Browse Source

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

pull/914/head
Anders Jenbo 5 years ago
parent
commit
d4976f70ac
  1. 30
      Source/drlg_l1.h
  2. 132
      Source/drlg_l2.h
  3. 53
      Source/drlg_l3.h
  4. 31
      Source/drlg_l4.h
  5. 3
      Source/dx.h
  6. 7
      Source/gendung.h
  7. 17
      Source/inv.cpp
  8. 50
      Source/items.cpp
  9. 328
      Source/player.cpp
  10. 63
      Source/player.h
  11. 6
      Source/plrmsg.h
  12. 5
      Source/portal.h
  13. 20
      Source/quests.h
  14. 9
      Source/scrollrt.h
  15. 11
      Source/setmaps.h
  16. 12
      Source/sound.h
  17. 178
      Source/stores.cpp
  18. 93
      Source/stores.h
  19. 162
      Source/sync.cpp
  20. 10
      Source/sync.h
  21. 1
      Source/textdat.h
  22. 48
      Source/themes.h
  23. 2
      Source/town.h
  24. 60
      Source/towners.cpp
  25. 38
      Source/towners.h
  26. 26
      Source/trigs.h
  27. 1
      Source/wave.h
  28. 42
      SourceX/sound.cpp

30
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

132
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

53
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

31
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

3
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

7
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);

17
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)

50
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
}
}

328
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) {

63
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
}

6
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

5
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

20
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
}

9
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

11
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

12
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
}

178
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;

93
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

162
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;

10
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();

1
Source/textdat.h

@ -13,7 +13,6 @@ extern "C" {
#endif
extern const TextDataStruct alltext[];
extern const DWORD gdwAllTextEntries;
#ifdef __cplusplus
}

48
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__ */

2
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);

60
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

38
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 */

26
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

1
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);

42
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) {

Loading…
Cancel
Save