Devilution
Diablo devolved - magic behind the 1996 computer game
|
Go to the documentation of this file.
7 #include "../3rdParty/Storm/Source/storm.h"
8 #include "../DiabloUI/diabloui.h"
55 memcpy((
char *)&packeta[1] - packeta->
dwSpaceLeft, packet, dwSize);
68 while (result->
pNext) {
69 result = result->
pNext;
98 DrawDlg(
"Unable to get level data");
122 if (!SNetGetOwnerTurnsWaiting(&turns) && SErrGetLastError() == STORM_ERROR_NOT_IN_GAME)
161 int spaceLeft, pktSize;
167 for (i = -1; pkt; pkt = pkt->
pNext) {
175 spaceLeft -=
sizeof(*cmd);
179 spaceLeft -=
sizeof(*dropCmd);
184 spaceLeft -= pktSize;
221 if (src->
bCmd == 0xFF) {
245 if (*(BYTE *)src == 0xFF) {
270 memcpy(dst, pD,
sizeof(*pD));
281 memcpy(dst, mq,
sizeof(*mq));
294 size = end - buffer - 1;
296 *buffer = size != pkSize;
420 for (i = 0; i <
MAXITEMS; i++, pD++) {
431 for (i = 0; i <
MAXITEMS; i++, pD++) {
432 if (pD->
bCmd == 0xFF) {
568 for (k = 1; k < 50 && !done; k++) {
569 for (j = -k; j <= k && !done; j++) {
571 for (l = -k; l <= k && !done; l++) {
584 dItem[x][y] = ii + 1;
682 void NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)
703 cmd.wParam1 = wParam1;
798 memcpy(&cmd, p,
sizeof(cmd));
809 ticks = SDL_GetTicks();
812 }
else if (ticks - cmd.
dwTime > 5000) {
824 memcpy(&cmd, p,
sizeof(cmd));
829 ticks = SDL_GetTicks();
832 }
else if (ticks - cmd.
dwTime > 5000) {
845 memcpy(&cmd, p,
sizeof(cmd));
970 dwStrLen = strlen(pszStr);
972 strcpy(cmd.
str, pszStr);
988 switch (pCmd->
bCmd) {
1140 SNetDropPlayer(pnum, 0x40000006);
1159 return p->
wBytes +
sizeof(*p);
1165 return p->
wBytes +
sizeof(*p);
1170 return p->
wBytes +
sizeof(*p);
1177 return p->
wBytes +
sizeof(*p);
1187 return p->
wBytes +
sizeof(*p);
1369 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1377 static DWORD msg_err_timer;
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);
1432 if (
plr[i].plractive
1433 && !
plr[i]._pLvlChanging
1434 &&
plr[i].plrlevel == nReqLevel
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);
1480 for (i = 0; i <
MAXITEMS; i++, pD++) {
1502 if (((pI->
wCI >> 8) & 0x80) == 0)
1505 for (i = 0; i <
MAXITEMS; i++, pD++) {
1506 if (pD->
bCmd == 0xFF) {
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);
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);
1642 for (i = 0; i <
MAXITEMS; i++, pD++) {
1650 app_fatal(
"Trying to drop a floor item?");
1655 for (i = 0; i <
MAXITEMS; i++, pD++) {
1656 if (pD->
bCmd == 0xFF) {
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);
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);
1771 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1792 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1813 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1824 if (
object[p->
wParam1]._oSolidFlag ||
object[p->
wParam1]._oDoorFlag)
1840 if (
object[p->
wParam1]._oSolidFlag ||
object[p->
wParam1]._oDoorFlag)
1870 if (distx > 1 || disty > 1)
1932 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1952 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1972 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
1992 msg_errorf(
"%s has cast an illegal spell.",
plr[pnum]._pName);
2053 else if (pnum !=
myplr)
2082 else if (pnum !=
myplr) {
2097 else if (pnum !=
myplr) {
2114 else if (pnum !=
myplr) {
2117 BOOL addGolem = TRUE;
2138 else if (pnum !=
myplr) {
2160 else if (pnum !=
myplr)
2174 if ((
plr[
myplr]._pHitPoints >> 6) > 0) {
2182 if ((
plr[
myplr]._pHitPoints >> 6) <= 0)
2280 else if (pnum !=
myplr)
2292 else if (pnum !=
myplr)
2331 return p->
wBytes +
sizeof(*p);
2347 if (
plr[pnum]._pName[0] && !
plr[pnum].plractive) {
2350 EventPlrMsg(
"Player '%s' (level %d) just joined the game",
plr[pnum]._pName,
plr[pnum]._pLevel);
2353 if (
plr[pnum].plractive &&
myplr != pnum) {
2361 if ((
plr[pnum]._pHitPoints >> 6) > 0)
2390 if (pnum !=
myplr) {
2395 BOOL addPortal = TRUE;
2435 return sizeof(*pCmd);
2443 if (pnum ==
myplr) {
2450 return sizeof(*pCmd);
2510 int len = strlen(p->
str);
2546 return sizeof(*pCmd);
2559 return sizeof(*pCmd);
2570 return sizeof(*pCmd);
2575 return sizeof(*pCmd);
2600 return sizeof(*pCmd);
2608 return sizeof(*pCmd);
void InvGetItem(int pnum, int ii)
struct DMonsterStr DMonsterStr
DWORD On_HEALOTHER(TCmd *pCmd, int pnum)
static LocalLevel sgLocals[NUMLEVELS]
DWORD On_RATTACKID(TCmd *pCmd, int pnum)
static BYTE sgRecvBuf[sizeof(DLevel)+1]
MultiQuests quests[MAXMULTIQUESTS]
DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum)
void AddDead(int dx, int dy, char dv, int ddir)
QuestStruct quests[MAXQUESTS]
DWORD On_REQUESTAGITEM(TCmd *pCmd, int pnum)
DWORD On_PLRLEVEL(TCmd *pCmd, int pnum)
BYTE * DeltaImportMonster(BYTE *src, DMonsterStr *dst)
DWORD On_SYNCDATA(TCmd *pCmd, int pnum)
void SetPlrDex(int p, int v)
static int sgnCurrMegaPlayer
void delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)
static DEVILUTION_BEGIN_NAMESPACE DWORD sgdwOwnerWait
void PkwareDecompress(void *param, int recv_size, int dwMaxBytes)
DWORD On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum)
void NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)
DWORD On_SPELLXY(TCmd *pCmd, int pnum)
DWORD On_RESPAWNITEM(TCmd *pCmd, int pnum)
void M_UpdateLeader(int i)
void delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel)
DWORD On_GETITEM(TCmd *pCmd, int pnum)
DWORD On_SETVIT(TCmd *pCmd, int pnum)
DObjectStr object[MAXOBJECTS]
static TMegaPkt * sgpCurrPkt
DWORD On_RETOWN(TCmd *pCmd, int pnum)
void M_GetKnockback(int i)
WORD sgwPackPlrOffsetTbl[MAX_PLRS]
BOOL delta_quest_inited(int i)
void PutItemRecord(int nSeed, WORD wCI, int nIndex)
void msg_send_packet(int pnum, const void *packet, DWORD dwSize)
void NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)
DWORD On_ACK_PLRINFO(TCmd *pCmd, int pnum)
static BYTE sgbDeltaChunks
void MakePlrPath(int pnum, int xx, int yy, BOOL endspace)
void DoHealOther(int pnum, int rid)
DWORD On_ADDDEX(TCmd *pCmd, int pnum)
DWORD On_OPERATEOBJ(TCmd *pCmd, int pnum)
ItemStruct item[MAXITEMS+1]
DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)
DWORD On_ENDSHIELD(TCmd *pCmd, int pnum)
BOOL delta_portal_inited(int i)
DWORD On_DELPLRITEMS(TCmd *pCmd, int pnum)
void NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)
void check_update_plr(int pnum)
DEVILUTION_BEGIN_NAMESPACE int itemactive[MAXITEMS]
MissileStruct missile[MAXMISSILES]
DWORD On_TSPELLXY(TCmd *pCmd, int pnum)
DWORD On_SETMAG(TCmd *pCmd, int pnum)
static TMegaPkt * sgpMegaPkt
void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen)
BYTE * DeltaExportJunk(BYTE *dst)
void NetSendCmdString(int pmask, const char *pszStr)
void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)
DWORD On_STRING2(int pnum, TCmd *pCmd)
DWORD On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum)
DWORD On_DROPITEM(TCmd *pCmd, int pnum)
void ClrPlrPath(int pnum)
void NetSendCmdExtra(TCmdGItem *p)
void NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii)
void pfile_update(BOOL force_save)
DWORD On_DLEVEL(int pnum, TCmd *pCmd)
void delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)
void SyncPlrKill(int pnum, int earflag)
DWORD On_PLROPOBJ(TCmd *pCmd, int pnum)
void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)
void msg_get_next_packet()
static BOOLEAN sgbDeltaChanged
DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum)
void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)
void NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam)
void DeleteItem(int ii, int i)
DWORD On_OPOBJT(TCmd *pCmd, int pnum)
void RespawnItem(int i, BOOL FlipFlag)
DWORD On_OPENDOOR(TCmd *pCmd, int pnum)
void ModifyPlrDex(int p, int l)
void NetSendCmdGItem2(BOOL usonly, BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
void NetSendCmdDItem(BOOL bHiPri, int ii)
void ClearMissileSpot(int mi)
DEVILUTION_BEGIN_NAMESPACE SpellData spelldata[]
Data related to each spell ID.
DWORD On_ACTIVATEPORTAL(TCmd *pCmd, int pnum)
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
void SetMultiQuest(int q, int s, int l, int v1)
void NetSendCmdQuest(BOOL bHiPri, BYTE q)
DWORD On_DEBUG(TCmd *pCmd, int pnum)
void SetItemRecord(int nSeed, WORD wCI, int nIndex)
void multi_msg_add(BYTE *pbMsg, BYTE bLen)
void recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv)
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)
BOOLEAN _pLvlVisited[NUMLEVELS]
struct TCmdPItem TCmdPItem
DWORD On_ADDMAG(TCmd *pCmd, int pnum)
int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl)
DWORD On_TSPELLPID(TCmd *pCmd, int pnum)
void NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width)
char str[MAX_SEND_STR_LEN]
DWORD On_ADDVIT(TCmd *pCmd, int pnum)
void DeltaExportData(int pnum)
void SyncGetItem(int x, int y, int idx, WORD ci, int iseed)
BYTE * DeltaImportItem(BYTE *src, TCmdPItem *dst)
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
BYTE * DeltaExportItem(BYTE *dst, TCmdPItem *src)
DWORD On_PLRDAMAGE(TCmd *pCmd, int pnum)
void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
struct DObjectStr DObjectStr
void M_SyncStartKill(int i, int x, int y, int pnum)
DWORD sync_update(int pnum, const BYTE *pbBuf)
void ModifyPlrMag(int p, int l)
void NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)
void DeactivatePortal(int i)
void SyncInitPlr(int pnum)
DWORD On_BREAKOBJ(TCmd *pCmd, int pnum)
void app_fatal(const char *pszFmt,...)
DWORD On_CLOSEDOOR(TCmd *pCmd, int pnum)
#define DEVILUTION_END_NAMESPACE
BYTE * DeltaExportObject(BYTE *dst, DObjectStr *src)
DWORD On_ATTACKXY(TCmd *pCmd, int pnum)
BOOL nthread_has_500ms_passed(BOOL unused)
void RestartTownLvl(int pnum)
MonsterStruct monster[MAXMONSTERS]
DWORD On_NEWLVL(TCmd *pCmd, int pnum)
int FindGetItem(int idx, WORD ci, int iseed)
void delta_close_portal(int pnum)
void DeltaAddItem(int ii)
char * ErrorPlrMsg(const char *pszMsg)
void AutoGetItem(int pnum, int ii)
void StartStand(int pnum, int dir)
DWORD On_ADDSTR(TCmd *pCmd, int pnum)
void ModifyPlrStr(int p, int l)
void NextPlrLevel(int pnum)
DWORD On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)
DWORD On_RATTACKXY(TCmd *pCmd, int pnum)
char dItem[MAXDUNX][MAXDUNY]
void SetPlrMag(int p, int v)
void DeleteMissile(int mi, int i)
struct MultiQuests MultiQuests
void M_StartStand(int i, int md)
int objectactive[MAXOBJECTS]
DWORD On_SPELLPID(TCmd *pCmd, int pnum)
BOOL PortalOnLevel(int i)
void StartPlayerKill(int pnum, int earflag)
void decode_enemy(int m, int enemy)
DEVILUTION_BEGIN_NAMESPACE int missileactive[MAXMISSILES]
void AddInTownPortal(int i)
int GetRndSeed()
Get the current RNG seed.
int AddVision(int x, int y, int r, BOOL mine)
void DeltaImportJunk(BYTE *src)
BOOL i_own_level(int nReqLevel)
DWORD On_SEND_PLRINFO(TCmd *pCmd, int pnum)
void inv_update_rem_item(int pnum, BYTE iv)
void DoResurrect(int pnum, int rid)
DWORD On_SETSHIELD(TCmd *pCmd, int pnum)
void NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)
void SetPlrStr(int p, int v)
BOOL NetSendCmdReq2(BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)
BOOL CanPut(int x, int y)
void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
void SetPortalStats(int i, BOOL o, int x, int y, int lvl, int lvltype)
void nthread_set_turn_upper_bit()
DWORD On_RESURRECT(TCmd *pCmd, int pnum)
void SyncOpObject(int pnum, int cmd, int i)
DWORD On_PLRDEAD(TCmd *pCmd, int pnum)
BOOLEAN automapview[DMAXX][DMAXY]
Tracks the explored areas of the map.
void NetSendCmd(BOOL bHiPri, BYTE bCmd)
DWORD On_ITEMEXTRA(TCmd *pCmd, int pnum)
DWORD On_WARP(TCmd *pCmd, int pnum)
DWORD On_DISARMXY(TCmd *pCmd, int pnum)
void M_ClearSquares(int i)
DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum)
BOOL nthread_recv_turns(BOOL *pfSendAsync)
DWORD On_WALKXY(TCmd *pCmd, int pnum)
int monstactive[MAXMONSTERS]
QuestData questlist[MAXQUESTS]
DWORD On_TSPELLID(TCmd *pCmd, int pnum)
DWORD glSeedTbl[NUMLEVELS]
DMonsterStr monster[MAXMONSTERS]
DWORD On_CHANGEPLRITEMS(TCmd *pCmd, int pnum)
BYTE * DiabloAllocPtr(DWORD dwBytes)
Multithreaded safe malloc.
DWORD On_SPELLID(TCmd *pCmd, int pnum)
DWORD On_REMSHIELD(TCmd *pCmd, int pnum)
DWORD On_KILLGOLEM(TCmd *pCmd, int pnum)
DWORD On_OPOBJXY(TCmd *pCmd, int pnum)
void M_StartHit(int i, int pnum, int dam)
size_t EventPlrMsg(const char *pszFmt,...)
DWORD On_SPELLXYD(TCmd *pCmd, int pnum)
DWORD On_STRING(TCmd *pCmd, int pnum)
void delta_monster_hp(int mi, int hp, BYTE bLevel)
DWORD On_SETSTR(TCmd *pCmd, int pnum)
DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum)
void multi_player_left(int pnum, int reason)
void NetSendLoPri(BYTE *pbMsg, BYTE bLen)
void mem_free_dbg(void *p)
Multithreaded safe memfree.
BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex)
BYTE * DeltaImportObject(BYTE *src, DObjectStr *dst)
DWORD On_ATTACKID(TCmd *pCmd, int pnum)
DWORD On_TALKXY(TCmd *pCmd, int pnum)
DWORD On_REQUESTGITEM(TCmd *pCmd, int pnum)
static DLevel sgLevels[NUMLEVELS]
void StartNewLvl(int pnum, int fom, int lvl)
int dMonster[MAXDUNX][MAXDUNY]
void RemovePortalMissile(int id)
void NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)
int msg_comp_level(BYTE *buffer, BYTE *end)
void NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)
DWORD On_KNOCKBACK(TCmd *pCmd, int pnum)
void SendPlrMsg(int pnum, const char *pszStr)
DWORD On_AGETITEM(TCmd *pCmd, int pnum)
static DWORD sgdwRecvOffset
DWORD On_SATTACKXY(TCmd *pCmd, int pnum)
int PkwareCompress(void *buf, int size)
void ActivatePortal(int i, int x, int y, int lvl, int lvltype, BOOL sp)
DWORD On_GOTOGETITEM(TCmd *pCmd, int pnum)
void DrawDlg(char *pszFmt,...)
DWORD On_RATTACKPID(TCmd *pCmd, int pnum)
void NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl)
DWORD On_ATTACKPID(TCmd *pCmd, int pnum)
char dFlags[MAXDUNX][MAXDUNY]
void DeltaImportData(BYTE cmd, DWORD recv_offset)
void NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
DWORD ParseCmd(int pnum, TCmd *pCmd)
void delta_leave_sync(BYTE bLevel)
DWORD On_MONSTDEATH(TCmd *pCmd, int pnum)
DWORD On_SYNCQUEST(TCmd *pCmd, int pnum)
BOOL delta_get_item(TCmdGItem *pI, BYTE bLevel)
void multi_process_network_packets()
void RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff)
void delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)
int InvPutItem(int pnum, int x, int y)
void SetPlrVit(int p, int v)
DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum)
PlayerStruct plr[MAX_PLRS]
DWORD On_PUTITEM(TCmd *pCmd, int pnum)
void msg_send_drop_pkt(int pnum, int reason)
void AddWarpMissile(int i, int x, int y)
void delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)
DWORD On_NOVA(TCmd *pCmd, int pnum)
DWORD On_SBSPELL(TCmd *pCmd, int pnum)
void LoadPlrGFX(int pnum, player_graphic gfxflag)
void SyncBreakObj(int pnum, int oi)
void msg_errorf(const char *pszFmt,...)
DPortal portal[MAXPORTAL]
BYTE * DeltaExportMonster(BYTE *dst, DMonsterStr *src)
void ModifyPlrVit(int p, int l)
DWORD On_SETDEX(TCmd *pCmd, int pnum)
void NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
void StartWarpLvl(int pnum, int pidx)