Browse Source

Rename monster globals

pull/2319/head
Anders Jenbo 5 years ago
parent
commit
07ad083fda
  1. 6
      Source/control.cpp
  2. 10
      Source/controls/plrctrls.cpp
  3. 38
      Source/cursor.cpp
  4. 32
      Source/dead.cpp
  5. 14
      Source/debug.cpp
  6. 4
      Source/diablo.cpp
  7. 14
      Source/effects.cpp
  8. 2
      Source/inv.cpp
  9. 28
      Source/items.cpp
  10. 50
      Source/loadsave.cpp
  11. 234
      Source/missiles.cpp
  12. 1588
      Source/monster.cpp
  13. 12
      Source/monster.h
  14. 66
      Source/msg.cpp
  15. 2
      Source/multi.cpp
  16. 20
      Source/objects.cpp
  17. 94
      Source/player.cpp
  18. 4
      Source/qol/monhealthbar.cpp
  19. 16
      Source/quests.cpp
  20. 26
      Source/scrollrt.cpp
  21. 56
      Source/sync.cpp
  22. 12
      Source/themes.cpp

6
Source/control.cpp

@ -1135,13 +1135,13 @@ void DrawInfoBox(const Surface &out)
if (pcursmonst != -1) {
if (leveltype != DTYPE_TOWN) {
infoclr = UIS_SILVER;
strcpy(infostr, _(monster[pcursmonst].mName));
strcpy(infostr, _(Monsters[pcursmonst].mName));
ClearPanel();
if (monster[pcursmonst]._uniqtype != 0) {
if (Monsters[pcursmonst]._uniqtype != 0) {
infoclr = UIS_GOLD;
PrintUniqueHistory();
} else {
PrintMonstHistory(monster[pcursmonst].MType->mtype);
PrintMonstHistory(Monsters[pcursmonst].MType->mtype);
}
} else if (pcursitem == -1) {
string_view townerName = towners[pcursmonst]._tName;

10
Source/controls/plrctrls.cpp

@ -187,7 +187,7 @@ bool HasRangedSpell()
bool CanTargetMonster(int mi)
{
const MonsterStruct &monst = monster[mi];
const MonsterStruct &monst = Monsters[mi];
if ((monst._mFlags & (MFLAG_HIDDEN | MFLAG_GOLEM)) != 0)
return false;
@ -218,8 +218,8 @@ void FindRangedTarget()
const bool newCanTalk = CanTalkToMonst(mi);
if (pcursmonst != -1 && !canTalk && newCanTalk)
continue;
const int newDdistance = GetDistanceRanged(monster[mi].position.future);
const int newRotations = GetRotaryDistance(monster[mi].position.future);
const int newDdistance = GetDistanceRanged(Monsters[mi].position.future);
const int newRotations = GetRotaryDistance(Monsters[mi].position.future);
if (pcursmonst != -1 && canTalk == newCanTalk) {
if (distance < newDdistance)
continue;
@ -1398,8 +1398,8 @@ bool SpellHasActorTarget()
return false;
if (spl == SPL_FIREWALL && pcursmonst != -1) {
cursmx = monster[pcursmonst].position.tile.x;
cursmy = monster[pcursmonst].position.tile.y;
cursmx = Monsters[pcursmonst].position.tile.x;
cursmy = Monsters[pcursmonst].position.tile.y;
}
return pcursplr != -1 || pcursmonst != -1;

38
Source/cursor.cpp

@ -418,7 +418,7 @@ void CheckCursMove()
if (pcurstemp != -1) {
if (!flipflag && mx + 2 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 2][my + 1] != 0 && (dFlags[mx + 2][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 2; /// BUGFIX: 'mx + 2' (fixed)
cursmy = my + 1; /// BUGFIX: 'my + 1' (fixed)
pcursmonst = mi;
@ -426,7 +426,7 @@ void CheckCursMove()
}
if (flipflag && mx + 1 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 1][my + 2] != 0 && (dFlags[mx + 1][my + 2] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 1;
cursmy = my + 2;
pcursmonst = mi;
@ -434,7 +434,7 @@ void CheckCursMove()
}
if (mx + 2 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 2][my + 2] != 0 && (dFlags[mx + 2][my + 2] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 2;
cursmy = my + 2;
pcursmonst = mi;
@ -442,7 +442,7 @@ void CheckCursMove()
}
if (mx + 1 < MAXDUNX && !flipflag && dMonster[mx + 1][my] != 0 && (dFlags[mx + 1][my] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx + 1;
cursmy = my;
pcursmonst = mi;
@ -450,7 +450,7 @@ void CheckCursMove()
}
if (my + 1 < MAXDUNY && flipflag && dMonster[mx][my + 1] != 0 && (dFlags[mx][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx;
cursmy = my + 1;
pcursmonst = mi;
@ -458,7 +458,7 @@ void CheckCursMove()
}
if (dMonster[mx][my] != 0 && (dFlags[mx][my] & BFLAG_LIT) != 0) {
int mi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 1) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 1) != 0) {
cursmx = mx;
cursmy = my;
pcursmonst = mi;
@ -466,18 +466,18 @@ void CheckCursMove()
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 1][my + 1] != 0 && (dFlags[mx + 1][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);
if (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (mi == pcurstemp && Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx + 1;
cursmy = my + 1;
pcursmonst = mi;
}
}
if (pcursmonst != -1 && (monster[pcursmonst]._mFlags & MFLAG_HIDDEN) != 0) {
if (pcursmonst != -1 && (Monsters[pcursmonst]._mFlags & MFLAG_HIDDEN) != 0) {
pcursmonst = -1;
cursmx = mx;
cursmy = my;
}
if (pcursmonst != -1 && (monster[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (monster[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
if (pcursmonst != -1 && (Monsters[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (Monsters[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
pcursmonst = -1;
}
if (pcursmonst != -1) {
@ -486,7 +486,7 @@ void CheckCursMove()
}
if (!flipflag && mx + 2 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 2][my + 1] != 0 && (dFlags[mx + 2][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 2;
cursmy = my + 1;
pcursmonst = mi;
@ -494,7 +494,7 @@ void CheckCursMove()
}
if (flipflag && mx + 1 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 1][my + 2] != 0 && (dFlags[mx + 1][my + 2] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 1;
cursmy = my + 2;
pcursmonst = mi;
@ -502,7 +502,7 @@ void CheckCursMove()
}
if (mx + 2 < MAXDUNX && my + 2 < MAXDUNY && dMonster[mx + 2][my + 2] != 0 && (dFlags[mx + 2][my + 2] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 4) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 4) != 0) {
cursmx = mx + 2;
cursmy = my + 2;
pcursmonst = mi;
@ -510,7 +510,7 @@ void CheckCursMove()
}
if (!flipflag && mx + 1 < MAXDUNX && dMonster[mx + 1][my] != 0 && (dFlags[mx + 1][my] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx + 1;
cursmy = my;
pcursmonst = mi;
@ -518,7 +518,7 @@ void CheckCursMove()
}
if (flipflag && my + 1 < MAXDUNY && dMonster[mx][my + 1] != 0 && (dFlags[mx][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx;
cursmy = my + 1;
pcursmonst = mi;
@ -526,7 +526,7 @@ void CheckCursMove()
}
if (dMonster[mx][my] != 0 && (dFlags[mx][my] & BFLAG_LIT) != 0) {
int mi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 1) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 1) != 0) {
cursmx = mx;
cursmy = my;
pcursmonst = mi;
@ -534,18 +534,18 @@ void CheckCursMove()
}
if (mx + 1 < MAXDUNX && my + 1 < MAXDUNY && dMonster[mx + 1][my + 1] != 0 && (dFlags[mx + 1][my + 1] & BFLAG_LIT) != 0) {
int mi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);
if (monster[mi]._mhitpoints >> 6 > 0 && (monster[mi].MData->mSelFlag & 2) != 0) {
if (Monsters[mi]._mhitpoints >> 6 > 0 && (Monsters[mi].MData->mSelFlag & 2) != 0) {
cursmx = mx + 1;
cursmy = my + 1;
pcursmonst = mi;
}
}
if (pcursmonst != -1 && (monster[pcursmonst]._mFlags & MFLAG_HIDDEN) != 0) {
if (pcursmonst != -1 && (Monsters[pcursmonst]._mFlags & MFLAG_HIDDEN) != 0) {
pcursmonst = -1;
cursmx = mx;
cursmy = my;
}
if (pcursmonst != -1 && (monster[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (monster[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
if (pcursmonst != -1 && (Monsters[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (Monsters[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
pcursmonst = -1;
}
} else {
@ -712,7 +712,7 @@ void CheckCursMove()
cursmx = mx;
cursmy = my;
}
if (pcursmonst != -1 && (monster[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (monster[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
if (pcursmonst != -1 && (Monsters[pcursmonst]._mFlags & MFLAG_GOLEM) != 0 && (Monsters[pcursmonst]._mFlags & MFLAG_BERSERK) == 0) {
pcursmonst = -1;
}
}

32
Source/dead.cpp

@ -32,16 +32,16 @@ void InitDead()
int8_t nd = 0;
for (int i = 0; i < nummtypes; i++) {
if (mtypes[Monsters[i].mtype] != 0)
for (int i = 0; i < LevelMonsterTypeCount; i++) {
if (mtypes[LevelMonsterTypes[i].mtype] != 0)
continue;
InitDeadAnimationFromMonster(Dead[nd], Monsters[i]);
InitDeadAnimationFromMonster(Dead[nd], LevelMonsterTypes[i]);
Dead[nd].translationPaletteIndex = 0;
nd++;
Monsters[i].mdeadval = nd;
mtypes[Monsters[i].mtype] = nd;
LevelMonsterTypes[i].mdeadval = nd;
mtypes[LevelMonsterTypes[i].mtype] = nd;
}
for (auto &dead : Dead[nd].data)
@ -61,14 +61,14 @@ void InitDead()
stonendx = nd;
for (int i = 0; i < nummonsters; i++) {
int mi = monstactive[i];
if (monster[mi]._uniqtype != 0) {
InitDeadAnimationFromMonster(Dead[nd], *monster[mi].MType);
Dead[nd].translationPaletteIndex = monster[mi]._uniqtrans + 4;
for (int i = 0; i < ActiveMonsterCount; i++) {
int mi = ActiveMonsters[i];
if (Monsters[mi]._uniqtype != 0) {
InitDeadAnimationFromMonster(Dead[nd], *Monsters[mi].MType);
Dead[nd].translationPaletteIndex = Monsters[mi]._uniqtrans + 4;
nd++;
monster[mi]._udeadval = nd;
Monsters[mi]._udeadval = nd;
}
}
@ -82,14 +82,14 @@ void AddDead(Point tilePosition, int8_t dv, Direction ddir)
void SetDead()
{
for (int i = 0; i < nummonsters; i++) {
int mi = monstactive[i];
if (monster[mi]._uniqtype == 0)
for (int i = 0; i < ActiveMonsterCount; i++) {
int mi = ActiveMonsters[i];
if (Monsters[mi]._uniqtype == 0)
continue;
for (int dx = 0; dx < MAXDUNX; dx++) {
for (int dy = 0; dy < MAXDUNY; dy++) {
if ((dDead[dx][dy] & 0x1F) == monster[mi]._udeadval)
ChangeLightXY(monster[mi].mlid, { dx, dy });
if ((dDead[dx][dy] & 0x1F) == Monsters[mi]._udeadval)
ChangeLightXY(Monsters[mi].mlid, { dx, dy });
}
}
}

14
Source/debug.cpp

@ -182,23 +182,23 @@ void PrintDebugMonster(int m)
int i;
char dstr[128];
sprintf(dstr, "Monster %i = %s", m, _(monster[m].mName));
sprintf(dstr, "Monster %i = %s", m, _(Monsters[m].mName));
NetSendCmdString(1 << myplr, dstr);
sprintf(dstr, "X = %i, Y = %i", monster[m].position.tile.x, monster[m].position.tile.y);
sprintf(dstr, "X = %i, Y = %i", Monsters[m].position.tile.x, Monsters[m].position.tile.y);
NetSendCmdString(1 << myplr, dstr);
sprintf(dstr, "Enemy = %i, HP = %i", monster[m]._menemy, monster[m]._mhitpoints);
sprintf(dstr, "Enemy = %i, HP = %i", Monsters[m]._menemy, Monsters[m]._mhitpoints);
NetSendCmdString(1 << myplr, dstr);
sprintf(dstr, "Mode = %i, Var1 = %i", monster[m]._mmode, monster[m]._mVar1);
sprintf(dstr, "Mode = %i, Var1 = %i", Monsters[m]._mmode, Monsters[m]._mVar1);
NetSendCmdString(1 << myplr, dstr);
bActive = false;
for (i = 0; i < nummonsters; i++) {
if (monstactive[i] == m)
for (i = 0; i < ActiveMonsterCount; i++) {
if (ActiveMonsters[i] == m)
bActive = true;
}
sprintf(dstr, "Active List = %i, Squelch = %i", bActive ? 1 : 0, monster[m]._msquelch);
sprintf(dstr, "Active List = %i, Squelch = %i", bActive ? 1 : 0, Monsters[m]._msquelch);
NetSendCmdString(1 << myplr, dstr);
}

4
Source/diablo.cpp

@ -1450,8 +1450,8 @@ void CreateLevel(lvl_entry lvldir)
static void UpdateMonsterLights()
{
for (int i = 0; i < nummonsters; i++) {
MonsterStruct *mon = &monster[monstactive[i]];
for (int i = 0; i < ActiveMonsterCount; i++) {
MonsterStruct *mon = &Monsters[ActiveMonsters[i]];
if (mon->mlid != NO_LIGHT) {
if (mon->mlid == plr[myplr]._plid) { // Fix old saves where some monsters had 0 instead of NO_LIGHT
mon->mlid = NO_LIGHT;

14
Source/effects.cpp

@ -1119,13 +1119,13 @@ void InitMonsterSND(int monst)
return;
}
const int mtype = Monsters[monst].mtype;
const int mtype = LevelMonsterTypes[monst].mtype;
for (int i = 0; i < 4; i++) {
if (MonstSndChar[i] != 's' || MonsterData[mtype].snd_special) {
for (int j = 0; j < 2; j++) {
char path[MAX_PATH];
sprintf(path, MonsterData[mtype].sndfile, MonstSndChar[i], j + 1);
Monsters[monst].Snds[i][j] = sound_file_load(path);
LevelMonsterTypes[monst].Snds[i][j] = sound_file_load(path);
}
}
}
@ -1133,8 +1133,8 @@ void InitMonsterSND(int monst)
void FreeMonsterSnd()
{
for (int i = 0; i < nummtypes; i++) {
for (auto &variants : Monsters[i].Snds) {
for (int i = 0; i < LevelMonsterTypeCount; i++) {
for (auto &variants : LevelMonsterTypes[i].Snds) {
for (auto &snd : variants) {
snd = nullptr;
}
@ -1203,15 +1203,15 @@ void PlayEffect(int i, int mode)
return;
}
int mi = monster[i]._mMTidx;
TSnd *snd = Monsters[mi].Snds[mode][sndIdx].get();
int mi = Monsters[i]._mMTidx;
TSnd *snd = LevelMonsterTypes[mi].Snds[mode][sndIdx].get();
if (snd == nullptr || snd->isPlaying()) {
return;
}
int lVolume = 0;
int lPan = 0;
if (!calc_snd_position(monster[i].position.tile, &lVolume, &lPan))
if (!calc_snd_position(Monsters[i].position.tile, &lVolume, &lPan))
return;
snd_play_snd(snd, lVolume, lPan);

2
Source/inv.cpp

@ -2145,7 +2145,7 @@ void DoTelekinesis()
NetSendCmdParam1(true, CMD_OPOBJT, pcursobj);
if (pcursitem != -1)
NetSendCmdGItem(true, CMD_REQUESTAGITEM, myplr, myplr, pcursitem);
if (pcursmonst != -1 && !M_Talker(pcursmonst) && monster[pcursmonst].mtalkmsg == TEXT_NONE)
if (pcursmonst != -1 && !M_Talker(pcursmonst) && Monsters[pcursmonst].mtalkmsg == TEXT_NONE)
NetSendCmdParam1(true, CMD_KNOCKBACK, pcursmonst);
NewCursor(CURSOR_HAND);
}

28
Source/items.cpp

@ -2215,10 +2215,10 @@ void SetupItem(int i)
int RndItem(int m)
{
if ((monster[m].MData->mTreasure & 0x8000) != 0)
return -((monster[m].MData->mTreasure & 0xFFF) + 1);
if ((Monsters[m].MData->mTreasure & 0x8000) != 0)
return -((Monsters[m].MData->mTreasure & 0xFFF) + 1);
if ((monster[m].MData->mTreasure & 0x4000) != 0)
if ((Monsters[m].MData->mTreasure & 0x4000) != 0)
return 0;
if (GenerateRnd(100) > 40)
@ -2234,12 +2234,12 @@ int RndItem(int m)
if (!IsItemAvailable(i))
continue;
if (AllItemsList[i].iRnd == IDROP_DOUBLE && monster[m].mLevel >= AllItemsList[i].iMinMLvl
if (AllItemsList[i].iRnd == IDROP_DOUBLE && Monsters[m].mLevel >= AllItemsList[i].iMinMLvl
&& ri < 512) {
ril[ri] = i;
ri++;
}
if (AllItemsList[i].iRnd != IDROP_NEVER && monster[m].mLevel >= AllItemsList[i].iMinMLvl
if (AllItemsList[i].iRnd != IDROP_NEVER && Monsters[m].mLevel >= AllItemsList[i].iMinMLvl
&& ri < 512) {
ril[ri] = i;
ri++;
@ -2256,8 +2256,8 @@ int RndItem(int m)
int RndUItem(int m)
{
if (m != -1 && (monster[m].MData->mTreasure & 0x8000) != 0 && !gbIsMultiplayer)
return -((monster[m].MData->mTreasure & 0xFFF) + 1);
if (m != -1 && (Monsters[m].MData->mTreasure & 0x8000) != 0 && !gbIsMultiplayer)
return -((Monsters[m].MData->mTreasure & 0xFFF) + 1);
int ril[512];
@ -2271,7 +2271,7 @@ int RndUItem(int m)
if (AllItemsList[i].iRnd == IDROP_NEVER)
okflag = false;
if (m != -1) {
if (monster[m].mLevel < AllItemsList[i].iMinMLvl)
if (Monsters[m].mLevel < AllItemsList[i].iMinMLvl)
okflag = false;
} else {
if (2 * curlv < AllItemsList[i].iMinMLvl)
@ -2494,7 +2494,7 @@ void SpawnItem(int m, Point position, bool sendmsg)
int idx;
bool onlygood = true;
if (monster[m]._uniqtype != 0 || ((monster[m].MData->mTreasure & 0x8000) != 0 && gbIsMultiplayer)) {
if (Monsters[m]._uniqtype != 0 || ((Monsters[m].MData->mTreasure & 0x8000) != 0 && gbIsMultiplayer)) {
idx = RndUItem(m);
if (idx < 0) {
SpawnUnique((_unique_items) - (idx + 1), position);
@ -2522,10 +2522,10 @@ void SpawnItem(int m, Point position, bool sendmsg)
int ii = AllocateItem();
GetSuperItemSpace(position, ii);
int uper = monster[m]._uniqtype != 0 ? 15 : 1;
int uper = Monsters[m]._uniqtype != 0 ? 15 : 1;
int8_t mLevel = monster[m].MData->mLevel;
if (!gbIsHellfire && monster[m].MType->mtype == MT_DIABLO)
int8_t mLevel = Monsters[m].MData->mLevel;
if (!gbIsHellfire && Monsters[m].MType->mtype == MT_DIABLO)
mLevel -= 15;
SetupAllItems(ii, idx, AdvanceRndSeed(), mLevel, uper, onlygood, false, false);
@ -3364,7 +3364,7 @@ void PrintItemPower(char plidx, ItemStruct *x)
case IPL_SETAC:
case IPL_AC_CURSE:
strcpy(tempstr, fmt::format(_("armor class: {:d}"), x->_iAC).c_str());
break;
break;
case IPL_FIRERES:
case IPL_FIRERES_CURSE:
if (x->_iPLFR < 75)
@ -4261,7 +4261,7 @@ static void SpawnOnePremium(int i, int plvl, int playerId)
count++;
} while (keepGoing
|| ((
|| ((
items[0]._iIvalue > 200000
|| items[0]._iMinStr > strength
|| items[0]._iMinMag > magic

50
Source/loadsave.cpp

@ -99,7 +99,7 @@ public:
&& m_size_ >= (m_cur_ + size);
}
template<typename T>
template <typename T>
constexpr void Skip()
{
Skip(sizeof(T));
@ -162,7 +162,7 @@ public:
&& m_capacity_ >= (m_cur_ + len);
}
template<typename T>
template <typename T>
constexpr void Skip()
{
Skip(sizeof(T));
@ -373,7 +373,7 @@ static void LoadPlayer(LoadHelper *file, int p)
file->Skip(2); // Alignment
player._pTSpell = static_cast<spell_id>(file->NextLE<int32_t>());
file->Skip<int8_t>(); // Skip _pTSplType
file->Skip(3); // Alignment
file->Skip(3); // Alignment
player._pRSpell = static_cast<spell_id>(file->NextLE<int32_t>());
player._pRSplType = static_cast<spell_type>(file->NextLE<int8_t>());
file->Skip(3); // Alignment
@ -552,7 +552,7 @@ bool gbSkipSync = false;
static void LoadMonster(LoadHelper *file, int i)
{
MonsterStruct *pMonster = &monster[i];
MonsterStruct *pMonster = &Monsters[i];
pMonster->_mMTidx = file->NextLE<int32_t>();
pMonster->_mmode = static_cast<MON_MODE>(file->NextLE<int32_t>());
@ -1153,19 +1153,19 @@ void LoadGame(bool firstflag)
ViewX = viewX;
ViewY = viewY;
nummonsters = tmpNummonsters;
ActiveMonsterCount = tmpNummonsters;
numitems = tmpNumitems;
nummissiles = tmpNummissiles;
nobjects = tmpNobjects;
for (int &monstkill : monstkills)
for (int &monstkill : MonsterKillCounts)
monstkill = file.NextBE<int32_t>();
if (leveltype != DTYPE_TOWN) {
for (int &monsterId : monstactive)
for (int &monsterId : ActiveMonsters)
monsterId = file.NextBE<int32_t>();
for (int i = 0; i < nummonsters; i++)
LoadMonster(&file, monstactive[i]);
for (int i = 0; i < ActiveMonsterCount; i++)
LoadMonster(&file, ActiveMonsters[i]);
for (int &missileId : missileactive)
missileId = file.NextLE<int8_t>();
for (int &missileId : missileavail)
@ -1518,7 +1518,7 @@ static void SavePlayer(SaveHelper *file, int p)
file->Skip(2); // Alignment
file->Skip<int32_t>(); // Skip _pGFXLoad
file->Skip(4 * 8); // Skip pointers _pNAnim
file->Skip(4 * 8); // Skip pointers _pNAnim
file->WriteLE<int32_t>(player._pNFrames);
file->Skip(4); // Skip _pNWidth
file->Skip(4 * 8); // Skip pointers _pWAnim
@ -1567,7 +1567,7 @@ static void SavePlayer(SaveHelper *file, int p)
file->WriteLE<int8_t>(player._pISplLvlAdd);
file->Skip<uint8_t>(); // Skip _pISplCost
file->Skip(2); // Alignment
file->Skip(2); // Alignment
file->WriteLE<int32_t>(player._pISplDur);
file->WriteLE<int32_t>(player._pIEnAc);
file->WriteLE<int32_t>(player._pIFMinDam);
@ -1607,7 +1607,7 @@ static void SavePlayer(SaveHelper *file, int p)
static void SaveMonster(SaveHelper *file, int i)
{
MonsterStruct *pMonster = &monster[i];
MonsterStruct *pMonster = &Monsters[i];
file->WriteLE<int32_t>(pMonster->_mMTidx);
file->WriteLE<int32_t>(pMonster->_mmode);
@ -1905,7 +1905,7 @@ void SaveGameData()
file.WriteBE<int32_t>(ViewY);
file.WriteLE<uint8_t>(invflag ? 1 : 0);
file.WriteLE<uint8_t>(chrflag ? 1 : 0);
file.WriteBE<int32_t>(nummonsters);
file.WriteBE<int32_t>(ActiveMonsterCount);
file.WriteBE<int32_t>(numitems);
file.WriteBE<int32_t>(nummissiles);
file.WriteBE<int32_t>(nobjects);
@ -1922,14 +1922,14 @@ void SaveGameData()
SaveQuest(&file, i);
for (int i = 0; i < MAXPORTAL; i++)
SavePortal(&file, i);
for (int monstkill : monstkills)
for (int monstkill : MonsterKillCounts)
file.WriteBE<int32_t>(monstkill);
if (leveltype != DTYPE_TOWN) {
for (int monsterId : monstactive)
for (int monsterId : ActiveMonsters)
file.WriteBE<int32_t>(monsterId);
for (int i = 0; i < nummonsters; i++)
SaveMonster(&file, monstactive[i]);
for (int i = 0; i < ActiveMonsterCount; i++)
SaveMonster(&file, ActiveMonsters[i]);
for (int missileId : missileactive)
file.WriteLE<int8_t>(missileId);
for (int missileId : missileavail)
@ -2050,15 +2050,15 @@ void SaveLevel()
}
}
file.WriteBE<int32_t>(nummonsters);
file.WriteBE<int32_t>(ActiveMonsterCount);
file.WriteBE<int32_t>(numitems);
file.WriteBE<int32_t>(nobjects);
if (leveltype != DTYPE_TOWN) {
for (int monsterId : monstactive)
for (int monsterId : ActiveMonsters)
file.WriteBE<int32_t>(monsterId);
for (int i = 0; i < nummonsters; i++)
SaveMonster(&file, monstactive[i]);
for (int i = 0; i < ActiveMonsterCount; i++)
SaveMonster(&file, ActiveMonsters[i]);
for (int objectId : objectactive)
file.WriteLE<int8_t>(objectId);
for (int objectId : objectavail)
@ -2133,15 +2133,15 @@ void LoadLevel()
SetDead();
}
nummonsters = file.NextBE<int32_t>();
ActiveMonsterCount = file.NextBE<int32_t>();
numitems = file.NextBE<int32_t>();
nobjects = file.NextBE<int32_t>();
if (leveltype != DTYPE_TOWN) {
for (int &monsterId : monstactive)
for (int &monsterId : ActiveMonsters)
monsterId = file.NextBE<int32_t>();
for (int i = 0; i < nummonsters; i++)
LoadMonster(&file, monstactive[i]);
for (int i = 0; i < ActiveMonsterCount; i++)
LoadMonster(&file, ActiveMonsters[i]);
for (int &objectId : objectactive)
objectId = file.NextLE<int8_t>();
for (int &objectId : objectavail)

234
Source/missiles.cpp

@ -398,19 +398,19 @@ void MoveMissilePos(int i)
bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, bool shift)
{
bool resist = false;
if (monster[m].mtalkmsg != TEXT_NONE) {
if (Monsters[m].mtalkmsg != TEXT_NONE) {
return false;
}
if (monster[m]._mhitpoints >> 6 <= 0) {
if (Monsters[m]._mhitpoints >> 6 <= 0) {
return false;
}
if (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT)
if (Monsters[m].MType->mtype == MT_ILLWEAV && Monsters[m]._mgoal == MGOAL_RETREAT)
return false;
if (monster[m]._mmode == MM_CHARGE)
if (Monsters[m]._mmode == MM_CHARGE)
return false;
missile_resistance mir = missiledata[t].mResist;
int mor = monster[m].mMagicRes;
int mor = Monsters[m].mMagicRes;
if (((mor & IMMUNE_MAGIC) != 0 && mir == MISR_MAGIC)
|| ((mor & IMMUNE_FIRE) != 0 && mir == MISR_FIRE)
|| ((mor & IMMUNE_LIGHTNING) != 0 && mir == MISR_LIGHTNING)) {
@ -424,7 +424,7 @@ bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, bool shift)
}
int hit = GenerateRnd(100);
int hper = 90 - (BYTE)monster[m].mArmorClass - dist;
int hper = 90 - (BYTE)Monsters[m].mArmorClass - dist;
if (hper < 5)
hper = 5;
if (hper > 95)
@ -434,35 +434,35 @@ bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, bool shift)
return ret;
}
#ifdef _DEBUG
if (hit < hper || debug_mode_dollar_sign || debug_mode_key_inverted_v || monster[m]._mmode == MM_STONE) {
if (hit < hper || debug_mode_dollar_sign || debug_mode_key_inverted_v || Monsters[m]._mmode == MM_STONE) {
#else
if (hit < hper || monster[m]._mmode == MM_STONE) {
if (hit < hper || Monsters[m]._mmode == MM_STONE) {
#endif
int dam = mindam + GenerateRnd(maxdam - mindam + 1);
if (!shift)
dam <<= 6;
if (resist)
monster[m]._mhitpoints -= dam / 4;
Monsters[m]._mhitpoints -= dam / 4;
else
monster[m]._mhitpoints -= dam;
Monsters[m]._mhitpoints -= dam;
#ifdef _DEBUG
if (debug_mode_dollar_sign || debug_mode_key_inverted_v)
monster[m]._mhitpoints = 0;
Monsters[m]._mhitpoints = 0;
#endif
if (monster[m]._mhitpoints >> 6 <= 0) {
if (monster[m]._mmode == MM_STONE) {
if (Monsters[m]._mhitpoints >> 6 <= 0) {
if (Monsters[m]._mmode == MM_STONE) {
M_StartKill(m, -1);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
M_StartKill(m, -1);
}
} else {
if (resist) {
PlayEffect(m, 1);
} else if (monster[m]._mmode == MM_STONE) {
} else if (Monsters[m]._mmode == MM_STONE) {
if (m > MAX_PLRS - 1)
M_StartHit(m, -1, dam);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
if (m > MAX_PLRS - 1)
M_StartHit(m, -1, dam);
@ -476,17 +476,17 @@ bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, bool shift)
bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool shift)
{
bool resist = false;
if (monster[m].mtalkmsg != TEXT_NONE
|| monster[m]._mhitpoints >> 6 <= 0
|| (t == MIS_HBOLT && monster[m].MType->mtype != MT_DIABLO && monster[m].MData->mMonstClass != MC_UNDEAD)) {
if (Monsters[m].mtalkmsg != TEXT_NONE
|| Monsters[m]._mhitpoints >> 6 <= 0
|| (t == MIS_HBOLT && Monsters[m].MType->mtype != MT_DIABLO && Monsters[m].MData->mMonstClass != MC_UNDEAD)) {
return false;
}
if (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT)
if (Monsters[m].MType->mtype == MT_ILLWEAV && Monsters[m]._mgoal == MGOAL_RETREAT)
return false;
if (monster[m]._mmode == MM_CHARGE)
if (Monsters[m]._mmode == MM_CHARGE)
return false;
uint8_t mor = monster[m].mMagicRes;
uint8_t mor = Monsters[m].mMagicRes;
missile_resistance mir = missiledata[t].mResist;
if (((mor & IMMUNE_MAGIC) != 0 && mir == MISR_MAGIC)
@ -500,7 +500,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
|| ((mor & RESIST_LIGHTNING) != 0 && mir == MISR_LIGHTNING))
resist = true;
if (gbIsHellfire && t == MIS_HBOLT && (monster[m].MType->mtype == MT_DIABLO || monster[m].MType->mtype == MT_BONEDEMN))
if (gbIsHellfire && t == MIS_HBOLT && (Monsters[m].MType->mtype == MT_DIABLO || Monsters[m].MType->mtype == MT_BONEDEMN))
resist = true;
int hit = GenerateRnd(100);
@ -511,7 +511,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
hper = player._pDexterity;
hper += player._pIBonusToHit;
hper += player._pLevel;
hper -= monster[m].mArmorClass;
hper -= Monsters[m].mArmorClass;
hper -= (dist * dist) / 2;
hper += player._pIEnAc;
hper += 50;
@ -520,19 +520,19 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
if (player._pClass == HeroClass::Warrior || player._pClass == HeroClass::Bard)
hper += 10;
} else {
hper = player._pMagic - (monster[m].mLevel * 2) - dist + 50;
hper = player._pMagic - (Monsters[m].mLevel * 2) - dist + 50;
if (player._pClass == HeroClass::Sorcerer)
hper += 20;
else if (player._pClass == HeroClass::Bard)
hper += 10;
}
} else {
hper = GenerateRnd(75) - monster[m].mLevel * 2;
hper = GenerateRnd(75) - Monsters[m].mLevel * 2;
}
hper = clamp(hper, 5, 95);
if (monster[m]._mmode == MM_STONE)
if (Monsters[m]._mmode == MM_STONE)
hit = 0;
bool ret = false;
@ -549,7 +549,7 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
int dam;
if (t == MIS_BONESPIRIT) {
dam = monster[m]._mhitpoints / 3 >> 6;
dam = Monsters[m]._mhitpoints / 3 >> 6;
} else {
dam = mindam + GenerateRnd(maxdam - mindam + 1);
}
@ -569,25 +569,25 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
dam >>= 2;
if (pnum == myplr)
monster[m]._mhitpoints -= dam;
Monsters[m]._mhitpoints -= dam;
if ((gbIsHellfire && (plr[pnum]._pIFlags & ISPL_NOHEALMON) != 0) || (!gbIsHellfire && (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS) != 0))
monster[m]._mFlags |= MFLAG_NOHEAL;
Monsters[m]._mFlags |= MFLAG_NOHEAL;
if (monster[m]._mhitpoints >> 6 <= 0) {
if (monster[m]._mmode == MM_STONE) {
if (Monsters[m]._mhitpoints >> 6 <= 0) {
if (Monsters[m]._mmode == MM_STONE) {
M_StartKill(m, pnum);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
M_StartKill(m, pnum);
}
} else {
if (resist) {
PlayEffect(m, 1);
} else if (monster[m]._mmode == MM_STONE) {
} else if (Monsters[m]._mmode == MM_STONE) {
if (m > MAX_PLRS - 1)
M_StartHit(m, pnum, dam);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
if (missiledata[t].mType == 0 && (plr[pnum]._pIFlags & ISPL_KNOCKBACK) != 0) {
M_GetKnockback(m);
@ -597,9 +597,9 @@ bool MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, bool
}
}
if (monster[m]._msquelch == 0) {
monster[m]._msquelch = UINT8_MAX;
monster[m].position.last = plr[pnum].position.tile;
if (Monsters[m]._msquelch == 0) {
Monsters[m]._msquelch = UINT8_MAX;
Monsters[m].position.last = plr[pnum].position.tile;
}
return true;
@ -632,15 +632,15 @@ bool PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, bool s
if (missiledata[mtype].mType == 0) {
int tac = player._pIAC + player._pIBonusAC + player._pDexterity / 5;
if (m != -1) {
hper = monster[m].mHit
+ ((monster[m].mLevel - player._pLevel) * 2)
hper = Monsters[m].mHit
+ ((Monsters[m].mLevel - player._pLevel) * 2)
+ 30
- (dist * 2) - tac;
} else {
hper = 100 - (tac / 2) - (dist * 2);
}
} else if (m != -1) {
hper += (monster[m].mLevel * 2) - (player._pLevel * 2) - (dist * 2);
hper += (Monsters[m].mLevel * 2) - (player._pLevel * 2) - (dist * 2);
}
if (hper < 10)
@ -667,7 +667,7 @@ bool PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, bool s
int blkper = player._pBaseToBlk + player._pDexterity;
if (m != -1)
blkper -= (monster[m].mLevel - player._pLevel) * 2;
blkper -= (Monsters[m].mLevel - player._pLevel) * 2;
if (blkper < 0)
blkper = 0;
@ -719,7 +719,7 @@ bool PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, bool s
if ((resper <= 0 || gbIsHellfire) && blk < blkper) {
Direction dir = player._pdir;
if (m != -1) {
dir = GetDirection(player.position.tile, monster[m].position.tile);
dir = GetDirection(player.position.tile, Monsters[m].position.tile);
}
*blocked = true;
StartPlrBlock(pnum, dir);
@ -890,7 +890,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, Point position,
}
} else {
if (dMonster[mx][my] < 0
&& monster[-(dMonster[mx][my] + 1)]._mmode == MM_STONE
&& Monsters[-(dMonster[mx][my] + 1)]._mmode == MM_STONE
&& MonsterMHit(
missile[i]._misource,
-(dMonster[mx][my] + 1),
@ -930,9 +930,9 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, Point position,
missile[i]._miHitFlag = true;
}
} else {
if ((monster[missile[i]._misource]._mFlags & MFLAG_TARGETS_MONSTER) != 0
if ((Monsters[missile[i]._misource]._mFlags & MFLAG_TARGETS_MONSTER) != 0
&& dMonster[mx][my] > 0
&& (monster[dMonster[mx][my] - 1]._mFlags & MFLAG_GOLEM) != 0
&& (Monsters[dMonster[mx][my] - 1]._mFlags & MFLAG_GOLEM) != 0
&& MonsterTrapHit(dMonster[mx][my] - 1, mindam, maxdam, missile[i]._midist, missile[i]._mitype, shift)) {
if (!nodel)
missile[i]._mirange = 0;
@ -1335,26 +1335,26 @@ void AddBerserk(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienem
if (dm <= 3)
continue;
if (monster[dm]._uniqtype != 0 || monster[dm]._mAi == AI_DIABLO)
if (Monsters[dm]._uniqtype != 0 || Monsters[dm]._mAi == AI_DIABLO)
continue;
if (monster[dm]._mmode == MM_FADEIN || monster[dm]._mmode == MM_FADEOUT)
if (Monsters[dm]._mmode == MM_FADEIN || Monsters[dm]._mmode == MM_FADEOUT)
continue;
if ((monster[dm].mMagicRes & IMMUNE_MAGIC) != 0)
if ((Monsters[dm].mMagicRes & IMMUNE_MAGIC) != 0)
continue;
if ((monster[dm].mMagicRes & RESIST_MAGIC) != 0 && ((monster[dm].mMagicRes & RESIST_MAGIC) != 1 || GenerateRnd(2) != 0))
if ((Monsters[dm].mMagicRes & RESIST_MAGIC) != 0 && ((Monsters[dm].mMagicRes & RESIST_MAGIC) != 1 || GenerateRnd(2) != 0))
continue;
if (monster[dm]._mmode == MM_CHARGE)
if (Monsters[dm]._mmode == MM_CHARGE)
continue;
i = 6;
auto slvl = GetSpellLevel(id, SPL_BERSERK);
monster[dm]._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;
monster[dm].mMinDamage = (GenerateRnd(10) + 120) * monster[dm].mMinDamage / 100 + slvl;
monster[dm].mMaxDamage = (GenerateRnd(10) + 120) * monster[dm].mMaxDamage / 100 + slvl;
monster[dm].mMinDamage2 = (GenerateRnd(10) + 120) * monster[dm].mMinDamage2 / 100 + slvl;
monster[dm].mMaxDamage2 = (GenerateRnd(10) + 120) * monster[dm].mMaxDamage2 / 100 + slvl;
Monsters[dm]._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;
Monsters[dm].mMinDamage = (GenerateRnd(10) + 120) * Monsters[dm].mMinDamage / 100 + slvl;
Monsters[dm].mMaxDamage = (GenerateRnd(10) + 120) * Monsters[dm].mMaxDamage / 100 + slvl;
Monsters[dm].mMinDamage2 = (GenerateRnd(10) + 120) * Monsters[dm].mMinDamage2 / 100 + slvl;
Monsters[dm].mMaxDamage2 = (GenerateRnd(10) + 120) * Monsters[dm].mMaxDamage2 / 100 + slvl;
int r = (currlevel < 17 || currlevel > 20) ? 3 : 9;
monster[dm].mlid = AddLight(monster[dm].position.tile, r);
Monsters[dm].mlid = AddLight(Monsters[dm].position.tile, r);
UseMana(id, SPL_BERSERK);
break;
}
@ -2080,7 +2080,7 @@ void AddLightning(int mi, Point /*src*/, Point dst, int midir, int8_t mienemy, i
void AddMisexp(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t mienemy, int id, int /*dam*/)
{
if (mienemy != 0 && id > 0) {
switch (monster[id].MType->mtype) {
switch (Monsters[id].MType->mtype) {
case MT_SUCCUBUS:
SetMissAnim(mi, MFILE_FLAREEXP);
break;
@ -2192,7 +2192,7 @@ void AddFlash(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t mienem
missile[mi]._midam += missile[mi]._midam / 2;
UseMana(id, SPL_FLASH);
} else {
missile[mi]._midam = monster[id].mLevel * 2;
missile[mi]._midam = Monsters[id].mLevel * 2;
}
} else {
missile[mi]._midam = currlevel / 2;
@ -2342,20 +2342,20 @@ void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const Monste
void AddRhino(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int id, int /*dam*/)
{
int graphic = MA_SPECIAL;
if (monster[id].MType->mtype < MT_HORNED || monster[id].MType->mtype > MT_OBLORD) {
if (monster[id].MType->mtype < MT_NSNAKE || monster[id].MType->mtype > MT_GSNAKE) {
if (Monsters[id].MType->mtype < MT_HORNED || Monsters[id].MType->mtype > MT_OBLORD) {
if (Monsters[id].MType->mtype < MT_NSNAKE || Monsters[id].MType->mtype > MT_GSNAKE) {
graphic = MA_WALK;
} else {
graphic = MA_ATTACK;
}
}
UpdateMissileVel(mi, src, dst, 18);
InitMissileAnimationFromMonster(missile[mi], midir, monster[id], graphic);
if (monster[id].MType->mtype >= MT_NSNAKE && monster[id].MType->mtype <= MT_GSNAKE)
InitMissileAnimationFromMonster(missile[mi], midir, Monsters[id], graphic);
if (Monsters[id].MType->mtype >= MT_NSNAKE && Monsters[id].MType->mtype <= MT_GSNAKE)
missile[mi]._miAnimFrame = 7;
if (monster[id]._uniqtype != 0) {
missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1;
missile[mi]._mlid = monster[id].mlid;
if (Monsters[id]._uniqtype != 0) {
missile[mi]._miUniqTrans = Monsters[id]._uniqtrans + 1;
missile[mi]._mlid = Monsters[id].mlid;
}
PutMissile(mi);
}
@ -2363,7 +2363,7 @@ void AddRhino(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int i
void AddFireman(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int id, int /*dam*/)
{
UpdateMissileVel(mi, src, dst, 16);
auto &mon = monster[id];
auto &mon = Monsters[id];
InitMissileAnimationFromMonster(missile[mi], midir, mon, MA_WALK);
if (mon._uniqtype != 0)
missile[mi]._miUniqTrans = mon._uniqtrans + 1;
@ -2386,13 +2386,13 @@ void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
ApplyPlrDamage(id, 5);
} else {
if (id > 0) {
if (monster[id].MType->mtype == MT_SUCCUBUS)
if (Monsters[id].MType->mtype == MT_SUCCUBUS)
SetMissAnim(mi, MFILE_FLARE);
if (monster[id].MType->mtype == MT_SNOWWICH)
if (Monsters[id].MType->mtype == MT_SNOWWICH)
SetMissAnim(mi, MFILE_SCUBMISB);
if (monster[id].MType->mtype == MT_HLSPWN)
if (Monsters[id].MType->mtype == MT_HLSPWN)
SetMissAnim(mi, MFILE_SCUBMISD);
if (monster[id].MType->mtype == MT_SOLBRNR)
if (Monsters[id].MType->mtype == MT_SOLBRNR)
SetMissAnim(mi, MFILE_SCUBMISC);
}
}
@ -2407,7 +2407,7 @@ void AddAcid(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, in
UpdateMissileVel(mi, src, dst, 16);
SetMissDir(mi, GetDirection16(src, dst));
if ((!gbIsHellfire && (missile[mi].position.velocity.deltaX & 0xFFFF0000) != 0) || (missile[mi].position.velocity.deltaY & 0xFFFF0000) != 0)
missile[mi]._mirange = 5 * (monster[id]._mint + 4);
missile[mi]._mirange = 5 * (Monsters[id]._mint + 4);
else
missile[mi]._mirange = 1;
missile[mi]._mlid = NO_LIGHT;
@ -2431,7 +2431,7 @@ void AddAcidpud(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mi
missile[mi].position.offset = { 0, 0 };
missile[mi]._miLightFlag = true;
int monst = missile[mi]._misource;
missile[mi]._mirange = GenerateRnd(15) + 40 * (monster[monst]._mint + 1);
missile[mi]._mirange = GenerateRnd(15) + 40 * (Monsters[monst]._mint + 1);
missile[mi]._miPreFlag = true;
}
@ -2451,13 +2451,13 @@ void AddStone(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*
if (InDungeonBounds({ tx, ty })) {
int mid = dMonster[tx][ty];
mid = mid > 0 ? mid - 1 : -(mid + 1);
if (mid > MAX_PLRS - 1 && monster[mid]._mAi != AI_DIABLO && monster[mid].MType->mtype != MT_NAKRUL) {
if (monster[mid]._mmode != MM_FADEIN && monster[mid]._mmode != MM_FADEOUT && monster[mid]._mmode != MM_CHARGE) {
if (mid > MAX_PLRS - 1 && Monsters[mid]._mAi != AI_DIABLO && Monsters[mid].MType->mtype != MT_NAKRUL) {
if (Monsters[mid]._mmode != MM_FADEIN && Monsters[mid]._mmode != MM_FADEOUT && Monsters[mid]._mmode != MM_CHARGE) {
faded = true;
i = 6;
missile[mi]._miVar1 = monster[mid]._mmode;
missile[mi]._miVar1 = Monsters[mid]._mmode;
missile[mi]._miVar2 = mid;
monster[mid].Petrify();
Monsters[mid].Petrify();
break;
}
}
@ -2497,7 +2497,7 @@ void AddGolem(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, i
missile[mi]._miVar2 = src.y;
missile[mi]._miVar4 = dst.x;
missile[mi]._miVar5 = dst.y;
if ((monster[id].position.tile.x != 1 || monster[id].position.tile.y != 0) && id == myplr)
if ((Monsters[id].position.tile.x != 1 || Monsters[id].position.tile.y != 0) && id == myplr)
M_StartKill(id, id);
UseMana(id, SPL_GOLEM);
}
@ -2798,7 +2798,7 @@ void AddFlame(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
int i = GenerateRnd(plr[id]._pLevel) + GenerateRnd(2);
missile[mi]._midam = 8 * i + 16 + ((8 * i + 16) / 2);
} else {
missile[mi]._midam = monster[id].mMinDamage + GenerateRnd(monster[id].mMaxDamage - monster[id].mMinDamage + 1);
missile[mi]._midam = Monsters[id].mMinDamage + GenerateRnd(Monsters[id].mMaxDamage - Monsters[id].mMinDamage + 1);
}
}
@ -2996,7 +2996,7 @@ static int Sentfire(int i, Point src)
{
int ex = 0;
if (LineClearMissile(missile[i].position.tile, src)) {
if (dMonster[src.x][src.y] > 0 && monster[dMonster[src.x][src.y] - 1]._mhitpoints >> 6 > 0 && dMonster[src.x][src.y] - 1 > MAX_PLRS - 1) {
if (dMonster[src.x][src.y] > 0 && Monsters[dMonster[src.x][src.y] - 1]._mhitpoints >> 6 > 0 && dMonster[src.x][src.y] - 1 > MAX_PLRS - 1) {
Direction dir = GetDirection(missile[i].position.tile, src);
missile[i]._miVar3 = missileavail[0];
AddMissile(missile[i].position.tile, src, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile[i]._misource, missile[i]._midam, GetSpellLevel(missile[i]._misource, SPL_FIREBOLT));
@ -3018,7 +3018,7 @@ void MI_Dummy(int i)
void MI_Golem(int mi)
{
int src = missile[mi]._misource;
if (monster[src].position.tile.x == 1 && monster[src].position.tile.y == 0) {
if (Monsters[src].position.tile.x == 1 && Monsters[src].position.tile.y == 0) {
for (int i = 0; i < 6; i++) {
int k = CrawlNum[i];
int ck = k + 2;
@ -3088,8 +3088,8 @@ void MI_LArrow(int i)
mind = plr[p]._pIMinDam;
maxd = plr[p]._pIMaxDam;
} else {
mind = monster[p].mMinDamage;
maxd = monster[p].mMaxDamage;
mind = Monsters[p].mMinDamage;
maxd = Monsters[p].mMaxDamage;
}
} else {
mind = GenerateRnd(10) + 1 + currlevel;
@ -3142,8 +3142,8 @@ void MI_Arrow(int i)
mind = plr[p]._pIMinDam;
maxd = plr[p]._pIMaxDam;
} else {
mind = monster[p].mMinDamage;
maxd = monster[p].mMaxDamage;
mind = Monsters[p].mMinDamage;
maxd = Monsters[p].mMaxDamage;
}
} else {
mind = currlevel;
@ -3181,7 +3181,7 @@ void MI_Firebolt(int i)
break;
}
} else {
d = monster[p].mMinDamage + GenerateRnd(monster[p].mMaxDamage - monster[p].mMinDamage + 1);
d = Monsters[p].mMinDamage + GenerateRnd(Monsters[p].mMaxDamage - Monsters[p].mMinDamage + 1);
}
} else {
d = currlevel + GenerateRnd(2 * currlevel);
@ -3332,7 +3332,7 @@ static void FireballUpdate(int i, Displacement offset, bool alwaysDelete)
missile[i]._mirange--;
int id = missile[i]._misource;
Point p = (missile[i]._micaster == TARGET_MONSTERS) ? plr[id].position.tile : monster[id].position.tile;
Point p = (missile[i]._micaster == TARGET_MONSTERS) ? plr[id].position.tile : Monsters[id].position.tile;
if (missile[i]._miAnimType == MFILE_BIGEXP) {
if (missile[i]._mirange == 0) {
@ -3433,7 +3433,7 @@ void MI_Rune(int i)
Direction dir;
if (mid != 0) {
mid = (mid > 0) ? (mid - 1) : -(mid + 1);
dir = GetDirection(missile[i].position.tile, monster[mid].position.tile);
dir = GetDirection(missile[i].position.tile, Monsters[mid].position.tile);
} else {
pid = (pid > 0) ? (pid - 1) : -(pid + 1);
dir = GetDirection(missile[i].position.tile, plr[pid].position.tile);
@ -3521,8 +3521,8 @@ void MI_LightningArrow(int i)
if ((mx != missile[i]._miVar1 || my != missile[i]._miVar2) && mx > 0 && my > 0 && mx < MAXDUNX && my < MAXDUNY) {
if (missile[i]._misource != -1) {
if (missile[i]._micaster == TARGET_PLAYERS
&& monster[missile[i]._misource].MType->mtype >= MT_STORM
&& monster[missile[i]._misource].MType->mtype <= MT_MAEL) {
&& Monsters[missile[i]._misource].MType->mtype >= MT_STORM
&& Monsters[missile[i]._misource].MType->mtype <= MT_MAEL) {
AddMissile(
missile[i].position.tile,
missile[i].position.start,
@ -3774,7 +3774,7 @@ void MI_Lightctrl(int i)
if (missile[i]._micaster == TARGET_MONSTERS) {
dam = (GenerateRnd(2) + GenerateRnd(plr[id]._pLevel) + 2) << 6;
} else {
dam = 2 * (monster[id].mMinDamage + GenerateRnd(monster[id].mMaxDamage - monster[id].mMinDamage + 1));
dam = 2 * (Monsters[id].mMinDamage + GenerateRnd(Monsters[id].mMaxDamage - Monsters[id].mMinDamage + 1));
}
} else {
dam = GenerateRnd(currlevel) + 2 * currlevel;
@ -3800,8 +3800,8 @@ void MI_Lightctrl(int i)
&& InDungeonBounds({ mx, my })) {
if (id != -1) {
if (missile[i]._micaster == TARGET_PLAYERS
&& monster[id].MType->mtype >= MT_STORM
&& monster[id].MType->mtype <= MT_MAEL) {
&& Monsters[id].MType->mtype >= MT_STORM
&& Monsters[id].MType->mtype <= MT_MAEL) {
AddMissile(
missile[i].position.tile,
missile[i].position.start,
@ -4189,7 +4189,7 @@ void MI_Acidsplat(int i)
if (missile[i]._mirange == 0) {
missile[i]._miDelFlag = true;
int monst = missile[i]._misource;
int dam = (monster[monst].MData->mLevel >= 2 ? 2 : 1);
int dam = (Monsters[monst].MData->mLevel >= 2 ? 2 : 1);
AddMissile(missile[i].position.tile, { i, 0 }, missile[i]._mimfnum, MIS_ACIDPUD, TARGET_PLAYERS, monst, dam, missile[i]._mispllvl);
} else {
PutMissile(i);
@ -4229,24 +4229,24 @@ void MI_Stone(int i)
{
missile[i]._mirange--;
int m = missile[i]._miVar2;
if (monster[m]._mhitpoints == 0 && missile[i]._miAnimType != MFILE_SHATTER1) {
if (Monsters[m]._mhitpoints == 0 && missile[i]._miAnimType != MFILE_SHATTER1) {
missile[i]._mimfnum = 0;
missile[i]._miDrawFlag = true;
SetMissAnim(i, MFILE_SHATTER1);
missile[i]._mirange = 11;
}
if (monster[m]._mmode != MM_STONE) {
if (Monsters[m]._mmode != MM_STONE) {
missile[i]._miDelFlag = true;
return;
}
if (missile[i]._mirange == 0) {
missile[i]._miDelFlag = true;
if (monster[m]._mhitpoints > 0) {
monster[m]._mmode = (MON_MODE)missile[i]._miVar1;
monster[m].AnimInfo.IsPetrified = false;
if (Monsters[m]._mhitpoints > 0) {
Monsters[m]._mmode = (MON_MODE)missile[i]._miVar1;
Monsters[m].AnimInfo.IsPetrified = false;
} else {
AddDead(monster[m].position.tile, stonendx, monster[m]._mdir);
AddDead(Monsters[m].position.tile, stonendx, Monsters[m]._mdir);
}
}
if (missile[i]._miAnimType == MFILE_SHATTER1)
@ -4268,7 +4268,7 @@ void MI_Boom(int i)
void MI_Rhino(int i)
{
int monst = missile[i]._misource;
if (monster[monst]._mmode != MM_CHARGE) {
if (Monsters[monst]._mmode != MM_CHARGE) {
missile[i]._miDelFlag = true;
return;
}
@ -4276,7 +4276,7 @@ void MI_Rhino(int i)
Point prevPos = missile[i].position.tile;
Point newPosSnake;
dMonster[prevPos.x][prevPos.y] = 0;
if (monster[monst]._mAi == AI_SNAKE) {
if (Monsters[monst]._mAi == AI_SNAKE) {
missile[i].position.traveled += missile[i].position.velocity * 2;
UpdateMissilePos(i);
newPosSnake = missile[i].position.tile;
@ -4286,16 +4286,16 @@ void MI_Rhino(int i)
}
UpdateMissilePos(i);
Point newPos = missile[i].position.tile;
if (!PosOkMonst(monst, newPos) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, newPosSnake))) {
if (!PosOkMonst(monst, newPos) || (Monsters[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, newPosSnake))) {
MissToMonst(i, prevPos);
missile[i]._miDelFlag = true;
return;
}
monster[monst].position.future = newPos;
monster[monst].position.old = newPos;
monster[monst].position.tile = newPos;
Monsters[monst].position.future = newPos;
Monsters[monst].position.old = newPos;
Monsters[monst].position.tile = newPos;
dMonster[newPos.x][newPos.y] = -(monst + 1);
if (monster[monst]._uniqtype != 0)
if (Monsters[monst]._uniqtype != 0)
ChangeLightXY(missile[i]._mlid, newPos);
MoveMissilePos(i);
PutMissile(i);
@ -4309,14 +4309,14 @@ void MI_Fireman(int i)
UpdateMissilePos(i);
int src = missile[i]._misource;
Point b = missile[i].position.tile;
int enemy = monster[src]._menemy;
Point c = (monster[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0 ? plr[enemy].position.tile : monster[enemy].position.tile;
int enemy = Monsters[src]._menemy;
Point c = (Monsters[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0 ? plr[enemy].position.tile : Monsters[enemy].position.tile;
int j = 0;
if (b != a && (((missile[i]._miVar1 & 1) != 0 && a.WalkingDistance(c) >= 4) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, a)) {
MissToMonst(i, a);
missile[i]._miDelFlag = true;
} else if ((monster[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0) {
} else if ((Monsters[src]._mFlags & MFLAG_TARGETS_MONSTER) == 0) {
j = dPlayer[b.x][b.y];
} else {
j = dMonster[b.x][b.y];
@ -4324,7 +4324,7 @@ void MI_Fireman(int i)
if (!PosOkMissile(0, b) || (j > 0 && (missile[i]._miVar1 & 1) == 0)) {
missile[i].position.velocity *= -1;
missile[i]._mimfnum = opposite[missile[i]._mimfnum];
missile[i]._miAnimData = monster[src].MType->Anims[MA_WALK].CelSpritesForDirections[missile[i]._mimfnum]->Data();
missile[i]._miAnimData = Monsters[src].MType->Anims[MA_WALK].CelSpritesForDirections[missile[i]._mimfnum]->Data();
missile[i]._miVar2++;
if (j > 0)
missile[i]._miVar1 |= 1;
@ -4673,9 +4673,9 @@ void MI_Element(int i)
missile[i]._mirange = 255;
int mid = FindClosest(c, 19);
if (mid > 0) {
Direction sd = GetDirection(c, monster[mid].position.tile);
Direction sd = GetDirection(c, Monsters[mid].position.tile);
SetMissDir(i, sd);
UpdateMissileVel(i, c, monster[mid].position.tile, 16);
UpdateMissileVel(i, c, Monsters[mid].position.tile, 16);
} else {
Direction sd = plr[id]._pdir;
SetMissDir(i, sd);
@ -4720,9 +4720,9 @@ void MI_Bonespirit(int i)
missile[i]._mirange = 255;
int mid = FindClosest(c, 19);
if (mid > 0) {
missile[i]._midam = monster[mid]._mhitpoints >> 7;
SetMissDir(i, GetDirection(c, monster[mid].position.tile));
UpdateMissileVel(i, c, monster[mid].position.tile, 16);
missile[i]._midam = Monsters[mid]._mhitpoints >> 7;
SetMissDir(i, GetDirection(c, Monsters[mid].position.tile));
UpdateMissileVel(i, c, Monsters[mid].position.tile, 16);
} else {
Direction sd = plr[id]._pdir;
SetMissDir(i, sd);
@ -4827,7 +4827,7 @@ void missiles_process_charge()
if (mis->_mitype != MIS_RHINO)
continue;
CMonster *mon = monster[mis->_misource].MType;
CMonster *mon = Monsters[mis->_misource].MType;
AnimStruct *anim;
if (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) {

1588
Source/monster.cpp

File diff suppressed because it is too large Load Diff

12
Source/monster.h

@ -210,13 +210,13 @@ struct MonsterStruct { // note: missing field _mAFNum
bool IsWalking() const;
};
extern int monstkills[MAXMONSTERS];
extern int monstactive[MAXMONSTERS];
extern int nummonsters;
extern CMonster LevelMonsterTypes[MAX_LVLMTYPES];
extern int LevelMonsterTypeCount;
extern MonsterStruct Monsters[MAXMONSTERS];
extern int ActiveMonsters[MAXMONSTERS];
extern int ActiveMonsterCount;
extern int MonsterKillCounts[MAXMONSTERS];
extern bool sgbSaveSoundOn;
extern MonsterStruct monster[MAXMONSTERS];
extern CMonster Monsters[MAX_LVLMTYPES];
extern int nummtypes;
void InitLevelMonsters();
void GetLevelMTypes();

66
Source/msg.cpp

@ -385,18 +385,18 @@ void DeltaLeaveSync(BYTE bLevel)
if (currlevel <= 0)
return;
for (int i = 0; i < nummonsters; i++) {
int ma = monstactive[i];
if (monster[ma]._mhitpoints == 0)
for (int i = 0; i < ActiveMonsterCount; i++) {
int ma = ActiveMonsters[i];
if (Monsters[ma]._mhitpoints == 0)
continue;
sgbDeltaChanged = true;
DMonsterStr *pD = &sgLevels[bLevel].monster[ma];
pD->_mx = monster[ma].position.tile.x;
pD->_my = monster[ma].position.tile.y;
pD->_mdir = monster[ma]._mdir;
pD->_mx = Monsters[ma].position.tile.x;
pD->_my = Monsters[ma].position.tile.y;
pD->_mdir = Monsters[ma]._mdir;
pD->_menemy = encode_enemy(ma);
pD->_mhitpoints = monster[ma]._mhitpoints;
pD->_mactive = monster[ma]._msquelch;
pD->_mhitpoints = Monsters[ma]._mhitpoints;
pD->_mactive = Monsters[ma]._msquelch;
}
memcpy(&sgLocals[bLevel].automapsv, AutomapView, sizeof(AutomapView));
}
@ -1051,8 +1051,8 @@ DWORD OnAttackMonster(TCmd *pCmd, int pnum)
auto *p = (TCmdParam1 *)pCmd;
if (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {
if (plr[pnum].position.tile.WalkingDistance(monster[p->wParam1].position.future) > 1)
MakePlrPath(pnum, monster[p->wParam1].position.future, false);
if (plr[pnum].position.tile.WalkingDistance(Monsters[p->wParam1].position.future) > 1)
MakePlrPath(pnum, Monsters[p->wParam1].position.future, false);
plr[pnum].destAction = ACTION_ATTACKMON;
plr[pnum].destParam1 = p->wParam1;
}
@ -1325,12 +1325,12 @@ DWORD OnMonstDamage(TCmd *pCmd, int pnum)
SendPacket(pnum, p, sizeof(*p)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire (fixed)
else if (pnum != myplr) {
if (currlevel == plr[pnum].plrlevel) {
monster[p->wMon].mWhoHit |= 1 << pnum;
if (monster[p->wMon]._mhitpoints > 0) {
monster[p->wMon]._mhitpoints -= p->dwDam;
if ((monster[p->wMon]._mhitpoints >> 6) < 1)
monster[p->wMon]._mhitpoints = 1 << 6;
delta_monster_hp(p->wMon, monster[p->wMon]._mhitpoints, plr[pnum].plrlevel);
Monsters[p->wMon].mWhoHit |= 1 << pnum;
if (Monsters[p->wMon]._mhitpoints > 0) {
Monsters[p->wMon]._mhitpoints -= p->dwDam;
if ((Monsters[p->wMon]._mhitpoints >> 6) < 1)
Monsters[p->wMon]._mhitpoints = 1 << 6;
delta_monster_hp(p->wMon, Monsters[p->wMon]._mhitpoints, plr[pnum].plrlevel);
}
}
}
@ -1901,7 +1901,7 @@ void delta_kill_monster(int mi, Point position, BYTE bLevel)
DMonsterStr *pD = &sgLevels[bLevel].monster[mi];
pD->_mx = position.x;
pD->_my = position.y;
pD->_mdir = monster[mi]._mdir;
pD->_mdir = Monsters[mi]._mdir;
pD->_mhitpoints = 0;
}
@ -2011,39 +2011,39 @@ void DeltaLoadLevel()
deltaload = true;
if (currlevel != 0) {
for (int i = 0; i < nummonsters; i++) {
for (int i = 0; i < ActiveMonsterCount; i++) {
if (sgLevels[currlevel].monster[i]._mx != 0xFF) {
M_ClearSquares(i);
int x = sgLevels[currlevel].monster[i]._mx;
int y = sgLevels[currlevel].monster[i]._my;
monster[i].position.tile = { x, y };
monster[i].position.old = { x, y };
monster[i].position.future = { x, y };
Monsters[i].position.tile = { x, y };
Monsters[i].position.old = { x, y };
Monsters[i].position.future = { x, y };
if (sgLevels[currlevel].monster[i]._mhitpoints != -1)
monster[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints;
Monsters[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints;
if (sgLevels[currlevel].monster[i]._mhitpoints == 0) {
M_ClearSquares(i);
if (monster[i]._mAi != AI_DIABLO) {
if (monster[i]._uniqtype == 0) {
assert(monster[i].MType != nullptr);
AddDead(monster[i].position.tile, monster[i].MType->mdeadval, monster[i]._mdir);
if (Monsters[i]._mAi != AI_DIABLO) {
if (Monsters[i]._uniqtype == 0) {
assert(Monsters[i].MType != nullptr);
AddDead(Monsters[i].position.tile, Monsters[i].MType->mdeadval, Monsters[i]._mdir);
} else {
AddDead(monster[i].position.tile, monster[i]._udeadval, monster[i]._mdir);
AddDead(Monsters[i].position.tile, Monsters[i]._udeadval, Monsters[i]._mdir);
}
}
monster[i]._mDelFlag = true;
Monsters[i]._mDelFlag = true;
M_UpdateLeader(i);
} else {
decode_enemy(i, sgLevels[currlevel].monster[i]._menemy);
if (monster[i].position.tile != Point { 0, 0 } && monster[i].position.tile != Point { 1, 0 })
dMonster[monster[i].position.tile.x][monster[i].position.tile.y] = i + 1;
if (Monsters[i].position.tile != Point { 0, 0 } && Monsters[i].position.tile != Point { 1, 0 })
dMonster[Monsters[i].position.tile.x][Monsters[i].position.tile.y] = i + 1;
if (i < MAX_PLRS) {
MAI_Golum(i);
monster[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM);
Monsters[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM);
} else {
M_StartStand(i, monster[i]._mdir);
M_StartStand(i, Monsters[i]._mdir);
}
monster[i]._msquelch = sgLevels[currlevel].monster[i]._mactive;
Monsters[i]._msquelch = sgLevels[currlevel].monster[i]._mactive;
}
}
}

2
Source/multi.cpp

@ -143,7 +143,7 @@ void MonsterSeeds()
sgdwGameLoops++;
uint32_t l = (sgdwGameLoops >> 8) | (sgdwGameLoops << 24); // _rotr(sgdwGameLoops, 8)
for (int i = 0; i < MAXMONSTERS; i++)
monster[i]._mAISeed = l + i;
Monsters[i]._mAISeed = l + i;
}
void HandleTurnUpperBit(int pnum)

20
Source/objects.cpp

@ -2700,8 +2700,8 @@ void OperateL3LDoor(int pnum, int oi, bool sendflag)
void MonstCheckDoors(int m)
{
int mx = monster[m].position.tile.x;
int my = monster[m].position.tile.y;
int mx = Monsters[m].position.tile.x;
int my = Monsters[m].position.tile.y;
if (dObject[mx - 1][my - 1] != 0
|| dObject[mx][my - 1] != 0
|| dObject[mx + 1][my - 1] != 0
@ -4388,14 +4388,14 @@ void OperateBookCase(int pnum, int i, bool sendmsg)
SetRndSeed(object[i]._oRndSeed);
CreateTypeItem(object[i].position, false, ITYPE_MISC, IMISC_BOOK, sendmsg, false);
if (QuestStatus(Q_ZHAR)
&& monster[MAX_PLRS]._mmode == MM_STAND // prevents playing the "angry" message for the second time if zhar got aggroed by losing vision and talking again
&& monster[MAX_PLRS]._uniqtype - 1 == UMT_ZHAR
&& monster[MAX_PLRS]._msquelch == UINT8_MAX
&& monster[MAX_PLRS]._mhitpoints > 0) {
monster[MAX_PLRS].mtalkmsg = TEXT_ZHAR2;
M_StartStand(0, monster[MAX_PLRS]._mdir); // BUGFIX: first parameter in call to M_StartStand should be MAX_PLRS, not 0.
monster[MAX_PLRS]._mgoal = MGOAL_ATTACK2;
monster[MAX_PLRS]._mmode = MM_TALK;
&& Monsters[MAX_PLRS]._mmode == MM_STAND // prevents playing the "angry" message for the second time if zhar got aggroed by losing vision and talking again
&& Monsters[MAX_PLRS]._uniqtype - 1 == UMT_ZHAR
&& Monsters[MAX_PLRS]._msquelch == UINT8_MAX
&& Monsters[MAX_PLRS]._mhitpoints > 0) {
Monsters[MAX_PLRS].mtalkmsg = TEXT_ZHAR2;
M_StartStand(0, Monsters[MAX_PLRS]._mdir); // BUGFIX: first parameter in call to M_StartStand should be MAX_PLRS, not 0.
Monsters[MAX_PLRS]._mgoal = MGOAL_ATTACK2;
Monsters[MAX_PLRS]._mmode = MM_TALK;
}
if (pnum == myplr)
NetSendCmdParam1(false, CMD_OPERATEOBJ, i);

94
Source/player.cpp

@ -1938,20 +1938,20 @@ void SyncPlrKill(int pnum, int earflag)
void RemovePlrMissiles(int pnum)
{
if (currlevel != 0 && pnum == myplr && (monster[myplr].position.tile.x != 1 || monster[myplr].position.tile.y != 0)) {
if (currlevel != 0 && pnum == myplr && (Monsters[myplr].position.tile.x != 1 || Monsters[myplr].position.tile.y != 0)) {
M_StartKill(myplr, myplr);
AddDead(monster[myplr].position.tile, (monster[myplr].MType)->mdeadval, monster[myplr]._mdir);
int mx = monster[myplr].position.tile.x;
int my = monster[myplr].position.tile.y;
AddDead(Monsters[myplr].position.tile, (Monsters[myplr].MType)->mdeadval, Monsters[myplr]._mdir);
int mx = Monsters[myplr].position.tile.x;
int my = Monsters[myplr].position.tile.y;
dMonster[mx][my] = 0;
monster[myplr]._mDelFlag = true;
Monsters[myplr]._mDelFlag = true;
DeleteMonsterList();
}
for (int i = 0; i < nummissiles; i++) {
int am = missileactive[i];
if (missile[am]._mitype == MIS_STONE && missile[am]._misource == pnum) {
monster[missile[am]._miVar2]._mmode = (MON_MODE)missile[am]._miVar1;
Monsters[missile[am]._miVar2]._mmode = (MON_MODE)missile[am]._miVar1;
}
if (missile[am]._mitype == MIS_MANASHIELD && missile[am]._misource == pnum) {
ClearMissileSpot(am);
@ -2260,15 +2260,15 @@ bool PlrHitMonst(int pnum, int m)
}
auto &player = plr[pnum];
if ((monster[m]._mhitpoints >> 6) <= 0) {
if ((Monsters[m]._mhitpoints >> 6) <= 0) {
return false;
}
if (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT) {
if (Monsters[m].MType->mtype == MT_ILLWEAV && Monsters[m]._mgoal == MGOAL_RETREAT) {
return false;
}
if (monster[m]._mmode == MM_CHARGE) {
if (Monsters[m]._mmode == MM_CHARGE) {
return false;
}
@ -2286,11 +2286,11 @@ bool PlrHitMonst(int pnum, int m)
}
int hit = GenerateRnd(100);
if (monster[m]._mmode == MM_STONE) {
if (Monsters[m]._mmode == MM_STONE) {
hit = 0;
}
int tmac = monster[m].mArmorClass;
int tmac = Monsters[m].mArmorClass;
if (gbIsHellfire && player._pIEnAc > 0) {
int pIEnAc = player._pIEnAc - 1;
if (pIEnAc > 0)
@ -2299,7 +2299,7 @@ bool PlrHitMonst(int pnum, int m)
tmac -= tmac / 4;
if (player._pClass == HeroClass::Barbarian) {
tmac -= monster[m].mArmorClass / 8;
tmac -= Monsters[m].mArmorClass / 8;
}
if (tmac < 0)
@ -2356,7 +2356,7 @@ bool PlrHitMonst(int pnum, int m)
phanditype = ITYPE_MACE;
}
switch (monster[m].MData->mMonstClass) {
switch (Monsters[m].MData->mMonstClass) {
case MC_UNDEAD:
if (phanditype == ITYPE_SWORD) {
dam -= dam / 2;
@ -2382,8 +2382,8 @@ bool PlrHitMonst(int pnum, int m)
dam *= 3;
}
if ((player.pDamAcFlags & ISPLHF_DOPPELGANGER) != 0 && monster[m].MType->mtype != MT_DIABLO && monster[m]._uniqtype == 0 && GenerateRnd(100) < 10) {
AddDoppelganger(monster[m]);
if ((player.pDamAcFlags & ISPLHF_DOPPELGANGER) != 0 && Monsters[m].MType->mtype != MT_DIABLO && Monsters[m]._uniqtype == 0 && GenerateRnd(100) < 10) {
AddDoppelganger(Monsters[m]);
}
dam <<= 6;
@ -2405,7 +2405,7 @@ bool PlrHitMonst(int pnum, int m)
}
dam *= 2;
}
monster[m]._mhitpoints -= dam;
Monsters[m]._mhitpoints -= dam;
}
int skdam = 0;
@ -2456,24 +2456,24 @@ bool PlrHitMonst(int pnum, int m)
drawhpflag = true;
}
if ((player._pIFlags & ISPL_NOHEALPLR) != 0) {
monster[m]._mFlags |= MFLAG_NOHEAL;
Monsters[m]._mFlags |= MFLAG_NOHEAL;
}
#ifdef _DEBUG
if (debug_mode_dollar_sign || debug_mode_key_inverted_v) {
monster[m]._mhitpoints = 0; /* double check */
Monsters[m]._mhitpoints = 0; /* double check */
}
#endif
if ((monster[m]._mhitpoints >> 6) <= 0) {
if (monster[m]._mmode == MM_STONE) {
if ((Monsters[m]._mhitpoints >> 6) <= 0) {
if (Monsters[m]._mmode == MM_STONE) {
M_StartKill(m, pnum);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
M_StartKill(m, pnum);
}
} else {
if (monster[m]._mmode == MM_STONE) {
if (Monsters[m]._mmode == MM_STONE) {
M_StartHit(m, pnum, dam);
monster[m].Petrify();
Monsters[m].Petrify();
} else {
if ((player._pIFlags & ISPL_KNOCKBACK) != 0) {
M_GetKnockback(m);
@ -2666,7 +2666,7 @@ bool PM_DoAttack(int pnum)
dx = position.x;
dy = position.y;
int m = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1;
if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m].position.old.x == dx && monster[m].position.old.y == dy) {
if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && Monsters[m].position.old.x == dx && Monsters[m].position.old.y == dy) {
if (PlrHitMonst(-pnum, m))
didhit = true;
}
@ -2674,7 +2674,7 @@ bool PM_DoAttack(int pnum)
dx = position.x;
dy = position.y;
m = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1;
if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m].position.old.x == dx && monster[m].position.old.y == dy) {
if (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && Monsters[m].position.old.x == dx && Monsters[m].position.old.y == dy) {
if (PlrHitMonst(-pnum, m))
didhit = true;
}
@ -2966,7 +2966,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
int i = -1;
if (player.destAction == ACTION_ATTACKMON) {
i = player.destParam1;
MakePlrPath(pnum, monster[i].position.future, false);
MakePlrPath(pnum, Monsters[i].position.future, false);
}
if (player.destAction == ACTION_ATTACKPLR) {
@ -2981,9 +2981,9 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
if (player.destAction == ACTION_ATTACKMON || player.destAction == ACTION_ATTACKPLR) {
if (player.destAction == ACTION_ATTACKMON) {
x = abs(player.position.future.x - monster[i].position.future.x);
y = abs(player.position.future.y - monster[i].position.future.y);
d = GetDirection(player.position.future, monster[i].position.future);
x = abs(player.position.future.x - Monsters[i].position.future.x);
y = abs(player.position.future.y - Monsters[i].position.future.y);
d = GetDirection(player.position.future, Monsters[i].position.future);
} else {
auto &target = plr[player.destParam1];
x = abs(player.position.future.x - target.position.future.x);
@ -2993,7 +2993,7 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
if (x < 2 && y < 2) {
ClrPlrPath(player);
if (player.destAction == ACTION_ATTACKMON && monster[i].mtalkmsg != TEXT_NONE && monster[i].mtalkmsg != TEXT_VILE14) {
if (player.destAction == ACTION_ATTACKMON && Monsters[i].mtalkmsg != TEXT_NONE && Monsters[i].mtalkmsg != TEXT_VILE14) {
TalktoMonster(i);
} else {
StartAttack(pnum, d);
@ -3064,11 +3064,11 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
StartAttack(pnum, d);
break;
case ACTION_ATTACKMON:
x = abs(player.position.tile.x - monster[i].position.future.x);
y = abs(player.position.tile.y - monster[i].position.future.y);
x = abs(player.position.tile.x - Monsters[i].position.future.x);
y = abs(player.position.tile.y - Monsters[i].position.future.y);
if (x <= 1 && y <= 1) {
d = GetDirection(player.position.future, monster[i].position.future);
if (monster[i].mtalkmsg != TEXT_NONE && monster[i].mtalkmsg != TEXT_VILE14) {
d = GetDirection(player.position.future, Monsters[i].position.future);
if (Monsters[i].mtalkmsg != TEXT_NONE && Monsters[i].mtalkmsg != TEXT_VILE14) {
TalktoMonster(i);
} else {
StartAttack(pnum, d);
@ -3090,11 +3090,11 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
break;
case ACTION_RATTACKMON:
i = player.destParam1;
d = GetDirection(player.position.future, monster[i].position.future);
if (monster[i].mtalkmsg != TEXT_NONE && monster[i].mtalkmsg != TEXT_VILE14) {
d = GetDirection(player.position.future, Monsters[i].position.future);
if (Monsters[i].mtalkmsg != TEXT_NONE && Monsters[i].mtalkmsg != TEXT_VILE14) {
TalktoMonster(i);
} else {
StartRangeAttack(pnum, d, monster[i].position.future.x, monster[i].position.future.y);
StartRangeAttack(pnum, d, Monsters[i].position.future.x, Monsters[i].position.future.y);
}
break;
case ACTION_RATTACKPLR: {
@ -3115,8 +3115,8 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
break;
case ACTION_SPELLMON:
i = player.destParam1;
d = GetDirection(player.position.tile, monster[i].position.future);
StartSpell(pnum, d, monster[i].position.future.x, monster[i].position.future.y);
d = GetDirection(player.position.tile, Monsters[i].position.future);
StartSpell(pnum, d, Monsters[i].position.future.x, Monsters[i].position.future.y);
player._pVar4 = player.destParam2;
break;
case ACTION_SPELLPLR: {
@ -3208,10 +3208,10 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
player.destAction = ACTION_NONE;
} else if (player.destAction == ACTION_ATTACKMON) {
i = player.destParam1;
x = abs(player.position.tile.x - monster[i].position.future.x);
y = abs(player.position.tile.y - monster[i].position.future.y);
x = abs(player.position.tile.x - Monsters[i].position.future.x);
y = abs(player.position.tile.y - Monsters[i].position.future.y);
if (x <= 1 && y <= 1) {
d = GetDirection(player.position.future, monster[i].position.future);
d = GetDirection(player.position.future, Monsters[i].position.future);
StartAttack(pnum, d);
}
player.destAction = ACTION_NONE;
@ -3247,8 +3247,8 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
player.destAction = ACTION_NONE;
} else if (player.destAction == ACTION_RATTACKMON) {
i = player.destParam1;
d = GetDirection(player.position.tile, monster[i].position.future);
StartRangeAttack(pnum, d, monster[i].position.future.x, monster[i].position.future.y);
d = GetDirection(player.position.tile, Monsters[i].position.future);
StartRangeAttack(pnum, d, Monsters[i].position.future.x, Monsters[i].position.future.y);
player.destAction = ACTION_NONE;
} else if (player.destAction == ACTION_RATTACKPLR) {
auto &target = plr[player.destParam1];
@ -3266,8 +3266,8 @@ void CheckNewPath(int pnum, bool pmWillBeCalled)
player.destAction = ACTION_NONE;
} else if (player.destAction == ACTION_SPELLMON) {
i = player.destParam1;
d = GetDirection(player.position.tile, monster[i].position.future);
StartSpell(pnum, d, monster[i].position.future.x, monster[i].position.future.y);
d = GetDirection(player.position.tile, Monsters[i].position.future);
StartSpell(pnum, d, Monsters[i].position.future.x, Monsters[i].position.future.y);
player.destAction = ACTION_NONE;
} else if (player.destAction == ACTION_SPELLPLR) {
auto &target = plr[player.destParam1];
@ -3516,7 +3516,7 @@ bool PosOkPlayer(int pnum, Point position)
if (dMonster[position.x][position.y] <= 0) {
return false;
}
if ((monster[dMonster[position.x][position.y] - 1]._mhitpoints >> 6) > 0) {
if ((Monsters[dMonster[position.x][position.y] - 1]._mhitpoints >> 6) > 0) {
return false;
}
}

4
Source/qol/monhealthbar.cpp

@ -59,7 +59,7 @@ void DrawMonsterHealthBar(const Surface &out)
if (pcursmonst == -1)
return;
const MonsterStruct &mon = monster[pcursmonst];
const MonsterStruct &mon = Monsters[pcursmonst];
const int width = healthBox.w();
const int height = healthBox.h();
@ -104,7 +104,7 @@ void DrawMonsterHealthBar(const Surface &out)
style = UIS_BLUE;
DrawString(out, mon.mName, { { xPos, barLabelY }, { width, height } }, UIS_CENTER | style);
if (mon._uniqtype != 0 || monstkills[mon.MType->mtype] >= 15) {
if (mon._uniqtype != 0 || MonsterKillCounts[mon.MType->mtype] >= 15) {
monster_resistance immunes[] = { IMMUNE_MAGIC, IMMUNE_FIRE, IMMUNE_LIGHTNING };
monster_resistance resists[] = { RESIST_MAGIC, RESIST_FIRE, RESIST_LIGHTNING };

16
Source/quests.cpp

@ -236,7 +236,7 @@ void CheckQuests()
if (setlvlnum == quests[Q_PWATER]._qslvl
&& quests[Q_PWATER]._qactive != QUEST_INIT
&& leveltype == quests[Q_PWATER]._qlvltype
&& nummonsters == 4
&& ActiveMonsterCount == 4
&& quests[Q_PWATER]._qactive != QUEST_DONE) {
quests[Q_PWATER]._qactive = QUEST_DONE;
PlaySfxLoc(IS_QUESTDN, plr[myplr].position.tile);
@ -306,24 +306,24 @@ void CheckQuestKill(int m, bool sendmsg)
if (gbIsSpawn)
return;
if (monster[m].MType->mtype == MT_SKING) {
if (Monsters[m].MType->mtype == MT_SKING) {
quests[Q_SKELKING]._qactive = QUEST_DONE;
plr[myplr].Say(HeroSpeech::RestWellLeoricIllFindYourSon, 30);
if (sendmsg)
NetSendCmdQuest(true, Q_SKELKING);
} else if (monster[m].MType->mtype == MT_CLEAVER) {
} else if (Monsters[m].MType->mtype == MT_CLEAVER) {
quests[Q_BUTCHER]._qactive = QUEST_DONE;
plr[myplr].Say(HeroSpeech::TheSpiritsOfTheDeadAreNowAvenged, 30);
if (sendmsg)
NetSendCmdQuest(true, Q_BUTCHER);
} else if (monster[m]._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak"
} else if (Monsters[m]._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak"
quests[Q_GARBUD]._qactive = QUEST_DONE;
plr[myplr].Say(HeroSpeech::ImNotImpressed, 30);
} else if (monster[m]._uniqtype - 1 == UMT_ZHAR) { //"Zhar the Mad"
} else if (Monsters[m]._uniqtype - 1 == UMT_ZHAR) { //"Zhar the Mad"
quests[Q_ZHAR]._qactive = QUEST_DONE;
plr[myplr].Say(HeroSpeech::ImSorryDidIBreakYourConcentration, 30);
} else if (monster[m]._uniqtype - 1 == UMT_LAZURUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus"
} else if (Monsters[m]._uniqtype - 1 == UMT_LAZURUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus"
quests[Q_BETRAYER]._qactive = QUEST_DONE;
quests[Q_BETRAYER]._qvar1 = 7;
quests[Q_DIABLO]._qactive = QUEST_ACTIVE;
@ -342,7 +342,7 @@ void CheckQuestKill(int m, bool sendmsg)
NetSendCmdQuest(true, Q_BETRAYER);
NetSendCmdQuest(true, Q_DIABLO);
}
} else if (monster[m]._uniqtype - 1 == UMT_LAZURUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus"
} else if (Monsters[m]._uniqtype - 1 == UMT_LAZURUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus"
quests[Q_BETRAYER]._qactive = QUEST_DONE;
InitVPTriggers();
quests[Q_BETRAYER]._qvar1 = 7;
@ -350,7 +350,7 @@ void CheckQuestKill(int m, bool sendmsg)
quests[Q_DIABLO]._qactive = QUEST_ACTIVE;
AddMissile({ 35, 32 }, { 35, 32 }, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0);
plr[myplr].Say(HeroSpeech::YourMadnessEndsHereBetrayer, 30);
} else if (monster[m]._uniqtype - 1 == UMT_WARLORD) { //"Warlord of Blood"
} else if (Monsters[m]._uniqtype - 1 == UMT_WARLORD) { //"Warlord of Blood"
quests[Q_WARLORD]._qactive = QUEST_DONE;
plr[myplr].Say(HeroSpeech::YourReignOfPainHasEnded, 30);
}

26
Source/scrollrt.cpp

@ -424,29 +424,29 @@ static void DrawMonster(const Surface &out, int x, int y, int mx, int my, int m)
return;
}
if (monster[m].AnimInfo.pCelSprite == nullptr) {
Log("Draw Monster \"{}\": NULL Cel Buffer", monster[m].mName);
if (Monsters[m].AnimInfo.pCelSprite == nullptr) {
Log("Draw Monster \"{}\": NULL Cel Buffer", Monsters[m].mName);
return;
}
int nCel = monster[m].AnimInfo.GetFrameToUseForRendering();
const auto *frameTable = reinterpret_cast<const uint32_t *>(monster[m].AnimInfo.pCelSprite->Data());
int nCel = Monsters[m].AnimInfo.GetFrameToUseForRendering();
const auto *frameTable = reinterpret_cast<const uint32_t *>(Monsters[m].AnimInfo.pCelSprite->Data());
int frames = SDL_SwapLE32(frameTable[0]);
if (nCel < 1 || frames > 50 || nCel > frames) {
const char *szMode = "unknown action";
if (monster[m]._mmode <= 17)
szMode = MonsterModeNames[monster[m]._mmode];
if (Monsters[m]._mmode <= 17)
szMode = MonsterModeNames[Monsters[m]._mmode];
Log(
"Draw Monster \"{}\" {}: facing {}, frame {} of {}",
monster[m].mName,
Monsters[m].mName,
szMode,
monster[m]._mdir,
Monsters[m]._mdir,
nCel,
frames);
return;
}
CelSprite &cel = *monster[m].AnimInfo.pCelSprite;
CelSprite &cel = *Monsters[m].AnimInfo.pCelSprite;
if ((dFlags[x][y] & BFLAG_LIT) == 0) {
Cl2DrawLightTbl(out, mx, my, cel, nCel, 1);
@ -454,9 +454,9 @@ static void DrawMonster(const Surface &out, int x, int y, int mx, int my, int m)
}
char trans = 0;
if (monster[m]._uniqtype != 0)
trans = monster[m]._uniqtrans + 4;
if (monster[m]._mmode == MM_STONE)
if (Monsters[m]._uniqtype != 0)
trans = Monsters[m]._uniqtrans + 4;
if (Monsters[m]._mmode == MM_STONE)
trans = 2;
if (plr[myplr]._pInfraFlag && light_table_index > 8)
trans = 1;
@ -792,7 +792,7 @@ static void DrawMonsterHelper(const Surface &out, int x, int y, int oy, int sx,
return;
}
MonsterStruct *pMonster = &monster[mi];
MonsterStruct *pMonster = &Monsters[mi];
if ((pMonster->_mFlags & MFLAG_HIDDEN) != 0) {
return;
}

56
Source/sync.cpp

@ -21,10 +21,10 @@ int sgnSyncPInv;
void SyncOneMonster()
{
for (int i = 0; i < nummonsters; i++) {
int m = monstactive[i];
sgnMonsterPriority[m] = plr[myplr].position.tile.ManhattanDistance(monster[m].position.tile);
if (monster[m]._msquelch == 0) {
for (int i = 0; i < ActiveMonsterCount; i++) {
int m = ActiveMonsters[i];
sgnMonsterPriority[m] = plr[myplr].position.tile.ManhattanDistance(Monsters[m].position.tile);
if (Monsters[m]._msquelch == 0) {
sgnMonsterPriority[m] += 0x1000;
} else if (sgwLRU[m] != 0) {
sgwLRU[m]--;
@ -35,13 +35,13 @@ void SyncOneMonster()
void SyncMonsterPos(TSyncMonster *p, int ndx)
{
p->_mndx = ndx;
p->_mx = monster[ndx].position.tile.x;
p->_my = monster[ndx].position.tile.y;
p->_mx = Monsters[ndx].position.tile.x;
p->_my = Monsters[ndx].position.tile.y;
p->_menemy = encode_enemy(ndx);
p->_mdelta = sgnMonsterPriority[ndx] > 255 ? 255 : sgnMonsterPriority[ndx];
sgnMonsterPriority[ndx] = 0xFFFF;
sgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE;
sgwLRU[ndx] = Monsters[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE;
}
bool SyncMonsterActive(TSyncMonster *p)
@ -49,11 +49,11 @@ bool SyncMonsterActive(TSyncMonster *p)
int ndx = -1;
uint32_t lru = 0xFFFFFFFF;
for (int i = 0; i < nummonsters; i++) {
int m = monstactive[i];
for (int i = 0; i < ActiveMonsterCount; i++) {
int m = ActiveMonsters[i];
if (sgnMonsterPriority[m] < lru && sgwLRU[m] < 0xFFFE) {
lru = sgnMonsterPriority[m];
ndx = monstactive[i];
ndx = ActiveMonsters[i];
}
}
@ -70,14 +70,14 @@ bool SyncMonsterActive2(TSyncMonster *p)
int ndx = -1;
uint32_t lru = 0xFFFE;
for (int i = 0; i < nummonsters; i++) {
if (sgnMonsters >= nummonsters) {
for (int i = 0; i < ActiveMonsterCount; i++) {
if (sgnMonsters >= ActiveMonsterCount) {
sgnMonsters = 0;
}
int m = monstactive[sgnMonsters];
int m = ActiveMonsters[sgnMonsters];
if (sgwLRU[m] < lru) {
lru = sgwLRU[m];
ndx = monstactive[sgnMonsters];
ndx = ActiveMonsters[sgnMonsters];
}
sgnMonsters++;
}
@ -152,7 +152,7 @@ void SyncPlrInv(TSyncHeader *pHdr)
uint32_t sync_all_monsters(const byte *pbBuf, uint32_t dwMaxLen)
{
if (nummonsters < 1) {
if (ActiveMonsterCount < 1) {
return dwMaxLen;
}
if (dwMaxLen < sizeof(TSyncHeader) + sizeof(TSyncMonster)) {
@ -170,7 +170,7 @@ uint32_t sync_all_monsters(const byte *pbBuf, uint32_t dwMaxLen)
assert(dwMaxLen <= 0xffff);
SyncOneMonster();
for (int i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) {
for (int i = 0; i < ActiveMonsterCount && dwMaxLen >= sizeof(TSyncMonster); i++) {
bool sync = false;
if (i < 2) {
sync = SyncMonsterActive2((TSyncMonster *)pbBuf);
@ -193,11 +193,11 @@ static void SyncMonster(int pnum, const TSyncMonster *p)
{
int ndx = p->_mndx;
if (monster[ndx]._mhitpoints <= 0) {
if (Monsters[ndx]._mhitpoints <= 0) {
return;
}
uint32_t delta = plr[myplr].position.tile.ManhattanDistance(monster[ndx].position.tile);
uint32_t delta = plr[myplr].position.tile.ManhattanDistance(Monsters[ndx].position.tile);
if (delta > 255) {
delta = 255;
}
@ -205,31 +205,31 @@ static void SyncMonster(int pnum, const TSyncMonster *p)
if (delta < p->_mdelta || (delta == p->_mdelta && pnum > myplr)) {
return;
}
if (monster[ndx].position.future.x == p->_mx && monster[ndx].position.future.y == p->_my) {
if (Monsters[ndx].position.future.x == p->_mx && Monsters[ndx].position.future.y == p->_my) {
return;
}
if (monster[ndx]._mmode == MM_CHARGE || monster[ndx]._mmode == MM_STONE) {
if (Monsters[ndx]._mmode == MM_CHARGE || Monsters[ndx]._mmode == MM_STONE) {
return;
}
if (monster[ndx].position.tile.WalkingDistance({ p->_mx, p->_my }) <= 2) {
if (monster[ndx]._mmode < MM_WALK || monster[ndx]._mmode > MM_WALK3) {
Direction md = GetDirection(monster[ndx].position.tile, { p->_mx, p->_my });
if (Monsters[ndx].position.tile.WalkingDistance({ p->_mx, p->_my }) <= 2) {
if (Monsters[ndx]._mmode < MM_WALK || Monsters[ndx]._mmode > MM_WALK3) {
Direction md = GetDirection(Monsters[ndx].position.tile, { p->_mx, p->_my });
if (DirOK(ndx, md)) {
M_ClearSquares(ndx);
dMonster[monster[ndx].position.tile.x][monster[ndx].position.tile.y] = ndx + 1;
dMonster[Monsters[ndx].position.tile.x][Monsters[ndx].position.tile.y] = ndx + 1;
M_WalkDir(ndx, md);
monster[ndx]._msquelch = UINT8_MAX;
Monsters[ndx]._msquelch = UINT8_MAX;
}
}
} else if (dMonster[p->_mx][p->_my] == 0) {
M_ClearSquares(ndx);
dMonster[p->_mx][p->_my] = ndx + 1;
monster[ndx].position.tile = { p->_mx, p->_my };
Monsters[ndx].position.tile = { p->_mx, p->_my };
decode_enemy(ndx, p->_menemy);
Direction md = GetDirection({ p->_mx, p->_my }, monster[ndx].enemyPosition);
Direction md = GetDirection({ p->_mx, p->_my }, Monsters[ndx].enemyPosition);
M_StartStand(ndx, md);
monster[ndx]._msquelch = UINT8_MAX;
Monsters[ndx]._msquelch = UINT8_MAX;
}
decode_enemy(ndx, p->_menemy);

12
Source/themes.cpp

@ -157,8 +157,8 @@ bool TFit_SkelRoom(int t)
return false;
}
for (i = 0; i < nummtypes; i++) {
if (IsSkel(Monsters[i].mtype)) {
for (i = 0; i < LevelMonsterTypeCount; i++) {
if (IsSkel(LevelMonsterTypes[i].mtype)) {
themeVar1 = i;
return TFit_Obj5(t);
}
@ -171,8 +171,8 @@ bool TFit_GoatShrine(int t)
{
int i;
for (i = 0; i < nummtypes; i++) {
if (IsGoat(Monsters[i].mtype)) {
for (i = 0; i < LevelMonsterTypeCount; i++) {
if (IsGoat(LevelMonsterTypes[i].mtype)) {
themeVar1 = i;
return TFit_Obj5(t);
}
@ -486,8 +486,8 @@ void PlaceThemeMonsts(int t, int f)
int scattertypes[138];
int numscattypes = 0;
for (int i = 0; i < nummtypes; i++) {
if ((Monsters[i].mPlaceFlags & PLACE_SCATTER) != 0) {
for (int i = 0; i < LevelMonsterTypeCount; i++) {
if ((LevelMonsterTypes[i].mPlaceFlags & PLACE_SCATTER) != 0) {
scattertypes[numscattypes] = i;
numscattypes++;
}

Loading…
Cancel
Save