Browse Source

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

pull/911/head
Anders Jenbo 5 years ago
parent
commit
fa3785a475
  1. 2
      Source/diablo.cpp
  2. 1
      Source/diablo.h
  3. 1
      Source/doom.h
  4. 2
      Source/effects.cpp
  5. 1
      Source/effects.h
  6. 7
      Source/inv.h
  7. 205
      Source/items.cpp
  8. 74
      Source/items.h
  9. 6
      Source/lighting.h
  10. 958
      Source/loadsave.cpp
  11. 34
      Source/loadsave.h
  12. 97
      Source/mainmenu.cpp
  13. 11
      Source/mainmenu.h
  14. 14
      Source/minitext.h
  15. 36
      Source/missiles.cpp
  16. 25
      Source/missiles.h
  17. 60
      Source/monster.cpp
  18. 84
      Source/monster.h
  19. 2
      Source/movie.h
  20. 150
      Source/mpqapi.cpp
  21. 9
      Source/mpqapi.h

2
Source/diablo.cpp

@ -757,7 +757,7 @@ static void RightMouseDown()
} }
} }
static void diablo_pause_game() void diablo_pause_game()
{ {
if (gbMaxPlayers <= 1) { if (gbMaxPlayers <= 1) {
if (PauseMode) { if (PauseMode) {

1
Source/diablo.h

@ -54,6 +54,7 @@ BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer);
void diablo_quit(int exitStatus); void diablo_quit(int exitStatus);
int DiabloMain(int argc, char **argv); int DiabloMain(int argc, char **argv);
BOOL TryIconCurs(); BOOL TryIconCurs();
void diablo_pause_game();
BOOL PressEscKey(); BOOL PressEscKey();
void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

1
Source/doom.h

@ -15,6 +15,7 @@ extern "C" {
extern DIABOOL doomflag; extern DIABOOL doomflag;
extern int DoomQuestState; extern int DoomQuestState;
int doom_get_frame_from_time();
void doom_init(); void doom_init();
void doom_close(); void doom_close();
void doom_draw(); void doom_draw();

2
Source/effects.cpp

@ -1162,7 +1162,7 @@ void FreeMonsterSnd()
} }
} }
static BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan) BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan)
{ {
int pan, volume; int pan, volume;

1
Source/effects.h

@ -19,6 +19,7 @@ BOOL effect_is_playing(int nSFX);
void stream_stop(); void stream_stop();
void InitMonsterSND(int monst); void InitMonsterSND(int monst);
void FreeMonsterSnd(); void FreeMonsterSnd();
BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan);
void PlayEffect(int i, int mode); void PlayEffect(int i, int mode);
void PlaySFX(int psfx); void PlaySFX(int psfx);
void PlaySfxLoc(int psfx, int x, int y); void PlaySfxLoc(int psfx, int x, int y);

7
Source/inv.h

@ -18,17 +18,13 @@ extern const InvXY InvRect[73];
void FreeInvGFX(); void FreeInvGFX();
void InitInv(); void InitInv();
void InvDrawSlotBack(int X, int Y, int W, int H);
void DrawInv(); void DrawInv();
void DrawInvBelt(); void DrawInvBelt();
BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag); BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag);
BOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag); BOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag);
BOOL GoldAutoPlace(int pnum); BOOL GoldAutoPlace(int pnum);
BOOL WeaponAutoPlace(int pnum);
int SwapItem(ItemStruct *a, ItemStruct *b); int SwapItem(ItemStruct *a, ItemStruct *b);
void CheckInvPaste(int pnum, int mx, int my);
void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId); void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId);
void CheckInvCut(int pnum, int mx, int my);
void inv_update_rem_item(int pnum, BYTE iv); void inv_update_rem_item(int pnum, BYTE iv);
void RemoveInvItem(int pnum, int iv); void RemoveInvItem(int pnum, int iv);
#ifdef HELLFIRE #ifdef HELLFIRE
@ -38,8 +34,6 @@ void RemoveSpdBarItem(int pnum, int iv);
void CheckInvItem(); void CheckInvItem();
void CheckInvScrn(); void CheckInvScrn();
void CheckItemStats(int pnum); void CheckItemStats(int pnum);
void CheckBookLevel(int pnum);
void CheckQuestItem(int pnum);
void InvGetItem(int pnum, int ii); void InvGetItem(int pnum, int ii);
void AutoGetItem(int pnum, int ii); void AutoGetItem(int pnum, int ii);
int FindGetItem(int idx, WORD ci, int iseed); int FindGetItem(int idx, WORD ci, int iseed);
@ -58,7 +52,6 @@ void RemoveScroll(int pnum);
BOOL UseScroll(); BOOL UseScroll();
void UseStaffCharge(int pnum); void UseStaffCharge(int pnum);
BOOL UseStaff(); BOOL UseStaff();
void StartGoldDrop();
BOOL UseInvItem(int pnum, int cii); BOOL UseInvItem(int pnum, int cii);
void DoTelekinesis(); void DoTelekinesis();
int CalculateGold(int pnum); int CalculateGold(int pnum);

205
Source/items.cpp

