diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index dd37cc4d7..bbbd86e76 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -1350,7 +1350,7 @@ void SaveMonster(SaveHelper *file, Monster &monster) // Omit pointer MData; } -void SaveMissile(SaveHelper *file, Missile &missile) +void SaveMissile(SaveHelper *file, const Missile &missile) { file->WriteLE(missile._mitype); file->WriteLE(missile.position.tile.x); @@ -1538,16 +1538,17 @@ void SaveAdditionalMissiles() { constexpr size_t BytesWrittenBySaveMissile = 180; size_t missileCountAdditional = (Missiles.size() > MaxMissilesForSaveGame) ? Missiles.size() - MaxMissilesForSaveGame : 0; - SaveHelper file("additionalMissiles", sizeof(uint32_t) + sizeof(int32_t) + (missileCountAdditional * BytesWrittenBySaveMissile)); + SaveHelper file("additionalMissiles", sizeof(uint32_t) + sizeof(uint32_t) + (missileCountAdditional * BytesWrittenBySaveMissile)); file.WriteLE(VersionAdditionalMissiles); file.WriteLE(missileCountAdditional); - size_t wroteMissiles = 0; - for (auto &missile : Missiles) { - wroteMissiles += 1; - if (wroteMissiles >= MaxMissilesForSaveGame) { - SaveMissile(&file, missile); + if (missileCountAdditional > 0) { + auto it = Missiles.cbegin(); + // std::list::const_iterator doesn't provide operator+() :/ using std::advance to get past the missiles we've already saved + std::advance(it, MaxMissilesForSaveGame); + for (; it != Missiles.cend(); it++) { + SaveMissile(&file, *it); } } } @@ -1566,8 +1567,8 @@ void LoadAdditionalMissiles() // unknown version return; } - uint32_t missileCountAdditional = file.NextLE(); - for (int i = 0; i < missileCountAdditional; i++) { + auto missileCountAdditional = file.NextLE(); + for (uint32_t i = 0U; i < missileCountAdditional; i++) { LoadMissile(&file); } } @@ -1860,8 +1861,6 @@ void LoadGame(bool firstflag) monstkill = file.NextBE(); if (leveltype != DTYPE_TOWN) { - int8_t tmpActiveMissiles[MaxMissilesForSaveGame]; - for (int &monsterId : ActiveMonsters) monsterId = file.NextBE(); for (int i = 0; i < ActiveMonsterCount; i++) @@ -1968,7 +1967,7 @@ void LoadGame(bool firstflag) ProcessVisionList(); // convert stray manashield missiles into pManaShield flag for (auto &missile : Missiles) { - if (missile._mitype == MIS_MANASHIELD && missile._miDelFlag == false) { + if (missile._mitype == MIS_MANASHIELD && !missile._miDelFlag) { Players[missile._misource].pManaShield = true; missile._miDelFlag = true; } @@ -2037,7 +2036,10 @@ void SaveGameData() file.WriteLE(chrflag ? 1 : 0); file.WriteBE(ActiveMonsterCount); file.WriteBE(ActiveItemCount); - file.WriteBE(std::min(Missiles.size(), MaxMissilesForSaveGame)); + // ActiveMissileCount will be a value from 0-125 (for vanilla compatibility). Writing an unsigned value here to avoid + // warnings about casting from unsigned to signed, but there's no sign extension issues when reading this as a signed + // value later so it doesn't have to match in LoadGameData(). + file.WriteBE(static_cast(std::min(Missiles.size(), MaxMissilesForSaveGame))); file.WriteBE(ActiveObjectCount); for (uint8_t i = 0; i < giNumberOfLevels; i++) { @@ -2066,15 +2068,16 @@ void SaveGameData() file.WriteLE(activeMissile); // Write AvailableMissiles for (size_t avaiableMissile = Missiles.size(); avaiableMissile < MaxMissilesForSaveGame; avaiableMissile++) - file.WriteLE(avaiableMissile); - file.Skip(std::min(Missiles.size(), MaxMissilesForSaveGame)); + file.WriteLE(static_cast(avaiableMissile)); + const size_t savedMissiles = std::min(Missiles.size(), MaxMissilesForSaveGame); + file.Skip(savedMissiles); // Write Missile Data - size_t wroteMissiles = 0; - for (auto &missile : Missiles) { - SaveMissile(&file, missile); - wroteMissiles += 1; - if (wroteMissiles == MaxMissilesForSaveGame) - break; + { + auto missilesEnd = Missiles.cbegin(); + std::advance(missilesEnd, savedMissiles); + for (auto it = Missiles.cbegin(); it != missilesEnd; it++) { + SaveMissile(&file, *it); + } } for (int objectId : ActiveObjects) file.WriteLE(objectId); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index e5a9a155e..17d5a5bae 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2699,9 +2699,7 @@ Missile &AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mi Missiles.emplace_back(Missile {}); auto &missile = Missiles.back(); - memset(&missile, 0, sizeof(missile)); - - auto &missileData = MissilesData[mitype]; + const auto &missileData = MissilesData[mitype]; missile._mitype = mitype; missile._micaster = micaster; @@ -4128,9 +4126,11 @@ void ProcessMissiles() { for (auto &missile : Missiles) { const auto &position = missile.position.tile; - dFlags[position.x][position.y] &= ~DungeonFlag::Missile; - if (!InDungeonBounds(position)) + if (InDungeonBounds(position)) { + dFlags[position.x][position.y] &= ~DungeonFlag::Missile; + } else { missile._miDelFlag = true; + } } DeleteMissiles();