Skip to content

Commit ad27a6c

Browse files
committed
refactor: move NetPacketFieldTypes to header, use const NetPacketFieldType type, and add struct constructors
1 parent e80ad6d commit ad27a6c

File tree

3 files changed

+141
-17
lines changed

3 files changed

+141
-17
lines changed

GeneralsMD/Code/GameEngine/Include/GameNetwork/NetPacket.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class NetPacket : public MemoryPoolObject
105105
static UnsignedInt GetDisconnectScreenOffCommandSize(NetCommandMsg *msg);
106106
static UnsignedInt GetFrameResendRequestCommandSize(NetCommandMsg *msg);
107107

108+
#ifdef _DEBUG
109+
// Testing function - remove before merging to main
110+
static void TestPacketSizes();
111+
#endif
112+
108113
static void FillBufferWithGameCommand(UnsignedByte *buffer, NetCommandRef *msg);
109114
static void FillBufferWithAckCommand(UnsignedByte *buffer, NetCommandRef *msg);
110115
static void FillBufferWithFrameCommand(UnsignedByte *buffer, NetCommandRef *msg);

GeneralsMD/Code/GameEngine/Include/GameNetwork/NetPacketStructs.h

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,43 +30,67 @@
3030
// Ensure structs are packed to 1-byte alignment for network protocol compatibility
3131
#pragma pack(push, 1)
3232

33+
// Network packet field type definitions
34+
typedef UnsignedByte NetPacketFieldType;
35+
36+
namespace NetPacketFieldTypes {
37+
constexpr const NetPacketFieldType CommandType = 'T'; // NetCommandType field
38+
constexpr const NetPacketFieldType Relay = 'R'; // Relay field
39+
constexpr const NetPacketFieldType PlayerId = 'P'; // Player ID field
40+
constexpr const NetPacketFieldType CommandId = 'C'; // Command ID field
41+
constexpr const NetPacketFieldType Frame = 'F'; // Frame field
42+
constexpr const NetPacketFieldType Data = 'D'; // Data payload field
43+
}
44+
3345
////////////////////////////////////////////////////////////////////////////////
3446
// Common packet field structures
3547
////////////////////////////////////////////////////////////////////////////////
3648

3749
// Command Type field: 'T' + UnsignedByte
3850
struct NetPacketCommandTypeField {
39-
char header; // 'T'
51+
const NetPacketFieldType type; // 'T'
4052
UnsignedByte commandType;
53+
54+
NetPacketCommandTypeField() : type(NetPacketFieldTypes::CommandType) {}
4155
};
4256

4357
// Relay field: 'R' + UnsignedByte
4458
struct NetPacketRelayField {
45-
char header; // 'R'
59+
const NetPacketFieldType type; // 'R'
4660
UnsignedByte relay;
61+
62+
NetPacketRelayField() : type(NetPacketFieldTypes::Relay) {}
4763
};
4864

4965
// Player ID field: 'P' + UnsignedByte
5066
struct NetPacketPlayerIdField {
51-
char header; // 'P'
67+
const NetPacketFieldType type; // 'P'
5268
UnsignedByte playerId;
69+
70+
NetPacketPlayerIdField() : type(NetPacketFieldTypes::PlayerId) {}
5371
};
5472

5573
// Frame field: 'F' + UnsignedInt
5674
struct NetPacketFrameField {
57-
char header; // 'F'
75+
const NetPacketFieldType type; // 'F'
5876
UnsignedInt frame;
77+
78+
NetPacketFrameField() : type(NetPacketFieldTypes::Frame) {}
5979
};
6080

6181
// Command ID field: 'C' + UnsignedShort
6282
struct NetPacketCommandIdField {
63-
char header; // 'C'
83+
const NetPacketFieldType type; // 'C'
6484
UnsignedShort commandId;
85+
86+
NetPacketCommandIdField() : type(NetPacketFieldTypes::CommandId) {}
6587
};
6688

6789
// Data field header: 'D' (followed by variable-length data)
6890
struct NetPacketDataFieldHeader {
69-
char header; // 'D'
91+
const NetPacketFieldType type; // 'D'
92+
93+
NetPacketDataFieldHeader() : type(NetPacketFieldTypes::Data) {}
7094
};
7195