@ -494,31 +494,6 @@ int items_get_currlevel()
return lvl; return lvl;
} }
void items_42390F()
{
int x, y, id;
x = random_(12, 80) + 16;
y = random_(12, 80) + 16;
while (!ItemPlace(x, y)) {
x = random_(12, 80) + 16;
y = random_(12, 80) + 16;
}
switch (currlevel) {
case 22:
id = IDI_NOTE2;
break;
case 23:
id = IDI_NOTE3;
break;
default:
id = IDI_NOTE1;
break;
}
SpawnQuestItem(id, x, y, 0, 1);
}
#endif #endif
void InitItemGFX() void InitItemGFX()
@ -600,6 +575,32 @@ void AddInitItems()
} }
} }
#ifdef HELLFIRE
static void items_42390F()
{
int x, y, id;
x = random_(12, 80) + 16;
y = random_(12, 80) + 16;
while (!ItemPlace(x, y)) {
x = random_(12, 80) + 16;
y = random_(12, 80) + 16;
}
switch (currlevel) {
case 22:
id = IDI_NOTE2;
break;
case 23:
id = IDI_NOTE3;
break;
default:
id = IDI_NOTE1;
break;
}
SpawnQuestItem(id, x, y, 0, 1);
}
#endif
void InitItems() void InitItems()
{ {
int i; int i;
@ -1210,6 +1211,20 @@ void CalcSelfItems(int pnum)
} while (changeflag); } while (changeflag);
} }
static BOOL ItemMinStats(PlayerStruct *p, ItemStruct *x)
{
if (p->_pMagic < x->_iMinMag)
return FALSE;
if (p->_pStrength < x->_iMinStr)
return FALSE;
if (p->_pDexterity < x->_iMinDex)
return FALSE;
return TRUE;
}
void CalcPlrItemMin(int pnum) void CalcPlrItemMin(int pnum)
{ {
PlayerStruct *p; PlayerStruct *p;
@ -1234,20 +1249,6 @@ void CalcPlrItemMin(int pnum)
} }
} }
BOOL ItemMinStats(PlayerStruct *p, ItemStruct *x)
{
if (p->_pMagic < x->_iMinMag)
return FALSE;
if (p->_pStrength < x->_iMinStr)
return FALSE;
if (p->_pDexterity < x->_iMinDex)
return FALSE;
return TRUE;
}
void CalcPlrBookVals(int p) void CalcPlrBookVals(int p)
{ {
int i, slvl; int i, slvl;
@ -3517,28 +3518,7 @@ void CheckIdentify(int pnum, int cii)
SetCursor_(CURSOR_HAND); SetCursor_(CURSOR_HAND);
} }
void DoRepair(int pnum, int cii) static void RepairItem(ItemStruct *i, int lvl)
{
PlayerStruct *p;
ItemStruct *pi;
p = &plr[pnum];
PlaySfxLoc(IS_REPAIR, p->_px, p->_py);
if (cii >= NUM_INVLOC) {
pi = &p->InvList[cii - NUM_INVLOC];
} else {
pi = &p->InvBody[cii];
}
RepairItem(pi, p->_pLevel);
CalcPlrInv(pnum, TRUE);
if (pnum == myplr)
SetCursor_(CURSOR_HAND);
}
void RepairItem(ItemStruct *i, int lvl)
{ {
int rep, d; int rep, d;
@ -3569,6 +3549,42 @@ void RepairItem(ItemStruct *i, int lvl)
i->_iDurability = i->_iMaxDur; i->_iDurability = i->_iMaxDur;
} }
void DoRepair(int pnum, int cii)
{
PlayerStruct *p;
ItemStruct *pi;
p = &plr[pnum];
PlaySfxLoc(IS_REPAIR, p->_px, p->_py);
if (cii >= NUM_INVLOC) {
pi = &p->InvList[cii - NUM_INVLOC];
} else {
pi = &p->InvBody[cii];
}
RepairItem(pi, p->_pLevel);
CalcPlrInv(pnum, TRUE);
if (pnum == myplr)
SetCursor_(CURSOR_HAND);
}
static void RechargeItem(ItemStruct *i, int r)
{
if (i->_iCharges != i->_iMaxCharges) {
do {
i->_iMaxCharges--;
if (i->_iMaxCharges == 0) {
return;
}
i->_iCharges += r;
} while (i->_iCharges < i->_iMaxCharges);
if (i->_iCharges > i->_iMaxCharges)
i->_iCharges = i->_iMaxCharges;
}
}
void DoRecharge(int pnum, int cii) void DoRecharge(int pnum, int cii)
{ {
PlayerStruct *p; PlayerStruct *p;
@ -3593,21 +3609,7 @@ void DoRecharge(int pnum, int cii)
} }
#ifdef HELLFIRE #ifdef HELLFIRE
void DoOil(int pnum, int cii) static BOOL OilItem(ItemStruct *x, PlayerStruct *p)
{
PlayerStruct *p = &plr[pnum];
if (cii >= NUM_INVLOC || cii == INVLOC_HEAD || (cii > INVLOC_AMULET && cii <= INVLOC_CHEST)) {
if (OilItem(&p->InvBody[cii], p)) {
CalcPlrInv(pnum, TRUE);
if (pnum == myplr) {
SetCursor_(CURSOR_HAND);
}
}
}
}
BOOL OilItem(ItemStruct *x, PlayerStruct *p)
{ {
int dur, r; int dur, r;
@ -3727,21 +3729,20 @@ BOOL OilItem(ItemStruct *x, PlayerStruct *p)
return TRUE; return TRUE;
} }
#endif void DoOil(int pnum, int cii)
void RechargeItem(ItemStruct *i, int r)
{ {
if (i->_iCharges != i->_iMaxCharges) { PlayerStruct *p = &plr[pnum];
do {
i->_iMaxCharges--; if (cii >= NUM_INVLOC || cii == INVLOC_HEAD || (cii > INVLOC_AMULET && cii <= INVLOC_CHEST)) {
if (i->_iMaxCharges == 0) { if (OilItem(&p->InvBody[cii], p)) {
return; CalcPlrInv(pnum, TRUE);
if (pnum == myplr) {
SetCursor_(CURSOR_HAND);
} }
i->_iCharges += r; }
} while (i->_iCharges < i->_iMaxCharges);
if (i->_iCharges > i->_iMaxCharges)
i->_iCharges = i->_iMaxCharges;
} }
} }
#endif
void PrintItemOil(char IDidx) void PrintItemOil(char IDidx)
{ {
@ -4902,7 +4903,7 @@ int RndPremiumItem(int minlvl, int maxlvl)
return ril[random_(50, ri)] + 1; return ril[random_(50, ri)] + 1;
} }
void SpawnOnePremium(int i, int plvl) static void SpawnOnePremium(int i, int plvl)
{ {
int itype; int itype;
ItemStruct holditem; ItemStruct holditem;
@ -5635,6 +5636,20 @@ void CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL de
} }
} }
static void NextItemRecord(int i)
{
gnNumGetRecords--;
if (gnNumGetRecords == 0) {
return;
}
itemrecord[i].dwTimestamp = itemrecord[gnNumGetRecords].dwTimestamp;
itemrecord[i].nSeed = itemrecord[gnNumGetRecords].nSeed;
itemrecord[i].wCI = itemrecord[gnNumGetRecords].wCI;
itemrecord[i].nIndex = itemrecord[gnNumGetRecords].nIndex;
}
BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex) BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex)
{ {
int i; int i;
@ -5654,20 +5669,6 @@ BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex)
return TRUE; return TRUE;
} }
void NextItemRecord(int i)
{
gnNumGetRecords--;
if (gnNumGetRecords == 0) {
return;
}
itemrecord[i].dwTimestamp = itemrecord[gnNumGetRecords].dwTimestamp;
itemrecord[i].nSeed = itemrecord[gnNumGetRecords].nSeed;
itemrecord[i].wCI = itemrecord[gnNumGetRecords].wCI;
itemrecord[i].nIndex = itemrecord[gnNumGetRecords].nIndex;
}
void SetItemRecord(int nSeed, WORD wCI, int nIndex) void SetItemRecord(int nSeed, WORD wCI, int nIndex)
{ {
DWORD dwTicks; DWORD dwTicks;

74
Source/items.h

@ -15,20 +15,16 @@ extern "C" {
extern int itemactive[MAXITEMS]; extern int itemactive[MAXITEMS];
extern BOOL uitemflag; extern BOOL uitemflag;
extern int itemavail[MAXITEMS]; extern int itemavail[MAXITEMS];
extern ItemStruct curruitem;
extern ItemGetRecordStruct itemrecord[MAXITEMS]; extern ItemGetRecordStruct itemrecord[MAXITEMS];
extern ItemStruct item[MAXITEMS + 1]; extern ItemStruct item[MAXITEMS + 1];
extern BOOL itemhold[3][3];
#ifdef HELLFIRE #ifdef HELLFIRE
extern CornerStoneStruct CornerStone; extern CornerStoneStruct CornerStone;
#endif #endif
extern BYTE *itemanims[ITEMTYPES];
extern BOOL UniqueItemFlag[128]; extern BOOL UniqueItemFlag[128];
#ifdef HELLFIRE #ifdef HELLFIRE
extern int auricGold; extern int auricGold;
#endif #endif
extern int numitems; extern int numitems;
extern int gnNumGetRecords;
#ifdef HELLFIRE #ifdef HELLFIRE
int items_4231CA(int i); int items_4231CA(int i);
@ -41,63 +37,29 @@ int items_42342E(int i);
int items_4234B2(int i); int items_4234B2(int i);
int items_423518(int i); int items_423518(int i);
int items_42357E(int i); int items_42357E(int i);
void items_42390F();
int items_get_currlevel();
#endif #endif
void InitItemGFX(); void InitItemGFX();
BOOL ItemPlace(int xp, int yp);
void AddInitItems();
void InitItems(); void InitItems();
void CalcPlrItemVals(int p, BOOL Loadgfx); void CalcPlrItemVals(int p, BOOL Loadgfx);
void CalcPlrScrolls(int p); void CalcPlrScrolls(int p);
void CalcPlrStaff(int p); void CalcPlrStaff(int p);
void CalcSelfItems(int pnum);
void CalcPlrItemMin(int pnum);
BOOL ItemMinStats(PlayerStruct *p, ItemStruct *x);
void CalcPlrBookVals(int p);
void CalcPlrInv(int p, BOOL Loadgfx); void CalcPlrInv(int p, BOOL Loadgfx);
void SetPlrHandItem(ItemStruct *h, int idata); void SetPlrHandItem(ItemStruct *h, int idata);
void GetPlrHandSeed(ItemStruct *h); void GetPlrHandSeed(ItemStruct *h);
void GetGoldSeed(int pnum, ItemStruct *h); void GetGoldSeed(int pnum, ItemStruct *h);
void SetPlrHandSeed(ItemStruct *h, int iseed);
void SetPlrHandGoldCurs(ItemStruct *h); void SetPlrHandGoldCurs(ItemStruct *h);
void CreatePlrItems(int p); void CreatePlrItems(int p);
BOOL ItemSpaceOk(int i, int j); BOOL ItemSpaceOk(int i, int j);
BOOL GetItemSpace(int x, int y, char inum);
void GetSuperItemSpace(int x, int y, char inum);
void GetSuperItemLoc(int x, int y, int *xx, int *yy); void GetSuperItemLoc(int x, int y, int *xx, int *yy);
void CalcItemValue(int i);
void GetBookSpell(int i, int lvl);
void GetStaffPower(int i, int lvl, int bs, BOOL onlygood);
void GetStaffSpell(int i, int lvl, BOOL onlygood);
void GetItemAttrs(int i, int idata, int lvl); void GetItemAttrs(int i, int idata, int lvl);
int RndPL(int param1, int param2);
int PLVal(int pv, int p1, int p2, int minv, int maxv);
void SaveItemPower(int i, int power, int param1, int param2, int minval, int maxval, int multval); void SaveItemPower(int i, int power, int param1, int param2, int minval, int maxval, int multval);
void GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood); void GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood);
#ifdef HELLFIRE
void GetItemBonus(int i, int idata, int minlvl, int maxlvl, BOOL onlygood, BOOLEAN allowspells);
#else
void GetItemBonus(int i, int idata, int minlvl, int maxlvl, BOOL onlygood);
#endif
void SetupItem(int i); void SetupItem(int i);
int RndItem(int m); int RndItem(int m);
int RndUItem(int m);
int RndAllItems();
#ifdef HELLFIRE
int RndTypeItems(int itype, int imid, int lvl);
#else
int RndTypeItems(int itype, int imid);
#endif
int CheckUnique(int i, int lvl, int uper, BOOL recreate);
void GetUniqueItem(int i, int uid);
void SpawnUnique(int uid, int x, int y); void SpawnUnique(int uid, int x, int y);
void ItemRndDur(int ii);
void SetupAllItems(int ii, int idx, int iseed, int lvl, int uper, BOOL onlygood, BOOL recreate, BOOL pregen);
void SpawnItem(int m, int x, int y, BOOL sendmsg); void SpawnItem(int m, int x, int y, BOOL sendmsg);
void CreateItem(int uid, int x, int y); void CreateItem(int uid, int x, int y);
void CreateRndItem(int x, int y, BOOL onlygood, BOOL sendmsg, BOOL delta); void CreateRndItem(int x, int y, BOOL onlygood, BOOL sendmsg, BOOL delta);
void SetupAllUseful(int ii, int iseed, int lvl);
void CreateRndUseful(int pnum, int x, int y, BOOL sendmsg); void CreateRndUseful(int pnum, int x, int y, BOOL sendmsg);
void CreateTypeItem(int x, int y, BOOL onlygood, int itype, int imisc, BOOL sendmsg, BOOL delta); void CreateTypeItem(int x, int y, BOOL onlygood, int itype, int imisc, BOOL sendmsg, BOOL delta);
void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue); void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue);
@ -116,7 +78,6 @@ void SpawnTheodore(int xx, int yy);
#endif #endif
void RespawnItem(int i, BOOL FlipFlag); void RespawnItem(int i, BOOL FlipFlag);
void DeleteItem(int ii, int i); void DeleteItem(int ii, int i);
void ItemDoppel();
void ProcessItems(); void ProcessItems();
void FreeItemGFX(); void FreeItemGFX();
void GetItemFrm(int i); void GetItemFrm(int i);
@ -127,50 +88,25 @@ void RepairItem(ItemStruct *i, int lvl);
void DoRecharge(int pnum, int cii); void DoRecharge(int pnum, int cii);
#ifdef HELLFIRE #ifdef HELLFIRE
void DoOil(int pnum, int cii); void DoOil(int pnum, int cii);
BOOL OilItem(ItemStruct *x, PlayerStruct *p);
#endif #endif
void RechargeItem(ItemStruct *i, int r); void RechargeItem(ItemStruct *i, int r);
void PrintItemOil(char IDidx);
void PrintItemPower(char plidx, ItemStruct *x); void PrintItemPower(char plidx, ItemStruct *x);
void DrawUTextBack();
void PrintUString(int x, int y, BOOL cjustflag, const char *str, int col);
void DrawULine(int y);
void DrawUniqueInfo(); void DrawUniqueInfo();
void PrintItemMisc(ItemStruct *x);
void PrintItemDetails(ItemStruct *x); void PrintItemDetails(ItemStruct *x);
void PrintItemDur(ItemStruct *x); void PrintItemDur(ItemStruct *x);
void UseItem(int p, int Mid, int spl); void UseItem(int p, int Mid, int spl);
BOOL StoreStatOk(ItemStruct *h); BOOL StoreStatOk(ItemStruct *h);
BOOL SmithItemOk(int i);
int RndSmithItem(int lvl);
void BubbleSwapItem(ItemStruct *a, ItemStruct *b);
void SortSmith();
void SpawnSmith(int lvl); void SpawnSmith(int lvl);
BOOL PremiumItemOk(int i);
int RndPremiumItem(int minlvl, int maxlvl);
void SpawnOnePremium(int i, int plvl);
#ifdef HELLFIRE #ifdef HELLFIRE
void SpawnPremium(int pnum); void SpawnPremium(int pnum);
#else #else
void SpawnPremium(int lvl); void SpawnPremium(int lvl);
#endif #endif
BOOL WitchItemOk(int i);
int RndWitchItem(int lvl);
void SortWitch();
void WitchBookLevel(int ii); void WitchBookLevel(int ii);
void SpawnWitch(int lvl); void SpawnWitch(int lvl);
int RndBoyItem(int lvl);
void SpawnBoy(int lvl); void SpawnBoy(int lvl);
BOOL HealerItemOk(int i);
int RndHealerItem(int lvl);
void SortHealer();
void SpawnHealer(int lvl); void SpawnHealer(int lvl);
void SpawnStoreGold(); void SpawnStoreGold();
void RecreateSmithItem(int ii, int idx, int lvl, int iseed);
void RecreatePremiumItem(int ii, int idx, int plvl, int iseed);
void RecreateBoyItem(int ii, int idx, int lvl, int iseed);
void RecreateWitchItem(int ii, int idx, int lvl, int iseed);
void RecreateHealerItem(int ii, int idx, int lvl, int iseed);
void RecreateTownItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue); void RecreateTownItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue);
void RecalcStoreStats(); void RecalcStoreStats();
int ItemNoFlippy(); int ItemNoFlippy();
@ -181,27 +117,17 @@ void CreateAmulet(int x, int y, int curlv, BOOL sendmsg, BOOL delta);
#endif #endif
void CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta); void CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta);
BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex); BOOL GetItemRecord(int nSeed, WORD wCI, int nIndex);
void NextItemRecord(int i);
void SetItemRecord(int nSeed, WORD wCI, int nIndex); void SetItemRecord(int nSeed, WORD wCI, int nIndex);
void PutItemRecord(int nSeed, WORD wCI, int nIndex); void PutItemRecord(int nSeed, WORD wCI, int nIndex);
/* data */ /* data */
#ifdef HELLFIRE #ifdef HELLFIRE
extern int OilLevels[10];
extern int OilValues[10];
extern int OilMagic[10];
extern char OilNames[10][25];
extern int MaxGold; extern int MaxGold;
#endif #endif
extern BYTE ItemCAnimTbl[]; extern BYTE ItemCAnimTbl[];
extern const char *const ItemDropNames[];
extern BYTE ItemAnimLs[];
extern int ItemDropSnds[];
extern int ItemInvSnds[]; extern int ItemInvSnds[];
extern int idoppely;
extern int premiumlvladd[6];
#ifdef __cplusplus #ifdef __cplusplus
} }

