(svn r11419) -Fix [FS#1388]: articulated vehicle breaking up when making a 90 degree turn immediately after a 180 degree turn.

pull/155/head
rubidium 17 years ago
parent 14fe7a9fed
commit abbde80e53

@ -1415,7 +1415,29 @@ static Trackdir FollowPreviousRoadVehicle(const Vehicle *v, const Vehicle *prev,
} else if (HASBIT(prev_state, RVS_IN_DT_ROAD_STOP)) {
dir = (Trackdir)(prev_state & RVSB_ROAD_STOP_TRACKDIR_MASK);
} else if (prev_state < TRACKDIR_END) {
dir = (Trackdir)prev_state;
if (already_reversed && prev->tile != tile) {
/*
* The vehicle has reversed, but did not go straight back.
* It immediatelly turn onto another tile. This means that
* the roadstate of the previous vehicle cannot be used
* as the direction we have to go with this vehicle.
*
* Next table is build in the following way:
* - first row for when the vehicle in front went to the northern or
* western tile, second for southern and eastern.
* - columns represent the entry direction.
* - cell values are determined by the Trackdir one has to take from
* the entry dir (column) to the tile in north or south by only
* going over the trackdirs used for turning 90 degrees, i.e.
* TRACKDIR_{UPPER,RIGHT,LOWER,LEFT}_{N,E,S,W}.
*/
Trackdir reversed_turn_lookup[2][DIAGDIR_END] = {
{ TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N, TRACKDIR_UPPER_E },
{ TRACKDIR_RIGHT_S, TRACKDIR_LOWER_W, TRACKDIR_LOWER_E, TRACKDIR_LEFT_S }};
dir = reversed_turn_lookup[prev->tile < tile ? 0 : 1][ReverseDiagDir(entry_dir)];
} else {
dir = (Trackdir)prev_state;
}
} else {
return INVALID_TRACKDIR;
}

Loading…
Cancel
Save