Browse Source

Fix TBuffer type and buffer_init

pull/25/head
galaxyhaxz 7 years ago committed by Anders Jenbo
parent
commit
849ec37b70
  1. 89
      Source/multi.cpp
  2. 12
      Source/multi.h
  3. 5
      structs.h

89
Source/multi.cpp

@ -3,7 +3,7 @@
#include "../types.h"
char gbSomebodyWonGameKludge; // weak
char pkdata_6761C0[4100];
TBuffer sgHiPriBuf;
char szPlayerDescript[128];
short sgwPackPlrOffsetTbl[MAX_PLRS];
PkPlayerStruct netplr[MAX_PLRS];
@ -19,7 +19,7 @@ _gamedata sgGameInitInfo;
char byte_678640; // weak
int sglTimeoutStart; // weak
int sgdwPlayerLeftReasonTbl[MAX_PLRS];
char pkdata_678658[4100];
TBuffer sgLoPriBuf;
unsigned int sgdwGameLoops; // idb
BYTE gbMaxPlayers;
char sgbTimeout; // weak
@ -56,26 +56,27 @@ void __fastcall NetSendLoPri(BYTE *pbMsg, BYTE bLen)
{
if (pbMsg) {
if (bLen) {
multi_copy_packet(pkdata_678658, pbMsg, bLen);
multi_copy_packet(&sgLoPriBuf, pbMsg, bLen);
multi_send_packet(pbMsg, bLen);
}
}
}
void __fastcall multi_copy_packet(void *a1, void *packet, BYTE size)
void __fastcall multi_copy_packet(TBuffer *a1, void *packet, BYTE size)
{
int v3; // eax
int v4; // ebx
char *v5; // esi
v3 = *(_DWORD *)a1;
v4 = *(_DWORD *)a1 + (unsigned char)size;
if ((unsigned int)(v4 + 2) <= 0x1000) {
*(_DWORD *)a1 = v4 + 1;
*((_BYTE *)a1 + v3 + 4) = size;
v5 = (char *)a1 + v3 + 5;
memcpy(v5, packet, (unsigned char)size);
v5[(unsigned char)size] = 0;
DWORD v3; // eax
DWORD v4; // ebx
BYTE *v5; // esi
v3 = a1->dwNextWriteOffset;
v4 = a1->dwNextWriteOffset + size;
if ( v4 + 2 <= 0x1000 )
{
a1->dwNextWriteOffset = v4 + 1;
a1->bData[v3] = size;
v5 = &a1->bData[v3 + 1];
memcpy(v5, packet, size);
v5[size] = 0;
}
}
@ -114,15 +115,15 @@ void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen)
int size; // [esp+20Ch] [ebp-4h]
if (pbMsg && bLen) {
multi_copy_packet(pkdata_6761C0, pbMsg, bLen);
multi_copy_packet(&sgHiPriBuf, pbMsg, bLen);
multi_send_packet(pbMsg, bLen);
}
if (!dword_678628) {
dword_678628 = 1;
NetRecvPlrData(&pkt);
size = gdwNormalMsgSize - 19;
v5 = multi_recv_packet(pkdata_6761C0, pkt.body, &size);
v6 = (TSyncHeader *)multi_recv_packet(pkdata_678658, v5, &size);
v5 = multi_recv_packet(&sgHiPriBuf, pkt.body, &size);
v6 = (TSyncHeader *)multi_recv_packet(&sgLoPriBuf, v5, &size);
v7 = sync_all_monsters(v6, size);
v8 = gdwNormalMsgSize - v7;
pkt.hdr.wLen = v8;
@ -133,32 +134,34 @@ void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen)
// 678628: using guessed type int dword_678628;
// 679760: using guessed type int gdwNormalMsgSize;
unsigned char *__fastcall multi_recv_packet(void *packet, unsigned char *a2, int *a3)
unsigned char *__fastcall multi_recv_packet(TBuffer *packet, unsigned char *a2, int *a3)
{
char *v3; // esi
TBuffer *v3; // esi
unsigned char *result; // eax
char *v5; // ebx
size_t v6; // edi
char *v7; // ebx
unsigned char *v8; // [esp+4h] [ebp-4h]
BYTE *v5; // ebx
size_t v6; // edi
char *v7; // ebx
unsigned char *v8; // [esp+4h] [ebp-4h]
v3 = (char *)packet;
v3 = packet;
result = a2;
v8 = a2;
if (*(_DWORD *)packet) {
v5 = (char *)packet + 4;
while (*v5) {
v6 = (unsigned char)*v5;
if (v6 > *a3)
if ( packet->dwNextWriteOffset )
{
v5 = packet->bData;
while ( *v5 )
{
v6 = *v5;
if ( v6 > *a3 )
break;
v7 = v5 + 1;
v7 = (char *)(v5 + 1);
memcpy(v8, v7, v6);
v8 += v6;
v5 = &v7[v6];
v5 = (BYTE *)&v7[v6];
*a3 -= v6;
}
memcpy(v3 + 4, v5, (size_t)&v3[*(_DWORD *)v3 - (_DWORD)v5 + 5]);
*(_DWORD *)v3 += v3 - v5 + 4;
memcpy(v3->bData, v5, (size_t)&v3->bData[v3->dwNextWriteOffset - (_DWORD)v5 + 1]); /* memcpy_0 */
v3->dwNextWriteOffset += (char *)v3 - (char *)v5 + 4;
result = v8;
}
return result;
@ -338,7 +341,7 @@ int __cdecl multi_handle_delta()
if (recieved) {
if (dword_678628) {
dword_678628 = 0;
if (!multi_check_pkt_valid(pkdata_6761C0))
if (!multi_check_pkt_valid(&sgHiPriBuf))
NetSendHiPri(0, 0);
} else {
NetSendHiPri(0, 0);
@ -353,9 +356,9 @@ int __cdecl multi_handle_delta()
// 679661: using guessed type char sgbTimeout;
// Microsoft VisualC 2-11/net runtime
int __fastcall multi_check_pkt_valid(char *a1)
int __fastcall multi_check_pkt_valid(TBuffer *a1)
{
return *(_DWORD *)a1 == 0;
return a1->dwNextWriteOffset == 0;
}
void __cdecl multi_mon_seeds()
@ -759,8 +762,8 @@ int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram)
sgbTimeout = 0;
delta_init();
InitPlrMsg();
multi_clear_pkt(pkdata_6761C0);
multi_clear_pkt(pkdata_678658);
buffer_init(&sgHiPriBuf);
buffer_init(&sgLoPriBuf);
dword_678628 = 0;
sync_clear_pkt();
nthread_start(sgbPlayerTurnBitTbl[myplr]);
@ -804,10 +807,10 @@ int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram)
// 6796E4: using guessed type char gbDeltaSender;
// 6796E8: using guessed type int sgbNetInited;
void __fastcall multi_clear_pkt(char *a1)
void __fastcall buffer_init(TBuffer *pBuf)
{
*(_DWORD *)a1 = 0;
a1[4] = 0;
pBuf->dwNextWriteOffset = 0;
pBuf->bData[0] = 0;
}
void __fastcall multi_send_pinfo(int pnum, char cmd)

12
Source/multi.h

@ -3,7 +3,7 @@
#define __MULTI_H__
extern char gbSomebodyWonGameKludge; // weak
extern char pkdata_6761C0[4100];
extern TBuffer sgHiPriBuf;
extern char szPlayerDescript[128];
extern short sgwPackPlrOffsetTbl[MAX_PLRS];
extern PkPlayerStruct netplr[MAX_PLRS];
@ -19,7 +19,7 @@ extern _gamedata sgGameInitInfo;
extern char byte_678640; // weak
extern int sglTimeoutStart; // weak
extern int sgdwPlayerLeftReasonTbl[MAX_PLRS];
extern char pkdata_678658[4100];
extern TBuffer sgLoPriBuf;
extern unsigned int sgdwGameLoops; // idb
extern BYTE gbMaxPlayers;
extern char sgbTimeout; // weak
@ -31,11 +31,11 @@ extern int player_state[MAX_PLRS];
void __cdecl multi_cpp_init();
void __fastcall multi_msg_add(BYTE *a1, unsigned char a2);
void __fastcall NetSendLoPri(BYTE *pbMsg, BYTE bLen);
void __fastcall multi_copy_packet(void *a1, void *packet, BYTE size);
void __fastcall multi_copy_packet(TBuffer *a1, void *packet, BYTE size);
void __fastcall multi_send_packet(void *packet, BYTE dwSize);
void __fastcall NetRecvPlrData(TPkt *pkt);
void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen);
unsigned char *__fastcall multi_recv_packet(void *packet, unsigned char *a2, int *a3);
unsigned char *__fastcall multi_recv_packet(TBuffer *packet, unsigned char *a2, int *a3);
void __fastcall multi_send_msg_packet(int a1, BYTE *a2, BYTE len);
void __cdecl multi_msg_countdown();
void __fastcall multi_parse_turn(int pnum, int turn);
@ -45,7 +45,7 @@ void __cdecl multi_clear_left_tbl();
void __fastcall multi_player_left_msg(int pnum, int left);
void __cdecl multi_net_ping();
int __cdecl multi_handle_delta();
int __fastcall multi_check_pkt_valid(char *a1);
int __fastcall multi_check_pkt_valid(TBuffer *a1);
void __cdecl multi_mon_seeds();
void __cdecl multi_begin_timeout();
void __cdecl multi_check_drop_player();
@ -57,7 +57,7 @@ void __cdecl NetClose();
char __fastcall multi_event_handler(int a1);
void __stdcall multi_handle_events(_SNETEVENT *pEvt);
int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram);
void __fastcall multi_clear_pkt(char *a1);
void __fastcall buffer_init(TBuffer *pBuf);
void __fastcall multi_send_pinfo(int pnum, char cmd);
int __fastcall InitNewSeed(int newseed);
void __cdecl SetupLocalCoords();

5
structs.h

@ -946,6 +946,11 @@ typedef struct TMegaPkt {
BYTE data[32000];
} TMegaPkt;
typedef struct TBuffer {
DWORD dwNextWriteOffset;
BYTE bData[4096];
} TBuffer;
//////////////////////////////////////////////////
// quests
//////////////////////////////////////////////////

Loading…
Cancel
Save