From d6b258926ef4a27ffb395776ec096fd4700f367e Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 22 May 2022 01:03:00 +0200 Subject: [PATCH] Apply type checking on monster type --- Source/missiles.cpp | 20 +-- Source/monstdat.cpp | 421 +++++++++++++++----------------------------- Source/monstdat.h | 14 +- Source/monster.cpp | 155 ++++++++-------- Source/monster.h | 4 +- 5 files changed, 236 insertions(+), 378 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 2bbe23375..835c4d8da 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2101,19 +2101,17 @@ void InitMissileAnimationFromMonster(Missile &mis, Direction midir, const Monste void AddRhino(Missile &missile, const AddMissileParameter ¶meter) { - auto &monster = Monsters[missile._misource]; + Monster &monster = Monsters[missile._misource]; - MonsterGraphic graphic = MonsterGraphic::Special; - if (monster.MType->mtype < MT_HORNED || monster.MType->mtype > MT_OBLORD) { - if (monster.MType->mtype < MT_NSNAKE || monster.MType->mtype > MT_GSNAKE) { - graphic = MonsterGraphic::Walk; - } else { - graphic = MonsterGraphic::Attack; - } + MonsterGraphic graphic = MonsterGraphic::Walk; + if (IsAnyOf(monster.MType->mtype, MT_HORNED, MT_MUDRUN, MT_FROSTC, MT_OBLORD)) { + graphic = MonsterGraphic::Special; + } else if (IsAnyOf(monster.MType->mtype, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) { + graphic = MonsterGraphic::Attack; } UpdateMissileVelocity(missile, parameter.dst, 18); InitMissileAnimationFromMonster(missile, parameter.midir, monster, graphic); - if (monster.MType->mtype >= MT_NSNAKE && monster.MType->mtype <= MT_GSNAKE) + if (IsAnyOf(monster.MType->mtype, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) missile._miAnimFrame = 7; if (monster._uniqtype != 0) { missile._mlid = monster.mlid; @@ -4101,9 +4099,9 @@ void missiles_process_charge() CMonster *mon = Monsters[missile._misource].MType; MonsterGraphic graphic; - if (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) { + if (IsAnyOf(mon->mtype, MT_HORNED, MT_MUDRUN, MT_FROSTC, MT_OBLORD)) { graphic = MonsterGraphic::Special; - } else if (mon->mtype >= MT_NSNAKE && mon->mtype <= MT_GSNAKE) { + } else if (IsAnyOf(mon->mtype, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) { graphic = MonsterGraphic::Attack; } else { graphic = MonsterGraphic::Walk; diff --git a/Source/monstdat.cpp b/Source/monstdat.cpp index 5888a39b4..b1c226a8e 100644 --- a/Source/monstdat.cpp +++ b/Source/monstdat.cpp @@ -15,147 +15,147 @@ namespace devilution { /** Contains the data related to each monster ID. */ const MonsterData MonstersData[] = { // clang-format off -//_monster_id mName, GraphicType, sndfile, TransFile, width, mImage, has_special, snd_special, has_trans, Frames[6], Rate[6], mMinDLvl, mMaxDLvl, mLevel, mMinHP, mMaxHP, mAi, mFlags , mInt, mHit, mAFNum, mMinDamage, mMaxDamage, mHit2, mAFNum2, mMinDamage2, mMaxDamage2, mArmorClass, mMonstClass , mMagicRes , mMagicRes2 , mSelFlag, mTreasure, mExp +//_monster_id mName, GraphicType, sndfile, TransFile, availability, width, mImage, has_special, snd_special, has_trans, Frames[6], Rate[6], mMinDLvl, mMaxDLvl, mLevel, mMinHP, mMaxHP, mAi, mFlags , mInt, mHit, mAFNum, mMinDamage, mMaxDamage, mHit2, mAFNum2, mMinDamage2, mMaxDamage2, mArmorClass, mMonstClass , mMagicRes , mMagicRes2 , mSelFlag, mTreasure, mExp // TRANSLATORS: Monster Block start -/* MT_NZOMBIE */ { P_("monster", "Zombie"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", nullptr, 128, 799, false, false, false, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 1, 2, 1, 4, 7, AI_ZOMBIE, 0 , 0, 10, 8, 2, 5, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 54 }, -/* MT_BZOMBIE */ { P_("monster", "Ghoul"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Bluered.TRN", 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 2, 7, 11, AI_ZOMBIE, 0 , 1, 10, 8, 3, 10, 0, 0, 0, 0, 10, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 58 }, -/* MT_GZOMBIE */ { P_("monster", "Rotting Carcass"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Grey.TRN", 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 4, 15, 25, AI_ZOMBIE, 0 , 2, 25, 8, 5, 15, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 136 }, -/* MT_YZOMBIE */ { P_("monster", "Black Death"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Yellow.TRN", 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 3, 5, 6, 25, 40, AI_ZOMBIE, 0 , 3, 30, 8, 6, 22, 0, 0, 0, 0, 20, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 240 }, -/* MT_RFALLSP */ { P_("monster", "Fallen One"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\FallenT.TRN", 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 1, 2, 1, 1, 4, AI_FALLEN, 0 , 0, 15, 7, 1, 3, 0, 5, 0, 0, 0, MonsterClass::Animal, 0 , 0 , 3, 0, 46 }, -/* MT_DFALLSP */ { P_("monster", "Carver"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\Dark.TRN", 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 2, 3, 3, 4, 8, AI_FALLEN, 0 , 2, 20, 7, 2, 5, 0, 5, 0, 0, 5, MonsterClass::Animal, 0 , 0 , 3, 0, 80 }, -/* MT_YFALLSP */ { P_("monster", "Devil Kin"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", nullptr, 128, 543, true, true, false, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 2, 4, 5, 12, 24, AI_FALLEN, 0 , 2, 25, 7, 3, 7, 0, 5, 0, 0, 10, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 155 }, -/* MT_BFALLSP */ { P_("monster", "Dark One"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\Blue.TRN", 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 7, 20, 36, AI_FALLEN, 0 , 3, 30, 7, 4, 8, 0, 5, 0, 0, 15, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 255 }, -/* MT_WSKELAX */ { P_("monster", "Skeleton"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\White.TRN", 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 5, 1, 1, 1, 1, 1 }, 1, 2, 1, 2, 4, AI_SKELSD, 0 , 0, 20, 8, 1, 4, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 64 }, -/* MT_TSKELAX */ { P_("monster", "Corpse Axe"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\Skelt.TRN", 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 2, 4, 7, AI_SKELSD, 0 , 1, 25, 8, 3, 5, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 68 }, -/* MT_RSKELAX */ { P_("monster", "Burning Dead"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", nullptr, 128, 553, true, false, false, { 12, 8, 13, 6, 17, 16 }, { 2, 1, 1, 1, 1, 1 }, 2, 4, 4, 8, 12, AI_SKELSD, 0 , 2, 30, 8, 3, 7, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 154 }, -/* MT_XSKELAX */ { P_("monster", "Horror"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\Black.TRN", 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 6, 12, 20, AI_SKELSD, 0 , 3, 35, 8, 4, 9, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 264 }, -/* MT_RFALLSD */ { P_("monster", "Fallen One"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\FallenT.TRN", 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 1, 2, 1, 2, 5, AI_FALLEN, 0 , 0, 15, 8, 1, 4, 0, 5, 0, 0, 10, MonsterClass::Animal, 0 , 0 , 3, 0, 52 }, -/* MT_DFALLSD */ { P_("monster", "Carver"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\Dark.TRN", 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 2, 3, 3, 5, 9, AI_FALLEN, 0 , 1, 20, 8, 2, 7, 0, 5, 0, 0, 15, MonsterClass::Animal, 0 , 0 , 3, 0, 90 }, -/* MT_YFALLSD */ { P_("monster", "Devil Kin"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", nullptr, 128, 623, true, true, false, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 2, 4, 5, 16, 24, AI_FALLEN, 0 , 2, 25, 8, 4, 10, 0, 5, 0, 0, 20, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 180 }, -/* MT_BFALLSD */ { P_("monster", "Dark One"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\Blue.TRN", 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 7, 24, 36, AI_FALLEN, 0 , 3, 30, 8, 4, 12, 0, 5, 0, 0, 25, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 280 }, -/* MT_NSCAV */ { P_("monster", "Scavenger"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", nullptr, 128, 410, true, false, false, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 1, 3, 2, 3, 6, AI_SCAV, 0 , 0, 20, 7, 1, 5, 0, 0, 0, 0, 10, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 80 }, -/* MT_BSCAV */ { P_("monster", "Plague Eater"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavBr.TRN", 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 2, 4, 4, 12, 24, AI_SCAV, 0 , 1, 30, 7, 1, 8, 0, 0, 0, 0, 20, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 3, 0, 188 }, -/* MT_WSCAV */ { P_("monster", "Shadow Beast"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavBe.TRN", 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 3, 5, 6, 24, 36, AI_SCAV, 0 , 2, 35, 7, 3, 12, 0, 0, 0, 0, 25, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 375 }, -/* MT_YSCAV */ { P_("monster", "Bone Gasher"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavW.TRN", 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 4, 6, 8, 28, 40, AI_SCAV, 0 , 3, 35, 7, 5, 15, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 552 }, -/* MT_WSKELBW */ { P_("monster", "Skeleton"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\White.TRN", 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 3, 2, 4, AI_SKELBOW, 0 , 0, 15, 12, 1, 2, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 110 }, -/* MT_TSKELBW */ { P_("monster", "Corpse Bow"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\Skelt.TRN", 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 5, 8, 16, AI_SKELBOW, 0 , 1, 25, 12, 1, 4, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 210 }, -/* MT_RSKELBW */ { P_("monster", "Burning Dead"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", nullptr, 128, 567, true, false, false, { 9, 8, 16, 5, 16, 16 }, { 2, 1, 1, 1, 1, 1 }, 3, 5, 7, 10, 24, AI_SKELBOW, 0 , 2, 30, 12, 1, 6, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 364 }, -/* MT_XSKELBW */ { P_("monster", "Horror"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\Black.TRN", 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 3, 1, 1, 1, 1, 1 }, 4, 6, 9, 15, 45, AI_SKELBOW, 0 , 3, 35, 12, 2, 9, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 594 }, -/* MT_WSKELSD */ { P_("monster", "Skeleton Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\White.TRN", 128, 575, true, true, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 1, 3, 2, 3, 6, AI_SKELSD, 0 , 0, 20, 8, 2, 7, 0, 0, 0, 0, 10, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 90 }, -/* MT_TSKELSD */ { P_("monster", "Corpse Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\Skelt.TRN", 128, 575, true, false, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 4, 12, 20, AI_SKELSD, 0 , 1, 30, 8, 3, 9, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 200 }, -/* MT_RSKELSD */ { P_("monster", "Burning Dead Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", nullptr, 128, 575, true, false, false, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 3, 5, 6, 16, 30, AI_SKELSD, 0 , 2, 35, 8, 4, 10, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 393 }, -/* MT_XSKELSD */ { P_("monster", "Horror Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\Black.TRN", 128, 575, true, false, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 4, 6, 8, 35, 50, AI_SKELSD, MFLAG_SEARCH , 3, 40, 8, 5, 14, 0, 0, 0, 0, 30, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 604 }, -/* MT_INVILORD*/ { P_("monster", "Invisible Lord"), "TSneak\\TSneak", "Monsters\\TSneak\\Sneakl%c%i.WAV", nullptr, 128, 800, false, false, false, { 13, 13, 15, 11, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 14, 278, 278, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 65, 8, 16, 30, 0, 0, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 2000 }, -/* MT_SNEAK */ { P_("monster", "Hidden"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", nullptr, 128, 992, true, false, false, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 2, 5, 5, 8, 24, AI_SNEAK, MFLAG_HIDDEN , 0, 35, 8, 3, 6, 0, 0, 0, 0, 25, MonsterClass::Demon, 0 , IMMUNE_NULL_40 , 3, 0, 278 }, -/* MT_STALKER */ { P_("monster", "Stalker"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv2.TRN", 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 5, 7, 9, 30, 45, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 1, 40, 8, 8, 16, 0, 0, 0, 0, 30, MonsterClass::Demon, 0 , IMMUNE_NULL_40 , 3, 0, 630 }, -/* MT_UNSEEN */ { P_("monster", "Unseen"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv3.TRN", 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 6, 8, 11, 35, 50, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 2, 45, 8, 12, 20, 0, 0, 0, 0, 30, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 935 }, -/* MT_ILLWEAV */ { P_("monster", "Illusion Weaver"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv1.TRN", 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 13, 40, 60, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 3, 60, 8, 16, 24, 0, 0, 0, 0, 30, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 1500 }, -/* MT_LRDSAYTR*/ { P_("monster", "Satyr Lord"), "GoatLord\\GoatL", "Monsters\\newsfx\\Satyr%c%i.WAV", nullptr, 160, 800, false, false, false, { 13, 13, 14, 9, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 28, 160, 200, AI_SKELSD, MFLAG_SEARCH , 3, 90, 8, 20, 30, 0, 0, 0, 0, 70, MonsterClass::Animal, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 2800 }, -/* MT_NGOATMC */ { P_("monster", "Flesh Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", nullptr, 128, 1030, true, false, false, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 4, 6, 8, 30, 45, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 50, 8, 4, 10, 0, 0, 0, 0, 40, MonsterClass::Demon, 0 , 0 , 3, 0, 460 }, -/* MT_BGOATMC */ { P_("monster", "Stone Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Beige.TRN", 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 5, 7, 10, 40, 55, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 60, 8, 6, 12, 0, 0, 0, 0, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 685 }, -/* MT_RGOATMC */ { P_("monster", "Fire Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Red.TRN", 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 6, 8, 12, 50, 65, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 70, 8, 8, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, RESIST_FIRE , IMMUNE_FIRE , 3, 0, 906 }, -/* MT_GGOATMC */ { P_("monster", "Night Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Gray.TRN", 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 7, 9, 14, 55, 70, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 80, 8, 10, 20, 15, 0, 30, 30, 50, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 1190 }, -/* MT_FIEND */ { P_("monster", "Fiend"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\red.trn", 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 2, 3, 3, 3, 6, AI_BAT, 0 , 0, 35, 5, 1, 6, 0, 0, 0, 0, 0, MonsterClass::Animal, 0 , 0 , 6, T_NODROP, 102 }, -/* MT_BLINK */ { P_("monster", "Blink"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", nullptr, 96, 364, false, false, false, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 3, 5, 7, 12, 28, AI_BAT, 0 , 1, 45, 5, 1, 8, 0, 0, 0, 0, 15, MonsterClass::Animal, 0 , 0 , 6, T_NODROP, 340 }, -/* MT_GLOOM */ { P_("monster", "Gloom"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\grey.trn", 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 4, 6, 9, 28, 36, AI_BAT, MFLAG_SEARCH , 2, 70, 5, 4, 12, 0, 0, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC | IMMUNE_NULL_40 , 6, T_NODROP, 509 }, -/* MT_FAMILIAR*/ { P_("monster", "Familiar"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\orange.trn", 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 13, 20, 35, AI_BAT, MFLAG_SEARCH , 3, 50, 5, 4, 16, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, T_NODROP, 448 }, -/* MT_NGOATBW */ { P_("monster", "Flesh Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", nullptr, 128, 1040, false, false, false, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 4, 6, 8, 20, 35, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 0, 35, 13, 1, 7, 0, 0, 0, 0, 35, MonsterClass::Demon, 0 , 0 , 3, 0, 448 }, -/* MT_BGOATBW */ { P_("monster", "Stone Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Beige.TRN", 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 5, 7, 10, 30, 40, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 1, 40, 13, 2, 9, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 645 }, -/* MT_RGOATBW */ { P_("monster", "Fire Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Red.TRN", 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 6, 8, 12, 40, 50, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 45, 13, 3, 11, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_FIRE , IMMUNE_FIRE , 3, 0, 822 }, -/* MT_GGOATBW */ { P_("monster", "Night Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Gray.TRN", 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 7, 9, 14, 50, 65, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 50, 13, 4, 13, 15, 0, 0, 0, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 1092 }, -/* MT_NACID */ { P_("monster", "Acid Beast"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 128, 716, true, true, false, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 11, 40, 66, AI_ACID, 0 , 0, 40, 8, 4, 12, 25, 8, 0, 0, 30, MonsterClass::Animal, IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_ACID , 3, 0, 846 }, -/* MT_RACID */ { P_("monster", "Poison Spitter"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidBlk.TRN", 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 8, 10, 15, 60, 85, AI_ACID, 0 , 1, 45, 8, 4, 16, 25, 8, 0, 0, 30, MonsterClass::Animal, IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_ACID , 3, 0, 1248 }, -/* MT_BACID */ { P_("monster", "Pit Beast"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidB.TRN", 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 10, 12, 21, 80, 110, AI_ACID, 0 , 2, 55, 8, 8, 18, 35, 8, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_ACID , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_ACID , 3, 0, 2060 }, -/* MT_XACID */ { P_("monster", "Lava Maw"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidR.TRN", 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 12, 14, 25, 100, 150, AI_ACID, 0 , 3, 65, 8, 10, 20, 40, 8, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_ACID , 3, 0, 2940 }, -/* MT_SKING */ { P_("monster", "Skeleton King"), "SKing\\SKing", "Monsters\\SKing\\SKing%c%i.WAV", "Monsters\\SkelAxe\\White.TRN", 160, 1010, true, true, true, { 8, 6, 16, 6, 16, 6 }, { 2, 1, 1, 1, 1, 2 }, 4, 4, 9, 140, 140, AI_SKELKING, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 60, 8, 6, 16, 0, 0, 0, 0, 70, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7,T_UNIQ+UITEM_SKCROWN, 570 }, -/* MT_CLEAVER */ { P_("monster", "The Butcher"), "FatC\\FatC", "Monsters\\FatC\\FatC%c%i.WAV", nullptr, 128, 980, false, false, false, { 10, 8, 12, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 1, 1, 1, 320, 320, AI_CLEAVER, 0 , 3, 50, 8, 6, 12, 0, 0, 0, 0, 50, MonsterClass::Demon, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3,T_UNIQ+UITEM_CLEAVER, 710 }, -/* MT_FAT */ { P_("monster", "Overlord"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, 128, 1130, true, false, false, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 5, 7, 10, 60, 80, AI_FAT, 0 , 0, 55, 8, 6, 12, 0, 0, 0, 0, 55, MonsterClass::Demon, 0 , RESIST_FIRE , 3, 0, 635 }, -/* MT_MUDMAN, */ { P_("monster", "Mud Man"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\Blue.TRN", 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 7, 9, 14, 100, 125, AI_FAT, MFLAG_SEARCH , 1, 60, 8, 8, 16, 0, 0, 0, 0, 60, MonsterClass::Demon, 0 , IMMUNE_LIGHTNING , 3, 0, 1165 }, -/* MT_TOAD */ { P_("monster", "Toad Demon"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\FatB.TRN", 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 8, 10, 16, 135, 160, AI_FAT, MFLAG_SEARCH , 2, 70, 8, 8, 16, 40, 0, 8, 20, 65, MonsterClass::Demon, IMMUNE_MAGIC , IMMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 1380 }, -/* MT_FLAYED */ { P_("monster", "Flayed One"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\FatF.TRN", 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 10, 12, 20, 160, 200, AI_FAT, MFLAG_SEARCH , 3, 85, 8, 10, 20, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 2058 }, -/* MT_WYRM */ { P_("monster", "Wyrm"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 5, 7, 11, 60, 90, AI_SKELSD, 0 , 0, 40, 8, 4, 10, 0, 0, 0, 0, 25, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 660 }, -/* MT_CAVSLUG */ { P_("monster", "Cave Slug"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 13, 75, 110, AI_SKELSD, 0 , 1, 50, 8, 6, 13, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 994 }, -/* MT_DVLWYRM */ { P_("monster", "Devil Wyrm"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 7, 9, 15, 100, 140, AI_SKELSD, 0 , 2, 55, 8, 8, 16, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC | RESIST_FIRE , RESIST_MAGIC | RESIST_FIRE , 3, 0, 1320 }, -/* MT_DEVOUR */ { P_("monster", "Devourer"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 8, 10, 17, 125, 200, AI_SKELSD, 0 , 3, 60, 8, 10, 20, 0, 0, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 1827 }, -/* MT_NMAGMA */ { P_("monster", "Magma Demon"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", nullptr, 128, 1680, true, true, false, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 8, 9, 13, 50, 70, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 45, 4, 2, 10, 50, 13, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1076 }, -/* MT_YMAGMA */ { P_("monster", "Blood Stone"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Yellow.TRN", 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 14, 55, 75, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 50, 4, 2, 12, 50, 14, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1309 }, -/* MT_BMAGMA */ { P_("monster", "Hell Stone"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Blue.TRN", 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 16, 60, 80, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 60, 4, 2, 20, 60, 14, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1680 }, -/* MT_WMAGMA */ { P_("monster", "Lava Lord"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Wierd.TRN", 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 18, 70, 85, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 75, 4, 4, 24, 60, 14, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 2124 }, -/* MT_HORNED */ { P_("monster", "Horned Demon"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", nullptr, 160, 1630, true, true, false, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 7, 9, 13, 40, 80, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 60, 7, 2, 16, 100, 0, 5, 32, 40, MonsterClass::Animal, 0 , RESIST_FIRE , 7, 0, 1172 }, -/* MT_MUDRUN */ { P_("monster", "Mud Runner"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\Orange.TRN", 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 15, 50, 90, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 70, 7, 6, 18, 100, 0, 12, 36, 45, MonsterClass::Animal, 0 , RESIST_FIRE , 7, 0, 1404 }, -/* MT_FROSTC */ { P_("monster", "Frost Charger"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\Blue.TRN", 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 17, 60, 100, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 8, 20, 100, 0, 20, 40, 50, MonsterClass::Animal, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_LIGHTNING , 7, 0, 1720 }, -/* MT_OBLORD */ { P_("monster", "Obsidian Lord"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\RhinoB.TRN", 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 10, 12, 19, 70, 110, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 7, 10, 22, 100, 0, 20, 50, 55, MonsterClass::Animal, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 1809 }, -/* MT_BONEDMN */ { P_("monster", "oldboned"), "Demskel\\Demskl", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 128, 1740, true, true, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 24, 24, 12, 70, 70, AI_STORM, 0 , 0, 60, 8, 6, 14, 12, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 7, 0, 1344 }, -/* MT_REDDTH */ { P_("monster", "Red Death"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 8, 10, 16, 96, 96, AI_STORM, 0 , 1, 75, 5, 10, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 2168 }, -/* MT_LTCHDMN */ { P_("monster", "Litch Demon"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 9, 11, 18, 110, 110, AI_STORM, 0 , 2, 80, 5, 10, 24, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 2736 }, -/* MT_UDEDBLRG*/ { P_("monster", "Undead Balrog"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 11, 13, 22, 130, 130, AI_STORM, 0 , 3, 85, 5, 12, 30, 0, 0, 0, 0, 65, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3575 }, -/* MT_INCIN */ { P_("monster", "Incinerator"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 21, 22, 16, 30, 45, AI_FIREMAN, 0 , 0, 75, 8, 8, 16, 0, 0, 0, 0, 25, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 1888 }, -/* MT_FLAMLRD */ { P_("monster", "Flame Lord"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 22, 23, 18, 40, 55, AI_FIREMAN, 0 , 1, 75, 8, 10, 20, 0, 0, 0, 0, 25, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 2250 }, -/* MT_DOOMFIRE*/ { P_("monster", "Doom Fire"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 23, 24, 20, 50, 65, AI_FIREMAN, 0 , 2, 80, 8, 12, 24, 0, 0, 0, 0, 30, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 2740 }, -/* MT_HELLBURN*/ { P_("monster", "Hell Burner"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 24, 24, 22, 60, 80, AI_FIREMAN, 0 , 3, 85, 8, 15, 30, 0, 0, 0, 0, 30, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 3355 }, -/* MT_STORM */ { P_("monster", "Red Storm"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 9, 11, 18, 55, 110, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 80, 5, 8, 18, 75, 8, 4, 16, 30, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2160 }, -/* MT_RSTORM */ { P_("monster", "Storm Rider"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", nullptr, 160, 1740, true, true, false, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 10, 12, 20, 60, 120, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 80, 5, 8, 18, 80, 8, 4, 16, 30, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2391 }, -/* MT_STORML */ { P_("monster", "Storm Lord"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv2.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 11, 13, 22, 75, 135, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 85, 5, 12, 24, 75, 8, 4, 16, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2775 }, -/* MT_MAEL */ { P_("monster", "Maelstrom"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv1.TRN", 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 12, 14, 24, 90, 150, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 5, 12, 28, 75, 8, 4, 16, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3177 }, -/* MT_BIGFALL */ { P_("monster", "Devil Kin Brute"), "BigFall\\Fallg", "Monsters\\newsfx\\KBrute%c%i.WAV", nullptr, 128, 800, true, false, false, { 10, 8, 11, 8, 17, 0 }, { 1, 1, 1, 1, 2, 2 }, 21, 22, 27, 120, 160, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 100, 6, 18, 24, 0, 0, 0, 0, 70, MonsterClass::Animal, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 2400 }, -/* MT_WINGED */ { P_("monster", "Winged-Demon"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", nullptr, 160, 1650, true, false, false, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 2 }, 5, 7, 9, 45, 60, AI_GARG, MFLAG_CAN_OPEN_DOOR, 0, 50, 7, 10, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 6, 0, 662 }, -/* MT_GARGOYLE*/ { P_("monster", "Gargoyle"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GarE.TRN", 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 2 }, 7, 9, 13, 60, 90, AI_GARG, MFLAG_CAN_OPEN_DOOR, 1, 65, 7, 10, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 1205 }, -/* MT_BLOODCLW*/ { P_("monster", "Blood Claw"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GargBr.TRN", 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 1 }, 9, 11, 19, 75, 125, AI_GARG, MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 14, 22, 0, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 1873 }, -/* MT_DEATHW */ { P_("monster", "Death Wing"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GargB.TRN", 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 1 }, 10, 12, 23, 90, 150, AI_GARG, MFLAG_CAN_OPEN_DOOR, 3, 95, 7, 16, 28, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 2278 }, -/* MT_MEGA */ { P_("monster", "Slayer"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", nullptr, 160, 2220, true, true, false, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 10, 12, 20, 120, 140, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 100, 8, 12, 20, 0, 3, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 2300 }, -/* MT_GUARD */ { P_("monster", "Guardian"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Guard.TRN", 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 11, 13, 22, 140, 160, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 110, 8, 14, 22, 0, 3, 0, 0, 65, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 2714 }, -/* MT_VTEXLRD */ { P_("monster", "Vortex Lord"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Vtexl.TRN", 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 12, 14, 24, 160, 180, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 120, 8, 18, 24, 0, 3, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3252 }, -/* MT_BALROG */ { P_("monster", "Balrog"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Balr.TRN", 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 13, 15, 26, 180, 200, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 130, 8, 22, 30, 0, 3, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3643 }, -/* MT_NSNAKE */ { P_("monster", "Cave Viper"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", nullptr, 160, 1270, false, false, false, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 11, 13, 21, 100, 150, AI_SNAKE, MFLAG_SEARCH , 0, 90, 8, 8, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC , IMMUNE_MAGIC , 7, 0, 2725 }, -/* MT_RSNAKE */ { P_("monster", "Fire Drake"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\SnakR.TRN", 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 12, 14, 23, 120, 170, AI_SNAKE, MFLAG_SEARCH , 1, 105, 8, 12, 24, 0, 0, 0, 0, 65, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 3139 }, -/* MT_BSNAKE */ { P_("monster", "Gold Viper"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\Snakg.TRN", 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 14, 25, 140, 180, AI_SNAKE, MFLAG_SEARCH , 2, 120, 8, 15, 26, 0, 0, 0, 0, 70, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_LIGHTNING , 7, 0, 3540 }, -/* MT_GSNAKE */ { P_("monster", "Azure Drake"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\Snakb.TRN", 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 15, 16, 27, 160, 200, AI_SNAKE, MFLAG_SEARCH , 3, 130, 8, 18, 30, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 3791 }, -/* MT_NBLACK */ { P_("monster", "Black Knight"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", nullptr, 160, 2120, false, false, false, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 12, 14, 24, 150, 150, AI_SKELSD, MFLAG_SEARCH , 0, 110, 8, 15, 20, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3360 }, -/* MT_RTBLACK */ { P_("monster", "Doom Guard"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntRT.TRN", 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 15, 26, 165, 165, AI_SKELSD, MFLAG_SEARCH , 0, 130, 8, 18, 25, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 7, 0, 3650 }, -/* MT_BTBLACK */ { P_("monster", "Steel Lord"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntBT.TRN", 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 14, 16, 28, 180, 180, AI_SKELSD, MFLAG_SEARCH , 1, 120, 8, 20, 30, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4252 }, -/* MT_RBLACK */ { P_("monster", "Blood Knight"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntBe.TRN", 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 14, 30, 200, 200, AI_SKELSD, MFLAG_SEARCH , 1, 130, 8, 25, 35, 0, 0, 0, 0, 85, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 5130 }, -/* MT_UNRAV */ { P_("monster", "The Shredded"), "Unrav\\Unrav", "Monsters\\newsfx\\Shred%c%i.WAV", nullptr, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 17, 18, 23, 70, 90, AI_SKELSD, 0 , 0, 75, 7, 4, 12, 0, 0, 0, 0, 65, MonsterClass::Undead, RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 900 }, -/* MT_HOLOWONE*/ { P_("monster", "Hollow One"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 18, 19, 27, 135, 240, AI_SKELSD, 0 , 1, 75, 7, 12, 24, 0, 0, 0, 0, 75, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4374 }, -/* MT_PAINMSTR*/ { P_("monster", "Pain Master"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 19, 20, 29, 110, 200, AI_SKELSD, 0 , 2, 80, 7, 16, 30, 0, 0, 0, 0, 80, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 5147 }, -/* MT_REALWEAV*/ { P_("monster", "Reality Weaver"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 20, 20, 30, 135, 240, AI_SKELSD, 0 , 3, 85, 7, 20, 35, 0, 0, 0, 0, 85, MonsterClass::Undead, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 5925 }, -/* MT_SUCCUBUS*/ { P_("monster", "Succubus"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", nullptr, 128, 980, false, false, false, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 12, 14, 24, 120, 150, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 0, 100, 10, 1, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC , IMMUNE_MAGIC | RESIST_FIRE , 3, 0, 3696 }, -/* MT_SNOWWICH*/ { P_("monster", "Snow Witch"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succb.TRN", 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 13, 15, 26, 135, 175, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 1, 110, 10, 1, 24, 0, 0, 0, 0, 65, MonsterClass::Demon, RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4084 }, -/* MT_HLSPWN */ { P_("monster", "Hell Spawn"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succrw.TRN", 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 14, 16, 28, 150, 200, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 115, 10, 1, 30, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 4480 }, -/* MT_SOLBRNR */ { P_("monster", "Soul Burner"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succbw.TRN", 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 15, 16, 30, 140, 225, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 120, 10, 1, 35, 0, 0, 0, 0, 85, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 4644 }, -/* MT_COUNSLR */ { P_("monster", "Counselor"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", nullptr, 128, 2000, true, false, false, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 13, 14, 25, 70, 70, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 0, 90, 8, 8, 20, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 4070 }, -/* MT_MAGISTR */ { P_("monster", "Magistrate"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselg.TRN", 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 14, 15, 27, 85, 85, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 1, 100, 8, 10, 24, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4478 }, -/* MT_CABALIST*/ { P_("monster", "Cabalist"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselgd.TRN", 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 15, 16, 29, 120, 120, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 2, 110, 8, 14, 30, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4929 }, -/* MT_ADVOCATE*/ { P_("monster", "Advocate"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselbk.TRN", 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 16, 16, 30, 145, 145, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 15, 25, 0, 0, 0, 0, 0, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4968 }, -/* MT_GOLEM */ { P_("monster", "Golem"), "Golem\\Golem", "Monsters\\Golem\\Golm%c%i.WAV", nullptr, 96, 386, true, false, false, { 0, 16, 12, 0, 12, 20 }, { 1, 1, 1, 1, 1, 1 }, 1, 1, 12, 1, 1, AI_GOLUM, MFLAG_CAN_OPEN_DOOR, 0, 0, 7, 1, 1, 0, 0, 0, 0, 1, MonsterClass::Demon, 0 , 0 , 0, 0, 0 }, -/* MT_DIABLO */ { P_("monster", "The Dark Lord"), "Diablo\\Diablo", "Monsters\\Diablo\\Diablo%c%i.WAV", nullptr, 160, 2000, true, true, false, { 16, 6, 16, 6, 16, 16 }, { 1, 1, 1, 1, 1, 1 }, 26, 26, 45, 3333, 3333, AI_DIABLO, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 220, 4, 30, 60, 0, 11, 0, 0, 90, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 31666 }, -/* MT_DARKMAGE*/ { P_("monster", "The Arch-Litch Malignus"), "DarkMage\\Dmage", "Monsters\\DarkMage\\Dmag%c%i.WAV", nullptr, 128, 1060, true, false, false, { 6, 1, 21, 6, 23, 18 }, { 1, 1, 1, 1, 1, 1 }, 21, 21, 30, 160, 160, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 20, 40, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4968 }, -/* MT_HELLBOAR*/ { P_("monster", "Hellboar"), "Fork\\Fork", "Monsters\\newsfx\\HBoar%c%i.WAV", nullptr, 188, 800, false, false, false, { 10, 10, 15, 6, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 23, 80, 100, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_SEARCH , 2, 70, 7, 16, 24, 0, 0, 0, 0, 60, MonsterClass::Demon, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 750 }, -/* MT_STINGER */ { P_("monster", "Stinger"), "Scorp\\Scorp", "Monsters\\newsfx\\Stingr%c%i.WAV", nullptr, 64, 305, false, false, false, { 10, 10, 12, 6, 15, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 30, 40, AI_SKELSD, 0 , 3, 85, 8, 1, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 1, 0, 500 }, -/* MT_PSYCHORB*/ { P_("monster", "Psychorb"), "Eye\\Eye", "Monsters\\newsfx\\psyco%c%i.WAV", nullptr, 156, 800, false, false, false, { 12, 13, 13, 7, 21, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 20, 30, AI_PSYCHORB, 0 , 3, 80, 8, 10, 10, 0, 0, 0, 0, 40, MonsterClass::Animal, 0 , RESIST_FIRE , 6, 0, 450 }, -/* MT_ARACHNON*/ { P_("monster", "Arachnon"), "Spider\\Spider", "Monsters\\newsfx\\SLord%c%i.WAV", nullptr, 148, 800, false, false, false, { 12, 10, 15, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 60, 80, AI_SKELSD, MFLAG_SEARCH , 3, 50, 8, 5, 15, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 7, 0, 500 }, -/* MT_FELLTWIN*/ { P_("monster", "Felltwin"), "TSneak\\TSneak", "Monsters\\newsfx\\FTwin%c%i.WAV", nullptr, 128, 800, false, false, false, { 13, 13, 15, 11, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 50, 70, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 70, 8, 10, 18, 0, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 600 }, -/* MT_HORKSPWN*/ { P_("monster", "Hork Spawn"), "Spawn\\Spawn", "Monsters\\newsfx\\HSpawn%c%i.WAV", nullptr, 164, 520, false, true, false, { 15, 12, 14, 11, 14, 0 }, { 1, 1, 1, 1, 1, 1 }, 18, 19, 22, 30, 30, AI_SKELSD, 0 , 3, 60, 8, 10, 25, 0, 0, 0, 0, 25, MonsterClass::Demon, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 250 }, -/* MT_VENMTAIL*/ { P_("monster", "Venomtail"), "WScorp\\WScorp", "Monsters\\newsfx\\Stingr%c%i.WAV", nullptr, 86, 305, false, false, false, { 10, 10, 12, 6, 15, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 40, 50, AI_SKELSD, 0 , 3, 85, 8, 1, 30, 0, 0, 0, 0, 60, MonsterClass::Animal, RESIST_LIGHTNING , IMMUNE_LIGHTNING , 1, 0, 1000 }, -/* MT_NECRMORB*/ { P_("monster", "Necromorb"), "Eye2\\Eye2", "Monsters\\newsfx\\Psyco%c%i.WAV", nullptr, 140, 800, false, false, false, { 12, 13, 13, 7, 21, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 30, 40, AI_NECROMORB, 0 , 3, 80, 8, 20, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, RESIST_FIRE , IMMUNE_FIRE | RESIST_LIGHTNING , 6, 0, 1100 }, -/* MT_SPIDLORD*/ { P_("monster", "Spider Lord"), "bSpidr\\bSpidr", "Monsters\\newsfx\\SLord%c%i.WAV", nullptr, 148, 800, true, true, false, { 12, 10, 15, 6, 20, 10 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 80, 100, AI_ACID, MFLAG_SEARCH , 3, 60, 8, 8, 20, 75, 8, 10, 10, 60, MonsterClass::Animal, RESIST_LIGHTNING , RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 1250 }, -/* MT_LASHWORM*/ { P_("monster", "Lashworm"), "Clasp\\Clasp", "Monsters\\newsfx\\Lworm%c%i.WAV", nullptr, 176, 800, false, false, false, { 10, 12, 15, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 19, 20, 20, 30, 30, AI_SKELSD, 0 , 3, 90, 8, 12, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 600 }, -/* MT_TORCHANT*/ { P_("monster", "Torchant"), "AntWorm\\Worm", "Monsters\\newsfx\\TchAnt%c%i.WAV", nullptr, 192, 800, false, false, false, { 14, 12, 12, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 22, 60, 80, AI_TORCHANT, 0 , 3, 75, 8, 20, 30, 0, 0, 0, 0, 70, MonsterClass::Animal, IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 1250 }, -/* MT_HORKDMN */ { P_("monster", "Hork Demon"), "HorkD\\HorkD", "Monsters\\newsfx\\HDemon%c%i.WAV", nullptr, 138, 800, true, true, false, { 15, 8, 16, 6, 16, 9 }, { 2, 1, 1, 1, 1, 2 }, 19, 19, 27, 120, 160, AI_SKELSD, 0 , 3, 60, 8, 20, 35, 80, 8, 0, 0, 80, MonsterClass::Demon, RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2000 }, -/* MT_DEFILER */ { P_("monster", "Hell Bug"), "Hellbug\\Hellbg", "Monsters\\newsfx\\Defile%c%i.WAV", nullptr, 198, 800, true, true, false, { 8, 8, 14, 6, 14, 12 }, { 1, 1, 1, 1, 1, 1 }, 20, 20, 30, 240, 240, AI_SKELSD, MFLAG_SEARCH , 3, 110, 8, 20, 30, 90, 8, 50, 60, 80, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 5000 }, -/* MT_GRAVEDIG*/ { P_("monster", "Gravedigger"), "Gravdg\\Gravdg", "Monsters\\newsfx\\GDiggr%c%i.WAV", nullptr, 124, 800, true, true, false, { 24, 24, 12, 6, 16, 16 }, { 2, 1, 1, 1, 1, 1 }, 21, 21, 26, 120, 240, AI_SCAV, MFLAG_CAN_OPEN_DOOR, 3, 80, 6, 2, 12, 0, 0, 0, 0, 20, MonsterClass::Undead, IMMUNE_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 2000 }, -/* MT_TOMBRAT */ { P_("monster", "Tomb Rat"), "Rat\\Rat", "Monsters\\newsfx\\TmbRat%c%i.WAV", nullptr, 104, 550, false, false, false, { 11, 8, 12, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 24, 80, 120, AI_SKELSD, 0 , 3, 120, 8, 12, 25, 0, 0, 0, 0, 30, MonsterClass::Animal, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 1800 }, -/* MT_FIREBAT */ { P_("monster", "Firebat"), "Hellbat\\Helbat", "Monsters\\newsfx\\HelBat%c%i.WAV", nullptr, 96, 550, false, false, false, { 18, 16, 14, 6, 18, 11 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 24, 60, 80, AI_FIREBAT, 0 , 3, 100, 8, 15, 20, 0, 0, 0, 0, 70, MonsterClass::Animal, IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 2400 }, -/* MT_SKLWING */ { P_("monster", "Skullwing"), "Demskel\\Demskl", "Monsters\\newsfx\\SWing%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 128, 1740, true, false, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 21, 22, 27, 70, 70, AI_SKELSD, 0 , 0, 75, 7, 15, 20, 75, 9, 15, 20, 80, MonsterClass::Undead, RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3000 }, -/* MT_LICH */ { P_("monster", "Lich"), "Lich\\Lich", "Monsters\\newsfx\\Lich%c%i.WAV", nullptr, 96, 800, false, true, false, { 12, 10, 10, 7, 21, 0 }, { 2, 1, 1, 1, 2, 1 }, 21, 22, 25, 80, 100, AI_LICH, 0 , 3, 100, 8, 15, 20, 0, 0, 0, 0, 60, MonsterClass::Undead, RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 3000 }, -/* MT_CRYPTDMN*/ { P_("monster", "Crypt Demon"), "Bubba\\Bubba", "Monsters\\newsfx\\Crypt%c%i.WAV", nullptr, 154, 800, false, true, false, { 8, 18, 12, 8, 21, 0 }, { 3, 1, 1, 1, 1, 1 }, 22, 23, 28, 200, 240, AI_SKELSD, 0 , 3, 100, 8, 20, 40, 0, 0, 0, 0, 85, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 3200 }, -/* MT_HELLBAT */ { P_("monster", "Hellbat"), "Hellbat2\\bhelbt", "Monsters\\newsfx\\HelBat%c%i.WAV", nullptr, 96, 550, true, false, false, { 18, 16, 14, 6, 18, 11 }, { 2, 1, 1, 1, 1, 1 }, 23, 24, 29, 100, 140, AI_TORCHANT, 0 , 3, 110, 8, 30, 30, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 3600 }, -/* MT_BONEDEMN*/ { P_("monster", "Bone Demon"), "Demskel\\Demskl", "Monsters\\newsfx\\SWing%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", 128, 1740, true, true, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 23, 24, 30, 240, 280, AI_BONEDEMON, 0 , 0, 100, 8, 40, 50, 160, 12, 50, 50, 50, MonsterClass::Undead, IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 5000 }, -/* MT_ARCHLICH*/ { P_("monster", "Arch Lich"), "Lich2\\Lich2", "Monsters\\newsfx\\Lich%c%i.WAV", nullptr, 136, 800, false, true, false, { 12, 10, 10, 7, 21, 0 }, { 2, 1, 1, 1, 2, 1 }, 23, 24, 30, 180, 200, AI_ARCHLICH, 0 , 3, 120, 8, 30, 30, 0, 0, 0, 0, 75, MonsterClass::Undead, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4000 }, -/* MT_BICLOPS */ { P_("monster", "Biclops"), "Byclps\\Byclps", "Monsters\\newsfx\\Biclop%c%i.WAV", nullptr, 180, 800, false, false, false, { 10, 11, 16, 6, 16, 0 }, { 2, 1, 1, 1, 2, 1 }, 23, 24, 30, 200, 240, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_CAN_OPEN_DOOR, 3, 90, 8, 40, 50, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_LIGHTNING , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 4000 }, -/* MT_FLESTHNG*/ { P_("monster", "Flesh Thing"), "Flesh\\Flesh", "Monsters\\newsfx\\FleshT%c%i.WAV", nullptr, 164, 800, false, true, false, { 15, 24, 15, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 23, 24, 28, 300, 400, AI_SKELSD, 0 , 3, 150, 8, 12, 18, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 4000 }, -/* MT_REAPER */ { P_("monster", "Reaper"), "Reaper\\Reap", "Monsters\\newsfx\\Reaper%c%i.WAV", nullptr, 180, 800, false, false, false, { 12, 10, 14, 6, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 23, 24, 30, 260, 300, AI_SKELSD, 0 , 3, 120, 8, 30, 35, 0, 0, 0, 0, 90, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 6000 }, +/* MT_NZOMBIE */ { P_("monster", "Zombie"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 799, false, false, false, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 1, 2, 1, 4, 7, AI_ZOMBIE, 0 , 0, 10, 8, 2, 5, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 54 }, +/* MT_BZOMBIE */ { P_("monster", "Ghoul"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Bluered.TRN", MonsterAvailability::Always, 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 2, 7, 11, AI_ZOMBIE, 0 , 1, 10, 8, 3, 10, 0, 0, 0, 0, 10, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 58 }, +/* MT_GZOMBIE */ { P_("monster", "Rotting Carcass"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Grey.TRN", MonsterAvailability::Always, 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 4, 15, 25, AI_ZOMBIE, 0 , 2, 25, 8, 5, 15, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 136 }, +/* MT_YZOMBIE */ { P_("monster", "Black Death"), "Zombie\\Zombie", "Monsters\\Zombie\\Zombie%c%i.WAV", "Monsters\\Zombie\\Yellow.TRN", MonsterAvailability::Always, 128, 799, false, false, true, { 11, 24, 12, 6, 16, 0 }, { 4, 1, 1, 1, 1, 1 }, 3, 5, 6, 25, 40, AI_ZOMBIE, 0 , 3, 30, 8, 6, 22, 0, 0, 0, 0, 20, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 240 }, +/* MT_RFALLSP */ { P_("monster", "Fallen One"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\FallenT.TRN", MonsterAvailability::Always, 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 1, 2, 1, 1, 4, AI_FALLEN, 0 , 0, 15, 7, 1, 3, 0, 5, 0, 0, 0, MonsterClass::Animal, 0 , 0 , 3, 0, 46 }, +/* MT_DFALLSP */ { P_("monster", "Carver"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\Dark.TRN", MonsterAvailability::Always, 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 2, 3, 3, 4, 8, AI_FALLEN, 0 , 2, 20, 7, 2, 5, 0, 5, 0, 0, 5, MonsterClass::Animal, 0 , 0 , 3, 0, 80 }, +/* MT_YFALLSP */ { P_("monster", "Devil Kin"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 543, true, true, false, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 2, 4, 5, 12, 24, AI_FALLEN, 0 , 2, 25, 7, 3, 7, 0, 5, 0, 0, 10, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 155 }, +/* MT_BFALLSP */ { P_("monster", "Dark One"), "FalSpear\\Phall", "Monsters\\FalSpear\\Phall%c%i.WAV", "Monsters\\FalSpear\\Blue.TRN", MonsterAvailability::Always, 128, 543, true, true, true, { 11, 11, 13, 11, 18, 13 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 7, 20, 36, AI_FALLEN, 0 , 3, 30, 7, 4, 8, 0, 5, 0, 0, 15, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 255 }, +/* MT_WSKELAX */ { P_("monster", "Skeleton"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\White.TRN", MonsterAvailability::Always, 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 5, 1, 1, 1, 1, 1 }, 1, 2, 1, 2, 4, AI_SKELSD, 0 , 0, 20, 8, 1, 4, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 64 }, +/* MT_TSKELAX */ { P_("monster", "Corpse Axe"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\Skelt.TRN", MonsterAvailability::Always, 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 2, 4, 7, AI_SKELSD, 0 , 1, 25, 8, 3, 5, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 68 }, +/* MT_RSKELAX */ { P_("monster", "Burning Dead"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 553, true, false, false, { 12, 8, 13, 6, 17, 16 }, { 2, 1, 1, 1, 1, 1 }, 2, 4, 4, 8, 12, AI_SKELSD, 0 , 2, 30, 8, 3, 7, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 154 }, +/* MT_XSKELAX */ { P_("monster", "Horror"), "SkelAxe\\SklAx", "Monsters\\SkelAxe\\SklAx%c%i.WAV", "Monsters\\SkelAxe\\Black.TRN", MonsterAvailability::Always, 128, 553, true, false, true, { 12, 8, 13, 6, 17, 16 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 6, 12, 20, AI_SKELSD, 0 , 3, 35, 8, 4, 9, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 264 }, +/* MT_RFALLSD */ { P_("monster", "Fallen One"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\FallenT.TRN", MonsterAvailability::Always, 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 1, 2, 1, 2, 5, AI_FALLEN, 0 , 0, 15, 8, 1, 4, 0, 5, 0, 0, 10, MonsterClass::Animal, 0 , 0 , 3, 0, 52 }, +/* MT_DFALLSD */ { P_("monster", "Carver"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\Dark.TRN", MonsterAvailability::Always, 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 2, 3, 3, 5, 9, AI_FALLEN, 0 , 1, 20, 8, 2, 7, 0, 5, 0, 0, 15, MonsterClass::Animal, 0 , 0 , 3, 0, 90 }, +/* MT_YFALLSD */ { P_("monster", "Devil Kin"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 623, true, true, false, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 2, 4, 5, 16, 24, AI_FALLEN, 0 , 2, 25, 8, 4, 10, 0, 5, 0, 0, 20, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 180 }, +/* MT_BFALLSD */ { P_("monster", "Dark One"), "FalSword\\Fall", "Monsters\\FalSword\\Fall%c%i.WAV", "Monsters\\FalSword\\Blue.TRN", MonsterAvailability::Always, 128, 623, true, true, true, { 12, 12, 13, 11, 14, 15 }, { 3, 1, 1, 1, 1, 1 }, 3, 5, 7, 24, 36, AI_FALLEN, 0 , 3, 30, 8, 4, 12, 0, 5, 0, 0, 25, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 280 }, +/* MT_NSCAV */ { P_("monster", "Scavenger"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 410, true, false, false, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 1, 3, 2, 3, 6, AI_SCAV, 0 , 0, 20, 7, 1, 5, 0, 0, 0, 0, 10, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 80 }, +/* MT_BSCAV */ { P_("monster", "Plague Eater"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavBr.TRN", MonsterAvailability::Always, 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 2, 4, 4, 12, 24, AI_SCAV, 0 , 1, 30, 7, 1, 8, 0, 0, 0, 0, 20, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 3, 0, 188 }, +/* MT_WSCAV */ { P_("monster", "Shadow Beast"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavBe.TRN", MonsterAvailability::Always, 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 3, 5, 6, 24, 36, AI_SCAV, 0 , 2, 35, 7, 3, 12, 0, 0, 0, 0, 25, MonsterClass::Animal, IMMUNE_NULL_40 , RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 375 }, +/* MT_YSCAV */ { P_("monster", "Bone Gasher"), "Scav\\Scav", "Monsters\\Scav\\Scav%c%i.WAV", "Monsters\\Scav\\ScavW.TRN", MonsterAvailability::Always, 128, 410, true, false, true, { 12, 8, 12, 6, 20, 11 }, { 2, 1, 1, 1, 1, 1 }, 4, 6, 8, 28, 40, AI_SCAV, 0 , 3, 35, 7, 5, 15, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_NULL_40 , RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 552 }, +/* MT_WSKELBW */ { P_("monster", "Skeleton"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\White.TRN", MonsterAvailability::Always, 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 3, 3, 2, 4, AI_SKELBOW, 0 , 0, 15, 12, 1, 2, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 110 }, +/* MT_TSKELBW */ { P_("monster", "Corpse Bow"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\Skelt.TRN", MonsterAvailability::Always, 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 5, 8, 16, AI_SKELBOW, 0 , 1, 25, 12, 1, 4, 0, 0, 0, 0, 0, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 210 }, +/* MT_RSKELBW */ { P_("monster", "Burning Dead"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 567, true, false, false, { 9, 8, 16, 5, 16, 16 }, { 2, 1, 1, 1, 1, 1 }, 3, 5, 7, 10, 24, AI_SKELBOW, 0 , 2, 30, 12, 1, 6, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 364 }, +/* MT_XSKELBW */ { P_("monster", "Horror"), "SkelBow\\SklBw", "Monsters\\SkelBow\\SklBw%c%i.WAV", "Monsters\\SkelBow\\Black.TRN", MonsterAvailability::Always, 128, 567, true, false, true, { 9, 8, 16, 5, 16, 16 }, { 3, 1, 1, 1, 1, 1 }, 4, 6, 9, 15, 45, AI_SKELBOW, 0 , 3, 35, 12, 2, 9, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 594 }, +/* MT_WSKELSD */ { P_("monster", "Skeleton Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\White.TRN", MonsterAvailability::Always, 128, 575, true, true, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 1, 3, 2, 3, 6, AI_SKELSD, 0 , 0, 20, 8, 2, 7, 0, 0, 0, 0, 10, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 90 }, +/* MT_TSKELSD */ { P_("monster", "Corpse Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\Skelt.TRN", MonsterAvailability::Always, 128, 575, true, false, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 2, 4, 4, 12, 20, AI_SKELSD, 0 , 1, 30, 8, 3, 9, 0, 0, 0, 0, 5, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 200 }, +/* MT_RSKELSD */ { P_("monster", "Burning Dead Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", nullptr, MonsterAvailability::Always, 128, 575, true, false, false, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 3, 5, 6, 16, 30, AI_SKELSD, 0 , 2, 35, 8, 4, 10, 0, 0, 0, 0, 15, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 3, 0, 393 }, +/* MT_XSKELSD */ { P_("monster", "Horror Captain"), "SkelSd\\SklSr", "Monsters\\SkelSd\\SklSr%c%i.WAV", "Monsters\\SkelSd\\Black.TRN", MonsterAvailability::Always, 128, 575, true, false, true, { 13, 8, 12, 7, 15, 16 }, { 4, 1, 1, 1, 1, 1 }, 4, 6, 8, 35, 50, AI_SKELSD, MFLAG_SEARCH , 3, 40, 8, 5, 14, 0, 0, 0, 0, 30, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 604 }, +/* MT_INVILORD*/ { P_("monster", "Invisible Lord"), "TSneak\\TSneak", "Monsters\\TSneak\\Sneakl%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 800, false, false, false, { 13, 13, 15, 11, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 14, 278, 278, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 65, 8, 16, 30, 0, 0, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 2000 }, +/* MT_SNEAK */ { P_("monster", "Hidden"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 992, true, false, false, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 2, 5, 5, 8, 24, AI_SNEAK, MFLAG_HIDDEN , 0, 35, 8, 3, 6, 0, 0, 0, 0, 25, MonsterClass::Demon, 0 , IMMUNE_NULL_40 , 3, 0, 278 }, +/* MT_STALKER */ { P_("monster", "Stalker"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv2.TRN", MonsterAvailability::Retail, 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 5, 7, 9, 30, 45, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 1, 40, 8, 8, 16, 0, 0, 0, 0, 30, MonsterClass::Demon, 0 , IMMUNE_NULL_40 , 3, 0, 630 }, +/* MT_UNSEEN */ { P_("monster", "Unseen"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv3.TRN", MonsterAvailability::Retail, 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 6, 8, 11, 35, 50, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 2, 45, 8, 12, 20, 0, 0, 0, 0, 30, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 935 }, +/* MT_ILLWEAV */ { P_("monster", "Illusion Weaver"), "Sneak\\Sneak", "Monsters\\Sneak\\Sneak%c%i.WAV", "Monsters\\Sneak\\Sneakv1.TRN", MonsterAvailability::Retail, 128, 992, true, false, true, { 16, 8, 12, 8, 24, 15 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 13, 40, 60, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 3, 60, 8, 16, 24, 0, 0, 0, 0, 30, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 1500 }, +/* MT_LRDSAYTR*/ { P_("monster", "Satyr Lord"), "GoatLord\\GoatL", "Monsters\\newsfx\\Satyr%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 800, false, false, false, { 13, 13, 14, 9, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 28, 160, 200, AI_SKELSD, MFLAG_SEARCH , 3, 90, 8, 20, 30, 0, 0, 0, 0, 70, MonsterClass::Animal, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 2800 }, +/* MT_NGOATMC */ { P_("monster", "Flesh Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 1030, true, false, false, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 4, 6, 8, 30, 45, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 50, 8, 4, 10, 0, 0, 0, 0, 40, MonsterClass::Demon, 0 , 0 , 3, 0, 460 }, +/* MT_BGOATMC */ { P_("monster", "Stone Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Beige.TRN", MonsterAvailability::Retail, 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 5, 7, 10, 40, 55, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 60, 8, 6, 12, 0, 0, 0, 0, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 685 }, +/* MT_RGOATMC */ { P_("monster", "Fire Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Red.TRN", MonsterAvailability::Retail, 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 6, 8, 12, 50, 65, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 70, 8, 8, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, RESIST_FIRE , IMMUNE_FIRE , 3, 0, 906 }, +/* MT_GGOATMC */ { P_("monster", "Night Clan"), "GoatMace\\Goat", "Monsters\\GoatMace\\Goat%c%i.WAV", "Monsters\\GoatMace\\Gray.TRN", MonsterAvailability::Retail, 128, 1030, true, false, true, { 12, 8, 12, 6, 20, 12 }, { 2, 1, 1, 1, 1, 1 }, 7, 9, 14, 55, 70, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 80, 8, 10, 20, 15, 0, 30, 30, 50, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 1190 }, +/* MT_FIEND */ { P_("monster", "Fiend"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\red.trn", MonsterAvailability::Always, 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 2, 3, 3, 3, 6, AI_BAT, 0 , 0, 35, 5, 1, 6, 0, 0, 0, 0, 0, MonsterClass::Animal, 0 , 0 , 6, T_NODROP, 102 }, +/* MT_BLINK */ { P_("monster", "Blink"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", nullptr, MonsterAvailability::Always, 96, 364, false, false, false, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 3, 5, 7, 12, 28, AI_BAT, 0 , 1, 45, 5, 1, 8, 0, 0, 0, 0, 15, MonsterClass::Animal, 0 , 0 , 6, T_NODROP, 340 }, +/* MT_GLOOM */ { P_("monster", "Gloom"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\grey.trn", MonsterAvailability::Always, 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 4, 6, 9, 28, 36, AI_BAT, MFLAG_SEARCH , 2, 70, 5, 4, 12, 0, 0, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC | IMMUNE_NULL_40 , 6, T_NODROP, 509 }, +/* MT_FAMILIAR*/ { P_("monster", "Familiar"), "Bat\\Bat", "Monsters\\Bat\\Bat%c%i.WAV", "Monsters\\Bat\\orange.trn", MonsterAvailability::Always, 96, 364, false, false, true, { 9, 13, 10, 9, 13, 0 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 13, 20, 35, AI_BAT, MFLAG_SEARCH , 3, 50, 5, 4, 16, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, T_NODROP, 448 }, +/* MT_NGOATBW */ { P_("monster", "Flesh Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 1040, false, false, false, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 4, 6, 8, 20, 35, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 0, 35, 13, 1, 7, 0, 0, 0, 0, 35, MonsterClass::Demon, 0 , 0 , 3, 0, 448 }, +/* MT_BGOATBW */ { P_("monster", "Stone Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Beige.TRN", MonsterAvailability::Retail, 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 5, 7, 10, 30, 40, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 1, 40, 13, 2, 9, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 645 }, +/* MT_RGOATBW */ { P_("monster", "Fire Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Red.TRN", MonsterAvailability::Retail, 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 6, 8, 12, 40, 50, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 45, 13, 3, 11, 0, 0, 0, 0, 35, MonsterClass::Demon, RESIST_FIRE , IMMUNE_FIRE , 3, 0, 822 }, +/* MT_GGOATBW */ { P_("monster", "Night Clan"), "GoatBow\\GoatB", "Monsters\\GoatBow\\GoatB%c%i.WAV", "Monsters\\GoatBow\\Gray.TRN", MonsterAvailability::Retail, 128, 1040, false, false, true, { 12, 8, 16, 6, 20, 0 }, { 3, 1, 1, 1, 1, 1 }, 7, 9, 14, 50, 65, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 50, 13, 4, 13, 15, 0, 0, 0, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 3, 0, 1092 }, +/* MT_NACID */ { P_("monster", "Acid Beast"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 716, true, true, false, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 11, 40, 66, AI_ACID, 0 , 0, 40, 8, 4, 12, 25, 8, 0, 0, 30, MonsterClass::Animal, IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_ACID , 3, 0, 846 }, +/* MT_RACID */ { P_("monster", "Poison Spitter"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidBlk.TRN", MonsterAvailability::Retail, 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 8, 10, 15, 60, 85, AI_ACID, 0 , 1, 45, 8, 4, 16, 25, 8, 0, 0, 30, MonsterClass::Animal, IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_ACID , 3, 0, 1248 }, +/* MT_BACID */ { P_("monster", "Pit Beast"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidB.TRN", MonsterAvailability::Retail, 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 10, 12, 21, 80, 110, AI_ACID, 0 , 2, 55, 8, 8, 18, 35, 8, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_ACID , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_ACID , 3, 0, 2060 }, +/* MT_XACID */ { P_("monster", "Lava Maw"), "Acid\\Acid", "Monsters\\Acid\\Acid%c%i.WAV", "Monsters\\Acid\\AcidR.TRN", MonsterAvailability::Retail, 128, 716, true, true, true, { 13, 8, 12, 8, 16, 12 }, { 1, 1, 1, 1, 1, 1 }, 12, 14, 25, 100, 150, AI_ACID, 0 , 3, 65, 8, 10, 20, 40, 8, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_ACID , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_ACID , 3, 0, 2940 }, +/* MT_SKING */ { P_("monster", "Skeleton King"), "SKing\\SKing", "Monsters\\SKing\\SKing%c%i.WAV", "Monsters\\SkelAxe\\White.TRN", MonsterAvailability::Never, 160, 1010, true, true, true, { 8, 6, 16, 6, 16, 6 }, { 2, 1, 1, 1, 1, 2 }, 4, 4, 9, 140, 140, AI_SKELKING, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 60, 8, 6, 16, 0, 0, 0, 0, 70, MonsterClass::Undead, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7,T_UNIQ+UITEM_SKCROWN, 570 }, +/* MT_CLEAVER */ { P_("monster", "The Butcher"), "FatC\\FatC", "Monsters\\FatC\\FatC%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 980, false, false, false, { 10, 8, 12, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 1, 1, 1, 320, 320, AI_CLEAVER, 0 , 3, 50, 8, 6, 12, 0, 0, 0, 0, 50, MonsterClass::Demon, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3,T_UNIQ+UITEM_CLEAVER, 710 }, +/* MT_FAT */ { P_("monster", "Overlord"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 1130, true, false, false, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 5, 7, 10, 60, 80, AI_FAT, 0 , 0, 55, 8, 6, 12, 0, 0, 0, 0, 55, MonsterClass::Demon, 0 , RESIST_FIRE , 3, 0, 635 }, +/* MT_MUDMAN, */ { P_("monster", "Mud Man"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\Blue.TRN", MonsterAvailability::Retail, 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 7, 9, 14, 100, 125, AI_FAT, MFLAG_SEARCH , 1, 60, 8, 8, 16, 0, 0, 0, 0, 60, MonsterClass::Demon, 0 , IMMUNE_LIGHTNING , 3, 0, 1165 }, +/* MT_TOAD */ { P_("monster", "Toad Demon"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\FatB.TRN", MonsterAvailability::Retail, 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 8, 10, 16, 135, 160, AI_FAT, MFLAG_SEARCH , 2, 70, 8, 8, 16, 40, 0, 8, 20, 65, MonsterClass::Demon, IMMUNE_MAGIC , IMMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 1380 }, +/* MT_FLAYED */ { P_("monster", "Flayed One"), "Fat\\Fat", "Monsters\\Fat\\Fat%c%i.WAV", "Monsters\\Fat\\FatF.TRN", MonsterAvailability::Retail, 128, 1130, true, false, true, { 8, 10, 15, 6, 16, 10 }, { 4, 1, 1, 1, 1, 1 }, 10, 12, 20, 160, 200, AI_FAT, MFLAG_SEARCH , 3, 85, 8, 10, 20, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 2058 }, +/* MT_WYRM */ { P_("monster", "Wyrm"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, MonsterAvailability::Never, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 5, 7, 11, 60, 90, AI_SKELSD, 0 , 0, 40, 8, 4, 10, 0, 0, 0, 0, 25, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 660 }, +/* MT_CAVSLUG */ { P_("monster", "Cave Slug"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, MonsterAvailability::Never, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 6, 8, 13, 75, 110, AI_SKELSD, 0 , 1, 50, 8, 6, 13, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 994 }, +/* MT_DVLWYRM */ { P_("monster", "Devil Wyrm"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, MonsterAvailability::Never, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 7, 9, 15, 100, 140, AI_SKELSD, 0 , 2, 55, 8, 8, 16, 0, 0, 0, 0, 30, MonsterClass::Animal, RESIST_MAGIC | RESIST_FIRE , RESIST_MAGIC | RESIST_FIRE , 3, 0, 1320 }, +/* MT_DEVOUR */ { P_("monster", "Devourer"), "Worm\\Worm", "Monsters\\Fat\\Fat%c%i.WAV", nullptr, MonsterAvailability::Never, 160, 2420, false, false, false, { 13, 13, 13, 11, 19, 0 }, { 1, 1, 1, 1, 1, 1 }, 8, 10, 17, 125, 200, AI_SKELSD, 0 , 3, 60, 8, 10, 20, 0, 0, 0, 0, 35, MonsterClass::Animal, RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , 3, 0, 1827 }, +/* MT_NMAGMA */ { P_("monster", "Magma Demon"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 1680, true, true, false, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 8, 9, 13, 50, 70, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 45, 4, 2, 10, 50, 13, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1076 }, +/* MT_YMAGMA */ { P_("monster", "Blood Stone"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Yellow.TRN", MonsterAvailability::Retail, 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 14, 55, 75, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 50, 4, 2, 12, 50, 14, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1309 }, +/* MT_BMAGMA */ { P_("monster", "Hell Stone"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Blue.TRN", MonsterAvailability::Retail, 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 16, 60, 80, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 60, 4, 2, 20, 60, 14, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 1680 }, +/* MT_WMAGMA */ { P_("monster", "Lava Lord"), "Magma\\Magma", "Monsters\\Magma\\Magma%c%i.WAV", "Monsters\\Magma\\Wierd.TRN", MonsterAvailability::Retail, 128, 1680, true, true, true, { 8, 10, 14, 7, 18, 18 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 18, 70, 85, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 75, 4, 4, 24, 60, 14, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 2124 }, +/* MT_HORNED */ { P_("monster", "Horned Demon"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 1630, true, true, false, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 7, 9, 13, 40, 80, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 60, 7, 2, 16, 100, 0, 5, 32, 40, MonsterClass::Animal, 0 , RESIST_FIRE , 7, 0, 1172 }, +/* MT_MUDRUN */ { P_("monster", "Mud Runner"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\Orange.TRN", MonsterAvailability::Retail, 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 8, 10, 15, 50, 90, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 70, 7, 6, 18, 100, 0, 12, 36, 45, MonsterClass::Animal, 0 , RESIST_FIRE , 7, 0, 1404 }, +/* MT_FROSTC */ { P_("monster", "Frost Charger"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\Blue.TRN", MonsterAvailability::Retail, 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 9, 11, 17, 60, 100, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 8, 20, 100, 0, 20, 40, 50, MonsterClass::Animal, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_LIGHTNING , 7, 0, 1720 }, +/* MT_OBLORD */ { P_("monster", "Obsidian Lord"), "Rhino\\Rhino", "Monsters\\Rhino\\Rhino%c%i.WAV", "Monsters\\Rhino\\RhinoB.TRN", MonsterAvailability::Retail, 160, 1630, true, true, true, { 8, 8, 14, 6, 16, 6 }, { 2, 1, 1, 1, 1, 1 }, 10, 12, 19, 70, 110, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 7, 10, 22, 100, 0, 20, 50, 55, MonsterClass::Animal, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 1809 }, +/* MT_BONEDMN */ { P_("monster", "oldboned"), "Demskel\\Demskl", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Never, 128, 1740, true, true, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 24, 24, 12, 70, 70, AI_STORM, 0 , 0, 60, 8, 6, 14, 12, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_NULL_40 , 7, 0, 1344 }, +/* MT_REDDTH */ { P_("monster", "Red Death"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Never, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 8, 10, 16, 96, 96, AI_STORM, 0 , 1, 75, 5, 10, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 2168 }, +/* MT_LTCHDMN */ { P_("monster", "Litch Demon"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Never, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 9, 11, 18, 110, 110, AI_STORM, 0 , 2, 80, 5, 10, 24, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 2736 }, +/* MT_UDEDBLRG*/ { P_("monster", "Undead Balrog"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Never, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 11, 13, 22, 130, 130, AI_STORM, 0 , 3, 85, 5, 12, 30, 0, 0, 0, 0, 65, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3575 }, +/* MT_INCIN */ { P_("monster", "Incinerator"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 21, 22, 16, 30, 45, AI_FIREMAN, 0 , 0, 75, 8, 8, 16, 0, 0, 0, 0, 25, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 1888 }, +/* MT_FLAMLRD */ { P_("monster", "Flame Lord"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 22, 23, 18, 40, 55, AI_FIREMAN, 0 , 1, 75, 8, 10, 20, 0, 0, 0, 0, 25, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 3, 0, 2250 }, +/* MT_DOOMFIRE*/ { P_("monster", "Doom Fire"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 23, 24, 20, 50, 65, AI_FIREMAN, 0 , 2, 80, 8, 12, 24, 0, 0, 0, 0, 30, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 2740 }, +/* MT_HELLBURN*/ { P_("monster", "Hell Burner"), "Fireman\\FireM", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 1460, true, false, false, { 14, 19, 20, 8, 14, 23 }, { 1, 1, 1, 1, 1, 1 }, 24, 24, 22, 60, 80, AI_FIREMAN, 0 , 3, 85, 8, 15, 30, 0, 0, 0, 0, 30, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 3355 }, +/* MT_STORM */ { P_("monster", "Red Storm"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Retail, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 9, 11, 18, 55, 110, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 80, 5, 8, 18, 75, 8, 4, 16, 30, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2160 }, +/* MT_RSTORM */ { P_("monster", "Storm Rider"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 1740, true, true, false, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 10, 12, 20, 60, 120, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 80, 5, 8, 18, 80, 8, 4, 16, 30, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2391 }, +/* MT_STORML */ { P_("monster", "Storm Lord"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv2.TRN", MonsterAvailability::Retail, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 11, 13, 22, 75, 135, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 85, 5, 12, 24, 75, 8, 4, 16, 35, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2775 }, +/* MT_MAEL */ { P_("monster", "Maelstrom"), "Thin\\Thin", "Monsters\\Thin\\Thin%c%i.WAV", "Monsters\\Thin\\Thinv1.TRN", MonsterAvailability::Retail, 160, 1740, true, true, true, { 8, 8, 18, 4, 17, 14 }, { 3, 1, 1, 1, 1, 1 }, 12, 14, 24, 90, 150, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 5, 12, 28, 75, 8, 4, 16, 40, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3177 }, +/* MT_BIGFALL */ { P_("monster", "Devil Kin Brute"), "BigFall\\Fallg", "Monsters\\newsfx\\KBrute%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 800, true, false, false, { 10, 8, 11, 8, 17, 0 }, { 1, 1, 1, 1, 2, 2 }, 21, 22, 27, 120, 160, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 100, 6, 18, 24, 0, 0, 0, 0, 70, MonsterClass::Animal, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 2400 }, +/* MT_WINGED */ { P_("monster", "Winged-Demon"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 1650, true, false, false, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 2 }, 5, 7, 9, 45, 60, AI_GARG, MFLAG_CAN_OPEN_DOOR, 0, 50, 7, 10, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 6, 0, 662 }, +/* MT_GARGOYLE*/ { P_("monster", "Gargoyle"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GarE.TRN", MonsterAvailability::Retail, 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 2 }, 7, 9, 13, 60, 90, AI_GARG, MFLAG_CAN_OPEN_DOOR, 1, 65, 7, 10, 16, 0, 0, 0, 0, 45, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 1205 }, +/* MT_BLOODCLW*/ { P_("monster", "Blood Claw"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GargBr.TRN", MonsterAvailability::Retail, 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 1 }, 9, 11, 19, 75, 125, AI_GARG, MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 14, 22, 0, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 1873 }, +/* MT_DEATHW */ { P_("monster", "Death Wing"), "Gargoyle\\Gargo", "Monsters\\Gargoyle\\Gargo%c%i.WAV", "Monsters\\Gargoyle\\GargB.TRN", MonsterAvailability::Retail, 160, 1650, true, false, true, { 14, 14, 14, 10, 18, 14 }, { 1, 1, 1, 1, 1, 1 }, 10, 12, 23, 90, 150, AI_GARG, MFLAG_CAN_OPEN_DOOR, 3, 95, 7, 16, 28, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 6, 0, 2278 }, +/* MT_MEGA */ { P_("monster", "Slayer"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 2220, true, true, false, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 10, 12, 20, 120, 140, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 100, 8, 12, 20, 0, 3, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 2300 }, +/* MT_GUARD */ { P_("monster", "Guardian"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Guard.TRN", MonsterAvailability::Retail, 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 11, 13, 22, 140, 160, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 110, 8, 14, 22, 0, 3, 0, 0, 65, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 2714 }, +/* MT_VTEXLRD */ { P_("monster", "Vortex Lord"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Vtexl.TRN", MonsterAvailability::Retail, 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 12, 14, 24, 160, 180, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 120, 8, 18, 24, 0, 3, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3252 }, +/* MT_BALROG */ { P_("monster", "Balrog"), "Mega\\Mega", "Monsters\\Mega\\Mega%c%i.WAV", "Monsters\\Mega\\Balr.TRN", MonsterAvailability::Retail, 160, 2220, true, true, true, { 6, 7, 14, 1, 24, 5 }, { 3, 1, 1, 1, 2, 1 }, 13, 15, 26, 180, 200, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 130, 8, 22, 30, 0, 3, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3643 }, +/* MT_NSNAKE */ { P_("monster", "Cave Viper"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 1270, false, false, false, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 11, 13, 21, 100, 150, AI_SNAKE, MFLAG_SEARCH , 0, 90, 8, 8, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, IMMUNE_MAGIC , IMMUNE_MAGIC , 7, 0, 2725 }, +/* MT_RSNAKE */ { P_("monster", "Fire Drake"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\SnakR.TRN", MonsterAvailability::Retail, 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 12, 14, 23, 120, 170, AI_SNAKE, MFLAG_SEARCH , 1, 105, 8, 12, 24, 0, 0, 0, 0, 65, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE , IMMUNE_MAGIC | IMMUNE_FIRE , 7, 0, 3139 }, +/* MT_BSNAKE */ { P_("monster", "Gold Viper"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\Snakg.TRN", MonsterAvailability::Retail, 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 14, 25, 140, 180, AI_SNAKE, MFLAG_SEARCH , 2, 120, 8, 15, 26, 0, 0, 0, 0, 70, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_LIGHTNING , 7, 0, 3540 }, +/* MT_GSNAKE */ { P_("monster", "Azure Drake"), "Snake\\Snake", "Monsters\\Snake\\Snake%c%i.WAV", "Monsters\\Snake\\Snakb.TRN", MonsterAvailability::Retail, 160, 1270, false, false, true, { 12, 11, 13, 5, 18, 0 }, { 2, 1, 1, 1, 1, 1 }, 15, 16, 27, 160, 200, AI_SNAKE, MFLAG_SEARCH , 3, 130, 8, 18, 30, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 3791 }, +/* MT_NBLACK */ { P_("monster", "Black Knight"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", nullptr, MonsterAvailability::Retail, 160, 2120, false, false, false, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 12, 14, 24, 150, 150, AI_SKELSD, MFLAG_SEARCH , 0, 110, 8, 15, 20, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3360 }, +/* MT_RTBLACK */ { P_("monster", "Doom Guard"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntRT.TRN", MonsterAvailability::Retail, 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 15, 26, 165, 165, AI_SKELSD, MFLAG_SEARCH , 0, 130, 8, 18, 25, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_NULL_40 , 7, 0, 3650 }, +/* MT_BTBLACK */ { P_("monster", "Steel Lord"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntBT.TRN", MonsterAvailability::Retail, 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 14, 16, 28, 180, 180, AI_SKELSD, MFLAG_SEARCH , 1, 120, 8, 20, 30, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4252 }, +/* MT_RBLACK */ { P_("monster", "Blood Knight"), "Black\\Black", "Monsters\\Black\\Black%c%i.WAV", "Monsters\\Black\\BlkKntBe.TRN", MonsterAvailability::Retail, 160, 2120, false, false, true, { 8, 8, 16, 4, 24, 0 }, { 2, 1, 1, 1, 1, 1 }, 13, 14, 30, 200, 200, AI_SKELSD, MFLAG_SEARCH , 1, 130, 8, 25, 35, 0, 0, 0, 0, 85, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 5130 }, +/* MT_UNRAV */ { P_("monster", "The Shredded"), "Unrav\\Unrav", "Monsters\\newsfx\\Shred%c%i.WAV", nullptr, MonsterAvailability::Retail, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 17, 18, 23, 70, 90, AI_SKELSD, 0 , 0, 75, 7, 4, 12, 0, 0, 0, 0, 65, MonsterClass::Undead, RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 900 }, +/* MT_HOLOWONE*/ { P_("monster", "Hollow One"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 18, 19, 27, 135, 240, AI_SKELSD, 0 , 1, 75, 7, 12, 24, 0, 0, 0, 0, 75, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4374 }, +/* MT_PAINMSTR*/ { P_("monster", "Pain Master"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 19, 20, 29, 110, 200, AI_SKELSD, 0 , 2, 80, 7, 16, 30, 0, 0, 0, 0, 80, MonsterClass::Undead, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 5147 }, +/* MT_REALWEAV*/ { P_("monster", "Reality Weaver"), "Unrav\\Unrav", "Monsters\\Acid\\Acid%c%i.WAV", nullptr, MonsterAvailability::Never, 96, 484, false, false, false, { 10, 10, 12, 5, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 20, 20, 30, 135, 240, AI_SKELSD, 0 , 3, 85, 7, 20, 35, 0, 0, 0, 0, 85, MonsterClass::Undead, RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 5925 }, +/* MT_SUCCUBUS*/ { P_("monster", "Succubus"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 980, false, false, false, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 12, 14, 24, 120, 150, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 0, 100, 10, 1, 20, 0, 0, 0, 0, 60, MonsterClass::Demon, RESIST_MAGIC , IMMUNE_MAGIC | RESIST_FIRE , 3, 0, 3696 }, +/* MT_SNOWWICH*/ { P_("monster", "Snow Witch"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succb.TRN", MonsterAvailability::Retail, 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 13, 15, 26, 135, 175, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 1, 110, 10, 1, 24, 0, 0, 0, 0, 65, MonsterClass::Demon, RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4084 }, +/* MT_HLSPWN */ { P_("monster", "Hell Spawn"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succrw.TRN", MonsterAvailability::Retail, 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 14, 16, 28, 150, 200, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 115, 10, 1, 30, 0, 0, 0, 0, 75, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 4480 }, +/* MT_SOLBRNR */ { P_("monster", "Soul Burner"), "Succ\\Scbs", "Monsters\\Succ\\Scbs%c%i.WAV", "Monsters\\Succ\\Succbw.TRN", MonsterAvailability::Retail, 128, 980, false, false, true, { 14, 8, 16, 7, 24, 0 }, { 1, 1, 1, 1, 1, 1 }, 15, 16, 30, 140, 225, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 120, 10, 1, 35, 0, 0, 0, 0, 85, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 4644 }, +/* MT_COUNSLR */ { P_("monster", "Counselor"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 2000, true, false, false, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 13, 14, 25, 70, 70, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 0, 90, 8, 8, 20, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 4070 }, +/* MT_MAGISTR */ { P_("monster", "Magistrate"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselg.TRN", MonsterAvailability::Retail, 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 14, 15, 27, 85, 85, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 1, 100, 8, 10, 24, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4478 }, +/* MT_CABALIST*/ { P_("monster", "Cabalist"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselgd.TRN", MonsterAvailability::Retail, 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 15, 16, 29, 120, 120, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 2, 110, 8, 14, 30, 0, 0, 0, 0, 0, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4929 }, +/* MT_ADVOCATE*/ { P_("monster", "Advocate"), "Mage\\Mage", "Monsters\\Mage\\Mage%c%i.WAV", "Monsters\\Mage\\Cnselbk.TRN", MonsterAvailability::Retail, 128, 2000, true, false, true, { 12, 1, 20, 8, 28, 20 }, { 1, 1, 1, 1, 1, 1 }, 16, 16, 30, 145, 145, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 15, 25, 0, 0, 0, 0, 0, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4968 }, +/* MT_GOLEM */ { P_("monster", "Golem"), "Golem\\Golem", "Monsters\\Golem\\Golm%c%i.WAV", nullptr, MonsterAvailability::Never, 96, 386, true, false, false, { 0, 16, 12, 0, 12, 20 }, { 1, 1, 1, 1, 1, 1 }, 1, 1, 12, 1, 1, AI_GOLUM, MFLAG_CAN_OPEN_DOOR, 0, 0, 7, 1, 1, 0, 0, 0, 0, 1, MonsterClass::Demon, 0 , 0 , 0, 0, 0 }, +/* MT_DIABLO */ { P_("monster", "The Dark Lord"), "Diablo\\Diablo", "Monsters\\Diablo\\Diablo%c%i.WAV", nullptr, MonsterAvailability::Never, 160, 2000, true, true, false, { 16, 6, 16, 6, 16, 16 }, { 1, 1, 1, 1, 1, 1 }, 26, 26, 45, 3333, 3333, AI_DIABLO, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 220, 4, 30, 60, 0, 11, 0, 0, 90, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 31666 }, +/* MT_DARKMAGE*/ { P_("monster", "The Arch-Litch Malignus"), "DarkMage\\Dmage", "Monsters\\DarkMage\\Dmag%c%i.WAV", nullptr, MonsterAvailability::Never, 128, 1060, true, false, false, { 6, 1, 21, 6, 23, 18 }, { 1, 1, 1, 1, 1, 1 }, 21, 21, 30, 160, 160, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 20, 40, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 4968 }, +/* MT_HELLBOAR*/ { P_("monster", "Hellboar"), "Fork\\Fork", "Monsters\\newsfx\\HBoar%c%i.WAV", nullptr, MonsterAvailability::Retail, 188, 800, false, false, false, { 10, 10, 15, 6, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 23, 80, 100, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_SEARCH , 2, 70, 7, 16, 24, 0, 0, 0, 0, 60, MonsterClass::Demon, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 750 }, +/* MT_STINGER */ { P_("monster", "Stinger"), "Scorp\\Scorp", "Monsters\\newsfx\\Stingr%c%i.WAV", nullptr, MonsterAvailability::Retail, 64, 305, false, false, false, { 10, 10, 12, 6, 15, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 30, 40, AI_SKELSD, 0 , 3, 85, 8, 1, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 1, 0, 500 }, +/* MT_PSYCHORB*/ { P_("monster", "Psychorb"), "Eye\\Eye", "Monsters\\newsfx\\psyco%c%i.WAV", nullptr, MonsterAvailability::Retail, 156, 800, false, false, false, { 12, 13, 13, 7, 21, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 20, 30, AI_PSYCHORB, 0 , 3, 80, 8, 10, 10, 0, 0, 0, 0, 40, MonsterClass::Animal, 0 , RESIST_FIRE , 6, 0, 450 }, +/* MT_ARACHNON*/ { P_("monster", "Arachnon"), "Spider\\Spider", "Monsters\\newsfx\\SLord%c%i.WAV", nullptr, MonsterAvailability::Retail, 148, 800, false, false, false, { 12, 10, 15, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 60, 80, AI_SKELSD, MFLAG_SEARCH , 3, 50, 8, 5, 15, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_LIGHTNING , 7, 0, 500 }, +/* MT_FELLTWIN*/ { P_("monster", "Felltwin"), "TSneak\\TSneak", "Monsters\\newsfx\\FTwin%c%i.WAV", nullptr, MonsterAvailability::Retail, 128, 800, false, false, false, { 13, 13, 15, 11, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 17, 18, 22, 50, 70, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 70, 8, 10, 18, 0, 0, 0, 0, 50, MonsterClass::Demon, IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 600 }, +/* MT_HORKSPWN*/ { P_("monster", "Hork Spawn"), "Spawn\\Spawn", "Monsters\\newsfx\\HSpawn%c%i.WAV", nullptr, MonsterAvailability::Retail, 164, 520, false, true, false, { 15, 12, 14, 11, 14, 0 }, { 1, 1, 1, 1, 1, 1 }, 18, 19, 22, 30, 30, AI_SKELSD, 0 , 3, 60, 8, 10, 25, 0, 0, 0, 0, 25, MonsterClass::Demon, RESIST_MAGIC , RESIST_MAGIC , 3, 0, 250 }, +/* MT_VENMTAIL*/ { P_("monster", "Venomtail"), "WScorp\\WScorp", "Monsters\\newsfx\\Stingr%c%i.WAV", nullptr, MonsterAvailability::Retail, 86, 305, false, false, false, { 10, 10, 12, 6, 15, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 40, 50, AI_SKELSD, 0 , 3, 85, 8, 1, 30, 0, 0, 0, 0, 60, MonsterClass::Animal, RESIST_LIGHTNING , IMMUNE_LIGHTNING , 1, 0, 1000 }, +/* MT_NECRMORB*/ { P_("monster", "Necromorb"), "Eye2\\Eye2", "Monsters\\newsfx\\Psyco%c%i.WAV", nullptr, MonsterAvailability::Retail, 140, 800, false, false, false, { 12, 13, 13, 7, 21, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 30, 40, AI_NECROMORB, 0 , 3, 80, 8, 20, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, RESIST_FIRE , IMMUNE_FIRE | RESIST_LIGHTNING , 6, 0, 1100 }, +/* MT_SPIDLORD*/ { P_("monster", "Spider Lord"), "bSpidr\\bSpidr", "Monsters\\newsfx\\SLord%c%i.WAV", nullptr, MonsterAvailability::Retail, 148, 800, true, true, false, { 12, 10, 15, 6, 20, 10 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 24, 80, 100, AI_ACID, MFLAG_SEARCH , 3, 60, 8, 8, 20, 75, 8, 10, 10, 60, MonsterClass::Animal, RESIST_LIGHTNING , RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 1250 }, +/* MT_LASHWORM*/ { P_("monster", "Lashworm"), "Clasp\\Clasp", "Monsters\\newsfx\\Lworm%c%i.WAV", nullptr, MonsterAvailability::Retail, 176, 800, false, false, false, { 10, 12, 15, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 19, 20, 20, 30, 30, AI_SKELSD, 0 , 3, 90, 8, 12, 20, 0, 0, 0, 0, 50, MonsterClass::Animal, 0 , RESIST_FIRE , 3, 0, 600 }, +/* MT_TORCHANT*/ { P_("monster", "Torchant"), "AntWorm\\Worm", "Monsters\\newsfx\\TchAnt%c%i.WAV", nullptr, MonsterAvailability::Retail, 192, 800, false, false, false, { 14, 12, 12, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 19, 20, 22, 60, 80, AI_TORCHANT, 0 , 3, 75, 8, 20, 30, 0, 0, 0, 0, 70, MonsterClass::Animal, IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 1250 }, +/* MT_HORKDMN */ { P_("monster", "Hork Demon"), "HorkD\\HorkD", "Monsters\\newsfx\\HDemon%c%i.WAV", nullptr, MonsterAvailability::Never, 138, 800, true, true, false, { 15, 8, 16, 6, 16, 9 }, { 2, 1, 1, 1, 1, 2 }, 19, 19, 27, 120, 160, AI_SKELSD, 0 , 3, 60, 8, 20, 35, 80, 8, 0, 0, 80, MonsterClass::Demon, RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2000 }, +/* MT_DEFILER */ { P_("monster", "Hell Bug"), "Hellbug\\Hellbg", "Monsters\\newsfx\\Defile%c%i.WAV", nullptr, MonsterAvailability::Never, 198, 800, true, true, false, { 8, 8, 14, 6, 14, 12 }, { 1, 1, 1, 1, 1, 1 }, 20, 20, 30, 240, 240, AI_SKELSD, MFLAG_SEARCH , 3, 110, 8, 20, 30, 90, 8, 50, 60, 80, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 5000 }, +/* MT_GRAVEDIG*/ { P_("monster", "Gravedigger"), "Gravdg\\Gravdg", "Monsters\\newsfx\\GDiggr%c%i.WAV", nullptr, MonsterAvailability::Retail, 124, 800, true, true, false, { 24, 24, 12, 6, 16, 16 }, { 2, 1, 1, 1, 1, 1 }, 21, 21, 26, 120, 240, AI_SCAV, MFLAG_CAN_OPEN_DOOR, 3, 80, 6, 2, 12, 0, 0, 0, 0, 20, MonsterClass::Undead, IMMUNE_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 2000 }, +/* MT_TOMBRAT */ { P_("monster", "Tomb Rat"), "Rat\\Rat", "Monsters\\newsfx\\TmbRat%c%i.WAV", nullptr, MonsterAvailability::Retail, 104, 550, false, false, false, { 11, 8, 12, 6, 20, 0 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 24, 80, 120, AI_SKELSD, 0 , 3, 120, 8, 12, 25, 0, 0, 0, 0, 30, MonsterClass::Animal, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 1800 }, +/* MT_FIREBAT */ { P_("monster", "Firebat"), "Hellbat\\Helbat", "Monsters\\newsfx\\HelBat%c%i.WAV", nullptr, MonsterAvailability::Retail, 96, 550, false, false, false, { 18, 16, 14, 6, 18, 11 }, { 2, 1, 1, 1, 1, 1 }, 21, 22, 24, 60, 80, AI_FIREBAT, 0 , 3, 100, 8, 15, 20, 0, 0, 0, 0, 70, MonsterClass::Animal, IMMUNE_FIRE , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 2400 }, +/* MT_SKLWING */ { P_("monster", "Skullwing"), "Demskel\\Demskl", "Monsters\\newsfx\\SWing%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Retail, 128, 1740, true, false, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 21, 22, 27, 70, 70, AI_SKELSD, 0 , 0, 75, 7, 15, 20, 75, 9, 15, 20, 80, MonsterClass::Undead, RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 3000 }, +/* MT_LICH */ { P_("monster", "Lich"), "Lich\\Lich", "Monsters\\newsfx\\Lich%c%i.WAV", nullptr, MonsterAvailability::Retail, 96, 800, false, true, false, { 12, 10, 10, 7, 21, 0 }, { 2, 1, 1, 1, 2, 1 }, 21, 22, 25, 80, 100, AI_LICH, 0 , 3, 100, 8, 15, 20, 0, 0, 0, 0, 60, MonsterClass::Undead, RESIST_LIGHTNING | IMMUNE_NULL_40 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 3000 }, +/* MT_CRYPTDMN*/ { P_("monster", "Crypt Demon"), "Bubba\\Bubba", "Monsters\\newsfx\\Crypt%c%i.WAV", nullptr, MonsterAvailability::Retail, 154, 800, false, true, false, { 8, 18, 12, 8, 21, 0 }, { 3, 1, 1, 1, 1, 1 }, 22, 23, 28, 200, 240, AI_SKELSD, 0 , 3, 100, 8, 20, 40, 0, 0, 0, 0, 85, MonsterClass::Demon, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 3200 }, +/* MT_HELLBAT */ { P_("monster", "Hellbat"), "Hellbat2\\bhelbt", "Monsters\\newsfx\\HelBat%c%i.WAV", nullptr, MonsterAvailability::Retail, 96, 550, true, false, false, { 18, 16, 14, 6, 18, 11 }, { 2, 1, 1, 1, 1, 1 }, 23, 24, 29, 100, 140, AI_TORCHANT, 0 , 3, 110, 8, 30, 30, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 3600 }, +/* MT_BONEDEMN*/ { P_("monster", "Bone Demon"), "Demskel\\Demskl", "Monsters\\newsfx\\SWing%c%i.WAV", "Monsters\\Thin\\Thinv3.TRN", MonsterAvailability::Retail, 128, 1740, true, true, false, { 10, 8, 20, 6, 24, 16 }, { 3, 1, 1, 1, 1, 1 }, 23, 24, 30, 240, 280, AI_BONEDEMON, 0 , 0, 100, 8, 40, 50, 160, 12, 50, 50, 50, MonsterClass::Undead, IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 5000 }, +/* MT_ARCHLICH*/ { P_("monster", "Arch Lich"), "Lich2\\Lich2", "Monsters\\newsfx\\Lich%c%i.WAV", nullptr, MonsterAvailability::Retail, 136, 800, false, true, false, { 12, 10, 10, 7, 21, 0 }, { 2, 1, 1, 1, 2, 1 }, 23, 24, 30, 180, 200, AI_ARCHLICH, 0 , 3, 120, 8, 30, 30, 0, 0, 0, 0, 75, MonsterClass::Undead, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 3, 0, 4000 }, +/* MT_BICLOPS */ { P_("monster", "Biclops"), "Byclps\\Byclps", "Monsters\\newsfx\\Biclop%c%i.WAV", nullptr, MonsterAvailability::Retail, 180, 800, false, false, false, { 10, 11, 16, 6, 16, 0 }, { 2, 1, 1, 1, 2, 1 }, 23, 24, 30, 200, 240, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_CAN_OPEN_DOOR, 3, 90, 8, 40, 50, 0, 0, 0, 0, 80, MonsterClass::Demon, RESIST_LIGHTNING , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 4000 }, +/* MT_FLESTHNG*/ { P_("monster", "Flesh Thing"), "Flesh\\Flesh", "Monsters\\newsfx\\FleshT%c%i.WAV", nullptr, MonsterAvailability::Retail, 164, 800, false, true, false, { 15, 24, 15, 6, 16, 0 }, { 1, 1, 1, 1, 1, 1 }, 23, 24, 28, 300, 400, AI_SKELSD, 0 , 3, 150, 8, 12, 18, 0, 0, 0, 0, 70, MonsterClass::Demon, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 4000 }, +/* MT_REAPER */ { P_("monster", "Reaper"), "Reaper\\Reap", "Monsters\\newsfx\\Reaper%c%i.WAV", nullptr, MonsterAvailability::Retail, 180, 800, false, false, false, { 12, 10, 14, 6, 16, 0 }, { 2, 1, 1, 1, 1, 1 }, 23, 24, 30, 260, 300, AI_SKELSD, 0 , 3, 120, 8, 30, 35, 0, 0, 0, 0, 90, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 6000 }, // TRANSLATORS: Monster Block end -/* MT_NAKRUL */ { P_("monster", "Na-Krul"), "Nkr\\Nkr", "Monsters\\newsfx\\Nakrul%c%i.WAV", nullptr, 226, 1200, true, true, false, { 2, 6, 16, 3, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, 31, 31, 40, 1332, 1332, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 150, 7, 40, 50, 150, 10, 40, 50, 125, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 13333 }, +/* MT_NAKRUL */ { P_("monster", "Na-Krul"), "Nkr\\Nkr", "Monsters\\newsfx\\Nakrul%c%i.WAV", nullptr, MonsterAvailability::Never, 226, 1200, true, true, false, { 2, 6, 16, 3, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, 31, 31, 40, 1332, 1332, AI_SKELSD, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 150, 7, 40, 50, 150, 10, 40, 50, 125, MonsterClass::Demon, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40 , IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40 , 7, 0, 13333 }, // clang-format on }; @@ -322,149 +322,6 @@ const _monster_id MonstConvTbl[] = { MT_LRDSAYTR, }; -/** - * Define what version a monster type is available in - */ -const char MonstAvailTbl[] = { - MAT_ALWAYS, // Zombie - MAT_ALWAYS, // Ghoul - MAT_ALWAYS, // Rotting Carcass - MAT_ALWAYS, // Black Death - MAT_ALWAYS, // Fallen One - MAT_ALWAYS, // Carver - MAT_ALWAYS, // Devil Kin - MAT_ALWAYS, // Dark One - MAT_ALWAYS, // Skeleton - MAT_ALWAYS, // Corpse Axe - MAT_ALWAYS, // Burning Dead - MAT_ALWAYS, // Horror - MAT_ALWAYS, // Fallen One - MAT_ALWAYS, // Carver - MAT_ALWAYS, // Devil Kin - MAT_ALWAYS, // Dark One - MAT_ALWAYS, // Scavenger - MAT_ALWAYS, // Plague Eater - MAT_ALWAYS, // Shadow Beast - MAT_ALWAYS, // Bone Gasher - MAT_ALWAYS, // Skeleton - MAT_ALWAYS, // Corpse Bow - MAT_ALWAYS, // Burning Dead - MAT_ALWAYS, // Horror - MAT_ALWAYS, // Skeleton Captain - MAT_ALWAYS, // Corpse Captain - MAT_ALWAYS, // Burning Dead Captain - MAT_ALWAYS, // Horror Captain - MAT_NEVER, // Invisible Lord - MAT_RETAIL, // Hidden - MAT_RETAIL, // Stalker - MAT_RETAIL, // Unseen - MAT_RETAIL, // Illusion Weaver - MAT_RETAIL, // Satyr Lord - MAT_RETAIL, // Flesh Clan - MAT_RETAIL, // Stone Clan - MAT_RETAIL, // Fire Clan - MAT_RETAIL, // Night Clan - MAT_ALWAYS, // Fiend - MAT_ALWAYS, // Blink - MAT_ALWAYS, // Gloom - MAT_ALWAYS, // Familiar - MAT_RETAIL, // Flesh Clan - MAT_RETAIL, // Stone Clan - MAT_RETAIL, // Fire Clan - MAT_RETAIL, // Night Clan - MAT_RETAIL, // Acid Beast - MAT_RETAIL, // Poison Spitter - MAT_RETAIL, // Pit Beast - MAT_RETAIL, // Lava Maw - MAT_NEVER, // Skeleton King - MAT_NEVER, // The Butcher - MAT_RETAIL, // Overlord - MAT_RETAIL, // Mud Man - MAT_RETAIL, // Toad Demon - MAT_RETAIL, // Flayed One - MAT_NEVER, // Wyrm - MAT_NEVER, // Cave Slug - MAT_NEVER, // Devil Wyrm - MAT_NEVER, // Devourer - MAT_RETAIL, // Magma Demon - MAT_RETAIL, // Blood Stone - MAT_RETAIL, // Hell Stone - MAT_RETAIL, // Lava Lord - MAT_RETAIL, // Horned Demon - MAT_RETAIL, // Mud Runner - MAT_RETAIL, // Frost Charger - MAT_RETAIL, // Obsidian Lord - MAT_NEVER, // Bone Demon (oldboned in Hellfire) - MAT_NEVER, // Red Death - MAT_NEVER, // Litch Demon - MAT_NEVER, // Undead Balrog - MAT_NEVER, // Incinerator - MAT_NEVER, // Flame Lord - MAT_NEVER, // Doom Fire - MAT_NEVER, // Hell Burner - MAT_RETAIL, // Red Storm - MAT_RETAIL, // Storm Rider - MAT_RETAIL, // Storm Lord - MAT_RETAIL, // Maelstorm - MAT_RETAIL, // Devil Kin Brute - MAT_RETAIL, // Winged-Demon - MAT_RETAIL, // Gargoyle - MAT_RETAIL, // Blood Claw - MAT_RETAIL, // Death Wing - MAT_RETAIL, // Slayer - MAT_RETAIL, // Guardian - MAT_RETAIL, // Vortex Lord - MAT_RETAIL, // Balrog - MAT_RETAIL, // Cave Viper - MAT_RETAIL, // Fire Drake - MAT_RETAIL, // Gold Viper - MAT_RETAIL, // Azure Drake - MAT_RETAIL, // Black Knight - MAT_RETAIL, // Doom Guard - MAT_RETAIL, // Steel Lord - MAT_RETAIL, // Blood Knight - MAT_RETAIL, // The Shredded - MAT_NEVER, // Hollow One - MAT_NEVER, // Pain Master - MAT_NEVER, // Reality Weaver - MAT_RETAIL, // Succubus - MAT_RETAIL, // Snow Witch - MAT_RETAIL, // Hell Spawn - MAT_RETAIL, // Soul Burner - MAT_RETAIL, // Counselor - MAT_RETAIL, // Magistrate - MAT_RETAIL, // Cabalist - MAT_RETAIL, // Advocate - MAT_NEVER, // Golem - MAT_NEVER, // The Dark Lord - MAT_NEVER, // The Arch-Litch Malignus - MAT_RETAIL, // Hellboar - MAT_RETAIL, // Stinger - MAT_RETAIL, // Psychorb - MAT_RETAIL, // Arachnon - MAT_RETAIL, // Felltwin - MAT_RETAIL, // Hork Spawn - MAT_RETAIL, // Venomtail - MAT_RETAIL, // Necromorb - MAT_RETAIL, // Spider Lord - MAT_RETAIL, // Lashworm - MAT_RETAIL, // Torchant - MAT_NEVER, // Hork Demon - MAT_NEVER, // Hell Bug - MAT_RETAIL, // Gravedigger - MAT_RETAIL, // Tomb Rat - MAT_RETAIL, // Firebat - MAT_RETAIL, // Skullwing - MAT_RETAIL, // Lich - MAT_RETAIL, // Crypt Demon - MAT_RETAIL, // Hellbat - MAT_RETAIL, // Bone Demon - MAT_RETAIL, // Arch Lich - MAT_RETAIL, // Biclops - MAT_RETAIL, // Flesh Thing - MAT_RETAIL, // Reaper - MAT_NEVER, // Na-Krul -}; /** Contains the data related to each unique monster ID. */ const UniqueMonsterData UniqueMonstersData[] = { // clang-format off diff --git a/Source/monstdat.h b/Source/monstdat.h index 180b535ba..0a20cd112 100644 --- a/Source/monstdat.h +++ b/Source/monstdat.h @@ -82,11 +82,18 @@ enum monster_treasure : uint16_t { // clang-format on }; +enum class MonsterAvailability : uint8_t { + Never, + Always, + Retail, +}; + struct MonsterData { const char *mName; const char *GraphicType; const char *sndfile; const char *TransFile; + MonsterAvailability availability; uint16_t width; uint16_t mImage; bool has_special; @@ -266,12 +273,6 @@ enum _monster_id : int16_t { 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 */ @@ -314,7 +315,6 @@ struct UniqueMonsterData { extern const MonsterData MonstersData[]; extern const _monster_id MonstConvTbl[]; -extern const char MonstAvailTbl[]; extern const UniqueMonsterData UniqueMonstersData[]; } // namespace devilution diff --git a/Source/monster.cpp b/Source/monster.cpp index b0074ab2e..193d963d7 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -65,6 +65,21 @@ int totalmonsters; int monstimgtot; int uniquetrans; +constexpr std::array<_monster_id, 12> SkeletonTypes { + MT_WSKELAX, + MT_TSKELAX, + MT_RSKELAX, + MT_XSKELAX, + MT_WSKELBW, + MT_TSKELBW, + MT_RSKELBW, + MT_XSKELBW, + MT_WSKELSD, + MT_TSKELSD, + MT_RSKELSD, + MT_XSKELSD, +}; + // BUGFIX: MWVel velocity values are not rounded consistently. The correct // formula for monster walk velocity is calculated as follows (for 16, 32 and 64 // pixel distances, respectively): @@ -151,7 +166,7 @@ void InitMonsterTRN(CMonster &monst) const size_t numAnims = GetNumAnims(*monst.MData); for (size_t i = 0; i < numAnims; i++) { - if (i == 1 && monst.mtype >= MT_COUNSLR && monst.mtype <= MT_ADVOCATE) { + if (i == 1 && IsAnyOf(monst.mtype, MT_COUNSLR, MT_MAGISTR, MT_CABALIST, MT_ADVOCATE)) { continue; } @@ -577,23 +592,18 @@ void PlaceUniqueMonsters() void PlaceQuestMonsters() { - int skeltype; - if (!setlevel) { if (Quests[Q_BUTCHER].IsAvailable()) { PlaceUniqueMonst(UMT_BUTCHER, 0, 0); } if (currlevel == Quests[Q_SKELKING]._qlevel && gbIsMultiplayer) { - skeltype = 0; - - for (skeltype = 0; skeltype < LevelMonsterTypeCount; skeltype++) { - if (IsSkel(LevelMonsterTypes[skeltype].mtype)) { + for (int i = 0; i < LevelMonsterTypeCount; i++) { + if (IsSkel(LevelMonsterTypes[i].mtype)) { + PlaceUniqueMonst(UMT_SKELKING, i, 30); break; } } - - PlaceUniqueMonst(UMT_SKELKING, skeltype, 30); } if (Quests[Q_LTBANNER].IsAvailable()) { @@ -989,6 +999,10 @@ void DiabloDeath(Monster &diablo, bool sendmsg) void SpawnLoot(Monster &monster, bool sendmsg) { + if (monster.MType->mtype == MT_HORKSPWN) { + return; + } + if (Quests[Q_GARBUD].IsAvailable() && monster._uniqtype - 1 == UMT_GARBUD) { CreateTypeItem(monster.position.tile + Displacement { 1, 1 }, true, ItemType::Mace, IMISC_NONE, sendmsg, false); } else if (monster._uniqtype - 1 == UMT_DEFILER) { @@ -1002,7 +1016,6 @@ void SpawnLoot(Monster &monster, bool sendmsg) } else { CreateAmulet(monster.position.tile, 13, sendmsg, false); } - } else if (monster.MType->mtype == MT_HORKSPWN) { } else if (monster.MType->mtype == MT_NAKRUL) { int nSFX = IsUberRoomOpened ? USFX_NAKRUL4 : USFX_NAKRUL5; if (sgGameInitInfo.bCowQuest != 0) @@ -1076,14 +1089,13 @@ void MonsterHitMonster(int mid, int i, int dam) NetSendCmdMonDmg(false, mid, dam); PlayEffect(monster, 1); - if ((monster.MType->mtype >= MT_SNEAK && monster.MType->mtype <= MT_ILLWEAV) || dam >> 6 >= monster.mLevel + 3) { + if (IsAnyOf(monster.MType->mtype, MT_SNEAK, MT_STALKER, MT_UNSEEN, MT_ILLWEAV) || dam >> 6 >= monster.mLevel + 3) { if (i >= 0) monster._mdir = Opposite(Monsters[i]._mdir); if (monster.MType->mtype == MT_BLINK) { Teleport(mid); - } else if ((monster.MType->mtype >= MT_NSCAV && monster.MType->mtype <= MT_YSCAV) - || monster.MType->mtype == MT_GRAVEDIG) { + } else if (IsAnyOf(monster.MType->mtype, MT_NSCAV, MT_BSCAV, MT_WSCAV, MT_YSCAV, MT_GRAVEDIG)) { monster._mgoal = MGOAL_NORMAL; monster._mgoalvar1 = 0; monster._mgoalvar2 = 0; @@ -1104,7 +1116,7 @@ void MonsterDeath(int mid, int pnum, Direction md, bool sendmsg) if (pnum < MAX_PLRS) { if (pnum >= 0) monster.mWhoHit |= 1 << pnum; - if (mid >= MAX_PLRS) + if (monster.MType->mtype != MT_GOLEM) AddPlrMonstExper(monster.mLevel, monster.mExp, monster.mWhoHit); } @@ -1134,7 +1146,7 @@ void MonsterDeath(int mid, int pnum, Direction md, bool sendmsg) dMonster[monster.position.tile.x][monster.position.tile.y] = mid + 1; CheckQuestKill(monster, sendmsg); M_FallenFear(monster.position.tile); - if ((monster.MType->mtype >= MT_NACID && monster.MType->mtype <= MT_XACID) || monster.MType->mtype == MT_SPIDLORD) + if (IsAnyOf(monster.MType->mtype, MT_NACID, MT_RACID, MT_BACID, MT_XACID, MT_SPIDLORD)) AddMissile(monster.position.tile, { 0, 0 }, Direction::South, MIS_ACIDPUD, TARGET_PLAYERS, mid, monster._mint + 1, 0); } @@ -1438,11 +1450,11 @@ bool MonsterAttack(int i) if (monster._mAi != AI_SNAKE) PlayEffect(monster, 0); } - if (monster.MType->mtype >= MT_NMAGMA && monster.MType->mtype <= MT_WMAGMA && monster.AnimInfo.CurrentFrame == 8) { + if (IsAnyOf(monster.MType->mtype, MT_NMAGMA, MT_YMAGMA, MT_BMAGMA, MT_WMAGMA) && monster.AnimInfo.CurrentFrame == 8) { MonsterAttackPlayer(i, monster._menemy, monster.mHit + 10, monster.mMinDamage - 2, monster.mMaxDamage - 2); PlayEffect(monster, 0); } - if (monster.MType->mtype >= MT_STORM && monster.MType->mtype <= MT_MAEL && monster.AnimInfo.CurrentFrame == 12) { + if (IsAnyOf(monster.MType->mtype, MT_STORM, MT_RSTORM, MT_STORML, MT_MAEL) && monster.AnimInfo.CurrentFrame == 12) { MonsterAttackPlayer(i, monster._menemy, monster.mHit - 20, monster.mMinDamage + 4, monster.mMaxDamage + 4); PlayEffect(monster, 0); } @@ -1568,12 +1580,9 @@ bool MonsterFadeout(Monster &monster) return false; } - int mt = monster.MType->mtype; - if (mt < MT_INCIN || mt > MT_HELLBURN) { - monster._mFlags &= ~MFLAG_LOCK_ANIMATION; + monster._mFlags &= ~MFLAG_LOCK_ANIMATION; + if (IsNoneOf(monster.MType->mtype, MT_INCIN, MT_FLAMLRD, MT_DOOMFIRE, MT_HELLBURN)) { monster._mFlags |= MFLAG_HIDDEN; - } else { - monster._mFlags &= ~MFLAG_LOCK_ANIMATION; } M_StartStand(monster, monster._mdir); @@ -3444,6 +3453,17 @@ bool IsRelativeMoveOK(const Monster &monster, Point position, Direction mdir) return true; } +bool IsMonsterAvalible(const MonsterData &monsterData) +{ + if (monsterData.availability == MonsterAvailability::Never) + return false; + + if (gbIsSpawn && monsterData.availability == MonsterAvailability::Retail) + return false; + + return currlevel >= monsterData.mMinDLvl && currlevel <= monsterData.mMaxDLvl; +} + } // namespace void InitTRNForUniqueMonster(Monster &monster) @@ -3585,20 +3605,6 @@ void InitLevelMonsters() void GetLevelMTypes() { - // this array is merged with skeltypes down below. - _monster_id typelist[MAXMONSTERS]; - _monster_id skeltypes[NUM_MTYPES]; - - char mamask; - const int numskeltypes = 19; - - int nt; // number of types - - if (gbIsSpawn) - mamask = 1; // monster availability mask - else - mamask = 3; // monster availability mask - AddMonsterType(MT_GOLEM, PLACE_SPECIAL); if (currlevel == 16) { AddMonsterType(MT_ADVOCATE, PLACE_SCATTER); @@ -3638,26 +3644,25 @@ void GetLevelMTypes() AddMonsterType(MT_SKING, PLACE_UNIQUE); - nt = 0; - for (int i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++) { - if (IsSkel(i)) { - if (currlevel >= MonstersData[i].mMinDLvl && currlevel <= MonstersData[i].mMaxDLvl) { - if ((MonstAvailTbl[i] & mamask) != 0) { - skeltypes[nt++] = (_monster_id)i; - } - } - } + int skeletonTypeCount = 0; + _monster_id skeltypes[NUM_MTYPES]; + for (_monster_id skeletonType : SkeletonTypes) { + if (!IsMonsterAvalible(MonstersData[skeletonType])) + continue; + + skeltypes[skeletonTypeCount++] = skeletonType; } - AddMonsterType(skeltypes[GenerateRnd(nt)], PLACE_SCATTER); + AddMonsterType(skeltypes[GenerateRnd(skeletonTypeCount)], PLACE_SCATTER); } - nt = 0; + _monster_id typelist[MAXMONSTERS]; + + int nt = 0; for (int i = MT_NZOMBIE; i < NUM_MTYPES; i++) { - if (currlevel >= MonstersData[i].mMinDLvl && currlevel <= MonstersData[i].mMaxDLvl) { - if ((MonstAvailTbl[i] & mamask) != 0) { - typelist[nt++] = (_monster_id)i; - } - } + if (!IsMonsterAvalible(MonstersData[i])) + continue; + + typelist[nt++] = (_monster_id)i; } while (nt > 0 && LevelMonsterTypeCount < MAX_LVLMTYPES && monstimgtot < 4000) { @@ -3676,7 +3681,6 @@ void GetLevelMTypes() typelist[i] = typelist[--nt]; } } - } else { if (setlvlnum == SL_SKELKING) { AddMonsterType(MT_SKING, PLACE_UNIQUE); @@ -3732,9 +3736,9 @@ void InitMonsterGFX(int monst) InitMonsterTRN(monster); } - if (mtype >= MT_NMAGMA && mtype <= MT_WMAGMA) + if (IsAnyOf(mtype, MT_NMAGMA, MT_YMAGMA, MT_BMAGMA, MT_WMAGMA)) MissileSpriteData[MFILE_MAGBALL].LoadGFX(); - if (mtype >= MT_STORM && mtype <= MT_MAEL) + if (IsAnyOf(mtype, MT_STORM, MT_RSTORM, MT_STORML, MT_MAEL)) MissileSpriteData[MFILE_THINLGHT].LoadGFX(); if (mtype == MT_SNOWWICH) { MissileSpriteData[MFILE_SCUBMISB].LoadGFX(); @@ -3748,7 +3752,7 @@ void InitMonsterGFX(int monst) MissileSpriteData[MFILE_SCUBMISC].LoadGFX(); MissileSpriteData[MFILE_SCBSEXPC].LoadGFX(); } - if ((mtype >= MT_NACID && mtype <= MT_XACID) || mtype == MT_SPIDLORD) { + if (IsAnyOf(mtype, MT_NACID, MT_RACID, MT_BACID, MT_XACID, MT_SPIDLORD)) { MissileSpriteData[MFILE_ACIDBF].LoadGFX(); MissileSpriteData[MFILE_ACIDSPLA].LoadGFX(); MissileSpriteData[MFILE_ACIDPUD].LoadGFX(); @@ -3761,7 +3765,7 @@ void InitMonsterGFX(int monst) MissileSpriteData[MFILE_ARCHLICH].LoadGFX(); MissileSpriteData[MFILE_EXYEL2].LoadGFX(); } - if (mtype == MT_PSYCHORB || mtype == MT_BONEDEMN) + if (IsAnyOf(mtype, MT_PSYCHORB, MT_BONEDEMN)) MissileSpriteData[MFILE_BONEDEMON].LoadGFX(); if (mtype == MT_NECRMORB) { MissileSpriteData[MFILE_NECROMORB].LoadGFX(); @@ -3994,7 +3998,7 @@ void M_StartHit(int i, int pnum, int dam) NetSendCmdMonDmg(false, i, dam); } PlayEffect(monster, 1); - if ((monster.MType->mtype >= MT_SNEAK && monster.MType->mtype <= MT_ILLWEAV) || dam >> 6 >= monster.mLevel + 3) { + if (IsAnyOf(monster.MType->mtype, MT_SNEAK, MT_STALKER, MT_UNSEEN, MT_ILLWEAV) || dam >> 6 >= monster.mLevel + 3) { if (pnum >= 0) { monster._menemy = pnum; monster.enemyPosition = Players[pnum].position.future; @@ -4003,7 +4007,7 @@ void M_StartHit(int i, int pnum, int dam) } if (monster.MType->mtype == MT_BLINK) { Teleport(i); - } else if ((monster.MType->mtype >= MT_NSCAV && monster.MType->mtype <= MT_YSCAV) + } else if (IsAnyOf(monster.MType->mtype, MT_NSCAV, MT_BSCAV, MT_WSCAV, MT_YSCAV) || monster.MType->mtype == MT_GRAVEDIG) { monster._mgoal = MGOAL_NORMAL; monster._mgoalvar1 = 0; @@ -4307,7 +4311,7 @@ void ProcessMonsters() if (IsTileVisible(monster.position.tile)) { monster._msquelch = UINT8_MAX; monster.position.last = player.position.future; - } else if (monster._msquelch != 0 && monster.MType->mtype != MT_DIABLO) { /// BUGFIX: change '_mAi' to 'MType->mtype' + } else if (monster._msquelch != 0 && monster.MType->mtype != MT_DIABLO) { monster._msquelch--; } } @@ -4731,21 +4735,21 @@ void MissToMonst(Missile &missile, Point position) monster._mdir = static_cast(missile._mimfnum); monster.position.tile = position; M_StartStand(monster, monster._mdir); - if (monster.MType->mtype < MT_INCIN || monster.MType->mtype > MT_HELLBURN) { + if (IsAnyOf(monster.MType->mtype, MT_INCIN, MT_FLAMLRD, MT_DOOMFIRE, MT_HELLBURN)) { + StartFadein(monster, monster._mdir, false); + } else { if ((monster._mFlags & MFLAG_TARGETS_MONSTER) == 0) M_StartHit(m, -1, 0); else MonsterHitMonster(m, -1, 0); - } else { - StartFadein(monster, monster._mdir, false); } if ((monster._mFlags & MFLAG_TARGETS_MONSTER) == 0) { int pnum = dPlayer[oldPosition.x][oldPosition.y] - 1; if (dPlayer[oldPosition.x][oldPosition.y] > 0) { - if (monster.MType->mtype != MT_GLOOM && (monster.MType->mtype < MT_INCIN || monster.MType->mtype > MT_HELLBURN)) { + if (IsNoneOf(monster.MType->mtype, MT_GLOOM, MT_INCIN, MT_FLAMLRD, MT_DOOMFIRE, MT_HELLBURN)) { MonsterAttackPlayer(m, dPlayer[oldPosition.x][oldPosition.y] - 1, 500, monster.mMinDamage2, monster.mMaxDamage2); - if (pnum == dPlayer[oldPosition.x][oldPosition.y] - 1 && (monster.MType->mtype < MT_NSNAKE || monster.MType->mtype > MT_GSNAKE)) { + if (pnum == dPlayer[oldPosition.x][oldPosition.y] - 1 && IsNoneOf(monster.MType->mtype, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) { auto &player = Players[pnum]; if (player._pmode != PM_GOTHIT && player._pmode != PM_DEATH) StartPlrHit(pnum, 0, true); @@ -4764,9 +4768,9 @@ void MissToMonst(Missile &missile, Point position) } if (dMonster[oldPosition.x][oldPosition.y] > 0) { - if (monster.MType->mtype != MT_GLOOM && (monster.MType->mtype < MT_INCIN || monster.MType->mtype > MT_HELLBURN)) { + if (IsNoneOf(monster.MType->mtype, MT_GLOOM, MT_INCIN, MT_FLAMLRD, MT_DOOMFIRE, MT_HELLBURN)) { MonsterAttackMonster(m, dMonster[oldPosition.x][oldPosition.y] - 1, 500, monster.mMinDamage2, monster.mMaxDamage2); - if (monster.MType->mtype < MT_NSNAKE || monster.MType->mtype > MT_GSNAKE) { + if (IsNoneOf(monster.MType->mtype, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE)) { Point newPosition = oldPosition + monster._mdir; if (IsTileAvailable(Monsters[dMonster[oldPosition.x][oldPosition.y] - 1], newPosition)) { m = dMonster[oldPosition.x][oldPosition.y]; @@ -4789,17 +4793,16 @@ bool IsTileAvailable(const Monster &monster, Point position) return IsTileSafe(monster, position); } -bool IsSkel(int mt) +bool IsSkel(_monster_id mt) { - return (mt >= MT_WSKELAX && mt <= MT_XSKELAX) - || (mt >= MT_WSKELBW && mt <= MT_XSKELBW) - || (mt >= MT_WSKELSD && mt <= MT_XSKELSD); + return std::find(std::begin(SkeletonTypes), std::end(SkeletonTypes), mt) != std::end(SkeletonTypes); } -bool IsGoat(int mt) +bool IsGoat(_monster_id mt) { - return (mt >= MT_NGOATMC && mt <= MT_GGOATMC) - || (mt >= MT_NGOATBW && mt <= MT_GGOATBW); + return IsAnyOf(mt, + MT_NGOATMC, MT_BGOATMC, MT_RGOATMC, MT_GGOATMC, + MT_NGOATBW, MT_BGOATBW, MT_RGOATBW, MT_GGOATBW); } bool SpawnSkeleton(int ii, Point position) @@ -4992,7 +4995,7 @@ bool Monster::IsResistant(missile_id mName) const || ((mMagicRes & RESIST_FIRE) != 0 && missileElement == MISR_FIRE) || ((mMagicRes & RESIST_LIGHTNING) != 0 && missileElement == MISR_LIGHTNING)) return true; - if (gbIsHellfire && mName == MIS_HBOLT && (MType->mtype == MT_DIABLO || MType->mtype == MT_BONEDEMN)) + if (gbIsHellfire && mName == MIS_HBOLT && IsAnyOf(MType->mtype, MT_DIABLO, MT_BONEDEMN)) return true; return false; } @@ -5003,7 +5006,7 @@ bool Monster::IsPossibleToHit() const || mtalkmsg != TEXT_NONE || (MType->mtype == MT_ILLWEAV && _mgoal == MGOAL_RETREAT) || _mmode == MonsterMode::Charge - || (MType->mtype >= MT_COUNSLR && MType->mtype <= MT_ADVOCATE && _mgoal != MGOAL_NORMAL)); + || (IsAnyOf(MType->mtype, MT_COUNSLR, MT_MAGISTR, MT_CABALIST, MT_ADVOCATE) && _mgoal != MGOAL_NORMAL)); } bool Monster::TryLiftGargoyle() diff --git a/Source/monster.h b/Source/monster.h index e2da82436..fb66aacac 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -312,8 +312,8 @@ void MissToMonst(Missile &missile, Point position); * @brief Check that the given tile is available to the monster */ bool IsTileAvailable(const Monster &monster, Point position); -bool IsSkel(int mt); -bool IsGoat(int mt); +bool IsSkel(_monster_id mt); +bool IsGoat(_monster_id mt); bool SpawnSkeleton(int ii, Point position); int PreSpawnSkeleton(); void TalktoMonster(Monster &monster);