Browse Source

Merge branch 'master' of github.com:diasurgical/devilution

pull/197/head
Anders Jenbo 7 years ago
parent
commit
2fcf8dab70
  1. 1
      DiabloUI/diabloui_gcc.def
  2. 4
      Source/_render.cpp
  3. 4
      Source/appfat.h
  4. 2
      Source/automap.cpp
  5. 98
      Source/control.cpp
  6. 46
      Source/control.h
  7. 6
      Source/cursor.cpp
  8. 2
      Source/cursor.h
  9. 2
      Source/dead.h
  10. 2
      Source/debug.cpp
  11. 2
      Source/debug.h
  12. 132
      Source/diablo.cpp
  13. 38
      Source/diablo.h
  14. 12
      Source/drlg_l1.cpp
  15. 2
      Source/drlg_l1.h
  16. 4
      Source/drlg_l2.cpp
  17. 484
      Source/drlg_l4.cpp
  18. 20
      Source/drlg_l4.h
  19. 2
      Source/dthread.cpp
  20. 2
      Source/dthread.h
  21. 2
      Source/effects.cpp
  22. 16
      Source/error.cpp
  23. 2
      Source/fault.cpp
  24. 2
      Source/fault.h
  25. 26
      Source/gamemenu.h
  26. 16
      Source/gendung.cpp
  27. 10
      Source/gendung.h
  28. 4
      Source/gmenu.cpp
  29. 4
      Source/gmenu.h
  30. 14
      Source/help.cpp
  31. 6
      Source/help.h
  32. 2
      Source/init.cpp
  33. 4
      Source/init.h
  34. 2
      Source/interfac.h
  35. 60
      Source/inv.cpp
  36. 18
      Source/items.cpp
  37. 2
      Source/items.h
  38. 11
      Source/lighting.cpp
  39. 6
      Source/loadsave.cpp
  40. 4
      Source/mainmenu.h
  41. 16
      Source/minitext.cpp
  42. 10
      Source/minitext.h
  43. 30
      Source/missiles.cpp
  44. 4
      Source/missiles.h
  45. 514
      Source/monstdat.cpp
  46. 2
      Source/monstdat.h
  47. 23
      Source/monster.cpp
  48. 6
      Source/monster.h
  49. 2
      Source/mpqapi.cpp
  50. 32
      Source/multi.cpp
  51. 10
      Source/multi.h
  52. 2
      Source/nthread.cpp
  53. 2
      Source/nthread.h
  54. 30
      Source/objects.cpp
  55. 16
      Source/objects.h
  56. 10
      Source/pfile.cpp
  57. 6
      Source/pfile.h
  58. 8
      Source/player.cpp
  59. 18
      Source/plrmsg.cpp
  60. 2
      Source/plrmsg.h
  61. 14
      Source/quests.cpp
  62. 470
      Source/render.cpp
  63. 16
      Source/render.h
  64. 35
      Source/scrollrt.cpp
  65. 2
      Source/scrollrt.h
  66. 14
      Source/setmaps.cpp
  67. 14
      Source/setmaps.h
  68. 6
      Source/sound.cpp
  69. 6
      Source/sound.h
  70. 22
      Source/stores.cpp
  71. 4
      Source/stores.h
  72. 2
      Source/textdat.cpp
  73. 2
      Source/textdat.h
  74. 25
      Source/towners.cpp
  75. 5
      Source/trigs.cpp
  76. 2
      Source/trigs.h
  77. 13
      defs.h
  78. 24
      structs.h
  79. 4
      types.h

1
DiabloUI/diabloui_gcc.def

@ -14,6 +14,7 @@ EXPORTS
UiCategoryCallback @6
UiCategoryCallback@28 @6 NONAME
UiCopyProtError @7
UiCopyProtError@4 @7 NONAME
UiCreateGameCallback @8
UiCreateGameCallback@24 @8 NONAME
UiCreateGameCriteria @9

4
Source/_render.cpp

@ -2303,7 +2303,7 @@ __declspec(naked) void drawTopArchesUpperScreen(BYTE *pBuff)
}
}
__declspec(naked) void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned int *pMask)
__declspec(naked) void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *pMask)
{
__asm {
push ebx
@ -7350,7 +7350,7 @@ __declspec(naked) void drawTopArchesLowerScreen(BYTE *pBuff)
}
}
__declspec(naked) void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned int *pMask)
__declspec(naked) void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *pMask)
{
__asm {
push ebx

4
Source/appfat.h

@ -3,8 +3,8 @@
#define __APPFAT_H__
extern char sz_error_buf[256];
extern int terminating; // weak
extern int cleanup_thread_id; // weak
extern int terminating;
extern int cleanup_thread_id;
void TriggerBreak();
#ifdef _DEBUG

2
Source/automap.cpp

@ -175,7 +175,7 @@ void DrawAutomap()
return;
}
gpBufEnd = (unsigned char *)&gpBuffer[(PANEL_Y) * BUFFER_WIDTH];
gpBufEnd = &gpBuffer[(PANEL_Y) * BUFFER_WIDTH];
MapX = (ViewX - 16) >> 1;
while (MapX + AutoMapXOfs < 0)

98
Source/control.cpp

@ -6,17 +6,17 @@ BYTE sgbNextTalkSave;
BYTE sgbTalkSavePos;
BYTE *pDurIcons;
BYTE *pChrButtons;
BOOL drawhpflag; // idb
BOOL drawhpflag;
BOOL dropGoldFlag;
int panbtn[8];
int chrbtn[4];
BYTE *pMultiBtns;
BYTE *pPanelButtons;
BYTE *pChrPanel;
int lvlbtndown; // weak
BOOL lvlbtndown;
char sgszTalkSave[8][80];
int dropGoldValue; // idb
BOOL drawmanaflag; // idb
int dropGoldValue;
BOOL drawmanaflag;
BOOL chrbtnactive;
char sgszTalkMsg[MAX_SEND_STR_LEN];
BYTE *pPanelText;
@ -25,40 +25,40 @@ BYTE *pLifeBuff;
BYTE *pBtmBuff;
BYTE *pTalkBtns;
int pstrjust[4];
int pnumlines; // idb
int pnumlines;
BOOL pinfoflag;
BOOL talkbtndown[3];
int pSpell; // weak
int pSpell;
BYTE *pManaBuff;
char infoclr; // weak
int sgbPlrTalkTbl; // weak // should be char [4]
char infoclr;
int sgbPlrTalkTbl; // should be char [4]
BYTE *pGBoxBuff;
BYTE *pSBkBtnCel;
char tempstr[256];
BOOLEAN whisper[MAX_PLRS];
int sbooktab; // weak
int pSplType; // weak
int frame; // idb
int initialDropGoldIndex; // idb
int talkflag; // weak
int sbooktab;
int pSplType;
int frame;
int initialDropGoldIndex;
BOOL talkflag;
BYTE *pSBkIconCels;
int sbookflag; // weak
int chrflag;
BOOL sbookflag;
BOOL chrflag;
BOOL drawbtnflag;
BYTE *pSpellBkCel;
char infostr[MAX_PATH];
int numpanbtns; // weak
int numpanbtns;
BYTE *pStatusPanel;
char panelstr[256];
int panelflag; // weak
unsigned char SplTransTbl[256];
int initialDropGoldValue; // idb
BOOL panelflag;
BYTE SplTransTbl[256];
int initialDropGoldValue;
BYTE *pSpellCels;
BOOL panbtndown;
BYTE *pTalkPanel;
int spselflag; // weak
int spselflag;
const unsigned char fontframe[128] = {
const BYTE fontframe[128] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 54, 44, 57, 58, 56, 55, 47, 40, 41, 59, 39, 50, 37, 51, 52,
@ -68,7 +68,7 @@ const unsigned char fontframe[128] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 40, 66, 41, 67, 0
};
const unsigned char fontkern[68] = {
const BYTE fontkern[68] = {
8, 10, 7, 9, 8, 7, 6, 8, 8, 3,
3, 8, 6, 11, 9, 10, 6, 9, 9, 6,
9, 11, 10, 13, 10, 11, 7, 5, 7, 7,
@ -104,7 +104,7 @@ const int lineoffset[25] = {
BUFFER_WIDTH * 606 + 241,
BUFFER_WIDTH * 617 + 241
};
const unsigned char gbFontTransTbl[256] = {
const BYTE gbFontTransTbl[256] = {
// clang-format off
'\0', 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
@ -500,8 +500,6 @@ void DrawSpellList()
}
}
}
// 4B8834: using guessed type int pSpell;
// 4B8954: using guessed type int pSplType;
void SetSpell()
{
@ -1135,7 +1133,7 @@ void InitControlPan()
CelDecodeRect(pLifeBuff, 0, 87, 88, pStatusPanel, 1, 88);
CelDecodeRect(pManaBuff, 0, 87, 88, pStatusPanel, 2, 88);
MemFreeDbg(pStatusPanel);
talkflag = 0;
talkflag = FALSE;
if (gbMaxPlayers != 1) {
pTalkPanel = LoadFileInMem("CtrlPan\\TalkPanl.CEL", NULL);
CelDecodeRect(pBtmBuff, 0, (PANEL_HEIGHT + 16) * 2 - 1, PANEL_WIDTH, pTalkPanel, 1, PANEL_WIDTH);
@ -1149,8 +1147,8 @@ void InitControlPan()
for (i = 0; i < sizeof(talkbtndown) / sizeof(talkbtndown[0]); i++)
talkbtndown[i] = FALSE;
}
panelflag = 0;
lvlbtndown = 0;
panelflag = FALSE;
lvlbtndown = FALSE;
pPanelButtons = LoadFileInMem("CtrlPan\\Panel8bu.CEL", NULL);
for (i = 0; i < sizeof(panbtn) / sizeof(panbtn[0]); i++)
panbtn[i] = 0;
@ -1168,13 +1166,13 @@ void InitControlPan()
ClearPanel();
drawhpflag = TRUE;
drawmanaflag = TRUE;
chrflag = 0;
chrflag = FALSE;
spselflag = 0;
pSpellBkCel = LoadFileInMem("Data\\SpellBk.CEL", NULL);
pSBkBtnCel = LoadFileInMem("Data\\SpellBkB.CEL", NULL);
pSBkIconCels = LoadFileInMem("Data\\SpellI2.CEL", NULL);
sbooktab = 0;
sbookflag = 0;
sbookflag = FALSE;
if (plr[myplr]._pClass == PC_WARRIOR) {
SpellPages[0][0] = SPL_REPAIR;
} else if (plr[myplr]._pClass == PC_ROGUE) {
@ -1327,7 +1325,7 @@ void CheckPanelInfo()
{
int i, c, v, s;
panelflag = 0;
panelflag = FALSE;
ClearPanel();
for (i = 0; i < numpanbtns; i++) {
if (MouseX >= PanBtnPos[i][0]
@ -1347,14 +1345,14 @@ void CheckPanelInfo()
AddPanelString(tempstr, TRUE);
}
infoclr = COL_WHITE;
panelflag = 1;
panelflag = TRUE;
pinfoflag = TRUE;
}
}
if (!spselflag && MouseX >= 565 && MouseX < 621 && MouseY >= 416 && MouseY < 472) {
strcpy(infostr, "Select current spell button");
infoclr = COL_WHITE;
panelflag = 1;
panelflag = TRUE;
pinfoflag = TRUE;
strcpy(tempstr, "Hotkey : 's'");
AddPanelString(tempstr, TRUE);
@ -1416,12 +1414,6 @@ void CheckPanelInfo()
if (MouseX > 190 && MouseX < 437 && MouseY > 356 && MouseY < 385)
pcursinvitem = CheckInvHLight();
}
// 484368: using guessed type int FriendlyMode;
// 4B883C: using guessed type int infoclr;
// 4B8A7C: using guessed type int numpanbtns;
// 4B8B84: using guessed type int panelflag;
// 4B8C98: using guessed type int spselflag;
// 4B8CB8: using guessed type char pcursinvitem;
void CheckBtnUp()
{
@ -1449,10 +1441,10 @@ void CheckBtnUp()
switch (i) {
case PANBTN_CHARINFO:
questlog = FALSE;
chrflag = chrflag == 0;
chrflag = !chrflag;
break;
case PANBTN_QLOG:
chrflag = 0;
chrflag = FALSE;
if (!questlog)
StartQuestlog();
else
@ -1467,7 +1459,7 @@ void CheckBtnUp()
gamemenuOff = 0;
break;
case PANBTN_INVENTORY:
sbookflag = 0;
sbookflag = FALSE;
invflag = invflag == 0;
if (dropGoldFlag) {
dropGoldFlag = FALSE;
@ -1480,7 +1472,7 @@ void CheckBtnUp()
dropGoldFlag = FALSE;
dropGoldValue = 0;
}
sbookflag = sbookflag == 0;
sbookflag = !sbookflag;
break;
case PANBTN_SENDMSG:
if (talkflag)
@ -1933,14 +1925,14 @@ void MY_PlrStringXY(int x, int y, int width, char *pszStr, char col, int base)
void CheckLvlBtn()
{
if (!lvlbtndown && MouseX >= 40 && MouseX <= 81 && MouseY >= 313 && MouseY <= 335)
lvlbtndown = 1;
lvlbtndown = TRUE;
}
void ReleaseLvlBtn()
{
if (MouseX >= 40 && MouseX <= 81 && MouseY >= 313 && MouseY <= 335)
chrflag = 1;
lvlbtndown = 0;
chrflag = TRUE;
lvlbtndown = FALSE;
}
void DrawLevelUpIcon()
@ -2468,14 +2460,14 @@ void DrawTalkPan()
}
}
char *control_print_talk_msg(char *msg, int x, int y, int *a4, int color)
char *control_print_talk_msg(char *msg, int x, int y, int *nOffset, int color)
{
BYTE c;
int width;
x += 264;
width = x;
*a4 = PitchTbl[y + 534] + x;
*nOffset = PitchTbl[y + 534] + x;
while (*msg) {
c = fontframe[gbFontTransTbl[(BYTE)*msg]];
@ -2484,11 +2476,11 @@ char *control_print_talk_msg(char *msg, int x, int y, int *a4, int color)
return msg;
msg++;
if (c) {
CPrintString(*a4, c, color);
CPrintString(*nOffset, c, color);
}
*a4 += fontkern[c] + 1;
*nOffset += fontkern[c] + 1;
}
return 0;
return NULL;
}
BOOL control_check_talk_btn()
@ -2558,7 +2550,7 @@ void control_type_message()
return;
}
talkflag = 1;
talkflag = TRUE;
sgszTalkMsg[0] = 0;
frame = 1;
for (i = 0; i < 3; i++) {
@ -2571,7 +2563,7 @@ void control_type_message()
void control_reset_talk()
{
talkflag = 0;
talkflag = FALSE;
sgbPlrTalkTbl = 0;
drawpanflag = 255;
}

46
Source/control.h

@ -4,16 +4,16 @@
extern BYTE *pDurIcons;
extern BYTE *pChrButtons;
extern BOOL drawhpflag; // idb
extern BOOL drawhpflag;
extern BOOL dropGoldFlag;
extern int panbtn[8];
extern int chrbtn[4];
extern BYTE *pMultiBtns;
extern BYTE *pPanelButtons;
extern BYTE *pChrPanel;
extern int lvlbtndown; // weak
extern int dropGoldValue; // idb
extern BOOL drawmanaflag; // idb
extern BOOL lvlbtndown;
extern int dropGoldValue;
extern BOOL drawmanaflag;
extern BOOL chrbtnactive;
extern BYTE *pPanelText;
extern int nGoldFrame;
@ -21,37 +21,37 @@ extern BYTE *pLifeBuff;
extern BYTE *pBtmBuff;
extern BYTE *pTalkBtns;
extern int pstrjust[4];
extern int pnumlines; // idb
extern int pnumlines;
extern BOOL pinfoflag;
extern BOOL talkbtndown[3];
extern int pSpell; // weak
extern int pSpell;
extern BYTE *pManaBuff;
extern char infoclr; // weak
extern char infoclr;
extern BYTE *pGBoxBuff;
extern BYTE *pSBkBtnCel;
extern char tempstr[256];
extern BOOLEAN whisper[MAX_PLRS];
extern int sbooktab; // weak
extern int pSplType; // weak
extern int frame; // idb
extern int initialDropGoldIndex; // idb
extern int talkflag; // weak
extern int sbooktab;
extern int pSplType;
extern int frame;
extern int initialDropGoldIndex;
extern BOOL talkflag;
extern BYTE *pSBkIconCels;
extern int sbookflag; // weak
extern int chrflag;
extern BOOL sbookflag;
extern BOOL chrflag;
extern BOOL drawbtnflag;
extern BYTE *pSpellBkCel;
extern char infostr[MAX_PATH];
extern int numpanbtns; // weak
extern int numpanbtns;
extern BYTE *pStatusPanel;
extern char panelstr[256];
extern int panelflag; // weak
extern unsigned char SplTransTbl[256];
extern int initialDropGoldValue; // idb
extern BOOL panelflag;
extern BYTE SplTransTbl[256];
extern int initialDropGoldValue;
extern BYTE *pSpellCels;
extern BOOL panbtndown;
extern BYTE *pTalkPanel;
extern int spselflag; // weak
extern int spselflag;
void DrawSpellCel(int xp, int yp, BYTE *Trans, int nCel, int w);
void SetSpellTrans(char t);
@ -109,7 +109,7 @@ void control_drop_gold(char vkey);
void control_remove_gold(int pnum, int gold_index);
void control_set_gold_curs(int pnum);
void DrawTalkPan();
char *control_print_talk_msg(char *msg, int x, int y, int *a4, int just);
char *control_print_talk_msg(char *msg, int x, int y, int *nOffset, int just);
BOOL control_check_talk_btn();
void control_release_talk_btn();
void control_reset_talk_msg();
@ -121,10 +121,10 @@ void control_press_enter();
void control_up_down(int v);
/* rdata */
extern const unsigned char fontframe[128];
extern const unsigned char fontkern[68];
extern const BYTE fontframe[128];
extern const BYTE fontkern[68];
extern const int lineoffset[25];
extern const unsigned char gbFontTransTbl[256];
extern const BYTE gbFontTransTbl[256];
/* data */

6
Source/cursor.cpp

@ -7,7 +7,7 @@ int icursH28;
int cursW;
int pcursmonst;
int icursW28;
void *pCursCels;
BYTE *pCursCels;
int icursH;
// inv_item value
@ -261,8 +261,8 @@ void CheckCursMove()
}
pcursinvitem = -1;
pcursplr = -1;
uitemflag = 0;
panelflag = 0;
uitemflag = FALSE;
panelflag = FALSE;
trigflag = FALSE;
if (plr[myplr]._pInvincible) {

2
Source/cursor.h

@ -7,7 +7,7 @@ extern int icursH28;
extern int cursW;
extern int pcursmonst;
extern int icursW28;
extern void *pCursCels;
extern BYTE *pCursCels;
extern int icursH;
extern char pcursinvitem;
extern int icursW;

2
Source/dead.h

@ -2,7 +2,7 @@
#ifndef __DEAD_H__
#define __DEAD_H__
extern int spurtndx; // weak
extern int spurtndx;
extern DeadStruct dead[MAXDEAD];
extern int stonendx;

2
Source/debug.cpp

@ -10,7 +10,7 @@ int seed_index;
int level_seeds[NUMLEVELS];
int seed_table[4096];
void *pSquareCel;
BYTE *pSquareCel;
char dMonsDbg[NUMLEVELS][MAXDUNX][MAXDUNY];
char dFlagDbg[NUMLEVELS][MAXDUNX][MAXDUNY];

2
Source/debug.h

@ -2,7 +2,7 @@
#ifndef __DEBUG_H__
#define __DEBUG_H__
extern void *pSquareCel;
extern BYTE *pSquareCel;
extern char dMonsDbg[NUMLEVELS][MAXDUNX][MAXDUNY];
extern char dFlagDbg[NUMLEVELS][MAXDUNX][MAXDUNY];

132
Source/diablo.cpp

@ -8,33 +8,33 @@ HWND ghMainWnd;
int glMid1Seed[NUMLEVELS];
int glMid2Seed[NUMLEVELS];
int gnLevelTypeTbl[NUMLEVELS];
int MouseY; // idb
int MouseX; // idb
BOOL gbGameLoopStartup; // idb
int MouseY;
int MouseX;
BOOL gbGameLoopStartup;
DWORD glSeedTbl[NUMLEVELS];
BOOL gbRunGame;
int glMid3Seed[NUMLEVELS];
BOOL gbRunGameResult;
int zoomflag; // weak
int zoomflag;
BOOL gbProcessPlayers;
int glEndSeed[NUMLEVELS];
BOOL gbLoadGame;
HINSTANCE ghInst; // idb
HINSTANCE ghInst;
int DebugMonsters[10];
char cineflag; // weak
int drawpanflag; // weak
int visiondebug; // weak
int scrollflag; /* unused */
BOOLEAN cineflag;
int drawpanflag;
BOOL visiondebug;
BOOL scrollflag; /* unused */
BOOL light4flag;
int leveldebug; // weak
int monstdebug; // weak
int trigdebug; /* unused */
int setseed; // weak
int debugmonsttypes; // weak
int PauseMode; // weak
BOOL leveldebug;
BOOL monstdebug;
BOOL trigdebug; /* unused */
int setseed;
int debugmonsttypes;
int PauseMode;
int sgnTimeoutCurs;
char sgbMouseDown; // weak
int color_cycle_timer; // weak
char sgbMouseDown;
int color_cycle_timer;
/* rdata */
@ -63,8 +63,8 @@ char *spszMsgTbl[4] = {
"Follow me.",
"Here's something for you.",
"Now you DIE!"
}; // weak
char *spszMsgKeyTbl[4] = { "F9", "F10", "F11", "F12" }; // weak
};
char *spszMsgKeyTbl[4] = { "F9", "F10", "F11", "F12" };
void FreeGameMem()
{
@ -120,7 +120,6 @@ BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer)
SNetDestroy();
return gbRunGameResult;
}
// 678640: using guessed type char byte_678640;
void run_game_loop(unsigned int uMsg)
{
@ -194,9 +193,6 @@ void run_game_loop(unsigned int uMsg)
DoEnding();
}
}
// 525718: using guessed type char cineflag;
// 52571C: using guessed type int drawpanflag;
// 679660: using guessed type char gbMaxPlayers;
void start_game(unsigned int uMsg)
{
@ -214,9 +210,6 @@ void start_game(unsigned int uMsg)
sgbMouseDown = 0;
track_repeat_walk(0);
}
// 52569C: using guessed type int zoomflag;
// 525718: using guessed type char cineflag;
// 525748: using guessed type char sgbMouseDown;
void free_game()
{
@ -336,7 +329,7 @@ void diablo_parse_flags(char *args)
gbBackBuf = 1;
args += strlen("dd_backbuf");
} else if (_strnicmp("ds_noduplicates", args, strlen("ds_noduplicates")) == 0) {
gbDupSounds = 0;
gbDupSounds = FALSE;
args += strlen("ds_noduplicates");
} else {
c = tolower(*args);
@ -379,7 +372,7 @@ void diablo_parse_flags(char *args)
break;
case 'l':
setlevel = FALSE;
leveldebug = 1;
leveldebug = TRUE;
while (isspace(*args)) {
args++;
}
@ -401,7 +394,7 @@ void diablo_parse_flags(char *args)
plr[0].plrlevel = i;
break;
case 'm':
monstdebug = 1;
monstdebug = TRUE;
while (isspace(*args)) {
args++;
}
@ -441,7 +434,7 @@ void diablo_parse_flags(char *args)
debug_mode_key_s = 1;
break;
case 't':
leveldebug = 1;
leveldebug = TRUE;
setlevel = TRUE;
while (isspace(*args)) {
args++;
@ -454,7 +447,7 @@ void diablo_parse_flags(char *args)
setlvlnum = i;
break;
case 'v':
visiondebug = 1;
visiondebug = TRUE;
break;
case 'w':
debug_mode_key_w = 1;
@ -467,8 +460,6 @@ void diablo_parse_flags(char *args)
}
}
}
// 52A548: using guessed type char gbBackBuf;
// 52A549: using guessed type char gbEmulate;
void diablo_init_screen()
{
@ -636,13 +627,6 @@ BOOL PressEscKey()
return rv;
}
// 4B8960: using guessed type int talkflag;
// 4B8C98: using guessed type int spselflag;
// 52575C: using guessed type int doomflag;
// 52B9F0: using guessed type char msgdelay;
// 52B9F1: using guessed type char msgflag;
// 646D00: using guessed type char qtextflag;
// 6AA705: using guessed type char stextflag;
LRESULT CALLBACK DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@ -686,7 +670,6 @@ LRESULT CALLBACK DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
return MainWndProc(hWnd, uMsg, wParam, lParam);
}
// 525748: using guessed type char sgbMouseDown;
LRESULT CALLBACK GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@ -787,9 +770,6 @@ LRESULT CALLBACK GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return MainWndProc(hWnd, uMsg, wParam, lParam);
}
// 52571C: using guessed type int drawpanflag;
// 525748: using guessed type char sgbMouseDown;
// 679660: using guessed type char gbMaxPlayers;
BOOL LeftMouseDown(int wParam)
{
@ -946,9 +926,6 @@ BOOL TryIconCurs()
return FALSE;
}
// 4B8CB8: using guessed type char pcursinvitem;
// 4B8CC1: using guessed type char pcursobj;
// 4B8CC2: using guessed type char pcursplr;
void LeftMouseUp()
{
@ -963,8 +940,6 @@ void LeftMouseUp()
if (stextflag)
ReleaseStoreBtn();
}
// 4B851C: using guessed type int lvlbtndown;
// 6AA705: using guessed type char stextflag;
void RightMouseDown()
{
@ -988,12 +963,6 @@ void RightMouseDown()
}
}
}
// 4B8968: using guessed type int sbookflag;
// 4B8C98: using guessed type int spselflag;
// 4B8CB8: using guessed type char pcursinvitem;
// 525740: using guessed type int PauseMode;
// 52575C: using guessed type int doomflag;
// 6AA705: using guessed type char stextflag;
BOOL PressSysKey(int wParam)
{
@ -1026,9 +995,6 @@ void diablo_hotkey_msg(DWORD dwMsg)
GetPrivateProfileString("NetMsg", spszMsgKeyTbl[dwMsg], spszMsgTbl[dwMsg], szMsg, sizeof(szMsg), szFileName);
NetSendCmdString(-1, szMsg);
}
// 48436C: using guessed type char *spszMsgTbl[4];
// 48437C: using guessed type char *spszMsgKeyTbl[4];
// 679660: using guessed type char gbMaxPlayers;
void ReleaseKey(int vkey)
{
@ -1102,11 +1068,11 @@ void PressKey(int vkey)
track_repeat_walk(0);
} else {
invflag = 0;
chrflag = 0;
sbookflag = 0;
chrflag = FALSE;
sbookflag = FALSE;
spselflag = 0;
if (qtextflag && leveltype == DTYPE_TOWN) {
qtextflag = 0;
qtextflag = FALSE;
sfx_stop();
}
questlog = FALSE;
@ -1220,11 +1186,11 @@ void PressKey(int vkey)
}
helpflag = 0;
invflag = 0;
chrflag = 0;
sbookflag = 0;
chrflag = FALSE;
sbookflag = FALSE;
spselflag = 0;
if (qtextflag && leveltype == DTYPE_TOWN) {
qtextflag = 0;
qtextflag = FALSE;
sfx_stop();
}
questlog = FALSE;
@ -1234,17 +1200,10 @@ void PressKey(int vkey)
doom_close();
}
}
// 4B8960: using guessed type int talkflag;
// 4B8968: using guessed type int sbookflag;
// 4B8C98: using guessed type int spselflag;
// 525740: using guessed type int PauseMode;
// 52B9F0: using guessed type char msgdelay;
// 646D00: using guessed type char qtextflag;
// 6AA705: using guessed type char stextflag;
void diablo_pause_game()
{
if ((unsigned char)gbMaxPlayers <= 1u) {
if (gbMaxPlayers <= 1) {
if (PauseMode) {
PauseMode = 0;
} else {
@ -1255,9 +1214,6 @@ void diablo_pause_game()
drawpanflag = 255;
}
}
// 52571C: using guessed type int drawpanflag;
// 525740: using guessed type int PauseMode;
// 679660: using guessed type char gbMaxPlayers;
/* NOTE: `return` must be used instead of `break` to be bin exact as C++ */
void PressChar(int vkey)
@ -1293,7 +1249,7 @@ void PressChar(int vkey)
case 'I':
case 'i':
if (!stextflag) {
sbookflag = 0;
sbookflag = FALSE;
invflag = invflag == 0;
if (!invflag || chrflag) {
if (MouseX < 480 && MouseY < PANEL_TOP) {
@ -1310,7 +1266,7 @@ void PressChar(int vkey)
case 'c':
if (!stextflag) {
questlog = FALSE;
chrflag = chrflag == 0;
chrflag = !chrflag;
if (!chrflag || invflag) {
if (MouseX > 160 && MouseY < PANEL_TOP) {
SetCursorPos(MouseX - 160, MouseY);
@ -1325,7 +1281,7 @@ void PressChar(int vkey)
case 'Q':
case 'q':
if (!stextflag) {
chrflag = 0;
chrflag = FALSE;
if (!questlog) {
StartQuestlog();
} else {
@ -1353,7 +1309,7 @@ void PressChar(int vkey)
case 'b':
if (!stextflag) {
invflag = 0;
sbookflag = sbookflag == 0;
sbookflag = !sbookflag;
}
return;
case '+':
@ -1524,18 +1480,12 @@ void PressChar(int vkey)
#endif
}
}
// 4B8968: using guessed type int sbookflag;
// 4B8C98: using guessed type int spselflag;
// 52569C: using guessed type int zoomflag;
// 525740: using guessed type int PauseMode;
// 52575C: using guessed type int doomflag;
// 6AA705: using guessed type char stextflag;
void LoadLvlGFX()
{
/// ASSERT: assert(! pDungeonCels);
switch ((unsigned char)leveltype) {
switch (leveltype) {
case DTYPE_TOWN:
pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL", NULL);
pMegaTiles = LoadFileInMem("Levels\\TownData\\Town.TIL", NULL);
@ -1835,8 +1785,6 @@ void LoadGameLevel(BOOL firstflag, int lvldir)
if (setlevel && setlvlnum == SL_SKELKING && quests[QTYPE_KING]._qactive == 2)
PlaySFX(USFX_SKING1);
}
// 525738: using guessed type int setseed;
// 679660: using guessed type char gbMaxPlayers;
void game_loop(BOOL bStartup)
{
@ -1856,7 +1804,6 @@ void game_loop(BOOL bStartup)
break;
}
}
// 679660: using guessed type char gbMaxPlayers;
void game_logic()
{
@ -1904,10 +1851,6 @@ void game_logic()
drawpanflag |= 1;
pfile_update(FALSE);
}
// 525718: using guessed type char cineflag;
// 52571C: using guessed type int drawpanflag;
// 525740: using guessed type int PauseMode;
// 679660: using guessed type char gbMaxPlayers;
void timeout_cursor(BOOL bTimeout)
{
@ -1929,8 +1872,6 @@ void timeout_cursor(BOOL bTimeout)
drawpanflag = 255;
}
}
// 52571C: using guessed type int drawpanflag;
// 525748: using guessed type char sgbMouseDown;
void diablo_color_cyc_logic()
{
@ -1949,6 +1890,5 @@ void diablo_color_cyc_logic()
}
}
}
// 52574C: using guessed type int color_cycle_timer;
DEVILUTION_END_NAMESPACE

38
Source/diablo.h

@ -87,32 +87,32 @@ extern HWND ghMainWnd;
extern int glMid1Seed[NUMLEVELS];
extern int glMid2Seed[NUMLEVELS];
extern int gnLevelTypeTbl[NUMLEVELS];
extern int MouseY; // idb
extern int MouseX; // idb
extern BOOL gbGameLoopStartup; // idb
extern int MouseY;
extern int MouseX;
extern BOOL gbGameLoopStartup;
extern DWORD glSeedTbl[NUMLEVELS];
extern BOOL gbRunGame;
extern int glMid3Seed[NUMLEVELS];
extern BOOL gbRunGameResult;
extern int zoomflag; // weak
extern int zoomflag;
extern BOOL gbProcessPlayers;
extern int glEndSeed[NUMLEVELS];
extern BOOL gbLoadGame;
extern HINSTANCE ghInst; // idb
extern HINSTANCE ghInst;
extern int DebugMonsters[10];
extern char cineflag; // weak
extern int drawpanflag; // weak
extern int visiondebug; // weak
extern int scrollflag; /* unused */
extern BOOLEAN cineflag;
extern int drawpanflag;
extern BOOL visiondebug;
extern BOOL scrollflag; /* unused */
extern BOOL light4flag;
extern int leveldebug; // weak
extern int monstdebug; // weak
extern int trigdebug; /* unused */
extern int setseed; // weak
extern int debugmonsttypes; // weak
extern int PauseMode; // weak
extern char sgbMouseDown; // weak
extern int color_cycle_timer; // weak
extern BOOL leveldebug;
extern BOOL monstdebug;
extern BOOL trigdebug; /* unused */
extern int setseed;
extern int debugmonsttypes;
extern int PauseMode;
extern char sgbMouseDown;
extern int color_cycle_timer;
void FreeGameMem();
BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer);
@ -173,8 +173,8 @@ extern int framerate;
extern int framestart;
#endif
extern BOOL FriendlyMode;
extern char *spszMsgTbl[4]; // weak
extern char *spszMsgKeyTbl[4]; // weak
extern char *spszMsgTbl[4];
extern char *spszMsgKeyTbl[4];
#ifdef DEVILUTION_STUB
#include "miniwin/popdecl.inc"

12
Source/drlg_l1.cpp

@ -2,7 +2,7 @@
DEVILUTION_BEGIN_NAMESPACE
char L5dungeon[80][80];
BYTE L5dungeon[80][80];
BYTE L5dflags[DMAXX][DMAXY];
BOOL setloadflag;
int HR1;
@ -108,7 +108,7 @@ const BYTE LAMPS[] = { 2, 2, 13, 0, 13, 13, 129, 0, 130, 128 };
const BYTE PWATERIN[] = { 6, 6, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 202, 200, 200, 84, 0, 0, 199, 203, 203, 83, 0, 0, 85, 206, 80, 81, 0, 0, 0, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0 };
/* data */
BYTE L5ConvTbl[16] = { 22u, 13u, 1u, 13u, 2u, 13u, 13u, 13u, 4u, 13u, 1u, 13u, 2u, 13u, 16u, 13u };
BYTE L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };
void DRLG_Init_Globals()
{
@ -1035,10 +1035,10 @@ void L5makeDmt()
for (j = 0, dmty = 1; dmty <= 77; j++, dmty += 2) {
for (i = 0, dmtx = 1; dmtx <= 77; i++, dmtx += 2) {
int val = (unsigned char)L5dungeon[dmtx + 1][dmty + 1]; /* todo: unsigned */
val = 2 * val + (unsigned char)L5dungeon[dmtx][dmty + 1];
val = 2 * val + (unsigned char)L5dungeon[dmtx + 1][dmty];
val = 2 * val + (unsigned char)L5dungeon[dmtx][dmty];
int val = L5dungeon[dmtx + 1][dmty + 1];
val = 2 * val + L5dungeon[dmtx][dmty + 1];
val = 2 * val + L5dungeon[dmtx + 1][dmty];
val = 2 * val + L5dungeon[dmtx][dmty];
dungeon[i][j] = L5ConvTbl[val];
}
}

2
Source/drlg_l1.h

@ -2,7 +2,7 @@
#ifndef __DRLG_L1_H__
#define __DRLG_L1_H__
extern char L5dungeon[80][80];
extern BYTE L5dungeon[80][80];
extern BYTE L5dflags[DMAXX][DMAXY];
extern BOOL setloadflag;
extern int HR1;

4
Source/drlg_l2.cpp

@ -16,8 +16,8 @@ int Room_Max = 10;
int Room_Min = 4;
int Dir_Xadd[5] = { 0, 0, 1, 0, -1 };
int Dir_Yadd[5] = { 0, -1, 0, 1, 0 };
ShadowStruct SPATSL2[2] = { { 6u, 3u, 0u, 3u, 48u, 0u, 50u }, { 9u, 3u, 0u, 3u, 48u, 0u, 50u } };
//short word_48489A = 0; // weak
ShadowStruct SPATSL2[2] = { { 6, 3, 0, 3, 48, 0, 50 }, { 9, 3, 0, 3, 48, 0, 50 } };
//short word_48489A = 0;
BYTE BTYPESL2[161] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 17, 18, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
BYTE BSTYPESL2[161] = { 0, 1, 2, 3, 0, 0, 6, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 6, 6, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 6, 2, 2, 2, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
BYTE VARCH1[] = { 2, 4, 3, 0, 3, 1, 3, 4, 0, 7, 48, 0, 51, 39, 47, 44, 0, 0 };

484
Source/drlg_l4.cpp

@ -19,258 +19,258 @@ int SP4y1;
int SP4y2;
BYTE L4dungeon[80][80];
BYTE dung[20][20];
//int dword_52A4DC; // weak
//int dword_52A4DC;
const BYTE L4ConvTbl[16] = { 30u, 6u, 1u, 6u, 2u, 6u, 6u, 6u, 9u, 6u, 1u, 6u, 2u, 6u, 3u, 6u };
const BYTE L4ConvTbl[16] = { 30, 6, 1, 6, 2, 6, 6, 6, 9, 6, 1, 6, 2, 6, 3, 6 };
const BYTE L4USTAIRS[42] = {
4u,
5u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
0u,
0u,
0u,
0u,
36u,
38u,
35u,
0u,
37u,
34u,
33u,
32u,
0u,
0u,
31u,
0u,
0u,
0u,
0u,
0u
4,
5,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
0,
0,
0,
0,
36,
38,
35,
0,
37,
34,
33,
32,
0,
0,
31,
0,
0,
0,
0,
0
};
const BYTE L4TWARP[42] = {
4u,
5u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
0u,
0u,
0u,
0u,
134u,
136u,
133u,
0u,
135u,
132u,
131u,
130u,
0u,
0u,
129u,
0u,
0u,
0u,
0u,
0u
4,
5,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
0,
0,
0,
0,
134,
136,
133,
0,
135,
132,
131,
130,
0,
0,
129,
0,
0,
0,
0,
0
};
const BYTE L4DSTAIRS[52] = {
5u,
5u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
0u,
0u,
0u,
0u,
0u,
0u,
0u,
45u,
41u,
0u,
0u,
44u,
43u,
40u,
0u,
0u,
46u,
42u,
39u,
0u,
0u,
0u,
0u,
0u,
0u
5,
5,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
0,
0,
0,
0,
0,
0,
0,
45,
41,
0,
0,
44,
43,
40,
0,
0,
46,
42,
39,
0,
0,
0,
0,
0,
0
};
const BYTE L4PENTA[52] = {
5u,
5u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
0u,
0u,
0u,
0u,
0u,
0u,
98u,
100u,
103u,
0u,
0u,
99u,
102u,
105u,
0u,
0u,
101u,
104u,
106u,
0u,
0u,
0u,
0u,
0u,
0u
5,
5,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
0,
0,
0,
0,
0,
0,
98,
100,
103,
0,
0,
99,
102,
105,
0,
0,
101,
104,
106,
0,
0,
0,
0,
0,
0
};
const BYTE L4PENTA2[52] = {
5u,
5u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
6u,
0u,
0u,
0u,
0u,
0u,
0u,
107u,
109u,
112u,
0u,
0u,
108u,
111u,
114u,
0u,
0u,
110u,
113u,
115u,
0u,
0u,
0u,
0u,
0u,
0u
5,
5,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
0,
0,
0,
0,
0,
0,
107,
109,
112,
0,
0,
108,
111,
114,
0,
0,
110,
113,
115,
0,
0,
0,
0,
0,
0
};
const BYTE L4BTYPES[140] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

20
Source/drlg_l4.h

@ -17,9 +17,9 @@ extern int SP4x1;
extern int SP4x2;
extern int SP4y1;
extern int SP4y2;
extern unsigned char L4dungeon[80][80];
extern unsigned char dung[20][20];
//int dword_52A4DC; // weak
extern BYTE L4dungeon[80][80];
extern BYTE dung[20][20];
//int dword_52A4DC;
void DRLG_LoadL4SP();
void DRLG_FreeL4SP();
@ -58,12 +58,12 @@ void DRLG_L4Corners();
void DRLG_L4Pass3();
/* rdata */
extern const unsigned char L4ConvTbl[16];
extern const unsigned char L4USTAIRS[42];
extern const unsigned char L4TWARP[42];
extern const unsigned char L4DSTAIRS[52];
extern const unsigned char L4PENTA[52];
extern const unsigned char L4PENTA2[52];
extern const unsigned char L4BTYPES[140];
extern const BYTE L4ConvTbl[16];
extern const BYTE L4USTAIRS[42];
extern const BYTE L4TWARP[42];
extern const BYTE L4DSTAIRS[52];
extern const BYTE L4PENTA[52];
extern const BYTE L4PENTA2[52];
extern const BYTE L4BTYPES[140];
#endif /* __DRLG_L4_H__ */

2
Source/dthread.cpp

@ -83,7 +83,7 @@ void dthread_start()
}
}
unsigned int __stdcall dthread_handler(void *unused)
unsigned int __stdcall dthread_handler(void *)
{
char *error_buf;
TMegaPkt *pkt;

2
Source/dthread.h

@ -8,7 +8,7 @@ extern BOOLEAN dthread_running;
void dthread_remove_player(int pnum);
void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen);
void dthread_start();
unsigned int __stdcall dthread_handler(void *unused);
unsigned int __stdcall dthread_handler(void *);
void dthread_cleanup();
/* data */

2
Source/effects.cpp

@ -8,7 +8,7 @@ int sfxdnum;
HANDLE sfx_stream;
TSFX *sfx_data_cur;
const char monster_action_sounds[] = { 'a', 'h', 'd', 's' }; // idb
const char monster_action_sounds[] = { 'a', 'h', 'd', 's' };
/* data */

16
Source/error.cpp

@ -87,21 +87,21 @@ void DrawDiabloMsg()
int i, len, off, width, sx, sy;
BYTE c;
CelDecodeOnly(165, 318, (BYTE *)pSTextSlidCels, 1, 12);
CelDecodeOnly(591, 318, (BYTE *)pSTextSlidCels, 4, 12);
CelDecodeOnly(165, 366, (BYTE *)pSTextSlidCels, 2, 12);
CelDecodeOnly(591, 366, (BYTE *)pSTextSlidCels, 3, 12);
CelDecodeOnly(165, 318, pSTextSlidCels, 1, 12);
CelDecodeOnly(591, 318, pSTextSlidCels, 4, 12);
CelDecodeOnly(165, 366, pSTextSlidCels, 2, 12);
CelDecodeOnly(591, 366, pSTextSlidCels, 3, 12);
sx = 173;
for (i = 0; i < 35; i++) {
CelDecodeOnly(sx, 318, (BYTE *)pSTextSlidCels, 5, 12);
CelDecodeOnly(sx, 366, (BYTE *)pSTextSlidCels, 7, 12);
CelDecodeOnly(sx, 318, pSTextSlidCels, 5, 12);
CelDecodeOnly(sx, 366, pSTextSlidCels, 7, 12);
sx += 12;
}
sy = 330;
for (i = 0; i < 3; i++) {
CelDecodeOnly(165, sy, (BYTE *)pSTextSlidCels, 6, 12);
CelDecodeOnly(591, sy, (BYTE *)pSTextSlidCels, 8, 12);
CelDecodeOnly(165, sy, pSTextSlidCels, 6, 12);
CelDecodeOnly(591, sy, pSTextSlidCels, 8, 12);
sy += 12;
}

2
Source/fault.cpp

@ -83,7 +83,7 @@ LONG __stdcall TopLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
return EXCEPTION_CONTINUE_SEARCH;
}
void fault_hex_format(BYTE *ptr, unsigned int numBytes)
void fault_hex_format(BYTE *ptr, DWORD numBytes)
{
DWORD i, bytesRead;
const char *fmt;

2
Source/fault.h

@ -14,7 +14,7 @@ void fault_init_filter();
void fault_cleanup_filter_atexit();
LPTOP_LEVEL_EXCEPTION_FILTER __cdecl fault_cleanup_filter();
LONG __stdcall TopLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo);
void fault_hex_format(BYTE *ptr, unsigned int numBytes);
void fault_hex_format(BYTE *ptr, DWORD numBytes);
void fault_unknown_module(LPCVOID lpAddress, LPSTR lpModuleName, int iMaxLength, int *sectionNum, int *sectionOffset);
void fault_call_stack(void *instr, STACK_FRAME *stackAddr);
char *fault_get_error_type(DWORD dwMessageId, LPSTR lpString1, DWORD nSize);

26
Source/gamemenu.h

@ -3,28 +3,28 @@
#define __GAMEMENU_H__
void gamemenu_previous();
void gamemenu_enable_single(TMenuItem *a1);
void gamemenu_enable_multi(TMenuItem *a1);
void gamemenu_enable_single(TMenuItem *pMenuItems);
void gamemenu_enable_multi(TMenuItem *pMenuItems);
void gamemenu_off();
void gamemenu_handle_previous();
void j_gamemenu_previous(BOOL a1);
void gamemenu_new_game(BOOL a1);
void gamemenu_quit_game(BOOL a1);
void gamemenu_load_game(BOOL a1);
void gamemenu_save_game(BOOL a1);
void gamemenu_restart_town(BOOL a1);
void gamemenu_options(BOOL a1);
void j_gamemenu_previous(BOOL bActivate);
void gamemenu_new_game(BOOL bActivate);
void gamemenu_quit_game(BOOL bActivate);
void gamemenu_load_game(BOOL bActivate);
void gamemenu_save_game(BOOL bActivate);
void gamemenu_restart_town(BOOL bActivate);
void gamemenu_options(BOOL bActivate);
void gamemenu_get_music();
void gamemenu_sound_music_toggle(char **names, TMenuItem *menu_item, int gamma);
void gamemenu_get_sound();
void gamemenu_get_color_cycling();
void gamemenu_get_gamma();
void gamemenu_music_volume(BOOL a1);
void gamemenu_music_volume(BOOL bActivate);
int gamemenu_slider_music_sound(TMenuItem *menu_item);
void gamemenu_sound_volume(BOOL a1);
void gamemenu_gamma(BOOL a1);
void gamemenu_sound_volume(BOOL bActivate);
void gamemenu_gamma(BOOL bActivate);
int gamemenu_slider_gamma();
void gamemenu_color_cycling(BOOL a1);
void gamemenu_color_cycling(BOOL bActivate);
/* rdata */
extern char *music_toggle_names[];

16
Source/gendung.cpp

@ -4,14 +4,14 @@ DEVILUTION_BEGIN_NAMESPACE
WORD level_frame_types[MAXTILES];
int themeCount;
char nTransTable[2049];
BOOLEAN nTransTable[2049];
//int dword_52D204;
int dMonster[MAXDUNX][MAXDUNY];
BYTE dungeon[DMAXX][DMAXY];
char dObject[MAXDUNX][MAXDUNY];
BYTE *pSpeedCels;
int nlevel_frames;
char pdungeon[DMAXX][DMAXY];
BYTE pdungeon[DMAXX][DMAXY];
char dDead[MAXDUNX][MAXDUNY];
MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
char dPreLight[MAXDUNX][MAXDUNY];
@ -31,7 +31,7 @@ char dTransVal[MAXDUNX][MAXDUNY];
BOOLEAN nTrapTable[2049];
BYTE leveltype;
BYTE currlevel;
char TransList[256];
BOOLEAN TransList[256];
BOOLEAN nSolidTable[2049];
int level_frame_count[MAXTILES];
ScrollStruct ScrollInfo;
@ -44,13 +44,13 @@ int dword_5C2FFC;
int scr_pix_width;
int scr_pix_height;
char dArch[MAXDUNX][MAXDUNY];
char nBlockTable[2049];
BOOLEAN nBlockTable[2049];
BYTE *pSpecialCels;
char dFlags[MAXDUNX][MAXDUNY];
char dItem[MAXDUNX][MAXDUNY];
BYTE setlvlnum;
int level_frame_sizes[MAXTILES];
char nMissileTable[2049];
BOOLEAN nMissileTable[2049];
char *pSetPiece_2;
char setlvltype;
BOOLEAN setlevel;
@ -109,11 +109,11 @@ void FillSolidBlockTbls()
if (bv & 1)
nSolidTable[i] = 1;
if (bv & 2)
nBlockTable[i] = 1;
nBlockTable[i] = TRUE;
if (bv & 4)
nMissileTable[i] = 1;
nMissileTable[i] = TRUE;
if (bv & 8)
nTransTable[i] = 1;
nTransTable[i] = TRUE;
if (bv & 0x80)
nTrapTable[i] = 1;
block_lvid[i] = (bv & 0x70) >> 4; /* beta: (bv >> 4) & 7 */

10
Source/gendung.h

@ -4,14 +4,14 @@
extern WORD level_frame_types[MAXTILES];
extern int themeCount;
extern char nTransTable[2049];
extern BOOLEAN nTransTable[2049];
//int dword_52D204;
extern int dMonster[MAXDUNX][MAXDUNY];
extern BYTE dungeon[DMAXX][DMAXY];
extern char dObject[MAXDUNX][MAXDUNY];
extern BYTE *pSpeedCels;
extern int nlevel_frames;
extern char pdungeon[DMAXX][DMAXY];
extern BYTE pdungeon[DMAXX][DMAXY];
extern char dDead[MAXDUNX][MAXDUNY];
extern MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
extern char dPreLight[MAXDUNX][MAXDUNY];
@ -31,7 +31,7 @@ extern char dTransVal[MAXDUNX][MAXDUNY];
extern BOOLEAN nTrapTable[2049];
extern BYTE leveltype;
extern BYTE currlevel;
extern char TransList[256];
extern BOOLEAN TransList[256];
extern BOOLEAN nSolidTable[2049];
extern int level_frame_count[MAXTILES];
extern ScrollStruct ScrollInfo;
@ -44,13 +44,13 @@ extern int dword_5C2FFC;
extern int scr_pix_width;
extern int scr_pix_height;
extern char dArch[MAXDUNX][MAXDUNY];
extern char nBlockTable[2049];
extern BOOLEAN nBlockTable[2049];
extern BYTE *pSpecialCels;
extern char dFlags[MAXDUNX][MAXDUNY];
extern char dItem[MAXDUNX][MAXDUNY];
extern BYTE setlvlnum;
extern int level_frame_sizes[MAXTILES];
extern char nMissileTable[2049];
extern BOOLEAN nMissileTable[2049];
extern char *pSetPiece_2;
extern char setlvltype;
extern BOOLEAN setlevel;

4
Source/gmenu.cpp

@ -225,11 +225,11 @@ int gmenu_get_lfont(TMenuItem *pItem)
return i - 2;
}
BOOL gmenu_presskeys(int a1)
BOOL gmenu_presskeys(int vkey)
{
if (!sgpCurrentMenu)
return 0;
switch (a1) {
switch (vkey) {
case VK_RETURN:
if ((sgpCurrItem->dwFlags & GMENU_ENABLED) != 0) {
PlaySFX(IS_TITLEMOV);

4
Source/gmenu.h

@ -21,10 +21,10 @@ BOOL gmenu_exception();
void gmenu_call_proc(TMenuItem *pItem, void (*gmFunc)(TMenuItem *));
void gmenu_up_down(BOOL isDown);
void gmenu_draw();
void gmenu_draw_menu_item(TMenuItem *pItem, int a2);
void gmenu_draw_menu_item(TMenuItem *pItem, int y);
void gmenu_clear_buffer(int x, int y, int width, int height);
int gmenu_get_lfont(TMenuItem *pItem);
BOOL gmenu_presskeys(int a1);
BOOL gmenu_presskeys(int vkey);
void gmenu_left_right(BOOL isRight);
BOOL gmenu_on_mouse_move();
BOOLEAN gmenu_valid_mouse_pos(int *plOffset);

14
Source/help.cpp

@ -2,11 +2,11 @@
DEVILUTION_BEGIN_NAMESPACE
int help_select_line; // weak
int dword_634494; // weak
int help_select_line;
int dword_634494;
int helpflag;
int displayinghelp[22]; /* check, does nothing? */
int HelpTop; // weak
int HelpTop;
const char gszHelpText[] = {
"$Keyboard Shortcuts:|"
@ -83,7 +83,6 @@ void InitHelp()
dword_634494 = 0;
displayinghelp[0] = 0;
}
// 634494: using guessed type int dword_634494;
void DrawHelp()
{
@ -173,8 +172,6 @@ void DrawHelp()
PrintSString(0, 23, 1, "Press ESC to end or the arrow keys to scroll.", COL_GOLD, 0);
}
// 634490: using guessed type int help_select_line;
// 634960: using guessed type int HelpTop;
void DrawHelpLine(int always_0, int help_line_nr, char *text, char color)
{
@ -202,22 +199,17 @@ void DisplayHelp()
helpflag = 1;
HelpTop = 5000;
}
// 634490: using guessed type int help_select_line;
// 634960: using guessed type int HelpTop;
void HelpScrollUp()
{
if (help_select_line > 0)
help_select_line--;
}
// 634490: using guessed type int help_select_line;
void HelpScrollDown()
{
if (help_select_line < HelpTop)
help_select_line++;
}
// 634490: using guessed type int help_select_line;
// 634960: using guessed type int HelpTop;
DEVILUTION_END_NAMESPACE

6
Source/help.h

@ -2,11 +2,11 @@
#ifndef __HELP_H__
#define __HELP_H__
extern int help_select_line; // weak
extern int dword_634494; // weak
extern int help_select_line;
extern int dword_634494;
extern int helpflag;
extern int displayinghelp[22];
extern int HelpTop; // weak
extern int HelpTop;
void InitHelp();
void DrawHelp();

2
Source/init.cpp

@ -130,7 +130,7 @@ void init_disable_screensaver(BOOLEAN disable)
}
Data[1] = 0;
Data[0] = enabled ? '1' : '0';
RegSetValueEx(phkResult, "ScreenSaveActive", 0, REG_SZ, (const BYTE *)Data, 2u);
RegSetValueEx(phkResult, "ScreenSaveActive", 0, REG_SZ, (const BYTE *)Data, 2);
RegCloseKey(phkResult);
}
}

4
Source/init.h

@ -3,7 +3,7 @@
#define __INIT_H__
extern _SNETVERSIONDATA fileinfo;
extern int gbActive; // weak
extern int gbActive;
extern char diablo_exe_path[MAX_PATH];
extern HANDLE unused_mpq;
extern char patch_rt_mpq_path[MAX_PATH];
@ -11,7 +11,7 @@ extern WNDPROC CurrentProc;
extern HANDLE diabdat_mpq;
extern char diabdat_mpq_path[MAX_PATH];
extern HANDLE patch_rt_mpq;
extern BOOL killed_mom_parent; // weak
extern BOOL killed_mom_parent;
extern BOOLEAN screensaver_enabled_prev;
void init_cleanup(BOOL show_cursor);

2
Source/interfac.h

@ -14,7 +14,7 @@ void InitCutscene(unsigned int uMsg);
/* rdata */
extern const unsigned char progress_bar_colours[3];
extern const BYTE progress_bar_colours[3];
extern const int progress_bar_screen_pos[3][2];
#endif /* __INTERFAC_H__ */

60
Source/inv.cpp

@ -3,7 +3,7 @@
DEVILUTION_BEGIN_NAMESPACE
BOOL invflag;
void *pInvCels;
BYTE *pInvCels;
BOOL drawsbarflag;
int sgdwLastTime; // check name
@ -172,7 +172,7 @@ void DrawInv()
BOOL invtest[40];
int frame, frame_width, colour, screen_x, screen_y, i, j, ii;
CelDecodeOnly(384, 511, (BYTE *)pInvCels, 1, 320);
CelDecodeOnly(384, 511, pInvCels, 1, 320);
if (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {
InvDrawSlotBack(517, 219, 2 * INV_SLOT_SIZE_PX, 2 * INV_SLOT_SIZE_PX);
@ -188,13 +188,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, 517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, 517, 219, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {
CelDrawHdrOnly(517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(517, 219, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(517, 219, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -212,13 +212,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, 432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, 432, 365, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {
CelDrawHdrOnly(432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(432, 365, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(432, 365, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -236,13 +236,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, 633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, 633, 365, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {
CelDrawHdrOnly(633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(633, 365, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(633, 365, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -260,13 +260,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, 589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, 589, 220, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {
CelDrawHdrOnly(589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(589, 220, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(589, 220, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -287,13 +287,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {
CelDrawHdrOnly(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8, 1);
}
if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) {
@ -305,7 +305,7 @@ void DrawInv()
frame_width == INV_SLOT_SIZE_PX
? &gpBuffer[SCREENXY(581, 160)]
: &gpBuffer[SCREENXY(567, 160)],
(BYTE *)pCursCels, frame, frame_width, 0, 8);
pCursCels, frame, frame_width, 0, 8);
cel_transparency_active = 0;
}
@ -327,13 +327,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {
CelDrawHdrOnly(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -351,13 +351,13 @@ void DrawInv()
if (!plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {
colour = ICOL_RED;
}
CelDecodeClr(colour, 517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, 517, 320, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {
CelDrawHdrOnly(517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(517, 320, pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(517, 320, pCursCels, frame, frame_width, 0, 8, 1);
}
}
@ -392,19 +392,19 @@ void DrawInv()
colour,
InvRect[j + SLOTXY_INV_FIRST].X + 64,
InvRect[j + SLOTXY_INV_FIRST].Y + 159,
(BYTE *)pCursCels, frame, frame_width, 0, 8);
pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].InvList[ii]._iStatFlag) {
CelDrawHdrOnly(
InvRect[j + SLOTXY_INV_FIRST].X + 64,
InvRect[j + SLOTXY_INV_FIRST].Y + 159,
(BYTE *)pCursCels, frame, frame_width, 0, 8);
pCursCels, frame, frame_width, 0, 8);
} else {
CelDrawHdrLightRed(
InvRect[j + SLOTXY_INV_FIRST].X + 64,
InvRect[j + SLOTXY_INV_FIRST].Y + 159,
(BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
pCursCels, frame, frame_width, 0, 8, 1);
}
}
}
@ -436,13 +436,13 @@ void DrawInvBelt()
colour = ICOL_BLUE;
if (!plr[myplr].SpdList[i]._iStatFlag)
colour = ICOL_RED;
CelDecodeClr(colour, InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDecodeClr(colour, InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, pCursCels, frame, frame_width, 0, 8);
}
if (plr[myplr].SpdList[i]._iStatFlag)
CelDrawHdrOnly(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8);
CelDrawHdrOnly(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, pCursCels, frame, frame_width, 0, 8);
else
CelDrawHdrLightRed(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1);
CelDrawHdrLightRed(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, pCursCels, frame, frame_width, 0, 8, 1);
if (AllItemsList[plr[myplr].SpdList[i].IDidx].iUsable
&& plr[myplr].SpdList[i]._iStatFlag

18
Source/items.cpp

@ -3,7 +3,7 @@
DEVILUTION_BEGIN_NAMESPACE
int itemactive[MAXITEMS];
int uitemflag;
BOOL uitemflag;
int itemavail[MAXITEMS];
ItemStruct curruitem;
ItemGetRecordStruct itemrecord[MAXITEMS];
@ -280,11 +280,11 @@ void InitItems()
SpawnRock();
if (QuestStatus(QTYPE_ANVIL))
SpawnQuestItem(IDI_ANVIL, 2 * setpc_x + 27, 2 * setpc_y + 27, 0, 1);
if (currlevel > 0u && currlevel < 0x10u)
if (currlevel > 0 && currlevel < 16)
AddInitItems();
}
uitemflag = 0;
uitemflag = FALSE;
}
void CalcPlrItemVals(int p, BOOL Loadgfx)
@ -312,14 +312,14 @@ void CalcPlrItemVals(int p, BOOL Loadgfx)
unsigned __int64 spl = 0; // bitarray for all enabled/active spells
signed int fr = 0; // fire resistance
signed int lr = 0; // lightning resistance
signed int mr = 0; // magic resistance
int fr = 0; // fire resistance
int lr = 0; // lightning resistance
int mr = 0; // magic resistance
int dmod = 0; // bonus damage mod?
int ghit = 0; // increased damage from enemies
signed int lrad = 10; // light radius
int lrad = 10; // light radius
int ihp = 0; // increased HP
int imana = 0; // increased mana
@ -2886,7 +2886,7 @@ void PrintItemPower(char plidx, ItemStruct *x)
void DrawUTextBack()
{
CelDecodeOnly(88, 487, (BYTE *)pSTextBoxCels, 1, 271);
CelDecodeOnly(88, 487, pSTextBoxCels, 1, 271);
#define TRANS_RECT_X 27
#define TRANS_RECT_Y 28
@ -3056,7 +3056,7 @@ void PrintItemDetails(ItemStruct *x)
}
if (x->_iMagical == ITEM_QUALITY_UNIQUE) {
AddPanelString("unique item", TRUE);
uitemflag = 1;
uitemflag = TRUE;
curruitem = *x;
}
PrintItemMisc(x);

2
Source/items.h

@ -3,7 +3,7 @@
#define __ITEMS_H__
extern int itemactive[MAXITEMS];
extern int uitemflag;
extern BOOL uitemflag;
extern int itemavail[MAXITEMS];
extern ItemStruct curruitem;
extern ItemGetRecordStruct itemrecord[MAXITEMS];

11
Source/lighting.cpp

@ -665,7 +665,8 @@ void DoUnVision(int nXPos, int nYPos, int nRadius)
void DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible)
{
int nCrawlX, nCrawlY, nLineLen, nBlockerFlag, nTrans;
BOOL nBlockerFlag;
int nCrawlX, nCrawlY, nLineLen, nTrans;
int j, k, v, x1adj, x2adj, y1adj, y2adj;
if (nXPos >= 0 && nXPos <= MAXDUNX && nYPos >= 0 && nYPos <= MAXDUNY) {
@ -725,7 +726,7 @@ void DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible)
break;
}
if (nCrawlX >= 0 && nCrawlX <= MAXDUNX && nCrawlY >= 0 && nCrawlY <= MAXDUNY) {
nBlockerFlag = (BYTE)nBlockTable[dPiece[nCrawlX][nCrawlY]];
nBlockerFlag = nBlockTable[dPiece[nCrawlX][nCrawlY]];
if (!nBlockTable[dPiece[x1adj + nCrawlX][y1adj + nCrawlY]]
|| !nBlockTable[dPiece[x2adj + nCrawlX][y2adj + nCrawlY]]) {
if (doautomap) {
@ -741,7 +742,7 @@ void DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible)
if (!nBlockerFlag) {
nTrans = dTransVal[nCrawlX][nCrawlY];
if (nTrans != 0) {
TransList[nTrans] = 1;
TransList[nTrans] = TRUE;
}
}
}
@ -1152,7 +1153,7 @@ void InitVision()
visionid = 1;
for (i = 0; i < TransVal; i++) {
TransList[i] = 0;
TransList[i] = FALSE;
}
}
@ -1225,7 +1226,7 @@ void ProcessVisionList()
}
}
for (i = 0; i < TransVal; i++) {
TransList[i] = 0;
TransList[i] = FALSE;
}
for (i = 0; i < numvision; i++) {
if (!VisionList[i]._ldel) {

6
Source/loadsave.cpp

@ -779,10 +779,10 @@ void SaveGame()
tbuff = SaveBuff;
ISave('RETL');
OSave((unsigned char)setlevel);
OSave(setlevel);
WSave(setlvlnum);
WSave(currlevel);
WSave((unsigned char)leveltype);
WSave(leveltype);
WSave(ViewX);
WSave(ViewY);
OSave(invflag);
@ -1462,7 +1462,7 @@ void SaveLevel()
int i, j;
char szName[MAX_PATH];
int dwLen;
unsigned char *SaveBuff;
BYTE *SaveBuff;
if (!currlevel)
glSeedTbl[0] = GetRndSeed();

4
Source/mainmenu.h

@ -17,7 +17,7 @@ int __stdcall mainmenu_select_hero_dialog(
BOOL *multi); // new character? - unsure about this
void mainmenu_loop();
BOOL mainmenu_single_player();
BOOL mainmenu_init_menu(int a1);
BOOL mainmenu_init_menu(int type);
BOOL mainmenu_multi_player();
void mainmenu_play_intro();
@ -25,6 +25,6 @@ void mainmenu_play_intro();
/* data */
extern int menu_music_track_id; // idb
extern int menu_music_track_id;
#endif /* __MAINMENU_H__ */

16
Source/minitext.cpp

@ -5,13 +5,13 @@ DEVILUTION_BEGIN_NAMESPACE
int qtexty;
char *qtextptr;
int qtextSpd;
char qtextflag;
BOOLEAN qtextflag;
int scrolltexty;
int sgLastScroll;
void *pMedTextCels;
void *pTextBoxCels;
BYTE *pMedTextCels;
BYTE *pTextBoxCels;
const unsigned char mfontframe[127] = {
const BYTE mfontframe[127] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@ -26,7 +26,7 @@ const unsigned char mfontframe[127] = {
14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 48, 0, 49, 0
};
const unsigned char mfontkern[56] = {
const BYTE mfontkern[56] = {
5, 15, 10, 13, 14, 10, 9, 13, 11, 5,
5, 11, 10, 16, 13, 16, 10, 15, 12, 10,
14, 17, 17, 22, 17, 16, 11, 5, 11, 11,
@ -68,7 +68,7 @@ void InitQTextMsg(int m)
void DrawQTextBack()
{
CelDecodeOnly(88, 487, (BYTE *)pTextBoxCels, 1, 591);
CelDecodeOnly(88, 487, pTextBoxCels, 1, 591);
#define TRANS_RECT_X 27
#define TRANS_RECT_Y 28
@ -243,7 +243,7 @@ void DrawQText()
p++;
}
if (c != 0) {
PrintQTextChr(tx, ty, (BYTE *)pMedTextCels, c);
PrintQTextChr(tx, ty, pMedTextCels, c);
}
tx += mfontkern[c] + 2;
}
@ -275,7 +275,7 @@ void DrawQText()
qtexty += 38;
qtextptr = pnl;
if (*pnl == '|') {
qtextflag = 0;
qtextflag = FALSE;
}
break;
}

10
Source/minitext.h

@ -5,10 +5,10 @@
extern int qtexty;
extern char *qtextptr;
extern int qtextSpd;
extern char qtextflag;
extern BOOLEAN qtextflag;
extern int scrolltexty;
extern void *pMedTextCels;
extern void *pTextBoxCels;
extern BYTE *pMedTextCels;
extern BYTE *pTextBoxCels;
void FreeQuestText();
void InitQuestText();
@ -19,8 +19,8 @@ void DrawQText();
/* rdata */
extern const unsigned char mfontframe[127];
extern const unsigned char mfontkern[56];
extern const BYTE mfontframe[127];
extern const BYTE mfontkern[56];
/* data */

30
Source/missiles.cpp

@ -6,9 +6,9 @@ int missileactive[MAXMISSILES];
int missileavail[MAXMISSILES];
MissileStruct missile[MAXMISSILES];
int nummissiles;
int ManashieldFlag;
BOOL ManashieldFlag;
ChainStruct chain[MAXMISSILES];
int MissilePreFlag;
BOOL MissilePreFlag;
int numchains;
int XDirAdd[8] = { 1, 0, -1, -1, -1, 0, 1, 1 };
@ -392,7 +392,7 @@ void PutMissile(int i)
else
dMissile[x][y] = -1;
if (missile[i]._miPreFlag)
MissilePreFlag = 1;
MissilePreFlag = TRUE;
}
}
@ -1573,7 +1573,7 @@ void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, in
tx = dx + CrawlTable[k - 1];
ty = dy + CrawlTable[k];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
if (!(dObject[tx][ty] | dPlayer[tx][ty] | dMissile[tx][ty] | nSolidTable[dPiece[tx][ty]] | (BYTE)nMissileTable[dPiece[tx][ty]])) {
if (!(dObject[tx][ty] | dPlayer[tx][ty] | dMissile[tx][ty] | nSolidTable[dPiece[tx][ty]] | nMissileTable[dPiece[tx][ty]])) {
if (!CheckIfTrig(tx, ty)) {
missile[mi]._miDelFlag = FALSE;
missile[mi]._mix = tx;
@ -1705,7 +1705,7 @@ void AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
pn = dPiece[tx][ty];
if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {
if (LineClear(sx, sy, tx, ty)) {
if (!(dMonster[tx][ty] | dObject[tx][ty] | dMissile[tx][ty] | nSolidTable[pn] | (BYTE)nMissileTable[pn])) {
if (!(dMonster[tx][ty] | dObject[tx][ty] | dMissile[tx][ty] | nSolidTable[pn] | nMissileTable[pn])) {
missile[mi]._miDelFlag = FALSE;
missile[mi]._mix = tx;
missile[mi]._miy = ty;
@ -2095,7 +2095,7 @@ void AddIdentify(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
UseMana(id, SPL_IDENTIFY);
if (id == myplr) {
if (sbookflag)
sbookflag = 0;
sbookflag = FALSE;
if (!invflag)
invflag = 1;
SetCursor_(CURSOR_IDENTIFY);
@ -2191,7 +2191,7 @@ void AddRepair(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy,
UseMana(id, SPL_REPAIR);
if (id == myplr) {
if (sbookflag)
sbookflag = 0;
sbookflag = FALSE;
if (!invflag)
invflag = 1;
SetCursor_(CURSOR_REPAIR);
@ -2204,7 +2204,7 @@ void AddRecharge(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
UseMana(id, SPL_RECHARGE);
if (id == myplr) {
if (sbookflag)
sbookflag = 0;
sbookflag = FALSE;
if (!invflag)
invflag = 1;
SetCursor_(CURSOR_RECHARGE);
@ -2541,7 +2541,7 @@ void MI_Golem(int i)
void MI_SetManashield(int i)
{
ManashieldFlag = 1;
ManashieldFlag = TRUE;
}
void MI_LArrow(int i)
@ -2932,13 +2932,13 @@ void MI_Lightctrl(int i)
/// ASSERT: assert((DWORD)pn <= MAXTILES);
if (missile[i]._misource == -1) {
if ((mx != missile[i]._misx || my != missile[i]._misy) && nMissileTable[pn] != 0) {
if ((mx != missile[i]._misx || my != missile[i]._misy) && nMissileTable[pn]) {
missile[i]._mirange = 0;
}
} else if (nMissileTable[pn] != 0) {
} else if (nMissileTable[pn]) {
missile[i]._mirange = 0;
}
if (nMissileTable[pn] == 0) {
if (!nMissileTable[pn]) {
if ((mx != missile[i]._miVar1 || my != missile[i]._miVar2) && mx > 0 && my > 0 && mx < MAXDUNX && my < MAXDUNY) {
if (missile[i]._misource != -1) {
if (missile[i]._micaster == 1
@ -3667,7 +3667,7 @@ void MI_Wave(int i)
nya = sy + YDirAdd[sd];
pn = dPiece[nxa][nya];
/// ASSERT: assert((DWORD)pn <= MAXTILES);
if (nMissileTable[pn] == 0) {
if (!nMissileTable[pn]) {
AddMissile(nxa, nya, nxa + XDirAdd[sd], nya + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, 0, id, 0, missile[i]._mispllvl);
nxa += XDirAdd[dira];
nya += YDirAdd[dira];
@ -4041,8 +4041,8 @@ void ProcessMissiles()
}
}
MissilePreFlag = 0;
ManashieldFlag = 0;
MissilePreFlag = FALSE;
ManashieldFlag = FALSE;
for (i = 0; i < nummissiles; i++) {
mi = missileactive[i];

4
Source/missiles.h

@ -6,9 +6,9 @@ extern int missileactive[MAXMISSILES];
extern int missileavail[MAXMISSILES];
extern MissileStruct missile[MAXMISSILES];
extern int nummissiles;
extern int ManashieldFlag;
extern BOOL ManashieldFlag;
extern ChainStruct chain[MAXMISSILES];
extern int MissilePreFlag;
extern BOOL MissilePreFlag;
extern int numchains;
void GetDamageAmt(int i, int *mind, int *maxd);

514
Source/monstdat.cpp

@ -1,258 +1,256 @@
#include "diablo.h"
DEVILUTION_BEGIN_NAMESPACE
MonsterData monsterdata[112] = {
// clang-format off
// width, mImage, GraphicType, has_special, sndfile, snd_special, has_trans, TransFile, Frames[6], Rate[6], mName, mMinDLvl, mMaxDLvl, mLevel, mMinHP, mMaxHP, mAi, mFlags, mInt, mHit, mAFNum, mMinDamage, mMaxDamage, mHit2, mAFNum2, mMinDamage2, mMaxDamage2, mArmorClass, mMonstClass, mMagicRes , mMagicRes2 , mTreasure, mSelFlag, mExp
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, FALSE, NULL, { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Zombie", 1, 3, 1, 4, 7, AI_ZOMBIE, 0 , 0, 10, 8, 2, 5, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 54 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Bluered.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Ghoul", 2, 4, 2, 7, 11, AI_ZOMBIE, 0 , 1, 10, 8, 3, 10, 0, 0, 0, 0, 10, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 58 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Grey.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Rotting Carcass", 2, 6, 4, 15, 25, AI_ZOMBIE, 0 , 2, 25, 8, 5, 15, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 136 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Yellow.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Black Death", 4, 8, 6, 25, 40, AI_ZOMBIE, 0 , 3, 30, 8, 6, 22, 0, 0, 0, 0, 20, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 240 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\FallenT.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Fallen One", 1, 3, 1, 1, 4, AI_FALLEN, 0 , 0, 15, 7, 1, 3, 0, 5, 0, 0, 0, MC_ANIMAL, 0 , 0 , 0, 3, 46 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\Dark.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Carver", 2, 5, 3, 4, 8, AI_FALLEN, 0 , 2, 20, 7, 2, 5, 0, 5, 0, 0, 5, MC_ANIMAL, 0 , 0 , 0, 3, 80 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, FALSE, NULL, { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Devil Kin", 3, 7, 5, 12, 24, AI_FALLEN, 0 , 2, 25, 7, 3, 7, 0, 5, 0, 0, 10, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 155 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\Blue.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Dark One", 5, 9, 7, 20, 36, AI_FALLEN, 0 , 3, 30, 7, 4, 8, 0, 5, 0, 0, 15, MC_ANIMAL, IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 255 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\White.TRN", { 12, 8, 13, 6, 17, 16 }, { 5, 0, 0, 0, 0, 0 }, "Skeleton", 1, 3, 1, 2, 4, AI_SKELSD, 0 , 0, 20, 8, 1, 4, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 64 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\Skelt.TRN", { 12, 8, 13, 6, 17, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Axe", 2, 5, 2, 4, 7, AI_SKELSD, 0 , 1, 25, 8, 3, 5, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 68 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 13, 6, 17, 16 }, { 2, 0, 0, 0, 0, 0 }, "Burning Dead", 2, 6, 4, 8, 12, AI_SKELSD, 0 , 2, 30, 8, 3, 7, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 154 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\Black.TRN", { 12, 8, 13, 6, 17, 16 }, { 3, 0, 0, 0, 0, 0 }, "Horror", 4, 8, 6, 12, 20, AI_SKELSD, 0 , 3, 35, 8, 4, 9, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 264 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\FallenT.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Fallen One", 1, 3, 1, 2, 5, AI_FALLEN, 0 , 0, 15, 8, 1, 4, 0, 5, 0, 0, 10, MC_ANIMAL, 0 , 0 , 0, 3, 52 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\Dark.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Carver", 2, 5, 3, 5, 9, AI_FALLEN, 0 , 1, 20, 8, 2, 7, 0, 5, 0, 0, 15, MC_ANIMAL, 0 , 0 , 0, 3, 90 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, FALSE, NULL, { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Devil Kin", 3, 7, 5, 16, 24, AI_FALLEN, 0 , 2, 25, 8, 4, 10, 0, 5, 0, 0, 20, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 180 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\Blue.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Dark One", 5, 9, 7, 24, 36, AI_FALLEN, 0 , 3, 30, 8, 4, 12, 0, 5, 0, 0, 25, MC_ANIMAL, IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 280 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Scavenger", 1, 4, 2, 3, 6, AI_SCAV, 0 , 0, 20, 7, 1, 5, 0, 0, 0, 0, 10, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 80 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavBr.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Plague Eater", 3, 6, 4, 12, 24, AI_SCAV, 0 , 1, 30, 7, 1, 8, 0, 0, 0, 0, 20, MC_ANIMAL, 0 , RESIST_LIGHTNING , 0, 3, 188 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavBe.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Shadow Beast", 4, 8, 6, 24, 36, AI_SCAV, 0 , 2, 35, 7, 3, 12, 0, 0, 0, 0, 25, MC_ANIMAL, IMUNE_NULL_40, RESIST_FIRE | IMUNE_NULL_40, 0, 3, 375 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavW.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Bone Gasher", 6, 10, 8, 28, 40, AI_SCAV, 0 , 3, 35, 7, 5, 15, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC | IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 552 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\White.TRN", { 9, 8, 16, 5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, "Skeleton", 2, 5, 3, 2, 4, AI_SKELBOW, 0 , 0, 15, 12, 1, 2, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 110 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\Skelt.TRN", { 9, 8, 16, 5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Bow", 3, 7, 5, 8, 16, AI_SKELBOW, 0 , 1, 25, 12, 1, 4, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 210 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, FALSE, NULL, { 9, 8, 16, 5, 16, 16 }, { 2, 0, 0, 0, 0, 0 }, "Burning Dead", 5, 9, 7, 10, 24, AI_SKELBOW, 0 , 2, 30, 12, 1, 6, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 364 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\Black.TRN", { 9, 8, 16, 5, 16, 16 }, { 3, 0, 0, 0, 0, 0 }, "Horror", 7, 11, 9, 15, 45, AI_SKELBOW, 0 , 3, 35, 12, 2, 9, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 594 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", TRUE, TRUE, "Monsters\\SkelSd\\White.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Skeleton Captain", 1, 4, 2, 3, 6, AI_SKELSD, 0 , 0, 20, 8, 2, 7, 0, 0, 0, 0, 10, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 90 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, TRUE, "Monsters\\SkelSd\\Skelt.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Captain", 2, 6, 4, 12, 20, AI_SKELSD, 0 , 1, 30, 8, 3, 9, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 200 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, FALSE, NULL, { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Burning Dead Captain", 4, 8, 6, 16, 30, AI_SKELSD, 0 , 2, 35, 8, 4, 10, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 393 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, TRUE, "Monsters\\SkelSd\\Black.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Horror Captain", 6, 10, 8, 35, 50, AI_SKELSD, MFLAG_SEARCH , 3, 40, 8, 5, 14, 0, 0, 0, 0, 30, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 604 },
{ 128, 2000, "Monsters\\TSneak\\TSneak%c.CL2", FALSE, "Monsters\\TSneak\\Sneakl%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 15, 11, 16, 0 }, { 2, 0, 0, 0, 0, 0 }, "Invisible Lord", 14, 14, 14, 278, 278, AI_SKELSD, MFLAG_SEARCH , 3, 65, 8, 16, 30, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 2000 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, FALSE, NULL, { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Hidden", 3, 8, 5, 8, 24, AI_SNEAK, MFLAG_HIDDEN , 0, 35, 8, 3, 6, 0, 0, 0, 0, 25, MC_DEMON, 0 , IMUNE_NULL_40, 0, 3, 278 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv2.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Stalker", 8, 12, 9, 30, 45, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 1, 40, 8, 8, 16, 0, 0, 0, 0, 30, MC_DEMON, 0 , IMUNE_NULL_40, 0, 3, 630 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv3.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Unseen", 10, 14, 11, 35, 50, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 2, 45, 8, 12, 20, 0, 0, 0, 0, 30, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 935 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv1.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Illusion Weaver", 14, 18, 13, 40, 60, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 3, 60, 8, 16, 24, 0, 0, 0, 0, 30, MC_DEMON, RESIST_MAGIC | RESIST_FIRE , IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1500 },
{ 160, 2000, "Monsters\\GoatLord\\GoatL%c.CL2", FALSE, "Monsters\\GoatLord\\Goatl%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 14, 9, 16, 0 }, { 2, 0, 0, 0, 0, 0 }, "Lord Sayter", 13, 13, 12, 351, 351, AI_SKELSD, MFLAG_SEARCH , 3, 80, 8, 14, 24, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1500 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Flesh Clan", 6, 10, 8, 30, 45, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 50, 8, 4, 10, 0, 0, 0, 0, 40, MC_DEMON, 0 , 0 , 0, 3, 460 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Beige.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Stone Clan", 8, 12, 10, 40, 55, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 60, 8, 6, 12, 0, 0, 0, 0, 40, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 685 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Red.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Fire Clan", 10, 14, 12, 50, 65, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 70, 8, 8, 16, 0, 0, 0, 0, 45, MC_DEMON, RESIST_FIRE , IMUNE_FIRE , 0, 3, 906 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Gray.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Night Clan", 12, 16, 14, 55, 70, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 80, 8, 10, 20, 15, 0, 30, 30, 50, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 1190 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\red.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Fiend", 2, 5, 3, 3, 6, AI_BAT, 0 , 0, 35, 5, 1, 6, 0, 0, 0, 0, 0, MC_ANIMAL, 0 , 0 , 0x4000, 6, 102 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, FALSE, NULL, { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Blink", 5, 9, 7, 12, 28, AI_BAT, 0 , 1, 45, 5, 1, 8, 0, 0, 0, 0, 15, MC_ANIMAL, 0 , 0 , 0x4000, 6, 340 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\grey.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Gloom", 7, 11, 9, 28, 36, AI_BAT, MFLAG_SEARCH , 2, 70, 5, 4, 12, 0, 0, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC | IMUNE_NULL_40, 0x4000, 6, 509 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\orange.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Familiar", 11, 15, 13, 20, 35, AI_BAT, MFLAG_SEARCH , 3, 50, 5, 4, 16, 0, 0, 0, 0, 35, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0x4000, 6, 448 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Flesh Clan", 6, 10, 8, 20, 35, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 0, 35, 13, 1, 7, 0, 0, 0, 0, 35, MC_DEMON, 0 , 0 , 0, 3, 448 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Beige.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Stone Clan", 8, 12, 10, 30, 40, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 1, 40, 13, 2, 9, 0, 0, 0, 0, 35, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 645 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Red.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Fire Clan", 10, 14, 12, 40, 50, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 45, 13, 3, 11, 0, 0, 0, 0, 35, MC_DEMON, RESIST_FIRE , IMUNE_FIRE , 0, 3, 822 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Gray.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Night Clan", 12, 16, 14, 50, 65, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 50, 13, 4, 13, 15, 0, 0, 0, 40, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 1092 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, FALSE, NULL, { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Acid Beast", 10, 14, 11, 40, 66, AI_ACID, 0 , 0, 40, 8, 4, 12, 25, 8, 0, 0, 30, MC_ANIMAL, IMUNE_ACID , IMUNE_MAGIC | IMUNE_ACID , 0, 3, 846 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidBlk.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Poison Spitter", 14, 18, 15, 60, 85, AI_ACID, 0 , 1, 45, 8, 4, 16, 25, 8, 0, 0, 30, MC_ANIMAL, IMUNE_ACID , IMUNE_MAGIC | IMUNE_ACID , 0, 3, 1248 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidB.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Pit Beast", 18, 22, 21, 80, 110, AI_ACID, 0 , 2, 55, 8, 8, 18, 35, 8, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | IMUNE_ACID , IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_ACID , 0, 3, 2060 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidR.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Lava Maw", 22, 27, 25, 100, 150, AI_ACID, 0 , 3, 65, 8, 10, 20, 40, 8, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | IMUNE_FIRE | IMUNE_ACID , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_ACID , 0, 3, 2940 },
{ 160, 1010, "Monsters\\SKing\\SKing%c.CL2", TRUE, "Monsters\\SKing\\SKing%c%i.WAV", TRUE, TRUE, "Monsters\\SkelAxe\\White.TRN", { 8, 6, 16, 6, 16, 6 }, { 2, 0, 0, 0, 0, 2 }, "Skeleton King", 6, 6, 9, 140, 140, AI_SKELKING, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 60, 8, 6, 16, 0, 0, 0, 0, 70, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0x8001, 7, 570 },
{ 128, 980, "Monsters\\FatC\\FatC%c.CL2", FALSE, "Monsters\\FatC\\FatC%c%i.WAV", FALSE, FALSE, NULL, { 10, 8, 12, 6, 16, 0 }, { 1, 0, 0, 0, 0, 0 }, "The Butcher", 0, 0, 1, 320, 320, AI_CLEAVER, 0 , 3, 50, 8, 6, 12, 0, 0, 0, 0, 50, MC_DEMON, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0x8000, 3, 710 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Overlord", 8, 12, 10, 60, 80, AI_FAT, 0 , 0, 55, 8, 6, 12, 0, 0, 0, 0, 55, MC_DEMON, 0 , RESIST_FIRE , 0, 3, 635 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\Blue.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Mud Man", 13, 17, 14, 100, 125, AI_FAT, MFLAG_SEARCH , 1, 60, 8, 8, 16, 0, 0, 0, 0, 60, MC_DEMON, 0 , IMUNE_LIGHTNING , 0, 3, 1165 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\FatB.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Toad Demon", 15, 19, 16, 135, 160, AI_FAT, MFLAG_SEARCH , 2, 70, 8, 8, 16, 40, 0, 8, 20, 65, MC_DEMON, IMUNE_MAGIC , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 3, 1380 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\FatF.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Flayed One", 19, 23, 20, 160, 200, AI_FAT, MFLAG_SEARCH , 3, 85, 8, 10, 20, 0, 0, 0, 0, 70, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 2058 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Wyrm", 9, 13, 11, 60, 90, AI_SKELSD, 0 , 0, 40, 8, 4, 10, 0, 0, 0, 0, 25, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC , 0, 3, 660 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Cave Slug", 11, 15, 13, 75, 110, AI_SKELSD, 0 , 1, 50, 8, 6, 13, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC , 0, 3, 994 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Devil Wyrm", 13, 17, 15, 100, 140, AI_SKELSD, 0 , 2, 55, 8, 8, 16, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC | RESIST_FIRE , RESIST_MAGIC | RESIST_FIRE , 0, 3, 1320 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Devourer", 15, 19, 17, 125, 200, AI_SKELSD, 0 , 3, 60, 8, 10, 20, 0, 0, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1827 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, FALSE, NULL, { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Magma Demon", 14, 17, 13, 50, 70, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 45, 4, 2, 10, 50, 13, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1076 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Yellow.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Blood Stone", 15, 19, 14, 55, 75, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 50, 4, 2, 12, 50, 14, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1309 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Blue.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Hell Stone", 16, 20, 16, 60, 80, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 60, 4, 2, 20, 60, 14, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1680 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Wierd.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Lava Lord", 17, 21, 18, 70, 85, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 75, 4, 4, 24, 60, 14, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 2124 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, FALSE, NULL, { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Horned Demon", 12, 16, 13, 40, 80, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 60, 7, 2, 16, 100, 0, 5, 32, 40, MC_ANIMAL, 0 , RESIST_FIRE , 0, 7, 1172 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\Orange.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Mud Runner", 14, 18, 15, 50, 90, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 70, 7, 6, 18, 100, 0, 12, 36, 45, MC_ANIMAL, 0 , RESIST_FIRE , 0, 7, 1404 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\Blue.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Frost Charger", 16, 20, 17, 60, 100, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 8, 20, 100, 0, 20, 40, 50, MC_ANIMAL, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 7, 1720 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\RhinoB.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Obsidian Lord", 18, 22, 19, 70, 110, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 7, 10, 22, 100, 0, 20, 50, 55, MC_ANIMAL, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0, 7, 1809 },
{ 128, 1740, "Monsters\\Demskel\\Demskl%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, FALSE, "Monsters\\Thin\\Thinv3.TRN", { 10, 8, 20, 6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, "Bone Demon", 10, 14, 12, 70, 70, AI_STORM, 0 , 0, 60, 8, 6, 14, 12, 0, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 7, 1344 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Red Death", 14, 18, 16, 96, 96, AI_STORM, 0 , 1, 75, 5, 10, 20, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 2168 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Litch Demon", 16, 20, 18, 110, 110, AI_STORM, 0 , 2, 80, 5, 10, 24, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 2736 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Undead Balrog", 20, 24, 22, 130, 130, AI_STORM, 0 , 3, 85, 5, 12, 30, 0, 0, 0, 0, 65, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3575 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Incinerator", 14, 18, 16, 30, 45, AI_FIREMAN, 0 , 0, 75, 8, 8, 16, 0, 0, 0, 0, 25, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 1888 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Flame Lord", 16, 20, 18, 40, 55, AI_FIREMAN, 0 , 1, 75, 8, 10, 20, 0, 0, 0, 0, 25, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 2250 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Doom Fire", 18, 22, 20, 50, 65, AI_FIREMAN, 0 , 2, 80, 8, 12, 24, 0, 0, 0, 0, 30, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 2740 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Hell Burner", 20, 24, 22, 60, 80, AI_FIREMAN, 0 , 3, 85, 8, 15, 30, 0, 0, 0, 0, 30, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 3355 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Red Storm", 17, 21, 18, 55, 110, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 80, 5, 8, 18, 75, 8, 4, 16, 30, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2160 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, FALSE, NULL, { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Storm Rider", 19, 23, 20, 60, 120, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 80, 5, 8, 18, 80, 8, 4, 16, 30, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2391 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv2.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Storm Lord", 21, 25, 22, 75, 135, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 85, 5, 12, 24, 75, 8, 4, 16, 35, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2775 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE , TRUE, "Monsters\\Thin\\Thinv1.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Maelstorm", 23, 27, 24, 90, 150, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 5, 12, 28, 75, 8, 4, 16, 40, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 3177 },
{ 128, 1650, "Monsters\\BigFall\\Fallg%c.CL2", TRUE, "Monsters\\BigFall\\Bfal%c%i.WAV", FALSE, FALSE, NULL, { 10, 8, 11, 8, 17, 0 }, { 0, 0, 0, 0, 2, 2 }, "Devil Kin Brute", 20, 20, 24, 160, 220, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 100, 6, 18, 24, 0, 0, 0, 0, 75, MC_ANIMAL, 0 , 0 , 0, 6, 2000 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, FALSE, NULL, { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, "Winged-Demon", 8, 12, 9, 45, 60, AI_GARG, MFLAG_CAN_OPEN_DOOR, 0, 50, 7, 10, 16, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 6, 662 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GarE.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, "Gargoyle", 12, 16, 13, 60, 90, AI_GARG, MFLAG_CAN_OPEN_DOOR, 1, 65, 7, 10, 16, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 6, 1205 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GargBr.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, "Blood Claw", 16, 20, 19, 75, 125, AI_GARG, MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 14, 22, 0, 0, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 6, 1873 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GargB.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, "Death Wing", 18, 22, 23, 90, 150, AI_GARG, MFLAG_CAN_OPEN_DOOR, 3, 95, 7, 16, 28, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 6, 2278 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, FALSE, NULL, { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Slayer", 19, 23, 20, 120, 140, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 100, 8, 12, 20, 0, 3, 0, 0, 60, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , RESIST_MAGIC | IMUNE_FIRE , 0, 7, 2300 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Guard.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Guardian", 21, 25, 22, 140, 160, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 110, 8, 14, 22, 0, 3, 0, 0, 65, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , RESIST_MAGIC | IMUNE_FIRE , 0, 7, 2714 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Vtexl.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Vortex Lord", 23, 26, 24, 160, 180, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 120, 8, 18, 24, 0, 3, 0, 0, 70, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3252 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Balr.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Balrog", 25, 29, 26, 180, 200, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 130, 8, 22, 30, 0, 3, 0, 0, 75, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3643 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, FALSE, NULL, { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Cave Viper", 20, 24, 21, 100, 150, AI_SNAKE, MFLAG_SEARCH , 0, 90, 8, 8, 20, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC , IMUNE_MAGIC , 0, 7, 2725 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\SnakR.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Fire Drake", 22, 26, 23, 120, 170, AI_SNAKE, MFLAG_SEARCH , 1, 105, 8, 12, 24, 0, 0, 0, 0, 65, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 3139 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\Snakg.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Gold Viper", 24, 27, 25, 140, 180, AI_SNAKE, MFLAG_SEARCH , 2, 120, 8, 15, 26, 0, 0, 0, 0, 70, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 7, 3540 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\Snakb.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Azure Drake", 28, 30, 27, 160, 200, AI_SNAKE, MFLAG_SEARCH , 3, 130, 8, 18, 30, 0, 0, 0, 0, 75, MC_DEMON, RESIST_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING , 0, 7, 3791 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, FALSE, NULL, { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Black Knight", 23, 27, 24, 150, 150, AI_SKELSD, MFLAG_SEARCH , 0, 110, 8, 15, 20, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 3360 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntRT.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Doom Guard", 25, 29, 26, 165, 165, AI_SKELSD, MFLAG_SEARCH , 0, 130, 8, 18, 25, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 7, 3650 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntBT.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Steel Lord", 27, 30, 28, 180, 180, AI_SKELSD, MFLAG_SEARCH , 1, 120, 8, 20, 30, 0, 0, 0, 0, 80, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 4252 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntBe.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Blood Knight", 24, 26, 30, 200, 200, AI_SKELSD, MFLAG_SEARCH , 1, 130, 8, 25, 35, 0, 0, 0, 0, 85, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 5130 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Unraveler", 26, 28, 25, 70, 150, AI_SKELSD, 0 , 0, 75, 7, 10, 20, 0, 0, 0, 0, 70, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 3, 3812 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Hollow One", 28, 30, 27, 135, 240, AI_SKELSD, 0 , 1, 75, 7, 12, 24, 0, 0, 0, 0, 75, MC_UNDEAD, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 4374 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Pain Master", 27, 30, 29, 110, 200, AI_SKELSD, 0 , 2, 80, 7, 16, 30, 0, 0, 0, 0, 80, MC_UNDEAD, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 5147 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Reality Weaver", 28, 30, 30, 135, 240, AI_SKELSD, 0 , 3, 85, 7, 20, 35, 0, 0, 0, 0, 85, MC_UNDEAD, RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 3, 5925 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, FALSE, NULL, { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Succubus", 22, 26, 24, 120, 150, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 0, 100, 10, 1, 20, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC , IMUNE_MAGIC | RESIST_FIRE , 0, 3, 3696 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succb.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Snow Witch", 25, 28, 26, 135, 175, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 1, 110, 10, 1, 24, 0, 0, 0, 0, 65, MC_DEMON, RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 4084 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succrw.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Hell Spawn", 27, 30, 28, 150, 200, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 115, 10, 1, 30, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 4480 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succbw.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Soul Burner", 28, 30, 30, 140, 225, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 120, 10, 1, 35, 0, 0, 0, 0, 85, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0, 3, 4644 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, FALSE, NULL, { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Counselor", 24, 26, 25, 70, 70, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 0, 90, 8, 8, 20, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 0, 7, 4070 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselg.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Magistrate", 26, 28, 27, 85, 85, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 1, 100, 8, 10, 24, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 4478 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselgd.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Cabalist", 28, 30, 29, 120, 120, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 2, 110, 8, 14, 30, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4929 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselbk.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Advocate", 30, 30, 30, 145, 145, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 15, 25, 0, 0, 0, 0, 0, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4968 },
{ 96, 386, "Monsters\\Golem\\Golem%c.CL2", TRUE, "Monsters\\Golem\\Golm%c%i.WAV", FALSE, FALSE, NULL, { 0, 16, 12, 0, 12, 20 }, { 0, 0, 0, 0, 0, 0 }, "Golem", 0, 0, 12, 1, 1, AI_GOLUM, MFLAG_CAN_OPEN_DOOR, 0, 0, 7, 1, 1, 0, 0, 0, 0, 1, MC_DEMON, 0 , 0 , 0, 0, 0 },
{ 160, 2000, "Monsters\\Diablo\\Diablo%c.CL2", TRUE, "Monsters\\Diablo\\Diablo%c%i.WAV", TRUE, FALSE, NULL, { 16, 6, 16, 6, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, "The Dark Lord", 50, 50, 30, 1666, 1666, AI_DIABLO, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 220, 4, 30, 60, 0, 11, 0, 0, 70, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 31666 },
{ 128, 1060, "Monsters\\DarkMage\\Dmage%c.CL2", TRUE, "Monsters\\DarkMage\\Dmag%c%i.WAV", FALSE, FALSE, NULL, { 6, 1, 21, 6, 23, 18 }, { 0, 0, 0, 0, 0, 0 }, "The Arch-Litch Malignus", 30, 30, 30, 160, 160, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 20, 40, 0, 0, 0, 0, 70, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4968 }
// clang-format on
};
char MonstConvTbl[128] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 29, 30,
31, 32, 34, 35, 36, 37, 38, 40, 39, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 52,
53, 54, 55, 56, 57, 59, 58, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 0,
0, 0, 0, 72, 73, 74, 75, 0, 0, 0,
0, 77, 76, 78, 79, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 92, 91, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 0, 110, 0, 109, 0, 0, 0,
0, 0, 0, 0, 0, 0, 80, 111
};
unsigned char MonstAvailTbl[112] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 2,
2, 2, 2, 0, 2, 2, 2, 2, 1, 1,
1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
0, 0, 2, 2, 2, 2, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
0, 0, 0, 0, 0, 0, 2, 2, 2, 2,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 0, 0, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 0
};
UniqMonstStruct UniqMonst[98] = {
// clang-format off
// mtype, mName, mTrnName, mlevel, mmaxhp, mAi, mint, mMinDamage, mMaxDamage, mMagicRes, mUnqAttr, mUnqVar1, mUnqVar2, mtalkmsg
{ MT_NGOATMC, "Gharbad the Weak", "BSDB", 4, 120, AI_GARBUD, 3, 8, 16, IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_GARBUD1 },
{ MT_SKING, "Skeleton King", "GENRL", 0, 240, AI_SKELKING, 3, 6, 16, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 1, 0, 0, 0 },
{ MT_COUNSLR, "Zhar the Mad", "GENERAL", 8, 360, AI_ZHAR, 3, 16, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 0, 0, 0, QUEST_ZHAR1 },
{ MT_BFALLSP, "Snotspill", "BNG", 4, 220, AI_SNOTSPIL, 3, 10, 18, RESIST_LIGHTNING , 0, 0, 0, QUEST_BANNER10 },
{ MT_ADVOCATE, "Arch-Bishop Lazarus", "GENERAL", 0, 600, AI_LAZURUS, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_HLSPWN, "Red Vex", "REDV", 0, 400, AI_LAZHELP, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_HLSPWN, "BlackJade", "BLKJD", 0, 400, AI_LAZHELP, 3, 30, 50, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_RBLACK, "Lachdanan", "BHKA", 14, 500, AI_LACHDAN, 3, 0, 0, 0 , 0, 0, 0, QUEST_VEIL9 },
{ MT_BTBLACK, "Warlord of Blood", "GENERAL", 13, 850, AI_WARLORD, 3, 35, 50, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_WARLRD9 },
{ MT_CLEAVER, "The Butcher", "GENRL", 0, 220, AI_CLEAVER, 3, 6, 12, RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_TSKELAX, "Bonehead Keenaxe", "BHKA", 2, 91, AI_SKELSD, 2, 4, 10, IMUNE_MAGIC | IMUNE_NULL_40, 7, 100, 0, 0 },
{ MT_RFALLSD, "Bladeskin the Slasher", "BSTS", 2, 51, AI_FALLEN, 0, 6, 18, RESIST_FIRE , 11, 45, 0, 0 },
{ MT_NZOMBIE, "Soulpus", "GENERAL", 2, 133, AI_ZOMBIE, 0, 4, 8, RESIST_FIRE | RESIST_LIGHTNING , 0, 0, 0, 0 },
{ MT_RFALLSP, "Pukerat the Unclean", "PTU", 2, 77, AI_FALLEN, 3, 1, 5, RESIST_FIRE , 0, 0, 0, 0 },
{ MT_WSKELAX, "Boneripper", "BR", 2, 54, AI_BAT, 0, 6, 15, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NZOMBIE, "Rotfeast the Hungry", "ETH", 2, 85, AI_SKELSD, 3, 4, 12, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_DFALLSD, "Gutshank the Quick", "GTQ", 3, 66, AI_BAT, 2, 6, 16, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_TSKELSD, "Brokenhead Bangshield", "BHBS", 3, 108, AI_SKELSD, 3, 12, 20, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_YFALLSP, "Bongo", "BNG", 3, 178, AI_FALLEN, 3, 9, 21, 0 , 3, 0, 0, 0 },
{ MT_BZOMBIE, "Rotcarnage", "RCRN", 3, 102, AI_ZOMBIE, 3, 9, 24, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 11, 45, 0, 0 },
{ MT_NSCAV, "Shadowbite", "SHBT", 2, 60, AI_SKELSD, 3, 3, 20, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_WSKELBW, "Deadeye", "DE", 2, 49, AI_GOATBOW, 0, 6, 9, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RSKELAX, "Madeye the Dead", "MTD", 4, 75, AI_BAT, 0, 9, 21, IMUNE_MAGIC | IMUNE_FIRE , 11, 30, 0, 0 },
{ MT_BSCAV, "El Chupacabras", "GENERAL", 3, 120, AI_GOATMC, 0, 10, 18, RESIST_FIRE , 3, 30, 0, 0 },
{ MT_TSKELBW, "Skullfire", "SKFR", 3, 125, AI_GOATBOW, 1, 6, 10, IMUNE_FIRE , 0, 100, 0, 0 },
{ MT_SNEAK, "Warpskull", "TSPO", 3, 117, AI_SNEAK, 2, 6, 18, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_GZOMBIE, "Goretongue", "PMR", 3, 156, AI_SKELSD, 1, 15, 30, IMUNE_MAGIC | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_WSCAV, "Pulsecrawler", "BHKA", 4, 150, AI_SCAV, 0, 16, 20, IMUNE_FIRE | RESIST_LIGHTNING , 11, 45, 0, 0 },
{ MT_BLINK, "Moonbender", "GENERAL", 4, 135, AI_BAT, 0, 9, 27, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BLINK, "Wrathraven", "GENERAL", 5, 135, AI_BAT, 2, 9, 22, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_YSCAV, "Spineeater", "GENERAL", 4, 180, AI_SCAV, 1, 18, 25, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSKELBW, "Blackash the Burning", "BASHTB", 4, 120, AI_GOATBOW, 0, 6, 16, IMUNE_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BFALLSD, "Shadowcrow", "GENERAL", 5, 270, AI_SNEAK, 2, 12, 25, 0 , 3, 0, 0, 0 },
{ MT_LRDSAYTR, "Blightstone the Weak", "BHKA", 4, 360, AI_SKELSD, 0, 4, 12, IMUNE_MAGIC | RESIST_LIGHTNING , 7, 70, 0, 0 },
{ MT_FAT, "Bilefroth the Pit Master", "BFTP", 6, 210, AI_BAT, 1, 16, 23, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_NGOATBW, "Bloodskin Darkbow", "BSDB", 5, 207, AI_GOATBOW, 0, 3, 16, RESIST_FIRE | RESIST_LIGHTNING , 11, 55, 0, 0 },
{ MT_GLOOM, "Foulwing", "DB", 5, 246, AI_RHINO, 3, 12, 28, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_XSKELSD, "Shadowdrinker", "SHDR", 5, 300, AI_SNEAK, 1, 18, 26, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 8, 45, 0, 0 },
{ MT_UNSEEN, "Hazeshifter", "BHKA", 5, 285, AI_SNEAK, 3, 18, 30, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NACID, "Deathspit", "BFDS", 6, 303, AI_ACIDUNIQ, 0, 12, 32, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_RGOATMC, "Bloodgutter", "BGBL", 6, 315, AI_BAT, 1, 24, 34, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BGOATMC, "Deathshade Fleshmaul", "DSFM", 6, 276, AI_RHINO, 0, 12, 24, IMUNE_MAGIC | RESIST_FIRE , 8, 65, 0, 0 },
{ MT_WYRM, "Warmaggot the Mad", "GENERAL", 6, 246, AI_BAT, 3, 15, 30, RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_STORM, "Glasskull the Jagged", "BHKA", 7, 354, AI_STORM, 0, 18, 30, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RGOATBW, "Blightfire", "BLF", 7, 321, AI_SUCC, 2, 13, 21, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_GARGOYLE, "Nightwing the Cold", "GENERAL", 7, 342, AI_BAT, 1, 18, 26, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_GGOATBW, "Gorestone", "GENERAL", 7, 303, AI_GOATBOW, 1, 15, 28, RESIST_LIGHTNING | IMUNE_NULL_40, 7, 70, 0, 0 },
{ MT_BMAGMA, "Bronzefist Firestone", "GENERAL", 8, 360, AI_MAGMA, 0, 30, 36, IMUNE_MAGIC | RESIST_FIRE , 3, 0, 0, 0 },
{ MT_INCIN, "Wrathfire the Doomed", "WFTD", 8, 270, AI_SKELSD, 2, 20, 30, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_NMAGMA, "Firewound the Grim", "BHKA", 8, 303, AI_MAGMA, 0, 18, 22, IMUNE_MAGIC | RESIST_FIRE , 3, 0, 0, 0 },
{ MT_MUDMAN, "Baron Sludge", "BSM", 8, 315, AI_SNEAK, 3, 25, 34, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 11, 75, 0, 0 },
{ MT_GGOATMC, "Blighthorn Steelmace", "BHSM", 7, 250, AI_RHINO, 0, 20, 28, RESIST_LIGHTNING , 11, 45, 0, 0 },
{ MT_RACID, "Chaoshowler", "GENERAL", 8, 240, AI_ACIDUNIQ, 0, 12, 20, 0 , 3, 0, 0, 0 },
{ MT_REDDTH, "Doomgrin the Rotting", "GENERAL", 8, 405, AI_STORM, 3, 25, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_FLAMLRD, "Madburner", "GENERAL", 9, 270, AI_STORM, 0, 20, 40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_LTCHDMN, "Bonesaw the Litch", "GENERAL", 9, 495, AI_STORM, 2, 30, 55, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_MUDRUN, "Breakspine", "GENERAL", 9, 351, AI_RHINO, 0, 25, 34, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_REDDTH, "Devilskull Sharpbone", "GENERAL", 9, 444, AI_STORM, 1, 25, 40, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_STORM, "Brokenstorm", "GENERAL", 9, 411, AI_STORM, 2, 25, 36, IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_RSTORM, "Stormbane", "GENERAL", 9, 555, AI_STORM, 3, 30, 30, IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_TOAD, "Oozedrool", "GENERAL", 9, 483, AI_FAT, 3, 25, 30, RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BLOODCLW, "Goldblight of the Flame", "GENERAL", 10, 405, AI_GARG, 0, 15, 35, IMUNE_MAGIC | IMUNE_FIRE , 11, 80, 0, 0 },
{ MT_OBLORD, "Blackstorm", "GENERAL", 10, 525, AI_RHINO, 3, 20, 40, IMUNE_MAGIC | IMUNE_LIGHTNING , 11, 90, 0, 0 },
{ MT_RACID, "Plaguewrath", "GENERAL", 10, 450, AI_ACIDUNIQ, 2, 20, 30, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSTORM, "The Flayer", "GENERAL", 10, 501, AI_STORM, 1, 20, 35, RESIST_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_FROSTC, "Bluehorn", "GENERAL", 11, 477, AI_RHINO, 1, 25, 30, IMUNE_MAGIC | RESIST_FIRE , 11, 90, 0, 0 },
{ MT_HELLBURN, "Warpfire Hellspawn", "GENERAL", 11, 525, AI_FIREMAN, 3, 10, 40, RESIST_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_NSNAKE, "Fangspeir", "GENERAL", 11, 444, AI_SKELSD, 1, 15, 32, IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_UDEDBLRG, "Festerskull", "GENERAL", 11, 600, AI_STORM, 2, 15, 30, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NBLACK, "Lionskull the Bent", "GENERAL", 12, 525, AI_SKELSD, 2, 25, 25, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_COUNSLR, "Blacktongue", "GENERAL", 12, 360, AI_COUNSLR, 3, 15, 30, RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_DEATHW, "Viletouch", "GENERAL", 12, 525, AI_GARG, 3, 20, 40, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSNAKE, "Viperflame", "GENERAL", 12, 570, AI_SKELSD, 1, 25, 35, IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BSNAKE, "Fangskin", "BHKA", 14, 681, AI_SKELSD, 2, 15, 50, IMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_SUCCUBUS, "Witchfire the Unholy", "GENERAL", 12, 444, AI_SUCC, 3, 10, 20, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BALROG, "Blackskull", "BHKA", 13, 750, AI_SKELSD, 3, 25, 40, IMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_UNRAV, "Soulslash", "GENERAL", 12, 450, AI_SKELSD, 0, 25, 25, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_VTEXLRD, "Windspawn", "GENERAL", 12, 711, AI_SKELSD, 1, 35, 40, IMUNE_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_GSNAKE, "Lord of the Pit", "GENERAL", 13, 762, AI_SKELSD, 2, 25, 42, RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RTBLACK, "Rustweaver", "GENERAL", 13, 400, AI_SKELSD, 3, 1, 60, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_HOLOWONE, "Howlingire the Shade", "GENERAL", 13, 450, AI_SKELSD, 2, 40, 75, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_MAEL, "Doomcloud", "GENERAL", 13, 612, AI_STORM, 1, 1, 60, RESIST_FIRE | IMUNE_LIGHTNING , 0, 0, 0, 0 },
{ MT_PAINMSTR, "Bloodmoon Soulfire", "GENERAL", 13, 684, AI_SKELSD, 1, 15, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_SNOWWICH, "Witchmoon", "GENERAL", 13, 310, AI_SUCC, 3, 30, 40, RESIST_LIGHTNING , 0, 0, 0, 0 },
{ MT_VTEXLRD, "Gorefeast", "GENERAL", 13, 771, AI_SKELSD, 3, 20, 55, RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RTBLACK, "Graywar the Slayer", "GENERAL", 14, 672, AI_SKELSD, 1, 30, 50, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_MAGISTR, "Dreadjudge", "GENERAL", 14, 540, AI_COUNSLR, 1, 30, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_HLSPWN, "Stareye the Witch", "GENERAL", 14, 726, AI_SUCC, 2, 30, 50, IMUNE_FIRE , 0, 0, 0, 0 },
{ MT_BTBLACK, "Steelskull the Hunter", "GENERAL", 14, 831, AI_SKELSD, 3, 40, 50, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RBLACK, "Sir Gorash", "GENERAL", 16, 1050, AI_SKELSD, 1, 20, 60, IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_CABALIST, "The Vizier", "GENERAL", 15, 850, AI_COUNSLR, 2, 25, 40, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_REALWEAV, "Zamphir", "GENERAL", 15, 891, AI_SKELSD, 2, 30, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_HLSPWN, "Bloodlust", "GENERAL", 15, 825, AI_SUCC, 1, 20, 55, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_HLSPWN, "Webwidow", "GENERAL", 16, 774, AI_SUCC, 1, 20, 50, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_SOLBRNR, "Fleshdancer", "GENERAL", 16, 999, AI_SUCC, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_OBLORD, "Grimspike", "GENERAL", 19, 534, AI_SNEAK, 1, 25, 40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_STORML, "Doomlock", "GENERAL", 28, 534, AI_SNEAK, 1, 35, 55, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ -1, NULL, NULL, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0 }
// clang-format on
};
DEVILUTION_END_NAMESPACE
#include "diablo.h"
DEVILUTION_BEGIN_NAMESPACE
MonsterData monsterdata[112] = {
// clang-format off
// width, mImage, GraphicType, has_special, sndfile, snd_special, has_trans, TransFile, Frames[6], Rate[6], mName, mMinDLvl, mMaxDLvl, mLevel, mMinHP, mMaxHP, mAi, mFlags, mInt, mHit, mAFNum, mMinDamage, mMaxDamage, mHit2, mAFNum2, mMinDamage2, mMaxDamage2, mArmorClass, mMonstClass, mMagicRes , mMagicRes2 , mTreasure, mSelFlag, mExp
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, FALSE, NULL, { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Zombie", 1, 3, 1, 4, 7, AI_ZOMBIE, 0 , 0, 10, 8, 2, 5, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 54 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Bluered.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Ghoul", 2, 4, 2, 7, 11, AI_ZOMBIE, 0 , 1, 10, 8, 3, 10, 0, 0, 0, 0, 10, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 58 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Grey.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Rotting Carcass", 2, 6, 4, 15, 25, AI_ZOMBIE, 0 , 2, 25, 8, 5, 15, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 136 },
{ 128, 799, "Monsters\\Zombie\\Zombie%c.CL2", FALSE, "Monsters\\Zombie\\Zombie%c%i.WAV", FALSE, TRUE, "Monsters\\Zombie\\Yellow.TRN", { 11, 24, 12, 6, 16, 0 }, { 4, 0, 0, 0, 0, 0 }, "Black Death", 4, 8, 6, 25, 40, AI_ZOMBIE, 0 , 3, 30, 8, 6, 22, 0, 0, 0, 0, 20, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 240 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\FallenT.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Fallen One", 1, 3, 1, 1, 4, AI_FALLEN, 0 , 0, 15, 7, 1, 3, 0, 5, 0, 0, 0, MC_ANIMAL, 0 , 0 , 0, 3, 46 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\Dark.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Carver", 2, 5, 3, 4, 8, AI_FALLEN, 0 , 2, 20, 7, 2, 5, 0, 5, 0, 0, 5, MC_ANIMAL, 0 , 0 , 0, 3, 80 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, FALSE, NULL, { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Devil Kin", 3, 7, 5, 12, 24, AI_FALLEN, 0 , 2, 25, 7, 3, 7, 0, 5, 0, 0, 10, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 155 },
{ 128, 543, "Monsters\\FalSpear\\Phall%c.CL2", TRUE, "Monsters\\FalSpear\\Phall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSpear\\Blue.TRN", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, "Dark One", 5, 9, 7, 20, 36, AI_FALLEN, 0 , 3, 30, 7, 4, 8, 0, 5, 0, 0, 15, MC_ANIMAL, IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 255 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\White.TRN", { 12, 8, 13, 6, 17, 16 }, { 5, 0, 0, 0, 0, 0 }, "Skeleton", 1, 3, 1, 2, 4, AI_SKELSD, 0 , 0, 20, 8, 1, 4, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 64 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\Skelt.TRN", { 12, 8, 13, 6, 17, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Axe", 2, 5, 2, 4, 7, AI_SKELSD, 0 , 1, 25, 8, 3, 5, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 68 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 13, 6, 17, 16 }, { 2, 0, 0, 0, 0, 0 }, "Burning Dead", 2, 6, 4, 8, 12, AI_SKELSD, 0 , 2, 30, 8, 3, 7, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 154 },
{ 128, 553, "Monsters\\SkelAxe\\SklAx%c.CL2", TRUE, "Monsters\\SkelAxe\\SklAx%c%i.WAV", FALSE, TRUE, "Monsters\\SkelAxe\\Black.TRN", { 12, 8, 13, 6, 17, 16 }, { 3, 0, 0, 0, 0, 0 }, "Horror", 4, 8, 6, 12, 20, AI_SKELSD, 0 , 3, 35, 8, 4, 9, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 264 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\FallenT.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Fallen One", 1, 3, 1, 2, 5, AI_FALLEN, 0 , 0, 15, 8, 1, 4, 0, 5, 0, 0, 10, MC_ANIMAL, 0 , 0 , 0, 3, 52 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\Dark.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Carver", 2, 5, 3, 5, 9, AI_FALLEN, 0 , 1, 20, 8, 2, 7, 0, 5, 0, 0, 15, MC_ANIMAL, 0 , 0 , 0, 3, 90 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, FALSE, NULL, { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Devil Kin", 3, 7, 5, 16, 24, AI_FALLEN, 0 , 2, 25, 8, 4, 10, 0, 5, 0, 0, 20, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 180 },
{ 128, 623, "Monsters\\FalSword\\Fall%c.CL2", TRUE, "Monsters\\FalSword\\Fall%c%i.WAV", TRUE, TRUE, "Monsters\\FalSword\\Blue.TRN", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, "Dark One", 5, 9, 7, 24, 36, AI_FALLEN, 0 , 3, 30, 8, 4, 12, 0, 5, 0, 0, 25, MC_ANIMAL, IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 280 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Scavenger", 1, 4, 2, 3, 6, AI_SCAV, 0 , 0, 20, 7, 1, 5, 0, 0, 0, 0, 10, MC_ANIMAL, 0 , RESIST_FIRE , 0, 3, 80 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavBr.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Plague Eater", 3, 6, 4, 12, 24, AI_SCAV, 0 , 1, 30, 7, 1, 8, 0, 0, 0, 0, 20, MC_ANIMAL, 0 , RESIST_LIGHTNING , 0, 3, 188 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavBe.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Shadow Beast", 4, 8, 6, 24, 36, AI_SCAV, 0 , 2, 35, 7, 3, 12, 0, 0, 0, 0, 25, MC_ANIMAL, IMUNE_NULL_40, RESIST_FIRE | IMUNE_NULL_40, 0, 3, 375 },
{ 128, 410, "Monsters\\Scav\\Scav%c.CL2", TRUE, "Monsters\\Scav\\Scav%c%i.WAV", FALSE, TRUE, "Monsters\\Scav\\ScavW.TRN", { 12, 8, 12, 6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, "Bone Gasher", 6, 10, 8, 28, 40, AI_SCAV, 0 , 3, 35, 7, 5, 15, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC | IMUNE_NULL_40, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 552 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\White.TRN", { 9, 8, 16, 5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, "Skeleton", 2, 5, 3, 2, 4, AI_SKELBOW, 0 , 0, 15, 12, 1, 2, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 110 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\Skelt.TRN", { 9, 8, 16, 5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Bow", 3, 7, 5, 8, 16, AI_SKELBOW, 0 , 1, 25, 12, 1, 4, 0, 0, 0, 0, 0, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 210 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, FALSE, NULL, { 9, 8, 16, 5, 16, 16 }, { 2, 0, 0, 0, 0, 0 }, "Burning Dead", 5, 9, 7, 10, 24, AI_SKELBOW, 0 , 2, 30, 12, 1, 6, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 364 },
{ 128, 567, "Monsters\\SkelBow\\SklBw%c.CL2", TRUE, "Monsters\\SkelBow\\SklBw%c%i.WAV", FALSE, TRUE, "Monsters\\SkelBow\\Black.TRN", { 9, 8, 16, 5, 16, 16 }, { 3, 0, 0, 0, 0, 0 }, "Horror", 7, 11, 9, 15, 45, AI_SKELBOW, 0 , 3, 35, 12, 2, 9, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 594 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", TRUE, TRUE, "Monsters\\SkelSd\\White.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Skeleton Captain", 1, 4, 2, 3, 6, AI_SKELSD, 0 , 0, 20, 8, 2, 7, 0, 0, 0, 0, 10, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 90 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, TRUE, "Monsters\\SkelSd\\Skelt.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Corpse Captain", 2, 6, 4, 12, 20, AI_SKELSD, 0 , 1, 30, 8, 3, 9, 0, 0, 0, 0, 5, MC_UNDEAD, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 200 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, FALSE, NULL, { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Burning Dead Captain", 4, 8, 6, 16, 30, AI_SKELSD, 0 , 2, 35, 8, 4, 10, 0, 0, 0, 0, 15, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 3, 393 },
{ 128, 575, "Monsters\\SkelSd\\SklSr%c.CL2", TRUE, "Monsters\\SkelSd\\SklSr%c%i.WAV", FALSE, TRUE, "Monsters\\SkelSd\\Black.TRN", { 13, 8, 12, 7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, "Horror Captain", 6, 10, 8, 35, 50, AI_SKELSD, MFLAG_SEARCH , 3, 40, 8, 5, 14, 0, 0, 0, 0, 30, MC_UNDEAD, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 604 },
{ 128, 2000, "Monsters\\TSneak\\TSneak%c.CL2", FALSE, "Monsters\\TSneak\\Sneakl%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 15, 11, 16, 0 }, { 2, 0, 0, 0, 0, 0 }, "Invisible Lord", 14, 14, 14, 278, 278, AI_SKELSD, MFLAG_SEARCH , 3, 65, 8, 16, 30, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 2000 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, FALSE, NULL, { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Hidden", 3, 8, 5, 8, 24, AI_SNEAK, MFLAG_HIDDEN , 0, 35, 8, 3, 6, 0, 0, 0, 0, 25, MC_DEMON, 0 , IMUNE_NULL_40, 0, 3, 278 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv2.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Stalker", 8, 12, 9, 30, 45, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 1, 40, 8, 8, 16, 0, 0, 0, 0, 30, MC_DEMON, 0 , IMUNE_NULL_40, 0, 3, 630 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv3.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Unseen", 10, 14, 11, 35, 50, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 2, 45, 8, 12, 20, 0, 0, 0, 0, 30, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 935 },
{ 128, 992, "Monsters\\Sneak\\Sneak%c.CL2", TRUE, "Monsters\\Sneak\\Sneak%c%i.WAV", FALSE, TRUE, "Monsters\\Sneak\\Sneakv1.TRN", { 16, 8, 12, 8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, "Illusion Weaver", 14, 18, 13, 40, 60, AI_SNEAK, MFLAG_HIDDEN | MFLAG_SEARCH , 3, 60, 8, 16, 24, 0, 0, 0, 0, 30, MC_DEMON, RESIST_MAGIC | RESIST_FIRE , IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1500 },
{ 160, 2000, "Monsters\\GoatLord\\GoatL%c.CL2", FALSE, "Monsters\\GoatLord\\Goatl%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 14, 9, 16, 0 }, { 2, 0, 0, 0, 0, 0 }, "Lord Sayter", 13, 13, 12, 351, 351, AI_SKELSD, MFLAG_SEARCH , 3, 80, 8, 14, 24, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1500 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Flesh Clan", 6, 10, 8, 30, 45, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 50, 8, 4, 10, 0, 0, 0, 0, 40, MC_DEMON, 0 , 0 , 0, 3, 460 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Beige.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Stone Clan", 8, 12, 10, 40, 55, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 60, 8, 6, 12, 0, 0, 0, 0, 40, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 685 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Red.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Fire Clan", 10, 14, 12, 50, 65, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 70, 8, 8, 16, 0, 0, 0, 0, 45, MC_DEMON, RESIST_FIRE , IMUNE_FIRE , 0, 3, 906 },
{ 128, 1030, "Monsters\\GoatMace\\Goat%c.CL2", TRUE, "Monsters\\GoatMace\\Goat%c%i.WAV", FALSE, TRUE, "Monsters\\GoatMace\\Gray.TRN", { 12, 8, 12, 6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, "Night Clan", 12, 16, 14, 55, 70, AI_GOATMC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 80, 8, 10, 20, 15, 0, 30, 30, 50, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 1190 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\red.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Fiend", 2, 5, 3, 3, 6, AI_BAT, 0 , 0, 35, 5, 1, 6, 0, 0, 0, 0, 0, MC_ANIMAL, 0 , 0 , 0x4000, 6, 102 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, FALSE, NULL, { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Blink", 5, 9, 7, 12, 28, AI_BAT, 0 , 1, 45, 5, 1, 8, 0, 0, 0, 0, 15, MC_ANIMAL, 0 , 0 , 0x4000, 6, 340 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\grey.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Gloom", 7, 11, 9, 28, 36, AI_BAT, MFLAG_SEARCH , 2, 70, 5, 4, 12, 0, 0, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC | IMUNE_NULL_40, 0x4000, 6, 509 },
{ 96, 364, "Monsters\\Bat\\Bat%c.CL2", FALSE, "Monsters\\Bat\\Bat%c%i.WAV", FALSE, TRUE, "Monsters\\Bat\\orange.trn", { 9, 13, 10, 9, 13, 0 }, { 0, 0, 0, 0, 0, 0 }, "Familiar", 11, 15, 13, 20, 35, AI_BAT, MFLAG_SEARCH , 3, 50, 5, 4, 16, 0, 0, 0, 0, 35, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0x4000, 6, 448 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, FALSE, NULL, { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Flesh Clan", 6, 10, 8, 20, 35, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 0, 35, 13, 1, 7, 0, 0, 0, 0, 35, MC_DEMON, 0 , 0 , 0, 3, 448 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Beige.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Stone Clan", 8, 12, 10, 30, 40, AI_GOATBOW, MFLAG_CAN_OPEN_DOOR, 1, 40, 13, 2, 9, 0, 0, 0, 0, 35, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 645 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Red.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Fire Clan", 10, 14, 12, 40, 50, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 45, 13, 3, 11, 0, 0, 0, 0, 35, MC_DEMON, RESIST_FIRE , IMUNE_FIRE , 0, 3, 822 },
{ 128, 1040, "Monsters\\GoatBow\\GoatB%c.CL2", FALSE, "Monsters\\GoatBow\\GoatB%c%i.WAV", FALSE, TRUE, "Monsters\\GoatBow\\Gray.TRN", { 12, 8, 16, 6, 20, 0 }, { 3, 0, 0, 0, 0, 0 }, "Night Clan", 12, 16, 14, 50, 65, AI_GOATBOW, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 50, 13, 4, 13, 15, 0, 0, 0, 40, MC_DEMON, RESIST_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 3, 1092 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, FALSE, NULL, { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Acid Beast", 10, 14, 11, 40, 66, AI_ACID, 0 , 0, 40, 8, 4, 12, 25, 8, 0, 0, 30, MC_ANIMAL, IMUNE_ACID , IMUNE_MAGIC | IMUNE_ACID , 0, 3, 846 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidBlk.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Poison Spitter", 14, 18, 15, 60, 85, AI_ACID, 0 , 1, 45, 8, 4, 16, 25, 8, 0, 0, 30, MC_ANIMAL, IMUNE_ACID , IMUNE_MAGIC | IMUNE_ACID , 0, 3, 1248 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidB.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Pit Beast", 18, 22, 21, 80, 110, AI_ACID, 0 , 2, 55, 8, 8, 18, 35, 8, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | IMUNE_ACID , IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_ACID , 0, 3, 2060 },
{ 128, 716, "Monsters\\Acid\\Acid%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", TRUE, TRUE, "Monsters\\Acid\\AcidR.TRN", { 13, 8, 12, 8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, "Lava Maw", 22, 27, 25, 100, 150, AI_ACID, 0 , 3, 65, 8, 10, 20, 40, 8, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | IMUNE_FIRE | IMUNE_ACID , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_ACID , 0, 3, 2940 },
{ 160, 1010, "Monsters\\SKing\\SKing%c.CL2", TRUE, "Monsters\\SKing\\SKing%c%i.WAV", TRUE, TRUE, "Monsters\\SkelAxe\\White.TRN", { 8, 6, 16, 6, 16, 6 }, { 2, 0, 0, 0, 0, 2 }, "Skeleton King", 6, 6, 9, 140, 140, AI_SKELKING, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 60, 8, 6, 16, 0, 0, 0, 0, 70, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0x8001, 7, 570 },
{ 128, 980, "Monsters\\FatC\\FatC%c.CL2", FALSE, "Monsters\\FatC\\FatC%c%i.WAV", FALSE, FALSE, NULL, { 10, 8, 12, 6, 16, 0 }, { 1, 0, 0, 0, 0, 0 }, "The Butcher", 0, 0, 1, 320, 320, AI_CLEAVER, 0 , 3, 50, 8, 6, 12, 0, 0, 0, 0, 50, MC_DEMON, RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0x8000, 3, 710 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Overlord", 8, 12, 10, 60, 80, AI_FAT, 0 , 0, 55, 8, 6, 12, 0, 0, 0, 0, 55, MC_DEMON, 0 , RESIST_FIRE , 0, 3, 635 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\Blue.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Mud Man", 13, 17, 14, 100, 125, AI_FAT, MFLAG_SEARCH , 1, 60, 8, 8, 16, 0, 0, 0, 0, 60, MC_DEMON, 0 , IMUNE_LIGHTNING , 0, 3, 1165 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\FatB.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Toad Demon", 15, 19, 16, 135, 160, AI_FAT, MFLAG_SEARCH , 2, 70, 8, 8, 16, 40, 0, 8, 20, 65, MC_DEMON, IMUNE_MAGIC , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 3, 1380 },
{ 128, 1130, "Monsters\\Fat\\Fat%c.CL2", TRUE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, TRUE, "Monsters\\Fat\\FatF.TRN", { 8, 10, 15, 6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, "Flayed One", 19, 23, 20, 160, 200, AI_FAT, MFLAG_SEARCH , 3, 85, 8, 10, 20, 0, 0, 0, 0, 70, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 2058 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Wyrm", 9, 13, 11, 60, 90, AI_SKELSD, 0 , 0, 40, 8, 4, 10, 0, 0, 0, 0, 25, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC , 0, 3, 660 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Cave Slug", 11, 15, 13, 75, 110, AI_SKELSD, 0 , 1, 50, 8, 6, 13, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC , RESIST_MAGIC , 0, 3, 994 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Devil Wyrm", 13, 17, 15, 100, 140, AI_SKELSD, 0 , 2, 55, 8, 8, 16, 0, 0, 0, 0, 30, MC_ANIMAL, RESIST_MAGIC | RESIST_FIRE , RESIST_MAGIC | RESIST_FIRE , 0, 3, 1320 },
{ 160, 2420, "Monsters\\Worm\\Worm%c.CL2", FALSE, "Monsters\\Fat\\Fat%c%i.WAV", FALSE, FALSE, NULL, { 13, 13, 13, 11, 19, 0 }, { 0, 0, 0, 0, 0, 0 }, "Devourer", 15, 19, 17, 125, 200, AI_SKELSD, 0 , 3, 60, 8, 10, 20, 0, 0, 0, 0, 35, MC_ANIMAL, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 3, 1827 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, FALSE, NULL, { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Magma Demon", 14, 17, 13, 50, 70, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 45, 4, 2, 10, 50, 13, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1076 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Yellow.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Blood Stone", 15, 19, 14, 55, 75, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 50, 4, 2, 12, 50, 14, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1309 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Blue.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Hell Stone", 16, 20, 16, 60, 80, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 60, 4, 2, 20, 60, 14, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 1680 },
{ 128, 1680, "Monsters\\Magma\\Magma%c.CL2", TRUE, "Monsters\\Magma\\Magma%c%i.WAV", TRUE, TRUE, "Monsters\\Magma\\Wierd.TRN", { 8, 10, 14, 7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, "Lava Lord", 17, 21, 18, 70, 85, AI_MAGMA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 75, 4, 4, 24, 60, 14, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 2124 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, FALSE, NULL, { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Horned Demon", 12, 16, 13, 40, 80, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 60, 7, 2, 16, 100, 0, 5, 32, 40, MC_ANIMAL, 0 , RESIST_FIRE , 0, 7, 1172 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\Orange.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Mud Runner", 14, 18, 15, 50, 90, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 70, 7, 6, 18, 100, 0, 12, 36, 45, MC_ANIMAL, 0 , RESIST_FIRE , 0, 7, 1404 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\Blue.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Frost Charger", 16, 20, 17, 60, 100, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 8, 20, 100, 0, 20, 40, 50, MC_ANIMAL, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 7, 1720 },
{ 160, 1630, "Monsters\\Rhino\\Rhino%c.CL2", TRUE, "Monsters\\Rhino\\Rhino%c%i.WAV", TRUE, TRUE, "Monsters\\Rhino\\RhinoB.TRN", { 8, 8, 14, 6, 16, 6 }, { 2, 0, 0, 0, 0, 0 }, "Obsidian Lord", 18, 22, 19, 70, 110, AI_RHINO, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 7, 10, 22, 100, 0, 20, 50, 55, MC_ANIMAL, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0, 7, 1809 },
{ 128, 1740, "Monsters\\Demskel\\Demskl%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, FALSE, "Monsters\\Thin\\Thinv3.TRN", { 10, 8, 20, 6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, "Bone Demon", 10, 14, 12, 70, 70, AI_STORM, 0 , 0, 60, 8, 6, 14, 12, 0, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_NULL_40, 0, 7, 1344 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Red Death", 14, 18, 16, 96, 96, AI_STORM, 0 , 1, 75, 5, 10, 20, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 2168 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Litch Demon", 16, 20, 18, 110, 110, AI_STORM, 0 , 2, 80, 5, 10, 24, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 2736 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Undead Balrog", 20, 24, 22, 130, 130, AI_STORM, 0 , 3, 85, 5, 12, 30, 0, 0, 0, 0, 65, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3575 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Incinerator", 14, 18, 16, 30, 45, AI_FIREMAN, 0 , 0, 75, 8, 8, 16, 0, 0, 0, 0, 25, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 1888 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Flame Lord", 16, 20, 18, 40, 55, AI_FIREMAN, 0 , 1, 75, 8, 10, 20, 0, 0, 0, 0, 25, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 3, 2250 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Doom Fire", 18, 22, 20, 50, 65, AI_FIREMAN, 0 , 2, 80, 8, 12, 24, 0, 0, 0, 0, 30, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 2740 },
{ 128, 1460, "Monsters\\Fireman\\FireM%c.CL2", TRUE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 14, 19, 20, 8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, "Hell Burner", 20, 24, 22, 60, 80, AI_FIREMAN, 0 , 3, 85, 8, 15, 30, 0, 0, 0, 0, 30, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 3355 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv3.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Red Storm", 17, 21, 18, 55, 110, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 80, 5, 8, 18, 75, 8, 4, 16, 30, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2160 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, FALSE, NULL, { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Storm Rider", 19, 23, 20, 60, 120, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 80, 5, 8, 18, 80, 8, 4, 16, 30, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2391 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE, TRUE, "Monsters\\Thin\\Thinv2.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Storm Lord", 21, 25, 22, 75, 135, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 85, 5, 12, 24, 75, 8, 4, 16, 35, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_LIGHTNING , 0, 7, 2775 },
{ 160, 1740, "Monsters\\Thin\\Thin%c.CL2", TRUE, "Monsters\\Thin\\Thin%c%i.WAV", TRUE , TRUE, "Monsters\\Thin\\Thinv1.TRN", { 8, 8, 18, 4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, "Maelstorm", 23, 27, 24, 90, 150, AI_STORM, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 90, 5, 12, 28, 75, 8, 4, 16, 40, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 3177 },
{ 128, 1650, "Monsters\\BigFall\\Fallg%c.CL2", TRUE, "Monsters\\BigFall\\Bfal%c%i.WAV", FALSE, FALSE, NULL, { 10, 8, 11, 8, 17, 0 }, { 0, 0, 0, 0, 2, 2 }, "Devil Kin Brute", 20, 20, 24, 160, 220, AI_SKELSD, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 100, 6, 18, 24, 0, 0, 0, 0, 75, MC_ANIMAL, 0 , 0 , 0, 6, 2000 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, FALSE, NULL, { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, "Winged-Demon", 8, 12, 9, 45, 60, AI_GARG, MFLAG_CAN_OPEN_DOOR, 0, 50, 7, 10, 16, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 6, 662 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GarE.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, "Gargoyle", 12, 16, 13, 60, 90, AI_GARG, MFLAG_CAN_OPEN_DOOR, 1, 65, 7, 10, 16, 0, 0, 0, 0, 45, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 6, 1205 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GargBr.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, "Blood Claw", 16, 20, 19, 75, 125, AI_GARG, MFLAG_CAN_OPEN_DOOR, 2, 80, 7, 14, 22, 0, 0, 0, 0, 50, MC_DEMON, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 6, 1873 },
{ 160, 1650, "Monsters\\Gargoyle\\Gargo%c.CL2", TRUE, "Monsters\\Gargoyle\\Gargo%c%i.WAV", FALSE, TRUE, "Monsters\\Gargoyle\\GargB.TRN", { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, "Death Wing", 18, 22, 23, 90, 150, AI_GARG, MFLAG_CAN_OPEN_DOOR, 3, 95, 7, 16, 28, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 6, 2278 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, FALSE, NULL, { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Slayer", 19, 23, 20, 120, 140, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 0, 100, 8, 12, 20, 0, 3, 0, 0, 60, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , RESIST_MAGIC | IMUNE_FIRE , 0, 7, 2300 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Guard.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Guardian", 21, 25, 22, 140, 160, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 1, 110, 8, 14, 22, 0, 3, 0, 0, 65, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE , RESIST_MAGIC | IMUNE_FIRE , 0, 7, 2714 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Vtexl.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Vortex Lord", 23, 26, 24, 160, 180, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 120, 8, 18, 24, 0, 3, 0, 0, 70, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3252 },
{ 160, 2220, "Monsters\\Mega\\Mega%c.CL2", TRUE, "Monsters\\Mega\\Mega%c%i.WAV", TRUE, TRUE, "Monsters\\Mega\\Balr.TRN", { 6, 7, 14, 1, 24, 5 }, { 3, 0, 0, 0, 2, 0 }, "Balrog", 25, 29, 26, 180, 200, AI_MEGA, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 130, 8, 22, 30, 0, 3, 0, 0, 75, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 3643 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, FALSE, NULL, { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Cave Viper", 20, 24, 21, 100, 150, AI_SNAKE, MFLAG_SEARCH , 0, 90, 8, 8, 20, 0, 0, 0, 0, 60, MC_DEMON, IMUNE_MAGIC , IMUNE_MAGIC , 0, 7, 2725 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\SnakR.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Fire Drake", 22, 26, 23, 120, 170, AI_SNAKE, MFLAG_SEARCH , 1, 105, 8, 12, 24, 0, 0, 0, 0, 65, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE , IMUNE_MAGIC | IMUNE_FIRE , 0, 7, 3139 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\Snakg.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Gold Viper", 24, 27, 25, 140, 180, AI_SNAKE, MFLAG_SEARCH , 2, 120, 8, 15, 26, 0, 0, 0, 0, 70, MC_DEMON, IMUNE_MAGIC | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_LIGHTNING , 0, 7, 3540 },
{ 160, 1270, "Monsters\\Snake\\Snake%c.CL2", FALSE, "Monsters\\Snake\\Snake%c%i.WAV", FALSE, TRUE, "Monsters\\Snake\\Snakb.TRN", { 12, 11, 13, 5, 18, 0 }, { 2, 0, 0, 0, 1, 0 }, "Azure Drake", 28, 30, 27, 160, 200, AI_SNAKE, MFLAG_SEARCH , 3, 130, 8, 18, 30, 0, 0, 0, 0, 75, MC_DEMON, RESIST_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING , 0, 7, 3791 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, FALSE, NULL, { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Black Knight", 23, 27, 24, 150, 150, AI_SKELSD, MFLAG_SEARCH , 0, 110, 8, 15, 20, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 3360 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntRT.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Doom Guard", 25, 29, 26, 165, 165, AI_SKELSD, MFLAG_SEARCH , 0, 130, 8, 18, 25, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 7, 3650 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntBT.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Steel Lord", 27, 30, 28, 180, 180, AI_SKELSD, MFLAG_SEARCH , 1, 120, 8, 20, 30, 0, 0, 0, 0, 80, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 4252 },
{ 160, 2120, "Monsters\\Black\\Black%c.CL2", FALSE, "Monsters\\Black\\Black%c%i.WAV", FALSE, TRUE, "Monsters\\Black\\BlkKntBe.TRN", { 8, 8, 16, 4, 24, 0 }, { 2, 0, 0, 0, 0, 0 }, "Blood Knight", 24, 26, 30, 200, 200, AI_SKELSD, MFLAG_SEARCH , 1, 130, 8, 25, 35, 0, 0, 0, 0, 85, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 5130 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Unraveler", 26, 28, 25, 70, 150, AI_SKELSD, 0 , 0, 75, 7, 10, 20, 0, 0, 0, 0, 70, MC_UNDEAD, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 3, 3812 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Hollow One", 28, 30, 27, 135, 240, AI_SKELSD, 0 , 1, 75, 7, 12, 24, 0, 0, 0, 0, 75, MC_UNDEAD, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 4374 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Pain Master", 27, 30, 29, 110, 200, AI_SKELSD, 0 , 2, 80, 7, 16, 30, 0, 0, 0, 0, 80, MC_UNDEAD, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 5147 },
{ 96, 484, "Monsters\\Unrav\\Unrav%c.CL2", FALSE, "Monsters\\Acid\\Acid%c%i.WAV", FALSE, FALSE, NULL, { 10, 10, 12, 5, 16, 0 }, { 0, 0, 0, 0, 0, 0 }, "Reality Weaver", 28, 30, 30, 135, 240, AI_SKELSD, 0 , 3, 85, 7, 20, 35, 0, 0, 0, 0, 85, MC_UNDEAD, RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, RESIST_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 3, 5925 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, FALSE, NULL, { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Succubus", 22, 26, 24, 120, 150, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 0, 100, 10, 1, 20, 0, 0, 0, 0, 60, MC_DEMON, RESIST_MAGIC , IMUNE_MAGIC | RESIST_FIRE , 0, 3, 3696 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succb.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Snow Witch", 25, 28, 26, 135, 175, AI_SUCC, MFLAG_CAN_OPEN_DOOR, 1, 110, 10, 1, 24, 0, 0, 0, 0, 65, MC_DEMON, RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 3, 4084 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succrw.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Hell Spawn", 27, 30, 28, 150, 200, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 2, 115, 10, 1, 30, 0, 0, 0, 0, 75, MC_DEMON, RESIST_MAGIC | IMUNE_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 0, 3, 4480 },
{ 128, 980, "Monsters\\Succ\\Scbs%c.CL2", FALSE, "Monsters\\Succ\\Scbs%c%i.WAV", FALSE, TRUE, "Monsters\\Succ\\Succbw.TRN", { 14, 8, 16, 7, 24, 0 }, { 0, 0, 0, 0, 0, 0 }, "Soul Burner", 28, 30, 30, 140, 225, AI_SUCC, MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 120, 10, 1, 35, 0, 0, 0, 0, 85, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 0, 3, 4644 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, FALSE, NULL, { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Counselor", 24, 26, 25, 70, 70, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 0, 90, 8, 8, 20, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 0, 7, 4070 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselg.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Magistrate", 26, 28, 27, 85, 85, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 1, 100, 8, 10, 24, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 4478 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselgd.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Cabalist", 28, 30, 29, 120, 120, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 2, 110, 8, 14, 30, 0, 0, 0, 0, 0, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4929 },
{ 128, 2000, "Monsters\\Mage\\Mage%c.CL2", TRUE, "Monsters\\Mage\\Mage%c%i.WAV", FALSE, TRUE, "Monsters\\Mage\\Cnselbk.TRN", { 12, 1, 20, 8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, "Advocate", 30, 30, 30, 145, 145, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 15, 25, 0, 0, 0, 0, 0, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4968 },
{ 96, 386, "Monsters\\Golem\\Golem%c.CL2", TRUE, "Monsters\\Golem\\Golm%c%i.WAV", FALSE, FALSE, NULL, { 0, 16, 12, 0, 12, 20 }, { 0, 0, 0, 0, 0, 0 }, "Golem", 0, 0, 12, 1, 1, AI_GOLUM, MFLAG_CAN_OPEN_DOOR, 0, 0, 7, 1, 1, 0, 0, 0, 0, 1, MC_DEMON, 0 , 0 , 0, 0, 0 },
{ 160, 2000, "Monsters\\Diablo\\Diablo%c.CL2", TRUE, "Monsters\\Diablo\\Diablo%c%i.WAV", TRUE, FALSE, NULL, { 16, 6, 16, 6, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, "The Dark Lord", 50, 50, 30, 1666, 1666, AI_DIABLO, MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR, 3, 220, 4, 30, 60, 0, 11, 0, 0, 70, MC_DEMON, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 7, 31666 },
{ 128, 1060, "Monsters\\DarkMage\\Dmage%c.CL2", TRUE, "Monsters\\DarkMage\\Dmag%c%i.WAV", FALSE, FALSE, NULL, { 6, 1, 21, 6, 23, 18 }, { 0, 0, 0, 0, 0, 0 }, "The Arch-Litch Malignus", 30, 30, 30, 160, 160, AI_COUNSLR, MFLAG_CAN_OPEN_DOOR, 3, 120, 8, 20, 40, 0, 0, 0, 0, 70, MC_DEMON, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 7, 4968 }
// clang-format on
};
char MonstConvTbl[128] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 29, 30,
31, 32, 34, 35, 36, 37, 38, 40, 39, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 52,
53, 54, 55, 56, 57, 59, 58, 60, 61, 62,
63, 64, 65, 66, 67, 68, 69, 70, 71, 0,
0, 0, 0, 72, 73, 74, 75, 0, 0, 0,
0, 77, 76, 78, 79, 81, 82, 83, 84, 85,
86, 87, 88, 89, 90, 92, 91, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 0, 110, 0, 109, 0, 0, 0,
0, 0, 0, 0, 0, 0, 80, 111
};
BYTE MonstAvailTbl[112] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 2,
2, 2, 2, 0, 2, 2, 2, 2, 1, 1,
1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
0, 0, 2, 2, 2, 2, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
0, 0, 0, 0, 0, 0, 2, 2, 2, 2,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 0, 0, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 0
};
UniqMonstStruct UniqMonst[98] = {
// clang-format off
// mtype, mName, mTrnName, mlevel, mmaxhp, mAi, mint, mMinDamage, mMaxDamage, mMagicRes, mUnqAttr, mUnqVar1, mUnqVar2, mtalkmsg
{ MT_NGOATMC, "Gharbad the Weak", "BSDB", 4, 120, AI_GARBUD, 3, 8, 16, IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_GARBUD1 },
{ MT_SKING, "Skeleton King", "GENRL", 0, 240, AI_SKELKING, 3, 6, 16, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 1, 0, 0, 0 },
{ MT_COUNSLR, "Zhar the Mad", "GENERAL", 8, 360, AI_ZHAR, 3, 16, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 0, 0, 0, QUEST_ZHAR1 },
{ MT_BFALLSP, "Snotspill", "BNG", 4, 220, AI_SNOTSPIL, 3, 10, 18, RESIST_LIGHTNING , 0, 0, 0, QUEST_BANNER10 },
{ MT_ADVOCATE, "Arch-Bishop Lazarus", "GENERAL", 0, 600, AI_LAZURUS, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_HLSPWN, "Red Vex", "REDV", 0, 400, AI_LAZHELP, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_HLSPWN, "BlackJade", "BLKJD", 0, 400, AI_LAZHELP, 3, 30, 50, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_VILE13 },
{ MT_RBLACK, "Lachdanan", "BHKA", 14, 500, AI_LACHDAN, 3, 0, 0, 0 , 0, 0, 0, QUEST_VEIL9 },
{ MT_BTBLACK, "Warlord of Blood", "GENERAL", 13, 850, AI_WARLORD, 3, 35, 50, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, QUEST_WARLRD9 },
{ MT_CLEAVER, "The Butcher", "GENRL", 0, 220, AI_CLEAVER, 3, 6, 12, RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_TSKELAX, "Bonehead Keenaxe", "BHKA", 2, 91, AI_SKELSD, 2, 4, 10, IMUNE_MAGIC | IMUNE_NULL_40, 7, 100, 0, 0 },
{ MT_RFALLSD, "Bladeskin the Slasher", "BSTS", 2, 51, AI_FALLEN, 0, 6, 18, RESIST_FIRE , 11, 45, 0, 0 },
{ MT_NZOMBIE, "Soulpus", "GENERAL", 2, 133, AI_ZOMBIE, 0, 4, 8, RESIST_FIRE | RESIST_LIGHTNING , 0, 0, 0, 0 },
{ MT_RFALLSP, "Pukerat the Unclean", "PTU", 2, 77, AI_FALLEN, 3, 1, 5, RESIST_FIRE , 0, 0, 0, 0 },
{ MT_WSKELAX, "Boneripper", "BR", 2, 54, AI_BAT, 0, 6, 15, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NZOMBIE, "Rotfeast the Hungry", "ETH", 2, 85, AI_SKELSD, 3, 4, 12, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_DFALLSD, "Gutshank the Quick", "GTQ", 3, 66, AI_BAT, 2, 6, 16, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_TSKELSD, "Brokenhead Bangshield", "BHBS", 3, 108, AI_SKELSD, 3, 12, 20, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_YFALLSP, "Bongo", "BNG", 3, 178, AI_FALLEN, 3, 9, 21, 0 , 3, 0, 0, 0 },
{ MT_BZOMBIE, "Rotcarnage", "RCRN", 3, 102, AI_ZOMBIE, 3, 9, 24, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 11, 45, 0, 0 },
{ MT_NSCAV, "Shadowbite", "SHBT", 2, 60, AI_SKELSD, 3, 3, 20, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_WSKELBW, "Deadeye", "DE", 2, 49, AI_GOATBOW, 0, 6, 9, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RSKELAX, "Madeye the Dead", "MTD", 4, 75, AI_BAT, 0, 9, 21, IMUNE_MAGIC | IMUNE_FIRE , 11, 30, 0, 0 },
{ MT_BSCAV, "El Chupacabras", "GENERAL", 3, 120, AI_GOATMC, 0, 10, 18, RESIST_FIRE , 3, 30, 0, 0 },
{ MT_TSKELBW, "Skullfire", "SKFR", 3, 125, AI_GOATBOW, 1, 6, 10, IMUNE_FIRE , 0, 100, 0, 0 },
{ MT_SNEAK, "Warpskull", "TSPO", 3, 117, AI_SNEAK, 2, 6, 18, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_GZOMBIE, "Goretongue", "PMR", 3, 156, AI_SKELSD, 1, 15, 30, IMUNE_MAGIC | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_WSCAV, "Pulsecrawler", "BHKA", 4, 150, AI_SCAV, 0, 16, 20, IMUNE_FIRE | RESIST_LIGHTNING , 11, 45, 0, 0 },
{ MT_BLINK, "Moonbender", "GENERAL", 4, 135, AI_BAT, 0, 9, 27, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BLINK, "Wrathraven", "GENERAL", 5, 135, AI_BAT, 2, 9, 22, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_YSCAV, "Spineeater", "GENERAL", 4, 180, AI_SCAV, 1, 18, 25, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSKELBW, "Blackash the Burning", "BASHTB", 4, 120, AI_GOATBOW, 0, 6, 16, IMUNE_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BFALLSD, "Shadowcrow", "GENERAL", 5, 270, AI_SNEAK, 2, 12, 25, 0 , 3, 0, 0, 0 },
{ MT_LRDSAYTR, "Blightstone the Weak", "BHKA", 4, 360, AI_SKELSD, 0, 4, 12, IMUNE_MAGIC | RESIST_LIGHTNING , 7, 70, 0, 0 },
{ MT_FAT, "Bilefroth the Pit Master", "BFTP", 6, 210, AI_BAT, 1, 16, 23, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_NGOATBW, "Bloodskin Darkbow", "BSDB", 5, 207, AI_GOATBOW, 0, 3, 16, RESIST_FIRE | RESIST_LIGHTNING , 11, 55, 0, 0 },
{ MT_GLOOM, "Foulwing", "DB", 5, 246, AI_RHINO, 3, 12, 28, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_XSKELSD, "Shadowdrinker", "SHDR", 5, 300, AI_SNEAK, 1, 18, 26, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 8, 45, 0, 0 },
{ MT_UNSEEN, "Hazeshifter", "BHKA", 5, 285, AI_SNEAK, 3, 18, 30, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NACID, "Deathspit", "BFDS", 6, 303, AI_ACIDUNIQ, 0, 12, 32, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_RGOATMC, "Bloodgutter", "BGBL", 6, 315, AI_BAT, 1, 24, 34, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_BGOATMC, "Deathshade Fleshmaul", "DSFM", 6, 276, AI_RHINO, 0, 12, 24, IMUNE_MAGIC | RESIST_FIRE , 8, 65, 0, 0 },
{ MT_WYRM, "Warmaggot the Mad", "GENERAL", 6, 246, AI_BAT, 3, 15, 30, RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_STORM, "Glasskull the Jagged", "BHKA", 7, 354, AI_STORM, 0, 18, 30, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RGOATBW, "Blightfire", "BLF", 7, 321, AI_SUCC, 2, 13, 21, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_GARGOYLE, "Nightwing the Cold", "GENERAL", 7, 342, AI_BAT, 1, 18, 26, IMUNE_MAGIC | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_GGOATBW, "Gorestone", "GENERAL", 7, 303, AI_GOATBOW, 1, 15, 28, RESIST_LIGHTNING | IMUNE_NULL_40, 7, 70, 0, 0 },
{ MT_BMAGMA, "Bronzefist Firestone", "GENERAL", 8, 360, AI_MAGMA, 0, 30, 36, IMUNE_MAGIC | RESIST_FIRE , 3, 0, 0, 0 },
{ MT_INCIN, "Wrathfire the Doomed", "WFTD", 8, 270, AI_SKELSD, 2, 20, 30, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_NMAGMA, "Firewound the Grim", "BHKA", 8, 303, AI_MAGMA, 0, 18, 22, IMUNE_MAGIC | RESIST_FIRE , 3, 0, 0, 0 },
{ MT_MUDMAN, "Baron Sludge", "BSM", 8, 315, AI_SNEAK, 3, 25, 34, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 11, 75, 0, 0 },
{ MT_GGOATMC, "Blighthorn Steelmace", "BHSM", 7, 250, AI_RHINO, 0, 20, 28, RESIST_LIGHTNING , 11, 45, 0, 0 },
{ MT_RACID, "Chaoshowler", "GENERAL", 8, 240, AI_ACIDUNIQ, 0, 12, 20, 0 , 3, 0, 0, 0 },
{ MT_REDDTH, "Doomgrin the Rotting", "GENERAL", 8, 405, AI_STORM, 3, 25, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_FLAMLRD, "Madburner", "GENERAL", 9, 270, AI_STORM, 0, 20, 40, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_LTCHDMN, "Bonesaw the Litch", "GENERAL", 9, 495, AI_STORM, 2, 30, 55, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_MUDRUN, "Breakspine", "GENERAL", 9, 351, AI_RHINO, 0, 25, 34, RESIST_FIRE , 3, 0, 0, 0 },
{ MT_REDDTH, "Devilskull Sharpbone", "GENERAL", 9, 444, AI_STORM, 1, 25, 40, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_STORM, "Brokenstorm", "GENERAL", 9, 411, AI_STORM, 2, 25, 36, IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_RSTORM, "Stormbane", "GENERAL", 9, 555, AI_STORM, 3, 30, 30, IMUNE_LIGHTNING , 3, 0, 0, 0 },
{ MT_TOAD, "Oozedrool", "GENERAL", 9, 483, AI_FAT, 3, 25, 30, RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BLOODCLW, "Goldblight of the Flame", "GENERAL", 10, 405, AI_GARG, 0, 15, 35, IMUNE_MAGIC | IMUNE_FIRE , 11, 80, 0, 0 },
{ MT_OBLORD, "Blackstorm", "GENERAL", 10, 525, AI_RHINO, 3, 20, 40, IMUNE_MAGIC | IMUNE_LIGHTNING , 11, 90, 0, 0 },
{ MT_RACID, "Plaguewrath", "GENERAL", 10, 450, AI_ACIDUNIQ, 2, 20, 30, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSTORM, "The Flayer", "GENERAL", 10, 501, AI_STORM, 1, 20, 35, RESIST_MAGIC | RESIST_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_FROSTC, "Bluehorn", "GENERAL", 11, 477, AI_RHINO, 1, 25, 30, IMUNE_MAGIC | RESIST_FIRE , 11, 90, 0, 0 },
{ MT_HELLBURN, "Warpfire Hellspawn", "GENERAL", 11, 525, AI_FIREMAN, 3, 10, 40, RESIST_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_NSNAKE, "Fangspeir", "GENERAL", 11, 444, AI_SKELSD, 1, 15, 32, IMUNE_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_UDEDBLRG, "Festerskull", "GENERAL", 11, 600, AI_STORM, 2, 15, 30, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_NBLACK, "Lionskull the Bent", "GENERAL", 12, 525, AI_SKELSD, 2, 25, 25, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_COUNSLR, "Blacktongue", "GENERAL", 12, 360, AI_COUNSLR, 3, 15, 30, RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_DEATHW, "Viletouch", "GENERAL", 12, 525, AI_GARG, 3, 20, 40, IMUNE_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RSNAKE, "Viperflame", "GENERAL", 12, 570, AI_SKELSD, 1, 25, 35, IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BSNAKE, "Fangskin", "BHKA", 14, 681, AI_SKELSD, 2, 15, 50, IMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_SUCCUBUS, "Witchfire the Unholy", "GENERAL", 12, 444, AI_SUCC, 3, 10, 20, IMUNE_MAGIC | IMUNE_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_BALROG, "Blackskull", "BHKA", 13, 750, AI_SKELSD, 3, 25, 40, IMUNE_MAGIC | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_UNRAV, "Soulslash", "GENERAL", 12, 450, AI_SKELSD, 0, 25, 25, IMUNE_MAGIC | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_VTEXLRD, "Windspawn", "GENERAL", 12, 711, AI_SKELSD, 1, 35, 40, IMUNE_MAGIC | IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_GSNAKE, "Lord of the Pit", "GENERAL", 13, 762, AI_SKELSD, 2, 25, 42, RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_RTBLACK, "Rustweaver", "GENERAL", 13, 400, AI_SKELSD, 3, 1, 60, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_HOLOWONE, "Howlingire the Shade", "GENERAL", 13, 450, AI_SKELSD, 2, 40, 75, RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_MAEL, "Doomcloud", "GENERAL", 13, 612, AI_STORM, 1, 1, 60, RESIST_FIRE | IMUNE_LIGHTNING , 0, 0, 0, 0 },
{ MT_PAINMSTR, "Bloodmoon Soulfire", "GENERAL", 13, 684, AI_SKELSD, 1, 15, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_SNOWWICH, "Witchmoon", "GENERAL", 13, 310, AI_SUCC, 3, 30, 40, RESIST_LIGHTNING , 0, 0, 0, 0 },
{ MT_VTEXLRD, "Gorefeast", "GENERAL", 13, 771, AI_SKELSD, 3, 20, 55, RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RTBLACK, "Graywar the Slayer", "GENERAL", 14, 672, AI_SKELSD, 1, 30, 50, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_MAGISTR, "Dreadjudge", "GENERAL", 14, 540, AI_COUNSLR, 1, 30, 40, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING , 3, 0, 0, 0 },
{ MT_HLSPWN, "Stareye the Witch", "GENERAL", 14, 726, AI_SUCC, 2, 30, 50, IMUNE_FIRE , 0, 0, 0, 0 },
{ MT_BTBLACK, "Steelskull the Hunter", "GENERAL", 14, 831, AI_SKELSD, 3, 40, 50, RESIST_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_RBLACK, "Sir Gorash", "GENERAL", 16, 1050, AI_SKELSD, 1, 20, 60, IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_CABALIST, "The Vizier", "GENERAL", 15, 850, AI_COUNSLR, 2, 25, 40, IMUNE_FIRE , 3, 0, 0, 0 },
{ MT_REALWEAV, "Zamphir", "GENERAL", 15, 891, AI_SKELSD, 2, 30, 50, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_HLSPWN, "Bloodlust", "GENERAL", 15, 825, AI_SUCC, 1, 20, 55, IMUNE_MAGIC | IMUNE_LIGHTNING | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_HLSPWN, "Webwidow", "GENERAL", 16, 774, AI_SUCC, 1, 20, 50, IMUNE_MAGIC | IMUNE_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_SOLBRNR, "Fleshdancer", "GENERAL", 16, 999, AI_SUCC, 3, 30, 50, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 0, 0, 0, 0 },
{ MT_OBLORD, "Grimspike", "GENERAL", 19, 534, AI_SNEAK, 1, 25, 40, IMUNE_MAGIC | RESIST_FIRE | IMUNE_NULL_40, 3, 0, 0, 0 },
{ MT_STORML, "Doomlock", "GENERAL", 28, 534, AI_SNEAK, 1, 35, 55, IMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMUNE_NULL_40, 3, 0, 0, 0 },
{ -1, NULL, NULL, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0 }
// clang-format on
};

2
Source/monstdat.h

@ -4,7 +4,7 @@
extern MonsterData monsterdata[112];
extern char MonstConvTbl[128];
extern unsigned char MonstAvailTbl[112];
extern BYTE MonstAvailTbl[112];
extern UniqMonstStruct UniqMonst[98];
#endif /* __MONSTDAT_H__ */

23
Source/monster.cpp

@ -13,7 +13,7 @@ BOOLEAN sgbSaveSoundOn;
MonsterStruct monster[MAXMONSTERS];
int totalmonsters;
CMonster Monsters[16];
// int END_Monsters_17; // weak
// int END_Monsters_17;
int monstimgtot;
int uniquetrans;
int nummtypes;
@ -998,9 +998,8 @@ void InitMonsters()
void PlaceUniques()
{
int u;
int u, mt;
BOOL done;
int mt;
for (u = 0; UniqMonst[u].mtype != -1; u++) {
if (UniqMonst[u].mlevel != currlevel)
@ -1027,7 +1026,7 @@ void PlaceUniques()
}
}
void SetMapMonsters(unsigned char *pMap, int startx, int starty)
void SetMapMonsters(BYTE *pMap, int startx, int starty)
{
WORD rw, rh;
WORD *lm;
@ -2146,7 +2145,7 @@ void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam)
StartPlrHit(pnum, dam, 0);
if (monster[i]._mFlags & MFLAG_KNOCKBACK) {
if (plr[pnum]._pmode != PM_GOTHIT)
StartPlrHit(pnum, 0, 1u);
StartPlrHit(pnum, 0, TRUE);
newx = plr[pnum].WorldX + offset_x[monster[i]._mdir];
newy = plr[pnum].WorldY + offset_y[monster[i]._mdir];
if (PosOkPlayer(pnum, newx, newy)) {
@ -3577,17 +3576,17 @@ void MAI_Ranged(int i, int missile_type, BOOL special)
void MAI_GoatBow(int i)
{
MAI_Ranged(i, MIS_ARROW, 0);
MAI_Ranged(i, MIS_ARROW, FALSE);
}
void MAI_Succ(int i)
{
MAI_Ranged(i, MIS_FLARE, 0);
MAI_Ranged(i, MIS_FLARE, FALSE);
}
void MAI_AcidUniq(int i)
{
MAI_Ranged(i, MIS_ACID, 1u);
MAI_Ranged(i, MIS_ACID, TRUE);
}
void MAI_Scav(int i)
@ -3784,22 +3783,22 @@ void MAI_RoundRanged(int i, int missile_type, BOOL checkdoors, int dam, int less
void MAI_Magma(int i)
{
MAI_RoundRanged(i, MIS_MAGMABALL, 1u, 4, 0);
MAI_RoundRanged(i, MIS_MAGMABALL, TRUE, 4, 0);
}
void MAI_Storm(int i)
{
MAI_RoundRanged(i, MIS_LIGHTCTRL2, 1u, 4, 0);
MAI_RoundRanged(i, MIS_LIGHTCTRL2, TRUE, 4, 0);
}
void MAI_Acid(int i)
{
MAI_RoundRanged(i, MIS_ACID, 0, 4, 1);
MAI_RoundRanged(i, MIS_ACID, FALSE, 4, 1);
}
void MAI_Diablo(int i)
{
MAI_RoundRanged(i, MIS_DIABAPOCA, 0, 40, 0);
MAI_RoundRanged(i, MIS_DIABAPOCA, FALSE, 40, 0);
}
void MAI_RR2(int i, int mistype, int dam)

6
Source/monster.h

@ -9,7 +9,7 @@ extern int nummonsters;
extern MonsterStruct monster[MAXMONSTERS];
extern int totalmonsters;
extern CMonster Monsters[16];
// int END_Monsters_17; // weak
// int END_Monsters_17;
extern int monstimgtot;
extern int uniquetrans;
extern int nummtypes;
@ -30,7 +30,7 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader);
void LoadDiabMonsts();
void InitMonsters();
void PlaceUniques();
void SetMapMonsters(unsigned char *pMap, int startx, int starty);
void SetMapMonsters(BYTE *pMap, int startx, int starty);
void DeleteMonster(int i);
int AddMonster(int x, int y, int dir, int mtype, BOOL InMap);
void NewMonsterAnim(int i, AnimStruct *anim, int md);
@ -163,7 +163,7 @@ void decode_enemy(int m, int enemy);
/* rdata */
extern const char plr2monst[9];
extern const unsigned char counsmiss[4];
extern const BYTE counsmiss[4];
/* data */

2
Source/mpqapi.cpp

@ -397,7 +397,7 @@ int mpqapi_find_free_block(int size, int *block_size)
pBlockTbl->sizealloc -= size;
if (!pBlockTbl->sizealloc)
memset(pBlockTbl, 0, 0x10u);
memset(pBlockTbl, 0, sizeof(*pBlockTbl));
return result;
}

32
Source/multi.cpp

@ -24,7 +24,7 @@ char byte_678640;
int sglTimeoutStart;
int sgdwPlayerLeftReasonTbl[MAX_PLRS];
TBuffer sgLoPriBuf;
unsigned int sgdwGameLoops;
DWORD sgdwGameLoops;
BYTE gbMaxPlayers;
BOOLEAN sgbTimeout;
char szPlayerName[128];
@ -154,13 +154,13 @@ void NetSendHiPri(BYTE *pbMsg, BYTE bLen)
}
}
BYTE *multi_recv_packet(TBuffer *packet, BYTE *body, int *size)
BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size)
{
BYTE *src_ptr;
size_t chunk_size;
if (packet->dwNextWriteOffset != 0) {
src_ptr = packet->bData;
if (pBuf->dwNextWriteOffset != 0) {
src_ptr = pBuf->bData;
while (TRUE) {
if (*src_ptr == 0)
break;
@ -173,14 +173,14 @@ BYTE *multi_recv_packet(TBuffer *packet, BYTE *body, int *size)
src_ptr += chunk_size;
*size -= chunk_size;
}
memcpy(packet->bData, src_ptr, (packet->bData - src_ptr) + packet->dwNextWriteOffset + 1);
packet->dwNextWriteOffset += (packet->bData - src_ptr);
memcpy(pBuf->bData, src_ptr, (pBuf->bData - src_ptr) + pBuf->dwNextWriteOffset + 1);
pBuf->dwNextWriteOffset += (pBuf->bData - src_ptr);
return body;
}
return body;
}
void multi_send_msg_packet(int pmask, BYTE *a2, BYTE len)
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len)
{
DWORD v, p, t;
TPkt pkt;
@ -188,7 +188,7 @@ void multi_send_msg_packet(int pmask, BYTE *a2, BYTE len)
NetRecvPlrData(&pkt);
t = len + 19;
pkt.hdr.wLen = t;
memcpy(pkt.body, a2, len);
memcpy(pkt.body, src, len);
for (v = 1, p = 0; p < MAX_PLRS; p++, v <<= 1) {
if (v & pmask) {
if (!SNetSendMessage(p, &pkt.hdr, t) && SErrGetLastError() != STORM_ERROR_INVALID_PLAYER) {
@ -340,9 +340,9 @@ int multi_handle_delta()
}
// Microsoft VisualC 2-11/net runtime
int multi_check_pkt_valid(TBuffer *a1)
int multi_check_pkt_valid(TBuffer *pBuf)
{
return a1->dwNextWriteOffset == 0;
return pBuf->dwNextWriteOffset == 0;
}
void multi_mon_seeds()
@ -533,12 +533,12 @@ void multi_process_tmsgs()
}
}
void multi_send_zero_packet(DWORD pnum, char a2, void *pbSrc, DWORD dwLen)
void multi_send_zero_packet(DWORD pnum, char identifier, void *pbSrc, DWORD dwLen)
{
DWORD v5, dwBody;
DWORD len, dwBody;
TPkt pkt;
int t;
v5 = 0;
len = 0;
while (dwLen) {
pkt.hdr.wCheck = 'ip';
pkt.hdr.px = 0;
@ -550,8 +550,8 @@ void multi_send_zero_packet(DWORD pnum, char a2, void *pbSrc, DWORD dwLen)
pkt.hdr.bstr = 0;
pkt.hdr.bmag = 0;
pkt.hdr.bdex = 0;
pkt.body[0] = a2;
*(WORD *)&pkt.body[1] = v5;
pkt.body[0] = identifier;
*(WORD *)&pkt.body[1] = len;
dwBody = gdwLargestMsgSize - 24;
if (dwLen < dwBody)
dwBody = dwLen;
@ -565,7 +565,7 @@ void multi_send_zero_packet(DWORD pnum, char a2, void *pbSrc, DWORD dwLen)
}
pbSrc = (char *)pbSrc + *(WORD *)&pkt.body[3];
dwLen -= *(WORD *)&pkt.body[3];
v5 += *(WORD *)&pkt.body[3];
len += *(WORD *)&pkt.body[3];
}
}

10
Source/multi.h

@ -20,12 +20,12 @@ void __cdecl dumphist(const char *pszFmt, ...);
#endif
void multi_msg_add(BYTE *pbMsg, BYTE bLen);
void NetSendLoPri(BYTE *pbMsg, BYTE bLen);
void multi_copy_packet(TBuffer *buf, void *packet, BYTE size);
void multi_copy_packet(TBuffer *pBuf, void *packet, BYTE size);
void multi_send_packet(void *packet, BYTE dwSize);
void NetRecvPlrData(TPkt *pkt);
void NetSendHiPri(BYTE *pbMsg, BYTE bLen);
BYTE *multi_recv_packet(TBuffer *packet, BYTE *body, int *size);
void multi_send_msg_packet(int pmask, BYTE *a2, BYTE len);
BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size);
void multi_send_msg_packet(int pmask, BYTE *src, BYTE len);
void multi_msg_countdown();
void multi_parse_turn(int pnum, int turn);
void multi_handle_turn_upper_bit(int pnum);
@ -34,14 +34,14 @@ void multi_clear_left_tbl();
void multi_player_left_msg(int pnum, int left);
void multi_net_ping();
int multi_handle_delta();
int multi_check_pkt_valid(TBuffer *a1);
int multi_check_pkt_valid(TBuffer *pBuf);
void multi_mon_seeds();
void multi_begin_timeout();
void multi_check_drop_player();
void multi_process_network_packets();
void multi_handle_all_packets(int pnum, BYTE *pData, int nSize);
void multi_process_tmsgs();
void multi_send_zero_packet(DWORD pnum, char a2, void *pbSrc, DWORD dwLen);
void multi_send_zero_packet(DWORD pnum, char identifier, void *pbSrc, DWORD dwLen);
void NetClose();
void multi_event_handler(BOOL add);
void __stdcall multi_handle_events(_SNETEVENT *pEvt);

2
Source/nthread.cpp

@ -170,7 +170,7 @@ void nthread_start(BOOL set_turn_upper_bit)
}
}
unsigned int __stdcall nthread_handler(void *a1)
unsigned int __stdcall nthread_handler(void *)
{
int delta;
int received;

2
Source/nthread.h

@ -20,7 +20,7 @@ DWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta);
BOOL nthread_recv_turns(BOOL *pfSendAsync);
void nthread_set_turn_upper_bit();
void nthread_start(BOOL set_turn_upper_bit);
unsigned int __stdcall nthread_handler(void *a1);
unsigned int __stdcall nthread_handler(void *);
void nthread_cleanup();
void nthread_ignore_mutex(BOOL bStart);
BOOL nthread_has_500ms_passed(BOOL unused);

30
Source/objects.cpp

@ -2,17 +2,17 @@
DEVILUTION_BEGIN_NAMESPACE
int trapid; // weak
int trapdir; // weak
unsigned char *pObjCels[40];
int trapid;
int trapdir;
BYTE *pObjCels[40];
char ObjFileList[40];
int objectactive[MAXOBJECTS];
int nobjects; // idb
int leverid; // idb
int nobjects;
int leverid;
int objectavail[MAXOBJECTS];
ObjectStruct object[MAXOBJECTS];
BOOL InitObjFlag;
int numobjfiles; // weak
int numobjfiles;
int bxadd[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int byadd[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
@ -55,7 +55,7 @@ char shrinemax[NUM_SHRINETYPE] = {
16, 16, 16, 16, 16, 16
};
// 0 - sp+mp, 1 - sp only, 2 - mp only
unsigned char shrineavail[NUM_SHRINETYPE] = {
BYTE shrineavail[NUM_SHRINETYPE] = {
0, 0, 1, 1, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
0, 0, 0, 0, 0, 2
@ -833,17 +833,17 @@ void InitObjects()
InitRndLocObj(1, 5, 7);
if (leveltype != DTYPE_HELL)
AddObjTraps();
if (leveltype > 1u)
if (leveltype > 1)
AddChestTraps();
InitObjFlag = FALSE;
}
}
void SetMapObjects(unsigned char *pMap, int startx, int starty)
void SetMapObjects(BYTE *pMap, int startx, int starty)
{
int rw, rh;
int i, j;
unsigned char *lm, *h;
BYTE *lm, *h;
long mapoff;
int fileload[56];
char filestr[32];
@ -1252,7 +1252,7 @@ void AddStoryBook(int i)
object[i]._oVar2 = StoryText[bookframe][1];
if (currlevel == 12)
object[i]._oVar2 = StoryText[bookframe][2];
object[i]._oVar3 = ((unsigned int)currlevel >> 2) + 3 * bookframe - 1;
object[i]._oVar3 = (currlevel >> 2) + 3 * bookframe - 1;
object[i]._oAnimFrame = 5 - 2 * bookframe;
object[i]._oVar4 = object[i]._oAnimFrame + 1;
}
@ -2353,7 +2353,7 @@ void ObjChangeMap(int x1, int y1, int x2, int y2)
for (j = y1; j <= y2; j++) {
for (i = x1; i <= x2; i++) {
ObjSetMini(i, j, (BYTE)pdungeon[i][j]);
ObjSetMini(i, j, pdungeon[i][j]);
dungeon[i][j] = pdungeon[i][j];
}
}
@ -2373,7 +2373,7 @@ void ObjChangeMapResync(int x1, int y1, int x2, int y2)
for (j = y1; j <= y2; j++) {
for (i = x1; i <= x2; i++) {
ObjSetMini(i, j, (unsigned char)pdungeon[i][j]);
ObjSetMini(i, j, pdungeon[i][j]);
dungeon[i][j] = pdungeon[i][j];
}
}
@ -2582,7 +2582,7 @@ void OperateChest(int pnum, int i, BOOL sendmsg)
SetRndSeed(object[i]._oRndSeed);
if (setlevel) {
for (j = 0; j < object[i]._oVar1; j++) {
CreateRndItem(object[i]._ox, object[i]._oy, 1u, sendmsg, 0);
CreateRndItem(object[i]._ox, object[i]._oy, TRUE, sendmsg, 0);
}
} else {
for (j = 0; j < object[i]._oVar1; j++) {
@ -3448,8 +3448,6 @@ void OperateShrine(int pnum, int i, int sType)
if (pnum == myplr)
NetSendCmdParam2(FALSE, CMD_PLROPOBJ, pnum, i);
}
// 52571C: using guessed type int drawpanflag;
// 676190: using guessed type int deltaload;
void OperateSkelBook(int pnum, int i, BOOL sendmsg)
{

16
Source/objects.h

@ -2,17 +2,17 @@
#ifndef __OBJECTS_H__
#define __OBJECTS_H__
extern int trapid; // weak
extern int trapdir; // weak
extern unsigned char *pObjCels[40];
extern int trapid;
extern int trapdir;
extern BYTE *pObjCels[40];
extern char ObjFileList[40];
extern int objectactive[MAXOBJECTS];
extern int nobjects; // idb
extern int leverid; // idb
extern int nobjects;
extern int leverid;
extern int objectavail[MAXOBJECTS];
extern ObjectStruct object[MAXOBJECTS];
extern BOOL InitObjFlag;
extern int numobjfiles; // weak
extern int numobjfiles;
void InitObjectGFX();
void FreeObjectGFX();
@ -41,7 +41,7 @@ void AddHookedBodies(int freq);
void AddL4Goodies();
void AddLazStand();
void InitObjects();
void SetMapObjects(unsigned char *pMap, int startx, int starty);
void SetMapObjects(BYTE *pMap, int startx, int starty);
void DeleteObject_(int oi, int i);
void SetupObject(int i, int x, int y, int ot);
void SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v);
@ -159,7 +159,7 @@ extern int byadd[8];
extern char *shrinestrs[NUM_SHRINETYPE];
extern char shrinemin[NUM_SHRINETYPE];
extern char shrinemax[NUM_SHRINETYPE];
extern unsigned char shrineavail[NUM_SHRINETYPE];
extern BYTE shrineavail[NUM_SHRINETYPE];
extern char *StoryBookName[9];
extern int StoryText[3][3];

10
Source/pfile.cpp

@ -97,7 +97,7 @@ void pfile_encode_hero(const PkPlayerStruct *pPack)
mem_free_dbg(packed);
}
BOOL pfile_open_archive(BOOL a1, DWORD save_num)
BOOL pfile_open_archive(BOOL update, DWORD save_num)
{
char FileName[MAX_PATH];
@ -105,7 +105,7 @@ BOOL pfile_open_archive(BOOL a1, DWORD save_num)
if (OpenMPQ(FileName, FALSE, save_num))
return TRUE;
if (a1 && gbMaxPlayers > 1)
if (update && gbMaxPlayers > 1)
mpqapi_store_default_time(save_num);
return FALSE;
}
@ -209,13 +209,13 @@ void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSav
heroinfo->vitality = p->_pVitality;
heroinfo->gold = p->_pGold;
heroinfo->hassaved = bHasSaveFile;
heroinfo->herorank = (unsigned char)p->pDiabloKillLevel;
heroinfo->herorank = p->pDiabloKillLevel;
heroinfo->spawned = 0;
}
unsigned char game_2_ui_class(const PlayerStruct *p)
BYTE game_2_ui_class(const PlayerStruct *p)
{
unsigned char uiclass;
BYTE uiclass;
if (p->_pClass == PC_WARRIOR)
uiclass = UI_WARRIOR;
else if (p->_pClass == PC_ROGUE)

6
Source/pfile.h

@ -2,21 +2,21 @@
#ifndef __PFILE_H__
#define __PFILE_H__
extern BOOL gbValidSaveFile; // idb
extern BOOL gbValidSaveFile;
void pfile_init_save_directory();
void pfile_check_available_space(char *pszDir);
void pfile_write_hero();
DWORD pfile_get_save_num_from_name(const char *name);
void pfile_encode_hero(const PkPlayerStruct *pPack);
BOOL pfile_open_archive(BOOL a1, DWORD save_num);
BOOL pfile_open_archive(BOOL update, DWORD save_num);
void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num);
void pfile_flush(BOOL is_single_player, DWORD save_num);
BOOL pfile_create_player_description(char *dst, DWORD len);
BOOL pfile_rename_hero(const char *name_1, const char *name_2);
void pfile_flush_W();
void game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile);
unsigned char game_2_ui_class(const PlayerStruct *p);
BYTE game_2_ui_class(const PlayerStruct *p);
BOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uiheroinfo *));
char *GetSaveDirectory(char *dst, int dst_size, DWORD save_num);
BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack);

8
Source/player.cpp

@ -108,7 +108,7 @@ int ExpLvlsTbl[MAXCHARLEVEL] = {
1583495809
};
char *ClassStrTbl[3] = { "Warrior", "Rogue", "Sorceror" };
BYTE fix[9] = { 0u, 0u, 3u, 3u, 3u, 6u, 6u, 6u, 8u }; /* PM_ChangeLightOff local type */
BYTE fix[9] = { 0, 0, 3, 3, 3, 6, 6, 6, 8 }; /* PM_ChangeLightOff local type */
void SetPlayerGPtrs(BYTE *pData, BYTE **pAnim)
{
@ -1026,7 +1026,7 @@ void PlrClrTrans(int x, int y)
for (i = y - 1; i <= y + 1; i++) {
for (j = x - 1; j <= x + 1; j++) {
TransList[dTransVal[j][i]] = 0;
TransList[dTransVal[j][i]] = FALSE;
}
}
}
@ -1036,12 +1036,12 @@ void PlrDoTrans(int x, int y)
int i, j;
if (leveltype != DTYPE_CATHEDRAL && leveltype != DTYPE_CATACOMBS) {
TransList[1] = 1;
TransList[1] = TRUE;
} else {
for (i = y - 1; i <= y + 1; i++) {
for (j = x - 1; j <= x + 1; j++) {
if (!nSolidTable[dPiece[j][i]] && dTransVal[j][i]) {
TransList[dTransVal[j][i]] = 1;
TransList[dTransVal[j][i]] = TRUE;
}
}
}

18
Source/plrmsg.cpp

@ -2,7 +2,7 @@
DEVILUTION_BEGIN_NAMESPACE
static unsigned char plr_msg_slot;
static BYTE plr_msg_slot;
_plrmsg plr_msgs[PMSG_COUNT];
const char text_color_from_player_num[MAX_PLRS + 1] = { COL_WHITE, COL_WHITE, COL_WHITE, COL_WHITE, COL_GOLD };
@ -83,9 +83,9 @@ void InitPlrMsg()
void DrawPlrMsg()
{
int i;
int x = 74;
int y = 230;
int width = 620;
DWORD x = 74;
DWORD y = 230;
DWORD width = 620;
_plrmsg *pMsg;
if (chrflag || questlog) {
@ -105,20 +105,20 @@ void DrawPlrMsg()
}
}
void PrintPlrMsg(unsigned int x, unsigned int y, unsigned int width, const char *str, unsigned char col)
void PrintPlrMsg(DWORD x, DWORD y, DWORD width, const char *str, BYTE col)
{
int line = 0;
while (*str) {
unsigned char c;
BYTE c;
int screen = PitchTbl[y] + x;
const char *sstr = str;
unsigned int len = 0;
DWORD len = 0;
const char *endstr = sstr;
while (1) {
if (*sstr) {
c = gbFontTransTbl[(unsigned char)*sstr++];
c = gbFontTransTbl[(BYTE)*sstr++];
c = fontframe[c];
len += fontkern[c] + 1;
if (!c) // allow wordwrap on blank glyph
@ -132,7 +132,7 @@ void PrintPlrMsg(unsigned int x, unsigned int y, unsigned int width, const char
}
while (str < endstr) {
c = gbFontTransTbl[(unsigned char)*str++];
c = gbFontTransTbl[(BYTE)*str++];
c = fontframe[c];
if (c)
CPrintString(screen, c, col);

2
Source/plrmsg.h

@ -11,7 +11,7 @@ void SendPlrMsg(int pnum, const char *pszStr);
void ClearPlrMsg();
void InitPlrMsg();
void DrawPlrMsg();
void PrintPlrMsg(unsigned int x, unsigned int y, unsigned int width, const char *str, unsigned char just);
void PrintPlrMsg(DWORD x, DWORD y, DWORD width, const char *str, BYTE col);
/* rdata */

14
Source/quests.cpp

@ -664,18 +664,18 @@ void ResyncQuests()
SpawnQuestItem(IDI_GLDNELIX, 0, 0, 5, 1);
}
if (setlevel && setlvlnum == 5) {
if (quests[QTYPE_VB]._qvar1 >= 4u)
if (quests[QTYPE_VB]._qvar1 >= 4)
ObjChangeMapResync(1, 11, 20, 18);
if (quests[QTYPE_VB]._qvar1 >= 6u)
if (quests[QTYPE_VB]._qvar1 >= 6)
ObjChangeMapResync(1, 18, 20, 24);
if (quests[QTYPE_VB]._qvar1 >= 7u)
if (quests[QTYPE_VB]._qvar1 >= 7)
InitVPTriggers();
for (i = 0; i < nobjects; i++)
SyncObjectAnim(objectactive[i]);
}
if (currlevel == quests[QTYPE_VB]._qlevel
&& !setlevel
&& (quests[QTYPE_VB]._qvar2 == 1 || quests[QTYPE_VB]._qvar2 >= 3u)
&& (quests[QTYPE_VB]._qvar2 == 1 || quests[QTYPE_VB]._qvar2 >= 3)
&& (quests[QTYPE_VB]._qactive == 2 || quests[QTYPE_VB]._qactive == 3)) {
quests[QTYPE_VB]._qvar2 = 2;
}
@ -718,14 +718,14 @@ void DrawQuestLog()
{
int y, i;
PrintQLString(0, 2, 1u, "Quest Log", 3);
PrintQLString(0, 2, TRUE, "Quest Log", 3);
CelDecodeOnly(64, 511, pQLogCel, 1, 320);
y = qtopline;
for (i = 0; i < numqlines; i++) {
PrintQLString(0, y, 1, questlist[qlist[i]]._qlstr, 0);
PrintQLString(0, y, TRUE, questlist[qlist[i]]._qlstr, 0);
y += 2;
}
PrintQLString(0, 22, 1, "Close Quest Log", 0);
PrintQLString(0, 22, TRUE, "Close Quest Log", 0);
ALLQUESTS = (ALLQUESTS & 7) + 1;
}

470
Source/render.cpp

File diff suppressed because it is too large Load Diff

16
Source/render.h

@ -3,24 +3,24 @@
#define __RENDER_H__
void drawTopArchesUpperScreen(BYTE *pBuff);
void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned int *pMask);
void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *pMask);
void drawUpperScreen(BYTE *pBuff);
void drawTopArchesLowerScreen(BYTE *pBuff);
void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned int *pMask);
void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *pMask);
void drawLowerScreen(BYTE *pBuff);
void world_draw_black_tile(BYTE *pBuff);
/* rdata */
extern int WorldBoolFlag;
extern unsigned int gdwCurrentMask;
extern DWORD gdwCurrentMask;
// extern char world_4B3264;
extern unsigned char *gpCelFrame;
extern unsigned int *gpDrawMask;
extern BYTE *gpCelFrame;
extern DWORD *gpDrawMask;
// extern char world_4B326D[16];
extern unsigned int RightMask[32];
extern unsigned int LeftMask[32];
extern unsigned int WallMask[32];
extern DWORD RightMask[32];
extern DWORD LeftMask[32];
extern DWORD WallMask[32];
extern int WorldTbl3x16[48];
extern int WorldTbl17_1[17];
extern int WorldTbl17_2[17];

35
Source/scrollrt.cpp

@ -707,7 +707,7 @@ void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy,
negMon = dMonster[sx][sy - 1];
if (visiondebug && bFlag & BFLAG_LIT) {
Cel2DecodeHdrOnly(pBuff, (BYTE *)pSquareCel, 1, 64, 0, 8);
Cel2DecodeHdrOnly(pBuff, pSquareCel, 1, 64, 0, 8);
}
if (MissilePreFlag && bFlag & BFLAG_MISSILE) {
DrawClippedMissile(sx, sy, dx, dy, 0, 8, 1);
@ -889,7 +889,7 @@ void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy,
}
}
if (bArch != 0) {
cel_transparency_active = (BYTE)TransList[bMap];
cel_transparency_active = TransList[bMap];
Cel2DecodeLightTrans(pBuff, pSpecialCels, bArch, 64, 0, 8);
}
}
@ -1173,7 +1173,7 @@ void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks
negMon = dMonster[sx][sy - 1];
if (visiondebug && bFlag & BFLAG_LIT) {
Cel2DecodeHdrOnly(pBuff, (BYTE *)pSquareCel, 1, 64, CelSkip, 8);
Cel2DecodeHdrOnly(pBuff, pSquareCel, 1, 64, CelSkip, 8);
}
if (MissilePreFlag && bFlag & BFLAG_MISSILE) {
DrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, 1);
@ -1355,12 +1355,12 @@ void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks
}
}
if (bArch != 0) {
cel_transparency_active = (BYTE)TransList[bMap];
cel_transparency_active = TransList[bMap];
Cel2DecodeLightTrans(pBuff, pSpecialCels, bArch, 64, CelSkip, 8);
}
}
void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, signed int CelSkip, int sx, int sy)
void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, int CelSkip, int sx, int sy)
{
int lti_old, cta_old, lpi_old;
BYTE *dst;
@ -1578,7 +1578,7 @@ void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks
void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag)
{
int px, py, nCel, nMon, negMon, p;
int px, py, nCel, nMon, negMon, p, tx, ty;
char bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd;
DeadStruct *pDeadGuy;
ItemStruct *pItem;
@ -1603,11 +1603,15 @@ void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCa
negMon = dMonster[sx][sy - 1];
if (visiondebug && bFlag & BFLAG_LIT) {
CelDecodeHdrOnly(pBuff, (BYTE *)pSquareCel, 1, 64, 0, CelCap);
CelDecodeHdrOnly(pBuff, pSquareCel, 1, 64, 0, CelCap);
}
tx = dx - 96;
ty = dy - 16;
if (MissilePreFlag && bFlag & BFLAG_MISSILE) {
DrawMissile(sx, sy, dx, dy, 0, CelCap, 1);
}
if (light_table_index < lightmax) {
if (bDead != 0) {
pDeadGuy = &dead[(bDead & 0x1F) - 1];
@ -1666,7 +1670,7 @@ void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCa
DrawPlayer(p, sx, sy - 1, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, 0, CelCap);
if (eflag && pPlayer->_peflag != 0) {
if (pPlayer->_peflag == 2) {
scrollrt_draw_e_flag(pBuff - (BUFFER_WIDTH * 16 + 96), sx - 2, sy + 1, capChunks, CelCap, dx - 96, dy - 16);
scrollrt_draw_e_flag(pBuff - (BUFFER_WIDTH * 16 + 96), sx - 2, sy + 1, capChunks, CelCap, tx, ty);
}
scrollrt_draw_e_flag(pBuff - 64, sx - 1, sy + 1, capChunks, CelCap, dx - 64, dy);
}
@ -1698,10 +1702,7 @@ void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCa
}
}
if (bFlag & BFLAG_DEAD_PLAYER) {
if (light_table_index)
DrawDeadPlayer(sx, sy, dx, dy, 0, CelCap, 0);
else
DrawDeadPlayer(sx, sy, dx, dy, 0, CelCap, 0);
DrawDeadPlayer(sx, sy, dx, dy, 0, CelCap, 0);
}
if (bPlr > 0) {
p = bPlr - 1;
@ -1774,7 +1775,7 @@ void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCa
}
}
if (bArch != 0) {
cel_transparency_active = (BYTE)TransList[bMap];
cel_transparency_active = TransList[bMap];
CelDecodeHdrLightTrans(pBuff, pSpecialCels, bArch, 64, 0, CelCap);
}
}
@ -2323,14 +2324,14 @@ void scrollrt_draw_cursor_item()
if (!plr[myplr].HoldItem._iStatFlag) {
col = PAL16_RED + 5;
}
CelDrawHdrClrHL(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, (BYTE *)pCursCels, pcurs, cursW, 0, 8);
CelDrawHdrClrHL(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);
if (col != PAL16_RED + 5) {
Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, (BYTE *)pCursCels, pcurs, cursW, 0, 8);
Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);
} else {
Cel2DrawHdrLightRed(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, (BYTE *)pCursCels, pcurs, cursW, 0, 8, 1);
Cel2DrawHdrLightRed(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8, 1);
}
} else {
Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, (BYTE *)pCursCels, pcurs, cursW, 0, 8);
Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);
}
}

2
Source/scrollrt.h

@ -8,7 +8,7 @@ extern BYTE *gpBufEnd;
extern DWORD level_cel_block;
extern char arch_draw_type;
extern DDSURFACEDESC DDS_desc;
extern int cel_transparency_active; // weak
extern int cel_transparency_active;
extern int level_piece_id;
extern void (*DrawPlrProc)(int, int, int, int, int, BYTE *, int, int, int, int);
extern int draw_monster_num;

14
Source/setmaps.cpp

@ -3,17 +3,17 @@
DEVILUTION_BEGIN_NAMESPACE
// BUGFIX: constant data should be const
unsigned char SkelKingTrans1[8] = {
BYTE SkelKingTrans1[8] = {
19, 47, 26, 55,
26, 49, 30, 53
};
unsigned char SkelKingTrans2[8] = {
BYTE SkelKingTrans2[8] = {
33, 19, 47, 29,
37, 29, 43, 39
};
unsigned char SkelKingTrans3[20] = {
BYTE SkelKingTrans3[20] = {
27, 53, 35, 61,
27, 35, 34, 42,
45, 35, 53, 43,
@ -21,7 +21,7 @@ unsigned char SkelKingTrans3[20] = {
31, 39, 49, 57
};
unsigned char SkelKingTrans4[28] = {
BYTE SkelKingTrans4[28] = {
49, 45, 58, 51,
57, 31, 62, 37,
63, 31, 69, 40,
@ -31,7 +31,7 @@ unsigned char SkelKingTrans4[28] = {
79, 43, 89, 53
};
unsigned char SkelChamTrans1[20] = {
BYTE SkelChamTrans1[20] = {
43, 19, 50, 26,
51, 19, 59, 26,
35, 27, 42, 34,
@ -39,12 +39,12 @@ unsigned char SkelChamTrans1[20] = {
50, 27, 59, 34
};
unsigned char SkelChamTrans2[8] = {
BYTE SkelChamTrans2[8] = {
19, 31, 34, 47,
34, 35, 42, 42
};
unsigned char SkelChamTrans3[36] = {
BYTE SkelChamTrans3[36] = {
43, 35, 50, 42,
51, 35, 62, 42,
63, 31, 66, 46,

14
Source/setmaps.h

@ -10,13 +10,13 @@ void DRLG_SetMapTrans(char *sFileName);
void LoadSetMap();
/* rdata */
extern unsigned char SkelKingTrans1[8];
extern unsigned char SkelKingTrans2[8];
extern unsigned char SkelKingTrans3[20];
extern unsigned char SkelKingTrans4[28];
extern unsigned char SkelChamTrans1[20];
extern unsigned char SkelChamTrans2[8];
extern unsigned char SkelChamTrans3[36];
extern BYTE SkelKingTrans1[8];
extern BYTE SkelKingTrans2[8];
extern BYTE SkelKingTrans3[20];
extern BYTE SkelKingTrans4[28];
extern BYTE SkelChamTrans1[20];
extern BYTE SkelChamTrans2[8];
extern BYTE SkelChamTrans3[36];
extern char *quest_level_names[];
#endif /* __SETMAPS_H__ */

6
Source/sound.cpp

@ -14,9 +14,9 @@ LPDIRECTSOUNDBUFFER sglpDSB;
/* data */
BYTE gbMusicOn = TRUE;
BYTE gbSoundOn = TRUE;
BYTE gbDupSounds = TRUE;
BOOLEAN gbMusicOn = TRUE;
BOOLEAN gbSoundOn = TRUE;
BOOLEAN gbDupSounds = TRUE;
int sgnMusicTrack = 6;
char *sgszMusicTracks[NUM_MUSIC] = {
"Music\\DTowne.wav",

6
Source/sound.h

@ -31,9 +31,9 @@ int sound_get_or_set_sound_volume(int volume);
/* data */
extern BYTE gbMusicOn;
extern BYTE gbSoundOn;
extern BYTE gbDupSounds;
extern BOOLEAN gbMusicOn;
extern BOOLEAN gbSoundOn;
extern BOOLEAN gbDupSounds;
extern char unk_volume[4][2];
#endif /* __SOUND_H__ */

22
Source/stores.cpp

@ -8,7 +8,7 @@ int stextlhold;
ItemStruct boyitem;
int stextshold;
ItemStruct premiumitem[6];
void *pSTextBoxCels;
BYTE *pSTextBoxCels;
int premiumlevel;
int talker;
STextStruct stext[24];
@ -23,7 +23,7 @@ int numpremium;
ItemStruct healitem[20];
ItemStruct golditem;
char storehidx[48];
void *pSTextSlidCels;
BYTE *pSTextSlidCels;
int stextvhold;
int stextsel;
char stextscrldbtn;
@ -132,7 +132,7 @@ void FreeStoreMem()
void DrawSTextBack()
{
CelDecodeOnly(408, 487, (BYTE *)pSTextBoxCels, 1, 271);
CelDecodeOnly(408, 487, pSTextBoxCels, 1, 271);
#define TRANS_RECT_X 347
#define TRANS_RECT_Y 28
@ -249,16 +249,16 @@ void DrawSArrows(int y1, int y2)
yd1 = SStringY[y1] + 204;
yd2 = SStringY[y2] + 204;
if (stextscrlubtn != -1)
CelDecodeOnly(665, yd1, (BYTE *)pSTextSlidCels, 12, 12);
CelDecodeOnly(665, yd1, pSTextSlidCels, 12, 12);
else
CelDecodeOnly(665, yd1, (BYTE *)pSTextSlidCels, 10, 12);
CelDecodeOnly(665, yd1, pSTextSlidCels, 10, 12);
if (stextscrldbtn != -1)
CelDecodeOnly(665, yd2, (BYTE *)pSTextSlidCels, 11, 12);
CelDecodeOnly(665, yd2, pSTextSlidCels, 11, 12);
else
CelDecodeOnly(665, yd2, (BYTE *)pSTextSlidCels, 9, 12);
CelDecodeOnly(665, yd2, pSTextSlidCels, 9, 12);
yd1 += 12;
for (yd3 = yd1; yd3 < yd2; yd3 += 12) {
CelDecodeOnly(665, yd3, (BYTE *)pSTextSlidCels, 14, 12);
CelDecodeOnly(665, yd3, pSTextSlidCels, 14, 12);
}
if (stextsel == 22)
yd3 = stextlhold;
@ -268,7 +268,7 @@ void DrawSArrows(int y1, int y2)
yd3 = 1000 * (stextsval + ((yd3 - stextup) >> 2)) / (storenumh - 1) * (SStringY[y2] - SStringY[y1] - 24) / 1000;
else
yd3 = 0;
CelDecodeOnly(665, SStringY[y1 + 1] + 204 + yd3, (BYTE *)pSTextSlidCels, 13, 12);
CelDecodeOnly(665, SStringY[y1 + 1] + 204 + yd3, pSTextSlidCels, 13, 12);
}
void DrawSTextHelp()
@ -1434,9 +1434,9 @@ void StartStore(char s)
int i;
for (t = s;; t = STORE_SMITH) {
sbookflag = 0;
sbookflag = FALSE;
invflag = 0;
chrflag = 0;
chrflag = FALSE;
questlog = FALSE;
dropGoldFlag = FALSE;
ClearSText(0, 24);

4
Source/stores.h

@ -8,7 +8,7 @@ extern int stextlhold;
extern ItemStruct boyitem;
extern int stextshold;
extern ItemStruct premiumitem[6];
extern void *pSTextBoxCels;
extern BYTE *pSTextBoxCels;
extern int premiumlevel;
extern int talker;
extern STextStruct stext[24];
@ -23,7 +23,7 @@ extern int numpremium;
extern ItemStruct healitem[20];
extern ItemStruct golditem;
extern char storehidx[48];
extern void *pSTextSlidCels;
extern BYTE *pSTextSlidCels;
extern int stextvhold;
extern int stextsel;
extern char stextscrldbtn;

2
Source/textdat.cpp

@ -508,6 +508,6 @@ const TextDataStruct alltext[259] = {
{ "Thank goodness you've returned!\nMuch has changed since you lived here, my friend. All was peaceful until the dark riders came and destroyed our village. Many were cut down where they stood, and those who took up arms were slain or dragged away to become slaves - or worse. The church at the edge of town has been desecrated and is being used for dark rituals. The screams that echo in the night are inhuman, but some of our townsfolk may yet survive. Follow the path that lies between my tavern and the blacksmith shop to find the church and save who you can. \n \nPerhaps I can tell you more if we speak again. Good luck.|",
1, 5, TSFX_TAVERN0 }
};
const int gdwAllTextEntries = 259; /* unused */
const DWORD gdwAllTextEntries = 259; /* unused */
DEVILUTION_END_NAMESPACE

2
Source/textdat.h

@ -3,6 +3,6 @@
#define __TEXTDAT_H__
extern const TextDataStruct alltext[259];
extern const int gdwAllTextEntries;
extern const DWORD gdwAllTextEntries;
#endif /* __TEXTDAT_H__ */

25
Source/towners.cpp

@ -2,12 +2,12 @@
DEVILUTION_BEGIN_NAMESPACE
int storeflag; // weak
BOOL storeflag;
int sgnCowMsg;
int numtowners; // idb
int numtowners;
DWORD sgdwCowClicks;
int bannerflag; // weak // unused 0x6AAC28
int boyloadflag; // weak
BOOL bannerflag; // unused 0x6AAC28
BOOL boyloadflag;
BYTE *pCowCels;
TownerStruct towner[16];
@ -212,7 +212,7 @@ void InitBarOwner()
{
int i;
bannerflag = 0; // unused
bannerflag = FALSE; // unused
InitTownerInfo(numtowners, 96, 1, TOWN_TAVERN, 55, 62, 3, 10);
InitQstSnds(numtowners);
towner[numtowners]._tNData = LoadFileInMem("Towners\\TwnF\\TwnFN.CEL", NULL);
@ -224,7 +224,6 @@ void InitBarOwner()
strcpy(towner[numtowners]._tName, "Ogden the Tavern owner");
numtowners++;
}
// 6AAC28: using guessed type int bannerflag;
void InitTownDead()
{
@ -278,7 +277,7 @@ void InitBoy()
{
int i;
boyloadflag = 1;
boyloadflag = TRUE;
InitTownerInfo(numtowners, 96, 1, TOWN_PEGBOY, 11, 53, -1, 10);
InitQstSnds(numtowners);
towner[numtowners]._tNData = LoadFileInMem("Towners\\TownBoy\\PegKid1.CEL", NULL);
@ -290,7 +289,6 @@ void InitBoy()
strcpy(towner[numtowners]._tName, "Wirt the Peg-legged boy");
numtowners++;
}
// 6AAC2C: using guessed type int boyloadflag;
void InitHealer()
{
@ -373,12 +371,11 @@ void InitCows()
numtowners++;
}
}
// 6AAC2C: using guessed type int boyloadflag;
void InitTowners()
{
numtowners = 0;
boyloadflag = 0;
boyloadflag = FALSE;
InitSmith();
InitHealer();
if (quests[QTYPE_BUTCH]._qactive && quests[QTYPE_BUTCH]._qactive != 3)
@ -391,7 +388,6 @@ void InitTowners()
InitBoy();
InitCows();
}
// 6AAC2C: using guessed type int boyloadflag;
void FreeTownerGFX()
{
@ -425,7 +421,6 @@ void TownCtrlMsg(int i)
}
}
}
// 646D00: using guessed type char qtextflag;
void TownBlackSmith()
{
@ -592,10 +587,9 @@ void TownerTalk(int first, int t)
{
sgdwCowClicks = 0;
sgnCowMsg = 0;
storeflag = 1;
storeflag = TRUE;
InitQTextMsg(first);
}
// 6AAC18: using guessed type int storeflag;
void TalkToTowner(int p, int t)
{
@ -940,9 +934,6 @@ void TalkToTowner(int p, int t)
CowSFX(p);
}
}
// 646D00: using guessed type char qtextflag;
// 679660: using guessed type char gbMaxPlayers;
// 6AAC18: using guessed type int storeflag;
void CowSFX(int pnum)
{

5
Source/trigs.cpp

@ -6,7 +6,7 @@ BOOL townwarps[3];
BOOL trigflag;
int numtrigs;
TriggerStruct trigs[MAXTRIGGERS];
int TWarpFrom; // weak
int TWarpFrom;
int TownDownList[11] = { 716, 715, 719, 720, 721, 723, 724, 725, 726, 727, -1 };
int TownWarp1List[13] = {
@ -152,7 +152,6 @@ void InitTownTriggers()
trigflag = FALSE;
}
// 679660: using guessed type char gbMaxPlayers;
void InitL1Triggers()
{
@ -778,7 +777,5 @@ void CheckTriggers()
}
}
}
// 679660: using guessed type char gbMaxPlayers;
// 6ABB30: using guessed type int TWarpFrom;
DEVILUTION_END_NAMESPACE

2
Source/trigs.h

@ -6,7 +6,7 @@ extern BOOL townwarps[3];
extern BOOL trigflag;
extern int numtrigs;
extern TriggerStruct trigs[MAXTRIGGERS];
extern int TWarpFrom; // weak
extern int TWarpFrom;
void InitNoTriggers();
void InitTownTriggers();

13
defs.h

@ -5,8 +5,8 @@
#define LIGHTSIZE 6912 // 27 * 256
#define GMENU_SLIDER (DWORD)1 << 30
#define GMENU_ENABLED (DWORD)1 << 31
#define GMENU_SLIDER 0x40000000
#define GMENU_ENABLED 0x80000000
// must be unsigned to generate unsigned comparisons with pnum
#define MAX_PLRS 4
@ -151,15 +151,6 @@
#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
#endif
/////////////////////////////////////////////////////////////////////////
/* temporary stuff from the decompiler */
/* remove all the garbage below in the future */
/////////////////////////////////////////////////////////////////////////
#ifndef IDA_GARBAGE
#define IDA_GARBAGE
#define _LOBYTE(x) (*((BYTE*)&(x)))
#endif /* IDA_GARBAGE */
// Typedef for the function pointer
typedef void (*_PVFV)(void);

24
structs.h

@ -1216,26 +1216,26 @@ typedef struct DeadStruct {
typedef struct _gamedata {
int dwSeed;
unsigned char bDiff;
BYTE bDiff;
} _gamedata;
typedef struct _uidefaultstats {
unsigned short strength;
unsigned short magic;
unsigned short dexterity;
unsigned short vitality;
WORD strength;
WORD magic;
WORD dexterity;
WORD vitality;
} _uidefaultstats;
typedef struct _uiheroinfo {
struct _uiheroinfo *next;
char name[16];
unsigned short level;
unsigned char heroclass;
unsigned char herorank;
unsigned short strength;
unsigned short magic;
unsigned short dexterity;
unsigned short vitality;
WORD level;
BYTE heroclass;
BYTE herorank;
WORD strength;
WORD magic;
WORD dexterity;
WORD vitality;
int gold;
int hassaved;
int spawned;

4
types.h

@ -65,7 +65,9 @@ DEVILUTION_BEGIN_NAMESPACE
#endif
// If defined, use copy protection [Default -> Defined]
//#define COPYPROT
#ifndef _DEBUG
#define COPYPROT
#endif
// If defined, don't reload for debuggers [Default -> Undefined]
// Note that with patch 1.03 the command line was hosed, this is required to pass arguments to the game

Loading…
Cancel
Save