Browse Source

Backport cleanups from hellfire branch

pull/704/head
Anders Jenbo 6 years ago
parent
commit
c384711a5f
  1. 2
      Source/appfat.cpp
  2. 12
      Source/control.cpp
  3. 14
      Source/cursor.cpp
  4. 8
      Source/cursor.h
  5. 35
      Source/diablo.cpp
  6. 2
      Source/diablo.h
  7. 2
      Source/drlg_l2.cpp
  8. 2
      Source/drlg_l2.h
  9. 6
      Source/drlg_l4.cpp
  10. 6
      Source/drlg_l4.h
  11. 7
      Source/effects.cpp
  12. 4
      Source/error.cpp
  13. 2
      Source/error.h
  14. 23
      Source/gamemenu.cpp
  15. 110
      Source/gendung.cpp
  16. 96
      Source/gendung.h
  17. 5
      Source/inv.cpp
  18. 2
      Source/itemdat.cpp
  19. 28
      Source/items.cpp
  20. 10
      Source/items.h
  21. 3
      Source/lighting.cpp
  22. 80
      Source/monster.cpp
  23. 1
      Source/monster.h
  24. 8
      Source/mpqapi.cpp
  25. 2
      Source/multi.cpp
  26. 126
      Source/objects.cpp
  27. 8
      Source/palette.cpp
  28. 82
      Source/player.cpp
  29. 2
      Source/quests.cpp
  30. 2
      Source/quests.h
  31. 2
      Source/scrollrt.cpp
  32. 4
      Source/sound.cpp
  33. 2
      Source/textdat.cpp
  34. 2
      Source/textdat.h
  35. 62
      Source/towners.cpp
  36. 2
      Source/towners.h
  37. 2
      defs.h
  38. 5
      enums.h

2
Source/appfat.cpp

@ -523,7 +523,7 @@ void __cdecl DrawDlg(char *pszFmt, ...)
va_start(arglist, pszFmt);
wvsprintf(text, pszFmt, arglist);
va_end(arglist);
SDrawMessageBox(text, "Diablo", MB_TASKMODAL | MB_ICONEXCLAMATION);
SDrawMessageBox(text, APP_NAME, MB_TASKMODAL | MB_ICONEXCLAMATION);
}
#ifdef _DEBUG

12
Source/control.cpp

@ -1136,9 +1136,12 @@ void DrawFlask(BYTE *pCelBuff, int w, int nSrcOff, BYTE *pBuff, int nDstOff, int
*/
void DrawLifeFlask()
{
int filled = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;
plr[myplr]._pHPPer = filled;
double p;
int filled;
p = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;
plr[myplr]._pHPPer = p;
filled = plr[myplr]._pHPPer;
if (filled > 80)
filled = 80;
filled = 80 - filled;
@ -1158,7 +1161,10 @@ void DrawLifeFlask()
*/
void UpdateLifeFlask()
{
int filled = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;
double p;
int filled;
p = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;
filled = p;
plr[myplr]._pHPPer = filled;
if (filled > 69)

14
Source/cursor.cpp

@ -5,17 +5,17 @@
*/
#include "all.h"
int cursH;
int icursH28;
int cursW;
int cursH;
int pcursmonst;
int icursW28;
int icursH28;
BYTE *pCursCels;
int icursH;
/** inv_item value */
char pcursinvitem;
int icursW;
int icursH;
char pcursitem;
char pcursobj;
char pcursplr;
@ -26,7 +26,7 @@ int pcurs;
/* rdata */
/** Maps from objcurs.cel frame number to frame width. */
const int InvItemWidth[180] = {
const int InvItemWidth[] = {
// Cursors
0, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 23,
// Items
@ -46,11 +46,11 @@ const int InvItemWidth[180] = {
2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,
2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,
2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,
2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28
2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,
};
/** Maps from objcurs.cel frame number to frame height. */
const int InvItemHeight[180] = {
const int InvItemHeight[] = {
// Cursors
0, 29, 32, 32, 32, 32, 32, 32, 32, 32, 32, 35,
// Items
@ -70,7 +70,7 @@ const int InvItemHeight[180] = {
3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,
3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,
3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,
3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28
3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,
};
void InitCursor()

8
Source/cursor.h

@ -6,11 +6,11 @@
#ifndef __CURSOR_H__
#define __CURSOR_H__
extern int cursH;
extern int icursH28;
extern int cursW;
extern int cursH;
extern int pcursmonst;
extern int icursW28;
extern int icursH28;
extern BYTE *pCursCels;
extern int icursH;
extern char pcursinvitem;
@ -34,7 +34,7 @@ void CheckRportal();
void CheckCursMove();
/* rdata */
extern const int InvItemWidth[180];
extern const int InvItemHeight[180];
extern const int InvItemWidth[];
extern const int InvItemHeight[];
#endif /* __CURSOR_H__ */

35
Source/diablo.cpp

@ -11,8 +11,8 @@ HWND ghMainWnd;
int glMid1Seed[NUMLEVELS];
int glMid2Seed[NUMLEVELS];
int gnLevelTypeTbl[NUMLEVELS];
int MouseY;
int MouseX;
int MouseY;
BOOL gbGameLoopStartup;
DWORD glSeedTbl[NUMLEVELS];
BOOL gbRunGame;
@ -119,11 +119,11 @@ BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer)
InitPortals();
InitDungMsgs(myplr);
}
if (!gbValidSaveFile || !gbLoadGame)
if (!gbValidSaveFile || !gbLoadGame) {
uMsg = WM_DIABNEWGAME;
else
} else {
uMsg = WM_DIABLOADGAME;
}
run_game_loop(uMsg);
NetClose();
pfile_create_player_description(0, 0);
@ -284,7 +284,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
fault_get_filter();
bNoEvent = diablo_get_not_running();
if (!diablo_find_window("DIABLO") && bNoEvent) {
if (diablo_find_window(GAME_NAME) || !bNoEvent)
return 0;
#ifdef _DEBUG
SFileEnableDirectAccess(TRUE);
#endif
@ -305,11 +307,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
#ifndef SPAWN
{
char szValueName[] = "Intro";
if (!SRegLoadValue("Diablo", szValueName, 0, &nData))
if (!SRegLoadValue(APP_NAME, szValueName, 0, &nData))
nData = 1;
if (nData)
play_movie("gendata\\diablo1.smk", TRUE);
SRegSaveValue("Diablo", szValueName, 0, 0);
SRegSaveValue(APP_NAME, szValueName, 0, 0);
}
#endif
@ -330,9 +332,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
Sleep(300);
DestroyWindow(ghMainWnd);
}
}
return FALSE;
return 0;
}
void diablo_parse_flags(char *args)
@ -349,13 +350,18 @@ void diablo_parse_flags(char *args)
if (_strnicmp("dd_emulate", args, strlen("dd_emulate")) == 0) {
gbEmulate = 1;
args += strlen("dd_emulate");
} else if (_strnicmp("dd_backbuf", args, strlen("dd_backbuf")) == 0) {
continue;
}
if (_strnicmp("dd_backbuf", args, strlen("dd_backbuf")) == 0) {
gbBackBuf = 1;
args += strlen("dd_backbuf");
} else if (_strnicmp("ds_noduplicates", args, strlen("ds_noduplicates")) == 0) {
continue;
}
if (_strnicmp("ds_noduplicates", args, strlen("ds_noduplicates")) == 0) {
gbDupSounds = FALSE;
args += strlen("ds_noduplicates");
} else {
continue;
}
c = tolower(*args);
args++;
#ifdef _DEBUG
@ -483,7 +489,6 @@ void diablo_parse_flags(char *args)
#endif
}
}
}
void diablo_init_screen()
{
@ -1921,7 +1926,8 @@ void diablo_color_cyc_logic()
tc = GetTickCount();
if (tc - color_cycle_timer >= 50) {
color_cycle_timer = tc;
if (palette_get_color_cycling()) {
if (!palette_get_color_cycling())
return;
if (leveltype == DTYPE_HELL) {
lighting_color_cycling();
} else if (leveltype == DTYPE_CAVES) {
@ -1930,4 +1936,3 @@ void diablo_color_cyc_logic()
}
}
}
}

2
Source/diablo.h

@ -10,8 +10,8 @@ extern HWND ghMainWnd;
extern int glMid1Seed[NUMLEVELS];
extern int glMid2Seed[NUMLEVELS];
extern int gnLevelTypeTbl[NUMLEVELS];
extern int MouseY;
extern int MouseX;
extern int MouseY;
extern BOOL gbGameLoopStartup;
extern DWORD glSeedTbl[NUMLEVELS];
extern BOOL gbRunGame;

