Merge branch 'master' into jgrpp-beta
# Conflicts: # src/command.cpp # src/console_cmds.cpp # src/group_gui.cpp # src/lang/catalan.txt # src/lang/czech.txt # src/lang/danish.txt # src/lang/greek.txt # src/lang/hungarian.txt # src/lang/irish.txt # src/lang/japanese.txt # src/lang/luxembourgish.txt # src/lang/norwegian_bokmal.txt # src/lang/romanian.txt # src/lang/russian.txt # src/lang/serbian.txt # src/lang/simplified_chinese.txt # src/lang/slovak.txt # src/lang/spanish_MX.txt # src/lang/swedish.txt # src/lang/tamil.txt # src/lang/traditional_chinese.txt # src/lang/turkish.txt # src/lang/ukrainian.txt # src/lang/vietnamese.txt # src/network/network.cpp # src/network/network_client.cpp # src/network/network_func.h # src/network/network_internal.h # src/network/network_server.cpp # src/network/network_server.h # src/saveload/afterload.cpp # src/saveload/newgrf_sl.cpp # src/saveload/saveload.h # src/script/script_instance.cpp # src/toolbar_gui.cpp # src/toolbar_gui.h # src/vehicle_gui.cpp # src/widgets/rail_widget.h # src/widgets/vehicle_widget.h # src/window.cpp
This commit is contained in:
@@ -361,6 +361,18 @@ static Vehicle *EnsureNoMovingShipProc(Vehicle *v, void *data)
|
||||
return (v->vehstatus & (VS_HIDDEN | VS_STOPPED)) == 0 ? v : nullptr;
|
||||
}
|
||||
|
||||
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, trackdir); break;
|
||||
case VPF_YAPF: reverse = YapfShipCheckReverse(v, trackdir); break;
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
return reverse;
|
||||
}
|
||||
|
||||
static bool CheckShipLeaveDepot(Ship *v)
|
||||
{
|
||||
if (!v->IsChainInDepot()) return false;
|
||||
@@ -397,14 +409,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) {
|
||||
@@ -820,6 +825,7 @@ static void ShipController(Ship *v)
|
||||
const byte *b;
|
||||
Track track;
|
||||
TrackBits tracks;
|
||||
GetNewVehiclePosResult gp;
|
||||
|
||||
v->tick_counter++;
|
||||
v->current_order_time++;
|
||||
@@ -828,7 +834,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;
|
||||
@@ -851,7 +858,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) {
|
||||
@@ -912,7 +919,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);
|
||||
@@ -989,6 +1008,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