mirror of https://github.com/OpenTTD/OpenTTD
Codechange: migrate all game-time-related timers to the new framework
parent
1ba4dcc924
commit
3ebc7ad16e
|
@ -31,6 +31,8 @@
|
||||||
#include "airport_cmd.h"
|
#include "airport_cmd.h"
|
||||||
#include "station_cmd.h"
|
#include "station_cmd.h"
|
||||||
#include "zoom_func.h"
|
#include "zoom_func.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "widgets/airport_widget.h"
|
#include "widgets/airport_widget.h"
|
||||||
|
|
||||||
|
@ -581,6 +583,10 @@ public:
|
||||||
{
|
{
|
||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->InvalidateData();
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
static const NWidgetPart _nested_build_airport_widgets[] = {
|
static const NWidgetPart _nested_build_airport_widgets[] = {
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "misc_cmd.h"
|
#include "misc_cmd.h"
|
||||||
#include "core/geometry_func.hpp"
|
#include "core/geometry_func.hpp"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "widgets/cheat_widget.h"
|
#include "widgets/cheat_widget.h"
|
||||||
|
|
||||||
|
@ -417,6 +419,10 @@ struct CheatWindow : Window {
|
||||||
if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value);
|
if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value);
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->SetDirty();
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Window description of the cheats GUI. */
|
/** Window description of the cheats GUI. */
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
#include "story_base.h"
|
#include "story_base.h"
|
||||||
#include "widgets/statusbar_widget.h"
|
#include "widgets/statusbar_widget.h"
|
||||||
#include "company_cmd.h"
|
#include "company_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -743,7 +745,7 @@ void OnTick_Companies()
|
||||||
* A year has passed, update the economic data of all companies, and perhaps show the
|
* A year has passed, update the economic data of all companies, and perhaps show the
|
||||||
* financial overview window of the local company.
|
* financial overview window of the local company.
|
||||||
*/
|
*/
|
||||||
void CompaniesYearlyLoop()
|
static IntervalTimer<TimerGameCalendar> _companies_yearly({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::COMPANY}, [](auto)
|
||||||
{
|
{
|
||||||
/* Copy statistics */
|
/* Copy statistics */
|
||||||
for (Company *c : Company::Iterate()) {
|
for (Company *c : Company::Iterate()) {
|
||||||
|
@ -761,7 +763,7 @@ void CompaniesYearlyLoop()
|
||||||
if (_settings_client.sound.new_year) SndPlayFx(SND_00_GOOD_YEAR);
|
if (_settings_client.sound.new_year) SndPlayFx(SND_00_GOOD_YEAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill the CompanyNewsInformation struct with the required data.
|
* Fill the CompanyNewsInformation struct with the required data.
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include "settings_type.h"
|
#include "settings_type.h"
|
||||||
#include "date_func.h"
|
#include "date_func.h"
|
||||||
#include "string_type.h"
|
#include "string_type.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -138,7 +140,7 @@ uint64 GetMaskOfAllowedCurrencies()
|
||||||
/**
|
/**
|
||||||
* Verify if the currency chosen by the user is about to be converted to Euro
|
* Verify if the currency chosen by the user is about to be converted to Euro
|
||||||
*/
|
*/
|
||||||
void CheckSwitchToEuro()
|
static IntervalTimer<TimerGameCalendar> _check_switch_to_euro({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
{
|
{
|
||||||
if (_currency_specs[_settings_game.locale.currency].to_euro != CF_NOEURO &&
|
if (_currency_specs[_settings_game.locale.currency].to_euro != CF_NOEURO &&
|
||||||
_currency_specs[_settings_game.locale.currency].to_euro != CF_ISEURO &&
|
_currency_specs[_settings_game.locale.currency].to_euro != CF_ISEURO &&
|
||||||
|
@ -146,7 +148,7 @@ void CheckSwitchToEuro()
|
||||||
_settings_game.locale.currency = 2; // this is the index of euro above.
|
_settings_game.locale.currency = 2; // this is the index of euro above.
|
||||||
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, NT_ECONOMY, NF_NORMAL);
|
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, NT_ECONOMY, NF_NORMAL);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will fill _currency_specs array with
|
* Will fill _currency_specs array with
|
||||||
|
|
|
@ -102,7 +102,6 @@ extern CurrencySpec _currency_specs[CURRENCY_END];
|
||||||
#define _currency ((const CurrencySpec*)&_currency_specs[GetGameSettings().locale.currency])
|
#define _currency ((const CurrencySpec*)&_currency_specs[GetGameSettings().locale.currency])
|
||||||
|
|
||||||
uint64 GetMaskOfAllowedCurrencies();
|
uint64 GetMaskOfAllowedCurrencies();
|
||||||
void CheckSwitchToEuro();
|
|
||||||
void ResetCurrencies(bool preserve_custom = true);
|
void ResetCurrencies(bool preserve_custom = true);
|
||||||
StringID *BuildCurrencyDropdown();
|
StringID *BuildCurrencyDropdown();
|
||||||
byte GetNewgrfCurrencyIdConverted(byte grfcurr_id);
|
byte GetNewgrfCurrencyIdConverted(byte grfcurr_id);
|
||||||
|
|
108
src/date.cpp
108
src/date.cpp
|
@ -158,111 +158,3 @@ Date ConvertYMDToDate(Year year, Month month, Day day)
|
||||||
|
|
||||||
return DAYS_TILL(year) + days;
|
return DAYS_TILL(year) + days;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Functions used by the IncreaseDate function */
|
|
||||||
|
|
||||||
extern void EnginesDailyLoop();
|
|
||||||
extern void DisasterDailyLoop();
|
|
||||||
extern void IndustryDailyLoop();
|
|
||||||
|
|
||||||
extern void CompaniesMonthlyLoop();
|
|
||||||
extern void EnginesMonthlyLoop();
|
|
||||||
extern void TownsMonthlyLoop();
|
|
||||||
extern void IndustryMonthlyLoop();
|
|
||||||
extern void StationMonthlyLoop();
|
|
||||||
extern void SubsidyMonthlyLoop();
|
|
||||||
|
|
||||||
extern void CompaniesYearlyLoop();
|
|
||||||
extern void VehiclesYearlyLoop();
|
|
||||||
extern void TownsYearlyLoop();
|
|
||||||
|
|
||||||
extern void ShowEndGameChart();
|
|
||||||
|
|
||||||
|
|
||||||
/** Available settings for autosave intervals. */
|
|
||||||
static const Month _autosave_months[] = {
|
|
||||||
0, ///< never
|
|
||||||
1, ///< every month
|
|
||||||
3, ///< every 3 months
|
|
||||||
6, ///< every 6 months
|
|
||||||
12, ///< every 12 months
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs various procedures that have to be done yearly
|
|
||||||
*/
|
|
||||||
static IntervalTimer<TimerGameCalendar> _on_new_year({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
|
|
||||||
{
|
|
||||||
CompaniesYearlyLoop();
|
|
||||||
VehiclesYearlyLoop();
|
|
||||||
TownsYearlyLoop();
|
|
||||||
InvalidateWindowClassesData(WC_BUILD_STATION);
|
|
||||||
InvalidateWindowClassesData(WC_BUS_STATION);
|
|
||||||
InvalidateWindowClassesData(WC_TRUCK_STATION);
|
|
||||||
if (_network_server) NetworkServerYearlyLoop();
|
|
||||||
|
|
||||||
if (_cur_year == _settings_client.gui.semaphore_build_before) ResetSignalVariant();
|
|
||||||
|
|
||||||
/* check if we reached end of the game (end of ending year); 0 = never */
|
|
||||||
if (_cur_year == _settings_game.game_creation.ending_year + 1 && _settings_game.game_creation.ending_year != 0) {
|
|
||||||
ShowEndGameChart();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if we reached the maximum year, decrement dates by a year */
|
|
||||||
if (_cur_year == MAX_YEAR + 1) {
|
|
||||||
int days_this_year;
|
|
||||||
|
|
||||||
_cur_year--;
|
|
||||||
days_this_year = IsLeapYear(_cur_year) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR;
|
|
||||||
_date -= days_this_year;
|
|
||||||
for (Vehicle *v : Vehicle::Iterate()) v->ShiftDates(-days_this_year);
|
|
||||||
for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(-days_this_year);
|
|
||||||
|
|
||||||
/* Because the _date wraps here, and text-messages expire by game-days, we have to clean out
|
|
||||||
* all of them if the date is set back, else those messages will hang for ever */
|
|
||||||
NetworkInitChatMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_settings_client.gui.auto_euro) CheckSwitchToEuro();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs various procedures that have to be done monthly
|
|
||||||
*/
|
|
||||||
static IntervalTimer<TimerGameCalendar> _on_new_month({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [](auto)
|
|
||||||
{
|
|
||||||
if (_settings_client.gui.autosave != 0 && (_cur_month % _autosave_months[_settings_client.gui.autosave]) == 0) {
|
|
||||||
_do_autosave = true;
|
|
||||||
SetWindowDirty(WC_STATUS_BAR, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetWindowClassesDirty(WC_CHEATS);
|
|
||||||
CompaniesMonthlyLoop();
|
|
||||||
EnginesMonthlyLoop();
|
|
||||||
TownsMonthlyLoop();
|
|
||||||
IndustryMonthlyLoop();
|
|
||||||
SubsidyMonthlyLoop();
|
|
||||||
StationMonthlyLoop();
|
|
||||||
if (_network_server) NetworkServerMonthlyLoop();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs various procedures that have to be done daily
|
|
||||||
*/
|
|
||||||
static IntervalTimer<TimerGameCalendar> _on_new_day({TimerGameCalendar::DAY, TimerGameCalendar::Priority::NONE}, [](auto)
|
|
||||||
{
|
|
||||||
if (!_newgrf_profilers.empty() && _newgrf_profile_end_date <= _date) {
|
|
||||||
NewGRFProfiler::FinishAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_network_server) NetworkServerDailyLoop();
|
|
||||||
|
|
||||||
DisasterDailyLoop();
|
|
||||||
IndustryDailyLoop();
|
|
||||||
|
|
||||||
SetWindowWidgetDirty(WC_STATUS_BAR, 0, WID_S_LEFT);
|
|
||||||
EnginesDailyLoop();
|
|
||||||
|
|
||||||
/* Refresh after possible snowline change */
|
|
||||||
SetWindowClassesDirty(WC_TOWN_VIEW);
|
|
||||||
});
|
|
||||||
|
|
|
@ -47,6 +47,8 @@
|
||||||
#include "core/random_func.hpp"
|
#include "core/random_func.hpp"
|
||||||
#include "core/backup_type.hpp"
|
#include "core/backup_type.hpp"
|
||||||
#include "landscape_cmd.h"
|
#include "landscape_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -935,14 +937,14 @@ static void ResetDisasterDelay()
|
||||||
_disaster_delay = GB(Random(), 0, 9) + 730;
|
_disaster_delay = GB(Random(), 0, 9) + 730;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisasterDailyLoop()
|
static IntervalTimer<TimerGameCalendar> _disaster_daily({TimerGameCalendar::DAY, TimerGameCalendar::Priority::DISASTER}, [](auto)
|
||||||
{
|
{
|
||||||
if (--_disaster_delay != 0) return;
|
if (--_disaster_delay != 0) return;
|
||||||
|
|
||||||
ResetDisasterDelay();
|
ResetDisasterDelay();
|
||||||
|
|
||||||
if (_settings_game.difficulty.disasters != 0) DoDisaster();
|
if (_settings_game.difficulty.disasters != 0) DoDisaster();
|
||||||
}
|
});
|
||||||
|
|
||||||
void StartupDisasters()
|
void StartupDisasters()
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "station_cmd.h"
|
#include "station_cmd.h"
|
||||||
#include "water_cmd.h"
|
#include "water_cmd.h"
|
||||||
#include "waypoint_cmd.h"
|
#include "waypoint_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "widgets/dock_widget.h"
|
#include "widgets/dock_widget.h"
|
||||||
|
|
||||||
|
@ -477,6 +479,10 @@ public:
|
||||||
{
|
{
|
||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->InvalidateData();
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Nested widget parts of a build dock station window. */
|
/** Nested widget parts of a build dock station window. */
|
||||||
|
|
|
@ -52,6 +52,8 @@
|
||||||
#include "company_cmd.h"
|
#include "company_cmd.h"
|
||||||
#include "economy_cmd.h"
|
#include "economy_cmd.h"
|
||||||
#include "vehicle_cmd.h"
|
#include "vehicle_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/pricebase.h"
|
#include "table/pricebase.h"
|
||||||
|
@ -1983,7 +1985,7 @@ void LoadUnloadStation(Station *st)
|
||||||
/**
|
/**
|
||||||
* Monthly update of the economic data (of the companies as well as economic fluctuations).
|
* Monthly update of the economic data (of the companies as well as economic fluctuations).
|
||||||
*/
|
*/
|
||||||
void CompaniesMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _companies_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::COMPANY}, [](auto)
|
||||||
{
|
{
|
||||||
CompaniesGenStatistics();
|
CompaniesGenStatistics();
|
||||||
if (_settings_game.economy.inflation) {
|
if (_settings_game.economy.inflation) {
|
||||||
|
@ -1992,7 +1994,7 @@ void CompaniesMonthlyLoop()
|
||||||
}
|
}
|
||||||
CompaniesPayInterest();
|
CompaniesPayInterest();
|
||||||
HandleEconomyFluctuations();
|
HandleEconomyFluctuations();
|
||||||
}
|
});
|
||||||
|
|
||||||
static void DoAcquireCompany(Company *c)
|
static void DoAcquireCompany(Company *c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "articulated_vehicles.h"
|
#include "articulated_vehicles.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "engine_base.h"
|
#include "engine_base.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/engines.h"
|
#include "table/engines.h"
|
||||||
|
@ -878,7 +880,7 @@ static bool IsVehicleTypeDisabled(VehicleType type, bool ai)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Daily check to offer an exclusive engine preview to the companies. */
|
/** Daily check to offer an exclusive engine preview to the companies. */
|
||||||
void EnginesDailyLoop()
|
static IntervalTimer<TimerGameCalendar> _engines_daily({TimerGameCalendar::DAY, TimerGameCalendar::Priority::ENGINE}, [](auto)
|
||||||
{
|
{
|
||||||
for (Company *c : Company::Iterate()) {
|
for (Company *c : Company::Iterate()) {
|
||||||
c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date);
|
c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date);
|
||||||
|
@ -915,7 +917,7 @@ void EnginesDailyLoop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the 'hidden' flag for all engines of a new company.
|
* Clear the 'hidden' flag for all engines of a new company.
|
||||||
|
@ -1110,6 +1112,11 @@ void EnginesMonthlyLoop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IntervalTimer<TimerGameCalendar> _engines_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::ENGINE}, [](auto)
|
||||||
|
{
|
||||||
|
EnginesMonthlyLoop();
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is \a name still free as name for an engine?
|
* Is \a name still free as name for an engine?
|
||||||
* @param name New name of an engine.
|
* @param name New name of an engine.
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
#include "hotkeys.h"
|
#include "hotkeys.h"
|
||||||
#include "zoom_func.h"
|
#include "zoom_func.h"
|
||||||
#include "misc_cmd.h"
|
#include "misc_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
#include "date_func.h"
|
||||||
|
|
||||||
#include "widgets/highscore_widget.h"
|
#include "widgets/highscore_widget.h"
|
||||||
|
|
||||||
|
@ -250,3 +253,14 @@ void ShowEndGameChart()
|
||||||
CloseWindowByClass(WC_ENDSCREEN);
|
CloseWindowByClass(WC_ENDSCREEN);
|
||||||
new EndGameWindow(&_endgame_desc);
|
new EndGameWindow(&_endgame_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IntervalTimer<TimerGameCalendar> _check_end_game({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
|
{
|
||||||
|
/* 0 = never */
|
||||||
|
if (_settings_game.game_creation.ending_year == 0) return;
|
||||||
|
|
||||||
|
/* Show the end-game chart at the end of the ending year (hence the + 1). */
|
||||||
|
if (_cur_year == _settings_game.game_creation.ending_year + 1) {
|
||||||
|
ShowEndGameChart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
#include "industry_cmd.h"
|
#include "industry_cmd.h"
|
||||||
#include "landscape_cmd.h"
|
#include "landscape_cmd.h"
|
||||||
#include "terraform_cmd.h"
|
#include "terraform_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/industry_land.h"
|
#include "table/industry_land.h"
|
||||||
|
@ -2947,7 +2949,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly)
|
||||||
* For small maps, it implies that less than one change per month is required, while on bigger maps,
|
* For small maps, it implies that less than one change per month is required, while on bigger maps,
|
||||||
* it would be way more. The daily loop handles those changes.
|
* it would be way more. The daily loop handles those changes.
|
||||||
*/
|
*/
|
||||||
void IndustryDailyLoop()
|
static IntervalTimer<TimerGameCalendar> _industries_daily({TimerGameCalendar::DAY, TimerGameCalendar::Priority::INDUSTRY}, [](auto)
|
||||||
{
|
{
|
||||||
_economy.industry_daily_change_counter += _economy.industry_daily_increment;
|
_economy.industry_daily_change_counter += _economy.industry_daily_increment;
|
||||||
|
|
||||||
|
@ -2987,9 +2989,9 @@ void IndustryDailyLoop()
|
||||||
|
|
||||||
/* production-change */
|
/* production-change */
|
||||||
InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);
|
InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);
|
||||||
}
|
});
|
||||||
|
|
||||||
void IndustryMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _industries_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::INDUSTRY}, [](auto)
|
||||||
{
|
{
|
||||||
Backup<CompanyID> cur_company(_current_company, OWNER_NONE, FILE_LINE);
|
Backup<CompanyID> cur_company(_current_company, OWNER_NONE, FILE_LINE);
|
||||||
|
|
||||||
|
@ -3009,7 +3011,7 @@ void IndustryMonthlyLoop()
|
||||||
|
|
||||||
/* production-change */
|
/* production-change */
|
||||||
InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);
|
InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_PRODUCTION_CHANGE);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
|
||||||
void InitializeIndustries()
|
void InitializeIndustries()
|
||||||
|
|
|
@ -65,9 +65,6 @@ void NetworkPrintClients();
|
||||||
void NetworkHandlePauseChange(PauseMode prev_mode, PauseMode changed_mode);
|
void NetworkHandlePauseChange(PauseMode prev_mode, PauseMode changed_mode);
|
||||||
|
|
||||||
/*** Commands ran by the server ***/
|
/*** Commands ran by the server ***/
|
||||||
void NetworkServerDailyLoop();
|
|
||||||
void NetworkServerMonthlyLoop();
|
|
||||||
void NetworkServerYearlyLoop();
|
|
||||||
void NetworkServerSendConfigUpdate();
|
void NetworkServerSendConfigUpdate();
|
||||||
void NetworkServerUpdateGameInfo();
|
void NetworkServerUpdateGameInfo();
|
||||||
void NetworkServerShowStatusToConsole();
|
void NetworkServerShowStatusToConsole();
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#include "../core/random_func.hpp"
|
#include "../core/random_func.hpp"
|
||||||
#include "../company_cmd.h"
|
#include "../company_cmd.h"
|
||||||
#include "../rev.h"
|
#include "../rev.h"
|
||||||
|
#include "../timer/timer.h"
|
||||||
|
#include "../timer/timer_game_calendar.h"
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
|
||||||
|
@ -1812,26 +1814,32 @@ void NetworkServer_Tick(bool send_frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Yearly "callback". Called whenever the year changes. */
|
/** Yearly "callback". Called whenever the year changes. */
|
||||||
void NetworkServerYearlyLoop()
|
static IntervalTimer<TimerGameCalendar> _network_yearly({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
{
|
{
|
||||||
|
if (!_network_server) return;
|
||||||
|
|
||||||
NetworkCheckRestartMap();
|
NetworkCheckRestartMap();
|
||||||
NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);
|
NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);
|
||||||
}
|
});
|
||||||
|
|
||||||
/** Monthly "callback". Called whenever the month changes. */
|
/** Monthly "callback". Called whenever the month changes. */
|
||||||
void NetworkServerMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _network_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
{
|
{
|
||||||
|
if (!_network_server) return;
|
||||||
|
|
||||||
NetworkAutoCleanCompanies();
|
NetworkAutoCleanCompanies();
|
||||||
NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY);
|
NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY);
|
||||||
if ((_cur_month % 3) == 0) NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY);
|
if ((_cur_month % 3) == 0) NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY);
|
||||||
}
|
});
|
||||||
|
|
||||||
/** Daily "callback". Called whenever the date changes. */
|
/** Daily "callback". Called whenever the date changes. */
|
||||||
void NetworkServerDailyLoop()
|
static IntervalTimer<TimerGameCalendar> _network_daily({TimerGameCalendar::DAY, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
{
|
{
|
||||||
|
if (!_network_server) return;
|
||||||
|
|
||||||
NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY);
|
NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY);
|
||||||
if ((_date % 7) == 3) NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY);
|
if ((_date % 7) == 3) NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY);
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the IP address/hostname of the connected client.
|
* Get the IP address/hostname of the connected client.
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include "console_func.h"
|
#include "console_func.h"
|
||||||
#include "spritecache.h"
|
#include "spritecache.h"
|
||||||
#include "walltime_func.h"
|
#include "walltime_func.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
|
@ -158,3 +160,13 @@ uint32 NewGRFProfiler::FinishAll()
|
||||||
|
|
||||||
return total_microseconds;
|
return total_microseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether profiling is active and should be finished.
|
||||||
|
*/
|
||||||
|
static IntervalTimer<TimerGameCalendar> _check_profiling_finished({TimerGameCalendar::DAY, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
|
{
|
||||||
|
if (_newgrf_profilers.empty() || _newgrf_profile_end_date > _date) return;
|
||||||
|
|
||||||
|
NewGRFProfiler::FinishAll();
|
||||||
|
});
|
||||||
|
|
|
@ -101,6 +101,15 @@ bool _save_config = false;
|
||||||
bool _request_newgrf_scan = false;
|
bool _request_newgrf_scan = false;
|
||||||
NewGRFScanCallback *_request_newgrf_scan_callback = nullptr;
|
NewGRFScanCallback *_request_newgrf_scan_callback = nullptr;
|
||||||
|
|
||||||
|
/** Available settings for autosave intervals. */
|
||||||
|
static const Month _autosave_months[] = {
|
||||||
|
0, ///< never
|
||||||
|
1, ///< every month
|
||||||
|
3, ///< every 3 months
|
||||||
|
6, ///< every 6 months
|
||||||
|
12, ///< every 12 months
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error handling for fatal user errors.
|
* Error handling for fatal user errors.
|
||||||
* @param s the string to print.
|
* @param s the string to print.
|
||||||
|
@ -1432,6 +1441,15 @@ void StateGameLoop()
|
||||||
assert(IsLocalCompany());
|
assert(IsLocalCompany());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IntervalTimer<TimerGameCalendar> _autosave_interval({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::AUTOSAVE}, [](auto)
|
||||||
|
{
|
||||||
|
if (_settings_client.gui.autosave == 0) return;
|
||||||
|
if ((_cur_month % _autosave_months[_settings_client.gui.autosave]) != 0) return;
|
||||||
|
|
||||||
|
_do_autosave = true;
|
||||||
|
SetWindowDirty(WC_STATUS_BAR, 0);
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an autosave. The default name is "autosave#.sav". However with
|
* Create an autosave. The default name is "autosave#.sav". However with
|
||||||
* the setting 'keep_all_autosave' the name defaults to company-name + date
|
* the setting 'keep_all_autosave' the name defaults to company-name + date
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include "tunnelbridge_cmd.h"
|
#include "tunnelbridge_cmd.h"
|
||||||
#include "waypoint_cmd.h"
|
#include "waypoint_cmd.h"
|
||||||
#include "rail_cmd.h"
|
#include "rail_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "station_map.h"
|
#include "station_map.h"
|
||||||
#include "tunnelbridge_map.h"
|
#include "tunnelbridge_map.h"
|
||||||
|
@ -1505,6 +1507,10 @@ public:
|
||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->SetDirty();
|
||||||
|
}};
|
||||||
|
|
||||||
static HotkeyList hotkeys;
|
static HotkeyList hotkeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2201,6 +2207,13 @@ void ResetSignalVariant(int32 new_value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static IntervalTimer<TimerGameCalendar> _check_reset_signal({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
|
||||||
|
{
|
||||||
|
if (_cur_year != _settings_client.gui.semaphore_build_before) return;
|
||||||
|
|
||||||
|
ResetSignalVariant();
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the rail GUI - sets default railtype to build
|
* Resets the rail GUI - sets default railtype to build
|
||||||
* and resets the signal GUI
|
* and resets the signal GUI
|
||||||
|
|
|
@ -39,6 +39,8 @@
|
||||||
#include "sortlist_type.h"
|
#include "sortlist_type.h"
|
||||||
#include "stringfilter_type.h"
|
#include "stringfilter_type.h"
|
||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "widgets/road_widget.h"
|
#include "widgets/road_widget.h"
|
||||||
|
|
||||||
|
@ -1586,6 +1588,10 @@ public:
|
||||||
CheckRedrawStationCoverage(this);
|
CheckRedrawStationCoverage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->InvalidateData();
|
||||||
|
}};
|
||||||
|
|
||||||
static HotkeyList hotkeys;
|
static HotkeyList hotkeys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,8 @@
|
||||||
#include "landscape_cmd.h"
|
#include "landscape_cmd.h"
|
||||||
#include "rail_cmd.h"
|
#include "rail_cmd.h"
|
||||||
#include "newgrf_roadstop.h"
|
#include "newgrf_roadstop.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -4007,7 +4009,7 @@ void OnTick_Station()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Monthly loop for stations. */
|
/** Monthly loop for stations. */
|
||||||
void StationMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _stations_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::STATION}, [](auto)
|
||||||
{
|
{
|
||||||
for (Station *st : Station::Iterate()) {
|
for (Station *st : Station::Iterate()) {
|
||||||
for (CargoID i = 0; i < NUM_CARGO; i++) {
|
for (CargoID i = 0; i < NUM_CARGO; i++) {
|
||||||
|
@ -4016,8 +4018,7 @@ void StationMonthlyLoop()
|
||||||
ClrBit(ge->status, GoodsEntry::GES_CURRENT_MONTH);
|
ClrBit(ge->status, GoodsEntry::GES_CURRENT_MONTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
|
||||||
void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint radius)
|
void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint radius)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "core/geometry_func.hpp"
|
#include "core/geometry_func.hpp"
|
||||||
#include "zoom_func.h"
|
#include "zoom_func.h"
|
||||||
#include "timer/timer.h"
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
#include "timer/timer_window.h"
|
#include "timer/timer_window.h"
|
||||||
|
|
||||||
#include "widgets/statusbar_widget.h"
|
#include "widgets/statusbar_widget.h"
|
||||||
|
@ -233,6 +234,10 @@ struct StatusBarWindow : Window {
|
||||||
TimeoutTimer<TimerWindow> reminder_timeout = {REMINDER_START, [this]() {
|
TimeoutTimer<TimerWindow> reminder_timeout = {REMINDER_START, [this]() {
|
||||||
this->SetWidgetDirty(WID_S_MIDDLE);
|
this->SetWidgetDirty(WID_S_MIDDLE);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::DAY, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
this->SetWidgetDirty(WID_S_LEFT);
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
static const NWidgetPart _nested_main_status_widgets[] = {
|
static const NWidgetPart _nested_main_status_widgets[] = {
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
#include "tile_cmd.h"
|
#include "tile_cmd.h"
|
||||||
#include "subsidy_cmd.h"
|
#include "subsidy_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -477,7 +479,7 @@ bool FindSubsidyCargoDestination(CargoID cid, SourceType src_type, SourceID src)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Perform the monthly update of open subsidies, and try to create a new one. */
|
/** Perform the monthly update of open subsidies, and try to create a new one. */
|
||||||
void SubsidyMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _subsidies_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::SUBSIDY}, [](auto)
|
||||||
{
|
{
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
|
|
||||||
|
@ -547,7 +549,7 @@ void SubsidyMonthlyLoop()
|
||||||
modified |= passenger_subsidy || town_subsidy || industry_subsidy;
|
modified |= passenger_subsidy || town_subsidy || industry_subsidy;
|
||||||
|
|
||||||
if (modified) InvalidateWindowData(WC_SUBSIDIES_LIST, 0);
|
if (modified) InvalidateWindowData(WC_SUBSIDIES_LIST, 0);
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests whether given delivery is subsidised and possibly awards the subsidy to delivering company
|
* Tests whether given delivery is subsidised and possibly awards the subsidy to delivering company
|
||||||
|
|
|
@ -86,4 +86,15 @@ void TimerManager<TimerGameCalendar>::Elapsed(TimerGameCalendar::TElapsed delta)
|
||||||
timer->Elapsed(TimerGameCalendar::YEAR);
|
timer->Elapsed(TimerGameCalendar::YEAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if we reached the maximum year, decrement dates by a year */
|
||||||
|
if (_cur_year == MAX_YEAR + 1) {
|
||||||
|
int days_this_year;
|
||||||
|
|
||||||
|
_cur_year--;
|
||||||
|
days_this_year = IsLeapYear(_cur_year) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR;
|
||||||
|
_date -= days_this_year;
|
||||||
|
for (Vehicle *v : Vehicle::Iterate()) v->ShiftDates(-days_this_year);
|
||||||
|
for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(-days_this_year);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,8 @@
|
||||||
#include "road_cmd.h"
|
#include "road_cmd.h"
|
||||||
#include "terraform_cmd.h"
|
#include "terraform_cmd.h"
|
||||||
#include "tunnelbridge_cmd.h"
|
#include "tunnelbridge_cmd.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/town_land.h"
|
#include "table/town_land.h"
|
||||||
|
@ -3756,7 +3758,7 @@ CommandCost CheckforTownRating(DoCommandFlag flags, Town *t, TownRatingCheckType
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TownsMonthlyLoop()
|
static IntervalTimer<TimerGameCalendar> _towns_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::TOWN}, [](auto)
|
||||||
{
|
{
|
||||||
for (Town *t : Town::Iterate()) {
|
for (Town *t : Town::Iterate()) {
|
||||||
if (t->road_build_months != 0) t->road_build_months--;
|
if (t->road_build_months != 0) t->road_build_months--;
|
||||||
|
@ -3770,17 +3772,16 @@ void TownsMonthlyLoop()
|
||||||
UpdateTownRating(t);
|
UpdateTownRating(t);
|
||||||
UpdateTownUnwanted(t);
|
UpdateTownUnwanted(t);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
static IntervalTimer<TimerGameCalendar> _towns_yearly({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::TOWN}, [](auto)
|
||||||
|
|
||||||
void TownsYearlyLoop()
|
|
||||||
{
|
{
|
||||||
/* Increment house ages */
|
/* Increment house ages */
|
||||||
for (TileIndex t = 0; t < Map::Size(); t++) {
|
for (TileIndex t = 0; t < Map::Size(); t++) {
|
||||||
if (!IsTileType(t, MP_HOUSE)) continue;
|
if (!IsTileType(t, MP_HOUSE)) continue;
|
||||||
IncrementHouseAge(t);
|
IncrementHouseAge(t);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
static CommandCost TerraformTile_Town(TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
|
static CommandCost TerraformTile_Town(TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "town_kdtree.h"
|
#include "town_kdtree.h"
|
||||||
#include "town_cmd.h"
|
#include "town_cmd.h"
|
||||||
#include "timer/timer.h"
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
#include "timer/timer_window.h"
|
#include "timer/timer_window.h"
|
||||||
|
|
||||||
#include "widgets/town_widget.h"
|
#include "widgets/town_widget.h"
|
||||||
|
@ -596,6 +597,11 @@ public:
|
||||||
|
|
||||||
Command<CMD_RENAME_TOWN>::Post(STR_ERROR_CAN_T_RENAME_TOWN, this->window_number, str);
|
Command<CMD_RENAME_TOWN>::Post(STR_ERROR_CAN_T_RENAME_TOWN, this->window_number, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::DAY, TimerGameCalendar::Priority::NONE}, [this](auto) {
|
||||||
|
/* Refresh after possible snowline change */
|
||||||
|
this->SetDirty();
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
static const NWidgetPart _nested_town_game_view_widgets[] = {
|
static const NWidgetPart _nested_town_game_view_widgets[] = {
|
||||||
|
|
|
@ -56,6 +56,8 @@
|
||||||
#include "train_cmd.h"
|
#include "train_cmd.h"
|
||||||
#include "vehicle_cmd.h"
|
#include "vehicle_cmd.h"
|
||||||
#include "newgrf_roadstop.h"
|
#include "newgrf_roadstop.h"
|
||||||
|
#include "timer/timer.h"
|
||||||
|
#include "timer/timer_game_calendar.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -2826,7 +2828,7 @@ void Vehicle::RemoveFromShared()
|
||||||
this->previous_shared = nullptr;
|
this->previous_shared = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VehiclesYearlyLoop()
|
static IntervalTimer<TimerGameCalendar> _vehicles_yearly({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::VEHICLE}, [](auto)
|
||||||
{
|
{
|
||||||
for (Vehicle *v : Vehicle::Iterate()) {
|
for (Vehicle *v : Vehicle::Iterate()) {
|
||||||
if (v->IsPrimaryVehicle()) {
|
if (v->IsPrimaryVehicle()) {
|
||||||
|
@ -2851,8 +2853,7 @@ void VehiclesYearlyLoop()
|
||||||
SetWindowClassesDirty(WC_SHIPS_LIST);
|
SetWindowClassesDirty(WC_SHIPS_LIST);
|
||||||
SetWindowClassesDirty(WC_ROADVEH_LIST);
|
SetWindowClassesDirty(WC_ROADVEH_LIST);
|
||||||
SetWindowClassesDirty(WC_AIRCRAFT_LIST);
|
SetWindowClassesDirty(WC_AIRCRAFT_LIST);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Can this station be used by the given engine type?
|
* Can this station be used by the given engine type?
|
||||||
|
|
Loading…
Reference in New Issue