src/industry.h
branchNewGRF_ports
changeset 6719 4cc327ad39d5
parent 6633 b2ad8da77b7e
child 6720 35756db7e577
--- 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,