OpenTTD Source 20241222-master-gc72542431a
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"
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
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
94})
95
96
98static const std::string _vehicle_type_to_string[] = {
99 "train",
100 "roadveh",
101 "ship",
102 "aircraft",
103};
104
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
142static 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. */
148
149 auto name = sd->GetName();
150 if (skip_if_default && sd->IsDefaultValue(object)) continue;
151 survey[name] = sd->FormatValue(object);
152 }
153}
154
160void 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
178void 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
206void 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
238void 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
252void 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->param.empty()) {
277 survey["graphics_set_parameters"] = std::span<const uint32_t>(extra_cfg->param);
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
295void 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
308void 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
339void 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
355void 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);
374 }
375}
376
382void SurveyGameScript(nlohmann::json &survey)
383{
384 if (Game::GetInfo() == nullptr) return;
385
386 survey = fmt::format("{}.{}", Game::GetInfo()->GetName(), Game::GetInfo()->GetVersion());
387}
388
394void 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
464void 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
487std::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).
debug_inline constexpr 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.
@ 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: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.
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: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.
@ 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.
@ GCF_STATIC
GRF file is used statically (can be used in any MP game)
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.
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:1290
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.
std::vector< uint32_t > param
GRF parameters.
struct GRFConfig * next
NOSAVE: Next item in the linked list.
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.
SaveLoadVersion version_to
Save/load the variable before this savegame version.
Definition saveload.h:723
SaveLoadVersion version_from
Save/load the variable starting from this savegame version.
Definition saveload.h:722
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
static auto & GenericSettingTables()
List of all the generic setting tables.
Definition survey.cpp:115
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 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.
@ VEH_COMPANY_END
Last company-ownable type.
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