void CalculateAndDisplay(IntegerVector2 position, IReadOnlyPiece movingPiece) { var logicPositions = movePredictor.PredictMoveableColumns(position, movingPiece); var worldPositions = ConvertLogicPositionToWorldPosition(logicPositions); UpdateMarker(worldPositions); }
//Unsafe public void OnStoredPieceClicked(IReadOnlyPiece piece) { if (piece is IPiece) { selectedPiece = (IPiece)piece; } }
public PieceMovementMessage(IReadOnlyPlayer player, IReadOnlyPiece piece, IntegerVector2 startPosition, IntegerVector2 endPosition) { Player = player; Piece = piece; StartPosition = startPosition; EndPosition = endPosition; }
internal VerifiedMove(IReadOnlyPiece movingPiece, IReadOnlyPlayer player, IEnumerable <IntegerVector2> worldPath, IntegerVector2 viaPositionNode) { MovingPiece = movingPiece; Player = player; WorldPath = worldPath; ViaPositionNode = viaPositionNode; }
public void Initialize(IReadOnlyPiece piece, Vector3[,] columnMap) { this.piece = piece; this.columnMap = columnMap; //TODO 駒の色系統の処理がいろいろクソなので直す GetComponentInChildren <SpriteRenderer>().material = ConvertPieceColorToMaterial(piece.Color); UpdateView(Unit.Default); }
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); }
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)); }
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); }
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); }
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); }
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);
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); }
public SetPieceMessage(IReadOnlyPlayer player, IReadOnlyPiece piece, IntegerVector2 setPosition) { Player = player; Piece = piece; SetPosition = setPosition; }
public void Reset(IReadOnlyPiece piece) { Count = 1; PreviousPiece = piece; }
public OperationStatus() { Count = 1; PreviousPiece = null; }