Changeset - r21085:ecb6a73cc24e
[Not reviewed]
master
0 3 0
frosch - 11 years ago 2013-12-22 11:55:07
frosch@openttd.org
(svn r26169) -Fix-ish [FS#5831-ish]: Unify the time a RV needs to travel through a curve.
3 files changed with 65 insertions and 11 deletions:
0 comments (0 inline, 0 general)
src/roadveh_cmd.cpp
Show inline comments
 
@@ -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. */
 
		v->UpdateInclination(false, true);
 
		return true;
 
	}
 

	
 
	/* 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
src/saveload/afterload.cpp
Show inline comments
 
@@ -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:
 
						cur_skip++;
 
						if (u->frame <= (roadside ? 5 : 9)) *this_skip = cur_skip;
 
						break;
 

	
 
					case 5:
 
						cur_skip++;
 
						if (u->frame <= (roadside ? 4 : 2)) *this_skip = cur_skip;
 
						break;
 

	
 
					default:
 
						break;
 
				}
 
			}
 
			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);
src/saveload/saveload.cpp
Show inline comments
 
@@ -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!
0 comments (0 inline, 0 general)