OpenTTD Source  20241121-master-g67a0fccfad
survey.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "stdafx.h"
11 
12 #include "survey.h"
13 
14 #include "settings_table.h"
15 #include "network/network.h"
16 #include "rev.h"
17 #include "settings_type.h"
18 #include "timer/timer_game_tick.h"
21 
22 #include "currency.h"
23 #include "fontcache.h"
24 #include "language.h"
25 
26 #include "ai/ai_info.hpp"
27 #include "game/game.hpp"
28 #include "game/game_info.hpp"
29 
30 #include "music/music_driver.hpp"
31 #include "sound/sound_driver.hpp"
32 #include "video/video_driver.hpp"
33 
34 #include "base_media_base.h"
35 #include "blitter/factory.hpp"
36 
37 #include "social_integration.h"
38 
39 #ifdef WITH_ALLEGRO
40 # include <allegro.h>
41 #endif /* WITH_ALLEGRO */
42 #ifdef WITH_FONTCONFIG
43 # include <fontconfig/fontconfig.h>
44 #endif /* WITH_FONTCONFIG */
45 #ifdef WITH_PNG
46  /* pngconf.h, included by png.h doesn't like something in the
47  * freetype headers. As such it's not alphabetically sorted. */
48 # include <png.h>
49 #endif /* WITH_PNG */
50 #ifdef WITH_FREETYPE
51 # include <ft2build.h>
52 # include FT_FREETYPE_H
53 #endif /* WITH_FREETYPE */
54 #ifdef WITH_HARFBUZZ
55 # include <hb.h>
56 #endif /* WITH_HARFBUZZ */
57 #ifdef WITH_ICU_I18N
58 # include <unicode/uversion.h>
59 #endif /* WITH_ICU_I18N */
60 #ifdef WITH_LIBLZMA
61 # include <lzma.h>
62 #endif
63 #ifdef WITH_LZO
64 #include <lzo/lzo1x.h>
65 #endif
66 #if defined(WITH_SDL) || defined(WITH_SDL2)
67 # include <SDL.h>
68 #endif /* WITH_SDL || WITH_SDL2 */
69 #ifdef WITH_ZLIB
70 # include <zlib.h>
71 #endif
72 #ifdef WITH_CURL
73 # include <curl/curl.h>
74 #endif
75 
76 #include "safeguards.h"
77 
79  {GRFStatus::GCS_UNKNOWN, "unknown"},
80  {GRFStatus::GCS_DISABLED, "disabled"},
81  {GRFStatus::GCS_NOT_FOUND, "not found"},
82  {GRFStatus::GCS_INITIALISED, "initialised"},
83  {GRFStatus::GCS_ACTIVATED, "activated"},
84 })
85 
87  {SocialIntegrationPlugin::State::RUNNING, "running"},
88  {SocialIntegrationPlugin::State::FAILED, "failed"},
89  {SocialIntegrationPlugin::State::PLATFORM_NOT_RUNNING, "platform_not_running"},
90  {SocialIntegrationPlugin::State::UNLOADED, "unloaded"},
91  {SocialIntegrationPlugin::State::DUPLICATE, "duplicate"},
92  {SocialIntegrationPlugin::State::UNSUPPORTED_API, "unsupported_api"},
93  {SocialIntegrationPlugin::State::INVALID_SIGNATURE, "invalid_signature"},
94 })
95 
96 
98 static const std::string _vehicle_type_to_string[] = {
99  "train",
100  "roadveh",
101  "ship",
102  "aircraft",
103 };
104 
115 static auto &GenericSettingTables()
116 {
117  static const SettingTable _generic_setting_tables[] = {
118  _difficulty_settings,
119  _economy_settings,
120  _game_settings,
121  _gui_settings,
122  _linkgraph_settings,
123  _locale_settings,
124  _multimedia_settings,
125  _network_settings,
126  _news_display_settings,
127  _pathfinding_settings,
128  _script_settings,
129  _world_settings,
130  };
131  return _generic_setting_tables;
132 }
133 
142 static void SurveySettingsTable(nlohmann::json &survey, const SettingTable &table, void *object, bool skip_if_default)
143 {
144  for (auto &desc : table) {
145  const SettingDesc *sd = GetSettingDesc(desc);
146  /* Skip any old settings we no longer save/load. */
147  if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to)) continue;
148 
149  auto name = sd->GetName();
150  if (skip_if_default && sd->IsDefaultValue(object)) continue;
151  survey[name] = sd->FormatValue(object);
152  }
153 }
154 
160 void SurveySettings(nlohmann::json &survey, bool skip_if_default)
161 {
162  SurveySettingsTable(survey, _misc_settings, nullptr, skip_if_default);
163 #if defined(_WIN32) && !defined(DEDICATED)
164  SurveySettingsTable(survey, _win32_settings, nullptr, skip_if_default);
165 #endif
166  for (auto &table : GenericSettingTables()) {
167  SurveySettingsTable(survey, table, &_settings_game, skip_if_default);
168  }
169  SurveySettingsTable(survey, _currency_settings, &GetCustomCurrency(), skip_if_default);
170  SurveySettingsTable(survey, _company_settings, &_settings_client.company, skip_if_default);
171 }
172 
178 void SurveyCompiler(nlohmann::json &survey)
179 {
180 #if defined(_MSC_VER)
181  survey["name"] = "MSVC";
182  survey["version"] = _MSC_VER;
183 #elif defined(__ICC) && defined(__GNUC__)
184  survey["name"] = "ICC";
185  survey["version"] = __ICC;
186 # if defined(__GNUC__)
187  survey["extra"] = fmt::format("GCC {}.{}.{} mode", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
188 # endif
189 #elif defined(__GNUC__)
190  survey["name"] = "GCC";
191  survey["version"] = fmt::format("{}.{}.{}", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
192 #else
193  survey["name"] = "unknown";
194 #endif
195 
196 #if defined(__VERSION__)
197  survey["extra"] = __VERSION__;
198 #endif
199 }
200 
206 void SurveyOpenTTD(nlohmann::json &survey)
207 {
208  survey["version"]["revision"] = std::string(_openttd_revision);
209  survey["version"]["modified"] = _openttd_revision_modified;
210  survey["version"]["tagged"] = _openttd_revision_tagged;
211  survey["version"]["hash"] = std::string(_openttd_revision_hash);
212  survey["version"]["newgrf"] = fmt::format("{:X}", _openttd_newgrf_version);
213  survey["version"]["content"] = std::string(_openttd_content_version);
214  survey["build_date"] = std::string(_openttd_build_date);
215  survey["bits"] =
216 #ifdef POINTER_IS_64BIT
217  64
218 #else
219  32
220 #endif
221  ;
222  if constexpr (std::endian::native == std::endian::little) survey["endian"] = "little";
223  if constexpr (std::endian::native == std::endian::big) survey["endian"] = "big";
224  survey["dedicated_build"] =
225 #ifdef DEDICATED
226  "yes"
227 #else
228  "no"
229 #endif
230  ;
231 }
232 
238 void SurveyGameSession(nlohmann::json &survey)
239 {
240  survey["id"] = _game_session_stats.savegame_id;
241  survey["seconds"] = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - _game_session_stats.start_time).count();
242  if (_game_session_stats.savegame_size.has_value()) {
243  survey["savegame_size"] = _game_session_stats.savegame_size.value();
244  }
245 }
246 
252 void SurveyConfiguration(nlohmann::json &survey)
253 {
254  survey["network"] = _networking ? (_network_server ? "server" : "client") : "no";
255  if (_current_language != nullptr) {
256  survey["language"]["filename"] = FS2OTTD(_current_language->file.filename());
257  survey["language"]["name"] = _current_language->name;
258  survey["language"]["isocode"] = _current_language->isocode;
259  }
260  if (BlitterFactory::GetCurrentBlitter() != nullptr) {
261  survey["blitter"] = BlitterFactory::GetCurrentBlitter()->GetName();
262  }
263  if (MusicDriver::GetInstance() != nullptr) {
264  survey["music_driver"] = MusicDriver::GetInstance()->GetName();
265  }
266  if (SoundDriver::GetInstance() != nullptr) {
267  survey["sound_driver"] = SoundDriver::GetInstance()->GetName();
268  }
269  if (VideoDriver::GetInstance() != nullptr) {
270  survey["video_driver"] = VideoDriver::GetInstance()->GetName();
271  survey["video_info"] = VideoDriver::GetInstance()->GetInfoString();
272  }
273  if (BaseGraphics::GetUsedSet() != nullptr) {
274  survey["graphics_set"] = fmt::format("{}.{}", BaseGraphics::GetUsedSet()->name, BaseGraphics::GetUsedSet()->version);
275  const GRFConfig *extra_cfg = BaseGraphics::GetUsedSet()->GetExtraConfig();
276  if (extra_cfg != nullptr && extra_cfg->num_params > 0) {
277  survey["graphics_set_parameters"] = std::span<const uint32_t>(extra_cfg->param.data(), extra_cfg->num_params);
278  } else {
279  survey["graphics_set_parameters"] = std::span<const uint32_t>();
280  }
281  }
282  if (BaseMusic::GetUsedSet() != nullptr) {
283  survey["music_set"] = fmt::format("{}.{}", BaseMusic::GetUsedSet()->name, BaseMusic::GetUsedSet()->version);
284  }
285  if (BaseSounds::GetUsedSet() != nullptr) {
286  survey["sound_set"] = fmt::format("{}.{}", BaseSounds::GetUsedSet()->name, BaseSounds::GetUsedSet()->version);
287  }
288 }
289 
295 void SurveyFont(nlohmann::json &survey)
296 {
297  survey["small"] = FontCache::Get(FS_SMALL)->GetFontName();
298  survey["medium"] = FontCache::Get(FS_NORMAL)->GetFontName();
299  survey["large"] = FontCache::Get(FS_LARGE)->GetFontName();
300  survey["mono"] = FontCache::Get(FS_MONO)->GetFontName();
301 }
302 
308 void SurveyCompanies(nlohmann::json &survey)
309 {
310  for (const Company *c : Company::Iterate()) {
311  auto &company = survey[std::to_string(c->index)];
312  if (c->ai_info == nullptr) {
313  company["type"] = "human";
314  } else {
315  company["type"] = "ai";
316  company["script"] = fmt::format("{}.{}", c->ai_info->GetName(), c->ai_info->GetVersion());
317  }
318 
319  for (VehicleType type = VEH_BEGIN; type < VEH_COMPANY_END; type++) {
320  uint amount = c->group_all[type].num_vehicle;
321  company["vehicles"][_vehicle_type_to_string[type]] = amount;
322  }
323 
324  company["infrastructure"]["road"] = c->infrastructure.GetRoadTotal();
325  company["infrastructure"]["tram"] = c->infrastructure.GetTramTotal();
326  company["infrastructure"]["rail"] = c->infrastructure.GetRailTotal();
327  company["infrastructure"]["signal"] = c->infrastructure.signal;
328  company["infrastructure"]["water"] = c->infrastructure.water;
329  company["infrastructure"]["station"] = c->infrastructure.station;
330  company["infrastructure"]["airport"] = c->infrastructure.airport;
331  }
332 }
333 
339 void SurveyTimers(nlohmann::json &survey)
340 {
341  survey["ticks"] = TimerGameTick::counter;
342 
343  TimerGameEconomy::YearMonthDay economy_ymd = TimerGameEconomy::ConvertDateToYMD(TimerGameEconomy::date);
344  survey["economy"] = fmt::format("{:04}-{:02}-{:02} ({})", economy_ymd.year, economy_ymd.month + 1, economy_ymd.day, TimerGameEconomy::date_fract);
345 
346  TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date);
347  survey["calendar"] = fmt::format("{:04}-{:02}-{:02} ({})", ymd.year, ymd.month + 1, ymd.day, TimerGameCalendar::date_fract);
348 }
349 
355 void SurveyGrfs(nlohmann::json &survey)
356 {
357  for (GRFConfig *c = _grfconfig; c != nullptr; c = c->next) {
358  auto grfid = fmt::format("{:08x}", BSWAP32(c->ident.grfid));
359  auto &grf = survey[grfid];
360 
361  grf["md5sum"] = FormatArrayAsHex(c->ident.md5sum);
362  grf["status"] = c->status;
363 
364  if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_UNSET) grf["palette"] = "unset";
365  if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_DOS) grf["palette"] = "dos";
366  if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_WINDOWS) grf["palette"] = "windows";
367  if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_ANY) grf["palette"] = "any";
368 
369  if ((c->palette & GRFP_BLT_MASK) == GRFP_BLT_UNSET) grf["blitter"] = "unset";
370  if ((c->palette & GRFP_BLT_MASK) == GRFP_BLT_32BPP) grf["blitter"] = "32bpp";
371 
372  grf["is_static"] = HasBit(c->flags, GCF_STATIC);
373  grf["parameters"] = std::span<const uint32_t>(c->param.data(), c->num_params);
374  }
375 }
376 
382 void SurveyGameScript(nlohmann::json &survey)
383 {
384  if (Game::GetInfo() == nullptr) return;
385 
386  survey = fmt::format("{}.{}", Game::GetInfo()->GetName(), Game::GetInfo()->GetVersion());
387 }
388 
394 void SurveyLibraries(nlohmann::json &survey)
395 {
396 #ifdef WITH_ALLEGRO
397  survey["allegro"] = std::string(allegro_id);
398 #endif /* WITH_ALLEGRO */
399 
400 #ifdef WITH_FONTCONFIG
401  int version = FcGetVersion();
402  survey["fontconfig"] = fmt::format("{}.{}.{}", version / 10000, (version / 100) % 100, version % 100);
403 #endif /* WITH_FONTCONFIG */
404 
405 #ifdef WITH_FREETYPE
406  FT_Library library;
407  int major, minor, patch;
408  FT_Init_FreeType(&library);
409  FT_Library_Version(library, &major, &minor, &patch);
410  FT_Done_FreeType(library);
411  survey["freetype"] = fmt::format("{}.{}.{}", major, minor, patch);
412 #endif /* WITH_FREETYPE */
413 
414 #if defined(WITH_HARFBUZZ)
415  survey["harfbuzz"] = hb_version_string();
416 #endif /* WITH_HARFBUZZ */
417 
418 #if defined(WITH_ICU_I18N)
419  /* 4 times 0-255, separated by dots (.) and a trailing '\0' */
420  char buf[4 * 3 + 3 + 1];
421  UVersionInfo ver;
422  u_getVersion(ver);
423  u_versionToString(ver, buf);
424  survey["icu_i18n"] = buf;
425 #endif /* WITH_ICU_I18N */
426 
427 #ifdef WITH_LIBLZMA
428  survey["lzma"] = lzma_version_string();
429 #endif
430 
431 #ifdef WITH_LZO
432  survey["lzo"] = lzo_version_string();
433 #endif
434 
435 #ifdef WITH_PNG
436  survey["png"] = png_get_libpng_ver(nullptr);
437 #endif /* WITH_PNG */
438 
439 #ifdef WITH_SDL
440  const SDL_version *sdl_v = SDL_Linked_Version();
441  survey["sdl"] = fmt::format("{}.{}.{}", sdl_v->major, sdl_v->minor, sdl_v->patch);
442 #elif defined(WITH_SDL2)
443  SDL_version sdl2_v;
444  SDL_GetVersion(&sdl2_v);
445  survey["sdl2"] = fmt::format("{}.{}.{}", sdl2_v.major, sdl2_v.minor, sdl2_v.patch);
446 #endif
447 
448 #ifdef WITH_ZLIB
449  survey["zlib"] = zlibVersion();
450 #endif
451 
452 #ifdef WITH_CURL
453  auto *curl_v = curl_version_info(CURLVERSION_NOW);
454  survey["curl"] = curl_v->version;
455  survey["curl_ssl"] = curl_v->ssl_version == nullptr ? "none" : curl_v->ssl_version;
456 #endif
457 }
458 
464 void SurveyPlugins(nlohmann::json &survey)
465 {
467 
468  for (auto &plugin : _plugins) {
469  auto &platform = survey[plugin->social_platform];
470  platform.push_back({
471  {"name", plugin->name},
472  {"version", plugin->version},
473  {"basepath", plugin->basepath},
474  {"state", plugin->state},
475  });
476  }
477 }
478 
487 std::string SurveyMemoryToText(uint64_t memory)
488 {
489  memory = memory / 1024; // KiB
490  memory = CeilDiv(memory, 1024); // MiB
491 
492  /* Anything above 512 MiB we represent in GiB. */
493  if (memory > 512) {
494  return fmt::format("{} GiB", CeilDiv(memory, 1024));
495  }
496 
497  /* Anything above 64 MiB we represent in a multiplier of 128 MiB. */
498  if (memory > 64) {
499  return fmt::format("{} MiB", Ceil(memory, 128));
500  }
501 
502  /* Anything else in a multiplier of 4 MiB. */
503  return fmt::format("{} MiB", Ceil(memory, 4));
504 }
AIInfo keeps track of all information of an AI, like Author, Description, ...
Generic functions for replacing base data (graphics, sounds).
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
static uint32_t BSWAP32(uint32_t x)
Perform a 32 bits endianness bitswap on x.
static const GraphicsSet * GetUsedSet()
Return the used set.
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
Definition: factory.hpp:138
virtual std::string_view GetName()=0
Get the name of the blitter, the same as the Factory-instance returns.
virtual std::string_view GetName() const =0
Get the name of this driver.
virtual std::string GetFontName()=0
Get the name of this font.
static FontCache * Get(FontSize fs)
Get the font cache of a given font size.
Definition: fontcache.h:129
static class GameInfo * GetInfo()
Get the current GameInfo.
Definition: game.hpp:75
static MusicDriver * GetInstance()
Get the currently active instance of the music driver.
static std::vector< SocialIntegrationPlugin * > GetPlugins()
Get the list of loaded social integration plugins.
static SoundDriver * GetInstance()
Get the currently active instance of the sound driver.
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
static Date date
Current date in days (day counter).
static DateFract date_fract
Fractional part of the day.
static Date date
Current date in days (day counter).
static DateFract date_fract
Fractional part of the day.
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
static TickCounter counter
Monotonic counter, in ticks, since start of game.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
Functions to handle different currencies.
CurrencySpec & GetCustomCurrency()
Get the custom currency.
Definition: currency.h:108
Factory to 'query' all available blitters.
Functions to read fonts from files and cache them.
Base functions for all Games.
GameInfo keeps track of all information of an Game, like Author, Description, ...
GameSessionStats _game_session_stats
Statistics about the current session.
Definition: gfx.cpp:51
@ FS_MONO
Index of the monospaced font in the font tables.
Definition: gfx_type.h:212
@ FS_SMALL
Index of the small font in the font tables.
Definition: gfx_type.h:210
@ FS_NORMAL
Index of the normal font in the font tables.
Definition: gfx_type.h:209
@ FS_LARGE
Index of the large font in the font tables.
Definition: gfx_type.h:211
Information about languages and their files.
const LanguageMetadata * _current_language
The currently loaded language.
Definition: strings.cpp:54
constexpr uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
Definition: math_func.hpp:320
constexpr uint Ceil(uint a, uint b)
Computes ceil(a / b) * b for non-negative a and b.
Definition: math_func.hpp:331
Base for all music playback.
bool _networking
are we in networking mode?
Definition: network.cpp:65
bool _network_server
network-server is active
Definition: network.cpp:66
Basic functions/variables used all over the place.
NLOHMANN_JSON_SERIALIZE_ENUM(NetworkSurveyHandler::Reason, { {NetworkSurveyHandler::Reason::PREVIEW, "preview"}, {NetworkSurveyHandler::Reason::LEAVE, "leave"}, {NetworkSurveyHandler::Reason::EXIT, "exit"}, {NetworkSurveyHandler::Reason::CRASH, "crash"}, }) std
Create the payload for the survey.
GRFConfig * _grfconfig
First item in list of current GRF set up.
@ GRFP_GRF_UNSET
The NewGRF provided no information.
Definition: newgrf_config.h:69
@ GRFP_BLT_UNSET
The NewGRF provided no information or doesn't care about a 32 bpp blitter.
Definition: newgrf_config.h:75
@ GRFP_GRF_WINDOWS
The NewGRF says the Windows palette can be used.
Definition: newgrf_config.h:71
@ GRFP_GRF_DOS
The NewGRF says the DOS palette can be used.
Definition: newgrf_config.h:70
@ GRFP_GRF_ANY
The NewGRF says any palette can be used.
Definition: newgrf_config.h:72
@ GRFP_BLT_MASK
Bitmask to only get the blitter information.
Definition: newgrf_config.h:77
@ GRFP_BLT_32BPP
The NewGRF prefers a 32 bpp blitter.
Definition: newgrf_config.h:76
@ GRFP_GRF_MASK
Bitmask to get only the NewGRF supplied information.
Definition: newgrf_config.h:73
@ GCF_STATIC
GRF file is used statically (can be used in any MP game)
Definition: newgrf_config.h:24
GRFStatus
Status of GRF.
Definition: newgrf_config.h:33
@ GCS_INITIALISED
GRF file has been initialised.
Definition: newgrf_config.h:37
@ GCS_DISABLED
GRF file is disabled.
Definition: newgrf_config.h:35
@ GCS_NOT_FOUND
GRF file was not found in the local cache.
Definition: newgrf_config.h:36
@ GCS_UNKNOWN
The status of this grf file is unknown.
Definition: newgrf_config.h:34
@ GCS_ACTIVATED
GRF file has been activated.
Definition: newgrf_config.h:38
declaration of OTTD revision dependent variables
A number of safeguards to prevent using unsafe methods.
bool SlIsObjectCurrentlyValid(SaveLoadVersion version_from, SaveLoadVersion version_to)
Checks if some version from/to combination falls within the range of the active savegame version.
Definition: saveload.h:1266
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:57
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:56
static constexpr const SettingDesc * GetSettingDesc(const SettingVariant &desc)
Helper to convert the type of the iterated settings description to a pointer to it.
Definition of the configuration tables of the settings.
Types related to global configuration settings.
static std::vector< std::unique_ptr< InternalSocialIntegrationPlugin > > _plugins
List of loaded plugins.
Interface definitions for game to report/respond to social integration.
Base for all sound drivers.
Definition of base types and functions in a cross-platform compatible way.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
Definition: string.cpp:81
CompanySettings company
default values for per-company settings
Information about GRF, used in the game and (part of it) in savegames.
uint8_t num_params
Number of used parameters.
struct GRFConfig * next
NOSAVE: Next item in the linked list.
std::array< uint32_t, 0x80 > param
GRF parameters.
std::chrono::steady_clock::time_point start_time
Time when the current game was started.
Definition: openttd.h:56
std::string savegame_id
Unique ID of the savegame.
Definition: openttd.h:57
std::optional< size_t > savegame_size
Size of the last saved savegame in bytes, or std::nullopt if not saved yet.
Definition: openttd.h:58
std::filesystem::path file
Name of the file we read this data from.
Definition: language.h:94
char isocode[16]
the ISO code for the language (not country code)
Definition: language.h:31
char name[32]
the international name of this language
Definition: language.h:29
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:388
SaveLoadVersion version_to
Save/load the variable before this savegame version.
Definition: saveload.h:719
SaveLoadVersion version_from
Save/load the variable starting from this savegame version.
Definition: saveload.h:718
Properties of config file settings.
constexpr const std::string & GetName() const
Get the name of this setting.
virtual std::string FormatValue(const void *object) const =0
Format the value of the setting associated with this object.
virtual bool IsDefaultValue(void *object) const =0
Check whether the value is the same as the default value.
SaveLoad save
Internal structure (going to savegame, parts to config).
void SurveySettings(nlohmann::json &survey, bool skip_if_default)
Convert settings to JSON.
Definition: survey.cpp:160
void SurveyPlugins(nlohmann::json &survey)
Convert plugin information to JSON.
Definition: survey.cpp:464
void SurveyTimers(nlohmann::json &survey)
Convert timer information to JSON.
Definition: survey.cpp:339
static void SurveySettingsTable(nlohmann::json &survey, const SettingTable &table, void *object, bool skip_if_default)
Convert a settings table to JSON.
Definition: survey.cpp:142
void SurveyGameSession(nlohmann::json &survey)
Convert game session information to JSON.
Definition: survey.cpp:238
std::string SurveyMemoryToText(uint64_t memory)
Change the bytes of memory into a textual version rounded up to the biggest unit.
Definition: survey.cpp:487
void SurveyGameScript(nlohmann::json &survey)
Convert game-script information to JSON.
Definition: survey.cpp:382
void SurveyConfiguration(nlohmann::json &survey)
Convert generic game information to JSON.
Definition: survey.cpp:252
void SurveyOpenTTD(nlohmann::json &survey)
Convert generic OpenTTD information to JSON.
Definition: survey.cpp:206
void SurveyFont(nlohmann::json &survey)
Convert font information to JSON.
Definition: survey.cpp:295
void SurveyCompanies(nlohmann::json &survey)
Convert company information to JSON.
Definition: survey.cpp:308
void SurveyCompiler(nlohmann::json &survey)
Convert compiler information to JSON.
Definition: survey.cpp:178
void SurveyLibraries(nlohmann::json &survey)
Convert compiled libraries information to JSON.
Definition: survey.cpp:394
static auto & GenericSettingTables()
List of all the generic setting tables.
Definition: survey.cpp:115
static const std::string _vehicle_type_to_string[]
Lookup table to convert a VehicleType to a string.
Definition: survey.cpp:98
void SurveyGrfs(nlohmann::json &survey)
Convert GRF information to JSON.
Definition: survey.cpp:355
Functions to survey the current game / system, for crashlog and network-survey.
Definition of the game-calendar-timer.
Definition of the game-economy-timer.
Definition of the tick-based game-timer.
VehicleType
Available vehicle types.
Definition: vehicle_type.h:21
@ VEH_COMPANY_END
Last company-ownable type.
Definition: vehicle_type.h:29
Base of all video drivers.
std::string FS2OTTD(const std::wstring &name)
Convert to OpenTTD's encoding from a wide string.
Definition: win32.cpp:337