Думайте, что говорите
Как говорит одна моя знакомая - "пизд%ть - не мешки ворочать"
Весь алгоритм я несколько раз разжевывал здесь. Единственное с чем согласен, надо свести все как-нибудь в кучу и поместить на soe2.com, до которого руки не доходят.
Вкратце (но именно так и никак иначе) - каждый ДЕНЬ (не ход, а ДЕНЬ) число произведенных (указанных в уровне за день) уходит в медленный склад, туда же попадают отремонтированные и трофеи. С медленного склада определенный % - каждый ход на быстрый склад, с котрого можно пополнять юниты.
вот вам исходник алгоритма. Любуйтесь и изучайте.
// перевод произведенной техники(из кол-ва произведенных в день)
// в slow_depot для текущей коалиции при завершении ей хода
if Hdr_Massive.eco_use = 0 then
begin
for i:= 1 to 114000 do
begin
if proizv_pool_tech[i]>0 then slow_pool_tech[i]:=slow_pool_tech[i] + proizv_pool_tech[i];
end;
end;
// пополнение slow_depot за счет отремонтированной техники
for i:= 1 to 114000 do
begin
add_remont:=0;
// расчитываем кол-во отремонтированной (каждый день(правило по каждой модели) - 1% от числа находящейся в ремонте, если менее 100, но больше 0 - то 1шт в день))
if remont_pool_tech[i]>0 then
begin
if remont_pool_tech[i]>99
then add_remont:=(remont_pool_tech[i] div 100)
else add_remont:=1;
end;
// добавляем кол-во отремонтированной к slow_depot
if add_remont>0 then
begin
slow_pool_tech[i]:=slow_pool_tech[i] + add_remont;
end;
// вычитаем кол-во отремонтированной из техники, находящейся в ремонте
if add_remont>0 then
begin
remont_pool_tech[i]:=remont_pool_tech[i] - add_remont;
end;
end;
// если fast_depot < slow_depot, то переводим 10% от кол-ва в slow_depot в fast_depot (если 0<slow_depot<10, то переводим 1шт)
for i:= 1 to 114000 do
begin
move_fast_slow:=0;
//
if fast_pool_tech[i]<slow_pool_tech[i] then
begin
if slow_pool_tech[i]>9
then move_fast_slow:=(slow_pool_tech[i] div 10)
else move_fast_slow:=1;
end;
//
if move_fast_slow>0 then
begin
fast_pool_tech[i]:=fast_pool_tech[i] + move_fast_slow;
slow_pool_tech[i]:=slow_pool_tech[i] - move_fast_slow;
end;
end;
// автоматическая корректировка уровней производства моделей техники в зависимости от
// установленных приказов ("+","-","="), реального и требуемого экономических потенциалов
if Hdr_Massive.eco_use = 0 then
begin
// реальный экономич. потенциал - находится ранее, в differ_counter_for_stat_modes_13_34;
// вызов процедуры расчета требуемого экономического потенциала (с учетом приказов)
summa_nado_eco;
// вызов процедуры расчета требуемого экономического потенциала (без учета приказов)
summa_nado_eco2;
// сравнение реального и требуемого экономических потенциалов и действия
// в зависимости от результата(снижение-увеличение объемов производства)
//
// правила увеличения - уменьшения
//
// увеличение по конкретному типу не больше чем на 1шт в день
// падение производства может быть любое, вплоть до 0шт в день!
// максимально возможное выполнение приказов при нехватке требуемого экономического потенциала!
// а) сперва выполняем все [-], кроме тех где произв-во уже = 0
for i:=1 to 114000 do
begin
if (
(proizv_pool_tech[i]>0) and
(proizv_orders[i]=1)
) then
begin
proizv_pool_tech[i]:=proizv_pool_tech[i] - 1;
end;
end;
// б) выполняем (именно так!!!) все [+]
for i:=1 to 114000 do
begin
if (
(proizv_orders[i]=3)
) then
begin
// старый вариант
//proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
// новый вариант, начиная с 1.4.
if i<3001
then i50:=i
else i50:= i - (((i-1) div 3000) * 3000);
case tech_dat[i50].type_tech of
// может увеличиваться каждый день на 1 (с вероятностью 100%) при достатке экономич. потенциала
// 6 - минометы легкие (самоходн. или буксируем.)
// 7 - минометы средние (самоходн. или буксируем.)
// 16 - птр, гранатометы
6,7,16:
begin
proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
end;
// может увеличиваться каждый день на 1 (с вероятностью 75%) при достатке экономич. потенциала
// 8 - минометы тяжелые (самоходн. или буксируем.) в т.ч. и реактивные (но не РСЗО !!!)
8:
begin
random_chislo:= Random(4);{0,1,2,3}
if (
(random_chislo=0) or
(random_chislo=1) or
(random_chislo=2)
) then proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
end;
// может увеличиваться каждый день на 1 (с вероятностью 50%) при достатке экономич. потенциала
// 1 - БТР
// 2 - БМ
// 5 - ПТ (самоходн. или буксируем.)
// 9 - пехотная артиллерия (самоходн. или буксируем.)
// 10 - легкая артиллерия (самоходн. или буксируем.)
// 13 - РСЗО (самоходн. или буксируем.)
// 14 - легкие зен. системы (самоходн. или буксируем.)
1,2,5,9,10,13,14:
begin
random_chislo:= Random(2);{0,1}
if (
(random_chislo=0)
) then proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
end;
// может увеличиваться каждый день на 1 (с вероятностью 33%) при достатке экономич. потенциала
// 3 - танк
// 4 - штурм. орудие
// 11 - тяжелая артиллерия (самоходн. или буксируем.)
// 15 - тяжелые зен. системы (самоходн. или буксируем.)
// 100 - истребитель
// 101 - штурмовик или тактический бомбардировщик
3,4,11,15,100,101:
begin
random_chislo:= Random(3);{0,1,2}
if (
(random_chislo=0)
) then proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
end;
// может увеличиваться каждый день на 1 (с вероятностью 20%) при достатке экономич. потенциала
// 12 - особой мощности артиллерия (самоходн. или буксируем.)
// 102 - средний бомбардировщик
// 103 - дальний или тяжелый бомбардировщик
12,102,103:
begin
random_chislo:= Random(5);{0,1,2,3,4}
if (
(random_chislo=0)
) then proizv_pool_tech[i]:=proizv_pool_tech[i] + 1;
end;
end;
end;
end;
// в) случайным образом снижаем по всему списку произв-во до того, пока
// требуемый эко_потенциал не будет равен или меньше реальному, причем (внимание!!!),
// используется 2-ая процедура расчета требуемого эко_потенциала (процедура summa_nado_eco2), т.к. "+" временно уже выполнили выше...
for iiii:=1 to 38 do
begin
// а эту часть выполняем только тогда, когда требуемый потенциал > реального !!!
if summa_eco_now[iiii]<summa_eco_nado[iiii] then
begin
summa_nado_eco2;
// будем уменьшать производство конкретных видов техники, пока не будет уровень пр-ва не будет соотв-ть возможностям...
while summa_eco_now[iiii]<summa_eco_nado2[iiii] do
begin
for i:= 1 to 3000 do
begin
// проверка, если производство > 0шт/день и summa_eco_now[iiii]<summa_eco_nado2[iiii], то производство снижаем на 1шт
if (
(summa_eco_now[iiii]<summa_eco_nado2[iiii]) and
(proizv_pool_tech[((iiii-1)*3000 + i)]>0)
) then
begin
proizv_pool_tech[((iiii-1)*3000 + i)]:=proizv_pool_tech[((iiii-1)*3000 + i)] - 1;
summa_nado_eco2;
end;
end;
end;
end;
end;
end;
// ограничение по запасам...принудительное не больше 1млн штук
for i:= 1 to 114000 do
begin
//
if fast_pool_tech[i]>1000000 then fast_pool_tech[i]:=1000000;
if slow_pool_tech[i]>1000000 then slow_pool_tech[i]:=1000000;
if remont_pool_tech[i]>1000000 then remont_pool_tech[i]:=1000000;
end;