Files
@ r28403:d4cdcb69255f
Branch filter:
Location: cpp/openttd-patchpack/source/src/newgrf_config.h - annotation
r28403:d4cdcb69255f
11.0 KiB
text/x-c
Fix: race-condition when quitting the game with libcurl (#11688)
There could be a callback in _new_http_callbacks that is not
processed yet. All callbacks in _http_callbacks were cancelled,
but not the ones in _new_http_callbacks
There could be a callback in _new_http_callbacks that is not
processed yet. All callbacks in _http_callbacks were cancelled,
but not the ones in _new_http_callbacks
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r9111:983de9c5a848 r6348:a905c3e6d8fa r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r8142:8414f11ec81b r14662:8798e984ee81 r17403:bbaee031fd60 r18007:5ef6f0cf0861 r19064:0f7af43d9a9f r24209:155ba259d4af r27391:048886674223 r6139:0128edd33976 r8799:2ce178790a9f r6248:b940b09d7ab8 r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r17067:d8300f20b7a7 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r8799:2ce178790a9f r6248:b940b09d7ab8 r6229:a69564e4eb2e r6229:a69564e4eb2e r6229:a69564e4eb2e r6229:a69564e4eb2e r18737:1ee35da7fa2f r6248:b940b09d7ab8 r6229:a69564e4eb2e r9704:108fa337b182 r9704:108fa337b182 r15816:67664bff2b7d r18668:b656d614c4fd r15816:67664bff2b7d r18294:67a72ead8996 r21229:bf509b0caedd r9704:108fa337b182 r9704:108fa337b182 r8799:2ce178790a9f r9704:108fa337b182 r8799:2ce178790a9f r19944:25a78576fb5e r18737:1ee35da7fa2f r6248:b940b09d7ab8 r6229:a69564e4eb2e r15583:941df37daa12 r15583:941df37daa12 r15583:941df37daa12 r15584:5fce62ffde01 r15584:5fce62ffde01 r18162:11349b218a54 r18162:11349b218a54 r15583:941df37daa12 r15583:941df37daa12 r15583:941df37daa12 r15583:941df37daa12 r15584:5fce62ffde01 r15584:5fce62ffde01 r15584:5fce62ffde01 r15584:5fce62ffde01 r15584:5fce62ffde01 r15584:5fce62ffde01 r18162:11349b218a54 r18162:11349b218a54 r18162:11349b218a54 r18162:11349b218a54 r15583:941df37daa12 r15583:941df37daa12 r15583:941df37daa12 r8799:2ce178790a9f r6248:b940b09d7ab8 r27737:728d55b97775 r27391:048886674223 r15196:77940844856f r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r27737:728d55b97775 r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r15610:623a23fb6560 r15610:623a23fb6560 r15196:77940844856f r23607:36c15679007d r15196:77940844856f r15196:77940844856f r27737:728d55b97775 r15196:77940844856f r15196:77940844856f r23607:36c15679007d r27391:048886674223 r15196:77940844856f r6248:b940b09d7ab8 r5765:cfade44195bc r8799:2ce178790a9f r24212:4cf87ac30a4f r14662:8798e984ee81 r25524:02dac61ae3ed r27640:320868bd2fe5 r27640:320868bd2fe5 r27640:320868bd2fe5 r27640:320868bd2fe5 r27640:320868bd2fe5 r6248:b940b09d7ab8 r6139:0128edd33976 r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r24209:155ba259d4af r24209:155ba259d4af r15585:151b3e97ecca r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r15585:151b3e97ecca r15585:151b3e97ecca r15585:151b3e97ecca r27384:b919ab98bb53 r19401:96b7d1ecdefe r15588:8aad267fa5ef r27737:728d55b97775 r27737:728d55b97775 r19401:96b7d1ecdefe r15585:151b3e97ecca r15585:151b3e97ecca r8799:2ce178790a9f r14667:a7ee51a0cfe3 r27238:b62a71d9f1bd r15578:4df52cbd221a r14667:a7ee51a0cfe3 r25524:02dac61ae3ed r25524:02dac61ae3ed r25524:02dac61ae3ed r27390:f40f34fc3a62 r27391:048886674223 r27390:f40f34fc3a62 r27390:f40f34fc3a62 r27390:f40f34fc3a62 r27390:f40f34fc3a62 r27640:320868bd2fe5 r5475:3f5cd13d1b63 r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r27390:f40f34fc3a62 r27737:728d55b97775 r27394:3ebc0b64917c r27737:728d55b97775 r27737:728d55b97775 r27737:728d55b97775 r27389:34c6b4cd5a75 r27390:f40f34fc3a62 r5475:3f5cd13d1b63 r27390:f40f34fc3a62 r7882:cdf03a4ac84a r27979:37253e20ef1d r28059:72edd14954dc r21498:c603a3d7e3d7 r21498:c603a3d7e3d7 r27259:59b91be38623 r14701:3d820af7badc r14701:3d820af7badc r18637:6db0bce1fa51 r15582:6daf5f9adce7 r15907:70e379b9c8d1 r15582:6daf5f9adce7 r19401:96b7d1ecdefe r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r16246:b0e8840a555e r16246:b0e8840a555e r16246:b0e8840a555e r16247:0b3fc1f1c234 r16246:b0e8840a555e r17067:d8300f20b7a7 r16246:b0e8840a555e r16246:b0e8840a555e r16246:b0e8840a555e r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r8799:2ce178790a9f r22525:8b64738b95fa r5475:3f5cd13d1b63 r17971:2adf1b724154 r17971:2adf1b724154 r17971:2adf1b724154 r27372:06d384d76bd2 r17971:2adf1b724154 r17971:2adf1b724154 r17971:2adf1b724154 r17971:2adf1b724154 r19020:24d71054fe13 r19020:24d71054fe13 r17974:7006269a8b97 r27737:728d55b97775 r27737:728d55b97775 r6956:6398843f1341 r5475:3f5cd13d1b63 r6108:580a9fc2a546 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r15320:d9619cca229a r18007:5ef6f0cf0861 r27435:a26109e60d6d r5475:3f5cd13d1b63 r6348:a905c3e6d8fa r5475:3f5cd13d1b63 r28060:53690f1ef210 r5475:3f5cd13d1b63 r17978:c07585e51a28 r27737:728d55b97775 r17978:c07585e51a28 r5475:3f5cd13d1b63 | /*
* This file is part of OpenTTD.
* 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.
* 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.
* 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/>.
*/
/** @file newgrf_config.h Functions to find and configure NewGRFs. */
#ifndef NEWGRF_CONFIG_H
#define NEWGRF_CONFIG_H
#include "strings_type.h"
#include "core/alloc_type.hpp"
#include "misc/countedptr.hpp"
#include "fileio_type.h"
#include "textfile_type.h"
#include "newgrf_text.h"
#include "3rdparty/md5/md5.h"
/** GRF config bit flags */
enum GCF_Flags {
GCF_SYSTEM, ///< GRF file is an openttd-internal system grf
GCF_UNSAFE, ///< GRF file is unsafe for static usage
GCF_STATIC, ///< GRF file is used statically (can be used in any MP game)
GCF_COMPATIBLE, ///< GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
GCF_COPY, ///< The data is copied from a grf in _all_grfs
GCF_INIT_ONLY, ///< GRF file is processed up to GLS_INIT
GCF_RESERVED, ///< GRF file passed GLS_RESERVE stage
GCF_INVALID, ///< GRF is unusable with this version of OpenTTD
};
/** Status of GRF */
enum GRFStatus {
GCS_UNKNOWN, ///< The status of this grf file is unknown
GCS_DISABLED, ///< GRF file is disabled
GCS_NOT_FOUND, ///< GRF file was not found in the local cache
GCS_INITIALISED, ///< GRF file has been initialised
GCS_ACTIVATED, ///< GRF file has been activated
};
/** Encountered GRF bugs */
enum GRFBugs {
GBUG_VEH_LENGTH, ///< Length of rail vehicle changes when not inside a depot
GBUG_VEH_REFIT, ///< Articulated vehicles carry different cargoes resp. are differently refittable than specified in purchase list
GBUG_VEH_POWERED_WAGON, ///< Powered wagon changed poweredness state when not inside a depot
GBUG_UNKNOWN_CB_RESULT, ///< A callback returned an unknown/invalid result
GBUG_VEH_CAPACITY, ///< Capacity of vehicle changes when not refitting or arranging
};
/** Status of post-gameload GRF compatibility check */
enum GRFListCompatibility {
GLC_ALL_GOOD, ///< All GRF needed by game are present
GLC_COMPATIBLE, ///< Compatible (eg. the same ID, but different checksum) GRF found in at least one case
GLC_NOT_FOUND, ///< At least one GRF couldn't be found (higher priority than GLC_COMPATIBLE)
};
/** Information that can/has to be stored about a GRF's palette. */
enum GRFPalette {
GRFP_USE_BIT = 0, ///< The bit used for storing the palette to use.
GRFP_GRF_OFFSET = 2, ///< The offset of the GRFP_GRF data.
GRFP_GRF_SIZE = 2, ///< The size of the GRFP_GRF data.
GRFP_BLT_OFFSET = 4, ///< The offset of the GRFP_BLT data.
GRFP_BLT_SIZE = 1, ///< The size of the GRFP_BLT data.
GRFP_USE_DOS = 0x0, ///< The palette state is set to use the DOS palette.
GRFP_USE_WINDOWS = 0x1, ///< The palette state is set to use the Windows palette.
GRFP_USE_MASK = 0x1, ///< Bitmask to get only the use palette use states.
GRFP_GRF_UNSET = 0x0 << GRFP_GRF_OFFSET, ///< The NewGRF provided no information.
GRFP_GRF_DOS = 0x1 << GRFP_GRF_OFFSET, ///< The NewGRF says the DOS palette can be used.
GRFP_GRF_WINDOWS = 0x2 << GRFP_GRF_OFFSET, ///< The NewGRF says the Windows palette can be used.
GRFP_GRF_ANY = GRFP_GRF_DOS | GRFP_GRF_WINDOWS, ///< The NewGRF says any palette can be used.
GRFP_GRF_MASK = GRFP_GRF_ANY, ///< Bitmask to get only the NewGRF supplied information.
GRFP_BLT_UNSET = 0x0 << GRFP_BLT_OFFSET, ///< The NewGRF provided no information or doesn't care about a 32 bpp blitter.
GRFP_BLT_32BPP = 0x1 << GRFP_BLT_OFFSET, ///< The NewGRF prefers a 32 bpp blitter.
GRFP_BLT_MASK = GRFP_BLT_32BPP, ///< Bitmask to only get the blitter information.
};
/** Basic data to distinguish a GRF. Used in the server list window */
struct GRFIdentifier {
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)
GRFIdentifier() = default;
GRFIdentifier(const GRFIdentifier &other) = default;
GRFIdentifier(GRFIdentifier &&other) = default;
GRFIdentifier(uint32_t grfid, const MD5Hash &md5sum) : grfid(grfid), md5sum(md5sum) {}
GRFIdentifier& operator =(const GRFIdentifier &other) = default;
/**
* Does the identification match the provided values?
* @param grfid Expected grfid.
* @param md5sum Expected md5sum, may be \c nullptr (in which case, do not check it).
* @return the object has the provided grfid and md5sum.
*/
inline bool HasGrfIdentifier(uint32_t grfid, const MD5Hash *md5sum) const
{
if (this->grfid != grfid) return false;
if (md5sum == nullptr) return true;
return *md5sum == this->md5sum;
}
};
/** Information about why GRF had problems during initialisation */
struct GRFError {
GRFError(StringID severity, StringID message = 0);
std::string custom_message{}; ///< Custom message (if present)
std::string data{}; ///< Additional data for message and custom_message
StringID message{}; ///< Default message
StringID severity{}; ///< Info / Warning / Error / Fatal
std::array<uint32_t, 2> param_value{}; ///< Values of GRF parameters to show for message and custom_message
};
/** The possible types of a newgrf parameter. */
enum GRFParameterType {
PTYPE_UINT_ENUM, ///< The parameter allows a range of numbers, each of which can have a special name
PTYPE_BOOL, ///< The parameter is either 0 or 1
PTYPE_END, ///< Invalid parameter type
};
/** Information about one grf parameter. */
struct GRFParameterInfo {
GRFParameterInfo(uint nr);
GRFTextList name; ///< The name of this parameter
GRFTextList desc; ///< The description of this parameter
GRFParameterType type; ///< The type of this parameter
uint32_t min_value; ///< The minimal value this parameter can have
uint32_t max_value; ///< The maximal value of this parameter
uint32_t def_value; ///< Default value of this parameter
byte param_nr; ///< GRF parameter to store content in
byte first_bit; ///< First bit to use in the GRF parameter
byte num_bit; ///< Number of bits to use for this parameter
std::map<uint32_t, GRFTextList> value_names; ///< Names for each value.
bool complete_labels; ///< True if all values have a label.
uint32_t GetValue(struct GRFConfig *config) const;
void SetValue(struct GRFConfig *config, uint32_t value);
void Finalize();
};
/** Information about GRF, used in the game and (part of it) in savegames */
struct GRFConfig : ZeroedMemoryAllocator {
GRFConfig(const std::string &filename = std::string{});
GRFConfig(const GRFConfig &config);
/* Remove the copy assignment, as the default implementation will not do the right thing. */
GRFConfig &operator=(GRFConfig &rhs) = delete;
GRFIdentifier ident; ///< grfid and md5sum to uniquely identify newgrfs
MD5Hash original_md5sum; ///< MD5 checksum of original file if only a 'compatible' file was loaded
std::string filename; ///< Filename - either with or without full path
GRFTextWrapper name; ///< NOSAVE: GRF name (Action 0x08)
GRFTextWrapper info; ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08)
GRFTextWrapper url; ///< NOSAVE: URL belonging to this GRF.
std::optional<GRFError> error; ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B)
uint32_t version; ///< NOSAVE: Version a NewGRF can set so only the newest NewGRF is shown
uint32_t min_loadable_version; ///< NOSAVE: Minimum compatible version a NewGRF can define
uint8_t flags; ///< NOSAVE: GCF_Flags, bitset
GRFStatus status; ///< NOSAVE: GRFStatus, enum
uint32_t grf_bugs; ///< NOSAVE: bugs in this GRF in this run, @see enum GRFBugs
std::array<uint32_t, 0x80> param; ///< GRF parameters
uint8_t num_params; ///< Number of used parameters
uint8_t num_valid_params; ///< NOSAVE: Number of valid parameters (action 0x14)
uint8_t palette; ///< GRFPalette, bitset
std::vector<std::optional<GRFParameterInfo>> param_info; ///< NOSAVE: extra information about the parameters
bool has_param_defaults; ///< NOSAVE: did this newgrf specify any defaults for it's parameters
struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
bool IsCompatible(uint32_t old_version) const;
void SetParams(const std::vector<uint32_t> &pars);
void CopyParams(const GRFConfig &src);
std::optional<std::string> GetTextfile(TextfileType type) const;
const char *GetName() const;
const char *GetDescription() const;
const char *GetURL() const;
void SetParameterDefaults();
void SetSuitablePalette();
void FinalizeParameterInfo();
};
/** Method to find GRFs using FindGRFConfig */
enum FindGRFConfigMode {
FGCM_EXACT, ///< Only find Grfs matching md5sum
FGCM_COMPATIBLE, ///< Find best compatible Grf wrt. desired_version
FGCM_NEWEST, ///< Find newest Grf
FGCM_NEWEST_VALID,///< Find newest Grf, ignoring Grfs with GCF_INVALID set
FGCM_ANY, ///< Use first found
};
extern GRFConfig *_all_grfs; ///< First item in list of all scanned NewGRFs
extern GRFConfig *_grfconfig; ///< First item in list of current GRF set up
extern GRFConfig *_grfconfig_newgame; ///< First item in list of default GRF set up
extern GRFConfig *_grfconfig_static; ///< First item in list of static GRF set up
extern uint _missing_extra_graphics; ///< Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset.
/** Callback for NewGRF scanning. */
struct NewGRFScanCallback {
/** Make sure the right destructor gets called. */
virtual ~NewGRFScanCallback() = default;
/** Called whenever the NewGRF scan completed. */
virtual void OnNewGRFsScanned() = 0;
};
size_t GRFGetSizeOfDataSection(FILE *f);
void ScanNewGRFFiles(NewGRFScanCallback *callback);
const GRFConfig *FindGRFConfig(uint32_t grfid, FindGRFConfigMode mode, const MD5Hash *md5sum = nullptr, uint32_t desired_version = 0);
GRFConfig *GetGRFConfig(uint32_t grfid, uint32_t mask = 0xFFFFFFFF);
GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src, bool init_only);
void AppendStaticGRFConfigs(GRFConfig **dst);
void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el);
void ClearGRFConfigList(GRFConfig **config);
void ResetGRFConfig(bool defaults);
GRFListCompatibility IsGoodGRFConfigList(GRFConfig *grfconfig);
bool FillGRFDetails(GRFConfig *config, bool is_static, Subdirectory subdir = NEWGRF_DIR);
std::string GRFBuildParamList(const GRFConfig *c);
/* In newgrf_gui.cpp */
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config);
void OpenGRFParameterWindow(bool is_baseset, GRFConfig *c, bool editable);
void UpdateNewGRFScanStatus(uint num, const char *name);
void UpdateNewGRFConfigPalette(int32_t new_value = 0);
#endif /* NEWGRF_CONFIG_H */
|