7296
////////////////////////////////////////////////////////////////////////////////
@@ -373,3 +397,85 @@ struct NetPacketFrameResendRequestCommand {
373397
// Restore normal struct packing
374398
#pragma pack(pop)
375399

400+
////////////////////////////////////////////////////////////////////////////////
401+
// Static Assert Tests - Verify struct sizes match original manual calculations
402+
// These tests ensure the refactor maintains exact compatibility
403+
////////////////////////////////////////////////////////////////////////////////
404+
405+
// Test function for Frame Resend Request Command
406+
constexpr UnsignedInt GetFrameResendRequestCommandSize()
407+
{
408+
UnsignedInt msglen = 0;
409+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::CommandType and command type
410+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::PlayerId and player ID
411+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedShort); // NetPacketFieldTypes::CommandId and command ID
412+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::Relay and relay
413+
414+
++msglen; // NetPacketFieldTypes::Data
415+
msglen += sizeof(UnsignedInt); // frame to resend
416+
417+
return msglen;
418+
}
419+
420+
// Test function for ACK Command
421+
constexpr UnsignedInt GetAckCommandSize()
422+
{
423+
UnsignedInt msglen = 0;
424+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::CommandType and command type
425+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::PlayerId and player ID
426+
++msglen; // NetPacketFieldTypes::Data
427+
msglen += sizeof(UnsignedShort); // command ID being acknowledged
428+
msglen += sizeof(UnsignedByte); // original player ID
429+
430+
return msglen;
431+
}
432+
433+
// Test function for Frame Command
434+
constexpr UnsignedInt GetFrameCommandSize()
435+
{
436+
UnsignedInt msglen = 0;
437+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::CommandType and command type
438+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::Relay and relay
439+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedInt); // NetPacketFieldTypes::Frame and frame
440+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::PlayerId and player ID
441+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedShort); // NetPacketFieldTypes::CommandId and command ID
442+
++msglen; // NetPacketFieldTypes::Data
443+
msglen += sizeof(UnsignedShort); // command count
444+
445+
return msglen;
446+
}
447+
448+
// Test function for Player Leave Command
449+
constexpr UnsignedInt GetPlayerLeaveCommandSize()
450+
{
451+
UnsignedInt msglen = 0;
452+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::CommandType and command type
453+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::Relay and relay
454+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedInt); // NetPacketFieldTypes::Frame and frame
455+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::PlayerId and player ID
456+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedShort); // NetPacketFieldTypes::CommandId and command ID
457+
++msglen; // NetPacketFieldTypes::Data
458+
msglen += sizeof(UnsignedByte); // leaving player ID
459+
460+
return msglen;
461+
}
462+
463+
// Test function for Keep Alive Command
464+
constexpr UnsignedInt GetKeepAliveCommandSize()
465+
{
466+
UnsignedInt msglen = 0;
467+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::CommandType and command type
468+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::Relay and relay
469+
msglen += sizeof(UnsignedByte) + sizeof(UnsignedByte); // NetPacketFieldTypes::PlayerId and player ID
470+
++msglen; // NetPacketFieldTypes::Data
471+
472+
return msglen;
473+
}
474+
475+
// Static assertions to verify sizes match
476+
static_assert(GetFrameResendRequestCommandSize() == sizeof(NetPacketFrameResendRequestCommand), "FrameResendRequestCommand size mismatch");
477+
static_assert(GetAckCommandSize() == sizeof(NetPacketAckCommand), "AckCommand size mismatch");
478+
static_assert(GetFrameCommandSize() == sizeof(NetPacketFrameCommand), "FrameCommand size mismatch");
479+
static_assert(GetPlayerLeaveCommandSize() == sizeof(NetPacketPlayerLeaveCommand), "PlayerLeaveCommand size mismatch");
480+
static_assert(GetKeepAliveCommandSize() == sizeof(NetPacketKeepAliveCommand), "KeepAliveCommand size mismatch");
481+

GeneralsMD/Code/GameEngine/Source/GameNetwork/NetPacket.cpp

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,6 @@
3434
#include <Utility/CppMacros.h>
3535
#include "GameNetwork/NetPacketStructs.h"
3636

37-
// TheSuperHackers @refactor BobTista 10/06/2025 Extract magic character literals into named constants for improved readability
38-
typedef UnsignedByte NetPacketFieldType;
39-
40-
namespace NetPacketFieldTypes {
41-
constexpr const NetPacketFieldType CommandType = 'T'; // NetCommandType field
42-
constexpr const NetPacketFieldType Relay = 'R'; // Relay field
43-
constexpr const NetPacketFieldType PlayerId = 'P'; // Player ID field
44-
constexpr const NetPacketFieldType CommandId = 'C'; // Command ID field
45-
constexpr const NetPacketFieldType Frame = 'F'; // Frame field
46-
constexpr const NetPacketFieldType Data = 'D'; // Data payload field
47-
}
4837

4938
// This function assumes that all of the fields are either of default value or are
5039
// present in the raw data.
@@ -520,6 +509,30 @@ UnsignedInt NetPacket::GetFrameResendRequestCommandSize(NetCommandMsg *msg) {
520509
return sizeof(NetPacketFrameResendRequestCommand);
521510
}
522511

512+
////////////////////////////////////////////////////////////////////////////////
513+
// TESTING FUNCTIONS - Remove these before merging to main
514+
// These functions help verify packet serialization works correctly
515+
////////////////////////////////////////////////////////////////////////////////
516+
517+
#ifdef _DEBUG
518+
// Test function to verify packet struct sizes match expectations
519+
void NetPacket::TestPacketSizes() {
520+
// This function will be called during debug builds to verify sizes
521+
// Set a breakpoint here to inspect the values
522+
523+
UnsignedInt frameResendSize = sizeof(NetPacketFrameResendRequestCommand);
524+
UnsignedInt ackSize = sizeof(NetPacketAckCommand);
525+
UnsignedInt frameSize = sizeof(NetPacketFrameCommand);
526+
UnsignedInt playerLeaveSize = sizeof(NetPacketPlayerLeaveCommand);
527+
UnsignedInt keepAliveSize = sizeof(NetPacketKeepAliveCommand);
528+
529+
// These should match the original manual calculations
530+
// Set breakpoints here to verify the values are correct
531+
DEBUG_LOG_LEVEL(DEBUG_LEVEL_NET, ("TestPacketSizes: FrameResend=%d, Ack=%d, Frame=%d, PlayerLeave=%d, KeepAlive=%d",
532+
frameResendSize, ackSize, frameSize, playerLeaveSize, keepAliveSize));
533+
}
534+
#endif
535+
523536
// this function assumes that buffer is already the correct size.
524537
void NetPacket::FillBufferWithCommand(UnsignedByte *buffer, NetCommandRef *ref) {
525538
NetCommandMsg *msg = ref->getCommand();

0 commit comments

Comments
 (0)