public MultiMoves CalculateTakeTerritoriesMoves(List <TerritoryIDType> territoriesToTake, MultiMoves precondition) { MultiMoves resultMoves = precondition.Clone(); List <TerritoryIDType> territoriesToTakeCopy = new List <TerritoryIDType>(territoriesToTake); while (territoriesToTakeCopy.Count > 0) { var reachableTerritories = FilterNonBorderingTerritories(territoriesToTakeCopy, resultMoves); if (reachableTerritories.Count == 0) { return(null); } var bestStartTerritory = GetBestAttackingTerritory(reachableTerritories, resultMoves); var bestAttackTerritory = GetBestAttackTerritory(reachableTerritories, territoriesToTakeCopy, bestStartTerritory, resultMoves); int neededAttackArmies = AttackInformer.GetNeededBreakArmies (resultMoves.GetTerritoryStandingsAfterAllMoves()[bestAttackTerritory].NumArmies.ArmiesOrZero); GameOrderAttackTransfer attackOrder = GameOrderAttackTransfer.Create (GameState.MyPlayerId, bestStartTerritory, bestAttackTerritory, AttackTransferEnum.AttackTransfer, new Armies(neededAttackArmies), REASON); var standing = resultMoves.GetTerritoryStandingsAfterAllMoves().Where(o => o.Key == attackOrder.From).First().Value; int leftoverArmies = standing.NumArmies.ArmiesOrZero - standing.ArmiesMarkedAsUsed.ArmiesOrZero - 1; int armiesToPump = Math.Max(0, attackOrder.NumArmies.ArmiesOrZero - leftoverArmies); bool successfull = resultMoves.PumpArmies(attackOrder.From, armiesToPump, REASON); if (!successfull) { return(null); } resultMoves.AddAttackOrder(attackOrder); territoriesToTakeCopy.Remove(bestAttackTerritory); } return(resultMoves); }
private int GetClassification(GameOrderAttackTransfer attackMove) { var initialState = GameState.CurrentTurn().LatestTurnStanding.Territories; bool opponentAttack = initialState[attackMove.To].OwnerPlayerID == GameState.OpponentPlayerId; var attackFromNeighbors = MapInformer.GetNeighborTerritories(initialState[attackMove.From].ID); var opponentTerritories = MapInformer.GetOwnedTerritories(initialState.Values.ToList(), GameState.OpponentPlayerId); var opponentNeighboringAttack = false; foreach (var opponentTerritory in opponentTerritories) { if (attackFromNeighbors.Contains(opponentTerritory.ID)) { opponentNeighboringAttack = true; } } bool clearOpponentBreak = false; int opponentIncome = GameState.CurrentTurn().Incomes[GameState.OpponentPlayerId].FreeArmies; int maxOpponentArmies = 0; if (opponentAttack) { maxOpponentArmies = initialState[attackMove.To].NumArmies.ArmiesOrZero + opponentIncome; int maxNeededArmies = AttackInformer.GetNeededBreakArmies(maxOpponentArmies); if (attackMove.NumArmies.ArmiesOrZero >= maxNeededArmies) { clearOpponentBreak = true; } } bool isTransfer = initialState[attackMove.To].OwnerPlayerID == GameState.MyPlayerId; bool isExpansion = initialState[attackMove.To].IsNeutral; if (clearOpponentBreak) { return(1); } if (isTransfer) { return(2); } if (isExpansion && !opponentNeighboringAttack) { return(3); } if (isExpansion && opponentNeighboringAttack) { return(4); } // non clear opponent attacks return(5); }