OpenTTD Source 20260311-master-g511d3794ce
newgrf_config.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
9
10#include "stdafx.h"
11#include "debug.h"
12#include "3rdparty/md5/md5.h"
13#include "newgrf.h"
15#include "gfx_func.h"
16#include "newgrf_text.h"
17#include "window_func.h"
18#include "progress.h"
20#include "string_func.h"
21#include "strings_func.h"
22#include "textfile_gui.h"
23#include "thread.h"
24#include "newgrf_config.h"
25#include "newgrf_text.h"
26
27#include "fileio_func.h"
28#include "fios.h"
29
30#include "safeguards.h"
31
36GRFConfig::GRFConfig(const GRFConfig &config) :
37 ident(config.ident),
39 filename(config.filename),
40 name(config.name),
41 info(config.info),
42 url(config.url),
43 errors(config.errors),
44 version(config.version),
46 flags(config.flags),
47 status(config.status),
48 grf_bugs(config.grf_bugs),
50 palette(config.palette),
52 param_info(config.param_info),
53 param(config.param)
54{
55 this->flags.Reset(GRFConfigFlag::Copy);
56}
57
58void GRFConfig::SetParams(std::span<const uint32_t> pars)
59{
60 this->param.assign(std::begin(pars), std::end(pars));
61}
62
68bool GRFConfig::IsCompatible(uint32_t old_version) const
69{
70 return this->min_loadable_version <= old_version && old_version <= this->version;
71}
72
77void GRFConfig::CopyParams(const GRFConfig &src)
78{
79 this->param = src.param;
80}
81
87std::string GRFConfig::GetName() const
88{
89 auto name = GetGRFStringFromGRFText(this->name);
90 return name.has_value() && !name->empty() ? std::string(*name) : this->filename;
91}
92
97std::optional<std::string> GRFConfig::GetDescription() const
98{
99 auto str = GetGRFStringFromGRFText(this->info);
100 if (!str.has_value()) return std::nullopt;
101 return std::string(*str);
102}
103
108std::optional<std::string> GRFConfig::GetURL() const
109{
110 auto str = GetGRFStringFromGRFText(this->url);
111 if (!str.has_value()) return std::nullopt;
112 return std::string(*str);
113}
114
117{
118 this->param.clear();
119
120 if (!this->has_param_defaults) return;
121
122 for (const auto &info : this->param_info) {
123 if (!info.has_value()) continue;
124 this->SetValue(info.value(), info->def_value);
125 }
126}
127
134{
135 PaletteType pal;
136 switch (this->palette & GRFP_GRF_MASK) {
137 case GRFP_GRF_DOS: pal = PAL_DOS; break;
138 case GRFP_GRF_WINDOWS: pal = PAL_WINDOWS; break;
139 default: pal = _settings_client.gui.newgrf_default_palette == 1 ? PAL_WINDOWS : PAL_DOS; break;
140 }
142}
143
148{
149 for (auto &info : this->param_info) {
150 if (!info.has_value()) continue;
151 info->Finalize();
152 }
153}
154
155GRFConfigList _all_grfs;
156GRFConfigList _grfconfig;
157GRFConfigList _grfconfig_newgame;
158GRFConfigList _grfconfig_static;
160
167{
168 /* If the parameter is not set then it must be 0. */
169 if (info.param_nr >= std::size(this->param)) return 0;
170
171 /* GB doesn't work correctly with nbits == 32, so handle that case here. */
172 if (info.num_bit == 32) return this->param[info.param_nr];
173
174 return GB(this->param[info.param_nr], info.first_bit, info.num_bit);
175}
176
182void GRFConfig::SetValue(const GRFParameterInfo &info, uint32_t value)
183{
184 value = Clamp(value, info.min_value, info.max_value);
185
186 /* Allocate the new parameter if it's not already present. */
187 if (info.param_nr >= std::size(this->param)) this->param.resize(info.param_nr + 1);
188
189 /* SB doesn't work correctly with nbits == 32, so handle that case here. */
190 if (info.num_bit == 32) {
191 this->param[info.param_nr] = value;
192 } else {
193 SB(this->param[info.param_nr], info.first_bit, info.num_bit, value);
194 }
195
197}
198
203{
204 /* Remove value names outside of the permitted range of values. */
205 auto it = std::remove_if(std::begin(this->value_names), std::end(this->value_names),
206 [this](const ValueName &vn) { return vn.first < this->min_value || vn.first > this->max_value; });
207 this->value_names.erase(it, std::end(this->value_names));
208
209 /* Test if the number of named values matches the full ranges of values. -1 because the range is inclusive. */
210 this->complete_labels = (this->max_value - this->min_value) == std::size(this->value_names) - 1;
211}
212
218{
219 for (const auto &c : _grfconfig_newgame) c->SetSuitablePalette();
220 for (const auto &c : _grfconfig_static ) c->SetSuitablePalette();
221 for (const auto &c : _all_grfs ) c->SetSuitablePalette();
222}
223
230{
231 extern const std::array<uint8_t, 8> _grf_cont_v2_sig;
232 static const uint header_len = 14;
233
234 uint8_t data[header_len];
235 if (fread(data, 1, header_len, f) == header_len) {
236 if (data[0] == 0 && data[1] == 0 && std::ranges::equal(std::span(data + 2, _grf_cont_v2_sig.size()), _grf_cont_v2_sig)) {
237 /* Valid container version 2, get data section size. */
238 size_t offset = (static_cast<size_t>(data[13]) << 24) | (static_cast<size_t>(data[12]) << 16) | (static_cast<size_t>(data[11]) << 8) | static_cast<size_t>(data[10]);
239 if (offset >= 1 * 1024 * 1024 * 1024) {
240 Debug(grf, 0, "Unexpectedly large offset for NewGRF");
241 /* Having more than 1 GiB of data is very implausible. Mostly because then
242 * all pools in OpenTTD are flooded already. Or it's just Action C all over.
243 * In any case, the offsets to graphics will likely not work either. */
244 return SIZE_MAX;
245 }
246 return header_len + offset;
247 }
248 }
249
250 return SIZE_MAX;
251}
252
259static bool CalcGRFMD5Sum(GRFConfig &config, Subdirectory subdir)
260{
261 Md5 checksum;
262 uint8_t buffer[1024];
263 size_t len, size;
264
265 /* open the file */
266 auto f = FioFOpenFile(config.filename, "rb", subdir, &size);
267 if (!f.has_value()) return false;
268
269 long start = ftell(*f);
270 size = std::min(size, GRFGetSizeOfDataSection(*f));
271
272 if (start < 0 || fseek(*f, start, SEEK_SET) < 0) {
273 return false;
274 }
275
276 /* calculate md5sum */
277 while ((len = fread(buffer, 1, (size > sizeof(buffer)) ? sizeof(buffer) : size, *f)) != 0 && size != 0) {
278 size -= len;
279 checksum.Append(buffer, len);
280 }
281 checksum.Finish(config.ident.md5sum);
282
283 return true;
284}
285
286
294bool FillGRFDetails(GRFConfig &config, bool is_static, Subdirectory subdir)
295{
296 if (!FioCheckFileExists(config.filename, subdir)) {
297 config.status = GCS_NOT_FOUND;
298 return false;
299 }
300
301 /* Find and load the Action 8 information */
302 LoadNewGRFFile(config, GrfLoadingStage::FileScan, subdir, true);
303 config.SetSuitablePalette();
304 config.FinalizeParameterInfo();
305
306 /* Skip if the grfid is 0 (not read) or if it is an internal GRF */
307 if (config.ident.grfid == 0 || config.flags.Test(GRFConfigFlag::System)) return false;
308
309 if (is_static) {
310 /* Perform a 'safety scan' for static GRFs */
311 LoadNewGRFFile(config, GrfLoadingStage::SafetyScan, subdir, true);
312
313 /* GRFConfigFlag::Unsafe is set if GrfLoadingStage::SafetyScan finds unsafe actions */
314 if (config.flags.Test(GRFConfigFlag::Unsafe)) return false;
315 }
316
317 return CalcGRFMD5Sum(config, subdir);
318}
319
320
326void ClearGRFConfigList(GRFConfigList &config)
327{
328 config.clear();
329}
330
337static void AppendGRFConfigList(GRFConfigList &dst, const GRFConfigList &src, bool init_only)
338{
339 for (const auto &s : src) {
340 auto &c = dst.emplace_back(std::make_unique<GRFConfig>(*s));
341 if (init_only) {
342 c->flags.Set(GRFConfigFlag::InitOnly);
343 } else {
344 c->flags.Reset(GRFConfigFlag::InitOnly);
345 }
346 }
347}
348
355void CopyGRFConfigList(GRFConfigList &dst, const GRFConfigList &src, bool init_only)
356{
357 /* Clear destination as it will be overwritten */
359 AppendGRFConfigList(dst, src, init_only);
360}
361
375static void RemoveDuplicatesFromGRFConfigList(GRFConfigList &list)
376{
377 if (list.empty()) return;
378
379 auto last = std::end(list);
380 for (auto it = std::begin(list); it != last; ++it) {
381 auto remove = std::remove_if(std::next(it), last, [&grfid = (*it)->ident.grfid](const auto &c) { return grfid == c->ident.grfid; });
382 last = list.erase(remove, last);
383 }
384}
385
390void AppendStaticGRFConfigs(GRFConfigList &dst)
391{
394}
395
401void AppendToGRFConfigList(GRFConfigList &dst, std::unique_ptr<GRFConfig> &&el)
402{
403 dst.push_back(std::move(el));
405}
406
407
417
418
431{
433
434 for (auto &c : grfconfig) {
435 const GRFConfig *f = FindGRFConfig(c->ident.grfid, FGCM_EXACT, &c->ident.md5sum);
436 if (f == nullptr || f->flags.Test(GRFConfigFlag::Invalid)) {
437 /* If we have not found the exactly matching GRF try to find one with the
438 * same grfid, as it most likely is compatible */
439 f = FindGRFConfig(c->ident.grfid, FGCM_COMPATIBLE, nullptr, c->version);
440 if (f != nullptr) {
441 Debug(grf, 1, "NewGRF {:08X} ({}) not found; checksum {}. Compatibility mode on", std::byteswap(c->ident.grfid), c->filename, FormatArrayAsHex(c->ident.md5sum));
442 if (!c->flags.Test(GRFConfigFlag::Compatible)) {
443 /* Preserve original_md5sum after it has been assigned */
444 c->flags.Set(GRFConfigFlag::Compatible);
445 c->original_md5sum = c->ident.md5sum;
446 }
447
448 /* Non-found has precedence over compatibility load */
449 if (res != GLC_NOT_FOUND) res = GLC_COMPATIBLE;
450 goto compatible_grf;
451 }
452
453 /* No compatible grf was found, mark it as disabled */
454 Debug(grf, 0, "NewGRF {:08X} ({}) not found; checksum {}", std::byteswap(c->ident.grfid), c->filename, FormatArrayAsHex(c->ident.md5sum));
455
456 c->status = GCS_NOT_FOUND;
457 res = GLC_NOT_FOUND;
458 } else {
459compatible_grf:
460 Debug(grf, 1, "Loading GRF {:08X} from {}", std::byteswap(f->ident.grfid), f->filename);
461 /* The filename could be the filename as in the savegame. As we need
462 * to load the GRF here, we need the correct filename, so overwrite that
463 * in any case and set the name and info when it is not set already.
464 * When the GRFConfigFlag::Copy flag is set, it is certain that the filename is
465 * already a local one, so there is no need to replace it. */
466 if (!c->flags.Test(GRFConfigFlag::Copy)) {
467 c->filename = f->filename;
468 c->ident.md5sum = f->ident.md5sum;
469 c->name = f->name;
470 c->info = f->name;
471 c->errors.clear();
472 c->version = f->version;
473 c->min_loadable_version = f->min_loadable_version;
474 c->num_valid_params = f->num_valid_params;
475 c->param_info = f->param_info;
476 c->has_param_defaults = f->has_param_defaults;
477 }
478 }
479 }
480
481 return res;
482}
483
484
487
489class GRFFileScanner : FileScanner {
490 std::chrono::steady_clock::time_point next_update;
492
493public:
494 GRFFileScanner() : num_scanned(0)
495 {
496 this->next_update = std::chrono::steady_clock::now();
497 }
498
499 bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override;
500
505 static uint DoScan()
506 {
509 return 0;
510 }
511
512 GRFFileScanner fs;
513 int ret = fs.Scan(".grf", NEWGRF_DIR);
514 /* The number scanned and the number returned may not be the same;
515 * duplicate NewGRFs and base sets are ignored in the return value. */
516 _settings_client.gui.last_newgrf_count = fs.num_scanned;
517 return ret;
518 }
519};
520
521bool GRFFileScanner::AddFile(const std::string &filename, size_t basepath_length, const std::string &)
522{
523 /* Abort if the user stopped the game during a scan. */
524 if (_exit_game) return false;
525
526 bool added = false;
527 auto c = std::make_unique<GRFConfig>(filename.substr(basepath_length));
528 GRFConfig *grfconfig = c.get();
529 if (FillGRFDetails(*c, false)) {
530 if (std::ranges::none_of(_all_grfs, [&c](const auto &gc) { return c->ident.grfid == gc->ident.grfid && c->ident.md5sum == gc->ident.md5sum; })) {
531 _all_grfs.push_back(std::move(c));
532 added = true;
533 }
534 }
535
536 this->num_scanned++;
537
538 std::string name = grfconfig->GetName();
539 UpdateNewGRFScanStatus(this->num_scanned, std::move(name));
541
542 return added;
543}
544
547static bool GRFSorter(std::unique_ptr<GRFConfig> const &a, std::unique_ptr<GRFConfig> const &b)
548{
549 return StrNaturalCompare(a->GetName(), b->GetName()) < 0;
550}
551
557{
560
561 Debug(grf, 1, "Scanning for NewGRFs");
562 uint num = GRFFileScanner::DoScan();
563
564 Debug(grf, 1, "Scan complete, found {} files", num);
565 std::ranges::sort(_all_grfs, GRFSorter);
567
568 /* Yes... these are the NewGRF windows */
571 if (!_exit_game && callback != nullptr) callback->OnNewGRFsScanned();
572
574 SetModalProgress(false);
576}
577
583{
584 /* First set the modal progress. This ensures that it will eventually let go of the paint mutex. */
585 SetModalProgress(true);
586 /* Only then can we really start, especially by marking the whole screen dirty. Get those other windows hidden!. */
588
589 DoScanNewGRFFiles(callback);
590}
591
600const GRFConfig *FindGRFConfig(uint32_t grfid, FindGRFConfigMode mode, const MD5Hash *md5sum, uint32_t desired_version)
601{
602 assert((mode == FGCM_EXACT) != (md5sum == nullptr));
603 const GRFConfig *best = nullptr;
604 for (const auto &c : _all_grfs) {
605 /* if md5sum is set, we look for an exact match and continue if not found */
606 if (!c->ident.HasGrfIdentifier(grfid, md5sum)) continue;
607 /* return it, if the exact same newgrf is found, or if we do not care about finding "the best" */
608 if (md5sum != nullptr || mode == FGCM_ANY) return c.get();
609 /* Skip incompatible stuff, unless explicitly allowed */
610 if (mode != FGCM_NEWEST && c->flags.Test(GRFConfigFlag::Invalid)) continue;
611 /* check version compatibility */
612 if (mode == FGCM_COMPATIBLE && !c->IsCompatible(desired_version)) continue;
613 /* remember the newest one as "the best" */
614 if (best == nullptr || c->version > best->version) best = c.get();
615 }
616
617 return best;
618}
619
626GRFConfig *GetGRFConfig(uint32_t grfid, uint32_t mask)
627{
628 auto it = std::ranges::find_if(_grfconfig, [grfid, mask](const auto &c) { return (c->ident.grfid & mask) == (grfid & mask); });
629 if (it != std::end(_grfconfig)) return it->get();
630
631 return nullptr;
632}
633
634
640std::string GRFBuildParamList(const GRFConfig &c)
641{
642 std::string result;
643 for (const uint32_t &value : c.param) {
644 if (!result.empty()) result += ' ';
645 format_append(result, "{}", value);
646 }
647 return result;
648}
649
655std::optional<std::string> GRFConfig::GetTextfile(TextfileType type) const
656{
657 return ::GetTextfile(type, NEWGRF_DIR, this->filename);
658}
constexpr T SB(T &x, const uint8_t s, const uint8_t n, const U d)
Set n bits in x starting at bit s to d.
static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
constexpr enable_if_t< is_integral_v< T >, T > byteswap(T x) noexcept
Custom implementation of std::byteswap; remove once we build with C++23.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Helper for scanning for files with a given name.
Definition fileio_func.h:37
uint Scan(std::string_view extension, Subdirectory sd, bool tars=true, bool recursive=true)
Scan for files with the given extension in the given search path.
Definition fileio.cpp:1124
static uint DoScan()
Do the scan for GRFs.
std::chrono::steady_clock::time_point next_update
The next moment we do update the screen.
bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override
Add a file with the given filename.
uint num_scanned
The number of GRFs we have scanned.
@ NewGRF
Scan for non-base sets.
Definition fileio_func.h:65
uint DoScan(Subdirectory sd)
Perform the scanning of a particular subdirectory.
Definition fileio.cpp:378
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
void GameLoopPause()
Pause the game-loop for a bit, releasing the game-state lock.
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
std::optional< FileHandle > FioFOpenFile(std::string_view filename, std::string_view mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
Definition fileio.cpp:244
bool FioCheckFileExists(std::string_view filename, Subdirectory subdir)
Check whether the given file exists.
Definition fileio.cpp:121
Functions for standard in/out file operations.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
Definition fileio_type.h:88
@ NEWGRF_DIR
Subdirectory for all NewGRFs.
Definition fileio_type.h:97
Declarations for savegames operations.
Functions related to the gfx engine.
PaletteType
Palettes OpenTTD supports.
Definition gfx_type.h:351
@ PAL_DOS
Use the DOS palette.
Definition gfx_type.h:352
@ PAL_WINDOWS
Use the Windows palette.
Definition gfx_type.h:353
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition gfx.cpp:1554
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
Network functions used by other parts of OpenTTD.
void NetworkAfterNewGRFScan()
Rebuild the GRFConfig's of the servers in the game list as we did a rescan and might have found new N...
void LoadNewGRFFile(GRFConfig &config, GrfLoadingStage stage, Subdirectory subdir, bool temporary)
Load a particular NewGRF.
Definition newgrf.cpp:1397
Base for the NewGRF implementation.
@ SafetyScan
Checks whether the NewGRF can be used in a static context.
Definition newgrf.h:49
@ FileScan
Load the Action 8 metadata (GRF ID, name).
Definition newgrf.h:48
GRFConfigList _grfconfig
First item in list of current GRF set up.
GRFConfigList _grfconfig_static
First item in list of static GRF set up.
void CopyGRFConfigList(GRFConfigList &dst, const GRFConfigList &src, bool init_only)
Copy a GRF Config list.
GRFListCompatibility IsGoodGRFConfigList(GRFConfigList &grfconfig)
Check if all GRFs in the GRF config from a savegame can be loaded.
static bool CalcGRFMD5Sum(GRFConfig &config, Subdirectory subdir)
Calculate the MD5 sum for a GRF, and store it in the config.
std::string GRFBuildParamList(const GRFConfig &c)
Build a string containing space separated parameter values.
static bool GRFSorter(std::unique_ptr< GRFConfig > const &a, std::unique_ptr< GRFConfig > const &b)
Simple sorter for GRFS.
uint _missing_extra_graphics
Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset.
static void RemoveDuplicatesFromGRFConfigList(GRFConfigList &list)
Removes duplicates from lists of GRFConfigs.
const GRFConfig * FindGRFConfig(uint32_t grfid, FindGRFConfigMode mode, const MD5Hash *md5sum, uint32_t desired_version)
Find a NewGRF in the scanned list.
void ResetGRFConfig(bool defaults)
Reset the current GRF Config to either blank or newgame settings.
GRFConfigList _grfconfig_newgame
First item in list of default GRF set up.
GRFConfigList _all_grfs
First item in list of all scanned NewGRFs.
bool FillGRFDetails(GRFConfig &config, bool is_static, Subdirectory subdir)
Find the GRFID of a given grf, and calculate its md5sum.
static void AppendGRFConfigList(GRFConfigList &dst, const GRFConfigList &src, bool init_only)
Append a GRF Config list onto another list.
void AppendStaticGRFConfigs(GRFConfigList &dst)
Appends the static GRFs to a list of GRFs.
void ScanNewGRFFiles(NewGRFScanCallback *callback)
Scan for all NewGRFs.
GRFConfig * GetGRFConfig(uint32_t grfid, uint32_t mask)
Retrieve a NewGRF from the current config by its grfid.
size_t GRFGetSizeOfDataSection(FileHandle &f)
Get the data section size of a GRF.
void DoScanNewGRFFiles(NewGRFScanCallback *callback)
Really perform the scan for all NewGRFs.
int _skip_all_newgrf_scanning
Set this flag to prevent any NewGRF scanning from being done.
void AppendToGRFConfigList(GRFConfigList &dst, std::unique_ptr< GRFConfig > &&el)
Appends an element to a list of GRFs.
void UpdateNewGRFConfigPalette()
Update the palettes of the graphics from the config file.
void ClearGRFConfigList(GRFConfigList &config)
Clear a GRF Config list, freeing all nodes.
Functions to find and configure NewGRFs.
GRFListCompatibility
Status of post-gameload GRF compatibility check.
@ GLC_COMPATIBLE
Compatible (eg. the same ID, but different checksum) GRF found in at least one case.
@ GLC_ALL_GOOD
All GRF needed by game are present.
@ GLC_NOT_FOUND
At least one GRF couldn't be found (higher priority than GLC_COMPATIBLE).
@ GCS_NOT_FOUND
GRF file was not found in the local cache.
@ Invalid
GRF is unusable with this version of OpenTTD.
@ Copy
The data is copied from a grf in _all_grfs.
@ Compatible
GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches).
@ System
GRF file is an openttd-internal system grf.
@ Unsafe
GRF file is unsafe for static usage.
@ InitOnly
GRF file is processed up to GrfLoadingStage::Init.
void UpdateNewGRFScanStatus(uint num, std::string &&name)
Update the NewGRF scan status.
FindGRFConfigMode
Method to find GRFs using FindGRFConfig.
@ FGCM_NEWEST
Find newest Grf.
@ FGCM_ANY
Use first found.
@ FGCM_EXACT
Only find Grfs matching md5sum.
@ FGCM_COMPATIBLE
Find best compatible Grf wrt. desired_version.
@ GRFP_USE_DOS
The palette state is set to use the DOS palette.
@ GRFP_GRF_WINDOWS
The NewGRF says the Windows palette can be used.
@ GRFP_USE_WINDOWS
The palette state is set to use the Windows palette.
@ GRFP_GRF_DOS
The NewGRF says the DOS palette can be used.
@ GRFP_USE_BIT
The bit used for storing the palette to use.
@ GRFP_GRF_MASK
Bitmask to get only the NewGRF supplied information.
std::optional< std::string_view > GetGRFStringFromGRFText(const GRFTextList &text_list)
Get a C-string from a GRFText-list.
Header of Action 04 "universal holder" structure and functions.
void SetModalProgress(bool state)
Set the modal progress state.
Definition progress.cpp:22
Functions related to modal progress.
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:60
const std::array< uint8_t, 8 > _grf_cont_v2_sig
Signature of a container version 2 GRF.
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
int StrNaturalCompare(std::string_view s1, std::string_view s2, bool ignore_garbage_at_front)
Compares two strings using case insensitive natural sort.
Definition string.cpp:429
Functions related to low-level strings.
Functions related to OTTD's strings.
Information about GRF, used in the game and (part of it) in savegames.
MD5Hash original_md5sum
MD5 checksum of original file if only a 'compatible' file was loaded.
void SetParameterDefaults()
Set the default value for all parameters as specified by action14.
GRFTextWrapper url
NOSAVE: URL belonging to this GRF.
uint8_t palette
GRFPalette, bitset.
GRFTextWrapper info
NOSAVE: GRF info (author, copyright, ...) (Action 0x08).
std::vector< std::optional< GRFParameterInfo > > param_info
NOSAVE: extra information about the parameters.
std::vector< GRFError > errors
NOSAVE: Error/Warning during GRF loading (Action 0x0B).
uint32_t version
NOSAVE: Version a NewGRF can set so only the newest NewGRF is shown.
std::vector< uint32_t > param
GRF parameters.
void FinalizeParameterInfo()
Finalize Action 14 info after file scan is finished.
bool has_param_defaults
NOSAVE: did this newgrf specify any defaults for it's parameters.
GRFTextWrapper name
NOSAVE: GRF name (Action 0x08).
GRFBugs grf_bugs
NOSAVE: bugs in this GRF in this run,.
std::optional< std::string > GetURL() const
Get the grf url.
GRFStatus status
NOSAVE: GRFStatus, enum.
void SetValue(const GRFParameterInfo &info, uint32_t value)
Set the value of the given user-changeable parameter.
bool IsCompatible(uint32_t old_version) const
Return whether this NewGRF can replace an older version of the same NewGRF.
void CopyParams(const GRFConfig &src)
Copy the parameter information from the src config.
std::optional< std::string > GetTextfile(TextfileType type) const
Search a textfile file next to this NewGRF.
GRFConfigFlags flags
NOSAVE: GCF_Flags, bitset.
uint8_t num_valid_params
NOSAVE: Number of valid parameters (action 0x14).
std::string filename
Filename - either with or without full path.
GRFIdentifier ident
grfid and md5sum to uniquely identify newgrfs
void SetSuitablePalette()
Set the palette of this GRFConfig to something suitable.
uint32_t min_loadable_version
NOSAVE: Minimum compatible version a NewGRF can define.
std::string GetName() const
Get the name of this grf.
std::optional< std::string > GetDescription() const
Get the grf info.
uint32_t GetValue(const GRFParameterInfo &info) const
Get the value of the given user-changeable parameter.
uint32_t grfid
GRF ID (defined by Action 0x08).
MD5Hash md5sum
MD5 checksum of file to distinguish files with the same GRF ID (eg. newer version of GRF).
Information about one grf parameter.
bool complete_labels
True if all values have a label.
uint32_t min_value
The minimal value this parameter can have.
uint32_t max_value
The maximal value of this parameter.
std::vector< ValueName > value_names
Names for each value.
void Finalize()
Finalize Action 14 info after file scan is finished.
Callback for NewGRF scanning.
virtual void OnNewGRFsScanned()=0
Called whenever the NewGRF scan completed.
GUI functions related to textfiles.
TextfileType
Additional text files accompanying Tar archives.
Base of all threads.
Base of all video drivers.
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1222
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
Definition window.cpp:3321
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting).
Definition window.cpp:3199
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3339
Window functions not directly related to making/drawing windows.
@ WN_GAME_OPTIONS_NEWGRF_STATE
NewGRF settings.
Definition window_type.h:30
@ GOID_NEWGRF_RESCANNED
NewGRFs were just rescanned.
@ WC_GAME_OPTIONS
Game options window; Window numbers:
@ WC_SAVELOAD
Saveload window; Window numbers:
@ WC_MODAL_PROGRESS
Progress report of landscape generation; Window numbers: