From 0b10678050c82604214136343673a5290f986cdb Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 19 May 2018 21:50:03 +0100 Subject: Change: Make ships stop in locks to move up/down instead of following the slope. --- src/saveload/afterload.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/saveload/saveload.h | 1 + 2 files changed, 38 insertions(+) (limited to 'src/saveload') 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 }; -- cgit v1.2.3-70-g09d2