Ported crazyhouse piece. Working on crazyhouse game state.
[tagua.git] / src / hlvariant / crazyhouse / gamestate.h
blob0115c4c412cf1e4a7c9f67c72c0a0dec34bf9636
1 #ifndef HLVARIANT__CRAZYHOUSE__GAMESTATE_H
2 #define HLVARIANT__CRAZYHOUSE__GAMESTATE_H
4 #include "../chess/gamestate.h"
5 #include "../pool.h"
6 #include "../poolcollection.h"
8 namespace HLVariant {
9 namespace Crazyhouse {
11 template <typename _Board, typename _Move>
12 class GameState : public HLVariant::Chess::GameState<_Board, _Move> {
13 typedef HLVariant::Chess::GameState<_Board, _Move> Base;
14 public:
15 typedef typename Base::Board Board;
16 typedef typename Base::Move Move;
17 typedef typename Base::Piece Piece;
18 typedef Pool<Piece> Pool;
19 typedef PoolCollection<Pool> Pools;
20 private:
21 using Base::m_board;
22 Pools m_pools;
23 public:
24 virtual const Pools& pools() const;
25 virtual Pools& pools();
27 virtual void captureOn(const Point& p);
28 virtual void move(const Move& m);
31 // IMPLEMENTATION
33 template <typename Board, typename Move>
34 const typename GameState<Board, Move>::Pools& GameState<Board, Move>::pools() const {
35 return m_pools;
38 template <typename Board, typename Move>
39 typename GameState<Board, Move>::Pools& GameState<Board, Move>::pools() {
40 return m_pools;
43 template <typename Board, typename Move>
44 void GameState<Board, Move>::move(const Move& m) {
45 if (m.drop() == Piece()) {
46 Base::move(m);
48 if (m.promoteTo() != -1) {
49 Piece promoted = m_board.get(m.to());
50 promoted.setPromoted();
51 m_board.set(m.to(), promoted);
54 else {
55 m_board.set(m.to(), m.drop());
56 m_pools.pool(m.drop().color()).remove(m.drop().type());
60 template <typename Board, typename Move>
61 void GameState<Board, Move>::captureOn(const Point& p) {
62 Piece captured = m_board.get(p);
63 if (captured != Piece()) {
64 m_pools.pool(captured.color()).add(captured.actualType());
66 Base::captureOn(p);
69 } // namespace Crazyhouse
70 } // namespace HLVariant
72 #endif // HLVARIANT__CRAZYHOUSE__GAMESTATE_H