Browse Source

Clean up nthread.cpp

pull/124/head
Anders Jenbo 7 years ago
parent
commit
1d7a548cd7
  1. 2
      3rdParty/Storm/Source/storm.cpp
  2. 2
      3rdParty/Storm/Source/storm.h
  3. 1
      Source/msg.cpp
  4. 10
      Source/multi.cpp
  5. 93
      Source/nthread.cpp
  6. 20
      Source/nthread.h
  7. 24
      structs.h

2
3rdParty/Storm/Source/storm.cpp vendored

@ -23,7 +23,7 @@ BOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *pla
BOOL STORMAPI SNetLeaveGame(int type) rBool; BOOL STORMAPI SNetLeaveGame(int type) rBool;
BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus) rBool; BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus) rBool;
BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes) rBool; BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes) rBool;
BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, unsigned int *arraydatabytes, DWORD *arrayplayerstatus) rBool; BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus) rBool;
//HANDLE STORMAPI SNetRegisterEventHandler(int type, void (STORMAPI *sEvent)(PS_EVT)) rPVoid; //HANDLE STORMAPI SNetRegisterEventHandler(int type, void (STORMAPI *sEvent)(PS_EVT)) rPVoid;
int STORMAPI SNetSelectGame(int a1, int a2, int a3, int a4, int a5, int *playerid) rInt; int STORMAPI SNetSelectGame(int a1, int a2, int a3, int a4, int a5, int *playerid) rInt;

2
3rdParty/Storm/Source/storm.h vendored

@ -354,7 +354,7 @@ SNetLeaveGame(
BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus); BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus);
BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes); BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes);
BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, unsigned int *arraydatabytes, DWORD *arrayplayerstatus); BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus);
// Values for arrayplayerstatus // Values for arrayplayerstatus
#define SNET_PS_OK 0 #define SNET_PS_OK 0

1
Source/msg.cpp

