Change Missiles Array to std::list

This commit is contained in:
obligaron 2022-01-15 21:16:35 +01:00 committed by Anders Jenbo
commit 234a053863
11 changed files with 92 additions and 152 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -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 &parameter)
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 &parameter)
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);
}
}

View file

@ -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 &parameter);
void AddBoneSpirit(Missile &missile, const AddMissileParameter &parameter);
void AddRportal(Missile &missile, const AddMissileParameter &parameter);
void AddDiabApoca(Missile &missile, const AddMissileParameter &parameter);
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);

View file

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

View file

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

View file

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

View file

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

View file

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