public bool IsAllyOf(Army army) => Army.IsAllyOf(army);
public abstract Province GiveUpTo(Army army);
public Province AttackedBy(Army another) => GiveUpTo(Army.AttackedBy(another));
public bool IsAllyOf(Army another) => another.IsControlledBy(PlayerId);
public Army AttackedBy(Army another) { var soldiers = Soldiers.AttackedBy(another.Soldiers); return(DefensePower >= another.AttackPower ? new Army(soldiers, player) : new Army(soldiers, another.player)); }
public Army Join(Army another) => new Army(Soldiers.Add(another.Soldiers), player);
public Army Subtract(Army another) => new Army(Soldiers.Subtract(another.Soldiers), player);
public Province ReinforcedBy(Army another) => WithArmy(Army.Join(another));
public (Province, Dynamics.IAction[]) AttackedBy(Army another) => GiveUpTo(Army.AttackedBy(another));
public virtual Province StartMove(Province dest, Army army) => WithArmy(Army.Subtract(army));
public (Province, Dynamics.IAction[]) GiveUpTo(Army his_army) { return(WithArmy(his_army), new[] { Army.Lose(this), his_army.Gain(this) }.NotNull().ToArray()); }
protected abstract Province WithArmy(Army army);