void CalculateAndDisplay(IntegerVector2 position, IReadOnlyPiece movingPiece)
        {
            var logicPositions = movePredictor.PredictMoveableColumns(position, movingPiece);
            var worldPositions = ConvertLogicPositionToWorldPosition(logicPositions);

            UpdateMarker(worldPositions);
        }
Esempio n. 2
0
 //Unsafe
 public void OnStoredPieceClicked(IReadOnlyPiece piece)
 {
     if (piece is IPiece)
     {
         selectedPiece = (IPiece)piece;
     }
 }
Esempio n. 3
0
 public PieceMovementMessage(IReadOnlyPlayer player, IReadOnlyPiece piece, IntegerVector2 startPosition, IntegerVector2 endPosition)
 {
     Player        = player;
     Piece         = piece;
     StartPosition = startPosition;
     EndPosition   = endPosition;
 }
Esempio n. 4
0
 internal VerifiedMove(IReadOnlyPiece movingPiece, IReadOnlyPlayer player, IEnumerable <IntegerVector2> worldPath, IntegerVector2 viaPositionNode)
 {
     MovingPiece     = movingPiece;
     Player          = player;
     WorldPath       = worldPath;
     ViaPositionNode = viaPositionNode;
 }
Esempio n. 5
0
        public void Initialize(IReadOnlyPiece piece, Vector3[,] columnMap)
        {
            this.piece     = piece;
            this.columnMap = columnMap;

            //TODO 駒の色系統の処理がいろいろクソなので直す
            GetComponentInChildren <SpriteRenderer>().material = ConvertPieceColorToMaterial(piece.Color);

            UpdateView(Unit.Default);
        }
Esempio n. 6
0
        public IReadOnlyPiece SearchPiece(PieceName pieceName)
        {
            for (int i = 0; i < pieces.Width; i++)
            {
                for (int j = 0; j < pieces.Height; j++)
                {
                    IReadOnlyPiece piece = pieces.Read(new PublicDataType.IntegerVector2(i, j));
                    if (piece != null && piece.Name == pieceName)
                    {
                        return(piece);
                    }
                }
            }

            return(null);
        }
Esempio n. 7
0
        public VerifiedMove VerifyMove(IReadOnlyPlayer player, IntegerVector2 startPosition, IntegerVector2 viaPosition, IntegerVector2 endPosition)
        {
            Assert.IsTrue(IsOnBoard(startPosition));
            Assert.IsTrue(IsOnBoard(viaPosition) || viaPosition == new IntegerVector2(-1, -1));
            Assert.IsTrue(IsOnBoard(endPosition));

            //経路計算前の合法性チェック
            bool           areViaAndLastSame      = viaPosition == endPosition;
            IReadOnlyPiece movingPiece            = pieces.Read(startPosition);
            IReadOnlyPiece viaPiece               = pieces.Read(viaPosition);
            IReadOnlyPiece originalPiece          = pieces.Read(endPosition); //元からある駒の意味で使っているが, 英語があってるか不明.
            bool           isTargetNull           = movingPiece == null;
            bool           isViaPieceNull         = viaPiece == null;         //
            bool           isOwner                = !isTargetNull && movingPiece.IsOwner(player);
            bool           isSameOwner            = !isTargetNull && originalPiece != null && originalPiece.Owner == movingPiece.Owner;
            PieceMovement  start2ViaPieceMovement = PieceMovement.Default;
            PieceMovement  via2EndPieceMovement   = PieceMovement.Default;
            bool           isMoveableToVia        = !isTargetNull && movingPiece.TryToGetPieceMovement(viaPosition, out start2ViaPieceMovement);                                                    //
            bool           isMoveableToLast       = !isTargetNull && (areViaAndLastSame || movingPiece.TryToGetPieceMovement(startPosition + endPosition - viaPosition, out via2EndPieceMovement)); //

            if (isTargetNull || (!areViaAndLastSame && isViaPieceNull) || !isOwner || isSameOwner || !isMoveableToVia || !isMoveableToLast)                                                         //
            {
                return(VerifiedMove.InvalidMove);
            }

            //経路計算
            //worldPathに開始地点は含まれない
            var worldPath       = WorldPathCalculator.CalculatePath(startPosition, viaPosition, endPosition, pieces, start2ViaPieceMovement, via2EndPieceMovement);
            var viaPositionNode = worldPath.First(value => value == viaPosition);  //経由点を通過するのが1回だけだということは保証されている.

            //経路の合法性チェック
            var surmountLimit = via2EndPieceMovement.Surmountable ? 1 : 0;
            var noPieceOnPath = worldPath.Where(node => node != viaPosition).Where(node => node != endPosition)
                                .Select(node => pieces.Read(node)).Where(piece => piece != null)
                                .Count() <= surmountLimit;

            if (!noPieceOnPath)
            {
                return(VerifiedMove.InvalidMove);
            }

            return(new VerifiedMove(movingPiece, player, worldPath, viaPositionNode));
        }
