From 7537ae2a7e81b4659d423e8246c57550867cac20 Mon Sep 17 00:00:00 2001 From: patch-import Date: Tue, 4 Aug 2015 23:38:31 +0100 Subject: [PATCH 1/3] Import vehicle repair costs patch Strip trailing whitespace http://www.tt-forums.net/viewtopic.php?p=1093268#p1093268 --- src/lang/english.txt | 5 +++++ src/lang/russian.txt | 5 +++++ src/saveload/saveload.cpp | 2 +- src/saveload/saveload.h | 1 + src/saveload/vehicle_sl.cpp | 19 +++++++++++++++++++ src/settings_gui.cpp | 2 ++ src/settings_type.h | 2 ++ src/table/settings.ini | 23 +++++++++++++++++++++++ src/vehicle.cpp | 30 ++++++++++++++++++++++++++++++ src/vehicle_base.h | 1 + src/vehicle_cmd.cpp | 1 + 11 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index cfad971ff5..7d19157a38 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1663,6 +1663,11 @@ STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Allow trains to STR_CONFIG_SETTING_QUERY_CAPTION :{WHITE}Change setting value +STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE :Pay for repairing vehicle: {STRING2} +STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE_HELPTEXT :Pay for repairing vehicle +STR_CONFIG_SETTING_REPAIR_COST :Cost of repairing vehicle: 1/{STRING2} of total cost +STR_CONFIG_SETTING_REPAIR_COST_HELPTEXT :Cost of repairing vehicle + # Config errors STR_CONFIG_ERROR :{WHITE}Error with the configuration file... STR_CONFIG_ERROR_ARRAY :{WHITE}... error in array '{RAW_STRING}' diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 9b8aa42480..9738f79c74 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -5098,3 +5098,8 @@ STR_PLANE :{BLACK}{PLANE} STR_SHIP :{BLACK}{SHIP} STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY}) + +STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE :Взымать плату за починку тс: {STRING} +STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE_HELPTEXT :Если включено, в депо бужет взыматься плата за ремонт каждой поломки транспортного средства +STR_CONFIG_SETTING_REPAIR_COST :Стоимость ремонта: 1/{STRING} полной стоимости тс +STR_CONFIG_SETTING_REPAIR_COST_HELPTEXT :Стоимость ремонта одной поломки транспортного средства diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 8f58ea3816..d85b0dd6c9 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -252,7 +252,7 @@ * 184 25508 * 185 25620 */ -extern const uint16 SAVEGAME_VERSION = 185; ///< Current savegame version of OpenTTD. +extern const uint16 SAVEGAME_VERSION = SL_REPAIRCOST; ///< Current savegame version of OpenTTD. SavegameType _savegame_type; ///< type of savegame we are loading diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 1ad8850093..601f65d582 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -89,6 +89,7 @@ enum SLRefType { /** Highest possible savegame version. */ #define SL_MAX_VERSION UINT16_MAX +#define SL_REPAIRCOST 200 /** Flags of a chunk. */ enum ChunkType { diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 3ee6ce99c4..2c1dc2507d 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -364,6 +364,24 @@ void AfterLoadVehicles(bool part_of_load) v->SetServiceIntervalIsPercent(c->settings.vehicle.servint_ispercent); } } + + if ( IsSavegameVersionBefore( SL_REPAIRCOST )) { + /* repair cost is value for new vehicles and each week +/256 part for old */ + FOR_ALL_VEHICLES(v) { + if (!v->IsPrimaryVehicle()) continue; + + v->repair_cost = v->value; + for(int w = 0; w < v->age / 7; w++, v->repair_cost += v->repair_cost >> 8 ); + //DEBUG(misc,0, "eid#%d, value=%lld, weeks=%d/%d, repair cost=%lld", + // v->engine_type, (int64)v->value, v->age, v->max_age, (int64)v->repair_cost ); + + if ( v->age > v->max_age ) { + Date weeks = (v->age - v->max_age)/7; + for(int w = 0; w < weeks; w++, v->repair_cost += v->repair_cost >> 8 ); + //DEBUG(misc,0, "OLD: value=%lld, weeks=%d, repair cost=%lld", (int64)v->value, weeks, (int64)v->repair_cost ); + } + } + } } CheckValidVehicles(); @@ -684,6 +702,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLEG_CONDVAR( _cargo_loaded_at_xy, SLE_UINT32, 51, 67), SLE_CONDVAR(Vehicle, value, SLE_FILE_I32 | SLE_VAR_I64, 0, 64), SLE_CONDVAR(Vehicle, value, SLE_INT64, 65, SL_MAX_VERSION), + SLE_CONDVAR(Vehicle, repair_cost, SLE_INT64, SL_REPAIRCOST, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, random_bits, SLE_UINT8, 2, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, waiting_triggers, SLE_UINT8, 2, SL_MAX_VERSION), diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index efd9580952..76eb032e12 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1643,6 +1643,8 @@ static SettingEntry _settings_vehicles_autorenew[] = { static SettingsPage _settings_vehicles_autorenew_page = {_settings_vehicles_autorenew, lengthof(_settings_vehicles_autorenew)}; static SettingEntry _settings_vehicles_servicing[] = { + SettingEntry("vehicle.pay_for_repair"), + SettingEntry("vehicle.repair_cost"), SettingEntry("vehicle.servint_ispercent"), SettingEntry("vehicle.servint_trains"), SettingEntry("vehicle.servint_roadveh"), diff --git a/src/settings_type.h b/src/settings_type.h index 7731e40c9c..850120af10 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -460,6 +460,8 @@ struct VehicleSettings { byte extend_vehicle_life; ///< extend vehicle life by this many years byte road_side; ///< the side of the road vehicles drive on uint8 plane_crashes; ///< number of plane crashes, 0 = none, 1 = reduced, 2 = normal + bool pay_for_repair; ///< pay for repairing vehicle + uint8 repair_cost; ///< cost of repairing vehicle }; /** Settings related to the economy. */ diff --git a/src/table/settings.ini b/src/table/settings.ini index 0b723a0ae0..ae9ef79cfa 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3895,5 +3895,28 @@ strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT strval = STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND cat = SC_BASIC +[SDT_BOOL] +base = GameSettings +var = vehicle.pay_for_repair +from = SL_REPAIRCOST +def = true +str = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE +strhelp = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE_HELPTEXT +cat = SC_EXPERT + +[SDT_VAR] +base = GameSettings +var = vehicle.repair_cost +type = SLE_UINT8 +from = SL_REPAIRCOST +def = 100 +min = 1 +max = 255 +interval = 1 +str = STR_CONFIG_SETTING_REPAIR_COST +strhelp = STR_CONFIG_SETTING_REPAIR_COST_HELPTEXT +strval = STR_JUST_INT +cat = SC_EXPERT + [SDT_END] diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 7d9a67924a..5bdc4e6acd 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -99,6 +99,33 @@ void VehicleServiceInDepot(Vehicle *v) do { v->date_of_last_service = _date; + if ( _settings_game.vehicle.pay_for_repair && v->breakdowns_since_last_service ) { + ExpensesType type = INVALID_EXPENSES; + _current_company = v->owner; + switch (v->type) { + case VEH_AIRCRAFT: + type = EXPENSES_AIRCRAFT_RUN; + break; + case VEH_TRAIN: + type = EXPENSES_TRAIN_RUN; + break; + case VEH_SHIP: + type = EXPENSES_SHIP_RUN; + break; + case VEH_ROAD: + type = EXPENSES_ROADVEH_RUN; + break; + default: + NOT_REACHED(); + } + assert(type != INVALID_EXPENSES); + Money repair_cost = (v->breakdowns_since_last_service * v->repair_cost / _settings_game.vehicle.repair_cost) + 1; + CommandCost cost(type, repair_cost); + v->First()->profit_this_year -= cost.GetCost() << 8; + SubtractMoneyFromCompany(cost); + ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost.GetCost()); + } + v->breakdowns_since_last_service = 0; v->reliability = v->GetEngine()->reliability; /* Prevent vehicles from breaking down directly after exiting the depot. */ @@ -1118,6 +1145,9 @@ Vehicle *CheckClickOnVehicle(const ViewPort *vp, int x, int y) void DecreaseVehicleValue(Vehicle *v) { v->value -= v->value >> 8; + if ( v->age > v->max_age ) { // double cost for each max_age days after max_age + v->repair_cost += v->repair_cost >> 8; + } SetWindowDirty(WC_VEHICLE_DETAILS, v->index); } diff --git a/src/vehicle_base.h b/src/vehicle_base.h index be3a4058f7..431692a32d 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -151,6 +151,7 @@ public: Money profit_this_year; ///< Profit this year << 8, low 8 bits are fract Money profit_last_year; ///< Profit last year << 8, low 8 bits are fract Money value; ///< Value of the vehicle + Money repair_cost; ///< Cost to repair one breakdown CargoPayment *cargo_payment; ///< The cargo payment we're currently in diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 68e6fff1a9..62c032111a 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -133,6 +133,7 @@ CommandCost CmdBuildVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint if (value.Succeeded() && flags & DC_EXEC) { v->unitnumber = unit_num; v->value = value.GetCost(); + v->repair_cost = value.GetCost(); InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); InvalidateWindowClassesData(GetWindowClassForVehicleType(type), 0); From 938babfe7b0094b5db0e966fb4b26670aff7901d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 4 Aug 2015 23:39:02 +0100 Subject: [PATCH 2/3] Vehicle repair costs patch: whitespace fixes. --- src/saveload/vehicle_sl.cpp | 12 ++++++------ src/vehicle.cpp | 34 +++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 2c1dc2507d..9338f3eae5 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -365,19 +365,19 @@ void AfterLoadVehicles(bool part_of_load) } } - if ( IsSavegameVersionBefore( SL_REPAIRCOST )) { + if (IsSavegameVersionBefore(SL_REPAIRCOST)) { /* repair cost is value for new vehicles and each week +/256 part for old */ FOR_ALL_VEHICLES(v) { if (!v->IsPrimaryVehicle()) continue; v->repair_cost = v->value; - for(int w = 0; w < v->age / 7; w++, v->repair_cost += v->repair_cost >> 8 ); + for (int w = 0; w < v->age / 7; w++, v->repair_cost += v->repair_cost >> 8); //DEBUG(misc,0, "eid#%d, value=%lld, weeks=%d/%d, repair cost=%lld", // v->engine_type, (int64)v->value, v->age, v->max_age, (int64)v->repair_cost ); - if ( v->age > v->max_age ) { - Date weeks = (v->age - v->max_age)/7; - for(int w = 0; w < weeks; w++, v->repair_cost += v->repair_cost >> 8 ); + if (v->age > v->max_age) { + Date weeks = (v->age - v->max_age) / 7; + for (int w = 0; w < weeks; w++, v->repair_cost += v->repair_cost >> 8); //DEBUG(misc,0, "OLD: value=%lld, weeks=%d, repair cost=%lld", (int64)v->value, weeks, (int64)v->repair_cost ); } } @@ -702,7 +702,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLEG_CONDVAR( _cargo_loaded_at_xy, SLE_UINT32, 51, 67), SLE_CONDVAR(Vehicle, value, SLE_FILE_I32 | SLE_VAR_I64, 0, 64), SLE_CONDVAR(Vehicle, value, SLE_INT64, 65, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, repair_cost, SLE_INT64, SL_REPAIRCOST, SL_MAX_VERSION), + SLE_CONDVAR(Vehicle, repair_cost, SLE_INT64, SL_REPAIRCOST, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, random_bits, SLE_UINT8, 2, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, waiting_triggers, SLE_UINT8, 2, SL_MAX_VERSION), diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 5bdc4e6acd..a0bfc7cd8a 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -99,24 +99,28 @@ void VehicleServiceInDepot(Vehicle *v) do { v->date_of_last_service = _date; - if ( _settings_game.vehicle.pay_for_repair && v->breakdowns_since_last_service ) { + if (_settings_game.vehicle.pay_for_repair && v->breakdowns_since_last_service) { ExpensesType type = INVALID_EXPENSES; _current_company = v->owner; switch (v->type) { - case VEH_AIRCRAFT: - type = EXPENSES_AIRCRAFT_RUN; - break; - case VEH_TRAIN: - type = EXPENSES_TRAIN_RUN; - break; - case VEH_SHIP: - type = EXPENSES_SHIP_RUN; - break; - case VEH_ROAD: - type = EXPENSES_ROADVEH_RUN; - break; - default: - NOT_REACHED(); + case VEH_AIRCRAFT: + type = EXPENSES_AIRCRAFT_RUN; + break; + + case VEH_TRAIN: + type = EXPENSES_TRAIN_RUN; + break; + + case VEH_SHIP: + type = EXPENSES_SHIP_RUN; + break; + + case VEH_ROAD: + type = EXPENSES_ROADVEH_RUN; + break; + + default: + NOT_REACHED(); } assert(type != INVALID_EXPENSES); Money repair_cost = (v->breakdowns_since_last_service * v->repair_cost / _settings_game.vehicle.repair_cost) + 1; From 6bb8d5087d3e1843c91beb1aa63233a08cafaffd Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 4 Aug 2015 23:56:37 +0100 Subject: [PATCH 3/3] Vehicle repair costs patch: implement save/load changes. --- src/saveload/extended_ver_sl.cpp | 1 + src/saveload/extended_ver_sl.h | 1 + src/saveload/saveload.h | 1 - src/saveload/vehicle_sl.cpp | 4 ++-- src/table/settings.ini | 6 ++++-- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index be40cad17b..f8e5b48808 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -45,6 +45,7 @@ std::vector _sl_xv_discardable_chunk_ids; ///< list of chunks static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { + { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 1, 1, "vehicle_repair_cost", NULL, NULL, NULL }, { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker }; diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index 3dffee5a7c..78efaf3f26 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -21,6 +21,7 @@ */ enum SlXvFeatureIndex { XSLFI_NULL = 0, ///< Unused value, to indicate that no extended feature test is in use + XSLFI_VEHICLE_REPAIR_COST, ///< Vehicle repair costs patch XSLFI_SIZE, ///< Total count of features, including null feature }; diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index b080cd0f9b..711d9ac7ac 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -92,7 +92,6 @@ enum SLRefType { /** Highest possible savegame version. */ #define SL_MAX_VERSION UINT16_MAX -#define SL_REPAIRCOST 200 /** Flags of a chunk. */ enum ChunkType { diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index db57da3dd8..6d534e80c1 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -369,7 +369,7 @@ void AfterLoadVehicles(bool part_of_load) } } - if (IsSavegameVersionBefore(SL_REPAIRCOST)) { + if (SlXvIsFeatureMissing(XSLFI_VEHICLE_REPAIR_COST)) { /* repair cost is value for new vehicles and each week +/256 part for old */ FOR_ALL_VEHICLES(v) { if (!v->IsPrimaryVehicle()) continue; @@ -706,7 +706,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLEG_CONDVAR( _cargo_loaded_at_xy, SLE_UINT32, 51, 67), SLE_CONDVAR(Vehicle, value, SLE_FILE_I32 | SLE_VAR_I64, 0, 64), SLE_CONDVAR(Vehicle, value, SLE_INT64, 65, SL_MAX_VERSION), - SLE_CONDVAR(Vehicle, repair_cost, SLE_INT64, SL_REPAIRCOST, SL_MAX_VERSION), + SLE_CONDVAR_X(Vehicle, repair_cost, SLE_INT64, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST)), SLE_CONDVAR(Vehicle, random_bits, SLE_UINT8, 2, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, waiting_triggers, SLE_UINT8, 2, SL_MAX_VERSION), diff --git a/src/table/settings.ini b/src/table/settings.ini index e5473374b8..9e18e2c75a 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -3941,17 +3941,17 @@ cat = SC_BASIC [SDT_BOOL] base = GameSettings var = vehicle.pay_for_repair -from = SL_REPAIRCOST def = true str = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE strhelp = STR_CONFIG_SETTING_PAY_FOR_REPAIR_VEHICLE_HELPTEXT cat = SC_EXPERT +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST) +patxname = ""vehicle_repair_cost.vehicle.pay_for_repair"" [SDT_VAR] base = GameSettings var = vehicle.repair_cost type = SLE_UINT8 -from = SL_REPAIRCOST def = 100 min = 1 max = 255 @@ -3960,6 +3960,8 @@ str = STR_CONFIG_SETTING_REPAIR_COST strhelp = STR_CONFIG_SETTING_REPAIR_COST_HELPTEXT strval = STR_JUST_INT cat = SC_EXPERT +extver = SlXvFeatureTest(XSLFTO_AND, XSLFI_VEHICLE_REPAIR_COST) +patxname = ""vehicle_repair_cost.vehicle.repair_cost"" [SDT_END]