6
Source/lighting.h

@ -21,14 +21,11 @@ extern BOOL dovision;
extern int numvision; extern int numvision;
extern char lightmax; extern char lightmax;
extern BOOL dolighting; extern BOOL dolighting;
extern BYTE lightblock[64][16][16];
extern int visionid; extern int visionid;
extern BYTE *pLightTbl; extern BYTE *pLightTbl;
extern BOOL lightflag; extern BOOL lightflag;
void RotateRadius(int *x, int *y, int *dx, int *dy, int *lx, int *ly, int *bx, int *by);
void DoLighting(int nXPos, int nYPos, int nRadius, int Lnum); void DoLighting(int nXPos, int nYPos, int nRadius, int Lnum);
void DoUnLight(int nXPos, int nYPos, int nRadius);
void DoUnVision(int nXPos, int nYPos, int nRadius); void DoUnVision(int nXPos, int nYPos, int nRadius);
void DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible); void DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible);
void FreeLightTable(); void FreeLightTable();
@ -57,10 +54,7 @@ void lighting_color_cycling();
/* rdata */ /* rdata */
extern char CrawlTable[2749]; extern char CrawlTable[2749];
extern char *pCrawlTable[19];
extern BYTE vCrawlTable[23][30]; extern BYTE vCrawlTable[23][30];
extern BYTE byte_49463C[18][18];
extern BYTE RadiusAdj[23];
#ifdef __cplusplus #ifdef __cplusplus
} }

958
Source/loadsave.cpp

File diff suppressed because it is too large Load Diff

34
Source/loadsave.h

@ -12,42 +12,8 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" { extern "C" {
#endif #endif
extern BYTE *tbuff;
void LoadGame(BOOL firstflag); void LoadGame(BOOL firstflag);
char BLoad();
int WLoad();
int ILoad();
BOOL OLoad();
void LoadItems(const int n, ItemStruct *pItem);
void LoadItemData(ItemStruct *pItem);
void SaveItem(ItemStruct *pItem);
void SaveItems(ItemStruct *pItem, const int n);
void LoadPlayer(int i);
void LoadMonster(int i);
void LoadMissile(int i);
void LoadObject(int i);
void LoadItem(int i);
void LoadPremium(int i);
void LoadQuest(int i);
void LoadLighting(int i);
void LoadVision(int i);
void LoadPortal(int i);
void SaveGame(); void SaveGame();
void BSave(char v);
void WSave(int v);
void ISave(int v);
void OSave(BOOL v);
void SavePlayer(int i);
void SaveMonster(int i);
void SaveMissile(int i);
void SaveObject(int i);
void SavePremium(int i);
void SaveQuest(int i);
void SaveLighting(int i);
void SaveVision(int i);
void SavePortal(int i);
void SaveLevel(); void SaveLevel();
void LoadLevel(); void LoadLevel();

97
Source/mainmenu.cpp

