diff --git a/src/cargopacket.h b/src/cargopacket.h index 16438dddef..ece7a08a5a 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -202,6 +202,7 @@ public: static void InvalidateAllFrom(SourceType src_type, SourceID src); static void InvalidateAllFrom(StationID sid); static void AfterLoad(); + static void PostVehiclesAfterLoad(); static bool ValidateDeferredCargoPayments(); }; @@ -586,6 +587,11 @@ public: uint Truncate(uint max_move = UINT_MAX, StationCargoAmountMap *cargo_per_source = nullptr); uint Reroute(uint max_move, StationCargoList *dest, StationID avoid, StationID avoid2, const GoodsEntry *ge); + void AfterLoadIncreaseReservationCount(uint count) + { + this->reserved_count += count; + } + /** * Are two the two CargoPackets mergeable in the context of * a list of CargoPackets for a Vehicle? diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a026fd6120..2a33225270 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -794,7 +794,7 @@ bool AfterLoadGame() /* The value of _date_fract got divided, so make sure that old games are converted correctly. */ if (IsSavegameVersionBefore(SLV_11, 1) || (IsSavegameVersionBefore(SLV_147) && _date_fract > DAY_TICKS)) _date_fract /= 885; - if (SlXvIsFeaturePresent(XSLFI_SPRINGPP) || SlXvIsFeaturePresent(XSLFI_JOKERPP)) { + if (SlXvIsFeaturePresent(XSLFI_SPRINGPP) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP)) { assert(_settings_game.economy.day_length_factor >= 1); _tick_skip_counter = _date_fract % _settings_game.economy.day_length_factor; _date_fract /= _settings_game.economy.day_length_factor; @@ -803,7 +803,7 @@ bool AfterLoadGame() } /* Set day length factor to 1 if loading a pre day length savegame */ - if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH) && SlXvIsFeatureMissing(XSLFI_SPRINGPP) && SlXvIsFeatureMissing(XSLFI_JOKERPP)) { + if (SlXvIsFeatureMissing(XSLFI_VARIABLE_DAY_LENGTH) && SlXvIsFeatureMissing(XSLFI_SPRINGPP) && SlXvIsFeatureMissing(XSLFI_JOKERPP) && SlXvIsFeatureMissing(XSLFI_CHILLPP)) { _settings_game.economy.day_length_factor = 1; } @@ -945,6 +945,8 @@ bool AfterLoadGame() /* Update all vehicles */ AfterLoadVehicles(true); + CargoPacket::PostVehiclesAfterLoad(); + /* Update template vehicles */ AfterLoadTemplateVehicles(); @@ -3333,6 +3335,16 @@ bool AfterLoadGame() } } + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + // re-arrange vehicle_flags + Vehicle *v; + FOR_ALL_VEHICLES(v) { + SB(v->vehicle_flags, VF_AUTOMATE_TIMETABLE, 1, GB(v->vehicle_flags, 7, 1)); + SB(v->vehicle_flags, VF_PATHFINDER_LOST, 1, GB(v->vehicle_flags, 8, 1)); + SB(v->vehicle_flags, VF_SERVINT_IS_CUSTOM, 7, 0); + } + } + if (IsSavegameVersionBefore(SLV_188)) { /* Fix articulated road vehicles. * Some curves were shorter than other curves. @@ -3437,6 +3449,14 @@ bool AfterLoadGame() _jokerpp_auto_separation.clear(); _jokerpp_non_auto_separation.clear(); } + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + for (TileIndex t = 0; t < map_size; t++) { + if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) { + if (GetSignalType(t, TRACK_LOWER) == 7) SetSignalType(t, TRACK_LOWER, SIGTYPE_NORMAL); + if (GetSignalType(t, TRACK_UPPER) == 7) SetSignalType(t, TRACK_UPPER, SIGTYPE_NORMAL); + } + } + } /* * Only keep order-backups for network clients (and when replaying). diff --git a/src/saveload/cargopacket_sl.cpp b/src/saveload/cargopacket_sl.cpp index 9117f9e14f..2983d1501c 100644 --- a/src/saveload/cargopacket_sl.cpp +++ b/src/saveload/cargopacket_sl.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../vehicle_base.h" #include "../station_base.h" +#include "../scope_info.h" #include "../3rdparty/cpp-btree/btree_map.h" #include "saveload.h" @@ -87,6 +88,27 @@ extern btree::btree_map _cargo_packet_deferred_payments; } } +/** + * Savegame conversion for cargopackets. + */ +/* static */ void CargoPacket::PostVehiclesAfterLoad() +{ + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + extern std::map _veh_cpp_packets; + for (auto &iter : _veh_cpp_packets) { + if (iter.second.empty()) continue; + Vehicle *v = Vehicle::Get(iter.first); + Station *st = Station::Get(v->First()->last_station_visited); + assert_msg(st != nullptr, "%s", scope_dumper().VehicleInfo(v)); + for (CargoPacket *cp : iter.second) { + st->goods[v->cargo_type].cargo.AfterLoadIncreaseReservationCount(cp->count); + v->cargo.Append(cp, VehicleCargoList::MTA_LOAD); + } + } + _veh_cpp_packets.clear(); + } +} + /** * Wrapper function to get the CargoPacket's internal structure while * some of the variables itself are private. diff --git a/src/saveload/economy_sl.cpp b/src/saveload/economy_sl.cpp index f69dd6d554..b410fc5116 100644 --- a/src/saveload/economy_sl.cpp +++ b/src/saveload/economy_sl.cpp @@ -67,7 +67,7 @@ static const SaveLoad _cargopayment_desc[] = { SLE_REF(CargoPayment, front, REF_VEHICLE), SLE_VAR(CargoPayment, route_profit, SLE_INT64), SLE_VAR(CargoPayment, visual_profit, SLE_INT64), - SLE_CONDVAR(CargoPayment, visual_transfer, SLE_INT64, SLV_181, SL_MAX_VERSION), + SLE_CONDVAR_X(CargoPayment, visual_transfer, SLE_INT64, SLV_181, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_CHILLPP)), SLE_END() }; diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 9fb7956b5b..d23116ffc3 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -256,6 +256,23 @@ bool SlXvCheckSpecialSavegameVersions() _sl_is_faked_ext = true; return true; } + if (_sl_version >= SL_CHILLPP_232 && _sl_version <= SL_CHILLPP_233) { /* 232 - 233 */ + DEBUG(sl, 1, "Loading a ChillPP v14.7 savegame version %d as version 160", _sl_version); + _sl_xv_feature_versions[XSLFI_CHILLPP] = _sl_version; + _sl_xv_feature_versions[XSLFI_ZPOS_32_BIT] = 1; + _sl_xv_feature_versions[XSLFI_TOWN_CARGO_ADJ] = 1; + _sl_xv_feature_versions[XSLFI_TRAFFIC_LIGHTS] = 1; + _sl_xv_feature_versions[XSLFI_IMPROVED_BREAKDOWNS] = 1; + _sl_xv_feature_versions[XSLFI_INFRA_SHARING] = 1; + _sl_xv_feature_versions[XSLFI_AUTO_TIMETABLE] = 1; + _sl_xv_feature_versions[XSLFI_SIG_TUNNEL_BRIDGE] = 1; + _sl_xv_feature_versions[XSLFI_RAIL_AGEING] = 1; + _sl_xv_discardable_chunk_ids.push_back('LGRP'); + _sl_xv_discardable_chunk_ids.push_back('SSIG'); + _sl_version = SLV_160; + _sl_is_faked_ext = true; + return true; + } return false; } diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 2b1ee2db03..f2b9dfcb00 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -80,11 +80,13 @@ enum SlXvFeatureIndex { 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_ZPOS_32_BIT, ///< Vehicle/sign z_pos is 32 bit instead of 8 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_TRAFFIC_LIGHTS, ///< This save game uses road traffic lights XSLFI_RAIL_AGEING, ///< This save game uses the rail aging patch XSLFI_SPRINGPP, ///< This is a SpringPP game, use this for loading some settings XSLFI_JOKERPP, ///< This is a JokerPP game, use this for loading some settings + XSLFI_CHILLPP, ///< This is a ChillPP game, use this for loading some settings XSLFI_SIZE, ///< Total count of features, including null feature }; diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp index 9e15b918bb..e9f4ebecc3 100644 --- a/src/saveload/map_sl.cpp +++ b/src/saveload/map_sl.cpp @@ -67,6 +67,20 @@ static void Load_MAPT() static void Load_MAPH() { + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + if (SlGetFieldLength() != 0) { + _sl_xv_feature_versions[XSLFI_HEIGHT_8_BIT] = 2; + std::array buf; + TileIndex size = MapSize(); + + for (TileIndex i = 0; i != size;) { + SlArray(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT16); + for (uint j = 0; j != MAP_SL_BUF_SIZE; j++) _m[i++].height = buf[j]; + } + } + return; + } + std::array buf; TileIndex size = MapSize(); diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index ed3a1b065f..2f4d983fb7 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -328,6 +328,8 @@ enum SaveLoadVersion : uint16 { SL_JOKER_1_25 = 284, SL_JOKER_1_26 = 285, SL_JOKER_1_27 = 286, + SL_CHILLPP_232 = 232, + SL_CHILLPP_233 = 233, }; /** Save or load result codes. */ diff --git a/src/saveload/signs_sl.cpp b/src/saveload/signs_sl.cpp index 33be36d9c7..f4b4123261 100644 --- a/src/saveload/signs_sl.cpp +++ b/src/saveload/signs_sl.cpp @@ -24,8 +24,8 @@ static const SaveLoad _sign_desc[] = { SLE_CONDVAR(Sign, x, SLE_INT32, SLV_5, SL_MAX_VERSION), SLE_CONDVAR(Sign, y, SLE_INT32, SLV_5, SL_MAX_VERSION), SLE_CONDVAR(Sign, owner, SLE_UINT8, SLV_6, SL_MAX_VERSION), - SLE_CONDVAR(Sign, z, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164), - SLE_CONDVAR(Sign, z, SLE_INT32, SLV_164, SL_MAX_VERSION), + SLE_CONDVAR_X(Sign, z, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164, SlXvFeatureTest(XSLFTO_AND, XSLFI_ZPOS_32_BIT, 0, 0)), + SLE_CONDVAR_X(Sign, z, SLE_INT32, SLV_164, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_ZPOS_32_BIT)), SLE_END() }; diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 1ce33db9ec..5675930e3b 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -286,8 +286,8 @@ const SaveLoad *GetGoodsDesc() SLEG_CONDVAR( _cargo_feeder_share, SLE_FILE_U32 | SLE_VAR_I64, SLV_14, SLV_65), SLEG_CONDVAR( _cargo_feeder_share, SLE_INT64, SLV_65, SLV_68), SLE_CONDVAR(GoodsEntry, amount_fract, SLE_UINT8, SLV_150, SL_MAX_VERSION), - SLEG_CONDPTRDEQ( _packets, REF_CARGO_PACKET, SLV_68, SLV_183), - SLEG_CONDVAR( _num_dests, SLE_UINT32, SLV_183, SL_MAX_VERSION), + SLEG_CONDPTRDEQ_X( _packets, REF_CARGO_PACKET, SLV_68, SLV_183, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, 0, 0)), + SLEG_CONDVAR_X( _num_dests, SLE_UINT32, SLV_183, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_CHILLPP)), SLE_CONDVAR(GoodsEntry, cargo.reserved_count, SLE_UINT, SLV_181, SL_MAX_VERSION), SLE_CONDVAR(GoodsEntry, link_graph, SLE_UINT16, SLV_183, SL_MAX_VERSION), SLE_CONDVAR(GoodsEntry, node, SLE_UINT16, SLV_183, SL_MAX_VERSION), @@ -623,7 +623,7 @@ static void Load_STNN() } fs->SetRawFlags(SlReadUint16()); } - } else { + } else if (SlXvIsFeatureMissing(XSLFI_CHILLPP)) { FlowSaveLoad flow; FlowStat *fs = nullptr; for (uint32 j = 0; j < _num_flows; ++j) { @@ -642,9 +642,18 @@ static void Load_STNN() prev_source = flow.source; } } - if (IsSavegameVersionBefore(SLV_183)) { + if (IsSavegameVersionBefore(SLV_183) && SlXvIsFeatureMissing(XSLFI_CHILLPP)) { SwapPackets(&st->goods[i]); } else { + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + SlSkipBytes(8); + uint num_links = SlReadUint16(); + uint num_flows = SlReadUint32(); + SlSkipBytes(6); + SlSkipBytes(18 * num_links); + SlSkipBytes(16 * num_flows); + } + StationCargoPair pair; for (uint j = 0; j < _num_dests; ++j) { SlObjectLoadFiltered(&pair, _cargo_list_desc); // _cargo_list_desc has no conditionals @@ -682,7 +691,7 @@ static void Ptrs_STNN() FOR_ALL_STATIONS(st) { for (CargoID i = 0; i < num_cargo; i++) { GoodsEntry *ge = &st->goods[i]; - if (IsSavegameVersionBefore(SLV_183)) { + if (IsSavegameVersionBefore(SLV_183) && SlXvIsFeatureMissing(XSLFI_CHILLPP)) { SwapPackets(ge); SlObjectPtrOrNullFiltered(ge, _filtered_goods_desc.data()); SwapPackets(ge); diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 6246950b8b..b34dfe2096 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -160,21 +160,32 @@ static const SaveLoad _town_desc[] = { SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), SLE_CONDVAR(Town, supplied[CT_MAIL].new_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_max, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_MAIL].old_max, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_max, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_MAIL].new_max, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_act, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_MAIL].old_act, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_act, SLE_UINT32, SLV_9, SLV_165), + SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, supplied[CT_MAIL].new_act, SLE_UINT32, SLV_9, SLV_165), SLE_CONDNULL(2, SL_MIN_VERSION, SLV_164), ///< pct_pass_transported / pct_mail_transported, now computed on the fly + SLE_CONDNULL_X(3, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, received[TE_FOOD].old_act, SLE_UINT16, SL_MIN_VERSION, SLV_165), SLE_CONDVAR(Town, received[TE_WATER].old_act, SLE_UINT16, SL_MIN_VERSION, SLV_165), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, received[TE_FOOD].new_act, SLE_UINT16, SL_MIN_VERSION, SLV_165), SLE_CONDVAR(Town, received[TE_WATER].new_act, SLE_UINT16, SL_MIN_VERSION, SLV_165), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDARR(Town, goal, SLE_UINT32, NUM_TE, SLV_165, SL_MAX_VERSION), @@ -197,6 +208,7 @@ static const SaveLoad _town_desc[] = { SLE_VAR(Town, road_build_months, SLE_UINT8), SLE_CONDVAR(Town, exclusivity, SLE_UINT8, SLV_2, SL_MAX_VERSION), + SLE_CONDNULL_X(1, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Town, exclusive_counter, SLE_UINT8, SLV_2, SL_MAX_VERSION), SLE_CONDVAR(Town, larger_town, SLE_BOOL, SLV_56, SL_MAX_VERSION), diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 34846c3fc3..fd7f45c274 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -607,6 +607,8 @@ static uint16 _cargo_count; static uint16 _cargo_paid_for; static Money _cargo_feeder_share; static uint32 _cargo_loaded_at_xy; +CargoPacketList _cpp_packets; +std::map _veh_cpp_packets; /** * Make it possible to make the saveload tables "friends" of other classes. @@ -634,8 +636,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, x_pos, SLE_UINT32, SLV_6, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, y_pos, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_6), SLE_CONDVAR(Vehicle, y_pos, SLE_UINT32, SLV_6, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164), - SLE_CONDVAR(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164, SlXvFeatureTest(XSLFTO_AND, XSLFI_ZPOS_32_BIT, 0, 0)), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_ZPOS_32_BIT)), SLE_VAR(Vehicle, direction, SLE_UINT8), SLE_CONDNULL(2, SL_MIN_VERSION, SLV_58), @@ -652,7 +654,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, vehstatus, SLE_UINT8), SLE_CONDVAR(Vehicle, last_station_visited, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_5), SLE_CONDVAR(Vehicle, last_station_visited, SLE_UINT16, SLV_5, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, last_loading_station, SLE_UINT16, SLV_182, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, last_loading_station, SLE_UINT16, SLV_182, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_CHILLPP)), SLE_VAR(Vehicle, cargo_type, SLE_UINT8), SLE_CONDVAR(Vehicle, cargo_subtype, SLE_UINT8, SLV_35, SL_MAX_VERSION), @@ -664,16 +666,17 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, refit_cap, SLE_UINT16, SLV_182, SL_MAX_VERSION), SLEG_CONDVAR( _cargo_count, SLE_UINT16, SL_MIN_VERSION, SLV_68), SLE_CONDPTRDEQ(Vehicle, cargo.packets, REF_CARGO_PACKET, SLV_68, SL_MAX_VERSION), + SLEG_CONDPTRDEQ_X( _cpp_packets, REF_CARGO_PACKET, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDARR(Vehicle, cargo.action_counts, SLE_UINT, VehicleCargoList::NUM_MOVE_TO_ACTION, SLV_181, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, cargo_age_counter, SLE_UINT16, SLV_162, SL_MAX_VERSION), SLE_VAR(Vehicle, day_counter, SLE_UINT8), SLE_VAR(Vehicle, tick_counter, SLE_UINT8), SLE_CONDVAR_X(Vehicle, running_ticks, SLE_FILE_U8 | SLE_VAR_U16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && !(SlXvIsFeaturePresent(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + return version_in_range && !(SlXvIsFeaturePresent(XSLFI_SPRINGPP, 3) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); })), SLE_CONDVAR_X(Vehicle, running_ticks, SLE_UINT16, SLV_88, SL_MAX_VERSION, SlXvFeatureTest([](uint16 version, bool version_in_range) -> bool { - return version_in_range && (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); + return version_in_range && (SlXvIsFeaturePresent(XSLFI_SPRINGPP, 2) || SlXvIsFeaturePresent(XSLFI_JOKERPP) || SlXvIsFeaturePresent(XSLFI_CHILLPP) || SlXvIsFeaturePresent(XSLFI_VARIABLE_DAY_LENGTH, 2)); })), SLE_VAR(Vehicle, cur_implicit_order_index, SLE_UINT8), @@ -797,6 +800,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDNULL(2, SLV_2, SLV_20), SLE_CONDVAR(Train, gv_flags, SLE_UINT16, SLV_139, SL_MAX_VERSION), + SLE_CONDNULL_X(2 , SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDNULL(11, SLV_2, SLV_144), // old reserved space SLE_CONDVAR_X(Train, reverse_distance, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_REVERSE_AT_WAYPOINT)), SLE_CONDVAR_X(Train, speed_restriction, SLE_UINT16, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPEED_RESTRICTION)), @@ -856,6 +860,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Aircraft, last_direction, SLE_UINT8, SLV_2, SL_MAX_VERSION), SLE_CONDVAR(Aircraft, number_consecutive_turns, SLE_UINT8, SLV_2, SL_MAX_VERSION), SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(Aircraft, turn_counter, SLE_UINT8, SLV_136, SL_MAX_VERSION), SLE_CONDVAR(Aircraft, flags, SLE_UINT8, SLV_167, SL_MAX_VERSION), @@ -879,8 +884,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, x_pos, SLE_INT32, SLV_6, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, y_pos, SLE_FILE_I16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_6), SLE_CONDVAR(Vehicle, y_pos, SLE_INT32, SLV_6, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164), - SLE_CONDVAR(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164, SlXvFeatureTest(XSLFTO_AND, XSLFI_ZPOS_32_BIT, 0, 0)), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_ZPOS_32_BIT)), SLE_VAR(Vehicle, sprite_seq.seq[0].sprite, SLE_FILE_U16 | SLE_VAR_U32), SLE_CONDNULL(5, SL_MIN_VERSION, SLV_59), @@ -912,8 +917,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(Vehicle, x_pos, SLE_INT32, SLV_6, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, y_pos, SLE_FILE_I16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_6), SLE_CONDVAR(Vehicle, y_pos, SLE_INT32, SLV_6, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164), - SLE_CONDVAR(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_FILE_U8 | SLE_VAR_I32, SL_MIN_VERSION, SLV_164, SlXvFeatureTest(XSLFTO_AND, XSLFI_ZPOS_32_BIT, 0, 0)), + SLE_CONDVAR_X(Vehicle, z_pos, SLE_INT32, SLV_164, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_OR, XSLFI_ZPOS_32_BIT)), SLE_VAR(Vehicle, direction, SLE_UINT8), SLE_CONDNULL(5, SL_MIN_VERSION, SLV_58), @@ -932,6 +937,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_191), SLE_CONDVAR(DisasterVehicle, big_ufo_destroyer_target, SLE_UINT32, SLV_191, SL_MAX_VERSION), SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP)), + SLE_CONDNULL_X(2, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP)), SLE_CONDVAR(DisasterVehicle, flags, SLE_UINT8, SLV_194, SL_MAX_VERSION), SLE_CONDNULL(16, SLV_2, SLV_144), // old reserved space @@ -1002,6 +1008,9 @@ void Load_VEHS() _cargo_count = 0; + _cpp_packets.clear(); + _veh_cpp_packets.clear(); + while ((index = SlIterateArray()) != -1) { Vehicle *v; VehicleType vtype = (VehicleType)SlReadByte(); @@ -1030,7 +1039,7 @@ void Load_VEHS() v->last_station_visited = INVALID_STATION; } - if (IsSavegameVersionBefore(SLV_182)) v->last_loading_station = INVALID_STATION; + if (IsSavegameVersionBefore(SLV_182) && !SlXvIsFeaturePresent(XSLFI_CHILLPP)) v->last_loading_station = INVALID_STATION; if (IsSavegameVersionBefore(SLV_5)) { /* Convert the current_order.type (which is a mix of type and flags, because @@ -1041,6 +1050,11 @@ void Load_VEHS() /* Advanced vehicle lists got added */ if (IsSavegameVersionBefore(SLV_60)) v->group_id = DEFAULT_GROUP; + + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) { + _veh_cpp_packets[index] = std::move(_cpp_packets); + _cpp_packets.clear(); + } } } @@ -1050,7 +1064,9 @@ static void Ptrs_VEHS() Vehicle *v; FOR_ALL_VEHICLES(v) { + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) _cpp_packets = std::move(_veh_cpp_packets[v->index]); SlObjectPtrOrNullFiltered(v, GetVehicleDescriptionFiltered(v->type)); + if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) _veh_cpp_packets[v->index] = std::move(_cpp_packets); } } diff --git a/src/table/gameopt_settings.ini b/src/table/gameopt_settings.ini index 0233372e25..6cd3c05751 100644 --- a/src/table/gameopt_settings.ini +++ b/src/table/gameopt_settings.ini @@ -144,6 +144,11 @@ full = _climates load = ConvertLandscape cat = SC_BASIC +;;game_creation.snow_line_height high +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = game_creation.snow_line_height @@ -158,6 +163,11 @@ to = SLV_22 length = 2 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) +;;game_creation.desert_amount + tree_line +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_NULL] length = 1 from = SLV_22 diff --git a/src/table/settings.ini b/src/table/settings.ini index 5cc18f2def..ed6b6c6cb2 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -437,12 +437,22 @@ strhelp = STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT strval = STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE cat = SC_BASIC +; Snow line upper byte +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + ; Snow line (or snow_line_height * TILE_HEIGHT) [SDT_NULL] length = 1 from = SLV_97 to = SLV_164 +;;game_creation.desert_amount + tree_line +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_OMANY] base = GameSettings var = vehicle.road_side @@ -474,7 +484,12 @@ strhelp = STR_CONFIG_SETTING_MAX_HEIGHTLEVEL_HELPTEXT strval = STR_JUST_INT proc = ChangeMaxHeightLevel cat = SC_BASIC -extver = SlXvFeatureTest(XSLFTO_OR, XSLFI_HEIGHT_8_BIT) +extver = SlXvFeatureTest(XSLFTO_OR, XSLFI_HEIGHT_8_BIT, 1, 1) + +;; construction.allow_more_heightlevels +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) [SDT_BOOL] base = GameSettings @@ -670,6 +685,11 @@ str = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH strhelp = STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT strval = STR_CONFIG_SETTING_TILE_LENGTH +;; construction.max_chunnel_exit_length +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP, SL_CHILLPP_233) + [SDT_BOOL] base = GameSettings var = construction.chunnel @@ -771,6 +791,10 @@ strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT xref = ""economy.old_town_cargo_factor"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +[SDT_XREF] +xref = ""economy.day_length_factor"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = economy.found_town @@ -796,6 +820,10 @@ def = true str = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS strhelp = STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT +[SDT_XREF] +xref = ""economy.old_town_cargo_factor"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = economy.town_cargogen_mode @@ -1180,6 +1208,11 @@ cat = SC_EXPERT length = 1 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) +;; pf.back_of_one_way_pbs_waiting_point +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = vehicle.max_train_length @@ -1217,6 +1250,11 @@ strval = STR_CONFIG_SETTING_NONE length = 1 to = SLV_159 +;; order.gotodepot +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + ; path finder [SDT_BOOL] @@ -1472,12 +1510,22 @@ proc = UpdateConsists length = 1 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +;; ticks_per_minute +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + ; order.timetabling [SDT_NULL] length = 1 from = SLV_67 to = SLV_159 +;; order.timetabling, order.timetable_automated, order.timetable_separation +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = vehicle.plane_speed @@ -1519,6 +1567,10 @@ cat = SC_BASIC xref = ""vehicle.improved_breakdowns"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +[SDT_XREF] +xref = ""vehicle.improved_breakdowns"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_BOOL] base = GameSettings var = vehicle.improved_breakdowns @@ -1885,6 +1937,11 @@ strhelp = STR_CONFIG_SETTING_MULTIPINDTOWN_HELPTEXT length = 1 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 4) +;; construction.extra_industry_placement_logic +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_NULL] length = 1 to = SLV_141 @@ -1949,6 +2006,11 @@ cat = SC_BASIC length = 1 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_JOKERPP) +; Snow line upper byte +[SDT_NULL] +length = 1 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = game_creation.snow_line_height @@ -1962,6 +2024,11 @@ strhelp = STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT strval = STR_JUST_COMMA cat = SC_BASIC +;;game_creation.desert_amount + tree_line +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + ;;game_creation.desert_amount [SDT_NULL] length = 1 @@ -2148,6 +2215,11 @@ str = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER strhelp = STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT strval = STR_JUST_COMMA +;; economy.town_growth_cargo, economy.town_pop_need_goods, economy.larger_town_growth_cargo, economy.larger_town_pop_need_goods +[SDT_NULL] +length = 10 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_BOOL] base = GameSettings var = economy.mod_road_rebuild @@ -2155,6 +2227,10 @@ from = SLV_77 def = true cat = SC_EXPERT +[SDT_XREF] +xref = ""construction.maximum_signal_evaluations"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = economy.town_min_distance @@ -2208,6 +2284,42 @@ extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) xref = ""economy.sharing_payment_in_debt"" extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +[SDT_XREF] +xref = ""economy.infrastructure_sharing[0]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[1]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[2]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.infrastructure_sharing[3]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[0]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[1]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[2]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.sharing_fee[3]"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +[SDT_XREF] +xref = ""economy.sharing_payment_in_debt"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = construction.maximum_signal_evaluations @@ -2498,6 +2610,16 @@ strhelp = STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT proc = InvalidateCompanyInfrastructureWindow cat = SC_BASIC +[SDT_XREF] +xref = ""economy.infrastructure_maintenance"" +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + +;; construction.traffic_lights... +;; linkgraph... +[SDT_NULL] +length = 18 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = economy.random_road_reconstruction @@ -2689,6 +2811,11 @@ cat = SC_EXPERT length = 4 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +# pf.npf.npf_road_trafficlight_penalty +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = pf.npf.npf_road_dt_occupied_penalty @@ -2999,6 +3126,11 @@ cat = SC_EXPERT length = 4 extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP) +# pf.yapf.road_trafficlight_penalty +[SDT_NULL] +length = 4 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_VAR] base = GameSettings var = pf.yapf.road_stop_penalty @@ -3246,6 +3378,11 @@ strhelp = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT strval = STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NONE cat = SC_BASIC +;; construction.tree_placement_drag_limit, construction.ingame_tree_line_height, construction.tree_growth_rate +[SDT_NULL] +length = 3 +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_CHILLPP) + [SDT_BOOL] base = GameSettings var = construction.trees_around_snow_line_enabled