@@ -1104,13 +1104,13 @@ static bool CanBuildTramTrackOnTile(Comp
CommandCost ret = DoCommand(t, ROADTYPE_TRAM << 4 | r, 0, DC_NO_WATER, CMD_BUILD_ROAD);
cur_company.Restore();
return ret.Succeeded();
}
static bool IndividualRoadVehicleController(RoadVehicle *v, const RoadVehicle *prev)
bool IndividualRoadVehicleController(RoadVehicle *v, const RoadVehicle *prev)
{
if (v->overtaking != 0) {
if (IsTileType(v->tile, MP_STATION)) {
/* Force us to be not overtaking! */
v->overtaking = 0;
} else if (++v->overtaking_ctr >= RV_OVERTAKE_TIMEOUT) {
@@ -1414,23 +1414,18 @@ again:
Direction old_dir = v->direction;
if (new_dir != old_dir) {
v->direction = new_dir;
if (_settings_game.vehicle.roadveh_acceleration_model == AM_ORIGINAL) v->cur_speed -= v->cur_speed >> 2;
/* Delay the vehicle in curves by making it require one or two additional frames per curve.
/* Delay the vehicle in curves by making it require one additional frame per turning direction (two in total).
* A vehicle has to spend at least 9 frames on a tile, so the following articulated part can follow.
* (The following part may only be one tile behind, and the front part is moved before the following ones.)
* The short (inner) curve has 8 frames, this elongates it to 9 or 10.
*
* The difference between 9 and 10 is arbitrary, and completely bollocks (i.e. a bug).
* Unifying this requires a complicated savegame conversion. */
if (old_dir != v->state) {
v->UpdateInclination(false, true);
return true;
* The short (inner) curve has 8 frames, this elongates it to 10. */
/* If the vehicle is in a normal road stop and the frame equals the stop frame OR
* if the vehicle is in a drive-through road stop and this is the destination station
* and it's the correct type of stop (bus or truck) and the frame equals the stop frame...
* (the station test and stop type test ensure that other vehicles, using the road stop as
@@ -2829,12 +2829,70 @@ bool AfterLoadGame()
o->type = _m[t].m5;
_m[t].m5 = 0; // zero upper bits of (now bigger) ObjectID
if (IsSavegameVersionBefore(188)) {
/* Fix articulated road vehicles.
* Some curves were shorter than other curves.
* Now they have the same length, but that means that trailing articulated parts will
* take longer to go through the curve than the parts in front which already left the courve.
* So, make articulated parts catch up. */
RoadVehicle *v;
bool roadside = _settings_game.vehicle.road_side == 1;
SmallVector<uint, 16> skip_frames;
FOR_ALL_ROADVEHICLES(v) {
if (!v->IsFrontEngine()) continue;
skip_frames.Clear();
TileIndex prev_tile = v->tile;
uint prev_tile_skip = 0;
uint cur_skip = 0;
for (RoadVehicle *u = v; u != NULL; u = u->Next()) {
if (u->tile != prev_tile) {
prev_tile_skip = cur_skip;
prev_tile = u->tile;
} else {
cur_skip = prev_tile_skip;
uint *this_skip = skip_frames.Append();
*this_skip = prev_tile_skip;
/* The following 3 curves now take longer than before */
switch (u->state) {
case 2:
cur_skip++;
if (u->frame <= (roadside ? 9 : 5)) *this_skip = cur_skip;
break;
case 4:
if (u->frame <= (roadside ? 5 : 9)) *this_skip = cur_skip;
case 5:
if (u->frame <= (roadside ? 4 : 2)) *this_skip = cur_skip;
default:
while (cur_skip > skip_frames[0]) {
RoadVehicle *u = v;
RoadVehicle *prev = NULL;
for (uint *it = skip_frames.Begin(); it != skip_frames.End(); ++it, prev = u, u = u->Next()) {
extern bool IndividualRoadVehicleController(RoadVehicle *v, const RoadVehicle *prev);
if (*it >= cur_skip) IndividualRoadVehicleController(u, prev);
cur_skip--;
/* Station acceptance is some kind of cache */
if (IsSavegameVersionBefore(127)) {
Station *st;
FOR_ALL_STATIONS(st) UpdateStationAcceptance(st, false);
@@ -250,14 +250,15 @@
* 182 25296
* 183 25363
* 184 25508
* 185 25620
* 186 25833
* 187 25899
* 188 26169
*/
extern const uint16 SAVEGAME_VERSION = 187; ///< Current savegame version of OpenTTD.
extern const uint16 SAVEGAME_VERSION = 188; ///< Current savegame version of OpenTTD.
SavegameType _savegame_type; ///< type of savegame we are loading
uint32 _ttdp_version; ///< version of TTDP savegame (if applicable)
uint16 _sl_version; ///< the major savegame version identifier
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
Status change: