Change: Reverse ship when leaving docks if a better path exists

This commit is contained in:
glx22 2021-10-05 17:58:19 +02:00 committed by Loïc Guilloux
parent d0092925c9
commit 207cf7bbdd
1 changed files with 17 additions and 10 deletions

View File

@ -335,6 +335,18 @@ 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)
{
/* 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;
default: NOT_REACHED();
}
return reverse;
}
static bool CheckShipLeaveDepot(Ship *v)
{
if (!v->IsChainInDepot()) return false;
@ -364,14 +376,7 @@ static bool CheckShipLeaveDepot(Ship *v)
TrackBits north_tracks = DiagdirReachesTracks(north_dir) & GetTileShipTrackStatus(north_neighbour);
TrackBits south_tracks = DiagdirReachesTracks(south_dir) & GetTileShipTrackStatus(south_neighbour);
if (north_tracks && south_tracks) {
/* 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;
default: NOT_REACHED();
}
if (reverse) north_tracks = TRACK_BIT_NONE;
if (CheckReverseShip(v)) north_tracks = TRACK_BIT_NONE;
}
if (north_tracks) {
@ -624,6 +629,7 @@ static void ShipController(Ship *v)
const byte *b;
Track track;
TrackBits tracks;
GetNewVehiclePosResult gp;
v->tick_counter++;
v->current_order_time++;
@ -632,7 +638,8 @@ static void ShipController(Ship *v)
if (v->vehstatus & VS_STOPPED) return;
ProcessOrders(v);
if (ProcessOrders(v) && CheckReverseShip(v)) goto reverse_direction;
v->HandleLoading();
if (v->current_order.IsType(OT_LOADING)) return;
@ -657,7 +664,7 @@ static void ShipController(Ship *v)
if (!ShipAccelerate(v)) return;
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
gp = GetNewVehiclePos(v);
if (v->state != TRACK_BIT_WORMHOLE) {
/* Not on a bridge */
if (gp.old_tile == gp.new_tile) {