diff options
-rw-r--r-- | src/aircraft_cmd.cpp | 9 | ||||
-rw-r--r-- | src/newgrf.cpp | 10 | ||||
-rw-r--r-- | src/saveload/afterload.cpp | 11 | ||||
-rw-r--r-- | src/table/engines.h | 4 |
4 files changed, 23 insertions, 11 deletions
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index cad674a20..71d8d3bb2 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -598,7 +598,14 @@ enum AircraftSpeedLimits { */ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE, bool hard_limit = true) { - uint spd = v->acceleration * 16; + /** + * 'acceleration' has the unit 3/8 mph/tick. This function is called twice per tick. + * So the speed amount we need to accelerate is: + * acceleration * 3 / 16 mph = acceleration * 3 / 16 * 16 / 10 km-ish/h + * = acceleration * 3 / 10 * 256 * (km-ish/h / 256) + * ~ acceleration * 77 (km-ish/h / 256) + */ + uint spd = v->acceleration * 77; byte t; /* Adjust speed limits by plane speed factor to prevent taxiing diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 848903324..854ad165e 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1618,15 +1618,9 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int avi->max_speed = (buf->ReadByte() * 128) / 10; break; - case 0x0D: { // Acceleration - uint acceleration = (buf->ReadByte() * 128) / 10; - if (acceleration > UINT8_MAX) { - grfmsg(1, "Acceleration property of aircraft %d is too big.", engine + i); - acceleration = UINT8_MAX; - } - avi->acceleration = acceleration; + case 0x0D: // Acceleration + avi->acceleration = buf->ReadByte(); break; - } case PROP_AIRCRAFT_RUNNING_COST_FACTOR: // 0x0E Running cost factor avi->running_cost = buf->ReadByte(); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 15c44d392..a3837942c 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2761,6 +2761,17 @@ bool AfterLoadGame() _settings_game.script.settings_profile = IsInsideMM(_old_diff_level, SP_BEGIN, SP_END) ? _old_diff_level : (uint)SP_MEDIUM; } + if (IsSavegameVersionBefore(182)) { + Aircraft *v; + /* Aircraft acceleration variable was bonkers */ + FOR_ALL_AIRCRAFT(v) { + if (v->subtype <= AIR_AIRCRAFT) { + const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type); + v->acceleration = avi->acceleration; + } + } + } + /* Road stops is 'only' updating some caches */ AfterLoadRoadStops(); AfterLoadLabelMaps(); diff --git a/src/table/engines.h b/src/table/engines.h index 102d8d79c..b79733c7a 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -580,8 +580,8 @@ static const ShipVehicleInfo _orig_ship_vehicle_info[] = { * @param c running_Cost * @param d subtype (bit 0 - plane, bit 1 - large plane) * @param e sound effect - * @param f acceleration - * @param g max_speed (1 unit = 8 mph = 12.8 km-ish/h) + * @param f acceleration (1 unit = 3/8 mph/tick = 3/5 km-ish/h/tick) (stays the same in the variable) + * @param g max_speed (1 unit = 8 mph = 12.8 km-ish/h) (is converted to km-ish/h by the macro) * @param h mail_capacity (bags) * @param i passenger_capacity (persons) */ |