abstract class Buff
{
public abstract void Apply(IBuffTargetable<Buff> target);
public abstract void Unapply();
}
class PlayerBuff : Buff
{
public Player AffectedPlayer { get; private set; }
public override void Apply(IBuffTargetable<Buff> target)
{
AffectedPlayer = (Player)target;
}
public override void Unapply()
{
AffectedPlayer = null;
}
}
interface IBuffTargetable<T> where T : Buff
{
T[] AppliedBuffs { get; }
void ApplyBuff(T buff);
void UnapplyBuff(T buff);
}
class Player : IBuffTargetable<PlayerBuff>
{
private List<PlayerBuff> appliedBuffs;
public PlayerBuff[] AppliedBuffs
{
get { return appliedBuffs.ToArray(); }
}
public void ApplyBuff(PlayerBuff buff)
{
buff.Apply((IBuffTargetable<Buff>)this);
appliedBuffs.Add(buff);
}
public void UnapplyBuff(PlayerBuff buff)
{
if (appliedBuffs.Remove(buff))
buff.Unapply();
}
private void Awake()
{
appliedBuffs = new List<PlayerBuff>(10);
}
}