/// <summary> /// Game Turn /// One game turn is computed as follows: /// Move existing troops and bombs /// Execute user orders /// Produce new cyborgs in all factories /// Solve battles /// Make the bombs explode /// Check end conditions /// </summary> public void DoNextMove() { foreach (var factory in Factories.Where(x => x.Side != Side.Neutral)) { if (factory.InactivityDaysLeft <= 0) { factory.TroopsCount += factory.Income; } else { factory.InactivityDaysLeft--; } } foreach (var troop in Troops) { troop.Remaining--; } foreach (var bomb in Bombs) { bomb.Remaining--; } //Solve battles foreach (var troopGroup in Troops.Where(x => x.Remaining == 0).GroupBy(x => x.Dst)) { var factory = Factories[troopGroup.First().Dst]; int troopToFactory = troopGroup.Where(x => x.Side == Side.MyOwn).Sum(x => x.Size) - troopGroup.Where(x => x.Side == Side.Enemy).Sum(x => x.Size); if (troopToFactory == 0) { continue; } Side troopRestSide = troopToFactory > 0 ? Side.MyOwn : Side.Enemy; troopToFactory = Math.Abs(troopToFactory); var sign = 1; // if (factory.Side == Side.Neutral ? troopRestSide == Side.Enemy : (factory.Side != troopRestSide)) if (factory.Side != troopRestSide) { sign = -1; } factory.TroopsCount += troopToFactory * sign; if (factory.TroopsCount < 0) { factory.Side = troopRestSide; factory.TroopsCount = Math.Abs(factory.TroopsCount); } } //Bomb explode foreach (var bomb in Bombs.Where(x => x.Remaining == 0)) { var factory = Factories[bomb.Dst]; factory.TroopsCount -= Math.Max(10, factory.TroopsCount / 2); } Bombs.RemoveAll(bomb => { if (bomb.Remaining > 0) { return(false); } var factory = Factories[bomb.Dst]; factory.TroopsCount -= Math.Min(factory.TroopsCount, Math.Max(10, factory.TroopsCount / 2)); factory.InactivityDaysLeft = Constants.BOMB_EXPLODE_DURATION; return(true); }); // Troops = Troops.Where(x => x.Remaining > 0).ToList(); CurrentGameTick++; // foreach (var factory in Factories) { // if (factory.Side == Side.Neutral) { // if (factory.TroopsCount != 0) // factory.Side = factory.TroopsCount > 0 ? Side.MyOwn : Side.Enemy; // } // else if (factory.TroopsCount < 0) // factory.Side = factory.Side == Side.Enemy ? Side.MyOwn : Side.Enemy; // } }