Browse Source

Use active monsters instead of proximity for autosave safety and run clang

pull/8497/head
morfidon 4 weeks ago
parent
commit
577444d292
  1. 25
      Source/diablo.cpp
  2. 48
      Source/loadsave.cpp
  3. 1
      Source/utils/sdl_compat.h

25
Source/diablo.cpp

@ -185,7 +185,6 @@ uint32_t autoSaveCombatCooldownUntil = 0;
bool wasAutoSaveEnabled = false;
constexpr uint32_t AutoSaveCooldownMilliseconds = 5000;
constexpr uint32_t AutoSaveCombatCooldownMilliseconds = 4000;
constexpr int AutoSaveEnemyProximityTiles = 6;
uint32_t GetAutoSaveIntervalMilliseconds()
{
@ -1886,7 +1885,7 @@ const auto OptionChangeHandlerLanguage = (GetOptions().Language.code.SetValueCha
} // namespace
bool IsEnemyTooCloseForAutoSave();
bool HasActiveMonstersForAutoSave();
bool IsAutoSaveSafe()
{
@ -1911,7 +1910,7 @@ bool IsAutoSaveSafe()
if (qtextflag || DropGoldFlag || IsWithdrawGoldOpen || pcurs != CURSOR_HAND)
return false;
if (leveltype != DTYPE_TOWN && IsEnemyTooCloseForAutoSave())
if (leveltype != DTYPE_TOWN && HasActiveMonstersForAutoSave())
return false;
return true;
@ -1922,28 +1921,16 @@ void MarkCombatActivity()
autoSaveCombatCooldownUntil = SDL_GetTicks() + AutoSaveCombatCooldownMilliseconds;
}
bool IsEnemyTooCloseForAutoSave()
bool HasActiveMonstersForAutoSave()
{
if (MyPlayer == nullptr)
return false;
const Point playerPosition = MyPlayer->position.tile;
for (size_t i = 0; i < ActiveMonsterCount; i++) {
const Monster &monster = Monsters[ActiveMonsters[i]];
for (const Monster &monster : Monsters) {
if (monster.hitPoints <= 0 || monster.mode == MonsterMode::Death || monster.mode == MonsterMode::Petrified)
continue;
if (monster.type().type == MT_GOLEM)
if (monster.activeForTicks == 0)
continue;
if ((monster.flags & MFLAG_HIDDEN) != 0)
continue;
const int distance = std::max(
std::abs(monster.position.tile.x - playerPosition.x),
std::abs(monster.position.tile.y - playerPosition.y));
if (distance <= AutoSaveEnemyProximityTiles)
return true;
return true;
}
return false;

48
Source/loadsave.cpp

@ -54,30 +54,30 @@ namespace {
constexpr size_t MaxMissilesForSaveGame = 125;
constexpr size_t PlayerWalkPathSizeForSaveGame = 25;
uint8_t giNumberQuests;
uint8_t giNumberOfSmithPremiumItems;
bool ActiveSaveContainsGame()
{
if (gbIsMultiplayer)
return false;
auto archive = OpenSaveArchive(gSaveNumber);
if (!archive)
return false;
auto gameData = ReadArchive(*archive, "game");
if (gameData == nullptr)
return false;
return IsHeaderValid(LoadLE32(gameData.get()));
}
SaveResult GetSaveFailureResult()
{
gbValidSaveFile = ActiveSaveContainsGame();
return gbValidSaveFile ? SaveResult::FailedButPreviousSavePreserved : SaveResult::FailedNoValidSave;
}
uint8_t giNumberQuests;
uint8_t giNumberOfSmithPremiumItems;
bool ActiveSaveContainsGame()
{
if (gbIsMultiplayer)
return false;
auto archive = OpenSaveArchive(gSaveNumber);
if (!archive)
return false;
auto gameData = ReadArchive(*archive, "game");
if (gameData == nullptr)
return false;
return IsHeaderValid(LoadLE32(gameData.get()));
}
SaveResult GetSaveFailureResult()
{
gbValidSaveFile = ActiveSaveContainsGame();
return gbValidSaveFile ? SaveResult::FailedButPreviousSavePreserved : SaveResult::FailedNoValidSave;
}
template <class T>
T SwapLE(T in)

1
Source/utils/sdl_compat.h

@ -19,7 +19,6 @@
#endif
#endif
#ifdef USE_SDL1
#define SDL_Scancode Uint8
#endif

Loading…
Cancel
Save