Files
Justin Marshall 101266ab72 Initial commit.
2026-04-27 10:35:40 -07:00

521 lines
14 KiB
C++

/*-----------------------------------------------------------------------**
** Diablo
**
** Constants and Variables
**
** (C)1995 Condor, Inc. All rights reserved.
**-----------------------------------------------------------------------**
** $Header: /Diablo/PLAYER.H 3 2/22/97 12:54p Pwyatt $
**-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------**
** Defines
**-----------------------------------------------------------------------*/
#define MAXPACKLEN 256
#define PM_STAND 0
#define PM_WALK 1
#define PM_WALK2 2
#define PM_WALK3 3
#define PM_ATTACK 4
#define PM_RATTACK 5
#define PM_BLOCK 6
#define PM_GOTHIT 7
#define PM_DEATH 8
#define PM_SPELL 9
#define PM_NEWLVL 10
#define PM_QUIT 11
#define PCMD_NOTHING -1
#define PCMD_STAND 0
#define PCMD_WALKUR 1
#define PCMD_WALKUL 2
#define PCMD_WALKDR 3
#define PCMD_WALKDL 4
#define PCMD_WALKU 5
#define PCMD_WALKR 6
#define PCMD_WALKD 7
#define PCMD_WALKL 8
#define PCMD_ATTACK 9
#define PCMD_RATTACK 10
#define PCMD_BLOCK 11
#define PCMD_SPELL 12
#define PCMD_OPOBJ 13
#define PCMD_DISARM 14
#define PCMD_REQGETITEM 15
#define PCMD_REQAGETITEM 16
#define PCMD_TALK 17
#define PCMD_TELEK 18
// free space
#define PCMD_ATTACKID 20
#define PCMD_ATTACKPID 21
#define PCMD_RATTACKID 22
#define PCMD_RATTACKPID 23
#define PCMD_SPELLID 24
#define PCMD_SPELLPID 25
#define PCMD_SPELLXYD 26
#define DIR_U 4
#define DIR_UR 5
#define DIR_R 6
#define DIR_DR 7
#define DIR_D 0
#define DIR_DL 1
#define DIR_L 2
#define DIR_UL 3
#define PGFX_MASK 0x0f
#define PGFX_CMASK 0xf0
#define PGFX_CSHIFT 4
#define PGFX_NGUY 0 // Nothing in hands
#define PGFX_SGUY 1 // Shield only
#define PGFX_XGUY 2 // Sword only
#define PGFX_GUY 3 // Sword and shield
#define PGFX_BGUY 4 // Bow
#define PGFX_FGUY 5 // Axe
#define PGFX_ZGUY 6 // Mace
#define PGFX_CGUY 7 // Mace and shield
#define PGFX_TGUY 8 // Staff
#define PGFX_NMGUY 16 // Same as above, medium armor = 0x10 + plain version
#define PGFX_SMGUY 17
#define PGFX_XMGUY 18
#define PGFX_MGUY 19
#define PGFX_BMGUY 20
#define PGFX_FMGUY 21
#define PGFX_ZMGUY 22
#define PGFX_CMGUY 23
#define PGFX_TMGUY 24
#define PGFX_NHGUY 32 // Same as above, heavy armor = 0x20 + plain version
#define PGFX_SHGUY 33
#define PGFX_XHGUY 34
#define PGFX_HGUY 35
#define PGFX_BHGUY 36
#define PGFX_FHGUY 37
#define PGFX_ZHGUY 38
#define PGFX_CHGUY 39
#define PGFX_THGUY 40
#define PGL_STAND 0x0001 // Player gfx load
#define PGL_WALK 0x0002
#define PGL_ATTACK 0x0004
#define PGL_HIT 0x0008
#define PGL_LMAG 0x0010
#define PGL_FMAG 0x0020
#define PGL_TMAG 0x0040
#define PGL_DEAD 0x0080
#define PGL_BLOCK 0x0100
#define PGL_ALL 0x017f
#define E_SINGLE 0
#define E_DOUBLE 1
#define CLASS_WARRIOR 0
#define CLASS_ROGUE 1
#define CLASS_SORCEROR 2
#define CLASS_MONK 3
#define CLASS_BARD 4
#define CLASS_BARBARIAN 5
#define NUM_CLASSES (1 + CLASS_BARBARIAN)
#define HP_SHIFT 6 // number of fractional bits for hit points
#define MANA_SHIFT 6 // number of fractional bits for mana points
#define WEAP_H2H 0
#define WEAP_RANGE 1
#define MAXPATHLEN 25
#define MAXINV 40 // maximum inventory items per player
#define MAXSPD 8 // maximum invertory speed items per player
#define SPL_FROMR 0 // Current spell from readied spell
#define SPL_FROMBK 1 // Current spell from spell book
#define SPL_FROMT 2 // Current spell from targeted spell
#define SPL_FROMSB 3 // Current spell from scroll in speed bar
#define PLR_NAME_LEN 32
#define BASE_TO_HIT 50
#define SF_ETHER 0x01 // Etheralize spell on
#define SF_RAGE 0x02 // Rage spell on.
#define SF_LETHERGY 0x04 // Lethergy spell on.
#define SF_FLAG4 0x08 //
#define SF_FLAG5 0x10 //
#define SF_FLAG6 0x20 //
#define SF_FLAG7 0x40 //
#define SF_FLAG8 0x80 //
#define INVLOC_HEAD 0
#define INVLOC_RING1 1
#define INVLOC_RING2 2
#define INVLOC_NECK 3
#define INVLOC_HAND1 4
#define INVLOC_HAND2 5
#define INVLOC_BODY 6
#define NUM_INVLOC 7
#define DUNGMSG_1 0x01
#define DUNGMSG_2 0x02
#define DUNGMSG_3 0x04
#define DUNGMSG_4 0x08
#define DUNGMSG_5 0x10
#define DUNGMSG_6 0x20 // JKE CRYPT
#define DUNGMSG_7 0x40 // JKE HIVE
#define DUNGMSG_8 0x80 // JKEQUEST HIVE2
#define STAT_STR 0
#define STAT_MAG 1
#define STAT_DEX 2
#define STAT_VIT 3
#define LVLCHANGE_OFF 0
#define LVLCHANGE_TIME 10
#define KILL_UNKNOWN -1
/*-----------------------------------------------------------------------**
** Structures
**-----------------------------------------------------------------------*/
typedef struct {
int _pmode; // players current mode
char walkpath[MAXPATHLEN];
BYTE plractive;
int destAction;
int destParam1;
int destParam2;
int destParam3;
int destParam4;
int plrlevel;
int _px; // plr map x
int _py; // plr map y
int _pfutx; // plr future map x
int _pfuty; // plr future map y
int _ptargx; // final target x
int _ptargy; // final target y
int _pownerx; // x coord from computer which owns this player
int _pownery; // x coord from computer which owns this player
int _poldx; // plr old x position
int _poldy; // plr old y position
long _pxoff; // offset x from left of map tile
long _pyoff; // offset y from bottom of map tile
long _pxvel; // current x rate
long _pyvel; // current y rate
int _pdir; // current player direction
int _nextdir; // Next direction wanted
int _pgfxnum; // Graphic set player number
BYTE *_pAnimData; // Data pointer to anim tables
int _pAnimDelay; // anim delay amount
int _pAnimCnt; // current anim delay value
int _pAnimLen; // number of anim frames
int _pAnimFrame; // current anim frame
long _pAnimWidth; // current width of anim
long _pAnimWidth2; // (width - 64) / 2
int _peflag; // draw extra tile to left for walk fix (flag)
int _plid; // player light id
int _pvid; // player vision id
int _pSpell; // Spell to cast (from book or readied)
char _pSplType; // Spell type of spell to cast
char _pSplFrom; // Spell from Readied, book, or speed bar
int _pTSpell; // Targeted spell
char _pTSplType; // Targeted spell type
int _pRSpell; // Readied spell
char _pRSplType; // Readied spell type (Memorized, ability, staff/item)
int _pSBkSpell; // Current spell book spell
char _pSBkSplType; // Spell book spell type
char _pSplLvl[64]; // Spell level corresponding to SplType bits
__int64 _pMemSpells; // Flags for which spell the char has from memorizing books
__int64 _pAblSpells; // Flags for which spell the char has class abilities
__int64 _pScrlSpells; // Flags for which spell the char has from scrolls
char _pSpellFlags; // Flags for spells, these can be used for anything, see defines above
int _pSplHotKey[4]; // Spell hotkeys
char _pSplTHotKey[4]; // Spell type hotkeys
int _pwtype; // Weapon type (ranged, h2h)
BYTE _pBlockFlag; // Do I have a shield to block with?
BYTE _pInvincible; // Can I be hit?
char _pLightRad; // Player light radius
BYTE _pLvlChanging; // Am I in the process of changing levels?
// Player attributes
char _pName[PLR_NAME_LEN];
char _pClass;
int _pStrength;
int _pBaseStr;
int _pMagic;
int _pBaseMag;
int _pDexterity;
int _pBaseDex;
int _pVitality;
int _pBaseVit;
int _pStatPts;
int _pDamageMod; // Damage modifier
int _pBaseToBlk; // Block %
long _pHPBase;
long _pMaxHPBase;
long _pHitPoints;
long _pMaxHP;
int _pHPPer;
long _pManaBase;
long _pMaxManaBase;
long _pMana;
long _pMaxMana;
int _pManaPer;
char _pLevel;
char _pMaxLvl;
long _pExperience;
long _pMaxExp;
long _pNextExper;
char _pArmorClass;
char _pMagResist;
char _pFireResist;
char _pLghtResist;
long _pGold;
BOOL _pInfraFlag;
long _pVar1; // scratch var 1
long _pVar2; // scratch var 2
long _pVar3; // scratch var 3
long _pVar4; // scratch var 4
long _pVar5; // scratch var 5
long _pVar6; // scratch var 6
long _pVar7; // scratch var 7
long _pVar8; // scratch var 8
BYTE _pLvlVisited[NUMLEVELS]; // Have I been on this level?
BYTE _pSLvlVisited[NUMLEVELS]; // Have I been on this set piece level?
int _pGFXLoad; // Flag for which graphics are loaded
BYTE *_pNAnim[8]; // Neutral anims
int _pNFrames; // Number of neutral frames
long _pNWidth; // Width of neutral frames
BYTE *_pWAnim[8]; // Walk anims
int _pWFrames; // Number of walk frames
long _pWWidth; // Width of walk frames
BYTE *_pAAnim[8]; // Attack anims
int _pAFrames; // Number of attack frames
long _pAWidth; // Width of attack frames
int _pAFNum; // Which frame to check for attack on
BYTE *_pLAnim[8]; // Lightning Spell anims
BYTE *_pFAnim[8]; // Fire Spell anims
BYTE *_pTAnim[8]; // Misc Spell anims
int _pSFrames; // Number of spell frames
long _pSWidth; // Width of spell frames
int _pSFNum; // Which frame to cast spell on
BYTE *_pHAnim[8]; // Got Hit anims
int _pHFrames; // Number of got hit frames
long _pHWidth; // Width of got hit frames
BYTE *_pDAnim[8]; // Death anims
int _pDFrames; // Number of death frames
long _pDWidth; // Width of death frames
BYTE *_pBAnim[8]; // Block anims
int _pBFrames; // Number of block frames
long _pBWidth; // Width of block frames
ItemStruct InvBody[NUM_INVLOC];
ItemStruct InvList[MAXINV];
int _pNumInv;
char InvGrid[MAXINV];
ItemStruct SpdList[MAXSPD];
ItemStruct HoldItem; // Item in transit
int _pIMinDam; // Min damage from all items
int _pIMaxDam; // Max damage from all items
int _pIAC; // AC bonus from all items
int _pIBonusDam; // Added to damage after calced (%)
int _pIBonusToHit; // Added to hit percent
int _pIBonusAC; // Added to AC
int _pIBonusDamMod; // Added to damage after calced (number)
__int64 _pISpells; // item activated spells
long _pIFlags; // tot item flags from all items
int _pIGetHit; // When I gen hit, added to or subtracted from damage
char _pISplLvlAdd; // What to add to each spell level
char _pISplCost; // % modifier to spell cost
int _pISplDur; // % modifier to spell duration
int _pIEnAc;
int _pIFMinDam; // Fire hit min damage
int _pIFMaxDam; // Fire hit min damage
int _pILMinDam; // Lightning hit min damage
int _pILMaxDam; // Lightning hit min damage
/* BOOL _WarpActive; // If I am on the town level from a portal, this turns true.
int _WarpLevel; // Level Town portal was cast on
int _WarpLvlType; // Level type where warp occurred
BOOL _WarpSet; // Was it a set level?
int _WarpX; // Level X pos where warp occurred
int _WarpY; // Level Y pos where warp occurred */
int _pOilType; // Temp hold for oil creation
// these fields are to be used if more variables need to be added
// to the player structure so that the size won't change
BYTE pTownWarps; // Town warp flags for single player (drb 11/22)
BYTE pDungMsgs; // Dungeon phrases that the player says
BYTE pLvlLoad;
BYTE pHellfireMsgs; // Message slots for nest messages
BYTE bReserved5;
BYTE bReserved6;
BYTE bReserved7;
BYTE bReserved8;
WORD _pReflectCount; // Number of reflected hits left.
WORD wReserved2;
WORD wReserved3;
WORD wReserved4;
WORD wReserved5;
WORD wReserved6;
WORD wReserved7;
WORD wReserved8;
DWORD pDiabloKillLevel; // player killed Diablo at what level
DWORD _gnDifficulty;
DWORD _pIFlags2;
DWORD dwReserved4;
DWORD dwReserved5;
DWORD dwReserved6;
DWORD dwReserved7;
DWORD dwReserved8;
// Anything below this will not be saved or sent during a sync
#define SAVE_PLAYER_SIZE offsetof(PlayerStruct,_pNData)
BYTE *_pNData; // Neutral anim memory
BYTE *_pWData; // Walk anim memory
BYTE *_pAData; // Attack anim memory
BYTE *_pLData; // Spell anim memory
BYTE *_pFData; // Spell anim memory
BYTE *_pTData; // Spell anim memory
BYTE *_pHData; // Got Hit anim memory
BYTE *_pDData; // Death anim memory
BYTE *_pBData; // Block anim memory
} PlayerStruct;
// for compatiblity with existing code
#define HeadItem InvBody[INVLOC_HEAD]
#define BodyItem InvBody[INVLOC_BODY]
#define Ring1Item InvBody[INVLOC_RING1]
#define Ring2Item InvBody[INVLOC_RING2]
#define NeckItem InvBody[INVLOC_NECK]
#define Hand1Item InvBody[INVLOC_HAND1]
#define Hand2Item InvBody[INVLOC_HAND2]
extern DWORD glSeedTbl[NUMLEVELS];
extern int gnLevelTypeTbl[NUMLEVELS];
extern char *ClassStrTbl[NUM_CLASSES];
/*-----------------------------------------------------------------------**
** Externs
**-----------------------------------------------------------------------*/
// pjw.patch1.start
// extern PlayerStruct plr[MAX_PLRS];
extern PlayerStruct * plr;
// pjw.patch1.end
extern int myplr;
extern int pholdx, pholdy;
extern int MaxStats[NUM_CLASSES][4];
extern int deathdelay;
extern BOOL deathflag;
extern BOOL gbValidSaveFile;
extern BOOL gbSaveFileExists;
/*-----------------------------------------------------------------------**
** Prototypes
**-----------------------------------------------------------------------*/
void InitPlrGFXMem(int);
void LoadPlrGFX(int,DWORD);
void InitPlayerGFX(int);
void FreePlayerGFX(int);
void SetPlrAnims(int);
void InitPlayer(int, BOOL);
void InitMultiView();
void ProcessPlayers();
int PlrGetDirXY(int, int, int);
void StartSpell(int, int, int, int);
void StartPlrKill(int, BOOL);
void SyncPlrKill(int, BOOL);
void StartPlrHit(int, int, BOOL);
void StartPlrBlock(int, int);
void StartNewLvl(int, int, int);
void StartWarpLvl(int, int);
void RestartTownLvl(int);
void CreatePlayer(int, char);
void CreateMyPacket();
void ProcessPackets();
void AddPlrExperience(int, int, long);
void AddPlrMonstExper(int, long, char);
void SyncInitPlr(int);
void ClrPlrPath(int);
BOOL PosOkPlayer(int, int, int);
void MakePlrPath(int, int, int, BOOL);
void CheckPlrSpell();
void PlrClrTrans(int, int);
void PlrDoTrans(int, int);
void ModifyPlrStr(int, int);
void ModifyPlrMag(int, int);
void ModifyPlrDex(int, int);
void ModifyPlrVit(int, int);
void SetPlayerHitPoints(int pnum, int newhp);
void SetPlrStr(int p, int v);
void SetPlrMag(int p, int v);
void SetPlrDex(int p, int v);
void SetPlrVit(int p, int v);
void DropHalfPlayersGold(int pnum);
extern void StripTopGold(int pnum);
void InitDungMsgs(int pnum);
void PlayDungMsgs();
void CheckStats(int p);
void FixPlrWalkTags(int pnum);
void FixPlayerLocation(int pnum,int bDir);
void SetPlayerOld(int pnum);
int GetMaxStr(int /* class */);
int GetMaxMag(int /* class */);
int GetMaxDex(int /* class */);