public void Fight(Army first, Army second) { if (IsGameFinished()) { return; } List <IUnit> firstLineInFirst = GetFirstLine(first); List <IUnit> firstLineInSecond = GetFirstLine(second); var min = Math.Min(Strategy.rowSize, Math.Min(first.Count(), second.Count())); for (int i = 0; i < min; i++) { IUnit attacker = firstLineInFirst[i]; IUnit victim = firstLineInSecond[i]; MoveInfo += String.Format("\n\nArmy {0}. {1}\n\n in opposition \n\nArmy {2}. {3}", first.Name, attacker.GetInfo(), second.Name, victim.GetInfo()); IUnit dead = attacker.Fight(victim); if (dead != null) { MoveInfo += string.Format("\n\nArmy {0}. {1} dead.\n", second.Name, dead.Name); dead.NotifyObservers(); second.Remove(dead); } else { MoveInfo += String.Format("\n\nArmy {0}. {1} attacked.\n", second.Name, victim.GetInfo()); } } }
public void DoSpecialAction(Army first, Army second) { if (IsGameFinished() || first.Count() < Strategy.rowSize + 1) { return; } for (int i = 0; i < Strategy.rowSize; i++) { var specials = GetSpecialUnitsInRow(first, i); if (specials.Count == 0) { continue; } int specialIndex = Rand.Get(0, specials.Count); var victims = GetTargets(first, second, specials[specialIndex]); if (victims.Count == 0) { continue; } int victimIndex = Rand.Get(0, victims.Count); IUnit beforeSpecial = victims[victimIndex].Copy(); IUnit afterSpecial = specials[specialIndex].DoSpecialAction(victims[victimIndex]); MoveInfo += "\nSpecial action."; if (specials[specialIndex] is BowmanUnit) { MoveInfo += String.Format("\n\nArmy {0}. {1} in opposition \n\nArmy {2}. {3}", first.Name, ((IUnit)specials[specialIndex]).GetInfo(), second.Name, beforeSpecial.GetInfo()); if (afterSpecial == specials[specialIndex]) { MoveInfo += String.Format("\n\nArmy {0}. {1} dead.\n", second.Name, victims[victimIndex].Name); afterSpecial.NotifyObservers(); second.Remove(afterSpecial); } else { MoveInfo += String.Format("\n\nArmy {0}. {1} attacked\n", second.Name, victims[victimIndex].GetInfo()); } } else if (specials[specialIndex] is HealerUnit) { if (afterSpecial != null) { MoveInfo += String.Format("\nArmy {0}. {1}\n\n\t healing \n\nArmy {2}. {3}", first.Name, ((IUnit)specials[specialIndex]).GetInfo(), first.Name, beforeSpecial.GetInfo()); MoveInfo += String.Format("\n\nArmy {0}. {1} healed\n", first.Name, victims[victimIndex].GetInfo()); } else { MoveInfo += String.Format("\n\nNo one was cured from the army {0}. ", first.Name); } } else if (specials[specialIndex] is WizardUnit) { if (afterSpecial != null) { MoveInfo += String.Format("\nАrmy {0}. {1}\n\n\t cloning \n\nАrmy {2}. {3}", first.Name, ((IUnit)specials[specialIndex]).GetInfo(), first.Name, beforeSpecial.GetInfo()); MoveInfo += String.Format("\n\nАrmy {0}. {1} cloned.\n", first.Name, victims[victimIndex].GetInfo()); } else { MoveInfo += String.Format("\n\nNo one was cloned from the army {0}.\n", first.Name); } } else { if (specials[specialIndex] is LightUnit) { if (afterSpecial != null) { MoveInfo += String.Format("\nArmy {0}. {1}\n\n\t dressing \n\nArmy {2}. {3}", first.Name, ((IUnit)specials[specialIndex]).GetInfo(), first.Name, beforeSpecial.GetInfo()); MoveInfo += String.Format("\n\nArmy {0}. {1} dressed.\n", first.Name, victims[victimIndex].GetInfo()); } else { MoveInfo += String.Format("\n\nNo one was dressed from the army {0}. ", first.Name); } } } } }