2
Source/drlg_l2.cpp

@ -7,8 +7,8 @@
#include "all.h"
int nSx1;
int nSx2;
int nSy1;
int nSx2;
int nSy2;
int nRoomCnt;
BYTE predungeon[DMAXX][DMAXY];

2
Source/drlg_l2.h

@ -7,8 +7,8 @@
#define __DRLG_L2_H__
extern int nSx1;
extern int nSx2;
extern int nSy1;
extern int nSx2;
extern int nSy2;
extern int nRoomCnt;
extern BYTE predungeon[DMAXX][DMAXY];

6
Source/drlg_l4.cpp

@ -7,10 +7,10 @@
int diabquad1x;
int diabquad1y;
int diabquad3x;
int diabquad3y;
int diabquad2x;
int diabquad2y;
int diabquad3x;
int diabquad3y;
int diabquad4x;
int diabquad4y;
#ifndef SPAWN
@ -18,8 +18,8 @@ BOOL hallok[20];
int l4holdx;
int l4holdy;
int SP4x1;
int SP4x2;
int SP4y1;
int SP4x2;
int SP4y2;
BYTE L4dungeon[80][80];
BYTE dung[20][20];

6
Source/drlg_l4.h

@ -8,18 +8,18 @@
extern int diabquad1x;
extern int diabquad1y;
extern int diabquad3x;
extern int diabquad3y;
extern int diabquad2x;
extern int diabquad2y;
extern int diabquad3x;
extern int diabquad3y;
extern int diabquad4x;
extern int diabquad4y;
extern BOOL hallok[20];
extern int l4holdx;
extern int l4holdy;
extern int SP4x1;
extern int SP4x2;
extern int SP4y1;
extern int SP4x2;
extern int SP4y2;
extern BYTE L4dungeon[80][80];
extern BYTE dung[20][20];

7
Source/effects.cpp

@ -914,6 +914,7 @@ TSFX sgSFX[] = {
// clang-format on
};
#define PLRSFXS (SFX_WARRIOR | SFX_ROGUE | SFX_SORCEROR)
BOOL effect_is_playing(int nSFX)
{
TSFX *sfx = &sgSFX[nSFX];
@ -1224,7 +1225,7 @@ void sound_init()
{
BYTE mask = 0;
if (gbMaxPlayers > 1) {
mask = SFX_WARRIOR | SFX_ROGUE | SFX_SORCEROR;
mask = PLRSFXS;
} else if (plr[myplr]._pClass == PC_WARRIOR) {
mask = SFX_WARRIOR;
} else if (plr[myplr]._pClass == PC_ROGUE) {
@ -1247,7 +1248,7 @@ void priv_sound_init(BYTE bLoadMask)
return;
}
pc = bLoadMask & (SFX_ROGUE | SFX_WARRIOR | SFX_SORCEROR);
pc = bLoadMask & PLRSFXS;
bLoadMask ^= pc;
for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {
@ -1263,7 +1264,7 @@ void priv_sound_init(BYTE bLoadMask)
continue;
}
if (sgSFX[i].bFlags & (SFX_ROGUE | SFX_WARRIOR | SFX_SORCEROR) && !(sgSFX[i].bFlags & pc)) {
if (sgSFX[i].bFlags & PLRSFXS && !(sgSFX[i].bFlags & pc)) {
continue;
}

4
Source/error.cpp

@ -11,7 +11,7 @@ char msgflag;
char msgcnt;
/** Maps from error_id to error message. */
char *MsgStrings[44] = {
char *MsgStrings[] = {
"",
"No automap available in town",
"No multiplayer functions in demo",
@ -55,7 +55,7 @@ char *MsgStrings[44] = {
"You must be at least level 8 to use this.",
"You must be at least level 13 to use this.",
"You must be at least level 17 to use this.",
"Arcane knowledge gained!"
"Arcane knowledge gained!",
};
void InitDiabloMsg(char e)

2
Source/error.h

@ -16,6 +16,6 @@ void ClrDiabloMsg();
void DrawDiabloMsg();
/* data */
extern char *MsgStrings[44];
extern char *MsgStrings[];
#endif /* __ERROR_H__ */

23
Source/gamemenu.cpp

@ -217,42 +217,31 @@ void gamemenu_get_gamma()
void gamemenu_music_volume(BOOL bActivate)
{
int volume;
if (bActivate) {
if (gbMusicOn) {
gbMusicOn = FALSE;
music_stop();
sound_get_or_set_music_volume(VOLUME_MIN);
gamemenu_get_music();
return;
}
} else {
gbMusicOn = TRUE;
sound_get_or_set_music_volume(VOLUME_MAX);
music_start(leveltype);
gamemenu_get_music();
return;
}
} else {
volume = gamemenu_slider_music_sound(sgOptionsMenu);
sound_get_or_set_music_volume(volume);
if (volume == VOLUME_MIN) {
if (gbMusicOn) {
gbMusicOn = FALSE;
music_stop();
}
gamemenu_get_music();
return;
}
if (gbMusicOn) {
gamemenu_get_music();
return;
}
} else if (!gbMusicOn) {
gbMusicOn = TRUE;
music_start(leveltype);
}
}
gamemenu_get_music();
}

110
Source/gendung.cpp

@ -5,87 +5,85 @@
*/
#include "all.h"
WORD level_frame_types[MAXTILES];
int themeCount;
/**
* List of transparent dPieces
*/
BOOLEAN nTransTable[2049];
//int dword_52D204;
int dMonster[MAXDUNX][MAXDUNY];
BYTE dungeon[DMAXX][DMAXY];
char dObject[MAXDUNX][MAXDUNY];
BYTE *pSpeedCels;
int nlevel_frames;
BYTE pdungeon[DMAXX][DMAXY];
char dDead[MAXDUNX][MAXDUNY];
MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
char dPreLight[MAXDUNX][MAXDUNY];
char TransVal;
int MicroTileLen;
char dflags[DMAXX][DMAXY];
int dPiece[MAXDUNX][MAXDUNY];
char dLight[MAXDUNX][MAXDUNY];
int setpc_x;
int setpc_y;
int setpc_w;
int setpc_h;
BYTE *pSetPiece;
BOOL setloadflag;
int tile_defs[MAXTILES];
BYTE *pSpecialCels;
BYTE *pMegaTiles;
BYTE *pLevelPieces;
int gnDifficulty;
BYTE *pDungeonCels;
BYTE *pSpeedCels;
int SpeedFrameTbl[128][16];
/**
* List of transparancy masks to use for dPieces
*/
char block_lvid[2049];
//char byte_5B78EB;
char dTransVal[MAXDUNX][MAXDUNY];
BOOLEAN nTrapTable[2049];
BYTE leveltype;
BYTE currlevel;
BOOLEAN TransList[256];
int level_frame_count[MAXTILES];
int tile_defs[MAXTILES];
WORD level_frame_types[MAXTILES];
int level_frame_sizes[MAXTILES];
int nlevel_frames;
/**
* List of light blocking dPieces
*/
BOOLEAN nBlockTable[2049];
/**
* List of path blocking dPieces
*/
BOOLEAN nSolidTable[2049];
int level_frame_count[MAXTILES];
ScrollStruct ScrollInfo;
BYTE *pDungeonCels;
int SpeedFrameTbl[128][16];
THEME_LOC themeLoc[MAXTHEMES];
char dPlayer[MAXDUNX][MAXDUNY];
int ViewBX;
int ViewBY;
int ViewDX;
int ViewDY;
char dSpecial[MAXDUNX][MAXDUNY];
/**
* List of light blocking dPieces
* List of transparent dPieces
*/
BOOLEAN nBlockTable[2049];
BYTE *pSpecialCels;
char dFlags[MAXDUNX][MAXDUNY];
char dItem[MAXDUNX][MAXDUNY];
BYTE setlvlnum;
int level_frame_sizes[MAXTILES];
BOOLEAN nTransTable[2049];
/**
* List of missile blocking dPieces
*/
BOOLEAN nMissileTable[2049];
BYTE *pSetPiece;
char setlvltype;
BOOLEAN setlevel;
int LvlViewY;
int LvlViewX;
BOOLEAN nTrapTable[2049];
int dminx;
int dminy;
int dmaxx;
int dmaxy;
int setpc_h;
int setpc_w;
int setpc_x;
int gnDifficulty;
BYTE leveltype;
BYTE currlevel;
BOOLEAN setlevel;
BYTE setlvlnum;
char setlvltype;
int ViewX;
int ViewY;
int setpc_y;
char dMissile[MAXDUNX][MAXDUNY];
int dminx;
int dminy;
int ViewBX;
int ViewBY;
int ViewDX;
int ViewDY;
ScrollStruct ScrollInfo;
int LvlViewX;
int LvlViewY;
int MicroTileLen;
char TransVal;
BOOLEAN TransList[256];
int dPiece[MAXDUNX][MAXDUNY];
MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY];
MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
char dTransVal[MAXDUNX][MAXDUNY];
char dLight[MAXDUNX][MAXDUNY];
char dPreLight[MAXDUNX][MAXDUNY];
char dFlags[MAXDUNX][MAXDUNY];
char dPlayer[MAXDUNX][MAXDUNY];
int dMonster[MAXDUNX][MAXDUNY];
char dDead[MAXDUNX][MAXDUNY];
char dObject[MAXDUNX][MAXDUNY];
char dItem[MAXDUNX][MAXDUNY];
char dMissile[MAXDUNX][MAXDUNY];
char dSpecial[MAXDUNX][MAXDUNY];
int themeCount;
THEME_LOC themeLoc[MAXTHEMES];
void FillSolidBlockTbls()
{

96
Source/gendung.h

@ -6,72 +6,70 @@
#ifndef __GENDUNG_H__
#define __GENDUNG_H__
extern WORD level_frame_types[MAXTILES];
extern int themeCount;
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 BYTE pdungeon[DMAXX][DMAXY];
extern char dDead[MAXDUNX][MAXDUNY];
extern MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
extern char dPreLight[MAXDUNX][MAXDUNY];
extern char TransVal;
extern int MicroTileLen;
extern char dflags[DMAXX][DMAXY];
extern int dPiece[MAXDUNX][MAXDUNY];
extern char dLight[MAXDUNX][MAXDUNY];
extern int setpc_x;
extern int setpc_y;
extern int setpc_w;
extern int setpc_h;
extern BYTE *pSetPiece;
extern BOOL setloadflag;
extern int tile_defs[MAXTILES];
extern BYTE *pSpecialCels;
extern BYTE *pMegaTiles;
extern BYTE *pLevelPieces;
extern int gnDifficulty;
extern BYTE *pDungeonCels;
extern BYTE *pSpeedCels;
extern int SpeedFrameTbl[128][16];
extern char block_lvid[2049];
//char byte_5B78EB;
extern char dTransVal[MAXDUNX][MAXDUNY];
extern int level_frame_count[MAXTILES];
extern int tile_defs[MAXTILES];
extern WORD level_frame_types[MAXTILES];
extern int level_frame_sizes[MAXTILES];
extern int nlevel_frames;
extern BOOLEAN nBlockTable[2049];
extern BOOLEAN nSolidTable[2049];
extern BOOLEAN nTransTable[2049];
extern BOOLEAN nMissileTable[2049];
extern BOOLEAN nTrapTable[2049];
extern int dminx;
extern int dminy;
extern int dmaxx;
extern int dmaxy;
extern int gnDifficulty;
extern BYTE leveltype;
extern BYTE currlevel;
extern BOOLEAN TransList[256];
extern BOOLEAN nSolidTable[2049];
extern int level_frame_count[MAXTILES];
extern ScrollStruct ScrollInfo;
extern BYTE *pDungeonCels;
extern int SpeedFrameTbl[128][16];
extern THEME_LOC themeLoc[MAXTHEMES];
extern char dPlayer[MAXDUNX][MAXDUNY];
extern BOOLEAN setlevel;
extern BYTE setlvlnum;
extern char setlvltype;
extern int ViewX;
extern int ViewY;
extern int ViewBX;
extern int ViewBY;
extern int ViewDX;
extern int ViewDY;
extern char dSpecial[MAXDUNX][MAXDUNY];
extern BOOLEAN nBlockTable[2049];
extern BYTE *pSpecialCels;
extern ScrollStruct ScrollInfo;
extern int LvlViewX;
extern int LvlViewY;
extern int MicroTileLen;
extern char TransVal;
extern BOOLEAN TransList[256];
extern int dPiece[MAXDUNX][MAXDUNY];
extern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY];
extern MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];
extern char dTransVal[MAXDUNX][MAXDUNY];
extern char dLight[MAXDUNX][MAXDUNY];
extern char dPreLight[MAXDUNX][MAXDUNY];
extern char dFlags[MAXDUNX][MAXDUNY];
extern char dPlayer[MAXDUNX][MAXDUNY];
extern int dMonster[MAXDUNX][MAXDUNY];
extern char dDead[MAXDUNX][MAXDUNY];
extern char dObject[MAXDUNX][MAXDUNY];
extern char dItem[MAXDUNX][MAXDUNY];
extern BYTE setlvlnum;
extern int level_frame_sizes[MAXTILES];
extern BOOLEAN nMissileTable[2049];
extern BYTE *pSetPiece;
extern char setlvltype;
extern BOOLEAN setlevel;
extern int LvlViewY;
extern int LvlViewX;
extern int dmaxx;
extern int dmaxy;
extern int setpc_h;
extern int setpc_w;
extern int setpc_x;
extern int ViewX;
extern int ViewY;
extern int setpc_y;
extern char dMissile[MAXDUNX][MAXDUNY];
extern int dminx;
extern int dminy;
extern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY];
extern char dSpecial[MAXDUNX][MAXDUNY];
extern int themeCount;
extern THEME_LOC themeLoc[MAXTHEMES];
void FillSolidBlockTbls();
void MakeSpeedCels();

