Transfer new blind options in network games.

This commit is contained in:
lotodore
2007-10-02 15:00:33 +00:00
parent 8c88b68476
commit 6bfea736cf
5 changed files with 223 additions and 64 deletions
+30 -11
View File
@@ -77,10 +77,10 @@ Server Reply: Init ACK
| Your Player ID | | Your Player ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Player ID:
Unique Player ID
Session ID: Session ID:
Unique Session ID which is not known by other players Unique Session ID which is not known by other players
Player ID:
Unique Player ID
Server Notification: Game List New Server Notification: Game List New
@@ -116,9 +116,8 @@ Server Notification: Game List New
/ | / |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Game List notifications will be automatically sent if the player Game List notifications will be automatically sent if the player
is in the lobby. If a game is joined/started, no more messages is in the lobby. The player remains in the lobby at all times
will be sent. As soon as the player leaves a game without while connected to the server.
disconnecting, Game List notifications will be sent again.
Game Mode: Game Mode:
1: Game Created 1: Game Created
@@ -212,14 +211,22 @@ Client Request: Create Game
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Password Length | Game Name Length | | Password Length | Game Name Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Max Number of Players | Small Blind | | Max Number of Players | First Small Blind |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Hands before raise | Proposed GUI Speed | | Raise Interval Mode | Raise Small Blind Interval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Player Action Timeout | Reserved | | Raise Mode | End Raise Mode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| End Raise Small Blind Value | Number of Manual Blinds |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Proposed GUI Speed | Player Action Timeout |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Start Money | | Start Money |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ Manual Blind Slot #1 | Manual Blind Slot #2 /
| +-------------------------------+
/ Manual Blind Slot #n | padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
\ Password (UTF-8) / \ Password (UTF-8) /
| +-------------------------------+ | +-------------------------------+
@@ -236,6 +243,8 @@ Proposed GUI Speed:
1-11 1-11
Player Action Timeout: Player Action Timeout:
# seconds # seconds
Manual Blind Slots
can be 0, up to a number of 30.
Client Request: Join Game Client Request: Join Game
@@ -261,18 +270,28 @@ Server Reply: Join Game Ack
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type = 11 | Message Length = 24 | | Message Type = 11 | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Game ID | | Game ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Player Rights | Max Number of Players | | Player Rights | Max Number of Players |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Small Blind | Hands before raise | | First Small Blind | Raise Interval Mode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Proposed GUI Speed | Player Action Timeout | | Raise Small Blind Interval | Raise Mode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| End Raise Mode | End Raise Small Blind Value |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Manual Blinds | Proposed GUI Speed |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Player Action Timeout | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Start Money | | Start Money |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\ Manual Blind Slot #1 | Manual Blind Slot #2 /
| +-------------------------------+
/ Manual Blind Slot #n | padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Server Reply: Join Game Failed Server Reply: Join Game Failed
+5 -5
View File
@@ -32,19 +32,19 @@ enum GameMode
enum RaiseIntervalMode enum RaiseIntervalMode
{ {
RAISE_ON_HANDNUMBER, RAISE_ON_HANDNUMBER = 1,
RAISE_ON_MINUTES RAISE_ON_MINUTES
}; };
enum RaiseMode enum RaiseMode
{ {
DOUBLE_BLINDS, DOUBLE_BLINDS = 1,
MANUAL_BLINDS_ORDER MANUAL_BLINDS_ORDER
}; };
enum AfterManualBlindsMode enum AfterManualBlindsMode
{ {
AFTERMB_DOUBLE_BLINDS, AFTERMB_DOUBLE_BLINDS = 1,
AFTERMB_RAISE_ABOUT, AFTERMB_RAISE_ABOUT,
AFTERMB_STAY_AT_LAST_BLIND AFTERMB_STAY_AT_LAST_BLIND
}; };
@@ -55,7 +55,7 @@ struct GameData
GameData() : maxNumberOfPlayers(0), startMoney(0), smallBlind(0), firstSmallBlind(0), raiseIntervalMode(RAISE_ON_HANDNUMBER), raiseSmallBlindEveryHandsValue(8), raiseSmallBlindEveryMinutesValue(0), raiseMode(DOUBLE_BLINDS), afterManualBlindsMode(AFTERMB_DOUBLE_BLINDS), afterMBAlwaysRaiseValue(0), handsBeforeRaise(1), guiSpeed(4), playerActionTimeoutSec(20) {} GameData() : maxNumberOfPlayers(0), startMoney(0), smallBlind(0), firstSmallBlind(0), raiseIntervalMode(RAISE_ON_HANDNUMBER), raiseSmallBlindEveryHandsValue(8), raiseSmallBlindEveryMinutesValue(0), raiseMode(DOUBLE_BLINDS), afterManualBlindsMode(AFTERMB_DOUBLE_BLINDS), afterMBAlwaysRaiseValue(0), handsBeforeRaise(1), guiSpeed(4), playerActionTimeoutSec(20) {}
int maxNumberOfPlayers; int maxNumberOfPlayers;
int startMoney; int startMoney;
int smallBlind; int smallBlind; // deprecated
int firstSmallBlind; int firstSmallBlind;
RaiseIntervalMode raiseIntervalMode; RaiseIntervalMode raiseIntervalMode;
int raiseSmallBlindEveryHandsValue; int raiseSmallBlindEveryHandsValue;
@@ -64,7 +64,7 @@ struct GameData
std::list<int> manualBlindsList; std::list<int> manualBlindsList;
AfterManualBlindsMode afterManualBlindsMode; AfterManualBlindsMode afterManualBlindsMode;
int afterMBAlwaysRaiseValue; int afterMBAlwaysRaiseValue;
int handsBeforeRaise; int handsBeforeRaise; // deprecated
int guiSpeed; int guiSpeed;
int playerActionTimeoutSec; int playerActionTimeoutSec;
}; };
+186 -48
View File
@@ -190,11 +190,15 @@ struct GCC_PACKED NetPacketCreateGameData
u_int16_t passwordLength; u_int16_t passwordLength;
u_int16_t gameNameLength; u_int16_t gameNameLength;
u_int16_t maxNumberOfPlayers; u_int16_t maxNumberOfPlayers;
u_int16_t smallBlind; u_int16_t firstSmallBlind;
u_int16_t handsBeforeRaise; u_int16_t raiseIntervalMode;
u_int16_t raiseSmallBlindInterval;
u_int16_t raiseMode;
u_int16_t endRaiseMode;
u_int16_t endRaiseSmallBlindValue;
u_int16_t numberOfManualBlinds;
u_int16_t proposedGuiSpeed; u_int16_t proposedGuiSpeed;
u_int16_t playerActionTimeout; u_int16_t playerActionTimeout;
u_int16_t reserved;
u_int32_t startMoney; u_int32_t startMoney;
}; };
@@ -212,10 +216,16 @@ struct GCC_PACKED NetPacketJoinGameAckData
u_int32_t gameId; u_int32_t gameId;
u_int16_t playerRights; u_int16_t playerRights;
u_int16_t maxNumberOfPlayers; u_int16_t maxNumberOfPlayers;
u_int16_t smallBlind; u_int16_t firstSmallBlind;
u_int16_t handsBeforeRaise; u_int16_t raiseIntervalMode;
u_int16_t raiseSmallBlindInterval;
u_int16_t raiseMode;
u_int16_t endRaiseMode;
u_int16_t endRaiseSmallBlindValue;
u_int16_t numberOfManualBlinds;
u_int16_t proposedGuiSpeed; u_int16_t proposedGuiSpeed;
u_int16_t playerActionTimeout; u_int16_t playerActionTimeout;
u_int16_t reserved;
u_int32_t startMoney; u_int32_t startMoney;
}; };
@@ -1134,8 +1144,8 @@ NetPacketGameListNew::SetData(const NetPacketGameListNew::Data &inData)
tmpData->curNumberOfPlayers = htons(curNumPlayers); tmpData->curNumberOfPlayers = htons(curNumPlayers);
tmpData->gameFlags = htons(inData.gameInfo.isPasswordProtected ? NET_GAME_FLAG_PASSWORD_PROTECTED : 0); tmpData->gameFlags = htons(inData.gameInfo.isPasswordProtected ? NET_GAME_FLAG_PASSWORD_PROTECTED : 0);
tmpData->maxNumberOfPlayers = htons(inData.gameInfo.data.maxNumberOfPlayers); tmpData->maxNumberOfPlayers = htons(inData.gameInfo.data.maxNumberOfPlayers);
tmpData->smallBlind = htons(inData.gameInfo.data.smallBlind); tmpData->smallBlind = htons(inData.gameInfo.data.firstSmallBlind);
tmpData->handsBeforeRaise = htons(inData.gameInfo.data.handsBeforeRaise); tmpData->handsBeforeRaise = htons(inData.gameInfo.data.raiseSmallBlindEveryHandsValue);
tmpData->proposedGuiSpeed = htons(inData.gameInfo.data.guiSpeed); tmpData->proposedGuiSpeed = htons(inData.gameInfo.data.guiSpeed);
tmpData->playerActionTimeout = htons(inData.gameInfo.data.playerActionTimeoutSec); tmpData->playerActionTimeout = htons(inData.gameInfo.data.playerActionTimeoutSec);
tmpData->startMoney = htonl(inData.gameInfo.data.startMoney); tmpData->startMoney = htonl(inData.gameInfo.data.startMoney);
@@ -1172,8 +1182,8 @@ NetPacketGameListNew::GetData(NetPacketGameListNew::Data &outData) const
u_int16_t curNumPlayers = ntohs(tmpData->curNumberOfPlayers); u_int16_t curNumPlayers = ntohs(tmpData->curNumberOfPlayers);
outData.gameInfo.isPasswordProtected = ntohs(tmpData->gameFlags) == NET_GAME_FLAG_PASSWORD_PROTECTED; outData.gameInfo.isPasswordProtected = ntohs(tmpData->gameFlags) == NET_GAME_FLAG_PASSWORD_PROTECTED;
outData.gameInfo.data.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers); outData.gameInfo.data.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameInfo.data.smallBlind = ntohs(tmpData->smallBlind); outData.gameInfo.data.firstSmallBlind = ntohs(tmpData->smallBlind);
outData.gameInfo.data.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise); outData.gameInfo.data.raiseSmallBlindEveryHandsValue = ntohs(tmpData->handsBeforeRaise);
outData.gameInfo.data.guiSpeed = ntohs(tmpData->proposedGuiSpeed); outData.gameInfo.data.guiSpeed = ntohs(tmpData->proposedGuiSpeed);
outData.gameInfo.data.playerActionTimeoutSec= ntohs(tmpData->playerActionTimeout); outData.gameInfo.data.playerActionTimeoutSec= ntohs(tmpData->playerActionTimeout);
outData.gameInfo.data.startMoney = ntohl(tmpData->startMoney); outData.gameInfo.data.startMoney = ntohl(tmpData->startMoney);
@@ -1606,6 +1616,7 @@ NetPacketCreateGame::SetData(const NetPacketCreateGame::Data &inData)
{ {
u_int16_t gameNameLen = (u_int16_t)inData.gameName.length(); u_int16_t gameNameLen = (u_int16_t)inData.gameName.length();
u_int16_t passwordLen = (u_int16_t)inData.password.length(); u_int16_t passwordLen = (u_int16_t)inData.password.length();
u_int16_t numManualBlinds = (u_int16_t)inData.gameData.manualBlindsList.size();
// Some basic checks, so we don't use up too much memory. // Some basic checks, so we don't use up too much memory.
// The constructed packet will also be checked. // The constructed packet will also be checked.
@@ -1613,24 +1624,46 @@ NetPacketCreateGame::SetData(const NetPacketCreateGame::Data &inData)
throw NetException(ERR_NET_INVALID_PLAYER_NAME, 0); throw NetException(ERR_NET_INVALID_PLAYER_NAME, 0);
if (passwordLen > MAX_PASSWORD_SIZE) if (passwordLen > MAX_PASSWORD_SIZE)
throw NetException(ERR_NET_INVALID_PASSWORD_STR, 0); throw NetException(ERR_NET_INVALID_PASSWORD_STR, 0);
if (numManualBlinds > MAX_NUM_MANUAL_BLINDS)
throw NetException(ERR_NET_TOO_MANY_MANUAL_BLINDS, 0);
int manualBlindsSize = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
// Resize the packet so that the data fits in. // Resize the packet so that the data fits in.
Resize((u_int16_t) Resize((u_int16_t)
(sizeof(NetPacketCreateGameData) + ADD_PADDING(gameNameLen) + ADD_PADDING(passwordLen))); (sizeof(NetPacketCreateGameData) + manualBlindsSize + ADD_PADDING(gameNameLen) + ADD_PADDING(passwordLen)));
NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)GetRawData(); NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)GetRawData();
// Set the data. // Set the data.
tmpData->passwordLength = htons(passwordLen); tmpData->passwordLength = htons(passwordLen);
tmpData->gameNameLength = htons(gameNameLen); tmpData->gameNameLength = htons(gameNameLen);
tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers); tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers);
tmpData->smallBlind = htons(inData.gameData.smallBlind); tmpData->firstSmallBlind = htons(inData.gameData.firstSmallBlind);
tmpData->handsBeforeRaise = htons(inData.gameData.handsBeforeRaise); tmpData->raiseIntervalMode = htons(inData.gameData.raiseIntervalMode);
tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed); tmpData->raiseSmallBlindInterval = inData.gameData.raiseIntervalMode == RAISE_ON_HANDNUMBER
tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec); ? htons(inData.gameData.raiseSmallBlindEveryHandsValue) : htons(inData.gameData.raiseSmallBlindEveryMinutesValue);
tmpData->startMoney = htonl(inData.gameData.startMoney); tmpData->raiseMode = htons(inData.gameData.raiseMode);
tmpData->endRaiseMode = htons(inData.gameData.afterManualBlindsMode);
tmpData->endRaiseSmallBlindValue = htons(inData.gameData.afterMBAlwaysRaiseValue);
tmpData->numberOfManualBlinds = htons(numManualBlinds);
tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed);
tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec);
tmpData->startMoney = htonl(inData.gameData.startMoney);
char *passwordPtr = (char *)tmpData + sizeof(NetPacketCreateGameData); if (numManualBlinds)
{
u_int16_t *manualBlindsPtr = (u_int16_t *)((char *)tmpData + sizeof(NetPacketCreateGameData));
list<int>::const_iterator i = inData.gameData.manualBlindsList.begin();
list<int>::const_iterator end = inData.gameData.manualBlindsList.end();
while (i != end)
{
*manualBlindsPtr = htons(*i);
++manualBlindsPtr;
++i;
}
}
char *passwordPtr = (char *)tmpData + sizeof(NetPacketCreateGameData) + manualBlindsSize;
memcpy(passwordPtr, inData.password.c_str(), passwordLen); memcpy(passwordPtr, inData.password.c_str(), passwordLen);
memcpy(passwordPtr + ADD_PADDING(passwordLen), inData.gameName.c_str(), gameNameLen); memcpy(passwordPtr + ADD_PADDING(passwordLen), inData.gameName.c_str(), gameNameLen);
@@ -1644,15 +1677,37 @@ NetPacketCreateGame::GetData(NetPacketCreateGame::Data &outData) const
// We assume that the data is valid. Validity has already been checked. // We assume that the data is valid. Validity has already been checked.
NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)GetRawData(); NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)GetRawData();
outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers); u_int16_t numManualBlinds = ntohs(tmpData->numberOfManualBlinds);
outData.gameData.smallBlind = ntohs(tmpData->smallBlind); int manualBlindsSize = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
outData.gameData.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise);
outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed); outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout); outData.gameData.firstSmallBlind = ntohs(tmpData->firstSmallBlind);
outData.gameData.startMoney = ntohl(tmpData->startMoney); outData.gameData.smallBlind = ntohs(tmpData->firstSmallBlind); // TODO remove
outData.gameData.raiseIntervalMode = static_cast<RaiseIntervalMode>(ntohs(tmpData->raiseIntervalMode));
outData.gameData.raiseSmallBlindEveryHandsValue = outData.gameData.raiseSmallBlindEveryMinutesValue = 0;
if (outData.gameData.raiseIntervalMode == RAISE_ON_HANDNUMBER)
outData.gameData.raiseSmallBlindEveryHandsValue = ntohs(tmpData->raiseSmallBlindInterval);
else
outData.gameData.raiseSmallBlindEveryMinutesValue = ntohs(tmpData->raiseSmallBlindInterval);
outData.gameData.raiseMode = static_cast<RaiseMode>(ntohs(tmpData->raiseMode));
outData.gameData.afterManualBlindsMode = static_cast<AfterManualBlindsMode>(ntohs(tmpData->endRaiseMode));
outData.gameData.afterMBAlwaysRaiseValue = ntohs(tmpData->endRaiseSmallBlindValue);
outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed);
outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout);
outData.gameData.startMoney = ntohl(tmpData->startMoney);
if (numManualBlinds)
{
u_int16_t *manualBlindsPtr = (u_int16_t *)((char *)tmpData + sizeof(NetPacketCreateGameData));
for (u_int16_t i = 0; i < numManualBlinds; i++)
{
outData.gameData.manualBlindsList.push_back(*manualBlindsPtr);
++manualBlindsPtr;
}
}
u_int16_t passwordLen = ntohs(tmpData->passwordLength); u_int16_t passwordLen = ntohs(tmpData->passwordLength);
char *passwordPtr = (char *)tmpData + sizeof(NetPacketCreateGameData); char *passwordPtr = (char *)tmpData + manualBlindsSize + sizeof(NetPacketCreateGameData);
outData.password = string(passwordPtr, passwordLen); outData.password = string(passwordPtr, passwordLen);
outData.gameName = string(passwordPtr + ADD_PADDING(passwordLen), ntohs(tmpData->gameNameLength)); outData.gameName = string(passwordPtr + ADD_PADDING(passwordLen), ntohs(tmpData->gameNameLength));
} }
@@ -1670,14 +1725,22 @@ NetPacketCreateGame::InternalCheck(const NetPacketHeader* data) const
NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)data; NetPacketCreateGameData *tmpData = (NetPacketCreateGameData *)data;
int passwordLength = ntohs(tmpData->passwordLength); int passwordLength = ntohs(tmpData->passwordLength);
int gameNameLength = ntohs(tmpData->gameNameLength); int gameNameLength = ntohs(tmpData->gameNameLength);
int numManualBlinds = ntohs(tmpData->numberOfManualBlinds);
int manualBlindsLength = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
// Exact checking of dynamic packet size. // Exact checking of dynamic packet size.
if (dataLen < if (dataLen <
sizeof(NetPacketCreateGameData) sizeof(NetPacketCreateGameData)
+ manualBlindsLength
+ ADD_PADDING(passwordLength) + ADD_PADDING(passwordLength)
+ ADD_PADDING(gameNameLength)) + ADD_PADDING(gameNameLength))
{ {
throw NetException(ERR_SOCK_INVALID_PACKET, 0); throw NetException(ERR_SOCK_INVALID_PACKET, 0);
} }
// Check manual blind list size
if (numManualBlinds > MAX_NUM_MANUAL_BLINDS)
{
throw NetException(ERR_SOCK_INVALID_PACKET, 0);
}
// Check string sizes. // Check string sizes.
if (passwordLength > MAX_PASSWORD_SIZE if (passwordLength > MAX_PASSWORD_SIZE
|| !gameNameLength || !gameNameLength
@@ -1686,7 +1749,7 @@ NetPacketCreateGame::InternalCheck(const NetPacketHeader* data) const
throw NetException(ERR_SOCK_INVALID_PACKET, 0); throw NetException(ERR_SOCK_INVALID_PACKET, 0);
} }
// Check name string. // Check name string.
char *namePtr = (char *)tmpData + sizeof(NetPacketCreateGameData) + ADD_PADDING(passwordLength); char *namePtr = (char *)tmpData + sizeof(NetPacketCreateGameData) + manualBlindsLength + ADD_PADDING(passwordLength);
if (namePtr[0] == 0) if (namePtr[0] == 0)
{ {
throw NetException(ERR_SOCK_INVALID_PACKET, 0); throw NetException(ERR_SOCK_INVALID_PACKET, 0);
@@ -1696,8 +1759,11 @@ NetPacketCreateGame::InternalCheck(const NetPacketHeader* data) const
int proposedGuiSpeed = ntohs(tmpData->proposedGuiSpeed); int proposedGuiSpeed = ntohs(tmpData->proposedGuiSpeed);
if (maxNumPlayers < MIN_NUMBER_OF_PLAYERS if (maxNumPlayers < MIN_NUMBER_OF_PLAYERS
|| maxNumPlayers > MAX_NUMBER_OF_PLAYERS || maxNumPlayers > MAX_NUMBER_OF_PLAYERS
|| !ntohs(tmpData->smallBlind) || !ntohs(tmpData->firstSmallBlind)
|| !ntohs(tmpData->handsBeforeRaise) || !ntohs(tmpData->raiseIntervalMode)
|| !ntohs(tmpData->raiseSmallBlindInterval)
|| !ntohs(tmpData->raiseMode)
|| !ntohs(tmpData->endRaiseMode)
|| proposedGuiSpeed < MIN_GUI_SPEED || proposedGuiSpeed < MIN_GUI_SPEED
|| proposedGuiSpeed > MAX_GUI_SPEED || proposedGuiSpeed > MAX_GUI_SPEED
|| !ntohl(tmpData->startMoney)) || !ntohl(tmpData->startMoney))
@@ -1800,7 +1866,7 @@ NetPacketJoinGame::InternalCheck(const NetPacketHeader* data) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
NetPacketJoinGameAck::NetPacketJoinGameAck() NetPacketJoinGameAck::NetPacketJoinGameAck()
: NetPacket(NET_TYPE_JOIN_GAME_ACK, sizeof(NetPacketJoinGameAckData), sizeof(NetPacketJoinGameAckData)) : NetPacket(NET_TYPE_JOIN_GAME_ACK, sizeof(NetPacketJoinGameAckData), MAX_PACKET_SIZE)
{ {
} }
@@ -1825,17 +1891,48 @@ NetPacketJoinGameAck::Clone() const
void void
NetPacketJoinGameAck::SetData(const NetPacketJoinGameAck::Data &inData) NetPacketJoinGameAck::SetData(const NetPacketJoinGameAck::Data &inData)
{ {
u_int16_t numManualBlinds = (u_int16_t)inData.gameData.manualBlindsList.size();
// Some basic checks, so we don't use up too much memory.
// The constructed packet will also be checked.
if (numManualBlinds > MAX_NUM_MANUAL_BLINDS)
throw NetException(ERR_NET_TOO_MANY_MANUAL_BLINDS, 0);
int manualBlindsSize = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
// Resize the packet so that the data fits in.
Resize((u_int16_t)
(sizeof(NetPacketJoinGameAckData) + manualBlindsSize));
NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)GetRawData(); NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)GetRawData();
// Set the data. // Set the data.
tmpData->gameId = htonl(inData.gameId); tmpData->gameId = htonl(inData.gameId);
tmpData->playerRights = htons(inData.prights); tmpData->playerRights = htons(inData.prights);
tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers); tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers);
tmpData->smallBlind = htons(inData.gameData.smallBlind); tmpData->firstSmallBlind = htons(inData.gameData.firstSmallBlind);
tmpData->handsBeforeRaise = htons(inData.gameData.handsBeforeRaise); tmpData->raiseIntervalMode = htons(inData.gameData.raiseIntervalMode);
tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed); tmpData->raiseSmallBlindInterval = inData.gameData.raiseIntervalMode == RAISE_ON_HANDNUMBER
tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec); ? htons(inData.gameData.raiseSmallBlindEveryHandsValue) : htons(inData.gameData.raiseSmallBlindEveryMinutesValue);
tmpData->startMoney = htonl(inData.gameData.startMoney); tmpData->raiseMode = htons(inData.gameData.raiseMode);
tmpData->endRaiseMode = htons(inData.gameData.afterManualBlindsMode);
tmpData->endRaiseSmallBlindValue = htons(inData.gameData.afterMBAlwaysRaiseValue);
tmpData->numberOfManualBlinds = htons(numManualBlinds);
tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed);
tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec);
tmpData->startMoney = htonl(inData.gameData.startMoney);
if (numManualBlinds)
{
u_int16_t *manualBlindsPtr = (u_int16_t *)((char *)tmpData + sizeof(NetPacketJoinGameAckData));
list<int>::const_iterator i = inData.gameData.manualBlindsList.begin();
list<int>::const_iterator end = inData.gameData.manualBlindsList.end();
while (i != end)
{
*manualBlindsPtr = htons(*i);
++manualBlindsPtr;
++i;
}
}
// Check the packet - just in case. // Check the packet - just in case.
Check(GetRawData()); Check(GetRawData());
@@ -1847,14 +1944,36 @@ NetPacketJoinGameAck::GetData(NetPacketJoinGameAck::Data &outData) const
// We assume that the data is valid. Validity has already been checked. // We assume that the data is valid. Validity has already been checked.
NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)GetRawData(); NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)GetRawData();
outData.gameId = ntohl(tmpData->gameId); u_int16_t numManualBlinds = ntohs(tmpData->numberOfManualBlinds);
outData.prights = static_cast<PlayerRights>(ntohs(tmpData->playerRights)); int manualBlindsSize = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameData.smallBlind = ntohs(tmpData->smallBlind); outData.gameId = ntohl(tmpData->gameId);
outData.gameData.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise); outData.prights = static_cast<PlayerRights>(ntohs(tmpData->playerRights));
outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed); outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout); outData.gameData.firstSmallBlind = ntohs(tmpData->firstSmallBlind);
outData.gameData.startMoney = ntohl(tmpData->startMoney); outData.gameData.smallBlind = ntohs(tmpData->firstSmallBlind); // TODO remove
outData.gameData.raiseIntervalMode = static_cast<RaiseIntervalMode>(ntohs(tmpData->raiseIntervalMode));
outData.gameData.raiseSmallBlindEveryHandsValue = outData.gameData.raiseSmallBlindEveryMinutesValue = 0;
if (outData.gameData.raiseIntervalMode == RAISE_ON_HANDNUMBER)
outData.gameData.raiseSmallBlindEveryHandsValue = ntohs(tmpData->raiseSmallBlindInterval);
else
outData.gameData.raiseSmallBlindEveryMinutesValue = ntohs(tmpData->raiseSmallBlindInterval);
outData.gameData.raiseMode = static_cast<RaiseMode>(ntohs(tmpData->raiseMode));
outData.gameData.afterManualBlindsMode = static_cast<AfterManualBlindsMode>(ntohs(tmpData->endRaiseMode));
outData.gameData.afterMBAlwaysRaiseValue = ntohs(tmpData->endRaiseSmallBlindValue);
outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed);
outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout);
outData.gameData.startMoney = ntohl(tmpData->startMoney);
if (numManualBlinds)
{
u_int16_t *manualBlindsPtr = (u_int16_t *)((char *)tmpData + sizeof(NetPacketJoinGameAckData));
for (u_int16_t i = 0; i < numManualBlinds; i++)
{
outData.gameData.manualBlindsList.push_back(*manualBlindsPtr);
++manualBlindsPtr;
}
}
} }
const NetPacketJoinGameAck * const NetPacketJoinGameAck *
@@ -1866,14 +1985,33 @@ NetPacketJoinGameAck::ToNetPacketJoinGameAck() const
void void
NetPacketJoinGameAck::InternalCheck(const NetPacketHeader* data) const NetPacketJoinGameAck::InternalCheck(const NetPacketHeader* data) const
{ {
u_int16_t dataLen = ntohs(data->length);
NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)data; NetPacketJoinGameAckData *tmpData = (NetPacketJoinGameAckData *)data;
int numManualBlinds = ntohs(tmpData->numberOfManualBlinds);
int manualBlindsLength = ADD_PADDING(numManualBlinds * sizeof(u_int16_t));
// Exact checking of dynamic packet size.
if (dataLen <
sizeof(NetPacketJoinGameAckData)
+ manualBlindsLength)
{
throw NetException(ERR_SOCK_INVALID_PACKET, 0);
}
// Check manual blind list size
if (numManualBlinds > MAX_NUM_MANUAL_BLINDS)
{
throw NetException(ERR_SOCK_INVALID_PACKET, 0);
}
// Semantic checks // Semantic checks
int maxNumPlayers = ntohs(tmpData->maxNumberOfPlayers); int maxNumPlayers = ntohs(tmpData->maxNumberOfPlayers);
int proposedGuiSpeed = ntohs(tmpData->proposedGuiSpeed); int proposedGuiSpeed = ntohs(tmpData->proposedGuiSpeed);
if (maxNumPlayers < MIN_NUMBER_OF_PLAYERS if (maxNumPlayers < MIN_NUMBER_OF_PLAYERS
|| maxNumPlayers > MAX_NUMBER_OF_PLAYERS || maxNumPlayers > MAX_NUMBER_OF_PLAYERS
|| !ntohs(tmpData->smallBlind) || !ntohs(tmpData->firstSmallBlind)
|| !ntohs(tmpData->handsBeforeRaise) || !ntohs(tmpData->raiseIntervalMode)
|| !ntohs(tmpData->raiseSmallBlindInterval)
|| !ntohs(tmpData->raiseMode)
|| !ntohs(tmpData->endRaiseMode)
|| proposedGuiSpeed < MIN_GUI_SPEED || proposedGuiSpeed < MIN_GUI_SPEED
|| proposedGuiSpeed > MAX_GUI_SPEED || proposedGuiSpeed > MAX_GUI_SPEED
|| !ntohl(tmpData->startMoney)) || !ntohl(tmpData->startMoney))
+1
View File
@@ -34,6 +34,7 @@
#define MAX_PACKET_SIZE 256 #define MAX_PACKET_SIZE 256
#define MAX_NAME_SIZE 64 #define MAX_NAME_SIZE 64
#define MAX_PASSWORD_SIZE 64 #define MAX_PASSWORD_SIZE 64
#define MAX_NUM_MANUAL_BLINDS 30
#define MAX_CHAT_TEXT_SIZE 128 #define MAX_CHAT_TEXT_SIZE 128
#define MAX_NUM_PLAYER_RESULTS MAX_NUMBER_OF_PLAYERS #define MAX_NUM_PLAYER_RESULTS MAX_NUMBER_OF_PLAYERS
#define MAX_NUM_PLAYER_CARDS MAX_NUMBER_OF_PLAYERS #define MAX_NUM_PLAYER_CARDS MAX_NUMBER_OF_PLAYERS
+1
View File
@@ -57,6 +57,7 @@
#define ERR_NET_INVALID_ROUND 113 #define ERR_NET_INVALID_ROUND 113
#define ERR_NET_PLAYER_KICKED 114 #define ERR_NET_PLAYER_KICKED 114
#define ERR_NET_INVALID_PLAYER_COUNT 115 #define ERR_NET_INVALID_PLAYER_COUNT 115
#define ERR_NET_TOO_MANY_MANUAL_BLINDS 116
#define ERR_IRC_INTERNAL 151 #define ERR_IRC_INTERNAL 151
#define ERR_IRC_CONNECT_FAILED 152 #define ERR_IRC_CONNECT_FAILED 152