--- a/src/industry.h Tue Mar 27 23:27:27 2007 +0000
+++ b/src/industry.h Sat Jun 02 19:59:29 2007 +0000
@@ -6,13 +6,25 @@
#define INDUSTRY_H
#include "oldpool.h"
+#include "helpers.hpp"
typedef byte IndustryGfx;
typedef uint8 IndustryType;
enum {
- INVALID_INDUSTRY = 0xFFFF,
- INDUTILE_NOANIM = 0xFF, ///< flag to mark industry tiles as having no animation
+ INVALID_INDUSTRY = 0xFFFF,
+ NEW_INDUSTRYOFFSET = 37, ///< original number of industries
+ NUM_INDUSTRYTYPES = 37, ///< 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 = NEW_INDUSTRYTILEOFFSET, ///< total number of industry tiles, new and old
+ INVALID_INDUSTRYTILE = NUM_INDUSTRYTILES, ///< one above amount is considered invalid
+};
+
+enum {
+ CLEAN_RANDOMSOUNDS, ///< Free the dynamically allocated sounds table
+ CLEAN_TILELSAYOUT, ///< Free the dynamically allocated tile layout structure
};
enum IndustryLifeType {
@@ -21,6 +33,42 @@
INDUSTRYLIFE_CLOSABLE, ///< Industry can only close (no production change)
};
+/* Procedures that can be run to check whether an industry may
+ * build at location the given to the procedure */
+enum CheckProc {
+ CHECK_NOTHING = 0,
+ CHECK_FOREST = 1,
+ CHECK_REFINERY = 2,
+ CHECK_FARM = 3,
+ CHECK_PLANTATION = 4,
+ CHECK_WATER = 5,
+ CHECK_LUMBERMILL = 6,
+ CHECK_BUBBLEGEN = 7,
+ CHECK_OIL_RIG = 8,
+ CHECK_END,
+};
+
+enum IndustyBehaviour {
+ 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 then 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)
+ 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)
+};
+
+
+DECLARE_ENUM_AS_BIT_SET(IndustyBehaviour);
+
/**
* Defines the internal data of a functionnal industry
*/
@@ -29,10 +77,8 @@
byte width;
byte height;
const Town* town; ///< Nearest town
- CargoID produced_cargo[2]; ///< 2 production cargo slots
uint16 cargo_waiting[2]; ///< amount of cargo produced per cargo
byte production_rate[2]; ///< production rate for each cargo
- CargoID accepts_cargo[3]; ///< 3 input cargo slots
byte prod_level; ///< general production level
uint16 last_mo_production[2]; ///< stats of last month production per cargo
uint16 last_mo_transported[2]; ///< stats of last month transport per cargo
@@ -41,7 +87,7 @@
uint16 total_transported[2]; ///< total units transported per cargo
uint16 counter; ///< used for animation and/or production (if available cargo)
- byte type; ///< type of industry. see IT_COAL_MINE and others
+ IndustryType type; ///< type of industry. see IT_COAL_MINE and others
OwnerByte owner; ///< owner of the industry. Which SHOULD always be (imho) OWNER_NONE
byte random_color; ///< randomized colour of the industry, for display purpose
Year last_prod_year; ///< last year of production
@@ -55,13 +101,22 @@
IndustryGfx gfx;
};
+/** Data related to the handling of grf files. Common to both industry and industry tile */
+struct GRFFileProps {
+ uint8 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 house
+ uint8 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
- byte cost_multiplier; ///< Base cost multiplier*/
+ byte cost_multiplier; ///< Base cost multiplier. Watch out for this one, << 5 VS << 8
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];
@@ -69,13 +124,25 @@
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
+ IndustyBehaviour 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
+ 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
};
/**
@@ -83,15 +150,30 @@
*/
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
+ ///< state instead of the construction state
+ /* Newgrf data */
+ uint8 callback_flags; ///< Flags telling which grf callback is set
+ bool enabled; ///< entity still avaible (by default true).newgrf can disable it, though
+ struct GRFFileProps grf_prop;
};
-const IndustrySpec *GetIndustrySpec(IndustryType thistype); ///< Array of industries default data
-const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx); ///< Array of industry tiles default data
+/* 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);
+
+/* writable arrays of specs */
+extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
+extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
+
+/* smallmap_gui.cpp */
+void BuildIndustriesLegend();
DECLARE_OLD_POOL(Industry, Industry, 3, 8000)
@@ -170,10 +252,6 @@
VARDEF const Industry** _industry_sort;
VARDEF bool _industry_sort_dirty;
-
-void DeleteIndustry(Industry *is);
-void PlantRandomFarmField(const Industry *i);
-
enum {
IT_COAL_MINE = 0,
IT_POWER_STATION = 1,