Index: src/ship_cmd.cpp =================================================================== --- src/ship_cmd.cpp (revision 27848) +++ src/ship_cmd.cpp (working copy) @@ -341,12 +341,17 @@ if (north_tracks && south_tracks) { /* Ask pathfinder for best direction */ bool reverse = false; - bool path_found; - switch (_settings_game.pf.pathfinder_for_ships) { - case VPF_OPF: reverse = OPFShipChooseTrack(v, north_neighbour, north_dir, north_tracks, path_found) == INVALID_TRACK; break; // OPF always allows reversing - case VPF_NPF: reverse = NPFShipCheckReverse(v); break; - case VPF_YAPF: reverse = YapfShipCheckReverse(v); break; - default: NOT_REACHED(); + if (v->dest_tile == 0) { + /* No destination, don't invoke pathfinder. */ + reverse = HasBit(Random(), 0); + } else { + bool path_found; + switch (_settings_game.pf.pathfinder_for_ships) { + case VPF_OPF: reverse = OPFShipChooseTrack(v, north_neighbour, north_dir, north_tracks, path_found) == INVALID_TRACK; break; // OPF always allows reversing + case VPF_NPF: reverse = NPFShipCheckReverse(v); break; + case VPF_YAPF: reverse = YapfShipCheckReverse(v); break; + default: NOT_REACHED(); + } } if (reverse) north_tracks = TRACK_BIT_NONE; } @@ -440,11 +445,37 @@ bool path_found = true; Track track; - switch (_settings_game.pf.pathfinder_for_ships) { - case VPF_OPF: track = OPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break; - case VPF_NPF: track = NPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break; - case VPF_YAPF: track = YapfShipChooseTrack(v, tile, enterdir, tracks, path_found); break; - default: NOT_REACHED(); + + if (v->dest_tile == 0) { + /* No destination, don't invoke pathfinder. */ + static const TrackBits direction_to_trackbits[DIR_END] = { + TRACK_BIT_LEFT | TRACK_BIT_RIGHT, // DIR_N + TRACK_BIT_X, // DIR_NE + TRACK_BIT_UPPER | TRACK_BIT_LOWER, // DIR_E + TRACK_BIT_Y, // DIR_SE + TRACK_BIT_LEFT | TRACK_BIT_RIGHT, // DIR_S + TRACK_BIT_X, // DIR_SW + TRACK_BIT_UPPER | TRACK_BIT_LOWER, // DIR_W + TRACK_BIT_Y, // DIR_NW + }; + + TrackBits same = direction_to_trackbits[v->direction] & tracks; + if (same != 0 && GB(Random(), 0, 4) != 0) { + /* Continue in same direction. */ + track = (Track)FindFirstBit(same); + } else { + /* Pick a random track. */ + do { + track = (Track)(GB(Random(), 0, 3) % TRACK_END); + } while ((TrackToTrackBits(track) & tracks) == 0); + } + } else { + switch (_settings_game.pf.pathfinder_for_ships) { + case VPF_OPF: track = OPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break; + case VPF_NPF: track = NPFShipChooseTrack(v, tile, enterdir, tracks, path_found); break; + case VPF_YAPF: track = YapfShipChooseTrack(v, tile, enterdir, tracks, path_found); break; + default: NOT_REACHED(); + } } v->HandlePathfindingResult(path_found);