summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorPeter Nelson <peter1138@openttd.org>2018-05-19 21:50:03 +0100
committerCharles Pigott <charlespigott@googlemail.com>2019-02-04 20:20:49 +0000
commit0b10678050c82604214136343673a5290f986cdb (patch)
tree2626dff680c8a54fedce1bb5dbd9f093a8bc42eb /src/saveload
parent8e7fe3973fc03561c828594ce3293c1ab3c15481 (diff)
downloadopenttd-0b10678050c82604214136343673a5290f986cdb.tar.xz
Change: Make ships stop in locks to move up/down instead of following the slope.
Diffstat (limited to 'src/saveload')
-rw-r--r--src/saveload/afterload.cpp37
-rw-r--r--src/saveload/saveload.h1
2 files changed, 38 insertions, 0 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 872458b25..d0b4723c6 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -55,6 +55,7 @@
#include "../order_backup.h"
#include "../error.h"
#include "../disaster_vehicle.h"
+#include "../ship.h"
#include "saveload_internal.h"
@@ -3045,6 +3046,42 @@ bool AfterLoadGame()
}
}
+ if (IsSavegameVersionBefore(SLV_SHIPS_STOP_IN_LOCKS)) {
+ /* Move ships from lock slope to upper or lower position. */
+ Ship *s;
+ FOR_ALL_SHIPS(s) {
+ /* Suitable tile? */
+ if (!IsTileType(s->tile, MP_WATER) || !IsLock(s->tile) || GetLockPart(s->tile) != LOCK_PART_MIDDLE) continue;
+
+ /* We don't need to adjust position when at the tile centre */
+ int x = s->x_pos & 0xF;
+ int y = s->y_pos & 0xF;
+ if (x == 8 && y == 8) continue;
+
+ /* Test if ship is on the second half of the tile */
+ bool second_half;
+ DiagDirection shipdiagdir = DirToDiagDir(s->direction);
+ switch (shipdiagdir) {
+ default: NOT_REACHED();
+ case DIAGDIR_NE: second_half = x < 8; break;
+ case DIAGDIR_NW: second_half = y < 8; break;
+ case DIAGDIR_SW: second_half = x > 8; break;
+ case DIAGDIR_SE: second_half = y > 8; break;
+ }
+
+ DiagDirection slopediagdir = GetInclinedSlopeDirection(GetTileSlope(s->tile));
+
+ /* Heading up slope == passed half way */
+ if ((shipdiagdir == slopediagdir) == second_half) {
+ /* On top half of lock */
+ s->z_pos = GetTileMaxZ(s->tile) * (int)TILE_HEIGHT;
+ } else {
+ /* On lower half of lock */
+ s->z_pos = GetTileZ(s->tile) * (int)TILE_HEIGHT;
+ }
+ }
+ }
+
/* Station acceptance is some kind of cache */
if (IsSavegameVersionBefore(SLV_127)) {
Station *st;
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
index 613c9ce51..5c84abc21 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -289,6 +289,7 @@ enum SaveLoadVersion : uint16 {
SLV_SHIP_ROTATION, ///< 204 PR#7065 Add extra rotation stages for ships.
SLV_GROUP_LIVERIES, ///< 205 PR#7108 Livery storage change and group liveries.
+ SLV_SHIPS_STOP_IN_LOCKS, ///< 206 PR#7150 Ship/lock movement changes.
SL_MAX_VERSION, ///< Highest possible saveload version
};