@ -30,6 +30,54 @@ void mainmenu_refresh_music()
} while (menu_music_track_id == TMUSIC_TOWN || menu_music_track_id == TMUSIC_L1); } while (menu_music_track_id == TMUSIC_TOWN || menu_music_track_id == TMUSIC_L1);
} }
static BOOL mainmenu_init_menu(int type)
{
BOOL success;
if (type == SELHERO_PREVIOUS)
return TRUE;
music_stop();
success = StartGame(type != SELHERO_CONTINUE, type != SELHERO_CONNECT);
if (success)
mainmenu_refresh_music();
return success;
}
static BOOL mainmenu_single_player()
{
#ifdef HELLFIRE
if (!SRegLoadValue(APP_NAME, jogging_title, 0, &jogging_opt)) {
jogging_opt = TRUE;
}
#endif
gbMaxPlayers = 1;
if (!SRegLoadValue("devilutionx", "game speed", 0, &ticks_per_sec)) {
SRegSaveValue("devilutionx", "game speed", 0, ticks_per_sec);
}
return mainmenu_init_menu(SELHERO_NEW_DUNGEON);
}
static BOOL mainmenu_multi_player()
{
gbMaxPlayers = MAX_PLRS;
return mainmenu_init_menu(SELHERO_CONNECT);
}
static void mainmenu_play_intro()
{
music_stop();
#ifdef HELLFIRE
play_movie("gendata\\Hellfire.smk", TRUE);
#else
play_movie("gendata\\diablo1.smk", TRUE);
#endif
mainmenu_refresh_music();
}
void mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2) void mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2)
{ {
if (UiValidPlayerName(name_2)) if (UiValidPlayerName(name_2))
@ -142,53 +190,4 @@ void mainmenu_loop()
music_stop(); music_stop();
} }
BOOL mainmenu_single_player()
{
#ifdef HELLFIRE
if (!SRegLoadValue(APP_NAME, jogging_title, 0, &jogging_opt)) {
jogging_opt = TRUE;
}
#endif
gbMaxPlayers = 1;
if (!SRegLoadValue("devilutionx", "game speed", 0, &ticks_per_sec)) {
SRegSaveValue("devilutionx", "game speed", 0, ticks_per_sec);
}
return mainmenu_init_menu(SELHERO_NEW_DUNGEON);
}
BOOL mainmenu_init_menu(int type)
{
BOOL success;
if (type == SELHERO_PREVIOUS)
return TRUE;
music_stop();
success = StartGame(type != SELHERO_CONTINUE, type != SELHERO_CONNECT);
if (success)
mainmenu_refresh_music();
return success;
}
BOOL mainmenu_multi_player()
{
gbMaxPlayers = MAX_PLRS;
return mainmenu_init_menu(SELHERO_CONNECT);
}
void mainmenu_play_intro()
{
music_stop();
#ifdef HELLFIRE
play_movie("gendata\\Hellfire.smk", TRUE);
#else
play_movie("gendata\\diablo1.smk", TRUE);
#endif
mainmenu_refresh_music();
}
DEVILUTION_END_NAMESPACE DEVILUTION_END_NAMESPACE

11
Source/mainmenu.h

@ -14,7 +14,6 @@ extern "C" {
extern char gszHero[16]; extern char gszHero[16];
void mainmenu_refresh_music();
void mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2); void mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2);
BOOL mainmenu_select_hero_dialog( BOOL mainmenu_select_hero_dialog(
const _SNETPROGRAMDATA *client_info, const _SNETPROGRAMDATA *client_info,
@ -26,16 +25,6 @@ BOOL mainmenu_select_hero_dialog(
char *cdesc, DWORD cdlen, // character "description" will be copied here (used to advertise games) char *cdesc, DWORD cdlen, // character "description" will be copied here (used to advertise games)
BOOL *multi); // new character? - unsure about this BOOL *multi); // new character? - unsure about this
void mainmenu_loop(); void mainmenu_loop();
BOOL mainmenu_single_player();
BOOL mainmenu_init_menu(int type);
BOOL mainmenu_multi_player();
void mainmenu_play_intro();
/* rdata */
/* data */
extern int menu_music_track_id;
#ifdef __cplusplus #ifdef __cplusplus
} }

14
Source/minitext.h

@ -12,28 +12,14 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" { extern "C" {
#endif #endif
extern int qtexty;
extern const char *qtextptr;
extern BOOLEAN qtextflag; extern BOOLEAN qtextflag;
extern BYTE *pMedTextCels;
extern BYTE *pTextBoxCels;
void FreeQuestText(); void FreeQuestText();
void InitQuestText(); void InitQuestText();
void InitQTextMsg(int m); void InitQTextMsg(int m);
void DrawQTextBack(); void DrawQTextBack();
void PrintQTextChr(int sx, int sy, BYTE *pCelBuff, int nCel);
void DrawQText(); void DrawQText();
/* rdata */
extern const BYTE mfontframe[128];
extern const BYTE mfontkern[56];
/* data */
extern int qscroll_spd_tbl[9];
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

36
Source/missiles.cpp

@ -1314,24 +1314,7 @@ void missiles_hive_explosion(int mi, int sx, int sy, int dx, int dy, int midir,
missile[mi]._miDelFlag = TRUE; missile[mi]._miDelFlag = TRUE;
} }
void missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam) static BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad)
{
if (LineClear(sx, sy, dx, dy)) {
if (id >= 0)
UseMana(id, SPL_RUNEFIRE);
if (missiles_found_target(mi, &dx, &dy, 10)) {
missile[mi]._miVar1 = MIS_HIVEEXP;
missile[mi]._miDelFlag = FALSE;
missile[mi]._mlid = AddLight(dx, dy, 8);
} else {
missile[mi]._miDelFlag = TRUE;
}
} else {
missile[mi]._miDelFlag = TRUE;
}
}
BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad)
{ {
BOOLEAN found; BOOLEAN found;
int i, j, k, tx, ty, dp; int i, j, k, tx, ty, dp;
@ -1365,6 +1348,23 @@ BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad)
return found; return found;
} }
void missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)
{
if (LineClear(sx, sy, dx, dy)) {
if (id >= 0)
UseMana(id, SPL_RUNEFIRE);
if (missiles_found_target(mi, &dx, &dy, 10)) {
missile[mi]._miVar1 = MIS_HIVEEXP;
missile[mi]._miDelFlag = FALSE;
missile[mi]._mlid = AddLight(dx, dy, 8);
} else {
missile[mi]._miDelFlag = TRUE;
}
} else {
missile[mi]._miDelFlag = TRUE;
}
}
void missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam) void missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)
{ {
if (LineClear(sx, sy, dx, dy)) { if (LineClear(sx, sy, dx, dy)) {

25
Source/missiles.h

@ -16,39 +16,23 @@ extern int missileactive[MAXMISSILES];
extern int missileavail[MAXMISSILES]; extern int missileavail[MAXMISSILES];
extern MissileStruct missile[MAXMISSILES]; extern MissileStruct missile[MAXMISSILES];
extern int nummissiles; extern int nummissiles;
extern BOOL ManashieldFlag;
extern ChainStruct chain[MAXMISSILES];
extern BOOL MissilePreFlag; extern BOOL MissilePreFlag;
extern int numchains;
void GetDamageAmt(int i, int *mind, int *maxd); void GetDamageAmt(int i, int *mind, int *maxd);
BOOL CheckBlock(int fx, int fy, int tx, int ty);
int FindClosest(int sx, int sy, int rad);
int GetSpellLevel(int id, int sn); int GetSpellLevel(int id, int sn);
int GetDirection8(int x1, int y1, int x2, int y2);
int GetDirection16(int x1, int y1, int x2, int y2);
void DeleteMissile(int mi, int i); void DeleteMissile(int mi, int i);
void GetMissileVel(int i, int sx, int sy, int dx, int dy, int v);
void PutMissile(int i);
void GetMissilePos(int i);
void MoveMissilePos(int i);
BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift); BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift);
BOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift);
BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag); BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag);
BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, BOOLEAN shift);
void CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, BOOLEAN nodel);
void SetMissAnim(int mi, int animtype); void SetMissAnim(int mi, int animtype);
void SetMissDir(int mi, int dir); void SetMissDir(int mi, int dir);
void LoadMissileGFX(BYTE mi); void LoadMissileGFX(BYTE mi);
void InitMissileGFX(); void InitMissileGFX();
void FreeMissileGFX(int mi);
void FreeMissiles(); void FreeMissiles();
void FreeMissiles2(); void FreeMissiles2();
void InitMissiles(); void InitMissiles();
#ifdef HELLFIRE #ifdef HELLFIRE
void missiles_hive_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void missiles_hive_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad);
void missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void missiles_great_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void missiles_great_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void missiles_immolation_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void missiles_immolation_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
@ -78,7 +62,6 @@ void AddBlodboil(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy
#endif #endif
void AddLArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddLArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void GetVileMissPos(int mi, int dx, int dy);
void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddFirebolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam); void AddFirebolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam);
void AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
@ -91,7 +74,6 @@ void AddLightctrl(int mi, int sx, int sy, int dx, int dy, int midir, char mienem
void AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
BOOL CheckIfTrig(int x, int y);
void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
@ -138,7 +120,6 @@ void AddBoneSpirit(int mi, int sx, int sy, int dx, int dy, int midir, char miene
void AddRportal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddRportal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
void AddDiabApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam); void AddDiabApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);
int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl); int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl);
int Sentfire(int i, int sx, int sy);
void MI_Dummy(int i); void MI_Dummy(int i);
void MI_Golem(int i); void MI_Golem(int i);
void MI_SetManashield(int i); void MI_SetManashield(int i);
@ -172,7 +153,6 @@ void MI_Lightning(int i);
void MI_Town(int i); void MI_Town(int i);
void MI_Flash(int i); void MI_Flash(int i);
void MI_Flash2(int i); void MI_Flash2(int i);
void MI_Manashield(int i);
void MI_Etherealize(int i); void MI_Etherealize(int i);
void MI_Firemove(int i); void MI_Firemove(int i);
void MI_Guardian(int i); void MI_Guardian(int i);
@ -204,11 +184,6 @@ void ProcessMissiles();
void missiles_process_charge(); void missiles_process_charge();
void ClearMissileSpot(int mi); void ClearMissileSpot(int mi);
/* rdata */
extern int XDirAdd[8];
extern int YDirAdd[8];
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

