mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-10 08:00:05 +00:00
Change: Reverse ship when leaving docks if a better path exists
This commit is contained in:
parent
d0092925c9
commit
207cf7bbdd
@ -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;
|
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)
|
static bool CheckShipLeaveDepot(Ship *v)
|
||||||
{
|
{
|
||||||
if (!v->IsChainInDepot()) return false;
|
if (!v->IsChainInDepot()) return false;
|
||||||
@ -364,14 +376,7 @@ static bool CheckShipLeaveDepot(Ship *v)
|
|||||||
TrackBits north_tracks = DiagdirReachesTracks(north_dir) & GetTileShipTrackStatus(north_neighbour);
|
TrackBits north_tracks = DiagdirReachesTracks(north_dir) & GetTileShipTrackStatus(north_neighbour);
|
||||||
TrackBits south_tracks = DiagdirReachesTracks(south_dir) & GetTileShipTrackStatus(south_neighbour);
|
TrackBits south_tracks = DiagdirReachesTracks(south_dir) & GetTileShipTrackStatus(south_neighbour);
|
||||||
if (north_tracks && south_tracks) {
|
if (north_tracks && south_tracks) {
|
||||||
/* Ask pathfinder for best direction */
|
if (CheckReverseShip(v)) north_tracks = TRACK_BIT_NONE;
|
||||||
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 (north_tracks) {
|
if (north_tracks) {
|
||||||
@ -624,6 +629,7 @@ static void ShipController(Ship *v)
|
|||||||
const byte *b;
|
const byte *b;
|
||||||
Track track;
|
Track track;
|
||||||
TrackBits tracks;
|
TrackBits tracks;
|
||||||
|
GetNewVehiclePosResult gp;
|
||||||
|
|
||||||
v->tick_counter++;
|
v->tick_counter++;
|
||||||
v->current_order_time++;
|
v->current_order_time++;
|
||||||
@ -632,7 +638,8 @@ static void ShipController(Ship *v)
|
|||||||
|
|
||||||
if (v->vehstatus & VS_STOPPED) return;
|
if (v->vehstatus & VS_STOPPED) return;
|
||||||
|
|
||||||
ProcessOrders(v);
|
if (ProcessOrders(v) && CheckReverseShip(v)) goto reverse_direction;
|
||||||
|
|
||||||
v->HandleLoading();
|
v->HandleLoading();
|
||||||
|
|
||||||
if (v->current_order.IsType(OT_LOADING)) return;
|
if (v->current_order.IsType(OT_LOADING)) return;
|
||||||
@ -657,7 +664,7 @@ static void ShipController(Ship *v)
|
|||||||
|
|
||||||
if (!ShipAccelerate(v)) return;
|
if (!ShipAccelerate(v)) return;
|
||||||
|
|
||||||
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
|
gp = GetNewVehiclePos(v);
|
||||||
if (v->state != TRACK_BIT_WORMHOLE) {
|
if (v->state != TRACK_BIT_WORMHOLE) {
|
||||||
/* Not on a bridge */
|
/* Not on a bridge */
|
||||||
if (gp.old_tile == gp.new_tile) {
|
if (gp.old_tile == gp.new_tile) {
|
||||||
|
Loading…
Reference in New Issue
Block a user