|
@@ -332,19 +332,19 @@ void Ship::UpdateDeltaXY()
|
|
|
*/
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
static bool CheckShipLeaveDepot(Ship *v)
|
|
@@ -722,13 +722,25 @@ static void ShipController(Ship *v)
|
|
|
/* New tile */
|
|
|
if (!IsValidTile(gp.new_tile)) goto reverse_direction;
|
|
|
|
|
|
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);
|
|
|
if (track == INVALID_TRACK) goto reverse_direction;
|
|
|
|
|
|
b = _ship_subcoord[diagdir][track];
|
|
@@ -793,12 +805,13 @@ getout:
|
|
|
v->UpdatePosition();
|
|
|
v->UpdateViewport(true, true);
|
|
|
return;
|
|
|
|
|
|
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;
|
|
|
v->cur_speed = 0;
|
|
|
v->path.clear();
|
|
|
goto getout;
|