package com.rpsg.rpg.object.game; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import com.badlogic.gdx.utils.JsonValue; import com.rpsg.rpg.core.Game; import com.rpsg.rpg.object.context.EquipmentContext; import com.rpsg.rpg.object.item.Equipment; import com.rpsg.rpg.object.prop.Prop; import com.rpsg.rpg.object.prop.PropKey; /** * GDX-RPG 数值信息类<br> * <br> * 所有的enemy和hero均拥有Target类,Target存储了该角色的所有数值信息(能力、装备等)。<br> * * TODO 为了保证不被数值污染,最好把战斗相关的数值上下文不再这里加入。到时候做一个BattleTarget怎么样=。= */ public class Target implements Serializable{ private static final long serialVersionUID = 1L; /**基础数值,存储了永久的基础属性(攻击,血量等)*/ Map<PropKey, Integer> props = new HashMap<>();{ props.put(PropKey.dead, PropKey.FALSE); props.put(PropKey.attackRate, 0); } /**该target身上的所有装备*/ private Map<Equipment.Parts, Equipment> equipments = new HashMap<>(); /**获取原始属性,请不要用此来获取最终数值,最终数值请使用{@link #get(PropKey)}来获取*/ public Map<PropKey, Integer> getProps() { return props; } /**获取装备*/ public Map<Equipment.Parts, Equipment> getEquipments() { return equipments; } public Target(JsonValue props) { for(JsonValue value : props) this.props.put(PropKey.valueOf(value.name), value.asInt()); } /** * 获取该target的某项数值,要注意的是,该数值是经过计算的(基础数值+装备提供的数值)。<br> * 因为该方法需要{@link Prop#get() 多次执行js},所以调用该方法可能会消耗性能(调用1次大概要2ms,不可以持续调用,必须做UI数值缓存) * */ public int get(PropKey propName){ int value = props.get(propName) == null ? 0 : props.get(propName); int originValue = value; for(Equipment e : equipments.values()){ if(e == null || e.effect == null) continue; Prop prop = e.effect.prop.get(propName); if(prop != null) value += prop.get(new EquipmentContext(originValue)); } return value; } /** * 穿上一件装备<br> * 如果当前部位已经有一件装备了,则先脱下来。 * 本来想用英文的put on之类的作为方法名,想想还是算了,用程序式的英语比较迷之带感2333 * */ public void setEquipment(Equipment.Parts parts, Equipment equipment){ //已经有装备的话就先脱下来 if(equipments.get(parts) != null) removeEquipment(parts, equipment); equipments.put(parts, equipment); Game.item.remove(equipment); } /*** * 脱下一件装备,并将装备放入玩家背包中 */ public void removeEquipment(Equipment.Parts parts, Equipment equipment){ Equipment equip = equipments.get(parts); if(equip == null) return; equipments.put(parts, null); Game.item.put(equip); } }