1620 { |
1620 { |
1621 bool closeit = true; |
1621 bool closeit = true; |
1622 int j; |
1622 int j; |
1623 const IndustrySpec *indspec = GetIndustrySpec(i->type); |
1623 const IndustrySpec *indspec = GetIndustrySpec(i->type); |
1624 |
1624 |
1625 switch (indspec->life_type) { |
1625 if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return; |
1626 case INDUSTRYLIFE_NOT_CLOSABLE: |
1626 |
1627 return; |
1627 if (HASBIT(indspec->life_type, INDUSTRYLIFE_ORGANIC) || HASBIT(indspec->life_type, INDUSTRYLIFE_EXTRACTIVE)) { |
1628 |
1628 for (j = 0; j < 2 && indspec->produced_cargo[j] != CT_INVALID; j++){ |
1629 case INDUSTRYLIFE_CLOSABLE: |
1629 uint32 r = Random(); |
1630 if ((byte)(_cur_year - i->last_prod_year) < 5 || !CHANCE16(1, 180)) |
1630 int old_prod, new_prod, percent; |
|
1631 int mag; |
|
1632 |
|
1633 new_prod = old_prod = i->production_rate[j]; |
|
1634 |
|
1635 if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U); |
|
1636 /* Chance of increasing becomes better when more is transported */ |
|
1637 if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) && |
|
1638 ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0 || _opt.landscape != LT_TEMPERATE)) { |
|
1639 new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U); |
|
1640 } |
|
1641 |
|
1642 new_prod = clamp(new_prod, 1, 255); |
|
1643 /* Do not stop closing the industry when it has the lowest possible production rate */ |
|
1644 if (new_prod == old_prod && old_prod > 1) { |
1631 closeit = false; |
1645 closeit = false; |
1632 break; |
1646 continue; |
1633 |
1647 } |
1634 default: /* INDUSTRY_PRODUCTION */ |
1648 |
1635 for (j = 0; j < 2 && indspec->produced_cargo[j] != CT_INVALID; j++){ |
1649 percent = (old_prod == 0) ? 100 : (new_prod * 100 / old_prod - 100); |
1636 uint32 r = Random(); |
1650 i->production_rate[j] = new_prod; |
1637 int old_prod, new_prod, percent; |
1651 |
1638 int mag; |
1652 /* Close the industry when it has the lowest possible production rate */ |
1639 |
1653 if (new_prod > 1) closeit = false; |
1640 new_prod = old_prod = i->production_rate[j]; |
1654 |
1641 |
1655 mag = abs(percent); |
1642 if (CHANCE16I(20, 1024, r)) new_prod -= max(((RandomRange(50) + 10) * old_prod) >> 8, 1U); |
1656 if (mag >= 10) { |
1643 /* Chance of increasing becomes better when more is transported */ |
1657 SetDParam(2, mag); |
1644 if (CHANCE16I(20 + (i->last_month_pct_transported[j] * 20 >> 8), 1024, r >> 16) && |
1658 SetDParam(0, GetCargo(indspec->produced_cargo[j])->name); |
1645 ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0 || _opt.landscape != LT_TEMPERATE)) { |
1659 SetDParam(1, i->index); |
1646 new_prod += max(((RandomRange(50) + 10) * old_prod) >> 8, 1U); |
1660 AddNewsItem( |
1647 } |
1661 percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN, |
1648 |
1662 NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ECONOMY, 0), |
1649 new_prod = clamp(new_prod, 1, 255); |
1663 i->xy + TileDiffXY(1, 1), 0 |
1650 /* Do not stop closing the industry when it has the lowest possible production rate */ |
1664 ); |
1651 if (new_prod == old_prod && old_prod > 1) { |
1665 } |
1652 closeit = false; |
1666 } |
1653 continue; |
1667 } |
1654 } |
1668 |
1655 |
1669 if (HASBIT(indspec->life_type, INDUSTRYLIFE_PROCESSING)) { |
1656 percent = new_prod * 100 / old_prod - 100; |
1670 if ((byte)(_cur_year - i->last_prod_year) < 5 || !CHANCE16(1, 180)) closeit = false; |
1657 i->production_rate[j] = new_prod; |
|
1658 |
|
1659 /* Close the industry when it has the lowest possible production rate */ |
|
1660 if (new_prod > 1) closeit = false; |
|
1661 |
|
1662 mag = abs(percent); |
|
1663 if (mag >= 10) { |
|
1664 SetDParam(2, mag); |
|
1665 SetDParam(0, GetCargo(indspec->produced_cargo[j])->name); |
|
1666 SetDParam(1, i->index); |
|
1667 AddNewsItem( |
|
1668 percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN, |
|
1669 NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ECONOMY, 0), |
|
1670 i->xy + TileDiffXY(1, 1), 0 |
|
1671 ); |
|
1672 } |
|
1673 } |
|
1674 break; |
|
1675 } |
1671 } |
1676 |
1672 |
1677 /* If industry will be closed down, show this */ |
1673 /* If industry will be closed down, show this */ |
1678 if (closeit) { |
1674 if (closeit) { |
1679 i->prod_level = 0; |
1675 i->prod_level = 0; |
1783 bool only_decrease = false; |
1779 bool only_decrease = false; |
1784 StringID str = STR_NULL; |
1780 StringID str = STR_NULL; |
1785 int type = i->type; |
1781 int type = i->type; |
1786 const IndustrySpec *indspec = GetIndustrySpec(type); |
1782 const IndustrySpec *indspec = GetIndustrySpec(type); |
1787 |
1783 |
1788 switch (indspec->life_type) { |
1784 if (indspec->life_type == INDUSTRYLIFE_BLACK_HOLE) return; |
1789 case INDUSTRYLIFE_NOT_CLOSABLE: |
1785 |
1790 return; |
1786 if (HASBIT(indspec->life_type, INDUSTRYLIFE_ORGANIC) || HASBIT(indspec->life_type, INDUSTRYLIFE_EXTRACTIVE)) { |
1791 |
1787 /* decrease or increase */ |
1792 case INDUSTRYLIFE_PRODUCTION: |
1788 if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE) |
1793 /* decrease or increase */ |
1789 only_decrease = true; |
1794 if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE) |
1790 |
1795 only_decrease = true; |
1791 if (only_decrease || CHANCE16(1, 3)) { |
1796 |
1792 /* If you transport > 60%, 66% chance we increase, else 33% chance we increase */ |
1797 if (only_decrease || CHANCE16(1, 3)) { |
1793 if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) { |
1798 /* If you transport > 60%, 66% chance we increase, else 33% chance we increase */ |
1794 /* Increase production */ |
1799 if (!only_decrease && (i->last_month_pct_transported[0] > 153) != CHANCE16(1, 3)) { |
1795 if (i->prod_level != 0x80) { |
1800 /* Increase production */ |
1796 byte b; |
1801 if (i->prod_level != 0x80) { |
1797 |
1802 byte b; |
1798 i->prod_level <<= 1; |
1803 |
1799 |
1804 i->prod_level <<= 1; |
1800 b = i->production_rate[0] * 2; |
1805 |
1801 if (i->production_rate[0] >= 128) |
1806 b = i->production_rate[0] * 2; |
1802 b = 0xFF; |
1807 if (i->production_rate[0] >= 128) |
1803 i->production_rate[0] = b; |
1808 b = 0xFF; |
1804 |
1809 i->production_rate[0] = b; |
1805 b = i->production_rate[1] * 2; |
1810 |
1806 if (i->production_rate[1] >= 128) |
1811 b = i->production_rate[1] * 2; |
1807 b = 0xFF; |
1812 if (i->production_rate[1] >= 128) |
1808 i->production_rate[1] = b; |
1813 b = 0xFF; |
1809 |
1814 i->production_rate[1] = b; |
1810 str = indspec->production_up_text; |
1815 |
1811 } |
1816 str = indspec->production_up_text; |
1812 } else { |
1817 } |
1813 /* Decrease production */ |
|
1814 if (i->prod_level == 4) { |
|
1815 i->prod_level = 0; |
|
1816 str = indspec->closure_text; |
1818 } else { |
1817 } else { |
1819 /* Decrease production */ |
1818 i->prod_level >>= 1; |
1820 if (i->prod_level == 4) { |
1819 i->production_rate[0] = (i->production_rate[0] + 1) >> 1; |
1821 i->prod_level = 0; |
1820 i->production_rate[1] = (i->production_rate[1] + 1) >> 1; |
1822 str = indspec->closure_text; |
1821 |
1823 } else { |
1822 str = indspec->production_down_text; |
1824 i->prod_level >>= 1; |
|
1825 i->production_rate[0] = (i->production_rate[0] + 1) >> 1; |
|
1826 i->production_rate[1] = (i->production_rate[1] + 1) >> 1; |
|
1827 |
|
1828 str = indspec->production_down_text; |
|
1829 } |
|
1830 } |
1823 } |
1831 } |
1824 } |
1832 break; |
1825 } |
1833 |
1826 } |
1834 case INDUSTRYLIFE_CLOSABLE: |
1827 if (HASBIT(indspec->life_type, INDUSTRYLIFE_PROCESSING)) { |
1835 /* maybe close */ |
1828 /* maybe close */ |
1836 if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) { |
1829 if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) { |
1837 i->prod_level = 0; |
1830 i->prod_level = 0; |
1838 str = indspec->closure_text; |
1831 str = indspec->closure_text; |
1839 } |
1832 } |
1840 break; |
|
1841 } |
1833 } |
1842 |
1834 |
1843 if (str != STR_NULL) { |
1835 if (str != STR_NULL) { |
1844 SetDParam(0, i->index); |
1836 SetDParam(0, i->index); |
1845 AddNewsItem(str, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, str == indspec->closure_text ? NT_OPENCLOSE : NT_ECONOMY, 0), i->xy + TileDiffXY(1, 1), 0); |
1837 AddNewsItem(str, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, str == indspec->closure_text ? NT_OPENCLOSE : NT_ECONOMY, 0), i->xy + TileDiffXY(1, 1), 0); |