@@ -44,6 +44,7 @@ import { PlayerSyncTask, NpcSyncTask } from './sync';
4444import { dialogue } from '../dialogue' ;
4545import { Npc } from '../npc' ;
4646import { combatStyles } from '../combat' ;
47+ import { SkillName } from '../skills' ;
4748
4849
4950export const playerOptions : { option : string , index : number , placement : 'TOP' | 'BOTTOM' } [ ] = [
@@ -830,6 +831,33 @@ export class Player extends Actor {
830831 return this . equipment . items [ equipmentIndex ( equipmentSlot ) ] || null ;
831832 }
832833
834+ public canEquipItem ( item : ItemDetails ) : boolean {
835+ const requirements = item . equipmentData ?. requirements ;
836+ if ( ! requirements ) return true ;
837+
838+ const hasSkillRequirements = Object . entries ( requirements . skills || { } ) . every ( ( [ skill , level ] ) => this . skills . hasLevel ( skill as SkillName , level ) ) ;
839+ const hasQuestRequirements = Object . entries ( requirements . quests || { } ) . every ( ( [ quest , stage ] ) => this . getQuest ( quest ) . progress >= stage ) ;
840+
841+ return hasSkillRequirements && hasQuestRequirements ;
842+ }
843+
844+ public missingItemEquipRequirements ( item : ItemDetails ) : string [ ] {
845+ const missingRequirements = [ ] ;
846+ const requirements = item . equipmentData ?. requirements ;
847+ if ( ! requirements ) return missingRequirements ;
848+
849+ missingRequirements . push (
850+ ...Object . entries ( requirements . skills || { } )
851+ . filter ( ( [ skill , level ] ) => ! this . skills . hasLevel ( skill as SkillName , level ) )
852+ . map ( ( [ skill , level ] ) => `You need to be at least level ${ level } ${ skill } to equip this item.` ) ,
853+ ...Object . entries ( requirements . quests || { } )
854+ . filter ( ( [ quest , stage ] ) => this . getQuest ( quest ) . progress < stage )
855+ . map ( ( [ quest ] ) => `You must progress further in the ${ quest . replace ( / _ / g, ' ' ) } quest to equip this item.` )
856+ ) ;
857+
858+ return missingRequirements ;
859+ }
860+
833861 public equipItem ( itemId : number , itemSlot : number , slot : EquipmentSlot | number ) : boolean {
834862 const itemToEquip = getItemFromContainer ( itemId , itemSlot , this . inventory ) ;
835863
@@ -856,6 +884,12 @@ export class Player extends Actor {
856884 return ;
857885 }
858886
887+ const missingRequirements = this . missingItemEquipRequirements ( itemDetails ) ;
888+ if ( missingRequirements . length ) {
889+ missingRequirements . forEach ( s => { this . sendMessage ( s ) } ) ;
890+ return ;
891+ }
892+
859893 if ( itemDetails && itemDetails . equipmentData ) {
860894 if ( itemDetails . equipmentData . equipmentType === 'two_handed' ) {
861895 shouldUnequipOffHand = true ;
0 commit comments