package com.asteria.game.character.player.content; import java.util.HashMap; import java.util.Map; import com.asteria.game.character.player.Player; import com.asteria.game.character.player.skill.SkillData; import com.asteria.game.item.Item; import com.asteria.utility.TextUtils; /** * The container class that represents one equipment requirement. * * @author lare96 <http://github.com/lare96> */ public final class Requirement { /** * The hash collection of equipment requirements. */ public static final Map<Integer, Requirement[]> REQUIREMENTS = new HashMap<>(); /** * The level of this equipment requirement. */ private final int level; /** * The skill identifier for this equipment requirement. */ private final SkillData skill; /** * Creates a new {@link Requirement}. * * @param level * the level of this equipment requirement. * @param skill * the skill identifier for this equipment requirement. */ public Requirement(int level, SkillData skill) { this.level = level; this.skill = skill; } /** * A substitute for {@link Object#clone()} that creates another 'copy' of * this instance. The created copy is <i>safe</i> meaning it does not hold * <b>any</b> references to the original instance. * * @return a reference-free copy of this instance. */ public Requirement copy() { return new Requirement(level, skill); } /** * Determines if {@code player} can equip {@code item} based on its * equipment requirements. * * @param player * the player that is equipping the item. * @param item * the item being equipped. * @return {@code true} if the player can equip the item, {@code false} * otherwise. */ public static boolean canEquip(Player player, Item item) { if (item == null) return true; Requirement[] req = REQUIREMENTS.get(item.getId()); if (req == null) return true; for (Requirement r : req) { if (player.getSkills()[r.skill.getId()].getRealLevel() < r.level) { String append = TextUtils.appendIndefiniteArticle(SkillData.values()[r.skill.getId()].toString()); player.getMessages().sendMessage("You need " + append + " " + "level of " + r.level + " to equip this item."); return false; } } return true; } /** * Gets the level of this equipment requirement. * * @return the level. */ public int getLevel() { return level; } /** * Gets the skill identifier for this equipment requirement. * * @return the skill identifier. */ public SkillData getSkill() { return skill; } }