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(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; } } }
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; } } }