Esempio n. 8
0
        int GetPieceAttitude(IReadOnlyPiece piece)
        {
            var owner = piece.Owner;

            if (owner == null)
            {
                return(-90);
            }

            switch (owner.Encampment)
            {
            case Terminologies.Encampment.Front:
                return(0);

            case Terminologies.Encampment.Back:
                return(180);
            }

            return(-90);
        }
Esempio n. 9
0
        void InitializePieceView(IntegerVector2 position, Vector3[,] columnMap, IGame game)
        {
            IBoard         board = game.Board;
            IReadOnlyPiece piece = board.GetPiece(position);

            if (piece == null)
            {
                return;
            }

            GameObject pieceViewObject = Instantiate(pieceViewPrefabs.Prefabs[(int)piece.Name]);

            pieceViewObject.transform.position = new Vector3(0, 0, -10);    //描画優先度の設定

            PieceView pieceViewComponent = pieceViewObject.GetComponent <PieceView>();

            pieceViewComponent.Initialize(piece, columnMap);
            pieceViewComponent.OnClicked.TakeUntilDestroy(this).Subscribe(onPieceClicked.Invoke);
            database.Add(piece, pieceViewComponent);
        }
Esempio n. 10
0
        public IEnumerable <PublicDataType.IntegerVector2> PredictMoveableColumns(PublicDataType.IntegerVector2 hypotheticalPosition, IReadOnlyPiece movingPiece)
        {
            if (movingPiece == null || !board.IsOnBoard(hypotheticalPosition))
            {
                return(Enumerable.Empty <PublicDataType.IntegerVector2>());
            }

            bool          isFrontPlayer = movingPiece.Owner != null && movingPiece.Owner.Encampment == Terminologies.Encampment.Front;
            PieceMovement unused;
            IEnumerable <PublicDataType.IntegerVector2> allColumn
                = Enumerable.Range(0, board.Width * board.Height)
                  .Select(x => new PublicDataType.IntegerVector2(x / board.Height, x % board.Height));

            IEnumerable <PublicDataType.IntegerVector2> moveable = allColumn
                                                                   .Select(absolutePosition => (absolutePosition - hypotheticalPosition) * (isFrontPlayer ? -1 : 1))
                                                                   .Where(relativePosition => movingPiece.TryToGetPieceMovementByRelativePosition(relativePosition, out unused))
                                                                   .Select(relativePosition => relativePosition * (isFrontPlayer ? -1 : 1) + hypotheticalPosition);

            return(moveable);
        }
Esempio n. 11
0
        IEnumerable <IntegerVector2> PredictMoveableColumns(IntegerVector2 hypotheticalPosition, IReadOnlyPiece movingPiece)
        {
            List <IntegerVector2> result = new List <IntegerVector2>();

            if (movingPiece == null || !board.IsOnBoard(hypotheticalPosition))
            {
                return(result);
            }

            for (int i = 0; i < board.Width; i++)
            {
                for (int j = 0; j < board.Height; j++)
                {
                    IntegerVector2 currentPosition  = new IntegerVector2(i, j);
                    bool           isFrontPlayer    = movingPiece.Owner != null && movingPiece.Owner.Encampment == Encampment.Front;
                    IntegerVector2 relativePosition = (currentPosition - hypotheticalPosition) * (isFrontPlayer ? -1 : 1);
                    PieceMovement  unused;
                    if (board.IsOnBoard(currentPosition) &&
                        movingPiece.TryToGetPieceMovementByRelativePosition(relativePosition, out unused))
                    {
                        result.Add(currentPosition);
                    }
                }
            }

            return(result);
        }
        Quaternion GetPieceQuaternion(IReadOnlyPiece piece)
        {
            int pieceAttitude = GetPieceAttitude(piece);

            return(Quaternion.AngleAxis(pieceAttitude, Vector3.forward));
        }
 public void OnViaPositionSelected(IntegerVector2 position)
 {
     /*中継地点からの移動先ハイライトは未実装*/
     CalculateAndDisplay(position, movingPiece);
     movingPiece = null;
 }
 public void OnPieceSelected(IReadOnlyPiece movingPiece)
 => CalculateAndDisplay(movingPiece?.Position ?? new IntegerVector2(-1, -1), this.movingPiece = movingPiece);
Esempio n. 15
0
        PublicDataType.IntegerVector2 currentPosition;      //現在のtamの座標

        public TamObserver(IObservable <Unit> onTurnChanged, IObservable <Unit> onEveruValueChangedOnBoard, IReadOnlyPiece tam)
        {
            previousTurnPosition = currentPosition = tam.Position;
            onEveruValueChangedOnBoard.Select(_ => tam.Position).DistinctUntilChanged().Subscribe(OnTamMoved);
            onTurnChanged.Subscribe(OnTurnChanged);
        }
Esempio n. 16
0
 public SetPieceMessage(IReadOnlyPlayer player, IReadOnlyPiece piece, IntegerVector2 setPosition)
 {
     Player      = player;
     Piece       = piece;
     SetPosition = setPosition;
 }
Esempio n. 17
0
 public void Reset(IReadOnlyPiece piece)
 {
     Count         = 1;
     PreviousPiece = piece;
 }
Esempio n. 18
0
 public OperationStatus()
 {
     Count         = 1;
     PreviousPiece = null;
 }