Lowercase all file paths

We want to be able to use unpacked MPQs on low-end platforms
(PS2/rg99/etc).

This is tricky on case-sensitive filesystems. Avoids case issues by
lowercasing all paths in the code (then we'll just need lowercased
listfiles).
This commit is contained in:
Gleb Mazovetskiy
2022-08-20 23:49:23 +01:00
parent 68891a8df1
commit 6327e713e0
65 changed files with 1649 additions and 1648 deletions
+4 -4
View File
@@ -157,10 +157,10 @@ set(devilutionx_assets
gendata/cutportlw.clx
gendata/cutportrw.clx
gendata/cutstartw.clx
Levels/L1Data/SklKngT.dun
Levels/L2Data/BonechaT.dun
NLevels/L5Data/cornerstone.dun
NLevels/L5Data/uberroom.dun
levels/l1data/sklkngt.dun
levels/l2data/bonechat.dun
nlevels/l5data/cornerstone.dun
nlevels/l5data/uberroom.dun
ui_art/black_diablo.pcx
ui_art/black_hellfire.pcx
ui_art/creditsw.clx
+6 -6
View File
@@ -540,17 +540,17 @@ std::unique_ptr<AutomapTile[]> LoadAutomapData(size_t &tileCount)
{
switch (leveltype) {
case DTYPE_CATHEDRAL:
return LoadFileInMem<AutomapTile>("Levels\\L1Data\\L1.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("levels\\l1data\\l1.amp", &tileCount);
case DTYPE_CATACOMBS:
return LoadFileInMem<AutomapTile>("Levels\\L2Data\\L2.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("levels\\l2data\\l2.amp", &tileCount);
case DTYPE_CAVES:
return LoadFileInMem<AutomapTile>("Levels\\L3Data\\L3.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("levels\\l3data\\l3.amp", &tileCount);
case DTYPE_HELL:
return LoadFileInMem<AutomapTile>("Levels\\L4Data\\L4.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("levels\\l4data\\l4.amp", &tileCount);
case DTYPE_NEST:
return LoadFileInMem<AutomapTile>("NLevels\\L6Data\\L6.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("nlevels\\l6data\\l6.amp", &tileCount);
case DTYPE_CRYPT:
return LoadFileInMem<AutomapTile>("NLevels\\L5Data\\L5.AMP", &tileCount);
return LoadFileInMem<AutomapTile>("nlevels\\l5data\\l5.amp", &tileCount);
default:
return nullptr;
}
+3 -2
View File
@@ -14,6 +14,7 @@
#include "utils/log.hpp"
#include "utils/paths.h"
#include "utils/pcx.hpp"
#include "utils/str_cat.hpp"
#include "utils/ui_fwd.h"
namespace devilution {
@@ -136,11 +137,11 @@ std::ofstream CaptureFile(std::string *dstPath)
std::time_t tt = std::time(nullptr);
std::tm *tm = std::localtime(&tt);
std::string filename = fmt::format("Screenshot from {:%Y-%m-%d %H-%M-%S}", *tm);
*dstPath = paths::PrefPath() + filename + ".PCX";
*dstPath = StrCat(paths::PrefPath(), filename, ".pcx");
int i = 0;
while (FileExists(dstPath->c_str())) {
i++;
*dstPath = paths::PrefPath() + filename + "-" + std::to_string(i) + ".PCX";
*dstPath = StrCat(paths::PrefPath(), filename, "-", i, ".pcx");
}
return std::ofstream(*dstPath, std::ios::binary | std::ios::trunc);
}
+1 -1
View File
@@ -8,7 +8,7 @@
namespace devilution {
/**
* @brief Save the current screen to a screen??.PCX (00-99) in file if available, then make the screen red for 200ms.
* @brief Save the current screen to a screen??.pcx (00-99) in file if available, then make the screen red for 200ms.
*/
void CaptureScreen();
+10 -10
View File
@@ -550,12 +550,12 @@ void InitControlPan()
LoadCharPanel();
LoadSpellIcons();
{
const OwnedClxSpriteList sprite = LoadCel("CtrlPan\\Panel8.CEL", GetMainPanel().size.width);
const OwnedClxSpriteList sprite = LoadCel("ctrlpan\\panel8.cel", GetMainPanel().size.width);
ClxDraw(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) - 1 }, sprite[0]);
}
{
const Point bulbsPosition { 0, 87 };
const OwnedClxSpriteList statusPanel = LoadCel("CtrlPan\\P8Bulbs.CEL", 88);
const OwnedClxSpriteList statusPanel = LoadCel("ctrlpan\\p8bulbs.cel", 88);
ClxDraw(*pLifeBuff, bulbsPosition, statusPanel[0]);
ClxDraw(*pManaBuff, bulbsPosition, statusPanel[1]);
}
@@ -564,11 +564,11 @@ void InitControlPan()
if (IsChatAvailable()) {
if (!HeadlessMode) {
{
const OwnedClxSpriteList sprite = LoadCel("CtrlPan\\TalkPanl.CEL", GetMainPanel().size.width);
const OwnedClxSpriteList sprite = LoadCel("ctrlpan\\talkpanl.cel", GetMainPanel().size.width);
ClxDraw(*pBtmBuff, { 0, (GetMainPanel().size.height + 16) * 2 - 1 }, sprite[0]);
}
multiButtons = LoadCel("CtrlPan\\P8But2.CEL", 33);
talkButtons = LoadCel("CtrlPan\\TalkButt.CEL", 61);
multiButtons = LoadCel("ctrlpan\\p8but2.cel", 33);
talkButtons = LoadCel("ctrlpan\\talkbutt.cel", 61);
}
sgbPlrTalkTbl = 0;
TalkMessage[0] = '\0';
@@ -581,10 +581,10 @@ void InitControlPan()
lvlbtndown = false;
if (!HeadlessMode) {
LoadMainPanel();
pPanelButtons = LoadCel("CtrlPan\\Panel8bu.CEL", 71);
pPanelButtons = LoadCel("ctrlpan\\panel8bu.cel", 71);
static const uint16_t CharButtonsFrameWidths[9] { 95, 41, 41, 41, 41, 41, 41, 41, 41 };
pChrButtons = LoadCel("Data\\CharBut.CEL", CharButtonsFrameWidths);
pChrButtons = LoadCel("data\\charbut.cel", CharButtonsFrameWidths);
}
ClearPanBtn();
if (!IsChatAvailable())
@@ -592,7 +592,7 @@ void InitControlPan()
else
PanelButtonIndex = 8;
if (!HeadlessMode)
pDurIcons = LoadCel("Items\\DurIcons.CEL", 32);
pDurIcons = LoadCel("items\\duricons.cel", 32);
for (bool &buttonEnabled : chrbtn)
buttonEnabled = false;
chrbtnactive = false;
@@ -607,8 +607,8 @@ void InitControlPan()
if (!HeadlessMode) {
InitSpellBook();
pQLogCel = LoadCel("Data\\Quest.CEL", static_cast<uint16_t>(SidePanelSize.width));
pGBoxBuff = LoadCel("CtrlPan\\Golddrop.cel", 261);
pQLogCel = LoadCel("data\\quest.cel", static_cast<uint16_t>(SidePanelSize.width));
pGBoxBuff = LoadCel("ctrlpan\\golddrop.cel", 261);
}
CloseGoldDrop();
dropGoldValue = 0;
+2 -2
View File
@@ -132,9 +132,9 @@ int pcurs;
void InitCursor()
{
assert(!pCursCels);
pCursCels = LoadCel("Data\\Inv\\Objcurs.CEL", InvItemWidth1);
pCursCels = LoadCel("data\\inv\\objcurs.cel", InvItemWidth1);
if (gbIsHellfire)
pCursCels2 = LoadCel("Data\\Inv\\Objcurs2.CEL", InvItemWidth2);
pCursCels2 = LoadCel("data\\inv\\objcurs2.cel", InvItemWidth2);
ClearCursor();
}
+6 -6
View File
@@ -965,13 +965,13 @@ std::string DebugCmdChangeTRN(const string_view parameter)
if (std::getline(paramsStream, second, ' ')) {
std::string prefix;
if (first == "mon") {
prefix = "Monsters\\Monsters\\";
prefix = "monsters\\monsters\\";
} else if (first == "plr") {
prefix = "PlrGFX\\";
prefix = "plrgfx\\";
}
debugTRN = prefix + second + ".TRN";
debugTRN = prefix + second + ".trn";
} else {
debugTRN = first + ".TRN";
debugTRN = first + ".trn";
}
out = fmt::format("I am a pretty butterfly. \n(Loading TRN: {:s})", debugTRN);
} else {
@@ -1020,14 +1020,14 @@ std::vector<DebugCmdItem> DebugCmdList = {
{ "questinfo", "Shows info of quests.", "{id}", &DebugCmdQuestInfo },
{ "playerinfo", "Shows info of player.", "{playerid}", &DebugCmdPlayerInfo },
{ "fps", "Toggles displaying FPS", "", &DebugCmdToggleFPS },
{ "trn", "Makes player use TRN {trn} - Write 'plr' before it to look in PlrGFX\\ or 'mon' to look in Monsters\\Monsters\\ - example: trn plr infra is equal to 'PlrGFX\\Infra.TRN'", "{trn}", &DebugCmdChangeTRN },
{ "trn", "Makes player use TRN {trn} - Write 'plr' before it to look in plrgfx\\ or 'mon' to look in monsters\\monsters\\ - example: trn plr infra is equal to 'plrgfx\\infra.trn'", "{trn}", &DebugCmdChangeTRN },
};
} // namespace
void LoadDebugGFX()
{
pSquareCel = LoadCel("Data\\Square.CEL", 64);
pSquareCel = LoadCel("data\\square.cel", 64);
}
void FreeDebugGFX()
+23 -23
View File
@@ -1087,43 +1087,43 @@ void LoadLvlGFX()
switch (leveltype) {
case DTYPE_TOWN:
if (gbIsHellfire) {
pDungeonCels = LoadFileInMem("NLevels\\TownData\\Town.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("NLevels\\TownData\\Town.TIL");
pDungeonCels = LoadFileInMem("nlevels\\towndata\\town.cel");
pMegaTiles = LoadFileInMem<MegaTile>("nlevels\\towndata\\town.til");
} else {
pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("Levels\\TownData\\Town.TIL");
pDungeonCels = LoadFileInMem("levels\\towndata\\town.cel");
pMegaTiles = LoadFileInMem<MegaTile>("levels\\towndata\\town.til");
}
pSpecialCels = LoadCel("Levels\\TownData\\TownS.CEL", SpecialCelWidth);
pSpecialCels = LoadCel("levels\\towndata\\towns.cel", SpecialCelWidth);
break;
case DTYPE_CATHEDRAL:
pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("Levels\\L1Data\\L1.TIL");
pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("levels\\l1data\\l1.cel");
pMegaTiles = LoadFileInMem<MegaTile>("levels\\l1data\\l1.til");
pSpecialCels = LoadCel("levels\\l1data\\l1s.cel", SpecialCelWidth);
break;
case DTYPE_CATACOMBS:
pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("Levels\\L2Data\\L2.TIL");
pSpecialCels = LoadCel("Levels\\L2Data\\L2S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("levels\\l2data\\l2.cel");
pMegaTiles = LoadFileInMem<MegaTile>("levels\\l2data\\l2.til");
pSpecialCels = LoadCel("levels\\l2data\\l2s.cel", SpecialCelWidth);
break;
case DTYPE_CAVES:
pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("Levels\\L3Data\\L3.TIL");
pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("levels\\l3data\\l3.cel");
pMegaTiles = LoadFileInMem<MegaTile>("levels\\l3data\\l3.til");
pSpecialCels = LoadCel("levels\\l1data\\l1s.cel", SpecialCelWidth);
break;
case DTYPE_HELL:
pDungeonCels = LoadFileInMem("Levels\\L4Data\\L4.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("Levels\\L4Data\\L4.TIL");
pSpecialCels = LoadCel("Levels\\L2Data\\L2S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("levels\\l4data\\l4.cel");
pMegaTiles = LoadFileInMem<MegaTile>("levels\\l4data\\l4.til");
pSpecialCels = LoadCel("levels\\l2data\\l2s.cel", SpecialCelWidth);
break;
case DTYPE_NEST:
pDungeonCels = LoadFileInMem("NLevels\\L6Data\\L6.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("NLevels\\L6Data\\L6.TIL");
pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("nlevels\\l6data\\l6.cel");
pMegaTiles = LoadFileInMem<MegaTile>("nlevels\\l6data\\l6.til");
pSpecialCels = LoadCel("levels\\l1data\\l1s.cel", SpecialCelWidth);
break;
case DTYPE_CRYPT:
pDungeonCels = LoadFileInMem("NLevels\\L5Data\\L5.CEL");
pMegaTiles = LoadFileInMem<MegaTile>("NLevels\\L5Data\\L5.TIL");
pSpecialCels = LoadCel("NLevels\\L5Data\\L5S.CEL", SpecialCelWidth);
pDungeonCels = LoadFileInMem("nlevels\\l5data\\l5.cel");
pMegaTiles = LoadFileInMem<MegaTile>("nlevels\\l5data\\l5.til");
pSpecialCels = LoadCel("nlevels\\l5data\\l5s.cel", SpecialCelWidth);
break;
default:
app_fatal("LoadLvlGFX");
+1 -1
View File
@@ -21,7 +21,7 @@ bool DoomFlag;
void doom_init()
{
DoomSprite = LoadCel("Items\\Map\\MapZtown.CEL", 640);
DoomSprite = LoadCel("items\\map\\mapztown.cel", 640);
DoomFlag = true;
}
+1026 -1026
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -248,13 +248,13 @@ void LoadRndLvlPal(dungeon_type l)
return;
if (l == DTYPE_TOWN) {
LoadPalette("Levels\\TownData\\Town.pal");
LoadPalette("levels\\towndata\\town.pal");
return;
}
int rv = GenerateRnd(4) + 1;
if (l == DTYPE_CRYPT) {
LoadPalette("NLevels\\L5Data\\L5Base.PAL");
LoadPalette("nlevels\\l5data\\l5base.pal");
return;
}
@@ -263,9 +263,9 @@ void LoadRndLvlPal(dungeon_type l)
if (!*sgOptions.Graphics.alternateNestArt) {
rv++;
}
*fmt::format_to(szFileName, FMT_COMPILE(R"(NLevels\L{0}Data\L{0}Base{1}.PAL)"), 6, rv) = '\0';
*fmt::format_to(szFileName, FMT_COMPILE(R"(nlevels\l{0}data\l{0}base{1}.pal)"), 6, rv) = '\0';
} else {
*fmt::format_to(szFileName, FMT_COMPILE(R"(Levels\L{0}Data\L{0}_{1}.PAL)"), l, rv) = '\0';
*fmt::format_to(szFileName, FMT_COMPILE(R"(levels\l{0}data\l{0}_{1}.pal)"), l, rv) = '\0';
}
LoadPalette(szFileName);
}
+1 -1
View File
@@ -413,7 +413,7 @@ int DoDrawString(const Surface &out, string_view text, Rectangle rect, Point &ch
void LoadSmallSelectionSpinner()
{
pSPentSpn2Cels = LoadCel("Data\\PentSpn2.CEL", 12);
pSPentSpn2Cels = LoadCel("data\\pentspn2.cel", 12);
}
void UnloadFonts()
+16 -16
View File
@@ -117,25 +117,25 @@ SoundSample *DuplicateSound(const SoundSample &sound)
/** Maps from track ID to track name in spawn. */
const char *const SpawnMusicTracks[NUM_MUSIC] = {
"Music\\sTowne.wav",
"Music\\sLvlA.wav",
"Music\\sLvlA.wav",
"Music\\sLvlA.wav",
"Music\\sLvlA.wav",
"Music\\DLvlF.wav",
"Music\\DLvlE.wav",
"Music\\sintro.wav",
"music\\stowne.wav",
"music\\slvla.wav",
"music\\slvla.wav",
"music\\slvla.wav",
"music\\slvla.wav",
"music\\dlvlf.wav",
"music\\dlvle.wav",
"music\\sintro.wav",
};
/** Maps from track ID to track name. */
const char *const MusicTracks[NUM_MUSIC] = {
"Music\\DTowne.wav",
"Music\\DLvlA.wav",
"Music\\DLvlB.wav",
"Music\\DLvlC.wav",
"Music\\DLvlD.wav",
"Music\\DLvlF.wav",
"Music\\DLvlE.wav",
"Music\\Dintro.wav",
"music\\dtowne.wav",
"music\\dlvla.wav",
"music\\dlvlb.wav",
"music\\dlvlc.wav",
"music\\dlvld.wav",
"music\\dlvlf.wav",
"music\\dlvle.wav",
"music\\dintro.wav",
};
int CapVolume(int volume)
+6 -6
View File
@@ -32,22 +32,22 @@ std::optional<std::array<uint8_t, 256>> GetClassTRN(Player &player)
switch (player._pClass) {
case HeroClass::Warrior:
path = "PlrGFX\\warrior.TRN";
path = "plrgfx\\warrior.trn";
break;
case HeroClass::Rogue:
path = "PlrGFX\\rogue.TRN";
path = "plrgfx\\rogue.trn";
break;
case HeroClass::Sorcerer:
path = "PlrGFX\\sorcerer.TRN";
path = "plrgfx\\sorcerer.trn";
break;
case HeroClass::Monk:
path = "PlrGFX\\monk.TRN";
path = "plrgfx\\monk.trn";
break;
case HeroClass::Bard:
path = "PlrGFX\\bard.TRN";
path = "plrgfx\\bard.trn";
break;
case HeroClass::Barbarian:
path = "PlrGFX\\barbarian.TRN";
path = "plrgfx\\barbarian.trn";
break;
}
+5 -5
View File
@@ -195,12 +195,12 @@ void gmenu_init_menu()
return;
if (gbIsHellfire)
sgpLogo = LoadCel("Data\\hf_logo3.CEL", 430);
sgpLogo = LoadCel("data\\hf_logo3.cel", 430);
else
sgpLogo = LoadCel("Data\\Diabsmal.CEL", 296);
PentSpin_cel = LoadCel("Data\\PentSpin.CEL", 48);
option_cel = LoadCel("Data\\option.CEL", 27);
optbar_cel = LoadCel("Data\\optbar.CEL", 287);
sgpLogo = LoadCel("data\\diabsmal.cel", 296);
PentSpin_cel = LoadCel("data\\pentspin.cel", 48);
option_cel = LoadCel("data\\option.cel", 27);
optbar_cel = LoadCel("data\\optbar.cel", 287);
}
bool gmenu_is_active()
+22 -22
View File
@@ -106,60 +106,60 @@ void LoadCutsceneBackground(interface_mode uMsg)
switch (PickCutscene(uMsg)) {
case CutStart:
ArtCutsceneWidescreen = LoadOptionalClx("gendata\\cutstartw.pcx");
celPath = "Gendata\\Cutstart.cel";
palPath = "Gendata\\Cutstart.pal";
celPath = "gendata\\cutstart.cel";
palPath = "gendata\\cutstart.pal";
progress_id = 1;
break;
case CutTown:
celPath = "Gendata\\Cuttt.cel";
palPath = "Gendata\\Cuttt.pal";
celPath = "gendata\\cuttt.cel";
palPath = "gendata\\cuttt.pal";
progress_id = 1;
break;
case CutLevel1:
celPath = "Gendata\\Cutl1d.cel";
palPath = "Gendata\\Cutl1d.pal";
celPath = "gendata\\cutl1d.cel";
palPath = "gendata\\cutl1d.pal";
progress_id = 0;
break;
case CutLevel2:
celPath = "Gendata\\Cut2.cel";
palPath = "Gendata\\Cut2.pal";
celPath = "gendata\\cut2.cel";
palPath = "gendata\\cut2.pal";
progress_id = 2;
break;
case CutLevel3:
celPath = "Gendata\\Cut3.cel";
palPath = "Gendata\\Cut3.pal";
celPath = "gendata\\cut3.cel";
palPath = "gendata\\cut3.pal";
progress_id = 1;
break;
case CutLevel4:
celPath = "Gendata\\Cut4.cel";
palPath = "Gendata\\Cut4.pal";
celPath = "gendata\\cut4.cel";
palPath = "gendata\\cut4.pal";
progress_id = 1;
break;
case CutLevel5:
celPath = "Nlevels\\Cutl5.cel";
palPath = "Nlevels\\Cutl5.pal";
celPath = "nlevels\\cutl5.cel";
palPath = "nlevels\\cutl5.pal";
progress_id = 1;
break;
case CutLevel6:
celPath = "Nlevels\\Cutl6.cel";
palPath = "Nlevels\\Cutl6.pal";
celPath = "nlevels\\cutl6.cel";
palPath = "nlevels\\cutl6.pal";
progress_id = 1;
break;
case CutPortal:
ArtCutsceneWidescreen = LoadOptionalClx("gendata\\cutportlw.pcx");
celPath = "Gendata\\Cutportl.cel";
palPath = "Gendata\\Cutportl.pal";
celPath = "gendata\\cutportl.cel";
palPath = "gendata\\cutportl.pal";
progress_id = 1;
break;
case CutPortalRed:
ArtCutsceneWidescreen = LoadOptionalClx("gendata\\cutportrw.pcx");
celPath = "Gendata\\Cutportr.cel";
palPath = "Gendata\\Cutportr.pal";
celPath = "gendata\\cutportr.cel";
palPath = "gendata\\cutportr.pal";
progress_id = 1;
break;
case CutGate:
celPath = "Gendata\\Cutgate.cel";
palPath = "Gendata\\Cutgate.pal";
celPath = "gendata\\cutgate.cel";
palPath = "gendata\\cutgate.pal";
progress_id = 1;
break;
}
+4 -4
View File
@@ -1070,17 +1070,17 @@ void InitInv()
switch (MyPlayer->_pClass) {
case HeroClass::Warrior:
case HeroClass::Barbarian:
pInvCels = LoadCel("Data\\Inv\\Inv.CEL", static_cast<uint16_t>(SidePanelSize.width));
pInvCels = LoadCel("data\\inv\\inv.cel", static_cast<uint16_t>(SidePanelSize.width));
break;
case HeroClass::Rogue:
case HeroClass::Bard:
pInvCels = LoadCel("Data\\Inv\\Inv_rog.CEL", static_cast<uint16_t>(SidePanelSize.width));
pInvCels = LoadCel("data\\inv\\inv_rog.cel", static_cast<uint16_t>(SidePanelSize.width));
break;
case HeroClass::Sorcerer:
pInvCels = LoadCel("Data\\Inv\\Inv_Sor.CEL", static_cast<uint16_t>(SidePanelSize.width));
pInvCels = LoadCel("data\\inv\\inv_sor.cel", static_cast<uint16_t>(SidePanelSize.width));
break;
case HeroClass::Monk:
pInvCels = LoadCel(!gbIsSpawn ? "Data\\Inv\\Inv_Sor.CEL" : "Data\\Inv\\Inv.CEL", static_cast<uint16_t>(SidePanelSize.width));
pInvCels = LoadCel(!gbIsSpawn ? "data\\inv\\inv_sor.cel" : "data\\inv\\inv.cel", static_cast<uint16_t>(SidePanelSize.width));
break;
}
}
+36 -36
View File
@@ -181,41 +181,41 @@ char OilNames[10][25] = {
/** Map of item type .cel file names. */
const char *const ItemDropNames[] = {
"Armor2",
"Axe",
"FBttle",
"Bow",
"GoldFlip",
"Helmut",
"Mace",
"Shield",
"SwrdFlip",
"Rock",
"Cleaver",
"Staff",
"Ring",
"CrownF",
"LArmor",
"WShield",
"Scroll",
"FPlateAr",
"FBook",
"Food",
"FBttleBB",
"FBttleDY",
"FBttleOR",
"FBttleBR",
"FBttleBL",
"FBttleBY",
"FBttleWH",
"FBttleDB",
"FEar",
"FBrain",
"FMush",
"Innsign",
"Bldstn",
"Fanvil",
"FLazStaf",
"armor2",
"axe",
"fbttle",
"bow",
"goldflip",
"helmut",
"mace",
"shield",
"swrdflip",
"rock",
"cleaver",
"staff",
"ring",
"crownf",
"larmor",
"wshield",
"scroll",
"fplatear",
"fbook",
"food",
"fbttlebb",
"fbttledy",
"fbttleor",
"fbttlebr",
"fbttlebl",
"fbttleby",
"fbttlewh",
"fbttledb",
"fear",
"fbrain",
"fmush",
"innsign",
"bldstn",
"fanvil",
"flazstaf",
"bombs1",
"halfps1",
"wholeps1",
@@ -2318,7 +2318,7 @@ void InitItemGFX()
int itemTypes = gbIsHellfire ? ITEMTYPES : 35;
for (int i = 0; i < itemTypes; i++) {
*BufCopy(arglist, "Items\\", ItemDropNames[i], ".CEL") = '\0';
*BufCopy(arglist, "items\\", ItemDropNames[i], ".cel") = '\0';
itemanims[i] = LoadCel(arglist, ItemAnimWidth);
}
memset(UniqueItemFlags, 0, sizeof(UniqueItemFlags));
+2 -2
View File
@@ -684,7 +684,7 @@ void SetCryptRoom()
IsUberRoomOpened = false;
IsUberLeverActivated = false;
auto dunData = LoadFileInMem<uint16_t>("NLevels\\L5Data\\uberroom.dun");
auto dunData = LoadFileInMem<uint16_t>("nlevels\\l5data\\uberroom.dun");
SetPiece = { position, { dunData[0], dunData[1] } };
@@ -695,7 +695,7 @@ void SetCornerRoom()
{
Point position = SelectChamber();
auto dunData = LoadFileInMem<uint16_t>("NLevels\\L5Data\\cornerstone.dun");
auto dunData = LoadFileInMem<uint16_t>("nlevels\\l5data\\cornerstone.dun");
SetPiece = { position, { dunData[0], dunData[1] } };
+3 -3
View File
@@ -382,11 +382,11 @@ void FillFloor()
void LoadQuestSetPieces()
{
if (Quests[Q_BUTCHER].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\rnd6.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\rnd6.dun");
} else if (Quests[Q_SKELKING].IsAvailable() && !gbIsMultiplayer) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\SKngDO.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\skngdo.dun");
} else if (Quests[Q_LTBANNER].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\Banner2.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\banner2.dun");
}
}
+3 -3
View File
@@ -1616,11 +1616,11 @@ void PlaceMiniSetRandom1x1(uint8_t search, uint8_t replace, int rndper)
void LoadQuestSetPieces()
{
if (Quests[Q_BLIND].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blind1.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\blind1.dun");
} else if (Quests[Q_BLOOD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blood1.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\blood1.dun");
} else if (Quests[Q_SCHAMB].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Bonestr2.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\bonestr2.dun");
}
}
+1 -1
View File
@@ -1793,7 +1793,7 @@ void Fence()
void LoadQuestSetPieces()
{
if (Quests[Q_ANVIL].IsAvailable())
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L3Data\\Anvil.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l3data\\anvil.dun");
}
bool PlaceAnvil()
+6 -6
View File
@@ -159,9 +159,9 @@ void ApplyShadowsPatterns()
void LoadQuestSetPieces()
{
if (Quests[Q_WARLORD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Warlord.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l4data\\warlord.dun");
} else if (currlevel == 15 && gbIsMultiplayer) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Vile1.DUN");
pSetPiece = LoadFileInMem<uint16_t>("levels\\l4data\\vile1.dun");
}
}
@@ -939,22 +939,22 @@ void ProtectQuads()
void LoadDiabQuads(bool preflag)
{
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\diab1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\diab1.dun");
DiabloQuad1 = L4Hold + Displacement { 4, 4 };
PlaceDunTiles(dunData.get(), DiabloQuad1, 6);
}
{
auto dunData = LoadFileInMem<uint16_t>(preflag ? "Levels\\L4Data\\diab2b.DUN" : "Levels\\L4Data\\diab2a.DUN");
auto dunData = LoadFileInMem<uint16_t>(preflag ? "levels\\l4data\\diab2b.dun" : "levels\\l4data\\diab2a.dun");
DiabloQuad2 = { 27 - L4Hold.x, 1 + L4Hold.y };
PlaceDunTiles(dunData.get(), DiabloQuad2, 6);
}
{
auto dunData = LoadFileInMem<uint16_t>(preflag ? "Levels\\L4Data\\diab3b.DUN" : "Levels\\L4Data\\diab3a.DUN");
auto dunData = LoadFileInMem<uint16_t>(preflag ? "levels\\l4data\\diab3b.dun" : "levels\\l4data\\diab3a.dun");
DiabloQuad3 = { 1 + L4Hold.x, 27 - L4Hold.y };
PlaceDunTiles(dunData.get(), DiabloQuad3, 6);
}
{
auto dunData = LoadFileInMem<uint16_t>(preflag ? "Levels\\L4Data\\diab4b.DUN" : "Levels\\L4Data\\diab4a.DUN");
auto dunData = LoadFileInMem<uint16_t>(preflag ? "levels\\l4data\\diab4b.dun" : "levels\\l4data\\diab4a.dun");
DiabloQuad4 = { 28 - L4Hold.x, 28 - L4Hold.y };
PlaceDunTiles(dunData.get(), DiabloQuad4, 6);
}
+16 -16
View File
@@ -58,20 +58,20 @@ std::unique_ptr<uint16_t[]> LoadMinData(size_t &tileCount)
switch (leveltype) {
case DTYPE_TOWN:
if (gbIsHellfire)
return LoadFileInMem<uint16_t>("NLevels\\TownData\\Town.MIN", &tileCount);
return LoadFileInMem<uint16_t>("Levels\\TownData\\Town.MIN", &tileCount);
return LoadFileInMem<uint16_t>("nlevels\\towndata\\town.min", &tileCount);
return LoadFileInMem<uint16_t>("levels\\towndata\\town.min", &tileCount);
case DTYPE_CATHEDRAL:
return LoadFileInMem<uint16_t>("Levels\\L1Data\\L1.MIN", &tileCount);
return LoadFileInMem<uint16_t>("levels\\l1data\\l1.min", &tileCount);
case DTYPE_CATACOMBS:
return LoadFileInMem<uint16_t>("Levels\\L2Data\\L2.MIN", &tileCount);
return LoadFileInMem<uint16_t>("levels\\l2data\\l2.min", &tileCount);
case DTYPE_CAVES:
return LoadFileInMem<uint16_t>("Levels\\L3Data\\L3.MIN", &tileCount);
return LoadFileInMem<uint16_t>("levels\\l3data\\l3.min", &tileCount);
case DTYPE_HELL:
return LoadFileInMem<uint16_t>("Levels\\L4Data\\L4.MIN", &tileCount);
return LoadFileInMem<uint16_t>("levels\\l4data\\l4.min", &tileCount);
case DTYPE_NEST:
return LoadFileInMem<uint16_t>("NLevels\\L6Data\\L6.MIN", &tileCount);
return LoadFileInMem<uint16_t>("nlevels\\l6data\\l6.min", &tileCount);
case DTYPE_CRYPT:
return LoadFileInMem<uint16_t>("NLevels\\L5Data\\L5.MIN", &tileCount);
return LoadFileInMem<uint16_t>("nlevels\\l5data\\l5.min", &tileCount);
default:
app_fatal("LoadMinData");
}
@@ -416,28 +416,28 @@ void LoadLevelSOLData()
switch (leveltype) {
case DTYPE_TOWN:
if (gbIsHellfire)
LoadFileInMem("NLevels\\TownData\\Town.SOL", SOLData);
LoadFileInMem("nlevels\\towndata\\town.sol", SOLData);
else
LoadFileInMem("Levels\\TownData\\Town.SOL", SOLData);
LoadFileInMem("levels\\towndata\\town.sol", SOLData);
break;
case DTYPE_CATHEDRAL:
LoadFileInMem("Levels\\L1Data\\L1.SOL", SOLData);
LoadFileInMem("levels\\l1data\\l1.sol", SOLData);
break;
case DTYPE_CATACOMBS:
LoadFileInMem("Levels\\L2Data\\L2.SOL", SOLData);
LoadFileInMem("levels\\l2data\\l2.sol", SOLData);
break;
case DTYPE_CAVES:
LoadFileInMem("Levels\\L3Data\\L3.SOL", SOLData);
LoadFileInMem("levels\\l3data\\l3.sol", SOLData);
break;
case DTYPE_HELL:
LoadFileInMem("Levels\\L4Data\\L4.SOL", SOLData);
LoadFileInMem("levels\\l4data\\l4.sol", SOLData);
SOLData[210] = TileProperties::None; // Tile is incorrectly marked as being solid
break;
case DTYPE_NEST:
LoadFileInMem("NLevels\\L6Data\\L6.SOL", SOLData);
LoadFileInMem("nlevels\\l6data\\l6.sol", SOLData);
break;
case DTYPE_CRYPT:
LoadFileInMem("NLevels\\L5Data\\L5.SOL", SOLData);
LoadFileInMem("nlevels\\l5data\\l5.sol", SOLData);
break;
default:
app_fatal("LoadLevelSOLData");
+14 -14
View File
@@ -74,18 +74,18 @@ void LoadSetMap()
Quests[Q_SKELKING]._qactive = QUEST_ACTIVE;
Quests[Q_SKELKING]._qvar1 = 1;
}
LoadPreL1Dungeon("Levels\\L1Data\\SklKng1.DUN");
LoadL1Dungeon("Levels\\L1Data\\SklKng2.DUN", { 83, 45 });
SetMapTransparency("Levels\\L1Data\\SklKngT.dun");
LoadPalette("Levels\\L1Data\\L1_2.pal");
LoadPreL1Dungeon("levels\\l1data\\sklkng1.dun");
LoadL1Dungeon("levels\\l1data\\sklkng2.dun", { 83, 45 });
SetMapTransparency("levels\\l1data\\sklkngt.dun");
LoadPalette("levels\\l1data\\l1_2.pal");
AddSKingObjs();
InitSKingTriggers();
break;
case SL_BONECHAMB:
LoadPreL2Dungeon("Levels\\L2Data\\Bonecha2.DUN");
LoadL2Dungeon("Levels\\L2Data\\Bonecha1.DUN", { 69, 39 });
SetMapTransparency("Levels\\L2Data\\BonechaT.dun");
LoadPalette("Levels\\L2Data\\L2_2.pal");
LoadPreL2Dungeon("levels\\l2data\\bonecha2.dun");
LoadL2Dungeon("levels\\l2data\\bonecha1.dun", { 69, 39 });
SetMapTransparency("levels\\l2data\\bonechat.dun");
LoadPalette("levels\\l2data\\l2_2.pal");
AddSChamObjs();
InitSChambTriggers();
break;
@@ -94,8 +94,8 @@ void LoadSetMap()
case SL_POISONWATER:
if (Quests[Q_PWATER]._qactive == QUEST_INIT)
Quests[Q_PWATER]._qactive = QUEST_ACTIVE;
LoadL3Dungeon("Levels\\L3Data\\Foulwatr.DUN", { 31, 83 });
LoadPalette("Levels\\L3Data\\L3pfoul.pal");
LoadL3Dungeon("levels\\l3data\\foulwatr.dun", { 31, 83 });
LoadPalette("levels\\l3data\\l3pfoul.pal");
InitPWaterTriggers();
break;
case SL_VILEBETRAYER:
@@ -104,10 +104,10 @@ void LoadSetMap()
} else if (Quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) {
Quests[Q_BETRAYER]._qvar2 = 3;
}
LoadPreL1Dungeon("Levels\\L1Data\\Vile1.DUN");
LoadL1Dungeon("Levels\\L1Data\\Vile2.DUN", { 35, 36 });
SetMapTransparency("Levels\\L1Data\\Vile1.DUN");
LoadPalette("Levels\\L1Data\\L1_2.pal");
LoadPreL1Dungeon("levels\\l1data\\vile1.dun");
LoadL1Dungeon("levels\\l1data\\vile2.dun", { 35, 36 });
SetMapTransparency("levels\\l1data\\vile1.dun");
LoadPalette("levels\\l1data\\l1_2.pal");
AddVileObjs();
InitNoTriggers();
break;
+4 -4
View File
@@ -193,10 +193,10 @@ void DrlgTPass3()
}
}
FillSector("Levels\\TownData\\Sector1s.DUN", 46, 46);
FillSector("Levels\\TownData\\Sector2s.DUN", 46, 0);
FillSector("Levels\\TownData\\Sector3s.DUN", 0, 46);
FillSector("Levels\\TownData\\Sector4s.DUN", 0, 0);
FillSector("levels\\towndata\\sector1s.dun", 46, 46);
FillSector("levels\\towndata\\sector2s.dun", 46, 0);
FillSector("levels\\towndata\\sector3s.dun", 0, 46);
FillSector("levels\\towndata\\sector4s.dun", 0, 0);
if (!IsWarpOpen(DTYPE_CATACOMBS)) {
FillTile(48, 20, 320);
+2 -2
View File
@@ -448,10 +448,10 @@ void MakeLightTable()
tbl += 240;
}
LoadFileInMem("PlrGFX\\Infra.TRN", tbl, 256);
LoadFileInMem("plrgfx\\infra.trn", tbl, 256);
tbl += 256;
LoadFileInMem("PlrGFX\\Stone.TRN", tbl, 256);
LoadFileInMem("plrgfx\\stone.trn", tbl, 256);
tbl += 256;
for (int i = 0; i < 8; i++) {
+1 -1
View File
@@ -126,7 +126,7 @@ void FreeQuestText()
void InitQuestText()
{
pTextBoxCels = LoadCel("Data\\TextBox.CEL", 591);
pTextBoxCels = LoadCel("data\\textbox.cel", 591);
}
void InitQTextMsg(_speech_id m)
+40 -40
View File
@@ -130,52 +130,52 @@ MissileData MissilesData[] = {
MissileFileData MissileSpriteData[] = {
// clang-format off
// name, animName, animFAmt, flags, animDelay[16], animLen[16], animWidth, animWidth2
{ "Arrows", MFILE_ARROWS, 1, MissileDataFlags::NotAnimated, { 0 }, { 16 }, 96, 16 },
{ "Fireba", MFILE_FIREBA, 16, MissileDataFlags::None, { 0 }, { 14 }, 96, 16 },
{ "Guard", MFILE_GUARD, 3, MissileDataFlags::None, { 1 }, { 15, 14, 3 }, 96, 16 },
{ "Lghning", MFILE_LGHNING, 1, MissileDataFlags::None, { 0 }, { 8 }, 96, 16 },
{ "Firewal", MFILE_FIREWAL, 2, MissileDataFlags::None, { 0 }, { 13, 11 }, 128, 32 },
{ "MagBlos", MFILE_MAGBLOS, 1, MissileDataFlags::None, { 1 }, { 10 }, 128, 32 },
{ "Portal", MFILE_PORTAL, 2, MissileDataFlags::None, { 0, 1 }, { 16 }, 96, 16 },
{ "Bluexfr", MFILE_BLUEXFR, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 },
{ "Bluexbk", MFILE_BLUEXBK, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 },
{ "Manashld", MFILE_MANASHLD, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, 96, 16 },
{ "arrows", MFILE_ARROWS, 1, MissileDataFlags::NotAnimated, { 0 }, { 16 }, 96, 16 },
{ "fireba", MFILE_FIREBA, 16, MissileDataFlags::None, { 0 }, { 14 }, 96, 16 },
{ "guard", MFILE_GUARD, 3, MissileDataFlags::None, { 1 }, { 15, 14, 3 }, 96, 16 },
{ "lghning", MFILE_LGHNING, 1, MissileDataFlags::None, { 0 }, { 8 }, 96, 16 },
{ "firewal", MFILE_FIREWAL, 2, MissileDataFlags::None, { 0 }, { 13, 11 }, 128, 32 },
{ "magblos", MFILE_MAGBLOS, 1, MissileDataFlags::None, { 1 }, { 10 }, 128, 32 },
{ "portal", MFILE_PORTAL, 2, MissileDataFlags::None, { 0, 1 }, { 16 }, 96, 16 },
{ "bluexfr", MFILE_BLUEXFR, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 },
{ "bluexbk", MFILE_BLUEXBK, 1, MissileDataFlags::None, { 0 }, { 19 }, 160, 48 },
{ "manashld", MFILE_MANASHLD, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, 96, 16 },
{ {}, MFILE_BLOOD, 4, MissileDataFlags::None, { 0 }, { 15 }, 96, 16 },
{ {}, MFILE_BONE, 3, MissileDataFlags::None, { 2 }, { 8 }, 128, 32 },
{ {}, MFILE_METLHIT, 3, MissileDataFlags::None, { 2 }, { 10 }, 96, 16 },
{ "Farrow", MFILE_FARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 },
{ "Doom", MFILE_DOOM, 9, MissileDataFlags::MonsterOwned, { 1 }, { 15 }, 96, 16 },
{ "farrow", MFILE_FARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 },
{ "doom", MFILE_DOOM, 9, MissileDataFlags::MonsterOwned, { 1 }, { 15 }, 96, 16 },
{ {}, MFILE_0F, 1, MissileDataFlags::MonsterOwned, { 0 }, { 0 }, 0, 0 },
{ {}, MFILE_BLODBUR, 2, MissileDataFlags::None, { 2 }, { 8 }, 128, 32 },
{ "Newexp", MFILE_NEWEXP, 1, MissileDataFlags::None, { 1 }, { 15 }, 96, 16 },
{ "Shatter1", MFILE_SHATTER1, 1, MissileDataFlags::None, { 1 }, { 12 }, 128, 32 },
{ "Bigexp", MFILE_BIGEXP, 1, MissileDataFlags::None, { 0 }, { 15 }, 160, 48 },
{ "Inferno", MFILE_INFERNO, 1, MissileDataFlags::None, { 0 }, { 20 }, 96, 16 },
{ "Thinlght", MFILE_THINLGHT, 1, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "Flare", MFILE_FLARE, 1, MissileDataFlags::None, { 0 }, { 16 }, 128, 32 },
{ "Flareexp", MFILE_FLAREEXP, 1, MissileDataFlags::None, { 0 }, { 7 }, 128, 32 },
{ "Magball", MFILE_MAGBALL, 8, MissileDataFlags::MonsterOwned, { 1 }, { 16 }, 128, 32 },
{ "Krull", MFILE_KRULL, 1, MissileDataFlags::MonsterOwned, { 0 }, { 14 }, 96, 16 },
{ "Miniltng", MFILE_MINILTNG, 1, MissileDataFlags::None, { 1 }, { 8 }, 64, 0 },
{ "Holy", MFILE_HOLY, 16, MissileDataFlags::None, { 1, 0 }, { 14 }, 96, 16 },
{ "Holyexpl", MFILE_HOLYEXPL, 1, MissileDataFlags::None, { 0 }, { 8 }, 160, 48 },
{ "Larrow", MFILE_LARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 },
{ "newexp", MFILE_NEWEXP, 1, MissileDataFlags::None, { 1 }, { 15 }, 96, 16 },
{ "shatter1", MFILE_SHATTER1, 1, MissileDataFlags::None, { 1 }, { 12 }, 128, 32 },
{ "bigexp", MFILE_BIGEXP, 1, MissileDataFlags::None, { 0 }, { 15 }, 160, 48 },
{ "inferno", MFILE_INFERNO, 1, MissileDataFlags::None, { 0 }, { 20 }, 96, 16 },
{ "thinlght", MFILE_THINLGHT, 1, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "flare", MFILE_FLARE, 1, MissileDataFlags::None, { 0 }, { 16 }, 128, 32 },
{ "flareexp", MFILE_FLAREEXP, 1, MissileDataFlags::None, { 0 }, { 7 }, 128, 32 },
{ "magball", MFILE_MAGBALL, 8, MissileDataFlags::MonsterOwned, { 1 }, { 16 }, 128, 32 },
{ "krull", MFILE_KRULL, 1, MissileDataFlags::MonsterOwned, { 0 }, { 14 }, 96, 16 },
{ "miniltng", MFILE_MINILTNG, 1, MissileDataFlags::None, { 1 }, { 8 }, 64, 0 },
{ "holy", MFILE_HOLY, 16, MissileDataFlags::None, { 1, 0 }, { 14 }, 96, 16 },
{ "holyexpl", MFILE_HOLYEXPL, 1, MissileDataFlags::None, { 0 }, { 8 }, 160, 48 },
{ "larrow", MFILE_LARROW, 16, MissileDataFlags::None, { 0 }, { 4 }, 96, 16 },
{ {}, MFILE_FIRARWEX, 1, MissileDataFlags::None, { 0 }, { 6 }, 64, 0 },
{ "Acidbf", MFILE_ACIDBF, 16, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "Acidspla", MFILE_ACIDSPLA, 1, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "Acidpud", MFILE_ACIDPUD, 2, MissileDataFlags::MonsterOwned, { 0 }, { 9, 4 }, 96, 16 },
{ "acidbf", MFILE_ACIDBF, 16, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "acidspla", MFILE_ACIDSPLA, 1, MissileDataFlags::MonsterOwned, { 0 }, { 8 }, 96, 16 },
{ "acidpud", MFILE_ACIDPUD, 2, MissileDataFlags::MonsterOwned, { 0 }, { 9, 4 }, 96, 16 },
{ {}, MFILE_ETHRSHLD, 1, MissileDataFlags::None, { 0 }, { 1 }, 96, 16 },
{ "Firerun", MFILE_FIRERUN, 8, MissileDataFlags::None, { 1 }, { 12 }, 96, 16 },
{ "Ressur1", MFILE_RESSUR1, 1, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 },
{ "Sklball", MFILE_SKLBALL, 9, MissileDataFlags::None, { 1 }, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, 96, 16 },
{ "Rportal", MFILE_RPORTAL, 2, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 },
{ "Fireplar", MFILE_FIREPLAR, 1, MissileDataFlags::MonsterOwned, { 1 }, { 17 }, 160, 48 },
{ "Scubmisb", MFILE_SCUBMISB, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "Scbsexpb", MFILE_SCBSEXPB, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "Scubmisc", MFILE_SCUBMISC, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "Scbsexpc", MFILE_SCBSEXPC, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "Scubmisd", MFILE_SCUBMISD, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "Scbsexpd", MFILE_SCBSEXPD, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "firerun", MFILE_FIRERUN, 8, MissileDataFlags::None, { 1 }, { 12 }, 96, 16 },
{ "ressur1", MFILE_RESSUR1, 1, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 },
{ "sklball", MFILE_SKLBALL, 9, MissileDataFlags::None, { 1 }, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, 96, 16 },
{ "rportal", MFILE_RPORTAL, 2, MissileDataFlags::None, { 0 }, { 16 }, 96, 16 },
{ "fireplar", MFILE_FIREPLAR, 1, MissileDataFlags::MonsterOwned, { 1 }, { 17 }, 160, 48 },
{ "scubmisb", MFILE_SCUBMISB, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "scbsexpb", MFILE_SCBSEXPB, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "scubmisc", MFILE_SCUBMISC, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "scbsexpc", MFILE_SCBSEXPC, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "scubmisd", MFILE_SCUBMISD, 1, MissileDataFlags::MonsterOwned, { 0 }, { 16 }, 96, 16 },
{ "scbsexpd", MFILE_SCBSEXPD, 1, MissileDataFlags::MonsterOwned, { 0 }, { 6 }, 128, 32 },
{ "spawns", MFILE_SPAWNS, 8, MissileDataFlags::MonsterOwned, { 0 }, { 9 }, 96, 16 },
{ "reflect", MFILE_REFLECT, 1, MissileDataFlags::NotAnimated, { 0 }, { 1 }, 160, 64 },
{ "ms_ora", MFILE_LICH, 16, MissileDataFlags::MonsterOwned, { 0 }, { 15 }, 96, 8 },
@@ -236,7 +236,7 @@ void MissileFileData::LoadGFX()
if (name.empty())
return;
FileNameGenerator pathGenerator({ "Missiles\\", name }, ".CL2");
FileNameGenerator pathGenerator({ "missiles\\", name }, ".cl2");
if (animFAmt == 1) {
sprites.emplace(OwnedClxSpriteListOrSheet { LoadCl2(pathGenerator(), animWidth) });
} else {
+238 -238
View File
@@ -28,145 +28,145 @@ const MonsterData MonstersData[] = {
// _monster_id name, assetsSuffix, soundSuffix, trnFile, availability, width, image, hasSpecial, hasSpecialSound, frames[6], rate[6], minDunLvl, maxDunLvl, level, hitPointsMinimum, hitPointsMaximum, ai, abilityFlags, intelligence, toHit, animFrameNum, minDamage, maxDamage, toHitSpecial, animFrameNumSpecial, minDamageSpecial, maxDamageSpecial, armorClass, monsterClass, resistance, resistanceHell, selectionType, treasure, exp
// TRANSLATORS: Monster Block start
/* MT_NZOMBIE */ { P_("monster", "Zombie"), "Zombie\\Zombie", nullptr, nullptr, MonsterAvailability::Always, 128, 799, 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_MAGIC , 3, 0, 54 },
/* MT_BZOMBIE */ { P_("monster", "Ghoul"), "Zombie\\Zombie", nullptr, "Zombie\\Bluered", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC , 3, 0, 58 },
/* MT_GZOMBIE */ { P_("monster", "Rotting Carcass"), "Zombie\\Zombie", nullptr, "Zombie\\Grey", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC | RESIST_FIRE , 3, 0, 136 },
/* MT_YZOMBIE */ { P_("monster", "Black Death"), "Zombie\\Zombie", nullptr, "Zombie\\Yellow", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 240 },
/* MT_RFALLSP */ { P_("monster", "Fallen One"), "FalSpear\\Phall", nullptr, "FalSpear\\FallenT", MonsterAvailability::Always, 128, 543, 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", nullptr, "FalSpear\\Dark", MonsterAvailability::Always, 128, 543, 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", nullptr, nullptr, MonsterAvailability::Always, 128, 543, true, true, { 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", nullptr, "FalSpear\\Blue", MonsterAvailability::Always, 128, 543, 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, 0 , RESIST_LIGHTNING , 3, 0, 255 },
/* MT_WSKELAX */ { P_("monster", "Skeleton"), "SkelAxe\\SklAx", nullptr, "SkelAxe\\White", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC , 3, 0, 64 },
/* MT_TSKELAX */ { P_("monster", "Corpse Axe"), "SkelAxe\\SklAx", nullptr, "SkelAxe\\Skelt", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC , 3, 0, 68 },
/* MT_RSKELAX */ { P_("monster", "Burning Dead"), "SkelAxe\\SklAx", nullptr, nullptr, MonsterAvailability::Always, 128, 553, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 154 },
/* MT_XSKELAX */ { P_("monster", "Horror"), "SkelAxe\\SklAx", nullptr, "SkelAxe\\Black", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 264 },
/* MT_RFALLSD */ { P_("monster", "Fallen One"), "FalSword\\Fall", nullptr, "FalSword\\FallenT", MonsterAvailability::Always, 128, 623, 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", nullptr, "FalSword\\Dark", MonsterAvailability::Always, 128, 623, 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", nullptr, nullptr, MonsterAvailability::Always, 128, 623, true, true, { 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", nullptr, "FalSword\\Blue", MonsterAvailability::Always, 128, 623, 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, 0 , RESIST_LIGHTNING , 3, 0, 280 },
/* MT_NSCAV */ { P_("monster", "Scavenger"), "Scav\\Scav", nullptr, nullptr, MonsterAvailability::Always, 128, 410, true, 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", nullptr, "Scav\\ScavBr", MonsterAvailability::Always, 128, 410, true, false, { 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", nullptr, "Scav\\ScavBe", MonsterAvailability::Always, 128, 410, true, false, { 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, 0 , RESIST_FIRE , 3, 0, 375 },
/* MT_YSCAV */ { P_("monster", "Bone Gasher"), "Scav\\Scav", nullptr, "Scav\\ScavW", MonsterAvailability::Always, 128, 410, true, false, { 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 , RESIST_LIGHTNING , 3, 0, 552 },
/* MT_WSKELBW */ { P_("monster", "Skeleton"), "SkelBow\\SklBw", nullptr, "SkelBow\\White", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC , 3, 0, 110 },
/* MT_TSKELBW */ { P_("monster", "Corpse Bow"), "SkelBow\\SklBw", nullptr, "SkelBow\\Skelt", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC , 3, 0, 210 },
/* MT_RSKELBW */ { P_("monster", "Burning Dead"), "SkelBow\\SklBw", nullptr, nullptr, MonsterAvailability::Always, 128, 567, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 364 },
/* MT_XSKELBW */ { P_("monster", "Horror"), "SkelBow\\SklBw", nullptr, "SkelBow\\Black", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 594 },
/* MT_WSKELSD */ { P_("monster", "Skeleton Captain"), "SkelSd\\SklSr", nullptr, "SkelSd\\White", MonsterAvailability::Always, 128, 575, 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_MAGIC , 3, 0, 90 },
/* MT_TSKELSD */ { P_("monster", "Corpse Captain"), "SkelSd\\SklSr", nullptr, "SkelSd\\Skelt", MonsterAvailability::Always, 128, 575, true, false, { 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_MAGIC , 3, 0, 200 },
/* MT_RSKELSD */ { P_("monster", "Burning Dead Captain"), "SkelSd\\SklSr", nullptr, nullptr, MonsterAvailability::Always, 128, 575, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 393 },
/* MT_XSKELSD */ { P_("monster", "Horror Captain"), "SkelSd\\SklSr", nullptr, "SkelSd\\Black", MonsterAvailability::Always, 128, 575, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 604 },
/* MT_INVILORD*/ { P_("monster", "Invisible Lord"), "TSneak\\TSneak", nullptr, nullptr, MonsterAvailability::Never, 128, 800, 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 , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 2000 },
/* MT_SNEAK */ { P_("monster", "Hidden"), "Sneak\\Sneak", nullptr, nullptr, MonsterAvailability::Retail, 128, 992, true, 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 , 0 , 3, 0, 278 },
/* MT_STALKER */ { P_("monster", "Stalker"), "Sneak\\Sneak", nullptr, "Sneak\\Sneakv2", MonsterAvailability::Retail, 128, 992, true, false, { 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 , 0 , 3, 0, 630 },
/* MT_UNSEEN */ { P_("monster", "Unseen"), "Sneak\\Sneak", nullptr, "Sneak\\Sneakv3", MonsterAvailability::Retail, 128, 992, true, false, { 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_MAGIC , 3, 0, 935 },
/* MT_ILLWEAV */ { P_("monster", "Illusion Weaver"), "Sneak\\Sneak", nullptr, "Sneak\\Sneakv1", MonsterAvailability::Retail, 128, 992, true, false, { 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 , 3, 0, 1500 },
/* MT_LRDSAYTR*/ { P_("monster", "Satyr Lord"), "GoatLord\\GoatL", "newsfx\\Satyr", nullptr, MonsterAvailability::Retail, 160, 800, 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", nullptr, nullptr, MonsterAvailability::Retail, 128, 1030, true, 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", nullptr, "GoatMace\\Beige", MonsterAvailability::Retail, 128, 1030, true, false, { 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_MAGIC , 3, 0, 685 },
/* MT_RGOATMC */ { P_("monster", "Fire Clan"), "GoatMace\\Goat", nullptr, "GoatMace\\Red", MonsterAvailability::Retail, 128, 1030, true, false, { 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", nullptr, "GoatMace\\Gray", MonsterAvailability::Retail, 128, 1030, true, false, { 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_MAGIC , 3, 0, 1190 },
/* MT_FIEND */ { P_("monster", "Fiend"), "Bat\\Bat", nullptr, "Bat\\red", MonsterAvailability::Always, 96, 364, false, false, { 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", nullptr, nullptr, MonsterAvailability::Always, 96, 364, 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", nullptr, "Bat\\grey", MonsterAvailability::Always, 96, 364, false, false, { 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 , 6, T_NODROP, 509 },
/* MT_FAMILIAR*/ { P_("monster", "Familiar"), "Bat\\Bat", nullptr, "Bat\\orange", MonsterAvailability::Always, 96, 364, false, false, { 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 , 6, T_NODROP, 448 },
/* MT_NGOATBW */ { P_("monster", "Flesh Clan"), "GoatBow\\GoatB", nullptr, nullptr, MonsterAvailability::Retail, 128, 1040, 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", nullptr, "GoatBow\\Beige", MonsterAvailability::Retail, 128, 1040, false, false, { 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_MAGIC , 3, 0, 645 },
/* MT_RGOATBW */ { P_("monster", "Fire Clan"), "GoatBow\\GoatB", nullptr, "GoatBow\\Red", MonsterAvailability::Retail, 128, 1040, false, false, { 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", nullptr, "GoatBow\\Gray", MonsterAvailability::Retail, 128, 1040, false, false, { 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_MAGIC , 3, 0, 1092 },
/* MT_NACID */ { P_("monster", "Acid Beast"), "Acid\\Acid", nullptr, nullptr, MonsterAvailability::Retail, 128, 716, true, true, { 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", nullptr, "Acid\\AcidBlk", MonsterAvailability::Retail, 128, 716, 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", nullptr, "Acid\\AcidB", MonsterAvailability::Retail, 128, 716, 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", nullptr, "Acid\\AcidR", MonsterAvailability::Retail, 128, 716, 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", nullptr, "SkelAxe\\White", MonsterAvailability::Never, 160, 1010, 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, Uniq(UITEM_SKCROWN), 570 },
/* MT_CLEAVER */ { P_("monster", "The Butcher"), "FatC\\FatC", nullptr, nullptr, MonsterAvailability::Never, 128, 980, 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, Uniq(UITEM_CLEAVER), 710 },
/* MT_FAT */ { P_("monster", "Overlord"), "Fat\\Fat", nullptr, nullptr, MonsterAvailability::Retail, 128, 1130, true, 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", nullptr, "Fat\\Blue", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, "Fat\\FatB", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, "Fat\\FatF", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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 , RESIST_MAGIC | RESIST_FIRE , 3, 0, 1827 },
/* MT_NMAGMA */ { P_("monster", "Magma Demon"), "Magma\\Magma", nullptr, nullptr, MonsterAvailability::Retail, 128, 1680, true, true, { 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", nullptr, "Magma\\Yellow", MonsterAvailability::Retail, 128, 1680, 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", nullptr, "Magma\\Blue", MonsterAvailability::Retail, 128, 1680, 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", nullptr, "Magma\\Wierd", MonsterAvailability::Retail, 128, 1680, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1630, true, true, { 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", nullptr, "Rhino\\Orange", MonsterAvailability::Retail, 160, 1630, 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", nullptr, "Rhino\\Blue", MonsterAvailability::Retail, 160, 1630, 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", nullptr, "Rhino\\RhinoB", MonsterAvailability::Retail, 160, 1630, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1740, true, true, { 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_MAGIC , 7, 0, 1344 },
/* MT_REDDTH */ { P_("monster", "Red Death"), "Thin\\Thin", nullptr, "Thin\\Thinv3", MonsterAvailability::Never, 160, 1740, 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", nullptr, "Thin\\Thinv3", MonsterAvailability::Never, 160, 1740, 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_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2736 },
/* MT_UDEDBLRG*/ { P_("monster", "Undead Balrog"), "Thin\\Thin", nullptr, "Thin\\Thinv3", MonsterAvailability::Never, 160, 1740, 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_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 3575 },
/* MT_INCIN */ { P_("monster", "Incinerator"), "Fireman\\FireM", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, "Thin\\Thinv3", MonsterAvailability::Retail, 160, 1740, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1740, true, true, { 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", nullptr, "Thin\\Thinv2", MonsterAvailability::Retail, 160, 1740, 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", nullptr, "Thin\\Thinv1", MonsterAvailability::Retail, 160, 1740, 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_MAGIC | IMMUNE_LIGHTNING , 7, 0, 3177 },
/* MT_BIGFALL */ { P_("monster", "Devil Kin Brute"), "BigFall\\Fallg", "newsfx\\KBrute", nullptr, MonsterAvailability::Retail, 128, 800, true, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1650, true, 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_MAGIC | IMMUNE_FIRE , 6, 0, 662 },
/* MT_GARGOYLE*/ { P_("monster", "Gargoyle"), "Gargoyle\\Gargo", nullptr, "Gargoyle\\GarE", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | IMMUNE_LIGHTNING , 6, 0, 1205 },
/* MT_BLOODCLW*/ { P_("monster", "Blood Claw"), "Gargoyle\\Gargo", nullptr, "Gargoyle\\GargBr", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 6, 0, 1873 },
/* MT_DEATHW */ { P_("monster", "Death Wing"), "Gargoyle\\Gargo", nullptr, "Gargoyle\\GargB", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 6, 0, 2278 },
/* MT_MEGA */ { P_("monster", "Slayer"), "Mega\\Mega", nullptr, nullptr, MonsterAvailability::Retail, 160, 2220, true, true, { 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", nullptr, "Mega\\Guard", MonsterAvailability::Retail, 160, 2220, 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", nullptr, "Mega\\Vtexl", MonsterAvailability::Retail, 160, 2220, 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 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 3252 },
/* MT_BALROG */ { P_("monster", "Balrog"), "Mega\\Mega", nullptr, "Mega\\Balr", MonsterAvailability::Retail, 160, 2220, 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 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 3643 },
/* MT_NSNAKE */ { P_("monster", "Cave Viper"), "Snake\\Snake", nullptr, nullptr, MonsterAvailability::Retail, 160, 1270, 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", nullptr, "Snake\\SnakR", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, "Snake\\Snakg", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, "Snake\\Snakb", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 2120, 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 , RESIST_MAGIC | IMMUNE_LIGHTNING , 7, 0, 3360 },
/* MT_RTBLACK */ { P_("monster", "Doom Guard"), "Black\\Black", nullptr, "Black\\BlkKntRT", MonsterAvailability::Retail, 160, 2120, false, false, { 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 , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 3650 },
/* MT_BTBLACK */ { P_("monster", "Steel Lord"), "Black\\Black", nullptr, "Black\\BlkKntBT", MonsterAvailability::Retail, 160, 2120, false, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 4252 },
/* MT_RBLACK */ { P_("monster", "Blood Knight"), "Black\\Black", nullptr, "Black\\BlkKntBe", MonsterAvailability::Retail, 160, 2120, false, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 5130 },
/* MT_UNRAV */ { P_("monster", "The Shredded"), "Unrav\\Unrav", "newsfx\\Shred", nullptr, MonsterAvailability::Retail, 96, 484, 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 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 900 },
/* MT_HOLOWONE*/ { P_("monster", "Hollow One"), "Unrav\\Unrav", "Acid\\Acid", nullptr, MonsterAvailability::Never, 96, 484, 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 4374 },
/* MT_PAINMSTR*/ { P_("monster", "Pain Master"), "Unrav\\Unrav", "Acid\\Acid", nullptr, MonsterAvailability::Never, 96, 484, 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 5147 },
/* MT_REALWEAV*/ { P_("monster", "Reality Weaver"), "Unrav\\Unrav", "Acid\\Acid", nullptr, MonsterAvailability::Never, 96, 484, 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 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 5925 },
/* MT_SUCCUBUS*/ { P_("monster", "Succubus"), "Succ\\Scbs", nullptr, nullptr, MonsterAvailability::Retail, 128, 980, 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", nullptr, "Succ\\Succb", MonsterAvailability::Retail, 128, 980, false, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 4084 },
/* MT_HLSPWN */ { P_("monster", "Hell Spawn"), "Succ\\Scbs", nullptr, "Succ\\Succrw", MonsterAvailability::Retail, 128, 980, false, false, { 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", nullptr, "Succ\\Succbw", MonsterAvailability::Retail, 128, 980, false, false, { 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", nullptr, nullptr, MonsterAvailability::Retail, 128, 2000, true, 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", nullptr, "Mage\\Cnselg", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 4478 },
/* MT_CABALIST*/ { P_("monster", "Cabalist"), "Mage\\Mage", nullptr, "Mage\\Cnselgd", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 4929 },
/* MT_ADVOCATE*/ { P_("monster", "Advocate"), "Mage\\Mage", nullptr, "Mage\\Cnselbk", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 4968 },
/* MT_GOLEM */ { P_("monster", "Golem"), "Golem\\Golem", "Golem\\Golm", nullptr, MonsterAvailability::Never, 96, 386, true, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2000, true, true, { 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_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 31666 },
/* MT_DARKMAGE*/ { P_("monster", "The Arch-Litch Malignus"), "DarkMage\\Dmage", "DarkMage\\Dmag", nullptr, MonsterAvailability::Never, 128, 1060, true, 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 4968 },
/* MT_HELLBOAR*/ { P_("monster", "Hellboar"), "Fork\\Fork", "newsfx\\HBoar", nullptr, MonsterAvailability::Retail, 188, 800, 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", "newsfx\\Stingr", nullptr, MonsterAvailability::Retail, 64, 305, 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", "newsfx\\psyco", nullptr, MonsterAvailability::Retail, 156, 800, 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", "newsfx\\SLord", nullptr, MonsterAvailability::Retail, 148, 800, 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", "newsfx\\FTwin", nullptr, MonsterAvailability::Retail, 128, 800, 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, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 600 },
/* MT_HORKSPWN*/ { P_("monster", "Hork Spawn"), "Spawn\\Spawn", "newsfx\\HSpawn", nullptr, MonsterAvailability::Retail, 164, 520, false, true, { 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", "newsfx\\Stingr", nullptr, MonsterAvailability::Retail, 86, 305, 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", "newsfx\\Psyco", nullptr, MonsterAvailability::Retail, 140, 800, 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", "newsfx\\SLord", nullptr, MonsterAvailability::Retail, 148, 800, true, true, { 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", "newsfx\\Lworm", nullptr, MonsterAvailability::Retail, 176, 800, 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", "newsfx\\TchAnt", nullptr, MonsterAvailability::Retail, 192, 800, 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", "newsfx\\HDemon", nullptr, MonsterAvailability::Never, 138, 800, true, true, { 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", "newsfx\\Defile", nullptr, MonsterAvailability::Never, 198, 800, true, true, { 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", "newsfx\\GDiggr", nullptr, MonsterAvailability::Retail, 124, 800, true, true, { 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 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 3, 0, 2000 },
/* MT_TOMBRAT */ { P_("monster", "Tomb Rat"), "Rat\\Rat", "newsfx\\TmbRat", nullptr, MonsterAvailability::Retail, 104, 550, 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", "newsfx\\HelBat", nullptr, MonsterAvailability::Retail, 96, 550, 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", "newsfx\\SWing", "SkelAxe\\Skelt", MonsterAvailability::Retail, 128, 1740, true, 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 , RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 3000 },
/* MT_LICH */ { P_("monster", "Lich"), "Lich\\Lich", "newsfx\\Lich", nullptr, MonsterAvailability::Retail, 96, 800, false, true, { 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 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 3, 0, 3000 },
/* MT_CRYPTDMN*/ { P_("monster", "Crypt Demon"), "Bubba\\Bubba", "newsfx\\Crypt", nullptr, MonsterAvailability::Retail, 154, 800, false, true, { 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", "newsfx\\HelBat", nullptr, MonsterAvailability::Retail, 96, 550, true, 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", "newsfx\\SWing", nullptr, MonsterAvailability::Retail, 128, 1740, true, true, { 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_FIRE | IMMUNE_LIGHTNING , 7, 0, 5000 },
/* MT_ARCHLICH*/ { P_("monster", "Arch Lich"), "Lich2\\Lich2", "newsfx\\Lich", nullptr, MonsterAvailability::Retail, 136, 800, false, true, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 4000 },
/* MT_BICLOPS */ { P_("monster", "Biclops"), "Byclps\\Byclps", "newsfx\\Biclop", nullptr, MonsterAvailability::Retail, 180, 800, 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", "newsfx\\FleshT", nullptr, MonsterAvailability::Retail, 164, 800, false, true, { 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", "newsfx\\Reaper", nullptr, MonsterAvailability::Retail, 180, 800, 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", nullptr, nullptr, MonsterAvailability::Always, 128, 799, 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_MAGIC , 3, 0, 54 },
/* MT_BZOMBIE */ { P_("monster", "Ghoul"), "zombie\\zombie", nullptr, "zombie\\bluered", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC , 3, 0, 58 },
/* MT_GZOMBIE */ { P_("monster", "Rotting Carcass"), "zombie\\zombie", nullptr, "zombie\\grey", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC | RESIST_FIRE , 3, 0, 136 },
/* MT_YZOMBIE */ { P_("monster", "Black Death"), "zombie\\zombie", nullptr, "zombie\\yellow", MonsterAvailability::Always, 128, 799, false, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 240 },
/* MT_RFALLSP */ { P_("monster", "Fallen One"), "falspear\\phall", nullptr, "falspear\\fallent", MonsterAvailability::Always, 128, 543, 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", nullptr, "falspear\\dark", MonsterAvailability::Always, 128, 543, 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", nullptr, nullptr, MonsterAvailability::Always, 128, 543, true, true, { 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", nullptr, "falspear\\blue", MonsterAvailability::Always, 128, 543, 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, 0 , RESIST_LIGHTNING , 3, 0, 255 },
/* MT_WSKELAX */ { P_("monster", "Skeleton"), "skelaxe\\sklax", nullptr, "skelaxe\\white", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC , 3, 0, 64 },
/* MT_TSKELAX */ { P_("monster", "Corpse Axe"), "skelaxe\\sklax", nullptr, "skelaxe\\skelt", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC , 3, 0, 68 },
/* MT_RSKELAX */ { P_("monster", "Burning Dead"), "skelaxe\\sklax", nullptr, nullptr, MonsterAvailability::Always, 128, 553, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 154 },
/* MT_XSKELAX */ { P_("monster", "Horror"), "skelaxe\\sklax", nullptr, "skelaxe\\black", MonsterAvailability::Always, 128, 553, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 264 },
/* MT_RFALLSD */ { P_("monster", "Fallen One"), "falsword\\fall", nullptr, "falsword\\fallent", MonsterAvailability::Always, 128, 623, 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", nullptr, "falsword\\dark", MonsterAvailability::Always, 128, 623, 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", nullptr, nullptr, MonsterAvailability::Always, 128, 623, true, true, { 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", nullptr, "falsword\\blue", MonsterAvailability::Always, 128, 623, 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, 0 , RESIST_LIGHTNING , 3, 0, 280 },
/* MT_NSCAV */ { P_("monster", "Scavenger"), "scav\\scav", nullptr, nullptr, MonsterAvailability::Always, 128, 410, true, 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", nullptr, "scav\\scavbr", MonsterAvailability::Always, 128, 410, true, false, { 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", nullptr, "scav\\scavbe", MonsterAvailability::Always, 128, 410, true, false, { 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, 0 , RESIST_FIRE , 3, 0, 375 },
/* MT_YSCAV */ { P_("monster", "Bone Gasher"), "scav\\scav", nullptr, "scav\\scavw", MonsterAvailability::Always, 128, 410, true, false, { 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 , RESIST_LIGHTNING , 3, 0, 552 },
/* MT_WSKELBW */ { P_("monster", "Skeleton"), "skelbow\\sklbw", nullptr, "skelbow\\white", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC , 3, 0, 110 },
/* MT_TSKELBW */ { P_("monster", "Corpse Bow"), "skelbow\\sklbw", nullptr, "skelbow\\skelt", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC , 3, 0, 210 },
/* MT_RSKELBW */ { P_("monster", "Burning Dead"), "skelbow\\sklbw", nullptr, nullptr, MonsterAvailability::Always, 128, 567, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 364 },
/* MT_XSKELBW */ { P_("monster", "Horror"), "skelbow\\sklbw", nullptr, "skelbow\\black", MonsterAvailability::Always, 128, 567, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 594 },
/* MT_WSKELSD */ { P_("monster", "Skeleton Captain"), "skelsd\\sklsr", nullptr, "skelsd\\white", MonsterAvailability::Always, 128, 575, 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_MAGIC , 3, 0, 90 },
/* MT_TSKELSD */ { P_("monster", "Corpse Captain"), "skelsd\\sklsr", nullptr, "skelsd\\skelt", MonsterAvailability::Always, 128, 575, true, false, { 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_MAGIC , 3, 0, 200 },
/* MT_RSKELSD */ { P_("monster", "Burning Dead Captain"), "skelsd\\sklsr", nullptr, nullptr, MonsterAvailability::Always, 128, 575, true, 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_MAGIC | IMMUNE_FIRE , 3, 0, 393 },
/* MT_XSKELSD */ { P_("monster", "Horror Captain"), "skelsd\\sklsr", nullptr, "skelsd\\black", MonsterAvailability::Always, 128, 575, true, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 604 },
/* MT_INVILORD*/ { P_("monster", "Invisible Lord"), "tsneak\\tsneak", nullptr, nullptr, MonsterAvailability::Never, 128, 800, 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 , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 2000 },
/* MT_SNEAK */ { P_("monster", "Hidden"), "sneak\\sneak", nullptr, nullptr, MonsterAvailability::Retail, 128, 992, true, 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 , 0 , 3, 0, 278 },
/* MT_STALKER */ { P_("monster", "Stalker"), "sneak\\sneak", nullptr, "sneak\\sneakv2", MonsterAvailability::Retail, 128, 992, true, false, { 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 , 0 , 3, 0, 630 },
/* MT_UNSEEN */ { P_("monster", "Unseen"), "sneak\\sneak", nullptr, "sneak\\sneakv3", MonsterAvailability::Retail, 128, 992, true, false, { 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_MAGIC , 3, 0, 935 },
/* MT_ILLWEAV */ { P_("monster", "Illusion Weaver"), "sneak\\sneak", nullptr, "sneak\\sneakv1", MonsterAvailability::Retail, 128, 992, true, false, { 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 , 3, 0, 1500 },
/* MT_LRDSAYTR*/ { P_("monster", "Satyr Lord"), "goatlord\\goatl", "newsfx\\satyr", nullptr, MonsterAvailability::Retail, 160, 800, 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", nullptr, nullptr, MonsterAvailability::Retail, 128, 1030, true, 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", nullptr, "goatmace\\beige", MonsterAvailability::Retail, 128, 1030, true, false, { 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_MAGIC , 3, 0, 685 },
/* MT_RGOATMC */ { P_("monster", "Fire Clan"), "goatmace\\goat", nullptr, "goatmace\\red", MonsterAvailability::Retail, 128, 1030, true, false, { 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", nullptr, "goatmace\\gray", MonsterAvailability::Retail, 128, 1030, true, false, { 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_MAGIC , 3, 0, 1190 },
/* MT_FIEND */ { P_("monster", "Fiend"), "bat\\bat", nullptr, "bat\\red", MonsterAvailability::Always, 96, 364, false, false, { 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", nullptr, nullptr, MonsterAvailability::Always, 96, 364, 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", nullptr, "bat\\grey", MonsterAvailability::Always, 96, 364, false, false, { 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 , 6, T_NODROP, 509 },
/* MT_FAMILIAR*/ { P_("monster", "Familiar"), "bat\\bat", nullptr, "bat\\orange", MonsterAvailability::Always, 96, 364, false, false, { 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 , 6, T_NODROP, 448 },
/* MT_NGOATBW */ { P_("monster", "Flesh Clan"), "goatbow\\goatb", nullptr, nullptr, MonsterAvailability::Retail, 128, 1040, 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", nullptr, "goatbow\\beige", MonsterAvailability::Retail, 128, 1040, false, false, { 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_MAGIC , 3, 0, 645 },
/* MT_RGOATBW */ { P_("monster", "Fire Clan"), "goatbow\\goatb", nullptr, "goatbow\\red", MonsterAvailability::Retail, 128, 1040, false, false, { 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", nullptr, "goatbow\\gray", MonsterAvailability::Retail, 128, 1040, false, false, { 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_MAGIC , 3, 0, 1092 },
/* MT_NACID */ { P_("monster", "Acid Beast"), "acid\\acid", nullptr, nullptr, MonsterAvailability::Retail, 128, 716, true, true, { 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", nullptr, "acid\\acidblk", MonsterAvailability::Retail, 128, 716, 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", nullptr, "acid\\acidb", MonsterAvailability::Retail, 128, 716, 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", nullptr, "acid\\acidr", MonsterAvailability::Retail, 128, 716, 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", nullptr, "skelaxe\\white", MonsterAvailability::Never, 160, 1010, 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, Uniq(UITEM_SKCROWN), 570 },
/* MT_CLEAVER */ { P_("monster", "The Butcher"), "fatc\\fatc", nullptr, nullptr, MonsterAvailability::Never, 128, 980, 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, Uniq(UITEM_CLEAVER), 710 },
/* MT_FAT */ { P_("monster", "Overlord"), "fat\\fat", nullptr, nullptr, MonsterAvailability::Retail, 128, 1130, true, 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", nullptr, "fat\\blue", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, "fat\\fatb", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, "fat\\fatf", MonsterAvailability::Retail, 128, 1130, true, false, { 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2420, 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 , RESIST_MAGIC | RESIST_FIRE , 3, 0, 1827 },
/* MT_NMAGMA */ { P_("monster", "Magma Demon"), "magma\\magma", nullptr, nullptr, MonsterAvailability::Retail, 128, 1680, true, true, { 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", nullptr, "magma\\yellow", MonsterAvailability::Retail, 128, 1680, 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", nullptr, "magma\\blue", MonsterAvailability::Retail, 128, 1680, 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", nullptr, "magma\\wierd", MonsterAvailability::Retail, 128, 1680, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1630, true, true, { 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", nullptr, "rhino\\orange", MonsterAvailability::Retail, 160, 1630, 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", nullptr, "rhino\\blue", MonsterAvailability::Retail, 160, 1630, 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", nullptr, "rhino\\rhinob", MonsterAvailability::Retail, 160, 1630, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1740, true, true, { 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_MAGIC , 7, 0, 1344 },
/* MT_REDDTH */ { P_("monster", "Red Death"), "thin\\thin", nullptr, "thin\\thinv3", MonsterAvailability::Never, 160, 1740, 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", nullptr, "thin\\thinv3", MonsterAvailability::Never, 160, 1740, 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_MAGIC | IMMUNE_LIGHTNING , 7, 0, 2736 },
/* MT_UDEDBLRG*/ { P_("monster", "Undead Balrog"), "thin\\thin", nullptr, "thin\\thinv3", MonsterAvailability::Never, 160, 1740, 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_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 3575 },
/* MT_INCIN */ { P_("monster", "Incinerator"), "fireman\\firem", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, nullptr, MonsterAvailability::Never, 128, 1460, true, 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", nullptr, "thin\\thinv3", MonsterAvailability::Retail, 160, 1740, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1740, true, true, { 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", nullptr, "thin\\thinv2", MonsterAvailability::Retail, 160, 1740, 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", nullptr, "thin\\thinv1", MonsterAvailability::Retail, 160, 1740, 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_MAGIC | IMMUNE_LIGHTNING , 7, 0, 3177 },
/* MT_BIGFALL */ { P_("monster", "Devil Kin Brute"), "bigfall\\fallg", "newsfx\\kbrute", nullptr, MonsterAvailability::Retail, 128, 800, true, 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 1650, true, 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_MAGIC | IMMUNE_FIRE , 6, 0, 662 },
/* MT_GARGOYLE*/ { P_("monster", "Gargoyle"), "gargoyle\\gargo", nullptr, "gargoyle\\gare", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | IMMUNE_LIGHTNING , 6, 0, 1205 },
/* MT_BLOODCLW*/ { P_("monster", "Blood Claw"), "gargoyle\\gargo", nullptr, "gargoyle\\gargbr", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 6, 0, 1873 },
/* MT_DEATHW */ { P_("monster", "Death Wing"), "gargoyle\\gargo", nullptr, "gargoyle\\gargb", MonsterAvailability::Retail, 160, 1650, true, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 6, 0, 2278 },
/* MT_MEGA */ { P_("monster", "Slayer"), "mega\\mega", nullptr, nullptr, MonsterAvailability::Retail, 160, 2220, true, true, { 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", nullptr, "mega\\guard", MonsterAvailability::Retail, 160, 2220, 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", nullptr, "mega\\vtexl", MonsterAvailability::Retail, 160, 2220, 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 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 3252 },
/* MT_BALROG */ { P_("monster", "Balrog"), "mega\\mega", nullptr, "mega\\balr", MonsterAvailability::Retail, 160, 2220, 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 , RESIST_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 3643 },
/* MT_NSNAKE */ { P_("monster", "Cave Viper"), "snake\\snake", nullptr, nullptr, MonsterAvailability::Retail, 160, 1270, 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", nullptr, "snake\\snakr", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, "snake\\snakg", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, "snake\\snakb", MonsterAvailability::Retail, 160, 1270, false, false, { 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", nullptr, nullptr, MonsterAvailability::Retail, 160, 2120, 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 , RESIST_MAGIC | IMMUNE_LIGHTNING , 7, 0, 3360 },
/* MT_RTBLACK */ { P_("monster", "Doom Guard"), "black\\black", nullptr, "black\\blkkntrt", MonsterAvailability::Retail, 160, 2120, false, false, { 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 , RESIST_MAGIC | IMMUNE_FIRE , 7, 0, 3650 },
/* MT_BTBLACK */ { P_("monster", "Steel Lord"), "black\\black", nullptr, "black\\blkkntbt", MonsterAvailability::Retail, 160, 2120, false, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 4252 },
/* MT_RBLACK */ { P_("monster", "Blood Knight"), "black\\black", nullptr, "black\\blkkntbe", MonsterAvailability::Retail, 160, 2120, false, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 5130 },
/* MT_UNRAV */ { P_("monster", "The Shredded"), "unrav\\unrav", "newsfx\\shred", nullptr, MonsterAvailability::Retail, 96, 484, 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 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 900 },
/* MT_HOLOWONE*/ { P_("monster", "Hollow One"), "unrav\\unrav", "acid\\acid", nullptr, MonsterAvailability::Never, 96, 484, 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 4374 },
/* MT_PAINMSTR*/ { P_("monster", "Pain Master"), "unrav\\unrav", "acid\\acid", nullptr, MonsterAvailability::Never, 96, 484, 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 5147 },
/* MT_REALWEAV*/ { P_("monster", "Reality Weaver"), "unrav\\unrav", "acid\\acid", nullptr, MonsterAvailability::Never, 96, 484, 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 , RESIST_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 5925 },
/* MT_SUCCUBUS*/ { P_("monster", "Succubus"), "succ\\scbs", nullptr, nullptr, MonsterAvailability::Retail, 128, 980, 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", nullptr, "succ\\succb", MonsterAvailability::Retail, 128, 980, false, false, { 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_MAGIC | RESIST_LIGHTNING , 3, 0, 4084 },
/* MT_HLSPWN */ { P_("monster", "Hell Spawn"), "succ\\scbs", nullptr, "succ\\succrw", MonsterAvailability::Retail, 128, 980, false, false, { 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", nullptr, "succ\\succbw", MonsterAvailability::Retail, 128, 980, false, false, { 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", nullptr, nullptr, MonsterAvailability::Retail, 128, 2000, true, 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", nullptr, "mage\\cnselg", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , 7, 0, 4478 },
/* MT_CABALIST*/ { P_("monster", "Cabalist"), "mage\\mage", nullptr, "mage\\cnselgd", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 7, 0, 4929 },
/* MT_ADVOCATE*/ { P_("monster", "Advocate"), "mage\\mage", nullptr, "mage\\cnselbk", MonsterAvailability::Retail, 128, 2000, true, false, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 4968 },
/* MT_GOLEM */ { P_("monster", "Golem"), "golem\\golem", "golem\\golm", nullptr, MonsterAvailability::Never, 96, 386, true, 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", nullptr, nullptr, MonsterAvailability::Never, 160, 2000, true, true, { 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_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 31666 },
/* MT_DARKMAGE*/ { P_("monster", "The Arch-Litch Malignus"), "darkmage\\dmage", "darkmage\\dmag", nullptr, MonsterAvailability::Never, 128, 1060, true, 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 4968 },
/* MT_HELLBOAR*/ { P_("monster", "Hellboar"), "fork\\fork", "newsfx\\hboar", nullptr, MonsterAvailability::Retail, 188, 800, 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", "newsfx\\stingr", nullptr, MonsterAvailability::Retail, 64, 305, 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", "newsfx\\psyco", nullptr, MonsterAvailability::Retail, 156, 800, 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", "newsfx\\slord", nullptr, MonsterAvailability::Retail, 148, 800, 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", "newsfx\\ftwin", nullptr, MonsterAvailability::Retail, 128, 800, 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, 0 , RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 600 },
/* MT_HORKSPWN*/ { P_("monster", "Hork Spawn"), "spawn\\spawn", "newsfx\\hspawn", nullptr, MonsterAvailability::Retail, 164, 520, false, true, { 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", "newsfx\\stingr", nullptr, MonsterAvailability::Retail, 86, 305, 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", "newsfx\\psyco", nullptr, MonsterAvailability::Retail, 140, 800, 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", "newsfx\\slord", nullptr, MonsterAvailability::Retail, 148, 800, true, true, { 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", "newsfx\\lworm", nullptr, MonsterAvailability::Retail, 176, 800, 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", "newsfx\\tchant", nullptr, MonsterAvailability::Retail, 192, 800, 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", "newsfx\\hdemon", nullptr, MonsterAvailability::Never, 138, 800, true, true, { 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", "newsfx\\defile", nullptr, MonsterAvailability::Never, 198, 800, true, true, { 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", "newsfx\\gdiggr", nullptr, MonsterAvailability::Retail, 124, 800, true, true, { 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 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 3, 0, 2000 },
/* MT_TOMBRAT */ { P_("monster", "Tomb Rat"), "rat\\rat", "newsfx\\tmbrat", nullptr, MonsterAvailability::Retail, 104, 550, 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", "newsfx\\helbat", nullptr, MonsterAvailability::Retail, 96, 550, 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", "newsfx\\swing", "skelaxe\\skelt", MonsterAvailability::Retail, 128, 1740, true, 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 , RESIST_FIRE | RESIST_LIGHTNING , 7, 0, 3000 },
/* MT_LICH */ { P_("monster", "Lich"), "lich\\lich", "newsfx\\lich", nullptr, MonsterAvailability::Retail, 96, 800, false, true, { 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 , RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , 3, 0, 3000 },
/* MT_CRYPTDMN*/ { P_("monster", "Crypt Demon"), "bubba\\bubba", "newsfx\\crypt", nullptr, MonsterAvailability::Retail, 154, 800, false, true, { 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", "newsfx\\helbat", nullptr, MonsterAvailability::Retail, 96, 550, true, 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", "newsfx\\swing", nullptr, MonsterAvailability::Retail, 128, 1740, true, true, { 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_FIRE | IMMUNE_LIGHTNING , 7, 0, 5000 },
/* MT_ARCHLICH*/ { P_("monster", "Arch Lich"), "lich2\\lich2", "newsfx\\lich", nullptr, MonsterAvailability::Retail, 136, 800, false, true, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 3, 0, 4000 },
/* MT_BICLOPS */ { P_("monster", "Biclops"), "byclps\\byclps", "newsfx\\biclop", nullptr, MonsterAvailability::Retail, 180, 800, 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", "newsfx\\flesht", nullptr, MonsterAvailability::Retail, 164, 800, false, true, { 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", "newsfx\\reaper", nullptr, MonsterAvailability::Retail, 180, 800, 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", "newsfx\\Nakrul", nullptr, MonsterAvailability::Never, 226, 1200, true, true, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 13333 },
/* MT_NAKRUL */ { P_("monster", "Na-Krul"), "nkr\\nkr", "newsfx\\nakrul", nullptr, MonsterAvailability::Never, 226, 1200, true, true, { 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_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , 7, 0, 13333 },
// clang-format on
};
@@ -338,107 +338,107 @@ const UniqueMonsterData UniqueMonstersData[] = {
// clang-format off
// type, name, mTrnName, mlevel, mmaxhp, ai, mint, minDamage, maxDamage, resistance, monsterPack, customToHit, customArmorClass, talkMsg
// TRANSLATORS: Unique Monster Block start
{ MT_NGOATMC, P_("monster", "Gharbad the Weak"), "BSDB", 4, 120, AI_GARBUD, 3, 8, 16, IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_GARBUD1 },
{ MT_SKING, P_("monster", "Skeleton King"), "GENRL", 0, 240, AI_SKELKING, 3, 6, 16, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Independent, 0, 0, TEXT_NONE },
{ MT_COUNSLR, P_("monster", "Zhar the Mad"), "GENERAL", 8, 360, AI_ZHAR, 3, 16, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_ZHAR1 },
{ MT_BFALLSP, P_("monster", "Snotspill"), "BNG", 4, 220, AI_SNOTSPIL, 3, 10, 18, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_BANNER10 },
{ MT_ADVOCATE, P_("monster", "Arch-Bishop Lazarus"), "GENERAL", 0, 600, AI_LAZARUS, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_HLSPWN, P_("monster", "Red Vex"), "REDV", 0, 400, AI_LAZHELP, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_HLSPWN, P_("monster", "Black Jade"), "BLKJD", 0, 400, AI_LAZHELP, 3, 30, 50, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_RBLACK, P_("monster", "Lachdanan"), "BHKA", 14, 500, AI_LACHDAN, 3, 0, 0, 0 , UniqueMonsterPack::None, 0, 0, TEXT_VEIL9 },
{ MT_BTBLACK, P_("monster", "Warlord of Blood"), "GENERAL", 13, 850, AI_WARLORD, 3, 35, 50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_WARLRD9 },
{ MT_CLEAVER, P_("monster", "The Butcher"), "GENRL", 0, 220, AI_CLEAVER, 3, 6, 12, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HORKDMN, P_("monster", "Hork Demon"), "GENRL", 19, 300, AI_HORKDMN, 3, 20, 35, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_DEFILER, P_("monster", "The Defiler"), "GENRL", 20, 480, AI_SKELSD, 3, 30, 40, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_NAKRUL, P_("monster", "Na-Krul"), "GENRL", 0, 1332, AI_SKELSD, 3, 40, 50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELAX, P_("monster", "Bonehead Keenaxe"), "BHKA", 2, 91, AI_SKELSD, 2, 4, 10, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 100, 0, TEXT_NONE },
{ MT_RFALLSD, P_("monster", "Bladeskin the Slasher"), "BSTS", 2, 51, AI_FALLEN, 0, 6, 18, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_NZOMBIE, P_("monster", "Soulpus"), "GENERAL", 2, 133, AI_ZOMBIE, 0, 4, 8, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RFALLSP, P_("monster", "Pukerat the Unclean"), "PTU", 2, 77, AI_FALLEN, 3, 1, 5, RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_WSKELAX, P_("monster", "Boneripper"), "BR", 2, 54, AI_BAT, 0, 6, 15, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NZOMBIE, P_("monster", "Rotfeast the Hungry"), "ETH", 2, 85, AI_SKELSD, 3, 4, 12, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_DFALLSD, P_("monster", "Gutshank the Quick"), "GTQ", 3, 66, AI_BAT, 2, 6, 16, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELSD, P_("monster", "Brokenhead Bangshield"), "BHBS", 3, 108, AI_SKELSD, 3, 12, 20, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_YFALLSP, P_("monster", "Bongo"), "BNG", 3, 178, AI_FALLEN, 3, 9, 21, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BZOMBIE, P_("monster", "Rotcarnage"), "RCRN", 3, 102, AI_ZOMBIE, 3, 9, 24, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_NSCAV, P_("monster", "Shadowbite"), "SHBT", 2, 60, AI_SKELSD, 3, 3, 20, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_WSKELBW, P_("monster", "Deadeye"), "DE", 2, 49, AI_GOATBOW, 0, 6, 9, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RSKELAX, P_("monster", "Madeye the Dead"), "MTD", 4, 75, AI_BAT, 0, 9, 21, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 30, TEXT_NONE },
{ MT_BSCAV, P_("monster", "El Chupacabras"), "GENERAL", 3, 120, AI_GOATMC, 0, 10, 18, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELBW, P_("monster", "Skullfire"), "SKFR", 3, 125, AI_GOATBOW, 1, 6, 10, IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_SNEAK, P_("monster", "Warpskull"), "TSPO", 3, 117, AI_SNEAK, 2, 6, 18, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GZOMBIE, P_("monster", "Goretongue"), "PMR", 3, 156, AI_SKELSD, 1, 15, 30, IMMUNE_MAGIC , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_WSCAV, P_("monster", "Pulsecrawler"), "BHKA", 4, 150, AI_SCAV, 0, 16, 20, IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_BLINK, P_("monster", "Moonbender"), "GENERAL", 4, 135, AI_BAT, 0, 9, 27, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BLINK, P_("monster", "Wrathraven"), "GENERAL", 5, 135, AI_BAT, 2, 9, 22, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_YSCAV, P_("monster", "Spineeater"), "GENERAL", 4, 180, AI_SCAV, 1, 18, 25, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSKELBW, P_("monster", "Blackash the Burning"), "BASHTB", 4, 120, AI_GOATBOW, 0, 6, 16, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BFALLSD, P_("monster", "Shadowcrow"), "GENERAL", 5, 270, AI_SNEAK, 2, 12, 25, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_LRDSAYTR, P_("monster", "Blightstone the Weak"), "BHKA", 4, 360, AI_SKELSD, 0, 4, 12, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 70, 0, TEXT_NONE },
{ MT_FAT, P_("monster", "Bilefroth the Pit Master"), "BFTP", 6, 210, AI_BAT, 1, 16, 23, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NGOATBW, P_("monster", "Bloodskin Darkbow"), "BSDB", 5, 207, AI_GOATBOW, 0, 3, 16, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 55, TEXT_NONE },
{ MT_GLOOM, P_("monster", "Foulwing"), "DB", 5, 246, AI_RHINO, 3, 12, 28, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_XSKELSD, P_("monster", "Shadowdrinker"), "SHDR", 5, 300, AI_SNEAK, 1, 18, 26, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 45, TEXT_NONE },
{ MT_UNSEEN, P_("monster", "Hazeshifter"), "BHKA", 5, 285, AI_SNEAK, 3, 18, 30, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NACID, P_("monster", "Deathspit"), "BFDS", 6, 303, AI_ACIDUNIQ, 0, 12, 32, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RGOATMC, P_("monster", "Bloodgutter"), "BGBL", 6, 315, AI_BAT, 1, 24, 34, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BGOATMC, P_("monster", "Deathshade Fleshmaul"), "DSFM", 6, 276, AI_RHINO, 0, 12, 24, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 65, TEXT_NONE },
{ MT_WYRM, P_("monster", "Warmaggot the Mad"), "GENERAL", 6, 246, AI_BAT, 3, 15, 30, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_STORM, P_("monster", "Glasskull the Jagged"), "BHKA", 7, 354, AI_STORM, 0, 18, 30, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RGOATBW, P_("monster", "Blightfire"), "BLF", 7, 321, AI_SUCC, 2, 13, 21, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GARGOYLE, P_("monster", "Nightwing the Cold"), "GENERAL", 7, 342, AI_BAT, 1, 18, 26, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GGOATBW, P_("monster", "Gorestone"), "GENERAL", 7, 303, AI_GOATBOW, 1, 15, 28, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 70, 0, TEXT_NONE },
{ MT_BMAGMA, P_("monster", "Bronzefist Firestone"), "GENERAL", 8, 360, AI_MAGMA, 0, 30, 36, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_INCIN, P_("monster", "Wrathfire the Doomed"), "WFTD", 8, 270, AI_SKELSD, 2, 20, 30, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NMAGMA, P_("monster", "Firewound the Grim"), "BHKA", 8, 303, AI_MAGMA, 0, 18, 22, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MUDMAN, P_("monster", "Baron Sludge"), "BSM", 8, 315, AI_SNEAK, 3, 25, 34, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 75, TEXT_NONE },
{ MT_GGOATMC, P_("monster", "Blighthorn Steelmace"), "BHSM", 7, 250, AI_RHINO, 0, 20, 28, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_RACID, P_("monster", "Chaoshowler"), "GENERAL", 8, 240, AI_ACIDUNIQ, 0, 12, 20, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REDDTH, P_("monster", "Doomgrin the Rotting"), "GENERAL", 8, 405, AI_STORM, 3, 25, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_FLAMLRD, P_("monster", "Madburner"), "GENERAL", 9, 270, AI_STORM, 0, 20, 40, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_LTCHDMN, P_("monster", "Bonesaw the Litch"), "GENERAL", 9, 495, AI_STORM, 2, 30, 55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MUDRUN, P_("monster", "Breakspine"), "GENERAL", 9, 351, AI_RHINO, 0, 25, 34, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REDDTH, P_("monster", "Devilskull Sharpbone"), "GENERAL", 9, 444, AI_STORM, 1, 25, 40, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_STORM, P_("monster", "Brokenstorm"), "GENERAL", 9, 411, AI_STORM, 2, 25, 36, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSTORM, P_("monster", "Stormbane"), "GENERAL", 9, 555, AI_STORM, 3, 30, 30, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TOAD, P_("monster", "Oozedrool"), "GENERAL", 9, 483, AI_FAT, 3, 25, 30, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BLOODCLW, P_("monster", "Goldblight of the Flame"), "GENERAL", 10, 405, AI_GARG, 0, 15, 35, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 80, TEXT_NONE },
{ MT_OBLORD, P_("monster", "Blackstorm"), "GENERAL", 10, 525, AI_RHINO, 3, 20, 40, IMMUNE_MAGIC | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 90, TEXT_NONE },
{ MT_RACID, P_("monster", "Plaguewrath"), "GENERAL", 10, 450, AI_ACIDUNIQ, 2, 20, 30, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSTORM, P_("monster", "The Flayer"), "GENERAL", 10, 501, AI_STORM, 1, 20, 35, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_FROSTC, P_("monster", "Bluehorn"), "GENERAL", 11, 477, AI_RHINO, 1, 25, 30, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 90, TEXT_NONE },
{ MT_HELLBURN, P_("monster", "Warpfire Hellspawn"), "GENERAL", 11, 525, AI_FIREMAN, 3, 10, 40, RESIST_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NSNAKE, P_("monster", "Fangspeir"), "GENERAL", 11, 444, AI_SKELSD, 1, 15, 32, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_UDEDBLRG, P_("monster", "Festerskull"), "GENERAL", 11, 600, AI_STORM, 2, 15, 30, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NBLACK, P_("monster", "Lionskull the Bent"), "GENERAL", 12, 525, AI_SKELSD, 2, 25, 25, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_COUNSLR, P_("monster", "Blacktongue"), "GENERAL", 12, 360, AI_COUNSLR, 3, 15, 30, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_DEATHW, P_("monster", "Viletouch"), "GENERAL", 12, 525, AI_GARG, 3, 20, 40, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSNAKE, P_("monster", "Viperflame"), "GENERAL", 12, 570, AI_SKELSD, 1, 25, 35, IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BSNAKE, P_("monster", "Fangskin"), "BHKA", 14, 681, AI_SKELSD, 2, 15, 50, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_SUCCUBUS, P_("monster", "Witchfire the Unholy"), "GENERAL", 12, 444, AI_SUCC, 3, 10, 20, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BALROG, P_("monster", "Blackskull"), "BHKA", 13, 750, AI_SKELSD, 3, 25, 40, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_UNRAV, P_("monster", "Soulslash"), "GENERAL", 12, 450, AI_SKELSD, 0, 25, 25, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_VTEXLRD, P_("monster", "Windspawn"), "GENERAL", 12, 711, AI_SKELSD, 1, 35, 40, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GSNAKE, P_("monster", "Lord of the Pit"), "GENERAL", 13, 762, AI_SKELSD, 2, 25, 42, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RTBLACK, P_("monster", "Rustweaver"), "GENERAL", 13, 400, AI_SKELSD, 3, 1, 60, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HOLOWONE, P_("monster", "Howlingire the Shade"), "GENERAL", 13, 450, AI_SKELSD, 2, 40, 75, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MAEL, P_("monster", "Doomcloud"), "GENERAL", 13, 612, AI_STORM, 1, 1, 60, RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_PAINMSTR, P_("monster", "Bloodmoon Soulfire"), "GENERAL", 13, 684, AI_SKELSD, 1, 15, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_SNOWWICH, P_("monster", "Witchmoon"), "GENERAL", 13, 310, AI_SUCC, 3, 30, 40, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_VTEXLRD, P_("monster", "Gorefeast"), "GENERAL", 13, 771, AI_SKELSD, 3, 20, 55, RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RTBLACK, P_("monster", "Graywar the Slayer"), "GENERAL", 14, 672, AI_SKELSD, 1, 30, 50, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_MAGISTR, P_("monster", "Dreadjudge"), "GENERAL", 14, 540, AI_COUNSLR, 1, 30, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Stareye the Witch"), "GENERAL", 14, 726, AI_SUCC, 2, 30, 50, IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_BTBLACK, P_("monster", "Steelskull the Hunter"), "GENERAL", 14, 831, AI_SKELSD, 3, 40, 50, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RBLACK, P_("monster", "Sir Gorash"), "GENERAL", 16, 1050, AI_SKELSD, 1, 20, 60, 0 , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_CABALIST, P_("monster", "The Vizier"), "GENERAL", 15, 850, AI_COUNSLR, 2, 25, 40, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REALWEAV, P_("monster", "Zamphir"), "GENERAL", 15, 891, AI_SKELSD, 2, 30, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Bloodlust"), "GENERAL", 15, 825, AI_SUCC, 1, 20, 55, IMMUNE_MAGIC | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Webwidow"), "GENERAL", 16, 774, AI_SUCC, 1, 20, 50, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_SOLBRNR, P_("monster", "Fleshdancer"), "GENERAL", 16, 999, AI_SUCC, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_OBLORD, P_("monster", "Grimspike"), "GENERAL", 19, 534, AI_SNEAK, 1, 25, 40, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NGOATMC, P_("monster", "Gharbad the Weak"), "bsdb", 4, 120, AI_GARBUD, 3, 8, 16, IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_GARBUD1 },
{ MT_SKING, P_("monster", "Skeleton King"), "genrl", 0, 240, AI_SKELKING, 3, 6, 16, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Independent, 0, 0, TEXT_NONE },
{ MT_COUNSLR, P_("monster", "Zhar the Mad"), "general", 8, 360, AI_ZHAR, 3, 16, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_ZHAR1 },
{ MT_BFALLSP, P_("monster", "Snotspill"), "bng", 4, 220, AI_SNOTSPIL, 3, 10, 18, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_BANNER10 },
{ MT_ADVOCATE, P_("monster", "Arch-Bishop Lazarus"), "general", 0, 600, AI_LAZARUS, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_HLSPWN, P_("monster", "Red Vex"), "redv", 0, 400, AI_LAZHELP, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_HLSPWN, P_("monster", "Black Jade"), "blkjd", 0, 400, AI_LAZHELP, 3, 30, 50, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_VILE13 },
{ MT_RBLACK, P_("monster", "Lachdanan"), "bhka", 14, 500, AI_LACHDAN, 3, 0, 0, 0 , UniqueMonsterPack::None, 0, 0, TEXT_VEIL9 },
{ MT_BTBLACK, P_("monster", "Warlord of Blood"), "general", 13, 850, AI_WARLORD, 3, 35, 50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_WARLRD9 },
{ MT_CLEAVER, P_("monster", "The Butcher"), "genrl", 0, 220, AI_CLEAVER, 3, 6, 12, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HORKDMN, P_("monster", "Hork Demon"), "genrl", 19, 300, AI_HORKDMN, 3, 20, 35, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_DEFILER, P_("monster", "The Defiler"), "genrl", 20, 480, AI_SKELSD, 3, 30, 40, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_NAKRUL, P_("monster", "Na-Krul"), "genrl", 0, 1332, AI_SKELSD, 3, 40, 50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELAX, P_("monster", "Bonehead Keenaxe"), "bhka", 2, 91, AI_SKELSD, 2, 4, 10, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 100, 0, TEXT_NONE },
{ MT_RFALLSD, P_("monster", "Bladeskin the Slasher"), "bsts", 2, 51, AI_FALLEN, 0, 6, 18, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_NZOMBIE, P_("monster", "Soulpus"), "general", 2, 133, AI_ZOMBIE, 0, 4, 8, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RFALLSP, P_("monster", "Pukerat the Unclean"), "ptu", 2, 77, AI_FALLEN, 3, 1, 5, RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_WSKELAX, P_("monster", "Boneripper"), "br", 2, 54, AI_BAT, 0, 6, 15, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NZOMBIE, P_("monster", "Rotfeast the Hungry"), "eth", 2, 85, AI_SKELSD, 3, 4, 12, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_DFALLSD, P_("monster", "Gutshank the Quick"), "gtq", 3, 66, AI_BAT, 2, 6, 16, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELSD, P_("monster", "Brokenhead Bangshield"), "bhbs", 3, 108, AI_SKELSD, 3, 12, 20, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_YFALLSP, P_("monster", "Bongo"), "bng", 3, 178, AI_FALLEN, 3, 9, 21, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BZOMBIE, P_("monster", "Rotcarnage"), "rcrn", 3, 102, AI_ZOMBIE, 3, 9, 24, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_NSCAV, P_("monster", "Shadowbite"), "shbt", 2, 60, AI_SKELSD, 3, 3, 20, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_WSKELBW, P_("monster", "Deadeye"), "de", 2, 49, AI_GOATBOW, 0, 6, 9, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RSKELAX, P_("monster", "Madeye the Dead"), "mtd", 4, 75, AI_BAT, 0, 9, 21, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 30, TEXT_NONE },
{ MT_BSCAV, P_("monster", "El Chupacabras"), "general", 3, 120, AI_GOATMC, 0, 10, 18, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TSKELBW, P_("monster", "Skullfire"), "skfr", 3, 125, AI_GOATBOW, 1, 6, 10, IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_SNEAK, P_("monster", "Warpskull"), "tspo", 3, 117, AI_SNEAK, 2, 6, 18, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GZOMBIE, P_("monster", "Goretongue"), "pmr", 3, 156, AI_SKELSD, 1, 15, 30, IMMUNE_MAGIC , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_WSCAV, P_("monster", "Pulsecrawler"), "bhka", 4, 150, AI_SCAV, 0, 16, 20, IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_BLINK, P_("monster", "Moonbender"), "general", 4, 135, AI_BAT, 0, 9, 27, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BLINK, P_("monster", "Wrathraven"), "general", 5, 135, AI_BAT, 2, 9, 22, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_YSCAV, P_("monster", "Spineeater"), "general", 4, 180, AI_SCAV, 1, 18, 25, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSKELBW, P_("monster", "Blackash the Burning"), "bashtb", 4, 120, AI_GOATBOW, 0, 6, 16, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BFALLSD, P_("monster", "Shadowcrow"), "general", 5, 270, AI_SNEAK, 2, 12, 25, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_LRDSAYTR, P_("monster", "Blightstone the Weak"), "bhka", 4, 360, AI_SKELSD, 0, 4, 12, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 70, 0, TEXT_NONE },
{ MT_FAT, P_("monster", "Bilefroth the Pit Master"), "bftp", 6, 210, AI_BAT, 1, 16, 23, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NGOATBW, P_("monster", "Bloodskin Darkbow"), "bsdb", 5, 207, AI_GOATBOW, 0, 3, 16, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 55, TEXT_NONE },
{ MT_GLOOM, P_("monster", "Foulwing"), "db", 5, 246, AI_RHINO, 3, 12, 28, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_XSKELSD, P_("monster", "Shadowdrinker"), "shdr", 5, 300, AI_SNEAK, 1, 18, 26, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 45, TEXT_NONE },
{ MT_UNSEEN, P_("monster", "Hazeshifter"), "bhka", 5, 285, AI_SNEAK, 3, 18, 30, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NACID, P_("monster", "Deathspit"), "bfds", 6, 303, AI_ACIDUNIQ, 0, 12, 32, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RGOATMC, P_("monster", "Bloodgutter"), "bgbl", 6, 315, AI_BAT, 1, 24, 34, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BGOATMC, P_("monster", "Deathshade Fleshmaul"), "dsfm", 6, 276, AI_RHINO, 0, 12, 24, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 65, TEXT_NONE },
{ MT_WYRM, P_("monster", "Warmaggot the Mad"), "general", 6, 246, AI_BAT, 3, 15, 30, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_STORM, P_("monster", "Glasskull the Jagged"), "bhka", 7, 354, AI_STORM, 0, 18, 30, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RGOATBW, P_("monster", "Blightfire"), "blf", 7, 321, AI_SUCC, 2, 13, 21, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GARGOYLE, P_("monster", "Nightwing the Cold"), "general", 7, 342, AI_BAT, 1, 18, 26, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GGOATBW, P_("monster", "Gorestone"), "general", 7, 303, AI_GOATBOW, 1, 15, 28, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 70, 0, TEXT_NONE },
{ MT_BMAGMA, P_("monster", "Bronzefist Firestone"), "general", 8, 360, AI_MAGMA, 0, 30, 36, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_INCIN, P_("monster", "Wrathfire the Doomed"), "wftd", 8, 270, AI_SKELSD, 2, 20, 30, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NMAGMA, P_("monster", "Firewound the Grim"), "bhka", 8, 303, AI_MAGMA, 0, 18, 22, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MUDMAN, P_("monster", "Baron Sludge"), "bsm", 8, 315, AI_SNEAK, 3, 25, 34, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 75, TEXT_NONE },
{ MT_GGOATMC, P_("monster", "Blighthorn Steelmace"), "bhsm", 7, 250, AI_RHINO, 0, 20, 28, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 45, TEXT_NONE },
{ MT_RACID, P_("monster", "Chaoshowler"), "general", 8, 240, AI_ACIDUNIQ, 0, 12, 20, 0 , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REDDTH, P_("monster", "Doomgrin the Rotting"), "general", 8, 405, AI_STORM, 3, 25, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_FLAMLRD, P_("monster", "Madburner"), "general", 9, 270, AI_STORM, 0, 20, 40, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_LTCHDMN, P_("monster", "Bonesaw the Litch"), "general", 9, 495, AI_STORM, 2, 30, 55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MUDRUN, P_("monster", "Breakspine"), "general", 9, 351, AI_RHINO, 0, 25, 34, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REDDTH, P_("monster", "Devilskull Sharpbone"), "general", 9, 444, AI_STORM, 1, 25, 40, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_STORM, P_("monster", "Brokenstorm"), "general", 9, 411, AI_STORM, 2, 25, 36, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSTORM, P_("monster", "Stormbane"), "general", 9, 555, AI_STORM, 3, 30, 30, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_TOAD, P_("monster", "Oozedrool"), "general", 9, 483, AI_FAT, 3, 25, 30, RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BLOODCLW, P_("monster", "Goldblight of the Flame"), "general", 10, 405, AI_GARG, 0, 15, 35, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 80, TEXT_NONE },
{ MT_OBLORD, P_("monster", "Blackstorm"), "general", 10, 525, AI_RHINO, 3, 20, 40, IMMUNE_MAGIC | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 90, TEXT_NONE },
{ MT_RACID, P_("monster", "Plaguewrath"), "general", 10, 450, AI_ACIDUNIQ, 2, 20, 30, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSTORM, P_("monster", "The Flayer"), "general", 10, 501, AI_STORM, 1, 20, 35, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_FROSTC, P_("monster", "Bluehorn"), "general", 11, 477, AI_RHINO, 1, 25, 30, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 90, TEXT_NONE },
{ MT_HELLBURN, P_("monster", "Warpfire Hellspawn"), "general", 11, 525, AI_FIREMAN, 3, 10, 40, RESIST_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NSNAKE, P_("monster", "Fangspeir"), "general", 11, 444, AI_SKELSD, 1, 15, 32, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_UDEDBLRG, P_("monster", "Festerskull"), "general", 11, 600, AI_STORM, 2, 15, 30, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_NBLACK, P_("monster", "Lionskull the Bent"), "general", 12, 525, AI_SKELSD, 2, 25, 25, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_COUNSLR, P_("monster", "Blacktongue"), "general", 12, 360, AI_COUNSLR, 3, 15, 30, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_DEATHW, P_("monster", "Viletouch"), "general", 12, 525, AI_GARG, 3, 20, 40, IMMUNE_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RSNAKE, P_("monster", "Viperflame"), "general", 12, 570, AI_SKELSD, 1, 25, 35, IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BSNAKE, P_("monster", "Fangskin"), "bhka", 14, 681, AI_SKELSD, 2, 15, 50, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_SUCCUBUS, P_("monster", "Witchfire the Unholy"), "general", 12, 444, AI_SUCC, 3, 10, 20, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_BALROG, P_("monster", "Blackskull"), "bhka", 13, 750, AI_SKELSD, 3, 25, 40, IMMUNE_MAGIC | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_UNRAV, P_("monster", "Soulslash"), "general", 12, 450, AI_SKELSD, 0, 25, 25, IMMUNE_MAGIC , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_VTEXLRD, P_("monster", "Windspawn"), "general", 12, 711, AI_SKELSD, 1, 35, 40, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_GSNAKE, P_("monster", "Lord of the Pit"), "general", 13, 762, AI_SKELSD, 2, 25, 42, RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_RTBLACK, P_("monster", "Rustweaver"), "general", 13, 400, AI_SKELSD, 3, 1, 60, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HOLOWONE, P_("monster", "Howlingire the Shade"), "general", 13, 450, AI_SKELSD, 2, 40, 75, RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_MAEL, P_("monster", "Doomcloud"), "general", 13, 612, AI_STORM, 1, 1, 60, RESIST_FIRE | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_PAINMSTR, P_("monster", "Bloodmoon Soulfire"), "general", 13, 684, AI_SKELSD, 1, 15, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_SNOWWICH, P_("monster", "Witchmoon"), "general", 13, 310, AI_SUCC, 3, 30, 40, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_VTEXLRD, P_("monster", "Gorefeast"), "general", 13, 771, AI_SKELSD, 3, 20, 55, RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RTBLACK, P_("monster", "Graywar the Slayer"), "general", 14, 672, AI_SKELSD, 1, 30, 50, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_MAGISTR, P_("monster", "Dreadjudge"), "general", 14, 540, AI_COUNSLR, 1, 30, 40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Stareye the Witch"), "general", 14, 726, AI_SUCC, 2, 30, 50, IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_BTBLACK, P_("monster", "Steelskull the Hunter"), "general", 14, 831, AI_SKELSD, 3, 40, 50, RESIST_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_RBLACK, P_("monster", "Sir Gorash"), "general", 16, 1050, AI_SKELSD, 1, 20, 60, 0 , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_CABALIST, P_("monster", "The Vizier"), "general", 15, 850, AI_COUNSLR, 2, 25, 40, IMMUNE_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_REALWEAV, P_("monster", "Zamphir"), "general", 15, 891, AI_SKELSD, 2, 30, 50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Bloodlust"), "general", 15, 825, AI_SUCC, 1, 20, 55, IMMUNE_MAGIC | IMMUNE_LIGHTNING , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_HLSPWN, P_("monster", "Webwidow"), "general", 16, 774, AI_SUCC, 1, 20, 50, IMMUNE_MAGIC | IMMUNE_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_SOLBRNR, P_("monster", "Fleshdancer"), "general", 16, 999, AI_SUCC, 3, 30, 50, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
{ MT_OBLORD, P_("monster", "Grimspike"), "general", 19, 534, AI_SNEAK, 1, 25, 40, IMMUNE_MAGIC | RESIST_FIRE , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
// TRANSLATORS: Unique Monster Block end
{ MT_STORML, P_("monster", "Doomlock"), "GENERAL", 28, 534, AI_SNEAK, 1, 35, 55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_STORML, P_("monster", "Doomlock"), "general", 28, 534, AI_SNEAK, 1, 35, 55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , UniqueMonsterPack::Leashed, 0, 0, TEXT_NONE },
{ MT_INVALID, nullptr, nullptr, 0, 0, AI_INVALID, 0, 0, 0, 0 , UniqueMonsterPack::None, 0, 0, TEXT_NONE },
// clang-format on
};
+18 -18
View File
@@ -97,7 +97,7 @@ size_t GetNumAnims(const MonsterData &monsterData)
void InitMonsterTRN(CMonster &monst)
{
char path[64];
*BufCopy(path, "Monsters\\", monst.data->trnFile, ".TRN") = '\0';
*BufCopy(path, "monsters\\", monst.data->trnFile, ".trn") = '\0';
std::array<uint8_t, 256> colorTranslations;
LoadFileInMem(path, colorTranslations);
std::replace(colorTranslations.begin(), colorTranslations.end(), 255, 0);
@@ -501,23 +501,23 @@ void PlaceQuestMonsters()
}
if (Quests[Q_LTBANNER].IsAvailable()) {
auto dunData = LoadFileInMem<uint16_t>("Levels\\L1Data\\Banner1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l1data\\banner1.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld());
}
if (Quests[Q_BLOOD].IsAvailable()) {
auto dunData = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blood2.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l2data\\blood2.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld());
}
if (Quests[Q_BLIND].IsAvailable()) {
auto dunData = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blind2.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l2data\\blind2.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld());
}
if (Quests[Q_ANVIL].IsAvailable()) {
auto dunData = LoadFileInMem<uint16_t>("Levels\\L3Data\\Anvil.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l3data\\anvil.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld() + Displacement { 2, 2 });
}
if (Quests[Q_WARLORD].IsAvailable()) {
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\Warlord.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\warlord.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld());
AddMonsterType(UniqueMonsterType::WarlordOfBlood, PLACE_SCATTER);
}
@@ -534,7 +534,7 @@ void PlaceQuestMonsters()
PlaceUniqueMonst(UniqueMonsterType::Lazarus, 0, 0);
PlaceUniqueMonst(UniqueMonsterType::RedVex, 0, 0);
PlaceUniqueMonst(UniqueMonsterType::BlackJade, 0, 0);
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\Vile1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\vile1.dun");
SetMapMonsters(dunData.get(), SetPiece.position.megaToWorld());
}
@@ -561,19 +561,19 @@ void PlaceQuestMonsters()
void LoadDiabMonsts()
{
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\diab1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\diab1.dun");
SetMapMonsters(dunData.get(), DiabloQuad1.megaToWorld());
}
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\diab2a.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\diab2a.dun");
SetMapMonsters(dunData.get(), DiabloQuad2.megaToWorld());
}
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\diab3a.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\diab3a.dun");
SetMapMonsters(dunData.get(), DiabloQuad3.megaToWorld());
}
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\diab4a.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\diab4a.dun");
SetMapMonsters(dunData.get(), DiabloQuad4.megaToWorld());
}
}
@@ -3095,7 +3095,7 @@ bool UpdateModeStance(Monster &monster)
void InitTRNForUniqueMonster(Monster &monster)
{
char filestr[64];
*BufCopy(filestr, R"(Monsters\Monsters\)", UniqueMonstersData[static_cast<size_t>(monster.uniqueType)].mTrnName, ".TRN") = '\0';
*BufCopy(filestr, R"(monsters\monsters\)", UniqueMonstersData[static_cast<size_t>(monster.uniqueType)].mTrnName, ".trn") = '\0';
monster.uniqueMonsterTRN = LoadFileInMem<uint8_t>(filestr);
}
@@ -3333,7 +3333,7 @@ void InitMonsterSND(CMonster &monsterType)
for (int j = 0; j < 2; j++) {
char path[64];
*BufCopy(path, "Monsters\\", soundSuffix, prefix, j + 1, ".WAV") = '\0';
*BufCopy(path, "monsters\\", soundSuffix, prefix, j + 1, ".wav") = '\0';
monsterType.sounds[i][j] = sound_file_load(path);
}
}
@@ -3352,7 +3352,7 @@ void InitMonsterGFX(CMonster &monsterType)
if (!HeadlessMode) {
monsterType.animData = MultiFileLoader<MaxAnims> {}(
numAnims,
FileNameWithCharAffixGenerator({ "Monsters\\", monsterData.assetsSuffix }, ".CL2", Animletter),
FileNameWithCharAffixGenerator({ "monsters\\", monsterData.assetsSuffix }, ".cl2", Animletter),
animOffsets.data(),
hasAnim);
}
@@ -3757,17 +3757,17 @@ void DoEnding()
switch (MyPlayer->_pClass) {
case HeroClass::Sorcerer:
case HeroClass::Monk:
play_movie("gendata\\DiabVic1.smk", false);
play_movie("gendata\\diabvic1.smk", false);
break;
case HeroClass::Warrior:
case HeroClass::Barbarian:
play_movie("gendata\\DiabVic2.smk", false);
play_movie("gendata\\diabvic2.smk", false);
break;
default:
play_movie("gendata\\DiabVic3.smk", false);
play_movie("gendata\\diabvic3.smk", false);
break;
}
play_movie("gendata\\Diabend.smk", false);
play_movie("gendata\\diabend.smk", false);
bool bMusicOn = gbMusicOn;
gbMusicOn = true;
+65 -65
View File
@@ -275,71 +275,71 @@ const ObjectData AllObjects[109] = {
};
/** Maps from object_graphic_id to object CEL name. */
const char *const ObjMasterLoadList[] = {
"L1Braz",
"L1Doors",
"Lever",
"Chest1",
"Chest2",
"Banner",
"SkulPile",
"SkulFire",
"SkulStik",
"CruxSk1",
"CruxSk2",
"CruxSk3",
"Book1",
"Book2",
"Rockstan",
"Angel",
"Chest3",
"Burncros",
"Candle2",
"Nude2",
"Switch4",
"TNudeM",
"TNudeW",
"TSoul",
"L2Doors",
"WTorch4",
"WTorch3",
"Sarc",
"Flame1",
"Prsrplt1",
"Traphole",
"MiniWatr",
"WTorch2",
"WTorch1",
"BCase",
"BShelf",
"WeapStnd",
"Barrel",
"Barrelex",
"LShrineG",
"RShrineG",
"Bloodfnt",
"Decap",
"Pedistl",
"L3Doors",
"PFountn",
"Armstand",
"Goatshrn",
"Cauldren",
"MFountn",
"TFountn",
"Altboy",
"Mcirl",
"Bkslbrnt",
"Mushptch",
"LzStand",
"L6Pod1",
"L6Pod2",
"L5Door",
"L5Lever",
"L5Light",
"L5Sarco",
"Urn",
"Urnexpld",
"L5Books",
"l1braz",
"l1doors",
"lever",
"chest1",
"chest2",
"banner",
"skulpile",
"skulfire",
"skulstik",
"cruxsk1",
"cruxsk2",
"cruxsk3",
"book1",
"book2",
"rockstan",
"angel",
"chest3",
"burncros",
"candle2",
"nude2",
"switch4",
"tnudem",
"tnudew",
"tsoul",
"l2doors",
"wtorch4",
"wtorch3",
"sarc",
"flame1",
"prsrplt1",
"traphole",
"miniwatr",
"wtorch2",
"wtorch1",
"bcase",
"bshelf",
"weapstnd",
"barrel",
"barrelex",
"lshrineg",
"rshrineg",
"bloodfnt",
"decap",
"pedistl",
"l3doors",
"pfountn",
"armstand",
"goatshrn",
"cauldren",
"mfountn",
"tfountn",
"altboy",
"mcirl",
"bkslbrnt",
"mushptch",
"lzstand",
"l6pod1",
"l6pod2",
"l5door",
"l5lever",
"l5light",
"l5sarco",
"urn",
"urnexpld",
"l5books",
};
} // namespace devilution
+8 -8
View File
@@ -683,9 +683,9 @@ void LoadMapObjects(const char *path, Point start, Rectangle mapRange = {}, int
void AddDiabObjs()
{
LoadMapObjects("Levels\\L4Data\\diab1.DUN", DiabloQuad1.megaToWorld(), { DiabloQuad2, { 11, 12 } }, 1);
LoadMapObjects("Levels\\L4Data\\diab2a.DUN", DiabloQuad2.megaToWorld(), { DiabloQuad3, { 11, 11 } }, 2);
LoadMapObjects("Levels\\L4Data\\diab3a.DUN", DiabloQuad3.megaToWorld(), { DiabloQuad4, { 9, 9 } }, 3);
LoadMapObjects("levels\\l4data\\diab1.dun", DiabloQuad1.megaToWorld(), { DiabloQuad2, { 11, 12 } }, 1);
LoadMapObjects("levels\\l4data\\diab2a.dun", DiabloQuad2.megaToWorld(), { DiabloQuad3, { 11, 11 } }, 2);
LoadMapObjects("levels\\l4data\\diab3a.dun", DiabloQuad3.megaToWorld(), { DiabloQuad4, { 9, 9 } }, 3);
}
void AddCryptObject(Object &object, int a2)
@@ -2256,7 +2256,7 @@ void OperatePedestal(Player &player, Object &pedestal)
if (pedestal._oVar6 == 3) {
PlaySfxLoc(LS_BLODSTAR, pedestal.position);
ObjChangeMap(pedestal._oVar1, pedestal._oVar2, pedestal._oVar3, pedestal._oVar4);
LoadMapObjects("Levels\\L2Data\\Blood2.DUN", SetPiece.position.megaToWorld());
LoadMapObjects("levels\\l2data\\blood2.dun", SetPiece.position.megaToWorld());
SpawnUnique(UITEM_ARMOFVAL, SetPiece.position.megaToWorld() + Displacement { 9, 3 });
pedestal._oSelFlag = 0;
}
@@ -3537,7 +3537,7 @@ void SyncPedestal(const Object &pedestal, Point origin, int width)
}
if (pedestal._oVar6 == 3) {
ObjChangeMapResync(pedestal._oVar1, pedestal._oVar2, pedestal._oVar3, pedestal._oVar4);
LoadMapObjects("Levels\\L2Data\\Blood2.DUN", origin.megaToWorld());
LoadMapObjects("levels\\l2data\\blood2.dun", origin.megaToWorld());
}
}
@@ -3642,7 +3642,7 @@ void LoadLevelObjects(uint16_t filesWidths[65])
ObjFileList[numobjfiles] = static_cast<object_graphic_id>(i);
char filestr[32];
*BufCopy(filestr, "Objects\\", ObjMasterLoadList[i], ".CEL") = '\0';
*BufCopy(filestr, "objects\\", ObjMasterLoadList[i], ".cel") = '\0';
pObjCels[numobjfiles] = LoadCel(filestr, filesWidths[i]);
numobjfiles++;
}
@@ -3822,7 +3822,7 @@ void InitObjects()
}
Quests[Q_BLIND]._qmsg = spId;
AddBookLever(OBJ_BLINDBOOK, { SetPiece.position, SetPiece.size + 1 }, spId);
LoadMapObjects("Levels\\L2Data\\Blind2.DUN", SetPiece.position.megaToWorld());
LoadMapObjects("levels\\l2data\\blind2.dun", SetPiece.position.megaToWorld());
}
if (Quests[Q_BLOOD].IsAvailable()) {
_speech_id spId;
@@ -3881,7 +3881,7 @@ void InitObjects()
}
Quests[Q_WARLORD]._qmsg = spId;
AddBookLever(OBJ_STEELTOME, SetPiece, spId);
LoadMapObjects("Levels\\L4Data\\Warlord.DUN", SetPiece.position.megaToWorld());
LoadMapObjects("levels\\l4data\\warlord.dun", SetPiece.position.megaToWorld());
}
if (Quests[Q_BETRAYER].IsAvailable() && !gbIsMultiplayer)
AddLazStand();
+2 -2
View File
@@ -9,8 +9,8 @@ OptionalOwnedClxSpriteList pSTextSlidCels;
void InitInfoBoxGfx()
{
pSTextSlidCels = LoadCel("Data\\TextSlid.CEL", 12);
pSTextBoxCels = LoadCel("Data\\TextBox2.CEL", 271);
pSTextSlidCels = LoadCel("data\\textslid.cel", 12);
pSTextBoxCels = LoadCel("data\\textbox2.cel", 271);
}
void FreeInfoBoxGfx()
+3 -3
View File
@@ -81,9 +81,9 @@ spell_type GetSBookTrans(spell_id ii, bool townok)
void InitSpellBook()
{
pSpellBkCel = LoadCel("Data\\SpellBk.CEL", static_cast<uint16_t>(SidePanelSize.width));
pSBkBtnCel = LoadCel("Data\\SpellBkB.CEL", gbIsHellfire ? 61 : 76);
pSBkIconCels = LoadCel("Data\\SpellI2.CEL", 37);
pSpellBkCel = LoadCel("data\\spellbk.cel", static_cast<uint16_t>(SidePanelSize.width));
pSBkBtnCel = LoadCel("data\\spellbkb.cel", gbIsHellfire ? 61 : 76);
pSBkIconCels = LoadCel("data\\spelli2.cel", 37);
Player &player = *MyPlayer;
if (player._pClass == HeroClass::Warrior) {
+2 -2
View File
@@ -71,9 +71,9 @@ const char SpellITbl[] = {
void LoadSpellIcons()
{
if (!gbIsHellfire)
pSpellCels = LoadCel("CtrlPan\\SpelIcon.CEL", SPLICONLENGTH);
pSpellCels = LoadCel("ctrlpan\\spelicon.cel", SPLICONLENGTH);
else
pSpellCels = LoadCel("Data\\SpelIcon.CEL", SPLICONLENGTH);
pSpellCels = LoadCel("data\\spelicon.cel", SPLICONLENGTH);
SetSpellTrans(RSPLTYPE_SKILL);
}
+1 -1
View File
@@ -2248,7 +2248,7 @@ void LoadPlrGFX(Player &player, player_graphic graphic)
char prefix[3] = { CharChar[static_cast<std::size_t>(cls)], ArmourChar[player._pgfxnum >> 4], WepChar[static_cast<std::size_t>(animWeaponId)] };
char pszName[256];
*fmt::format_to(pszName, FMT_COMPILE(R"(PlrGFX\{0}\{1}\{1}{2}.CL2)"), path, string_view(prefix, 3), szCel) = 0;
*fmt::format_to(pszName, FMT_COMPILE(R"(plrgfx\{0}\{1}\{1}{2}.cl2)"), path, string_view(prefix, 3), szCel) = 0;
const uint16_t animationWidth = GetPlayerSpriteWidth(cls, graphic, animWeaponId);
animationData.sprites = LoadCl2Sheet(pszName, animationWidth);
std::optional<std::array<uint8_t, 256>> trn = GetClassTRN(player);
+7 -7
View File
@@ -137,7 +137,7 @@ void DrawSkelKing(quest_id q, Point position)
void DrawWarLord(Point position)
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L4Data\\Warlord2.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l4data\\warlord2.dun");
SetPiece = { position, { SDL_SwapLE16(dunData[0]), SDL_SwapLE16(dunData[1]) } };
@@ -146,7 +146,7 @@ void DrawWarLord(Point position)
void DrawSChamber(quest_id q, Point position)
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L2Data\\Bonestr1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l2data\\bonestr1.dun");
SetPiece = { position, { SDL_SwapLE16(dunData[0]), SDL_SwapLE16(dunData[1]) } };
@@ -157,7 +157,7 @@ void DrawSChamber(quest_id q, Point position)
void DrawLTBanner(Point position)
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L1Data\\Banner1.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l1data\\banner1.dun");
int width = SDL_SwapLE16(dunData[0]);
int height = SDL_SwapLE16(dunData[1]);
@@ -187,7 +187,7 @@ void DrawBlind(Point position)
void DrawBlood(Point position)
{
auto dunData = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blood2.DUN");
auto dunData = LoadFileInMem<uint16_t>("levels\\l2data\\blood2.dun");
SetPiece = { position, { SDL_SwapLE16(dunData[0]), SDL_SwapLE16(dunData[1]) } };
@@ -352,7 +352,7 @@ void CheckQuests()
&& Quests[Q_PWATER]._qactive != QUEST_DONE) {
Quests[Q_PWATER]._qactive = QUEST_DONE;
PlaySfxLoc(IS_QUESTDN, MyPlayer->position.tile);
LoadPalette("Levels\\L3Data\\L3pwater.pal", false);
LoadPalette("levels\\l3data\\l3pwater.pal", false);
UpdatePWaterPalette();
WaterDone = 32;
}
@@ -532,9 +532,9 @@ void LoadPWaterPalette()
return;
if (Quests[Q_PWATER]._qactive == QUEST_DONE)
LoadPalette("Levels\\L3Data\\L3pwater.pal");
LoadPalette("levels\\l3data\\l3pwater.pal");
else
LoadPalette("Levels\\L3Data\\L3pfoul.pal");
LoadPalette("levels\\l3data\\l3pfoul.pal");
}
void UpdatePWaterPalette()
+16 -16
View File
@@ -77,7 +77,7 @@ void InitSmith(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\Smith\\SmithN.CEL", 16, 3);
LoadTownerAnimations(towner, "towners\\smith\\smithn.cel", 16, 3);
towner.name = _("Griswold the Blacksmith");
}
@@ -99,7 +99,7 @@ void InitBarOwner(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\TwnF\\TwnFN.CEL", 16, 3);
LoadTownerAnimations(towner, "towners\\twnf\\twnfn.cel", 16, 3);
towner.name = _("Ogden the Tavern owner");
}
@@ -108,7 +108,7 @@ void InitTownDead(Towner &towner, const TownerData &townerData)
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
towner.animOrderSize = 0;
LoadTownerAnimations(towner, "Towners\\Butch\\Deadguy.CEL", 8, 6);
LoadTownerAnimations(towner, "towners\\butch\\deadguy.cel", 8, 6);
towner.name = _("Wounded Townsman");
}
@@ -130,7 +130,7 @@ void InitWitch(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\TownWmn1\\Witch.CEL", 19, 6);
LoadTownerAnimations(towner, "towners\\townwmn1\\witch.cel", 19, 6);
towner.name = _("Adria the Witch");
}
@@ -139,7 +139,7 @@ void InitBarmaid(Towner &towner, const TownerData &townerData)
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
towner.animOrderSize = 0;
LoadTownerAnimations(towner, "Towners\\TownWmn1\\WmnN.CEL", 18, 6);
LoadTownerAnimations(towner, "towners\\townwmn1\\wmnn.cel", 18, 6);
towner.name = _("Gillian the Barmaid");
}
@@ -148,7 +148,7 @@ void InitBoy(Towner &towner, const TownerData &townerData)
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
towner.animOrderSize = 0;
LoadTownerAnimations(towner, "Towners\\TownBoy\\PegKid1.CEL", 20, 6);
LoadTownerAnimations(towner, "towners\\townboy\\pegkid1.cel", 20, 6);
towner.name = _("Wirt the Peg-legged boy");
}
@@ -170,7 +170,7 @@ void InitHealer(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\Healer\\Healer.CEL", 20, 6);
LoadTownerAnimations(towner, "towners\\healer\\healer.cel", 20, 6);
towner.name = _("Pepin the Healer");
}
@@ -187,7 +187,7 @@ void InitTeller(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\Strytell\\Strytell.CEL", 25, 3);
LoadTownerAnimations(towner, "towners\\strytell\\strytell.cel", 25, 3);
towner.name = _("Cain the Elder");
}
@@ -203,7 +203,7 @@ void InitDrunk(Towner &towner, const TownerData &townerData)
};
towner.animOrder = AnimOrder;
towner.animOrderSize = sizeof(AnimOrder);
LoadTownerAnimations(towner, "Towners\\Drunk\\TwnDrunk.CEL", 18, 3);
LoadTownerAnimations(towner, "towners\\drunk\\twndrunk.cel", 18, 3);
towner.name = _("Farnham the Drunk");
}
@@ -238,15 +238,15 @@ void InitFarmer(Towner &towner, const TownerData &townerData)
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
towner.animOrderSize = 0;
LoadTownerAnimations(towner, "Towners\\Farmer\\Farmrn2.CEL", 15, 3);
LoadTownerAnimations(towner, "towners\\farmer\\farmrn2.cel", 15, 3);
towner.name = _("Lester the farmer");
}
void InitCowFarmer(Towner &towner, const TownerData &townerData)
{
const char *celPath = "Towners\\Farmer\\cfrmrn2.CEL";
const char *celPath = "towners\\farmer\\cfrmrn2.cel";
if (Quests[Q_JERSEY]._qactive == QUEST_DONE) {
celPath = "Towners\\Farmer\\mfrmrn2.CEL";
celPath = "towners\\farmer\\mfrmrn2.cel";
}
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
@@ -260,7 +260,7 @@ void InitGirl(Towner &towner, const TownerData &townerData)
towner._tAnimWidth = 96;
towner.animOrder = nullptr;
towner.animOrderSize = 0;
LoadTownerAnimations(towner, "Towners\\Girl\\Girlw1.CEL", 20, 6);
LoadTownerAnimations(towner, "towners\\girl\\girlw1.cel", 20, 6);
towner.name = _("Celia");
}
@@ -649,7 +649,7 @@ void TalkToCowFarmer(Player &player, Towner &cowFarmer)
InitQTextMsg(TEXT_JERSEY8);
quest._qactive = QUEST_DONE;
auto curFrame = cowFarmer._tAnimFrame;
LoadTownerAnimations(cowFarmer, "Towners\\Farmer\\mfrmrn2.CEL", 15, 3);
LoadTownerAnimations(cowFarmer, "towners\\farmer\\mfrmrn2.cel", 15, 3);
cowFarmer._tAnimFrame = std::min<uint8_t>(curFrame, cowFarmer._tAnimLen - 1);
return;
}
@@ -729,7 +729,7 @@ void TalkToGirl(Player &player, Towner &girl)
quest._qlog = false;
quest._qactive = QUEST_DONE;
auto curFrame = girl._tAnimFrame;
LoadTownerAnimations(girl, "Towners\\Girl\\Girls1.CEL", 20, 6);
LoadTownerAnimations(girl, "towners\\girl\\girls1.cel", 20, 6);
girl._tAnimFrame = std::min<uint8_t>(curFrame, girl._tAnimLen - 1);
if (gbIsMultiplayer)
NetSendCmdQuest(true, quest);
@@ -820,7 +820,7 @@ void InitTowners()
{
assert(!CowSprites);
CowSprites.emplace(LoadCelSheet("Towners\\Animals\\Cow.CEL", 128));
CowSprites.emplace(LoadCelSheet("towners\\animals\\cow.cel", 128));
int i = 0;
for (const auto &townerData : TownersData) {
+1 -1
View File
@@ -42,7 +42,7 @@ OwnedClxSpriteListOrSheet CelToClx(const uint8_t *data, size_t size, PointerOrVa
std::vector<uint8_t> cl2Data;
// Most files become smaller with CL2. Allocate exactly enough bytes to avoid reallocation.
// The only file that becomes larger is Data\hf_logo3.CEL, by exactly 4445 bytes.
// The only file that becomes larger is data\hf_logo3.cel, by exactly 4445 bytes.
cl2Data.reserve(size + 4445);
// If it is a number of frames, then the last frame offset will be equal to the size of the file.
+20 -20
View File
@@ -44,26 +44,26 @@ set(devilutionx_fixtures
hellfire/22-1191662129.dun
hellfire/23-97055268.dun
hellfire/24-1324803725.dun
Levels/L1Data/Banner1.DUN
Levels/L1Data/Banner2.DUN
Levels/L1Data/rnd6.DUN
Levels/L1Data/SKngDO.DUN
Levels/L2Data/Blind1.DUN
Levels/L2Data/Blood1.DUN
Levels/L2Data/Blood2.DUN
Levels/L2Data/Bonestr1.DUN
Levels/L2Data/Bonestr2.DUN
Levels/L3Data/Anvil.DUN
Levels/L4Data/diab1.DUN
Levels/L4Data/diab2a.DUN
Levels/L4Data/diab2b.DUN
Levels/L4Data/diab3a.DUN
Levels/L4Data/diab3b.DUN
Levels/L4Data/diab4a.DUN
Levels/L4Data/diab4b.DUN
Levels/L4Data/Vile1.DUN
Levels/L4Data/Warlord.DUN
Levels/L4Data/Warlord2.DUN
levels/l1data/banner1.dun
levels/l1data/banner2.dun
levels/l1data/rnd6.dun
levels/l1data/skngdo.dun
levels/l2data/blind1.dun
levels/l2data/blood1.dun
levels/l2data/blood2.dun
levels/l2data/bonestr1.dun
levels/l2data/bonestr2.dun
levels/l3data/anvil.dun
levels/l4data/diab1.dun
levels/l4data/diab2a.dun
levels/l4data/diab2b.dun
levels/l4data/diab3a.dun
levels/l4data/diab3b.dun
levels/l4data/diab4a.dun
levels/l4data/diab4b.dun
levels/l4data/vile1.dun
levels/l4data/warlord.dun
levels/l4data/warlord2.dun
memory_map/additionalMissiles.txt
memory_map/game.txt
memory_map/hero.txt