Fix #12010: Use economy timer for vehicle stats minimum age, not calendar (#12142)

This commit is contained in:
Tyler Trahan 2024-03-09 09:38:52 -05:00 committed by GitHub
parent 04ce1c08ae
commit 32b0fb9f6e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 42 additions and 15 deletions

View File

@ -456,6 +456,7 @@ void Aircraft::OnNewCalendarDay()
void Aircraft::OnNewEconomyDay() void Aircraft::OnNewEconomyDay()
{ {
if (!this->IsNormalAircraft()) return; if (!this->IsNormalAircraft()) return;
EconomyAgeVehicle(this);
if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this); if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);

View File

@ -215,7 +215,7 @@ int UpdateCompanyRatingAndValue(Company *c, bool update)
if (v->owner != owner) continue; if (v->owner != owner) continue;
if (IsCompanyBuildableVehicleType(v->type) && v->IsPrimaryVehicle()) { if (IsCompanyBuildableVehicleType(v->type) && v->IsPrimaryVehicle()) {
if (v->profit_last_year > 0) num++; // For the vehicle score only count profitable vehicles if (v->profit_last_year > 0) num++; // For the vehicle score only count profitable vehicles
if (v->age > 730) { if (v->economy_age > VEHICLE_PROFIT_MIN_AGE) {
/* Find the vehicle with the lowest amount of profit */ /* Find the vehicle with the lowest amount of profit */
if (min_profit_first || min_profit > v->profit_last_year) { if (min_profit_first || min_profit > v->profit_last_year) {
min_profit = v->profit_last_year; min_profit = v->profit_last_year;

View File

@ -142,7 +142,7 @@ uint16_t GroupStatistics::GetNumEngines(EngineID engine) const
stats.num_vehicle += delta; stats.num_vehicle += delta;
stats.profit_last_year += v->GetDisplayProfitLastYear() * delta; stats.profit_last_year += v->GetDisplayProfitLastYear() * delta;
if (v->age > VEHICLE_PROFIT_MIN_AGE) { if (v->economy_age > VEHICLE_PROFIT_MIN_AGE) {
stats_all.num_vehicle_min_age += delta; stats_all.num_vehicle_min_age += delta;
stats_all.profit_last_year_min_age += v->GetDisplayProfitLastYear() * delta; stats_all.profit_last_year_min_age += v->GetDisplayProfitLastYear() * delta;
stats.num_vehicle_min_age += delta; stats.num_vehicle_min_age += delta;
@ -209,7 +209,7 @@ uint16_t GroupStatistics::GetNumEngines(EngineID engine) const
for (const Vehicle *v : Vehicle::Iterate()) { for (const Vehicle *v : Vehicle::Iterate()) {
if (v->IsPrimaryVehicle()) { if (v->IsPrimaryVehicle()) {
GroupStatistics::AddProfitLastYear(v); GroupStatistics::AddProfitLastYear(v);
if (v->age > VEHICLE_PROFIT_MIN_AGE) GroupStatistics::VehicleReachedMinAge(v); if (v->economy_age > VEHICLE_PROFIT_MIN_AGE) GroupStatistics::VehicleReachedMinAge(v);
} }
} }
} }

View File

@ -1728,6 +1728,7 @@ void RoadVehicle::OnNewCalendarDay()
void RoadVehicle::OnNewEconomyDay() void RoadVehicle::OnNewEconomyDay()
{ {
if (!this->IsFrontEngine()) return; if (!this->IsFrontEngine()) return;
EconomyAgeVehicle(this);
if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this); if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);
if (this->blocked_ctr == 0) CheckVehicleBreakdown(this); if (this->blocked_ctr == 0) CheckVehicleBreakdown(this);

View File

@ -376,7 +376,8 @@ enum SaveLoadVersion : uint16_t {
SLV_MAX_LOAN_FOR_COMPANY, ///< 330 PR#11224 Separate max loan for each company. SLV_MAX_LOAN_FOR_COMPANY, ///< 330 PR#11224 Separate max loan for each company.
SLV_DEPOT_UNBUNCHING, ///< 331 PR#11945 Allow unbunching shared order vehicles at a depot. SLV_DEPOT_UNBUNCHING, ///< 331 PR#11945 Allow unbunching shared order vehicles at a depot.
SLV_AI_LOCAL_CONFIG, ///< 332 PR#12003 Config of running AI is stored inside Company. SLV_AI_LOCAL_CONFIG, ///< 332 PR#12003 Config of running AI is stored inside Company.
SLV_SCRIPT_RANDOMIZER, ///< 333 PR#12063 v14.0 Save script randomizers. SLV_SCRIPT_RANDOMIZER, ///< 333 PR#12063 v14.0-RC1 Save script randomizers.
SLV_VEHICLE_ECONOMY_AGE, ///< 334 PR#12141 v14.0 Add vehicle age in economy year, for profit stats minimum age
SL_MAX_VERSION, ///< Highest possible saveload version SL_MAX_VERSION, ///< Highest possible saveload version
}; };

View File

@ -398,6 +398,13 @@ void AfterLoadVehicles(bool part_of_load)
v->timetable_start = GetStartTickFromDate(v->timetable_start); v->timetable_start = GetStartTickFromDate(v->timetable_start);
} }
} }
if (IsSavegameVersionBefore(SLV_VEHICLE_ECONOMY_AGE)) {
/* Set vehicle economy age based on calendar age. */
for (Vehicle *v : Vehicle::Iterate()) {
v->economy_age = v->age.base();
}
}
} }
CheckValidVehicles(); CheckValidVehicles();
@ -718,6 +725,7 @@ public:
SLE_CONDVAR(Vehicle, age, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31), SLE_CONDVAR(Vehicle, age, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31),
SLE_CONDVAR(Vehicle, age, SLE_INT32, SLV_31, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, age, SLE_INT32, SLV_31, SL_MAX_VERSION),
SLE_CONDVAR(Vehicle, economy_age, SLE_INT32, SLV_VEHICLE_ECONOMY_AGE, SL_MAX_VERSION),
SLE_CONDVAR(Vehicle, max_age, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31), SLE_CONDVAR(Vehicle, max_age, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31),
SLE_CONDVAR(Vehicle, max_age, SLE_INT32, SLV_31, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, max_age, SLE_INT32, SLV_31, SL_MAX_VERSION),
SLE_CONDVAR(Vehicle, date_of_last_service, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31), SLE_CONDVAR(Vehicle, date_of_last_service, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31),

