private List<Tile> GetSeaAttackableTiles(SeaCombatUnit seaUnit, Tile tile)
 {
     List<Tile> tiles = new List<Tile>();
     switch(seaUnit.EquipmentClassEnum)
     {
         case EquipmentClassEnum.Submarine:
             tiles = GetAdjacentTiles(tile, 1, true);
             tiles = tiles.Where(t => t.GroundUnit != null).ToList();
             tiles = tiles.Where(t => t.GroundUnit.SideEnum != seaUnit.SideEnum).ToList();
             tiles = tiles.Where(t => t.Terrain.TerrainGroupEnum != TerrainGroupEnum.Land).ToList();
             tiles = tiles.Where(t => t.GroundUnit.EquipmentClassEnum != EquipmentClassEnum.Submarine).ToList();
             break;
         case EquipmentClassEnum.Destroyer:
             tiles = GetAdjacentTiles(tile, 1, true);
             tiles = tiles.Where(t => t.GroundUnit != null).ToList();
             tiles = tiles.Where(t => t.GroundUnit.SideEnum != seaUnit.SideEnum).ToList();
             tiles = tiles.Where(t => t.Terrain.TerrainGroupEnum != TerrainGroupEnum.Land).ToList();
             break;
         case EquipmentClassEnum.CapitalShip:
             tiles = GetAdjacentTiles(tile, seaUnit.Equipment.Range, true);
             tiles = tiles.Where(t => t.GroundUnit != null).ToList();
             tiles = tiles.Where(t => t.GroundUnit.SideEnum != seaUnit.SideEnum).ToList();
             tiles = tiles.Where(t => t.GroundUnit.EquipmentClassEnum != EquipmentClassEnum.Submarine).ToList();
             break;
     }
     return tiles;
 }
 private void MoveSeaCombatUnit(SeaCombatUnit seaCombatUnit, Tile currentTile)
 {
     Tile targetTile = null;
     TargetAndJumpOffTile targetAndJumpOffTile = null;
     targetAndJumpOffTile = DetermineSeaAttackJumpOffTile(seaCombatUnit, currentTile);
     if (seaCombatUnit.CanAttack && targetAndJumpOffTile != null)
     {
         Game.BoardFactory.ActiveTile = currentTile;
         Game.BoardFactory.ActiveUnit = seaCombatUnit;
         Game.BoardFactory.MoveUnitForComputerPlayer(seaCombatUnit, currentTile, targetAndJumpOffTile.JumpOffTile);
         Game.BoardFactory.ActiveTile = targetAndJumpOffTile.JumpOffTile;
         if (seaCombatUnit.CanAttack)
         {
             Game.BoardFactory.CalculateBattleForComputerPlayer(targetAndJumpOffTile.TargetTile);
         }
         return;
     }
     targetTile = DetermineSeaWithdrawlTile(seaCombatUnit);
     if (targetTile != null)
     {
         Game.BoardFactory.ActiveTile = currentTile;
         Game.BoardFactory.ActiveUnit = seaCombatUnit;
         Game.BoardFactory.MoveUnitForComputerPlayer(seaCombatUnit, currentTile, targetTile);
         return;
     }
 }
        private TargetAndJumpOffTile DetermineSeaAttackJumpOffTile(SeaCombatUnit seaCombatUnit, Tile currentTile)
        {
            List<Tile> adjacentTiles = null;
            List<TargetAndJumpOffTile> targetAndJumpOffTiles = new List<TargetAndJumpOffTile>();
            TargetAndJumpOffTile targetAndJumpOffTile = null;

            foreach (Tile tile in seaCombatUnit.MoveableTiles)
            {
                Game.TileFactory.SetAttackableTiles(seaCombatUnit, tile);
                adjacentTiles = seaCombatUnit.AttackableTiles;
                adjacentTiles = adjacentTiles.Where(t => t.GroundUnit != null).ToList();
                adjacentTiles = adjacentTiles.Where(t => t.GroundUnit.SideEnum == SideEnum.Axis).ToList();
                foreach (Tile potentialTargetTile in adjacentTiles)
                {
                    targetAndJumpOffTile = new TargetAndJumpOffTile();
                    targetAndJumpOffTile.TargetTile = potentialTargetTile;
                    targetAndJumpOffTile.JumpOffTile = tile;
                    targetAndJumpOffTiles.Add(targetAndJumpOffTile);
                }
            }

            return DetermineTarget(targetAndJumpOffTiles, TargetTypeEnum.SoftGround);
        }
        private Tile DetermineSeaWithdrawlTile(SeaCombatUnit seaCombatUnit)
        {
            Tile targetTile = null;
            List<Tile> adjacentTiles = null;

            foreach (Tile tile in seaCombatUnit.MoveableTiles)
            {
                adjacentTiles = Game.TileFactory.GetAdjacentTiles(tile, 1, false);
                adjacentTiles = adjacentTiles.Where(t => t.VictoryIndicator).ToList();
                targetTile = adjacentTiles.Where(t => t.GroundUnit.SideEnum == SideEnum.Allies).FirstOrDefault();
                if (targetTile != null)
                {
                    return targetTile;
                }
            }
            return null;
        }
        public SeaCombatUnit CreateSeaCombatUnit(int unitId, ScenarioUnit scenarioUnit)
        {
            SeaCombatUnit unit = new SeaCombatUnit();
            unit.UnitId = unitId;
            unit.Equipment = EquipmentFactory.GetEquipment(scenarioUnit.EquipmentId);
            unit.UnitName = String.Format("{0} {1}", unitId, unit.Equipment.EquipmentDescription);
            unit.CoreIndicator = scenarioUnit.CordInd;
            unit.CurrentExperience = scenarioUnit.Experience;
            unit.CurrentStrength = scenarioUnit.Strength;
            unit.CurrentAttackPoints = scenarioUnit.Strength;
            unit.Nation = Game.NationFactory.GetNation(scenarioUnit.NationId);
            unit.CoreIndicator = scenarioUnit.CordInd;
            unit.CurrentAmmo = unit.Equipment.MaxAmmo;
            unit.CurrentFuel = unit.Equipment.MaxFuel;
            unit.CanMove = true;
            unit.CanAttack = true;
            unit.CurrentTileId = scenarioUnit.StartingScenarioTileId;

            return unit;
        }