diff --git a/Source/drlg_l1.h b/Source/drlg_l1.h index 3a83046fd..e5af13454 100644 --- a/Source/drlg_l1.h +++ b/Source/drlg_l1.h @@ -12,33 +12,19 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern BYTE L5dungeon[80][80]; -extern BYTE L5dflags[DMAXX][DMAXY]; -extern BOOL L5setloadflag; -extern int HR1; -extern int HR2; -extern int HR3; extern int UberRow; extern int UberCol; -extern int dword_577368; extern int IsUberRoomOpened; extern int UberLeverRow; extern int UberLeverCol; extern int IsUberLeverActivated; extern int UberDiabloMonsterIndex; -extern int VR1; -extern int VR2; -extern int VR3; -extern BYTE *L5pSetPiece; void DRLG_Init_Globals(); void LoadL1Dungeon(const char *sFileName, int vx, int vy); void LoadPreL1Dungeon(const char *sFileName, int vx, int vy); void CreateL5Dungeon(DWORD rseed, int entry); #ifdef HELLFIRE -void DRLG_InitL5Vals(); -void drlg_l1_crypt_lavafloor(); -void drlg_l1_crypt_rndset(const BYTE *miniset, int rndper); void drlg_l1_set_crypt_room(int rx1, int ry1); void drlg_l1_set_corner_room(int rx1, int ry1); void drlg_l1_crypt_pattern1(int rndper); @@ -50,22 +36,6 @@ void drlg_l1_crypt_pattern6(int rndper); void drlg_l1_crypt_pattern7(int rndper); #endif -/* rdata */ -extern const ShadowStruct SPATS[37]; - -// BUGFIX: These arrays should contain an additional 0 (207 elements). -extern const BYTE BSTYPES[207]; -extern const BYTE L5BTYPES[207]; - -extern const BYTE STAIRSUP[]; -extern const BYTE L5STAIRSUP[]; -extern const BYTE STAIRSDOWN[]; -extern const BYTE LAMPS[]; -extern const BYTE PWATERIN[]; - -/* data */ -extern BYTE L5ConvTbl[16]; - #ifdef __cplusplus } #endif diff --git a/Source/drlg_l2.h b/Source/drlg_l2.h index 76da5fa99..aa20d7a0f 100644 --- a/Source/drlg_l2.h +++ b/Source/drlg_l2.h @@ -12,145 +12,13 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int nSx1; -extern int nSy1; -extern int nSx2; -extern int nSy2; -extern int nRoomCnt; extern BYTE predungeon[DMAXX][DMAXY]; -extern ROOMNODE RoomList[81]; -extern HALLNODE *pHallList; void InitDungeon(); -void L2LockoutFix(); -void L2DoorFix(); void LoadL2Dungeon(const char *sFileName, int vx, int vy); void LoadPreL2Dungeon(const char *sFileName, int vx, int vy); void CreateL2Dungeon(DWORD rseed, int entry); -/* rdata */ -extern int Area_Min; -extern int Room_Max; -extern int Room_Min; -extern int Dir_Xadd[5]; -extern int Dir_Yadd[5]; -extern ShadowStruct SPATSL2[2]; -//short word_48489A; -extern BYTE BTYPESL2[161]; -extern BYTE BSTYPESL2[161]; -extern BYTE VARCH1[]; -extern BYTE VARCH2[]; -extern BYTE VARCH3[]; -extern BYTE VARCH4[]; -extern BYTE VARCH5[]; -extern BYTE VARCH6[]; -extern BYTE VARCH7[]; -extern BYTE VARCH8[]; -extern BYTE VARCH9[]; -extern BYTE VARCH10[]; -extern BYTE VARCH11[]; -extern BYTE VARCH12[]; -extern BYTE VARCH13[]; -extern BYTE VARCH14[]; -extern BYTE VARCH15[]; -extern BYTE VARCH16[]; -extern BYTE VARCH17[]; -extern BYTE VARCH18[]; -extern BYTE VARCH19[]; -extern BYTE VARCH20[]; -extern BYTE VARCH21[]; -extern BYTE VARCH22[]; -extern BYTE VARCH23[]; -extern BYTE VARCH24[]; -extern BYTE VARCH25[]; -extern BYTE VARCH26[]; -extern BYTE VARCH27[]; -extern BYTE VARCH28[]; -extern BYTE VARCH29[]; -extern BYTE VARCH30[]; -extern BYTE VARCH31[]; -extern BYTE VARCH32[]; -extern BYTE VARCH33[]; -extern BYTE VARCH34[]; -extern BYTE VARCH35[]; -extern BYTE VARCH36[]; -extern BYTE VARCH37[]; -extern BYTE VARCH38[]; -extern BYTE VARCH39[]; -extern BYTE VARCH40[]; -extern BYTE HARCH1[]; -extern BYTE HARCH2[]; -extern BYTE HARCH3[]; -extern BYTE HARCH4[]; -extern BYTE HARCH5[]; -extern BYTE HARCH6[]; -extern BYTE HARCH7[]; -extern BYTE HARCH8[]; -extern BYTE HARCH9[]; -extern BYTE HARCH10[]; -extern BYTE HARCH11[]; -extern BYTE HARCH12[]; -extern BYTE HARCH13[]; -extern BYTE HARCH14[]; -extern BYTE HARCH15[]; -extern BYTE HARCH16[]; -extern BYTE HARCH17[]; -extern BYTE HARCH18[]; -extern BYTE HARCH19[]; -extern BYTE HARCH20[]; -extern BYTE HARCH21[]; -extern BYTE HARCH22[]; -extern BYTE HARCH23[]; -extern BYTE HARCH24[]; -extern BYTE HARCH25[]; -extern BYTE HARCH26[]; -extern BYTE HARCH27[]; -extern BYTE HARCH28[]; -extern BYTE HARCH29[]; -extern BYTE HARCH30[]; -extern BYTE HARCH31[]; -extern BYTE HARCH32[]; -extern BYTE HARCH33[]; -extern BYTE HARCH34[]; -extern BYTE HARCH35[]; -extern BYTE HARCH36[]; -extern BYTE HARCH37[]; -extern BYTE HARCH38[]; -extern BYTE HARCH39[]; -extern BYTE HARCH40[]; -extern BYTE USTAIRS[]; -extern BYTE DSTAIRS[]; -extern BYTE WARPSTAIRS[]; -extern BYTE CRUSHCOL[]; -extern BYTE BIG1[]; -extern BYTE BIG2[]; -extern BYTE BIG3[]; -extern BYTE BIG4[]; -extern BYTE BIG5[]; -extern BYTE BIG6[]; -extern BYTE BIG7[]; -extern BYTE BIG8[]; -extern BYTE BIG9[]; -extern BYTE BIG10[]; -extern BYTE RUINS1[]; -extern BYTE RUINS2[]; -extern BYTE RUINS3[]; -extern BYTE RUINS4[]; -extern BYTE RUINS5[]; -extern BYTE RUINS6[]; -extern BYTE RUINS7[]; -extern BYTE PANCREAS1[]; -extern BYTE PANCREAS2[]; -extern BYTE CTRDOOR1[]; -extern BYTE CTRDOOR2[]; -extern BYTE CTRDOOR3[]; -extern BYTE CTRDOOR4[]; -extern BYTE CTRDOOR5[]; -extern BYTE CTRDOOR6[]; -extern BYTE CTRDOOR7[]; -extern BYTE CTRDOOR8[]; -extern int Patterns[100][10]; - #ifdef __cplusplus } #endif diff --git a/Source/drlg_l3.h b/Source/drlg_l3.h index 72dad1c0b..6a34fe637 100644 --- a/Source/drlg_l3.h +++ b/Source/drlg_l3.h @@ -12,64 +12,11 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern BOOLEAN lavapool; -extern int abyssx; -extern int lockoutcnt; -extern BOOLEAN lockout[DMAXX][DMAXY]; - void AddFenceDoors(); -void FenceDoorFix(); -BOOL DRLG_L3Anvil(); -void FixL3Warp(); -void FixL3HallofHeroes(); -void DRLG_L3LockRec(int x, int y); -BOOL DRLG_L3Lockout(); void CreateL3Dungeon(DWORD rseed, int entry); -#ifdef HELLFIRE -BOOLEAN drlg_l3_hive_rnd_piece(const BYTE *miniset, int rndper); -#endif void LoadL3Dungeon(const char *sFileName, int vx, int vy); void LoadPreL3Dungeon(const char *sFileName, int vx, int vy); -/* rdata */ -extern const BYTE L3ConvTbl[16]; -extern const BYTE L3UP[20]; -extern const BYTE L3DOWN[20]; -extern const BYTE L3HOLDWARP[20]; -extern const BYTE L3TITE1[34]; -extern const BYTE L3TITE2[34]; -extern const BYTE L3TITE3[34]; -extern const BYTE L3TITE6[42]; -extern const BYTE L3TITE7[42]; -extern const BYTE L3TITE8[20]; -extern const BYTE L3TITE9[20]; -extern const BYTE L3TITE10[20]; -extern const BYTE L3TITE11[20]; -extern const BYTE L3TITE12[6]; -extern const BYTE L3TITE13[6]; -extern const BYTE L3CREV1[6]; -extern const BYTE L3CREV2[6]; -extern const BYTE L3CREV3[6]; -extern const BYTE L3CREV4[6]; -extern const BYTE L3CREV5[6]; -extern const BYTE L3CREV6[6]; -extern const BYTE L3CREV7[6]; -extern const BYTE L3CREV8[6]; -extern const BYTE L3CREV9[6]; -extern const BYTE L3CREV10[6]; -extern const BYTE L3CREV11[6]; -extern const BYTE L3ISLE1[14]; -extern const BYTE L3ISLE2[14]; -extern const BYTE L3ISLE3[14]; -extern const BYTE L3ISLE4[14]; -extern const BYTE L3ISLE5[10]; -extern const BYTE L3XTRA1[4]; -extern const BYTE L3XTRA2[4]; -extern const BYTE L3XTRA3[4]; -extern const BYTE L3XTRA4[4]; -extern const BYTE L3XTRA5[4]; -extern const BYTE L3ANVIL[244]; - #ifdef __cplusplus } #endif diff --git a/Source/drlg_l4.h b/Source/drlg_l4.h index ef1463bbe..5b1c6969b 100644 --- a/Source/drlg_l4.h +++ b/Source/drlg_l4.h @@ -20,41 +20,10 @@ 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 SP4y1; -extern int SP4x2; -extern int SP4y2; -extern BYTE L4dungeon[80][80]; -extern BYTE dung[20][20]; -//int dword_52A4DC; - -void LoadPreL4Dungeon(char *sFileName, int vx, int vy); -void LoadL4Dungeon(char *sFileName, int vx, int vy); - -void DRLG_LoadL4SP(); -void DRLG_FreeL4SP(); -void DRLG_L4SetSPRoom(int rx1, int ry1); -void L4SaveQuads(); -void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1); -void DRLG_LoadDiabQuads(BOOL preflag); BOOL IsDURWall(char d); BOOL IsDLLWall(char dd); -void L4FixRim(); -void DRLG_L4GeneralFix(); void CreateL4Dungeon(DWORD rseed, int entry); -/* rdata */ -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]; - #ifdef __cplusplus } #endif diff --git a/Source/dx.h b/Source/dx.h index 9e701ed8d..af495b69b 100644 --- a/Source/dx.h +++ b/Source/dx.h @@ -19,15 +19,12 @@ void lock_buf(BYTE idx); void unlock_buf(BYTE idx); void dx_cleanup(); void dx_reinit(); - void InitPalette(); void BltFast(SDL_Rect *src_rect, SDL_Rect *dst_rect); void Blit(SDL_Surface *src, SDL_Rect *src_rect, SDL_Rect *dst_rect); void RenderPresent(); void PaletteGetEntries(DWORD dwNumEntries, SDL_Color *lpEntries); -void PaletteSetEntries(DWORD dwCount, SDL_Color *lpEntries); -/* data */ #ifdef __cplusplus } #endif diff --git a/Source/gendung.h b/Source/gendung.h index 8ff64e282..a3322192c 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -28,11 +28,6 @@ extern BYTE *pDungeonCels; extern BYTE *pSpeedCels; extern int SpeedFrameTbl[128][16]; extern char block_lvid[MAXTILES + 1]; -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[MAXTILES + 1]; extern BOOLEAN nSolidTable[MAXTILES + 1]; extern BOOLEAN nTransTable[MAXTILES + 1]; @@ -88,8 +83,6 @@ void DRLG_AreaTrans(int num, BYTE *List); void DRLG_InitSetPC(); void DRLG_SetPC(); void Make_SetPC(int x, int y, int w, int h); -BOOL DRLG_WillThemeRoomFit(int floor, int x, int y, int minSize, int maxSize, int *width, int *height); -void DRLG_CreateThemeRoom(int themeIndex); void DRLG_PlaceThemeRooms(int minSize, int maxSize, int floor, int freq, int rndSize); void DRLG_HoldThemeRooms(); BOOL SkipThemeRoom(int x, int y); diff --git a/Source/inv.cpp b/Source/inv.cpp index 465b08ced..f01aec910 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1069,7 +1069,14 @@ void CheckInvPaste(int pnum, int mx, int my) if (plr[pnum].HoldItem._iLoc == il) done = TRUE; if (il == ILOC_ONEHAND && plr[pnum].HoldItem._iLoc == ILOC_TWOHAND) { - il = ILOC_TWOHAND; +#ifdef HELLFIRE + if (plr[pnum]._pClass == PC_BARBARIAN + && (plr[pnum].HoldItem._itype == ITYPE_SWORD || plr[pnum].HoldItem._itype == ITYPE_MACE) + ) + il = ILOC_ONEHAND; + else +#endif + il = ILOC_TWOHAND; done = TRUE; } if (plr[pnum].HoldItem._iLoc == ILOC_UNEQUIPABLE && il == ILOC_BELT) { @@ -1144,6 +1151,14 @@ void CheckInvPaste(int pnum, int mx, int my) PlaySFX(PS_ROGUE13); else if (plr[pnum]._pClass == PC_SORCERER) PlaySFX(PS_MAGE13); +#ifdef HELLFIRE + else if (plr[pnum]._pClass == PC_MONK) + PlaySFX(PS_MONK13); + else if (plr[pnum]._pClass == PC_BARD) + PlaySFX(PS_ROGUE13); + else if (plr[pnum]._pClass == PC_BARBARIAN) + PlaySFX(PS_MAGE13); +#endif } if (!done) diff --git a/Source/items.cpp b/Source/items.cpp index cf04dea85..544d43d3c 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -305,7 +305,29 @@ char *off_4A5AC4 = "SItem"; /** Specifies the current Y-coordinate used for validation of items on ground. */ int idoppely = 16; /** Maps from Griswold premium item number to a quality level delta as added to the base quality level. */ -int premiumlvladd[6] = { -1, -1, 0, 0, 1, 2 }; +int premiumlvladd[SMITH_PREMIUM_ITEMS] = { + -1, + -1, +#ifdef HELLFIRE + -1, +#endif + 0, + 0, +#ifdef HELLFIRE + 0, + 0, + 1, + 1, + 1, +#endif + 1, + 2, +#ifdef HELLFIRE + 2, + 3, + 3, +#endif +}; #ifdef HELLFIRE int items_4231CA(int i) @@ -4903,7 +4925,11 @@ int RndPremiumItem(int minlvl, int maxlvl) return ril[random_(50, ri)] + 1; } +#ifdef HELLFIRE +static void SpawnOnePremium(int i, int plvl, int myplr, bool noSpells) +#else static void SpawnOnePremium(int i, int plvl) +#endif { int itype; ItemStruct holditem; @@ -4945,18 +4971,40 @@ void SpawnPremium(int lvl) if (numpremium < SMITH_PREMIUM_ITEMS) { for (i = 0; i < SMITH_PREMIUM_ITEMS; i++) { if (premiumitem[i]._itype == ITYPE_NONE) +#ifdef HELLFIRE + SpawnOnePremium(i, premiumlevel + premiumlvladd[i], pnum, FALSE); +#else SpawnOnePremium(i, premiumlevel + premiumlvladd[i]); +#endif } numpremium = SMITH_PREMIUM_ITEMS; } while (premiumlevel < lvl) { premiumlevel++; +#ifdef HELLFIRE + premiumitem[0] = premiumitem[3]; + premiumitem[1] = premiumitem[4]; + premiumitem[2] = premiumitem[5]; + premiumitem[3] = premiumitem[6]; + premiumitem[4] = premiumitem[7]; + premiumitem[5] = premiumitem[8]; + premiumitem[6] = premiumitem[9]; + premiumitem[7] = premiumitem[10]; + premiumitem[8] = premiumitem[11]; + premiumitem[9] = premiumitem[12]; + SpawnOnePremium(10, premiumlevel + premiumlvladd[10], pnum, FALSE); + premiumitem[11] = premiumitem[13]; + SpawnOnePremium(12, premiumlevel + premiumlvladd[12], pnum, FALSE); + premiumitem[13] = premiumitem[14]; + SpawnOnePremium(14, premiumlevel + premiumlvladd[14], pnum, FALSE); +#else premiumitem[0] = premiumitem[2]; premiumitem[1] = premiumitem[3]; premiumitem[2] = premiumitem[4]; SpawnOnePremium(3, premiumlevel + premiumlvladd[3]); premiumitem[4] = premiumitem[5]; SpawnOnePremium(5, premiumlevel + premiumlvladd[5]); +#endif } } diff --git a/Source/player.cpp b/Source/player.cpp index 4d300986e..804da6a88 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -380,6 +380,56 @@ void InitPlayerGFX(int pnum) } } +static DWORD GetPlrGFXSize(const char *szCel) +{ + DWORD c; + const char *a, *w; + DWORD dwSize, dwMaxSize; + HANDLE hsFile; + char pszName[256]; + char Type[16]; + + dwMaxSize = 0; + + for (c = 0; c < NUM_CLASSES; c++) { + if (gbIsSpawn && c != 0) + continue; + for (a = &ArmourChar[0]; *a; a++) { + if (gbIsSpawn && a != &ArmourChar[0]) + break; + for (w = &WepChar[0]; *w; w++) { // BUGFIX loads non-existing animagions; DT is only for N, BT is only for U, D & H (fixed) + if (szCel[0] == 'D' && szCel[1] == 'T' && *w != 'N') { + continue; //Death has no weapon + } + if (szCel[0] == 'B' && szCel[1] == 'L' && (*w != 'U' && *w != 'D' && *w != 'H')) { + continue; //No block without weapon + } +#ifdef HELLFIRE + if ((c == PC_BARD && hfbard_mpq == NULL) || (c == PC_BARBARIAN && hfbarb_mpq == NULL)) { +#endif + sprintf(Type, "%c%c%c", CharChar[c], *a, *w); + sprintf(pszName, "PlrGFX\\%s\\%s\\%s%s.CL2", ClassStrTbl[c], Type, Type, szCel); +#ifdef HELLFIRE + } else { + sprintf(Type, "%c%c%c", CharCharHF[c], *a, *w); + sprintf(pszName, "PlrGFX\\%s\\%s\\%s%s.CL2", ClassStrTblOld[c], Type, Type, szCel); + } +#endif + if (WOpenFile(pszName, &hsFile, TRUE)) { + /// ASSERT: assert(hsFile); + dwSize = WGetFileSize(hsFile, NULL, pszName); + WCloseFile(hsFile); + if (dwMaxSize <= dwSize) { + dwMaxSize = dwSize; + } + } + } + } + } + + return dwMaxSize; +} + void InitPlrGFXMem(int pnum) { if ((DWORD)pnum >= MAX_PLRS) { @@ -451,56 +501,6 @@ void InitPlrGFXMem(int pnum) plr[pnum]._pGFXLoad = 0; } -DWORD GetPlrGFXSize(const char *szCel) -{ - DWORD c; - const char *a, *w; - DWORD dwSize, dwMaxSize; - HANDLE hsFile; - char pszName[256]; - char Type[16]; - - dwMaxSize = 0; - - for (c = 0; c < NUM_CLASSES; c++) { - if (gbIsSpawn && c != 0) - continue; - for (a = &ArmourChar[0]; *a; a++) { - if (gbIsSpawn && a != &ArmourChar[0]) - break; - for (w = &WepChar[0]; *w; w++) { // BUGFIX loads non-existing animagions; DT is only for N, BT is only for U, D & H (fixed) - if (szCel[0] == 'D' && szCel[1] == 'T' && *w != 'N') { - continue; //Death has no weapon - } - if (szCel[0] == 'B' && szCel[1] == 'L' && (*w != 'U' && *w != 'D' && *w != 'H')) { - continue; //No block without weapon - } -#ifdef HELLFIRE - if ((c == PC_BARD && hfbard_mpq == NULL) || (c == PC_BARBARIAN && hfbarb_mpq == NULL)) { -#endif - sprintf(Type, "%c%c%c", CharChar[c], *a, *w); - sprintf(pszName, "PlrGFX\\%s\\%s\\%s%s.CL2", ClassStrTbl[c], Type, Type, szCel); -#ifdef HELLFIRE - } else { - sprintf(Type, "%c%c%c", CharCharHF[c], *a, *w); - sprintf(pszName, "PlrGFX\\%s\\%s\\%s%s.CL2", ClassStrTblOld[c], Type, Type, szCel); - } -#endif - if (WOpenFile(pszName, &hsFile, TRUE)) { - /// ASSERT: assert(hsFile); - dwSize = WGetFileSize(hsFile, NULL, pszName); - WCloseFile(hsFile); - if (dwMaxSize <= dwSize) { - dwMaxSize = dwSize; - } - } - } - } - } - - return dwMaxSize; -} - void FreePlayerGFX(int pnum) { if ((DWORD)pnum >= MAX_PLRS) { @@ -1824,6 +1824,43 @@ void RespawnDeadItem(ItemStruct *itm, int x, int y) itm->_itype = ITYPE_NONE; } +static void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy) +{ + int x, y; + int i, j, k; + + if (itm->_itype == ITYPE_NONE) + return; + + if ((DWORD)pnum >= MAX_PLRS) { + app_fatal("PlrDeadItem: illegal player %d", pnum); + } + + x = xx + plr[pnum]._px; + y = yy + plr[pnum]._py; + if ((xx || yy) && ItemSpaceOk(x, y)) { + RespawnDeadItem(itm, x, y); + plr[pnum].HoldItem = *itm; + NetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y); + return; + } + + for (k = 1; k < 50; k++) { + for (j = -k; j <= k; j++) { + y = j + plr[pnum]._py; + for (i = -k; i <= k; i++) { + x = i + plr[pnum]._px; + if (ItemSpaceOk(x, y)) { + RespawnDeadItem(itm, x, y); + plr[pnum].HoldItem = *itm; + NetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y); + return; + } + } + } + } +} + #if defined(__clang__) || defined(__GNUC__) __attribute__((no_sanitize("shift-base"))) #endif @@ -1951,43 +1988,6 @@ void StartPlayerKill(int pnum, int earflag) #endif } -void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy) -{ - int x, y; - int i, j, k; - - if (itm->_itype == ITYPE_NONE) - return; - - if ((DWORD)pnum >= MAX_PLRS) { - app_fatal("PlrDeadItem: illegal player %d", pnum); - } - - x = xx + plr[pnum]._px; - y = yy + plr[pnum]._py; - if ((xx || yy) && ItemSpaceOk(x, y)) { - RespawnDeadItem(itm, x, y); - plr[pnum].HoldItem = *itm; - NetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y); - return; - } - - for (k = 1; k < 50; k++) { - for (j = -k; j <= k; j++) { - y = j + plr[pnum]._py; - for (i = -k; i <= k; i++) { - x = i + plr[pnum]._px; - if (ItemSpaceOk(x, y)) { - RespawnDeadItem(itm, x, y); - plr[pnum].HoldItem = *itm; - NetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y); - return; - } - } - } - } -} - void DropHalfPlayersGold(int pnum) { int i, hGold; @@ -3120,6 +3120,56 @@ BOOL PM_DoBlock(int pnum) return FALSE; } +static void ArmorDur(int pnum) +{ + int a; + ItemStruct *pi; + PlayerStruct *p; + + if (pnum != myplr) { + return; + } + + if ((DWORD)pnum >= MAX_PLRS) { + app_fatal("ArmorDur: illegal player %d", pnum); + } + + p = &plr[pnum]; + if (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) { + return; + } + + a = random_(8, 3); + if (p->InvBody[INVLOC_CHEST]._itype != ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) { + a = 1; + } + if (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) { + a = 0; + } + + if (a != 0) { + pi = &p->InvBody[INVLOC_CHEST]; + } else { + pi = &p->InvBody[INVLOC_HEAD]; + } + if (pi->_iDurability == DUR_INDESTRUCTIBLE) { + return; + } + + pi->_iDurability--; + if (pi->_iDurability != 0) { + return; + } + + if (a != 0) { + NetSendCmdDelItem(TRUE, INVLOC_CHEST); + } else { + NetSendCmdDelItem(TRUE, INVLOC_HEAD); + } + pi->_itype = ITYPE_NONE; + CalcPlrInv(pnum, TRUE); +} + BOOL PM_DoSpell(int pnum) { if ((DWORD)pnum >= MAX_PLRS) { @@ -3227,56 +3277,6 @@ BOOL PM_DoGotHit(int pnum) return FALSE; } -void ArmorDur(int pnum) -{ - int a; - ItemStruct *pi; - PlayerStruct *p; - - if (pnum != myplr) { - return; - } - - if ((DWORD)pnum >= MAX_PLRS) { - app_fatal("ArmorDur: illegal player %d", pnum); - } - - p = &plr[pnum]; - if (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) { - return; - } - - a = random_(8, 3); - if (p->InvBody[INVLOC_CHEST]._itype != ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) { - a = 1; - } - if (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) { - a = 0; - } - - if (a != 0) { - pi = &p->InvBody[INVLOC_CHEST]; - } else { - pi = &p->InvBody[INVLOC_HEAD]; - } - if (pi->_iDurability == DUR_INDESTRUCTIBLE) { - return; - } - - pi->_iDurability--; - if (pi->_iDurability != 0) { - return; - } - - if (a != 0) { - NetSendCmdDelItem(TRUE, INVLOC_CHEST); - } else { - NetSendCmdDelItem(TRUE, INVLOC_HEAD); - } - pi->_itype = ITYPE_NONE; - CalcPlrInv(pnum, TRUE); -} - BOOL PM_DoDeath(int pnum) { if ((DWORD)pnum >= MAX_PLRS) { @@ -3710,6 +3710,33 @@ void ValidatePlayer() plr[myplr]._pMemSpells &= msk; } +static void CheckCheatStats(int pnum) +{ + if (plr[pnum]._pStrength > 750) { + plr[pnum]._pStrength = 750; + } + + if (plr[pnum]._pDexterity > 750) { + plr[pnum]._pDexterity = 750; + } + + if (plr[pnum]._pMagic > 750) { + plr[pnum]._pMagic = 750; + } + + if (plr[pnum]._pVitality > 750) { + plr[pnum]._pVitality = 750; + } + + if (plr[pnum]._pHitPoints > 128000) { + plr[pnum]._pHitPoints = 128000; + } + + if (plr[pnum]._pMana > 128000) { + plr[pnum]._pMana = 128000; + } +} + void ProcessPlayers() { int pnum; @@ -3827,33 +3854,6 @@ void ProcessPlayers() } } -void CheckCheatStats(int pnum) -{ - if (plr[pnum]._pStrength > 750) { - plr[pnum]._pStrength = 750; - } - - if (plr[pnum]._pDexterity > 750) { - plr[pnum]._pDexterity = 750; - } - - if (plr[pnum]._pMagic > 750) { - plr[pnum]._pMagic = 750; - } - - if (plr[pnum]._pVitality > 750) { - plr[pnum]._pVitality = 750; - } - - if (plr[pnum]._pHitPoints > 128000) { - plr[pnum]._pHitPoints = 128000; - } - - if (plr[pnum]._pMana > 128000) { - plr[pnum]._pMana = 128000; - } -} - void ClrPlrPath(int pnum) { if ((DWORD)pnum >= MAX_PLRS) { diff --git a/Source/player.h b/Source/player.h index 689828b12..df4086834 100644 --- a/Source/player.h +++ b/Source/player.h @@ -12,30 +12,16 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int plr_lframe_size; -extern int plr_wframe_size; -extern BYTE plr_gfx_flag; -extern int plr_aframe_size; extern int myplr; extern PlayerStruct plr[MAX_PLRS]; -extern int plr_fframe_size; -extern int plr_qframe_size; extern BOOL deathflag; -extern int plr_hframe_size; -extern int plr_bframe_size; -extern BYTE plr_gfx_bflag; -extern int plr_sframe_size; -extern int deathdelay; -extern int plr_dframe_size; +extern int ToBlkTbl[NUM_CLASSES]; -void SetPlayerGPtrs(BYTE *pData, BYTE **pAnim); void LoadPlrGFX(int pnum, player_graphic gfxflag); void InitPlayerGFX(int pnum); void InitPlrGFXMem(int pnum); -DWORD GetPlrGFXSize(const char *szCel); void FreePlayerGFX(int pnum); void NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width); -void ClearPlrPVars(int pnum); void SetPlrAnims(int pnum); void ClearPlrRVars(PlayerStruct *p); void CreatePlayer(int pnum, char c); @@ -47,61 +33,27 @@ void InitPlayer(int pnum, BOOL FirstTime); void InitMultiView(); void CheckEFlag(int pnum, BOOL flag); BOOL SolidLoc(int x, int y); -BOOL PlrDirOK(int pnum, int dir); void PlrClrTrans(int x, int y); void PlrDoTrans(int x, int y); void SetPlayerOld(int pnum); void FixPlayerLocation(int pnum, int bDir); void StartStand(int pnum, int dir); -void StartWalkStand(int pnum); -void PM_ChangeLightOff(int pnum); -void PM_ChangeOffset(int pnum); -void StartWalk(int pnum, int xvel, int yvel, int xadd, int yadd, int EndDir, int sdir); -void StartWalk2(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int EndDir, int sdir); -void StartWalk3(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, int EndDir, int sdir); void StartAttack(int pnum, int d); -void StartRangeAttack(int pnum, int d, int cx, int cy); void StartPlrBlock(int pnum, int dir); -void StartSpell(int pnum, int d, int cx, int cy); void FixPlrWalkTags(int pnum); void RemovePlrFromMap(int pnum); void StartPlrHit(int pnum, int dam, BOOL forcehit); -void RespawnDeadItem(ItemStruct *itm, int x, int y); void StartPlayerKill(int pnum, int earflag); -void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy); void DropHalfPlayersGold(int pnum); #ifdef HELLFIRE void StripTopGold(int pnum); #endif void SyncPlrKill(int pnum, int earflag); -void j_StartPlayerKill(int pnum, int earflag); void RemovePlrMissiles(int pnum); -void InitLevelChange(int pnum); void StartNewLvl(int pnum, int fom, int lvl); void RestartTownLvl(int pnum); void StartWarpLvl(int pnum, int pidx); -BOOL PM_DoStand(int pnum); -BOOL PM_DoNewLvl(int pnum); -BOOL PM_DoWalk(int pnum); -BOOL PM_DoWalk2(int pnum); -BOOL PM_DoWalk3(int pnum); -BOOL WeaponDur(int pnum, int durrnd); -BOOL PlrHitMonst(int pnum, int m); -BOOL PlrHitPlr(int pnum, char p); -BOOL PlrHitObj(int pnum, int mx, int my); -BOOL PM_DoAttack(int pnum); -BOOL PM_DoRangeAttack(int pnum); -void ShieldDur(int pnum); -BOOL PM_DoBlock(int pnum); -BOOL PM_DoSpell(int pnum); -BOOL PM_DoGotHit(int pnum); -void ArmorDur(int pnum); -BOOL PM_DoDeath(int pnum); -void CheckNewPath(int pnum); -BOOL PlrDeathModeOK(int p); -void ValidatePlayer(); void ProcessPlayers(); -void CheckCheatStats(int pnum); void ClrPlrPath(int pnum); BOOL PosOkPlayer(int pnum, int x, int y); void MakePlrPath(int pnum, int xx, int yy, BOOL endspace); @@ -127,31 +79,18 @@ int player_45EFAB(int i); int player_45EFB5(int i); #endif -/* rdata */ - -extern const char ArmourChar[4]; -extern const char WepChar[10]; -extern const char CharChar[]; - /* data */ extern int plrxoff[9]; extern int plryoff[9]; extern int plrxoff2[9]; extern int plryoff2[9]; -extern char PlrGFXAnimLens[NUM_CLASSES][11]; -extern int PWVel[NUM_CLASSES][3]; -extern int AnimLenFromClass[NUM_CLASSES]; extern int StrengthTbl[NUM_CLASSES]; extern int MagicTbl[NUM_CLASSES]; extern int DexterityTbl[NUM_CLASSES]; extern int VitalityTbl[NUM_CLASSES]; -extern int ToBlkTbl[NUM_CLASSES]; -extern const char *const ClassStrTblOld[]; extern int MaxStats[NUM_CLASSES][4]; -extern int ExpLvlsTbl[MAXCHARLEVEL]; extern const char *const ClassStrTbl[NUM_CLASSES]; -extern BYTE fix[9]; #ifdef __cplusplus } diff --git a/Source/plrmsg.h b/Source/plrmsg.h index c71aa0885..6464ef255 100644 --- a/Source/plrmsg.h +++ b/Source/plrmsg.h @@ -12,8 +12,6 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern _plrmsg plr_msgs[PMSG_COUNT]; - void plrmsg_delay(BOOL delay); char *ErrorPlrMsg(const char *pszMsg); size_t EventPlrMsg(const char *pszFmt, ...); @@ -23,10 +21,6 @@ void InitPlrMsg(); void DrawPlrMsg(); void PrintPlrMsg(DWORD x, DWORD y, DWORD width, const char *str, BYTE col); -/* rdata */ - -extern const char text_color_from_player_num[MAX_PLRS + 1]; - #ifdef __cplusplus } #endif diff --git a/Source/portal.h b/Source/portal.h index 254aa0c4e..e82d561f1 100644 --- a/Source/portal.h +++ b/Source/portal.h @@ -13,7 +13,6 @@ extern "C" { #endif extern PortalStruct portal[MAXPORTAL]; -extern int portalindex; void InitPortals(); void SetPortalStats(int i, BOOL o, int x, int y, int lvl, int lvltype); @@ -29,10 +28,6 @@ void GetPortalLevel(); void GetPortalLvlPos(); BOOL PosOkPortal(int lvl, int x, int y); -/* rdata */ -extern int WarpDropX[MAXPORTAL]; -extern int WarpDropY[MAXPORTAL]; - #ifdef __cplusplus } #endif diff --git a/Source/quests.h b/Source/quests.h index c7dc77aa9..36b5cabb9 100644 --- a/Source/quests.h +++ b/Source/quests.h @@ -12,14 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int qtopline; extern BOOL questlog; extern BYTE *pQLogCel; extern QuestStruct quests[MAXQUESTS]; -extern int qline; -extern int qlist[MAXQUESTS]; -extern int numqlines; -extern int WaterDone; extern int ReturnLvlX; extern int ReturnLvlY; extern int ReturnLvlT; @@ -30,19 +25,11 @@ void CheckQuests(); BOOL ForceQuests(); BOOL QuestStatus(int i); void CheckQuestKill(int m, BOOL sendmsg); -void DrawButcher(); -void DrawSkelKing(int q, int x, int y); -void DrawWarLord(int x, int y); -void DrawSChamber(int q, int x, int y); -void DrawLTBanner(int x, int y); -void DrawBlind(int x, int y); -void DrawBlood(int x, int y); void DRLG_CheckQuests(int x, int y); void SetReturnLvlPos(); void GetReturnLvlPos(); void ResyncMPQuests(); void ResyncQuests(); -void PrintQLString(int x, int y, BOOL cjustflag, const char *str, int col); void DrawQuestLog(); void StartQuestlog(); void QuestlogUp(); @@ -53,13 +40,6 @@ void SetMultiQuest(int q, int s, int l, int v1); /* rdata */ extern QuestData questlist[MAXQUESTS]; -extern char questxoff[7]; -extern char questyoff[7]; -extern const char *constquesttrigstr[5]; -extern int QuestGroup1[3]; -extern int QuestGroup2[3]; -extern int QuestGroup3[3]; -extern int QuestGroup4[2]; #ifdef __cplusplus } diff --git a/Source/scrollrt.h b/Source/scrollrt.h index c55a5e105..75610a154 100644 --- a/Source/scrollrt.h +++ b/Source/scrollrt.h @@ -21,7 +21,6 @@ extern char arch_draw_type; extern int cel_transparency_active; extern int cel_foliage_active; extern int level_piece_id; -extern void (*DrawPlrProc)(int, int, int, int, int, BYTE *, int, int, int, int); #ifdef HELLFIRE extern BOOLEAN AutoMapShowItems; #endif @@ -48,14 +47,6 @@ void EnableFrameCount(); void scrollrt_draw_game_screen(BOOL draw_cursor); void DrawAndBlit(); -/* rdata */ - -/* data */ - -/** used in 1.00 debug */ -extern const char *const szMonModeAssert[18]; -extern const char *const szPlrModeAssert[12]; - #ifdef __cplusplus } #endif diff --git a/Source/setmaps.h b/Source/setmaps.h index 62588e83b..231dd18bd 100644 --- a/Source/setmaps.h +++ b/Source/setmaps.h @@ -13,20 +13,9 @@ extern "C" { #endif int ObjIndex(int x, int y); -void AddSKingObjs(); -void AddSChamObjs(); -void AddVileObjs(); -void DRLG_SetMapTrans(const char *sFileName); void LoadSetMap(); /* rdata */ -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 const char *const quest_level_names[]; #ifdef __cplusplus diff --git a/Source/sound.h b/Source/sound.h index a661648e0..89d314414 100644 --- a/Source/sound.h +++ b/Source/sound.h @@ -11,39 +11,27 @@ DEVILUTION_BEGIN_NAMESPACE #ifdef __cplusplus extern "C" { #endif - -extern SoundSample *DSBs[8]; extern BOOLEAN gbSndInited; -extern HMODULE hDsound_dll; void snd_update(BOOL bStopAll); void snd_stop_snd(TSnd *pSnd); BOOL snd_playing(TSnd *pSnd); void snd_play_snd(TSnd *pSnd, int lVolume, int lPan); -SoundSample *sound_dup_channel(SoundSample *DSB); -BOOL sound_file_reload(TSnd *sound_file, SoundSample *DSB); TSnd *sound_file_load(const char *path); -void sound_CreateSoundBuffer(TSnd *sound_file); void sound_file_cleanup(TSnd *sound_file); void snd_init(HWND hWnd); -void snd_get_volume(const char *value_name, int *value); -void sound_create_primary_buffer(HANDLE music_track); void sound_cleanup(); -void snd_set_volume(const char *key, int value); void music_stop(); void music_start(int nTrack); void sound_disable_music(BOOL disable); int sound_get_or_set_music_volume(int volume); int sound_get_or_set_sound_volume(int volume); -/* rdata */ - /* data */ extern BOOLEAN gbMusicOn; extern BOOLEAN gbSoundOn; extern BOOLEAN gbDupSounds; -extern char unk_volume[4][2]; #ifdef __cplusplus } diff --git a/Source/stores.cpp b/Source/stores.cpp index 751979d68..f38bd83bb 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -291,6 +291,72 @@ void AddSText(int x, int y, BOOL j, const char *str, char clr, BOOL sel) stext[y]._ssel = sel; } +static void PrintStoreItem(ItemStruct *x, int l, char iclr) +{ + char sstr[128]; + char str, dex; + BYTE mag; + + sstr[0] = '\0'; + if (x->_iIdentified) { + if (x->_iMagical != ITEM_QUALITY_UNIQUE) { + if (x->_iPrePower != -1) { + PrintItemPower(x->_iPrePower, x); + strcat(sstr, tempstr); + } + } + if (x->_iSufPower != -1) { + PrintItemPower(x->_iSufPower, x); + if (sstr[0]) + strcat(sstr, ", "); + strcat(sstr, tempstr); + } + } + if (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) { + sprintf(tempstr, "Charges: %i/%i", x->_iCharges, x->_iMaxCharges); + if (sstr[0]) + strcat(sstr, ", "); + strcat(sstr, tempstr); + } + if (sstr[0]) { + AddSText(40, l, FALSE, sstr, iclr, FALSE); + l++; + } + sstr[0] = '\0'; + if (x->_iClass == ICLASS_WEAPON) + sprintf(sstr, "Damage: %i-%i ", x->_iMinDam, x->_iMaxDam); + if (x->_iClass == ICLASS_ARMOR) + sprintf(sstr, "Armor: %i ", x->_iAC); + if (x->_iMaxDur != DUR_INDESTRUCTIBLE && x->_iMaxDur) { + sprintf(tempstr, "Dur: %i/%i, ", x->_iDurability, x->_iMaxDur); + strcat(sstr, tempstr); + } else { + strcat(sstr, "Indestructible, "); + } + if (x->_itype == ITYPE_MISC) + sstr[0] = '\0'; + str = x->_iMinStr; + dex = x->_iMinDex; + mag = x->_iMinMag; + if ((str + mag + dex) == 0) { + strcat(sstr, "No required attributes"); + } else { + strcpy(tempstr, "Required:"); + if (x->_iMinStr) + sprintf(tempstr, "%s %i Str", tempstr, x->_iMinStr); + if (x->_iMinMag) + sprintf(tempstr, "%s %i Mag", tempstr, x->_iMinMag); + if (x->_iMinDex) + sprintf(tempstr, "%s %i Dex", tempstr, x->_iMinDex); + strcat(sstr, tempstr); + } + AddSText(40, l++, FALSE, sstr, iclr, FALSE); + if (x->_iMagical == ITEM_QUALITY_UNIQUE) { + if (x->_iIdentified) + AddSText(40, l, FALSE, "Unique Item", iclr, FALSE); + } +} + void StoreAutoPlace() { BOOL done; @@ -417,72 +483,6 @@ void S_ScrollSBuy(int idx) stextsel = stextdown; } -void PrintStoreItem(ItemStruct *x, int l, char iclr) -{ - char sstr[128]; - char str, dex; - BYTE mag; - - sstr[0] = '\0'; - if (x->_iIdentified) { - if (x->_iMagical != ITEM_QUALITY_UNIQUE) { - if (x->_iPrePower != -1) { - PrintItemPower(x->_iPrePower, x); - strcat(sstr, tempstr); - } - } - if (x->_iSufPower != -1) { - PrintItemPower(x->_iSufPower, x); - if (sstr[0]) - strcat(sstr, ", "); - strcat(sstr, tempstr); - } - } - if (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) { - sprintf(tempstr, "Charges: %i/%i", x->_iCharges, x->_iMaxCharges); - if (sstr[0]) - strcat(sstr, ", "); - strcat(sstr, tempstr); - } - if (sstr[0]) { - AddSText(40, l, FALSE, sstr, iclr, FALSE); - l++; - } - sstr[0] = '\0'; - if (x->_iClass == ICLASS_WEAPON) - sprintf(sstr, "Damage: %i-%i ", x->_iMinDam, x->_iMaxDam); - if (x->_iClass == ICLASS_ARMOR) - sprintf(sstr, "Armor: %i ", x->_iAC); - if (x->_iMaxDur != DUR_INDESTRUCTIBLE && x->_iMaxDur) { - sprintf(tempstr, "Dur: %i/%i, ", x->_iDurability, x->_iMaxDur); - strcat(sstr, tempstr); - } else { - strcat(sstr, "Indestructible, "); - } - if (x->_itype == ITYPE_MISC) - sstr[0] = '\0'; - str = x->_iMinStr; - dex = x->_iMinDex; - mag = x->_iMinMag; - if ((str + mag + dex) == 0) { - strcat(sstr, "No required attributes"); - } else { - strcpy(tempstr, "Required:"); - if (x->_iMinStr) - sprintf(tempstr, "%s %i Str", tempstr, x->_iMinStr); - if (x->_iMinMag) - sprintf(tempstr, "%s %i Mag", tempstr, x->_iMinMag); - if (x->_iMinDex) - sprintf(tempstr, "%s %i Dex", tempstr, x->_iMinDex); - strcat(sstr, tempstr); - } - AddSText(40, l++, FALSE, sstr, iclr, FALSE); - if (x->_iMagical == ITEM_QUALITY_UNIQUE) { - if (x->_iIdentified) - AddSText(40, l, FALSE, "Unique Item", iclr, FALSE); - } -} - void S_StartSBuy() { int i; @@ -724,6 +724,29 @@ BOOL SmithRepairOk(int i) return TRUE; } +static void AddStoreHoldRepair(ItemStruct *itm, int i) +{ + ItemStruct *item; + int v; + + item = &storehold[storenumh]; + storehold[storenumh] = *itm; + if (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified) + item->_ivalue = 30 * item->_iIvalue / 100; + v = item->_ivalue * (100 * (item->_iMaxDur - item->_iDurability) / item->_iMaxDur) / 100; + if (!v) { + if (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified) + return; + v = 1; + } + if (v > 1) + v >>= 1; + item->_iIvalue = v; + item->_ivalue = v; + storehidx[storenumh] = i; + storenumh++; +} + void S_StartSRepair() { BOOL repairok; @@ -783,29 +806,6 @@ void S_StartSRepair() OffsetSTextY(22, 6); } -void AddStoreHoldRepair(ItemStruct *itm, int i) -{ - ItemStruct *item; - int v; - - item = &storehold[storenumh]; - storehold[storenumh] = *itm; - if (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified) - item->_ivalue = 30 * item->_iIvalue / 100; - v = item->_ivalue * (100 * (item->_iMaxDur - item->_iDurability) / item->_iMaxDur) / 100; - if (!v) { - if (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified) - return; - v = 1; - } - if (v > 1) - v >>= 1; - item->_iIvalue = v; - item->_ivalue = v; - storehidx[storenumh] = i; - storenumh++; -} - void S_StartWitch() { stextsize = FALSE; diff --git a/Source/stores.h b/Source/stores.h index 04e10f5d5..45069f27f 100644 --- a/Source/stores.h +++ b/Source/stores.h @@ -12,95 +12,34 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern int stextup; -extern int storenumh; -extern int stextlhold; extern ItemStruct boyitem; -extern int stextshold; extern ItemStruct premiumitem[SMITH_PREMIUM_ITEMS]; extern BYTE *pSTextBoxCels; extern int premiumlevel; extern int talker; -extern STextStruct stext[STORE_LINES]; -extern char stextsize; -extern int stextsmax; -extern ItemStruct storehold[48]; -extern int gossipstart; #ifdef HELLFIRE extern ItemStruct witchitem[25]; #else extern ItemStruct witchitem[20]; #endif -extern BOOL stextscrl; extern int numpremium; extern ItemStruct healitem[20]; extern ItemStruct golditem; -extern char storehidx[48]; extern BYTE *pSTextSlidCels; -extern int stextvhold; -extern int stextsel; -extern char stextscrldbtn; -extern int gossipend; extern BYTE *pSPentSpn2Cels; -extern int stextsval; extern int boylevel; extern ItemStruct smithitem[SMITH_ITEMS]; extern int stextdown; -extern char stextscrlubtn; extern char stextflag; void InitStores(); int PentSpn2Spin(); void SetupTownStores(); void FreeStoreMem(); -void DrawSTextBack(); void PrintSString(int x, int y, BOOL cjustflag, const char *str, char col, int val); void DrawSLine(int y); -void DrawSSlider(int y1, int y2); void DrawSTextHelp(); void ClearSText(int s, int e); -void AddSLine(int y); -void AddSTextVal(int y, int val); -void OffsetSTextY(int y, int yo); -void AddSText(int x, int y, BOOL j, const char *str, char clr, BOOL sel); -void StoreAutoPlace(); -void S_StartSmith(); -void S_ScrollSBuy(int idx); -void PrintStoreItem(ItemStruct *x, int l, char iclr); -void S_StartSBuy(); -void S_ScrollSPBuy(int idx); -BOOL S_StartSPBuy(); -BOOL SmithSellOk(int i); -void S_ScrollSSell(int idx); -void S_StartSSell(); -BOOL SmithRepairOk(int i); -void S_StartSRepair(); -void AddStoreHoldRepair(ItemStruct *itm, int i); -void S_StartWitch(); -void S_ScrollWBuy(int idx); -void S_StartWBuy(); -BOOL WitchSellOk(int i); -void S_StartWSell(); -BOOL WitchRechargeOk(int i); -void AddStoreHoldRecharge(ItemStruct itm, int i); -void S_StartWRecharge(); -void S_StartNoMoney(); -void S_StartNoRoom(); -void S_StartConfirm(); -void S_StartBoy(); -void S_StartBBoy(); -void S_StartHealer(); -void S_ScrollHBuy(int idx); -void S_StartHBuy(); -void S_StartStory(); -BOOL IdItemOk(ItemStruct *i); -void AddStoreHoldId(ItemStruct itm, int i); -void S_StartSIdentify(); -void S_StartIdShow(); -void S_StartTalk(); -void S_StartTavern(); -void S_StartBarMaid(); -void S_StartDrunk(); void StartStore(char s); void DrawSText(); void STextESC(); @@ -108,47 +47,15 @@ void STextUp(); void STextDown(); void STextPrior(); void STextNext(); -void S_SmithEnter(); void SetGoldCurs(int pnum, int i); void SetSpdbarGoldCurs(int pnum, int i); void TakePlrsMoney(int cost); -void SmithBuyItem(); -void S_SBuyEnter(); -void SmithBuyPItem(); -void S_SPBuyEnter(); -BOOL StoreGoldFit(int idx); -void PlaceStoreGold(int v); -void StoreSellItem(); -void S_SSellEnter(); -void SmithRepairItem(); -void S_SRepairEnter(); -void S_WitchEnter(); -void WitchBuyItem(); -void S_WBuyEnter(); -void S_WSellEnter(); -void WitchRechargeItem(); -void S_WRechargeEnter(); -void S_BoyEnter(); -void BoyBuyItem(); -void HealerBuyItem(); -void S_BBuyEnter(); -void StoryIdItem(); -void S_ConfirmEnter(); -void S_HealerEnter(); -void S_HBuyEnter(); -void S_StoryEnter(); -void S_SIDEnter(); -void S_TalkEnter(); -void S_TavernEnter(); -void S_BarmaidEnter(); -void S_DrunkEnter(); void STextEnter(); void CheckStoreBtn(); void ReleaseStoreBtn(); /* rdata */ -extern const char *const talkname[9]; #ifdef __cplusplus } #endif diff --git a/Source/sync.cpp b/Source/sync.cpp index 1a4187b56..7198d8d6e 100644 --- a/Source/sync.cpp +++ b/Source/sync.cpp @@ -13,50 +13,7 @@ WORD sgwLRU[MAXMONSTERS]; int sgnSyncItem; int sgnSyncPInv; -DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen) -{ - TSyncHeader *pHdr; - int i; - BOOL sync; - - if (nummonsters < 1) { - return dwMaxLen; - } - if (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) { - return dwMaxLen; - } - - pHdr = (TSyncHeader *)pbBuf; - pbBuf += sizeof(*pHdr); - dwMaxLen -= sizeof(*pHdr); - - pHdr->bCmd = CMD_SYNCDATA; - pHdr->bLevel = currlevel; - pHdr->wLen = 0; - SyncPlrInv(pHdr); - assert(dwMaxLen <= 0xffff); - sync_one_monster(); - - for (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) { - sync = FALSE; - if (i < 2) { - sync = sync_monster_active2((TSyncMonster *)pbBuf); - } - if (!sync) { - sync = sync_monster_active((TSyncMonster *)pbBuf); - } - if (!sync) { - break; - } - pbBuf += sizeof(TSyncMonster); - pHdr->wLen += sizeof(TSyncMonster); - dwMaxLen -= sizeof(TSyncMonster); - } - - return dwMaxLen; -} - -void sync_one_monster() +static void sync_one_monster() { int i, m; @@ -71,7 +28,19 @@ void sync_one_monster() } } -BOOL sync_monster_active(TSyncMonster *p) +static void sync_monster_pos(TSyncMonster *p, int ndx) +{ + p->_mndx = ndx; + p->_mx = monster[ndx]._mx; + p->_my = monster[ndx]._my; + p->_menemy = encode_enemy(ndx); + p->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx]; + + sync_word_6AA708[ndx] = 0xFFFF; + sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE; +} + +static BOOL sync_monster_active(TSyncMonster *p) { int i, m, ndx; DWORD lru; @@ -95,19 +64,7 @@ BOOL sync_monster_active(TSyncMonster *p) return TRUE; } -void sync_monster_pos(TSyncMonster *p, int ndx) -{ - p->_mndx = ndx; - p->_mx = monster[ndx]._mx; - p->_my = monster[ndx]._my; - p->_menemy = encode_enemy(ndx); - p->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx]; - - sync_word_6AA708[ndx] = 0xFFFF; - sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE; -} - -BOOL sync_monster_active2(TSyncMonster *p) +static BOOL sync_monster_active2(TSyncMonster *p) { int i, m, ndx; DWORD lru; @@ -135,7 +92,7 @@ BOOL sync_monster_active2(TSyncMonster *p) return TRUE; } -void SyncPlrInv(TSyncHeader *pHdr) +static void SyncPlrInv(TSyncHeader *pHdr) { int ii; ItemStruct *pItem; @@ -193,41 +150,50 @@ void SyncPlrInv(TSyncHeader *pHdr) } } -DWORD sync_update(int pnum, const BYTE *pbBuf) +DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen) { TSyncHeader *pHdr; - WORD wLen; - - pHdr = (TSyncHeader *)pbBuf; - pbBuf += sizeof(*pHdr); + int i; + BOOL sync; - if (pHdr->bCmd != CMD_SYNCDATA) { - app_fatal("bad sync command"); + if (nummonsters < 1) { + return dwMaxLen; + } + if (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) { + return dwMaxLen; } - /// ASSERT: assert(gbBufferMsgs != BUFFER_PROCESS); + pHdr = (TSyncHeader *)pbBuf; + pbBuf += sizeof(*pHdr); + dwMaxLen -= sizeof(*pHdr); - if (gbBufferMsgs == 1) { - return pHdr->wLen + sizeof(*pHdr); - } - if (pnum == myplr) { - return pHdr->wLen + sizeof(*pHdr); - } + pHdr->bCmd = CMD_SYNCDATA; + pHdr->bLevel = currlevel; + pHdr->wLen = 0; + SyncPlrInv(pHdr); + assert(dwMaxLen <= 0xffff); + sync_one_monster(); - for (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) { - if (currlevel == pHdr->bLevel) { - sync_monster(pnum, (TSyncMonster *)pbBuf); + for (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) { + sync = FALSE; + if (i < 2) { + sync = sync_monster_active2((TSyncMonster *)pbBuf); + } + if (!sync) { + sync = sync_monster_active((TSyncMonster *)pbBuf); + } + if (!sync) { + break; } - delta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel); pbBuf += sizeof(TSyncMonster); + pHdr->wLen += sizeof(TSyncMonster); + dwMaxLen -= sizeof(TSyncMonster); } - assert(wLen == 0); - - return pHdr->wLen + sizeof(*pHdr); + return dwMaxLen; } -void sync_monster(int pnum, const TSyncMonster *p) +static void sync_monster(int pnum, const TSyncMonster *p) { int i, ndx, md, mdx, mdy; DWORD delta; @@ -289,6 +255,40 @@ void sync_monster(int pnum, const TSyncMonster *p) decode_enemy(ndx, p->_menemy); } +DWORD sync_update(int pnum, const BYTE *pbBuf) +{ + TSyncHeader *pHdr; + WORD wLen; + + pHdr = (TSyncHeader *)pbBuf; + pbBuf += sizeof(*pHdr); + + if (pHdr->bCmd != CMD_SYNCDATA) { + app_fatal("bad sync command"); + } + + /// ASSERT: assert(gbBufferMsgs != BUFFER_PROCESS); + + if (gbBufferMsgs == 1) { + return pHdr->wLen + sizeof(*pHdr); + } + if (pnum == myplr) { + return pHdr->wLen + sizeof(*pHdr); + } + + for (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) { + if (currlevel == pHdr->bLevel) { + sync_monster(pnum, (TSyncMonster *)pbBuf); + } + delta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel); + pbBuf += sizeof(TSyncMonster); + } + + assert(wLen == 0); + + return pHdr->wLen + sizeof(*pHdr); +} + void sync_init() { sgnMonsters = 16 * myplr; diff --git a/Source/sync.h b/Source/sync.h index 17ec08817..9d8aec01d 100644 --- a/Source/sync.h +++ b/Source/sync.h @@ -12,17 +12,7 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern WORD sync_word_6AA708[MAXMONSTERS]; -extern int sgnMonsters; -extern WORD sgwLRU[MAXMONSTERS]; -extern int sgnSyncItem; - DWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen); -void sync_one_monster(); -BOOL sync_monster_active(TSyncMonster *p); -void sync_monster_pos(TSyncMonster *p, int ndx); -BOOL sync_monster_active2(TSyncMonster *p); -void SyncPlrInv(TSyncHeader *pHdr); DWORD sync_update(int pnum, const BYTE *pbBuf); void sync_monster(int pnum, const TSyncMonster *p); void sync_init(); diff --git a/Source/textdat.h b/Source/textdat.h index 204168f9c..95430f747 100644 --- a/Source/textdat.h +++ b/Source/textdat.h @@ -13,7 +13,6 @@ extern "C" { #endif extern const TextDataStruct alltext[]; -extern const DWORD gdwAllTextEntries; #ifdef __cplusplus } diff --git a/Source/themes.h b/Source/themes.h index 9a852ea1e..f7ca21119 100644 --- a/Source/themes.h +++ b/Source/themes.h @@ -14,65 +14,17 @@ extern "C" { extern int numthemes; extern BOOL armorFlag; -extern BOOL ThemeGoodIn[4]; extern BOOL weaponFlag; -extern BOOL treasureFlag; -extern BOOL mFountainFlag; -extern BOOL cauldronFlag; -extern BOOL tFountainFlag; extern int zharlib; -extern int themex; -extern int themey; -extern int themeVar1; extern ThemeStruct themes[MAXTHEMES]; -extern BOOL pFountainFlag; -extern BOOL bFountainFlag; -extern BOOL bCrossFlag; -BOOL TFit_Shrine(int i); -BOOL TFit_Obj5(int t); -BOOL TFit_SkelRoom(int t); -BOOL TFit_GoatShrine(int t); -BOOL CheckThemeObj3(int xp, int yp, int t, int f); -BOOL TFit_Obj3(int t); -BOOL CheckThemeReqs(int t); -BOOL SpecialThemeFit(int i, int t); -BOOL CheckThemeRoom(int tv); void InitThemes(); void HoldThemeRooms(); -void PlaceThemeMonsts(int t, int f); -void Theme_Barrel(int t); -void Theme_Shrine(int t); -void Theme_MonstPit(int t); -void Theme_SkelRoom(int t); -void Theme_Treasure(int t); -void Theme_Library(int t); -void Theme_Torture(int t); -void Theme_BloodFountain(int t); -void Theme_Decap(int t); -void Theme_PurifyingFountain(int t); -void Theme_ArmorStand(int t); -void Theme_GoatShrine(int t); -void Theme_Cauldron(int t); -void Theme_MurkyFountain(int t); -void Theme_TearFountain(int t); -void Theme_BrnCross(int t); -void Theme_WeaponRack(int t); -void UpdateL4Trans(); void CreateThemeRooms(); -/* rdata */ - -extern int ThemeGood[4]; -extern int trm5x[25]; -extern int trm5y[25]; -extern int trm3x[9]; -extern int trm3y[9]; - #ifdef __cplusplus } #endif - DEVILUTION_END_NAMESPACE #endif /* __THEMES_H__ */ diff --git a/Source/town.h b/Source/town.h index e7adcde06..b97796b66 100644 --- a/Source/town.h +++ b/Source/town.h @@ -16,8 +16,6 @@ void T_FillSector(BYTE *P3Tiles, BYTE *pSector, int xi, int yi, int w, int h); void T_FillTile(BYTE *P3Tiles, int xx, int yy, int t); void T_Pass3(); void town_4751C6(); -void town_475379(); -void town_47552C(); void town_475595(); void CreateTown(int entry); diff --git a/Source/towners.cpp b/Source/towners.cpp index 2b11e5a4a..f78a743a5 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -158,6 +158,36 @@ QuestTalkData Qtalklist[] = { /** Specifies the active sound effect ID for interacting with cows. */ int CowPlaying = -1; +static void CowSFX(int pnum) +{ + if (CowPlaying != -1 && effect_is_playing(CowPlaying)) + return; + + sgdwCowClicks++; + + if (gbIsSpawn) { + if (sgdwCowClicks == 4) { + sgdwCowClicks = 0; + CowPlaying = TSFX_COW2; + } else { + CowPlaying = TSFX_COW1; + } + } else { + if (sgdwCowClicks >= 8) { + PlaySfxLoc(TSFX_COW1, plr[pnum]._px, plr[pnum]._py + 5); + sgdwCowClicks = 4; + CowPlaying = snSFX[sgnCowMsg][plr[pnum]._pClass]; /* snSFX is local */ + sgnCowMsg++; + if (sgnCowMsg >= 3) + sgnCowMsg = 0; + } else { + CowPlaying = sgdwCowClicks == 4 ? TSFX_COW2 : TSFX_COW1; + } + } + + PlaySfxLoc(CowPlaying, plr[pnum]._px, plr[pnum]._py); +} + int GetActiveTowner(int t) { int i; @@ -1354,34 +1384,4 @@ void TalkToTowner(int p, int t) } } -void CowSFX(int pnum) -{ - if (CowPlaying != -1 && effect_is_playing(CowPlaying)) - return; - - sgdwCowClicks++; - - if (gbIsSpawn) { - if (sgdwCowClicks == 4) { - sgdwCowClicks = 0; - CowPlaying = TSFX_COW2; - } else { - CowPlaying = TSFX_COW1; - } - } else { - if (sgdwCowClicks >= 8) { - PlaySfxLoc(TSFX_COW1, plr[pnum]._px, plr[pnum]._py + 5); - sgdwCowClicks = 4; - CowPlaying = snSFX[sgnCowMsg][plr[pnum]._pClass]; /* snSFX is local */ - sgnCowMsg++; - if (sgnCowMsg >= 3) - sgnCowMsg = 0; - } else { - CowPlaying = sgdwCowClicks == 4 ? TSFX_COW2 : TSFX_COW1; - } - } - - PlaySfxLoc(CowPlaying, plr[pnum]._px, plr[pnum]._py); -} - DEVILUTION_END_NAMESPACE diff --git a/Source/towners.h b/Source/towners.h index a5b15cd09..cc5be6167 100644 --- a/Source/towners.h +++ b/Source/towners.h @@ -14,49 +14,11 @@ extern "C" { extern TownerStruct towner[NUM_TOWNERS]; -int GetActiveTowner(int t); -void SetTownerGPtrs(BYTE *pData, BYTE **pAnim); -void NewTownerAnim(int tnum, BYTE *pAnim, int numFrames, int Delay); -void InitTownerInfo(int i, int w, int sel, int t, int x, int y, int ao, int tp); -void InitQstSnds(int i); -void InitSmith(); -void InitBarOwner(); -void InitTownDead(); -void InitWitch(); -void InitBarmaid(); -void InitBoy(); -void InitHealer(); -void InitTeller(); -void InitDrunk(); -void InitCows(); -#ifdef HELLFIRE -void InitFarmer(); -void InitCowFarmer(); -void InitGirl(); -#endif void InitTowners(); void FreeTownerGFX(); -void TownCtrlMsg(int i); -void TownBlackSmith(); -void TownBarOwner(); -void TownDead(); -void TownHealer(); -void TownStory(); -void TownDrunk(); -void TownBoy(); -void TownWitch(); -void TownBarMaid(); -void TownCow(); -#ifdef HELLFIRE -void TownFarmer(); -void TownCowFarmer(); -void TownGirl(); -#endif void ProcessTowners(); ItemStruct *PlrHasItem(int pnum, int item, int *i); -void TownerTalk(int first, int t); void TalkToTowner(int p, int t); -void CowSFX(int pnum); /* data */ diff --git a/Source/trigs.h b/Source/trigs.h index 5db6e433f..c3229298e 100644 --- a/Source/trigs.h +++ b/Source/trigs.h @@ -12,7 +12,6 @@ DEVILUTION_BEGIN_NAMESPACE extern "C" { #endif -extern BOOL townwarps[3]; extern BOOL trigflag; extern int numtrigs; extern TriggerStruct trigs[MAXTRIGGERS]; @@ -28,35 +27,10 @@ void InitSKingTriggers(); void InitSChambTriggers(); void InitPWaterTriggers(); void InitVPTriggers(); -BOOL ForceTownTrig(); -BOOL ForceL1Trig(); -BOOL ForceL2Trig(); -BOOL ForceL3Trig(); -BOOL ForceL4Trig(); void Freeupstairs(); -BOOL ForceSKingTrig(); -BOOL ForceSChambTrig(); -BOOL ForcePWaterTrig(); void CheckTrigForce(); void CheckTriggers(); -/* rdata */ - -extern int TownDownList[11]; -extern int TownWarp1List[13]; -extern int L1UpList[12]; -extern int L1DownList[10]; -extern int L2UpList[3]; -extern int L2DownList[5]; -extern int L2TWarpUpList[3]; -extern int L3UpList[15]; -extern int L3DownList[9]; -extern int L3TWarpUpList[14]; -extern int L4UpList[4]; -extern int L4DownList[6]; -extern int L4TWarpUpList[4]; -extern int L4PentaList[33]; - #ifdef __cplusplus } #endif diff --git a/Source/wave.h b/Source/wave.h index b5e50fbb7..cbfe53563 100644 --- a/Source/wave.h +++ b/Source/wave.h @@ -14,7 +14,6 @@ extern "C" { void WCloseFile(HANDLE file); LONG WGetFileSize(HANDLE hsFile, DWORD *lpFileSizeHigh, const char *FileName); -void WGetFileArchive(HANDLE hsFile, DWORD *retry, const char *FileName); BOOL WOpenFile(const char *FileName, HANDLE *phsFile, BOOL mayNotExist); void WReadFile(HANDLE hsFile, LPVOID buf, DWORD to_read, const char *FileName); int WSetFilePointer(HANDLE file1, int offset, HANDLE file2, int whence); diff --git a/SourceX/sound.cpp b/SourceX/sound.cpp index b12339d64..b028656f4 100644 --- a/SourceX/sound.cpp +++ b/SourceX/sound.cpp @@ -55,6 +55,27 @@ const char *const sgszMusicTracks[NUM_MUSIC] = { "Music\\Dintro.wav", }; +static void snd_get_volume(const char *value_name, int *value) +{ + int v = *value; + if (!SRegLoadValue(APP_NAME, value_name, 0, &v)) { + v = VOLUME_MAX; + } + *value = v; + + if (*value < VOLUME_MIN) { + *value = VOLUME_MIN; + } else if (*value > VOLUME_MAX) { + *value = VOLUME_MAX; + } + *value -= *value % 100; +} + +static void snd_set_volume(const char *key, int value) +{ + SRegSaveValue(APP_NAME, key, 0, value); +} + BOOL snd_playing(TSnd *pSnd) { if (pSnd == NULL || pSnd->DSB == NULL) @@ -154,22 +175,6 @@ void snd_init(HWND hWnd) gbSndInited = true; } -void snd_get_volume(const char *value_name, int *value) -{ - int v = *value; - if (!SRegLoadValue(APP_NAME, value_name, 0, &v)) { - v = VOLUME_MAX; - } - *value = v; - - if (*value < VOLUME_MIN) { - *value = VOLUME_MIN; - } else if (*value > VOLUME_MAX) { - *value = VOLUME_MAX; - } - *value -= *value % 100; -} - void sound_cleanup() { SFileDdaDestroy(); @@ -181,11 +186,6 @@ void sound_cleanup() } } -void snd_set_volume(const char *key, int value) -{ - SRegSaveValue(APP_NAME, key, 0, value); -} - void music_stop() { if (sghMusic) {