View File

@ -266,6 +266,8 @@ void Ship::OnNewCalendarDay()
/** Economy day handler. */ /** Economy day handler. */
void Ship::OnNewEconomyDay() void Ship::OnNewEconomyDay()
{ {
EconomyAgeVehicle(this);
if ((++this->day_counter & 7) == 0) { if ((++this->day_counter & 7) == 0) {
DecreaseVehicleValue(this); DecreaseVehicleValue(this);
} }

View File

@ -4186,6 +4186,8 @@ void Train::OnNewCalendarDay()
/** Economy day handler. */ /** Economy day handler. */
void Train::OnNewEconomyDay() void Train::OnNewEconomyDay()
{ {
EconomyAgeVehicle(this);
if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this); if ((++this->day_counter & 7) == 0) DecreaseVehicleValue(this);
if (this->IsFrontEngine()) { if (this->IsFrontEngine()) {

View File

@ -1418,16 +1418,25 @@ bool Vehicle::HandleBreakdown()
} }
} }
/**
* Update economy age of a vehicle.
* @param v Vehicle to update.
*/
void EconomyAgeVehicle(Vehicle *v)
{
if (v->economy_age < EconomyTime::MAX_DATE) {
v->economy_age++;
if (v->IsPrimaryVehicle() && v->economy_age == VEHICLE_PROFIT_MIN_AGE + 1) GroupStatistics::VehicleReachedMinAge(v);
}
}
/** /**
* Update age of a vehicle. * Update age of a vehicle.
* @param v Vehicle to update. * @param v Vehicle to update.
*/ */
void AgeVehicle(Vehicle *v) void AgeVehicle(Vehicle *v)
{ {
if (v->age < CalendarTime::MAX_DATE) { if (v->age < CalendarTime::MAX_DATE) v->age++;
v->age++;
if (v->IsPrimaryVehicle() && v->age == VEHICLE_PROFIT_MIN_AGE + 1) GroupStatistics::VehicleReachedMinAge(v);
}
if (!v->IsPrimaryVehicle() && (v->type != VEH_TRAIN || !Train::From(v)->IsEngine())) return; if (!v->IsPrimaryVehicle() && (v->type != VEH_TRAIN || !Train::From(v)->IsEngine())) return;
@ -2990,7 +2999,7 @@ static IntervalTimer<TimerGameEconomy> _economy_vehicles_yearly({TimerGameEconom
if (v->IsPrimaryVehicle()) { if (v->IsPrimaryVehicle()) {
/* show warning if vehicle is not generating enough income last 2 years (corresponds to a red icon in the vehicle list) */ /* show warning if vehicle is not generating enough income last 2 years (corresponds to a red icon in the vehicle list) */
Money profit = v->GetDisplayProfitThisYear(); Money profit = v->GetDisplayProfitThisYear();
if (v->age >= 730 && profit < 0) { if (v->economy_age >= VEHICLE_PROFIT_MIN_AGE && profit < 0) {
if (_settings_client.gui.vehicle_income_warn && v->owner == _local_company) { if (_settings_client.gui.vehicle_income_warn && v->owner == _local_company) {
SetDParam(0, v->index); SetDParam(0, v->index);
SetDParam(1, profit); SetDParam(1, profit);

View File

@ -285,7 +285,8 @@ public:
/* Related to age and service time */ /* Related to age and service time */
TimerGameCalendar::Year build_year; ///< Year the vehicle has been built. TimerGameCalendar::Year build_year; ///< Year the vehicle has been built.
TimerGameCalendar::Date age; ///< Age in days TimerGameCalendar::Date age; ///< Age in calendar days.
TimerGameEconomy::Date economy_age; ///< Age in economy days.
TimerGameCalendar::Date max_age; ///< Maximum age TimerGameCalendar::Date max_age; ///< Maximum age
TimerGameEconomy::Date date_of_last_service; ///< Last economy date the vehicle had a service at a depot. TimerGameEconomy::Date date_of_last_service; ///< Last economy date the vehicle had a service at a depot.
TimerGameCalendar::Date date_of_last_service_newgrf; ///< Last calendar date the vehicle had a service at a depot, unchanged by the date cheat to protect against unsafe NewGRF behavior. TimerGameCalendar::Date date_of_last_service_newgrf; ///< Last calendar date the vehicle had a service at a depot, unchanged by the date cheat to protect against unsafe NewGRF behavior.

View File

@ -12,6 +12,7 @@
#include "gfx_type.h" #include "gfx_type.h"
#include "direction_type.h" #include "direction_type.h"
#include "timer/timer_game_economy.h"
#include "command_type.h" #include "command_type.h"
#include "vehicle_type.h" #include "vehicle_type.h"
#include "engine_type.h" #include "engine_type.h"
@ -24,7 +25,7 @@
#define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD) #define IS_CUSTOM_FIRSTHEAD_SPRITE(x) (x == 0xFD)
#define IS_CUSTOM_SECONDHEAD_SPRITE(x) (x == 0xFE) #define IS_CUSTOM_SECONDHEAD_SPRITE(x) (x == 0xFE)
static const int VEHICLE_PROFIT_MIN_AGE = CalendarTime::DAYS_IN_YEAR * 2; ///< Only vehicles older than this have a meaningful profit. static const TimerGameEconomy::Date VEHICLE_PROFIT_MIN_AGE = CalendarTime::DAYS_IN_YEAR * 2; ///< Only vehicles older than this have a meaningful profit.
static const Money VEHICLE_PROFIT_THRESHOLD = 10000; ///< Threshold for a vehicle to be considered making good profit. static const Money VEHICLE_PROFIT_THRESHOLD = 10000; ///< Threshold for a vehicle to be considered making good profit.
/** /**
@ -61,6 +62,7 @@ CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle
void DecreaseVehicleValue(Vehicle *v); void DecreaseVehicleValue(Vehicle *v);
void CheckVehicleBreakdown(Vehicle *v); void CheckVehicleBreakdown(Vehicle *v);
void EconomyAgeVehicle(Vehicle *v);
void AgeVehicle(Vehicle *v); void AgeVehicle(Vehicle *v);
void RunVehicleCalendarDayProc(); void RunVehicleCalendarDayProc();
void VehicleEnteredDepotThisTick(Vehicle *v); void VehicleEnteredDepotThisTick(Vehicle *v);

View File

@ -486,7 +486,7 @@ void DepotSortList(VehicleList *list)
} }
/** draw the vehicle profit button in the vehicle list window. */ /** draw the vehicle profit button in the vehicle list window. */
static void DrawVehicleProfitButton(TimerGameCalendar::Date age, Money display_profit_last_year, uint num_vehicles, int x, int y) static void DrawVehicleProfitButton(TimerGameEconomy::Date age, Money display_profit_last_year, uint num_vehicles, int x, int y)
{ {
SpriteID spr; SpriteID spr;

View File

@ -53,12 +53,12 @@ struct GUIVehicleGroup {
}); });
} }
TimerGameCalendar::Date GetOldestVehicleAge() const TimerGameEconomy::Date GetOldestVehicleAge() const
{ {
const Vehicle *oldest = *std::max_element(this->vehicles_begin, this->vehicles_end, [](const Vehicle *v_a, const Vehicle *v_b) { const Vehicle *oldest = *std::max_element(this->vehicles_begin, this->vehicles_end, [](const Vehicle *v_a, const Vehicle *v_b) {
return v_a->age < v_b->age; return v_a->economy_age < v_b->economy_age;
}); });
return oldest->age; return oldest->economy_age;
} }
}; };