(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 8104 a792a30af2c8
parent 8103 98ef3fd99803
child 8105 8f7fcf4d2b7e
(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;
 		}