devilutionX/Source/msg.h
ephphatha baa1cd65c5 Make FindGetItem return an index into ActiveItems
This allows the calling code in DeltaLoadLevel to behave the same as every other use of DeleteItem, making it possible to remove the duplicate argument and ensure that the ActiveItems/AvailableItems arrays are treated appropriately.
2021-11-23 19:08:41 +01:00

472 lines
8.8 KiB
C++

/**
* @file msg.h
*
* Interface of function for sending and reciving network messages.
*/
#pragma once
#include <cstdint>
#include "engine/point.hpp"
#include "items.h"
#include "monster.h"
#include "objects.h"
#include "portal.h"
#include "quests.h"
namespace devilution {
#define MAX_SEND_STR_LEN 80
#define MAXMULTIQUESTS 10
enum _cmd_id : uint8_t {
CMD_STAND,
CMD_WALKXY,
CMD_ACK_PLRINFO,
CMD_ADDSTR,
CMD_ADDMAG,
CMD_ADDDEX,
CMD_ADDVIT,
CMD_GETITEM,
CMD_AGETITEM,
CMD_PUTITEM,
CMD_RESPAWNITEM,
CMD_ATTACKXY,
CMD_RATTACKXY,
CMD_SPELLXY,
CMD_TSPELLXY,
CMD_OPOBJXY,
CMD_DISARMXY,
CMD_ATTACKID,
CMD_ATTACKPID,
CMD_RATTACKID,
CMD_RATTACKPID,
CMD_SPELLID,
CMD_SPELLPID,
CMD_TSPELLID,
CMD_TSPELLPID,
CMD_RESURRECT,
CMD_OPOBJT,
CMD_KNOCKBACK,
CMD_TALKXY,
CMD_NEWLVL,
CMD_WARP,
CMD_CHEAT_EXPERIENCE,
CMD_CHEAT_SPELL_LEVEL,
CMD_DEBUG,
CMD_SYNCDATA,
CMD_MONSTDEATH,
CMD_MONSTDAMAGE,
CMD_PLRDEAD,
CMD_REQUESTGITEM,
CMD_REQUESTAGITEM,
CMD_GOTOGETITEM,
CMD_GOTOAGETITEM,
CMD_OPENDOOR,
CMD_CLOSEDOOR,
CMD_OPERATEOBJ,
CMD_PLROPOBJ,
CMD_BREAKOBJ,
CMD_CHANGEPLRITEMS,
CMD_DELPLRITEMS,
CMD_PLRDAMAGE,
CMD_PLRLEVEL,
CMD_DROPITEM,
CMD_PLAYER_JOINLEVEL,
CMD_SEND_PLRINFO,
CMD_SATTACKXY,
CMD_ACTIVATEPORTAL,
CMD_DEACTIVATEPORTAL,
CMD_DLEVEL_0,
CMD_DLEVEL_1,
CMD_DLEVEL_2,
CMD_DLEVEL_3,
CMD_DLEVEL_4,
CMD_DLEVEL_5,
CMD_DLEVEL_6,
CMD_DLEVEL_7,
CMD_DLEVEL_8,
CMD_DLEVEL_9,
CMD_DLEVEL_10,
CMD_DLEVEL_11,
CMD_DLEVEL_12,
CMD_DLEVEL_13,
CMD_DLEVEL_14,
CMD_DLEVEL_15,
CMD_DLEVEL_16,
CMD_DLEVEL_17,
CMD_DLEVEL_18,
CMD_DLEVEL_19,
CMD_DLEVEL_20,
CMD_DLEVEL_21,
CMD_DLEVEL_22,
CMD_DLEVEL_23,
CMD_DLEVEL_24,
CMD_DLEVEL_JUNK,
CMD_DLEVEL_END,
CMD_HEALOTHER,
CMD_STRING,
CMD_SETSTR,
CMD_SETMAG,
CMD_SETDEX,
CMD_SETVIT,
CMD_RETOWN,
CMD_SPELLXYD,
CMD_ITEMEXTRA,
CMD_SYNCPUTITEM,
CMD_KILLGOLEM,
CMD_SYNCQUEST,
CMD_AWAKEGOLEM,
CMD_NOVA,
CMD_SETSHIELD,
CMD_REMSHIELD,
CMD_SETREFLECT,
CMD_NAKRUL,
CMD_OPENHIVE,
CMD_OPENCRYPT,
FAKE_CMD_SETID,
FAKE_CMD_DROPID,
NUM_CMDS,
CMD_INVALID = 0xFF,
};
#pragma pack(push, 1)
struct TCmd {
_cmd_id bCmd;
};
struct TCmdLoc {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
};
struct TCmdLocParam1 {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
uint16_t wParam1;
};
struct TCmdLocParam2 {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
uint16_t wParam1;
uint16_t wParam2;
};
struct TCmdLocParam3 {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
uint16_t wParam1;
uint16_t wParam2;
uint16_t wParam3;
};
struct TCmdLocParam4 {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
uint16_t wParam1;
uint16_t wParam2;
uint16_t wParam3;
uint16_t wParam4;
};
struct TCmdParam1 {
_cmd_id bCmd;
uint16_t wParam1;
};
struct TCmdParam2 {
_cmd_id bCmd;
uint16_t wParam1;
uint16_t wParam2;
};
struct TCmdParam3 {
_cmd_id bCmd;
uint16_t wParam1;
uint16_t wParam2;
uint16_t wParam3;
};
struct TCmdParam4 {
_cmd_id bCmd;
uint16_t wParam1;
uint16_t wParam2;
uint16_t wParam3;
uint16_t wParam4;
};
struct TCmdGolem {
_cmd_id bCmd;
uint8_t _mx;
uint8_t _my;
Direction _mdir;
int8_t _menemy;
int32_t _mhitpoints;
uint8_t _currlevel;
};
struct TCmdQuest {
_cmd_id bCmd;
int8_t q;
quest_state qstate;
uint8_t qlog;
uint8_t qvar1;
};
/**
* Represents an item being picked up from the ground
*/
struct TCmdGItem {
_cmd_id bCmd;
uint8_t bMaster;
uint8_t bPnum;
uint8_t bCursitem;
uint8_t bLevel;
uint8_t x;
uint8_t y;
_item_indexes wIndx;
uint16_t wCI;
int32_t dwSeed;
uint8_t bId;
uint8_t bDur;
uint8_t bMDur;
uint8_t bCh;
uint8_t bMCh;
uint16_t wValue;
uint32_t dwBuff;
int32_t dwTime;
uint16_t wToHit;
uint16_t wMaxDam;
uint8_t bMinStr;
uint8_t bMinMag;
uint8_t bMinDex;
int16_t bAC;
};
/**
* Represents an item being dropped onto the ground
*/
struct TCmdPItem {
_cmd_id bCmd;
uint8_t x;
uint8_t y;
_item_indexes wIndx;
uint16_t wCI;
/**
* Item identifier
* @see Item::_iSeed
*/
int32_t dwSeed;
uint8_t bId;
uint8_t bDur;
uint8_t bMDur;
uint8_t bCh;
uint8_t bMCh;
uint16_t wValue;
uint32_t dwBuff;
uint16_t wToHit;
uint16_t wMaxDam;
uint8_t bMinStr;
uint8_t bMinMag;
uint8_t bMinDex;
int16_t bAC;
};
struct TCmdChItem {
_cmd_id bCmd;
uint8_t bLoc;
uint16_t wIndx;
uint16_t wCI;
int32_t dwSeed;
uint8_t bId;
uint32_t dwBuff;
};
struct TCmdDelItem {
_cmd_id bCmd;
uint8_t bLoc;
};
struct TCmdDamage {
_cmd_id bCmd;
uint8_t bPlr;
uint32_t dwDam;
};
struct TCmdMonDamage {
_cmd_id bCmd;
uint16_t wMon;
uint32_t dwDam;
};
struct TCmdPlrInfoHdr {
_cmd_id bCmd;
uint16_t wOffset;
uint16_t wBytes;
};
struct TCmdString {
_cmd_id bCmd;
char str[MAX_SEND_STR_LEN];
};
struct TFakeCmdPlr {
_cmd_id bCmd;
uint8_t bPlr;
};
struct TFakeDropPlr {
_cmd_id bCmd;
uint8_t bPlr;
uint32_t dwReason;
};
struct TSyncHeader {
_cmd_id bCmd;
uint8_t bLevel;
uint16_t wLen;
uint8_t bItemI;
uint8_t bItemX;
uint8_t bItemY;
uint16_t wItemIndx;
uint16_t wItemCI;
uint32_t dwItemSeed;
uint8_t bItemId;
uint8_t bItemDur;
uint8_t bItemMDur;
uint8_t bItemCh;
uint8_t bItemMCh;
uint16_t wItemVal;
uint32_t dwItemBuff;
uint8_t bPInvLoc;
uint16_t wPInvIndx;
uint16_t wPInvCI;
uint32_t dwPInvSeed;
uint8_t bPInvId;
};
struct TSyncMonster {
uint8_t _mndx;
uint8_t _mx;
uint8_t _my;
uint8_t _menemy;
uint8_t _mdelta;
int32_t _mhitpoints;
int8_t mWhoHit;
};
struct TPktHdr {
uint8_t px;
uint8_t py;
uint8_t targx;
uint8_t targy;
int32_t php;
int32_t pmhp;
uint8_t bstr;
uint8_t bmag;
uint8_t bdex;
uint16_t wCheck;
uint16_t wLen;
};
struct TPkt {
TPktHdr hdr;
byte body[493];
};
struct DMonsterStr {
uint8_t _mx;
uint8_t _my;
Direction _mdir;
uint8_t _menemy;
uint8_t _mactive;
int32_t _mhitpoints;
int8_t mWhoHit;
};
struct DObjectStr {
_cmd_id bCmd;
};
struct DLevel {
TCmdPItem item[MAXITEMS];
DObjectStr object[MAXOBJECTS];
DMonsterStr monster[MAXMONSTERS];
};
struct LocalLevel {
uint8_t automapsv[DMAXX][DMAXY];
};
struct DPortal {
uint8_t x;
uint8_t y;
uint8_t level;
uint8_t ltype;
uint8_t setlvl;
};
struct MultiQuests {
quest_state qstate;
uint8_t qlog;
uint8_t qvar1;
};
struct DJunk {
DPortal portal[MAXPORTAL];
MultiQuests quests[MAXMULTIQUESTS];
};
#pragma pack(pop)
struct TBuffer {
uint32_t dwNextWriteOffset;
byte bData[4096];
};
extern bool deltaload;
extern BYTE gbBufferMsgs;
extern int dwRecCount;
void msg_send_drop_pkt(int pnum, int reason);
bool msg_wait_resync();
void run_delta_info();
void DeltaExportData(int pnum);
void delta_init();
void delta_kill_monster(int mi, Point position, BYTE bLevel);
void delta_monster_hp(int mi, int hp, BYTE bLevel);
void delta_sync_monster(const TSyncMonster &monsterSync, uint8_t level);
bool delta_portal_inited(int i);
bool delta_quest_inited(int i);
void DeltaAddItem(int ii);
void DeltaSaveLevel();
void DeltaLoadLevel();
void NetSendCmd(bool bHiPri, _cmd_id bCmd);
void NetSendCmdGolem(BYTE mx, BYTE my, Direction dir, BYTE menemy, int hp, BYTE cl);
void NetSendCmdLoc(int playerId, bool bHiPri, _cmd_id bCmd, Point position);
void NetSendCmdLocParam1(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1);
void NetSendCmdLocParam2(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2);
void NetSendCmdLocParam3(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3);
void NetSendCmdLocParam4(bool bHiPri, _cmd_id bCmd, Point position, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3, uint16_t wParam4);
void NetSendCmdParam1(bool bHiPri, _cmd_id bCmd, uint16_t wParam1);
void NetSendCmdParam2(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2);
void NetSendCmdParam3(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3);
void NetSendCmdParam4(bool bHiPri, _cmd_id bCmd, uint16_t wParam1, uint16_t wParam2, uint16_t wParam3, uint16_t wParam4);
void NetSendCmdQuest(bool bHiPri, const Quest &quest);
void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii);
void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position);
void NetSendCmdChItem(bool bHiPri, BYTE bLoc);
void NetSendCmdDelItem(bool bHiPri, BYTE bLoc);
void NetSendCmdDItem(bool bHiPri, int ii);
void NetSendCmdDamage(bool bHiPri, uint8_t bPlr, uint32_t dwDam);
void NetSendCmdMonDmg(bool bHiPri, uint16_t wMon, uint32_t dwDam);
void NetSendCmdString(uint32_t pmask, const char *pszStr);
void delta_close_portal(int pnum);
uint32_t ParseCmd(int pnum, const TCmd *pCmd);
} // namespace devilution