private void DoSpecialAction(IArmy first, IArmy second) { if (EndGame()) { return; } for (int i = 0; i < GameStrategy.SizeOfRow; i++) { var specialUnits = GetSpecialUnitsInRow(first, i); if (specialUnits.Count == 0) { continue; } Random random = new Random(); int indexSpecial = random.Next(0, specialUnits.Count - 1); var targetUnits = GetTargets(first, second, specialUnits[indexSpecial]); if (targetUnits.Count == 0) { continue; } int indexTargets = random.Next(0, targetUnits.Count - 1); IUnit beforeSpecialAction = targetUnits[indexTargets].Copy(); IUnit afterSpecialAction = specialUnits[indexSpecial].DoSpecialAction(targetUnits[indexTargets]); StepInfo += "\n\n\t\t\t-----ОСОБОЕ ДЕЙСТВИЕ-----"; if (specialUnits[indexSpecial] is Archer) { StepInfo += $"\n\nв Армии {first.ArmyName} - {((IUnit)specialUnits[indexSpecial]).GetInfo()}\n\n\t\t\t|--|--СТРЕЛЯЕТ ИЗ ЛУКА В--|--|\n\nв Армию {second.ArmyName} - {beforeSpecialAction.GetInfo()}"; if (afterSpecialAction == specialUnits[indexSpecial]) { StepInfo += $"\n\n\t\t\t -------ИТОГ-------\n\nв Армии {second.ArmyName} ПОГИБАЕТ {targetUnits[indexTargets].Name}\n"; if (Subscribed == true) { StepInfo += $"\n\n\t\t\t{second.NotifyAboutDeath()}\n\n"; } second.Remove(targetUnits[indexTargets]); } else { StepInfo += $"\n\n\t\t\t -------ИТОГ-------\n\nв Армии {second.ArmyName} РАНЕН {targetUnits[indexTargets].GetInfo()}\n"; } } else if (specialUnits[indexSpecial] is Healer) { if (afterSpecialAction != null) { StepInfo += $"\n\nв Армии{first.ArmyName} - {((IUnit)specialUnits[indexSpecial]).GetInfo()}\n\n\t\t\t|---|---ЛЕЧИТ---|---|\n\n в Армии {first.ArmyName} - {beforeSpecialAction.GetInfo()}"; StepInfo += $"\n\n\t\t\t -------ИТОГ-------\n\nв Армии {first.ArmyName} - {targetUnits[indexTargets].GetInfo()} ВЫЛЕЧЕН\n"; } else { StepInfo += $"\n\nЦелитель уснул после ночного дежурства! Никто НЕ ВЫЛЕЧЕН в Армии {first.ArmyName}\n"; } } else if (specialUnits[indexSpecial] is Wizard) { if (afterSpecialAction != null) { StepInfo += $"\n\nв Армии {first.ArmyName} - {((IUnit)specialUnits[indexSpecial]).GetInfo()}\n\n\t\t\t|---|---КЛОНИРУЕТ---|---|\n\n в Армии {first.ArmyName} - {beforeSpecialAction.GetInfo()}"; StepInfo += $"\n\n\t\t\t -------ИТОГ-------\n\nв Армии {first.ArmyName} - {targetUnits[indexTargets].GetInfo()} УСПЕШНО КЛОНИРОВАН.\n"; first.Push(afterSpecialAction); } else { StepInfo += $"\n\nМаг столкнулся с кражей зелий. НИКТО НЕ КЛОНИРОВАН в Армии {first.ArmyName}\n"; } } else if (specialUnits[indexSpecial] is Infantry) { if (afterSpecialAction != null) { targetUnits[indexTargets] = afterSpecialAction; StepInfo += $"\n\nв Армии {first.ArmyName} - {((IUnit)specialUnits[indexSpecial]).GetInfo()}\n\n\t\t\t|---|---ОДЕВАЕТ---|---|\n\n в Армии {first.ArmyName} - {beforeSpecialAction.GetInfo()}"; StepInfo += $"\n\n\t\t\t -------ИТОГ-------\n\nв Армии {first.ArmyName} - {targetUnits[indexTargets].GetInfo()} ОДЕТ В СПЕЦИАЛЬНУЮ АМУНИЦИЮ!\n"; } else { StepInfo += $"\n\nХодоки украли амуницию! НИКТО НЕ ОДЕТ в Армии {first.ArmyName}\n"; } } } }