Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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;
            }
            }
        }
Beispiel #3
0
 public AvaliableMove(TilePosition source, TilePosition target, params IGameAction[] actions)
 {
     Source     = source;
     Target     = target;
     ActionList = new GameActionList(actions);
 }
Beispiel #4
0
        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;
            }
            }
        }
Beispiel #5
0
        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;
            }
            }
        }