OpenTTD Source 20250312-master-gcdcc6b491d
industrytype.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 INDUSTRYTYPE_H
11#define INDUSTRYTYPE_H
12
13#include "map_type.h"
14#include "slope_type.h"
15#include "industry_type.h"
16#include "landscape_type.h"
17#include "cargo_type.h"
19#include "newgrf_badge_type.h"
20#include "newgrf_callbacks.h"
21#include "newgrf_commons.h"
22
24enum class IndustryLifeType : uint8_t {
25 Extractive = 0,
26 Organic = 1,
27 Processing = 2,
28};
30
32
49
57
59enum class IndustryBehaviour : uint8_t {
60 PlantFields = 0,
61 CutTrees = 1,
62 BuiltOnWater = 2,
63 Town1200More = 3,
64 OnlyInTown = 4,
65 OnlyNearTown = 5,
66 PlantOnBuild = 6,
67 DontIncrProd = 7,
68 Before1950 = 8,
69 After1960 = 9,
70 AIAirShipRoutes = 10,
71 AirplaneAttacks = 11,
72 ChopperAttacks = 12,
73 CanSubsidence = 13,
74 /* The following flags are only used for newindustries and do no represent any normal behaviour */
80 NoPaxProdClamp = 19,
81};
83
85enum class IndustryTileSpecialFlag : uint8_t {
87 AcceptsAllCargo = 1,
88};
90
94 IndustryGfx gfx;
95};
96
98using IndustryTileLayout = std::vector<IndustryTileLayoutTile>;
99
104 std::vector<IndustryTileLayout> layouts;
108 IndustryType conflicting[3];
109 uint8_t check_proc;
110 std::array<CargoType, INDUSTRY_NUM_OUTPUTS> produced_cargo;
111 uint8_t production_rate[INDUSTRY_NUM_OUTPUTS];
117 std::array<CargoType, INDUSTRY_NUM_INPUTS> accepts_cargo;
122 uint8_t map_colour;
129 uint8_t appear_ingame[NUM_LANDSCAPE];
130 uint8_t appear_creation[NUM_LANDSCAPE];
131 /* Newgrf data */
133 bool enabled;
135 std::vector<uint8_t> random_sounds;
136 std::vector<BadgeID> badges;
137
138 std::array<std::variant<CargoLabel, MixedCargoType>, INDUSTRY_ORIGINAL_NUM_OUTPUTS> produced_cargo_label;
139 std::array<std::variant<CargoLabel, MixedCargoType>, INDUSTRY_ORIGINAL_NUM_INPUTS> accepts_cargo_label;
140
141 bool IsRawIndustry() const;
142 bool IsProcessingIndustry() const;
144 Money GetRemovalCost() const;
145 bool UsesOriginalEconomy() const;
146};
147
153 std::array<CargoType, INDUSTRY_NUM_INPUTS> accepts_cargo;
154 std::array<int8_t, INDUSTRY_NUM_INPUTS> acceptance;
157 uint8_t anim_next;
163 /* Newgrf data */
167 bool enabled;
169 std::vector<BadgeID> badges;
170
171 std::array<std::variant<CargoLabel, MixedCargoType>, INDUSTRY_ORIGINAL_NUM_INPUTS> accepts_cargo_label;
172};
173
174/* industry_cmd.cpp*/
175const IndustrySpec *GetIndustrySpec(IndustryType thistype);
176const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx);
177void ResetIndustries();
178
179/* writable arrays of specs */
180extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
181extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
182
183/* industry_gui.cpp */
184void SortIndustryTypes();
185/* Industry types sorted alphabetically by name. */
186extern std::array<IndustryType, NUM_INDUSTRYTYPES> _sorted_industry_types;
187
193inline IndustryGfx GetTranslatedIndustryTileID(IndustryGfx gfx)
194{
195 /* the 0xFF should be GFX_WATERTILE_SPECIALCHECK but for reasons of include mess,
196 * we'll simplify the writing.
197 * Basically, the first test is required since the GFX_WATERTILE_SPECIALCHECK value
198 * will never be assigned as a tile index and is only required in order to do some
199 * tests while building the industry (as in WATER REQUIRED */
200 if (gfx != 0xFF) {
201 assert(gfx < NUM_INDUSTRYTILES);
202 const IndustryTileSpec *it = &_industry_tile_specs[gfx];
203 return it->grf_prop.override == INVALID_INDUSTRYTILE ? gfx : it->grf_prop.override;
204 } else {
205 return gfx;
206 }
207}
208
209#endif /* INDUSTRYTYPE_H */
Types related to cargoes...
Types related to the industry.
static const int INDUSTRY_ORIGINAL_NUM_INPUTS
Original number of accepted cargo types.
static const int INDUSTRY_NUM_OUTPUTS
Number of cargo types an industry can produce.
static const int INDUSTRY_NUM_INPUTS
Number of cargo types an industry can accept.
static const IndustryType NUM_INDUSTRYTYPES
total number of industry types, new and old; limited to 240 because we need some special ids like IT_...
static const IndustryGfx INVALID_INDUSTRYTILE
one above amount is considered invalid
static const int INDUSTRY_ORIGINAL_NUM_OUTPUTS
Original number of produced cargo types.
static const IndustryGfx NUM_INDUSTRYTILES
total number of industry tiles, new and old
IndustryBehaviour
Various industry behaviours mostly to represent original TTD specialities.
@ AirplaneAttacks
can be exploded by a military airplane (oil refinery)
@ ProdCallbackRandom
Production callback needs random bits in var 10.
@ NoBuildMapCreation
Do not force one instance of this type to appear on map generation.
@ CutTrees
cuts trees and produce first output cargo from them (lumber mill)
@ PlantOnBuild
Fields are planted around when built (all farms)
@ Before1950
can only be built before 1950 (oil wells)
@ BuiltOnWater
is built on water (oil rig)
@ DontIncrProd
do not increase production (oil wells) in the temperate climate
@ AIAirShipRoutes
ai will attempt to establish air/ship routes to this industry (oil rig)
@ CargoTypesUnlimited
Allow produced/accepted cargoes callbacks to supply more than 2 and 3 types.
@ After1960
can only be built after 1960 (oil rigs)
@ CanSubsidence
can cause a subsidence (coal mine, shaft that collapses)
@ OnlyInTown
can only be built in towns (arctic/tropic banks, water tower)
@ ProdMultiHandling
Automatic production multiplier handling.
@ PlantFields
periodically plants fields around itself (temp and arctic farms)
@ Town1200More
can only be built in towns larger than 1200 inhabitants (temperate bank)
@ ChopperAttacks
can be exploded by a military helicopter (factory)
@ NoPaxProdClamp
Do not clamp production of passengers. (smooth economy only)
@ CanCloseLastInstance
Allow closing down the last instance of this type.
@ OnlyNearTown
is always built near towns (toy shop)
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Array of industries data.
const IndustryTileSpec * GetIndustryTileSpec(IndustryGfx gfx)
Array of industry tiles data.
IndustryTileSpecialFlag
Flags for miscellaneous industry tile specialities.
@ NextFrameRandomBits
Callback 0x26 needs random bits.
@ AcceptsAllCargo
Tile always accepts all cargoes the associated industry accepts.
IndustryLifeType
Available types of industry lifetimes.
@ Processing
Like factories.
@ Organic
Like forests.
@ Extractive
Like mines.
IndustryGfx GetTranslatedIndustryTileID(IndustryGfx gfx)
Do industry gfx ID translation for NewGRFs.
std::vector< IndustryTileLayoutTile > IndustryTileLayout
A complete tile layout for an industry is a list of tiles.
CheckProc
Available procedures to check whether an industry may build at a given location.
@ CHECK_REFINERY
Industry should be positioned near edge of the map.
@ CHECK_END
End marker of the industry check procedures.
@ CHECK_PLANTATION
Industry should NOT be in the desert.
@ CHECK_OIL_RIG
Industries at sea should be positioned near edge of the map.
@ CHECK_LUMBERMILL
Industry should be in the rainforest.
@ CHECK_WATER
Industry should be in the desert.
@ CHECK_BUBBLEGEN
Industry should be in low land.
@ CHECK_FOREST
Industry should be build above snow-line in arctic climate.
@ CHECK_FARM
Industry should be below snow-line in arctic.
@ CHECK_NOTHING
Always succeeds.
std::array< IndustryType, NUM_INDUSTRYTYPES > _sorted_industry_types
Industry types sorted by name.
void ResetIndustries()
This function initialize the spec arrays of both industry and industry tiles.
IndustryConstructionType
How was the industry created.
@ ICT_UNKNOWN
in previous game version or without newindustries activated
@ ICT_MAP_GENERATION
during random map creation
@ ICT_NORMAL_GAMEPLAY
either by user or random creation process
@ ICT_SCENARIO_EDITOR
while editing a scenario
static constexpr IndustryLifeTypes INDUSTRYLIFE_BLACK_HOLE
Like power plants and banks.
void SortIndustryTypes()
Initialize the list of sorted industry types.
Types related to the landscape.
Types related to maps.
Definitions related to NewGRF animation.
Types related to NewGRF badges.
Callbacks that NewGRFs could implement.
This file simplyfies and embeds a common mechanism of loading/saving and mapping of grf entities.
Definitions of a slope.
Slope
Enumeration for the slope-type.
Definition slope_type.h:48
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Information about animation.
Data related to the handling of grf files.
uint16_t override
id of the entity been replaced by
Defines the data structure for constructing industry.
IndustryCallbackMasks callback_mask
Bitmask of industry callbacks that have to be called.
bool IsProcessingIndustry() const
Is an industry with the spec a processing industry?
std::vector< uint8_t > random_sounds
Random sounds;.
Money GetRemovalCost() const
Get the cost for removing this industry Take note that the cost will always be zero for non-grf indus...
std::array< CargoType, INDUSTRY_NUM_INPUTS > accepts_cargo
16 accepted cargoes.
uint8_t appear_creation[NUM_LANDSCAPE]
Probability of appearance during map creation.
bool UsesOriginalEconomy() const
Determines whether this industrytype uses standard/newgrf production changes.
LandscapeTypes climate_availability
Bitmask, giving landscape enums as bit position.
uint8_t minimal_cargo
minimum amount of cargo transported to the stations.
uint32_t removal_cost_multiplier
Base removal cost multiplier.
uint32_t prospecting_chance
Chance prospecting succeeds.
StringID production_up_text
Message appearing when the industry's production is increasing.
StringID name
Displayed name of the industry.
std::array< std::variant< CargoLabel, MixedCargoType >, INDUSTRY_ORIGINAL_NUM_INPUTS > accepts_cargo_label
Cargo labels of accepted cargo for default industries.
uint8_t cost_multiplier
Base construction cost multiplier.
uint16_t input_cargo_multiplier[INDUSTRY_NUM_INPUTS][INDUSTRY_NUM_OUTPUTS]
Input cargo multipliers (multiply amount of incoming cargo for the produced cargoes)
bool IsRawIndustry() const
Is an industry with the spec a raw industry?
IndustryType conflicting[3]
Industries this industry cannot be close to.
uint8_t appear_ingame[NUM_LANDSCAPE]
Probability of appearance in game.
GRFFileProps grf_prop
properties related to the grf file
StringID production_down_text
Message appearing when the industry's production is decreasing.
StringID station_name
Default name for nearby station.
IndustryBehaviours behaviour
How this industry will behave, and how others entities can use it.
StringID closure_text
Message appearing when the industry closes.
StringID new_industry_text
Message appearing when the industry is built.
std::vector< IndustryTileLayout > layouts
List of possible tile layouts for the industry.
bool enabled
entity still available (by default true).newgrf can disable it, though
Money GetConstructionCost() const
Get the cost for constructing this industry.
uint8_t map_colour
colour used for the small map
IndustryLifeTypes life_type
This is also known as Industry production flag, in newgrf specs.
uint8_t check_proc
Index to a procedure to check for conflicting circumstances.
std::array< std::variant< CargoLabel, MixedCargoType >, INDUSTRY_ORIGINAL_NUM_OUTPUTS > produced_cargo_label
Cargo labels of produced cargo for default industries.
Definition of one tile in an industry tile layout.
Defines the data structure of each individual tile of an industry.
uint8_t anim_next
Next frame in an animation.
IndustryTileSpecialFlags special_flags
Bitmask of extra flags used by the tile.
GRFFileProps grf_prop
properties related to the grf file
Slope slopes_refused
slope pattern on which this tile cannot be built
AnimationInfo animation
Information about the animation (is it looping, how many loops etc)
std::array< std::variant< CargoLabel, MixedCargoType >, INDUSTRY_ORIGINAL_NUM_INPUTS > accepts_cargo_label
Cargo labels of accepted cargo for default industry tiles.
std::array< int8_t, INDUSTRY_NUM_INPUTS > acceptance
Level of acceptance per cargo type (signed, may be negative!)
bool enabled
entity still available (by default true).newgrf can disable it, though
bool anim_state
When true, the tile has to be drawn using the animation state instead of the construction state.
IndustryTileCallbackMasks callback_mask
Bitmask of industry tile callbacks that have to be called.
std::array< CargoType, INDUSTRY_NUM_INPUTS > accepts_cargo
Cargo accepted by this tile.
uint8_t anim_production
Animation frame to start when goods are produced.
A pair-construct of a TileIndexDiff.
Definition map_type.h:31