Files
@ r12768:980ae0491352
Branch filter:
Location: cpp/openttd-patchpack/source/src/industry.h - annotation
r12768:980ae0491352
15.5 KiB
text/x-c
(svn r17248) -Fix: add GPL license notice where appropriate
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 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 | r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r9111:983de9c5a848 r6201:2e76eb9a1d7a r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r11969:3526c3cc75dc r8119:8fdb3a371896 r7610:6031d09c03ef r8119:8fdb3a371896 r8119:8fdb3a371896 r8139:4fc34c1bc2fb r8138:f851b4cbdad1 r8140:9424f012f6a2 r8213:466402e95092 r8213:466402e95092 r9126:35955a7b9d9e r12467:b4ba97896a21 r12467:b4ba97896a21 r12467:b4ba97896a21 r12648:24c912bd53f6 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6743:3ed518db5852 r6743:3ed518db5852 r7654:46e53d046d6c r6743:3ed518db5852 r6743:3ed518db5852 r6743:3ed518db5852 r7654:46e53d046d6c r6743:3ed518db5852 r7291:131e3ddd5976 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6765:b24c23276278 r6765:b24c23276278 r6765:b24c23276278 r6765:b24c23276278 r6765:b24c23276278 r6248:b940b09d7ab8 r7144:19d3ab9f911f r7144:19d3ab9f911f r7144:19d3ab9f911f r7144:19d3ab9f911f r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r6440:b575dcd83d43 r6440:b575dcd83d43 r6440:b575dcd83d43 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r7173:36413bf11c62 r6440:b575dcd83d43 r6440:b575dcd83d43 r6440:b575dcd83d43 r7259:3304f8ac5a07 r7186:dea62b7d11ec r7259:3304f8ac5a07 r7259:3304f8ac5a07 r7259:3304f8ac5a07 r7259:3304f8ac5a07 r7259:3304f8ac5a07 r7259:3304f8ac5a07 r7757:6e81b6bf528c r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r9950:ca6054744c76 r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r7132:6f6500f4b39b r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r7614:4da580d88972 r7614:4da580d88972 r7614:4da580d88972 r7614:4da580d88972 r7608:77bc663268b5 r6390:c8b3b64c49ff r6390:c8b3b64c49ff r6390:c8b3b64c49ff r7757:6e81b6bf528c r6390:c8b3b64c49ff r11967:df0600d2c7e7 r11967:df0600d2c7e7 r7390:444ff4a56f72 r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r11967:df0600d2c7e7 r7610:6031d09c03ef r7610:6031d09c03ef r6819:52478124ff4e r6201:2e76eb9a1d7a r5475:3f5cd13d1b63 r6819:52478124ff4e r7645:e35d73ba358a r7165:b30ba7925dc4 r7165:b30ba7925dc4 r6819:52478124ff4e r6819:52478124ff4e r7645:e35d73ba358a r6819:52478124ff4e r6819:52478124ff4e r6819:52478124ff4e r6819:52478124ff4e r6819:52478124ff4e r6819:52478124ff4e r5475:3f5cd13d1b63 r7319:94412b8dacf8 r6819:52478124ff4e r11085:c87a330fb4c2 r6819:52478124ff4e r6819:52478124ff4e r5475:3f5cd13d1b63 r12648:24c912bd53f6 r12648:24c912bd53f6 r7186:dea62b7d11ec r7186:dea62b7d11ec r7186:dea62b7d11ec r7186:dea62b7d11ec r7445:0ebcc38f1de8 r7390:444ff4a56f72 r7860:c73688ce46ca r7860:c73688ce46ca r7860:c73688ce46ca r7610:6031d09c03ef r7610:6031d09c03ef r10550:fdff38307dad r7390:444ff4a56f72 r12242:f11b2e8973ab r12242:f11b2e8973ab r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r6675:3908dbc4686b r6675:3908dbc4686b r7460:e72488e534d9 r6675:3908dbc4686b r6675:3908dbc4686b r6848:e955ef83f2d3 r7107:54b249bce81c r6675:3908dbc4686b r6675:3908dbc4686b r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6248:b940b09d7ab8 r11371:4a7632225c6c r6201:2e76eb9a1d7a r7978:09f55e31ab2f r7978:09f55e31ab2f r12298:7868ae2e681e r7177:ef46b1aa1c6d r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6635:23f411510030 r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r7757:6e81b6bf528c r6440:b575dcd83d43 r8959:484dbfc31293 r8959:484dbfc31293 r8959:484dbfc31293 r8959:484dbfc31293 r8959:484dbfc31293 r8959:484dbfc31293 r6414:f6f0d66feb78 r6414:f6f0d66feb78 r6655:266e61c99a46 r6655:266e61c99a46 r6675:3908dbc4686b r6440:b575dcd83d43 r6765:b24c23276278 r6741:77c291a52fd3 r6675:3908dbc4686b r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7185:239823a9a847 r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r7978:09f55e31ab2f r6248:b940b09d7ab8 r5475:3f5cd13d1b63 r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6201:2e76eb9a1d7a r6248:b940b09d7ab8 r6201:2e76eb9a1d7a r6736:dedac489a3f9 r6201:2e76eb9a1d7a r6305:145c78f94177 r6305:145c78f94177 r6305:145c78f94177 r6637:08ab9ae07700 r6675:3908dbc4686b r6743:3ed518db5852 r7229:58b7db9e5145 r7229:58b7db9e5145 r7229:58b7db9e5145 r7229:58b7db9e5145 r6741:77c291a52fd3 r6675:3908dbc4686b r6248:b940b09d7ab8 r6092:e08485d6ba23 r6637:08ab9ae07700 r6743:3ed518db5852 r7462:2db74bba0fe1 r6637:08ab9ae07700 r6637:08ab9ae07700 r5475:3f5cd13d1b63 r10491:e3e4bb1ebaea r10491:e3e4bb1ebaea r6743:3ed518db5852 r6743:3ed518db5852 r6743:3ed518db5852 r6743:3ed518db5852 r7467:aa26cb62f693 r7467:aa26cb62f693 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7473:b9020aa56336 r7467:aa26cb62f693 r7467:aa26cb62f693 r6533:e4ba06da0f4c r6533:e4ba06da0f4c r10146:7fb6cf730d46 r10146:7fb6cf730d46 r6533:e4ba06da0f4c r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6824:57c303504bb1 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r6839:3df64b5ddb52 r11966:921bea0ca112 r11966:921bea0ca112 r5475:3f5cd13d1b63 r7319:94412b8dacf8 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 | /* $Id$ */
/*
* 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 industry.h Base of all industries. */
#ifndef INDUSTRY_H
#define INDUSTRY_H
#include "core/pool_type.hpp"
#include "core/random_func.hpp"
#include "newgrf_storage.h"
#include "cargo_type.h"
#include "economy_type.h"
#include "map_type.h"
#include "slope_type.h"
#include "date_type.h"
#include "town_type.h"
#include "industry_type.h"
#include "landscape_type.h"
#include "tile_type.h"
#include "company_type.h"
#include "strings_type.h"
#include "subsidy_type.h"
enum {
INVALID_INDUSTRY = 0xFFFF,
NEW_INDUSTRYOFFSET = 37, ///< original number of industries
NUM_INDUSTRYTYPES = 64, ///< total number of industries, new and old
INDUSTRYTILE_NOANIM = 0xFF, ///< flag to mark industry tiles as having no animation
NEW_INDUSTRYTILEOFFSET = 175, ///< original number of tiles
INVALID_INDUSTRYTYPE = NUM_INDUSTRYTYPES, ///< one above amount is considered invalid
NUM_INDUSTRYTILES = 512, ///< total number of industry tiles, new and old
INVALID_INDUSTRYTILE = NUM_INDUSTRYTILES, ///< one above amount is considered invalid
INDUSTRY_COMPLETED = 3, ///< final stage of industry construction.
};
enum {
CLEAN_RANDOMSOUNDS, ///< Free the dynamically allocated sounds table
CLEAN_TILELSAYOUT, ///< Free the dynamically allocated tile layout structure
};
enum IndustryLifeType {
INDUSTRYLIFE_BLACK_HOLE = 0, ///< Like power plants and banks
INDUSTRYLIFE_EXTRACTIVE = 1 << 0, ///< Like mines
INDUSTRYLIFE_ORGANIC = 1 << 1, ///< Like forests
INDUSTRYLIFE_PROCESSING = 1 << 2, ///< Like factories
};
/* Procedures that can be run to check whether an industry may
* build at location the given to the procedure */
enum CheckProc {
CHECK_NOTHING,
CHECK_FOREST,
CHECK_REFINERY,
CHECK_FARM,
CHECK_PLANTATION,
CHECK_WATER,
CHECK_LUMBERMILL,
CHECK_BUBBLEGEN,
CHECK_OIL_RIG,
CHECK_END,
};
/** How was the industry created */
enum IndustryConstructionType {
ICT_UNKNOWN, ///< in previous game version or without newindustries activated
ICT_NORMAL_GAMEPLAY, ///< either by user or random creation proccess
ICT_MAP_GENERATION, ///< during random map creation
ICT_SCENARIO_EDITOR ///< while scenarion edition
};
enum IndustryBehaviour {
INDUSTRYBEH_NONE = 0,
INDUSTRYBEH_PLANT_FIELDS = 1 << 0, ///< periodically plants fileds around itself (temp and artic farms)
INDUSTRYBEH_CUT_TREES = 1 << 1, ///< cuts trees and produce first output cargo from them (lumber mill)
INDUSTRYBEH_BUILT_ONWATER = 1 << 2, ///< is built on water (oil rig)
INDUSTRYBEH_TOWN1200_MORE = 1 << 3, ///< can only be built in towns larger than 1200 inhabitants (temperate bank)
INDUSTRYBEH_ONLY_INTOWN = 1 << 4, ///< can only be built in towns (arctic/tropic banks, water tower)
INDUSTRYBEH_ONLY_NEARTOWN = 1 << 5, ///< is always built near towns (toy shop)
INDUSTRYBEH_PLANT_ON_BUILT = 1 << 6, ///< Fields are planted around when built (all farms)
INDUSTRYBEH_DONT_INCR_PROD = 1 << 7, ///< do not increase production (oil wells) in the temperate climate
INDUSTRYBEH_BEFORE_1950 = 1 << 8, ///< can only be built before 1950 (oil wells)
INDUSTRYBEH_AFTER_1960 = 1 << 9, ///< can only be built after 1960 (oil rigs)
INDUSTRYBEH_AI_AIRSHIP_ROUTES = 1 << 10, ///< ai will attempt to establish air/ship routes to this industry (oil rig)
INDUSTRYBEH_AIRPLANE_ATTACKS = 1 << 11, ///< can be exploded by a military airplane (oil refinery)
INDUSTRYBEH_CHOPPER_ATTACKS = 1 << 12, ///< can be exploded by a military helicopter (factory)
INDUSTRYBEH_CAN_SUBSIDENCE = 1 << 13, ///< can cause a subsidence (coal mine, shaft that collapses)
/* The following flags are only used for newindustries and do no represent any normal behaviour */
INDUSTRYBEH_PROD_MULTI_HNDLING = 1 << 14, ///< Automatic production multiplier handling
INDUSTRYBEH_PRODCALLBACK_RANDOM = 1 << 15, ///< Production callback needs random bits in var 10
INDUSTRYBEH_NOBUILT_MAPCREATION = 1 << 16, ///< Do not force one instance of this type to appear on map generation
INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type
};
DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour);
typedef Pool<Industry, IndustryID, 64, 64000> IndustryPool;
extern IndustryPool _industry_pool;
/**
* Defines the internal data of a functionnal industry
*/
struct Industry : IndustryPool::PoolItem<&_industry_pool> {
typedef PersistentStorageArray<uint32, 16> PersistentStorage;
TileIndex xy; ///< coordinates of the primary tile the industry is built one
byte width;
byte height;
const Town *town; ///< Nearest town
CargoID produced_cargo[2]; ///< 2 production cargo slots
uint16 produced_cargo_waiting[2]; ///< amount of cargo produced per cargo
uint16 incoming_cargo_waiting[3]; ///< incoming cargo waiting to be processed
byte production_rate[2]; ///< production rate for each cargo
byte prod_level; ///< general production level
CargoID accepts_cargo[3]; ///< 3 input cargo slots
uint16 this_month_production[2]; ///< stats of this month's production per cargo
uint16 this_month_transported[2]; ///< stats of this month's transport per cargo
byte last_month_pct_transported[2]; ///< percentage transported per cargo in the last full month
uint16 last_month_production[2]; ///< total units produced per cargo in the last full month
uint16 last_month_transported[2]; ///< total units transported per cargo in the last full month
uint16 counter; ///< used for animation and/or production (if available cargo)
IndustryType type; ///< type of industry.
OwnerByte owner; ///< owner of the industry. Which SHOULD always be (imho) OWNER_NONE
byte random_colour; ///< randomized colour of the industry, for display purpose
Year last_prod_year; ///< last year of production
byte was_cargo_delivered; ///< flag that indicate this has been the closest industry chosen for cargo delivery by a station. see DeliverGoodsToIndustry
PartOfSubsidyByte part_of_subsidy; ///< NOSAVE: is this industry a source/destination of a subsidy?
OwnerByte founder; ///< Founder of the industry
Date construction_date; ///< Date of the construction of the industry
uint8 construction_type; ///< Way the industry was constructed (@see IndustryConstructionType)
Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry
byte selected_layout; ///< Which tile layout was used when creating the industry
byte random_triggers; ///< Triggers for the random
uint16 random; ///< Random value used for randomisation of all kinds of things
PersistentStorage psa; ///< Persistent storage for NewGRF industries.
Industry(TileIndex tile = INVALID_TILE) : xy(tile) {}
~Industry();
static Industry *GetRandom();
};
struct IndustryTileTable {
TileIndexDiffC ti;
IndustryGfx gfx;
};
/** Data related to the handling of grf files. Common to both industry and industry tile */
struct GRFFileProps {
uint16 subst_id;
uint16 local_id; ///< id defined by the grf file for this industry
struct SpriteGroup *spritegroup; ///< pointer to the different sprites of the industry
const struct GRFFile *grffile; ///< grf file that introduced this industry
uint16 override; ///< id of the entity been replaced by
};
/**
* Defines the data structure for constructing industry.
*/
struct IndustrySpec {
const IndustryTileTable * const *table;///< List of the tiles composing the industry
byte num_table; ///< Number of elements in the table
uint8 cost_multiplier; ///< Base construction cost multiplier.
uint32 removal_cost_multiplier; ///< Base removal cost multiplier.
uint16 raw_industry_cost_multiplier; ///< Base construction cost multiplier when building raw industries like secondary. (not modifiable by NewGRFs)
uint32 prospecting_chance; ///< Chance prospecting succeeds
IndustryType conflicting[3]; ///< Industries this industry cannot be close to
byte check_proc; ///< Index to a procedure to check for conflicting circumstances
CargoID produced_cargo[2];
byte production_rate[2];
byte minimal_cargo; ///< minimum amount of cargo transported to the stations
///< If the waiting cargo is less than this number, no cargo is moved to it
CargoID accepts_cargo[3]; ///< 3 accepted cargos
uint16 input_cargo_multiplier[3][2]; ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargos)
IndustryLifeType life_type; ///< This is also known as Industry production flag, in newgrf specs
byte climate_availability; ///< Bitmask, giving landscape enums as bit position
IndustryBehaviour behaviour; ///< How this industry will behave, and how others entities can use it
byte map_colour; ///< colour used for the small map
StringID name; ///< Displayed name of the industry
StringID new_industry_text; ///< Message appearing when the industry is built
StringID closure_text; ///< Message appearing when the industry closes
StringID production_up_text; ///< Message appearing when the industry's production is increasing
StringID production_down_text; ///< Message appearing when the industry's production is decreasing
StringID station_name; ///< Default name for nearby station
byte appear_ingame[NUM_LANDSCAPE]; ///< Probability of appearance in game
byte appear_creation[NUM_LANDSCAPE]; ///< Probability of appearance during map creation
uint8 number_of_sounds; ///< Number of sounds available in the sounds array
const uint8 *random_sounds; ///< array of random sounds.
/* Newgrf data */
uint16 callback_flags; ///< Flags telling which grf callback is set
uint8 cleanup_flag; ///< flags indicating which data should be freed upon cleaning up
bool enabled; ///< entity still avaible (by default true).newgrf can disable it, though
struct GRFFileProps grf_prop; ///< properties related the the grf file
/**
* Is an industry with the spec a raw industry?
* @return true if it should be handled as a raw industry
*/
bool IsRawIndustry() const;
/**
* Get the cost for constructing this industry
* @return the cost (inflation corrected etc)
*/
Money GetConstructionCost() const;
/**
* Get the cost for removing this industry
* Take note that the cost will always be zero for non-grf industries.
* Only if the grf author did specified a cost will it be applicable.
* @return the cost (inflation corrected etc)
*/
Money GetRemovalCost() const;
};
/**
* Defines the data structure of each indivudual tile of an industry.
*/
struct IndustryTileSpec {
CargoID accepts_cargo[3]; ///< Cargo accepted by this tile
uint8 acceptance[3]; ///< Level of aceptance per cargo type
Slope slopes_refused; ///< slope pattern on which this tile cannot be built
byte anim_production; ///< Animation frame to start when goods are produced
byte anim_next; ///< Next frame in an animation
bool anim_state; ///< When true, the tile has to be drawn using the animation
///< state instead of the construction state
/* Newgrf data */
uint8 callback_flags; ///< Flags telling which grf callback is set
uint16 animation_info; ///< Information about the animation (is it looping, how many loops etc)
uint8 animation_speed; ///< The speed of the animation
uint8 animation_triggers; ///< When to start the animation
uint8 animation_special_flags; ///< Extra flags to influence the animation
bool enabled; ///< entity still avaible (by default true).newgrf can disable it, though
struct GRFFileProps grf_prop;
};
/* industry_cmd.cpp*/
const IndustrySpec *GetIndustrySpec(IndustryType thistype); ///< Array of industries data
const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx); ///< Array of industry tiles data
void ResetIndustries();
void PlantRandomFarmField(const Industry *i);
void ReleaseDisastersTargetingIndustry(IndustryID);
/* writable arrays of specs */
extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
static inline IndustryGfx GetTranslatedIndustryTileID(IndustryGfx gfx)
{
/* the 0xFF should be GFX_WATERTILE_SPECIALCHECK but for reasons of include mess,
* we'll simplify the writing.
* Basically, the first test is required since the GFX_WATERTILE_SPECIALCHECK value
* will never be assigned as a tile index and is only required in order to do some
* tests while building the industry (as in WATER REQUIRED */
if (gfx != 0xFF) {
assert(gfx < INVALID_INDUSTRYTILE);
const IndustryTileSpec *it = &_industry_tile_specs[gfx];
return it->grf_prop.override == INVALID_INDUSTRYTILE ? gfx : it->grf_prop.override;
} else {
return gfx;
}
}
/* smallmap_gui.cpp */
void BuildIndustriesLegend();
/* industry_cmd.cpp */
void SetIndustryDailyChanges();
extern uint16 _industry_counts[NUM_INDUSTRYTYPES]; // Number of industries per type ingame
/** Increment the count of industries for this type
* @param type IndustryType to increment
* @pre type < INVALID_INDUSTRYTYPE */
static inline void IncIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
_industry_counts[type]++;
}
/** Decrement the count of industries for this type
* @param type IndustryType to decrement
* @pre type < INVALID_INDUSTRYTYPE */
static inline void DecIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
_industry_counts[type]--;
}
/** get the count of industries for this type
* @param type IndustryType to query
* @pre type < INVALID_INDUSTRYTYPE */
static inline uint8 GetIndustryTypeCount(IndustryType type)
{
assert(type < INVALID_INDUSTRYTYPE);
return min(_industry_counts[type], 0xFF); // callback expects only a byte, so cut it
}
/** Resets both the total_industries and the _industry_counts
* This way, we centralize all counts activities */
static inline void ResetIndustryCounts()
{
memset(&_industry_counts, 0, sizeof(_industry_counts));
}
#define FOR_ALL_INDUSTRIES_FROM(var, start) FOR_ALL_ITEMS_FROM(Industry, industry_index, var, start)
#define FOR_ALL_INDUSTRIES(var) FOR_ALL_INDUSTRIES_FROM(var, 0)
static const uint8 IT_INVALID = 255;
#endif /* INDUSTRY_H */
|