src/industry_cmd.cpp
changeset 7144 8e73641511f3
parent 7132 0af71cb216ff
child 7145 0bb6d7c2de2f
equal deleted inserted replaced
7143:67940cbbd17a 7144:8e73641511f3
  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);