(svn r10675) -Codechange: unhardcode the industry types used in several locations of the source code.
authorrubidium
Tue, 24 Jul 2007 19:56:43 +0000
changeset 7319 9b20d1dbe5d6
parent 7318 632cd0497770
child 7320 96d5862ec06a
(svn r10675) -Codechange: unhardcode the industry types used in several locations of the source code.
src/industry.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/station_cmd.cpp
src/table/build_industry.h
--- a/src/industry.h	Tue Jul 24 17:01:23 2007 +0000
+++ b/src/industry.h	Tue Jul 24 19:56:43 2007 +0000
@@ -105,7 +105,7 @@
 	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. see IT_COAL_MINE and others
+	IndustryType type;                  ///< type of industry.
 	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
@@ -332,46 +332,6 @@
 extern const Industry **_industry_sort;
 extern bool _industry_sort_dirty;
 
-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,
-};
+static const uint8 IT_INVALID = 255;
 
 #endif /* INDUSTRY_H */
--- a/src/industry_cmd.cpp	Tue Jul 24 17:01:23 2007 +0000
+++ b/src/industry_cmd.cpp	Tue Jul 24 19:56:43 2007 +0000
@@ -1669,7 +1669,7 @@
 
 	/* Find the total amount of industries */
 	if (_opt.diff.number_industries > 0) {
-		for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) {
+		for (it = 0; it < NUM_INDUSTRYTYPES; it++) {
 
 			ind_spc = GetIndustrySpec(it);
 
@@ -1694,7 +1694,7 @@
 	SetGeneratingWorldProgress(GWP_INDUSTRY, i);
 
 	if (_opt.diff.number_industries > 0) {
-		for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) {
+		for (it = 0; it < NUM_INDUSTRYTYPES; it++) {
 			/* Once the number of industries has been determined, let's really create them.
 			 * The test for chance allows us to try create industries that are available only
 			 * for this landscape.
--- a/src/industry_gui.cpp	Tue Jul 24 17:01:23 2007 +0000
+++ b/src/industry_gui.cpp	Tue Jul 24 19:56:43 2007 +0000
@@ -114,7 +114,7 @@
 
 			/* We'll perform two distinct loops, one for secondary industries, and the other one for
 			 * primary ones. Each loop will fill the _fund_gui structure. */
-			for (ind = IT_COAL_MINE; ind < NUM_INDUSTRYTYPES; ind++) {
+			for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) {
 				indsp = GetIndustrySpec(ind);
 				if (indsp->enabled && (!indsp->IsRawIndustry() || _game_mode == GM_EDITOR)) {
 					_fund_gui.index[_fund_gui.count] = ind;
@@ -124,7 +124,7 @@
 			}
 
 			if (_patches.raw_industry_construction != 0 && _game_mode != GM_EDITOR) {
-				for (ind = IT_COAL_MINE; ind < NUM_INDUSTRYTYPES; ind++) {
+				for (ind = 0; ind < NUM_INDUSTRYTYPES; ind++) {
 					indsp = GetIndustrySpec(ind);
 					if (indsp->enabled && indsp->IsRawIndustry()) {
 						_fund_gui.index[_fund_gui.count] = ind;
--- a/src/station_cmd.cpp	Tue Jul 24 17:01:23 2007 +0000
+++ b/src/station_cmd.cpp	Tue Jul 24 19:56:43 2007 +0000
@@ -137,6 +137,12 @@
 	return (closest_station == INVALID_STATION) ? NULL : GetStation(closest_station);
 }
 
+/**
+ * Function to check whether the given tile matches some criterion.
+ * @param tile the tile to check
+ * @return true if it matches, false otherwise
+ */
+typedef bool (*CMSAMatcher)(TileIndex tile);
 
 /**
  * Counts the numbers of tiles matching a specific type in the area around
@@ -146,39 +152,85 @@
  *                 in all other cases this parameter is ignored
  * @return the result the noumber of matching tiles around
  */
-static int CountMapSquareAround(TileIndex tile, TileType type, IndustryType industry)
+static int CountMapSquareAround(TileIndex tile, CMSAMatcher cmp)
 {
 	int num = 0;
 
 	for (int dx = -3; dx <= 3; dx++) {
 		for (int dy = -3; dy <= 3; dy++) {
-			TileIndex cur_tile = TILE_MASK(tile + TileDiffXY(dx, dy));
-
-			if (IsTileType(cur_tile, type)) {
-				switch (type) {
-					case MP_INDUSTRY:
-						if (GetIndustryType(cur_tile) == industry)
-							num++;
-						break;
-
-					case MP_WATER:
-						if (!IsWater(cur_tile))
-							break;
-						/* FALL THROUGH WHEN WATER TILE */
-					case MP_TREES:
-						num++;
-						break;
-
-					default:
-						break;
-				}
-			}
+			if (cmp(TILE_MASK(tile + TileDiffXY(dx, dy)))) num++;
 		}
 	}
 
 	return num;
 }
 
+/**
+ * Check whether the tile is a mine.
+ * @param tile the tile to investigate.
+ * @return true if and only if the tile is a mine
+ */
+static bool CMSAMine(TileIndex tile)
+{
+	/* No industry */
+	if (!IsTileType(tile, MP_INDUSTRY)) return false;
+
+	const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+
+	/* No extractive industry */
+	if ((indsp->life_type & INDUSTRYLIFE_EXTRACTIVE) == 0) return false;
+
+	for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+		/* The industry extracts something non-liquid, i.e. no oil or plastic, so it is a mine */
+		if (indsp->produced_cargo[i] != CT_INVALID && (GetCargo(indsp->produced_cargo[i])->classes & CC_LIQUID) == 0) return true;
+	}
+
+	return false;
+}
+
+/**
+ * Check whether the tile is water.
+ * @param tile the tile to investigate.
+ * @return true if and only if the tile is a mine
+ */
+static bool CMSAWater(TileIndex tile)
+{
+	return IsTileType(tile, MP_WATER) && IsWater(tile);
+}
+
+/**
+ * Check whether the tile is a tree.
+ * @param tile the tile to investigate.
+ * @return true if and only if the tile is a mine
+ */
+static bool CMSATree(TileIndex tile)
+{
+	return IsTileType(tile, MP_TREES);
+}
+
+/**
+ * Check whether the tile is a forest.
+ * @param tile the tile to investigate.
+ * @return true if and only if the tile is a mine
+ */
+static bool CMSAForest(TileIndex tile)
+{
+	/* No industry */
+	if (!IsTileType(tile, MP_INDUSTRY)) return false;
+
+	const IndustrySpec *indsp = GetIndustrySpec(GetIndustryByTile(tile)->type);
+
+	/* No extractive industry */
+	if ((indsp->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
+
+	for (uint i = 0; i < lengthof(indsp->produced_cargo); i++) {
+		/* The industry produces wood. */
+		if (indsp->produced_cargo[i] != CT_INVALID && GetCargo(indsp->produced_cargo[i])->label == 'WOOD') return true;
+	}
+
+	return false;
+}
+
 #define M(x) ((x) - STR_SV_STNAME)
 
 static bool GenerateStationName(Station *st, TileIndex tile, int flag)
@@ -221,11 +273,7 @@
 
 	/* check mine? */
 	if (HASBIT(free_names, M(STR_SV_STNAME_MINES))) {
-		if (CountMapSquareAround(tile, MP_INDUSTRY, IT_COAL_MINE) >= 2 ||
-				CountMapSquareAround(tile, MP_INDUSTRY, IT_IRON_MINE) >= 2 ||
-				CountMapSquareAround(tile, MP_INDUSTRY, IT_COPPER_MINE) >= 2 ||
-				CountMapSquareAround(tile, MP_INDUSTRY, IT_GOLD_MINE) >= 2 ||
-				CountMapSquareAround(tile, MP_INDUSTRY, IT_DIAMOND_MINE) >= 2) {
+		if (CountMapSquareAround(tile, CMSAMine) >= 2) {
 			found = M(STR_SV_STNAME_MINES);
 			goto done;
 		}
@@ -243,15 +291,15 @@
 	/* Check lakeside */
 	if (HASBIT(free_names, M(STR_SV_STNAME_LAKESIDE)) &&
 			DistanceFromEdge(tile) < 20 &&
-			CountMapSquareAround(tile, MP_WATER, 0) >= 5) {
+			CountMapSquareAround(tile, CMSAWater) >= 5) {
 		found = M(STR_SV_STNAME_LAKESIDE);
 		goto done;
 	}
 
 	/* Check woods */
 	if (HASBIT(free_names, M(STR_SV_STNAME_WOODS)) && (
-				CountMapSquareAround(tile, MP_TREES, 0) >= 8 ||
-				CountMapSquareAround(tile, MP_INDUSTRY, IT_FOREST) >= 2)
+				CountMapSquareAround(tile, CMSATree) >= 8 ||
+				CountMapSquareAround(tile, CMSAForest) >= 2)
 			) {
 		found = _opt.landscape == LT_TROPIC ?
 			M(STR_SV_STNAME_FOREST) : M(STR_SV_STNAME_WOODS);
--- a/src/table/build_industry.h	Tue Jul 24 17:01:23 2007 +0000
+++ b/src/table/build_industry.h	Tue Jul 24 19:56:43 2007 +0000
@@ -1091,6 +1091,47 @@
 /** Array with... hem... a sound of toyland */
 static const uint8 _plastic_mine_sounds[] = { SND_33_PLASTIC_MINE };
 
+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,
+};
+
 /**
  * Writes the properties of an industry into the IndustrySpec struct.
  * @param tbl  tile table