与复制对象以实现某种“应用对象”模式相反,最好记住改变的不是剑“基础物品”,而是玩家携带的物品。
例如,一把给定的剑,比如“生锈的旧剑”,其基础伤害始终为 50。现在,如果有人对其应用“旧的东西变得更好的魔法”,那么受到更多伤害的并不是“生锈的旧剑”:如果其他没有这种魔法的玩家捡起该物品,它会恢复到 50 的基础伤害。
因此,如果您实现某种EquippedWeapon
(甚至EquippedItem
)类,您可以让您的玩家装备武器并为其赋予扩展属性。像这样声明剑:
interface IWeapon
{
int Damage { get; }
}
class Sword : IWeapon
{
public int Damage { get; private set; }
public Sword()
{
this.Damage = 50;
}
}
现在我们有一把基础伤害为 50 的剑。现在让玩家携带这把剑:
interface IDamageModifier
{
int Damage { get; set; }
}
class EquippedWeapon : IWeapon
{
public int Damage
{
get
{
return CalculateActualDamage();
}
}
public List<IDamageModifier> DamageModifiers { get; set; }
private IWeapon _baseWeapon = null;
public EquippedWeapon(IWeapon weapon)
{
_baseWeapon = weapon;
}
private int CalulcateActualDamage()
{
int baseDamage = _baseWeapon.Damage;
foreach (var modifier in this.DamageModifiers)
{
baseDamage += modifier.Damage;
}
return baseDamage;
}
}
武器包含一系列活动修饰符,这些修饰符会影响携带物品的伤害,但不会影响基础物品。Sword
通过这种方式,您可以与许多(非)可玩角色共享一个实例。
现在,如果玩家受到攻击并且该攻击具有伤害效果,您只需将其应用于玩家携带的物品,因此该玩家的每次连续攻击都会应用这些效果:
class Player
{
public EquippedWeapon PrimaryWeapon { get; set; }
public Player()
{
this.PrimaryWeapon = new EquippedWeapon(new Sword());
}
public void UnderAttack(Attack attack)
{
// TODO: implement
if (attack.Buffs...)
{
this.EquippedWeapon.DamageModifiers.Add(attack.Buffs);
}
}
}