|
5 | 5 | */
|
6 | 6 |
|
7 | 7 | #include <cstdint>
|
| 8 | +#include <cstring> |
8 | 9 | #include <ctime>
|
9 | 10 |
|
10 | 11 | #include <SDL.h>
|
@@ -46,7 +47,7 @@ bool sgbSendDeltaTbl[MAX_PLRS];
|
46 | 47 | GameData sgGameInitInfo;
|
47 | 48 | bool gbSelectProvider;
|
48 | 49 | int sglTimeoutStart;
|
49 |
| -int sgdwPlayerLeftReasonTbl[MAX_PLRS]; |
| 50 | +uint32_t sgdwPlayerLeftReasonTbl[MAX_PLRS]; |
50 | 51 | TBuffer lowPriorityBuffer;
|
51 | 52 | uint32_t sgdwGameLoops;
|
52 | 53 | /**
|
@@ -74,6 +75,13 @@ const event_type EventTypes[3] = {
|
74 | 75 | EVENT_TYPE_PLAYER_MESSAGE
|
75 | 76 | };
|
76 | 77 |
|
| 78 | +void GameData::swapLE() |
| 79 | +{ |
| 80 | + size = SDL_SwapLE32(size); |
| 81 | + dwSeed = SDL_SwapLE32(dwSeed); |
| 82 | + programid = SDL_SwapLE32(programid); |
| 83 | +} |
| 84 | + |
77 | 85 | namespace {
|
78 | 86 |
|
79 | 87 | constexpr uint16_t HeaderCheckVal =
|
@@ -376,34 +384,44 @@ void SetupLocalPositions()
|
376 | 384 |
|
377 | 385 | void HandleEvents(_SNETEVENT *pEvt)
|
378 | 386 | {
|
| 387 | + const uint32_t playerId = pEvt->playerid; |
379 | 388 | switch (pEvt->eventid) {
|
380 | 389 | case EVENT_TYPE_PLAYER_CREATE_GAME: {
|
381 |
| - auto *gameData = (GameData *)pEvt->data; |
382 |
| - if (gameData->size != sizeof(GameData)) |
383 |
| - app_fatal(StrCat("Invalid size of game data: ", gameData->size)); |
384 |
| - sgGameInitInfo = *gameData; |
385 |
| - sgbPlayerTurnBitTbl[pEvt->playerid] = true; |
386 |
| - break; |
387 |
| - } |
| 390 | + GameData gameData; |
| 391 | + if (pEvt->databytes < sizeof(GameData)) |
| 392 | + app_fatal(StrCat("Invalid packet size (<sizeof(GameData)): ", pEvt->databytes)); |
| 393 | + std::memcpy(&gameData, pEvt->data, sizeof(gameData)); |
| 394 | + gameData.swapLE(); |
| 395 | + if (gameData.size != sizeof(GameData)) |
| 396 | + app_fatal(StrCat("Invalid size of game data: ", gameData.size)); |
| 397 | + sgGameInitInfo = gameData; |
| 398 | + sgbPlayerTurnBitTbl[playerId] = true; |
| 399 | + } break; |
388 | 400 | case EVENT_TYPE_PLAYER_LEAVE_GAME: {
|
389 |
| - sgbPlayerLeftGameTbl[pEvt->playerid] = true; |
390 |
| - sgbPlayerTurnBitTbl[pEvt->playerid] = false; |
| 401 | + sgbPlayerLeftGameTbl[playerId] = true; |
| 402 | + sgbPlayerTurnBitTbl[playerId] = false; |
391 | 403 |
|
392 |
| - int leftReason = 0; |
393 |
| - if (pEvt->data != nullptr && pEvt->databytes >= sizeof(leftReason)) |
394 |
| - leftReason = *(int *)pEvt->data; |
395 |
| - sgdwPlayerLeftReasonTbl[pEvt->playerid] = leftReason; |
| 404 | + int32_t leftReason = 0; |
| 405 | + if (pEvt->data != nullptr && pEvt->databytes >= sizeof(leftReason)) { |
| 406 | + std::memcpy(&leftReason, pEvt->data, sizeof(leftReason)); |
| 407 | + leftReason = SDL_SwapLE32(leftReason); |
| 408 | + } |
| 409 | + sgdwPlayerLeftReasonTbl[playerId] = leftReason; |
396 | 410 | if (leftReason == LEAVE_ENDING)
|
397 | 411 | gbSomebodyWonGameKludge = true;
|
398 | 412 |
|
399 |
| - sgbSendDeltaTbl[pEvt->playerid] = false; |
| 413 | + sgbSendDeltaTbl[playerId] = false; |
400 | 414 |
|
401 |
| - if (gbDeltaSender == pEvt->playerid) |
| 415 | + if (gbDeltaSender == playerId) |
402 | 416 | gbDeltaSender = MAX_PLRS;
|
403 | 417 | } break;
|
404 |
| - case EVENT_TYPE_PLAYER_MESSAGE: |
405 |
| - EventPlrMsg((char *)pEvt->data); |
406 |
| - break; |
| 418 | + case EVENT_TYPE_PLAYER_MESSAGE: { |
| 419 | + string_view data(static_cast<const char *>(pEvt->data), pEvt->databytes); |
| 420 | + if (const size_t nullPos = data.find('\0'); nullPos != string_view::npos) { |
| 421 | + data.remove_suffix(data.size() - nullPos); |
| 422 | + } |
| 423 | + EventPlrMsg(data); |
| 424 | + } break; |
407 | 425 | }
|
408 | 426 | }
|
409 | 427 |
|
@@ -432,7 +450,9 @@ bool InitSingle(GameData *gameData)
|
432 | 450 | }
|
433 | 451 |
|
434 | 452 | int unused = 0;
|
435 |
| - if (!SNetCreateGame("local", "local", (char *)&sgGameInitInfo, sizeof(sgGameInitInfo), &unused)) { |
| 453 | + GameData gameInitInfo = sgGameInitInfo; |
| 454 | + gameInitInfo.swapLE(); |
| 455 | + if (!SNetCreateGame("local", "local", reinterpret_cast<char *>(&gameInitInfo), sizeof(gameInitInfo), &unused)) { |
436 | 456 | app_fatal(StrCat("SNetCreateGame1:\n", SDL_GetError()));
|
437 | 457 | }
|
438 | 458 |
|
|
0 commit comments