OpenTTD Source 20250311-master-g40ddc03423
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 <http://www.gnu.org/licenses/>.
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#include "core/bitmath_func.hpp"
21#include "core/mem_func.hpp"
22
27enum CanalFeature : uint8_t {
28 CF_WATERSLOPE,
29 CF_LOCKS,
30 CF_DIKES,
31 CF_ICON,
32 CF_DOCKS,
33 CF_RIVER_SLOPE,
34 CF_RIVER_EDGE,
35 CF_RIVER_GUI,
36 CF_BUOY,
37 CF_END,
38};
39
45
46enum GrfLoadingStage : uint8_t {
47 GLS_FILESCAN,
48 GLS_SAFETYSCAN,
49 GLS_LABELSCAN,
50 GLS_INIT,
51 GLS_RESERVE,
52 GLS_ACTIVATION,
53 GLS_END,
54};
55
57
58enum GrfMiscBit : uint8_t {
59 GMB_DESERT_TREES_FIELDS = 0, // Unsupported.
60 GMB_DESERT_PAVED_ROADS = 1,
61 GMB_FIELD_BOUNDING_BOX = 2, // Unsupported.
63 GMB_AMBIENT_SOUND_CALLBACK = 4,
64 GMB_CATENARY_ON_3RD_TRACK = 5, // Unsupported.
65 GMB_SECOND_ROCKY_TILE_SET = 6,
66};
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_FAKE_TOWNS = GSF_END,
95
96 GSF_INVALID = 0xFF,
97};
99
100static const uint32_t INVALID_GRFID = 0xFFFFFFFF;
101
102struct GRFLabel {
103 uint8_t label;
104 uint32_t nfo_line;
105 size_t pos;
106
107 GRFLabel(uint8_t label, uint32_t nfo_line, size_t pos) : label(label), nfo_line(nfo_line), pos(pos) {}
108};
109
111struct GRFFile {
112 std::string filename{};
113 uint32_t grfid = 0;
114 uint8_t grf_version = 0;
115
116 uint sound_offset = 0;
117 uint16_t num_sounds = 0;
118
119 std::vector<std::unique_ptr<struct StationSpec>> stations;
120 std::vector<std::unique_ptr<struct HouseSpec>> housespec;
121 std::vector<std::unique_ptr<struct IndustrySpec>> industryspec;
122 std::vector<std::unique_ptr<struct IndustryTileSpec>> indtspec;
123 std::vector<std::unique_ptr<struct ObjectSpec>> objectspec;
124 std::vector<std::unique_ptr<struct AirportSpec>> airportspec;
125 std::vector<std::unique_ptr<struct AirportTileSpec>> airtspec;
126 std::vector<std::unique_ptr<struct RoadStopSpec>> roadstops;
127
128 std::vector<uint32_t> param{};
129
130 std::vector<GRFLabel> labels{};
131
132 std::vector<CargoLabel> cargo_list{};
133 std::array<uint8_t, NUM_CARGO> cargo_map{};
134
135 std::vector<BadgeID> badge_list{};
136 std::unordered_map<uint16_t, BadgeID> badge_map{};
137
138 std::vector<RailTypeLabel> railtype_list{};
139 std::array<RailType, RAILTYPE_END> railtype_map{};
140
141 std::vector<RoadTypeLabel> roadtype_list{};
142 std::array<RoadType, ROADTYPE_END> roadtype_map{};
143
144 std::vector<RoadTypeLabel> tramtype_list{};
145 std::array<RoadType, ROADTYPE_END> tramtype_map{};
146
147 std::array<CanalProperties, CF_END> canal_local_properties{};
148
149 std::unordered_map<uint8_t, LanguageMap> language_map{};
150
153
154 uint32_t grf_features = 0;
155 PriceMultipliers price_base_multipliers{};
156
157 GRFFile(const struct GRFConfig &config);
158
160 uint32_t GetParam(uint number) const
161 {
162 /* Note: We implicitly test for number < this->param.size() and return 0 for invalid parameters.
163 * In fact this is the more important test, as param is zeroed anyway. */
164 return (number < std::size(this->param)) ? this->param[number] : 0;
165 }
166};
167
174
180
187
193inline bool HasGrfMiscBit(GrfMiscBit bit)
194{
195 extern uint8_t _misc_grf_features;
196 return HasBit(_misc_grf_features, bit);
197}
198
199/* Indicates which are the newgrf features currently loaded ingame */
201
202void LoadNewGRFFile(GRFConfig &config, GrfLoadingStage stage, Subdirectory subdir, bool temporary);
203void LoadNewGRF(SpriteID load_index, uint num_baseset);
204void ReloadNewGRFData(); // in saveload/afterload.cpp
205void ResetNewGRFData();
207
208void GrfMsgI(int severity, const std::string &msg);
209#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)
210
211bool GetGlobalVariable(uint8_t param, uint32_t *value, const GRFFile *grffile);
212
213StringID MapGRFStringID(uint32_t grfid, GRFStringID str);
214void ShowNewGRFError();
215
216#endif /* NEWGRF_H */
Functions related to bit mathematics.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
Types/functions related to cargoes.
#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.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
Functions related to memory operations.
uint8_t _misc_grf_features
Miscellaneous GRF features, set by Action 0x0D, parameter 0x9E.
Definition newgrf.cpp:81
bool GetGlobalVariable(uint8_t param, uint32_t *value, const GRFFile *grffile)
Reads a variable common to VarAction2 and Action7/9/D.
Definition newgrf.cpp:6869
void ResetPersistentNewGRFData()
Reset NewGRF data which is stored persistently in savegames.
Definition newgrf.cpp:9158
ShoreReplacement
Definition newgrf.h:168
@ SHORE_REPLACE_ACTION_A
Shore sprites were replaced by ActionA (using grass tiles for the corner-shores).
Definition newgrf.h:171
@ SHORE_REPLACE_NONE
No shore sprites were replaced.
Definition newgrf.h:169
@ SHORE_REPLACE_ONLY_NEW
Only corner-shores were loaded by Action5 (openttd(w/d).grf only).
Definition newgrf.h:172
@ SHORE_REPLACE_ACTION_5
Shore sprites were replaced by Action5.
Definition newgrf.h:170
bool HasGrfMiscBit(GrfMiscBit bit)
Check for grf miscellaneous bits.
Definition newgrf.h:193
CanalFeature
List of different canal 'features'.
Definition newgrf.h:27
TramReplacement
Definition newgrf.h:175
@ TRAMWAY_REPLACE_DEPOT_WITH_TRACK
Electrified depot graphics with tram track were loaded.
Definition newgrf.h:177
@ TRAMWAY_REPLACE_DEPOT_NO_TRACK
Electrified depot graphics without tram track were loaded.
Definition newgrf.h:178
@ TRAMWAY_REPLACE_DEPOT_NONE
No tram depot graphics were loaded.
Definition newgrf.h:176
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 ...
Definition newgrf.cpp:563
GRFLoadedFeatures _loaded_newgrf_features
Indicates which are the newgrf features currently loaded ingame.
Definition newgrf.cpp:87
void LoadNewGRF(SpriteID load_index, uint num_baseset)
Load all the NewGRFs.
Definition newgrf.cpp:10365
void ResetNewGRFData()
Reset all NewGRF loaded data.
Definition newgrf.cpp:9057
GrfSpecFeature
Definition newgrf.h:68
@ GSF_FAKE_TOWNS
Fake town GrfSpecFeature for NewGRF debugging (parent scope)
Definition newgrf.h:93
@ GSF_INVALID
An invalid spec feature.
Definition newgrf.h:96
@ GSF_FAKE_END
End of the fake features.
Definition newgrf.h:94
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:393
GrfMiscBit
Definition newgrf.h:58
@ GMB_TRAIN_WIDTH_32_PIXELS
Use 32 pixels per train vehicle in depot gui and vehicle details. Never set in the global variable;.
Definition newgrf.h:62
void LoadNewGRFFile(GRFConfig &config, GrfLoadingStage stage, Subdirectory subdir, bool temporary)
Load a particular NewGRF.
Definition newgrf.cpp:10000
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:41
CanalCallbackMasks callback_mask
Bitmask of canal callbacks that have to be called.
Definition newgrf.h:42
uint8_t flags
Flags controlling display.
Definition newgrf.h:43
Information about GRF, used in the game and (part of it) in savegames.
Dynamic data of a loaded NewGRF.
Definition newgrf.h:111
std::array< CanalProperties, CF_END > canal_local_properties
Canal properties as set by this NewGRF.
Definition newgrf.h:147
std::array< uint8_t, NUM_CARGO > cargo_map
Inverse cargo translation table (CargoType -> local ID)
Definition newgrf.h:133
std::vector< RailTypeLabel > railtype_list
Railtype translation table.
Definition newgrf.h:138
uint32_t GetParam(uint number) const
Get GRF Parameter with range checking.
Definition newgrf.h:160
std::vector< RoadTypeLabel > roadtype_list
Roadtype translation table (road)
Definition newgrf.h:141
uint32_t grf_features
Bitset of GrfSpecFeature the grf uses.
Definition newgrf.h:154
std::vector< RoadTypeLabel > tramtype_list
Roadtype translation table (tram)
Definition newgrf.h:144
std::vector< CargoLabel > cargo_list
Cargo translation table (local ID -> label)
Definition newgrf.h:132
uint traininfo_vehicle_width
Width (in pixels) of a 8/8 train vehicle in depot GUI and vehicle details.
Definition newgrf.h:152
std::vector< BadgeID > badge_list
Badge translation table (local index -> global index)
Definition newgrf.h:135
int traininfo_vehicle_pitch
Vertical offset for drawing train images in depot GUI and vehicle details.
Definition newgrf.h:151
std::unordered_map< uint8_t, LanguageMap > language_map
Mappings related to the languages.
Definition newgrf.h:149
std::vector< GRFLabel > labels
List of labels.
Definition newgrf.h:130
PriceMultipliers price_base_multipliers
Price base multipliers as set by the grf.
Definition newgrf.h:155
bool has_2CC
Set if any vehicle is loaded which uses 2cc (two company colours).
Definition newgrf.h:182
ShoreReplacement shore
In which way shore sprites were replaced.
Definition newgrf.h:184
uint64_t used_liveries
Bitmask of LiveryScheme used by the defined engines.
Definition newgrf.h:183
TramReplacement tram
In which way tram depots were replaced.
Definition newgrf.h:185