OpenTTD Spring 2013 2.4.291

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

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

Re: OpenTTD Spring 2013 2.4.291

Сообщение Se7en » Вт дек 05, 2017 01:38

Разбирался тут с работой GS, и возник вопрос:
Скрипт использует функцию GSTown.GetLastMonthSupplied для получения количества грузов, созданных городом за прошлый месяц и поставленных на станции, однако в Spring2013 к этому значению прибавляется объем грузов, выгруженных на городских станциях, что приводит к некорректной работе скрипта, неправильному отображению в окне города количества грузов, поставленных городом на станции за прошлый месяц.
А также это приводит к неправильному вычислению GSTown.GetLastMonthTransportedPercentage, который вычисляется как:
inline byte GetPercentTransported(CargoID cid) const { return this->supplied[cid].old_act * 256 / (this->supplied[cid].old_max + 1); }
и в случае, если old_act > old_max возвращает некорректное значение.

Проблема, судя по всему, находится в economy.cpp, DeliverGoods():

/* Increase town's counter for town effects */
const CargoSpec *cs = CargoSpec::Get(cargo_type);
if(cs->town_effect == TE_FOOD || cs->town_effect == TE_WATER)
st->town->received[cs->town_effect].new_act += (accepted * 1000 * (cs->multipliertowngrowth == 0 ? 256 : cs->multipliertowngrowth)) >> 8; // food rate in kg, water rate in litres
else
st->town->received[cs->town_effect].new_act += (accepted * (cs->multipliertowngrowth == 0 ? 256 : cs->multipliertowngrowth)) >> 8;
st->town->supplied[cs->Index()].new_act += accepted;

В стандартном OpenTTD 1.7 этот код выглядит как:

/* Increase town's counter for town effects */
const CargoSpec *cs = CargoSpec::Get(cargo_type);
st->town->received[cs->town_effect].new_act += accepted;

То есть st->town->supplied[cs->Index()].new_act вроде как не должен тут меняться, кроме того, в Spring2013 модифицируется полученное количество грузов (для еды и воды умножается на 1000), что тоже приведет к некорректной работе скриптов, использующих эти значения.

Можно это как-то исправить, чтобы функции GSTown возвращали корректные значения?
Update: заменил товары на грузы для точности.

И еще вопрос, пытался скомпилировать OpenTTD Spring 2013 Patchpack v2.4.291 source в VS2010 по инструкции отсюда:
https://wiki.openttd.org/Compiling_on_W ... 2B%2B_2012

Вылезли ошибки:
7>zlibstat.lib(gzwrite.obj) : error LNK2005: _vsnprintf already defined in string.obj
7>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf already defined in libfreetype2.lib(bdf.obj)
7>rail_cmd.obj : error LNK2001: unresolved external symbol "unsigned int _opengfx_grf_file_index" (?_opengfx_grf_file_index@@3IA)
7>rail_cmd.obj : error LNK2001: unresolved external symbol "unsigned int _first_user_grf_file_index" (?_first_user_grf_file_index@@3IA)
7>icuuc.lib(unames.obj) : error LNK2001: unresolved external symbol ___report_rangecheckfailure
...
ну и так далее.

Проблема, видимо, в первых _vsnprintf already defined и _sprintf already defined. Подскажите, как это исправить?
Последний раз редактировалось Se7en Ср дек 06, 2017 15:24, всего редактировалось 2 раз(а).
Se7en
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 11
Зарегистрирован: Ср июл 26, 2017 15:05

Re: OpenTTD Spring 2013 2.4.291

Сообщение pi1985 » Вт дек 05, 2017 16:12

по быстрому. supplied обозначает "поставлено", в не " произведено", т. е. всё верно.
pi1985
Президент
Президент
 
Сообщения: 675
Зарегистрирован: Вт апр 03, 2012 23:10
Откуда: Донбассъ - Забайкалье

Re: OpenTTD Spring 2013 2.4.291

Сообщение Se7en » Вт дек 05, 2017 16:17