@ -149,7 +149,6 @@ int msg_wait_for_turns()
// 67618D: using guessed type char sgbDeltaChunks; // 67618D: using guessed type char sgbDeltaChunks;
// 67862D: using guessed type char gbGameDestroyed; // 67862D: using guessed type char gbGameDestroyed;
// 6796E4: using guessed type char gbDeltaSender; // 6796E4: using guessed type char gbDeltaSender;
// 679738: using guessed type int gdwTurnsInTransit;
void msg_process_net_packets() void msg_process_net_packets()
{ {

10
Source/multi.cpp

@ -227,7 +227,7 @@ void multi_parse_turn(int pnum, int turn)
if (absTurns >= 0x7FFFFFFF) if (absTurns >= 0x7FFFFFFF)
absTurns &= 0xFFFF; absTurns &= 0xFFFF;
sgbSentThisCycle = absTurns + gdwTurnsInTransit; sgbSentThisCycle = absTurns + gdwTurnsInTransit;
sgdwGameLoops = 4 * absTurns * (BYTE)byte_679704; sgdwGameLoops = 4 * absTurns * sgbNetUpdateRate;
} }
} }
@ -621,12 +621,12 @@ void multi_event_handler(BOOL add)
void __stdcall multi_handle_events(_SNETEVENT *pEvt) void __stdcall multi_handle_events(_SNETEVENT *pEvt)
{ {
int LeftReason; DWORD LeftReason;
int *data; DWORD *data;
switch (pEvt->eventid) { switch (pEvt->eventid) {
case EVENT_TYPE_PLAYER_CREATE_GAME: case EVENT_TYPE_PLAYER_CREATE_GAME:
data = (int *)pEvt->data; data = (DWORD *)pEvt->data;
sgGameInitInfo.dwSeed = data[0]; sgGameInitInfo.dwSeed = data[0];
sgGameInitInfo.bDiff = data[1]; sgGameInitInfo.bDiff = data[1];
sgbPlayerTurnBitTbl[pEvt->playerid] = TRUE; sgbPlayerTurnBitTbl[pEvt->playerid] = TRUE;
@ -635,7 +635,7 @@ void __stdcall multi_handle_events(_SNETEVENT *pEvt)
sgbPlayerLeftGameTbl[pEvt->playerid] = TRUE; sgbPlayerLeftGameTbl[pEvt->playerid] = TRUE;
sgbPlayerTurnBitTbl[pEvt->playerid] = FALSE; sgbPlayerTurnBitTbl[pEvt->playerid] = FALSE;
LeftReason = 0; LeftReason = 0;
data = (int *)pEvt->data; data = (DWORD *)pEvt->data;
if (data && (DWORD)pEvt->databytes >= 4) if (data && (DWORD)pEvt->databytes >= 4)
LeftReason = data[0]; LeftReason = data[0];
sgdwPlayerLeftReasonTbl[pEvt->playerid] = LeftReason; sgdwPlayerLeftReasonTbl[pEvt->playerid] = LeftReason;

93
Source/nthread.cpp

@ -1,24 +1,24 @@
#include "diablo.h" #include "diablo.h"
#include "../3rdParty/Storm/Source/storm.h" #include "../3rdParty/Storm/Source/storm.h"
char byte_679704; // weak BYTE sgbNetUpdateRate;
int gdwMsgLenTbl[MAX_PLRS]; DWORD gdwMsgLenTbl[MAX_PLRS];
#ifdef __cplusplus #ifdef __cplusplus
static CCritSect sgMemCrit; static CCritSect sgMemCrit;
#endif #endif
int gdwDeltaBytesSec; // weak DWORD gdwDeltaBytesSec;
char nthread_should_run; // weak BOOLEAN nthread_should_run;
DWORD gdwTurnsInTransit; // weak DWORD gdwTurnsInTransit;
int glpMsgTbl[MAX_PLRS]; int glpMsgTbl[MAX_PLRS];
unsigned int glpNThreadId; unsigned int glpNThreadId;
char sgbSyncCountdown; // weak char sgbSyncCountdown;
int turn_upper_bit; // weak int turn_upper_bit;
char byte_679758; // weak BOOLEAN sgbTicsOutOfSync;
char sgbPacketCountdown; // weak char sgbPacketCountdown;
char sgbThreadIsRunning; // weak BOOLEAN sgbThreadIsRunning;
DWORD gdwLargestMsgSize; // weak DWORD gdwLargestMsgSize;
DWORD gdwNormalMsgSize; // weak DWORD gdwNormalMsgSize;
int last_tick; // weak int last_tick;
/* data */ /* data */
static HANDLE sghThread = INVALID_HANDLE_VALUE; static HANDLE sghThread = INVALID_HANDLE_VALUE;
@ -42,8 +42,7 @@ void nthread_terminate_game(const char *pszFcn)
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta) DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)
{ {
DWORD new_cur_turn; DWORD new_cur_turn;
int turn_tmp; int turn, turn_tmp;
int turn;
int curTurnsInTransit; int curTurnsInTransit;
new_cur_turn = cur_turn; new_cur_turn = cur_turn;
@ -70,7 +69,6 @@ DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)
return new_cur_turn; return new_cur_turn;
} }
BOOL nthread_recv_turns(BOOL *pfSendAsync) BOOL nthread_recv_turns(BOOL *pfSendAsync)
{ {
*pfSendAsync = FALSE; *pfSendAsync = FALSE;
@ -80,25 +78,23 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync)
return TRUE; return TRUE;
} }
sgbSyncCountdown--; sgbSyncCountdown--;
sgbPacketCountdown = byte_679704; sgbPacketCountdown = sgbNetUpdateRate;
if (sgbSyncCountdown != 0) { if (sgbSyncCountdown != 0) {
*pfSendAsync = TRUE; *pfSendAsync = TRUE;
last_tick += 50; last_tick += 50;
return TRUE; return TRUE;
} }
if (!SNetReceiveTurns(0, MAX_PLRS, (char **)glpMsgTbl, (unsigned int *)gdwMsgLenTbl, (LPDWORD)player_state)) { if (!SNetReceiveTurns(0, MAX_PLRS, (char **)glpMsgTbl, gdwMsgLenTbl, (LPDWORD)player_state)) {
if (SErrGetLastError() != STORM_ERROR_NO_MESSAGES_WAITING) if (SErrGetLastError() != STORM_ERROR_NO_MESSAGES_WAITING)
nthread_terminate_game("SNetReceiveTurns"); nthread_terminate_game("SNetReceiveTurns");
byte_679758 = 0; sgbTicsOutOfSync = FALSE;
sgbSyncCountdown = 1; sgbSyncCountdown = 1;
sgbPacketCountdown = 1; sgbPacketCountdown = 1;
return 0; return 0;
} } else {
else{ if (!sgbTicsOutOfSync) {
sgbTicsOutOfSync = TRUE;
if (!byte_679758) {
byte_679758 = 1;
last_tick = GetTickCount(); last_tick = GetTickCount();
} }
sgbSyncCountdown = 4; sgbSyncCountdown = 4;
@ -108,11 +104,6 @@ BOOL nthread_recv_turns(BOOL *pfSendAsync)
return TRUE; return TRUE;
} }
} }
// 679704: using guessed type char byte_679704;
// 679750: using guessed type char sgbSyncCountdown;
// 679758: using guessed type char byte_679758;
// 679759: using guessed type char sgbPacketCountdown;
// 679764: using guessed type int last_tick;
void nthread_set_turn_upper_bit() void nthread_set_turn_upper_bit()
{ {
@ -121,16 +112,14 @@ void nthread_set_turn_upper_bit()
void nthread_start(BOOL set_turn_upper_bit) void nthread_start(BOOL set_turn_upper_bit)
{ {
char *err; // eax char *err, *err2;
unsigned int largestMsgSize; // esi DWORD largestMsgSize;
unsigned int normalMsgSize; // eax _SNETCAPS caps;
char *err2; // eax
_SNETCAPS caps; // [esp+8h] [ebp-24h]
last_tick = GetTickCount(); last_tick = GetTickCount();
sgbPacketCountdown = 1; sgbPacketCountdown = 1;
sgbSyncCountdown = 1; sgbSyncCountdown = 1;
byte_679758 = 1; sgbTicsOutOfSync = TRUE;
if (set_turn_upper_bit) if (set_turn_upper_bit)
nthread_set_turn_upper_bit(); nthread_set_turn_upper_bit();
else else
@ -143,33 +132,33 @@ void nthread_start(BOOL set_turn_upper_bit)
gdwTurnsInTransit = caps.defaultturnsintransit; gdwTurnsInTransit = caps.defaultturnsintransit;
if (!caps.defaultturnsintransit) if (!caps.defaultturnsintransit)
gdwTurnsInTransit = 1; gdwTurnsInTransit = 1;
if (caps.defaultturnssec <= 0x14u && caps.defaultturnssec) if (caps.defaultturnssec <= 20 && caps.defaultturnssec)
byte_679704 = 0x14u / caps.defaultturnssec; sgbNetUpdateRate = 20 / caps.defaultturnssec;
else else
byte_679704 = 1; sgbNetUpdateRate = 1;
largestMsgSize = 512; largestMsgSize = 512;
if (caps.maxmessagesize < 0x200u) if (caps.maxmessagesize < 0x200)
largestMsgSize = caps.maxmessagesize; largestMsgSize = caps.maxmessagesize;
gdwDeltaBytesSec = (unsigned int)caps.bytessec >> 2; gdwDeltaBytesSec = caps.bytessec >> 2;
gdwLargestMsgSize = largestMsgSize; gdwLargestMsgSize = largestMsgSize;
gdwNormalMsgSize = caps.bytessec * (unsigned int)(unsigned char)byte_679704 / 0x14; gdwNormalMsgSize = caps.bytessec * sgbNetUpdateRate / 20;
gdwNormalMsgSize *= 3; gdwNormalMsgSize *= 3;
gdwNormalMsgSize = gdwNormalMsgSize >> 2; gdwNormalMsgSize >>= 2;
if (caps.maxplayers > 4u) if (caps.maxplayers > MAX_PLRS)
caps.maxplayers = 4; caps.maxplayers = MAX_PLRS;
gdwNormalMsgSize /= caps.maxplayers; gdwNormalMsgSize /= caps.maxplayers;
while (gdwNormalMsgSize < 0x80){ while (gdwNormalMsgSize < 0x80) {
gdwNormalMsgSize *= 2; gdwNormalMsgSize *= 2;
byte_679704 *= 2; sgbNetUpdateRate *= 2;
} }
if (gdwNormalMsgSize > largestMsgSize) if (gdwNormalMsgSize > largestMsgSize)
gdwNormalMsgSize = largestMsgSize; gdwNormalMsgSize = largestMsgSize;
if ((unsigned char)gbMaxPlayers > 1u) { if (gbMaxPlayers > 1) {
sgbThreadIsRunning = 0; sgbThreadIsRunning = FALSE;
#ifdef __cplusplus #ifdef __cplusplus
sgMemCrit.Enter(); sgMemCrit.Enter();
#endif #endif
nthread_should_run = 1; nthread_should_run = TRUE;
sghThread = (HANDLE)_beginthreadex(NULL, 0, nthread_handler, NULL, 0, &glpNThreadId); sghThread = (HANDLE)_beginthreadex(NULL, 0, nthread_handler, NULL, 0, &glpNThreadId);
if (sghThread == INVALID_HANDLE_VALUE) { if (sghThread == INVALID_HANDLE_VALUE) {
err2 = TraceLastError(); err2 = TraceLastError();
@ -213,7 +202,7 @@ unsigned int __stdcall nthread_handler(void *a1)
void nthread_cleanup() void nthread_cleanup()
{ {
nthread_should_run = 0; nthread_should_run = FALSE;
gdwTurnsInTransit = 0; gdwTurnsInTransit = 0;
gdwNormalMsgSize = 0; gdwNormalMsgSize = 0;
gdwLargestMsgSize = 0; gdwLargestMsgSize = 0;

20
Source/nthread.h

@ -2,18 +2,18 @@
#ifndef __NTHREAD_H__ #ifndef __NTHREAD_H__
#define __NTHREAD_H__ #define __NTHREAD_H__
extern char byte_679704; // weak extern BYTE sgbNetUpdateRate;
extern int gdwMsgLenTbl[MAX_PLRS]; extern DWORD gdwMsgLenTbl[MAX_PLRS];
extern int gdwDeltaBytesSec; // weak extern DWORD gdwDeltaBytesSec;
extern char nthread_should_run; // weak extern BOOLEAN nthread_should_run;
extern DWORD gdwTurnsInTransit; // weak extern DWORD gdwTurnsInTransit;
extern int glpMsgTbl[MAX_PLRS]; extern int glpMsgTbl[MAX_PLRS];
extern unsigned int glpNThreadId; extern unsigned int glpNThreadId;
extern int turn_upper_bit; // weak extern int turn_upper_bit;
extern char byte_679758; // weak extern BOOLEAN sgbThreadIsRunning;
extern DWORD gdwLargestMsgSize; // weak extern DWORD gdwLargestMsgSize;
extern DWORD gdwNormalMsgSize; // weak extern DWORD gdwNormalMsgSize;
extern int last_tick; // weak extern int last_tick;
void nthread_terminate_game(const char *pszFcn); void nthread_terminate_game(const char *pszFcn);
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta); DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta);

24
structs.h

@ -1251,22 +1251,22 @@ typedef struct _uiheroinfo {
// TPDEF PTR FCN VOID SMSGHANDLER // TPDEF PTR FCN VOID SMSGHANDLER
typedef struct _SNETCAPS { typedef struct _SNETCAPS {
int size; DWORD size;
int flags; DWORD flags;
int maxmessagesize; DWORD maxmessagesize;
int maxqueuesize; DWORD maxqueuesize;
int maxplayers; DWORD maxplayers;
int bytessec; DWORD bytessec;
int latencyms; DWORD latencyms;
int defaultturnssec; DWORD defaultturnssec;
int defaultturnsintransit; DWORD defaultturnsintransit;
} _SNETCAPS; } _SNETCAPS;
typedef struct _SNETEVENT { typedef struct _SNETEVENT {
int eventid; DWORD eventid;
int playerid; DWORD playerid;
void *data; void *data;
int databytes; DWORD databytes;
} _SNETEVENT; } _SNETEVENT;
// TPDEF PTR FCN UCHAR SNETABORTPROC // TPDEF PTR FCN UCHAR SNETABORTPROC

Loading…
Cancel
Save