From 4398c1e06adc7d694c5a9e665f3bdf543262f1fa Mon Sep 17 00:00:00 2001 From: "Stephen C. Wills" Date: Sun, 10 Jul 2022 01:25:53 -0400 Subject: [PATCH] Use absolute coordinates for temp position when north-walking (#4937) --- Source/loadsave.cpp | 28 ++++++++++++++++++++++------ Source/player.cpp | 4 ++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index b8a3ae9dd..babb5fcd0 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -431,10 +431,18 @@ void LoadPlayer(LoadHelper &file, Player &player) player._pFireResist = file.NextLE(); player._pLghtResist = file.NextLE(); player._pGold = file.NextLE(); - player._pInfraFlag = file.NextBool32(); - player.position.temp.x = file.NextLE(); - player.position.temp.y = file.NextLE(); + + int32_t tempPositionX = file.NextLE(); + int32_t tempPositionY = file.NextLE(); + if (player._pmode == PM_WALK_NORTHWARDS) { + // These values are saved as offsets to remain consistent with old savefiles + tempPositionX += player.position.tile.x; + tempPositionY += player.position.tile.y; + } + player.position.temp.x = static_cast(tempPositionX); + player.position.temp.y = static_cast(tempPositionY); + player.tempDirection = static_cast(file.NextLE()); player.spellLevel = file.NextLE(); file.Skip(); // skip _pVar5, was used for storing position of a tile which should have its HorizontalMovingPlayer flag removed after walking @@ -1191,10 +1199,18 @@ void SavePlayer(SaveHelper &file, const Player &player) file.WriteLE(player._pFireResist); file.WriteLE(player._pLghtResist); file.WriteLE(player._pGold); - file.WriteLE(player._pInfraFlag ? 1 : 0); - file.WriteLE(player.position.temp.x); - file.WriteLE(player.position.temp.y); + + int32_t tempPositionX = player.position.temp.x; + int32_t tempPositionY = player.position.temp.y; + if (player._pmode == PM_WALK_NORTHWARDS) { + // For backwards compatibility, save this as an offset + tempPositionX -= player.position.tile.x; + tempPositionY -= player.position.tile.y; + } + file.WriteLE(tempPositionX); + file.WriteLE(tempPositionY); + file.WriteLE(static_cast(player.tempDirection)); file.WriteLE(player.spellLevel); file.Skip(); // skip _pVar5, was used for storing position of a tile which should have its HorizontalMovingPlayer flag removed after walking diff --git a/Source/player.cpp b/Source/player.cpp index 0fc944584..70d107bb2 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -225,7 +225,7 @@ void WalkNorthwards(int pnum, const DirectionSettings &walkParams) { Player &player = Players[pnum]; dPlayer[player.position.future.x][player.position.future.y] = -(pnum + 1); - player.position.temp = WorldTilePosition { static_cast(walkParams.tileAdd.deltaX), static_cast(walkParams.tileAdd.deltaY) }; + player.position.temp = player.position.tile + walkParams.tileAdd; } void WalkSouthwards(int pnum, const DirectionSettings & /*walkParams*/) @@ -669,7 +669,7 @@ bool DoWalk(int pnum, int variant) switch (variant) { case PM_WALK_NORTHWARDS: dPlayer[player.position.tile.x][player.position.tile.y] = 0; - player.position.tile += { player.position.temp.x, player.position.temp.y }; + player.position.tile = player.position.temp; dPlayer[player.position.tile.x][player.position.tile.y] = pnum + 1; break; case PM_WALK_SOUTHWARDS: