Change Missiles Array to std::list
This commit is contained in:
parent
a45eca5d40
commit
234a053863
11 changed files with 92 additions and 152 deletions
|
|
@ -35,7 +35,7 @@ namespace devilution {
|
|||
|
||||
ControlTypes ControlMode = ControlTypes::None;
|
||||
int pcurstrig = -1;
|
||||
int pcursmissile = -1;
|
||||
Missile *pcursmissile = nullptr;
|
||||
quest_id pcursquest = Q_INVALID;
|
||||
|
||||
/**
|
||||
|
|
@ -405,26 +405,24 @@ void FindTrigger()
|
|||
if (pcursitem != -1 || pcursobj != -1)
|
||||
return; // Prefer showing items/objects over triggers (use of cursm* conflicts)
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_TOWN || missile._mitype == MIS_RPORTAL) {
|
||||
const int newDistance = GetDistance(missile.position.tile, 2);
|
||||
if (newDistance == 0)
|
||||
continue;
|
||||
if (pcursmissile != -1 && distance < newDistance)
|
||||
if (pcursmissile != nullptr && distance < newDistance)
|
||||
continue;
|
||||
const int newRotations = GetRotaryDistance(missile.position.tile);
|
||||
if (pcursmissile != -1 && distance == newDistance && rotations < newRotations)
|
||||
if (pcursmissile != nullptr && distance == newDistance && rotations < newRotations)
|
||||
continue;
|
||||
cursPosition = missile.position.tile;
|
||||
pcursmissile = mi;
|
||||
pcursmissile = &missile;
|
||||
distance = newDistance;
|
||||
rotations = newRotations;
|
||||
}
|
||||
}
|
||||
|
||||
if (pcursmissile == -1) {
|
||||
if (pcursmissile == nullptr) {
|
||||
for (int i = 0; i < numtrigs; i++) {
|
||||
int tx = trigs[i].position.x;
|
||||
int ty = trigs[i].position.y;
|
||||
|
|
@ -1443,7 +1441,7 @@ void plrctrls_after_check_curs_move()
|
|||
pcursmonst = -1;
|
||||
pcursitem = -1;
|
||||
pcursobj = -1;
|
||||
pcursmissile = -1;
|
||||
pcursmissile = nullptr;
|
||||
pcurstrig = -1;
|
||||
pcursquest = Q_INVALID;
|
||||
cursPosition = { -1, -1 };
|
||||
|
|
@ -1710,8 +1708,8 @@ void PerformSecondaryAction()
|
|||
NetSendCmdLocParam1(true, CMD_OPOBJXY, cursPosition, pcursobj);
|
||||
} else {
|
||||
auto &myPlayer = Players[MyPlayerId];
|
||||
if (pcursmissile != -1) {
|
||||
MakePlrPath(myPlayer, Missiles[pcursmissile].position.tile, true);
|
||||
if (pcursmissile != nullptr) {
|
||||
MakePlrPath(myPlayer, pcursmissile->position.tile, true);
|
||||
myPlayer.destAction = ACTION_WALK;
|
||||
} else if (pcurstrig != -1) {
|
||||
MakePlrPath(myPlayer, trigs[pcurstrig].position, true);
|
||||
|
|
|
|||
|
|
@ -436,12 +436,12 @@ VirtualGamepadButtonType PrimaryActionButtonRenderer::GetInventoryButtonType()
|
|||
}
|
||||
|
||||
extern int pcurstrig;
|
||||
extern int pcursmissile;
|
||||
extern Missile *pcursmissile;
|
||||
extern quest_id pcursquest;
|
||||
|
||||
VirtualGamepadButtonType SecondaryActionButtonRenderer::GetButtonType()
|
||||
{
|
||||
if (pcursmissile != -1 || pcurstrig != -1 || pcursquest != Q_INVALID) {
|
||||
if (pcursmissile != nullptr || pcurstrig != -1 || pcursquest != Q_INVALID) {
|
||||
return GetStairsButtonType(virtualPadButton->isHeld);
|
||||
}
|
||||
if (InGameMenu() || QuestLogIsOpen || sbookflag)
|
||||
|
|
|
|||
|
|
@ -208,9 +208,7 @@ void InitLevelCursor()
|
|||
|
||||
void CheckTown()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mx = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mx];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_TOWN) {
|
||||
if (EntranceBoundaryContains(missile.position.tile, cursPosition)) {
|
||||
trigflag = true;
|
||||
|
|
@ -226,9 +224,7 @@ void CheckTown()
|
|||
|
||||
void CheckRportal()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mx = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mx];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_RPORTAL) {
|
||||
if (EntranceBoundaryContains(missile.position.tile, cursPosition)) {
|
||||
trigflag = true;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ uint8_t giNumberOfLevels;
|
|||
|
||||
namespace {
|
||||
|
||||
constexpr size_t MaxMissilesForSaveGame = 125;
|
||||
|
||||
uint8_t giNumberQuests;
|
||||
uint8_t giNumberOfSmithPremiumItems;
|
||||
|
||||
|
|
@ -166,9 +168,9 @@ public:
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
constexpr void Skip()
|
||||
constexpr void Skip(size_t count = 1)
|
||||
{
|
||||
Skip(sizeof(T));
|
||||
Skip(sizeof(T) * count);
|
||||
}
|
||||
|
||||
void Skip(size_t len)
|
||||
|
|
@ -664,8 +666,9 @@ void SyncPackSize(Monster &leader)
|
|||
}
|
||||
}
|
||||
|
||||
void LoadMissile(LoadHelper *file, Missile &missile)
|
||||
void LoadMissile(LoadHelper *file)
|
||||
{
|
||||
Missile missile = {};
|
||||
missile._mitype = static_cast<missile_id>(file->NextLE<int32_t>());
|
||||
missile.position.tile.x = file->NextLE<int32_t>();
|
||||
missile.position.tile.y = file->NextLE<int32_t>();
|
||||
|
|
@ -712,6 +715,7 @@ void LoadMissile(LoadHelper *file, Missile &missile)
|
|||
missile.var7 = file->NextLE<int32_t>();
|
||||
missile.limitReached = file->NextBool32();
|
||||
missile.lastCollisionTargetHash = 0;
|
||||
Missiles.push_back(missile);
|
||||
}
|
||||
|
||||
void LoadObject(LoadHelper &file, Object &object)
|
||||
|
|
@ -1810,9 +1814,9 @@ void LoadGame(bool firstflag)
|
|||
|
||||
ViewPosition = { viewX, viewY };
|
||||
ActiveMonsterCount = tmpNummonsters;
|
||||
ActiveMissileCount = tmpNummissiles;
|
||||
ActiveObjectCount = tmpNobjects;
|
||||
|
||||
|
||||
for (int &monstkill : MonsterKillCounts)
|
||||
monstkill = file.NextBE<int32_t>();
|
||||
|
||||
|
|
@ -1823,12 +1827,12 @@ void LoadGame(bool firstflag)
|
|||
LoadMonster(&file, Monsters[ActiveMonsters[i]]);
|
||||
for (int i = 0; i < ActiveMonsterCount; i++)
|
||||
SyncPackSize(Monsters[ActiveMonsters[i]]);
|
||||
for (int &missileId : ActiveMissiles)
|
||||
missileId = file.NextLE<int8_t>();
|
||||
for (int &missileId : AvailableMissiles)
|
||||
missileId = file.NextLE<int8_t>();
|
||||
for (int i = 0; i < ActiveMissileCount; i++)
|
||||
LoadMissile(&file, Missiles[ActiveMissiles[i]]);
|
||||
// Skip ActiveMissiles
|
||||
file.Skip<int8_t>(MaxMissilesForSaveGame);
|
||||
// Skip AvailableMissiles
|
||||
file.Skip<int8_t>(MaxMissilesForSaveGame);
|
||||
for (int i = 0; i < tmpNummissiles; i++)
|
||||
LoadMissile(&file);
|
||||
for (int &objectId : ActiveObjects)
|
||||
objectId = file.NextLE<int8_t>();
|
||||
for (int &objectId : AvailableObjects)
|
||||
|
|
@ -1990,7 +1994,7 @@ void SaveGameData()
|
|||
file.WriteLE<uint8_t>(chrflag ? 1 : 0);
|
||||
file.WriteBE<int32_t>(ActiveMonsterCount);
|
||||
file.WriteBE<int32_t>(ActiveItemCount);
|
||||
file.WriteBE<int32_t>(ActiveMissileCount);
|
||||
file.WriteBE<int32_t>(std::min(Missiles.size(), MaxMissilesForSaveGame));
|
||||
file.WriteBE<int32_t>(ActiveObjectCount);
|
||||
|
||||
for (uint8_t i = 0; i < giNumberOfLevels; i++) {
|
||||
|
|
@ -2014,12 +2018,21 @@ void SaveGameData()
|
|||
file.WriteBE<int32_t>(monsterId);
|
||||
for (int i = 0; i < ActiveMonsterCount; i++)
|
||||
SaveMonster(&file, Monsters[ActiveMonsters[i]]);
|
||||
for (int missileId : ActiveMissiles)
|
||||
file.WriteLE<int8_t>(missileId);
|
||||
for (int missileId : AvailableMissiles)
|
||||
file.WriteLE<int8_t>(missileId);
|
||||
for (int i = 0; i < ActiveMissileCount; i++)
|
||||
SaveMissile(&file, Missiles[ActiveMissiles[i]]);
|
||||
// Write ActiveMissiles
|
||||
for (int8_t activeMissile = 0; activeMissile < MaxMissilesForSaveGame; activeMissile++)
|
||||
file.WriteLE<int8_t>(activeMissile);
|
||||
// Write AvailableMissiles
|
||||
for (size_t avaiableMissile = Missiles.size(); avaiableMissile < MaxMissilesForSaveGame; avaiableMissile++)
|
||||
file.WriteLE<int8_t>(avaiableMissile);
|
||||
file.Skip<int8_t>(std::min(Missiles.size(), MaxMissilesForSaveGame));
|
||||
// Write Missile Data
|
||||
size_t wroteMissiles = 0;
|
||||
for (auto &missile : Missiles) {
|
||||
SaveMissile(&file, missile);
|
||||
wroteMissiles += 1;
|
||||
if (wroteMissiles == MaxMissilesForSaveGame)
|
||||
break;
|
||||
}
|
||||
for (int objectId : ActiveObjects)
|
||||
file.WriteLE<int8_t>(objectId);
|
||||
for (int objectId : AvailableObjects)
|
||||
|
|
|
|||
|
|
@ -26,10 +26,7 @@
|
|||
|
||||
namespace devilution {
|
||||
|
||||
int ActiveMissiles[MAXMISSILES];
|
||||
int AvailableMissiles[MAXMISSILES];
|
||||
Missile Missiles[MAXMISSILES];
|
||||
int ActiveMissileCount;
|
||||
std::list<Missile> Missiles;
|
||||
bool MissilePreFlag;
|
||||
|
||||
namespace {
|
||||
|
|
@ -956,14 +953,6 @@ Direction16 GetDirection16(Point p1, Point p2)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void DeleteMissile(int i)
|
||||
{
|
||||
AvailableMissiles[MAXMISSILES - ActiveMissileCount] = ActiveMissiles[i];
|
||||
ActiveMissileCount--;
|
||||
if (ActiveMissileCount > 0 && i != ActiveMissileCount)
|
||||
ActiveMissiles[i] = ActiveMissiles[ActiveMissileCount];
|
||||
}
|
||||
|
||||
bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, missile_id t, bool shift)
|
||||
{
|
||||
auto &monster = Monsters[m];
|
||||
|
|
@ -1191,9 +1180,7 @@ void InitMissiles()
|
|||
AutoMapShowItems = false;
|
||||
myPlayer._pSpellFlags &= ~0x1;
|
||||
if (myPlayer._pInfraFlag) {
|
||||
for (int i = 0; i < ActiveMissileCount; ++i) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_INFRA) {
|
||||
int src = missile._misource;
|
||||
if (src == MyPlayerId)
|
||||
|
|
@ -1205,9 +1192,7 @@ void InitMissiles()
|
|||
if ((myPlayer._pSpellFlags & 2) == 2 || (myPlayer._pSpellFlags & 4) == 4) {
|
||||
myPlayer._pSpellFlags &= ~0x2;
|
||||
myPlayer._pSpellFlags &= ~0x4;
|
||||
for (int i = 0; i < ActiveMissileCount; ++i) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_BLODBOIL) {
|
||||
if (missile._misource == MyPlayerId) {
|
||||
int missingHP = myPlayer._pMaxHP - myPlayer._pHitPoints;
|
||||
|
|
@ -1218,11 +1203,7 @@ void InitMissiles()
|
|||
}
|
||||
}
|
||||
|
||||
ActiveMissileCount = 0;
|
||||
for (int i = 0; i < MAXMISSILES; i++) {
|
||||
AvailableMissiles[i] = i;
|
||||
ActiveMissiles[i] = 0;
|
||||
}
|
||||
Missiles.clear();
|
||||
for (int j = 0; j < MAXDUNY; j++) {
|
||||
for (int i = 0; i < MAXDUNX; i++) { // NOLINT(modernize-loop-convert)
|
||||
dFlags[i][j] &= ~DungeonFlag::Missile;
|
||||
|
|
@ -1659,18 +1640,14 @@ void AddSearch(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|||
if (missile._micaster == TARGET_MONSTERS)
|
||||
UseMana(missile._misource, SPL_SEARCH);
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mx = ActiveMissiles[i];
|
||||
if (&Missiles[mx] != &missile) {
|
||||
auto &other = Missiles[mx];
|
||||
if (other._misource == missile._misource && other._mitype == MIS_SEARCH) {
|
||||
int r1 = missile._mirange;
|
||||
int r2 = other._mirange;
|
||||
if (r2 < INT_MAX - r1)
|
||||
other._mirange = r1 + r2;
|
||||
missile._miDelFlag = true;
|
||||
break;
|
||||
}
|
||||
for (auto &other : Missiles) {
|
||||
if (&other != &missile && other._misource == missile._misource && other._mitype == MIS_SEARCH) {
|
||||
int r1 = missile._mirange;
|
||||
int r2 = other._mirange;
|
||||
if (r2 < INT_MAX - r1)
|
||||
other._mirange = r1 + r2;
|
||||
missile._miDelFlag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2038,9 +2015,7 @@ void AddTown(Missile &missile, const AddMissileParameter ¶meter)
|
|||
|
||||
missile._mirange = 100;
|
||||
missile.var1 = missile._mirange - missile._miAnimLen;
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mx = ActiveMissiles[i];
|
||||
auto &other = Missiles[mx];
|
||||
for (auto &other : Missiles) {
|
||||
if (other._mitype == MIS_TOWN && &other != &missile && other._misource == missile._misource)
|
||||
other._mirange = 0;
|
||||
}
|
||||
|
|
@ -2331,9 +2306,7 @@ void AddGolem(Missile &missile, const AddMissileParameter ¶meter)
|
|||
|
||||
int playerId = missile._misource;
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mx = ActiveMissiles[i];
|
||||
auto &other = Missiles[mx];
|
||||
for (auto &other : Missiles) {
|
||||
if (other._mitype == MIS_GOLEM && &other != &missile && other._misource == playerId) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -2719,17 +2692,12 @@ void AddDiabApoca(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|||
missile._miDelFlag = true;
|
||||
}
|
||||
|
||||
int AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl, Missile *pParent /*= nullptr*/)
|
||||
Missile &AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl, Missile *pParent /*= nullptr*/)
|
||||
{
|
||||
if (ActiveMissileCount >= MAXMISSILES - 1)
|
||||
return -1;
|
||||
constexpr int32_t MaxMissiles = std::numeric_limits<int32_t>::max();
|
||||
|
||||
int mi = AvailableMissiles[0];
|
||||
auto &missile = Missiles[mi];
|
||||
|
||||
AvailableMissiles[0] = AvailableMissiles[MAXMISSILES - ActiveMissileCount - 1];
|
||||
ActiveMissiles[ActiveMissileCount] = mi;
|
||||
ActiveMissileCount++;
|
||||
Missiles.emplace_back(Missile {});
|
||||
auto &missile = Missiles.back();
|
||||
|
||||
memset(&missile, 0, sizeof(missile));
|
||||
|
||||
|
|
@ -2760,7 +2728,7 @@ int AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy
|
|||
AddMissileParameter parameter = { dst, midir, pParent };
|
||||
missileData.mAddProc(missile, parameter);
|
||||
|
||||
return mi;
|
||||
return missile;
|
||||
}
|
||||
|
||||
void MI_LArrow(Missile &missile)
|
||||
|
|
@ -4144,13 +4112,7 @@ void MI_Rportal(Missile &missile)
|
|||
|
||||
static void DeleteMissiles()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount;) {
|
||||
if (Missiles[ActiveMissiles[i]]._miDelFlag) {
|
||||
DeleteMissile(i);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
Missiles.remove_if([](Missile &missile) { return missile._miDelFlag; });
|
||||
}
|
||||
|
||||
void ProcessManaShield()
|
||||
|
|
@ -4164,8 +4126,7 @@ void ProcessManaShield()
|
|||
|
||||
void ProcessMissiles()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
auto &missile = Missiles[ActiveMissiles[i]];
|
||||
for (auto &missile : Missiles) {
|
||||
const auto &position = missile.position.tile;
|
||||
dFlags[position.x][position.y] &= ~DungeonFlag::Missile;
|
||||
if (!InDungeonBounds(position))
|
||||
|
|
@ -4176,8 +4137,7 @@ void ProcessMissiles()
|
|||
|
||||
MissilePreFlag = false;
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
auto &missile = Missiles[ActiveMissiles[i]];
|
||||
for (auto &missile : Missiles) {
|
||||
if (MissilesData[missile._mitype].mProc != nullptr)
|
||||
MissilesData[missile._mitype].mProc(missile);
|
||||
if (missile._miAnimFlags == MissileDataFlags::NotAnimated)
|
||||
|
|
@ -4201,10 +4161,7 @@ void ProcessMissiles()
|
|||
|
||||
void missiles_process_charge()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
|
||||
for (auto &missile : Missiles) {
|
||||
missile._miAnimData = MissileSpriteData[missile._miAnimType].animData[missile._mimfnum].get();
|
||||
if (missile._mitype != MIS_RHINO)
|
||||
continue;
|
||||
|
|
@ -4225,8 +4182,7 @@ void missiles_process_charge()
|
|||
|
||||
void RedoMissileFlags()
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
auto &missile = Missiles[ActiveMissiles[i]];
|
||||
for (auto &missile : Missiles) {
|
||||
PutMissile(missile);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <list>
|
||||
|
||||
#include "engine.h"
|
||||
#include "engine/point.hpp"
|
||||
|
|
@ -16,8 +17,6 @@
|
|||
|
||||
namespace devilution {
|
||||
|
||||
#define MAXMISSILES 125
|
||||
|
||||
constexpr Point GolemHoldingCell = Point { 1, 0 };
|
||||
|
||||
struct MissilePosition {
|
||||
|
|
@ -129,10 +128,7 @@ struct Missile {
|
|||
int16_t lastCollisionTargetHash;
|
||||
};
|
||||
|
||||
extern Missile Missiles[MAXMISSILES];
|
||||
extern int AvailableMissiles[MAXMISSILES];
|
||||
extern int ActiveMissiles[MAXMISSILES];
|
||||
extern int ActiveMissileCount;
|
||||
extern std::list<Missile> Missiles;
|
||||
extern bool MissilePreFlag;
|
||||
|
||||
void GetDamageAmt(int i, int *mind, int *maxd);
|
||||
|
|
@ -158,7 +154,6 @@ int GetSpellLevel(int playerId, spell_id sn);
|
|||
* @return the direction of the p1->p2 vector
|
||||
*/
|
||||
Direction16 GetDirection16(Point p1, Point p2);
|
||||
void DeleteMissile(int i);
|
||||
bool MonsterTrapHit(int m, int mindam, int maxdam, int dist, missile_id t, bool shift);
|
||||
bool PlayerMHit(int pnum, Monster *monster, int dist, int mind, int maxd, missile_id mtype, bool shift, int earflag, bool *blocked);
|
||||
|
||||
|
|
@ -346,7 +341,7 @@ void AddTelekinesis(Missile &missile, const AddMissileParameter ¶meter);
|
|||
void AddBoneSpirit(Missile &missile, const AddMissileParameter ¶meter);
|
||||
void AddRportal(Missile &missile, const AddMissileParameter ¶meter);
|
||||
void AddDiabApoca(Missile &missile, const AddMissileParameter ¶meter);
|
||||
int AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl, Missile *pParent = nullptr);
|
||||
Missile &AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl, Missile *pParent = nullptr);
|
||||
void MI_Golem(Missile &missile);
|
||||
void MI_Manashield(Missile &missile);
|
||||
void MI_LArrow(Missile &missile);
|
||||
|
|
|
|||
|
|
@ -2001,9 +2001,7 @@ bool IsTileSafe(const Monster &monster, Point position)
|
|||
bool fearsFire = (monster.mMagicRes & IMMUNE_FIRE) == 0 || monster.MType->mtype == MT_DIABLO;
|
||||
bool fearsLightning = (monster.mMagicRes & IMMUNE_LIGHTNING) == 0 || monster.MType->mtype == MT_DIABLO;
|
||||
|
||||
for (int j = 0; j < ActiveMissileCount; j++) {
|
||||
uint8_t mi = ActiveMissiles[j];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile.position.tile == position) {
|
||||
if (fearsFire && missile._mitype == MIS_FIREWALL) {
|
||||
return false;
|
||||
|
|
@ -2558,12 +2556,11 @@ void RhinoAi(int i)
|
|||
if (dist >= 5
|
||||
&& v < 2 * monster._mint + 43
|
||||
&& LineClear([&monster](Point position) { return IsTileAvailable(monster, position); }, monster.position.tile, { fx, fy })) {
|
||||
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0) != -1) {
|
||||
if (monster.MData->snd_special)
|
||||
PlayEffect(monster, 3);
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
}
|
||||
AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0);
|
||||
if (monster.MData->snd_special)
|
||||
PlayEffect(monster, 3);
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
} else {
|
||||
if (dist >= 2) {
|
||||
v = GenerateRnd(100);
|
||||
|
|
@ -2761,10 +2758,9 @@ void BatAi(int i)
|
|||
&& (abs(xd) >= 5 || abs(yd) >= 5)
|
||||
&& v < 4 * monster._mint + 33
|
||||
&& LineClear([&monster](Point position) { return IsTileAvailable(monster, position); }, monster.position.tile, { fx, fy })) {
|
||||
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0) != -1) {
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
}
|
||||
AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0);
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
} else if (abs(xd) >= 2 || abs(yd) >= 2) {
|
||||
if ((monster._mVar2 > 20 && v < monster._mint + 13)
|
||||
|| (IsAnyOf(static_cast<MonsterMode>(monster._mVar1), MonsterMode::MoveNorthwards, MonsterMode::MoveSouthwards, MonsterMode::MoveSideways)
|
||||
|
|
@ -3030,11 +3026,10 @@ void SnakeAi(int i)
|
|||
monster._mdir = md;
|
||||
if (abs(mx) >= 2 || abs(my) >= 2) {
|
||||
if (abs(mx) < 3 && abs(my) < 3 && LineClear([&monster](Point position) { return IsTileAvailable(monster, position); }, monster.position.tile, { fx, fy }) && static_cast<MonsterMode>(monster._mVar1) != MonsterMode::Charge) {
|
||||
if (AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0) != -1) {
|
||||
PlayEffect(monster, 0);
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
}
|
||||
AddMissile(monster.position.tile, { fx, fy }, md, MIS_RHINO, TARGET_PLAYERS, i, 0, 0);
|
||||
PlayEffect(monster, 0);
|
||||
dMonster[monster.position.tile.x][monster.position.tile.y] = -(i + 1);
|
||||
monster._mmode = MonsterMode::Charge;
|
||||
} else if (static_cast<MonsterMode>(monster._mVar1) == MonsterMode::Delay || GenerateRnd(100) >= 35 - 2 * monster._mint) {
|
||||
if (pattern[monster._mgoalvar1] == -1)
|
||||
md = Left(md);
|
||||
|
|
|
|||
|
|
@ -1421,9 +1421,7 @@ DWORD OnAwakeGolem(const TCmd *pCmd, int pnum)
|
|||
DeltaSyncGolem(message, pnum, message._currlevel);
|
||||
} else if (pnum != MyPlayerId) {
|
||||
// Check if this player already has an active golem
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_GOLEM && missile._misource == pnum) {
|
||||
return sizeof(message);
|
||||
}
|
||||
|
|
@ -1702,9 +1700,7 @@ DWORD OnActivatePortal(const TCmd *pCmd, int pnum)
|
|||
AddInTownPortal(pnum);
|
||||
} else if (currlevel == Players[pnum].plrlevel) {
|
||||
bool addPortal = true;
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_TOWN && missile._misource == pnum) {
|
||||
addPortal = false;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -3302,9 +3302,7 @@ void RemovePlrMissiles(int pnum)
|
|||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int am = ActiveMissiles[i];
|
||||
auto &missile = Missiles[am];
|
||||
for (auto &missile : Missiles) {
|
||||
if (missile._mitype == MIS_STONE && missile._misource == pnum) {
|
||||
Monsters[missile.var2]._mmode = static_cast<MonsterMode>(missile.var1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,11 +51,7 @@ void AddWarpMissile(int i, Point position)
|
|||
{
|
||||
MissilesData[MIS_TOWN].mlSFX = SFX_NONE;
|
||||
|
||||
int mi = AddMissile({ 0, 0 }, position, Direction::South, MIS_TOWN, TARGET_MONSTERS, i, 0, 0);
|
||||
if (mi == -1)
|
||||
return;
|
||||
|
||||
auto &missile = Missiles[mi];
|
||||
auto &missile = AddMissile({ 0, 0 }, position, Direction::South, MIS_TOWN, TARGET_MONSTERS, i, 0, 0);
|
||||
SetMissDir(missile, 1);
|
||||
|
||||
if (currlevel != 0)
|
||||
|
|
@ -113,18 +109,17 @@ bool PortalOnLevel(int i)
|
|||
|
||||
void RemovePortalMissile(int id)
|
||||
{
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
int mi = ActiveMissiles[i];
|
||||
auto &missile = Missiles[mi];
|
||||
Missiles.remove_if([id](Missile &missile) {
|
||||
if (missile._mitype == MIS_TOWN && missile._misource == id) {
|
||||
dFlags[missile.position.tile.x][missile.position.tile.y] &= ~DungeonFlag::Missile;
|
||||
|
||||
if (Portals[id].level != 0)
|
||||
AddUnLight(missile._mlid);
|
||||
|
||||
DeleteMissile(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
void SetCurrentPortal(int p)
|
||||
|
|
|
|||
|
|
@ -176,9 +176,7 @@ void UpdateMissilesRendererData()
|
|||
{
|
||||
MissilesAtRenderingTile.clear();
|
||||
|
||||
for (int i = 0; i < ActiveMissileCount; i++) {
|
||||
assert(ActiveMissiles[i] < MAXMISSILES);
|
||||
Missile &m = Missiles[ActiveMissiles[i]];
|
||||
for (auto &m : Missiles) {
|
||||
UpdateMissileRendererData(m);
|
||||
MissilesAtRenderingTile.insert(std::make_pair(m.position.tileForRendering, &m));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue