(svn r11137) -Feature: [NewGRF] Add support for bit 17 of property 1A for Industries. This bit enables the protection of the last instance of an industry type once raise.
authorbelugas
Sat, 22 Sep 2007 00:59:27 +0000
changeset 7608 7c091bba8741
parent 7607 c7df969919b3
child 7609 b70ffc13652a
(svn r11137) -Feature: [NewGRF] Add support for bit 17 of property 1A for Industries. This bit enables the protection of the last instance of an industry type once raise.
src/industry.h
src/industry_cmd.cpp
--- a/src/industry.h	Fri Sep 21 17:56:55 2007 +0000
+++ b/src/industry.h	Sat Sep 22 00:59:27 2007 +0000
@@ -81,6 +81,7 @@
 	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)
+	INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type
 };
 
 
--- a/src/industry_cmd.cpp	Fri Sep 21 17:56:55 2007 +0000
+++ b/src/industry_cmd.cpp	Sat Sep 22 00:59:27 2007 +0000
@@ -1694,6 +1694,24 @@
 	}
 }
 
+/**
+ * Protects an industry from closure if the appropriate flags and conditions are met
+ * INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the
+ * count of industries of this type must one (or lower) in order to be protected
+ * against closure.
+ * @param type IndustryType been queried
+ * @result true if protection is on, false otherwise (except for oil wells)
+ */
+static bool CheckIndustryCloseDownProtection(IndustryType type)
+{
+	const IndustrySpec *indspec = GetIndustrySpec(type);
+
+	/* oil wells (or the industries with that flag set) are always allowed to closedown */
+	if (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD && _opt.landscape == LT_TEMPERATE) return false;
+	return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE && GetIndustryTypeCount(type) <= 1);
+}
+
+
 /** Change industry production or do closure
  * @param i Industry for which changes are performed
  */
@@ -1752,7 +1770,7 @@
 	}
 
 	/* If industry will be closed down, show this */
-	if (closeit) {
+	if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
 		i->prod_level = 0;
 		SetDParam(0, i->index);
 		AddNewsItem(
@@ -1895,8 +1913,12 @@
 			} else {
 				/* Decrease production */
 				if (i->prod_level == 4) {
-					i->prod_level = 0;
-					str = indspec->closure_text;
+					/* Really set the production to 0 when the industrytype allows it,
+					 * since it is equivalent to closing it. */
+					if (!CheckIndustryCloseDownProtection(i->type)) {
+						i->prod_level = 0;
+						str = indspec->closure_text;
+					}
 				} else {
 					i->prod_level >>= 1;
 					i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
@@ -1909,7 +1931,7 @@
 	}
 	if (indspec->life_type & INDUSTRYLIFE_PROCESSING) {
 		/* maybe close */
-		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) {
+		if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2) && !CheckIndustryCloseDownProtection(i->type)) {
 			i->prod_level = 0;
 			str = indspec->closure_text;
 		}