|
@@ -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:
|