Разбирался тут с работой 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. Подскажите, как это исправить?