mirror of https://github.com/OpenTTD/OpenTTD
(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.
parent
a6a8502ca3
commit
47dd4989a8
|
@ -81,6 +81,7 @@ enum IndustyBehaviour {
|
||||||
INDUSTRYBEH_AIRPLANE_ATTACKS = 1 << 11, ///< can be exploded by a military airplane (oil refinery)
|
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_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_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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1694,6 +1694,24 @@ void GenerateIndustries()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
/** Change industry production or do closure
|
||||||
* @param i Industry for which changes are performed
|
* @param i Industry for which changes are performed
|
||||||
*/
|
*/
|
||||||
|
@ -1752,7 +1770,7 @@ static void ExtChangeIndustryProduction(Industry *i)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If industry will be closed down, show this */
|
/* If industry will be closed down, show this */
|
||||||
if (closeit) {
|
if (closeit && !CheckIndustryCloseDownProtection(i->type)) {
|
||||||
i->prod_level = 0;
|
i->prod_level = 0;
|
||||||
SetDParam(0, i->index);
|
SetDParam(0, i->index);
|
||||||
AddNewsItem(
|
AddNewsItem(
|
||||||
|
@ -1895,8 +1913,12 @@ static void ChangeIndustryProduction(Industry *i)
|
||||||
} else {
|
} else {
|
||||||
/* Decrease production */
|
/* Decrease production */
|
||||||
if (i->prod_level == 4) {
|
if (i->prod_level == 4) {
|
||||||
i->prod_level = 0;
|
/* Really set the production to 0 when the industrytype allows it,
|
||||||
str = indspec->closure_text;
|
* since it is equivalent to closing it. */
|
||||||
|
if (!CheckIndustryCloseDownProtection(i->type)) {
|
||||||
|
i->prod_level = 0;
|
||||||
|
str = indspec->closure_text;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
i->prod_level >>= 1;
|
i->prod_level >>= 1;
|
||||||
i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
|
i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
|
||||||
|
@ -1909,7 +1931,7 @@ static void ChangeIndustryProduction(Industry *i)
|
||||||
}
|
}
|
||||||
if (indspec->life_type & INDUSTRYLIFE_PROCESSING) {
|
if (indspec->life_type & INDUSTRYLIFE_PROCESSING) {
|
||||||
/* maybe close */
|
/* 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;
|
i->prod_level = 0;
|
||||||
str = indspec->closure_text;
|
str = indspec->closure_text;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue