Devilution
Diablo devolved - magic behind the 1996 computer game
sync.cpp
Go to the documentation of this file.
1 #include "all.h"
2 
4 
10 
11 DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen)
12 {
13  TSyncHeader *pHdr;
14  int i;
15  BOOL sync;
16 
17  if (nummonsters < 1) {
18  return dwMaxLen;
19  }
20  if (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) {
21  return dwMaxLen;
22  }
23 
24  pHdr = (TSyncHeader *)pbBuf;
25  pbBuf += sizeof(*pHdr);
26  dwMaxLen -= sizeof(*pHdr);
27 
28  pHdr->bCmd = CMD_SYNCDATA;
29  pHdr->bLevel = currlevel;
30  pHdr->wLen = 0;
31  SyncPlrInv(pHdr);
34 
35  for (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) {
36  sync = FALSE;
37  if (i < 2) {
38  sync = sync_monster_active2((TSyncMonster *)pbBuf);
39  }
40  if (!sync) {
41  sync = sync_monster_active((TSyncMonster *)pbBuf);
42  }
43  if (!sync) {
44  break;
45  }
46  pbBuf += sizeof(TSyncMonster);
47  pHdr->wLen += sizeof(TSyncMonster);
48  dwMaxLen -= sizeof(TSyncMonster);
49  }
50 
51  return dwMaxLen;
52 }
53 
55 {
56  int i, m;
57 
58  for (i = 0; i < nummonsters; i++) {
59  m = monstactive[i];
60  sync_word_6AA708[m] = abs(plr[myplr].WorldX - monster[m]._mx) + abs(plr[myplr].WorldY - monster[m]._my);
61  if (monster[m]._msquelch == 0) {
62  sync_word_6AA708[m] += 0x1000;
63  } else if (sgwLRU[m] != 0) {
64  sgwLRU[m]--;
65  }
66  }
67 }
68 
70 {
71  int i, m, ndx;
72  DWORD lru;
73 
74  ndx = -1;
75  lru = 0xFFFFFFFF;
76 
77  for (i = 0; i < nummonsters; i++) {
78  m = monstactive[i];
79  if (sync_word_6AA708[m] < lru && sgwLRU[m] < 0xFFFE) {
80  lru = sync_word_6AA708[m];
81  ndx = monstactive[i];
82  }
83  }
84 
85  if (ndx == -1) {
86  return FALSE;
87  }
88 
89  sync_monster_pos(p, ndx);
90  return TRUE;
91 }
92 
93 void sync_monster_pos(TSyncMonster *p, int ndx)
94 {
95  p->_mndx = ndx;
96  p->_mx = monster[ndx]._mx;
97  p->_my = monster[ndx]._my;
98  p->_menemy = encode_enemy(ndx);
99  p->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx];
100 
101  sync_word_6AA708[ndx] = 0xFFFF;
102  sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE;
103 }
104 
106 {
107  int i, m, ndx;
108  DWORD lru;
109 
110  ndx = -1;
111  lru = 0xFFFE;
112 
113  for (i = 0; i < nummonsters; i++) {
114  if (sgnMonsters >= nummonsters) {
115  sgnMonsters = 0;
116  }
118  if (sgwLRU[m] < lru) {
119  lru = sgwLRU[m];
120  ndx = monstactive[sgnMonsters];
121  }
122  sgnMonsters++;
123  }
124 
125  if (ndx == -1) {
126  return FALSE;
127  }
128 
129  sync_monster_pos(p, ndx);
130  return TRUE;
131 }
132 
134 {
135  int ii;
136  ItemStruct *pItem;
137 
138  if (numitems > 0) {
139  if (sgnSyncItem >= numitems) {
140  sgnSyncItem = 0;
141  }
142  ii = itemactive[sgnSyncItem++];
143  pHdr->bItemI = ii;
144  pHdr->bItemX = item[ii]._ix;
145  pHdr->bItemY = item[ii]._iy;
146  pHdr->wItemIndx = item[ii].IDidx;
147  if (item[ii].IDidx == IDI_EAR) {
148  pHdr->wItemCI = (item[ii]._iName[7] << 8) | item[ii]._iName[8];
149  pHdr->dwItemSeed = (item[ii]._iName[9] << 24) | (item[ii]._iName[10] << 16) | (item[ii]._iName[11] << 8) | item[ii]._iName[12];
150  pHdr->bItemId = item[ii]._iName[13];
151  pHdr->bItemDur = item[ii]._iName[14];
152  pHdr->bItemMDur = item[ii]._iName[15];
153  pHdr->bItemCh = item[ii]._iName[16];
154  pHdr->bItemMCh = item[ii]._iName[17];
155  pHdr->wItemVal = (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - 19) << 6) | item[ii]._ivalue;
156  pHdr->dwItemBuff = (item[ii]._iName[19] << 24) | (item[ii]._iName[20] << 16) | (item[ii]._iName[21] << 8) | item[ii]._iName[22];
157  } else {
158  pHdr->wItemCI = item[ii]._iCreateInfo;
159  pHdr->dwItemSeed = item[ii]._iSeed;
160  pHdr->bItemId = item[ii]._iIdentified;
161  pHdr->bItemDur = item[ii]._iDurability;
162  pHdr->bItemMDur = item[ii]._iMaxDur;
163  pHdr->bItemCh = item[ii]._iCharges;
164  pHdr->bItemMCh = item[ii]._iMaxCharges;
165  if (item[ii].IDidx == IDI_GOLD) {
166  pHdr->wItemVal = item[ii]._ivalue;
167  }
168  }
169  } else {
170  pHdr->bItemI = -1;
171  }
172 
174  pItem = &plr[myplr].InvBody[sgnSyncPInv];
175  if (pItem->_itype != ITYPE_NONE) {
176  pHdr->bPInvLoc = sgnSyncPInv;
177  pHdr->wPInvIndx = pItem->IDidx;
178  pHdr->wPInvCI = pItem->_iCreateInfo;
179  pHdr->dwPInvSeed = pItem->_iSeed;
180  pHdr->bPInvId = pItem->_iIdentified;
181  } else {
182  pHdr->bPInvLoc = -1;
183  }
184 
185  sgnSyncPInv++;
186  if (sgnSyncPInv >= NUM_INVLOC) {
187  sgnSyncPInv = 0;
188  }
189 }
190 
191 DWORD sync_update(int pnum, const BYTE *pbBuf)
192 {
193  TSyncHeader *pHdr;
194  WORD wLen;
195 
196  pHdr = (TSyncHeader *)pbBuf;
197  pbBuf += sizeof(*pHdr);
198 
199  if (pHdr->bCmd != CMD_SYNCDATA) {
200  app_fatal("bad sync command");
201  }
202 
204 
205  if (gbBufferMsgs == 1) {
206  return pHdr->wLen + sizeof(*pHdr);
207  }
208  if (pnum == myplr) {
209  return pHdr->wLen + sizeof(*pHdr);
210  }
211 
212  for (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) {
213  if (currlevel == pHdr->bLevel) {
214  sync_monster(pnum, (TSyncMonster *)pbBuf);
215  }
216  delta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel);
217  pbBuf += sizeof(TSyncMonster);
218  }
219 
221 
222  return pHdr->wLen + sizeof(*pHdr);
223 }
224 
225 void sync_monster(int pnum, const TSyncMonster *p)
226 {
227  int i, ndx, md, mdx, mdy;
228  DWORD delta;
229 
230  ndx = p->_mndx;
231 
232  if (monster[ndx]._mhitpoints == 0) {
233  return;
234  }
235 
236  for (i = 0; i < nummonsters; i++) {
237  if (monstactive[i] == ndx) {
238  break;
239  }
240  }
241 
242  delta = abs(plr[myplr].WorldX - monster[ndx]._mx) + abs(plr[myplr].WorldY - monster[ndx]._my);
243  if (delta > 255) {
244  delta = 255;
245  }
246 
247  if (delta < p->_mdelta || (delta == p->_mdelta && pnum > myplr)) {
248  return;
249  }
250  if (monster[ndx]._mfutx == p->_mx && monster[ndx]._mfuty == p->_my) {
251  return;
252  }
253  if (monster[ndx]._mmode == MM_CHARGE || monster[ndx]._mmode == MM_STONE) {
254  return;
255  }
256 
257  mdx = abs(monster[ndx]._mx - p->_mx);
258  mdy = abs(monster[ndx]._my - p->_my);
259  if (mdx <= 2 && mdy <= 2) {
260  if (monster[ndx]._mmode < MM_WALK || monster[ndx]._mmode > MM_WALK3) {
261  md = GetDirection(monster[ndx]._mx, monster[ndx]._my, p->_mx, p->_my);
262  if (DirOK(ndx, md)) {
263  M_ClearSquares(ndx);
264  dMonster[monster[ndx]._mx][monster[ndx]._my] = ndx + 1;
265  M_WalkDir(ndx, md);
266  monster[ndx]._msquelch = UCHAR_MAX;
267  }
268  }
269  } else if (dMonster[p->_mx][p->_my] == 0) {
270  M_ClearSquares(ndx);
271  dMonster[p->_mx][p->_my] = ndx + 1;
272  monster[ndx]._mx = p->_mx;
273  monster[ndx]._my = p->_my;
274  decode_enemy(ndx, p->_menemy);
275  md = GetDirection(p->_mx, p->_my, monster[ndx]._menemyx, monster[ndx]._menemyy);
276  M_StartStand(ndx, md);
277  monster[ndx]._msquelch = UCHAR_MAX;
278  }
279 
280  decode_enemy(ndx, p->_menemy);
281 }
282 
283 void sync_init()
284 {
285  sgnMonsters = 16 * myplr;
286  memset(sgwLRU, 255, sizeof(sgwLRU));
287 }
288 
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
TSyncHeader::bItemI
BYTE bItemI
Definition: structs.h:863
TSyncHeader
Definition: structs.h:857
TSyncHeader::wItemCI
WORD wItemCI
Definition: structs.h:867
ItemStruct::_iy
int _iy
Definition: structs.h:104
MM_WALK
@ MM_WALK
Definition: enums.h:2014
TSyncHeader::bPInvId
BYTE bPInvId
Definition: structs.h:880
SyncPlrInv
void SyncPlrInv(TSyncHeader *pHdr)
Definition: sync.cpp:133
TSyncHeader::wLen
WORD wLen
Definition: structs.h:860
sync_monster_active2
BOOL sync_monster_active2(TSyncMonster *p)
Definition: sync.cpp:105
currlevel
BYTE currlevel
Definition: gendung.cpp:40
ItemStruct::_ix
int _ix
Definition: structs.h:103
delta_sync_monster
void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel)
Definition: msg.cpp:336
NUM_INVLOC
@ NUM_INVLOC
Definition: enums.h:2796
gbBufferMsgs
BYTE gbBufferMsgs
Definition: msg.cpp:26
sync_one_monster
void sync_one_monster()
Definition: sync.cpp:54
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
TSyncHeader::wItemVal
WORD wItemVal
Definition: structs.h:874
GetDirection
int GetDirection(int x1, int y1, int x2, int y2)
Calculate the best fit direction between two points.
Definition: engine.cpp:683
ItemStruct::_itype
int _itype
Definition: structs.h:102
itemactive
DEVILUTION_BEGIN_NAMESPACE int itemactive[MAXITEMS]
Definition: items.cpp:10
TSyncHeader::bLevel
BYTE bLevel
Definition: structs.h:859
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
IDI_EAR
@ IDI_EAR
Definition: enums.h:2524
TSyncHeader::bItemId
BYTE bItemId
Definition: structs.h:869
TSyncHeader::bItemX
BYTE bItemX
Definition: structs.h:864
MonsterStruct::_mx
int _mx
Definition: structs.h:548
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
all.h
sync_word_6AA708
DEVILUTION_BEGIN_NAMESPACE WORD sync_word_6AA708[MAXMONSTERS]
Definition: sync.cpp:5
sgwLRU
WORD sgwLRU[MAXMONSTERS]
Definition: sync.cpp:7
TSyncHeader::bCmd
BYTE bCmd
Definition: structs.h:858
ItemStruct
Definition: structs.h:99
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
sync_init
void sync_init()
Definition: sync.cpp:283
TSyncHeader::bItemCh
BYTE bItemCh
Definition: structs.h:872
TSyncMonster::_mndx
BYTE _mndx
Definition: structs.h:884
sync_update
DWORD sync_update(int pnum, const BYTE *pbBuf)
Definition: sync.cpp:191
sync_all_monsters
DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen)
Definition: sync.cpp:11
app_fatal
void app_fatal(const char *pszFmt,...)
Definition: appfat.cpp:18
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
monster
MonsterStruct monster[MAXMONSTERS]
Definition: monster.cpp:19
sync_monster_pos
void sync_monster_pos(TSyncMonster *p, int ndx)
Definition: sync.cpp:93
M_WalkDir
void M_WalkDir(int i, int md)
Definition: monster.cpp:2652
MonsterStruct::_menemyx
unsigned char _menemyx
Definition: structs.h:560
TSyncHeader::dwItemBuff
DWORD dwItemBuff
Definition: structs.h:875
M_StartStand
void M_StartStand(int i, int md)
Definition: monster.cpp:1207
IDI_GOLD
@ IDI_GOLD
Definition: enums.h:2499
decode_enemy
void decode_enemy(int m, int enemy)
Definition: monster.cpp:5492
TSyncMonster
Definition: structs.h:883
CMD_SYNCDATA
@ CMD_SYNCDATA
Definition: enums.h:2206
TSyncHeader::wPInvCI
WORD wPInvCI
Definition: structs.h:878
MonsterStruct::_menemyy
unsigned char _menemyy
Definition: structs.h:561
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
TSyncHeader::bItemMCh
BYTE bItemMCh
Definition: structs.h:873
ItemStruct::_iName
char _iName[64]
Definition: structs.h:116
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
TSyncMonster::_menemy
BYTE _menemy
Definition: structs.h:887
numitems
int numitems
Definition: items.cpp:19
TSyncMonster::_my
BYTE _my
Definition: structs.h:886
M_ClearSquares
void M_ClearSquares(int i)
Definition: monster.cpp:1412
monstactive
int monstactive[MAXMONSTERS]
Definition: monster.cpp:16
MonsterStruct::_msquelch
BYTE _msquelch
Definition: structs.h:584
TSyncHeader::dwPInvSeed
DWORD dwPInvSeed
Definition: structs.h:879
nummonsters
int nummonsters
Definition: monster.cpp:17
TSyncMonster::_mdelta
BYTE _mdelta
Definition: structs.h:888
sgnSyncPInv
int sgnSyncPInv
Definition: sync.cpp:9
TSyncMonster::_mx
BYTE _mx
Definition: structs.h:885
PlayerStruct::InvBody
ItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:313
TSyncHeader::bItemMDur
BYTE bItemMDur
Definition: structs.h:871
MM_STONE
@ MM_STONE
Definition: enums.h:2028
ItemStruct::IDidx
int IDidx
Definition: structs.h:170
sync_monster
void sync_monster(int pnum, const TSyncMonster *p)
Definition: sync.cpp:225
myplr
int myplr
Definition: player.cpp:9
TSyncHeader::bPInvLoc
BYTE bPInvLoc
Definition: structs.h:876
sync_monster_active
BOOL sync_monster_active(TSyncMonster *p)
Definition: sync.cpp:69
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
DirOK
BOOL DirOK(int i, int mdir)
Definition: monster.cpp:4634
TSyncHeader::dwItemSeed
DWORD dwItemSeed
Definition: structs.h:868
dMonster
int dMonster[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:17
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
MonsterStruct::_mfuty
int _mfuty
Definition: structs.h:551
TSyncMonster
struct TSyncMonster TSyncMonster
TSyncHeader::wItemIndx
WORD wItemIndx
Definition: structs.h:866
TSyncHeader::bItemY
BYTE bItemY
Definition: structs.h:865
TSyncHeader::bItemDur
BYTE bItemDur
Definition: structs.h:870
MonsterStruct::_my
int _my
Definition: structs.h:549
MAXMONSTERS
#define MAXMONSTERS
Definition: defs.h:31
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
TSyncHeader::wPInvIndx
WORD wPInvIndx
Definition: structs.h:877
encode_enemy
int encode_enemy(int m)
Definition: monster.cpp:5484
MM_CHARGE
@ MM_CHARGE
Definition: enums.h:2027
sgnSyncItem
int sgnSyncItem
Definition: sync.cpp:8
sgnMonsters
int sgnMonsters
Definition: sync.cpp:6
ItemStruct::_iCreateInfo
WORD _iCreateInfo
Definition: structs.h:101
MM_WALK3
@ MM_WALK3
Definition: enums.h:2016