Initial support for loading savegames from SpringPP v2.0.102/103

Savegame version 220

Bin all extra settings added in SpringPP.
Bin extra features: trip histories, more conditional orders/jump counter,
prev order time, snow-line chunk, town auto adv. campaign, etc.
Fix vehicle flags.
Fix bridges wrt height changes.
Handle 60-bit RIFF chunk sizes.
Doesn't deal with huge airports, loading games with these may
lead to undefined ehaviour.
PAX signals and traffic lights are ignored.
pull/3/head
Jonathan G Rennison 9 years ago
parent bd10b0fb0b
commit 39608841f2

@ -584,7 +584,7 @@ bool AfterLoadGame()
}
}
if (IsSavegameVersionBefore(194)) {
if (IsSavegameVersionBefore(194) && SlXvIsFeatureMissing(XSLFI_HEIGHT_8_BIT)) {
_settings_game.construction.max_heightlevel = 15;
/* In old savegame versions, the heightlevel was coded in bits 0..3 of the type field */
@ -599,6 +599,17 @@ bool AfterLoadGame()
SB(_m[t].type, 2, 2, 0);
}
}
} else if (SlXvIsFeaturePresent(XSLFI_HEIGHT_8_BIT)) {
for (TileIndex t = 0; t < map_size; t++) {
SB(_m[t].type, 0, 2, GB(_me[t].m6, 0, 2));
SB(_me[t].m6, 0, 2, 0);
if (MayHaveBridgeAbove(t)) {
SB(_m[t].type, 2, 2, GB(_me[t].m6, 6, 2));
SB(_me[t].m6, 6, 2, 0);
} else {
SB(_m[t].type, 2, 2, 0);
}
}
}
/* in version 2.1 of the savegame, town owner was unified. */
@ -2943,6 +2954,15 @@ bool AfterLoadGame()
}
}
if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) {
// re-arrange vehicle_flags
Vehicle *v;
FOR_ALL_VEHICLES(v) {
SB(v->vehicle_flags, VF_AUTOMATE_TIMETABLE, 1, GB(v->vehicle_flags, 6, 1));
SB(v->vehicle_flags, VF_STOP_LOADING, 4, GB(v->vehicle_flags, 7, 4));
}
}
if (IsSavegameVersionBefore(188)) {
/* Fix articulated road vehicles.
* Some curves were shorter than other curves.

@ -138,6 +138,25 @@ void SlXvCheckSpecialSavegameVersions()
_sl_is_faked_ext = true;
_sl_xv_feature_versions[XSLFI_TRACE_RESTRICT] = 1;
}
if (_sl_version == 220) { /* SL_SPRING_2013_v2_0_102 */
DEBUG(sl, 1, "Loading a SpringPP 2013 v2.0.102 savegame version %d as version 187", _sl_version);
_sl_version = 187;
_sl_xv_feature_versions[XSLFI_RIFF_HEADER_60_BIT] = 1;
_sl_xv_feature_versions[XSLFI_HEIGHT_8_BIT] = 1;
_sl_xv_feature_versions[XSLFI_MIGHT_USE_PAX_SIGNALS] = 1;
_sl_xv_feature_versions[XSLFI_TIMETABLES_START_TICKS] = 1;
_sl_xv_feature_versions[XSLFI_VEHICLE_REPAIR_COST] = 1;
_sl_xv_feature_versions[XLSFI_IMPROVED_BREAKDOWNS] = 1;
_sl_xv_feature_versions[XSLFI_INFRA_SHARING] = 1;
_sl_xv_feature_versions[XSLFI_AUTO_TIMETABLE] = 1;
_sl_xv_feature_versions[XSLFI_SPRINGPP] = 1;
_sl_xv_discardable_chunk_ids.push_back('SNOW');
}
}
/**

@ -36,6 +36,11 @@ enum SlXvFeatureIndex {
XSLFI_INFRA_SHARING, ///< Infrastructure sharing patch
XSLFI_VARIABLE_DAY_LENGTH, ///< Variable day length patch
XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit
XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk
XSLFI_MIGHT_USE_PAX_SIGNALS, ///< This save game might use the pax-signals feature
XSLFI_SPRINGPP, ///< This is a SpringPP game, use this for loading some settings
XSLFI_SIZE, ///< Total count of features, including null feature
};

@ -106,6 +106,7 @@ const SaveLoad *GetOrderDescription()
static const SaveLoad _order_desc[] = {
SLE_VAR(Order, type, SLE_UINT8),
SLE_VAR(Order, flags, SLE_UINT8),
SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_VAR(Order, dest, SLE_UINT16),
SLE_REF(Order, next, REF_ORDER),
SLE_CONDVAR(Order, refit_cargo, SLE_UINT8, 36, SL_MAX_VERSION),
@ -113,6 +114,7 @@ const SaveLoad *GetOrderDescription()
SLE_CONDVAR(Order, wait_time, SLE_UINT16, 67, SL_MAX_VERSION),
SLE_CONDVAR(Order, travel_time, SLE_UINT16, 67, SL_MAX_VERSION),
SLE_CONDVAR(Order, max_speed, SLE_UINT16, 172, SL_MAX_VERSION),
SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
/* Leftover from the minor savegame version stuff
* We will never use those free bytes, but we have to keep this line to allow loading of old savegames */

