Fix: Try all possible reverse directions when a ship reaches a dead end
This commit is contained in:
@@ -335,13 +335,13 @@ static Vehicle *EnsureNoMovingShipProc(Vehicle *v, void *data)
|
||||
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;
|
||||
|
Reference in New Issue
Block a user