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/>.
8 /** @file newgrf_config.h Functions to find and configure NewGRFs. */
10 #ifndef NEWGRF_CONFIG_H
11 #define NEWGRF_CONFIG_H
13 #include "strings_type.h"
14 #include "core/alloc_type.hpp"
15 #include "misc/countedptr.hpp"
16 #include "fileio_type.h"
17 #include "textfile_type.h"
18 #include "newgrf_text.h"
19 #include "3rdparty/md5/md5.h"
21 /** GRF config bit flags */
23 GCF_SYSTEM
, ///< GRF file is an openttd-internal system grf
24 GCF_UNSAFE
, ///< GRF file is unsafe for static usage
25 GCF_STATIC
, ///< GRF file is used statically (can be used in any MP game)
26 GCF_COMPATIBLE
, ///< GRF file does not exactly match the requested GRF (different MD5SUM), but grfid matches)
27 GCF_COPY
, ///< The data is copied from a grf in _all_grfs
28 GCF_INIT_ONLY
, ///< GRF file is processed up to GLS_INIT
29 GCF_RESERVED
, ///< GRF file passed GLS_RESERVE stage
30 GCF_INVALID
, ///< GRF is unusable with this version of OpenTTD
35 GCS_UNKNOWN
, ///< The status of this grf file is unknown
36 GCS_DISABLED
, ///< GRF file is disabled
37 GCS_NOT_FOUND
, ///< GRF file was not found in the local cache
38 GCS_INITIALISED
, ///< GRF file has been initialised
39 GCS_ACTIVATED
, ///< GRF file has been activated
42 /** Encountered GRF bugs */
44 GBUG_VEH_LENGTH
, ///< Length of rail vehicle changes when not inside a depot
45 GBUG_VEH_REFIT
, ///< Articulated vehicles carry different cargoes resp. are differently refittable than specified in purchase list
46 GBUG_VEH_POWERED_WAGON
, ///< Powered wagon changed poweredness state when not inside a depot
47 GBUG_UNKNOWN_CB_RESULT
, ///< A callback returned an unknown/invalid result
48 GBUG_VEH_CAPACITY
, ///< Capacity of vehicle changes when not refitting or arranging
51 /** Status of post-gameload GRF compatibility check */
52 enum GRFListCompatibility
{
53 GLC_ALL_GOOD
, ///< All GRF needed by game are present
54 GLC_COMPATIBLE
, ///< Compatible (eg. the same ID, but different checksum) GRF found in at least one case
55 GLC_NOT_FOUND
, ///< At least one GRF couldn't be found (higher priority than GLC_COMPATIBLE)
58 /** Information that can/has to be stored about a GRF's palette. */
60 GRFP_USE_BIT
= 0, ///< The bit used for storing the palette to use.
61 GRFP_GRF_OFFSET
= 2, ///< The offset of the GRFP_GRF data.
62 GRFP_GRF_SIZE
= 2, ///< The size of the GRFP_GRF data.
63 GRFP_BLT_OFFSET
= 4, ///< The offset of the GRFP_BLT data.
64 GRFP_BLT_SIZE
= 1, ///< The size of the GRFP_BLT data.
66 GRFP_USE_DOS
= 0x0, ///< The palette state is set to use the DOS palette.
67 GRFP_USE_WINDOWS
= 0x1, ///< The palette state is set to use the Windows palette.
68 GRFP_USE_MASK
= 0x1, ///< Bitmask to get only the use palette use states.
70 GRFP_GRF_UNSET
= 0x0 << GRFP_GRF_OFFSET
, ///< The NewGRF provided no information.
71 GRFP_GRF_DOS
= 0x1 << GRFP_GRF_OFFSET
, ///< The NewGRF says the DOS palette can be used.
72 GRFP_GRF_WINDOWS
= 0x2 << GRFP_GRF_OFFSET
, ///< The NewGRF says the Windows palette can be used.
73 GRFP_GRF_ANY
= GRFP_GRF_DOS
| GRFP_GRF_WINDOWS
, ///< The NewGRF says any palette can be used.
74 GRFP_GRF_MASK
= GRFP_GRF_ANY
, ///< Bitmask to get only the NewGRF supplied information.
76 GRFP_BLT_UNSET
= 0x0 << GRFP_BLT_OFFSET
, ///< The NewGRF provided no information or doesn't care about a 32 bpp blitter.
77 GRFP_BLT_32BPP
= 0x1 << GRFP_BLT_OFFSET
, ///< The NewGRF prefers a 32 bpp blitter.
78 GRFP_BLT_MASK
= GRFP_BLT_32BPP
, ///< Bitmask to only get the blitter information.
82 /** Basic data to distinguish a GRF. Used in the server list window */
83 struct GRFIdentifier
{
84 uint32_t grfid
; ///< GRF ID (defined by Action 0x08)
85 MD5Hash md5sum
; ///< MD5 checksum of file to distinguish files with the same GRF ID (eg. newer version of GRF)
87 GRFIdentifier() = default;
88 GRFIdentifier(const GRFIdentifier
&other
) = default;
89 GRFIdentifier(GRFIdentifier
&&other
) = default;
90 GRFIdentifier(uint32_t grfid
, const MD5Hash
&md5sum
) : grfid(grfid
), md5sum(md5sum
) {}
92 GRFIdentifier
& operator =(const GRFIdentifier
&other
) = default;
95 * Does the identification match the provided values?
96 * @param grfid Expected grfid.
97 * @param md5sum Expected md5sum, may be \c nullptr (in which case, do not check it).
98 * @return the object has the provided grfid and md5sum.
100 inline bool HasGrfIdentifier(uint32_t grfid
, const MD5Hash
*md5sum
) const
102 if (this->grfid
!= grfid
) return false;
103 if (md5sum
== nullptr) return true;
104 return *md5sum
== this->md5sum
;
108 /** Information about why GRF had problems during initialisation */
110 GRFError(StringID severity
, StringID message
= 0);
112 std::string custom_message
{}; ///< Custom message (if present)
113 std::string data
{}; ///< Additional data for message and custom_message
114 StringID message
{}; ///< Default message
115 StringID severity
{}; ///< Info / Warning / Error / Fatal
116 std::array
<uint32_t, 2> param_value
{}; ///< Values of GRF parameters to show for message and custom_message
119 /** The possible types of a newgrf parameter. */
120 enum GRFParameterType
{
121 PTYPE_UINT_ENUM
, ///< The parameter allows a range of numbers, each of which can have a special name
122 PTYPE_BOOL
, ///< The parameter is either 0 or 1
123 PTYPE_END
, ///< Invalid parameter type
126 /** Information about one grf parameter. */
127 struct GRFParameterInfo
{
128 GRFParameterInfo(uint nr
);
129 GRFTextList name
; ///< The name of this parameter
130 GRFTextList desc
; ///< The description of this parameter
131 GRFParameterType type
; ///< The type of this parameter
132 uint32_t min_value
; ///< The minimal value this parameter can have
133 uint32_t max_value
; ///< The maximal value of this parameter
134 uint32_t def_value
; ///< Default value of this parameter
135 byte param_nr
; ///< GRF parameter to store content in
136 byte first_bit
; ///< First bit to use in the GRF parameter
137 byte num_bit
; ///< Number of bits to use for this parameter
138 std::map
<uint32_t, GRFTextList
> value_names
; ///< Names for each value.
139 bool complete_labels
; ///< True if all values have a label.
141 uint32_t GetValue(struct GRFConfig
*config
) const;
142 void SetValue(struct GRFConfig
*config
, uint32_t value
);
146 /** Information about GRF, used in the game and (part of it) in savegames */
147 struct GRFConfig
: ZeroedMemoryAllocator
{
148 GRFConfig(const std::string
&filename
= std::string
{});
149 GRFConfig(const GRFConfig
&config
);
151 /* Remove the copy assignment, as the default implementation will not do the right thing. */
152 GRFConfig
&operator=(GRFConfig
&rhs
) = delete;
154 GRFIdentifier ident
; ///< grfid and md5sum to uniquely identify newgrfs
155 MD5Hash original_md5sum
; ///< MD5 checksum of original file if only a 'compatible' file was loaded
156 std::string filename
; ///< Filename - either with or without full path
157 GRFTextWrapper name
; ///< NOSAVE: GRF name (Action 0x08)
158 GRFTextWrapper info
; ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08)
159 GRFTextWrapper url
; ///< NOSAVE: URL belonging to this GRF.
160 std::optional
<GRFError
> error
; ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B)
162 uint32_t version
; ///< NOSAVE: Version a NewGRF can set so only the newest NewGRF is shown
163 uint32_t min_loadable_version
; ///< NOSAVE: Minimum compatible version a NewGRF can define
164 uint8_t flags
; ///< NOSAVE: GCF_Flags, bitset
165 GRFStatus status
; ///< NOSAVE: GRFStatus, enum
166 uint32_t grf_bugs
; ///< NOSAVE: bugs in this GRF in this run, @see enum GRFBugs
167 std::array
<uint32_t, 0x80> param
; ///< GRF parameters
168 uint8_t num_params
; ///< Number of used parameters
169 uint8_t num_valid_params
; ///< NOSAVE: Number of valid parameters (action 0x14)
170 uint8_t palette
; ///< GRFPalette, bitset
171 std::vector
<std::optional
<GRFParameterInfo
>> param_info
; ///< NOSAVE: extra information about the parameters
172 bool has_param_defaults
; ///< NOSAVE: did this newgrf specify any defaults for it's parameters
174 struct GRFConfig
*next
; ///< NOSAVE: Next item in the linked list
176 bool IsCompatible(uint32_t old_version
) const;
177 void SetParams(const std::vector
<uint32_t> &pars
);
178 void CopyParams(const GRFConfig
&src
);
180 std::optional
<std::string
> GetTextfile(TextfileType type
) const;
181 const char *GetName() const;
182 const char *GetDescription() const;
183 const char *GetURL() const;
185 void SetParameterDefaults();
186 void SetSuitablePalette();
187 void FinalizeParameterInfo();
190 /** Method to find GRFs using FindGRFConfig */
191 enum FindGRFConfigMode
{
192 FGCM_EXACT
, ///< Only find Grfs matching md5sum
193 FGCM_COMPATIBLE
, ///< Find best compatible Grf wrt. desired_version
194 FGCM_NEWEST
, ///< Find newest Grf
195 FGCM_NEWEST_VALID
,///< Find newest Grf, ignoring Grfs with GCF_INVALID set
196 FGCM_ANY
, ///< Use first found
199 extern GRFConfig
*_all_grfs
; ///< First item in list of all scanned NewGRFs
200 extern GRFConfig
*_grfconfig
; ///< First item in list of current GRF set up
201 extern GRFConfig
*_grfconfig_newgame
; ///< First item in list of default GRF set up
202 extern GRFConfig
*_grfconfig_static
; ///< First item in list of static GRF set up
203 extern uint _missing_extra_graphics
; ///< Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset.
205 /** Callback for NewGRF scanning. */
206 struct NewGRFScanCallback
{
207 /** Make sure the right destructor gets called. */
208 virtual ~NewGRFScanCallback() = default;
209 /** Called whenever the NewGRF scan completed. */
210 virtual void OnNewGRFsScanned() = 0;
213 size_t GRFGetSizeOfDataSection(FILE *f
);
215 void ScanNewGRFFiles(NewGRFScanCallback
*callback
);
216 const GRFConfig
*FindGRFConfig(uint32_t grfid
, FindGRFConfigMode mode
, const MD5Hash
*md5sum
= nullptr, uint32_t desired_version
= 0);
217 GRFConfig
*GetGRFConfig(uint32_t grfid
, uint32_t mask
= 0xFFFFFFFF);
218 GRFConfig
**CopyGRFConfigList(GRFConfig
**dst
, const GRFConfig
*src
, bool init_only
);
219 void AppendStaticGRFConfigs(GRFConfig
**dst
);
220 void AppendToGRFConfigList(GRFConfig
**dst
, GRFConfig
*el
);
221 void ClearGRFConfigList(GRFConfig
**config
);
222 void ResetGRFConfig(bool defaults
);
223 GRFListCompatibility
IsGoodGRFConfigList(GRFConfig
*grfconfig
);
224 bool FillGRFDetails(GRFConfig
*config
, bool is_static
, Subdirectory subdir
= NEWGRF_DIR
);
225 std::string
GRFBuildParamList(const GRFConfig
*c
);
227 /* In newgrf_gui.cpp */
228 void ShowNewGRFSettings(bool editable
, bool show_params
, bool exec_changes
, GRFConfig
**config
);
229 void OpenGRFParameterWindow(bool is_baseset
, GRFConfig
*c
, bool editable
);
231 void UpdateNewGRFScanStatus(uint num
, const char *name
);
232 void UpdateNewGRFConfigPalette(int32_t new_value
= 0);
234 #endif /* NEWGRF_CONFIG_H */