OpenTTD Source 15.0-RC1
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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
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"
21#include "3rdparty/fmt/ranges.h"
22
23#include "currency.h"
24#include "fontcache.h"
25#include "language.h"
26
27#include "ai/ai_info.hpp"
28#include "game/game.hpp"
29#include "game/game_info.hpp"
30
34
35#include "base_media_base.h"
36#include "base_media_graphics.h"
37#include "base_media_music.h"
38#include "base_media_sounds.h"
39#include "blitter/factory.hpp"
40
41#include "social_integration.h"
42
43#ifdef WITH_ALLEGRO
44# include <allegro.h>
45#endif /* WITH_ALLEGRO */
46#ifdef WITH_FONTCONFIG
47# include <fontconfig/fontconfig.h>
48#endif /* WITH_FONTCONFIG */
49#ifdef WITH_PNG
50 /* pngconf.h, included by png.h doesn't like something in the
51 * freetype headers. As such it's not alphabetically sorted. */
52# include <png.h>
53#endif /* WITH_PNG */
54#ifdef WITH_FREETYPE
55# include <ft2build.h>
56# include FT_FREETYPE_H
57#endif /* WITH_FREETYPE */
58#ifdef WITH_HARFBUZZ
59# include <hb.h>
60#endif /* WITH_HARFBUZZ */
61#ifdef WITH_ICU_I18N
62# include <unicode/uversion.h>
63#endif /* WITH_ICU_I18N */
64#ifdef WITH_LIBLZMA
65# include <lzma.h>
66#endif
67#ifdef WITH_LZO
68#include <lzo/lzo1x.h>
69#endif
70#ifdef WITH_SDL2
71#include <SDL.h>
72#endif /* WITH_SDL2 */
73#ifdef WITH_ZLIB
74# include <zlib.h>
75#endif
76#ifdef WITH_CURL
77# include <curl/curl.h>
78#endif
79
80#include "safeguards.h"
81
83 {GRFStatus::GCS_UNKNOWN, "unknown"},
84 {GRFStatus::GCS_DISABLED, "disabled"},
85 {GRFStatus::GCS_NOT_FOUND, "not found"},
86 {GRFStatus::GCS_INITIALISED, "initialised"},
87 {GRFStatus::GCS_ACTIVATED, "activated"},
88})
89
98})
99
100
102static const std::string _vehicle_type_to_string[] = {
103 "train",
104 "roadveh",
105 "ship",
106 "aircraft",
107};
108
120{
121 static const SettingTable _generic_setting_tables[] = {
122 _difficulty_settings,
123 _economy_settings,
124 _game_settings,
125 _gui_settings,
126 _linkgraph_settings,
127 _locale_settings,
128 _multimedia_settings,
129 _network_settings,
130 _news_display_settings,
131 _pathfinding_settings,
132 _script_settings,
133 _world_settings,
134 };
135 return _generic_setting_tables;
136}
137
146static void SurveySettingsTable(nlohmann::json &survey, const SettingTable &table, void *object, bool skip_if_default)
147{
148 for (auto &desc : table) {
149 const SettingDesc *sd = GetSettingDesc(desc);
150 /* Skip any old settings we no longer save/load. */
152
153 const auto &name = sd->GetName();
154 if (skip_if_default && sd->IsDefaultValue(object)) continue;
155 survey[name] = sd->FormatValue(object);
156 }
157}
158
164void SurveySettings(nlohmann::json &survey, bool skip_if_default)
165{
166 SurveySettingsTable(survey, _misc_settings, nullptr, skip_if_default);
167#if defined(_WIN32) && !defined(DEDICATED)
168 SurveySettingsTable(survey, _win32_settings, nullptr, skip_if_default);
169#endif
170 for (auto &table : GenericSettingTables()) {
171 SurveySettingsTable(survey, table, &_settings_game, skip_if_default);
172 }
173 SurveySettingsTable(survey, _currency_settings, &GetCustomCurrency(), skip_if_default);
174 SurveySettingsTable(survey, _company_settings, &_settings_client.company, skip_if_default);
175}
176
182void SurveyCompiler(nlohmann::json &survey)
183{
184#if defined(_MSC_VER)
185 survey["name"] = "MSVC";
186 survey["version"] = _MSC_VER;
187#elif defined(__ICC) && defined(__GNUC__)
188 survey["name"] = "ICC";
189 survey["version"] = __ICC;
190# if defined(__GNUC__)
191 survey["extra"] = fmt::format("GCC {}.{}.{} mode", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
192# endif
193#elif defined(__GNUC__)
194 survey["name"] = "GCC";
195 survey["version"] = fmt::format("{}.{}.{}", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
196#else
197 survey["name"] = "unknown";
198#endif
199
200#if defined(__VERSION__)
201 survey["extra"] = __VERSION__;
202#endif
203}
204
210void SurveyOpenTTD(nlohmann::json &survey)
211{
212 survey["version"]["revision"] = std::string(_openttd_revision);
213 survey["version"]["modified"] = _openttd_revision_modified;
214 survey["version"]["tagged"] = _openttd_revision_tagged;
215 survey["version"]["hash"] = std::string(_openttd_revision_hash);
216 survey["version"]["newgrf"] = fmt::format("{:X}", _openttd_newgrf_version);
217 survey["version"]["content"] = std::string(_openttd_content_version);
218 survey["build_date"] = std::string(_openttd_build_date);
219 survey["bits"] =
220#ifdef POINTER_IS_64BIT
221 64
222#else
223 32
224#endif
225 ;
226 if constexpr (std::endian::native == std::endian::little) survey["endian"] = "little";
227 if constexpr (std::endian::native == std::endian::big) survey["endian"] = "big";
228 survey["dedicated_build"] =
229#ifdef DEDICATED
230 "yes"
231#else
232 "no"
233#endif
234 ;
235}
236
242void SurveyGameSession(nlohmann::json &survey)
243{
244 survey["id"] = _game_session_stats.savegame_id;
245 survey["seconds"] = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - _game_session_stats.start_time).count();
246 if (_game_session_stats.savegame_size.has_value()) {
247 survey["savegame_size"] = _game_session_stats.savegame_size.value();
248 }
249}
250
256void SurveyConfiguration(nlohmann::json &survey)
257{
258 survey["network"] = _networking ? (_network_server ? "server" : "client") : "no";
259 if (_current_language != nullptr) {
260 survey["language"]["filename"] = FS2OTTD(_current_language->file.filename().native());
261 survey["language"]["name"] = _current_language->name;
262 survey["language"]["isocode"] = _current_language->isocode;
263 }
264 if (BlitterFactory::GetCurrentBlitter() != nullptr) {
265 survey["blitter"] = BlitterFactory::GetCurrentBlitter()->GetName();
266 }
267 if (MusicDriver::GetInstance() != nullptr) {
268 survey["music_driver"] = MusicDriver::GetInstance()->GetName();
269 }
270 if (SoundDriver::GetInstance() != nullptr) {
271 survey["sound_driver"] = SoundDriver::GetInstance()->GetName();
272 }
273 if (VideoDriver::GetInstance() != nullptr) {
274 survey["video_driver"] = VideoDriver::GetInstance()->GetName();
275 survey["video_info"] = VideoDriver::GetInstance()->GetInfoString();
276 }
277 if (BaseGraphics::GetUsedSet() != nullptr) {
278 survey["graphics_set"] = fmt::format("{}.{}", BaseGraphics::GetUsedSet()->name, fmt::join(BaseGraphics::GetUsedSet()->version, "."));
279 const GRFConfig *extra_cfg = BaseGraphics::GetUsedSet()->GetExtraConfig();
280 if (extra_cfg != nullptr && !extra_cfg->param.empty()) {
281 survey["graphics_set_parameters"] = std::span<const uint32_t>(extra_cfg->param);
282 } else {
283 survey["graphics_set_parameters"] = std::span<const uint32_t>();
284 }
285 }
286 if (BaseMusic::GetUsedSet() != nullptr) {
287 survey["music_set"] = fmt::format("{}.{}", BaseMusic::GetUsedSet()->name, fmt::join(BaseMusic::GetUsedSet()->version, "."));
288 }
289 if (BaseSounds::GetUsedSet() != nullptr) {
290 survey["sound_set"] = fmt::format("{}.{}", BaseSounds::GetUsedSet()->name, fmt::join(BaseSounds::GetUsedSet()->version, "."));
291 }
292}
293
299void SurveyFont(nlohmann::json &survey)
300{
301 for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) {
302 const FontCacheSubSetting *setting = GetFontCacheSubSetting(fs);
303 auto &font = survey[std::string(FontSizeToName(fs))];
304 font["configured"]["font"] = setting->font;
305 font["configured"]["size"] = setting->size;
306 }
307 for (const auto &fc : FontCache::Get()) {
308 auto &font = survey[std::string(FontSizeToName(fc->GetSize()))];
309 font["active"].push_back(fc->GetFontName());
310 }
311}
312
318void SurveyCompanies(nlohmann::json &survey)
319{
320 for (const Company *c : Company::Iterate()) {
321 auto &company = survey[fmt::format("{}", c->index.base())];
322 if (c->ai_info == nullptr) {
323 company["type"] = "human";
324 } else {
325 company["type"] = "ai";
326 company["script"] = fmt::format("{}.{}", c->ai_info->GetName(), c->ai_info->GetVersion());
327 }
328
329 for (VehicleType type = VEH_BEGIN; type < VEH_COMPANY_END; type++) {
330 uint amount = c->group_all[type].num_vehicle;
331 company["vehicles"][_vehicle_type_to_string[type]] = amount;
332 }
333
334 company["infrastructure"]["road"] = c->infrastructure.GetRoadTotal();
335 company["infrastructure"]["tram"] = c->infrastructure.GetTramTotal();
336 company["infrastructure"]["rail"] = c->infrastructure.GetRailTotal();
337 company["infrastructure"]["signal"] = c->infrastructure.signal;
338 company["infrastructure"]["water"] = c->infrastructure.water;
339 company["infrastructure"]["station"] = c->infrastructure.station;
340 company["infrastructure"]["airport"] = c->infrastructure.airport;
341 }
342}
343
349void SurveyTimers(nlohmann::json &survey)
350{
351 survey["ticks"] = TimerGameTick::counter;
352
353 TimerGameEconomy::YearMonthDay economy_ymd = TimerGameEconomy::ConvertDateToYMD(TimerGameEconomy::date);
354 survey["economy"] = fmt::format("{:04}-{:02}-{:02} ({})", economy_ymd.year, economy_ymd.month + 1, economy_ymd.day, TimerGameEconomy::date_fract);
355
356 TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date);
357 survey["calendar"] = fmt::format("{:04}-{:02}-{:02} ({})", ymd.year, ymd.month + 1, ymd.day, TimerGameCalendar::date_fract);
358}
359
365void SurveyGrfs(nlohmann::json &survey)
366{
367 for (const auto &c : _grfconfig) {
368 auto grfid = fmt::format("{:08x}", std::byteswap(c->ident.grfid));
369 auto &grf = survey[std::move(grfid)];
370
371 grf["md5sum"] = FormatArrayAsHex(c->ident.md5sum);
372 grf["status"] = c->status;
373
374 if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_UNSET) grf["palette"] = "unset";
375 if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_DOS) grf["palette"] = "dos";
376 if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_WINDOWS) grf["palette"] = "windows";
377 if ((c->palette & GRFP_GRF_MASK) == GRFP_GRF_ANY) grf["palette"] = "any";
378
379 if ((c->palette & GRFP_BLT_MASK) == GRFP_BLT_UNSET) grf["blitter"] = "unset";
380 if ((c->palette & GRFP_BLT_MASK) == GRFP_BLT_32BPP) grf["blitter"] = "32bpp";
381
382 grf["is_static"] = c->flags.Test(GRFConfigFlag::Static);
383 grf["parameters"] = std::span<const uint32_t>(c->param);
384 }
385}
386
392void SurveyGameScript(nlohmann::json &survey)
393{
394 if (Game::GetInfo() == nullptr) return;
395
396 survey = fmt::format("{}.{}", Game::GetInfo()->GetName(), Game::GetInfo()->GetVersion());
397}
398
404void SurveyLibraries(nlohmann::json &survey)
405{
406#ifdef WITH_ALLEGRO
407 survey["allegro"] = std::string(allegro_id);
408#endif /* WITH_ALLEGRO */
409
410#ifdef WITH_FONTCONFIG
411 int version = FcGetVersion();
412 survey["fontconfig"] = fmt::format("{}.{}.{}", version / 10000, (version / 100) % 100, version % 100);
413#endif /* WITH_FONTCONFIG */
414
415#ifdef WITH_FREETYPE
416 FT_Library library;
417 int major, minor, patch;
418 FT_Init_FreeType(&library);
419 FT_Library_Version(library, &major, &minor, &patch);
420 FT_Done_FreeType(library);
421 survey["freetype"] = fmt::format("{}.{}.{}", major, minor, patch);
422#endif /* WITH_FREETYPE */
423
424#if defined(WITH_HARFBUZZ)
425 survey["harfbuzz"] = hb_version_string();
426#endif /* WITH_HARFBUZZ */
427
428#if defined(WITH_ICU_I18N)
429 /* 4 times 0-255, separated by dots (.) and a trailing '\0' */
430 char buf[4 * 3 + 3 + 1];
431 UVersionInfo ver;
432 u_getVersion(ver);
433 u_versionToString(ver, buf);
434 survey["icu_i18n"] = buf;
435#endif /* WITH_ICU_I18N */
436
437#ifdef WITH_LIBLZMA
438 survey["lzma"] = lzma_version_string();
439#endif
440
441#ifdef WITH_LZO
442 survey["lzo"] = lzo_version_string();
443#endif
444
445#ifdef WITH_PNG
446 survey["png"] = png_get_libpng_ver(nullptr);
447#endif /* WITH_PNG */
448
449#ifdef WITH_SDL2
450 SDL_version sdl2_v;
451 SDL_GetVersion(&sdl2_v);
452 survey["sdl2"] = fmt::format("{}.{}.{}", sdl2_v.major, sdl2_v.minor, sdl2_v.patch);
453#endif
454
455#ifdef WITH_ZLIB
456 survey["zlib"] = zlibVersion();
457#endif
458
459#ifdef WITH_CURL
460 auto *curl_v = curl_version_info(CURLVERSION_NOW);
461 survey["curl"] = curl_v->version;
462 survey["curl_ssl"] = curl_v->ssl_version == nullptr ? "none" : curl_v->ssl_version;
463#endif
464}
465
471void SurveyPlugins(nlohmann::json &survey)
472{
474
475 for (auto &plugin : _plugins) {
476 auto &platform = survey[plugin->social_platform];
477 platform.push_back({
478 {"name", plugin->name},
479 {"version", plugin->version},
480 {"basepath", plugin->basepath},
481 {"state", plugin->state},
482 });
483 }
484}
485
494std::string SurveyMemoryToText(uint64_t memory)
495{
496 memory = memory / 1024; // KiB
497 memory = CeilDiv(memory, 1024); // MiB
498
499 /* Anything above 512 MiB we represent in GiB. */
500 if (memory > 512) {
501 return fmt::format("{} GiB", CeilDiv(memory, 1024));
502 }
503
504 /* Anything above 64 MiB we represent in a multiplier of 128 MiB. */
505 if (memory > 64) {
506 return fmt::format("{} MiB", Ceil(memory, 128));
507 }
508
509 /* Anything else in a multiplier of 4 MiB. */
510 return fmt::format("{} MiB", Ceil(memory, 4));
511}
AIInfo keeps track of all information of an AI, like Author, Description, ...
Generic functions for replacing base data (graphics, sounds).
Generic functions for replacing base graphics data.
Generic functions for replacing base music data.
Generic functions for replacing base sounds data.
static const GraphicsSet * GetUsedSet()
Return the used set.
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
Definition factory.hpp:136
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.
static std::span< const std::unique_ptr< FontCache > > Get()
Get span of all FontCaches.
Definition fontcache.h:177
static class GameInfo * GetInfo()
Get the current GameInfo.
Definition game.hpp:70
static MusicDriver * GetInstance()
Get the currently active instance of the music driver.
@ PLATFORM_NOT_RUNNING
The plugin failed to initialize because the Social Platform is not running.
@ UNSUPPORTED_API
The plugin does not support the current API version.
@ RUNNING
The plugin is successfully loaded and running.
@ FAILED
The plugin failed to initialize.
@ DUPLICATE
Another plugin of the same Social Platform is already loaded.
@ INVALID_SIGNATURE
The signature of the plugin is invalid.
@ UNLOADED
The plugin is unloaded upon request.
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:110
Factory to 'query' all available blitters.
Functions to read fonts from files and cache them.
FontCacheSubSetting * GetFontCacheSubSetting(FontSize fs)
Get the settings of a given font size.
Definition fontcache.h:280
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
FontSize
Available font sizes.
Definition gfx_type.h:248
@ FS_BEGIN
First font.
Definition gfx_type.h:255
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.
constexpr uint Ceil(uint a, uint b)
Computes ceil(a / b) * b for non-negative a and b.
Base for all music playback.
bool _networking
are we in networking mode?
Definition network.cpp:66
bool _network_server
network-server is active
Definition network.cpp:67
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.
GRFConfigList _grfconfig
First item in list of current GRF set up.
GRFStatus
Status of GRF.
@ GCS_INITIALISED
GRF file has been initialised.
@ GCS_DISABLED
GRF file is disabled.
@ GCS_NOT_FOUND
GRF file was not found in the local cache.
@ GCS_UNKNOWN
The status of this grf file is unknown.
@ GCS_ACTIVATED
GRF file has been activated.
@ Static
GRF file is used statically (can be used in any MP game)
@ GRFP_GRF_UNSET
The NewGRF provided no information.
@ GRFP_BLT_UNSET
The NewGRF provided no information or doesn't care about a 32 bpp blitter.
@ GRFP_GRF_WINDOWS
The NewGRF says the Windows palette can be used.
@ GRFP_GRF_DOS
The NewGRF says the DOS palette can be used.
@ GRFP_GRF_ANY
The NewGRF says any palette can be used.
@ GRFP_BLT_MASK
Bitmask to only get the blitter information.
@ GRFP_BLT_32BPP
The NewGRF prefers a 32 bpp blitter.
@ GRFP_GRF_MASK
Bitmask to get only the NewGRF supplied information.
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:1305
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
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:77
CompanySettings company
default values for per-company settings
Settings for a single font.
Definition fontcache.h:249
std::string font
The name of the font, or path to the font.
Definition fontcache.h:250
uint size
The (requested) size of the font.
Definition fontcache.h:251
Information about GRF, used in the game and (part of it) in savegames.
std::vector< uint32_t > 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:90
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.
SaveLoadVersion version_to
Save/load the variable before this savegame version.
Definition saveload.h:738
SaveLoadVersion version_from
Save/load the variable starting from this savegame version.
Definition saveload.h:737
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:164
void SurveyPlugins(nlohmann::json &survey)
Convert plugin information to JSON.
Definition survey.cpp:471
void SurveyTimers(nlohmann::json &survey)
Convert timer information to JSON.
Definition survey.cpp:349
static void SurveySettingsTable(nlohmann::json &survey, const SettingTable &table, void *object, bool skip_if_default)
Convert a settings table to JSON.
Definition survey.cpp:146
void SurveyGameSession(nlohmann::json &survey)
Convert game session information to JSON.
Definition survey.cpp:242
std::string SurveyMemoryToText(uint64_t memory)
Change the bytes of memory into a textual version rounded up to the biggest unit.
Definition survey.cpp:494
void SurveyGameScript(nlohmann::json &survey)
Convert game-script information to JSON.
Definition survey.cpp:392
void SurveyConfiguration(nlohmann::json &survey)
Convert generic game information to JSON.
Definition survey.cpp:256
void SurveyOpenTTD(nlohmann::json &survey)
Convert generic OpenTTD information to JSON.
Definition survey.cpp:210
void SurveyFont(nlohmann::json &survey)
Convert font information to JSON.
Definition survey.cpp:299
void SurveyCompanies(nlohmann::json &survey)
Convert company information to JSON.
Definition survey.cpp:318
static auto & GenericSettingTables()
List of all the generic setting tables.
Definition survey.cpp:119
void SurveyCompiler(nlohmann::json &survey)
Convert compiler information to JSON.
Definition survey.cpp:182
void SurveyLibraries(nlohmann::json &survey)
Convert compiled libraries information to JSON.
Definition survey.cpp:404
static const std::string _vehicle_type_to_string[]
Lookup table to convert a VehicleType to a string.
Definition survey.cpp:102
void SurveyGrfs(nlohmann::json &survey)
Convert GRF information to JSON.
Definition survey.cpp:365
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.
@ VEH_COMPANY_END
Last company-ownable type.
Base of all video drivers.
std::string FS2OTTD(std::wstring_view name)
Convert to OpenTTD's encoding from a wide string.
Definition win32.cpp:340