33#include " PlayerSocket.hpp"
44#include " ../Util.hpp"
55
6+ #define CheckersInvertRole (role ) (role == 0 ? 1 : 0 )
7+
68namespace Win7 {
79
810CheckersMatch::CheckersMatch (PlayerSocket& player) :
911 Match (player),
12+ m_playerCheckersLeft ({ 12 , 12 }),
1013 m_drawOfferedBy (-1 )
1114{}
1215
@@ -57,6 +60,21 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
5760 if (targetY < 0 || targetY >= 8 )
5861 throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" Move\" : Invalid target Y value!" );
5962
63+ const int xDiff = abs (sourceX - targetX);
64+ const int yDiff = abs (sourceY - targetY);
65+ if (xDiff != 1 || yDiff != 1 )
66+ {
67+ if (xDiff == 2 && yDiff == 2 ) // Captured an opponent piece
68+ {
69+ if (--m_playerCheckersLeft[CheckersInvertRole (caller.m_role )] <= 0 )
70+ m_state = STATE_GAMEOVER;
71+ }
72+ else
73+ {
74+ throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" Move\" : Invalid move!" );
75+ }
76+ }
77+
6078 XMLPrinter sanitizedMoveMessage;
6179 sanitizedMoveMessage.OpenElement (" Message" );
6280 sanitizedMoveMessage.OpenElement (" Move" );
@@ -93,7 +111,7 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
93111 if (!strcmp (elMethod->GetText (), " OfferDraw" )) // Player has offered a draw to their opponent
94112 {
95113 if (m_drawOfferedBy >= 0 )
96- return {} ;
114+ throw std::runtime_error ( " CheckersMatch::ProcessEvent(): \" GameManagement \" -> \" OfferDraw \" : Draw already offered! " ) ;
97115
98116 m_drawOfferedBy = caller.m_role ;
99117 return {
@@ -102,8 +120,10 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
102120 }
103121 if (!strcmp (elMethod->GetText (), " DrawAccept" )) // Player has accepted a draw request by the opponent
104122 {
105- if (m_drawOfferedBy < 0 || m_drawOfferedBy == caller.m_role )
106- return {};
123+ if (m_drawOfferedBy < 0 )
124+ throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" GameManagement\" -> \" DrawAccept\" : No draw was offered!" );
125+ if (m_drawOfferedBy == caller.m_role )
126+ throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" GameManagement\" -> \" DrawAccept\" : Draw was offered by this player!" );
107127
108128 m_drawOfferedBy = -1 ;
109129 m_state = STATE_GAMEOVER;
@@ -115,8 +135,10 @@ CheckersMatch::ProcessEvent(const tinyxml2::XMLElement& elEvent, const PlayerSoc
115135 }
116136 if (!strcmp (elMethod->GetText (), " DrawReject" )) // Player has rejected a draw request by their opponent
117137 {
118- if (m_drawOfferedBy < 0 || m_drawOfferedBy == caller.m_role )
119- return {};
138+ if (m_drawOfferedBy < 0 )
139+ throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" GameManagement\" -> \" DrawReject\" : No draw was offered!" );
140+ if (m_drawOfferedBy == caller.m_role )
141+ throw std::runtime_error (" CheckersMatch::ProcessEvent(): \" GameManagement\" -> \" DrawReject\" : Draw was offered by this player!" );
120142
121143 m_drawOfferedBy = -1 ;
122144 return {
0 commit comments