public void Turn() { if (GameEnded) { return; } var magics = Strategy.GetMagicUnits(Army1, Army2); foreach (var tuple in magics) { HandleCommands(tuple.allies, tuple.enemies, tuple.alliesIndex); } var melees = Strategy.GetMeleeAttacks(Army1, Army2); foreach (var tuple in melees) { MakeDamage(tuple.allies, tuple.alliesIndex, tuple.enemies, tuple.targetIndex, tuple.allies[tuple.alliesIndex].Attack); } var unitsBefore = Army1.Count + Army2.Count; CommandsInvoker.Execute(Army1.CollectDead()); CommandsInvoker.Execute(Army2.CollectDead()); CommandsInvoker.EndTurn(); if (Army1.Count + Army2.Count == unitsBefore) { _turnsWithoutDeath++; } else { _turnsWithoutDeath = 0; } if (++_turns == DrawLimit || _turnsWithoutDeath == DrawLimitTurnsWithoutDeaths || Army1.Count == 0 || Army2.Count == 0) { GameEnded = true; } }
public override void NextStage() { int def1 = Army1.Battalions[counterUnit(CurrentStage)]; int def2 = Army2.Battalions[counterUnit(CurrentStage)]; int att1 = Army1.Battalions[CurrentStage]; int att2 = Army1.Battalions[CurrentStage]; double dmgProb1 = att1 == 0 ? 0 : att1 / (att1 + def2); double dmgProb2 = att2 == 0 ? 0 : att2 / (att2 + def1); double critProb1 = att1 == 0 ? 0 : att1 / (att1 + def2 * 2); double critProb2 = att2 == 0 ? 0 : att2 / (att2 + def1 * 2); double ran1 = Game.Random.ContinuousDouble(); double ran2 = Game.Random.ContinuousDouble(); int dmg1 = 0; int dmg2 = 0; if (ran1 < critProb1) { dmg1 = 2; } else if (ran1 < dmgProb1) { dmg1 = 1; } if (ran2 < critProb2) { dmg2 = 2; } else if (ran2 < dmgProb2) { dmg2 = 1; } Army1.RemoveRandom(dmg1); Army2.RemoveRandom(dmg2); nextStage(); }