Enabled ICS for Chess and Crazyhouse.
[tagua/yd.git] / src / hlvariant / crazyhouse / gamestate.h
blob289d46648f459520192e58acc137e805300869ea
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 GameState();
25 GameState(typename Piece::Color, bool, bool, bool, bool, const Point&);
27 virtual const Pools& pools() const;
28 virtual Pools& pools();
30 virtual void captureOn(const Point& p);
31 virtual void move(const Move& m);
34 // IMPLEMENTATION
36 template <typename Board, typename Move>
37 GameState<Board, Move>::GameState() { }
39 template <typename Board, typename Move>
40 GameState<Board, Move>::GameState(
41 typename Piece::Color turn,
42 bool wk,
43 bool wq,
44 bool bk,
45 bool bq,
46 const Point& ep)
47 : Base(turn, wk, wq, bk, bq, ep) { }
49 template <typename Board, typename Move>
50 const typename GameState<Board, Move>::Pools& GameState<Board, Move>::pools() const {
51 return m_pools;
54 template <typename Board, typename Move>
55 typename GameState<Board, Move>::Pools& GameState<Board, Move>::pools() {
56 return m_pools;
59 template <typename Board, typename Move>
60 void GameState<Board, Move>::move(const Move& m) {
61 if (m.drop() == Piece()) {
62 Base::move(m);
64 if (m.promoteTo() != -1) {
65 Piece promoted = m_board.get(m.to());
66 promoted.setPromoted();
67 m_board.set(m.to(), promoted);
70 else {
71 m_board.set(m.to(), m.drop());
72 m_pools.pool(m.drop().color()).remove(m.drop().type());
73 this->switchTurn();
77 template <typename Board, typename Move>
78 void GameState<Board, Move>::captureOn(const Point& p) {
79 Piece captured = m_board.get(p);
80 if (captured != Piece()) {
81 m_pools.pool(Piece::oppositeColor(captured.color()))
82 .add(captured.actualType());
84 Base::captureOn(p);
87 } // namespace Crazyhouse
88 } // namespace HLVariant
90 #endif // HLVARIANT__CRAZYHOUSE__GAMESTATE_H