Skip to content

Commit

Permalink
Merge pull request #356 from RedSparr0w/item-requirements
Browse files Browse the repository at this point in the history
Check if player has requirements to equip items
  • Loading branch information
SchauweM authored Oct 6, 2021
2 parents c04c935 + 9e7c4fe commit 6335a09
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions src/engine/world/actor/player/player.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import { PlayerSyncTask, NpcSyncTask } from './sync';
import { dialogue } from '../dialogue';
import { Npc } from '../npc';
import { combatStyles } from '../combat';
import { SkillName } from '../skills';


export const playerOptions: { option: string, index: number, placement: 'TOP' | 'BOTTOM' }[] = [
Expand Down Expand Up @@ -830,6 +831,33 @@ export class Player extends Actor {
return this.equipment.items[equipmentIndex(equipmentSlot)] || null;
}

public canEquipItem(item: ItemDetails): boolean {
const requirements = item.equipmentData?.requirements;
if (!requirements) return true;

const hasSkillRequirements = Object.entries(requirements.skills || {}).every(([skill, level]) => this.skills.hasLevel(skill as SkillName, level));
const hasQuestRequirements = Object.entries(requirements.quests || {}).every(([quest, stage]) => this.getQuest(quest).progress >= stage);

return hasSkillRequirements && hasQuestRequirements;
}

public missingItemEquipRequirements(item: ItemDetails): string[] {
const missingRequirements = [];
const requirements = item.equipmentData?.requirements;
if (!requirements) return missingRequirements;

missingRequirements.push(
...Object.entries(requirements.skills || {})
.filter(([skill, level]) => !this.skills.hasLevel(skill as SkillName, level))
.map(([skill, level]) => `You need to be at least level ${level} ${skill} to equip this item.`),
...Object.entries(requirements.quests || {})
.filter(([quest, stage]) => this.getQuest(quest).progress < stage)
.map(([quest]) => `You must progress further in the ${quest.replace(/_/g, ' ')} quest to equip this item.`)
);

return missingRequirements;
}

public equipItem(itemId: number, itemSlot: number, slot: EquipmentSlot | number): boolean {
const itemToEquip = getItemFromContainer(itemId, itemSlot, this.inventory);

Expand All @@ -856,6 +884,12 @@ export class Player extends Actor {
return;
}

const missingRequirements = this.missingItemEquipRequirements(itemDetails);
if (missingRequirements.length) {
missingRequirements.forEach( s => {this.sendMessage(s)});
return;
}

if(itemDetails && itemDetails.equipmentData) {
if(itemDetails.equipmentData.equipmentType === 'two_handed') {
shouldUnequipOffHand = true;
Expand Down

0 comments on commit 6335a09

Please sign in to comment.