summaryrefslogtreecommitdiff
path: root/src/ship_cmd.cpp
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/ship_cmd.cpp
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/ship_cmd.cpp')
-rw-r--r--src/ship_cmd.cpp53
1 files changed, 52 insertions, 1 deletions
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index 5d3a28b1b..23786c17d 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -550,6 +550,56 @@ static const byte _ship_subcoord[4][6][3] = {
}
};
+/**
+ * Test if a ship is in the centre of a lock and should move up or down.
+ * @param v Ship being tested.
+ * @return 0 if ship is not moving in lock, or -1 to move down, 1 to move up.
+ */
+static int ShipTestUpDownOnLock(const Ship *v)
+{
+ /* Suitable tile? */
+ if (!IsTileType(v->tile, MP_WATER) || !IsLock(v->tile) || GetLockPart(v->tile) != LOCK_PART_MIDDLE) return 0;
+
+ /* Must be at the centre of the lock */
+ if ((v->x_pos & 0xF) != 8 || (v->y_pos & 0xF) != 8) return 0;
+
+ DiagDirection diagdir = GetInclinedSlopeDirection(GetTileSlope(v->tile));
+ assert(IsValidDiagDirection(diagdir));
+
+ if (DirToDiagDir(v->direction) == diagdir) {
+ /* Move up */
+ return (v->z_pos < GetTileMaxZ(v->tile) * (int)TILE_HEIGHT) ? 1 : 0;
+ } else {
+ /* Move down */
+ return (v->z_pos > GetTileZ(v->tile) * (int)TILE_HEIGHT) ? -1 : 0;
+ }
+}
+
+/**
+ * Test and move a ship up or down in a lock.
+ * @param v Ship to move.
+ * @return true iff ship is moving up or down in a lock.
+ */
+static bool ShipMoveUpDownOnLock(Ship *v)
+{
+ /* Moving up/down through lock */
+ int dz = ShipTestUpDownOnLock(v);
+ if (dz == 0) return false;
+
+ if (v->cur_speed != 0) {
+ v->cur_speed = 0;
+ SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
+ }
+
+ if ((v->tick_counter & 7) == 0) {
+ v->z_pos += dz;
+ v->UpdatePosition();
+ v->UpdateViewport(true, true);
+ }
+
+ return true;
+}
+
static void ShipController(Ship *v)
{
uint32 r;
@@ -583,6 +633,8 @@ static void ShipController(Ship *v)
return;
}
+ if (ShipMoveUpDownOnLock(v)) return;
+
if (!ShipAccelerate(v)) return;
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
@@ -707,7 +759,6 @@ static void ShipController(Ship *v)
/* update image of ship, as well as delta XY */
v->x_pos = gp.x;
v->y_pos = gp.y;
- v->z_pos = GetSlopePixelZ(gp.x, gp.y);
getout:
v->UpdatePosition();