devilutionX/Source/msg.cpp
Anders Jenbo 4aac75e836 Change msg attributes to signed where relevant
The variables are either being compared to -1, transfered between values
that are signed or closely related to such. Having them as unsigned has
the potential to break the game, having them signed shoudn't have any
negative effects.
2018-12-15 18:13:31 +01:00

2804 lines
73 KiB
C++

//HEADER_GOES_HERE
#include "../types.h"
static DWORD sgdwOwnerWait;
static DWORD sgdwRecvOffset;
static int sgnCurrMegaPlayer;
static DLevel sgLevels[NUMLEVELS];
static BYTE sbLastCmd;
static TMegaPkt *sgpCurrPkt;
static char sgRecvBuf[sizeof(DLevel) + 1];
static BYTE sgbRecvCmd;
static LocalLevel sgLocals[NUMLEVELS];
static DJunk sgJunk;
static TMegaPkt *sgpMegaPkt;
static BYTE sgbDeltaChanged;
static BYTE sgbDeltaChunks;
int deltaload;
BYTE gbBufferMsgs;
int pkt_counter;
static float msg_cpp_init_value = INFINITY;
void __fastcall msg_send_drop_pkt(int pnum, int reason)
{
TFakeDropPlr cmd; // [esp+0h] [ebp-8h]
cmd.dwReason = reason;
cmd.bCmd = FAKE_CMD_DROPID;
cmd.bPlr = pnum;
msg_send_packet(pnum, &cmd, 6);
}
void __fastcall msg_send_packet(int pnum, const void *packet, DWORD dwSize)
{
const void *v3; // edi
TMegaPkt *v4; // eax
TFakeCmdPlr cmd; // [esp+Ah] [ebp-2h]
v3 = packet;
if (pnum != sgnCurrMegaPlayer) {
sgnCurrMegaPlayer = pnum;
cmd.bCmd = FAKE_CMD_SETID;
cmd.bPlr = pnum;
msg_send_packet(pnum, &cmd, 2);
}
v4 = sgpCurrPkt;
if (sgpCurrPkt->dwSpaceLeft < (unsigned int)dwSize) {
msg_get_next_packet();
v4 = sgpCurrPkt;
}
memcpy((char *)&v4[1] - v4->dwSpaceLeft, v3, dwSize);
sgpCurrPkt->dwSpaceLeft -= dwSize;
}
// 65AB24: using guessed type int sgnCurrMegaPlayer;
TMegaPkt *__cdecl msg_get_next_packet()
{
TMegaPkt *v0; // eax
TMegaPkt *v1; // ecx
TMegaPkt *result; // eax
v0 = (TMegaPkt *)DiabloAllocPtr(32008);
sgpCurrPkt = v0;
v0->pNext = 0;
sgpCurrPkt->dwSpaceLeft = 32000;
v1 = sgpMegaPkt;
result = (TMegaPkt *)&sgpMegaPkt;
while (v1) {
result = v1;
v1 = v1->pNext;
}
result->pNext = sgpCurrPkt;
return result;
}
BOOL __cdecl msg_wait_resync()
{
int v0; // eax
msg_get_next_packet();
sgbDeltaChunks = 0;
sgnCurrMegaPlayer = -1;
sgbRecvCmd = CMD_DLEVEL_END;
gbBufferMsgs = 1;
sgdwOwnerWait = GetTickCount();
v0 = UiProgressDialog(ghMainWnd, "Waiting for game data...", 1, msg_wait_for_turns, 20);
gbBufferMsgs = 0;
if (!v0)
goto LABEL_6;
if (gbGameDestroyed) {
DrawDlg("The game ended");
LABEL_6:
msg_free_packets();
return 0;
}
if (sgbDeltaChunks != 21) {
DrawDlg("Unable to get level data");
goto LABEL_6;
}
return 1;
}
// 65AB18: using guessed type int sgdwOwnerWait;
// 65AB24: using guessed type int sgnCurrMegaPlayer;
// 67618D: using guessed type char sgbDeltaChunks;
// 676194: using guessed type char gbBufferMsgs;
// 67862D: using guessed type char gbGameDestroyed;
void __cdecl msg_free_packets()
{
TMegaPkt *v0; // eax
TMegaPkt *v1; // ecx
v0 = sgpMegaPkt;
while (v0) {
v1 = v0->pNext;
sgpMegaPkt = 0;
sgpCurrPkt = v1;
mem_free_dbg(v0);
v0 = sgpCurrPkt;
sgpMegaPkt = sgpCurrPkt;
}
}
int __cdecl msg_wait_for_turns()
{
//int v0; // eax
//int v2; // eax
int recieved; // [esp+0h] [ebp-8h]
DWORD turns; // [esp+4h] [ebp-4h]
if (!sgbDeltaChunks) {
nthread_send_and_recv_turn(0, 0);
//_LOBYTE(v0) = SNetGetOwnerTurnsWaiting(&turns);
if (!SNetGetOwnerTurnsWaiting(&turns) && SErrGetLastError() == STORM_ERROR_NOT_IN_GAME)
return 100;
if (GetTickCount() - sgdwOwnerWait <= 2000 && turns < (unsigned int)gdwTurnsInTransit)
return 0;
++sgbDeltaChunks;
}
multi_process_network_packets();
nthread_send_and_recv_turn(0, 0);
//_LOBYTE(v2) = nthread_has_500ms_passed();
if (nthread_has_500ms_passed())
nthread_recv_turns(&recieved);
if (gbGameDestroyed)
return 100;
if ((unsigned char)gbDeltaSender >= 4u) {
sgbDeltaChunks = 0;
sgbRecvCmd = CMD_DLEVEL_END;
gbDeltaSender = myplr;
nthread_set_turn_upper_bit();
}
if (sgbDeltaChunks == 20) {
sgbDeltaChunks = 21;
return 99;
}
return 100 * (unsigned char)sgbDeltaChunks / 21;
}
// 65AB18: using guessed type int sgdwOwnerWait;
// 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 __cdecl msg_process_net_packets()
{
if (gbMaxPlayers != 1) {
gbBufferMsgs = 2;
msg_pre_packet();
gbBufferMsgs = 0;
msg_free_packets();
}
}
// 676194: using guessed type char gbBufferMsgs;
// 679660: using guessed type char gbMaxPlayers;
void __cdecl msg_pre_packet()
{
TMegaPkt *v0; // edi
int i; // ebp
signed int v2; // ebx
TFakeCmdPlr *v3; // esi
TFakeCmdPlr *v4; // eax
TFakeDropPlr *v5; // eax
int v6; // eax
v0 = sgpMegaPkt;
for (i = -1; v0; v0 = v0->pNext) {
v2 = 32000;
v3 = (TFakeCmdPlr *)v0->data;
while (v2 != v0->dwSpaceLeft) {
if (v3->bCmd == FAKE_CMD_SETID) {
v4 = v3;
++v3;
i = (unsigned char)v4->bPlr;
v2 -= 2;
} else if (v3->bCmd == FAKE_CMD_DROPID) {
v5 = (TFakeDropPlr *)v3;
v3 += 3;
v2 -= 6;
multi_player_left((unsigned char)v5->bPlr, v5->dwReason);
} else {
v6 = ParseCmd(i, (TCmd *)v3);
v3 = (TFakeCmdPlr *)((char *)v3 + v6);
v2 -= v6;
}
}
}
}
void __fastcall DeltaExportData(int pnum)
{
char *v1; // edi
DObjectStr *v2; // esi
void *v3; // ebx
void *v4; // eax
void *v5; // eax
void *v6; // eax
int v7; // eax
void *v8; // eax
int v9; // eax
int player_num; // [esp+0h] [ebp-Ch]
int v11; // [esp+4h] [ebp-8h]
char src; // [esp+Bh] [ebp-1h]
player_num = pnum;
if (sgbDeltaChanged) {
v11 = 0;
v1 = (char *)DiabloAllocPtr(4722);
v2 = sgLevels[0].object;
v3 = v1 + 1;
do {
v4 = DeltaExportItem(v3, &v2[-2794]);
v5 = DeltaExportObject(v4, v2);
v6 = DeltaExportMonster(v5, &v2[127]);
v7 = msg_comp_level(v1, v6);
dthread_send_delta(player_num, (_BYTE)v11++ + CMD_DLEVEL_0, v1, v7);
v2 += 4721;
} while ((signed int)v2 < (signed int)&sgLevels[NUMLEVELS].object);
v8 = DeltaExportJunk(v3);
v9 = msg_comp_level(v1, v8);
dthread_send_delta(player_num, CMD_DLEVEL_JUNK, v1, v9);
mem_free_dbg(v1);
}
src = 0;
dthread_send_delta(player_num, CMD_DLEVEL_END, &src, 1);
}
// 67618C: using guessed type char sgbDeltaChanged;
void *__fastcall DeltaExportItem(void *dst, void *src)
{
_BYTE *v2; // edi
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (unsigned char *)src;
v3 = (unsigned char *)dst;
v4 = 127;
do {
if (*v2 == -1) {
*v3++ = -1;
} else {
memcpy(v3, v2, 0x16u);
v3 += 22;
}
v2 += 22;
--v4;
} while (v4);
return v3;
}
void *__fastcall DeltaExportObject(void *dst, void *src)
{
char *v2; // esi
v2 = (char *)dst;
memcpy(dst, src, 0x7Fu);
return v2 + 127;
}
void *__fastcall DeltaExportMonster(void *dst, void *src)
{
_BYTE *v2; // edi
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (unsigned char *)src;
v3 = (unsigned char *)dst;
v4 = MAXMONSTERS;
do {
if (*v2 == -1) {
*v3++ = -1;
} else {
memcpy(v3, v2, 9u);
v3 += 9;
}
v2 += 9;
--v4;
} while (v4);
return v3;
}
void *__fastcall DeltaExportJunk(void *dst)
{
char *v1; // ebx
DJunk *v2; // edi
MultiQuests *v3; // esi
unsigned char *v4; // edi
int *v5; // ebp
v1 = (char *)dst;
v2 = &sgJunk;
v3 = sgJunk.quests;
do {
if (v2->portal[0].x == LOBYTE(-1)) {
*v1++ = -1;
} else {
memcpy(v1, v2, 5u);
v1 += 5;
}
v2 = (DJunk *)((char *)v2 + 5);
} while ((signed int)v2 < (signed int)sgJunk.quests);
v4 = &quests[0]._qactive;
v5 = &questlist[0]._qflags;
do {
if (*(_BYTE *)v5 & 1) {
v3->qlog = v4[18];
v3->qstate = *v4;
v3->qvar1 = v4[13];
memcpy(v1, v3, 3u);
v1 += 3;
++v3;
}
v5 += 5;
v4 += 24;
} while ((signed int)v5 < (signed int)&questlist[16]._qflags);
return v1;
}
int __fastcall msg_comp_level(char *begin, void *end)
{
char *v2; // esi
int v3; // edi
int v4; // eax
v2 = begin;
v3 = (char *)end - begin - 1;
v4 = PkwareCompress(begin + 1, v3);
*v2 = v3 != v4;
return v4 + 1;
}
void __cdecl delta_init()
{
sgbDeltaChanged = 0;
memset(&sgJunk, 255, 0x20u);
memset(sgLevels, 255, 0x13981u);
memset(sgLocals, 0, 0x6A40u);
deltaload = 0;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 676190: using guessed type int deltaload;
void __fastcall delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
{
DMonsterStr *v4; // eax
char v5; // cl
if (gbMaxPlayers != 1) {
v4 = &sgLevels[bLevel].monster[mi];
sgbDeltaChanged = 1;
v5 = monster[mi]._mdir;
v4->_mhitpoints = 0;
v4->_mx = x;
v4->_mdir = v5;
v4->_my = y;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_monster_hp(int mi, int hp, BYTE bLevel)
{
DMonsterStr *v3; // eax
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
v3 = &sgLevels[bLevel].monster[mi];
if (v3->_mhitpoints > hp)
v3->_mhitpoints = hp;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_sync_monster(TCmdLocParam1 *packet, BYTE level)
{
DMonsterStr *v2; // eax
char v3; // dl
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
v2 = &sgLevels[(unsigned char)level].monster[(unsigned char)packet->bCmd];
if (v2->_mhitpoints) {
v2->_mx = packet->x;
v3 = packet->y;
v2->_mactive = -1;
v2->_my = v3;
v2->_menemy = packet->wParam1;
}
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
{
DMonsterStr *v3; // eax
char v4; // dl
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
v3 = &sgLevels[(unsigned char)bLevel].monster[pnum];
v3->_mx = pG->_mx;
v4 = pG->_my;
v3->_mactive = -1;
v3->_my = v4;
v3->_menemy = pG->_menemy;
v3->_mdir = pG->_mdir;
v3->_mhitpoints = pG->_mhitpoints;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall delta_leave_sync(BYTE bLevel)
{
unsigned char v1; // bl
BOOLEAN v2; // zf
int v3; // eax
int i; // ebp
int v5; // ecx
int v6; // esi
DMonsterStr *v7; // edi
v1 = bLevel;
if (gbMaxPlayers != 1) {
v2 = currlevel == 0;
if (currlevel == 0) {
v3 = GetRndSeed();
v2 = currlevel == 0;
glSeedTbl[0] = v3;
}
if (!v2) {
for (i = 0; i < nummonsters; ++i) {
v5 = monstactive[i];
v6 = monstactive[i];
if (monster[v6]._mhitpoints) {
sgbDeltaChanged = 1;
v7 = &sgLevels[v1].monster[v5];
v7->_mx = monster[v6]._mx;
v7->_my = monster[v6]._my;
v7->_mdir = monster[v6]._mdir;
v7->_menemy = encode_enemy(v5);
v7->_mhitpoints = monster[v6]._mhitpoints;
v7->_mactive = monster[v6]._msquelch;
}
}
memcpy(&sgLocals[v1], automapview, 0x640u);
}
}
}
// 43C17D: could not find valid save-restore pair for edi
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
BOOL __fastcall delta_portal_inited(int i)
{
return sgJunk.portal[i].x == LOBYTE(-1);
}
BOOL __fastcall delta_quest_inited(int i)
{
return sgJunk.quests[i].qstate != LOBYTE(-1);
}
void __fastcall DeltaAddItem(int ii)
{
int v1; // eax
int v2; // ecx
signed int v3; // ebp
DLevel *v4; // edx
DLevel *v5; // edi
char v6; // bl
int v7; // esi
signed int v8; // esi
int v9; // eax
char v10; // cl
char v11; // cl
v1 = ii;
if (gbMaxPlayers != 1) {
v2 = currlevel;
v3 = 0;
v4 = &sgLevels[v2];
v5 = &sgLevels[v2];
while (1) {
v6 = v5->item[0].bCmd;
if (v5->item[0].bCmd != -1) {
v7 = v1;
if ((unsigned short)v5->item[0].wIndx == item[v1].IDidx
&& v5->item[0].wCI == item[v7]._iCreateInfo
&& v5->item[0].dwSeed == item[v7]._iSeed
&& (v6 == 1 || !v6)) {
break;
}
}
++v3;
v5 = (DLevel *)((char *)v5 + 22);
if (v3 >= 127) {
v8 = 0;
while (v4->item[0].bCmd != -1) {
++v8;
v4 = (DLevel *)((char *)v4 + 22);
if (v8 >= 127)
return;
}
v4->item[0].bCmd = 0;
v9 = 368 * v1;
v10 = *((_BYTE *)&item[0]._ix + v9);
sgbDeltaChanged = 1;
v4->item[0].x = v10;
v4->item[0].y = *((_BYTE *)&item[0]._iy + v9);
v4->item[0].wIndx = *(_WORD *)((char *)&item[0].IDidx + v9);
v4->item[0].wCI = *(short *)((char *)&item[0]._iCreateInfo + v9);
v4->item[0].dwSeed = *(int *)((char *)&item[0]._iSeed + v9);
v4->item[0].bId = *((_BYTE *)&item[0]._iIdentified + v9);
v4->item[0].bDur = *((_BYTE *)&item[0]._iDurability + v9);
v4->item[0].bMDur = *((_BYTE *)&item[0]._iMaxDur + v9);
v4->item[0].bCh = *((_BYTE *)&item[0]._iCharges + v9);
v11 = *((_BYTE *)&item[0]._iMaxCharges + v9);
_LOWORD(v9) = *(_WORD *)((char *)&item[0]._ivalue + v9);
v4->item[0].bMCh = v11;
v4->item[0].wValue = v9;
return;
}
}
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __cdecl DeltaSaveLevel()
{
int v0; // eax
int v1; // edx
int *v2; // ecx
unsigned char v3; // cl
if (gbMaxPlayers != 1) {
v0 = myplr;
v1 = 0;
v2 = &plr[0]._pGFXLoad;
do {
if (v1 != v0)
*v2 = 0;
v2 += 5430;
++v1;
} while ((signed int)v2 < (signed int)&plr[4]._pGFXLoad);
v3 = currlevel;
plr[v0]._pLvlVisited[currlevel] = 1;
delta_leave_sync(v3);
}
}
// 679660: using guessed type char gbMaxPlayers;
void __cdecl DeltaLoadLevel()
{
int v0; // ebx
int *v1; // esi
int v2; // eax
int v3; // ecx
int v4; // edx
int v5; // edi
char v6; // al
int v7; // eax
signed int v8; // esi
int v9; // eax
char v10; // cl
int v11; // eax
char *v12; // edx
int v13; // eax
int v14; // ebx
int *v15; // edx
unsigned short v16; // cx
int v17; // ST1C_4
int v18; // ST18_4
int v19; // eax
int v20; // ecx
int v21; // edx
int v22; // eax
int v23; // eax
int v24; // esi
int v25; // edi
int v26; // eax
int v27; // eax
int v28; // esi
unsigned char v29; // al
int j; // esi
int v31; // eax
signed int v32; // [esp+0h] [ebp-24h]
int v33; // [esp+4h] [ebp-20h]
int o2; // [esp+8h] [ebp-1Ch]
int i; // [esp+Ch] [ebp-18h]
signed int v36; // [esp+10h] [ebp-14h]
int v37; // [esp+14h] [ebp-10h]
signed int v38; // [esp+18h] [ebp-Ch]
signed int v39; // [esp+1Ch] [ebp-8h]
int v40; // [esp+20h] [ebp-4h]
signed int v41; // [esp+20h] [ebp-4h]
if (gbMaxPlayers != 1) {
deltaload = 1;
if (currlevel != 0) {
v0 = 0;
if (nummonsters > 0) {
v40 = 0;
v1 = &monster[0]._mfuty;
do {
if (sgLevels[currlevel].monster[v40]._mx != -1) {
M_ClearSquares(v0);
v2 = v40 * 9 + 4721 * currlevel;
v3 = *((unsigned char *)&sgLevels[0].monster[0]._mx + v2);
v4 = *((unsigned char *)&sgLevels[0].monster[0]._my + v2);
v5 = *(int *)((char *)&sgLevels[0].monster[0]._mhitpoints + v2);
*(v1 - 3) = v3;
*(v1 - 2) = v4;
v1[1] = v3;
v1[2] = v4;
*(v1 - 1) = v3;
*v1 = v4;
if (v5 != -1)
v1[26] = v5;
if (v5) {
decode_enemy(v0, *((unsigned char *)&sgLevels[0].monster[0]._menemy + v2));
v7 = *(v1 - 3);
if (v7 && v7 != 1 || *(v1 - 2))
dMonster[v7][*(v1 - 2)] = v0 + 1;
if ((signed int)v1 >= (signed int)&monster[4]._mfuty) {
M_StartStand(v0, v1[7]);
} else {
MAI_Golum(v0);
v1[28] |= 0x30u;
}
*((_BYTE *)v1 + 116) = sgLevels[currlevel].monster[v40]._mactive;
} else {
v1[1] = v3;
v1[2] = v4;
M_ClearSquares(v0);
if (*((_BYTE *)v1 + 108) != 27) {
if (*((_BYTE *)v1 + 144))
v6 = *((_BYTE *)v1 + 146);
else
v6 = *(_BYTE *)(v1[44] + 317);
AddDead(*(v1 - 3), *(v1 - 2), v6, (direction)v1[7]);
}
v1[16] = 1;
M_UpdateLeader(v0);
}
}
++v40;
++v0;
v1 += 57;
} while (v0 < nummonsters);
}
memcpy(automapview, &sgLocals[currlevel], 0x640u);
}
v8 = 0;
i = 0;
v32 = 0;
do {
v9 = v8 + 4721 * currlevel;
v10 = *(&sgLevels[0].item[0].bCmd + v9);
if (v10 != -1) {
if (v10 == 1) {
v11 = FindGetItem(
*(unsigned short *)((char *)&sgLevels[0].item[0].wIndx + v9),
*(short *)((char *)&sgLevels[0].item[0].wCI + v9),
*(int *)((char *)&sgLevels[0].item[0].dwSeed + v9));
if (v11 != -1) {
v12 = &dItem[item[v11]._ix][item[v11]._iy];
if (*v12 == v11 + 1)
*v12 = 0;
DeleteItem(v11, i);
}
}
v13 = v8 + 4721 * currlevel;
if (*(&sgLevels[0].item[0].bCmd + v13) == 2) {
v14 = itemavail[0];
v33 = itemavail[0];
v15 = &itemavail[MAXITEMS - numitems - 1];
itemactive[numitems] = itemavail[0];
v16 = *(short *)((char *)&sgLevels[0].item[0].wIndx + v13);
itemavail[0] = *v15;
if (v16 == IDI_EAR) {
RecreateEar(
v14,
*(short *)((char *)&sgLevels[0].item[0].wCI + v13),
*(int *)((char *)&sgLevels[0].item[0].dwSeed + v13),
*(&sgLevels[0].item[0].bId + v13),
*((unsigned char *)&sgLevels[0].item[0].bDur + v13),
*((unsigned char *)&sgLevels[0].item[0].bMDur + v13),
*((unsigned char *)&sgLevels[0].item[0].bCh + v13),
*((unsigned char *)&sgLevels[0].item[0].bMCh + v13),
*(unsigned short *)((char *)&sgLevels[0].item[0].wValue + v13),
*(int *)((char *)&sgLevels[0].item[0].dwBuff + v13));
} else {
v17 = *(unsigned short *)((char *)&sgLevels[0].item[0].wValue + v13);
v18 = *(int *)((char *)&sgLevels[0].item[0].dwSeed + v13);
_LOWORD(v13) = *(short *)((char *)&sgLevels[0].item[0].wCI + v13);
RecreateItem(v14, v16, v13, v18, v17);
v19 = v8 + 4721 * currlevel;
if (*(&sgLevels[0].item[0].bId + v19))
item[v14]._iIdentified = TRUE;
v20 = v14;
item[v20]._iDurability = *((unsigned char *)&sgLevels[0].item[0].bDur + v19);
item[v20]._iMaxDur = *((unsigned char *)&sgLevels[0].item[0].bMDur + v19);
v21 = *((unsigned char *)&sgLevels[0].item[0].bCh + v19);
v22 = *((unsigned char *)&sgLevels[0].item[0].bMCh + v19);
item[v20]._iCharges = v21;
item[v20]._iMaxCharges = v22;
}
v23 = v8 + 4721 * currlevel;
v24 = *((unsigned char *)&sgLevels[0].item[0].x + v23);
v25 = *((unsigned char *)&sgLevels[0].item[0].y + v23);
if (!CanPut(v24, v25)) {
v39 = 0;
v26 = -1;
v41 = 1;
v36 = -1;
do {
if (v39)
break;
v37 = v26;
while (v26 <= v41 && !v39) {
o2 = v25 + v37;
v38 = v36;
do {
if (v39)
break;
if (CanPut(v38 + v24, o2)) {
v25 = o2;
v39 = 1;
v24 += v38;
}
++v38;
v14 = v33;
} while (v38 <= v41);
v26 = ++v37;
}
++v41;
v26 = v36-- - 1;
} while (v36 > -50);
}
v27 = v14;
item[v27]._ix = v24;
item[v27]._iy = v25;
dItem[v24][v25] = v14 + 1;
RespawnItem(v14, 0);
++numitems;
v8 = v32;
}
}
++i;
v8 += 22;
v32 = v8;
} while (v8 < 2794);
if (currlevel != 0) {
v28 = 0;
do {
v29 = sgLevels[currlevel].object[v28].bCmd;
if (v29 >= CMD_OPENDOOR) {
if (v29 <= CMD_PLROPOBJ) {
SyncOpObject(-1, v29, v28);
} else if (v29 == CMD_BREAKOBJ) {
SyncBreakObj(-1, v28);
}
}
++v28;
} while (v28 < 127);
for (j = 0; j < nobjects; ++j) {
v31 = object[objectactive[j]]._otype;
if (v31 == OBJ_TRAPL || v31 == OBJ_TRAPR)
Obj_Trap(objectactive[j]);
}
}
deltaload = 0;
}
}
// 676190: using guessed type int deltaload;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall NetSendCmd(BOOL bHiPri, BYTE bCmd)
{
TCmd cmd; // [esp+3h] [ebp-1h]
cmd.bCmd = bCmd;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 1u);
else
NetSendLoPri((BYTE *)&cmd, 1u);
}
void __fastcall NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl)
{
TCmdGolem cmd; // [esp+0h] [ebp-Ch]
cmd._mx = mx;
cmd._mdir = dir;
cmd._menemy = menemy;
cmd._mhitpoints = hp;
cmd._my = my;
cmd.bCmd = CMD_AWAKEGOLEM;
cmd._currlevel = cl;
NetSendLoPri((BYTE *)&cmd, 0xAu);
}
void __fastcall NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
{
TCmdLoc cmd; // [esp+1h] [ebp-3h]
cmd.bCmd = bCmd;
cmd.x = x;
cmd.y = y;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 3u);
else
NetSendLoPri((BYTE *)&cmd, 3u);
}
void __fastcall NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
{
TCmdLocParam1 cmd; // [esp+0h] [ebp-8h]
cmd.bCmd = bCmd;
cmd.x = x;
cmd.y = y;
cmd.wParam1 = wParam1;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 5u);
else
NetSendLoPri((BYTE *)&cmd, 5u);
}
void __fastcall NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)
{
TCmdLocParam2 cmd; // [esp+0h] [ebp-8h]
cmd.bCmd = bCmd;
cmd.x = x;
cmd.y = y;
cmd.wParam1 = wParam1;
cmd.wParam2 = wParam2;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 7u);
else
NetSendLoPri((BYTE *)&cmd, 7u);
}
void __fastcall NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)
{
TCmdLocParam3 cmd; // [esp+0h] [ebp-Ch]
cmd.bCmd = bCmd;
cmd.x = x;
cmd.y = y;
cmd.wParam1 = wParam1;
cmd.wParam2 = wParam2;
cmd.wParam3 = wParam3;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 9u);
else
NetSendLoPri((BYTE *)&cmd, 9u);
}
void __fastcall NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
{
TCmdParam1 cmd;
cmd.bCmd = bCmd;
cmd.wParam1 = wParam1;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 3u);
else
NetSendLoPri((BYTE *)&cmd, 3u);
}
void __fastcall NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)
{
TCmdParam2 cmd; // [esp+0h] [ebp-8h]
cmd.bCmd = bCmd;
cmd.wParam1 = wParam1;
cmd.wParam2 = wParam2;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 5u);
else
NetSendLoPri((BYTE *)&cmd, 5u);
}
void __fastcall NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)
{
TCmdParam3 cmd; // [esp+0h] [ebp-8h]
cmd.bCmd = bCmd;
cmd.wParam1 = wParam1;
cmd.wParam2 = wParam2;
cmd.wParam3 = wParam3;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 7u);
else
NetSendLoPri((BYTE *)&cmd, 7u);
}
void __fastcall NetSendCmdQuest(BOOL bHiPri, BYTE q)
{
int v2; // eax
char v3; // dl
TCmdQuest cmd; // [esp+0h] [ebp-8h]
cmd.q = q;
cmd.bCmd = CMD_SYNCQUEST;
v2 = 24 * q;
cmd.qstate = *(&quests[0]._qactive + v2);
v3 = *((_BYTE *)&quests[0]._qlog + v2);
_LOBYTE(v2) = *(&quests[0]._qvar1 + v2);
cmd.qlog = v3;
cmd.qvar1 = v2;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 5u);
else
NetSendLoPri((BYTE *)&cmd, 5u);
}
void __fastcall NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, int ii)
{
int v5; // eax
BOOLEAN v6; // zf
short v7; // dx
short v8; // bx
int v9; // esi
int v10; // esi
char v11; // dl
short v12; // ax
TCmdGItem cmd; // [esp+4h] [ebp-20h]
cmd.bCmd = bCmd;
cmd.bPnum = pnum;
cmd.bMaster = mast;
cmd.bLevel = currlevel;
cmd.bCursitem = ii;
cmd.dwTime = 0;
v5 = (unsigned char)ii;
cmd.x = item[v5]._ix;
cmd.y = item[v5]._iy;
v6 = item[v5].IDidx == IDI_EAR;
cmd.wIndx = item[v5].IDidx;
if (v6) {
_LOBYTE(v7) = 0;
_HIBYTE(v7) = item[v5]._iName[7];
_LOBYTE(v8) = 0;
_HIBYTE(v8) = item[v5]._iName[18];
v9 = item[v5]._iName[10];
cmd.wCI = item[v5]._iName[8] | v7;
cmd.dwSeed = item[v5]._iName[12] | ((item[v5]._iName[11] | ((v9 | (item[v5]._iName[9] << 8)) << 8)) << 8);
cmd.bId = item[v5]._iName[13];
cmd.bDur = item[v5]._iName[14];
cmd.bMDur = item[v5]._iName[15];
cmd.bCh = item[v5]._iName[16];
cmd.bMCh = item[v5]._iName[17];
v10 = item[v5]._iName[20];
cmd.wValue = _LOWORD(item[v5]._ivalue) | v8 | ((_LOWORD(item[v5]._iCurs) - 19) << 6);
cmd.dwBuff = item[v5]._iName[22] | ((item[v5]._iName[21] | ((v10 | (item[v5]._iName[19] << 8)) << 8)) << 8);
} else {
cmd.wCI = item[v5]._iCreateInfo;
cmd.dwSeed = item[v5]._iSeed;
cmd.bId = item[v5]._iIdentified;
cmd.bDur = item[v5]._iDurability;
cmd.bMDur = item[v5]._iMaxDur;
cmd.bCh = item[v5]._iCharges;
v11 = item[v5]._iMaxCharges;
v12 = item[v5]._ivalue;
cmd.bMCh = v11;
cmd.wValue = v12;
}
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 0x1Eu);
else
NetSendLoPri((BYTE *)&cmd, 0x1Eu);
}
void __fastcall NetSendCmdGItem2(BOOL usonly, BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
{
unsigned char v5; // bl
int v7; // eax
TCmdGItem cmd; // [esp+8h] [ebp-20h]
v5 = bCmd;
memcpy(&cmd, p, 0x1Eu);
cmd.bPnum = pnum;
cmd.bCmd = v5;
cmd.bMaster = mast;
if (!usonly) {
cmd.dwTime = 0;
NetSendHiPri((BYTE *)&cmd, 0x1Eu);
return;
}
v7 = GetTickCount();
if (!cmd.dwTime) {
cmd.dwTime = v7;
} else {
if (v7 - cmd.dwTime > 5000)
return;
}
multi_msg_add((BYTE *)&cmd.bCmd, 0x1Eu);
}
BOOL __fastcall NetSendCmdReq2(BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
{
int ticks;
TCmdGItem cmd;
memcpy(&cmd, p, sizeof(TCmdGItem));
cmd.bCmd = bCmd;
cmd.bPnum = pnum;
cmd.bMaster = mast;
ticks = GetTickCount();
if (!cmd.dwTime) {
cmd.dwTime = ticks;
} else if (ticks - cmd.dwTime > 5000) {
return FALSE;
}
multi_msg_add((BYTE *)&cmd.bCmd, sizeof(TCmdGItem));
return TRUE;
}
void __fastcall NetSendCmdExtra(TCmdGItem *p)
{
TCmdGItem cmd; // [esp+0h] [ebp-20h]
memcpy(&cmd, p, 0x1Eu);
cmd.dwTime = 0;
cmd.bCmd = CMD_ITEMEXTRA;
NetSendHiPri((BYTE *)&cmd, 0x1Eu);
}
void __fastcall NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
{
int v4; // eax
short *v5; // edx
BOOLEAN v6; // zf
short v7; // dx
short v8; // bx
int v9; // esi
int v10; // esi
char v11; // dl
short v12; // ax
TCmdPItem cmd; // [esp+4h] [ebp-18h]
cmd.bCmd = bCmd;
cmd.x = x;
cmd.y = y;
v4 = myplr;
v5 = (short *)&plr[myplr].HoldItem.IDidx;
v6 = *(_DWORD *)v5 == IDI_EAR;
cmd.wIndx = *v5;
if (v6) {
_LOBYTE(v7) = 0;
_HIBYTE(v7) = plr[v4].HoldItem._iName[7];
_LOBYTE(v8) = 0;
_HIBYTE(v8) = plr[v4].HoldItem._iName[18];
v9 = plr[v4].HoldItem._iName[10];
cmd.wCI = plr[v4].HoldItem._iName[8] | v7;
cmd.dwSeed = plr[v4].HoldItem._iName[12] | ((plr[v4].HoldItem._iName[11] | ((v9 | (plr[v4].HoldItem._iName[9] << 8)) << 8)) << 8);
cmd.bId = plr[v4].HoldItem._iName[13];
cmd.bDur = plr[v4].HoldItem._iName[14];
cmd.bMDur = plr[v4].HoldItem._iName[15];
cmd.bCh = plr[v4].HoldItem._iName[16];
cmd.bMCh = plr[v4].HoldItem._iName[17];
v10 = plr[v4].HoldItem._iName[20];
cmd.wValue = _LOWORD(plr[v4].HoldItem._ivalue) | v8 | ((_LOWORD(plr[v4].HoldItem._iCurs) - 19) << 6);
cmd.dwBuff = plr[v4].HoldItem._iName[22] | ((plr[v4].HoldItem._iName[21] | ((v10 | (plr[v4].HoldItem._iName[19] << 8)) << 8)) << 8);
} else {
cmd.wCI = plr[v4].HoldItem._iCreateInfo;
cmd.dwSeed = plr[v4].HoldItem._iSeed;
cmd.bId = plr[v4].HoldItem._iIdentified;
cmd.bDur = plr[v4].HoldItem._iDurability;
cmd.bMDur = plr[v4].HoldItem._iMaxDur;
cmd.bCh = plr[v4].HoldItem._iCharges;
v11 = plr[v4].HoldItem._iMaxCharges;
v12 = plr[v4].HoldItem._ivalue;
cmd.bMCh = v11;
cmd.wValue = v12;
}
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 0x16u);
else
NetSendLoPri((BYTE *)&cmd, 0x16u);
}
void __fastcall NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)
{
short v2; // dx
char v3; // al
TCmdChItem cmd; // [esp+0h] [ebp-Ch]
cmd.bLoc = bLoc;
v2 = plr[myplr].HoldItem.IDidx;
cmd.bCmd = CMD_CHANGEPLRITEMS;
cmd.wIndx = v2;
cmd.wCI = plr[myplr].HoldItem._iCreateInfo;
v3 = plr[myplr].HoldItem._iIdentified;
cmd.dwSeed = plr[myplr].HoldItem._iSeed;
cmd.bId = v3;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 0xBu);
else
NetSendLoPri((BYTE *)&cmd, 0xBu);
}
void __fastcall NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)
{
TCmdDelItem cmd; // [esp+2h] [ebp-2h]
cmd.bLoc = bLoc;
cmd.bCmd = CMD_DELPLRITEMS;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 2u);
else
NetSendLoPri((BYTE *)&cmd, 2u);
}
void __fastcall NetSendCmdDItem(BOOL bHiPri, int ii)
{
int v2; // eax
short *v3; // edx
BOOLEAN v4; // zf
short v5; // dx
short v6; // bx
int v7; // esi
int v8; // esi
char v9; // dl
short v10; // ax
TCmdPItem cmd; // [esp+4h] [ebp-18h]
v2 = ii;
cmd.bCmd = CMD_DROPITEM;
cmd.x = item[ii]._ix;
cmd.y = item[ii]._iy;
v3 = (short *)&item[ii].IDidx;
v4 = *(_DWORD *)v3 == IDI_EAR;
cmd.wIndx = *v3;
if (v4) {
_LOBYTE(v5) = 0;
_HIBYTE(v5) = item[v2]._iName[7];
_LOBYTE(v6) = 0;
_HIBYTE(v6) = item[v2]._iName[18];
v7 = item[v2]._iName[10];
cmd.wCI = item[v2]._iName[8] | v5;
cmd.dwSeed = item[v2]._iName[12] | ((item[v2]._iName[11] | ((v7 | (item[v2]._iName[9] << 8)) << 8)) << 8);
cmd.bId = item[v2]._iName[13];
cmd.bDur = item[v2]._iName[14];
cmd.bMDur = item[v2]._iName[15];
cmd.bCh = item[v2]._iName[16];
cmd.bMCh = item[v2]._iName[17];
v8 = item[v2]._iName[20];
cmd.wValue = _LOWORD(item[v2]._ivalue) | v6 | ((_LOWORD(item[v2]._iCurs) - 19) << 6);
cmd.dwBuff = item[v2]._iName[22] | ((item[v2]._iName[21] | ((v8 | (item[v2]._iName[19] << 8)) << 8)) << 8);
} else {
cmd.wCI = item[v2]._iCreateInfo;
cmd.dwSeed = item[v2]._iSeed;
cmd.bId = item[v2]._iIdentified;
cmd.bDur = item[v2]._iDurability;
cmd.bMDur = item[v2]._iMaxDur;
cmd.bCh = item[v2]._iCharges;
v9 = item[v2]._iMaxCharges;
v10 = item[v2]._ivalue;
cmd.bMCh = v9;
cmd.wValue = v10;
}
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 0x16u);
else
NetSendLoPri((BYTE *)&cmd, 0x16u);
}
void __fastcall NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam)
{
TCmdDamage cmd; // [esp+0h] [ebp-8h]
cmd.bPlr = bPlr;
cmd.bCmd = CMD_PLRDAMAGE;
cmd.dwDam = dwDam;
if (bHiPri)
NetSendHiPri((BYTE *)&cmd, 6u);
else
NetSendLoPri((BYTE *)&cmd, 6u);
}
void __fastcall NetSendCmdString(int pmask, const char *pszStr)
{
int dwStrLen;
TCmdString cmd;
dwStrLen = strlen(pszStr);
cmd.bCmd = CMD_STRING;
strcpy(cmd.str, pszStr);
multi_send_msg_packet(pmask, (BYTE *)&cmd.bCmd, dwStrLen + 2);
}
void __fastcall RemovePlrPortal(int pnum)
{
memset(&sgJunk.portal[pnum], 255, 5u);
sgbDeltaChanged = 1;
}
// 67618C: using guessed type char sgbDeltaChanged;
int __fastcall ParseCmd(int pnum, TCmd *pCmd)
{
BOOLEAN v2; // zf
TCmd *v3; // eax
char v4; // dl
unsigned char v5; // bl
v2 = sgwPackPlrOffsetTbl[pnum] == 0;
v3 = pCmd;
v4 = pCmd->bCmd;
sbLastCmd = v4;
if (!v2 && v4 != CMD_ACK_PLRINFO && v4 != CMD_SEND_PLRINFO)
return 0;
v5 = v3->bCmd;
switch (v3->bCmd) {
case CMD_WALKXY:
return On_WALKXY((TCmdLoc *)v3, pnum);
case CMD_ACK_PLRINFO:
return On_ACK_PLRINFO((TCmdPlrInfoHdr *)v3, pnum);
case CMD_ADDSTR:
return On_ADDSTR((TCmdParam1 *)v3, pnum);
case CMD_ADDMAG:
return On_ADDMAG((TCmdParam1 *)v3, pnum);
case CMD_ADDDEX:
return On_ADDDEX((TCmdParam1 *)v3, pnum);
case CMD_ADDVIT:
return On_ADDVIT((TCmdParam1 *)v3, pnum);
case CMD_SBSPELL:
return On_SBSPELL((TCmdParam1 *)v3, pnum);
case CMD_GETITEM:
return On_GETITEM((TCmdGItem *)v3, pnum);
case CMD_AGETITEM:
return On_AGETITEM((TCmdGItem *)v3, pnum);
case CMD_PUTITEM:
return On_PUTITEM((TCmdPItem *)v3, pnum);
case CMD_RESPAWNITEM:
return On_RESPAWNITEM((TCmdPItem *)v3, pnum);
case CMD_ATTACKXY:
return On_ATTACKXY((TCmdLoc *)v3, pnum);
case CMD_RATTACKXY:
return On_RATTACKXY((TCmdLoc *)v3, pnum);
case CMD_SPELLXY:
return On_SPELLXY((TCmdLocParam2 *)v3, pnum);
case CMD_TSPELLXY:
return On_TSPELLXY((TCmdLocParam2 *)v3, pnum);
case CMD_OPOBJXY:
return On_OPOBJXY((TCmdLocParam1 *)v3, pnum);
case CMD_DISARMXY:
return On_DISARMXY((TCmdLocParam1 *)v3, pnum);
case CMD_ATTACKID:
return On_ATTACKID((TCmdParam1 *)v3, pnum);
case CMD_ATTACKPID:
return On_ATTACKPID((TCmdParam1 *)v3, pnum);
case CMD_RATTACKID:
return On_RATTACKID((TCmdParam1 *)v3, pnum);
case CMD_RATTACKPID:
return On_RATTACKPID((TCmdParam1 *)v3, pnum);
case CMD_SPELLID:
return On_SPELLID((TCmdParam3 *)v3, pnum);
case CMD_SPELLPID:
return On_SPELLPID((TCmdParam3 *)v3, pnum);
case CMD_TSPELLID:
return On_TSPELLID((TCmdParam3 *)v3, pnum);
case CMD_TSPELLPID:
return On_TSPELLPID((TCmdParam3 *)v3, pnum);
case CMD_RESURRECT:
return On_RESURRECT((TCmdParam1 *)v3, pnum);
case CMD_OPOBJT:
return On_OPOBJT((TCmdParam1 *)v3, pnum);
case CMD_KNOCKBACK:
return On_KNOCKBACK((TCmdParam1 *)v3, pnum);
case CMD_TALKXY:
return On_TALKXY((TCmdLocParam1 *)v3, pnum);
case CMD_NEWLVL:
return On_NEWLVL((TCmdParam2 *)v3, pnum);
case CMD_WARP:
return On_WARP((TCmdParam1 *)v3, pnum);
case CMD_CHEAT_EXPERIENCE:
return On_CHEAT_EXPERIENCE(v3, pnum);
case CMD_CHEAT_SPELL_LEVEL:
return On_CHEAT_SPELL_LEVEL(v3, pnum);
case CMD_DEBUG:
return On_DEBUG(v3);
case CMD_SYNCDATA:
return On_SYNCDATA(v3, pnum);
case CMD_MONSTDEATH:
return On_MONSTDEATH((TCmdLocParam1 *)v3, pnum);
case CMD_MONSTDAMAGE:
return On_MONSTDAMAGE((TCmdParam2 *)v3, pnum);
case CMD_PLRDEAD:
return On_PLRDEAD((TCmdParam1 *)v3, pnum);
case CMD_REQUESTGITEM:
return On_REQUESTGITEM((TCmdGItem *)v3, pnum);
case CMD_REQUESTAGITEM:
return On_REQUESTAGITEM((TCmdGItem *)v3, pnum);
case CMD_GOTOGETITEM:
return On_GOTOGETITEM((TCmdLocParam1 *)v3, pnum);
case CMD_GOTOAGETITEM:
return On_GOTOAGETITEM((TCmdLocParam1 *)v3, pnum);
case CMD_OPENDOOR:
return On_OPENDOOR((TCmdParam1 *)v3, pnum);
case CMD_CLOSEDOOR:
return On_CLOSEDOOR((TCmdParam1 *)v3, pnum);
case CMD_OPERATEOBJ:
return On_OPERATEOBJ((TCmdParam1 *)v3, pnum);
case CMD_PLROPOBJ:
return On_PLROPOBJ((TCmdParam2 *)v3, pnum);
case CMD_BREAKOBJ:
return On_BREAKOBJ((TCmdParam2 *)v3, pnum);
case CMD_CHANGEPLRITEMS:
return On_CHANGEPLRITEMS((TCmdChItem *)v3, pnum);
case CMD_DELPLRITEMS:
return On_DELPLRITEMS((TCmdDelItem *)v3, pnum);
case CMD_PLRDAMAGE:
return On_PLRDAMAGE((TCmdDamage *)v3, pnum);
case CMD_PLRLEVEL:
return On_PLRLEVEL((TCmdParam1 *)v3, pnum);
case CMD_DROPITEM:
return On_DROPITEM((TCmdPItem *)v3, pnum);
case CMD_PLAYER_JOINLEVEL:
return On_PLAYER_JOINLEVEL((TCmdLocParam1 *)v3, pnum);
case CMD_SEND_PLRINFO:
return On_SEND_PLRINFO((TCmdPlrInfoHdr *)v3, pnum);
case CMD_SATTACKXY:
return On_SATTACKXY((TCmdLoc *)v3, pnum);
case CMD_ACTIVATEPORTAL:
return On_ACTIVATEPORTAL((TCmdLocParam3 *)v3, pnum);
case CMD_DEACTIVATEPORTAL:
return On_DEACTIVATEPORTAL(v3, pnum);
case CMD_HEALOTHER:
return On_HEALOTHER((TCmdParam1 *)v3, pnum);
case CMD_STRING:
return On_STRING((TCmdString *)v3, pnum);
case CMD_SETSTR:
return On_SETSTR((TCmdParam1 *)v3, pnum);
case CMD_SETMAG:
return On_SETMAG((TCmdParam1 *)v3, pnum);
case CMD_SETDEX:
return On_SETDEX((TCmdParam1 *)v3, pnum);
case CMD_SETVIT:
return On_SETVIT((TCmdParam1 *)v3, pnum);
case CMD_RETOWN:
return On_RETOWN(v3, pnum);
case CMD_SPELLXYD:
return On_SPELLXYD((TCmdLocParam3 *)v3, pnum);
case CMD_ITEMEXTRA:
return On_ITEMEXTRA((TCmdGItem *)v3, pnum);
case CMD_SYNCPUTITEM:
return On_SYNCPUTITEM((TCmdPItem *)v3, pnum);
case CMD_KILLGOLEM:
return On_KILLGOLEM((TCmdLocParam1 *)v3, pnum);
case CMD_SYNCQUEST:
return On_SYNCQUEST((TCmdQuest *)v3, pnum);
case CMD_ENDSHIELD:
return On_ENDSHIELD(v3, pnum);
case CMD_AWAKEGOLEM:
return On_AWAKEGOLEM((TCmdGolem *)v3, pnum);
case CMD_NOVA:
return On_NOVA((TCmdLoc *)v3, pnum);
case CMD_SETSHIELD:
return On_SETSHIELD(v3, pnum);
case CMD_REMSHIELD:
return On_REMSHIELD(v3, pnum);
default:
if (v5 < CMD_DLEVEL_0 || v5 > CMD_DLEVEL_END) {
SNetDropPlayer(pnum, 0x40000006);
return 0;
}
return On_DLEVEL(pnum, (TCmdPlrInfoHdr *)v3);
}
}
// 66E4A9: using guessed type char sbLastCmd;
// 67618D: using guessed type char sgbDeltaChunks;
// 6796E4: using guessed type char gbDeltaSender;
int __fastcall On_DLEVEL(int pnum, TCmdPlrInfoHdr *pCmd)
{
if ( (unsigned char)gbDeltaSender == pnum )
{
if ( sgbRecvCmd != CMD_DLEVEL_END )
{
if ( sgbRecvCmd == pCmd->bCmd )
{
LABEL_17:
memcpy(&sgRecvBuf[pCmd->wOffset], &pCmd[1], pCmd->wBytes);
sgdwRecvOffset += pCmd->wBytes;
return pCmd->wBytes + 5;
}
DeltaImportData(sgbRecvCmd, sgdwRecvOffset);
if ( pCmd->bCmd == CMD_DLEVEL_END )
{
sgbDeltaChunks = 20;
sgbRecvCmd = CMD_DLEVEL_END;
return pCmd->wBytes + 5;
}
sgdwRecvOffset = 0;
LABEL_16:
sgbRecvCmd = pCmd->bCmd;
goto LABEL_17;
}
}
else
{
if ( pCmd->bCmd != CMD_DLEVEL_END && (pCmd->bCmd != CMD_DLEVEL_0 || pCmd->wOffset) )
return pCmd->wBytes + 5;
gbDeltaSender = pnum;
sgbRecvCmd = CMD_DLEVEL_END;
}
if ( pCmd->bCmd == CMD_DLEVEL_END )
{
sgbDeltaChunks = 20;
return pCmd->wBytes + 5;
}
if ( pCmd->bCmd == CMD_DLEVEL_0 && !pCmd->wOffset )
{
sgdwRecvOffset = 0;
goto LABEL_16;
}
return pCmd->wBytes + 5;
}
void __fastcall DeltaImportData(BYTE cmd, DWORD recv_offset)
{
unsigned char v2; // bl
int v3; // esi
void *v4; // eax
void *v5; // eax
v2 = cmd;
if (sgRecvBuf[0])
PkwareDecompress(&sgRecvBuf[1], recv_offset, 4721);
if (v2 == CMD_DLEVEL_JUNK) {
DeltaImportJunk(&sgRecvBuf[1]);
} else if (v2 < CMD_DLEVEL_0 || v2 > CMD_DLEVEL_16) {
TermMsg("msg:1");
} else {
v3 = (unsigned char)(v2 - CMD_DLEVEL_0);
v4 = DeltaImportItem(&sgRecvBuf[1], &sgLevels[v3]);
v5 = DeltaImportObject(v4, sgLevels[v3].object);
DeltaImportMonster(v5, sgLevels[v3].monster);
}
++sgbDeltaChunks;
sgbDeltaChanged = 1;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 67618D: using guessed type char sgbDeltaChunks;
void *__fastcall DeltaImportItem(void *src, void *dst)
{
char *v2; // edi
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (char *)dst;
v3 = (unsigned char *)src;
v4 = 127;
do {
if (*v3 == -1) {
memset(v2, 255, 0x16u);
++v3;
} else {
memcpy(v2, v3, 0x16u);
v3 += 22;
}
v2 += 22;
--v4;
} while (v4);
return v3;
}
void *__fastcall DeltaImportObject(void *src, void *dst)
{
char *v2; // esi
v2 = (char *)src;
memcpy(dst, src, 0x7Fu);
return v2 + 127;
}
void *__fastcall DeltaImportMonster(void *src, void *dst)
{
char *v2; // edi
_BYTE *v3; // esi
signed int v4; // ebx
v2 = (char *)dst;
v3 = (unsigned char *)src;
v4 = MAXMONSTERS;
do {
if (*v3 == -1) {
memset(v2, 255, 9u);
++v3;
} else {
memcpy(v2, v3, 9u);
v3 += 9;
}
v2 += 9;
--v4;
} while (v4);
return v3;
}
void __fastcall DeltaImportJunk(void *src)
{
_BYTE *v1; // ebx
int v2; // edi
DJunk *v3; // esi
char result; // al
MultiQuests *v5; // esi
unsigned char *v6; // edi
int *v7; // ebp
v1 = (_BYTE *)src;
v2 = 0;
v3 = &sgJunk;
do {
if (*v1 == -1) {
memset(v3, 255, 5u);
++v1;
SetPortalStats(v2, 0, 0, 0, 0, 0);
} else {
memcpy(v3, v1, 5u);
v1 += 5;
SetPortalStats(
v2,
1,
(unsigned char)v3->portal[0].x,
(unsigned char)v3->portal[0].y,
(unsigned char)v3->portal[0].level,
(unsigned char)v3->portal[0].ltype);
}
v3 = (DJunk *)((char *)v3 + 5);
++v2;
} while ((signed int)v3 < (signed int)sgJunk.quests);
v5 = sgJunk.quests;
v6 = &quests[0]._qactive;
v7 = &questlist[0]._qflags;
do {
if (*(_BYTE *)v7 & 1) {
memcpy(v5, v1, 3u);
*(_DWORD *)(v6 + 18) = (unsigned char)v5->qlog;
*v6 = v5->qstate;
result = v5->qvar1;
v1 += 3;
v6[13] = result;
++v5;
}
v7 += 5;
v6 += 24;
} while ((signed int)v7 < (signed int)&questlist[16]._qflags);
}
int __fastcall On_SYNCDATA(void *packet, int pnum)
{
return SyncData(pnum, (TSyncHeader *)packet);
}
int __fastcall On_WALKXY(TCmdLoc *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
ClrPlrPath(pnum);
MakePlrPath(pnum, pCmd->x, pCmd->y, TRUE);
plr[pnum].destAction = ACTION_NONE;
}
return sizeof(*pCmd);
}
int __fastcall On_ADDSTR(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 256)
ModifyPlrStr(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_ADDMAG(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 256)
ModifyPlrMag(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_ADDDEX(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 256)
ModifyPlrDex(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_ADDVIT(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 256)
ModifyPlrVit(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_SBSPELL(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1) {
if (currlevel != 0 || spelldata[pCmd->wParam1].sTownSpell) {
plr[pnum]._pSpell = pCmd->wParam1;
plr[pnum]._pSplType = plr[pnum]._pSBkSplType;
plr[pnum]._pSplFrom = 1;
plr[pnum].destAction = ACTION_SPELL;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
void msg_errorf(const char *pszFmt, ...)
{
static DWORD msg_err_timer;
DWORD v1; // eax
char v2[256]; // [esp+0h] [ebp-100h]
va_list va; // [esp+10Ch] [ebp+Ch]
va_start(va, pszFmt);
v1 = GetTickCount();
if (v1 - msg_err_timer >= 5000) {
msg_err_timer = v1;
vsprintf(v2, pszFmt, va);
ErrorPlrMsg(v2);
}
va_end(va);
}
int __fastcall On_GOTOGETITEM(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
plr[pnum].destAction = ACTION_PICKUPITEM;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_REQUESTGITEM(TCmdGItem *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {
if (GetItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx)) {
int ii = FindGetItem(pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
if (ii != -1) {
NetSendCmdGItem2(FALSE, CMD_GETITEM, myplr, pCmd->bPnum, pCmd);
if (pCmd->bPnum != myplr)
SyncGetItem(pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
else
InvGetItem(myplr, ii);
SetItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
} else if (!NetSendCmdReq2(CMD_REQUESTGITEM, myplr, pCmd->bPnum, pCmd))
NetSendCmdExtra(pCmd);
}
}
return sizeof(*pCmd);
}
BOOL __fastcall i_own_level(int nReqLevel)
{
int v1; // edx
unsigned char *v2; // eax
v1 = 0;
v2 = &plr[0]._pLvlChanging;
do {
if (*(v2 - 290) && !*v2 && *(_DWORD *)(v2 - 267) == nReqLevel && (v1 != myplr || !gbBufferMsgs))
break;
v2 += 21720;
++v1;
} while ((signed int)v2 < (signed int)&plr[4]._pLvlChanging);
return v1 == myplr;
}
// 676194: using guessed type char gbBufferMsgs;
int __fastcall On_GETITEM(TCmdGItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
int ii = FindGetItem(pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
if (delta_get_item(pCmd, pCmd->bLevel)) {
if ((currlevel == pCmd->bLevel || pCmd->bPnum == myplr) && pCmd->bMaster != myplr) {
if (pCmd->bPnum == myplr) {
if (currlevel != pCmd->bLevel) {
ii = SyncPutItem(myplr, plr[myplr].WorldX, plr[myplr].WorldY, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId, pCmd->bDur, pCmd->bMDur, pCmd->bCh, pCmd->bMCh, pCmd->wValue, pCmd->dwBuff);
if (ii != -1)
InvGetItem(myplr, ii);
} else
InvGetItem(myplr, ii);
} else
SyncGetItem(pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
}
} else
NetSendCmdGItem2(TRUE, CMD_GETITEM, pCmd->bMaster, pCmd->bPnum, pCmd);
}
return sizeof(*pCmd);
}
BOOL __fastcall delta_get_item(TCmdGItem *pI, BYTE bLevel)
{
TCmdGItem *v2; // esi
signed int v3; // ecx
DLevel *v4; // edi
DLevel *v5; // eax
char v6; // cl
DLevel *v8; // eax
signed int v9; // ecx
v2 = pI;
if (gbMaxPlayers != 1) {
v3 = 0;
v4 = &sgLevels[bLevel];
v5 = &sgLevels[bLevel];
while (v5->item[0].bCmd == -1
|| v5->item[0].wIndx != v2->wIndx
|| v5->item[0].wCI != v2->wCI
|| v5->item[0].dwSeed != v2->dwSeed) {
++v3;
v5 = (DLevel *)((char *)v5 + 22);
if (v3 >= 127)
goto LABEL_15;
}
v6 = v5->item[0].bCmd;
if (v5->item[0].bCmd == 1)
return 1;
if (!v6) {
sgbDeltaChanged = 1;
v5->item[0].bCmd = 1;
return 1;
}
if (v6 == 2) {
v5->item[0].bCmd = -1;
sgbDeltaChanged = 1;
return 1;
}
TermMsg("delta:1");
LABEL_15:
if (v2->wCI >= 0)
return 0;
v8 = v4;
v9 = 0;
while (v8->item[0].bCmd != -1) {
++v9;
v8 = (DLevel *)((char *)v8 + 22);
if (v9 >= 127)
return 1;
}
sgbDeltaChanged = 1;
v8->item[0].bCmd = 1;
v8->item[0].x = v2->x;
v8->item[0].y = v2->y;
v8->item[0].wIndx = v2->wIndx;
v8->item[0].wCI = v2->wCI;
v8->item[0].dwSeed = v2->dwSeed;
v8->item[0].bId = v2->bId;
v8->item[0].bDur = v2->bDur;
v8->item[0].bMDur = v2->bMDur;
v8->item[0].bCh = v2->bCh;
v8->item[0].bMCh = v2->bMCh;
v8->item[0].wValue = v2->wValue;
v8->item[0].dwBuff = v2->dwBuff;
}
return 1;
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
int __fastcall On_GOTOAGETITEM(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
plr[pnum].destAction = ACTION_PICKUPAITEM;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_REQUESTAGITEM(TCmdGItem *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {
if (GetItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx)) {
int ii = FindGetItem(pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
if (ii != -1) {
NetSendCmdGItem2(FALSE, CMD_AGETITEM, myplr, pCmd->bPnum, pCmd);
if (pCmd->bPnum != myplr)
SyncGetItem(pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
else
AutoGetItem(myplr, pCmd->bCursitem);
SetItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
} else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, myplr, pCmd->bPnum, pCmd))
NetSendCmdExtra(pCmd);
}
}
return sizeof(*pCmd);
}
int __fastcall On_AGETITEM(TCmdGItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
FindGetItem(pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
if (delta_get_item(pCmd, pCmd->bLevel)) {
if ((currlevel == pCmd->bLevel || pCmd->bPnum == myplr) && pCmd->bMaster != myplr) {
if (pCmd->bPnum == myplr) {
if (currlevel != pCmd->bLevel) {
int ii = SyncPutItem(myplr, plr[myplr].WorldX, plr[myplr].WorldY, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId, pCmd->bDur, pCmd->bMDur, pCmd->bCh, pCmd->bMCh, pCmd->wValue, pCmd->dwBuff);
if (ii != -1)
AutoGetItem(myplr, ii);
} else
AutoGetItem(myplr, pCmd->bCursitem);
} else
SyncGetItem(pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
}
} else
NetSendCmdGItem2(TRUE, CMD_AGETITEM, pCmd->bMaster, pCmd->bPnum, pCmd);
}
return sizeof(*pCmd);
}
int __fastcall On_ITEMEXTRA(TCmdGItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
delta_get_item(pCmd, pCmd->bLevel);
if (currlevel == plr[pnum].plrlevel)
SyncGetItem(pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed);
}
return sizeof(*pCmd);
}
int __fastcall On_PUTITEM(TCmdPItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (currlevel == plr[pnum].plrlevel) {
int ii;
if (pnum == myplr)
ii = InvPutItem(pnum, pCmd->x, pCmd->y);
else
ii = SyncPutItem(pnum, pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId, pCmd->bDur, pCmd->bMDur, pCmd->bCh, pCmd->bMCh, pCmd->wValue, pCmd->dwBuff);
if (ii != -1) {
PutItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
delta_put_item(pCmd, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);
check_update_plr(pnum);
}
return sizeof(*pCmd);
} else {
PutItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
delta_put_item(pCmd, pCmd->x, pCmd->y, plr[pnum].plrlevel);
check_update_plr(pnum);
}
return sizeof(*pCmd);
}
void __fastcall delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)
{
TCmdPItem *v4; // ebx
int v5; // eax
DLevel *v6; // esi
DLevel *v7; // edi
char v8; // al
signed int v9; // eax
char v10; // [esp+Ch] [ebp-4h]
signed int bLevela; // [esp+1Ch] [ebp+Ch]
v10 = x;
v4 = pI;
if (gbMaxPlayers != 1) {
v5 = bLevel;
bLevela = 0;
v6 = &sgLevels[v5];
v7 = &sgLevels[v5];
do {
v8 = v7->item[0].bCmd;
if (v7->item[0].bCmd != 1
&& v8 != -1
&& v7->item[0].wIndx == v4->wIndx
&& v7->item[0].wCI == v4->wCI
&& v7->item[0].dwSeed == v4->dwSeed) {
if (v8 == 2)
return;
TermMsg("Trying to drop a floor item?");
}
++bLevela;
v7 = (DLevel *)((char *)v7 + 22);
} while (bLevela < 127);
v9 = 0;
while (v6->item[0].bCmd != -1) {
++v9;
v6 = (DLevel *)((char *)v6 + 22);
if (v9 >= 127)
return;
}
sgbDeltaChanged = 1;
memcpy(v6, v4, 0x16u);
v6->item[0].x = v10;
v6->item[0].bCmd = 2;
v6->item[0].y = y;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
void __fastcall check_update_plr(int pnum)
{
if (gbMaxPlayers != 1 && pnum == myplr)
pfile_update(1);
}
// 679660: using guessed type char gbMaxPlayers;
int __fastcall On_SYNCPUTITEM(TCmdPItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (currlevel == plr[pnum].plrlevel) {
int ii = SyncPutItem(pnum, pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId, pCmd->bDur, pCmd->bMDur, pCmd->bCh, pCmd->bMCh, pCmd->wValue, pCmd->dwBuff);
if (ii != -1) {
PutItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
delta_put_item(pCmd, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);
check_update_plr(pnum);
}
return sizeof(*pCmd);
} else {
PutItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
delta_put_item(pCmd, pCmd->x, pCmd->y, plr[pnum].plrlevel);
check_update_plr(pnum);
}
return sizeof(*pCmd);
}
int __fastcall On_RESPAWNITEM(TCmdPItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel && pnum != myplr)
SyncPutItem(pnum, pCmd->x, pCmd->y, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId, pCmd->bDur, pCmd->bMDur, pCmd->bCh, pCmd->bMCh, pCmd->wValue, pCmd->dwBuff);
PutItemRecord(pCmd->dwSeed, pCmd->wCI, pCmd->wIndx);
delta_put_item(pCmd, pCmd->x, pCmd->y, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_ATTACKXY(TCmdLoc *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
plr[pnum].destAction = ACTION_ATTACK;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
}
return sizeof(*pCmd);
}
int __fastcall On_SATTACKXY(TCmdLoc *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_ATTACK;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
}
return sizeof(*pCmd);
}
int __fastcall On_RATTACKXY(TCmdLoc *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_RATTACK;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
}
return sizeof(*pCmd);
}
int __fastcall On_SPELLXYD(TCmdLocParam3 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam1].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLWALL;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
plr[pnum].destParam3 = pCmd->wParam2;
plr[pnum].destParam4 = pCmd->wParam3;
plr[pnum]._pSpell = pCmd->wParam1;
plr[pnum]._pSplType = plr[pnum]._pRSplType;
plr[pnum]._pSplFrom = 0;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_SPELLXY(TCmdLocParam2 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam1].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELL;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
plr[pnum].destParam3 = pCmd->wParam2;
plr[pnum]._pSpell = pCmd->wParam1;
plr[pnum]._pSplType = plr[pnum]._pRSplType;
plr[pnum]._pSplFrom = 0;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_TSPELLXY(TCmdLocParam2 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam1].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELL;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
plr[pnum].destParam3 = pCmd->wParam2;
plr[pnum]._pSpell = pCmd->wParam1;
plr[pnum]._pSplType = plr[pnum]._pTSplType;
plr[pnum]._pSplFrom = 2;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_OPOBJXY(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (object[pCmd->wParam1]._oSolidFlag || object[pCmd->wParam1]._oDoorFlag)
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
else
MakePlrPath(pnum, pCmd->x, pCmd->y, TRUE);
plr[pnum].destAction = ACTION_OPERATE;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_DISARMXY(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (object[pCmd->wParam1]._oSolidFlag || object[pCmd->wParam1]._oDoorFlag)
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
else
MakePlrPath(pnum, pCmd->x, pCmd->y, TRUE);
plr[pnum].destAction = ACTION_DISARM;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_OPOBJT(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
plr[pnum].destAction = ACTION_OPERATETK;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_ATTACKID(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
int distx = abs(plr[pnum].WorldX - monster[pCmd->wParam1]._mfutx);
int disty = abs(plr[pnum].WorldY - monster[pCmd->wParam1]._mfuty);
if (distx > 1 || disty > 1)
MakePlrPath(pnum, monster[pCmd->wParam1]._mfutx, monster[pCmd->wParam1]._mfuty, FALSE);
plr[pnum].destAction = ACTION_ATTACKMON;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_ATTACKPID(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
MakePlrPath(pnum, plr[pCmd->wParam1]._px, plr[pCmd->wParam1]._py, FALSE);
plr[pnum].destAction = ACTION_ATTACKPLR;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_RATTACKID(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_RATTACKMON;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_RATTACKPID(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_RATTACKPLR;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_SPELLID(TCmdParam3 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam2].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLMON;
plr[pnum].destParam1 = pCmd->wParam1;
plr[pnum].destParam2 = pCmd->wParam3;
plr[pnum]._pSpell = pCmd->wParam2;
plr[pnum]._pSplType = plr[pnum]._pRSplType;
plr[pnum]._pSplFrom = 0;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_SPELLPID(TCmdParam3 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam2].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLPLR;
plr[pnum].destParam1 = pCmd->wParam1;
plr[pnum].destParam2 = pCmd->wParam3;
plr[pnum]._pSpell = pCmd->wParam2;
plr[pnum]._pSplType = plr[pnum]._pRSplType;
plr[pnum]._pSplFrom = 0;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_TSPELLID(TCmdParam3 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam2].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLMON;
plr[pnum].destParam1 = pCmd->wParam1;
plr[pnum].destParam2 = pCmd->wParam3;
plr[pnum]._pSpell = pCmd->wParam2;
plr[pnum]._pSplType = plr[pnum]._pTSplType;
plr[pnum]._pSplFrom = 2;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_TSPELLPID(TCmdParam3 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (currlevel != 0 || spelldata[pCmd->wParam2].sTownSpell) {
ClrPlrPath(pnum);
plr[pnum].destAction = ACTION_SPELLPLR;
plr[pnum].destParam1 = pCmd->wParam1;
plr[pnum].destParam2 = pCmd->wParam3;
plr[pnum]._pSpell = pCmd->wParam2;
plr[pnum]._pSplType = plr[pnum]._pTSplType;
plr[pnum]._pSplFrom = 2;
} else
msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
}
return sizeof(*pCmd);
}
int __fastcall On_KNOCKBACK(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
M_GetKnockback(pCmd->wParam1);
M_StartHit(pCmd->wParam1, pnum, 0);
}
return sizeof(*pCmd);
}
int __fastcall On_RESURRECT(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
DoResurrect(pnum, pCmd->wParam1);
check_update_plr(pnum);
}
return sizeof(*pCmd);
}
int __fastcall On_HEALOTHER(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel)
DoHealOther(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_TALKXY(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
MakePlrPath(pnum, pCmd->x, pCmd->y, FALSE);
plr[pnum].destAction = ACTION_TALK;
plr[pnum].destParam1 = pCmd->wParam1;
}
return sizeof(*pCmd);
}
int __fastcall On_NEWLVL(TCmdParam2 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr)
StartNewLvl(pnum, pCmd->wParam1, pCmd->wParam2);
return sizeof(*pCmd);
}
int __fastcall On_WARP(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
StartWarpLvl(pnum, pCmd->wParam1);
if (pnum == myplr && pcurs >= CURSOR_FIRSTITEM) {
item[MAXITEMS] = plr[myplr].HoldItem;
AutoGetItem(myplr, MAXITEMS);
}
}
return sizeof(*pCmd);
}
int __fastcall On_MONSTDEATH(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr) {
if (currlevel == plr[pnum].plrlevel)
M_SyncStartKill(pCmd->wParam1, pCmd->x, pCmd->y, pnum);
delta_kill_monster(pCmd->wParam1, pCmd->x, pCmd->y, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_KILLGOLEM(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr) {
if (currlevel == pCmd->wParam1)
M_SyncStartKill(pnum, pCmd->x, pCmd->y, pnum);
delta_kill_monster(pnum, pCmd->x, pCmd->y, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_AWAKEGOLEM(TCmdGolem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (currlevel != plr[pnum].plrlevel)
delta_sync_golem(pCmd, pnum, pCmd->_currlevel);
else if (pnum != myplr) {
int i;
// check if this player already has an active golem
BOOL addGolem = TRUE;
for (i = 0; i < nummissiles; i++) {
int mi = missileactive[i];
if (missile[mi]._mitype == MIS_GOLEM && missile[mi]._misource == pnum) {
addGolem = FALSE;
// BUGFIX: break, don't need to check the rest
}
}
if (addGolem)
AddMissile(plr[pnum].WorldX, plr[pnum].WorldY, pCmd->_mx, pCmd->_my, pCmd->_mdir, MIS_GOLEM, 0, pnum, 0, 1);
}
return sizeof(*pCmd);
}
int __fastcall On_MONSTDAMAGE(TCmdParam2 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr) {
if (currlevel == plr[pnum].plrlevel) {
monster[pCmd->wParam1].mWhoHit |= 1 << pnum;
if (monster[pCmd->wParam1]._mhitpoints) {
monster[pCmd->wParam1]._mhitpoints -= pCmd->wParam2;
if ((monster[pCmd->wParam1]._mhitpoints >> 6) < 1)
monster[pCmd->wParam1]._mhitpoints = 1 << 6;
delta_monster_hp(pCmd->wParam1, monster[pCmd->wParam1]._mhitpoints, plr[pnum].plrlevel);
}
}
}
return sizeof(*pCmd);
}
int __fastcall On_PLRDEAD(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr)
StartPlayerKill(pnum, pCmd->wParam1);
else
check_update_plr(pnum);
return sizeof(*pCmd);
}
int __fastcall On_PLRDAMAGE(TCmdDamage *pCmd, int pnum)
{
if (pCmd->bPlr == myplr && currlevel != 0) {
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pCmd->dwDam <= 192000) {
if ((plr[myplr]._pHitPoints >> 6) > 0) {
drawhpflag = TRUE;
plr[myplr]._pHitPoints -= pCmd->dwDam;
plr[myplr]._pHPBase -= pCmd->dwDam;
if (plr[myplr]._pHitPoints > plr[myplr]._pMaxHP) {
plr[myplr]._pHitPoints = plr[myplr]._pMaxHP;
plr[myplr]._pHPBase = plr[myplr]._pMaxHPBase;
}
if ((plr[myplr]._pHitPoints >> 6) <= 0)
SyncPlrKill(myplr, 1);
}
}
}
return sizeof(*pCmd);
}
int __fastcall On_OPENDOOR(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel)
SyncOpObject(pnum, CMD_OPENDOOR, pCmd->wParam1);
delta_sync_object(pCmd->wParam1, CMD_OPENDOOR, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
void __fastcall delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)
{
if (gbMaxPlayers != 1) {
sgbDeltaChanged = 1;
sgLevels[bLevel].object[oi].bCmd = bCmd;
}
}
// 67618C: using guessed type char sgbDeltaChanged;
// 679660: using guessed type char gbMaxPlayers;
int __fastcall On_CLOSEDOOR(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel)
SyncOpObject(pnum, CMD_CLOSEDOOR, pCmd->wParam1);
delta_sync_object(pCmd->wParam1, CMD_CLOSEDOOR, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_OPERATEOBJ(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel)
SyncOpObject(pnum, CMD_OPERATEOBJ, pCmd->wParam1);
delta_sync_object(pCmd->wParam1, CMD_OPERATEOBJ, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_PLROPOBJ(TCmdParam2 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel)
SyncOpObject(pCmd->wParam1, CMD_PLROPOBJ, pCmd->wParam2);
delta_sync_object(pCmd->wParam2, CMD_PLROPOBJ, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_BREAKOBJ(TCmdParam2 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (currlevel == plr[pnum].plrlevel)
SyncBreakObj(pCmd->wParam1, pCmd->wParam2);
delta_sync_object(pCmd->wParam2, CMD_BREAKOBJ, plr[pnum].plrlevel);
}
return sizeof(*pCmd);
}
int __fastcall On_CHANGEPLRITEMS(TCmdChItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr)
CheckInvSwap(pnum, pCmd->bLoc, pCmd->wIndx, pCmd->wCI, pCmd->dwSeed, pCmd->bId);
return sizeof(*pCmd);
}
int __fastcall On_DELPLRITEMS(TCmdDelItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pnum != myplr)
inv_update_rem_item(pnum, pCmd->bLoc);
return sizeof(*pCmd);
}
int __fastcall On_PLRLEVEL(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= MAXCHARLEVEL && pnum != myplr)
plr[pnum]._pLevel = pCmd->wParam1;
return sizeof(*pCmd);
}
int __fastcall On_DROPITEM(TCmdPItem *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else
delta_put_item(pCmd, pCmd->x, pCmd->y, plr[pnum].plrlevel);
return sizeof(*pCmd);
}
int __fastcall On_SEND_PLRINFO(TCmdPlrInfoHdr *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, pCmd->wBytes + sizeof(*pCmd));
else
multi_player_joins(pnum, pCmd, pCmd->bCmd == CMD_ACK_PLRINFO);
return pCmd->wBytes + sizeof(*pCmd);
}
int __fastcall On_ACK_PLRINFO(TCmdPlrInfoHdr *pCmd, int pnum)
{
return On_SEND_PLRINFO(pCmd, pnum);
}
int __fastcall On_PLAYER_JOINLEVEL(TCmdLocParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
plr[pnum]._pLvlChanging = 0;
if (plr[pnum]._pName[0] && !plr[pnum].plractive) {
plr[pnum].plractive = 1;
gbActivePlayers++;
EventPlrMsg("Player '%s' (level %d) just joined the game", plr[pnum]._pName, plr[pnum]._pLevel);
}
if (plr[pnum].plractive && myplr != pnum) {
plr[pnum].WorldX = pCmd->x;
plr[pnum].WorldY = pCmd->y;
plr[pnum].plrlevel = pCmd->wParam1;
plr[pnum]._pGFXLoad = 0;
if (currlevel == plr[pnum].plrlevel) {
LoadPlrGFX(pnum, PFILE_STAND);
SyncInitPlr(pnum);
if ((plr[pnum]._pHitPoints >> 6) > 0)
StartStand(pnum, 0);
else {
plr[pnum]._pgfxnum = 0;
LoadPlrGFX(pnum, PFILE_DEATH);
plr[pnum]._pmode = PM_DEATH;
NewPlrAnim(pnum, plr[pnum]._pDAnim[0], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth);
plr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1;
plr[pnum]._pVar8 = plr[pnum]._pAnimLen << 1;
dFlags[plr[pnum].WorldX][plr[pnum].WorldY] |= DFLAG_DEAD_PLAYER;
}
plr[pnum]._pvid = AddVision(plr[pnum].WorldX, plr[pnum].WorldY, plr[pnum]._pLightRad, pnum == myplr);
plr[pnum]._plid = -1;
}
}
}
return sizeof(*pCmd);
}
int __fastcall On_ACTIVATEPORTAL(TCmdLocParam3 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
ActivatePortal(pnum, pCmd->x, pCmd->y, pCmd->wParam1, pCmd->wParam2, pCmd->wParam3);
if (pnum != myplr) {
if (currlevel == 0)
AddInTownPortal(pnum);
else if (currlevel == plr[pnum].plrlevel) {
int i;
BOOL addPortal = TRUE;
for (i = 0; i < nummissiles; i++) {
int mi = missileactive[i];
if (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == pnum) {
addPortal = FALSE;
// BUGFIX: break
}
}
if (addPortal)
AddWarpMissile(pnum, pCmd->x, pCmd->y);
} else
RemovePortalMissile(pnum);
}
delta_open_portal(pnum, pCmd->x, pCmd->y, pCmd->wParam1, pCmd->wParam2, pCmd->wParam3);
}
return sizeof(*pCmd);
}
void __fastcall delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)
{
int v6; // eax
v6 = pnum;
sgbDeltaChanged = 1;
sgJunk.portal[v6].y = y;
sgJunk.portal[v6].level = bLevel;
sgJunk.portal[v6].ltype = bLType;
sgJunk.portal[v6].x = x;
sgJunk.portal[v6].setlvl = bSetLvl;
}
// 67618C: using guessed type char sgbDeltaChanged;
int __fastcall On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (PortalOnLevel(pnum))
RemovePortalMissile(pnum);
DeactivatePortal(pnum);
RemovePlrPortal(pnum);
}
return sizeof(*pCmd);
}
int __fastcall On_RETOWN(TCmd *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (pnum == myplr) {
deathflag = FALSE;
gamemenu_off();
}
RestartTownLvl(pnum);
}
return sizeof(*pCmd);
}
int __fastcall On_SETSTR(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 750 && pnum != myplr)
SetPlrStr(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_SETDEX(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 750 && pnum != myplr)
SetPlrDex(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_SETMAG(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 750 && pnum != myplr)
SetPlrMag(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_SETVIT(TCmdParam1 *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (pCmd->wParam1 <= 750 && pnum != myplr)
SetPlrVit(pnum, pCmd->wParam1);
return sizeof(*pCmd);
}
int __fastcall On_STRING(TCmdString *pCmd, int pnum)
{
return On_STRING2(pnum, pCmd);
}
int __fastcall On_STRING2(int pnum, TCmdString *pCmd)
{
int len = strlen(pCmd->str);
if (!gbBufferMsgs)
SendPlrMsg(pnum, pCmd->str);
return len + 2; // length of string + nul terminator + sizeof(pCmd->bCmd)
}
int __fastcall On_SYNCQUEST(TCmdQuest *pCmd, int pnum)
{
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else {
if (pnum != myplr)
SetMultiQuest(pCmd->q, pCmd->qstate, pCmd->qlog, pCmd->qvar1);
sgbDeltaChanged = 1;
}
return sizeof(*pCmd);
}
int __fastcall On_ENDSHIELD(TCmd *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) {
int i;
for (i = 0; i < nummissiles; i++) {
int mi = missileactive[i];
if (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == pnum) {
ClearMissileSpot(mi);
DeleteMissile(mi, i);
}
}
}
return sizeof(*pCmd);
}
int __fastcall On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum)
{
#ifdef _DEBUG
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else if (plr[pnum]._pLevel < MAXCHARLEVEL - 1) {
plr[pnum]._pExperience = plr[pnum]._pNextExper;
NextPlrLevel(pnum);
}
#endif
return sizeof(*pCmd);
}
int __fastcall On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum)
{
#ifdef _DEBUG
if (gbBufferMsgs == 1)
msg_send_packet(pnum, pCmd, sizeof(*pCmd));
else
plr[pnum]._pSplLvl[plr[pnum]._pRSpell]++;
#endif
return sizeof(*pCmd);
}
int __cdecl On_DEBUG(TCmd *pCmd)
{
return sizeof(*pCmd);
}
int __fastcall On_NOVA(TCmdLoc *pCmd, int pnum)
{
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pnum != myplr) {
ClrPlrPath(pnum);
plr[pnum]._pSpell = SPL_NOVA;
plr[pnum]._pSplType = 4;
plr[pnum]._pSplFrom = 3;
plr[pnum].destAction = ACTION_SPELL;
plr[pnum].destParam1 = pCmd->x;
plr[pnum].destParam2 = pCmd->y;
}
return sizeof(*pCmd);
}
int __fastcall On_SETSHIELD(TCmd *pCmd, int pnum)
{
if (gbBufferMsgs != 1)
plr[pnum].pManaShield = 1;
return sizeof(*pCmd);
}
int __fastcall On_REMSHIELD(TCmd *pCmd, int pnum)
{
if (gbBufferMsgs != 1)
plr[pnum].pManaShield = 0;
return sizeof(*pCmd);
}