OpenTTD Source 20251213-master-g1091fa6071
newgrf.h
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#ifndef NEWGRF_H
11#define NEWGRF_H
12
13#include "cargotype.h"
14#include "rail_type.h"
15#include "road_type.h"
16#include "fileio_type.h"
17#include "newgrf_badge_type.h"
18#include "newgrf_callbacks.h"
19#include "newgrf_text_type.h"
20
25enum CanalFeature : uint8_t {
26 CF_WATERSLOPE,
27 CF_LOCKS,
28 CF_DIKES,
29 CF_ICON,
30 CF_DOCKS,
31 CF_RIVER_SLOPE,
32 CF_RIVER_EDGE,
33 CF_RIVER_GUI,
34 CF_BUOY,
35 CF_END,
36};
37
43
44enum GrfLoadingStage : uint8_t {
45 GLS_FILESCAN,
46 GLS_SAFETYSCAN,
47 GLS_LABELSCAN,
48 GLS_INIT,
49 GLS_RESERVE,
50 GLS_ACTIVATION,
51 GLS_END,
52};
53
55
56enum class GrfMiscBit : uint8_t {
57 DesertTreesFields = 0, // Unsupported.
58 DesertPavedRoads = 1,
59 FieldBoundingBox = 2, // Unsupported.
61 AmbientSoundCallback = 4,
62 CatenaryOn3rdTrack = 5, // Unsupported.
63 SecondRockyTileSet = 6,
64};
65
67
68enum GrfSpecFeature : uint8_t {
69 GSF_TRAINS,
70 GSF_ROADVEHICLES,
71 GSF_SHIPS,
72 GSF_AIRCRAFT,
73 GSF_STATIONS,
74 GSF_CANALS,
75 GSF_BRIDGES,
76 GSF_HOUSES,
77 GSF_GLOBALVAR,
78 GSF_INDUSTRYTILES,
79 GSF_INDUSTRIES,
80 GSF_CARGOES,
81 GSF_SOUNDFX,
82 GSF_AIRPORTS,
83 GSF_SIGNALS,
84 GSF_OBJECTS,
85 GSF_RAILTYPES,
86 GSF_AIRPORTTILES,
87 GSF_ROADTYPES,
88 GSF_TRAMTYPES,
89 GSF_ROADSTOPS,
90 GSF_BADGES,
91 GSF_END,
92
93 GSF_DEFAULT = GSF_END,
94 GSF_FAKE_TOWNS = GSF_END,
96
97 GSF_ORIGINAL_STRINGS = 0x48,
98
99 GSF_INVALID = 0xFF,
100};
102
103static const uint32_t INVALID_GRFID = 0xFFFFFFFF;
104
105struct GRFLabel {
106 uint8_t label;
107 uint32_t nfo_line;
108 size_t pos;
109
110 GRFLabel(uint8_t label, uint32_t nfo_line, size_t pos) : label(label), nfo_line(nfo_line), pos(pos) {}
111};
112
114struct GRFFile {
115 std::string filename{};
116 uint32_t grfid = 0;
117 uint8_t grf_version = 0;
118
119 uint sound_offset = 0;
120 uint16_t num_sounds = 0;
121
122 std::vector<std::unique_ptr<struct StationSpec>> stations;
123 std::vector<std::unique_ptr<struct HouseSpec>> housespec;
124 std::vector<std::unique_ptr<struct IndustrySpec>> industryspec;
125 std::vector<std::unique_ptr<struct IndustryTileSpec>> indtspec;
126 std::vector<std::unique_ptr<struct ObjectSpec>> objectspec;
127 std::vector<std::unique_ptr<struct AirportSpec>> airportspec;
128 std::vector<std::unique_ptr<struct AirportTileSpec>> airtspec;
129 std::vector<std::unique_ptr<struct RoadStopSpec>> roadstops;
130
131 std::vector<uint32_t> param{};
132
133 std::vector<GRFLabel> labels{};
134
135 std::vector<CargoLabel> cargo_list{};
136 std::array<uint8_t, NUM_CARGO> cargo_map{};
137
138 std::vector<BadgeID> badge_list{};
139 std::unordered_map<uint16_t, BadgeID> badge_map{};
140
141 std::vector<RailTypeLabel> railtype_list{};
142 std::array<RailType, RAILTYPE_END> railtype_map{};
143
144 std::vector<RoadTypeLabel> roadtype_list{};
145 std::array<RoadType, ROADTYPE_END> roadtype_map{};
146
147 std::vector<RoadTypeLabel> tramtype_list{};
148 std::array<RoadType, ROADTYPE_END> tramtype_map{};
149
150 std::array<CanalProperties, CF_END> canal_local_properties{};
151
152 std::unordered_map<uint8_t, LanguageMap> language_map{};
153
156
158 PriceMultipliers price_base_multipliers{};
159
160 GRFFile(const struct GRFConfig &config);
161 GRFFile();
162 GRFFile(GRFFile &&other);
163 ~GRFFile();
164
166 uint32_t GetParam(uint number) const
167 {
168 /* Note: We implicitly test for number < this->param.size() and return 0 for invalid parameters.
169 * In fact this is the more important test, as param is zeroed anyway. */
170 return (number < std::size(this->param)) ? this->param[number] : 0;
171 }
172};
173
180
186
193
203
209inline bool HasGrfMiscBit(GrfMiscBit bit)
210{
212 return _misc_grf_features.Test(bit);
213}
214
215/* Indicates which are the newgrf features currently loaded ingame */
217
218void LoadNewGRFFile(GRFConfig &config, GrfLoadingStage stage, Subdirectory subdir, bool temporary);
219void LoadNewGRF(SpriteID load_index, uint num_baseset);
220void ReloadNewGRFData(); // in saveload/afterload.cpp
221void ResetNewGRFData();
223
224void GrfMsgI(int severity, const std::string &msg);
225#define GrfMsg(severity, format_string, ...) do { if ((severity) == 0 || _debug_grf_level >= (severity)) GrfMsgI(severity, fmt::format(FMT_STRING(format_string) __VA_OPT__(,) __VA_ARGS__)); } while (false)
226
227bool GetGlobalVariable(uint8_t param, uint32_t *value, const GRFFile *grffile);
228
229StringID MapGRFStringID(uint32_t grfid, GRFStringID str);
230void ShowNewGRFError();
231
232#endif /* NEWGRF_H */
Types/functions related to cargoes.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
PriceCategory
Categories of a price bases.
Price
Enumeration of all base prices for use with Prices.
#define DECLARE_INCREMENT_DECREMENT_OPERATORS(enum_type)
For some enums it is useful to have pre/post increment/decrement operators.
Definition enum_type.hpp:63
Types for Standard In/Out file operations.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
Definition fileio_type.h:88
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
GrfMiscBits _misc_grf_features
Miscellaneous GRF features, set by Action 0x0D, parameter 0x9E.
Definition newgrf.cpp:71
bool GetGlobalVariable(uint8_t param, uint32_t *value, const GRFFile *grffile)
Reads a variable common to VarAction2 and Action7/9/D.
void ResetPersistentNewGRFData()
Reset NewGRF data which is stored persistently in savegames.
Definition newgrf.cpp:505
ShoreReplacement
Definition newgrf.h:174
@ SHORE_REPLACE_ACTION_A
Shore sprites were replaced by ActionA (using grass tiles for the corner-shores).
Definition newgrf.h:177
@ SHORE_REPLACE_NONE
No shore sprites were replaced.
Definition newgrf.h:175
@ SHORE_REPLACE_ONLY_NEW
Only corner-shores were loaded by Action5 (openttd(w/d).grf only).
Definition newgrf.h:178
@ SHORE_REPLACE_ACTION_5
Shore sprites were replaced by Action5.
Definition newgrf.h:176
bool HasGrfMiscBit(GrfMiscBit bit)
Check for grf miscellaneous bits.
Definition newgrf.h:209
CanalFeature
List of different canal 'features'.
Definition newgrf.h:25
TramReplacement
Definition newgrf.h:181
@ TRAMWAY_REPLACE_DEPOT_WITH_TRACK
Electrified depot graphics with tram track were loaded.
Definition newgrf.h:183
@ TRAMWAY_REPLACE_DEPOT_NO_TRACK
Electrified depot graphics without tram track were loaded.
Definition newgrf.h:184
@ TRAMWAY_REPLACE_DEPOT_NONE
No tram depot graphics were loaded.
Definition newgrf.h:182
StringID MapGRFStringID(uint32_t grfid, GRFStringID str)
Used when setting an object's property to map to the GRF's strings while taking in consideration the ...
GRFLoadedFeatures _loaded_newgrf_features
Indicates which are the newgrf features currently loaded ingame.
Definition newgrf.cpp:74
void LoadNewGRF(SpriteID load_index, uint num_baseset)
Load all the NewGRFs.
Definition newgrf.cpp:1758
void ResetNewGRFData()
Reset all NewGRF loaded data.
Definition newgrf.cpp:408
GrfSpecFeature
Definition newgrf.h:68
@ GSF_FAKE_TOWNS
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition newgrf.h:94
@ GSF_DEFAULT
Unspecified feature, default badge.
Definition newgrf.h:93
@ GSF_INVALID
An invalid spec feature.
Definition newgrf.h:99
@ GSF_FAKE_END
End of the fake features.
Definition newgrf.h:95
void GrfMsgI(int severity, const std::string &msg)
Debug() function dedicated to newGRF debugging messages Function is essentially the same as Debug(grf...
Definition newgrf.cpp:90
GrfMiscBit
Definition newgrf.h:56
@ TrainWidth32Pixels
Use 32 pixels per train vehicle in depot gui and vehicle details. Never set in the global variable;.
void LoadNewGRFFile(GRFConfig &config, GrfLoadingStage stage, Subdirectory subdir, bool temporary)
Load a particular NewGRF.
Definition newgrf.cpp:1391
void ShowNewGRFError()
Show the first NewGRF error we can find.
void ReloadNewGRFData()
Reload all NewGRF files during a running game.
Types related to NewGRF badges.
Callbacks that NewGRFs could implement.
Header of Action 04 "universal holder" structure.
The different types of rail.
Enums and other types related to roads.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Canal properties local to the NewGRF.
Definition newgrf.h:39
CanalCallbackMasks callback_mask
Bitmask of canal callbacks that have to be called.
Definition newgrf.h:40
uint8_t flags
Flags controlling display.
Definition newgrf.h:41
Information about GRF, used in the game and (part of it) in savegames.
Dynamic data of a loaded NewGRF.
Definition newgrf.h:114
std::array< CanalProperties, CF_END > canal_local_properties
Canal properties as set by this NewGRF.
Definition newgrf.h:150
std::array< uint8_t, NUM_CARGO > cargo_map
Inverse cargo translation table (CargoType -> local ID)
Definition newgrf.h:136
std::vector< RailTypeLabel > railtype_list
Railtype translation table.
Definition newgrf.h:141
uint32_t GetParam(uint number) const
Get GRF Parameter with range checking.
Definition newgrf.h:166
std::vector< RoadTypeLabel > roadtype_list
Roadtype translation table (road)
Definition newgrf.h:144
std::vector< RoadTypeLabel > tramtype_list
Roadtype translation table (tram)
Definition newgrf.h:147
std::vector< CargoLabel > cargo_list
Cargo translation table (local ID -> label)
Definition newgrf.h:135
uint traininfo_vehicle_width
Width (in pixels) of a 8/8 train vehicle in depot GUI and vehicle details.
Definition newgrf.h:155
std::vector< BadgeID > badge_list
Badge translation table (local index -> global index)
Definition newgrf.h:138
GrfSpecFeatures grf_features
Bitset of GrfSpecFeature the grf uses.
Definition newgrf.h:157
int traininfo_vehicle_pitch
Vertical offset for drawing train images in depot GUI and vehicle details.
Definition newgrf.h:154
std::unordered_map< uint8_t, LanguageMap > language_map
Mappings related to the languages.
Definition newgrf.h:152
std::vector< GRFLabel > labels
List of labels.
Definition newgrf.h:133
PriceMultipliers price_base_multipliers
Price base multipliers as set by the grf.
Definition newgrf.h:158
bool has_2CC
Set if any vehicle is loaded which uses 2cc (two company colours).
Definition newgrf.h:188
ShoreReplacement shore
In which way shore sprites were replaced.
Definition newgrf.h:190
uint64_t used_liveries
Bitmask of LiveryScheme used by the defined engines.
Definition newgrf.h:189
TramReplacement tram
In which way tram depots were replaced.
Definition newgrf.h:191
Describes properties of price bases.
Definition newgrf.h:197
Price fallback_price
Fallback price multiplier for new prices but old grfs.
Definition newgrf.h:201
PriceCategory category
Price is affected by certain difficulty settings.
Definition newgrf.h:199
Money start_price
Default value at game start, before adding multipliers.
Definition newgrf.h:198
GrfSpecFeature grf_feature
GRF Feature that decides whether price multipliers apply locally or globally, GSF_END if none.
Definition newgrf.h:200