|
|
|
|
@ -11,50 +11,7 @@ WORD sgwLRU[MAXMONSTERS];
|
|
|
|
|
int sgnSyncItem; |
|
|
|
|
int sgnSyncPInv; |
|
|
|
|
|
|
|
|
|
DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen) |
|
|
|
|
{ |
|
|
|
|
TSyncHeader *pHdr; |
|
|
|
|
int i; |
|
|
|
|
BOOL sync; |
|
|
|
|
|
|
|
|
|
if (nummonsters < 1) { |
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
if (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) { |
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pHdr = (TSyncHeader *)pbBuf; |
|
|
|
|
pbBuf += sizeof(*pHdr); |
|
|
|
|
dwMaxLen -= sizeof(*pHdr); |
|
|
|
|
|
|
|
|
|
pHdr->bCmd = CMD_SYNCDATA; |
|
|
|
|
pHdr->bLevel = currlevel; |
|
|
|
|
pHdr->wLen = 0; |
|
|
|
|
SyncPlrInv(pHdr); |
|
|
|
|
assert(dwMaxLen <= 0xffff); |
|
|
|
|
sync_one_monster(); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) { |
|
|
|
|
sync = FALSE; |
|
|
|
|
if (i < 2) { |
|
|
|
|
sync = sync_monster_active2((TSyncMonster *)pbBuf); |
|
|
|
|
} |
|
|
|
|
if (!sync) { |
|
|
|
|
sync = sync_monster_active((TSyncMonster *)pbBuf); |
|
|
|
|
} |
|
|
|
|
if (!sync) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
pbBuf += sizeof(TSyncMonster); |
|
|
|
|
pHdr->wLen += sizeof(TSyncMonster); |
|
|
|
|
dwMaxLen -= sizeof(TSyncMonster); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void sync_one_monster() |
|
|
|
|
static void sync_one_monster() |
|
|
|
|
{ |
|
|
|
|
int i, m; |
|
|
|
|
|
|
|
|
|
@ -69,7 +26,19 @@ void sync_one_monster()
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOL sync_monster_active(TSyncMonster *p) |
|
|
|
|
static void sync_monster_pos(TSyncMonster *p, int ndx) |
|
|
|
|
{ |
|
|
|
|
p->_mndx = ndx; |
|
|
|
|
p->_mx = monster[ndx]._mx; |
|
|
|
|
p->_my = monster[ndx]._my; |
|
|
|
|
p->_menemy = encode_enemy(ndx); |
|
|
|
|
p->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx]; |
|
|
|
|
|
|
|
|
|
sync_word_6AA708[ndx] = 0xFFFF; |
|
|
|
|
sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static BOOL sync_monster_active(TSyncMonster *p) |
|
|
|
|
{ |
|
|
|
|
int i, m, ndx; |
|
|
|
|
DWORD lru; |
|
|
|
|
@ -93,19 +62,7 @@ BOOL sync_monster_active(TSyncMonster *p)
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void sync_monster_pos(TSyncMonster *p, int ndx) |
|
|
|
|
{ |
|
|
|
|
p->_mndx = ndx; |
|
|
|
|
p->_mx = monster[ndx]._mx; |
|
|
|
|
p->_my = monster[ndx]._my; |
|
|
|
|
p->_menemy = encode_enemy(ndx); |
|
|
|
|
p->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx]; |
|
|
|
|
|
|
|
|
|
sync_word_6AA708[ndx] = 0xFFFF; |
|
|
|
|
sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOL sync_monster_active2(TSyncMonster *p) |
|
|
|
|
static BOOL sync_monster_active2(TSyncMonster *p) |
|
|
|
|
{ |
|
|
|
|
int i, m, ndx; |
|
|
|
|
DWORD lru; |
|
|
|
|
@ -133,7 +90,7 @@ BOOL sync_monster_active2(TSyncMonster *p)
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void SyncPlrInv(TSyncHeader *pHdr) |
|
|
|
|
static void SyncPlrInv(TSyncHeader *pHdr) |
|
|
|
|
{ |
|
|
|
|
int ii; |
|
|
|
|
ItemStruct *pItem; |
|
|
|
|
@ -191,41 +148,50 @@ void SyncPlrInv(TSyncHeader *pHdr)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DWORD sync_update(int pnum, const BYTE *pbBuf) |
|
|
|
|
DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen) |
|
|
|
|
{ |
|
|
|
|
TSyncHeader *pHdr; |
|
|
|
|
WORD wLen; |
|
|
|
|
|
|
|
|
|
pHdr = (TSyncHeader *)pbBuf; |
|
|
|
|
pbBuf += sizeof(*pHdr); |
|
|
|
|
int i; |
|
|
|
|
BOOL sync; |
|
|
|
|
|
|
|
|
|
if (pHdr->bCmd != CMD_SYNCDATA) { |
|
|
|
|
app_fatal("bad sync command"); |
|
|
|
|
if (nummonsters < 1) { |
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
if (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) { |
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// ASSERT: assert(gbBufferMsgs != BUFFER_PROCESS);
|
|
|
|
|
pHdr = (TSyncHeader *)pbBuf; |
|
|
|
|
pbBuf += sizeof(*pHdr); |
|
|
|
|
dwMaxLen -= sizeof(*pHdr); |
|
|
|
|
|
|
|
|
|
if (gbBufferMsgs == 1) { |
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
} |
|
|
|
|
if (pnum == myplr) { |
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
} |
|
|
|
|
pHdr->bCmd = CMD_SYNCDATA; |
|
|
|
|
pHdr->bLevel = currlevel; |
|
|
|
|
pHdr->wLen = 0; |
|
|
|
|
SyncPlrInv(pHdr); |
|
|
|
|
assert(dwMaxLen <= 0xffff); |
|
|
|
|
sync_one_monster(); |
|
|
|
|
|
|
|
|
|
for (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) { |
|
|
|
|
if (currlevel == pHdr->bLevel) { |
|
|
|
|
sync_monster(pnum, (TSyncMonster *)pbBuf); |
|
|
|
|
for (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) { |
|
|
|
|
sync = FALSE; |
|
|
|
|
if (i < 2) { |
|
|
|
|
sync = sync_monster_active2((TSyncMonster *)pbBuf); |
|
|
|
|
} |
|
|
|
|
if (!sync) { |
|
|
|
|
sync = sync_monster_active((TSyncMonster *)pbBuf); |
|
|
|
|
} |
|
|
|
|
if (!sync) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
delta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel); |
|
|
|
|
pbBuf += sizeof(TSyncMonster); |
|
|
|
|
pHdr->wLen += sizeof(TSyncMonster); |
|
|
|
|
dwMaxLen -= sizeof(TSyncMonster); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assert(wLen == 0); |
|
|
|
|
|
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
return dwMaxLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void sync_monster(int pnum, const TSyncMonster *p) |
|
|
|
|
static void sync_monster(int pnum, const TSyncMonster *p) |
|
|
|
|
{ |
|
|
|
|
int i, ndx, md, mdx, mdy; |
|
|
|
|
DWORD delta; |
|
|
|
|
@ -287,6 +253,40 @@ void sync_monster(int pnum, const TSyncMonster *p)
|
|
|
|
|
decode_enemy(ndx, p->_menemy); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DWORD sync_update(int pnum, const BYTE *pbBuf) |
|
|
|
|
{ |
|
|
|
|
TSyncHeader *pHdr; |
|
|
|
|
WORD wLen; |
|
|
|
|
|
|
|
|
|
pHdr = (TSyncHeader *)pbBuf; |
|
|
|
|
pbBuf += sizeof(*pHdr); |
|
|
|
|
|
|
|
|
|
if (pHdr->bCmd != CMD_SYNCDATA) { |
|
|
|
|
app_fatal("bad sync command"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// ASSERT: assert(gbBufferMsgs != BUFFER_PROCESS);
|
|
|
|
|
|
|
|
|
|
if (gbBufferMsgs == 1) { |
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
} |
|
|
|
|
if (pnum == myplr) { |
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) { |
|
|
|
|
if (currlevel == pHdr->bLevel) { |
|
|
|
|
sync_monster(pnum, (TSyncMonster *)pbBuf); |
|
|
|
|
} |
|
|
|
|
delta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel); |
|
|
|
|
pbBuf += sizeof(TSyncMonster); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
assert(wLen == 0); |
|
|
|
|
|
|
|
|
|
return pHdr->wLen + sizeof(*pHdr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void sync_init() |
|
|
|
|
{ |
|
|
|
|
sgnMonsters = 16 * myplr; |
|
|
|
|
|