private void GetAvailableMoves(int teamId) { _availableMoves.Clear(); _actions.Clear(); Team team = Board.Teams[teamId]; Ship ship = team.Ship; IEnumerable <Pirate> activePirates; Direction previosDirection = null; if (NeedSubTurnPirate != null) { activePirates = new[] { NeedSubTurnPirate }; previosDirection = PreviosSubTurnDirection; } else { activePirates = team.Pirates.Where(x => x.IsDrunk == false && x.IsInTrap == false); } var targets = new List <AvaliableMove>(); foreach (var pirate in activePirates) { var position = pirate.Position; GetAllAvaliableMovesTask task = new GetAllAvaliableMovesTask(); task.TeamId = teamId; task.FirstSource = position; task.PreviosSource = (previosDirection != null) ? previosDirection.From : null; List <AvaliableMove> temp = Board.GetAllAvaliableMoves(task); targets.AddRange(temp); } //если есть ходы, которые не приводят к прыжку в воду, то выбираем только их if (targets.Any(x => x.WithJumpToWater == false)) { targets = targets.Where(x => x.WithJumpToWater == false).ToList(); } foreach (AvaliableMove avaliableMove in targets) { Move move = new Move(avaliableMove.Source, avaliableMove.Target, avaliableMove.MoveType); GameActionList actionList = avaliableMove.ActionList; AddMoveAndActions(move, actionList); } }
private void Step(List <Move> moves, List <IGameAction> actions, int toX, int toY, Pirate pirate, Ship ship, Team team) { var to = new Position(toX, toY); Tile tile = Board.Map[toX, toY]; bool onShip = (ship.Position == pirate.Position); switch (tile.Type) { case TileType.Unknown: { // exploration if (onShip) { if (CanLanding(pirate, to)) { // landing moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Explore(to), new MovePirate(pirate, to), new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Explore(to), new MovePirate(pirate, to))); } break; } case TileType.Stone: { return; } case TileType.Water: { if (to == ship.Position) { // shipping with coins moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new TakeCoin(pirate), new Shipping(pirate, ship))); // shipping without coins moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Shipping(pirate, ship))); } else if (pirate.Position == ship.Position) { if (((ship.Position.X == 0 || ship.Position.X == Board.Size - 1) && (to.Y == 0 || to.Y == Board.Size - 1)) || ((ship.Position.Y == 0 || ship.Position.Y == Board.Size - 1) && (to.X == 0 || to.X == Board.Size - 1))) { break; // enemy water territories } // navigation moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new Naviation(ship, to))); } break; } case TileType.Grass: { var enemy = new List <Pirate>(); foreach (var enemyTeam in team.Enemies) { Pirate[] enemyPirates = enemyTeam.Pirates.Where(p => p.Position == to).ToArray(); enemy.AddRange(enemyPirates); } if (enemy.Count > 0) { // attack if (onShip) { if (CanLanding(pirate, to)) { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new AttackPirates(enemy.ToArray()), new MovePirate(pirate, to), new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new AttackPirates(enemy.ToArray()), new MovePirate(pirate, to))); } } else { if (onShip) { if (CanLanding(pirate, to)) { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new MovePirate(pirate, to), new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new MovePirate(pirate, to))); moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new TakeCoin(pirate), new MovePirate(pirate, to))); } } break; } } }
public AvaliableMove(TilePosition source, TilePosition target, params IGameAction[] actions) { Source = source; Target = target; ActionList = new GameActionList(actions); }
private void Step(int toX, int toY, Pirate pirate, Ship ship, Team team) { var moves = _availableMoves; var actions = _actions; var to = new Position(toX, toY); Tile tile = Board.Map[toX, toY]; bool onShip = (ship.Position == pirate.Position); switch (tile.Type) { case TileType.Unknown: { // exploration if (onShip) { if (CanLanding(pirate, to)) { // landing moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Explore(to), new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Explore(to), new Walk(pirate, to))); } break; } case TileType.Stone: { return; } case TileType.Water: { if (to == ship.Position) { // shipping with coins moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new TakeCoin(pirate), new Shipping(pirate, ship))); // shipping without coins moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Shipping(pirate, ship))); } else if (pirate.Position == ship.Position) { if (((ship.Position.X == 0 || ship.Position.X == Board.Size - 1) && (to.Y == 0 || to.Y == Board.Size - 1)) || ((ship.Position.Y == 0 || ship.Position.Y == Board.Size - 1) && (to.X == 0 || to.X == Board.Size - 1))) { break; // enemy water territories } // navigation moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new Navigation(ship, to))); } break; } case TileType.Grass: { var attack = tile.OccupationTeamId.HasValue && tile.OccupationTeamId.Value != pirate.TeamId; if (attack) { // attack if (onShip) { if (CanLanding(pirate, to)) { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Attack(to), new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Attack(to), new Walk(pirate, to))); } } else { if (onShip) { if (CanLanding(pirate, to)) { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new Landing(pirate, ship))); } } else { moves.Add(new Move(pirate, to, false)); actions.Add(GameActionList.Create( new DropCoin(pirate), new Walk(pirate, to))); moves.Add(new Move(pirate, to, true)); actions.Add(GameActionList.Create( new TakeCoin(pirate), new Walk(pirate, to))); } } break; } } }
private void Step(TilePosition target, Pirate pirate, Ship ship, Team team) { //var moves = _availableMoves; //var actions = _actions; Tile targetTile = Board.Map[target.Position]; var source = pirate.Position.Position; Tile sourceTile = Board.Map[source]; bool onShip = (ship.Position == pirate.Position.Position); Direction direction = new Direction(pirate.Position, target); switch (targetTile.Type) { case TileType.Unknown: { // exploration if (onShip) { if (CanLanding(pirate, target)) { // landing AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Explore(target, pirate, direction), new Landing(pirate, ship), new Moving(pirate, target))); } } else { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Explore(target, pirate, direction), new Moving(pirate, target))); } break; } case TileType.Water: { if (target == ship.Position) //на свой корабль { if (sourceTile.Coins > 0) { // shipping with coins AddMoveAndActions(new Move(pirate.Position.Position, target, MoveType.WithCoin), GameActionList.Create( new TakeCoinToShip(pirate, ship), new Shipping(pirate, ship))); } // shipping without coins AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( //new DropCoin(pirate), new Shipping(pirate, ship))); } else if (pirate.Position.Position == ship.Position) //двигаем корабль { if (((ship.Position.X == 0 || ship.Position.X == Board.Size - 1) && (target.Y <= 1 || target.Y >= Board.Size - 2)) || ((ship.Position.Y == 0 || ship.Position.Y == Board.Size - 1) && (target.X <= 1 || target.X >= Board.Size - 2))) { break; // enemy water territories } // navigation AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Navigation(ship, target))); } else if (Board.Teams.Where(x => x.Id != CurrentTeamId).Select(x => x.Ship.Position).Contains(target)) { //столкновение с чужим кораблем AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Dying(pirate))); } else //падение пирата в воду и плавание в воде { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Moving(pirate, target))); } break; } case TileType.Chest1: case TileType.Chest2: case TileType.Chest3: case TileType.Chest4: case TileType.Chest5: case TileType.Grass: case TileType.Fort: case TileType.RespawnFort: case TileType.RumBarrel: case TileType.Canibal: case TileType.Spinning: case TileType.Trap: { var attack = targetTile.OccupationTeamId.HasValue && targetTile.OccupationTeamId.Value != pirate.TeamId; bool targetIsFort = targetTile.Type.IsFort(); //Respawn if (targetTile.Type == TileType.RespawnFort && sourceTile.Type == TileType.RespawnFort) { if (team.Pirates.Count() < 3) { AddMoveAndActions(new Move(pirate.Position.Position, target, MoveType.WithRespawn), GameActionList.Create( new Respawn(team, target))); } } if (attack) { if (targetIsFort == false) { // attack if (onShip) { if (CanLanding(pirate, target)) { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Attack(target), new Landing(pirate, ship), new Moving(pirate, target))); } } else { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Attack(target), new Moving(pirate, target))); } } } else { if (onShip) { if (CanLanding(pirate, target)) { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Landing(pirate, ship), new Moving(pirate, target))); } } else { AddMoveAndActions(new Move(pirate.Position.Position, target), GameActionList.Create( new Moving(pirate, target))); if (sourceTile.Coins > 0 && targetIsFort == false) { AddMoveAndActions(new Move(pirate.Position.Position, target, MoveType.WithCoin), GameActionList.Create( new Moving(pirate, target, true))); } } } break; } } }