diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -529,38 +529,53 @@ static inline TrackBits GetAvailShipTrac return tracks; } -static const byte _ship_subcoord[4][6][3] = { +/** Structure for ship sub-coordinate data for moving into a new tile via a Diagdir onto a Track. */ +struct ShipSubcoordData { + byte x_subcoord; ///< New X sub-coordinate on the new tile + byte y_subcoord; ///< New Y sub-coordinate on the new tile + Direction dir; ///< New Direction to move in on the new track +}; +/** Ship sub-coordinate data for moving into a new tile via a Diagdir onto a Track. + * Array indexes are Diagdir, Track. + * There will always be three possible tracks going into an adjacent tile via a Diagdir, + * so each Diagdir sub-array will have three valid and three invalid structures per Track. + */ +static const ShipSubcoordData _ship_subcoord[DIAGDIR_END][TRACK_END] = { + // DIAGDIR_NE { - {15, 8, 1}, - { 0, 0, 0}, - { 0, 0, 0}, - {15, 8, 2}, - {15, 7, 0}, - { 0, 0, 0}, + {15, 8, DIR_NE}, // TRACK_X + { 0, 0, INVALID_DIR}, // TRACK_Y + { 0, 0, INVALID_DIR}, // TRACK_UPPER + {15, 8, DIR_E}, // TRACK_LOWER + {15, 7, DIR_N}, // TRACK_LEFT + { 0, 0, INVALID_DIR}, // TRACK_RIGHT }, + // DIAGDIR_SE { - { 0, 0, 0}, - { 8, 0, 3}, - { 7, 0, 2}, - { 0, 0, 0}, - { 8, 0, 4}, - { 0, 0, 0}, + { 0, 0, INVALID_DIR}, // TRACK_X + { 8, 0, DIR_SE}, // TRACK_Y + { 7, 0, DIR_E}, // TRACK_UPPER + { 0, 0, INVALID_DIR}, // TRACK_LOWER + { 8, 0, DIR_S}, // TRACK_LEFT + { 0, 0, INVALID_DIR}, // TRACK_RIGHT }, + // DIAGDIR_SW { - { 0, 8, 5}, - { 0, 0, 0}, - { 0, 7, 6}, - { 0, 0, 0}, - { 0, 0, 0}, - { 0, 8, 4}, + { 0, 8, DIR_SW}, // TRACK_X + { 0, 0, INVALID_DIR}, // TRACK_Y + { 0, 7, DIR_W}, // TRACK_UPPER + { 0, 0, INVALID_DIR}, // TRACK_LOWER + { 0, 0, INVALID_DIR}, // TRACK_LEFT + { 0, 8, DIR_S}, // TRACK_RIGHT }, + // DIAGDIR_NW { - { 0, 0, 0}, - { 8, 15, 7}, - { 0, 0, 0}, - { 8, 15, 6}, - { 0, 0, 0}, - { 7, 15, 0}, + { 0, 0, INVALID_DIR}, // TRACK_X + { 8, 15, DIR_NW}, // TRACK_Y + { 0, 0, INVALID_DIR}, // TRACK_UPPER + { 8, 15, DIR_W}, // TRACK_LOWER + { 0, 0, INVALID_DIR}, // TRACK_LEFT + { 7, 15, DIR_N}, // TRACK_RIGHT } }; @@ -640,7 +655,6 @@ bool IsShipDestinationTile(TileIndex til static void ShipController(Ship *v) { uint32 r; - const byte *b; Track track; TrackBits tracks; GetNewVehiclePosResult gp; @@ -757,10 +771,10 @@ static void ShipController(Ship *v) track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks); if (track == INVALID_TRACK) goto reverse_direction; - b = _ship_subcoord[diagdir][track]; + const ShipSubcoordData &b = _ship_subcoord[diagdir][track]; - gp.x = (gp.x & ~0xF) | b[0]; - gp.y = (gp.y & ~0xF) | b[1]; + gp.x = (gp.x & ~0xF) | b.x_subcoord; + gp.y = (gp.y & ~0xF) | b.y_subcoord; /* Call the landscape function and tell it that the vehicle entered the tile */ r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y); @@ -776,7 +790,7 @@ static void ShipController(Ship *v) if (old_wc != new_wc) v->UpdateCache(); } - Direction new_direction = (Direction)b[2]; + Direction new_direction = b.dir; DirDiff diff = DirDifference(new_direction, v->direction); switch (diff) { case DIRDIFF_SAME: