public List <AttackTransferMove> BasedOn(GameState state)
        {
            var attackTransferMoves = new List <AttackTransferMove>();
            var conditionalAttacks  = new ConditionalAttackList();

            var regions = state.VisibleMap.Regions;

            foreach (var fromRegion in regions)
            {
                if (fromRegion.Armies > 1 && fromRegion.OwnedByPlayer(GameState.MyPlayerName))
                {
                    var neighbors = fromRegion.Neighbors;
                    if (fromRegion.Armies > 1 && neighbors.Any(x => x.PlayerName != GameState.MyPlayerName))
                    {
                        ConsiderAttacks(fromRegion, neighbors, attackTransferMoves, conditionalAttacks);
                    }
                    else
                    {
                        MoveToLowerIsolationLevel(fromRegion, neighbors, attackTransferMoves);
                    }
                }
            }

            conditionalAttacks.ResolveConditionalAttacks(attackTransferMoves);

            return(attackTransferMoves);
        }
 public void Setup()
 {
     _gameState      = new TestGameState();
     _attackList     = new ConditionalAttackList();
     _committedMoves = new List <AttackTransferMove>();
 }
        private static void ConsiderAttacks(Region fromRegion, List <Region> neighbors, List <AttackTransferMove> attackTransferMoves, ConditionalAttackList conditionalAttacks)
        {
            neighbors.Sort((a, b) => b.StrategicValue.CompareTo(a.StrategicValue));
            Region conditionalAttackTarget = null;

            foreach (var toRegion in neighbors)
            {
                if (toRegion.PlayerName != GameState.MyPlayerName)
                {
                    var attackingArmies = BattleAnalysis.DetermineMaximumSafeAttack(fromRegion, toRegion, GameState.MyPlayerName, _confidence);

                    // it's not safe to attack this guy alone, but if we have armies left and others will attack too, maybe it will be
                    if (attackingArmies == 0 && conditionalAttackTarget == null)
                    {
                        conditionalAttackTarget = toRegion;
                    }

                    // don't attack with just one army, it's pretty much always a waste
                    if (attackingArmies > 1)
                    {
                        attackTransferMoves.Add(new AttackTransferMove(GameState.MyPlayerName, fromRegion, toRegion, attackingArmies));
                        fromRegion.Armies -= attackingArmies; // TODO: this isn't entirely true - maybe revisit it in the future
                    }
                }

                if (fromRegion.Armies <= 1)
                {
                    break;
                }
            }

            if (fromRegion.Armies > 2 && conditionalAttackTarget != null)
            {
                conditionalAttacks.Add(fromRegion, conditionalAttackTarget, fromRegion.Armies - 1);
            }
        }