1from pychess.Utils.const import SETUPCHESS, VARIANTS_OTHER, BLACK, reprSign
2from pychess.Utils.Board import Board
3from pychess.Utils.Piece import Piece
4from pychess.Utils.lutils.LBoard import LBoard
5
6SETUPSTART = "4k3/8/8/8/8/8/8/4K3 w - - 0 1"
7
8
9class SetupBoard(Board):
10    variant = SETUPCHESS
11    __desc__ = ""
12    name = ""
13    cecp_name = ""
14    standard_rules = False
15    variant_group = VARIANTS_OTHER
16
17    PROMOTION_ZONE = ((), ())
18    PROMOTIONS = ()
19
20    def __init__(self, setup=True, lboard=None):
21        fenstr = SETUPSTART if setup is True else setup
22        # add all kind of pieces to holdings
23        parts = fenstr.split()
24        parts[0] += "/prnsqkPRNSQK"
25        fenstr = " ".join(parts)
26        if lboard is not None:
27            Board.__init__(self, setup=fenstr, lboard=lboard)
28        else:
29            Board.__init__(self, setup=fenstr)
30        self._ply = 0
31
32    def _get_ply(self):
33        return self._ply
34
35    ply = property(_get_ply)
36
37    def simulateMove(self, board, move):
38        moved = []
39        new = []
40        dead = []
41
42        cord0, cord1 = move.cord0, move.cord1
43        if cord1.x < 0 or cord1.x > self.FILES - 1:
44            dead.append(self[cord0])
45        else:
46            moved.append((self[cord0], cord0))
47
48        return moved, new, dead
49
50    def move(self, move, color):
51        new_board = self.clone()
52        new_board._ply = self._ply + 1
53        cord0, cord1 = move.cord0, move.cord1
54        if cord0.x < 0 or cord0.x > self.FILES - 1 and \
55                (cord1.x >= 0 and cord1.x <= 7):
56            new_board[cord1] = new_board[cord0]
57            new_board[cord0] = Piece(color, self[cord0].sign)
58        elif cord1.x < 0 or cord1.x > self.FILES - 1:
59            new_board[cord0] = None
60        else:
61            new_board[cord1] = new_board[cord0]
62            new_board[cord0] = None
63        return new_board
64
65    def as_fen(self, variant):
66        fenstr = []
67        for r, row in enumerate(reversed(self.data)):
68            empty = 0
69            for i in range(0, 8):
70                piece = row.get(i)
71                if piece is not None:
72                    if empty > 0:
73                        fenstr.append(str(empty))
74                        empty = 0
75                    sign = reprSign[piece.piece]
76                    if piece.color == BLACK:
77                        sign = sign.lower()
78                    else:
79                        sign = sign.upper()
80                    fenstr.append(sign)
81                else:
82                    empty += 1
83            if empty > 0:
84                fenstr.append(str(empty))
85            if r != 7:
86                fenstr.append("/")
87
88        board = LBoard(variant)
89        board.applyFen("".join(fenstr) + " w")
90        return board.asFen().split()[0]
91
92    def __repr__(self):
93        return self.as_fen()
94