Devilution
Diablo devolved - magic behind the 1996 computer game
msg.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 #include "../3rdParty/Storm/Source/storm.h"
8 #include "../DiabloUI/diabloui.h"
9 
11 
12 static DWORD sgdwOwnerWait;
13 static DWORD sgdwRecvOffset;
14 static int sgnCurrMegaPlayer;
16 static BYTE sbLastCmd;
18 static BYTE sgRecvBuf[sizeof(DLevel) + 1];
19 static BYTE sgbRecvCmd;
21 static DJunk sgJunk;
23 static BOOLEAN sgbDeltaChanged;
24 static BYTE sgbDeltaChunks;
25 BOOL deltaload;
28 
29 void msg_send_drop_pkt(int pnum, int reason)
30 {
31  TFakeDropPlr cmd;
32 
33  cmd.dwReason = reason;
34  cmd.bCmd = FAKE_CMD_DROPID;
35  cmd.bPlr = pnum;
36  msg_send_packet(pnum, &cmd, sizeof(cmd));
37 }
38 
39 void msg_send_packet(int pnum, const void *packet, DWORD dwSize)
40 {
41  TMegaPkt *packeta;
42  TFakeCmdPlr cmd;
43 
44  if (pnum != sgnCurrMegaPlayer) {
45  sgnCurrMegaPlayer = pnum;
46  cmd.bCmd = FAKE_CMD_SETID;
47  cmd.bPlr = pnum;
48  msg_send_packet(pnum, &cmd, sizeof(cmd));
49  }
50  packeta = sgpCurrPkt;
51  if (sgpCurrPkt->dwSpaceLeft < dwSize) {
53  packeta = sgpCurrPkt;
54  }
55  memcpy((char *)&packeta[1] - packeta->dwSpaceLeft, packet, dwSize);
56  sgpCurrPkt->dwSpaceLeft -= dwSize;
57 }
58 
60 {
61  TMegaPkt *result;
62 
64  sgpCurrPkt->pNext = NULL;
65  sgpCurrPkt->dwSpaceLeft = 32000;
66 
67  result = (TMegaPkt *)&sgpMegaPkt;
68  while (result->pNext) {
69  result = result->pNext;
70  }
71  result->pNext = sgpCurrPkt;
72 }
73 
75 {
76  BOOL success;
77 
79  sgbDeltaChunks = 0;
80  sgnCurrMegaPlayer = -1;
82  gbBufferMsgs = 1;
83  sgdwOwnerWait = SDL_GetTicks();
84  success = UiProgressDialog("Waiting for game data...", 1, msg_wait_for_turns, 20);
85  gbBufferMsgs = 0;
86  if (!success) {
88  return FALSE;
89  }
90 
91  if (gbGameDestroyed) {
92  DrawDlg("The game ended");
94  return FALSE;
95  }
96 
97  if (sgbDeltaChunks != 21) {
98  DrawDlg("Unable to get level data");
100  return FALSE;
101  }
102 
103  return TRUE;
104 }
105 
107 {
108  while (sgpMegaPkt) {
112  }
113 }
114 
116 {
117  BOOL received;
118  DWORD turns;
119 
120  if (!sgbDeltaChunks) {
122  if (!SNetGetOwnerTurnsWaiting(&turns) && SErrGetLastError() == STORM_ERROR_NOT_IN_GAME)
123  return 100;
124  if (SDL_GetTicks() - sgdwOwnerWait <= 2000 && turns < gdwTurnsInTransit)
125  return 0;
126  sgbDeltaChunks++;
127  }
130  if (nthread_has_500ms_passed(FALSE))
131  nthread_recv_turns(&received);
132 
133  if (gbGameDestroyed)
134  return 100;
135  if (gbDeltaSender >= MAX_PLRS) {
136  sgbDeltaChunks = 0;
140  }
141  if (sgbDeltaChunks == 20) {
142  sgbDeltaChunks = 21;
143  return 99;
144  }
145  return 100 * sgbDeltaChunks / 21;
146 }
147 
149 {
150  if (gbMaxPlayers != 1) {
151  gbBufferMsgs = 2;
152  msg_pre_packet();
153  gbBufferMsgs = 0;
155  }
156 }
157 
159 {
160  int i;
161  int spaceLeft, pktSize;
162  TMegaPkt *pkt;
163  TFakeCmdPlr *cmd, *tmpCmd;
164  TFakeDropPlr *dropCmd;
165 
166  pkt = sgpMegaPkt;
167  for (i = -1; pkt; pkt = pkt->pNext) {
168  spaceLeft = 32000;
169  cmd = (TFakeCmdPlr *)pkt->data;
170  while (spaceLeft != pkt->dwSpaceLeft) {
171  if (cmd->bCmd == FAKE_CMD_SETID) {
172  tmpCmd = cmd;
173  cmd++;
174  i = tmpCmd->bPlr;
175  spaceLeft -= sizeof(*cmd);
176  } else if (cmd->bCmd == FAKE_CMD_DROPID) {
177  dropCmd = (TFakeDropPlr *)cmd;
178  cmd += 3;
179  spaceLeft -= sizeof(*dropCmd);
180  multi_player_left(dropCmd->bPlr, dropCmd->dwReason);
181  } else {
182  pktSize = ParseCmd(i, (TCmd *)cmd);
183  cmd = (TFakeCmdPlr *)((char *)cmd + pktSize);
184  spaceLeft -= pktSize;
185  }
186  }
187  }
188 }
189 
190 void DeltaExportData(int pnum)
191 {
192  BYTE *dst, *dstEnd;
193  int size, i;
194  char src;
195 
196  if (sgbDeltaChanged) {
197  dst = (BYTE *)DiabloAllocPtr(4722);
198  for (i = 0; i < NUMLEVELS; i++) {
199  dstEnd = dst + 1;
200  dstEnd = DeltaExportItem(dstEnd, sgLevels[i].item);
201  dstEnd = DeltaExportObject(dstEnd, sgLevels[i].object);
202  dstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster);
203  size = msg_comp_level(dst, dstEnd);
204  dthread_send_delta(pnum, i + CMD_DLEVEL_0, dst, size);
205  }
206  dstEnd = dst + 1;
207  dstEnd = DeltaExportJunk(dstEnd);
208  size = msg_comp_level(dst, dstEnd);
209  dthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst, size);
210  mem_free_dbg(dst);
211  }
212  src = 0;
213  dthread_send_delta(pnum, CMD_DLEVEL_END, &src, 1);
214 }
215 
216 BYTE *DeltaExportItem(BYTE *dst, TCmdPItem *src)
217 {
218  int i;
219 
220  for (i = 0; i < MAXITEMS; i++) {
221  if (src->bCmd == 0xFF) {
222  *dst = 0xFF;
223  dst++;
224  } else {
225  memcpy(dst, src, sizeof(TCmdPItem));
226  dst += sizeof(TCmdPItem);
227  }
228  src++;
229  }
230 
231  return dst;
232 }
233 
234 BYTE *DeltaExportObject(BYTE *dst, DObjectStr *src)
235 {
236  memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);
237  return dst + sizeof(DObjectStr) * MAXOBJECTS;
238 }
239 
240 BYTE *DeltaExportMonster(BYTE *dst, DMonsterStr *src)
241 {
242  int i;
243 
244  for (i = 0; i < MAXMONSTERS; i++) {
245  if (*(BYTE *)src == 0xFF) {
246  *dst = 0xFF;
247  dst++;
248  } else {
249  memcpy(dst, src, sizeof(DMonsterStr));
250  dst += sizeof(DMonsterStr);
251  }
252  src++;
253  }
254 
255  return dst;
256 }
257 
258 BYTE *DeltaExportJunk(BYTE *dst)
259 {
260  int i;
261  MultiQuests *mq;
262  DPortal *pD;
263 
264  for (i = 0; i < MAXPORTAL; i++) {
265  pD = &sgJunk.portal[i];
266  if (pD->x == 0xFF) {
267  *dst = 0xFF;
268  dst++;
269  } else {
270  memcpy(dst, pD, sizeof(*pD));
271  dst += sizeof(*pD);
272  }
273  }
274 
275  mq = sgJunk.quests;
276  for (i = 0; i < MAXMULTIQUESTS; i++) {
277  if (questlist[i]._qflags & 1) {
278  mq->qlog = quests[i]._qlog;
279  mq->qstate = quests[i]._qactive;
280  mq->qvar1 = quests[i]._qvar1;
281  memcpy(dst, mq, sizeof(*mq));
282  dst += sizeof(*mq);
283  mq++;
284  }
285  }
286 
287  return dst;
288 }
289 
290 int msg_comp_level(BYTE *buffer, BYTE *end)
291 {
292  int size, pkSize;
293 
294  size = end - buffer - 1;
295  pkSize = PkwareCompress(buffer + 1, size);
296  *buffer = size != pkSize;
297 
298  return pkSize + 1;
299 }
300 
302 {
303  sgbDeltaChanged = FALSE;
304  memset(&sgJunk, 0xFF, sizeof(sgJunk));
305  memset(sgLevels, 0xFF, sizeof(sgLevels));
306  memset(sgLocals, 0, sizeof(sgLocals));
307  deltaload = FALSE;
308 }
309 
310 void delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
311 {
312  DMonsterStr *pD;
313 
314  if (gbMaxPlayers != 1) {
315  sgbDeltaChanged = TRUE;
316  pD = &sgLevels[bLevel].monster[mi];
317  pD->_mx = x;
318  pD->_my = y;
319  pD->_mdir = monster[mi]._mdir;
320  pD->_mhitpoints = 0;
321  }
322 }
323 
324 void delta_monster_hp(int mi, int hp, BYTE bLevel)
325 {
326  DMonsterStr *pD;
327 
328  if (gbMaxPlayers != 1) {
329  sgbDeltaChanged = TRUE;
330  pD = &sgLevels[bLevel].monster[mi];
331  if (pD->_mhitpoints > hp)
332  pD->_mhitpoints = hp;
333  }
334 }
335 
336 void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel)
337 {
338  DMonsterStr *pD;
339 
340  if (gbMaxPlayers == 1) {
341  return;
342  }
343 
346  sgbDeltaChanged = TRUE;
347 
348  pD = &sgLevels[bLevel].monster[pSync->_mndx];
349  if (pD->_mhitpoints != 0) {
350  pD->_mx = pSync->_mx;
351  pD->_my = pSync->_my;
352  pD->_mactive = UCHAR_MAX;
353  pD->_menemy = pSync->_menemy;
354  }
355 }
356 
357 void delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
358 {
359  DMonsterStr *pD;
360 
361  if (gbMaxPlayers != 1) {
362  sgbDeltaChanged = TRUE;
363  pD = &sgLevels[bLevel].monster[pnum];
364  pD->_mx = pG->_mx;
365  pD->_my = pG->_my;
366  pD->_mactive = UCHAR_MAX;
367  pD->_menemy = pG->_menemy;
368  pD->_mdir = pG->_mdir;
369  pD->_mhitpoints = pG->_mhitpoints;
370  }
371 }
372 
373 void delta_leave_sync(BYTE bLevel)
374 {
375  int i, ma;
376  DMonsterStr *pD;
377 
378  if (gbMaxPlayers != 1) {
379  if (currlevel == 0) {
380  glSeedTbl[0] = GetRndSeed();
381  }
382  if (currlevel > 0) {
383  for (i = 0; i < nummonsters; ++i) {
384  ma = monstactive[i];
385  if (monster[ma]._mhitpoints) {
386  sgbDeltaChanged = TRUE;
387  pD = &sgLevels[bLevel].monster[ma];
388  pD->_mx = monster[ma]._mx;
389  pD->_my = monster[ma]._my;
390  pD->_mdir = monster[ma]._mdir;
391  pD->_menemy = encode_enemy(ma);
392  pD->_mhitpoints = monster[ma]._mhitpoints;
393  pD->_mactive = monster[ma]._msquelch;
394  }
395  }
396  memcpy(&sgLocals[bLevel], automapview, sizeof(automapview));
397  }
398  }
399 }
400 
402 {
403  return sgJunk.portal[i].x == 0xFF;
404 }
405 
407 {
408  return sgJunk.quests[i].qstate != 0xFF;
409 }
410 
411 void DeltaAddItem(int ii)
412 {
413  int i;
414  TCmdPItem *pD;
415 
416  if (gbMaxPlayers == 1) {
417  return;
418  }
419  pD = sgLevels[currlevel].item;
420  for (i = 0; i < MAXITEMS; i++, pD++) {
421  if (pD->bCmd != 0xFF
422  && pD->wIndx == item[ii].IDidx
423  && pD->wCI == item[ii]._iCreateInfo
424  && pD->dwSeed == item[ii]._iSeed
425  && (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) {
426  return;
427  }
428  }
429 
430  pD = sgLevels[currlevel].item;
431  for (i = 0; i < MAXITEMS; i++, pD++) {
432  if (pD->bCmd == 0xFF) {
433  pD->bCmd = CMD_STAND;
434  sgbDeltaChanged = TRUE;
435  pD->x = item[ii]._ix;
436  pD->y = item[ii]._iy;
437  pD->wIndx = item[ii].IDidx;
438  pD->wCI = item[ii]._iCreateInfo;
439  pD->dwSeed = item[ii]._iSeed;
440  pD->bId = item[ii]._iIdentified;
441  pD->bDur = item[ii]._iDurability;
442  pD->bMDur = item[ii]._iMaxDur;
443  pD->bCh = item[ii]._iCharges;
444  pD->bMCh = item[ii]._iMaxCharges;
445  pD->wValue = item[ii]._ivalue;
446  return;
447  }
448  }
449 }
450 
452 {
453  int i;
454 
455  if (gbMaxPlayers != 1) {
456  for (i = 0; i < MAX_PLRS; i++) {
457  if (i != myplr)
458  plr[i]._pGFXLoad = 0;
459  }
460  plr[myplr]._pLvlVisited[currlevel] = TRUE;
462  }
463 }
464 
466 {
467  int ii, ot;
468  int i, j, k, l;
469  int x, y, xx, yy;
470  BOOL done;
471 
472  if (gbMaxPlayers == 1) {
473  return;
474  }
475 
476  deltaload = TRUE;
477  if (currlevel != 0) {
478  for (i = 0; i < nummonsters; i++) {
479  if (sgLevels[currlevel].monster[i]._mx != 0xFF) {
480  M_ClearSquares(i);
481  x = sgLevels[currlevel].monster[i]._mx;
482  y = sgLevels[currlevel].monster[i]._my;
483  monster[i]._mx = x;
484  monster[i]._my = y;
485  monster[i]._moldx = x;
486  monster[i]._moldy = y;
487  monster[i]._mfutx = x;
488  monster[i]._mfuty = y;
489  if (sgLevels[currlevel].monster[i]._mhitpoints != -1)
491  if (!sgLevels[currlevel].monster[i]._mhitpoints) {
492  monster[i]._moldx = x;
493  monster[i]._moldy = y;
494  M_ClearSquares(i);
495  if (monster[i]._mAi != AI_DIABLO) {
496  if (!monster[i]._uniqtype)
498  AddDead(monster[i]._mx, monster[i]._my, monster[i].MType->mdeadval, (direction)monster[i]._mdir);
499  else
500  AddDead(monster[i]._mx, monster[i]._my, monster[i]._udeadval, (direction)monster[i]._mdir);
501  }
502  monster[i]._mDelFlag = TRUE;
503  M_UpdateLeader(i);
504  } else {
505  decode_enemy(i, sgLevels[currlevel].monster[i]._menemy);
506  if (monster[i]._mx && monster[i]._mx != 1 || monster[i]._my)
507  dMonster[monster[i]._mx][monster[i]._my] = i + 1;
508  if (i < MAX_PLRS) {
509  MAI_Golum(i);
511  } else {
512  M_StartStand(i, monster[i]._mdir);
513  }
515  }
516  }
517  }
518  memcpy(automapview, &sgLocals[currlevel], sizeof(automapview));
519  }
520 
521  for (i = 0; i < MAXITEMS; i++) {
522  if (sgLevels[currlevel].item[i].bCmd != 0xFF) {
523  if (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) {
524  ii = FindGetItem(
525  sgLevels[currlevel].item[i].wIndx,
526  sgLevels[currlevel].item[i].wCI,
527  sgLevels[currlevel].item[i].dwSeed);
528  if (ii != -1) {
529  if (dItem[item[ii]._ix][item[ii]._iy] == ii + 1)
530  dItem[item[ii]._ix][item[ii]._iy] = 0;
531  DeleteItem(ii, i);
532  }
533  }
534  if (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) {
535  ii = itemavail[0];
536  itemavail[0] = itemavail[MAXITEMS - numitems - 1];
537  itemactive[numitems] = ii;
538  if (sgLevels[currlevel].item[i].wIndx == IDI_EAR) {
539  RecreateEar(
540  ii,
541  sgLevels[currlevel].item[i].wCI,
542  sgLevels[currlevel].item[i].dwSeed,
543  sgLevels[currlevel].item[i].bId,
544  sgLevels[currlevel].item[i].bDur,
545  sgLevels[currlevel].item[i].bMDur,
546  sgLevels[currlevel].item[i].bCh,
547  sgLevels[currlevel].item[i].bMCh,
548  sgLevels[currlevel].item[i].wValue,
549  sgLevels[currlevel].item[i].dwBuff);
550  } else {
551  RecreateItem(
552  ii,
553  sgLevels[currlevel].item[i].wIndx,
554  sgLevels[currlevel].item[i].wCI,
555  sgLevels[currlevel].item[i].dwSeed,
556  sgLevels[currlevel].item[i].wValue);
557  if (sgLevels[currlevel].item[i].bId)
558  item[ii]._iIdentified = TRUE;
563  }
564  x = sgLevels[currlevel].item[i].x;
565  y = sgLevels[currlevel].item[i].y;
566  if (!CanPut(x, y)) {
567  done = FALSE;
568  for (k = 1; k < 50 && !done; k++) {
569  for (j = -k; j <= k && !done; j++) {
570  yy = y + j;
571  for (l = -k; l <= k && !done; l++) {
572  xx = x + l;
573  if (CanPut(xx, yy)) {
574  done = TRUE;
575  x = xx;
576  y = yy;
577  }
578  }
579  }
580  }
581  }
582  item[ii]._ix = x;
583  item[ii]._iy = y;
584  dItem[x][y] = ii + 1;
585  RespawnItem(ii, FALSE);
586  numitems++;
587  }
588  }
589  }
590 
591  if (currlevel != 0) {
592  for (i = 0; i < MAXOBJECTS; i++) {
593  switch (sgLevels[currlevel].object[i].bCmd) {
594  case CMD_OPENDOOR:
595  case CMD_CLOSEDOOR:
596  case CMD_OPERATEOBJ:
597  case CMD_PLROPOBJ:
598  SyncOpObject(-1, sgLevels[currlevel].object[i].bCmd, i);
599  break;
600  case CMD_BREAKOBJ:
601  SyncBreakObj(-1, i);
602  break;
603  }
604  }
605 
606  for (i = 0; i < nobjects; i++) {
607  ot = object[objectactive[i]]._otype;
608  if (ot == OBJ_TRAPL || ot == OBJ_TRAPR)
610  }
611  }
612  deltaload = FALSE;
613 }
614 
615 void NetSendCmd(BOOL bHiPri, BYTE bCmd)
616 {
617  TCmd cmd;
618 
619  cmd.bCmd = bCmd;
620  if (bHiPri)
621  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
622  else
623  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
624 }
625 
626 void NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl)
627 {
628  TCmdGolem cmd;
629 
630  cmd.bCmd = CMD_AWAKEGOLEM;
631  cmd._mx = mx;
632  cmd._my = my;
633  cmd._mdir = dir;
634  cmd._menemy = menemy;
635  cmd._mhitpoints = hp;
636  cmd._currlevel = cl;
637  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
638 }
639 
640 void NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
641 {
642  ALIGN_BY_1 TCmdLoc cmd;
643 
644  cmd.bCmd = bCmd;
645  cmd.x = x;
646  cmd.y = y;
647  if (bHiPri)
648  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
649  else
650  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
651 }
652 
653 void NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
654 {
655  TCmdLocParam1 cmd;
656 
657  cmd.bCmd = bCmd;
658  cmd.x = x;
659  cmd.y = y;
660  cmd.wParam1 = wParam1;
661  if (bHiPri)
662  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
663  else
664  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
665 }
666 
667 void NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)
668 {
669  TCmdLocParam2 cmd;
670 
671  cmd.bCmd = bCmd;
672  cmd.x = x;
673  cmd.y = y;
674  cmd.wParam1 = wParam1;
675  cmd.wParam2 = wParam2;
676  if (bHiPri)
677  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
678  else
679  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
680 }
681 
682 void NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)
683 {
684  TCmdLocParam3 cmd;
685 
686  cmd.bCmd = bCmd;
687  cmd.x = x;
688  cmd.y = y;
689  cmd.wParam1 = wParam1;
690  cmd.wParam2 = wParam2;
691  cmd.wParam3 = wParam3;
692  if (bHiPri)
693  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
694  else
695  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
696 }
697 
698 void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
699 {
701 
702  cmd.bCmd = bCmd;
703  cmd.wParam1 = wParam1;
704  if (bHiPri)
705  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
706  else
707  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
708 }
709 
710 void NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)
711 {
712  TCmdParam2 cmd;
713 
714  cmd.bCmd = bCmd;
715  cmd.wParam1 = wParam1;
716  cmd.wParam2 = wParam2;
717  if (bHiPri)
718  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
719  else
720  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
721 }
722 
723 void NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)
724 {
725  TCmdParam3 cmd;
726 
727  cmd.bCmd = bCmd;
728  cmd.wParam1 = wParam1;
729  cmd.wParam2 = wParam2;
730  cmd.wParam3 = wParam3;
731  if (bHiPri)
732  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
733  else
734  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
735 }
736 
737 void NetSendCmdQuest(BOOL bHiPri, BYTE q)
738 {
739  TCmdQuest cmd;
740 
741  cmd.q = q;
742  cmd.bCmd = CMD_SYNCQUEST;
743  cmd.qstate = quests[q]._qactive;
744  cmd.qlog = quests[q]._qlog;
745  cmd.qvar1 = quests[q]._qvar1;
746  if (bHiPri)
747  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
748  else
749  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
750 }
751 
752 void NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii)
753 {
754  TCmdGItem cmd;
755 
756  cmd.bCmd = bCmd;
757  cmd.bPnum = pnum;
758  cmd.bMaster = mast;
759  cmd.bLevel = currlevel;
760  cmd.bCursitem = ii;
761  cmd.dwTime = 0;
762  cmd.x = item[ii]._ix;
763  cmd.y = item[ii]._iy;
764  cmd.wIndx = item[ii].IDidx;
765 
766  if (item[ii].IDidx == IDI_EAR) {
767  cmd.wCI = item[ii]._iName[8] | (item[ii]._iName[7] << 8);
768  cmd.dwSeed = item[ii]._iName[12] | ((item[ii]._iName[11] | ((item[ii]._iName[10] | (item[ii]._iName[9] << 8)) << 8)) << 8);
769  cmd.bId = item[ii]._iName[13];
770  cmd.bDur = item[ii]._iName[14];
771  cmd.bMDur = item[ii]._iName[15];
772  cmd.bCh = item[ii]._iName[16];
773  cmd.bMCh = item[ii]._iName[17];
774  cmd.wValue = item[ii]._ivalue | (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - 19) << 6);
775  cmd.dwBuff = item[ii]._iName[22] | ((item[ii]._iName[21] | ((item[ii]._iName[20] | (item[ii]._iName[19] << 8)) << 8)) << 8);
776  } else {
777  cmd.wCI = item[ii]._iCreateInfo;
778  cmd.dwSeed = item[ii]._iSeed;
779  cmd.bId = item[ii]._iIdentified;
780  cmd.bDur = item[ii]._iDurability;
781  cmd.bMDur = item[ii]._iMaxDur;
782  cmd.bCh = item[ii]._iCharges;
783  cmd.bMCh = item[ii]._iMaxCharges;
784  cmd.wValue = item[ii]._ivalue;
785  }
786 
787  if (bHiPri)
788  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
789  else
790  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
791 }
792 
793 void NetSendCmdGItem2(BOOL usonly, BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
794 {
795  int ticks;
796  TCmdGItem cmd;
797 
798  memcpy(&cmd, p, sizeof(cmd));
799  cmd.bPnum = pnum;
800  cmd.bCmd = bCmd;
801  cmd.bMaster = mast;
802 
803  if (!usonly) {
804  cmd.dwTime = 0;
805  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
806  return;
807  }
808 
809  ticks = SDL_GetTicks();
810  if (!cmd.dwTime) {
811  cmd.dwTime = ticks;
812  } else if (ticks - cmd.dwTime > 5000) {
813  return;
814  }
815 
816  multi_msg_add((BYTE *)&cmd.bCmd, sizeof(cmd));
817 }
818 
819 BOOL NetSendCmdReq2(BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
820 {
821  int ticks;
822  TCmdGItem cmd;
823 
824  memcpy(&cmd, p, sizeof(cmd));
825  cmd.bCmd = bCmd;
826  cmd.bPnum = pnum;
827  cmd.bMaster = mast;
828 
829  ticks = SDL_GetTicks();
830  if (!cmd.dwTime) {
831  cmd.dwTime = ticks;
832  } else if (ticks - cmd.dwTime > 5000) {
833  return FALSE;
834  }
835 
836  multi_msg_add((BYTE *)&cmd.bCmd, sizeof(cmd));
837 
838  return TRUE;
839 }
840 
842 {
843  TCmdGItem cmd;
844 
845  memcpy(&cmd, p, sizeof(cmd));
846  cmd.dwTime = 0;
847  cmd.bCmd = CMD_ITEMEXTRA;
848  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
849 }
850 
851 void NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
852 {
853  TCmdPItem cmd;
854 
855  cmd.bCmd = bCmd;
856  cmd.x = x;
857  cmd.y = y;
858  cmd.wIndx = plr[myplr].HoldItem.IDidx;
859 
860  if (plr[myplr].HoldItem.IDidx == IDI_EAR) {
861  cmd.wCI = plr[myplr].HoldItem._iName[8] | (plr[myplr].HoldItem._iName[7] << 8);
862  cmd.dwSeed = plr[myplr].HoldItem._iName[12] | ((plr[myplr].HoldItem._iName[11] | ((plr[myplr].HoldItem._iName[10] | (plr[myplr].HoldItem._iName[9] << 8)) << 8)) << 8);
863  cmd.bId = plr[myplr].HoldItem._iName[13];
864  cmd.bDur = plr[myplr].HoldItem._iName[14];
865  cmd.bMDur = plr[myplr].HoldItem._iName[15];
866  cmd.bCh = plr[myplr].HoldItem._iName[16];
867  cmd.bMCh = plr[myplr].HoldItem._iName[17];
868  cmd.wValue = plr[myplr].HoldItem._ivalue | (plr[myplr].HoldItem._iName[18] << 8) | ((plr[myplr].HoldItem._iCurs - 19) << 6);
869  cmd.dwBuff = plr[myplr].HoldItem._iName[22] | ((plr[myplr].HoldItem._iName[21] | ((plr[myplr].HoldItem._iName[20] | (plr[myplr].HoldItem._iName[19] << 8)) << 8)) << 8);
870  } else {
872  cmd.dwSeed = plr[myplr].HoldItem._iSeed;
876  cmd.bCh = plr[myplr].HoldItem._iCharges;
879  }
880 
881  if (bHiPri)
882  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
883  else
884  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
885 }
886 
887 void NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)
888 {
889  TCmdChItem cmd;
890 
891  cmd.bCmd = CMD_CHANGEPLRITEMS;
892  cmd.bLoc = bLoc;
893  cmd.wIndx = plr[myplr].HoldItem.IDidx;
895  cmd.dwSeed = plr[myplr].HoldItem._iSeed;
897 
898  if (bHiPri)
899  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
900  else
901  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
902 }
903 
904 void NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)
905 {
906  TCmdDelItem cmd;
907 
908  cmd.bLoc = bLoc;
909  cmd.bCmd = CMD_DELPLRITEMS;
910  if (bHiPri)
911  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
912  else
913  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
914 }
915 
916 void NetSendCmdDItem(BOOL bHiPri, int ii)
917 {
918  TCmdPItem cmd;
919 
920  cmd.bCmd = CMD_DROPITEM;
921  cmd.x = item[ii]._ix;
922  cmd.y = item[ii]._iy;
923  cmd.wIndx = item[ii].IDidx;
924 
925  if (item[ii].IDidx == IDI_EAR) {
926  cmd.wCI = item[ii]._iName[8] | (item[ii]._iName[7] << 8);
927  cmd.dwSeed = item[ii]._iName[12] | ((item[ii]._iName[11] | ((item[ii]._iName[10] | (item[ii]._iName[9] << 8)) << 8)) << 8);
928  cmd.bId = item[ii]._iName[13];
929  cmd.bDur = item[ii]._iName[14];
930  cmd.bMDur = item[ii]._iName[15];
931  cmd.bCh = item[ii]._iName[16];
932  cmd.bMCh = item[ii]._iName[17];
933  cmd.wValue = item[ii]._ivalue | (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - 19) << 6);
934  cmd.dwBuff = item[ii]._iName[22] | ((item[ii]._iName[21] | ((item[ii]._iName[20] | (item[ii]._iName[19] << 8)) << 8)) << 8);
935  } else {
936  cmd.wCI = item[ii]._iCreateInfo;
937  cmd.dwSeed = item[ii]._iSeed;
938  cmd.bId = item[ii]._iIdentified;
939  cmd.bDur = item[ii]._iDurability;
940  cmd.bMDur = item[ii]._iMaxDur;
941  cmd.bCh = item[ii]._iCharges;
942  cmd.bMCh = item[ii]._iMaxCharges;
943  cmd.wValue = item[ii]._ivalue;
944  }
945 
946  if (bHiPri)
947  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
948  else
949  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
950 }
951 
952 void NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam)
953 {
954  TCmdDamage cmd;
955 
956  cmd.bCmd = CMD_PLRDAMAGE;
957  cmd.bPlr = bPlr;
958  cmd.dwDam = dwDam;
959  if (bHiPri)
960  NetSendHiPri((BYTE *)&cmd, sizeof(cmd));
961  else
962  NetSendLoPri((BYTE *)&cmd, sizeof(cmd));
963 }
964 
965 void NetSendCmdString(int pmask, const char *pszStr)
966 {
967  int dwStrLen;
968  TCmdString cmd;
969 
970  dwStrLen = strlen(pszStr);
971  cmd.bCmd = CMD_STRING;
972  strcpy(cmd.str, pszStr);
973  multi_send_msg_packet(pmask, (BYTE *)&cmd.bCmd, dwStrLen + 2);
974 }
975 
976 void delta_close_portal(int pnum)
977 {
978  memset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum]));
979  sgbDeltaChanged = TRUE;
980 }
981 
982 DWORD ParseCmd(int pnum, TCmd *pCmd)
983 {
984  sbLastCmd = pCmd->bCmd;
986  return 0;
987 
988  switch (pCmd->bCmd) {
989  case CMD_SYNCDATA:
990  return On_SYNCDATA(pCmd, pnum);
991  case CMD_WALKXY:
992  return On_WALKXY(pCmd, pnum);
993  case CMD_ADDSTR:
994  return On_ADDSTR(pCmd, pnum);
995  case CMD_ADDDEX:
996  return On_ADDDEX(pCmd, pnum);
997  case CMD_ADDMAG:
998  return On_ADDMAG(pCmd, pnum);
999  case CMD_ADDVIT:
1000  return On_ADDVIT(pCmd, pnum);
1001  case CMD_SBSPELL:
1002  return On_SBSPELL(pCmd, pnum);
1003  case CMD_GOTOGETITEM:
1004  return On_GOTOGETITEM(pCmd, pnum);
1005  case CMD_REQUESTGITEM:
1006  return On_REQUESTGITEM(pCmd, pnum);
1007  case CMD_GETITEM:
1008  return On_GETITEM(pCmd, pnum);
1009  case CMD_GOTOAGETITEM:
1010  return On_GOTOAGETITEM(pCmd, pnum);
1011  case CMD_REQUESTAGITEM:
1012  return On_REQUESTAGITEM(pCmd, pnum);
1013  case CMD_AGETITEM:
1014  return On_AGETITEM(pCmd, pnum);
1015  case CMD_ITEMEXTRA:
1016  return On_ITEMEXTRA(pCmd, pnum);
1017  case CMD_PUTITEM:
1018  return On_PUTITEM(pCmd, pnum);
1019  case CMD_SYNCPUTITEM:
1020  return On_SYNCPUTITEM(pCmd, pnum);
1021  case CMD_RESPAWNITEM:
1022  return On_RESPAWNITEM(pCmd, pnum);
1023  case CMD_ATTACKXY:
1024  return On_ATTACKXY(pCmd, pnum);
1025  case CMD_SATTACKXY:
1026  return On_SATTACKXY(pCmd, pnum);
1027  case CMD_RATTACKXY:
1028  return On_RATTACKXY(pCmd, pnum);
1029  case CMD_SPELLXYD:
1030  return On_SPELLXYD(pCmd, pnum);
1031  case CMD_SPELLXY:
1032  return On_SPELLXY(pCmd, pnum);
1033  case CMD_TSPELLXY:
1034  return On_TSPELLXY(pCmd, pnum);
1035  case CMD_OPOBJXY:
1036  return On_OPOBJXY(pCmd, pnum);
1037  case CMD_DISARMXY:
1038  return On_DISARMXY(pCmd, pnum);
1039  case CMD_OPOBJT:
1040  return On_OPOBJT(pCmd, pnum);
1041  case CMD_ATTACKID:
1042  return On_ATTACKID(pCmd, pnum);
1043  case CMD_ATTACKPID:
1044  return On_ATTACKPID(pCmd, pnum);
1045  case CMD_RATTACKID:
1046  return On_RATTACKID(pCmd, pnum);
1047  case CMD_RATTACKPID:
1048  return On_RATTACKPID(pCmd, pnum);
1049  case CMD_SPELLID:
1050  return On_SPELLID(pCmd, pnum);
1051  case CMD_SPELLPID:
1052  return On_SPELLPID(pCmd, pnum);
1053  case CMD_TSPELLID:
1054  return On_TSPELLID(pCmd, pnum);
1055  case CMD_TSPELLPID:
1056  return On_TSPELLPID(pCmd, pnum);
1057  case CMD_KNOCKBACK:
1058  return On_KNOCKBACK(pCmd, pnum);
1059  case CMD_RESURRECT:
1060  return On_RESURRECT(pCmd, pnum);
1061  case CMD_HEALOTHER:
1062  return On_HEALOTHER(pCmd, pnum);
1063  case CMD_TALKXY:
1064  return On_TALKXY(pCmd, pnum);
1065  case CMD_DEBUG:
1066  return On_DEBUG(pCmd, pnum);
1067  case CMD_NEWLVL:
1068  return On_NEWLVL(pCmd, pnum);
1069  case CMD_WARP:
1070  return On_WARP(pCmd, pnum);
1071  case CMD_MONSTDEATH:
1072  return On_MONSTDEATH(pCmd, pnum);
1073  case CMD_KILLGOLEM:
1074  return On_KILLGOLEM(pCmd, pnum);
1075  case CMD_AWAKEGOLEM:
1076  return On_AWAKEGOLEM(pCmd, pnum);
1077  case CMD_MONSTDAMAGE:
1078  return On_MONSTDAMAGE(pCmd, pnum);
1079  case CMD_PLRDEAD:
1080  return On_PLRDEAD(pCmd, pnum);
1081  case CMD_PLRDAMAGE:
1082  return On_PLRDAMAGE(pCmd, pnum);
1083  case CMD_OPENDOOR:
1084  return On_OPENDOOR(pCmd, pnum);
1085  case CMD_CLOSEDOOR:
1086  return On_CLOSEDOOR(pCmd, pnum);
1087  case CMD_OPERATEOBJ:
1088  return On_OPERATEOBJ(pCmd, pnum);
1089  case CMD_PLROPOBJ:
1090  return On_PLROPOBJ(pCmd, pnum);
1091  case CMD_BREAKOBJ:
1092  return On_BREAKOBJ(pCmd, pnum);
1093  case CMD_CHANGEPLRITEMS:
1094  return On_CHANGEPLRITEMS(pCmd, pnum);
1095  case CMD_DELPLRITEMS:
1096  return On_DELPLRITEMS(pCmd, pnum);
1097  case CMD_PLRLEVEL:
1098  return On_PLRLEVEL(pCmd, pnum);
1099  case CMD_DROPITEM:
1100  return On_DROPITEM(pCmd, pnum);
1101  case CMD_ACK_PLRINFO:
1102  return On_ACK_PLRINFO(pCmd, pnum);
1103  case CMD_SEND_PLRINFO:
1104  return On_SEND_PLRINFO(pCmd, pnum);
1105  case CMD_PLAYER_JOINLEVEL:
1106  return On_PLAYER_JOINLEVEL(pCmd, pnum);
1107  case CMD_ACTIVATEPORTAL:
1108  return On_ACTIVATEPORTAL(pCmd, pnum);
1109  case CMD_DEACTIVATEPORTAL:
1110  return On_DEACTIVATEPORTAL(pCmd, pnum);
1111  case CMD_RETOWN:
1112  return On_RETOWN(pCmd, pnum);
1113  case CMD_SETSTR:
1114  return On_SETSTR(pCmd, pnum);
1115  case CMD_SETMAG:
1116  return On_SETMAG(pCmd, pnum);
1117  case CMD_SETDEX:
1118  return On_SETDEX(pCmd, pnum);
1119  case CMD_SETVIT:
1120  return On_SETVIT(pCmd, pnum);
1121  case CMD_STRING:
1122  return On_STRING(pCmd, pnum);
1123  case CMD_SYNCQUEST:
1124  return On_SYNCQUEST(pCmd, pnum);
1125  case CMD_ENDSHIELD:
1126  return On_ENDSHIELD(pCmd, pnum);
1127  case CMD_CHEAT_EXPERIENCE:
1128  return On_CHEAT_EXPERIENCE(pCmd, pnum);
1129  case CMD_CHEAT_SPELL_LEVEL:
1130  return On_CHEAT_SPELL_LEVEL(pCmd, pnum);
1131  case CMD_NOVA:
1132  return On_NOVA(pCmd, pnum);
1133  case CMD_SETSHIELD:
1134  return On_SETSHIELD(pCmd, pnum);
1135  case CMD_REMSHIELD:
1136  return On_REMSHIELD(pCmd, pnum);
1137  }
1138 
1139  if (pCmd->bCmd < CMD_DLEVEL_0 || pCmd->bCmd > CMD_DLEVEL_END) {
1140  SNetDropPlayer(pnum, 0x40000006);
1141  return 0;
1142  }
1143 
1144  return On_DLEVEL(pnum, pCmd);
1145 }
1146 
1147 DWORD On_DLEVEL(int pnum, TCmd *pCmd)
1148 {
1149  TCmdPlrInfoHdr *p = (TCmdPlrInfoHdr *)pCmd;
1150 
1151  if (gbDeltaSender != pnum) {
1152  if (p->bCmd == CMD_DLEVEL_END) {
1153  gbDeltaSender = pnum;
1155  } else if (p->bCmd == CMD_DLEVEL_0 && p->wOffset == 0) {
1156  gbDeltaSender = pnum;
1158  } else {
1159  return p->wBytes + sizeof(*p);
1160  }
1161  }
1162  if (sgbRecvCmd == CMD_DLEVEL_END) {
1163  if (p->bCmd == CMD_DLEVEL_END) {
1164  sgbDeltaChunks = 20;
1165  return p->wBytes + sizeof(*p);
1166  } else if (p->bCmd == CMD_DLEVEL_0 && p->wOffset == 0) {
1167  sgdwRecvOffset = 0;
1168  sgbRecvCmd = p->bCmd;
1169  } else {
1170  return p->wBytes + sizeof(*p);
1171  }
1172  } else if (sgbRecvCmd != p->bCmd) {
1174  if (p->bCmd == CMD_DLEVEL_END) {
1175  sgbDeltaChunks = 20;
1177  return p->wBytes + sizeof(*p);
1178  } else {
1179  sgdwRecvOffset = 0;
1180  sgbRecvCmd = p->bCmd;
1181  }
1182  }
1183 
1185  memcpy(&sgRecvBuf[p->wOffset], &p[1], p->wBytes);
1186  sgdwRecvOffset += p->wBytes;
1187  return p->wBytes + sizeof(*p);
1188 }
1189 
1190 void DeltaImportData(BYTE cmd, DWORD recv_offset)
1191 {
1192  BYTE i;
1193  BYTE *src;
1194 
1195  if (sgRecvBuf[0])
1196  PkwareDecompress(&sgRecvBuf[1], recv_offset, 4721);
1197 
1198  src = &sgRecvBuf[1];
1199  if (cmd == CMD_DLEVEL_JUNK) {
1200  DeltaImportJunk(src);
1201  } else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_16) {
1202  i = cmd - CMD_DLEVEL_0;
1203  src = DeltaImportItem(src, sgLevels[i].item);
1204  src = DeltaImportObject(src, sgLevels[i].object);
1206  } else {
1207  app_fatal("msg:1");
1208  }
1209 
1210  sgbDeltaChunks++;
1211  sgbDeltaChanged = TRUE;
1212 }
1213 
1214 BYTE *DeltaImportItem(BYTE *src, TCmdPItem *dst)
1215 {
1216  int i;
1217 
1218  for (i = 0; i < MAXITEMS; i++) {
1219  if (*src == 0xFF) {
1220  memset(dst, 0xFF, sizeof(TCmdPItem));
1221  src++;
1222  } else {
1223  memcpy(dst, src, sizeof(TCmdPItem));
1224  src += sizeof(TCmdPItem);
1225  }
1226  dst++;
1227  }
1228 
1229  return src;
1230 }
1231 
1232 BYTE *DeltaImportObject(BYTE *src, DObjectStr *dst)
1233 {
1234  memcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);
1235  return src + sizeof(DObjectStr) * MAXOBJECTS;
1236 }
1237 
1238 BYTE *DeltaImportMonster(BYTE *src, DMonsterStr *dst)
1239 {
1240  int i;
1241 
1242  for (i = 0; i < MAXMONSTERS; i++) {
1243  if (*src == 0xFF) {
1244  memset(dst, 0xFF, sizeof(DMonsterStr));
1245  src++;
1246  } else {
1247  memcpy(dst, src, sizeof(DMonsterStr));
1248  src += sizeof(DMonsterStr);
1249  }
1250  dst++;
1251  }
1252 
1253  return src;
1254 }
1255 
1256 void DeltaImportJunk(BYTE *src)
1257 {
1258  int i;
1259  MultiQuests *mq;
1260 
1261  for (i = 0; i < MAXPORTAL; i++) {
1262  if (*src == 0xFF) {
1263  memset(&sgJunk.portal[i], 0xFF, sizeof(DPortal));
1264  src++;
1265  SetPortalStats(i, FALSE, 0, 0, 0, DTYPE_TOWN);
1266  } else {
1267  memcpy(&sgJunk.portal[i], src, sizeof(DPortal));
1268  src += sizeof(DPortal);
1270  i,
1271  TRUE,
1272  sgJunk.portal[i].x,
1273  sgJunk.portal[i].y,
1274  sgJunk.portal[i].level,
1275  sgJunk.portal[i].ltype);
1276  }
1277  }
1278 
1279  mq = sgJunk.quests;
1280  for (i = 0; i < MAXMULTIQUESTS; i++) {
1281  if (questlist[i]._qflags & 1) {
1282  memcpy(mq, src, sizeof(MultiQuests));
1283  src += sizeof(MultiQuests);
1284  quests[i]._qlog = mq->qlog;
1285  quests[i]._qactive = mq->qstate;
1286  quests[i]._qvar1 = mq->qvar1;
1287  mq++;
1288  }
1289  }
1290 }
1291 
1292 DWORD On_SYNCDATA(TCmd *pCmd, int pnum)
1293 {
1294  return sync_update(pnum, (const BYTE *)pCmd);
1295 }
1296 
1297 DWORD On_WALKXY(TCmd *pCmd, int pnum)
1298 {
1299  TCmdLoc *p = (TCmdLoc *)pCmd;
1300 
1301  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1302  ClrPlrPath(pnum);
1303  MakePlrPath(pnum, p->x, p->y, TRUE);
1304  plr[pnum].destAction = ACTION_NONE;
1305  }
1306 
1307  return sizeof(*p);
1308 }
1309 
1310 DWORD On_ADDSTR(TCmd *pCmd, int pnum)
1311 {
1312  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1313 
1314  if (gbBufferMsgs == 1)
1315  msg_send_packet(pnum, p, sizeof(*p));
1316  else if (p->wParam1 <= 256)
1317  ModifyPlrStr(pnum, p->wParam1);
1318 
1319  return sizeof(*p);
1320 }
1321 
1322 DWORD On_ADDMAG(TCmd *pCmd, int pnum)
1323 {
1324  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1325 
1326  if (gbBufferMsgs == 1)
1327  msg_send_packet(pnum, p, sizeof(*p));
1328  else if (p->wParam1 <= 256)
1329  ModifyPlrMag(pnum, p->wParam1);
1330 
1331  return sizeof(*p);
1332 }
1333 
1334 DWORD On_ADDDEX(TCmd *pCmd, int pnum)
1335 {
1336  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1337 
1338  if (gbBufferMsgs == 1)
1339  msg_send_packet(pnum, p, sizeof(*p));
1340  else if (p->wParam1 <= 256)
1341  ModifyPlrDex(pnum, p->wParam1);
1342 
1343  return sizeof(*p);
1344 }
1345 
1346 DWORD On_ADDVIT(TCmd *pCmd, int pnum)
1347 {
1348  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1349 
1350  if (gbBufferMsgs == 1)
1351  msg_send_packet(pnum, p, sizeof(*p));
1352  else if (p->wParam1 <= 256)
1353  ModifyPlrVit(pnum, p->wParam1);
1354 
1355  return sizeof(*p);
1356 }
1357 
1358 DWORD On_SBSPELL(TCmd *pCmd, int pnum)
1359 {
1360  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1361 
1362  if (gbBufferMsgs != 1) {
1363  if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
1364  plr[pnum]._pSpell = p->wParam1;
1365  plr[pnum]._pSplType = plr[pnum]._pSBkSplType;
1366  plr[pnum]._pSplFrom = 1;
1367  plr[pnum].destAction = ACTION_SPELL;
1368  } else
1369  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1370  }
1371 
1372  return sizeof(*p);
1373 }
1374 
1375 void msg_errorf(const char *pszFmt, ...)
1376 {
1377  static DWORD msg_err_timer;
1378  DWORD ticks;
1379  char msg[256];
1380  va_list va;
1381 
1382  va_start(va, pszFmt);
1383  ticks = SDL_GetTicks();
1384  if (ticks - msg_err_timer >= 5000) {
1385  msg_err_timer = ticks;
1386  vsprintf(msg, pszFmt, va);
1387  ErrorPlrMsg(msg);
1388  }
1389  va_end(va);
1390 }
1391 
1392 DWORD On_GOTOGETITEM(TCmd *pCmd, int pnum)
1393 {
1394  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
1395 
1396  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1397  MakePlrPath(pnum, p->x, p->y, FALSE);
1399  plr[pnum].destParam1 = p->wParam1;
1400  }
1401 
1402  return sizeof(*p);
1403 }
1404 
1405 DWORD On_REQUESTGITEM(TCmd *pCmd, int pnum)
1406 {
1407  TCmdGItem *p = (TCmdGItem *)pCmd;
1408 
1409  if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {
1410  if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
1411  int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
1412  if (ii != -1) {
1413  NetSendCmdGItem2(FALSE, CMD_GETITEM, myplr, p->bPnum, p);
1414  if (p->bPnum != myplr)
1415  SyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);
1416  else
1417  InvGetItem(myplr, ii);
1418  SetItemRecord(p->dwSeed, p->wCI, p->wIndx);
1419  } else if (!NetSendCmdReq2(CMD_REQUESTGITEM, myplr, p->bPnum, p))
1420  NetSendCmdExtra(p);
1421  }
1422  }
1423 
1424  return sizeof(*p);
1425 }
1426 
1427 BOOL i_own_level(int nReqLevel)
1428 {
1429  int i;
1430 
1431  for (i = 0; i < MAX_PLRS; i++) {
1432  if (plr[i].plractive
1433  && !plr[i]._pLvlChanging
1434  && plr[i].plrlevel == nReqLevel
1435  && (i != myplr || !gbBufferMsgs))
1436  break;
1437  }
1438 
1439  return i == myplr;
1440 }
1441 
1442 DWORD On_GETITEM(TCmd *pCmd, int pnum)
1443 {
1444  TCmdGItem *p = (TCmdGItem *)pCmd;
1445 
1446  if (gbBufferMsgs == 1)
1447  msg_send_packet(pnum, p, sizeof(*p));
1448  else {
1449  int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
1450  if (delta_get_item(p, p->bLevel)) {
1451  if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) {
1452  if (p->bPnum == myplr) {
1453  if (currlevel != p->bLevel) {
1454  ii = SyncPutItem(myplr, plr[myplr].WorldX, plr[myplr].WorldY, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff);
1455  if (ii != -1)
1456  InvGetItem(myplr, ii);
1457  } else
1458  InvGetItem(myplr, ii);
1459  } else
1460  SyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);
1461  }
1462  } else
1463  NetSendCmdGItem2(TRUE, CMD_GETITEM, p->bMaster, p->bPnum, p);
1464  }
1465 
1466  return sizeof(*p);
1467 }
1468 
1469 BOOL delta_get_item(TCmdGItem *pI, BYTE bLevel)
1470 {
1471  BOOL result;
1472  TCmdPItem *pD;
1473  int i;
1474  BOOL found;
1475 
1476  result = TRUE;
1477  found = FALSE;
1478  if (gbMaxPlayers != 1) {
1479  pD = sgLevels[bLevel].item;
1480  for (i = 0; i < MAXITEMS; i++, pD++) {
1481  if (pD->bCmd != 0xFF && pD->wIndx == pI->wIndx && pD->wCI == pI->wCI && pD->dwSeed == pI->dwSeed) {
1482  found = TRUE;
1483  break;
1484  }
1485  }
1486  if (found) {
1487  if (pD->bCmd == CMD_WALKXY) {
1488  return result;
1489  }
1490  if (pD->bCmd == CMD_STAND) {
1491  sgbDeltaChanged = 1;
1492  pD->bCmd = CMD_WALKXY;
1493  return result;
1494  }
1495  if (pD->bCmd == CMD_ACK_PLRINFO) {
1496  pD->bCmd = 0xFF;
1497  sgbDeltaChanged = 1;
1498  return result;
1499  }
1500  app_fatal("delta:1");
1501  }
1502  if (((pI->wCI >> 8) & 0x80) == 0)
1503  return FALSE;
1504  pD = sgLevels[bLevel].item;
1505  for (i = 0; i < MAXITEMS; i++, pD++) {
1506  if (pD->bCmd == 0xFF) {
1507  sgbDeltaChanged = 1;
1508  pD->bCmd = CMD_WALKXY;
1509  pD->x = pI->x;
1510  pD->y = pI->y;
1511  pD->wIndx = pI->wIndx;
1512  pD->wCI = pI->wCI;
1513  pD->dwSeed = pI->dwSeed;
1514  pD->bId = pI->bId;
1515  pD->bDur = pI->bDur;
1516  pD->bMDur = pI->bMDur;
1517  pD->bCh = pI->bCh;
1518  pD->bMCh = pI->bMCh;
1519  pD->wValue = pI->wValue;
1520  pD->dwBuff = pI->dwBuff;
1521  result = TRUE;
1522  break;
1523  }
1524  }
1525  }
1526  return result;
1527 }
1528 
1529 DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum)
1530 {
1531  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
1532 
1533  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1534  MakePlrPath(pnum, p->x, p->y, FALSE);
1536  plr[pnum].destParam1 = p->wParam1;
1537  }
1538 
1539  return sizeof(*p);
1540 }
1541 
1542 DWORD On_REQUESTAGITEM(TCmd *pCmd, int pnum)
1543 {
1544  TCmdGItem *p = (TCmdGItem *)pCmd;
1545 
1546  if (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {
1547  if (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {
1548  int ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);
1549  if (ii != -1) {
1550  NetSendCmdGItem2(FALSE, CMD_AGETITEM, myplr, p->bPnum, p);
1551  if (p->bPnum != myplr)
1552  SyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);
1553  else
1555  SetItemRecord(p->dwSeed, p->wCI, p->wIndx);
1556  } else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, myplr, p->bPnum, p))
1557  NetSendCmdExtra(p);
1558  }
1559  }
1560 
1561  return sizeof(*p);
1562 }
1563 
1564 DWORD On_AGETITEM(TCmd *pCmd, int pnum)
1565 {
1566  TCmdGItem *p = (TCmdGItem *)pCmd;
1567 
1568  if (gbBufferMsgs == 1)
1569  msg_send_packet(pnum, p, sizeof(*p));
1570  else {
1571  FindGetItem(p->wIndx, p->wCI, p->dwSeed);
1572  if (delta_get_item(p, p->bLevel)) {
1573  if ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) {
1574  if (p->bPnum == myplr) {
1575  if (currlevel != p->bLevel) {
1576  int ii = SyncPutItem(myplr, plr[myplr].WorldX, plr[myplr].WorldY, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff);
1577  if (ii != -1)
1578  AutoGetItem(myplr, ii);
1579  } else
1581  } else
1582  SyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);
1583  }
1584  } else
1585  NetSendCmdGItem2(TRUE, CMD_AGETITEM, p->bMaster, p->bPnum, p);
1586  }
1587 
1588  return sizeof(*p);
1589 }
1590 
1591 DWORD On_ITEMEXTRA(TCmd *pCmd, int pnum)
1592 {
1593  TCmdGItem *p = (TCmdGItem *)pCmd;
1594 
1595  if (gbBufferMsgs == 1)
1596  msg_send_packet(pnum, p, sizeof(*p));
1597  else {
1598  delta_get_item(p, p->bLevel);
1599  if (currlevel == plr[pnum].plrlevel)
1600  SyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);
1601  }
1602 
1603  return sizeof(*p);
1604 }
1605 
1606 DWORD On_PUTITEM(TCmd *pCmd, int pnum)
1607 {
1608  TCmdPItem *p = (TCmdPItem *)pCmd;
1609 
1610  if (gbBufferMsgs == 1)
1611  msg_send_packet(pnum, p, sizeof(*p));
1612  else if (currlevel == plr[pnum].plrlevel) {
1613  int ii;
1614  if (pnum == myplr)
1615  ii = InvPutItem(pnum, p->x, p->y);
1616  else
1617  ii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff);
1618  if (ii != -1) {
1619  PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
1620  delta_put_item(p, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);
1621  check_update_plr(pnum);
1622  }
1623  return sizeof(*p);
1624  } else {
1625  PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
1626  delta_put_item(p, p->x, p->y, plr[pnum].plrlevel);
1627  check_update_plr(pnum);
1628  }
1629 
1630  return sizeof(*p);
1631 }
1632 
1633 void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)
1634 {
1635  int i;
1636  TCmdPItem *pD;
1637 
1638  if (gbMaxPlayers == 1) {
1639  return;
1640  }
1641  pD = sgLevels[bLevel].item;
1642  for (i = 0; i < MAXITEMS; i++, pD++) {
1643  if (pD->bCmd != CMD_WALKXY
1644  && pD->bCmd != 0xFF
1645  && pD->wIndx == pI->wIndx
1646  && pD->wCI == pI->wCI
1647  && pD->dwSeed == pI->dwSeed) {
1648  if (pD->bCmd == CMD_ACK_PLRINFO)
1649  return;
1650  app_fatal("Trying to drop a floor item?");
1651  }
1652  }
1653 
1654  pD = sgLevels[bLevel].item;
1655  for (i = 0; i < MAXITEMS; i++, pD++) {
1656  if (pD->bCmd == 0xFF) {
1657  sgbDeltaChanged = TRUE;
1658  memcpy(pD, pI, sizeof(TCmdPItem));
1659  pD->bCmd = CMD_ACK_PLRINFO;
1660  pD->x = x;
1661  pD->y = y;
1662  return;
1663  }
1664  }
1665 }
1666 
1667 void check_update_plr(int pnum)
1668 {
1669  if (gbMaxPlayers != 1 && pnum == myplr)
1670  pfile_update(TRUE);
1671 }
1672 
1673 DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum)
1674 {
1675  TCmdPItem *p = (TCmdPItem *)pCmd;
1676 
1677  if (gbBufferMsgs == 1)
1678  msg_send_packet(pnum, p, sizeof(*p));
1679  else if (currlevel == plr[pnum].plrlevel) {
1680  int ii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff);
1681  if (ii != -1) {
1682  PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
1683  delta_put_item(p, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);
1684  check_update_plr(pnum);
1685  }
1686  return sizeof(*p);
1687  } else {
1688  PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
1689  delta_put_item(p, p->x, p->y, plr[pnum].plrlevel);
1690  check_update_plr(pnum);
1691  }
1692 
1693  return sizeof(*p);
1694 }
1695 
1696 DWORD On_RESPAWNITEM(TCmd *pCmd, int pnum)
1697 {
1698  TCmdPItem *p = (TCmdPItem *)pCmd;
1699 
1700  if (gbBufferMsgs == 1)
1701  msg_send_packet(pnum, p, sizeof(*p));
1702  else {
1703  if (currlevel == plr[pnum].plrlevel && pnum != myplr) {
1704  SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff);
1705  }
1706  PutItemRecord(p->dwSeed, p->wCI, p->wIndx);
1707  delta_put_item(p, p->x, p->y, plr[pnum].plrlevel);
1708  }
1709 
1710  return sizeof(*p);
1711 }
1712 
1713 DWORD On_ATTACKXY(TCmd *pCmd, int pnum)
1714 {
1715  TCmdLoc *p = (TCmdLoc *)pCmd;
1716 
1717  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1718  MakePlrPath(pnum, p->x, p->y, FALSE);
1719  plr[pnum].destAction = ACTION_ATTACK;
1720  plr[pnum].destParam1 = p->x;
1721  plr[pnum].destParam2 = p->y;
1722  }
1723 
1724  return sizeof(*p);
1725 }
1726 
1727 DWORD On_SATTACKXY(TCmd *pCmd, int pnum)
1728 {
1729  TCmdLoc *p = (TCmdLoc *)pCmd;
1730 
1731  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1732  ClrPlrPath(pnum);
1733  plr[pnum].destAction = ACTION_ATTACK;
1734  plr[pnum].destParam1 = p->x;
1735  plr[pnum].destParam2 = p->y;
1736  }
1737 
1738  return sizeof(*p);
1739 }
1740 
1741 DWORD On_RATTACKXY(TCmd *pCmd, int pnum)
1742 {
1743  TCmdLoc *p = (TCmdLoc *)pCmd;
1744 
1745  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1746  ClrPlrPath(pnum);
1747  plr[pnum].destAction = ACTION_RATTACK;
1748  plr[pnum].destParam1 = p->x;
1749  plr[pnum].destParam2 = p->y;
1750  }
1751 
1752  return sizeof(*p);
1753 }
1754 
1755 DWORD On_SPELLXYD(TCmd *pCmd, int pnum)
1756 {
1757  TCmdLocParam3 *p = (TCmdLocParam3 *)pCmd;
1758 
1759  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1760  if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
1761  ClrPlrPath(pnum);
1763  plr[pnum].destParam1 = p->x;
1764  plr[pnum].destParam2 = p->y;
1765  plr[pnum].destParam3 = p->wParam2;
1766  plr[pnum].destParam4 = p->wParam3;
1767  plr[pnum]._pSpell = p->wParam1;
1768  plr[pnum]._pSplType = plr[pnum]._pRSplType;
1769  plr[pnum]._pSplFrom = 0;
1770  } else
1771  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1772  }
1773 
1774  return sizeof(*p);
1775 }
1776 
1777 DWORD On_SPELLXY(TCmd *pCmd, int pnum)
1778 {
1779  TCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;
1780 
1781  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1782  if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
1783  ClrPlrPath(pnum);
1784  plr[pnum].destAction = ACTION_SPELL;
1785  plr[pnum].destParam1 = p->x;
1786  plr[pnum].destParam2 = p->y;
1787  plr[pnum].destParam3 = p->wParam2;
1788  plr[pnum]._pSpell = p->wParam1;
1789  plr[pnum]._pSplType = plr[pnum]._pRSplType;
1790  plr[pnum]._pSplFrom = 0;
1791  } else
1792  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1793  }
1794 
1795  return sizeof(*p);
1796 }
1797 
1798 DWORD On_TSPELLXY(TCmd *pCmd, int pnum)
1799 {
1800  TCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;
1801 
1802  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1803  if (currlevel != 0 || spelldata[p->wParam1].sTownSpell) {
1804  ClrPlrPath(pnum);
1805  plr[pnum].destAction = ACTION_SPELL;
1806  plr[pnum].destParam1 = p->x;
1807  plr[pnum].destParam2 = p->y;
1808  plr[pnum].destParam3 = p->wParam2;
1809  plr[pnum]._pSpell = p->wParam1;
1810  plr[pnum]._pSplType = plr[pnum]._pTSplType;
1811  plr[pnum]._pSplFrom = 2;
1812  } else
1813  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1814  }
1815 
1816  return sizeof(*p);
1817 }
1818 
1819 DWORD On_OPOBJXY(TCmd *pCmd, int pnum)
1820 {
1821  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
1822 
1823  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1824  if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag)
1825  MakePlrPath(pnum, p->x, p->y, FALSE);
1826  else
1827  MakePlrPath(pnum, p->x, p->y, TRUE);
1828  plr[pnum].destAction = ACTION_OPERATE;
1829  plr[pnum].destParam1 = p->wParam1;
1830  }
1831 
1832  return sizeof(*p);
1833 }
1834 
1835 DWORD On_DISARMXY(TCmd *pCmd, int pnum)
1836 {
1837  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
1838 
1839  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1840  if (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag)
1841  MakePlrPath(pnum, p->x, p->y, FALSE);
1842  else
1843  MakePlrPath(pnum, p->x, p->y, TRUE);
1844  plr[pnum].destAction = ACTION_DISARM;
1845  plr[pnum].destParam1 = p->wParam1;
1846  }
1847 
1848  return sizeof(*p);
1849 }
1850 
1851 DWORD On_OPOBJT(TCmd *pCmd, int pnum)
1852 {
1853  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1854 
1855  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1857  plr[pnum].destParam1 = p->wParam1;
1858  }
1859 
1860  return sizeof(*p);
1861 }
1862 
1863 DWORD On_ATTACKID(TCmd *pCmd, int pnum)
1864 {
1865  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1866 
1867  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1868  int distx = abs(plr[pnum].WorldX - monster[p->wParam1]._mfutx);
1869  int disty = abs(plr[pnum].WorldY - monster[p->wParam1]._mfuty);
1870  if (distx > 1 || disty > 1)
1871  MakePlrPath(pnum, monster[p->wParam1]._mfutx, monster[p->wParam1]._mfuty, FALSE);
1873  plr[pnum].destParam1 = p->wParam1;
1874  }
1875 
1876  return sizeof(*p);
1877 }
1878 
1879 DWORD On_ATTACKPID(TCmd *pCmd, int pnum)
1880 {
1881  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1882 
1883  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1884  MakePlrPath(pnum, plr[p->wParam1]._px, plr[p->wParam1]._py, FALSE);
1886  plr[pnum].destParam1 = p->wParam1;
1887  }
1888 
1889  return sizeof(*p);
1890 }
1891 
1892 DWORD On_RATTACKID(TCmd *pCmd, int pnum)
1893 {
1894  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1895 
1896  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1897  ClrPlrPath(pnum);
1899  plr[pnum].destParam1 = p->wParam1;
1900  }
1901 
1902  return sizeof(*p);
1903 }
1904 
1905 DWORD On_RATTACKPID(TCmd *pCmd, int pnum)
1906 {
1907  TCmdParam1 *p = (TCmdParam1 *)pCmd;
1908 
1909  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1910  ClrPlrPath(pnum);
1912  plr[pnum].destParam1 = p->wParam1;
1913  }
1914 
1915  return sizeof(*p);
1916 }
1917 
1918 DWORD On_SPELLID(TCmd *pCmd, int pnum)
1919 {
1920  TCmdParam3 *p = (TCmdParam3 *)pCmd;
1921 
1922  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1923  if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
1924  ClrPlrPath(pnum);
1925  plr[pnum].destAction = ACTION_SPELLMON;
1926  plr[pnum].destParam1 = p->wParam1;
1927  plr[pnum].destParam2 = p->wParam3;
1928  plr[pnum]._pSpell = p->wParam2;
1929  plr[pnum]._pSplType = plr[pnum]._pRSplType;
1930  plr[pnum]._pSplFrom = 0;
1931  } else
1932  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1933  }
1934 
1935  return sizeof(*p);
1936 }
1937 
1938 DWORD On_SPELLPID(TCmd *pCmd, int pnum)
1939 {
1940  TCmdParam3 *p = (TCmdParam3 *)pCmd;
1941 
1942  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1943  if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
1944  ClrPlrPath(pnum);
1945  plr[pnum].destAction = ACTION_SPELLPLR;
1946  plr[pnum].destParam1 = p->wParam1;
1947  plr[pnum].destParam2 = p->wParam3;
1948  plr[pnum]._pSpell = p->wParam2;
1949  plr[pnum]._pSplType = plr[pnum]._pRSplType;
1950  plr[pnum]._pSplFrom = 0;
1951  } else
1952  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1953  }
1954 
1955  return sizeof(*p);
1956 }
1957 
1958 DWORD On_TSPELLID(TCmd *pCmd, int pnum)
1959 {
1960  TCmdParam3 *p = (TCmdParam3 *)pCmd;
1961 
1962  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1963  if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
1964  ClrPlrPath(pnum);
1965  plr[pnum].destAction = ACTION_SPELLMON;
1966  plr[pnum].destParam1 = p->wParam1;
1967  plr[pnum].destParam2 = p->wParam3;
1968  plr[pnum]._pSpell = p->wParam2;
1969  plr[pnum]._pSplType = plr[pnum]._pTSplType;
1970  plr[pnum]._pSplFrom = 2;
1971  } else
1972  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1973  }
1974 
1975  return sizeof(*p);
1976 }
1977 
1978 DWORD On_TSPELLPID(TCmd *pCmd, int pnum)
1979 {
1980  TCmdParam3 *p = (TCmdParam3 *)pCmd;
1981 
1982  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
1983  if (currlevel != 0 || spelldata[p->wParam2].sTownSpell) {
1984  ClrPlrPath(pnum);
1985  plr[pnum].destAction = ACTION_SPELLPLR;
1986  plr[pnum].destParam1 = p->wParam1;
1987  plr[pnum].destParam2 = p->wParam3;
1988  plr[pnum]._pSpell = p->wParam2;
1989  plr[pnum]._pSplType = plr[pnum]._pTSplType;
1990  plr[pnum]._pSplFrom = 2;
1991  } else
1992  msg_errorf("%s has cast an illegal spell.", plr[pnum]._pName);
1993  }
1994 
1995  return sizeof(*p);
1996 }
1997 
1998 DWORD On_KNOCKBACK(TCmd *pCmd, int pnum)
1999 {
2000  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2001 
2002  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
2003  M_GetKnockback(p->wParam1);
2004  M_StartHit(p->wParam1, pnum, 0);
2005  }
2006 
2007  return sizeof(*p);
2008 }
2009 
2010 DWORD On_RESURRECT(TCmd *pCmd, int pnum)
2011 {
2012  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2013 
2014  if (gbBufferMsgs == 1)
2015  msg_send_packet(pnum, p, sizeof(*p));
2016  else {
2017  DoResurrect(pnum, p->wParam1);
2018  check_update_plr(pnum);
2019  }
2020 
2021  return sizeof(*p);
2022 }
2023 
2024 DWORD On_HEALOTHER(TCmd *pCmd, int pnum)
2025 {
2026  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2027 
2028  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel)
2029  DoHealOther(pnum, p->wParam1);
2030 
2031  return sizeof(*p);
2032 }
2033 
2034 DWORD On_TALKXY(TCmd *pCmd, int pnum)
2035 {
2036  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
2037 
2038  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
2039  MakePlrPath(pnum, p->x, p->y, FALSE);
2040  plr[pnum].destAction = ACTION_TALK;
2041  plr[pnum].destParam1 = p->wParam1;
2042  }
2043 
2044  return sizeof(*p);
2045 }
2046 
2047 DWORD On_NEWLVL(TCmd *pCmd, int pnum)
2048 {
2049  TCmdParam2 *p = (TCmdParam2 *)pCmd;
2050 
2051  if (gbBufferMsgs == 1)
2052  msg_send_packet(pnum, p, sizeof(*p));
2053  else if (pnum != myplr)
2054  StartNewLvl(pnum, p->wParam1, p->wParam2);
2055 
2056  return sizeof(*p);
2057 }
2058 
2059 DWORD On_WARP(TCmd *pCmd, int pnum)
2060 {
2061  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2062 
2063  if (gbBufferMsgs == 1)
2064  msg_send_packet(pnum, p, sizeof(*p));
2065  else {
2066  StartWarpLvl(pnum, p->wParam1);
2067  if (pnum == myplr && pcurs >= CURSOR_FIRSTITEM) {
2070  }
2071  }
2072 
2073  return sizeof(*p);
2074 }
2075 
2076 DWORD On_MONSTDEATH(TCmd *pCmd, int pnum)
2077 {
2078  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
2079 
2080  if (gbBufferMsgs == 1)
2081  msg_send_packet(pnum, p, sizeof(*p));
2082  else if (pnum != myplr) {
2083  if (currlevel == plr[pnum].plrlevel)
2084  M_SyncStartKill(p->wParam1, p->x, p->y, pnum);
2085  delta_kill_monster(p->wParam1, p->x, p->y, plr[pnum].plrlevel);
2086  }
2087 
2088  return sizeof(*p);
2089 }
2090 
2091 DWORD On_KILLGOLEM(TCmd *pCmd, int pnum)
2092 {
2093  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
2094 
2095  if (gbBufferMsgs == 1)
2096  msg_send_packet(pnum, p, sizeof(*p));
2097  else if (pnum != myplr) {
2098  if (currlevel == p->wParam1)
2099  M_SyncStartKill(pnum, p->x, p->y, pnum);
2100  delta_kill_monster(pnum, p->x, p->y, plr[pnum].plrlevel);
2101  }
2102 
2103  return sizeof(*p);
2104 }
2105 
2106 DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum)
2107 {
2108  TCmdGolem *p = (TCmdGolem *)pCmd;
2109 
2110  if (gbBufferMsgs == 1)
2111  msg_send_packet(pnum, p, sizeof(*p));
2112  else if (currlevel != plr[pnum].plrlevel)
2113  delta_sync_golem(p, pnum, p->_currlevel);
2114  else if (pnum != myplr) {
2115  int i;
2116  // check if this player already has an active golem
2117  BOOL addGolem = TRUE;
2118  for (i = 0; i < nummissiles; i++) {
2119  int mi = missileactive[i];
2120  if (missile[mi]._mitype == MIS_GOLEM && missile[mi]._misource == pnum) {
2121  addGolem = FALSE;
2122  // BUGFIX: break, don't need to check the rest
2123  }
2124  }
2125  if (addGolem)
2126  AddMissile(plr[pnum].WorldX, plr[pnum].WorldY, p->_mx, p->_my, p->_mdir, MIS_GOLEM, 0, pnum, 0, 1);
2127  }
2128 
2129  return sizeof(*p);
2130 }
2131 
2132 DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum)
2133 {
2134  TCmdParam2 *p = (TCmdParam2 *)pCmd;
2135 
2136  if (gbBufferMsgs == 1)
2137  msg_send_packet(pnum, p, sizeof(*p));
2138  else if (pnum != myplr) {
2139  if (currlevel == plr[pnum].plrlevel) {
2140  monster[p->wParam1].mWhoHit |= 1 << pnum;
2141 
2142  if (monster[p->wParam1]._mhitpoints) {
2143  monster[p->wParam1]._mhitpoints -= p->wParam2;
2144  if ((monster[p->wParam1]._mhitpoints >> 6) < 1)
2145  monster[p->wParam1]._mhitpoints = 1 << 6;
2147  }
2148  }
2149  }
2150 
2151  return sizeof(*p);
2152 }
2153 
2154 DWORD On_PLRDEAD(TCmd *pCmd, int pnum)
2155 {
2156  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2157 
2158  if (gbBufferMsgs == 1)
2159  msg_send_packet(pnum, p, sizeof(*p));
2160  else if (pnum != myplr)
2161  StartPlayerKill(pnum, p->wParam1);
2162  else
2163  check_update_plr(pnum);
2164 
2165  return sizeof(*p);
2166 }
2167 
2168 DWORD On_PLRDAMAGE(TCmd *pCmd, int pnum)
2169 {
2170  TCmdDamage *p = (TCmdDamage *)pCmd;
2171 
2172  if (p->bPlr == myplr && currlevel != 0) {
2173  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && p->dwDam <= 192000) {
2174  if ((plr[myplr]._pHitPoints >> 6) > 0) {
2175  drawhpflag = TRUE;
2176  plr[myplr]._pHitPoints -= p->dwDam;
2177  plr[myplr]._pHPBase -= p->dwDam;
2178  if (plr[myplr]._pHitPoints > plr[myplr]._pMaxHP) {
2181  }
2182  if ((plr[myplr]._pHitPoints >> 6) <= 0)
2183  SyncPlrKill(myplr, 1);
2184  }
2185  }
2186  }
2187 
2188  return sizeof(*p);
2189 }
2190 
2191 DWORD On_OPENDOOR(TCmd *pCmd, int pnum)
2192 {
2193  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2194 
2195  if (gbBufferMsgs == 1)
2196  msg_send_packet(pnum, p, sizeof(*p));
2197  else {
2198  if (currlevel == plr[pnum].plrlevel)
2199  SyncOpObject(pnum, CMD_OPENDOOR, p->wParam1);
2201  }
2202 
2203  return sizeof(*p);
2204 }
2205 
2206 void delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)
2207 {
2208  if (gbMaxPlayers != 1) {
2209  sgbDeltaChanged = TRUE;
2210  sgLevels[bLevel].object[oi].bCmd = bCmd;
2211  }
2212 }
2213 
2214 DWORD On_CLOSEDOOR(TCmd *pCmd, int pnum)
2215 {
2216  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2217 
2218  if (gbBufferMsgs == 1)
2219  msg_send_packet(pnum, p, sizeof(*p));
2220  else {
2221  if (currlevel == plr[pnum].plrlevel)
2222  SyncOpObject(pnum, CMD_CLOSEDOOR, p->wParam1);
2224  }
2225 
2226  return sizeof(*p);
2227 }
2228 
2229 DWORD On_OPERATEOBJ(TCmd *pCmd, int pnum)
2230 {
2231  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2232 
2233  if (gbBufferMsgs == 1)
2234  msg_send_packet(pnum, p, sizeof(*p));
2235  else {
2236  if (currlevel == plr[pnum].plrlevel)
2237  SyncOpObject(pnum, CMD_OPERATEOBJ, p->wParam1);
2239  }
2240 
2241  return sizeof(*p);
2242 }
2243 
2244 DWORD On_PLROPOBJ(TCmd *pCmd, int pnum)
2245 {
2246  TCmdParam2 *p = (TCmdParam2 *)pCmd;
2247 
2248  if (gbBufferMsgs == 1)
2249  msg_send_packet(pnum, p, sizeof(*p));
2250  else {
2251  if (currlevel == plr[pnum].plrlevel)
2254  }
2255 
2256  return sizeof(*p);
2257 }
2258 
2259 DWORD On_BREAKOBJ(TCmd *pCmd, int pnum)
2260 {
2261  TCmdParam2 *p = (TCmdParam2 *)pCmd;
2262 
2263  if (gbBufferMsgs == 1)
2264  msg_send_packet(pnum, p, sizeof(*p));
2265  else {
2266  if (currlevel == plr[pnum].plrlevel)
2267  SyncBreakObj(p->wParam1, p->wParam2);
2269  }
2270 
2271  return sizeof(*p);
2272 }
2273 
2274 DWORD On_CHANGEPLRITEMS(TCmd *pCmd, int pnum)
2275 {
2276  TCmdChItem *p = (TCmdChItem *)pCmd;
2277 
2278  if (gbBufferMsgs == 1)
2279  msg_send_packet(pnum, p, sizeof(*p));
2280  else if (pnum != myplr)
2281  CheckInvSwap(pnum, p->bLoc, p->wIndx, p->wCI, p->dwSeed, p->bId);
2282 
2283  return sizeof(*p);
2284 }
2285 
2286 DWORD On_DELPLRITEMS(TCmd *pCmd, int pnum)
2287 {
2288  TCmdDelItem *p = (TCmdDelItem *)pCmd;
2289 
2290  if (gbBufferMsgs == 1)
2291  msg_send_packet(pnum, p, sizeof(*p));
2292  else if (pnum != myplr)
2293  inv_update_rem_item(pnum, p->bLoc);
2294 
2295  return sizeof(*p);
2296 }
2297 
2298 DWORD On_PLRLEVEL(TCmd *pCmd, int pnum)
2299 {
2300  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2301 
2302  if (gbBufferMsgs == 1)
2303  msg_send_packet(pnum, p, sizeof(*p));
2304  else if (p->wParam1 <= MAXCHARLEVEL && pnum != myplr)
2305  plr[pnum]._pLevel = p->wParam1;
2306 
2307  return sizeof(*p);
2308 }
2309 
2310 DWORD On_DROPITEM(TCmd *pCmd, int pnum)
2311 {
2312  TCmdPItem *p = (TCmdPItem *)pCmd;
2313 
2314  if (gbBufferMsgs == 1)
2315  msg_send_packet(pnum, p, sizeof(*p));
2316  else
2317  delta_put_item(p, p->x, p->y, plr[pnum].plrlevel);
2318 
2319  return sizeof(*p);
2320 }
2321 
2322 DWORD On_SEND_PLRINFO(TCmd *pCmd, int pnum)
2323 {
2324  TCmdPlrInfoHdr *p = (TCmdPlrInfoHdr *)pCmd;
2325 
2326  if (gbBufferMsgs == 1)
2327  msg_send_packet(pnum, p, p->wBytes + sizeof(*p));
2328  else
2329  recv_plrinfo(pnum, p, p->bCmd == CMD_ACK_PLRINFO);
2330 
2331  return p->wBytes + sizeof(*p);
2332 }
2333 
2334 DWORD On_ACK_PLRINFO(TCmd *pCmd, int pnum)
2335 {
2336  return On_SEND_PLRINFO(pCmd, pnum);
2337 }
2338 
2339 DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum)
2340 {
2341  TCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;
2342 
2343  if (gbBufferMsgs == 1)
2344  msg_send_packet(pnum, p, sizeof(*p));
2345  else {
2346  plr[pnum]._pLvlChanging = FALSE;
2347  if (plr[pnum]._pName[0] && !plr[pnum].plractive) {
2348  plr[pnum].plractive = TRUE;
2349  gbActivePlayers++;
2350  EventPlrMsg("Player '%s' (level %d) just joined the game", plr[pnum]._pName, plr[pnum]._pLevel);
2351  }
2352 
2353  if (plr[pnum].plractive && myplr != pnum) {
2354  plr[pnum].WorldX = p->x;
2355  plr[pnum].WorldY = p->y;
2356  plr[pnum].plrlevel = p->wParam1;
2357  plr[pnum]._pGFXLoad = 0;
2358  if (currlevel == plr[pnum].plrlevel) {
2359  LoadPlrGFX(pnum, PFILE_STAND);
2360  SyncInitPlr(pnum);
2361  if ((plr[pnum]._pHitPoints >> 6) > 0)
2362  StartStand(pnum, 0);
2363  else {
2364  plr[pnum]._pgfxnum = 0;
2365  LoadPlrGFX(pnum, PFILE_DEATH);
2366  plr[pnum]._pmode = PM_DEATH;
2367  NewPlrAnim(pnum, plr[pnum]._pDAnim[0], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth);
2368  plr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1;
2369  plr[pnum]._pVar8 = plr[pnum]._pAnimLen << 1;
2370  dFlags[plr[pnum].WorldX][plr[pnum].WorldY] |= BFLAG_DEAD_PLAYER;
2371  }
2372 
2373  plr[pnum]._pvid = AddVision(plr[pnum].WorldX, plr[pnum].WorldY, plr[pnum]._pLightRad, pnum == myplr);
2374  plr[pnum]._plid = -1;
2375  }
2376  }
2377  }
2378 
2379  return sizeof(*p);
2380 }
2381 
2382 DWORD On_ACTIVATEPORTAL(TCmd *pCmd, int pnum)
2383 {
2384  TCmdLocParam3 *p = (TCmdLocParam3 *)pCmd;
2385 
2386  if (gbBufferMsgs == 1)
2387  msg_send_packet(pnum, p, sizeof(*p));
2388  else {
2389  ActivatePortal(pnum, p->x, p->y, p->wParam1, p->wParam2, p->wParam3);
2390  if (pnum != myplr) {
2391  if (currlevel == 0)
2392  AddInTownPortal(pnum);
2393  else if (currlevel == plr[pnum].plrlevel) {
2394  int i;
2395  BOOL addPortal = TRUE;
2396  for (i = 0; i < nummissiles; i++) {
2397  int mi = missileactive[i];
2398  if (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == pnum) {
2399  addPortal = FALSE;
2400  // BUGFIX: break
2401  }
2402  }
2403  if (addPortal)
2404  AddWarpMissile(pnum, p->x, p->y);
2405  } else
2406  RemovePortalMissile(pnum);
2407  }
2408  delta_open_portal(pnum, p->x, p->y, p->wParam1, p->wParam2, p->wParam3);
2409  }
2410 
2411  return sizeof(*p);
2412 }
2413 
2414 void delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)
2415 {
2416  sgbDeltaChanged = TRUE;
2417  sgJunk.portal[pnum].x = x;
2418  sgJunk.portal[pnum].y = y;
2419  sgJunk.portal[pnum].level = bLevel;
2420  sgJunk.portal[pnum].ltype = bLType;
2421  sgJunk.portal[pnum].setlvl = bSetLvl;
2422 }
2423 
2424 DWORD On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)
2425 {
2426  if (gbBufferMsgs == 1)
2427  msg_send_packet(pnum, pCmd, sizeof(*pCmd));
2428  else {
2429  if (PortalOnLevel(pnum))
2430  RemovePortalMissile(pnum);
2431  DeactivatePortal(pnum);
2432  delta_close_portal(pnum);
2433  }
2434 
2435  return sizeof(*pCmd);
2436 }
2437 
2438 DWORD On_RETOWN(TCmd *pCmd, int pnum)
2439 {
2440  if (gbBufferMsgs == 1)
2441  msg_send_packet(pnum, pCmd, sizeof(*pCmd));
2442  else {
2443  if (pnum == myplr) {
2444  deathflag = FALSE;
2445  gamemenu_off();
2446  }
2447  RestartTownLvl(pnum);
2448  }
2449 
2450  return sizeof(*pCmd);
2451 }
2452 
2453 DWORD On_SETSTR(TCmd *pCmd, int pnum)
2454 {
2455  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2456 
2457  if (gbBufferMsgs == 1)
2458  msg_send_packet(pnum, p, sizeof(*p));
2459  else if (p->wParam1 <= 750 && pnum != myplr)
2460  SetPlrStr(pnum, p->wParam1);
2461 
2462  return sizeof(*p);
2463 }
2464 
2465 DWORD On_SETDEX(TCmd *pCmd, int pnum)
2466 {
2467  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2468 
2469  if (gbBufferMsgs == 1)
2470  msg_send_packet(pnum, p, sizeof(*p));
2471  else if (p->wParam1 <= 750 && pnum != myplr)
2472  SetPlrDex(pnum, p->wParam1);
2473 
2474  return sizeof(*p);
2475 }
2476 
2477 DWORD On_SETMAG(TCmd *pCmd, int pnum)
2478 {
2479  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2480 
2481  if (gbBufferMsgs == 1)
2482  msg_send_packet(pnum, p, sizeof(*p));
2483  else if (p->wParam1 <= 750 && pnum != myplr)
2484  SetPlrMag(pnum, p->wParam1);
2485 
2486  return sizeof(*p);
2487 }
2488 
2489 DWORD On_SETVIT(TCmd *pCmd, int pnum)
2490 {
2491  TCmdParam1 *p = (TCmdParam1 *)pCmd;
2492 
2493  if (gbBufferMsgs == 1)
2494  msg_send_packet(pnum, p, sizeof(*p));
2495  else if (p->wParam1 <= 750 && pnum != myplr)
2496  SetPlrVit(pnum, p->wParam1);
2497 
2498  return sizeof(*p);
2499 }
2500 
2501 DWORD On_STRING(TCmd *pCmd, int pnum)
2502 {
2503  return On_STRING2(pnum, pCmd);
2504 }
2505 
2506 DWORD On_STRING2(int pnum, TCmd *pCmd)
2507 {
2508  TCmdString *p = (TCmdString *)pCmd;
2509 
2510  int len = strlen(p->str);
2511  if (!gbBufferMsgs)
2512  SendPlrMsg(pnum, p->str);
2513 
2514  return len + 2; // length of string + nul terminator + sizeof(p->bCmd)
2515 }
2516 
2517 DWORD On_SYNCQUEST(TCmd *pCmd, int pnum)
2518 {
2519  TCmdQuest *p = (TCmdQuest *)pCmd;
2520 
2521  if (gbBufferMsgs == 1)
2522  msg_send_packet(pnum, p, sizeof(*p));
2523  else {
2524  if (pnum != myplr)
2525  SetMultiQuest(p->q, p->qstate, p->qlog, p->qvar1);
2526  sgbDeltaChanged = TRUE;
2527  }
2528 
2529  return sizeof(*p);
2530 }
2531 
2532 DWORD On_ENDSHIELD(TCmd *pCmd, int pnum)
2533 {
2534  int i;
2535 
2536  if (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) {
2537  for (i = 0; i < nummissiles; i++) {
2538  int mi = missileactive[i];
2539  if (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == pnum) {
2540  ClearMissileSpot(mi);
2541  DeleteMissile(mi, i);
2542  }
2543  }
2544  }
2545 
2546  return sizeof(*pCmd);
2547 }
2548 
2549 DWORD On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum)
2550 {
2551 #ifdef _DEBUG
2552  if (gbBufferMsgs == 1)
2553  msg_send_packet(pnum, pCmd, sizeof(*pCmd));
2554  else if (plr[pnum]._pLevel < MAXCHARLEVEL - 1) {
2555  plr[pnum]._pExperience = plr[pnum]._pNextExper;
2556  NextPlrLevel(pnum);
2557  }
2558 #endif
2559  return sizeof(*pCmd);
2560 }
2561 
2562 DWORD On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum)
2563 {
2564 #ifdef _DEBUG
2565  if (gbBufferMsgs == 1)
2566  msg_send_packet(pnum, pCmd, sizeof(*pCmd));
2567  else
2568  plr[pnum]._pSplLvl[plr[pnum]._pRSpell]++;
2569 #endif
2570  return sizeof(*pCmd);
2571 }
2572 
2573 DWORD On_DEBUG(TCmd *pCmd, int pnum)
2574 {
2575  return sizeof(*pCmd);
2576 }
2577 
2578 DWORD On_NOVA(TCmd *pCmd, int pnum)
2579 {
2580  TCmdLoc *p = (TCmdLoc *)pCmd;
2581 
2582  if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pnum != myplr) {
2583  ClrPlrPath(pnum);
2584  plr[pnum]._pSpell = SPL_NOVA;
2585  plr[pnum]._pSplType = RSPLTYPE_INVALID;
2586  plr[pnum]._pSplFrom = 3;
2587  plr[pnum].destAction = ACTION_SPELL;
2588  plr[pnum].destParam1 = p->x;
2589  plr[pnum].destParam2 = p->y;
2590  }
2591 
2592  return sizeof(*p);
2593 }
2594 
2595 DWORD On_SETSHIELD(TCmd *pCmd, int pnum)
2596 {
2597  if (gbBufferMsgs != 1)
2598  plr[pnum].pManaShield = TRUE;
2599 
2600  return sizeof(*pCmd);
2601 }
2602 
2603 DWORD On_REMSHIELD(TCmd *pCmd, int pnum)
2604 {
2605  if (gbBufferMsgs != 1)
2606  plr[pnum].pManaShield = FALSE;
2607 
2608  return sizeof(*pCmd);
2609 }
2610 
InvGetItem
void InvGetItem(int pnum, int ii)
Definition: inv.cpp:1472
TCmdParam1::bCmd
BYTE bCmd
Definition: structs.h:743
DMonsterStr
struct DMonsterStr DMonsterStr
On_HEALOTHER
DWORD On_HEALOTHER(TCmd *pCmd, int pnum)
Definition: msg.cpp:2024
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
sgLocals
static LocalLevel sgLocals[NUMLEVELS]
Definition: msg.cpp:20
MFLAG_TARGETS_MONSTER
@ MFLAG_TARGETS_MONSTER
Definition: enums.h:1507
TCmdLocParam1::wParam1
WORD wParam1
Definition: structs.h:722
On_RATTACKID
DWORD On_RATTACKID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1892
CMD_TSPELLID
@ CMD_TSPELLID
Definition: enums.h:2195
DMonsterStr::_menemy
BYTE _menemy
Definition: structs.h:914
sgRecvBuf
static BYTE sgRecvBuf[sizeof(DLevel)+1]
Definition: msg.cpp:18
DJunk::quests
MultiQuests quests[MAXMULTIQUESTS]
Definition: structs.h:949
msg_wait_for_turns
int msg_wait_for_turns()
Definition: msg.cpp:115
On_MONSTDAMAGE
DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum)
Definition: msg.cpp:2132
ACTION_SPELLWALL
@ ACTION_SPELLWALL
Definition: enums.h:2922
PFILE_DEATH
@ PFILE_DEATH
Definition: enums.h:2847
AddDead
void AddDead(int dx, int dy, char dv, int ddir)
Definition: dead.cpp:74
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
MonsterStruct::_moldx
int _moldx
Definition: structs.h:552
ItemStruct::_iy
int _iy
Definition: structs.h:104
TCmdLocParam3::x
BYTE x
Definition: structs.h:735
TCmdString::bCmd
BYTE bCmd
Definition: structs.h:842
CMD_SETSTR
@ CMD_SETSTR
Definition: enums.h:2250
On_REQUESTAGITEM
DWORD On_REQUESTAGITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1542
On_PLRLEVEL
DWORD On_PLRLEVEL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2298
DeltaImportMonster
BYTE * DeltaImportMonster(BYTE *src, DMonsterStr *dst)
Definition: msg.cpp:1238
On_SYNCDATA
DWORD On_SYNCDATA(TCmd *pCmd, int pnum)
Definition: msg.cpp:1292
SetPlrDex
void SetPlrDex(int p, int v)
Definition: player.cpp:4025
TCmdChItem::wCI
WORD wCI
Definition: structs.h:819
sgnCurrMegaPlayer
static int sgnCurrMegaPlayer
Definition: msg.cpp:14
delta_open_portal
void delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)
Definition: msg.cpp:2414
sgdwOwnerWait
static DEVILUTION_BEGIN_NAMESPACE DWORD sgdwOwnerWait
Definition: msg.cpp:12
TCmdQuest::qstate
BYTE qstate
Definition: structs.h:773
PkwareDecompress
void PkwareDecompress(void *param, int recv_size, int dwMaxBytes)
Definition: encrypt.cpp:148
PlayerStruct::_pgfxnum
int _pgfxnum
Definition: structs.h:204
PlayerStruct::_pAnimFrame
int _pAnimFrame
Definition: structs.h:209
currlevel
BYTE currlevel
Definition: gendung.cpp:40
PlayerStruct::_pMaxHP
int _pMaxHP
Definition: structs.h:259
On_CHEAT_SPELL_LEVEL
DWORD On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2562
NetSendCmdLocParam1
void NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
Definition: msg.cpp:653
gbActivePlayers
BYTE gbActivePlayers
Definition: multi.cpp:21
ItemStruct::_ix
int _ix
Definition: structs.h:103
On_SPELLXY
DWORD On_SPELLXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1777
MAXPORTAL
#define MAXPORTAL
Definition: defs.h:34
TCmdPItem::bDur
BYTE bDur
Definition: structs.h:807
TCmdGolem::_mdir
BYTE _mdir
Definition: structs.h:764
CMD_ADDMAG
@ CMD_ADDMAG
Definition: enums.h:2175
TCmdGItem::dwTime
int dwTime
Definition: structs.h:796
SpellData::sTownSpell
BOOL sTownSpell
Definition: structs.h:1024
On_RESPAWNITEM
DWORD On_RESPAWNITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1696
M_UpdateLeader
void M_UpdateLeader(int i)
Definition: monster.cpp:2460
CMD_ADDVIT
@ CMD_ADDVIT
Definition: enums.h:2177
TCmdLoc
Definition: structs.h:712
delta_sync_monster
void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel)
Definition: msg.cpp:336
On_GETITEM
DWORD On_GETITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1442
DMonsterStr::_mx
BYTE _mx
Definition: structs.h:911
On_SETVIT
DWORD On_SETVIT(TCmd *pCmd, int pnum)
Definition: msg.cpp:2489
MAI_Golum
void MAI_Golum(int i)
Definition: monster.cpp:3849
TCmdGolem::_my
BYTE _my
Definition: structs.h:763
DLevel::object
DObjectStr object[MAXOBJECTS]
Definition: structs.h:925
PlayerStruct::destAction
int destAction
Definition: structs.h:182
MAX_PLRS
#define MAX_PLRS
Definition: defs.h:16
sgpCurrPkt
static TMegaPkt * sgpCurrPkt
Definition: msg.cpp:17
On_RETOWN
DWORD On_RETOWN(TCmd *pCmd, int pnum)
Definition: msg.cpp:2438
CMD_HEALOTHER
@ CMD_HEALOTHER
Definition: enums.h:2248
PlayerStruct::destParam3
int destParam3
Definition: structs.h:185
M_GetKnockback
void M_GetKnockback(int i)
Definition: monster.cpp:1436
TFakeDropPlr::bPlr
BYTE bPlr
Definition: structs.h:853
ACTION_ATTACK
@ ACTION_ATTACK
Definition: enums.h:2907
PlayerStruct::pManaShield
BOOLEAN pManaShield
Definition: structs.h:342
PlayerStruct::_pSpell
int _pSpell
Definition: structs.h:215
PlayerStruct::_pAnimLen
int _pAnimLen
Definition: structs.h:208
TCmdGolem
Definition: structs.h:760
TFakeDropPlr
Definition: structs.h:851
CMD_PLRDEAD
@ CMD_PLRDEAD
Definition: enums.h:2209
sgwPackPlrOffsetTbl
WORD sgwPackPlrOffsetTbl[MAX_PLRS]
Definition: multi.cpp:15
delta_quest_inited
BOOL delta_quest_inited(int i)
Definition: msg.cpp:406
TCmdParam2
Definition: structs.h:747
ACTION_ATTACKMON
@ ACTION_ATTACKMON
Definition: enums.h:2916
CMD_SETSHIELD
@ CMD_SETSHIELD
Definition: enums.h:2263
CMD_OPOBJXY
@ CMD_OPOBJXY
Definition: enums.h:2187
PlayerStruct::_pMaxHPBase
int _pMaxHPBase
Definition: structs.h:257
CMD_DELPLRITEMS
@ CMD_DELPLRITEMS
Definition: enums.h:2220
CMD_ATTACKPID
@ CMD_ATTACKPID
Definition: enums.h:2190
CMD_REQUESTGITEM
@ CMD_REQUESTGITEM
Definition: enums.h:2210
TCmdPItem::bMDur
BYTE bMDur
Definition: structs.h:808
PutItemRecord
void PutItemRecord(int nSeed, WORD wCI, int nIndex)
Definition: items.cpp:4056
msg_send_packet
void msg_send_packet(int pnum, const void *packet, DWORD dwSize)
Definition: msg.cpp:39
nobjects
int nobjects
Definition: objects.cpp:10
CMD_OPERATEOBJ
@ CMD_OPERATEOBJ
Definition: enums.h:2216
gbBufferMsgs
BYTE gbBufferMsgs
Definition: msg.cpp:26
NetSendCmdDelItem
void NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)
Definition: msg.cpp:904
On_ACK_PLRINFO
DWORD On_ACK_PLRINFO(TCmd *pCmd, int pnum)
Definition: msg.cpp:2334
TFakeDropPlr::dwReason
DWORD dwReason
Definition: structs.h:854
TCmdGItem::bPnum
BYTE bPnum
Definition: structs.h:781
TCmdPItem::wIndx
WORD wIndx
Definition: structs.h:803
sgbDeltaChunks
static BYTE sgbDeltaChunks
Definition: msg.cpp:24
msg_pre_packet
void msg_pre_packet()
Definition: msg.cpp:158
PlayerStruct::WorldX
int WorldX
Definition: structs.h:188
TCmdGItem::x
BYTE x
Definition: structs.h:784
PlayerStruct::_pHPBase
int _pHPBase
Definition: structs.h:256
PlayerStruct::_pRSpell
int _pRSpell
Definition: structs.h:220
CMD_PLRDAMAGE
@ CMD_PLRDAMAGE
Definition: enums.h:2221
TCmdDamage::bCmd
BYTE bCmd
Definition: structs.h:830
MakePlrPath
void MakePlrPath(int pnum, int xx, int yy, BOOL endspace)
Definition: player.cpp:3526
TCmdGItem::bMCh
BYTE bMCh
Definition: structs.h:793
DoHealOther
void DoHealOther(int pnum, int rid)
Definition: spells.cpp:238
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
On_ADDDEX
DWORD On_ADDDEX(TCmd *pCmd, int pnum)
Definition: msg.cpp:1334
gamemenu_off
void gamemenu_off()
Definition: gamemenu.cpp:85
TFakeCmdPlr::bPlr
BYTE bPlr
Definition: structs.h:848
TCmdLocParam3::wParam1
WORD wParam1
Definition: structs.h:737
PlayerStruct::_plid
int _plid
Definition: structs.h:213
On_OPERATEOBJ
DWORD On_OPERATEOBJ(TCmd *pCmd, int pnum)
Definition: msg.cpp:2229
TCmdPItem::dwBuff
DWORD dwBuff
Definition: structs.h:812
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
TCmdGItem::bMDur
BYTE bMDur
Definition: structs.h:791
TCmdChItem::bId
BOOLEAN bId
Definition: structs.h:821
MAXITEMS
#define MAXITEMS
Definition: defs.h:27
nthread_send_and_recv_turn
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)
Definition: nthread.cpp:47
MonsterStruct::_mfutx
int _mfutx
Definition: structs.h:550
TCmdGolem::_mx
BYTE _mx
Definition: structs.h:762
On_ENDSHIELD
DWORD On_ENDSHIELD(TCmd *pCmd, int pnum)
Definition: msg.cpp:2532
MIS_TOWN
@ MIS_TOWN
Definition: enums.h:1204
delta_portal_inited
BOOL delta_portal_inited(int i)
Definition: msg.cpp:401
TCmdChItem::bCmd
BYTE bCmd
Definition: structs.h:816
On_DELPLRITEMS
DWORD On_DELPLRITEMS(TCmd *pCmd, int pnum)
Definition: msg.cpp:2286
NetSendCmdLocParam2
void NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)
Definition: msg.cpp:667
PlayerStruct::HoldItem
ItemStruct HoldItem
Definition: structs.h:318
MIS_MANASHIELD
@ MIS_MANASHIELD
Definition: enums.h:1207
MonsterStruct::_mDelFlag
BOOL _mDelFlag
Definition: structs.h:569
TCmdParam2::wParam2
WORD wParam2
Definition: structs.h:750
check_update_plr
void check_update_plr(int pnum)
Definition: msg.cpp:1667
CMD_TSPELLXY
@ CMD_TSPELLXY
Definition: enums.h:2186
itemactive
DEVILUTION_BEGIN_NAMESPACE int itemactive[MAXITEMS]
Definition: items.cpp:10
TCmdDelItem::bCmd
BYTE bCmd
Definition: structs.h:825
missile
MissileStruct missile[MAXMISSILES]
Definition: missiles.cpp:12
gdwTurnsInTransit
DWORD gdwTurnsInTransit
Definition: nthread.cpp:16
On_TSPELLXY
DWORD On_TSPELLXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1798
IDI_EAR
@ IDI_EAR
Definition: enums.h:2524
PlayerStruct::_pSplLvl
char _pSplLvl[64]
Definition: structs.h:225
On_SETMAG
DWORD On_SETMAG(TCmd *pCmd, int pnum)
Definition: msg.cpp:2477
ACTION_ATTACKPLR
@ ACTION_ATTACKPLR
Definition: enums.h:2917
CMD_RETOWN
@ CMD_RETOWN
Definition: enums.h:2254
ACTION_SPELL
@ ACTION_SPELL
Definition: enums.h:2909
TCmdPItem::x
BYTE x
Definition: structs.h:801
PlayerStruct::_pNextExper
int _pNextExper
Definition: structs.h:270
DLevel
Definition: structs.h:923
sgpMegaPkt
static TMegaPkt * sgpMegaPkt
Definition: msg.cpp:22
TCmd::bCmd
BYTE bCmd
Definition: structs.h:709
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
dthread_send_delta
void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen)
Definition: dthread.cpp:32
CMD_KNOCKBACK
@ CMD_KNOCKBACK
Definition: enums.h:2199
DeltaExportJunk
BYTE * DeltaExportJunk(BYTE *dst)
Definition: msg.cpp:258
NetSendCmdString
void NetSendCmdString(int pmask, const char *pszStr)
Definition: msg.cpp:965
delta_put_item
void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)
Definition: msg.cpp:1633
DPortal
struct DPortal DPortal
On_STRING2
DWORD On_STRING2(int pnum, TCmd *pCmd)
Definition: msg.cpp:2506
TMegaPkt::pNext
struct TMegaPkt * pNext
Definition: structs.h:955
On_CHEAT_EXPERIENCE
DWORD On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum)
Definition: msg.cpp:2549
On_DROPITEM
DWORD On_DROPITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:2310
PM_DEATH
@ PM_DEATH
Definition: enums.h:2051
ClrPlrPath
void ClrPlrPath(int pnum)
Definition: player.cpp:3466
TCmdGolem::bCmd
BYTE bCmd
Definition: structs.h:761
DMonsterStr::_mhitpoints
int _mhitpoints
Definition: structs.h:916
CMD_CHANGEPLRITEMS
@ CMD_CHANGEPLRITEMS
Definition: enums.h:2219
TCmdPlrInfoHdr
Definition: structs.h:835
sbLastCmd
static BYTE sbLastCmd
Definition: msg.cpp:16
NetSendCmdExtra
void NetSendCmdExtra(TCmdGItem *p)
Definition: msg.cpp:841
msg_free_packets
void msg_free_packets()
Definition: msg.cpp:106
CMD_OPENDOOR
@ CMD_OPENDOOR
Definition: enums.h:2214
NetSendCmdGItem
void NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii)
Definition: msg.cpp:752
pfile_update
void pfile_update(BOOL force_save)
Definition: pfile.cpp:573
PlayerStruct::_pExperience
int _pExperience
Definition: structs.h:268
MonsterStruct::_mx
int _mx
Definition: structs.h:548
TCmdDelItem::bLoc
BYTE bLoc
Definition: structs.h:826
PlayerStruct::_pLevel
char _pLevel
Definition: structs.h:266
On_DLEVEL
DWORD On_DLEVEL(int pnum, TCmd *pCmd)
Definition: msg.cpp:1147
TCmdQuest::qlog
BYTE qlog
Definition: structs.h:774
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
TCmdGItem::bId
BYTE bId
Definition: structs.h:789
delta_kill_monster
void delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
Definition: msg.cpp:310
SyncPlrKill
void SyncPlrKill(int pnum, int earflag)
Definition: player.cpp:1884
deltaload
BOOL deltaload
Definition: msg.cpp:25
On_PLROPOBJ
DWORD On_PLROPOBJ(TCmd *pCmd, int pnum)
Definition: msg.cpp:2244
all.h
TCmdPItem::wCI
WORD wCI
Definition: structs.h:804
TCmdPItem::bCh
BYTE bCh
Definition: structs.h:809
QuestStruct::_qactive
unsigned char _qactive
Definition: structs.h:973
CheckInvSwap
void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)
Definition: inv.cpp:1081
msg_get_next_packet
void msg_get_next_packet()
Definition: msg.cpp:59
sgbDeltaChanged
static BOOLEAN sgbDeltaChanged
Definition: msg.cpp:23
On_SYNCPUTITEM
DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1673
RecreateItem
void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)
Definition: items.cpp:2251
NetSendCmdDamage
void NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam)
Definition: msg.cpp:952
DeleteItem
void DeleteItem(int ii, int i)
Definition: items.cpp:2427
ALIGN_BY_1
#define ALIGN_BY_1
Definition: defs.h:179
PlayerStruct::_pSplType
char _pSplType
Definition: structs.h:216
On_OPOBJT
DWORD On_OPOBJT(TCmd *pCmd, int pnum)
Definition: msg.cpp:1851
TCmdGItem::bCursitem
BYTE bCursitem
Definition: structs.h:782
RespawnItem
void RespawnItem(int i, BOOL FlipFlag)
Definition: items.cpp:2396
On_OPENDOOR
DWORD On_OPENDOOR(TCmd *pCmd, int pnum)
Definition: msg.cpp:2191
CMD_SETVIT
@ CMD_SETVIT
Definition: enums.h:2253
ModifyPlrDex
void ModifyPlrDex(int p, int l)
Definition: player.cpp:3912
PFILE_STAND
@ PFILE_STAND
Definition: enums.h:2840
CMD_TSPELLPID
@ CMD_TSPELLPID
Definition: enums.h:2196
CMD_ACK_PLRINFO
@ CMD_ACK_PLRINFO
Definition: enums.h:2173
NetSendCmdGItem2
void NetSendCmdGItem2(BOOL usonly, BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
Definition: msg.cpp:793
NetSendCmdDItem
void NetSendCmdDItem(BOOL bHiPri, int ii)
Definition: msg.cpp:916
PlayerStruct::destParam4
int destParam4
Definition: structs.h:186
PlayerStruct::destParam1
int destParam1
Definition: structs.h:183
CMD_RATTACKID
@ CMD_RATTACKID
Definition: enums.h:2191
ClearMissileSpot
void ClearMissileSpot(int mi)
Definition: missiles.cpp:4146
TCmdLocParam2::x
BYTE x
Definition: structs.h:727
CMD_RATTACKPID
@ CMD_RATTACKPID
Definition: enums.h:2192
TCmdParam1
Definition: structs.h:742
spelldata
DEVILUTION_BEGIN_NAMESPACE SpellData spelldata[]
Data related to each spell ID.
Definition: spelldat.cpp:6
On_ACTIVATEPORTAL
DWORD On_ACTIVATEPORTAL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2382
CMD_ENDSHIELD
@ CMD_ENDSHIELD
Definition: enums.h:2260
TCmdParam3::wParam1
WORD wParam1
Definition: structs.h:755
gbMaxPlayers
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
Definition: multi.cpp:34
CMD_STRING
@ CMD_STRING
Definition: enums.h:2249
SetMultiQuest
void SetMultiQuest(int q, int s, int l, int v1)
Definition: quests.cpp:826
NetSendCmdQuest
void NetSendCmdQuest(BOOL bHiPri, BYTE q)
Definition: msg.cpp:737
On_DEBUG
DWORD On_DEBUG(TCmd *pCmd, int pnum)
Definition: msg.cpp:2573
SetItemRecord
void SetItemRecord(int nSeed, WORD wCI, int nIndex)
Definition: items.cpp:4039
MultiQuests::qvar1
BYTE qvar1
Definition: structs.h:944
CMD_RATTACKXY
@ CMD_RATTACKXY
Definition: enums.h:2184
CMD_CHEAT_EXPERIENCE
@ CMD_CHEAT_EXPERIENCE
Definition: enums.h:2203
multi_msg_add
void multi_msg_add(BYTE *pbMsg, BYTE bLen)
Definition: multi.cpp:51
recv_plrinfo
void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv)
Definition: multi.cpp:877
SyncPutItem
int SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, DWORD ibuff)
Definition: inv.cpp:1840
PlayerStruct::_pLvlVisited
BOOLEAN _pLvlVisited[NUMLEVELS]
Definition: structs.h:285
PlayerStruct::destParam2
int destParam2
Definition: structs.h:184
TCmdPItem
struct TCmdPItem TCmdPItem
On_ADDMAG
DWORD On_ADDMAG(TCmd *pCmd, int pnum)
Definition: msg.cpp:1322
DObjectStr::bCmd
BYTE bCmd
Definition: structs.h:920
AddMissile
int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl)
Definition: missiles.cpp:2455
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
On_TSPELLPID
DWORD On_TSPELLPID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1978
TCmdGItem::bCh
BYTE bCh
Definition: structs.h:792
NewPlrAnim
void NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width)
Definition: player.cpp:394
ACTION_PICKUPITEM
@ ACTION_PICKUPITEM
Definition: enums.h:2912
PlayerStruct::_px
int _px
Definition: structs.h:190
TCmdDelItem
Definition: structs.h:824
TCmdString::str
char str[MAX_SEND_STR_LEN]
Definition: structs.h:843
On_ADDVIT
DWORD On_ADDVIT(TCmd *pCmd, int pnum)
Definition: msg.cpp:1346
PlayerStruct::_pTSplType
char _pTSplType
Definition: structs.h:219
MIS_GOLEM
@ MIS_GOLEM
Definition: enums.h:1227
DeltaExportData
void DeltaExportData(int pnum)
Definition: msg.cpp:190
SyncGetItem
void SyncGetItem(int x, int y, int idx, WORD ci, int iseed)
Definition: inv.cpp:1662
DeltaImportItem
BYTE * DeltaImportItem(BYTE *src, TCmdPItem *dst)
Definition: msg.cpp:1214
TCmdLocParam3::wParam2
WORD wParam2
Definition: structs.h:738
TCmdGItem::dwBuff
DWORD dwBuff
Definition: structs.h:795
multi_send_msg_packet
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
Definition: multi.cpp:159
CMD_TALKXY
@ CMD_TALKXY
Definition: enums.h:2200
DeltaExportItem
BYTE * DeltaExportItem(BYTE *dst, TCmdPItem *src)
Definition: msg.cpp:216
CURSOR_FIRSTITEM
@ CURSOR_FIRSTITEM
Definition: enums.h:2078
CMD_GETITEM
@ CMD_GETITEM
Definition: enums.h:2179
TSyncMonster::_mndx
BYTE _mndx
Definition: structs.h:884
PlayerStruct::_pSBkSplType
char _pSBkSplType
Definition: structs.h:224
On_PLRDAMAGE
DWORD On_PLRDAMAGE(TCmd *pCmd, int pnum)
Definition: msg.cpp:2168
NetSendCmdParam1
void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
Definition: msg.cpp:698
CMD_SETMAG
@ CMD_SETMAG
Definition: enums.h:2251
DObjectStr
struct DObjectStr DObjectStr
M_SyncStartKill
void M_SyncStartKill(int i, int x, int y, int pnum)
Definition: monster.cpp:1716
ACTION_OPERATE
@ ACTION_OPERATE
Definition: enums.h:2910
MonsterStruct::_mdir
int _mdir
Definition: structs.h:558
sync_update
DWORD sync_update(int pnum, const BYTE *pbBuf)
Definition: sync.cpp:191
DPortal::x
BYTE x
Definition: structs.h:934
CMD_DEBUG
@ CMD_DEBUG
Definition: enums.h:2205
ACTION_RATTACKMON
@ ACTION_RATTACKMON
Definition: enums.h:2918
ModifyPlrMag
void ModifyPlrMag(int p, int l)
Definition: player.cpp:3877
NetSendCmdChItem
void NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)
Definition: msg.cpp:887
CMD_WALKXY
@ CMD_WALKXY
Definition: enums.h:2172
gbGameDestroyed
BOOLEAN gbGameDestroyed
Definition: multi.cpp:22
dwRecCount
int dwRecCount
Definition: msg.cpp:27
direction
direction
Definition: enums.h:2081
CMD_DLEVEL_0
@ CMD_DLEVEL_0
Definition: enums.h:2229
TCmdParam1::wParam1
WORD wParam1
Definition: structs.h:744
DeactivatePortal
void DeactivatePortal(int i)
Definition: portal.cpp:90
CMD_CLOSEDOOR
@ CMD_CLOSEDOOR
Definition: enums.h:2215
PlayerStruct::_pGFXLoad
int _pGFXLoad
Definition: structs.h:287
TMegaPkt::dwSpaceLeft
DWORD dwSpaceLeft
Definition: structs.h:956
CMD_PLROPOBJ
@ CMD_PLROPOBJ
Definition: enums.h:2217
CMD_ITEMEXTRA
@ CMD_ITEMEXTRA
Definition: enums.h:2256
SyncInitPlr
void SyncInitPlr(int pnum)
Definition: player.cpp:3788
TCmdParam3::wParam2
WORD wParam2
Definition: structs.h:756
On_BREAKOBJ
DWORD On_BREAKOBJ(TCmd *pCmd, int pnum)
Definition: msg.cpp:2259
app_fatal
void app_fatal(const char *pszFmt,...)
Definition: appfat.cpp:18
On_CLOSEDOOR
DWORD On_CLOSEDOOR(TCmd *pCmd, int pnum)
Definition: msg.cpp:2214
CMD_GOTOGETITEM
@ CMD_GOTOGETITEM
Definition: enums.h:2212
TCmdLoc::x
BYTE x
Definition: structs.h:714
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
DeltaExportObject
BYTE * DeltaExportObject(BYTE *dst, DObjectStr *src)
Definition: msg.cpp:234
CMD_SPELLXYD
@ CMD_SPELLXYD
Definition: enums.h:2255
TCmdGItem::bLevel
BYTE bLevel
Definition: structs.h:783
On_ATTACKXY
DWORD On_ATTACKXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1713
CMD_NEWLVL
@ CMD_NEWLVL
Definition: enums.h:2201
nthread_has_500ms_passed
BOOL nthread_has_500ms_passed(BOOL unused)
Definition: nthread.cpp:224
TCmdGolem::_menemy
char _menemy
Definition: structs.h:765
PlayerStruct::_pvid
int _pvid
Definition: structs.h:214
RestartTownLvl
void RestartTownLvl(int pnum)
Definition: player.cpp:2007
monster
MonsterStruct monster[MAXMONSTERS]
Definition: monster.cpp:19
MonsterStruct::_mhitpoints
int _mhitpoints
Definition: structs.h:579
TFakeDropPlr::bCmd
BYTE bCmd
Definition: structs.h:852
On_NEWLVL
DWORD On_NEWLVL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2047
TCmdParam2::wParam1
WORD wParam1
Definition: structs.h:749
TCmdGItem::wIndx
WORD wIndx
Definition: structs.h:786
TCmdLocParam2::bCmd
BYTE bCmd
Definition: structs.h:726
TCmdDamage::dwDam
DWORD dwDam
Definition: structs.h:832
FindGetItem
int FindGetItem(int idx, WORD ci, int iseed)
Definition: inv.cpp:1640
TCmdPItem::dwSeed
int dwSeed
Definition: structs.h:805
TCmdGolem::_mhitpoints
int _mhitpoints
Definition: structs.h:766
CMD_SPELLXY
@ CMD_SPELLXY
Definition: enums.h:2185
TCmdParam3
Definition: structs.h:753
TCmdGItem
Definition: structs.h:778
delta_close_portal
void delta_close_portal(int pnum)
Definition: msg.cpp:976
DeltaAddItem
void DeltaAddItem(int ii)
Definition: msg.cpp:411
TCmdPItem::wValue
WORD wValue
Definition: structs.h:811
ErrorPlrMsg
char * ErrorPlrMsg(const char *pszMsg)
Definition: plrmsg.cpp:28
RSPLTYPE_INVALID
@ RSPLTYPE_INVALID
Definition: enums.h:2062
AutoGetItem
void AutoGetItem(int pnum, int ii)
Definition: inv.cpp:1504
StartStand
void StartStand(int pnum, int dir)
Definition: player.cpp:1056
ACTION_SPELLPLR
@ ACTION_SPELLPLR
Definition: enums.h:2921
TCmdLoc::bCmd
BYTE bCmd
Definition: structs.h:713
CMD_AGETITEM
@ CMD_AGETITEM
Definition: enums.h:2180
On_ADDSTR
DWORD On_ADDSTR(TCmd *pCmd, int pnum)
Definition: msg.cpp:1310
NUMLEVELS
#define NUMLEVELS
Definition: defs.h:56
ModifyPlrStr
void ModifyPlrStr(int p, int l)
Definition: player.cpp:3848
DeltaLoadLevel
void DeltaLoadLevel()
Definition: msg.cpp:465
CMD_MONSTDAMAGE
@ CMD_MONSTDAMAGE
Definition: enums.h:2208
NextPlrLevel
void NextPlrLevel(int pnum)
Definition: player.cpp:700
PlayerStruct::plractive
BOOLEAN plractive
Definition: structs.h:181
ACTION_RATTACKPLR
@ ACTION_RATTACKPLR
Definition: enums.h:2919
TCmdPlrInfoHdr::wBytes
WORD wBytes
Definition: structs.h:838
On_DEACTIVATEPORTAL
DWORD On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2424
CMD_WARP
@ CMD_WARP
Definition: enums.h:2202
On_RATTACKXY
DWORD On_RATTACKXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1741
MonsterStruct::mWhoHit
char mWhoHit
Definition: structs.h:594
DJunk
Definition: structs.h:947
dItem
char dItem[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:57
SetPlrMag
void SetPlrMag(int p, int v)
Definition: player.cpp:4005
DeleteMissile
void DeleteMissile(int mi, int i)
Definition: missiles.cpp:355
PlayerStruct::_pLvlChanging
BOOLEAN _pLvlChanging
Definition: structs.h:236
sgJunk
static DJunk sgJunk
Definition: msg.cpp:21
CMD_REMSHIELD
@ CMD_REMSHIELD
Definition: enums.h:2264
CMD_GOTOAGETITEM
@ CMD_GOTOAGETITEM
Definition: enums.h:2213
LocalLevel
Definition: structs.h:929
MultiQuests::qstate
BYTE qstate
Definition: structs.h:942
CMD_CHEAT_SPELL_LEVEL
@ CMD_CHEAT_SPELL_LEVEL
Definition: enums.h:2204
DPortal::setlvl
BYTE setlvl
Definition: structs.h:938
MultiQuests
struct MultiQuests MultiQuests
TCmdGItem::bMaster
BYTE bMaster
Definition: structs.h:780
M_StartStand
void M_StartStand(int i, int md)
Definition: monster.cpp:1207
objectactive
int objectactive[MAXOBJECTS]
Definition: objects.cpp:9
CMD_ADDSTR
@ CMD_ADDSTR
Definition: enums.h:2174
On_SPELLPID
DWORD On_SPELLPID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1938
CMD_ACTIVATEPORTAL
@ CMD_ACTIVATEPORTAL
Definition: enums.h:2227
PortalOnLevel
BOOL PortalOnLevel(int i)
Definition: portal.cpp:95
TCmdPItem::y
BYTE y
Definition: structs.h:802
DLevel::item
TCmdPItem item[MAXITEMS]
Definition: structs.h:924
BFLAG_DEAD_PLAYER
@ BFLAG_DEAD_PLAYER
Definition: enums.h:1879
StartPlayerKill
void StartPlayerKill(int pnum, int earflag)
Definition: player.cpp:1623
decode_enemy
void decode_enemy(int m, int enemy)
Definition: monster.cpp:5492
ACTION_SPELLMON
@ ACTION_SPELLMON
Definition: enums.h:2920
TSyncMonster
Definition: structs.h:883
CMD_AWAKEGOLEM
@ CMD_AWAKEGOLEM
Definition: enums.h:2261
CMD_SYNCQUEST
@ CMD_SYNCQUEST
Definition: enums.h:2259
CMD_PLAYER_JOINLEVEL
@ CMD_PLAYER_JOINLEVEL
Definition: enums.h:2224
missileactive
DEVILUTION_BEGIN_NAMESPACE int missileactive[MAXMISSILES]
Definition: missiles.cpp:10
AddInTownPortal
void AddInTownPortal(int i)
Definition: portal.cpp:72
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
TCmdQuest::bCmd
BYTE bCmd
Definition: structs.h:771
AddVision
int AddVision(int x, int y, int r, BOOL mine)
Definition: lighting.cpp:1176
CMD_SYNCDATA
@ CMD_SYNCDATA
Definition: enums.h:2206
DeltaImportJunk
void DeltaImportJunk(BYTE *src)
Definition: msg.cpp:1256
CMD_STAND
@ CMD_STAND
Definition: enums.h:2171
MonsterStruct::_mFlags
int _mFlags
Definition: structs.h:583
MFLAG_GOLEM
@ MFLAG_GOLEM
Definition: enums.h:1508
TCmdPlrInfoHdr::wOffset
WORD wOffset
Definition: structs.h:837
gbDeltaSender
BYTE gbDeltaSender
Definition: multi.cpp:37
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
CMD_ATTACKXY
@ CMD_ATTACKXY
Definition: enums.h:2183
CMD_BREAKOBJ
@ CMD_BREAKOBJ
Definition: enums.h:2218
i_own_level
BOOL i_own_level(int nReqLevel)
Definition: msg.cpp:1427
On_SEND_PLRINFO
DWORD On_SEND_PLRINFO(TCmd *pCmd, int pnum)
Definition: msg.cpp:2322
inv_update_rem_item
void inv_update_rem_item(int pnum, BYTE iv)
Definition: inv.cpp:1263
DoResurrect
void DoResurrect(int pnum, int rid)
Definition: spells.cpp:193
On_SETSHIELD
DWORD On_SETSHIELD(TCmd *pCmd, int pnum)
Definition: msg.cpp:2595
TCmdGItem::bCmd
BYTE bCmd
Definition: structs.h:779
ItemStruct::_iName
char _iName[64]
Definition: structs.h:116
NetSendCmdParam3
void NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)
Definition: msg.cpp:723
TCmdLocParam2::y
BYTE y
Definition: structs.h:728
SetPlrStr
void SetPlrStr(int p, int v)
Definition: player.cpp:3985
NetSendCmdReq2
BOOL NetSendCmdReq2(BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
Definition: msg.cpp:819
CanPut
BOOL CanPut(int x, int y)
Definition: inv.cpp:1698
NetSendHiPri
void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
Definition: multi.cpp:107
DPortal
Definition: structs.h:933
CMD_KILLGOLEM
@ CMD_KILLGOLEM
Definition: enums.h:2258
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
SetPortalStats
void SetPortalStats(int i, BOOL o, int x, int y, int lvl, int lvltype)
Definition: portal.cpp:25
nthread_set_turn_upper_bit
void nthread_set_turn_upper_bit()
Definition: nthread.cpp:113
TCmdGItem::y
BYTE y
Definition: structs.h:785
AI_DIABLO
@ AI_DIABLO
Definition: enums.h:1344
On_RESURRECT
DWORD On_RESURRECT(TCmd *pCmd, int pnum)
Definition: msg.cpp:2010
TCmdGItem::dwSeed
int dwSeed
Definition: structs.h:788
SyncOpObject
void SyncOpObject(int pnum, int cmd, int i)
Definition: objects.cpp:3924
On_PLRDEAD
DWORD On_PLRDEAD(TCmd *pCmd, int pnum)
Definition: msg.cpp:2154
TCmd
Definition: structs.h:708
TSyncMonster::_menemy
BYTE _menemy
Definition: structs.h:887
DMonsterStr::_mdir
BYTE _mdir
Definition: structs.h:913
CMD_SETDEX
@ CMD_SETDEX
Definition: enums.h:2252
CMD_PLRLEVEL
@ CMD_PLRLEVEL
Definition: enums.h:2222
automapview
BOOLEAN automapview[DMAXX][DMAXY]
Tracks the explored areas of the map.
Definition: automap.cpp:21
MAXOBJECTS
#define MAXOBJECTS
Definition: defs.h:33
DTYPE_TOWN
@ DTYPE_TOWN
Definition: enums.h:1868
NetSendCmd
void NetSendCmd(BOOL bHiPri, BYTE bCmd)
Definition: msg.cpp:615
On_ITEMEXTRA
DWORD On_ITEMEXTRA(TCmd *pCmd, int pnum)
Definition: msg.cpp:1591
On_WARP
DWORD On_WARP(TCmd *pCmd, int pnum)
Definition: msg.cpp:2059
CMD_SATTACKXY
@ CMD_SATTACKXY
Definition: enums.h:2226
numitems
int numitems
Definition: items.cpp:19
TSyncMonster::_my
BYTE _my
Definition: structs.h:886
On_DISARMXY
DWORD On_DISARMXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1835
CMD_ATTACKID
@ CMD_ATTACKID
Definition: enums.h:2189
TCmdLocParam1::bCmd
BYTE bCmd
Definition: structs.h:719
run_delta_info
void run_delta_info()
Definition: msg.cpp:148
M_ClearSquares
void M_ClearSquares(int i)
Definition: monster.cpp:1412
On_GOTOAGETITEM
DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1529
TCmdQuest
Definition: structs.h:770
nthread_recv_turns
BOOL nthread_recv_turns(BOOL *pfSendAsync)
Definition: nthread.cpp:77
On_WALKXY
DWORD On_WALKXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1297
monstactive
int monstactive[MAXMONSTERS]
Definition: monster.cpp:16
questlist
QuestData questlist[MAXQUESTS]
Definition: quests.cpp:18
On_TSPELLID
DWORD On_TSPELLID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1958
MonsterStruct::_msquelch
BYTE _msquelch
Definition: structs.h:584
glSeedTbl
DWORD glSeedTbl[NUMLEVELS]
Definition: diablo.cpp:20
TMegaPkt::data
BYTE data[32000]
Definition: structs.h:957
DLevel::monster
DMonsterStr monster[MAXMONSTERS]
Definition: structs.h:926
CMD_RESURRECT
@ CMD_RESURRECT
Definition: enums.h:2197
sgbRecvCmd
static BYTE sgbRecvCmd
Definition: msg.cpp:19
nummonsters
int nummonsters
Definition: monster.cpp:17
On_CHANGEPLRITEMS
DWORD On_CHANGEPLRITEMS(TCmd *pCmd, int pnum)
Definition: msg.cpp:2274
TSyncMonster::_mx
BYTE _mx
Definition: structs.h:885
TCmdLocParam2::wParam1
WORD wParam1
Definition: structs.h:729
DiabloAllocPtr
BYTE * DiabloAllocPtr(DWORD dwBytes)
Multithreaded safe malloc.
Definition: engine.cpp:765
TCmdChItem::wIndx
WORD wIndx
Definition: structs.h:818
DMonsterStr::_mactive
BYTE _mactive
Definition: structs.h:915
TCmdLocParam1
Definition: structs.h:718
On_SPELLID
DWORD On_SPELLID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1918
On_REMSHIELD
DWORD On_REMSHIELD(TCmd *pCmd, int pnum)
Definition: msg.cpp:2603
CMD_SBSPELL
@ CMD_SBSPELL
Definition: enums.h:2178
MonsterStruct::_moldy
int _moldy
Definition: structs.h:553
CMD_SEND_PLRINFO
@ CMD_SEND_PLRINFO
Definition: enums.h:2225
TCmdLocParam3::y
BYTE y
Definition: structs.h:736
CMD_OPOBJT
@ CMD_OPOBJT
Definition: enums.h:2198
TCmdLocParam3
Definition: structs.h:733
CMD_ADDDEX
@ CMD_ADDDEX
Definition: enums.h:2176
On_KILLGOLEM
DWORD On_KILLGOLEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:2091
On_OPOBJXY
DWORD On_OPOBJXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1819
M_StartHit
void M_StartHit(int i, int pnum, int dam)
Definition: monster.cpp:1459
CMD_REQUESTAGITEM
@ CMD_REQUESTAGITEM
Definition: enums.h:2211
TCmdQuest::qvar1
BYTE qvar1
Definition: structs.h:775
ItemStruct::IDidx
int IDidx
Definition: structs.h:170
MAXCHARLEVEL
#define MAXCHARLEVEL
Definition: defs.h:42
msg_wait_resync
BOOL msg_wait_resync()
Definition: msg.cpp:74
EventPlrMsg
size_t EventPlrMsg(const char *pszFmt,...)
Definition: plrmsg.cpp:40
On_SPELLXYD
DWORD On_SPELLXYD(TCmd *pCmd, int pnum)
Definition: msg.cpp:1755
On_STRING
DWORD On_STRING(TCmd *pCmd, int pnum)
Definition: msg.cpp:2501
myplr
int myplr
Definition: player.cpp:9
delta_monster_hp
void delta_monster_hp(int mi, int hp, BYTE bLevel)
Definition: msg.cpp:324
SPL_NOVA
@ SPL_NOVA
Definition: enums.h:2148
TCmdGItem::bDur
BYTE bDur
Definition: structs.h:790
PlayerStruct::_pHitPoints
int _pHitPoints
Definition: structs.h:258
DPortal::level
BYTE level
Definition: structs.h:936
TCmdLocParam2::wParam2
WORD wParam2
Definition: structs.h:730
TCmdLocParam3::wParam3
WORD wParam3
Definition: structs.h:739
On_SETSTR
DWORD On_SETSTR(TCmd *pCmd, int pnum)
Definition: msg.cpp:2453
TCmdPlrInfoHdr::bCmd
BYTE bCmd
Definition: structs.h:836
On_AWAKEGOLEM
DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:2106
multi_player_left
void multi_player_left(int pnum, int reason)
Definition: multi.cpp:221
NetSendLoPri
void NetSendLoPri(BYTE *pbMsg, BYTE bLen)
Definition: multi.cpp:58
TCmdChItem::bLoc
BYTE bLoc
Definition: structs.h:817
mem_free_dbg
void mem_free_dbg(void *p)
Multithreaded safe memfree.
Definition: engine.cpp:786
CMD_SPELLID
@ CMD_SPELLID
Definition: enums.h:2193
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
TCmdString
Definition: structs.h:841
TCmdGItem::wCI
WORD wCI
Definition: structs.h:787
GetItemRecord
BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex)
Definition: items.cpp:4006
CMD_DROPITEM
@ CMD_DROPITEM
Definition: enums.h:2223
nummissiles
int nummissiles
Definition: missiles.cpp:13
CMD_SPELLPID
@ CMD_SPELLPID
Definition: enums.h:2194
MultiQuests::qlog
BYTE qlog
Definition: structs.h:943
QuestStruct::_qvar1
unsigned char _qvar1
Definition: structs.h:980
DeltaImportObject
BYTE * DeltaImportObject(BYTE *src, DObjectStr *dst)
Definition: msg.cpp:1232
TCmdDamage
Definition: structs.h:829
PlayerStruct::plrlevel
int plrlevel
Definition: structs.h:187
On_ATTACKID
DWORD On_ATTACKID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1863
On_TALKXY
DWORD On_TALKXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:2034
TMegaPkt
Definition: structs.h:954
On_REQUESTGITEM
DWORD On_REQUESTGITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1405
sgLevels
static DLevel sgLevels[NUMLEVELS]
Definition: msg.cpp:15
StartNewLvl
void StartNewLvl(int pnum, int fom, int lvl)
Definition: player.cpp:1967
TFakeCmdPlr::bCmd
BYTE bCmd
Definition: structs.h:847
Obj_Trap
void Obj_Trap(int i)
Definition: objects.cpp:1634
TCmdLocParam1::y
BYTE y
Definition: structs.h:721
TCmdDamage::bPlr
BYTE bPlr
Definition: structs.h:831
pcurs
int pcurs
Definition: cursor.cpp:27
dMonster
int dMonster[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:17
RemovePortalMissile
void RemovePortalMissile(int id)
Definition: portal.cpp:103
ACTION_DISARM
@ ACTION_DISARM
Definition: enums.h:2911
CMD_DLEVEL_JUNK
@ CMD_DLEVEL_JUNK
Definition: enums.h:2246
NetSendCmdLocParam3
void NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)
Definition: msg.cpp:682
FAKE_CMD_SETID
@ FAKE_CMD_SETID
Definition: enums.h:2265
msg_comp_level
int msg_comp_level(BYTE *buffer, BYTE *end)
Definition: msg.cpp:290
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
CMD_PUTITEM
@ CMD_PUTITEM
Definition: enums.h:2181
NetSendCmdParam2
void NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)
Definition: msg.cpp:710
QuestStruct::_qlog
int _qlog
Definition: structs.h:982
MonsterStruct::_mfuty
int _mfuty
Definition: structs.h:551
TCmdPItem::bId
BYTE bId
Definition: structs.h:806
DMonsterStr
Definition: structs.h:910
On_KNOCKBACK
DWORD On_KNOCKBACK(TCmd *pCmd, int pnum)
Definition: msg.cpp:1998
SendPlrMsg
void SendPlrMsg(int pnum, const char *pszStr)
Definition: plrmsg.cpp:55
On_AGETITEM
DWORD On_AGETITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1564
sgdwRecvOffset
static DWORD sgdwRecvOffset
Definition: msg.cpp:13
delta_init
void delta_init()
Definition: msg.cpp:301
On_SATTACKXY
DWORD On_SATTACKXY(TCmd *pCmd, int pnum)
Definition: msg.cpp:1727
DObjectStr
Definition: structs.h:919
PkwareCompress
int PkwareCompress(void *buf, int size)
Definition: encrypt.cpp:82
PlayerStruct::_py
int _py
Definition: structs.h:191
ActivatePortal
void ActivatePortal(int i, int x, int y, int lvl, int lvltype, BOOL sp)
Definition: portal.cpp:77
TCmdPItem
Definition: structs.h:799
OBJ_TRAPL
@ OBJ_TRAPL
Definition: enums.h:2382
On_GOTOGETITEM
DWORD On_GOTOGETITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1392
DPortal::y
BYTE y
Definition: structs.h:935
CMD_SYNCPUTITEM
@ CMD_SYNCPUTITEM
Definition: enums.h:2257
DrawDlg
void DrawDlg(char *pszFmt,...)
Definition: appfat.cpp:58
On_RATTACKPID
DWORD On_RATTACKPID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1905
CMD_RESPAWNITEM
@ CMD_RESPAWNITEM
Definition: enums.h:2182
DPortal::ltype
BYTE ltype
Definition: structs.h:937
ACTION_NONE
@ ACTION_NONE
Definition: enums.h:2906
TCmdLoc::y
BYTE y
Definition: structs.h:715
MAXMULTIQUESTS
#define MAXMULTIQUESTS
Definition: defs.h:32
NetSendCmdGolem
void NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl)
Definition: msg.cpp:626
On_ATTACKPID
DWORD On_ATTACKPID(TCmd *pCmd, int pnum)
Definition: msg.cpp:1879
MultiQuests
Definition: structs.h:941
dFlags
char dFlags[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:56
TCmdPItem::bCmd
BYTE bCmd
Definition: structs.h:800
PlayerStruct::_pVar8
int _pVar8
Definition: structs.h:284
DeltaImportData
void DeltaImportData(BYTE cmd, DWORD recv_offset)
Definition: msg.cpp:1190
TCmdLocParam3::bCmd
BYTE bCmd
Definition: structs.h:734
DLevel
struct DLevel DLevel
TCmdPItem::bMCh
BYTE bMCh
Definition: structs.h:810
CMD_NOVA
@ CMD_NOVA
Definition: enums.h:2262
ACTION_PICKUPAITEM
@ ACTION_PICKUPAITEM
Definition: enums.h:2913
OBJ_TRAPR
@ OBJ_TRAPR
Definition: enums.h:2383
drawhpflag
BOOL drawhpflag
Definition: control.cpp:14
PlayerStruct::_pmode
int _pmode
Definition: structs.h:179
PlayerStruct::WorldY
int WorldY
Definition: structs.h:189
MonsterStruct::_my
int _my
Definition: structs.h:549
TCmdChItem::dwSeed
int dwSeed
Definition: structs.h:820
TCmdGItem::wValue
WORD wValue
Definition: structs.h:794
NetSendCmdLoc
void NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
Definition: msg.cpp:640
ParseCmd
DWORD ParseCmd(int pnum, TCmd *pCmd)
Definition: msg.cpp:982
ACTION_OPERATETK
@ ACTION_OPERATETK
Definition: enums.h:2915
delta_leave_sync
void delta_leave_sync(BYTE bLevel)
Definition: msg.cpp:373
CMD_DLEVEL_16
@ CMD_DLEVEL_16
Definition: enums.h:2245
On_MONSTDEATH
DWORD On_MONSTDEATH(TCmd *pCmd, int pnum)
Definition: msg.cpp:2076
TCmdParam3::bCmd
BYTE bCmd
Definition: structs.h:754
On_SYNCQUEST
DWORD On_SYNCQUEST(TCmd *pCmd, int pnum)
Definition: msg.cpp:2517
delta_get_item
BOOL delta_get_item(TCmdGItem *pI, BYTE bLevel)
Definition: msg.cpp:1469
multi_process_network_packets
void multi_process_network_packets()
Definition: multi.cpp:408
PlayerStruct::_pSplFrom
char _pSplFrom
Definition: structs.h:217
ACTION_RATTACK
@ ACTION_RATTACK
Definition: enums.h:2908
RecreateEar
void RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff)
Definition: items.cpp:2297
delta_sync_golem
void delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
Definition: msg.cpp:357
FAKE_CMD_DROPID
@ FAKE_CMD_DROPID
Definition: enums.h:2266
PlayerStruct::_pRSplType
char _pRSplType
Definition: structs.h:222
CMD_DEACTIVATEPORTAL
@ CMD_DEACTIVATEPORTAL
Definition: enums.h:2228
TCmdLocParam2
Definition: structs.h:725
MAXMONSTERS
#define MAXMONSTERS
Definition: defs.h:31
InvPutItem
int InvPutItem(int pnum, int x, int y)
Definition: inv.cpp:1771
SetPlrVit
void SetPlrVit(int p, int v)
Definition: player.cpp:4045
TCmdLocParam1::x
BYTE x
Definition: structs.h:720
On_PLAYER_JOINLEVEL
DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum)
Definition: msg.cpp:2339
CMD_DISARMXY
@ CMD_DISARMXY
Definition: enums.h:2188
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
TFakeCmdPlr
Definition: structs.h:846
On_PUTITEM
DWORD On_PUTITEM(TCmd *pCmd, int pnum)
Definition: msg.cpp:1606
msg_send_drop_pkt
void msg_send_drop_pkt(int pnum, int reason)
Definition: msg.cpp:29
AddWarpMissile
void AddWarpMissile(int i, int x, int y)
Definition: portal.cpp:35
delta_sync_object
void delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)
Definition: msg.cpp:2206
itemavail
int itemavail[MAXITEMS]
Definition: items.cpp:12
On_NOVA
DWORD On_NOVA(TCmd *pCmd, int pnum)
Definition: msg.cpp:2578
On_SBSPELL
DWORD On_SBSPELL(TCmd *pCmd, int pnum)
Definition: msg.cpp:1358
TCmdParam3::wParam3
WORD wParam3
Definition: structs.h:757
LoadPlrGFX
void LoadPlrGFX(int pnum, player_graphic gfxflag)
Definition: player.cpp:134
DeltaSaveLevel
void DeltaSaveLevel()
Definition: msg.cpp:451
encode_enemy
int encode_enemy(int m)
Definition: monster.cpp:5484
SyncBreakObj
void SyncBreakObj(int pnum, int oi)
Definition: objects.cpp:4132
msg_errorf
void msg_errorf(const char *pszFmt,...)
Definition: msg.cpp:1375
DJunk::portal
DPortal portal[MAXPORTAL]
Definition: structs.h:948
DeltaExportMonster
BYTE * DeltaExportMonster(BYTE *dst, DMonsterStr *src)
Definition: msg.cpp:240
ACTION_TALK
@ ACTION_TALK
Definition: enums.h:2914
ItemStruct::_iCreateInfo
WORD _iCreateInfo
Definition: structs.h:101
ModifyPlrVit
void ModifyPlrVit(int p, int l)
Definition: player.cpp:3938
TCmdQuest::q
BYTE q
Definition: structs.h:772
deathflag
BOOL deathflag
Definition: player.cpp:13
TCmdGolem::_currlevel
BYTE _currlevel
Definition: structs.h:767
TCmdChItem
Definition: structs.h:815
DMonsterStr::_my
BYTE _my
Definition: structs.h:912
CMD_MONSTDEATH
@ CMD_MONSTDEATH
Definition: enums.h:2207
TCmdParam2::bCmd
BYTE bCmd
Definition: structs.h:748
On_SETDEX
DWORD On_SETDEX(TCmd *pCmd, int pnum)
Definition: msg.cpp:2465
CMD_DLEVEL_END
@ CMD_DLEVEL_END
Definition: enums.h:2247
NetSendCmdPItem
void NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
Definition: msg.cpp:851
StartWarpLvl
void StartWarpLvl(int pnum, int pidx)
Definition: player.cpp:2031