К делу: есть два алгоритма, по которым происходить развитие индустрии. Обычный - (smooth_economy = false) и Расшыренный (smooth_economy = true). рыботают они очень просто, каждый месяц (1ое число) вызывается событие на обновление данных индустрии, откуда и вызывается либо первый метод либо второй (от установок)
вот часть кода первого алгоритма:
- Код: Выделить всё
if (only_decrease || CHANCE16(1,3)) {
/* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
if (!only_decrease && (i->pct_transported[0] > 153) != CHANCE16(1,3)) {
/* Increase production */
if (i->prod_level != 0x80) {
byte b;
i->prod_level <<= 1;
b = i->production_rate[0] * 2;
if (i->production_rate[0] >= 128)
b = 0xFF;
i->production_rate[0] = b;
b = i->production_rate[1] * 2;
if (i->production_rate[1] >= 128)
b = 0xFF;
i->production_rate[1] = b;
str = _industry_prod_up_strings[type];
}
} else {
/* Decrease production */
if (i->prod_level == 4) {
i->prod_level = 0;
str = _industry_close_strings[type];
} else {
i->prod_level >>= 1;
i->production_rate[0] = (i->production_rate[0] + 1) >> 1;
i->production_rate[1] = (i->production_rate[1] + 1) >> 1;
str = _industry_prod_down_strings[type];
}
}
}
break;
Как видно из кода, будет ли рости индустрия, решает генератор случайных чисел. НО, всеж шанс роста зависит от объемов отгрузки товаров на станции. Если индустрия отгружает больше 60% то шанс ее роста 2/3 в противном случае 1/3. Вроде все просто и красиво, но не тут-то было. Этот скрипт вызывается по другому алгоритму, который сначала выщитывает вероятность открытия новой индустрии, и в случае отказа, вызывает скрипт изменения производства индустрии. Тут же видим, что индустрия к развитию выбирается случайным образом из мессива индустрий. А уже из массива он может выбрать и ту индустрию, которы не подлежит к развитию, например перерабатывающая или электростанция.
Вот его часть:
- Код: Выделить всё
if (CHANCE16(3, 100)) {
MaybeNewIndustry(Random());
} else if (!_patches.smooth_economy && _total_industries > 0) {
i = GetIndustry(RandomRange(_total_industries));
if (i->xy != 0) ChangeIndustryProduction(i);
}
Второй метод работает аналогично, но уже не в диапазоне +/- 50% а в болле меньших и более плавных диапазонах.
Вот вырезка кода:
- Код: Выделить всё
for (j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){
uint32 r = Random();
int old, new, percent;
int mag;
new = old = i->production_rate[j];
if (CHANCE16I(20, 1024, r))
new -= ((RandomRange(50) + 10) * old) >> 8;
if (CHANCE16I(20 + (i->pct_transported[j] * 20 >> 8), 1024, r >> 16))
new += ((RandomRange(50) + 10) * old) >> 8;
new = clamp(new, 0, 255);
if (new == old) {
closeit = false;
continue;
}
percent = new * 100 / old - 100;
i->production_rate[j] = new;
if (new >= _industry_spec[i->type].production_rate[j] / 4)
closeit = false;
mag = abs(percent);
if (mag >= 10) {
SetDParam(2, mag);
SetDParam(0, _cargoc.names_s[i->produced_cargo[j]]);
SetDParam(1, i->index);
AddNewsItem(
percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
i->xy + TileDiffXY(1, 1), 0
);
}
}
break;
Я думаю тут коментарии излишни.
И так, изучив исходные тексты, делаю вывод, что объем отгруженных товаров только влияет только на шанс роста но не как не влияет на шанс выбора индустрии для развития. Так что сколько паравоз не изобретай, а руль все равно у господа бога, т.е. у гениратора случайных чисел.