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 SNetPerformUpgrade(DWORD *upgradestatus) 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;
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 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
#define SNET_PS_OK 0

1
Source/msg.cpp

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

10
Source/multi.cpp

@ -227,7 +227,7 @@ void multi_parse_turn(int pnum, int turn)
if (absTurns >= 0x7FFFFFFF)
absTurns &= 0xFFFF;
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)
{
int LeftReason;
int *data;
DWORD LeftReason;
DWORD *data;
switch (pEvt->eventid) {
case EVENT_TYPE_PLAYER_CREATE_GAME:
data = (int *)pEvt->data;
data = (DWORD *)pEvt->data;
sgGameInitInfo.dwSeed = data[0];
sgGameInitInfo.bDiff = data[1];
sgbPlayerTurnBitTbl[pEvt->playerid] = TRUE;
@ -635,7 +635,7 @@ void __stdcall multi_handle_events(_SNETEVENT *pEvt)
sgbPlayerLeftGameTbl[pEvt->playerid] = TRUE;
sgbPlayerTurnBitTbl[pEvt->playerid] = FALSE;
LeftReason = 0;
data = (int *)pEvt->data;
data = (DWORD *)pEvt->data;
if (data && (DWORD)pEvt->databytes >= 4)
LeftReason = data[0];
sgdwPlayerLeftReasonTbl[pEvt->playerid] = LeftReason;

93
Source/nthread.cpp

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

20
Source/nthread.h

@ -2,18 +2,18 @@
#ifndef __NTHREAD_H__
#define __NTHREAD_H__
extern char byte_679704; // weak
extern int gdwMsgLenTbl[MAX_PLRS];
extern int gdwDeltaBytesSec; // weak
extern char nthread_should_run; // weak
extern DWORD gdwTurnsInTransit; // weak
extern BYTE sgbNetUpdateRate;
extern DWORD gdwMsgLenTbl[MAX_PLRS];
extern DWORD gdwDeltaBytesSec;
extern BOOLEAN nthread_should_run;
extern DWORD gdwTurnsInTransit;
extern int glpMsgTbl[MAX_PLRS];
extern unsigned int glpNThreadId;
extern int turn_upper_bit; // weak
extern char byte_679758; // weak
extern DWORD gdwLargestMsgSize; // weak
extern DWORD gdwNormalMsgSize; // weak
extern int last_tick; // weak
extern int turn_upper_bit;
extern BOOLEAN sgbThreadIsRunning;
extern DWORD gdwLargestMsgSize;
extern DWORD gdwNormalMsgSize;
extern int last_tick;
void nthread_terminate_game(const char *pszFcn);
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
typedef struct _SNETCAPS {
int size;
int flags;
int maxmessagesize;
int maxqueuesize;
int maxplayers;
int bytessec;
int latencyms;
int defaultturnssec;
int defaultturnsintransit;
DWORD size;
DWORD flags;
DWORD maxmessagesize;
DWORD maxqueuesize;
DWORD maxplayers;
DWORD bytessec;
DWORD latencyms;
DWORD defaultturnssec;
DWORD defaultturnsintransit;
} _SNETCAPS;
typedef struct _SNETEVENT {
int eventid;
int playerid;
DWORD eventid;
DWORD playerid;
void *data;
int databytes;
DWORD databytes;
} _SNETEVENT;
// TPDEF PTR FCN UCHAR SNETABORTPROC

Loading…
Cancel
Save