pi1985 писал(а):по быстрому. supplied обозначает "поставлено", в не " произведено", т. е. всё верно.

По логике это именно поставлено городом на городские станции. Нигде больше такого кода нет, я смотрел транк, стабильный и JGR - там везде все корректно считается, и поставки товаров и процент перевозки.
Se7en
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 11
Зарегистрирован: Ср июл 26, 2017 15:05

Re: OpenTTD Spring 2013 2.4.291

Сообщение pi1985 » Вт дек 05, 2017 16:24

Ок, проверим. Кода также ого конечно, нет, так как патч только тут такой.
pi1985
Президент
Президент
 
Сообщения: 675
Зарегистрирован: Вт апр 03, 2012 23:10
Откуда: Донбассъ - Забайкалье

Re: OpenTTD Spring 2013 2.4.291

Сообщение pi1985 » Ср дек 06, 2017 03:51

Se7en писал(а):Разбирался тут с работой GS, и возник вопрос:
Скрипт использует функцию GSTown.GetLastMonthSupplied для получения количества товаров, созданных городом за прошлый месяц и поставленных на станции, однако в Spring2013 к этому значению прибавляется объем товаров, выгруженных на городских станциях, что приводит к некорректной работе скрипта, неправильному отображению в окне города количества товаров, поставленных городом на станции за прошлый месяц.


Насколько я помню, город сам производит только два груза: пассажиры и почту (в ECS ещё туристов), но не производит товары. Патч использует только те грузы, которые имеют пометку TE_GOODS, TE_FOOD или TE_WATER). Ни пассажиры, ни почта, ни туристы к этим категориям не относятся (для них есть свои категории TE_PASSENGERS и TE_MAIL), поэтому патч работает правильно (хотя можно сделать, чтобы эти категории так же учитывались).

Но в общем, согласен, использовать Town::supplied[] для хранения количества привезенного груза неправильно и нужно создать что-то вроде Town::delivered[].

А каким образом город начал производить товары?
pi1985
Президент
Президент
 
Сообщения: 675
Зарегистрирован: Вт апр 03, 2012 23:10
Откуда: Донбассъ - Забайкалье

Re: OpenTTD Spring 2013 2.4.291

Сообщение Se7en » Ср дек 06, 2017 15:21

Насколько я помню, город сам производит только два груза: пассажиры и почту (в ECS ещё туристов), но не производит товары. Патч использует только те грузы, которые имеют пометку TE_GOODS, TE_FOOD или TE_WATER). Ни пассажиры, ни почта, ни туристы к этим категориям не относятся (для них есть свои категории TE_PASSENGERS и TE_MAIL), поэтому патч работает правильно (хотя можно сделать, чтобы эти категории так же учитывались).

А каким образом город начал производить товары?

Товары имелись в виду в общем смысле как груз, то есть в данном случае пассажиры.
При разгрузке транспорта на станции количество пассажиров прибавляется к значению supplied, это неправильно, потому что supplied это пассажиры, которых произвел сам город и поставил на городские станции, через это вычисляется процент перевозки пассажиров как supplied/max за прошлый месяц.
Также при прибытии воды и еды на городские станции значение received умножается на 1000, что тоже неправильно, потому что эта переменная доступна скриптам через интерфейс города и может использоваться.

Но в общем, согласен, использовать Town::supplied[] для хранения количества привезенного груза неправильно и нужно создать что-то вроде Town::delivered[].

Именно так, поскольку supplied и received могут использоваться скриптами, они должны работать как в стандартном OTTD, иначе ломается совместимость.
Se7en
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 11
Зарегистрирован: Ср июл 26, 2017 15:05

Re: OpenTTD Spring 2013 2.4.291

Сообщение Sky_Turner » Ср дек 06, 2017 22:06

А я всё жду, когда автор добавит Terminus Airports в сборку :(
Изображение
Sky_Turner
Шпалоукладчик
Шпалоукладчик
 
Сообщения: 22
Зарегистрирован: Ср сен 23, 2015 01:04

Пред.

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

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

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