Skip to content

Commit 6335a09

Browse files
authored
Merge pull request #356 from RedSparr0w/item-requirements
Check if player has requirements to equip items
2 parents c04c935 + 9e7c4fe commit 6335a09

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

src/engine/world/actor/player/player.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { PlayerSyncTask, NpcSyncTask } from './sync';
4444
import { dialogue } from '../dialogue';
4545
import { Npc } from '../npc';
4646
import { combatStyles } from '../combat';
47+
import { SkillName } from '../skills';
4748

4849

4950
export 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

Comments
 (0)