Ejemplo n.º 1
0
        /// <summary>
        /// 盤面の駒が移動したときに呼ばれます。
        /// </summary>
        private void OnBoardPieceChanged(object sender, BoardChangedEventArgs e)
        {
            var move = e.Move;
            if ((object)move == null || !move.Validate())
            {
                return;
            }

            // 一応
            EndMove();

            // 指し手が進んだときのエフェクトを追加します。
            if (EffectManager != null)
            {
                EffectManager.Moved(move, e.IsUndo);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 盤面の駒が移動したときに呼ばれます。
        /// </summary>
        private void OnBoardPieceChanged(object sender, BoardChangedEventArgs e)
        {
            var move = e.Move;
            if ((object)move == null || !move.Validate())
            {
                return;
            }

            // 短縮形
            var np = move.DstSquare;
            var op = move.SrcSquare;

            // 一応
            EndMove();

            // リドゥ・アンドゥ両方に対応します。
            if (np != null)
            {
                RemovePieceObject(np);
            }
            if (op != null)
            {
                RemovePieceObject(op);
            }

            // 駒打ち
            if (move.DropPieceType != PieceType.None)
            {
                SyncCapturedPieceCount(
                    move.DropPieceType,
                    move.BWType);
            }

            // 駒を取った場合
            if (move.TookPiece != null)
            {
                SyncCapturedPieceCount(
                    move.TookPiece.PieceType,
                    move.BWType);

                // 取った駒を元の位置に戻します。
                if (e.IsUndo)
                {
                    AddPieceObject(new PieceObject(this, Board[np], np));
                }
            }

            // リドゥ時は新しい場所に、アンドゥ時は昔の場所に駒をおきます。
            // アンドゥで駒打ちの場合、追加される駒はありません。
            var square = (e.IsUndo ? move.SrcSquare : move.DstSquare);
            if (square != null)
            {
                AddPieceObject(new PieceObject(this, Board[square], square));
            }

            // 指し手が進んだときのエフェクトを追加します。
            if (EffectManager != null)
            {
                EffectManager.Moved(move, e.IsUndo);
            }
        }