示例#1
0
        public async Task <IMoveModel> TryMove(IPieceModel piece)
        {
            if (AllowMove)
            {
                var meepleId = piece.Meeple != null ? piece.Meeple.MeepleId : -1;
                var curr     = ActivePlayer;
                var result   = curr.TryMove(piece, GameField.ResetChangedPieces);
                if (meepleId < 0)
                {
                    meepleId = piece.Meeple != null ? piece.Meeple.MeepleId : meepleId;
                }

                _currentMoveInfo.MeepleId = meepleId;
                _currentMoveInfo.Finished = true;
                await _networkHelper.SendMoveToServer(_currentMoveInfo);

                AllowMove = false;
                if (LastDice == 6)
                {
                    AllowDice = true;
                }
                else
                {
                    AllowDice = false;
                    SelectNextPlayer();
                }
                return(result);
            }
            return(null);
        }
示例#2
0
 private IResponse AddPiece(Coord coord, IPieceModel piece)
 {
     Assert.IsNotNull(piece);
     Assert.IsTrue(IsValidCoord(coord));
     piece.Coord.Value = coord;
     _pieces.Add(piece);
     return(Response.Ok);
 }
示例#3
0
 public Battle(IPlayerModel player, IPieceModel attacker, IPieceModel defender)
     : base(player, EActionType.Battle)
 {
     Assert.IsNotNull(player);
     Assert.IsNotNull(attacker);
     Assert.IsNotNull(defender);
     Attacker = attacker;
     Defender = defender;
 }
示例#4
0
        public MoveResults GetMovements(IPieceModel piece)
        {
            if (piece == null)
            {
                Warn($"Attempt to get movements for empty piece");
                return(null);
            }
            var coord = piece.Coord.Value;

            return(GetMovements(coord, piece.PieceType));
        }
示例#5
0
        public bool CanMoveOrAttack(IPieceModel pieceModel)
        {
            Assert.IsNotNull(pieceModel);

            // movements and attacks can be different for different pieces so be ba careful
            var moves   = GetMovements(pieceModel);
            var attacks = GetAttacks(pieceModel);

            // we have an empty square to
            if (moves.Coords.Count > 0)
            {
                return(true);
            }

            // we have no empty squares, but check for interference squares on movement
            foreach (var other in moves.Interferernce)
            {
                Assert.IsNotNull(other);
                Assert.IsFalse(other.SameOwner(pieceModel));

                // we should not have an interference square in our movements list that
                // contains a piece that does not belong to same owner
                if (!other.SameOwner(pieceModel))
                {
                    Error($"{pieceModel} can 'move' to opposing piece {other}");
                    continue;
                }

                // TODO: Mounting
                // for now, if this is only option to move to, and has same
                // owner, then we can't move. check for attacks next.
                if (moves.Coords.Count == 0)
                {
                    break;
                }
            }

            // now we can only attack
            if (attacks.Coords.Count > 0)
            {
                return(true);
            }

            // we can attack a defender of a square we could otherwise attack directly
            if (attacks.Interferernce.Count > 0)
            {
                return(true);
            }

            // we can't move anywhere, mount anything, or attack directly or attack a defender
            return(false);
        }
示例#6
0
        public IResponse Move(IPieceModel pieceModel, Coord coord)
        {
            Assert.IsNotNull(pieceModel);
            Assert.IsNotNull(coord);
            Assert.IsTrue(IsValidCoord(coord));
            var found = Get(coord);

            if (found == null)
            {
                return(Response.Fail);
            }
            found.Coord.Value = coord;
            return(Response.Ok);
        }
示例#7
0
        public IResponse Move([NotNull] IPieceModel pieceModel, Coord coord)
        {
            var found = Get(coord);

            if (found == null)
            {
                return(Response.Ok);
            }
            if (found.Dead.Value)
            {
                return(Response.Ok);
            }
            found.Coord.Value = coord;
            return(Response.Ok);
        }
示例#8
0
        private IResponse MovePieceTo(Coord coord, IPieceModel piece)
        {
            Assert.IsNotNull(piece);
            Assert.IsNotNull(coord);
            Assert.IsTrue(IsValidCoord(coord));
            var found = _pieces.FirstOrDefault(p => p == piece);

            Assert.IsNotNull(found);
            if (found == null)
            {
                return(Response.Fail);
            }
            found.Coord.Value = coord;
            return(Response.Ok);
        }
        public async Task <IMoveModel> TryMove(IPieceModel piece)
        {
            var curr = ActivePlayer;
            var move = curr.TryMove(piece, GameField.ResetChangedPieces);

            if (move != null)
            {
                AllowMove = false;
                if (LastDice != 6)
                {
                    SelectNextPlayer();
                }
                return(move);
            }
            return(null);
        }
示例#10
0
        public IResponse Attack(IPieceModel defender)
        {
            var attack = defender.TakeDamage(this);

            if (attack.Failed)
            {
                return(attack);
            }
            var defend = TakeDamage(defender);

            if (defend.Failed)
            {
                return(defend);
            }
            if (defender.Dead.Value && !Dead.Value)
            {
                return(Board.Move(this, defender.Coord.Value));
            }

            return(Response.Ok);
        }
示例#11
0
 public MovePiece(IPlayerModel player, IPieceModel piece, Coord coord)
     : base(player, EActionType.MovePiece)
 {
     Piece = piece;
     Coord = coord;
 }
示例#12
0
 public Response TryUnequip(IPieceModel piece)
 {
     throw new System.NotImplementedException();
 }
示例#13
0
 public MountPiece(IPlayerModel player, IPieceModel mount, IPieceModel rider)
     : base(player, EActionType.Mount)
 {
     Mount = mount;
     Rider = rider;
 }
示例#14
0
 public MoveResults GetAttacks(IPieceModel piece)
 {
     return(piece == null ? null : GetAttacks(piece.Coord.Value, piece.PieceType));
 }
示例#15
0
 public IResponse Add(IPieceModel piece)
 {
     Assert.IsNull(At(piece.Coord.Value));
     AddPiece(piece.Coord.Value, piece);
     return(Response.Ok);
 }
示例#16
0
 public IResponse Remove(IPieceModel pieceModel)
 {
     Assert.IsNotNull(pieceModel);
     return(_pieces.Remove(pieceModel) ? Response.Ok : Response.Fail);
 }
示例#17
0
 public IResponse TakeDamage(IPieceModel attacker)
 {
     return(Card.TakeDamage(attacker.Card));
 }
示例#18
0
 public IEnumerable <IPieceModel> AllAttackingPieces(IEnumerable <IPieceModel> pieces, IPieceModel defender)
 => AllAttackingPieces(pieces, defender.Coord.Value);