1 require 'games/state_base'
5 class State < StateBase
6 def initialize(board, pool_factory, move_factory, piece_factory)
7 super(board, move_factory, piece_factory)
8 @pools = to_enum(:each_color).inject({}) do |res, c|
9 res[c] = pool_factory.new
15 def initialize_copy(other)
17 @pools = to_enum(:each_color).inject({}) do |res, c|
18 res[c] = other.pool(c).dup
29 (0...@board.size.x).each do |i|
30 @board[Point.new(i, row(2, color))] = piece_factory.new(color, :pawn)
34 set_piece = lambda do |x, type|
35 @board[Point.new(x, r)] = piece_factory.new(color, type)
48 @board[Point.new(r, r)] = piece_factory.new(color, :rook)
49 @board[Point.new(@board.size.x - r - 1, r)] = piece_factory.new(color, :bishop)
59 color == :black ? @board.size.y - 1 - i : i
62 def opposite_color(color)
63 color == :black ? :white : :black
67 Point.new(0, color == :black ? -1 : 1)
72 pool(turn).remove(move.dropped)
73 board[move.dst] = move.dropped
75 captured = basic_move(move)
77 board[move.dst] = promoted(board[move.dst])
80 piece = piece_factory.new(turn, captured.type)
81 pool(turn).add(demoted(piece))
88 @turn = opposite_color(@turn)
91 def in_promotion_zone?(p, color)
92 (row(6, color) <=> p.y) != (color == :black ? -1 : 1)
98 ('promoted_' + piece.type.to_s).to_sym)
104 piece.type.to_s.gsub(/^promoted_/, '').to_sym)
107 def promoted_type?(type)
108 type.to_s =~ /^promoted_/
112 promoted_type? piece.type