|
|
|
|
/**
|
|
|
|
|
* @file monstdat.h
|
|
|
|
|
*
|
|
|
|
|
* Interface of all monster data.
|
|
|
|
|
*/
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
|
|
#include "textdat.h"
|
|
|
|
|
|
|
|
|
|
namespace devilution {
|
|
|
|
|
|
|
|
|
|
enum _mai_id : int8_t {
|
|
|
|
|
AI_ZOMBIE,
|
|
|
|
|
AI_FAT,
|
|
|
|
|
AI_SKELSD,
|
|
|
|
|
AI_SKELBOW,
|
|
|
|
|
AI_SCAV,
|
|
|
|
|
AI_RHINO,
|
|
|
|
|
AI_GOATMC,
|
|
|
|
|
AI_GOATBOW,
|
|
|
|
|
AI_FALLEN,
|
|
|
|
|
AI_MAGMA,
|
|
|
|
|
AI_SKELKING,
|
|
|
|
|
AI_BAT,
|
|
|
|
|
AI_GARG,
|
|
|
|
|
AI_CLEAVER,
|
|
|
|
|
AI_SUCC,
|
|
|
|
|
AI_SNEAK,
|
|
|
|
|
AI_STORM,
|
|
|
|
|
AI_FIREMAN,
|
|
|
|
|
AI_GARBUD,
|
|
|
|
|
AI_ACID,
|
|
|
|
|
AI_ACIDUNIQ,
|
|
|
|
|
AI_GOLUM,
|
|
|
|
|
AI_ZHAR,
|
|
|
|
|
AI_SNOTSPIL,
|
|
|
|
|
AI_SNAKE,
|
|
|
|
|
AI_COUNSLR,
|
|
|
|
|
AI_MEGA,
|
|
|
|
|
AI_DIABLO,
|
|
|
|
|
AI_LAZARUS,
|
|
|
|
|
AI_LAZHELP,
|
|
|
|
|
AI_LACHDAN,
|
|
|
|
|
AI_WARLORD,
|
|
|
|
|
AI_FIREBAT,
|
|
|
|
|
AI_TORCHANT,
|
|
|
|
|
AI_HORKDMN,
|
|
|
|
|
AI_LICH,
|
|
|
|
|
AI_ARCHLICH,
|
|
|
|
|
AI_PSYCHORB,
|
|
|
|
|
AI_NECROMORB,
|
|
|
|
|
AI_BONEDEMON,
|
|
|
|
|
AI_INVALID = -1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum class MonsterClass : uint8_t {
|
|
|
|
|
Undead,
|
|
|
|
|
Demon,
|
|
|
|
|
Animal,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum monster_resistance : uint8_t {
|
|
|
|
|
// clang-format off
|
|
|
|
|
RESIST_MAGIC = 1 << 0,
|
|
|
|
|
RESIST_FIRE = 1 << 1,
|
|
|
|
|
RESIST_LIGHTNING = 1 << 2,
|
|
|
|
|
IMMUNE_MAGIC = 1 << 3,
|
|
|
|
|
IMMUNE_FIRE = 1 << 4,
|
|
|
|
|
IMMUNE_LIGHTNING = 1 << 5,
|
|
|
|
|
IMMUNE_NULL_40 = 1 << 6,
|
|
|
|
|
IMMUNE_ACID = 1 << 7,
|
|
|
|
|
// clang-format on
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum monster_treasure : uint16_t {
|
|
|
|
|
// clang-format off
|
|
|
|
|
T_MASK = 0xFFF,
|
|
|
|
|
T_NODROP = 0x4000, // monster doesn't drop any loot
|
|
|
|
|
T_UNIQ = 0x8000, // use combined with unique item's ID - for example butcher's cleaver = T_UNIQ+UITEM_CLEAVE
|
|
|
|
|
// clang-format on
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct MonsterData {
|
|
|
|
|
const char *mName;
|
|
|
|
|
const char *GraphicType;
|
|
|
|
|
const char *sndfile;
|
|
|
|
|
const char *TransFile;
|
|
|
|
|
uint16_t width;
|
|
|
|
|
uint16_t mImage;
|
|
|
|
|
bool has_special;
|
|
|
|
|
bool snd_special;
|
|
|
|
|
bool has_trans;
|
|
|
|
|
uint8_t Frames[6];
|
|
|
|
|
uint8_t Rate[6];
|
|
|
|
|
int8_t mMinDLvl;
|
|
|
|
|
int8_t mMaxDLvl;
|
|
|
|
|
int8_t mLevel;
|
|
|
|
|
uint16_t mMinHP;
|
|
|
|
|
uint16_t mMaxHP;
|
|
|
|
|
_mai_id mAi;
|
|
|
|
|
/** Usign monster_flag as bitflags */
|
|
|
|
|
uint16_t mFlags;
|
|
|
|
|
uint8_t mInt;
|
|
|
|
|
uint8_t mHit;
|
|
|
|
|
uint8_t mAFNum;
|
|
|
|
|
uint8_t mMinDamage;
|
|
|
|
|
uint8_t mMaxDamage;
|
|
|
|
|
uint8_t mHit2;
|
|
|
|
|
uint8_t mAFNum2;
|
|
|
|
|
uint8_t mMinDamage2;
|
|
|
|
|
uint8_t mMaxDamage2;
|
|
|
|
|
uint8_t mArmorClass;
|
|
|
|
|
MonsterClass mMonstClass;
|
|
|
|
|
/** Using monster_resistance as bitflags */
|
|
|
|
|
uint8_t mMagicRes;
|
|
|
|
|
/** Using monster_resistance as bitflags */
|
|
|
|
|
uint8_t mMagicRes2;
|
|
|
|
|
int8_t mSelFlag; // TODO Create enum
|
|
|
|
|
/** Using monster_treasure */
|
|
|
|
|
uint16_t mTreasure;
|
|
|
|
|
uint16_t mExp;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum _monster_id : int16_t {
|
|
|
|
|
MT_NZOMBIE,
|
|
|
|
|
MT_BZOMBIE,
|
|
|
|
|
MT_GZOMBIE,
|
|
|
|
|
MT_YZOMBIE,
|
|
|
|
|
MT_RFALLSP,
|
|
|
|
|
MT_DFALLSP,
|
|
|
|
|
MT_YFALLSP,
|
|
|
|
|
MT_BFALLSP,
|
|
|
|
|
MT_WSKELAX,
|
|
|
|
|
MT_TSKELAX,
|
|
|
|
|
MT_RSKELAX,
|
|
|
|
|
MT_XSKELAX,
|
|
|
|
|
MT_RFALLSD,
|
|
|
|
|
MT_DFALLSD,
|
|
|
|
|
MT_YFALLSD,
|
|
|
|
|
MT_BFALLSD,
|
|
|
|
|
MT_NSCAV,
|
|
|
|
|
MT_BSCAV,
|
|
|
|
|
MT_WSCAV,
|
|
|
|
|
MT_YSCAV,
|
|
|
|
|
MT_WSKELBW,
|
|
|
|
|
MT_TSKELBW,
|
|
|
|
|
MT_RSKELBW,
|
|
|
|
|
MT_XSKELBW,
|
|
|
|
|
MT_WSKELSD,
|
|
|
|
|
MT_TSKELSD,
|
|
|
|
|
MT_RSKELSD,
|
|
|
|
|
MT_XSKELSD,
|
|
|
|
|
MT_INVILORD,
|
|
|
|
|
MT_SNEAK,
|
|
|
|
|
MT_STALKER,
|
|
|
|
|
MT_UNSEEN,
|
|
|
|
|
MT_ILLWEAV,
|
|
|
|
|
MT_LRDSAYTR,
|
|
|
|
|
MT_NGOATMC,
|
|
|
|
|
MT_BGOATMC,
|
|
|
|
|
MT_RGOATMC,
|
|
|
|
|
MT_GGOATMC,
|
|
|
|
|
MT_FIEND,
|
|
|
|
|
MT_BLINK,
|
|
|
|
|
MT_GLOOM,
|
|
|
|
|
MT_FAMILIAR,
|
|
|
|
|
MT_NGOATBW,
|
|
|
|
|
MT_BGOATBW,
|
|
|
|
|
MT_RGOATBW,
|
|
|
|
|
MT_GGOATBW,
|
|
|
|
|
MT_NACID,
|
|
|
|
|
MT_RACID,
|
|
|
|
|
MT_BACID,
|
|
|
|
|
MT_XACID,
|
|
|
|
|
MT_SKING,
|
|
|
|
|
MT_CLEAVER,
|
|
|
|
|
MT_FAT,
|
|
|
|
|
MT_MUDMAN,
|
|
|
|
|
MT_TOAD,
|
|
|
|
|
MT_FLAYED,
|
|
|
|
|
MT_WYRM,
|
|
|
|
|
MT_CAVSLUG,
|
|
|
|
|
MT_DVLWYRM,
|
|
|
|
|
MT_DEVOUR,
|
|
|
|
|
MT_NMAGMA,
|
|
|
|
|
MT_YMAGMA,
|
|
|
|
|
MT_BMAGMA,
|
|
|
|
|
MT_WMAGMA,
|
|
|
|
|
MT_HORNED,
|
|
|
|
|
MT_MUDRUN,
|
|
|
|
|
MT_FROSTC,
|
|
|
|
|
MT_OBLORD,
|
|
|
|
|
MT_BONEDMN,
|
|
|
|
|
MT_REDDTH,
|
|
|
|
|
MT_LTCHDMN,
|
|
|
|
|
MT_UDEDBLRG,
|
|
|
|
|
MT_INCIN,
|
|
|
|
|
MT_FLAMLRD,
|
|
|
|
|
MT_DOOMFIRE,
|
|
|
|
|
MT_HELLBURN,
|
|
|
|
|
MT_STORM,
|
|
|
|
|
MT_RSTORM,
|
|
|
|
|
MT_STORML,
|
|
|
|
|
MT_MAEL,
|
|
|
|
|
MT_BIGFALL,
|
|
|
|
|
MT_WINGED,
|
|
|
|
|
MT_GARGOYLE,
|
|
|
|
|
MT_BLOODCLW,
|
|
|
|
|
MT_DEATHW,
|
|
|
|
|
MT_MEGA,
|
|
|
|
|
MT_GUARD,
|
|
|
|
|
MT_VTEXLRD,
|
|
|
|
|
MT_BALROG,
|
|
|
|
|
MT_NSNAKE,
|
|
|
|
|
MT_RSNAKE,
|
|
|
|
|
MT_BSNAKE,
|
|
|
|
|
MT_GSNAKE,
|
|
|
|
|
MT_NBLACK,
|
|
|
|
|
MT_RTBLACK,
|
|
|
|
|
MT_BTBLACK,
|
|
|
|
|
MT_RBLACK,
|
|
|
|
|
MT_UNRAV,
|
|
|
|
|
MT_HOLOWONE,
|
|
|
|
|
MT_PAINMSTR,
|
|
|
|
|
MT_REALWEAV,
|
|
|
|
|
MT_SUCCUBUS,
|
|
|
|
|
MT_SNOWWICH,
|
|
|
|
|
MT_HLSPWN,
|
|
|
|
|
MT_SOLBRNR,
|
|
|
|
|
MT_COUNSLR,
|
|
|
|
|
MT_MAGISTR,
|
|
|
|
|
MT_CABALIST,
|
|
|
|
|
MT_ADVOCATE,
|
|
|
|
|
MT_GOLEM,
|
|
|
|
|
MT_DIABLO,
|
|
|
|
|
MT_DARKMAGE,
|
|
|
|
|
MT_HELLBOAR,
|
|
|
|
|
MT_STINGER,
|
|
|
|
|
MT_PSYCHORB,
|
|
|
|
|
MT_ARACHNON,
|
|
|
|
|
MT_FELLTWIN,
|
|
|
|
|
MT_HORKSPWN,
|
|
|
|
|
MT_VENMTAIL,
|
|
|
|
|
MT_NECRMORB,
|
|
|
|
|
MT_SPIDLORD,
|
|
|
|
|
MT_LASHWORM,
|
|
|
|
|
MT_TORCHANT,
|
|
|
|
|
MT_HORKDMN,
|
|
|
|
|
MT_DEFILER,
|
|
|
|
|
MT_GRAVEDIG,
|
|
|
|
|
MT_TOMBRAT,
|
|
|
|
|
MT_FIREBAT,
|
|
|
|
|
MT_SKLWING,
|
|
|
|
|
MT_LICH,
|
|
|
|
|
MT_CRYPTDMN,
|
|
|
|
|
MT_HELLBAT,
|
|
|
|
|
MT_BONEDEMN,
|
|
|
|
|
MT_ARCHLICH,
|
|
|
|
|
MT_BICLOPS,
|
|
|
|
|
MT_FLESTHNG,
|
|
|
|
|
MT_REAPER,
|
|
|
|
|
MT_NAKRUL,
|
|
|
|
|
NUM_MTYPES,
|
|
|
|
|
MT_INVALID = -1,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum _monster_availability : uint8_t {
|
|
|
|
|
MAT_NEVER,
|
|
|
|
|
MAT_ALWAYS,
|
|
|
|
|
MAT_RETAIL,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Defines if and how a group of monsters should be spawned with the unique monster
|
|
|
|
|
*/
|
|
|
|
|
enum class UniqueMonsterPack {
|
|
|
|
|
/**
|
|
|
|
|
* @brief Don't spawn a group of monsters with the unique monster
|
|
|
|
|
*/
|
|
|
|
|
None,
|
|
|
|
|
/**
|
|
|
|
|
* @brief Spawn a group of monsters that are independent from the unique monster
|
|
|
|
|
*/
|
|
|
|
|
Independent,
|
|
|
|
|
/**
|
|
|
|
|
* @brief Spawn a group of monsters that are leashed to the unique monster
|
|
|
|
|
*/
|
|
|
|
|
Leashed,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct UniqueMonsterData {
|
|
|
|
|
_monster_id mtype;
|
|
|
|
|
const char *mName;
|
|
|
|
|
const char *mTrnName;
|
|
|
|
|
uint8_t mlevel;
|
|
|
|
|
uint16_t mmaxhp;
|
|
|
|
|
_mai_id mAi;
|
|
|
|
|
uint8_t mint;
|
|
|
|
|
uint8_t mMinDamage;
|
|
|
|
|
uint8_t mMaxDamage;
|
|
|
|
|
/** Using monster_resistance as bitflags */
|
|
|
|
|
uint16_t mMagicRes;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Defines if and how a group of monsters should be spawned with the unique monster
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
UniqueMonsterPack monsterPack;
|
|
|
|
|
uint8_t customToHit;
|
|
|
|
|
uint8_t customArmorClass;
|
|
|
|
|
_speech_id mtalkmsg;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern const MonsterData MonstersData[];
|
|
|
|
|
extern const _monster_id MonstConvTbl[];
|
|
|
|
|
extern const char MonstAvailTbl[];
|
|
|
|
|
extern const UniqueMonsterData UniqueMonstersData[];
|
|
|
|
|
|
|
|
|
|
} // namespace devilution
|