5
Source/inv.cpp

@ -1542,8 +1542,9 @@ void AutoGetItem(int pnum, int ii)
dropGoldValue = 0;
}
if (ii != MAXITEMS && !dItem[item[ii]._ix][item[ii]._iy]) {
return;
if (ii != MAXITEMS) {
if (dItem[item[ii]._ix][item[ii]._iy] == 0)
return;
}
item[ii]._iCreateInfo &= 0x7FFF;

2
Source/itemdat.cpp

@ -17,7 +17,7 @@ ItemDataStruct AllItemsList[] = {
{ IDROP_NEVER, ICLASS_WEAPON, ILOC_TWOHAND, ICURS_SHORT_STAFF, 10, UITYPE_NONE, "Short Staff of Charged Bolt", NULL, 1, 25, 2, 4, 0, 0, 0, 20, 0, ISPL_NONE, IMISC_STAFF, SPL_CBOLT, FALSE, 520, 520 },
{ IDROP_NEVER, ICLASS_WEAPON, ILOC_TWOHAND, ICURS_CLEAVER, 2, UITYPE_CLEAVER, "Cleaver", NULL, 10, 10, 4, 24, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, FALSE, 2000, 2000 },
{ IDROP_NEVER, ICLASS_ARMOR, ILOC_HELM, ICURS_THE_UNDEAD_CROWN, 7, UITYPE_SKCROWN, "The Undead Crown", NULL, 0, 50, 0, 0, 15, 15, 0, 0, 0, ISPL_RNDSTEALLIFE, IMISC_UNIQUE, SPL_NULL, FALSE, 10000, 10000 },
{ IDROP_NEVER, ICLASS_MISC, ILOC_RING, ICURS_EMPYREAN_BAND, 12, UITYPE_INFRARING, "Empyrean Band", NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, FALSE, 8000, 8000 },
{ IDROP_NEVER, ICLASS_MISC, ILOC_RING, ICURS_EMPYREAN_BAND, 12, UITYPE_INFRARING, "Empyrean Band", NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, FALSE, 8000, 8000 },
{ IDROP_NEVER, ICLASS_QUEST, ILOC_UNEQUIPABLE, ICURS_MAGIC_ROCK, 0, UITYPE_NONE, "Magic Rock", NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_NONE, SPL_NULL, FALSE, 0, 0 },
{ IDROP_NEVER, ICLASS_MISC, ILOC_AMULET, ICURS_OPTIC_AMULET, 13, UITYPE_OPTAMULET, "Optic Amulet", NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, FALSE, 5000, 5000 },
{ IDROP_NEVER, ICLASS_MISC, ILOC_RING, ICURS_RING_OF_TRUTH, 12, UITYPE_TRING, "Ring of Truth", NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, ISPL_NONE, IMISC_UNIQUE, SPL_NULL, FALSE, 1000, 1000 },

28
Source/items.cpp

@ -19,7 +19,7 @@ int gnNumGetRecords;
/* data */
BYTE ItemCAnimTbl[169] = {
BYTE ItemCAnimTbl[] = {
20, 16, 16, 16, 4, 4, 4, 12, 12, 12,
12, 12, 12, 12, 12, 21, 21, 25, 12, 28,
28, 28, 0, 0, 0, 32, 0, 0, 0, 24,
@ -38,7 +38,7 @@ BYTE ItemCAnimTbl[169] = {
14, 17, 17, 17, 0, 34, 1, 0, 3, 17,
8, 8, 6, 1, 3, 3, 11, 3, 4
};
char *ItemDropNames[ITEMTYPES] = {
char *ItemDropNames[] = {
"Armor2",
"Axe",
"FBttle",
@ -73,9 +73,9 @@ char *ItemDropNames[ITEMTYPES] = {
"Innsign",
"Bldstn",
"Fanvil",
"FLazStaf"
"FLazStaf",
};
BYTE ItemAnimLs[ITEMTYPES] = {
BYTE ItemAnimLs[] = {
15,
13,
16,
@ -110,9 +110,9 @@ BYTE ItemAnimLs[ITEMTYPES] = {
13,
13,
13,
8
8,
};
int ItemDropSnds[ITEMTYPES] = {
int ItemDropSnds[] = {
IS_FHARM,
IS_FAXE,
IS_FPOT,
@ -147,9 +147,9 @@ int ItemDropSnds[ITEMTYPES] = {
IS_ISIGN,
IS_FBLST,
IS_FANVL,
IS_FSTAF
IS_FSTAF,
};
int ItemInvSnds[ITEMTYPES] = {
int ItemInvSnds[] = {
IS_IHARM,
IS_IAXE,
IS_IPOT,
@ -184,7 +184,7 @@ int ItemInvSnds[ITEMTYPES] = {
IS_ISIGN,
IS_IBLST,
IS_IANVL,
IS_ISTAF
IS_ISTAF,
};
int idoppely = 16;
int premiumlvladd[6] = { -1, -1, 0, 0, 1, 2 };
@ -340,8 +340,8 @@ void CalcPlrItemVals(int p, BOOL Loadgfx)
ItemStruct *itm = &plr[p].InvBody[i];
if (itm->_itype != ITYPE_NONE && itm->_iStatFlag) {
mind += itm->_iMinDam;
tac += itm->_iAC;
mind += itm->_iMinDam;
maxd += itm->_iMaxDam;
if (itm->_iSpell != SPL_NULL) {
@ -357,7 +357,6 @@ void CalcPlrItemVals(int p, BOOL Loadgfx)
tmpac = 1;
bac += tmpac;
}
dmod += itm->_iPLDamMod;
iflgs |= itm->_iFlags;
sadd += itm->_iPLStr;
madd += itm->_iPLMag;
@ -366,6 +365,7 @@ void CalcPlrItemVals(int p, BOOL Loadgfx)
fr += itm->_iPLFR;
lr += itm->_iPLLR;
mr += itm->_iPLMR;
dmod += itm->_iPLDamMod;
ghit += itm->_iPLGetHit;
lrad += itm->_iPLLight;
ihp += itm->_iPLHP;
@ -393,15 +393,15 @@ void CalcPlrItemVals(int p, BOOL Loadgfx)
}
}
plr[p]._pIMinDam = mind;
plr[p]._pIMaxDam = maxd;
plr[p]._pIAC = tac;
plr[p]._pIBonusDam = bdam;
plr[p]._pIBonusToHit = btohit;
plr[p]._pIBonusAC = bac;
plr[p]._pIFlags = iflgs;
plr[p]._pIGetHit = ghit;
plr[p]._pIMinDam = mind;
plr[p]._pIBonusDamMod = dmod;
plr[p]._pIGetHit = ghit;
if (lrad < 2) {
lrad = 2;
@ -2480,7 +2480,7 @@ void FreeItemGFX()
{
int i;
for (i = 0; i < 35; i++) {
for (i = 0; i < ITEMTYPES; i++) {
MemFreeDbg(itemanims[i]);
}
}

10
Source/items.h

@ -132,11 +132,11 @@ void PutItemRecord(int nSeed, WORD wCI, int nIndex);
/* data */
extern BYTE ItemCAnimTbl[169];
extern char *ItemDropNames[ITEMTYPES];
extern BYTE ItemAnimLs[ITEMTYPES];
extern int ItemDropSnds[ITEMTYPES];
extern int ItemInvSnds[ITEMTYPES];
extern BYTE ItemCAnimTbl[];
extern char *ItemDropNames[];
extern BYTE ItemAnimLs[];
extern int ItemDropSnds[];
extern int ItemInvSnds[];
extern int idoppely;
extern int premiumlvladd[6];

3
Source/lighting.cpp

@ -654,9 +654,8 @@ void DoUnLight(int nXPos, int nYPos, int nRadius)
for (y = min_y; y < max_y; y++) {
for (x = min_x; x < max_x; x++) {
if (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY) {
if (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY)
dLight[x][y] = dPreLight[x][y];
}
}
}
}

80
Source/monster.cpp

@ -17,6 +17,7 @@ BOOLEAN sgbSaveSoundOn;
MonsterStruct monster[MAXMONSTERS];
int totalmonsters;
CMonster Monsters[MAX_LVLMTYPES];
BYTE GraphicTable[NUMLEVELS][MAX_LVLMTYPES];
int monstimgtot;
int uniquetrans;
int nummtypes;
@ -689,15 +690,9 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize)
Monst->mtalkmsg = Uniq->mtalkmsg;
Monst->mlid = AddLight(Monst->_mx, Monst->_my, 3);
if (gbMaxPlayers == 1) {
if (Monst->mtalkmsg) {
Monst->_mgoal = MGOAL_INQUIRING;
}
} else {
if (Monst->_mAi == AI_LAZHELP) {
if (gbMaxPlayers != 1) {
if (Monst->_mAi == AI_LAZHELP)
Monst->mtalkmsg = 0;
}
if (Monst->_mAi != AI_LAZURUS || quests[Q_BETRAYER]._qvar1 <= 3) {
if (Monst->mtalkmsg) {
Monst->_mgoal = MGOAL_INQUIRING;
@ -706,10 +701,12 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize)
Monst->_mgoal = MGOAL_NORMAL;
}
}
else if (Monst->mtalkmsg)
Monst->_mgoal = MGOAL_INQUIRING;
if (gnDifficulty == DIFF_NIGHTMARE) {
Monst->mLevel += 15;
Monst->_mmaxhp = 3 * Monst->_mmaxhp + 64;
Monst->mLevel += 15;
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->mExp = 2 * (Monst->mExp + 1000);
Monst->mMinDamage = 2 * (Monst->mMinDamage + 2);
@ -719,8 +716,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize)
}
if (gnDifficulty == DIFF_HELL) {
Monst->mLevel += 30;
Monst->_mmaxhp = 4 * Monst->_mmaxhp + 192;
Monst->mLevel += 30;
Monst->_mhitpoints = Monst->_mmaxhp;
Monst->mExp = 4 * (Monst->mExp + 1000);
Monst->mMinDamage = 4 * Monst->mMinDamage + 6;
@ -1632,6 +1629,7 @@ void M2MStartHit(int mid, int i, int dam)
void MonstStartKill(int i, int pnum, BOOL sendmsg)
{
int md;
MonsterStruct *Monst;
if ((DWORD)i >= MAXMONSTERS) {
app_fatal("MonstStartKill: Invalid monster %d", i);
@ -1640,19 +1638,20 @@ void MonstStartKill(int i, int pnum, BOOL sendmsg)
app_fatal("MonstStartKill: Monster %d \"%s\" MType NULL", i, monster[i].mName);
}
Monst = &monster[i];
if (pnum >= 0)
monster[i].mWhoHit |= 1 << pnum;
Monst->mWhoHit |= 1 << pnum;
if (pnum < MAX_PLRS && i > MAX_PLRS)
AddPlrMonstExper(monster[i].mLevel, monster[i].mExp, monster[i].mWhoHit);
monstkills[monster[i].MType->mtype]++;
monster[i]._mhitpoints = 0;
SetRndSeed(monster[i]._mRndSeed);
if (QuestStatus(Q_GARBUD) && monster[i].mName == UniqMonst[UMT_GARBUD].mName) {
CreateTypeItem(monster[i]._mx + 1, monster[i]._my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE);
AddPlrMonstExper(Monst->mLevel, Monst->mExp, Monst->mWhoHit);
monstkills[Monst->MType->mtype]++;
Monst->_mhitpoints = 0;
SetRndSeed(Monst->_mRndSeed);
if (QuestStatus(Q_GARBUD) && Monst->mName == UniqMonst[UMT_GARBUD].mName) {
CreateTypeItem(Monst->_mx + 1, Monst->_my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE);
} else if (i > MAX_PLRS - 1) { // Golems should not spawn items
SpawnItem(i, monster[i]._mx, monster[i]._my, sendmsg);
SpawnItem(i, Monst->_mx, Monst->_my, sendmsg);
}
if (monster[i].MType->mtype == MT_DIABLO)
if (Monst->MType->mtype == MT_DIABLO)
M_DiabloDeath(i, TRUE);
else
PlayEffect(i, 2);
@ -1660,24 +1659,24 @@ void MonstStartKill(int i, int pnum, BOOL sendmsg)
if (pnum >= 0)
md = M_GetDir(i);
else
md = monster[i]._mdir;
monster[i]._mdir = md;
NewMonsterAnim(i, monster[i].MType->Anims[MA_DEATH], md);
monster[i]._mmode = MM_DEATH;
monster[i]._mxoff = 0;
monster[i]._myoff = 0;
monster[i]._mVar1 = 0;
monster[i]._mx = monster[i]._moldx;
monster[i]._my = monster[i]._moldy;
monster[i]._mfutx = monster[i]._moldx;
monster[i]._mfuty = monster[i]._moldy;
md = Monst->_mdir;
Monst->_mdir = md;
NewMonsterAnim(i, Monst->MType->Anims[MA_DEATH], md);
Monst->_mmode = MM_DEATH;
Monst->_mxoff = 0;
Monst->_myoff = 0;
Monst->_mVar1 = 0;
Monst->_mx = Monst->_moldx;
Monst->_my = Monst->_moldy;
Monst->_mfutx = Monst->_moldx;
Monst->_mfuty = Monst->_moldy;
M_CheckEFlag(i);
M_ClearSquares(i);
dMonster[monster[i]._mx][monster[i]._my] = i + 1;
dMonster[Monst->_mx][Monst->_my] = i + 1;
CheckQuestKill(i, sendmsg);
M_FallenFear(monster[i]._mx, monster[i]._my);
if (monster[i].MType->mtype >= MT_NACID && monster[i].MType->mtype <= MT_XACID)
AddMissile(monster[i]._mx, monster[i]._my, 0, 0, 0, MIS_ACIDPUD, 1, i, monster[i]._mint + 1, 0);
M_FallenFear(Monst->_mx, Monst->_my);
if (Monst->MType->mtype >= MT_NACID && Monst->MType->mtype <= MT_XACID)
AddMissile(Monst->_mx, Monst->_my, 0, 0, 0, MIS_ACIDPUD, 1, i, Monst->_mint + 1, 0);
}
void M2MStartKill(int i, int mid)
@ -5510,19 +5509,20 @@ BOOL CheckMonsterHit(int m, BOOL &ret)
}
if (monster[m]._mAi == AI_GARG && monster[m]._mFlags & MFLAG_ALLOW_SPECIAL) {
monster[m]._mmode = MM_SATTACK;
monster[m]._mFlags &= ~MFLAG_ALLOW_SPECIAL;
monster[m]._mmode = MM_SATTACK;
ret = TRUE;
return TRUE;
}
if (monster[m].MType->mtype < MT_COUNSLR || monster[m].MType->mtype > MT_ADVOCATE || monster[m]._mgoal == MGOAL_NORMAL) {
return FALSE;
} else {
ret = FALSE;
if (monster[m].MType->mtype >= MT_COUNSLR && monster[m].MType->mtype <= MT_ADVOCATE) {
if (monster[m]._mgoal != MGOAL_NORMAL) {
ret = FALSE;
return TRUE;
}
}
return TRUE;
return FALSE;
}
int encode_enemy(int m)

1
Source/monster.h

@ -13,6 +13,7 @@ extern int nummonsters;
extern MonsterStruct monster[MAXMONSTERS];
extern int totalmonsters;
extern CMonster Monsters[MAX_LVLMTYPES];
extern BYTE GraphicTable[NUMLEVELS][MAX_LVLMTYPES];
extern int monstimgtot;
extern int uniquetrans;
extern int nummtypes;

8
Source/mpqapi.cpp

@ -62,9 +62,9 @@ BOOL mpqapi_reg_load_modification_time(char *dst, int size)
pszDst = dst;
memset(dst, 0, size);
#ifdef SPAWN
if (!SRegLoadData("Diablo", "Audio Playback ", 0, (BYTE *)pszDst, size, &nbytes_read)) {
if (!SRegLoadData(APP_NAME, "Audio Playback ", 0, (BYTE *)pszDst, size, &nbytes_read)) {
#else
if (!SRegLoadData("Diablo", "Video Player ", 0, (BYTE *)pszDst, size, &nbytes_read)) {
if (!SRegLoadData(APP_NAME, "Video Player ", 0, (BYTE *)pszDst, size, &nbytes_read)) {
#endif
return FALSE;
}
@ -132,9 +132,9 @@ BOOLEAN mpqapi_reg_store_modification_time(char *pbData, DWORD dwLen)
}
#ifdef SPAWN
return SRegSaveData("Diablo", "Audio Playback ", 0, (BYTE *)pbData, dwLen);
return SRegSaveData(APP_NAME, "Audio Playback ", 0, (BYTE *)pbData, dwLen);
#else
return SRegSaveData("Diablo", "Video Player ", 0, (BYTE *)pbData, dwLen);
return SRegSaveData(APP_NAME, "Video Player ", 0, (BYTE *)pbData, dwLen);
#endif
}

2
Source/multi.cpp

@ -772,7 +772,7 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)
gnDifficulty = sgGameInitInfo.bDiff;
SetRndSeed(sgGameInitInfo.dwSeed);
for (i = 0; i < 17; i++) {
for (i = 0; i < NUMLEVELS; i++) {
glSeedTbl[i] = GetRndSeed();
gnLevelTypeTbl[i] = InitLevelType(i);
}

126
Source/objects.cpp

@ -196,12 +196,13 @@ void InitRndLocBigObj(int min, int max, int objtype)
void InitRndLocObj5x5(int min, int max, int objtype)
{
BOOL exit;
int xp, yp, numobjs, i, k, m, n;
int xp, yp, numobjs, i, cnt, m, n;
numobjs = min + random_(139, max - min);
for (i = 0; i < numobjs; i++) {
k = 0;
for (;;) {
cnt = 0;
exit = FALSE;
while (!exit) {
exit = TRUE;
xp = random_(139, 80) + 16;
yp = random_(139, 80) + 16;
@ -211,11 +212,11 @@ void InitRndLocObj5x5(int min, int max, int objtype)
exit = FALSE;
}
}
if (exit)
break;
k++;
if (k > 20000)
return;
if (!exit) {
cnt++;
if (cnt > 20000)
return;
}
}
AddObject(objtype, xp, yp);
}
@ -286,11 +287,12 @@ void AddCandles()
void AddBookLever(int lx1, int ly1, int lx2, int ly2, int x1, int y1, int x2, int y2, int msg)
{
BOOL exit;
int xp, yp, ob, k, m, n;
DIABOOL exit;
int xp, yp, ob, cnt, m, n;
k = 0;
for (;;) {
cnt = 0;
exit = FALSE;
while (!exit) {
exit = TRUE;
xp = random_(139, 80) + 16;
yp = random_(139, 80) + 16;
@ -300,11 +302,11 @@ void AddBookLever(int lx1, int ly1, int lx2, int ly2, int x1, int y1, int x2, in
exit = FALSE;
}
}
if (exit)
break;
k++;
if (k > 20000)
if (!exit) {
cnt++;
if (cnt > 20000)
return;
}
}
if (QuestStatus(Q_BLIND))
@ -619,7 +621,8 @@ void AddStoryBooks()
BOOL done;
cnt = 0;
while (TRUE) {
done = FALSE;
while (!done) {
done = TRUE;
xp = random_(139, 80) + 16;
yp = random_(139, 80) + 16;
@ -629,11 +632,11 @@ void AddStoryBooks()
done = FALSE;
}
}
if (done)
break;
if (!done) {
cnt++;
if (cnt > 20000)
return;
}
}
AddObject(OBJ_STORYBOOK, xp, yp);
AddObject(OBJ_STORYCANDLE, xp - 2, yp + 1);
@ -707,8 +710,9 @@ void AddLazStand()
BOOL found;
cnt = 0;
while (TRUE) {
found = 1;
found = FALSE;
while (!found) {
found = TRUE;
xp = random_(139, 80) + 16;
yp = random_(139, 80) + 16;
for (yy = -3; yy <= 3; yy++) {
@ -717,15 +721,14 @@ void AddLazStand()
found = FALSE;
}
}
if (found)
break;
if (!found) {
cnt++;
if (cnt > 10000) {
InitRndLocObj(1, 1, OBJ_LAZSTAND);
return;
}
}
}
AddObject(OBJ_LAZSTAND, xp, yp);
AddObject(OBJ_TNUDEM2, xp, yp + 2);
AddObject(OBJ_STORYCANDLE, xp + 1, yp + 2);
@ -829,9 +832,9 @@ void InitObjects()
InitRndBarrels();
AddL4Goodies();
}
InitRndLocObj(5, 10, 5);
InitRndLocObj(3, 6, 6);
InitRndLocObj(1, 5, 7);
InitRndLocObj(5, 10, OBJ_CHEST1);
InitRndLocObj(3, 6, OBJ_CHEST2);
InitRndLocObj(1, 5, OBJ_CHEST3);
if (leveltype != DTYPE_HELL)
AddObjTraps();
if (leveltype > DTYPE_CATHEDRAL)
@ -1104,7 +1107,8 @@ void AddBarrel(int i, int t)
void AddShrine(int i)
{
int val, j, slist[NUM_SHRINETYPE];
int val, j;
BOOL slist[NUM_SHRINETYPE];
object[i]._oPreFlag = TRUE;
for (j = 0; j < NUM_SHRINETYPE; j++) {
@ -1113,22 +1117,16 @@ void AddShrine(int i)
} else {
slist[j] = 1;
}
if (gbMaxPlayers != 1) {
if (shrineavail[j] == 1) {
if (gbMaxPlayers != 1 && shrineavail[j] == 1) {
slist[j] = 0;
}
} else {
if (shrineavail[j] == 2) {
if (gbMaxPlayers == 1 && shrineavail[j] == 2) {
slist[j] = 0;
}
}
}
while (1) {
do {
val = random_(150, NUM_SHRINETYPE);
if (slist[val]) {
break;
}
}
} while (!slist[val]);
object[i]._oVar1 = val;
if (random_(150, 2)) {
@ -1548,21 +1546,21 @@ void Obj_StopAnim(int i)
void Obj_Door(int i)
{
int dx, dy;
BOOL dok;
if (!object[i]._oVar4) {
object[i]._oMissFlag = FALSE;
if (object[i]._oVar4 == 0) {
object[i]._oSelFlag = 3;
object[i]._oMissFlag = FALSE;
} else {
dy = object[i]._oy;
dx = object[i]._ox;
dy = object[i]._oy;
dok = !dMonster[dx][dy];
dok = dok & !dItem[dx][dy];
dok = dok & !dDead[dx][dy];
dok = dok & !dPlayer[dx][dy];
object[i]._oSelFlag = 2;
object[i]._oVar4 = dok ? 1 : 2;
object[i]._oMissFlag = TRUE;
object[i]._oVar4 = (((dItem[dx][dy] == 0 ? 1 : 0)
& (dDead[dx][dy] == 0 ? 1 : 0)
& (dPlayer[dx][dy] == 0 ? 1 : 0)
& (dMonster[dx][dy] == 0 ? 1 : 0))
== 0)
+ 1;
}
}
@ -2427,6 +2425,7 @@ void OperateBook(int pnum, int i)
{
int j, oi;
int dx, dy;
int otype;
BOOL do_add_missile, missile_added;
if (object[i]._oSelFlag == 0)
@ -2436,20 +2435,19 @@ void OperateBook(int pnum, int i)
missile_added = FALSE;
for (j = 0; j < nobjects; j++) {
oi = objectactive[j];
if (object[oi]._otype == OBJ_MCIRCLE2) {
if (object[oi]._oVar6 == 1) {
otype = object[oi]._otype;
if (otype == OBJ_MCIRCLE2 && object[oi]._oVar6 == 1) {
dx = 27;
dy = 29;
object[oi]._oVar6 = 4;
do_add_missile = TRUE;
}
if (object[oi]._oVar6 == 2) {
if (otype == OBJ_MCIRCLE2 && object[oi]._oVar6 == 2) {
dx = 43;
dy = 29;
object[oi]._oVar6 = 4;
do_add_missile = TRUE;
}
}
if (do_add_missile) {
object[dObject[35][36] - 1]._oVar5++;
AddMissile(plr[pnum]._px, plr[pnum]._py, dx, dy, plr[pnum]._pdir, MIS_RNDTELEPORT, 0, pnum, 0, 0);
@ -2460,8 +2458,8 @@ void OperateBook(int pnum, int i)
if (!missile_added)
return;
}
object[i]._oAnimFrame++;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame++;
if (!setlevel)
return;
@ -2574,8 +2572,8 @@ void OperateChest(int pnum, int i, BOOL sendmsg)
if (object[i]._oSelFlag != 0) {
if (!deltaload)
PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);
object[i]._oAnimFrame += 2;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame += 2;
if (!deltaload) {
SetRndSeed(object[i]._oRndSeed);
if (setlevel) {
@ -2664,8 +2662,8 @@ void OperateInnSignChest(int pnum, int i)
if (object[i]._oSelFlag != 0) {
if (!deltaload)
PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);
object[i]._oAnimFrame += 2;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame += 2;
if (!deltaload) {
GetSuperItemLoc(object[i]._ox, object[i]._oy, x, y);
SpawnQuestItem(IDI_BANNER, x, y, 0, 0);
@ -3462,8 +3460,8 @@ void OperateSkelBook(int pnum, int i, BOOL sendmsg)
if (object[i]._oSelFlag != 0) {
if (!deltaload)
PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);
object[i]._oAnimFrame += 2;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame += 2;
if (!deltaload) {
SetRndSeed(object[i]._oRndSeed);
if (random_(161, 5))
@ -3481,8 +3479,8 @@ void OperateBookCase(int pnum, int i, BOOL sendmsg)
if (object[i]._oSelFlag != 0) {
if (!deltaload)
PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);
object[i]._oAnimFrame -= 2;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame -= 2;
if (!deltaload) {
SetRndSeed(object[i]._oRndSeed);
CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_BOOK, sendmsg, FALSE);
@ -3519,8 +3517,8 @@ void OperateArmorStand(int pnum, int i, BOOL sendmsg)
BOOL uniqueRnd;
if (object[i]._oSelFlag != 0) {
object[i]._oAnimFrame++;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame++;
if (!deltaload) {
SetRndSeed(object[i]._oRndSeed);
uniqueRnd = random_(0, 2);
@ -3728,8 +3726,8 @@ void OperateWeaponRack(int pnum, int i, BOOL sendmsg)
break;
}
object[i]._oAnimFrame++;
object[i]._oSelFlag = 0;
object[i]._oAnimFrame++;
if (deltaload)
return;
@ -3898,9 +3896,7 @@ void SyncOpL1Door(int pnum, int cmd, int i)
return;
do_sync = FALSE;
if (cmd == CMD_OPENDOOR) {
if (object[i]._oVar4 != 0)
return;
if (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {
do_sync = TRUE;
}
if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)
@ -3921,9 +3917,7 @@ void SyncOpL2Door(int pnum, int cmd, int i)
return;
do_sync = FALSE;
if (cmd == CMD_OPENDOOR) {
if (object[i]._oVar4 != 0)
return;
if (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {
do_sync = TRUE;
}
if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)
@ -3944,9 +3938,7 @@ void SyncOpL3Door(int pnum, int cmd, int i)
return;
do_sync = FALSE;
if (cmd == CMD_OPENDOOR) {
if (object[i]._oVar4 != 0)
return;
if (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {
do_sync = TRUE;
}
if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)

8
Source/palette.cpp

@ -46,8 +46,8 @@ static void ApplyGamma(PALETTEENTRY *dst, PALETTEENTRY *src, int n)
void SaveGamma()
{
SRegSaveValue("Diablo", "Gamma Correction", 0, gamma_correction);
SRegSaveValue("Diablo", "Color Cycling", FALSE, color_cycling_enabled);
SRegSaveValue(APP_NAME, "Gamma Correction", 0, gamma_correction);
SRegSaveValue(APP_NAME, "Color Cycling", FALSE, color_cycling_enabled);
}
static void LoadGamma()
@ -56,7 +56,7 @@ static void LoadGamma()
int value;
value = gamma_correction;
if (!SRegLoadValue("Diablo", "Gamma Correction", 0, &value))
if (!SRegLoadValue(APP_NAME, "Gamma Correction", 0, &value))
value = 100;
gamma_value = value;
if (value < 30) {
@ -65,7 +65,7 @@ static void LoadGamma()
gamma_value = 100;
}
gamma_correction = gamma_value - gamma_value % 5;
if (!SRegLoadValue("Diablo", "Color Cycling", 0, &value))
if (!SRegLoadValue(APP_NAME, "Color Cycling", 0, &value))
value = 1;
color_cycling_enabled = value;
}

82
Source/player.cpp

@ -835,11 +835,11 @@ void InitPlayer(int pnum, BOOL FirstTime)
ClearPlrRVars(&plr[pnum]);
if (FirstTime) {
plr[pnum]._pRSplType = RSPLTYPE_INVALID;
plr[pnum]._pRSpell = SPL_INVALID;
plr[pnum]._pSBkSpell = SPL_INVALID;
plr[pnum]._pSpell = SPL_INVALID;
plr[pnum]._pRSplType = RSPLTYPE_INVALID;
plr[pnum]._pSplType = RSPLTYPE_INVALID;
plr[pnum]._pSpell = plr[pnum]._pRSpell;
plr[pnum]._pSplType = plr[pnum]._pRSplType;
if ((plr[pnum]._pgfxnum & 0xF) == ANIM_ID_BOW) {
plr[pnum]._pwtype = WT_RANGED;
} else {
@ -1204,9 +1204,12 @@ void PM_ChangeOffset(int pnum)
plr[pnum]._pxoff = plr[pnum]._pVar6 >> 8;
plr[pnum]._pyoff = plr[pnum]._pVar7 >> 8;
px -= plr[pnum]._pVar6 >> 8;
py -= plr[pnum]._pVar7 >> 8;
if (pnum == myplr && ScrollInfo._sdir) {
ScrollInfo._sxoff += px - plr[pnum]._pxoff;
ScrollInfo._syoff += py - plr[pnum]._pyoff;
ScrollInfo._sxoff += px;
ScrollInfo._syoff += py;
}
PM_ChangeLightOff(pnum);
@ -1675,7 +1678,8 @@ void StartPlayerKill(int pnum, int earflag)
ItemStruct ear;
ItemStruct *pi;
if (plr[pnum]._pHitPoints <= 0 && plr[pnum]._pmode == PM_DEATH) {
p = &plr[pnum];
if (p->_pHitPoints <= 0 && p->_pmode == PM_DEATH) {
return;
}
@ -1699,34 +1703,33 @@ void StartPlayerKill(int pnum, int earflag)
#endif
}
if (plr[pnum]._pgfxnum) {
plr[pnum]._pgfxnum = 0;
plr[pnum]._pGFXLoad = 0;
if (p->_pgfxnum) {
p->_pgfxnum = 0;
p->_pGFXLoad = 0;
SetPlrAnims(pnum);
}
if (!(plr[pnum]._pGFXLoad & PFILE_DEATH)) {
if (!(p->_pGFXLoad & PFILE_DEATH)) {
LoadPlrGFX(pnum, PFILE_DEATH);
}
p = &plr[pnum];
NewPlrAnim(pnum, p->_pDAnim[plr[pnum]._pdir], p->_pDFrames, 1, p->_pDWidth);
NewPlrAnim(pnum, p->_pDAnim[p->_pdir], p->_pDFrames, 1, p->_pDWidth);
plr[pnum]._pBlockFlag = FALSE;
plr[pnum]._pmode = PM_DEATH;
plr[pnum]._pInvincible = TRUE;
p->_pBlockFlag = FALSE;
p->_pmode = PM_DEATH;
p->_pInvincible = TRUE;
SetPlayerHitPoints(pnum, 0);
plr[pnum]._pVar8 = 1;
p->_pVar8 = 1;
if (pnum != myplr && !earflag && !diablolevel) {
for (i = 0; i < NUM_INVLOC; i++) {
plr[pnum].InvBody[i]._itype = ITYPE_NONE;
p->InvBody[i]._itype = ITYPE_NONE;
}
CalcPlrInv(pnum, FALSE);
}
if (plr[pnum].plrlevel == currlevel) {
FixPlayerLocation(pnum, plr[pnum]._pdir);
FixPlayerLocation(pnum, p->_pdir);
RemovePlrFromMap(pnum);
dFlags[p->_px][p->_py] |= BFLAG_DEAD_PLAYER;
SetPlayerOld(pnum);
@ -1736,7 +1739,7 @@ void StartPlayerKill(int pnum, int earflag)
deathdelay = 30;
if (pcurs >= CURSOR_FIRSTITEM) {
PlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);
PlrDeadItem(pnum, &p->HoldItem, 0, 0);
SetCursor_(CURSOR_HAND);
}
@ -1762,11 +1765,10 @@ void StartPlayerKill(int pnum, int earflag)
PlrDeadItem(pnum, &ear, 0, 0);
}
} else {
pi = &plr[pnum].InvBody[0];
pi = &p->InvBody[0];
i = NUM_INVLOC;
while (i != 0) {
i--;
pdd = (i + plr[pnum]._pdir) & 7;
while (i--) {
pdd = (i + p->_pdir) & 7;
PlrDeadItem(pnum, pi, offset_x[pdd], offset_y[pdd]);
pi++;
}
@ -1827,7 +1829,8 @@ void DropHalfPlayersGold(int pnum)
hGold = plr[pnum]._pGold >> 1;
for (i = 0; i < MAXBELTITEMS && hGold > 0; i++) {
if (plr[pnum].SpdList[i]._itype == ITYPE_GOLD && plr[pnum].SpdList[i]._ivalue != GOLD_MAX_LIMIT) {
if (plr[pnum].SpdList[i]._itype == ITYPE_GOLD &&
plr[pnum].SpdList[i]._ivalue != GOLD_MAX_LIMIT) {
if (hGold < plr[pnum].SpdList[i]._ivalue) {
plr[pnum].SpdList[i]._ivalue -= hGold;
SetSpdbarGoldCurs(pnum, i);
@ -2100,6 +2103,7 @@ BOOL PM_DoStand(int pnum)
BOOL PM_DoWalk(int pnum)
{
int anim_len;
BOOL rv;
if ((DWORD)pnum >= MAX_PLRS) {
app_fatal("PM_DoWalk: illegal player %d", pnum);
@ -2143,17 +2147,19 @@ BOOL PM_DoWalk(int pnum)
if (leveltype != DTYPE_TOWN) {
ChangeLightOff(plr[pnum]._plid, 0, 0);
}
return TRUE;
rv = TRUE;
} else {
PM_ChangeOffset(pnum);
rv = FALSE;
}
PM_ChangeOffset(pnum);
return FALSE;
return rv;
}
BOOL PM_DoWalk2(int pnum)
{
int anim_len;
BOOL rv;
if ((DWORD)pnum >= MAX_PLRS) {
app_fatal("PM_DoWalk2: illegal player %d", pnum);
@ -2190,21 +2196,22 @@ BOOL PM_DoWalk2(int pnum)
}
ClearPlrPVars(pnum);
if (leveltype != DTYPE_TOWN) {
ChangeLightOff(plr[pnum]._plid, 0, 0);
}
return TRUE;
rv = TRUE;
} else {
PM_ChangeOffset(pnum);
rv = FALSE;
}
PM_ChangeOffset(pnum);
return FALSE;
return rv;
}
BOOL PM_DoWalk3(int pnum)
{
int anim_len;
BOOL rv;
if ((DWORD)pnum >= MAX_PLRS) {
app_fatal("PM_DoWalk3: illegal player %d", pnum);
@ -2249,12 +2256,13 @@ BOOL PM_DoWalk3(int pnum)
if (leveltype != DTYPE_TOWN) {
ChangeLightOff(plr[pnum]._plid, 0, 0);
}
return TRUE;
rv = TRUE;
} else {
PM_ChangeOffset(pnum);
rv = FALSE;
}
PM_ChangeOffset(pnum);
return FALSE;
return rv;
}
BOOL WeaponDur(int pnum, int durrnd)

2
Source/quests.cpp

@ -8,8 +8,8 @@ int qline;
int qlist[MAXQUESTS];
int numqlines;
int WaterDone;
int ReturnLvlY;
int ReturnLvlX;
int ReturnLvlY;
int ReturnLvlT;
int ALLQUESTS; /** current frame # for the pentagram selector */
int ReturnLvl;

2
Source/quests.h

@ -10,8 +10,8 @@ extern int qline;
extern int qlist[MAXQUESTS];
extern int numqlines;
extern int WaterDone;
extern int ReturnLvlY;
extern int ReturnLvlX;
extern int ReturnLvlY;
extern int ReturnLvlT;
extern int ALLQUESTS;
extern int ReturnLvl;

2
Source/scrollrt.cpp

@ -2142,8 +2142,6 @@ static void DrawGame(int x, int y)
}
switch (ScrollInfo._sdir) {
case SDIR_NONE:
break;
case SDIR_NE:
chunks++;
case SDIR_N:

4
Source/sound.cpp

@ -270,7 +270,7 @@ void snd_init(HWND hWnd)
void snd_get_volume(char *value_name, int *value)
{
int v = *value;
if (!SRegLoadValue("Diablo", value_name, 0, &v)) {
if (!SRegLoadValue(APP_NAME, value_name, 0, &v)) {
v = VOLUME_MAX;
}
*value = v;
@ -362,7 +362,7 @@ void sound_cleanup()
void snd_set_volume(char *key, int value)
{
SRegSaveValue("Diablo", key, 0, value);
SRegSaveValue(APP_NAME, key, 0, value);
}
void music_stop()

2
Source/textdat.cpp

@ -783,7 +783,7 @@ const TextDataStruct alltext[] = {
1, 3, PS_NAR9 },
#endif
{ "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 }
1, 5, TSFX_TAVERN0 },
};
/** unused */
const DWORD gdwAllTextEntries = 259;

2
Source/textdat.h

@ -2,7 +2,7 @@
#ifndef __TEXTDAT_H__
#define __TEXTDAT_H__
extern const TextDataStruct alltext[259];
extern const TextDataStruct alltext[];
extern const DWORD gdwAllTextEntries;
#endif /* __TEXTDAT_H__ */

62
Source/towners.cpp

@ -91,8 +91,8 @@ int TownCowY[3] = { 16, 14, 20 };
int TownCowDir[3] = { 1, 3, 4 };
int cowoffx[8] = { -1, 0, -1, -1, -1, 0, -1, -1 };
int cowoffy[8] = { -1, -1, -1, 0, -1, -1, -1, 0 };
QuestTalkData Qtalklist[11] = {
// clang-format off
QuestTalkData Qtalklist[] = {
// clang-format off
// _qinfra, _qblkm, _qgarb, _qzhar, _qveil, _qmod, _qbutch, _qbol, _qblind, _qblood, _qanvil, _qwarlrd, _qking, _qpw, _qbone, _qvb
{ TEXT_INFRA6, TEXT_MUSH6, -1, -1, TEXT_VEIL5, -1, TEXT_BUTCH5, TEXT_BANNER6, TEXT_BLIND5, TEXT_BLOOD5, TEXT_ANVIL6, TEXT_WARLRD5, TEXT_KING7, TEXT_POISON7, TEXT_BONE5, TEXT_VILE9 },
{ TEXT_INFRA3, -1, -1, -1, TEXT_VEIL3, -1, TEXT_BUTCH3, TEXT_BANNER4, TEXT_BLIND3, TEXT_BLOOD3, TEXT_ANVIL3, TEXT_WARLRD3, TEXT_KING5, TEXT_POISON4, TEXT_BONE3, TEXT_VILE7 },
@ -446,12 +446,13 @@ void TownDead()
tidx = GetActiveTowner(TOWN_DEADGUY);
TownCtrlMsg(tidx);
if (!qtextflag) {
if ((quests[Q_BUTCHER]._qactive != QUEST_ACTIVE || quests[Q_BUTCHER]._qlog) && quests[Q_BUTCHER]._qactive != QUEST_INIT) {
if (quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && quests[Q_BUTCHER]._qlog == 0) {
return;
}
if (quests[Q_BUTCHER]._qactive != QUEST_INIT) {
towner[tidx]._tAnimDelay = 1000;
towner[tidx]._tAnimFrame = 1;
strcpy(towner[tidx]._tName, "Slain Townsman");
} else {
return;
}
}
if (quests[Q_BUTCHER]._qactive != QUEST_INIT)
@ -665,15 +666,17 @@ void TalkToTowner(int p, int t)
InitQTextMsg(TEXT_BANNER2);
towner[t]._tMsgSaid = TRUE;
}
if (quests[Q_LTBANNER]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, i) != NULL && !towner[t]._tMsgSaid) {
quests[Q_LTBANNER]._qactive = QUEST_DONE;
quests[Q_LTBANNER]._qvar1 = 3;
RemoveInvItem(p, i);
CreateItem(UITEM_HARCREST, towner[t]._tx, towner[t]._ty + 1);
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_BANNER3);
towner[t]._tMsgSaid = TRUE;
if (quests[Q_LTBANNER]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, i) != NULL) {
if (!towner[t]._tMsgSaid) {
quests[Q_LTBANNER]._qactive = QUEST_DONE;
quests[Q_LTBANNER]._qvar1 = 3;
RemoveInvItem(p, i);
CreateItem(UITEM_HARCREST, towner[t]._tx, towner[t]._ty + 1);
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_BANNER3);
towner[t]._tMsgSaid = TRUE;
}
}
}
if (!qtextflag) {
@ -729,16 +732,18 @@ void TalkToTowner(int p, int t)
InitQTextMsg(TEXT_INFRA5);
towner[t]._tMsgSaid = TRUE;
}
if (quests[Q_ROCK]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, i) != NULL && !towner[t]._tMsgSaid) {
quests[Q_ROCK]._qactive = QUEST_DONE;
quests[Q_ROCK]._qvar2 = 2;
quests[Q_ROCK]._qvar1 = 2;
RemoveInvItem(p, i);
CreateItem(UITEM_INFRARING, towner[t]._tx, towner[t]._ty + 1);
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_INFRA7);
towner[t]._tMsgSaid = TRUE;
if (quests[Q_ROCK]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, i) != NULL) {
if (!towner[t]._tMsgSaid) {
quests[Q_ROCK]._qactive = QUEST_DONE;
quests[Q_ROCK]._qvar2 = 2;
quests[Q_ROCK]._qvar1 = 2;
RemoveInvItem(p, i);
CreateItem(UITEM_INFRARING, towner[t]._tx, towner[t]._ty + 1);
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_INFRA7);
towner[t]._tMsgSaid = TRUE;
}
}
}
if (plr[p]._pLvlVisited[9] && quests[Q_ANVIL]._qactive != QUEST_NOTAVAIL) {
@ -894,16 +899,16 @@ void TalkToTowner(int p, int t)
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_VILE1);
towner[t]._tMsgSaid = TRUE;
quests[Q_BETRAYER]._qactive = QUEST_ACTIVE;
quests[Q_BETRAYER]._qlog = TRUE;
towner[t]._tMsgSaid = TRUE;
} else if (quests[Q_BETRAYER]._qactive == QUEST_DONE && quests[Q_BETRAYER]._qvar1 == 7) {
quests[Q_BETRAYER]._qvar1 = 8;
towner[t]._tbtcnt = 150;
towner[t]._tVar1 = p;
InitQTextMsg(TEXT_VILE3);
quests[Q_DIABLO]._qlog = TRUE;
towner[t]._tMsgSaid = TRUE;
quests[Q_DIABLO]._qlog = TRUE;
}
}
if (gbMaxPlayers != 1) {
@ -931,8 +936,9 @@ void TalkToTowner(int p, int t)
StartStore(STORE_STORY);
}
}
} else if (towner[t]._ttype == TOWN_COW && !qtextflag) {
CowSFX(p);
} else if (towner[t]._ttype == TOWN_COW) {
if (!qtextflag)
CowSFX(p);
}
}

2
Source/towners.h

@ -40,6 +40,6 @@ void CowSFX(int pnum);
/* data */
extern QuestTalkData Qtalklist[11];
extern QuestTalkData Qtalklist[];
#endif /* __TOWNERS_H__ */

2
defs.h

@ -4,7 +4,9 @@
* Global definitions and Macros.
*/
#define DIABOOL BOOL
#define GAME_NAME "DIABLO"
#define APP_NAME "Diablo"
#define DMAXX 40
#define DMAXY 40

5
enums.h

@ -1802,7 +1802,7 @@ typedef enum _speech_id {
TEXT_BOOK31 = 0xFF,
TEXT_BOOK32 = 0x100,
TEXT_BOOK33 = 0x101,
TEXT_INTRO = 0x102
TEXT_INTRO = 0x102,
} _speech_id;
typedef enum object_graphic_id {
@ -2560,7 +2560,8 @@ typedef enum quest_id {
Q_SKELKING = 0xC,
Q_PWATER = 0xD,
Q_SCHAMB = 0xE,
Q_BETRAYER = 0xF
Q_BETRAYER = 0xF,
Q_INVALID = -1,
} quest_id;
typedef enum quest_state {

Loading…
Cancel
Save