(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.
--- 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;
}