src/industry.h
branchcustombridgeheads
changeset 5643 3778051e8095
parent 5299 5d613241ee5e
child 5650 aefc131bf5ce
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/industry.h	Wed Jan 03 08:49:36 2007 +0000
@@ -0,0 +1,199 @@
+/* $Id$ */
+
+#ifndef INDUSTRY_H
+#define INDUSTRY_H
+
+#include "oldpool.h"
+
+typedef byte IndustryGfx;
+typedef uint8 IndustryType;
+
+enum {
+	INVALID_INDUSTRY = 0xFFFF,
+};
+
+typedef enum IndustryLifeTypes {
+	INDUSTRYLIFE_NOT_CLOSABLE,     ///< Industry can never close
+	INDUSTRYLIFE_PRODUCTION,       ///< Industry can close and change of production
+	INDUSTRYLIFE_CLOSABLE,         ///< Industry can only close (no production change)
+} IndustryLifeType;
+
+struct Industry {
+	TileIndex xy;
+	byte width; /* swapped order of w/h with town */
+	byte height;
+	const Town* town;
+	CargoID produced_cargo[2];
+	uint16 cargo_waiting[2];
+	byte production_rate[2];
+	CargoID accepts_cargo[3];
+	byte prod_level;
+	uint16 last_mo_production[2];
+	uint16 last_mo_transported[2];
+	byte pct_transported[2];
+	uint16 total_production[2];
+	uint16 total_transported[2];
+	uint16 counter;
+
+	byte type;
+	byte owner;
+	byte random_color;
+	Year last_prod_year;
+	byte was_cargo_delivered;
+
+	IndustryID index;
+};
+
+typedef struct IndustryTileTable {
+	TileIndexDiffC ti;
+	IndustryGfx gfx;
+} IndustryTileTable;
+
+typedef struct IndustrySpec {
+	/** Tables with the 'layout' of different composition of GFXes */
+	const IndustryTileTable *const *table;
+	/** Number of elements in the table */
+	byte num_table;
+	/** Base cost multiplier*/
+	byte cost_multiplier;
+	/** Industries this industry cannot be close to */
+	IndustryType conflicting[3];
+	/** index to a procedure to check for conflicting circumstances */
+	byte check_proc;
+
+	CargoID produced_cargo[2];
+	byte production_rate[2];
+	/** The minimum amount of cargo transported to the stations; if the
+	 * waiting cargo is less than this number, no cargo is moved to it*/
+	byte minimal_cargo;
+	CargoID accepts_cargo[3];
+
+	IndustryLifeType life_type;  ///< This is also known as Industry production flag, in newgrf specs
+
+	byte climate_availability;  ///< Bitmask, giving landscape enums as bit position
+
+	StringID name;
+	StringID closure_text;
+	StringID production_up_text;
+	StringID production_down_text;
+} IndustrySpec;
+
+const IndustrySpec *GetIndustrySpec(IndustryType thistype);
+
+DECLARE_OLD_POOL(Industry, Industry, 3, 8000)
+
+/**
+ * Check if an Industry really exists.
+ */
+static inline bool IsValidIndustry(const Industry *industry)
+{
+	return industry->xy != 0;
+}
+
+static inline bool IsValidIndustryID(IndustryID index)
+{
+	return index < GetIndustryPoolSize() && IsValidIndustry(GetIndustry(index));
+}
+
+VARDEF int _total_industries;
+
+static inline IndustryID GetMaxIndustryIndex(void)
+{
+	/* TODO - This isn't the real content of the function, but
+	 *  with the new pool-system this will be replaced with one that
+	 *  _really_ returns the highest index. Now it just returns
+	 *  the next safe value we are sure about everything is below.
+	 */
+	return GetIndustryPoolSize() - 1;
+}
+
+static inline uint GetNumIndustries(void)
+{
+	return _total_industries;
+}
+
+/**
+ * Return a random valid industry.
+ */
+static inline Industry *GetRandomIndustry(void)
+{
+	int num = RandomRange(GetNumIndustries());
+	IndustryID index = INVALID_INDUSTRY;
+
+	if (GetNumIndustries() == 0) return NULL;
+
+	while (num >= 0) {
+		num--;
+		index++;
+
+		/* Make sure we have a valid industry */
+		while (!IsValidIndustryID(index)) {
+			index++;
+			assert(index <= GetMaxIndustryIndex());
+		}
+	}
+
+	return GetIndustry(index);
+}
+
+void DestroyIndustry(Industry *i);
+
+static inline void DeleteIndustry(Industry *i)
+{
+	DestroyIndustry(i);
+	i->xy = 0;
+}
+
+#define FOR_ALL_INDUSTRIES_FROM(i, start) for (i = GetIndustry(start); i != NULL; i = (i->index + 1U < GetIndustryPoolSize()) ? GetIndustry(i->index + 1U) : NULL) if (IsValidIndustry(i))
+#define FOR_ALL_INDUSTRIES(i) FOR_ALL_INDUSTRIES_FROM(i, 0)
+
+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,
+	IT_SAWMILL             =   2,
+	IT_FOREST              =   3,
+	IT_OIL_REFINERY        =   4,
+	IT_OIL_RIG             =   5,
+	IT_FACTORY             =   6,
+	IT_PRINTING_WORKS      =   7,
+	IT_STEEL_MILL          =   8,
+	IT_FARM                =   9,
+	IT_COPPER_MINE         =  10,
+	IT_OIL_WELL            =  11,
+	IT_BANK_TEMP           =  12,
+	IT_FOOD_PROCESS        =  13,
+	IT_PAPER_MILL          =  14,
+	IT_GOLD_MINE           =  15,
+	IT_BANK_TROPIC_ARCTIC  =  16,
+	IT_DIAMOND_MINE        =  17,
+	IT_IRON_MINE           =  18,
+	IT_FRUIT_PLANTATION    =  19,
+	IT_RUBBER_PLANTATION   =  20,
+	IT_WATER_SUPPLY        =  21,
+	IT_WATER_TOWER         =  22,
+	IT_FACTORY_2           =  23,
+	IT_FARM_2              =  24,
+	IT_LUMBER_MILL         =  25,
+	IT_COTTON_CANDY        =  26,
+	IT_CANDY_FACTORY       =  27,
+	IT_BATTERY_FARM        =  28,
+	IT_COLA_WELLS          =  29,
+	IT_TOY_SHOP            =  30,
+	IT_TOY_FACTORY         =  31,
+	IT_PLASTIC_FOUNTAINS   =  32,
+	IT_FIZZY_DRINK_FACTORY =  33,
+	IT_BUBBLE_GENERATOR    =  34,
+	IT_TOFFEE_QUARRY       =  35,
+	IT_SUGAR_MINE          =  36,
+	IT_END,
+	IT_INVALID             = 255,
+};
+
+#endif /* INDUSTRY_H */