File diff r26014:71f8ae89abb6 → r26015:62da647d3454
src/ship_cmd.cpp
Show inline comments
 
@@ -335,13 +335,13 @@ static Vehicle *EnsureNoMovingShipProc(V
 
	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;
 
@@ -725,7 +725,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);
 
@@ -796,6 +808,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;