diff --git a/src/engine.cpp b/src/engine.cpp index cb0ede8c0c..f5de6de661 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -742,7 +742,7 @@ void SetYearEngineAgingStops() * @param aging_date The date used for age calculations. * @param seed Random seed. */ -void StartupOneEngine(Engine *e, CalTime::Date aging_date, const CalTime::YearMonthDay &aging_ymd, uint32_t seed, CalTime::Date no_introduce_after_date) +void StartupOneEngine(Engine *e, const CalTime::YearMonthDay &aging_ymd, const CalTime::YearMonthDay &expire_stop_ymd, uint32_t seed, CalTime::Date no_introduce_after_date) { const EngineInfo *ei = &e->info; @@ -765,15 +765,6 @@ void StartupOneEngine(Engine *e, CalTime::Date aging_date, const CalTime::YearMo * of engines in early starting games. * Note: TTDP uses fixed 1922 */ e->intro_date = ei->base_intro <= CalTime::ConvertYMDToDate(_settings_game.game_creation.starting_year + 2, 0, 1) ? ei->base_intro : (DateDelta)GB(r, 0, 9) + ei->base_intro; - if (e->intro_date <= CalTime::CurDate() && e->intro_date <= no_introduce_after_date) { - CalTime::YearMonthDay intro_ymd = CalTime::ConvertDateToYMD(e->intro_date); - int aging_months = aging_ymd.year.base() * 12 + aging_ymd.month; - int intro_months = intro_ymd.year.base() * 12 + intro_ymd.month; - if (intro_ymd.day > 1) intro_months++; // Engines are introduced at the first month start at/after intro date. - e->age = aging_months - intro_months; - e->company_avail = MAX_UVALUE(CompanyMask); - e->flags |= ENGINE_AVAILABLE; - } /* Get parent variant index for syncing reliability via random seed. */ const Engine *re = e; @@ -812,6 +803,17 @@ void StartupOneEngine(Engine *e, CalTime::Date aging_date, const CalTime::YearMo e->reliability_spd_dec = ei->decay_speed << 2; + if (e->intro_date <= CalTime::CurDate() && e->intro_date <= no_introduce_after_date) { + CalTime::YearMonthDay intro_ymd = CalTime::ConvertDateToYMD(e->intro_date); + int aging_months = aging_ymd.year.base() * 12 + aging_ymd.month; + int intro_months = intro_ymd.year.base() * 12 + intro_ymd.month; + if (intro_ymd.day > 1) intro_months++; // Engines are introduced at the first month start at/after intro date. + int expire_stop_months = std::max(expire_stop_ymd.year.base() * 12 + expire_stop_ymd.month, intro_months + e->duration_phase_1); + e->age = std::min(aging_months, expire_stop_months) - intro_months; + e->company_avail = MAX_UVALUE(CompanyMask); + e->flags |= ENGINE_AVAILABLE; + } + /* prevent certain engines from ever appearing. */ if (!HasBit(ei->climates, _settings_game.game_creation.landscape)) { e->flags |= ENGINE_AVAILABLE; @@ -827,11 +829,13 @@ void StartupEngines() { /* Aging of vehicles stops, so account for that when starting late */ CalTime::Year aging_stop_year = _year_engine_aging_stops; + const CalTime::Date aging_date = std::min(CalTime::CurDate(), CalTime::ConvertYMDToDate(aging_stop_year, 0, 1)); + const CalTime::YearMonthDay aging_ymd = CalTime::ConvertDateToYMD(aging_date); if (_settings_game.vehicle.no_expire_vehicles_after > 0) { aging_stop_year = std::min(aging_stop_year, _settings_game.vehicle.no_expire_vehicles_after); } - const CalTime::Date aging_date = std::min(CalTime::CurDate(), CalTime::ConvertYMDToDate(aging_stop_year, 0, 1)); - const CalTime::YearMonthDay aging_ymd = CalTime::ConvertDateToYMD(aging_date); + const CalTime::Date expire_stop_date = std::min(CalTime::CurDate(), CalTime::ConvertYMDToDate(aging_stop_year, 0, 1)); + const CalTime::YearMonthDay expire_stop_ymd = CalTime::ConvertDateToYMD(expire_stop_date); CalTime::Date no_introduce_after_date = INT_MAX; if (_settings_game.vehicle.no_introduce_vehicles_after > 0) { @@ -841,7 +845,7 @@ void StartupEngines() uint32_t seed = Random(); for (Engine *e : Engine::Iterate()) { - StartupOneEngine(e, aging_date, aging_ymd, seed, no_introduce_after_date); + StartupOneEngine(e, aging_ymd, expire_stop_ymd, seed, no_introduce_after_date); } for (Engine *e : Engine::Iterate()) { CalcEngineReliability(e, false); @@ -1199,17 +1203,13 @@ void EnginesMonthlyLoop() CalTime::Date no_introduce_after = INT_MAX; bool no_engine_aging = (_settings_game.vehicle.no_expire_vehicles_after > 0 && CalTime::CurYear() >= _settings_game.vehicle.no_expire_vehicles_after); if (_settings_game.vehicle.no_introduce_vehicles_after > 0) { - if (no_engine_aging && CalTime::CurYear() >= _settings_game.vehicle.no_introduce_vehicles_after) { - /* No engine expiry or aging, and no introductions, so nothing to do */ - return; - } no_introduce_after = CalTime::ConvertYMDToDate(_settings_game.vehicle.no_introduce_vehicles_after, 0, 1) - 1; } bool refresh = false; for (Engine *e : Engine::Iterate()) { /* Age the vehicle */ - if (!no_engine_aging && (e->flags & ENGINE_AVAILABLE) && e->age != INT32_MAX) { + if ((e->flags & ENGINE_AVAILABLE) && e->age != INT32_MAX && (!no_engine_aging || e->age < e->duration_phase_1)) { e->age++; CalcEngineReliability(e, true); refresh = true; diff --git a/src/engine_func.h b/src/engine_func.h index c23519d0ea..f7adc8c208 100644 --- a/src/engine_func.h +++ b/src/engine_func.h @@ -27,7 +27,7 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company); bool IsEngineRefittable(EngineID engine); void SetYearEngineAgingStops(); void CalcEngineReliability(Engine *e, bool new_month); -void StartupOneEngine(Engine *e, CalTime::Date aging_date, const CalTime::YearMonthDay &aging_ymd, uint32_t seed, CalTime::Date no_introduce_after_date); +void StartupOneEngine(Engine *e, const CalTime::YearMonthDay &aging_ymd, const CalTime::YearMonthDay &expire_stop_ymd, uint32_t seed, CalTime::Date no_introduce_after_date); uint GetTotalCapacityOfArticulatedParts(EngineID engine); diff --git a/src/sl/oldloader_sl.cpp b/src/sl/oldloader_sl.cpp index 35acbd3728..9e0bbf28c5 100644 --- a/src/sl/oldloader_sl.cpp +++ b/src/sl/oldloader_sl.cpp @@ -399,7 +399,7 @@ static bool FixTTOEngines() CalTime::State backup = CalTime::Detail::now; CalTime::Detail::now.cal_date += CalTime::DAYS_TILL_ORIGINAL_BASE_YEAR.AsDelta(); CalTime::Detail::now.cal_ymd = CalTime::ConvertDateToYMD(CalTime::Detail::now.cal_date); - StartupOneEngine(e, aging_date, aging_ymd, 0, INT_MAX); + StartupOneEngine(e, aging_ymd, aging_ymd, 0, INT_MAX); CalcEngineReliability(e, false); e->intro_date -= CalTime::DAYS_TILL_ORIGINAL_BASE_YEAR.AsDelta(); CalTime::Detail::now = backup;