public void Init() { BoardManager.Init(); PiecePrefabs.Load(); SpriteManager.Load(); ControlForLocalObject.SetActive(!GameServer.IsOnline); ControlForOnlineObject.SetActive(GameServer.IsOnline); }
void DoMoveGUI() { Winner = MyColor == SColor.NB ? SColor.NB : Winner; var us = Position.sideToMove; var from = MouseControl.PickedFrom; var to = MouseControl.PickedTo; var pt = Position.PieceOn(from).Type(); bool canPromote = (from.IsBoardPiece() && pt < Piece.GOLD) ? (Util.CanPromote(us, (Square)from) | Util.CanPromote(us, (Square)to)) : false; // 1. 駒打ち // 2. 成ることができないとき // 3. 不成ができないとき // 4. 成り・不成が選択できるとき Move m = Move.NONE; if (canPromote && pt == Piece.PAWN) // 3 { m = Util.MakeMove(from, to, true); } else { m = Util.MakeMove(from, to, false); // 1,2,4 } if (!Position.IsLegal(m)) { MouseControl.State = MouseStateEnum.None; return; } if (canPromote && pt != Piece.PAWN) // 4 { PiecePrefabs.PutPromotedialog((Square)MouseControl.PickedTo, Position.PieceOn(from), transform); MouseControl.State = MouseStateEnum.PromoteDialog; MouseControl.Select = PromoteDialogSelectEnum.None; } else // 1,2,3 { MouseControl.State = MouseStateEnum.None; if (GameServer.IsOnline) { photonView.RPC(nameof(DoMove), RpcTarget.All, m, true); } else { DoMove(m); } } }
void UndoMove(Move move, bool overwrite = true) { --CurrentValue; if (overwrite) { RemoveItem(MoveList.Count - 1, 1); MoveList.RemoveAt(MoveList.Count - 1); } ScreenControl.Interactable(MyColor == SColor.NB, Winner != SColor.NB); if (move.IsSpecial()) { return; } var us = Position.sideToMove.Not(); var st = Position.State(); Debug.Assert(move == st.lastMove); Square to = move.To(); Piece toPc = Position.PieceOn(to); PieceNo pn = Position.PieceNoOn(to); SquareHand from = move.IsDrop() ? Util.MakeSquareHand(us, move.DroppedPiece()) : (SquareHand)move.From(); Piece fromPc = move.IsPromote() ? toPc.RawType() : toPc; PiecePrefabs.MovePiece(from, fromPc, pn, move.IsPromote()); Piece capPc = st.capturedPiece; if (capPc != Piece.NO_PIECE) { // 駒台の駒をtoに移動 Piece pr = capPc.RawType(); PieceNo pn2 = Position.HandPieceNo(us, pr, Position.Hand(us).Count(pr) - 1); Debug.Assert(pn2 != PieceNo.NONE); PiecePrefabs.CapturePiece((SquareHand)to, capPc.Type(), pn2, MyColor == SColor.NB); // テキストを非表示にする // Counters(Util.MakeSquareHand(us, pr)).text = null; } BoardManager.UnDoMove(); }
void SetBoard(SColor us) { var sq = new Square[] { Square.SQ_55, Square.SQ_54, Square.SQ_45, Square.SQ_35, Square.SQ_25, Square.SQ_15, Square.SQ_11, Square.SQ_12, Square.SQ_21, Square.SQ_31, Square.SQ_41, Square.SQ_51, }; var piece = new Piece[] { Piece.B_KING, Piece.B_PAWN, Piece.B_GOLD, Piece.B_SILVER, Piece.B_BISHOP, Piece.B_ROOK, Piece.W_KING, Piece.W_PAWN, Piece.W_GOLD, Piece.W_SILVER, Piece.W_BISHOP, Piece.W_ROOK, }; PiecePrefabs.Clear(); for (int i = 0; i < 12; ++i) { PiecePrefabs.PutPiece(sq[i], piece[i], Position.PieceNoOn(sq[i]), us, transform); } }
public void DoMove(Move move, bool overwrite = true) { //Debug.Log(USIExtensions.USI(move)); if (overwrite) { // 上書きする指し手の数 var num = MoveList.Count - Position.gamePly; if (num > 0) { // 棋譜を上書きする RemoveItem(Position.gamePly, num); MoveList.RemoveRange(Position.gamePly, num); CurrentValue = Position.gamePly; } EntryItem(move); MoveList.Add(move); } ++CurrentValue; //Debug.Log(CurrentValue); var us = Position.sideToMove; var from = move.From(); if (move.IsSpecial()) { if (move == Move.RESIGN) { Winner = us.Not(); } ScreenControl.Interactable(MyColor == SColor.NB, true); return; } ScreenControl.Interactable(MyColor == SColor.NB, false); Piece movedPc = move.IsDrop() ? move.DroppedPiece() : Position.PieceOn(from); Piece movedAfterPc = move.IsPromote() ? movedPc.ToInt() + Piece.PROMOTE : movedPc; PieceNo pn = move.IsDrop() ? Position.HandPieceNo(us, movedPc, Position.Hand(us).Count(movedPc) - 1) : Position.PieceNoOn(from); Debug.Assert(pn != PieceNo.NONE); PiecePrefabs.MovePiece((SquareHand)move.To(), movedAfterPc, pn, move.IsPromote()); PieceNo pn2 = Position.PieceNoOn(move.To()); if (pn2 != PieceNo.NONE) { var toPr = Position.PieceOn(move.To()).RawType(); var sq = Util.MakeSquareHand(us, toPr); PiecePrefabs.CapturePiece(sq, toPr, pn2, true); // テキストを表示 // if (Position.Hand(us).Count(toPr) == 1) // Counters(Util.MakeSquareHand(us, toPr)).text = "2"; } BoardManager.DoMove(move); EndGame(); }