@ -1695,6 +1695,12 @@ static void SlLoadChunk(const ChunkHandler *ch)
/* Read length */
len = (SlReadByte() << 16) | ((m >> 4) << 24);
len += SlReadUint16();
if (SlXvIsFeaturePresent(XSLFI_RIFF_HEADER_60_BIT)) {
if (len != 0) {
SlErrorCorrupt("RIFF chunk too large");
}
len = SlReadUint32();
}
_sl.obj_len = len;
endoffs = _sl.reader->GetSize() + len;
ch->load_proc();
@ -1741,6 +1747,12 @@ static void SlLoadCheckChunk(const ChunkHandler *ch)
/* Read length */
len = (SlReadByte() << 16) | ((m >> 4) << 24);
len += SlReadUint16();
if (SlXvIsFeaturePresent(XSLFI_RIFF_HEADER_60_BIT)) {
if (len != 0) {
SlErrorCorrupt("RIFF chunk too large");
}
len = SlReadUint32();
}
_sl.obj_len = len;
endoffs = _sl.reader->GetSize() + len;
if (ch && ch->load_check_proc) {

@ -424,7 +424,9 @@ static const SaveLoad _station_desc[] = {
SLE_CONDVAR(Station, airport.h, SLE_FILE_U8 | SLE_VAR_U16, 140, SL_MAX_VERSION),
SLE_VAR(Station, airport.type, SLE_UINT8),
SLE_CONDVAR(Station, airport.layout, SLE_UINT8, 145, SL_MAX_VERSION),
SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_VAR(Station, airport.flags, SLE_UINT64),
SLE_CONDNULL_X(8, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDVAR(Station, airport.rotation, SLE_UINT8, 145, SL_MAX_VERSION),
SLEG_CONDARR(_old_st_persistent_storage.storage, SLE_UINT32, 16, 145, 160),
SLE_CONDREF(Station, airport.psa, REF_STORAGE, 161, SL_MAX_VERSION),

@ -137,6 +137,7 @@ static const SaveLoad _town_desc[] = {
SLE_CONDVAR(Town, have_ratings, SLE_UINT16, 104, SL_MAX_VERSION),
SLE_CONDARR(Town, ratings, SLE_INT16, 8, 0, 103),
SLE_CONDARR(Town, ratings, SLE_INT16, MAX_COMPANIES, 104, SL_MAX_VERSION),
SLE_CONDNULL_X(MAX_COMPANIES, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
/* failed bribe attempts are stored since savegame format 4 */
SLE_CONDARR(Town, unwanted, SLE_INT8, 8, 4, 103),
SLE_CONDARR(Town, unwanted, SLE_INT8, MAX_COMPANIES, 104, SL_MAX_VERSION),
@ -217,6 +218,15 @@ static const SaveLoad _town_received_desc[] = {
SLE_END()
};
static const SaveLoad _town_received_desc_spp[] = {
SLE_CONDVAR(TransportedCargoStat<uint16>, old_max, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION),
SLE_CONDVAR(TransportedCargoStat<uint16>, new_max, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION),
SLE_CONDVAR(TransportedCargoStat<uint16>, old_act, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION),
SLE_CONDVAR(TransportedCargoStat<uint16>, new_act, SLE_FILE_U32 | SLE_VAR_U16, 165, SL_MAX_VERSION),
SLE_END()
};
static void Save_HIDS()
{
Save_NewGRFMapping(_house_mngr);
@ -247,8 +257,14 @@ static void RealSave_Town(Town *t)
for (CargoID i = 0; i < NUM_CARGO; i++) {
SlObject(&t->supplied[i], _town_supplied_desc);
}
for (int i = TE_BEGIN; i < NUM_TE; i++) {
SlObject(&t->received[i], _town_received_desc);
if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) {
for (int i = TE_BEGIN; i < NUM_TE; i++) {
SlObject(&t->received[i], _town_received_desc_spp);
}
} else {
for (int i = TE_BEGIN; i < NUM_TE; i++) {
SlObject(&t->received[i], _town_received_desc);
}
}
if (IsSavegameVersionBefore(166)) return;
@ -281,8 +297,14 @@ static void Load_TOWN()
for (CargoID i = 0; i < NUM_CARGO; i++) {
SlObject(&t->supplied[i], _town_supplied_desc);
}
for (int i = TE_BEGIN; i < TE_END; i++) {
SlObject(&t->received[i], _town_received_desc);
if (SlXvIsFeaturePresent(XSLFI_SPRINGPP)) {
for (int i = TE_BEGIN; i < NUM_TE; i++) {
SlObject(&t->received[i], _town_received_desc_spp);
}
} else {
for (int i = TE_BEGIN; i < NUM_TE; i++) {
SlObject(&t->received[i], _town_received_desc);
}
}
if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GB(t->townnametype, 11, 5) != 15) {

@ -726,10 +726,16 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_CONDVAR(Vehicle, current_order_time, SLE_UINT32, 67, SL_MAX_VERSION),
SLE_CONDVAR_X(Vehicle, current_loading_time, SLE_UINT32, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_AUTO_TIMETABLE)),
SLE_CONDNULL_X(4, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDVAR(Vehicle, lateness_counter, SLE_INT32, 67, SL_MAX_VERSION),
SLE_CONDNULL(10, 2, 143), // old reserved space
SLE_CONDNULL_X((8 + 8 + 2 + 2 + 4 + 4 + 1 + 1) * 30, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDNULL_X(1, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDNULL_X(2, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_END()
};
@ -813,6 +819,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_VAR(Vehicle, subtype, SLE_UINT8),
SLE_CONDNULL_X(5, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDVAR(Vehicle, tile, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
SLE_CONDVAR(Vehicle, tile, SLE_UINT32, 6, SL_MAX_VERSION),
@ -872,6 +880,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_CONDVAR(DisasterVehicle, image_override, SLE_UINT32, 191, SL_MAX_VERSION),
SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_FILE_U16 | SLE_VAR_U32, 0, 190),
SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_UINT32, 191, SL_MAX_VERSION),
SLE_CONDNULL_X(2, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)),
SLE_CONDVAR(DisasterVehicle, flags, SLE_UINT8, 194, SL_MAX_VERSION),
SLE_CONDNULL(16, 2, 143), // old reserved space

@ -335,6 +335,24 @@ min = 0
max = 3
cat = SC_BASIC
[SDT_BOOL]
base = GameSettings
var = order.timetable_automated
def = true
str = STR_CONFIG_SETTING_TIMETABLE_AUTOMATED
strhelp = STR_CONFIG_SETTING_TIMETABLE_AUTOMATED_HELPTEXT
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_BOOL]
base = GameSettings
var = order.timetable_separation
def = true
str = STR_CONFIG_SETTING_TIMETABLE_SEPARATION
strhelp = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_HELPTEXT
cat = SC_EXPERT
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_BOOL]
base = GameSettings
var = order.timetable_automated
@ -420,6 +438,7 @@ strhelp = STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT
strval = STR_JUST_INT
proc = ChangeMaxHeightLevel
cat = SC_BASIC
extver = SlXvFeatureTest(XSLFTO_OR, XSLFI_HEIGHT_8_BIT)
[SDT_BOOL]
base = GameSettings
@ -582,7 +601,12 @@ from = 0
cat = SC_BASIC
patxname = ""signal_tunnel_bridge.construction.simulated_wormhole_signals""
# construction.longbridges
;; construction.maximum_signal_evaluations
[SDT_NULL]
length = 2
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; construction.longbridges
[SDT_NULL]
length = 1
to = 158
@ -624,6 +648,16 @@ strhelp = STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT
strval = STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT
proc = TownFoundingChanged
;; economy.town_construction_cost
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.station_rating_type
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_BOOL]
base = GameSettings
var = economy.allow_town_roads
@ -633,6 +667,11 @@ def = true
str = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS
strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT
;; economy.town_cargo_factor
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = economy.found_town
@ -1006,6 +1045,11 @@ def = false
str = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES
strhelp = STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT
;; vehicle.exact_intro_date
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = vehicle.max_trains
@ -1147,6 +1191,11 @@ strhelp = STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT
strval = STR_JUST_COMMA
proc = UpdateConsists
;; vehicle.freight_mult_to_passengers
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
; order.timetabling
[SDT_NULL]
length = 1
@ -1198,6 +1247,11 @@ def = false
str = STR_CONFIG_SETTING_IMPROVED_BREAKDOWNS
patxname = ""improved_breakdowns.vehicle.improved_breakdowns""
;; vehicle.improved_breakdowns
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
; station.join_stations
[SDT_NULL]
length = 1
@ -1222,6 +1276,12 @@ var = order.selectgoods
def = true
cat = SC_EXPERT
;; economy.deliver_goods
;; vehicle.cargo_wait_time
[SDT_NULL]
length = 2
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDTC_BOOL]
var = gui.sg_new_nonstop
from = 22
@ -1315,6 +1375,16 @@ str = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS
strhelp = STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT
proc = DeleteSelectStationWindow
;; construction.traffic_lights
;; construction.towns_build_traffic_lights
;; construction.allow_building_tls_in_towns
;; construction.traffic_lights_green_phase
;; construction.max_tlc_size
;; construction.max_tlc_distance
[SDT_NULL]
length = 6
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
##
[SDT_BOOL]
base = GameSettings
@ -1376,6 +1446,13 @@ strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT
length = 1
to = 140
;; economy.minimum_distance_town
;; economy.minimum_distance_industry
;; economy.minimum_distance_ind_town
[SDT_NULL]
length = 6
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_BOOL]
base = GameSettings
var = economy.bribe
@ -1487,6 +1564,53 @@ strhelp = STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT
strval = STR_CONFIG_SETTING_PERCENTAGE
cat = SC_EXPERT
;; economy.day_length_factor
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.price_mult[0-70]
[SDT_NULL]
length = 71
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.price_rails[0-15]
[SDT_NULL]
length = 16
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.rail_maintenance[0-15]
[SDT_NULL]
length = 16
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.pay_for_repair
;; economy.repair_cost
;; economy.town_consumption_rate
[SDT_NULL]
length = 3
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.town_pop_*
[SDT_NULL]
length = 6
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.town_consumption_rates[0-2][0-2]
[SDT_NULL]
length = 18
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.town_effects[0-2]
[SDT_NULL]
length = 3
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.grow_if_one_delivered
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = economy.town_growth_rate
@ -1534,6 +1658,21 @@ from = 77
def = true
cat = SC_EXPERT
;; economy.infrastructure_sharing[0-3]
[SDT_NULL]
length = 4
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.sharing_fee[0-3]
[SDT_NULL]
length = 16
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
;; economy.sharing_payment_in_debt
[SDT_NULL]
length = 1
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = construction.maximum_signal_evaluations
@ -1991,6 +2130,11 @@ min = 0
max = 100000
cat = SC_EXPERT
# pf.npf.npf_road_trafficlight_penalty
[SDT_NULL]
length = 4
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = pf.npf.npf_road_dt_occupied_penalty
@ -2296,6 +2440,11 @@ min = 0
max = 1000000
cat = SC_EXPERT
# pf.yapf.road_trafficlight_penalty
[SDT_NULL]
length = 4
extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)
[SDT_VAR]
base = GameSettings
var = pf.yapf.road_stop_penalty

Loading…
Cancel
Save