|
@@ -335,13 +335,13 @@ static Vehicle *EnsureNoMovingShipProc(V
|
|
|
return v->type == VEH_SHIP && (v->vehstatus & (VS_HIDDEN | VS_STOPPED)) == 0 ? v : nullptr;
|
|
|
}
|
|
|
|
|
|
static bool CheckReverseShip(const Ship *v)
|
|
|
static bool CheckReverseShip(const Ship *v, Trackdir *trackdir = nullptr)
|
|
|
{
|
|
|
/* Ask pathfinder for best direction */
|
|
|
bool reverse = false;
|
|
|
switch (_settings_game.pf.pathfinder_for_ships) {
|
|
|
case VPF_NPF: reverse = NPFShipCheckReverse(v); break;
|
|
|
case VPF_YAPF: reverse = YapfShipCheckReverse(v); break;
|
|
|
case VPF_NPF: reverse = NPFShipCheckReverse(v, trackdir); break;
|
|
|
case VPF_YAPF: reverse = YapfShipCheckReverse(v, trackdir); break;
|
|
|
default: NOT_REACHED();
|
|
|
}
|
|
|
return reverse;
|
|
@@ -725,7 +725,19 @@ static void ShipController(Ship *v)
|
|
|
DiagDirection diagdir = DiagdirBetweenTiles(gp.old_tile, gp.new_tile);
|
|
|
assert(diagdir != INVALID_DIAGDIR);
|
|
|
tracks = GetAvailShipTracks(gp.new_tile, diagdir);
|
|
|
if (tracks == TRACK_BIT_NONE) goto reverse_direction;
|
|
|
if (tracks == TRACK_BIT_NONE) {
|
|
|
Trackdir trackdir = INVALID_TRACKDIR;
|
|
|
CheckReverseShip(v, &trackdir);
|
|
|
if (trackdir == INVALID_TRACKDIR) goto reverse_direction;
|
|
|
static const Direction _trackdir_to_direction[] = {
|
|
|
DIR_NE, DIR_SE, DIR_E, DIR_E, DIR_S, DIR_S, INVALID_DIR, INVALID_DIR,
|
|
|
DIR_SW, DIR_NW, DIR_W, DIR_W, DIR_N, DIR_N, INVALID_DIR, INVALID_DIR,
|
|
|
};
|
|
|
v->direction = _trackdir_to_direction[trackdir];
|
|
|
assert(v->direction != INVALID_DIR);
|
|
|
v->state = TrackdirBitsToTrackBits(TrackdirToTrackdirBits(trackdir));
|
|
|
goto direction_changed;
|
|
|
}
|
|
|
|
|
|
/* Choose a direction, and continue if we find one */
|
|
|
track = ChooseShipTrack(v, gp.new_tile, diagdir, tracks);
|
|
@@ -796,6 +808,7 @@ getout:
|
|
|
|
|
|
reverse_direction:
|
|
|
v->direction = ReverseDir(v->direction);
|
|
|
direction_changed:
|
|
|
/* Remember our current location to avoid movement glitch */
|
|
|
v->rotation_x_pos = v->x_pos;
|
|
|
v->rotation_y_pos = v->y_pos;
|