60
Source/monster.cpp

@ -936,6 +936,36 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize)
} }
} }
static void PlaceUniques()
{
int u, mt;
BOOL done;
for (u = 0; UniqMonst[u].mtype != -1; u++) {
if (UniqMonst[u].mlevel != currlevel)
continue;
done = FALSE;
for (mt = 0; mt < nummtypes; mt++) {
if (done)
break;
done = (Monsters[mt].mtype == UniqMonst[u].mtype);
}
mt--;
if (u == UMT_GARBUD && quests[Q_GARBUD]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_ZHAR && quests[Q_ZHAR]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_SNOTSPIL && quests[Q_LTBANNER]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_LACHDAN && quests[Q_VEIL]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_WARLORD && quests[Q_WARLORD]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (done)
PlaceUniqueMonst(u, mt, 8);
}
}
void PlaceQuestMonsters() void PlaceQuestMonsters()
{ {
int skeltype; int skeltype;
@ -1194,36 +1224,6 @@ void InitMonsters()
} }
} }
void PlaceUniques()
{
int u, mt;
BOOL done;
for (u = 0; UniqMonst[u].mtype != -1; u++) {
if (UniqMonst[u].mlevel != currlevel)
continue;
done = FALSE;
for (mt = 0; mt < nummtypes; mt++) {
if (done)
break;
done = (Monsters[mt].mtype == UniqMonst[u].mtype);
}
mt--;
if (u == UMT_GARBUD && quests[Q_GARBUD]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_ZHAR && quests[Q_ZHAR]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_SNOTSPIL && quests[Q_LTBANNER]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_LACHDAN && quests[Q_VEIL]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (u == UMT_WARLORD && quests[Q_WARLORD]._qactive == QUEST_NOTAVAIL)
done = FALSE;
if (done)
PlaceUniqueMonst(u, mt, 8);
}
}
void SetMapMonsters(BYTE *pMap, int startx, int starty) void SetMapMonsters(BYTE *pMap, int startx, int starty)
{ {
WORD rw, rh; WORD rw, rh;

84
Source/monster.h

@ -12,112 +12,48 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" { extern "C" {
#endif #endif
extern int MissileFileFlag;
extern int monstkills[MAXMONSTERS]; extern int monstkills[MAXMONSTERS];
extern int monstactive[MAXMONSTERS]; extern int monstactive[MAXMONSTERS];
extern int nummonsters; extern int nummonsters;
extern BOOLEAN sgbSaveSoundOn; extern BOOLEAN sgbSaveSoundOn;
extern MonsterStruct monster[MAXMONSTERS]; extern MonsterStruct monster[MAXMONSTERS];
extern int totalmonsters;
extern CMonster Monsters[MAX_LVLMTYPES]; extern CMonster Monsters[MAX_LVLMTYPES];
#ifdef HELLFIRE
extern int GraphicTable[NUMLEVELS][MAX_LVLMTYPES];
#else
extern BYTE GraphicTable[NUMLEVELS][MAX_LVLMTYPES];
#endif
extern int monstimgtot;
extern int uniquetrans;
extern int nummtypes; extern int nummtypes;
void InitMonsterTRN(int monst, BOOL special);
void InitLevelMonsters(); void InitLevelMonsters();
int AddMonsterType(int type, int placeflag);
void GetLevelMTypes(); void GetLevelMTypes();
void InitMonsterGFX(int monst); void InitMonsterGFX(int monst);
void ClearMVars(int i);
void InitMonster(int i, int rd, int mtype, int x, int y); void InitMonster(int i, int rd, int mtype, int x, int y);
void ClrAllMonsters(); void ClrAllMonsters();
BOOL MonstPlace(int xp, int yp);
void monster_some_crypt(); void monster_some_crypt();
void PlaceMonster(int i, int mtype, int x, int y);
void PlaceUniqueMonst(int uniqindex, int miniontype, int unpackfilesize);
void PlaceQuestMonsters();
void PlaceGroup(int mtype, int num, int leaderf, int leader); void PlaceGroup(int mtype, int num, int leaderf, int leader);
void LoadDiabMonsts();
void InitMonsters(); void InitMonsters();
void PlaceUniques();
void SetMapMonsters(BYTE *pMap, int startx, int starty); void SetMapMonsters(BYTE *pMap, int startx, int starty);
void DeleteMonster(int i); void DeleteMonster(int i);
int AddMonster(int x, int y, int dir, int mtype, BOOL InMap); int AddMonster(int x, int y, int dir, int mtype, BOOL InMap);
#ifdef HELLFIRE #ifdef HELLFIRE
void monster_43C785(int i); void monster_43C785(int i);
#endif #endif
void NewMonsterAnim(int i, AnimStruct *anim, int md);
BOOL M_Ranged(int i);
BOOL M_Talker(int i); BOOL M_Talker(int i);
void M_Enemy(int i);
int M_GetDir(int i);
void M_CheckEFlag(int i);
void M_StartStand(int i, int md); void M_StartStand(int i, int md);
void M_StartDelay(int i, int len);
void M_StartSpStand(int i, int md);
void M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, int EndDir);
void M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int EndDir);
void M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, int EndDir);
void M_StartAttack(int i);
void M_StartRAttack(int i, int missile_type, int dam);
void M_StartRSpAttack(int i, int missile_type, int dam);
void M_StartSpAttack(int i);
void M_StartEat(int i);
void M_ClearSquares(int i); void M_ClearSquares(int i);
void M_GetKnockback(int i); void M_GetKnockback(int i);
void M_StartHit(int i, int pnum, int dam); void M_StartHit(int i, int pnum, int dam);
void M_DiabloDeath(int i, BOOL sendmsg);
#ifdef HELLFIRE
void SpawnLoot(int i, BOOL sendmsg);
#endif
void M2MStartHit(int mid, int i, int dam);
void MonstStartKill(int i, int pnum, BOOL sendmsg);
void M2MStartKill(int i, int mid);
void M_StartKill(int i, int pnum); void M_StartKill(int i, int pnum);
void M_SyncStartKill(int i, int x, int y, int pnum); void M_SyncStartKill(int i, int x, int y, int pnum);
void M_StartFadein(int i, int md, BOOL backwards);
void M_StartFadeout(int i, int md, BOOL backwards);
void M_StartHeal(int i);
void M_ChangeLightOffset(int monst);
BOOL M_DoStand(int i); BOOL M_DoStand(int i);
BOOL M_DoWalk(int i); BOOL M_DoWalk(int i);
BOOL M_DoWalk2(int i); BOOL M_DoWalk2(int i);
BOOL M_DoWalk3(int i); BOOL M_DoWalk3(int i);
void M_TryM2MHit(int i, int mid, int hper, int mind, int maxd);
void M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam);
BOOL M_DoAttack(int i); BOOL M_DoAttack(int i);
BOOL M_DoRAttack(int i);
int M_DoRSpAttack(int i);
BOOL M_DoSAttack(int i);
BOOL M_DoFadein(int i);
BOOL M_DoFadeout(int i);
int M_DoHeal(int i);
int M_DoTalk(int i);
void M_Teleport(int i); void M_Teleport(int i);
BOOL M_DoGotHit(int i); BOOL M_DoGotHit(int i);
void M_UpdateLeader(int i); void M_UpdateLeader(int i);
void DoEnding(); void DoEnding();
void PrepDoEnding(); void PrepDoEnding();
BOOL M_DoDeath(int i);
BOOL M_DoSpStand(int i);
BOOL M_DoDelay(int i);
BOOL M_DoStone(int i);
void M_WalkDir(int i, int md); void M_WalkDir(int i, int md);
void GroupUnity(int i);
BOOL M_CallWalk(int i, int md);
BOOL M_PathWalk(int i);
BOOL M_CallWalk2(int i, int md);
BOOL M_DumbWalk(int i, int md);
BOOL M_RoundWalk(int i, int md, int *dir);
void MAI_Zombie(int i); void MAI_Zombie(int i);
void MAI_SkelSd(int i); void MAI_SkelSd(int i);
BOOL MAI_Path(int i);
void MAI_Snake(int i); void MAI_Snake(int i);
void MAI_Bat(int i); void MAI_Bat(int i);
void MAI_SkelBow(int i); void MAI_SkelBow(int i);
@ -152,7 +88,6 @@ void mai_roundranged_441EA0(int i);
#endif #endif
void MAI_Acid(int i); void MAI_Acid(int i);
void MAI_Diablo(int i); void MAI_Diablo(int i);
void MAI_RR2(int i, int mistype, int dam);
void MAI_Mega(int i); void MAI_Mega(int i);
void MAI_Golum(int i); void MAI_Golum(int i);
void MAI_SkelKing(int i); void MAI_SkelKing(int i);
@ -191,7 +126,6 @@ BOOL PosOkMonst3(int i, int x, int y);
BOOL IsSkel(int mt); BOOL IsSkel(int mt);
BOOL IsGoat(int mt); BOOL IsGoat(int mt);
int M_SpawnSkel(int x, int y, int dir); int M_SpawnSkel(int x, int y, int dir);
void ActivateSpawn(int i, int x, int y, int dir);
BOOL SpawnSkeleton(int ii, int x, int y); BOOL SpawnSkeleton(int ii, int x, int y);
int PreSpawnSkeleton(); int PreSpawnSkeleton();
void TalktoMonster(int i); void TalktoMonster(int i);
@ -201,30 +135,12 @@ BOOL CheckMonsterHit(int m, BOOL *ret);
int encode_enemy(int m); int encode_enemy(int m);
void decode_enemy(int m, int enemy); void decode_enemy(int m, int enemy);
/* rdata */
extern const char plr2monst[9];
extern const BYTE counsmiss[4];
/* data */ /* data */
extern int MWVel[24][3];
extern char animletter[7];
extern int left[8];
extern int right[8];
extern int opposite[8]; extern int opposite[8];
extern int offset_x[8]; extern int offset_x[8];
extern int offset_y[8]; extern int offset_y[8];
/** unused */
extern int rnd5[4];
extern int rnd10[4];
extern int rnd20[4];
extern int rnd60[4];
//
extern void (*AiProc[])(int i);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

2
Source/movie.h

@ -18,8 +18,6 @@ extern BOOL loop_movie;
void play_movie(const char *pszMovie, BOOL user_can_close); void play_movie(const char *pszMovie, BOOL user_can_close);
void MovieWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); void MovieWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
/* rdata */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

150
Source/mpqapi.cpp

@ -347,23 +347,26 @@ bool ReadMPQHeader(Archive *archive, _FILEHEADER *hdr)
} // namespace } // namespace
void mpqapi_remove_hash_entry(const char *pszName) static _BLOCKENTRY *mpqapi_new_block(int *block_index)
{ {
_HASHENTRY *pHashTbl;
_BLOCKENTRY *blockEntry; _BLOCKENTRY *blockEntry;
int hIdx, block_offset, block_size; DWORD i;
hIdx = FetchHandle(pszName); blockEntry = cur_archive.sgpBlockTbl;
if (hIdx != -1) {
pHashTbl = &cur_archive.sgpHashTbl[hIdx]; i = 0;
blockEntry = &cur_archive.sgpBlockTbl[pHashTbl->block]; while (blockEntry->offset || blockEntry->sizealloc || blockEntry->flags || blockEntry->sizefile) {
pHashTbl->block = -2; i++;
block_offset = blockEntry->offset; blockEntry++;
block_size = blockEntry->sizealloc; if (i >= 2048) {
memset(blockEntry, 0, sizeof(*blockEntry)); app_fatal("Out of free block entries");
mpqapi_alloc_block(block_offset, block_size); return NULL;
cur_archive.modified = true; }
} }
if (block_index)
*block_index = i;
return blockEntry;
} }
void mpqapi_alloc_block(uint32_t block_offset, uint32_t block_size) void mpqapi_alloc_block(uint32_t block_offset, uint32_t block_size)
@ -405,34 +408,38 @@ void mpqapi_alloc_block(uint32_t block_offset, uint32_t block_size)
} }
} }
_BLOCKENTRY *mpqapi_new_block(int *block_index) int mpqapi_find_free_block(uint32_t size, uint32_t *block_size)
{ {
_BLOCKENTRY *blockEntry; _BLOCKENTRY *pBlockTbl;
DWORD i; int i, result;
blockEntry = cur_archive.sgpBlockTbl;
i = 0; pBlockTbl = cur_archive.sgpBlockTbl;
while (blockEntry->offset || blockEntry->sizealloc || blockEntry->flags || blockEntry->sizefile) { i = 2048;
i++; while (1) {
blockEntry++; i--;
if (i >= 2048) { if (pBlockTbl->offset && !pBlockTbl->flags && !pBlockTbl->sizefile && (DWORD)pBlockTbl->sizealloc >= size)
app_fatal("Out of free block entries"); break;
return NULL; pBlockTbl++;
if (!i) {
*block_size = size;
result = cur_archive.size;
cur_archive.size += size;
return result;
} }
} }
if (block_index)
*block_index = i;
return blockEntry; result = pBlockTbl->offset;
} *block_size = size;
pBlockTbl->offset += size;
pBlockTbl->sizealloc -= size;
int FetchHandle(const char *pszName) if (!pBlockTbl->sizealloc)
{ memset(pBlockTbl, 0, sizeof(*pBlockTbl));
return mpqapi_get_hash_index(Hash(pszName, 0), Hash(pszName, 1), Hash(pszName, 2), 0);
return result;
} }
int mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale) static int mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale)
{ {
int idx, i; int idx, i;
@ -449,6 +456,30 @@ int mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale)
return -1; return -1;
} }
static int FetchHandle(const char *pszName)
{
return mpqapi_get_hash_index(Hash(pszName, 0), Hash(pszName, 1), Hash(pszName, 2), 0);
}
void mpqapi_remove_hash_entry(const char *pszName)
{
_HASHENTRY *pHashTbl;
_BLOCKENTRY *blockEntry;
int hIdx, block_offset, block_size;
hIdx = FetchHandle(pszName);
if (hIdx != -1) {
pHashTbl = &cur_archive.sgpHashTbl[hIdx];
blockEntry = &cur_archive.sgpBlockTbl[pHashTbl->block];
pHashTbl->block = -2;
block_offset = blockEntry->offset;
block_size = blockEntry->sizealloc;
memset(blockEntry, 0, sizeof(*blockEntry));
mpqapi_alloc_block(block_offset, block_size);
cur_archive.modified = true;
}
}
void mpqapi_remove_hash_entries(BOOL (*fnGetName)(DWORD, char *)) void mpqapi_remove_hash_entries(BOOL (*fnGetName)(DWORD, char *))
{ {
DWORD dwIndex, i; DWORD dwIndex, i;
@ -460,21 +491,7 @@ void mpqapi_remove_hash_entries(BOOL (*fnGetName)(DWORD, char *))
} }
} }
BOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen) static _BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_index)
{
_BLOCKENTRY *blockEntry;
cur_archive.modified = true;
mpqapi_remove_hash_entry(pszName);
blockEntry = mpqapi_add_file(pszName, 0, 0);
if (!mpqapi_write_file_contents(pszName, pbData, dwLen, blockEntry)) {
mpqapi_remove_hash_entry(pszName);
return FALSE;
}
return TRUE;
}
_BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_index)
{ {
DWORD h1, h2, h3; DWORD h1, h2, h3;
int i, hIdx; int i, hIdx;
@ -504,7 +521,7 @@ _BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_i
return pBlk; return pBlk;
} }
BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk) static BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk)
{ {
const char *str_ptr = pszName; const char *str_ptr = pszName;
const char *tmp; const char *tmp;
@ -586,35 +603,18 @@ BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD d
return TRUE; return TRUE;
} }
int mpqapi_find_free_block(uint32_t size, uint32_t *block_size) BOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen)
{ {
_BLOCKENTRY *pBlockTbl; _BLOCKENTRY *blockEntry;
int i, result;
pBlockTbl = cur_archive.sgpBlockTbl; cur_archive.modified = true;
i = 2048; mpqapi_remove_hash_entry(pszName);
while (1) { blockEntry = mpqapi_add_file(pszName, 0, 0);
i--; if (!mpqapi_write_file_contents(pszName, pbData, dwLen, blockEntry)) {
if (pBlockTbl->offset && !pBlockTbl->flags && !pBlockTbl->sizefile && (DWORD)pBlockTbl->sizealloc >= size) mpqapi_remove_hash_entry(pszName);
break; return FALSE;
pBlockTbl++;
if (!i) {
*block_size = size;
result = cur_archive.size;
cur_archive.size += size;
return result;
}
} }
return TRUE;
result = pBlockTbl->offset;
*block_size = size;
pBlockTbl->offset += size;
pBlockTbl->sizealloc -= size;
if (!pBlockTbl->sizealloc)
memset(pBlockTbl, 0, sizeof(*pBlockTbl));
return result;
} }
void mpqapi_rename(char *pszOld, char *pszNew) void mpqapi_rename(char *pszOld, char *pszNew)

