Развитие индустрии

OpenTTD - современная игра, клон Transport Tycoon Deluxe с открытым исходным кодом, написанный на C и С++. Содержит ряд ключевых улучшений и возможность игры по сети. На данный момент это главное направление развития игры.

Модераторы: eraserkry, Mihamster, Smoky555, Группа модераторов

Развитие индустрии

Сообщение doron » Ср янв 03, 2007 17:35

Сколь себя помню за компом, все время игрался в TT, TTD теперь в OpenTTD, и все это время меня мучал вопрос, какой алгоритм заставляет развиваться индустрии. Буквально вчера скачал исходники и OpenTTD и начал изучать.
К делу: есть два алгоритма, по которым происходить развитие индустрии. Обычный - (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;

Я думаю тут коментарии излишни.

И так, изучив исходные тексты, делаю вывод, что объем отгруженных товаров только влияет только на шанс роста но не как не влияет на шанс выбора индустрии для развития. Так что сколько паравоз не изобретай, а руль все равно у господа бога, т.е. у гениратора случайных чисел. :)
Вложения
industry_cmd.zip
Модуль исходного кода с командами индустрии
(11.91 Кб) Скачиваний: 337
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение Quark » Ср янв 03, 2007 18:01

Код: Выделить всё
… if (!_patches.smooth_economy && …

что означает, что во втором случае наобум предприятие не выбирается

во втором фрагменте кода не указано, откуда взялось i, обозначающее предприятие.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ⓤⓐⓡⓚ ⓤⓢⓛⓞⓝ
Аватара пользователя
Quark
Президент
Президент
 
Сообщения: 628
Зарегистрирован: Пт сен 08, 2006 01:17
Откуда: Москва

Сообщение doron » Ср янв 03, 2007 18:06

Второй фрагмент, это фрагмент, чтоб не срать большим исходником, я сделал вырезку. весь код есть файле industry_cmd.zip процедуры:

ExtChangeIndustryProduction
ChangeIndustryProduction
UpdateIndustryStatistics
IndustryMonthlyLoop
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение Quark » Ср янв 03, 2007 18:15

ну хоть бы в html сделали чтоли тогда :) или помогите уговорить разработчиков починить TRAC, тогда можно будет в online смотреть :) А сейчас открывать его блокнотом как-то не хочется :)

doron писал(а):…чтоб не срать большим исходником, я сделал вырезку. …

вырезать лучше всего ненужный код, например показ новостей
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ⓤⓐⓡⓚ ⓤⓢⓛⓞⓝ
Аватара пользователя
Quark
Президент
Президент
 
Сообщения: 628
Зарегистрирован: Пт сен 08, 2006 01:17
Откуда: Москва

Сообщение kraks » Ср янв 03, 2007 19:23

А у меня такой вопрос: это было просто информационное сообщение или есть какие-то конкретные предложения по доработке? Конструктив-то хде? :D

З.Ы. Может это в разработку из общего?
Аватара пользователя
kraks
Президент
Президент
 
Сообщения: 889
Зарегистрирован: Вт окт 03, 2006 01:05
Откуда: Москва

Сообщение doron » Ср янв 03, 2007 21:14

2 kraks
Это просто информатив... хотя мысли есть, но надо с 0.5.0 работать...
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение kraks » Ср янв 03, 2007 23:17

Так какие мысли? Интересно жеж! :) Можно было б обсудить...
Аватара пользователя
kraks
Президент
Президент
 
Сообщения: 889
Зарегистрирован: Вт окт 03, 2006 01:05
Откуда: Москва

Сообщение doron » Чт янв 04, 2007 12:09

Мысли очень простые, в реальном мире не одно предприятие не развивается случайным образом, всему есть свои предпосылки. Спрос рождает предложение. В кратце вот такая мысль, яб начал переписывать алгоритм, но не могу с компилятором разобраться....
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение Quark » Чт янв 04, 2007 12:33

при patches.smooth_economy предприятия развиваются согласно спросу — если исправно увозим продукцию, то предприятие начинает её больше вырабатывать
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ⓤⓐⓡⓚ ⓤⓢⓛⓞⓝ
Аватара пользователя
Quark
Президент
Президент
 
Сообщения: 628
Зарегистрирован: Пт сен 08, 2006 01:17
Откуда: Москва

Сообщение kraks » Чт янв 04, 2007 13:24

Я так понял, что речь идет о том, чтобы исключить случайный выбор из всех предприятий, при выборе "жертвы" для модификации количества производимой продукции.

И все же интересно было бы услышать, как модифицировать?

Рассматривать на предмет выбора "жертвы" только те, которые "используются"? А как же тогда тот факт, что раз "не используются", то у них тоже "труба" с экономикой?

Мне кажется, дорабатывать надо другие моменты:
а) не закрываются электростанции;
б) не закрываются ресурсные предприятия;
в) в сторону обсуждаемых предложений - рассматривать сначала все предприятия, а потом еще отдельно - "используемые". Тогда вероятность изменения "используемых" предприятий возрастет. Однако, мне кажется, этого все же не стоит делать, потому что тогда играть будет очень легко - через годик-другой предприятие будет производить такие горы продукции...
Аватара пользователя
kraks
Президент
Президент
 
Сообщения: 889
Зарегистрирован: Вт окт 03, 2006 01:05
Откуда: Москва

Сообщение doron » Чт янв 04, 2007 14:08

С другой стороны, есть спрос, под который развивается предприятие. предприятия неконкурентноспособные закрыватся. все приходит к тому, что реально разрабатывающие придприятия ростут, а уботочные просто изчезают, тем самым мы расширяем простор для сетевой игры. т.е. есть на всю карту несколько реальный предприяти, сотрудничество с которыми выгодно каждому из игроков. Естественно предположить, что от сюда вытекает не только профессиональноя борьба игроков, но и рейтинговая(как суммарно так и относительно).
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение kraks » Чт янв 04, 2007 14:21

Однако в однопользовательской игре со скупым кредитиком, а еще если и наборчик поездов "дорогой" (типа NARS или UKRS - тама за проезд приходится ого-го скока платить), к тому времени, как ты выберешься из долговой ямы (допустим, даже это будет быстрее за счет нового развития предприятий) на карте нифиха не останется кроме электростанций :D
Аватара пользователя
kraks
Президент
Президент
 
Сообщения: 889
Зарегистрирован: Вт окт 03, 2006 01:05
Откуда: Москва

Сообщение doron » Чт янв 04, 2007 14:23

Ни кто и не говорит об отсутсвии открывающихся предприятий.. :-)
Лана, я как математику законькю, выложу, посмотрим... :-)
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

Сообщение Quark » Чт янв 04, 2007 18:01

вобщем есть два режима игры — со случайным развитием предприятий и с активным развитием тех, с которых есть спрос, во втором случае активность настраиваемая и на низком значении может быть поглащена фактором случайности.

что вы хотите менять?
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ⓤⓐⓡⓚ ⓤⓢⓛⓞⓝ
Аватара пользователя
Quark
Президент
Президент
 
Сообщения: 628
Зарегистрирован: Пт сен 08, 2006 01:17
Откуда: Москва

Сообщение doron » Чт янв 04, 2007 22:47

Менять я хочю весь алгорим, вводить новые промежуточные значения и т.п. Пока остановился на математических расчетах. Если это не окажется актуальным, я все равно получю удовлетворение от процесса. Сейчас моя проблемма только в компиляторе...
Аватара пользователя
doron
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 10
Зарегистрирован: Ср янв 03, 2007 10:17

След.

Вернуться в Общие вопросы по OpenTTD

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

cron