9
Source/mpqapi.h

@ -15,22 +15,13 @@ extern "C" {
#endif #endif
void mpqapi_remove_hash_entry(const char *pszName); void mpqapi_remove_hash_entry(const char *pszName);
void mpqapi_alloc_block(uint32_t block_offset, uint32_t block_size);
_BLOCKENTRY *mpqapi_new_block(int *block_index);
int FetchHandle(const char *pszName);
int mpqapi_get_hash_index(short index, int hash_a, int hash_b, int locale);
void mpqapi_remove_hash_entries(BOOL (*fnGetName)(DWORD, char *)); void mpqapi_remove_hash_entries(BOOL (*fnGetName)(DWORD, char *));
BOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen); BOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen);
_BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_index);
BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk);
int mpqapi_find_free_block(uint32_t size, uint32_t *block_size);
void mpqapi_rename(char *pszOld, char *pszNew); void mpqapi_rename(char *pszOld, char *pszNew);
BOOL mpqapi_has_file(const char *pszName); BOOL mpqapi_has_file(const char *pszName);
BOOL OpenMPQ(const char *pszArchive, DWORD dwChar); BOOL OpenMPQ(const char *pszArchive, DWORD dwChar);
BOOL mpqapi_flush_and_close(const char *pszArchive, BOOL bFree, DWORD dwChar); BOOL mpqapi_flush_and_close(const char *pszArchive, BOOL bFree, DWORD dwChar);
/* rdata */
/* data */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

Loading…
Cancel
Save