Вход

Просмотр полной версии : "1492: Global Colonization. Глобальная Колонизация"



Страницы : 1 [2] 3

kabjans
06.05.2010, 14:26
<div class='quotetop'>Цитата(NeseryozniyVET * 6.5.2010, 11:47) 335281</div>

<div class='quotetop'>Цитата(kabjans * 6.5.2010, 10:29) 335268
Тогда получается:
1 солдат = 1 мушкет.
1 конный разведчик = 1 лошадь.
1 пионер = 1 инструмент.
1 драгун = 1 лошадь + 1 мушкет.

Производства тоже становятся логичными. 1 изделие делает простой колонист, специалист может сделать в 2 или 3 раза больше.

Склад тоже приобретает разумный вид. В нем будет разумное количество товаров, а не тысячи.

Индейцам невозможно будет загнать 300 своих ружей, что уберет излишний торговый бонус в самом начале.

Пока только плюсы. А как насчет минусов? [/b]Минус в том, что сейчас можно сделать по 50 ружей в трех городах, свезти их в один и сделать одного солдата. В твоем варианте это невозможно.
[/b][/quote]
Верно, если в каждом городе можно изготовлять оружие. Но даже сейчас для его изготовления необходимы инструменты, которые в свою очередь производятся из железа. А оно в оригинальной версии есть везде, на каждом холме или горе. То есть вариант трех городов, где одновременно делают ружья, в этом случае работает.

А теперь представим другой вариант. Во всей колонии есть лишь одно месторождение железной руды, из которой после ряда превращений (опускаю детали) изготавливают ружья. Создание параллельных оружейных мастерских в других городах бессмысленно из-за элементарной нехватки исходных материалов для производства. То есть оружие разумно изготавливать лишь в том городе, где есть основной материал для его производства.

В этом случае вариант "1 солдат = 1 ружье" уже не кажется таким уж неразумным.

Еще раз большое спасибо за помощь с ограничением строительства. Кстати, в том числе и для таких случаев это и задумывалось. Нет исходных материалов => ненужной оружейной мастерской => появляется свободное место, которое можно использовать для другого производственного здания.

zombie_113
06.05.2010, 15:02
<div class='quotetop'>Цитата(NeseryozniyVET * 6.5.2010, 11:47) 335281</div>

Минус в том, что сейчас можно сделать по 50 ружей в трех городах, свезти их в один и сделать одного солдата. В твоем варианте это невозможно.
[/b]
Да... это минус...
О_о а что если зайти с другой стороны?
Что если юнитам дать кол-во?
Бредово кнешно... но так будет более плавный рост городов. Щас то они скачкообразно генерят юнита (который есть толпа). А так будет возможность население из трех городов свести в один и создать полноценного юнита. Или создать недоукомплектованного юнита и позже его только укомплектовывать в городах. Неукомплектованные юниты работают на столько процентов, на сколько полон отряд (поэтому 100 идеальное число для посчета).
Так у нас будет один юнит символизирующий отряд (человек в сто, для ровного счета) и юзающий соответствующее кол-во мушкетов.
При боях кол-во человек в отряде уменьшаецо (вместо жизней), и мы будем терять население. Даже когда выигрываем бой. Т.к. пополнять отряд нужно будет из населения города. А то в оригинале у нас был не отряд понесший потери, а юнит который мог лечицо.
Может это выход?

Кстати... сделать не сложно. Т.к. у нас уже есть здоровье юнита. Оно вроде как в процентах. Сила зависит от здоровья. Все что нам и нужно. Осталось запретить автолечение. И сделать пополнение отряда в городе из населения. Ах да... и вывести значение здоровья (переименовав его в кол-во) в инфу об юните. Просто и элегантно. И при этом сохраняется вся механика и более ясно, че для ста юнитов нужно сто мушкетов.
Хотя... опять остаеца проблема, когда 100 мастеров оружейников (1 юнит) производят в месяц (за ход) всего 16 мушкетов (это максимум со всеми бонусами).
Хотя, тут опять же можно играцо с кол-вом. Например для воинов сделать максимальное кол-во в 100. Для рабочих вне города, тоже по 100. Для мастеров в городе сделать максимальный размер отряда в 10 человек. Для уникальных юнитов (типа генерала, кораблей и др.) сделать кол-во в 1 человека.
Т.е. если мастер оружейник (отряд численностью 10 человек) делает 16 мушкетов в месяц, то это по моему более логично. Вобщем... оно и раньше как-то просилось к тому, что различные юниты (отряды) не равны между собой в кол-ве.

Кстати... юниты однозначно не должны быть равны в численности. Ибо странно когда в городе населением 3 (300 человек) - 1 (100 человек) из них производят одну какую-то продукцию.

Vik9
07.05.2010, 11:07
Тогда получается:
1 солдат = 1 мушкет.
1 конный разведчик = 1 лошадь.
1 пионер = 1 инструмент.
1 драгун = 1 лошадь + 1 мушкет.

Производства тоже становятся логичными. 1 изделие делает простой колонист, специалист может сделать в 2 или 3 раза больше.

Склад тоже приобретает разумный вид. В нем будет разумное количество товаров, а не тысячи.

Индейцам невозможно будет загнать 300 своих ружей, что уберет излишний торговый бонус в самом начале.

Пока только плюсы. А как насчет минусов? Минус в том, что сейчас можно сделать по 50 ружей в трех городах, свезти их в один и сделать одного солдата. В твоем варианте это невозможно.

Верно, если в каждом городе можно изготовлять оружие. Но даже сейчас для его изготовления необходимы инструменты, которые в свою очередь производятся из железа. А оно в оригинальной версии есть везде, на каждом холме или горе. То есть вариант трех городов, где одновременно делают ружья, в этом случае работает.

А теперь представим другой вариант. Во всей колонии есть лишь одно месторождение железной руды, из которой после ряда превращений (опускаю детали) изготавливают ружья. Создание параллельных оружейных мастерских в других городах бессмысленно из-за элементарной нехватки исходных материалов для производства. То есть оружие разумно изготавливать лишь в том городе, где есть основной материал для его производства.

В этом случае вариант "1 солдат = 1 ружье" уже не кажется таким уж неразумным.

Еще раз большое спасибо за помощь с ограничением строительства. Кстати, в том числе и для таких случаев это и задумывалось. Нет исходных материалов => ненужной оружейной мастерской => появляется свободное место, которое можно использовать для другого производственного здания.


Так истроится где основной материал, а Джеймс Медисон бонус дает +3 на здание, и не забывайте, что этот основной материал планируется быть не постоянным, получается руду полюбому завозить придется. Баланс ресурсов еще не раз обсуждать будем

NeseryozniyVET
11.05.2010, 20:06
Для обхода штормов кораблями, надо в файле CvGameCoreUtils.cpp в функции
int pathCost(FAStarNode* parent, FAStarNode* node, int data, const void* pointer, FAStar* finder) найти строчку
iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
и заменить ее на
iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage()));


Сделал общую вместимость склада. Изменения помечены //VET NewCapacity. В архиве есть инструкция.

kabjans
12.05.2010, 10:54
<div class='quotetop'>Цитата(NeseryozniyVET * 11.5.2010, 19:06) 335799</div>

Сделал общую вместимость склада. Изменения помечены //VET NewCapacity. В архиве есть инструкция.
[/b]
Большое спасибо, NeseryozniyVET! Файл скачал. Сейчас читаю твои комменты. Реально попробовать скомпилировать и посмотреть как действуют смогу в начале следующей недели. Сейчас я в поездке и до компа с игрой у меня отсюда доступа нет. Сегодня еще могу лишь читать (в Ворде) CvCity.cpp файл и писать на форуме. Завтра и до понедельника и такой возможности у меня уже не будет.

Итак, по складу.
Если просуммировать твои мысли по складу и то, что ты пишешь в файле, то получается такая картина.

<div class='quotetop'>Цитата</div>[quote]Для работы компонента надо в файле GlobalDefines.xml создать тэг NEW_CAPACITY со значением больше нуля

[code]

NeseryozniyVET
12.05.2010, 14:24
Тэг NEW_CAPACITY только включает новый алгоритм работы склада. Размер склада задается обычным способом. На складе хранятся все ресурсы, имеющие свойство bCargo = 1 (в XML), кроме еды. Если хочешь чтоб лошади и оружие хранилось на других складах, то прийдется создавать новый тэг ресурсу (тип ресурса) и зданию (тип хранимого ресурса). После этого можно будет создавать разные склады для разных ресурсов.


Корабль в шторм зайти сможет, но только если это будет единственый путь движения. А так будет старатся обходить их стороной.

kabjans
12.05.2010, 14:44
<div class='quotetop'>Цитата(NeseryozniyVET * 12.5.2010, 13:24) 335839</div>

Тэг NEW_CAPACITY только включает новый алгоритм работы склада. Размер склада задается обычным способом. На складе хранятся все ресурсы имеющие свойство bCargo = 1 (в XML), кроме еды. Если хочешь чтоб лошади и оружие хранилось на других складах, то прийдется создавать новый тэг ресурсу (тип ресурса) и зданию (тип хранимого ресурса). После этого можно будет создавать разные склады для разных ресурсов.


Корабль в шторм зайти сможет, но только если это будет единственый путь движения. А так будет старатся обходить их стороной.
[/b]
Свойство bCargo = 1 в CIV4YieldInfos.xml есть у всех ресурсов, кроме молотков, колоколов, крестов и книг (образование), то есть тех величин, что не отображаются на экране склада. Еда имеет bCargo = 1, но ее количество исключено из перегузки склада. Для нее идет свой счет.

Прочитав твой ответ, у меня мелькнула мысль исключить камни и древесину из списка хранимого на складе, задав им bCargo = 0. Трудно представить индейца, с3.14здевшего камень или бревно со склада европейца, но посмотрев повнимательнее на CIV4YieldInfos.xml, понял, что этот трюк вряд ли получится. Впрочим, это надо смотреть внимательнее на самой игре, а не на файлах...

Насчет корабля логику понял. В начале следующей недели скомпилирую и посмотрю, как изменится время "жизни" судна.

kabjans
19.05.2010, 10:34
<div class='quotetop'>Цитата(NeseryozniyVET * 11.5.2010, 19:06) 335799</div>

Для обхода штормов кораблями, надо в файле CvGameCoreUtils.cpp в функции
int pathCost(FAStarNode* parent, FAStarNode* node, int data, const void* pointer, FAStar* finder) найти строчку
iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage())) / GC.getMAX_HIT_POINTS();
и заменить ее на
iCost += (GC.getPATH_DAMAGE_WEIGHT() * std::max(0, GC.getFeatureInfo(pToPlot->getFeatureType()).getTurnDamage()));
[/b]
Добрался наконец-то до компа с игрой и скомпилировал новый CvGameCoreDLL.dll.

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

Вот результат:

Старый файл:
[code]

Vik9
19.05.2010, 11:15
kabjans, дождался тебя. "1492: Global Colonization. Resource Pack", по прежнему вылетает, думаю, что проблема в новых рассах, прикреплю файл, где игра вылетает( может у меня чет не впорядке), начал мод с пиратами, сыграл больше 200 ходов, работает стабильно, более того, он у меня на русском. Отправлять корабль из Европы на Запад или Восток, ты здорово придумал. Планируется ли обновление мода?

Vik9
19.05.2010, 11:29
Ошибка загрузки. У вас нет прав для загрузки файла с таким расширением.

Отправить файл не получается

kabjans
19.05.2010, 12:10
<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 10:15) 336389</div>

kabjans, дождался тебя. "1492: Global Colonization. Resource Pack", по прежнему вылетает, думаю, что проблема в новых рассах, прикреплю файл, где игра вылетает( может у меня чет не впорядке), начал мод с пиратами, сыграл больше 200 ходов, работает стабильно, более того, он у меня на русском.
[/b]
При массовом тестировании "1492: Global Colonization. Resource Pack" игроки действительно нашли несколько багов, где происходил вылет. Мне с ходу сложно сказать что конкретно у тебя происходит и из-за чего мод вылетает. Постарайся все же прислать сейв-файл, тогда можно попытаться найти причину. Возможно ты нашел еще один баг.

<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 10:15) 336389</div>

Отправлять корабль из Европы на Запад или Восток, ты здорово придумал. Планируется ли обновление мода?
[/b]
Это не я придумал. По-моему это впервые сделал koma13. Хотя я могу и ошибаться, поскольку слишком много информации и сложно запомнить кто какое улучшение ввел.

Над новой версией я работаю уже давно. Пару составных частей нового мода "1492: Global Colonization" уже в целом успешно прошли опробование. Это были "[MODCOMP] 1492: Reefs and Weather" и "[MODCOMP] Slavery Market. The Orient. Port-Royal". Мод я собираю с чистого листа, чтобы не было старых багов. Обкатку веду на DEBUG CvGameCoreDLL.dll, чтобы сразу видеть где и что не так. Так что работа над модом идет постоянно. Жаль только, что летние поездки никак отменить не удается. На следующей неделе опять исчезну на несколько дней.

Vik9
19.05.2010, 15:17
На форум файл скинуть не получается, могу попробовать в личку, если дашь адресс. А с кораблем здорово! Иногда генерирует карты, где у полюсов не проплывешь, я уж думал предложить раз в моде ход месяц(а не год), сделать, что б в летнее время льды оттаивали(исчезали), если это возможно. В моде реализована новая система обучения для юнитов, можно сделать и для пионеров?
Slavery Market обсуждалась возможность захвата судов пиратами, но и пиратов тоже захватывали, думаю такую опцию нужно давать всем военным кораблям.

kabjans
19.05.2010, 15:30
<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 14:17) 336406</div>

На форум файл скинуть не получается, могу попробовать в личку, если дашь адресс.
[/b]
Заархивируй свой файл WinRAR или WinZiP и залей его на любой файлообменник. Если я смогу зайти на него, то я его скачаю прямо сейчас и сообщу. Как вариант rapidshare.com (http://rapidshare.com). Нажимаешь Browse, выбираешь файл для залива и получаешь ссылку, которую выкладываешь здесь. Все просто.

<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 14:17) 336406</div>

А с кораблем здорово! Иногда генерирует карты, где у полюсов не проплывешь, я уж думал предложить раз в моде ход месяц(а не год), сделать, что б в летнее время льды оттаивали(исчезали), если это возможно. [/b]
В каком-то моде для Цивилизации были "плавающие" льды, а вот "тающих" по-моему не было нигде. С ходу трудно сказать возможно ли такое организовать. Льды у нас проходят как FEATURE и на данный момент к календарю вообще никак не привязаны. В принципе правильное предложение, но пока я не представляю с чего тут можно начать.

<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 14:17) 336406</div>

В моде реализована новая система обучения для юнитов, можно сделать и для пионеров?[/b]
Обучение взято из мода Кайлрика и возможности для обучения пионеров там точно на тот момент не было. Потом он правил свой мод, но ввел ли он туда обучение и для пионеров, я сказать пока не могу.

Немцы кстати сейчас сделали другой мод для обучения. Он так и называется "LbD - Learn by Doing". Открытых кодов сейчас нет и будут ли они доступны пока не ясно. Этот LbD мод - составная часть их большого ТАС мода. Когда выйдет следующая версия ТАС мода, то можно будет узнать насчет кодов у их главного модератора. В LbD вопрос обучения сделан по-другому.

<div class='quotetop'>Цитата(Vik9 * 19.5.2010, 14:17) 336406</div>

Slavery Market обсуждалась возможность захвата судов пиратами, но и пиратов тоже захватывали, думаю такую опцию нужно давать всем военным кораблям.
[/b]
До пиратской части я еще не добрался. На данный момент капер может лишь топить корабли соперников и захватывать груз и невооруженных пассажиров. Самого капера (фактически пирата) захватить невозможно, так как он является вооруженным юнитом, а значит гибнет в бою с военным кораблем.

Vik9
20.05.2010, 04:13
В архиве и сюда прикрепился. [attachmentid=6608]
kabjans, холмы ведь будут мало полезны, можно использовать их под высадку леса обычного и ценных пород, фермы наверное должны строить пионеры, а вот что там расти будет, сеют спецы( врач больницу ведь не строит), тогда опций в пионера поубавится, а то их много иногда промахиваюсь. Можно ль на полях с едой придумать мельницы, они б на клетку молотки прибавляли?
В "Mortally Dangerous Colonization. " звери появлялись посреди поля, не логично, ладно б с пустых клеток.

kabjans
21.05.2010, 10:15
<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475</div>

В архиве и сюда прикрепился. [attachmentid=6608] [/b]
ОК, файл скачал. Сегодня вечером посмотрю как именно происходит вылет и с чем это может быть связано.

<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475</div>

холмы ведь будут мало полезны, можно использовать их под высадку леса обычного и ценных пород[/b]
Холмы - прекрасные участки для животноводства (производство шерсти) и посадки виноградной лозы. Я по крайней мере их держу именно для этих целей. Сажать на них лес будет возможно.

<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475</div>

фермы наверное должны строить пионеры, а вот что там расти будет, сеют спецы( врач больницу ведь не строит), тогда опций в пионера поубавится, а то их много иногда промахиваюсь.[/b]
Насчет врача правильно, но остальное неверно. Пионер может расчистить участок для фермы, вырубив лес, проложить дорогу через данную клетку или построить обычную ("пищевую" ферму) на пищевом ресурсе (зерно, картофель и т.д.). Но строить специальные фермы - кофейные, чайные и т.д. - сможет только специалист данного профиля. Именно он сможет на ресурсной клетке посадить чайные кусты или кофейные деревья. Обычному пионеру эти функции должны быть недоступны.

Я по-моему уже писал, что в "1492: Global Colonization. Глобальная Колонизация. Resource Pack" масса опций по строительству улучшений были доступны пионеру. Это привело к тому, что комп тупо строил везде, где мог, фермы по самому дорогому товару, то есть по специям. Именно поэтому я и решил убрать эту опцию у пионера. Лишь специалист соответствующего профиля (к примеру чаевод и т.д.) сможет сажать чайные кусты и значит создавать чайную плантацию, на которой он будет работать. Таких специалистов надо сначала найти или обучить у аборигенов, а лишь потом они смогут реально что-то делать.

А при введении древа технологий из соответствующего мода Kailricа необходимо будет сначала изучить соответствующую науку. В данном случае (чай) местную флору (Native Flora).
<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475</div>

Можно ль на полях с едой придумать мельницы, они б на клетку молотки прибавляли?[/b]
В принципе прописать мельницам молотки не сложно. Но тут надо основательно подумать. Сейчас в игре молотки дает лишь плотник в городской мастерской. Именно этот специалист определяет производительность города. От него зависит как быстро будут построена городская инфраструктура. Делается это через параметр "молотки".

А что за "молотки" может дать мельница на поле с едой? Она дает прибавку по еде, это понятно. А молотки, это как?

<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475</div>

В "Mortally Dangerous Colonization. " звери появлялись посреди поля, не логично, ладно б с пустых клеток.[/b]
Тут два момента. Игра все-таки пошаговая. Поэтому звери появляются в начале хода. Сгенерились они именно на этой клетке или просто пришли на нее - не так уж и важно. Мы кстати это подчас и не видим. Во-вторых, клетка это только на карте "клетка". А на реальной местности этому соответствует большой участок местности. А что в реальности дикий зверь не может зайти на поле или на ферму? Тот же кабан, медведь или волк. Очень даже могут. В Индии до сих пор дикие слоны в местные деревушки наведываются.

Vik9
21.05.2010, 10:40
Про пионеров мы говорим об одном и томже но по разному. Мельницы еду не прибавляют, а ускоряют ее переработку, а как соотнести это к постройке зданий, я как то не подумал( уж больно хотелось, чтоб возле фермы что то крутилось).
Звери зайти могут, именно зайти, а не возникнуть в самом центре инфраструктуры, у меня медведь возник и вынес город 9, где и козак был и оружия вдосталь еще на троих, и никто не среагировал( досих пор понять не могу?), а когда приходят, то с окраины, его б раньше заметил.
Ига вылетает по разному, могу проиграть 20-30 ходов, а бывает на одном ходе дважды вылетит, в основном происходит, когда имею дело (юнит, рес., нация) не с оригинала). По краске и ладану комп выдает не спеца, а индейца, других попробую скажу.

Vik9
21.05.2010, 11:03
Как увеличить вместимость склада?

zombie_113
21.05.2010, 17:51
кстати... напомнили про животных...
таки если один юнит у нас это целый отряд (да не на один десяток человек), то один юнит животного это что? Ну ладно там с конями, и слонами понятно - табун, стадо и т.д.
Но медведи ходящие стадами? О_о
Все больше и больше возникает желание вводить кол-во для всех юнитов.

NeseryozniyVET
21.05.2010, 23:17
<div class='quotetop'>Цитата(Vik9 * 21.5.2010, 10:03) 336574</div>
Как увеличить вместимость склада?[/b]Assets\XML\Buildings\CIV4BuildingInfos.xml
iYieldStorage

kabjans
22.05.2010, 11:03
<div class='quotetop'>Цитата(kabjans * 21.5.2010, 9:15) 336567</div>

<div class='quotetop'>Цитата(Vik9 * 20.5.2010, 3:13) 336475

В архиве и сюда прикрепился. [attachmentid=6608] [/b]
ОК, файл скачал. Сегодня вечером посмотрю как именно происходит вылет и с чем это может быть связано.[/b][/quote]

А в чем собственно проблема? Файл скачал, без проблем запустил. По ходу дела драгуном захватил и разрушил Nya Stockholm, затем взял Анкару. Колонисты обучаются в городе и у аборигенов. Вылетов нет.

Есть лишь графические баги в СивПедии по профессиям, когда в разделе профессий показан неправильный юнит. В игре же появляется именно нужный юнит. Этот баг чисто СивПедии. Kailric уже нашел, как его исправить. Я специально проверял и все работает. В той версии, что я сейчас собираю, его не будет.

Второй графический баг связан с искажениями текста в СивПедии и значков promotions у солдата. Связано это с особеностями GameFont.tga и GameFont75.tga файлов. Я нашел графический способ для исправления и сейчас этот баг тоже устранен. Должно быть и программное решение этой проблемы, но с GameFont файлами традиционно масса проблем еще со времен Цивилизации, поэтому этого решения пока нет.

Vik9
22.05.2010, 19:35
Оригинальную лицензию по Колонизации не нашел, купил лицензионную обновленную, на ней Slavery Market идет идеально, а Global Colonization вылетал после окончания хода, нашел на форуме патч CIV4Col_Rus_1_01_1b, пропатчилась, игра стала англоязычной но пошла. Вылеты происходят по разному: построил ценную древесину и поставил колониста, через какоето? кол-во ходов онпревратился в лесника( а я ее лесорубами раньше собирал). Но когда я захотел лесника из города вывести как пионера игра вылетела, раза 4 пробовал нивкакую, оставил его в покое.

Vik9
22.05.2010, 21:15
Я тебе походу не тот файл скинул, после пропатчивания начал новую игру и его перепрописал( там с турком встретился). Сохраняться после каждого хода вошло в привычку.
Как насчет прокачки торговых судов? В бою им выйти победителем шансов мало, навигацию прокачивать по кол-ву заходов в Европу, или от общего пробега по карте?

NeseryozniyVET спасибо, что то подредактировал но похоже игру надо по новой начинать?
<iYieldStorage>50</iYieldStorage> если я правильно понял, то редактируется эта строка?

kabjans
24.05.2010, 09:47
<div class='quotetop'>Цитата(Vik9 * 22.5.2010, 20:15) 336740</div>

Как насчет прокачки торговых судов? В бою им выйти победителем шансов мало, навигацию прокачивать по кол-ву заходов в Европу, или от общего пробега по карте?[/b]
Специальной прокачки торговых судов как таковой в игре нет. Если торговое судно смогло выжить в схватке с капером, то оно получает соответствующие бонусы и может прокачать либо навигацию, либо что-то другое.

Выжить в схватке с пиратом шансов больше у более мощных судов, типа MERCHANTMAN или галеона. У меня при атаке на на них пираты где-то примерно с 25-33% вероятностью могут либо погибнуть, либо отступить. У слабенькой каравеллы шансов практически нет никаких.

zombie_113
25.05.2010, 09:45
<div class='quotetop'>Цитата(ZoMbiE_113 * 21.5.2010, 16:51) 336643</div>

кстати... напомнили про животных...
таки если один юнит у нас это целый отряд (да не на один десяток человек), то один юнит животного это что? Ну ладно там с конями, и слонами понятно - табун, стадо и т.д.
Но медведи ходящие стадами? О_о
Все больше и больше возникает желание вводить кол-во для всех юнитов.
[/b]
Мда... я вот только думал над идеей, а люди ее уже реализовали... =)
В моде [MOD] The Spread of Imperialism вроде как уже есть кол-во для юнитов... глядеть тут (http://forums.civfanatics.com/showpost.php?p=9029046&postcount=42)

Vik9
25.05.2010, 15:10
<div class='quotetop'>Цитата(kabjans * 24.5.2010, 8:47) 336850</div>

<div class='quotetop'>Цитата(Vik9 * 22.5.2010, 20:15) 336740

Как насчет прокачки торговых судов? В бою им выйти победителем шансов мало, навигацию прокачивать по кол-ву заходов в Европу, или от общего пробега по карте?[/b]
Специальной прокачки торговых судов как таковой в игре нет. Если торговое судно смогло выжить в схватке с капером, то оно получает соответствующие бонусы и может прокачать либо навигацию, либо что-то другое.

Выжить в схватке с пиратом шансов больше у более мощных судов, типа MERCHANTMAN или галеона. У меня при атаке на на них пираты где-то примерно с 25-33% вероятностью могут либо погибнуть, либо отступить. У слабенькой каравеллы шансов практически нет никаких.
[/b][/quote]

Я это понимаю, вопрос можно ль в принципе навигацию прокачивать по другому?
Установил игру на Win 7x64, идет супер, но с лесником таже проблема, лесник не завезенный с Европы а обученный в городе, пионером выходить не хочет(игра вылетает)

Vik9
25.05.2010, 15:26
<div class='quotetop'>Цитата(ZoMbiE_113 * 25.5.2010, 8:45) 336893</div>

<div class='quotetop'>Цитата(ZoMbiE_113 * 21.5.2010, 16:51) 336643

кстати... напомнили про животных...
таки если один юнит у нас это целый отряд (да не на один десяток человек), то один юнит животного это что? Ну ладно там с конями, и слонами понятно - табун, стадо и т.д.
Но медведи ходящие стадами? О_о
Все больше и больше возникает желание вводить кол-во для всех юнитов.
[/b]
Мда... я вот только думал над идеей, а люди ее уже реализовали... =)
В моде [MOD] The Spread of Imperialism вроде как уже есть кол-во для юнитов... глядеть тут (http://forums.civfanatics.com/showpost.php?p=9029046&postcount=42)
[/b][/quote]

А по русски объяснить?, а то скартинки не понял город-2, и 2 своб.колониста, если одного разделили, то город попрежнему один должен быть. Ввести колличество юнитов правильнее, но возникает много вопросов, на которые нету однозначного ответа. Для каждого производства можно назначить кол-во и принять за аксиому, но предположим 1 свободный колонист-100чел. При накоплении еды- город будет сколько выдавать?
1 солдат ветеран (100чел.) потерял вбою 70% лич.сост., я его дополнил за счет свободного колониста, какой юнит получился?

zombie_113
26.05.2010, 11:23
<div class='quotetop'>Цитата(Vik9 * 25.5.2010, 14:26) 336927</div>

А по русски объяснить?, а то скартинки не понял город-2, и 2 своб.колониста, если одного разделили, то город попрежнему один должен быть. Ввести колличество юнитов правильнее, но возникает много вопросов, на которые нету однозначного ответа. Для каждого производства можно назначить кол-во и принять за аксиому, но предположим 1 свободный колонист-100чел. При накоплении еды- город будет сколько выдавать?
1 солдат ветеран (100чел.) потерял вбою 70% лич.сост., я его дополнил за счет свободного колониста, какой юнит получился?
[/b]
Ну не знаю как тама реализовано. Особо не вчитывался, да там и объяснений не шибко много.
Но как бы это делал я...
Для наглядности примера будем считать, что один юнит - это 100 человек. Т.е. размер города 5 означает что в колонии 500 человек.
Как город растет в оригинальной игре? В оригинале город рост скачками. Роста не было, не было, не было, а потом раз и за ход (месяц???) в городе родилось сотня человек (город вырос на единицу).
При введении кол-ва людей рост города будет более плавным. Выглядеть это будет как постоянный прирост населения. К примеру вся еда уходящая в плюс будет давать плюсы к размерам свободных колонистов. К примеру... за каждые две еды в плюс, размер одного свободного колониста будет увеличиваться на один. Пока свободный колонист не наберет некоторую критическую массу. Ну к примеру 125 человек. Тогда этот свободный колонист разделится на два, один в 100 человек, а второй в 25. Добавить возможность добирать население для одного какого-то профессионального юнита в спец строении. Так если проф. юнит не полный, то оставлять его в специальном строении (биржа труда? казармы? ну что-то типа) и тогда весь прирост населения будет в первую очередь идти именно этому юниту.
Насчет прокачек. Оставить как есть. Т.е. не полный отряд (юнит) будет сравним с раненым, поэтому все прокачки и сила будут действовать пропорционально кол-ву юнитов в отряде. При добавления же населения к спец. юнитам считаем, что они автоматом обучаются у ветеранов. Не зря же нужно спец. строение, в котором будет увеличиваться размер профессиональных юнитов, они там не только добавляются а еще и обучаются нужному ремеслу.
Обобщим. Свободные колонисты появляются и растут сами по себе от еды. Профессиональные юниты для роста должны находится в специальном строении (может быть функционал школы заменить? А что так даже интереснее). При чем, можно ввести разное кол-во еды необходимое для роста различных профессий тем самым управляя скоростью "обучения" различных юнитов.
Размер города можно вычислять из общего кол-ва населения деленного на кол-во человек в одном полном отряде. Т.е. в нашем примере город с населением 854 человека будет иметь размер 8.
Вот примерно так...

Stariy Potz
28.05.2010, 10:38
Всем добрый день!

Вчера скачал ваш мод и столкнулся с той же проблемой, что сталкивались многие до меня. В окне Европы нет кнопки торговли. Я перечитал всю тему, согласно вашему совету изменил указанную строку в файле CvEuropeScreen.py на BOX_HEIGHT = self.YResolution * 2 / 27. Это ничего не дало, товары остались в одну строку и кнопки все так же нет... У меня ноут с разрешением экрана 1366х768, то же разрешение установлено в игре. Остальные моды идут без проблем, та же Terra Incognita. Да, система - Windows 7. Игра - локализация от 1С. Играть без этой кнопки невозможно, а очень хочется - в вашем чудном моде реализовано столько всего интересного из того, что мне не хватало. Может кто-нибудь все же подскажет выход?

Еще один вопрос. Когда ожидать обновления мода? А то в первом сообщении, насколько я понял, самая первая версия, без всех обсуждавшихся тут изменений. Так ли это?

Да, вспомнил еще кое-что, извиняюсь, что спрашиваю здесь. Есть интересный мод, AgeOfDiscoveryII, но там не расширен радиус города, а с малым мне играть неинтересно. Никто не подскажет, что и где нужно изменить, чтобы расширить в этом моде радиус города?

NeseryozniyVET
28.05.2010, 13:29
Зайди сюда http://www.civfanatics.ru/forum/index.php?showtopic=10896 и скачай файл CvEuropeScreen. Разархивируй и полученый CvEuropeScreen.py закинь в Mods\1492 Global Colonization\Assets\Python\Screens с заменой файлов.

Радиус города изменить несможешь.

Эйрик
28.05.2010, 20:25
<div class='quotetop'>Цитата(Stariy Potz * 28.5.2010, 10:38) 337127</div>

Есть интересный мод, AgeOfDiscoveryII, но там не расширен радиус города, а с малым мне играть неинтересно. Никто не подскажет, что и где нужно изменить, чтобы расширить в этом моде радиус города?[/b]
http://www.civfanatics.ru/forum/index.php?showtopic=8991

Stariy Potz
30.05.2010, 10:16
<div class='quotetop'>Цитата(NeseryozniyVET * 28.5.2010, 13:29) 337164</div>

Зайди сюда http://www.civfanatics.ru/forum/index.php?showtopic=10896 и скачай файл CvEuropeScreen. Разархивируй и полученый CvEuropeScreen.py закинь в Mods\1492 Global Colonization\Assets\Python\Screens с заменой файлов[/b]

Большое спасибо! Заработало.

zombie_113
31.05.2010, 09:17
<div class='quotetop'>Цитата(NeseryozniyVET * 28.5.2010, 12:29) 337164</div>

Радиус города изменить несможешь.
[/b]
О_о а чего он не сможет? Это ж не трудно, добавить в мод функционал другого минимода. Тем более, что там не много кода и он с каментами.
Я для AgeOfDiscoveryII делал радиус города на две клетки. Заняло это буквально минут 20 времени.

Хотя... если не программист, то дааа... будет довольно сложно =)

NeseryozniyVET
31.05.2010, 14:52
<div class='quotetop'>Цитата(ZoMbiE_113 * 31.5.2010, 8:17) 337327</div>
Хотя... если не программист, то дааа... будет довольно сложно =)[/b]Для этого в первую очередь надо иметь кампилятор, которого у него, скорей всего, нету.

kabjans
01.06.2010, 22:39
В каких модах Цивилизации есть исчерпаемые ресурсы? Я уже перерыл кучу модов и нашел их только в WoC 1.2. Но это очень сложный по структуре мод. Исчерпаемые ресурсы там завязаны в одном пакете с торговлей ресурсами, плюс масса особенностей конкретно данного мода. Короче нужен другой вариант.

Никто не подскажет где еще есть исчерпаемые ресурсы?

Эйрик
02.06.2010, 13:30
<div class='quotetop'>Цитата(kabjans * 1.6.2010, 22:39) 337444</div>

В каких модах Цивилизации есть исчерпаемые ресурсы? Я уже перерыл кучу модов и нашел их только в WoC 1.2. Но это очень сложный по структуре мод. Исчерпаемые ресурсы там завязаны в одном пакете с торговлей ресурсами, плюс масса особенностей конкретно данного мода. Короче нужен другой вариант.

Никто не подскажет где еще есть исчерпаемые ресурсы?
[/b]
В ModernStandartе v.4.18 (http://www.civfanatics.ru/forum/index.php?showtopic=8875&st=50)

kabjans
02.06.2010, 16:41
<div class='quotetop'>Цитата(Эйрик * 2.6.2010, 12:30) 337479</div>

<div class='quotetop'>Цитата(kabjans * 1.6.2010, 22:39) 337444

В каких модах Цивилизации есть исчерпаемые ресурсы? Я уже перерыл кучу модов и нашел их только в WoC 1.2. Но это очень сложный по структуре мод. Исчерпаемые ресурсы там завязаны в одном пакете с торговлей ресурсами, плюс масса особенностей конкретно данного мода. Короче нужен другой вариант.

Никто не подскажет где еще есть исчерпаемые ресурсы?
[/b]
В ModernStandartе v.4.18 (http://www.civfanatics.ru/forum/index.php?showtopic=8875&st=50)
[/b][/quote]
Спасибо, сейчас скачаю и посмотрю как там это сделано.

Дополнено 03.06.2010:

Мод скачал, установил, могу загрузить и читать СивПедию, но при запуске собственно игры постоянно идет вылет в Винду. В чем причина - **. Поэтому посмотрел лишь xml файлы, в частности CIV4BonusInfos.xml. Там действительно для минеральных ресурсов есть два новых тега

[code]

NeseryozniyVET
03.06.2010, 14:49
Вышли файлы CvPlot.h и CvPlot.cpp

Эйрик
03.06.2010, 15:35
<div class='quotetop'>Цитата(kabjans * 2.6.2010, 16:41) 337490</div>

Мод скачал, установил, могу загрузить и читать СивПедию, но при запуске собственно игры постоянно идет вылет в Винду.

Но как дальше к примеру накопленная медь используется - непонятно. Мод у меня почему-то не работает, а по xml файлам я концов пока не отыскал.[/b]
Мод загружается, но через несколько ходов вылетает :(

Для постройки юнитов в моде требуется определённое количество ресурса.
Прописано в Civ4UnitInfos: <iNeedRes> и <iCargoRes>.

kabjans
03.06.2010, 15:56
<div class='quotetop'>Цитата(NeseryozniyVET * 3.6.2010, 13:49) 337577</div>

Вышли файлы CvPlot.h и CvPlot.cpp
[/b]
Вот CvPlot.h и CvPlot.cpp из Civ4Col с патчем 1.01f.
[attachmentid=6654]

<div class='quotetop'>Цитата(Эйрик * 3.6.2010, 14:35) 337578</div>

<div class='quotetop'>Цитата(kabjans * 2.6.2010, 16:41) 337490

Мод скачал, установил, могу загрузить и читать СивПедию, но при запуске собственно игры постоянно идет вылет в Винду.

Но как дальше к примеру накопленная медь используется - непонятно. Мод у меня почему-то не работает, а по xml файлам я концов пока не отыскал.[/b]
Мод загружается, но через несколько ходов вылетает :(

Для постройки юнитов в моде требуется определённое количество ресурса.
Прописано в Civ4UnitInfos: <iNeedRes> и <iCargoRes>.
[/b][/quote]
Именно вылетает, поэтому изучаю его по файлам. Если с <iNeedRes> вроде понятно, то вот <iCargoRes> это случайно не сколько юнит может перевозить?

Тут выше в этой теме уже поднимался вопрос о грузоподъемности (транспорта, склада) или что тоже самое о весе перевозимого (хранимого) груза. То есть 300 единиц серебра не должны быть равны по весу 300 единицам табака. Пока они равны, а в ModernStandartе, если я правильно интерпретирую тег <iCargoRes>, эти ресурсы вероятно не равны. Правильно?

Эйрик
04.06.2010, 14:32
<div class='quotetop'>Цитата(kabjans * 3.6.2010, 15:56) 337581</div>

То есть 300 единиц серебра не должны быть равны по весу 300 единицам табака. Пока они равны, а в ModernStandartе, если я правильно интерпретирую тег <iCargoRes>, эти ресурсы вероятно не равны. Правильно?[/b]
В ModernStandartе количество ресурсов определяется не единицами, а килограммами.
300 единиц серебра не равны по весу 300 единицам табака, а 300 килограммов серебра равны 300 килограммам табака.
<iCargoRes> - это скорее всего сколько кг любого ресурса может перевозить юнит.

kabjans
04.06.2010, 16:03
<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631</div>

<div class='quotetop'>Цитата(kabjans * 3.6.2010, 15:56) 337581

То есть 300 единиц серебра не должны быть равны по весу 300 единицам табака. Пока они равны, а в ModernStandartе, если я правильно интерпретирую тег <iCargoRes>, эти ресурсы вероятно не равны. Правильно?[/b]
В ModernStandartе количество ресурсов определяется не единицами, а килограммами.
300 единиц серебра не равны по весу 300 единицам табака, а 300 килограммов серебра равны 300 килограммам табака.
<iCargoRes> - это скорее всего сколько кг любого ресурса может перевозить юнит.
[/b][/quote]
Спасибо, Эйрик за пояснения. В Колонизации счет идет на единицы товара, а что это конкретно - килограмм или штука, никто не знает. Плюс еще один ньюанс - это оружие, которое одному юниту надо аж 150 штук. То есть юнит - это не просто одна голова, а целый отряд. По инструментам, кстати то же самое.

Но если
<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631</div>

В ModernStandartе количество ресурсов определяется не единицами, а килограммами.
300 единиц серебра не равны по весу 300 единицам табака, а 300 килограммов серебра равны 300 килограммам табака.[/b]
Возможно, но мне все же кажется, что речь скорее всего идет об ячейках на телеге. Именно в ячейке условие "300 килограммов серебра равны 300 килограммам табака" выполняется. На практике это означает, что телега с друмя пустыми ячейками может перевозить лишь два типа товара. Либо тяжелого, либо легкого. Именно так сделано в Колонизации.

А если бы <iCargoRes> действительно относилось в весу, то на телегу грузоподъемностью 300 кг можно было бы загрузить массу самых разных товаров по несколько килограмм весом каждого, но так чтобы суммарный вес был меньше 300 кг. Я было подумал, что именно такой вариант реализован в ModernStandartе.

<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631</div>

<iCargoRes> - это скорее всего сколько кг любого ресурса может перевозить юнит.
[/b]
Если я правильно понимаю, то речь идет об этих двух юнитах: UNIT_VEHICLE и UNIT_LORRY. Именно на них действуют команды COMMAND_LOADRES и COMMAND_UNLOADRES. Другими словами повозка и грузовик могут загружать, перевозить и разгружать ресурсы.

Это кстати очень ценная вещь может оказаться. На вскидку приходят два варианта использования:

- сухопутный, когда к примеру камнетес посылается заготавливать камень в горную местность. В придачу ему дается телега. Камнетес выдает "на гора" по 6 камней за ход, которые складируются на этой же клетке. Их можно загрузить (команда COMMAND_LOADRES) на телегу (UNIT_VEHICLE), отвезти в город, где обычным образом разгрузить и вернуться за следующей партией камней.

- морской, когда в шторм тонет судно с товарами. Если разделить товары на две группы, одна, которые тонут - оружие, руда, инструменты и вторая - плавающие (пусть несколько ходов) типа древесина, табак, хлопок, то тогда любой корабль может подобрать с поверхности моря плавающий груз, выполнив команду COMMAND_LOADRES.

Очень интересно могло бы получиться, если по юнитам и командам рассуждения правильные.

NeseryozniyVET
04.06.2010, 17:45
Основные коды написал, а мелочовку, думаю, сам сможешь сделать.

В файлах CIV4BonusInfos.xml и CIV4TerrainSchema.xml создай 2 тэга iMinAmount и iMaxAmount под тегом iGroupRand. И сделай все по аналогии с последним. В файлах Infos.h и Infos.cpp аналогично.

В файле CvGameTextMgr.cpp зделай следующее:
В функции void CvGameTextMgr::setPlotHelp(CvWStringBuffer& szString, CvPlot* pPlot) найди[code]

kabjans
04.06.2010, 19:23
Большое спасибо, скачал. Вечером попробую скомпилировать dll.

kabjans
05.06.2010, 14:09
Файлы CvPlot.cpp и CvPlot.h скопировал в CvGameCoreDLL директорию и ничего в них не изменял.
Сделал необходимые добавления в Infos.h, Infos.cpp и CvGameTextMgr.cpp.

После этого начал уомпиляцию, но на CvPlot.cpp процесс застопорился. Вот лог ошибки.

<div class='quotetop'>Цитата</div>
-------------- Build: Final Release Win32 in CvGameCoreDLL ---------------

CvArea.cpp
CvArtFileMgr.cpp
CvCity.cpp
CvCityAI.cpp
CvDLLButtonPopup.cpp
CvDLLEntity.cpp
CvDLLPython.cpp
CvDLLWidgetData.cpp
CvDeal.cpp
CvDiploParameters.cpp
CvFractal.cpp
CvGame.cpp
CvGameAI.cpp
CvGameCoreDLL.cpp
CvGameCoreUtils.cpp
CvGameTextMgr.cpp
CvGlobals.cpp
CvHallOfFameInfo.cpp
CvInfoWater.cpp
CvInfos.cpp
CvInitCore.cpp
CvMap.cpp
CvMapGenerator.cpp
CvPlayer.cpp
CvPlayerAI.cpp
CvPlot.cpp
CvPlot.cpp(316) : error C2440: &#39;initializing&#39; : cannot convert from &#39;short&#39; to &#39;BonusTypes&#39;
Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
CvPlot.cpp(320) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(320) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(320) : error C2296: &#39;>&#39; : illegal, left operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(320) : error C2297: &#39;>&#39; : illegal, right operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(343) : error C2059: syntax error : &#39;)&#39;
CvPlot.cpp(4286) : error C2664: &#39;CvBonusInfo &CvGlobals::getBonusInfo(BonusTypes)&#39; : cannot convert parameter 1 from &#39;short&#39; to &#39;BonusTypes&#39;
Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
CvPlot.cpp(4328) : error C2511: &#39;void CvPlot::setAmount(int) const&#39; : overloaded member function not found in &#39;CvPlot&#39;
c:\Program Files\2K Games\1492 GC Resources\CvGameCoreDLL\CvPlot.h(31) : see declaration of &#39;CvPlot&#39;
CvPlot.cpp(4772) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4772) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4772) : error C2296: &#39;>&#39; : illegal, left operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(4772) : error C2297: &#39;>&#39; : illegal, right operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(4781) : error C2143: syntax error : missing &#39;;&#39; before &#39;}&#39;
CvPlot.cpp(4793) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4793) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4793) : error C2296: &#39;>&#39; : illegal, left operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(4793) : error C2297: &#39;>&#39; : illegal, right operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(4802) : error C2143: syntax error : missing &#39;;&#39; before &#39;}&#39;
CvPlot.cpp(4919) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4919) : error C2475: &#39;CvBonusInfo::getMaxAmount&#39; : forming a pointer-to-member requires explicit use of the address-of operator (&#39;&&#39;) and a qualified name
CvPlot.cpp(4919) : error C2296: &#39;>&#39; : illegal, left operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
CvPlot.cpp(4919) : error C2297: &#39;>&#39; : illegal, right operand has type &#39;int (__thiscall CvBonusInfo::* )(void) const&#39;
Process terminated with status 2 (2 minutes, 34 seconds)
22 errors, 0 warnings[/b]

NeseryozniyVET
05.06.2010, 15:43
Можешь выслать весь SDK от колонизации? Думаю так быстрей будет, чем постоянные переписки.

kabjans
05.06.2010, 17:24
<div class='quotetop'>Цитата(NeseryozniyVET * 5.6.2010, 14:43) 337724</div>

Можешь выслать весь SDK от колонизации? Думаю так быстрей будет, чем постоянные переписки.
[/b]
Весь SDK от Колонизации (4.8.Mb):http://rghost.net/1807473
Только cpp и h файлы из CvGameCoreDLL (0.7 Mb):http://rghost.net/1807505
5 измененных файлов, которые я использовал при компиляции (0.1 Mb): http://rghost.net/1807520

NeseryozniyVET
05.06.2010, 23:02
Сделал.

Исправил ошибку в //KJ: City development в CvCity.cpp

kabjans
05.06.2010, 23:33
<div class='quotetop'>Цитата(NeseryozniyVET * 5.6.2010, 22:02) 337743</div>

Сделал.
[/b]
Большое спасибо, NeseryozniyVET! Сейчас все скомпилировалось без ошибок. Теперь можно собирать мод и пробовать как он будет работать.

Папа
06.06.2010, 00:25
Приятно, когда люди идут на встречу друг-другу :)
Вообще, часто встречается взаимовыручка - и это здорово!
(просто захотелось сказать хорошие слова)

NeseryozniyVET
06.06.2010, 00:53
<div class='quotetop'>Цитата(kabjans * 5.6.2010, 22:33) 337750</div>
Теперь можно собирать мод и пробовать как он будет работать.[/b]Забыл объяснить что такое MinAmount и MaxAmount. Минимальный и максимальний запас ресурсов в месторождении. При установке месторождения ресурсов устанавливается случайное число между этими пределами.
Если MaxAmount больше нуля ресурс исчерпаем, в противном случае неисчерпаем.

kabjans
06.06.2010, 01:05
Странно....

Скомпилировал CvGameCoreDLL.dll файл без единой ошибки.
Затем собрал минимод, который включал лишь пару файлов: CIV4TerrainSchema.xml и CIV4BonusInfos.xml.
В обоих из них я прописал необходимые теги.
В CIV4TerrainSchema.xml эти

[code]

Vik9
06.06.2010, 01:10
<div class='quotetop'>Цитата(kabjans * 4.6.2010, 15:03) 337642</div>

<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631

<div class='quotetop'>Цитата(kabjans * 3.6.2010, 15:56) 337581

То есть 300 единиц серебра не должны быть равны по весу 300 единицам табака. Пока они равны, а в ModernStandartе, если я правильно интерпретирую тег <iCargoRes>, эти ресурсы вероятно не равны. Правильно?[/b]
В ModernStandartе количество ресурсов определяется не единицами, а килограммами.
300 единиц серебра не равны по весу 300 единицам табака, а 300 килограммов серебра равны 300 килограммам табака.
<iCargoRes> - это скорее всего сколько кг любого ресурса может перевозить юнит.
[/b][/quote]
Спасибо, Эйрик за пояснения. В Колонизации счет идет на единицы товара, а что это конкретно - килограмм или штука, никто не знает. Плюс еще один ньюанс - это оружие, которое одному юниту надо аж 150 штук. То есть юнит - это не просто одна голова, а целый отряд. По инструментам, кстати то же самое.

Но если
<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631</div>

В ModernStandartе количество ресурсов определяется не единицами, а килограммами.
300 единиц серебра не равны по весу 300 единицам табака, а 300 килограммов серебра равны 300 килограммам табака.[/b]
Возможно, но мне все же кажется, что речь скорее всего идет об ячейках на телеге. Именно в ячейке условие "300 килограммов серебра равны 300 килограммам табака" выполняется. На практике это означает, что телега с друмя пустыми ячейками может перевозить лишь два типа товара. Либо тяжелого, либо легкого. Именно так сделано в Колонизации.

А если бы <iCargoRes> действительно относилось в весу, то на телегу грузоподъемностью 300 кг можно было бы загрузить массу самых разных товаров по несколько килограмм весом каждого, но так чтобы суммарный вес был меньше 300 кг. Я было подумал, что именно такой вариант реализован в ModernStandartе.

<div class='quotetop'>Цитата(Эйрик * 4.6.2010, 13:32) 337631</div>

<iCargoRes> - это скорее всего сколько кг любого ресурса может перевозить юнит.
[/b]
Если я правильно понимаю, то речь идет об этих двух юнитах: UNIT_VEHICLE и UNIT_LORRY. Именно на них действуют команды COMMAND_LOADRES и COMMAND_UNLOADRES. Другими словами повозка и грузовик могут загружать, перевозить и разгружать ресурсы.

Это кстати очень ценная вещь может оказаться. На вскидку приходят два варианта использования:

- сухопутный, когда к примеру камнетес посылается заготавливать камень в горную местность. В придачу ему дается телега. Камнетес выдает "на гора" по 6 камней за ход, которые складируются на этой же клетке. Их можно загрузить (команда COMMAND_LOADRES) на телегу (UNIT_VEHICLE), отвезти в город, где обычным образом разгрузить и вернуться за следующей партией камней.

- морской, когда в шторм тонет судно с товарами. Если разделить товары на две группы, одна, которые тонут - оружие, руда, инструменты и вторая - плавающие (пусть несколько ходов) типа древесина, табак, хлопок, то тогда любой корабль может подобрать с поверхности моря плавающий груз, выполнив команду COMMAND_LOADRES.

Очень интересно могло бы получиться, если по юнитам и командам рассуждения правильные.
[/b][/quote]

Хотел предложить сделать шахту за пределами колонии типа города на одну клетку, где склад будет на 2 ячейки: в одной добываемый ресурс, в другой оружие( шахтера можно отправить вооруженным и в случае нападения на шахту он будет защищаться), но смотрю у вас идеи получше вырисовываются.
В новом моде, я бы сделал просто шахтеров и камнетесов, шахтерам ведь все равно, какую породу добывать(куда Родина пошлет), а с переобучением хлопот меньше.

NeseryozniyVET
06.06.2010, 03:08
:shock: :shock: :shock:
А у меня все работает. :blabla:
Правда в файле CvInfos.cpp надо[code]// VET AmountResourses - begin 5/5

kabjans
06.06.2010, 12:07
Исправил CvInfos.cpp и заменил CvCity.cpp на оригинальный файл. Скомпилировал final DEBUG CvGameCoreDLL.dll. Без проблем запустил мод и начал игру. Все заработало!

Вот серия снимков с пояснениями.

Turn 1.

Месторождение серебра. Запас серебра 35. Обратите внимание на наличие значка, указывающего на наличие месторождения серебра.

http://img688.imageshack.us/img688/8843/turn1.th.jpg (http://img688.imageshack.us/img688/8843/turn1.jpg)

Ставим рядом с ним шахтера и основываем город. Добыча серебра за ход 6 единиц.

http://img156.imageshack.us/img156/9756/turn1incity.th.jpg (http://img156.imageshack.us/img156/9756/turn1incity.jpg)

Turn 2.

За ход действительно добыто 6 единиц серебра. Оставшее количество серебра 35 - 6 = 29

http://img22.imageshack.us/img22/8307/turn2i.th.jpg (http://img22.imageshack.us/img22/8307/turn2i.jpg)

Продолжаем добычу несколько ходов до полного исчерпания серебряного месторождения.

Turn 7.

Месторождение все выработано. Значок серебра с карты исчез.

http://img340.imageshack.us/img340/3913/turn7.th.jpg (http://img340.imageshack.us/img340/3913/turn7.jpg)

Теперь смотрим, что у нас есть в городе.

http://img263.imageshack.us/img263/2988/errorjj.th.jpg (http://img263.imageshack.us/img263/2988/errorjj.jpg)

Добыто 36 единиц серебра, а должно быть 35. Это ошибка, поскольку программа наверняка считала так: (6 единиц за ход) х 6 ходов = 36.
В принципе не критично, поскольку в реальной игре количество ресурса в месторождении будет на порядки больше и игрок просто не заметит разницы в несколько единиц.

Большое спасибо, NeseryozniyVET! Здорово у тебя сделано, даже лучше, чем в WoC. На экране сразу видно сколько руды осталось в данном месторождении.

Теперь важно задать правильные iMinAmount и iMaxAmount, чтобы с одной стороны месторождения минерального сырья были исчерпаемыми, а с другой стороны не заканчивались очень быстро.

В версии мода "1492", что я сейчас собираю, все минеральные ресурсы распределены только по месторождениям. Уже нельзя добывать железную руду на каждом холме или горе. Только в месторождении. Именно поэтому правильный баланс между iMinAmount и iMaxAmount тут особенно важен.

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

Или еще лучше разделить их функции. Разведчик может найти только небольшие по размерам рассыпи золота (в природе оно встречается "рассыпным" по берегам рек, а не только в рудах), и заметить его разведчик совершенно спокойно может. Приехавший же из Европы (или купленный) геолог может открыть намного более богатые рудные месторождения железной руды, серебра и золота.

В общем, очень интересно и главное совершенно реалистично может получиться....

romello
06.06.2010, 15:18
Всем привет! Смотрю пока я здесь отсутствовал, очень много новых идей возникло, а одна уже почти реализована.
Пока инета не было рубился все в ту же Terra Incognita, а вчера нашел несколько интересных порталов об истории географических открытий и исследовании Америки, Карибского бассейна, морских экспедиций.
Может стоит ввести линейку лидеров мореплавания?
Все-таки колонизация напрямую связана с великими морскими открытиями и прокачки мирных судов будут не лишними, а скорее даже правильными.

kabjans
06.06.2010, 17:41
<div class='quotetop'>Цитата(NeseryozniyVET * 6.6.2010, 2:08) 337769</div>

Вылажую готовый мод. Исчерпаемые железо и серебро.
[/b]
Попробовал два мини-мода. Тот, что я собрал сам и тот, что ты выложил в сообщении №303. Я его только что скачал и сравнил со своей сборкой.

По серебру все почти правильно за исключением маленькой разницы в количестве добытого ресурса. В обоих модах одно и то же. Детали я описал в предыдущем сообщении.

Для правильной работы твоего мода я удалил из GlobalDefinesAlt.xml все лишнее, оставив лишь эти строки:
[code]

NeseryozniyVET
06.06.2010, 18:34
Все правильно. За холм дается 4 руды, за ресурс -- 2, от шахтера 100%. Итого 8 + 4 = 12. Забирае6тся только бонус от ресурса. Это сделано для того чтоб от наличия ресурса всегда бил положительный эффект. Иначе когда в залежах останется 1 ед ресурса тайл будет давать 1 с ресурсом (без ресурса 4), а так тайл будет давать 4 + 1 = 5.
Замеченый баг уже исправил, прада появился второй :boo: .

kabjans
06.06.2010, 18:59
<div class='quotetop'>Цитата(NeseryozniyVET * 6.6.2010, 17:34) 337818</div>

Все правильно. За холм дается 4 руды, за ресурс -- 2, от шахтера 100%. Итого 8 + 4 = 12. Забирае6тся только бонус от ресурса. Это сделано для того чтоб от наличия ресурса всегда бил положительный эффект. Иначе когда в залежах останется 1 ед ресурса тайл будет давать 1 с ресурсом (без ресурса 4), а так тайл будет давать 4 + 1 = 5.
Замеченый баг уже исправил, прада появился второй :boo: .
[/b]
Возможно, ты и правильно считаешь. Но мне казалось куда логичнее такая система.

Ресурс месторождения 100 единиц.
Их может добывать кто угодно, но только 100 единиц и ни больше.

И почему "забирается только бонус от ресурса"? Из месторождения добывается за ход ровно столько, сколько может добыть данный юнит. Шахтер добывает на 100% больше, чем колонист. Но это значит, что у него месторождение иссякнет в 2 раза быстрее.

И как шахтер может добыть из месторождения больше, чем оно содержит? Это же невозможно! А в данной версии мода это именно так. По железу аж раза в 3 превышение по ресурсу.

NeseryozniyVET
06.06.2010, 20:15
Вот готовые файлы. Все проверил багов ненашел.

kabjans
06.06.2010, 22:24
<div class='quotetop'>Цитата(NeseryozniyVET * 6.6.2010, 19:15) 337835</div>

Вот готовые файлы. Все проверил багов ненашел.
[/b]
Скомпилировал final DEBUG CvGameCoreDLL.dll без единой ошибки для твоего мода. Без проблем запустил мод и начал игру.

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

Прогнал более полусотни ходов, вылетов нет, но и ничего тоже нет. Склады ломятся от запасов серебра и железа.

В твоих xml файлах абсолютно ничего не менял. Только собрал CvGameCoreDLL.dll из присланных исходников.

Посмотрел сами исходные файлы. Вижу очень большие изменения в них, но на пользу они к сожалению не пошли. Возможно решение "где-то рядом", но я увы не Фокс Маудер и его не вижу.

NeseryozniyVET
07.06.2010, 00:00
Незнаю как ты там кампилировал, у меня все работает, даже новый алгоритм складов.
Кстате исправил 1 замеченый баг.

Вот готовый мод с DLL.

kabjans
07.06.2010, 00:47
<div class='quotetop'>Цитата(NeseryozniyVET * 6.6.2010, 23:00) 337869</div>

Незнаю как ты там кампилировал, у меня все работает, даже новый алгоритм складов.
Кстате исправил 1 замеченый баг.

Вот готовый мод с DLL.
[/b]
Вот эта версия работает!

По серебру замечаний нет. Сколько было в месторождении серебра, ровно столько его и добыл шахтер. Появляющееся красным цветом сообщение "Bonus outspend" весьма кстати.

Но в этой версии ты оставил те же самые 4 единицы ресурса на ход. То есть запас месторождения серебра или железа уменьшается только на 4 единицы и не зависит от реальной добычи данного ресурса шахтером или колонистом. У меня из железного месторождения с запасом 147 единиц шахтер добыл 443 железа.

Эврика!!! :huh1: У меня же в новой версии "1492" все железо только на месторождениях. Тогда по идее оно все "бонусное". На холмах просто так ничего нет. А значит твоя метода на ней должна работать именно так, как мне и надо. Жаль, сегодня уже не успею проверить, но завтра постараюсь протестировать твою идею на 1492 моде. О результате естественно сообщу.

Еще раз ОГРОМНОЕ СПАСИБО ЗА РАБОТУ! :applau2: :applau2: :applau2:

Vik9
08.06.2010, 17:33
kabjans попробуй пож-стаэтот файл, у меня на сладующем ходу вылетает.

romello
08.06.2010, 20:33
<div class='quotetop'>Цитата(Vik9 * 8.6.2010, 16:33) 338012</div>

kabjans попробуй пож-стаэтот файл, у меня на сладующем ходу вылетает.
[/b]

Привет! Попробовал поиграть в этот сейв - ниче не вылетело...

Vik9
09.06.2010, 00:25
Что у них происходит, что города горят, а игру начал заново.

NeseryozniyVET
10.07.2010, 03:01
А куда Кабъянс делся? :boo:
Неужели мод заброшен? :shock:

romello
10.07.2010, 08:41
<div class='quotetop'>Цитата(NeseryozniyVET * 10.7.2010, 2:01) 341288</div>

А куда Кабъянс делся? :boo:
Неужели мод заброшен? :shock:
[/b]

меня это тоже интересует, хотя наверное отпуск) :.V.:
да и не до игры сейчас...)

NeseryozniyVET
31.07.2010, 23:24
<div class='quotetop'>Цитата(romello * 10.7.2010, 7:41) 341295</div>
меня это тоже интересует, хотя наверное отпуск) :.V.:
да и не до игры сейчас...)[/b]Очень длинный отпуск у него :nerves:

waksik
02.08.2010, 18:20
А кто нибудь знает планируется перевод этого мода? Получилось, классно, да вот на англ играть не могу, глаз режет, и голова закипает от перевода))

NeseryozniyVET
02.08.2010, 20:39
<div class='quotetop'>Цитата(waksik * 2.8.2010, 17:20) 344837</div>
А кто нибудь знает планируется перевод этого мода? Получилось, классно, да вот на англ играть не могу, глаз режет, и голова закипает от перевода))[/b]Вобще-то автор мода НАШ русскоязычный. А почему он решил сделать мод неудобным для СВОИХ неизвестно.

waksik
02.08.2010, 20:57
Когда курсор навожу на летку, вместо привычных значков ресурсов разные буквы, в цицвилопедии тоже самое, и в окне строительства. мало того что на английском, так игра почти новая получается, ресурсы новые, тяжело играть, а игруха классная получилась.

romello
02.08.2010, 21:36
<div class='quotetop'>Цитата(NeseryozniyVET * 2.8.2010, 19:39) 344866</div>

<div class='quotetop'>Цитата(waksik * 2.8.2010, 17:20) 344837
А кто нибудь знает планируется перевод этого мода? Получилось, классно, да вот на англ играть не могу, глаз режет, и голова закипает от перевода))[/b]Вобще-то автор мода НАШ русскоязычный. А почему он решил сделать мод неудобным для СВОИХ неизвестно.
[/b][/quote]

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

<div class='quotetop'>Цитата(waksik * 2.8.2010, 19:57) 344870</div>

Когда курсор навожу на летку, вместо привычных значков ресурсов разные буквы, в цицвилопедии тоже самое, и в окне строительства. мало того что на английском, так игра почти новая получается, ресурсы новые, тяжело играть, а игруха классная получилась.
[/b]

ну так он же не сид, чтобы все получилось)))
главное, что мод играбелен

waksik
03.08.2010, 11:47
А как тут теперь в Европе покупать корабли, и спецов. Меня в первую очередь солдаты интересуют...
А обучать в колонии на солдат теперь можно как в Col I?

romello
03.08.2010, 21:05
<div class='quotetop'>Цитата(waksik * 3.8.2010, 10:47) 344931</div>

А как тут теперь в Европе покупать корабли, и спецов. Меня в первую очередь солдаты интересуют...
А обучать в колонии на солдат теперь можно как в Col I?
[/b]

Солдат обучать нельзя. только в европе покупать. покупка кораблей работает. почитай в самом начале темы - возможно у тебя не работает кнопка торговли с европой. проблема разрешимая - в самом начале темы читай - много траблов у многих людей с этим было

Vik9
04.08.2010, 18:46
<div class='quotetop'>Цитата(romello * 3.8.2010, 20:05) 344991</div>

<div class='quotetop'>Цитата(waksik * 3.8.2010, 10:47) 344931

А как тут теперь в Европе покупать корабли, и спецов. Меня в первую очередь солдаты интересуют...
А обучать в колонии на солдат теперь можно как в Col I?
[/b]

Солдат обучать нельзя. только в европе покупать. покупка кораблей работает. почитай в самом начале темы - возможно у тебя не работает кнопка торговли с европой. проблема разрешимая - в самом начале темы читай - много траблов у многих людей с этим было
[/b][/quote]

В "1492: Global Colonization. Глобальная Колонизация" солдаты обучаются, предлагаю старт за Ермака сделать с казаком (их в моде пока нет), а молчание Кабъянса малость настораживает.

romello
04.08.2010, 19:04
<div class='quotetop'>Цитата(Vik9 * 4.8.2010, 17:46) 345086</div>

<div class='quotetop'>Цитата(romello * 3.8.2010, 20:05) 344991

<div class='quotetop'>Цитата(waksik * 3.8.2010, 10:47) 344931

А как тут теперь в Европе покупать корабли, и спецов. Меня в первую очередь солдаты интересуют...
А обучать в колонии на солдат теперь можно как в Col I?
[/b]

Солдат обучать нельзя. только в европе покупать. покупка кораблей работает. почитай в самом начале темы - возможно у тебя не работает кнопка торговли с европой. проблема разрешимая - в самом начале темы читай - много траблов у многих людей с этим было
[/b][/quote]

В "1492: Global Colonization. Глобальная Колонизация" солдаты обучаются, предлагаю старт за Ермака сделать с казаком (их в моде пока нет), а молчание Кабъянса малость настораживает.
[/b][/quote]

обучать? че-то я не просек этого момента

waksik
07.08.2010, 12:41
А у кого какие соображения по поводу цен на товары в Европе? Мне кажется они явно завышены... Я имею продажу товаров привезенных из Америки. Я на одних "ЦЕННЫХ ПОРОДАХ ДЕРЕВА" бабла поднял, а когда до золота добрался, то вопрос денег меня вобще перестал волновать.... Мое мнение надо бы цены уменьшить, или сделать как с серебром в COL I, с каждей продажей 100ед. Цена на него падает, под конец, я помню, серебро чуть ли не по 1 продавал. И сдесь то же самое с золотом, да и с другими ресами. Или я где-то читал сделать ресурсы исчерпаемыми, это вобще классный вариант.

Vik9
11.08.2010, 01:07
обучать? че-то я не просек этого момента
[/quote]


Когда строишь schoolhouse после обучения школа выдает journeyman, его опять в школу, после обучения выдает список спецов, среди которых и ветеран(если есть в городе). Последующие постройки дают сразу список спецов. Кабъянс забыл включить "опцию обучения" в обращенных индейцев, так я их в школе на ветеранов обучаю.

Vik9
11.08.2010, 01:19
<div class='quotetop'>Цитата(waksik * 7.8.2010, 11:41) 345445</div>

А у кого какие соображения по поводу цен на товары в Европе? Мне кажется они явно завышены... Я имею продажу товаров привезенных из Америки. Я на одних "ЦЕННЫХ ПОРОДАХ ДЕРЕВА" бабла поднял, а когда до золота добрался, то вопрос денег меня вобще перестал волновать.... Мое мнение надо бы цены уменьшить, или сделать как с серебром в COL I, с каждей продажей 100ед. Цена на него падает, под конец, я помню, серебро чуть ли не по 1 продавал. И сдесь то же самое с золотом, да и с другими ресами. Или я где-то читал сделать ресурсы исчерпаемыми, это вобще классный вариант.
[/b]

Вопрос денег не волнует пока мод не доделан, а когда соберется воедино другие песни петь будем. Сюда войдет мод "Mortally Dangerous Colonization. Смертельно Опасная Колонизация." где пираты есть, просто так по карте не побегаешь, и не по плаваешь(тогда за деньги вспомнишь!), а делать золото по 1, или товары дешевле сырья, то нафиг его добывать или что-то производить?

NeseryozniyVET
11.08.2010, 10:31
<div class='quotetop'>Цитата(Vik9 * 11.8.2010, 0:19) 346052</div>
Вопрос денег не волнует пока мод не доделан, а когда соберется воедино другие песни петь будем.[/b]А кто доделовать будет? :nerves:

romello
11.08.2010, 21:37
обучать? че-то я не просек этого момента



Когда строишь schoolhouse после обучения школа выдает journeyman, его опять в школу, после обучения выдает список спецов, среди которых и ветеран(если есть в городе). Последующие постройки дают сразу список спецов. Кабъянс забыл включить "опцию обучения" в обращенных индейцев, так я их в школе на ветеранов обучаю.
[/quote]

А я не просек :yes:
Буду знать теперь. интересно даже. просто не обучал в поселениях индейцев в промышленных масштабах. линейные корабли строил на ура. теперь про ветеранов буду знать

Vik9
12.08.2010, 02:00
<div class='quotetop'>Цитата(NeseryozniyVET * 11.8.2010, 9:31) 346084</div>

<div class='quotetop'>Цитата(Vik9 * 11.8.2010, 0:19) 346052
Вопрос денег не волнует пока мод не доделан, а когда соберется воедино другие песни петь будем.[/b]А кто доделовать будет? :nerves:
[/b][/quote]

А кто цены менять будет?

NeseryozniyVET а сам возьмешься?

NeseryozniyVET
12.08.2010, 04:26
<div class='quotetop'>Цитата(Vik9 * 12.8.2010, 1:00) 346299</div>
NeseryozniyVET а сам возьмешься?[/b]Мне своего мода хватает, два непотяну. Я могу разве что помоч: исправление багов в СДК и Питоне.
Тут надо совместить уже готовые моды, в основном работа только по XML. Каждый может занятся.

romello
12.08.2010, 18:57
ну здесь всем кабьянс рулил, зомби 113 ему помогал и сам кое-какие идеи реализовывал.
странно, но ни один ни второй не появляются на форуме...

<div class='quotetop'>Цитата</div>
Каждый может занятся.[/b]

ну не скажи - я хотел кабьянсу помочь, но это не моего ума дело :no:

Vik9
12.08.2010, 22:27
И я не смыслю, умел бы- делал, NeseryozniyVET а у тебя какой мод?

NeseryozniyVET
12.08.2010, 23:54
<div class='quotetop'>Цитата(Vik9 * 12.8.2010, 21:27) 346419</div>
И я не смыслю, умел бы- делал, NeseryozniyVET а у тебя какой мод?[/b]http://www.civfanatics.ru/forum/index.php?...mp;#entry346409 (http://www.civfanatics.ru/forum/index.php?showtopic=9737&st=400&#entry346409)

zombie_113
13.08.2010, 09:49
<div class='quotetop'>Цитата(romello * 12.8.2010, 17:57) 346399</div>

ну здесь всем кабьянс рулил, зомби 113 ему помогал и сам кое-какие идеи реализовывал.
странно, но ни один ни второй не появляются на форуме...

<div class='quotetop'>Цитата
Каждый может занятся.[/b]

ну не скажи - я хотел кабьянсу помочь, но это не моего ума дело :no:
[/b][/quote]
Ну во первых не помогал... а так, участвовал в обсуждении. kabjans все делал сам и он молодец. У меня руки не доходят свой мод довести до состояния играбельного.
А летом так ваще, нехватка времени. Отдых, работа, жара... Про моддинг даже думать неохота.

А щас еще с ожиданием выхода пятерки, даже не знаю. стоит ли продолжать модить четверку (даже если это колонизация)? Поэтому мои работы пока в глубокой консервации. =) А вот kabjans не побоялсо и время нашел. За что скажем ему спасибо.

Vik9
13.08.2010, 22:40
[/quote]http://www.civfanatics.ru/forum/index.php?...mp;#entry346409 (http://www.civfanatics.ru/forum/index.php?showtopic=9737&st=400&#entry346409)
[/quote]

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

Vik9
27.09.2010, 10:28
Вышла пятая цива, похоже колонизация "прощай", форум и так затих.

NeseryozniyVET
27.09.2010, 17:04
<div class='quotetop'>Цитата(Vik9 * 27.9.2010, 9:28) 354047</div>
Вышла пятая цива, похоже колонизация "прощай", форум и так затих.[/b]Обидно, что мод так и небыл доведен до играбельного состояния.

mihgreen
10.10.2010, 21:13
Приветствую!
Если не затруднит, выложите сей чудный мод в нормальный файлообменник или торрентом. Рапидшара - ну совсем не вариант :( Остальные альтернативные ссылки уже не работают...

SadJohn
22.10.2010, 15:47
Господа, если тут еще кто-нибудь из продвинутых появляется может подскажете что за фигня: после определенного момента игры все сэйвы сохраняются битыми и при их загрузке происходит вылет в винду. Вот про ошибку, прикрепляю этот сэйв [attachmentid=7107]
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: Colonization.exe
Версия приложения: 1.0.0.1
Штамп времени приложения: 49a88196
Имя модуля с ошибкой: Colonization.exe
Версия модуля с ошибкой: 1.0.0.1
Штамп времени модуля с ошибкой: 49a88196
Код исключения: c0000005
Смещение исключения: 0054a857
Версия ОС: 6.0.6002.2.2.0.768.3
Код языка: 1049
Дополнительные сведения 1: 35e3
Дополнительные сведения 2: 37f4ec5d58068873a21f2805e6aa528f
Дополнительные сведения 3: 4f85
Дополнительные сведения 4: 20abe835967c4126a1ea4eef143cab78

KJ Jansson
07.12.2010, 00:47
1492: Золотая лихорадка.

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

Уже вернувшись домой, я смог закончить минимод "1492: Золотая лихорадка", во многом базирующийся на прекрасном моде AmountResourses, который сделал NeseryozniyVET этим летом, как раз накануне моего неожиданного отъезда. К сожалению, несмотря на то, что NeseryozniyVET выложил свой мод на их-фанатиках, никто их моддеров пока его не включил в свои работы. Я, правда, очень бегло ознакомился с тем, что там появилось нового и возможно что-то пропустил, но реальных ссылок на мод AmountResourses я ни у кого не нашел.

Именно поэтому я вычленил из моего нового мода "1492: Глобальная Колонизация" несколько элементов и именно они составят основу минимода "1492: Золотая лихорадка". На примере золота двух типов - рудного и рассыпного - я покажу и объясню как работает AmountResourses мод. А работает он именно так, как мне и требуется, за что NeseryozniyVETу ОГРОМНЕЙШЕЕ СПАСИБО!

Сам минимод "1492: Золотая лихорадка" я выложу в ближайшие дни, как только закончу с написанием пояснений и снимками и если буду наконец трезв хотя бы в течение дня, что пока остается несбыточной мечтой. :confused:

Пока же лишь один снимок из минимода "1492: Золотая лихорадка".

http://img530.imageshack.us/img530/5498/07placergolddepositisex.th.jpg (http://img530.imageshack.us/i/07placergolddepositisex.jpg)

P.S. Что случилось с форумом???? Я сначала подумал, что это результат хакерской атаки, потом почитал и понял, что был переезд. Судя по тому в каком виде сейчас раздел по Колонизации, переезжали по-видимому в крайней спешке. Впрочем, мне это слишком хорошо знакомо. Летом мне самому было дано всего несколько часов на сборы. Поэтому что это значит я прекрасно понимаю. Стоит лишь надеяться, что модераторы со временем подправят раздел, относящийся к Колонизации.

Более того, я не смог войти под своим именем. Пришлось заново регистрироваться. Я теперь тут прохожу как KJ Jansson. Впрочем, и это имя мне хорошо знакомо.

NeverMind
07.12.2010, 01:18
О, с возвращением! :yes:


Несколько дней назад я вернулся из почти полугодовой по длительности экспедиции, в которую мне неожиданно пришлось отправиться вопреки моим планам на лето и всем графикам и правилам. Прошедшее время, когда я и мои коллеги были практически полностью изолированы от внешнего мира Любопытно. Уверен, эта тема заслуживает отдельного освещения в личном блоге, который теперь все могут вести на форуме)


К сожалению, несмотря на то, что NeseryozniyVET выложил свой мод на их-фанатиках, никто их моддеров пока его не включил в свои работы. Тут такое дело... Боюсь тебя шокировать, но пока ты был в экспедиции, вышла Civ5! :shock: Так что и так небольшие ряды моддеров Колонизации почти растаяли... Остались наверное самые настоящие фанаты.


Стоит лишь надеяться, что модераторы со временем подправят раздел, относящийся к Колонизации.А что не так?


Более того, я не смог войти под своим именем. Пришлось заново регистрироваться. Это напрасно. На главной странице же написано Если зарегистрировались до 5 ноября 2010, то попробуйте зайти со старыми логином и паролем. Если не получится, то запросите пароль через форму восстановления пароля (http://www.civfanatics.ru/login.php?do=lostpw). Попробуй.

PS. Ждем "Глобальную Колонизацию"!

AFro
07.12.2010, 07:05
kabjans, с возвращением!
Не скажу, что я любитель колонизации, но это не мешает получать чисто эстетическое наслаждение от твоих сообщений...
Пиши еще :.V.:

kabjans
07.12.2010, 11:04
О, с возвращением! :yes:

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

Это напрасно. На главной странице же написано Если зарегистрировались до 5 ноября 2010, то попробуйте зайти со старыми логином и паролем. Если не получится, то запросите пароль через форму восстановления пароля (http://www.civfanatics.ru/login.php?do=lostpw). Попробуй.


Спасибо, NeverMind за помощь! Сейчас удалось войти под своим старым именем. Наверное вчера я что-то не так вводил или рука тряслась и я не туда нажимал.



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


Возможно, когдя я выйду на пенсию, я и доберусь до личных блогов и обсуждений. Сейчас же на эти дела просто элементарно нет времени.



А что не так?


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

Я вчера, к примеру, искал наш летний разговор с NeseryozniyVET'ом по поводу его мода AmountResourses и не нашел даже такой темы. Придется давать ссылку на его мод по форуму их-фанатиков.

Дополнение: Все нормально работает. Я просто не разобрался с опциями на новом форуме. Сейчас я вижу все темы в разделе Колонизации.



Тут такое дело... Боюсь тебя шокировать, но пока ты был в экспедиции, вышла Civ5! :shock: Так что и так небольшие ряды моддеров Колонизации почти растаяли... Остались наверное самые настоящие фанаты.

Ждем "Глобальную Колонизацию"!

О предстоящем выходе Civ5 я знал еще весной и моя позиция с того времени мало в чем изменилась.

Суть проблемы в следующем. Для игры (и если я правильно понял из уже прочитанного мной) и даже для установки Civ5 необходимо интернет-подключение компьютера. Причем даже в случае покупки коробочной версии на любом языке (английской или русской локализации). Такого соединения на моем компьютере с играми нет и не планируется. А раз так, то Civ5 я установить элементарно не смогу.

Чисто теоретически конечно есть вариант с установкой пиратской версии Civ5. Там наверняка наличие интернета не требуется. Но я отказался от таких версий много лет назад ввиду их глючности, проблем с установкой патчей и проч. Кроме того стоимость легальной версии настолько мало отличается от джевел-упаковки, что просто глупо покупать пиратку на диске. Качать же в течение нескольких дней несколько гигов из интернета по довольно тонкому и крайне нестабильному 3G каналу на лаптон даже не имея ограничения на трафик - это вообще выше моих сил. Поэтому покупка коробочной версии от оригинального разработчика (если зарубежный - то на языке оригинала, если русский - то естественно только на русском) стала для меня традицией. Как я вижу в случае с Civ5 это уже невозможно. Очень жаль, конечно, но подстраиваться под новые правила я не горю желанием.

Кроме того, опять-таки если я правильно понял ситуацию с Civ5, с этой версией не все так однозначно. Я пролистал несколько страниц на их-фанатиках в разделе по Civ5. Там мнения крайне поляризованы. Одним игра вроде бы нравится, другие ее ругают. В аргументы "за" и "против" я пока не вникал, так как на это пока нет времени. Со временем разбирусь...

Кроме того, а это уже скорее философский вопрос, что такое изготовление мода для Колонизации для меня лично?

Прежде всего сама игра - построение своего виртуального государства в Новом Свете. Государства, где ты сам решаешь что и как делать. Можно было бы даже сказать, что ты сам - это Бог, так как решаешь судьбы твоей нации. Но это далеко не так, ибо ты жестко ограничен правилами игры. Это можно сделать, а вот это уже нет. То есть роль игрока в Колонизации - это скорее роль наместника Бога в Новом Свете, который должен неукоснительно следовать написанным им (Богом) заветам (правилам). Это один уровень игры и он по-своему интересен.

А есть еще один, более высокий и в то же время куда более интересный уровень. Если продолжать сравнения, то это уровень Бога. Уровень, где ты сам создаешь правила, по которым будет происходить развитие в твоей игре. В повседневной жизни и применительно к играм это называется изготовлением модов. Для меня, который в игры практически не играет (звучит смешно, но это именно так), Колонизация интересна исключительно на данном уровне.

Обычные игроки получают удовольствия от самой игры, от выигрыша и количества полученных очков. Для меня же куда интереснее ввести в игру что-то свое, нечто новое, что я считаю необходимым, и увидеть, что это работает так, как задумано, а игра при этом стала интереснее. Одни уходят в мистику и так в модах появляется всякая "чертовщинка" (в хорошем смысле слова), другие уводят нас в далекое будущее и мы получаем фэнтези моды. Я лучше помню прошлое (возможно прожитые до этого жизни действительно как-то сохраняются в нашей памяти), поэтому строю свои моды исходя из своих представлений и воспоминаний.

Возможно это некая новая, неизвестная пока форма извращения, возможно это напротив широко известный феномен. Я этот вопрос специально не изучал. Просто для меня Колонизация именно такова как я ее описал.

Собственно поэтому я и "занимаюсь мододеланием", получая от этого куда большее удовольствие, чем от самой игры. Когда же нечто более-менее законченное получается, то я его делаю доступным остальным игрокам. В данном случае мне очень интересны их мнения и отзывы. Естественно, что далеко не со всеми замечаниями я буду согласен, но среди отзывов есть много очень ценных дополнений и предложений, которые позволяют по новому взглянуть на уже существующие в игре вещи. Некоторые же предложения игроков вполне реально реализовать, что я подчас и делаю.

Так постепенно, можно сказать по крупицам и создается мод "1492: Глобальная Колонизация", над которым я и продолжаю работать.

P.S. Перечитал написанное, чтобы исправить грамматичесие ошибки и сделал простейший вывод: "Надо как можно быстрее завязывать с алкоголем! До добра это точно не доведет. Вон уже в философствование понесло".

NeverMind
07.12.2010, 15:53
Какой интересный "философский вопрос". А ты говоришь, " когда на пенсию..." Пожалуй, вынесу его в новости. :)

По поводу приоритета моддинга над игрой я тебя очень понимаю. Правда мне всегда сложно было остановиться на том, что уже в принципе понятно, когда появляется игра с новыми возможностями и вопросами для моддинга. Даже так - лично мне интересней разбираться с инструментами моддинга, чем делать на их основе что то конкретное. Но, конечно, в Col2, как и в Civ4, еще много чего можно сделать.


Такого соединения на моем компьютере с играми нет и не планируется. А раз так, то Civ5 я установить элементарно не смогу. Хм, не очень понимаю, но жаль... Хотя тем лучше для тех, кто еще играет в Col2.


сделал простейший вывод: "Надо как можно быстрее завязывать с алкоголем! До добра это точно не доведет. Вон уже в философствование понесло". Ну, "еще по пиесят" ((c) Линник) и "Пьянству - бой!" :umnik:

General
07.12.2010, 20:39
А есть еще один, более высокий и в то же время куда более интересный уровень. Если продолжать сравнения, то это уровень Бога. Уровень, где ты сам создаешь правила, по которым будет происходить развитие в твоей игре. В повседневной жизни и применительно к играм это называется изготовлением модов. Для меня, который в игры практически не играет (звучит смешно, но это именно так), Колонизация интересна исключительно на данном уровне.


Вот-вот-вот :) В точку!
С программирование то же самое

NeseryozniyVET
07.12.2010, 23:38
Какой интересный "философский вопрос". А ты говоришь, " когда на пенсию..." Пожалуй, вынесу его в новости. :)Именно из этой новости я и узнал, что Кабъянс появился. :woot_jum:
А что за экспедиция? Куда ездил?

kabjans
10.12.2010, 17:14
Именно из этой новости я и узнал, что Кабъянс появился. :woot_jum:
А что за экспедиция? Куда ездил?

Приветствую тебя, NeseryozniyVET, и извини, что раньше никак не смог сделать мод под твои исчерпаемые ресурсы. Сейчас вернулся и обнаружил, что на их-фанатиках народ твой мод скачивает, но сами моддеры пока не понимают что и как там работает. Я поэтому взял твой мод "Amount Resources and New City Capacity", добавил в него два типа золота - рудное и россыпное - и выложил с детальными комментариями и пояснениями на их-фанатиках.

Вот ссылка на сам мод (http://forums.civfanatics.com/downloads.php?do=file&id=16163) и вот эта на форум (http://forums.civfanatics.com/showthread.php?t=402217).

Если кому-то лень туда лезть, то вот текст оттуда. Я его начну переводить, но сегодня наверняка не закончу.
.

1492: Золотая лихорадка

http://img600.imageshack.us/img600/6441/titlee.jpg

О моде:

Я вырезал из мода "1492: Глобальная Колонизация" ряд элементов и представляю их в виде отдельного [MODCOMP].

Почему? Есть две причины:

- во-первых мод "1492: Глобальная Колонизация" находится в рзработке и его еще пока рано выносить на суд публики.

- во-вторых NeseryozniyVET еще летом опубликовал свой "Amount Resources and New City Capacity" мод. Однако он лишь выложил свой интересный мод на civfanatics.com (http://forums.civfanatics.com/downloads.php?do=file&id=14881), но не дал никаких пояснений как мод собственно работает и как его правильно использовать. TC01 в теме "Quantity-based resource system? (http://forums.civfanatics.com/showthread.php?t=371443)" пытался выяснить ряд вопросом по моду "Amount Resources and New City Capacity", однако безуспешно. К сожалению, последние месяцы я был в длительной командировке и не мог читать сообщения форума. Несколько дней назад я вернулся и решил восполнить недостаток информации.

В результате я выделил из мода "1492: Global Colonization" все элементы, связанные с "Amount Resources and New City Capacity", добавил ряд необходимых деталей, облегчающих понимание. Все это я собрал в минимоде "1492: Gold Rush (Золотая лихорадка)", который и представляю в виде отдельного [MODCOMP].

Надеюсь, что [MODCOMP] "1492: Gold Rush" будет интересе как мододелам, так и игрокам. Этот минимод сделан как можно более простым, что должно облегчить включение его в другие моды.

Все благодарности двум авторам - NeseryoznijVET и Aymerick, чьи моды я использовал при сборке "1492: Gold Rush (Золотая лихорадка)".


Основная идея минимода:

Распределение ресурсов по клеткам в оригинальной Civilization IV:Colonization очень странное и крайне далекое от реальности. Свободно доступное на каждом холме железо, значительная отдача от клеток, не имеющих бонусных ресурсов, и т.д. Плюс совершенно неограниченные минеральные ресурсы (железо, серебро) делают игру предельно простой даже для маленьких детей. У игроков отсутствует мотивация борьбы за стратегически важные ресурсы, поскольку эти ресурсы доступны практически везде.

Все эти недостатки оригинальной CivIV:Colonization устранены в минимоде "1492: Gold Rush". Я специально добавил в это сообщение массу снимков и пояснений, что надеюсь облегчит понимание как основной идеи, так и методов как эта идея была реализована.


"1492: Золотая лихорадка" включает в себя следующие новые элементы:

1. Новое распределение всех ресурсов (как минеральных, так и растительных),
2. Два типа золотых месторождений: рудные и россыпи,
3. Ограниченные по количеству, а значит исчерпаемые минеральные ресурсы (железо, серебро, золото),
4. Новый метод расчета вместимости городского склада.


Теперь по пунктам:

Извините, но дальше не успеваю перевести, надо уходить. Закончу при первой возможности. Как и куда ставить я перевел (см. внизу статьи). Смотрите картинки, там есть все пояснения....

1. Новое распределение всех ресурсов (как минеральных, так и растительных).

To understand what was changed I recommend to start a new game with Earth33.py mapscript and Huge size mapsize, then open the map in WorldBuilder. I give here no screen because everybody can do it very easily.

As you see, each Land tile has not more than three main resources; namely: x Food; y Wood, z Fur. No additional resources on bonus-free tiles. Some tiles in desert have no Food, Wood or Furs at all (x=y=z=0).

All mineral and vegetative bonus resources are concentrated only on the bonus tiles. Find such tiles, establish your cities near such bonus tiles, and you will have a constant and rich flow of these resources in your empire.

All non-mineral (vegetatives) resources are unlimited.

All mineral resources are limited (please, see p.3)

Information for modders:

The xml files located in ..... XML/Terrain/ directory are responsible for such distribution. Everybody can compare in Notepad++ the current and the original distributions.


2. Gold deposits: hard rock gold mining and placer gold field.

I introduced two type of Gold in "1492: Gold Rush" minimod. One of them is a traditional hard-rock gold deposits. The second one is a PLACER GOLD on goldfields located on the rivers (in this minimod Placer Gold appears only near the river).

Historically each discovery of new placer goldfield gives a start to new GOLD RUSH. I recommend to read a very interesting article (http://en.wikipedia.org/wiki/Gold_rush) in Wikipedia. Today one of such stories gives the name to this minimod.

Both types of Gold deposits are introduced as two different bonuses. Thus, here I tested here such combination: one YIELD_GOLD and two bonuses BONUS_GOLD and BONUS_PLACER_GOLD.


http://img600.imageshack.us/img600/4228/golde.jpg

I already used such schemes in "1492: Global Colonization. Resource Pack" for the Ivory


http://img600.imageshack.us/img600/9071/ivory.jpg

In next version of the "1492: Global Colonization" mod the similar schemes could be used for vegetable


http://img600.imageshack.us/img600/1011/vegetablefiber.jpg

and animal fibers.

http://img600.imageshack.us/img600/8474/animalfiber.jpg

Such combinations of different resources under one YIELD permit geographically correctly present distribution of similar-type resources. From one side Elephants, Camels or Cotton could not appear near the Arctic circle (it's very easy to correct through <iMinLatitude>0</iMinLatitude> and <iMaxLatitude>40</iMaxLatitude> tags in CIV4BonusInfos.xml), from another side the cities located in colder regions all the time will have access to more typical for these regions fiber materials (Flax or Sheep) or Ivory (Walrus).
Hard-rock gold appears on hills and the Gold mine increase the output from the Gold_bonus tile.
Placer gold appears only near the river.

Historically the panning techniques was used for the placer gold extraction.

Gold panning is mostly a manual technique of sorting gold. Wide, shallow pans are filled with sand and gravel that may contain gold. The pan is submerged in water and shaken, sorting the gold from the gravel and other material. As gold is much denser than rock, it quickly settles to the bottom of the pan. The panning material is usually removed from stream beds, often at the inside turn in the stream, or resting on the bedrock bed of the stream, where the density of gold allows it to concentrate. This type of gold found in streams or dry streams are called placer deposits.

Gold panning is the easiest technique for searching for gold, but is not commercially viable for extracting gold from large deposits, except where labor costs are very low and/or gold traces are very substantial. It is often marketed as a tourist attraction on former goldfields. Before production methods can be used, a new source must be identified. Panning is a good way to identify placer gold deposits so that they may be evaluated for commercial viability.This technique is shown on "Panning Gold, California, 1849" by William McIlvaine (1813-1867) used as a title screen of this post.

I closed the possibility to construct Gold mine on Placer gold bonus tile. Each unit of any profession has equal output (or an equal chance to find gold). The professional Gold miner as more experiented unit has a little bit higher chance (higher output if Gold miner is working on Placer Gold bonus tile).

Information for modders:

Gold as a new YIELD

Changed files are:

CvCityAI.cpp
CvEnums.h
CvPlayerAI.cpp
CyEnumsInterface.cppAll places in the soure files are marked as


//MORE_YIELD_TYPES 05/05/09 Aymerick All additions are similar to the "PlantationEconomy 0.09" mod by Aymerick.

RiverSide as a place where Placer Gold deposites could be found

Changed files are:

CvInfos.cpp
CvInfos.h
CvPlot.cpp
CyInfoInterface2.cppAll places in the source files are marked as

// KJ: Placer Gold startand

// KJ: Placer Gold endI added a new tag in the CIV4BonusInfos.xml file

<bRiverSide>1</bRiverSide>This tag has 1 only for PLACER_GOLD bonus.

3. Limited and exhausted mineral resources (ore, silver, gold).

This is the most important part of the "1492: Gold Rush" minimod, therefore the main part of screens in this post is related to extracted mineral resources. Please, open the screens and follow my comments.

"1492: Gold Rush" minimod has two type of Gold deposits. A hard-rock gold deposit is shown of this screen.

http://img600.imageshack.us/img600/1756/01golddeposit.th.jpg (http://img600.imageshack.us/img600/1756/01golddeposit.jpg)

Please, note. Turn 1. Underlined in red on the left "Gold (69)" means that Gold deposit on this tile has 69 units of Gold.

Second type of Gold is a Placer Gold deposit

http://img600.imageshack.us/img600/883/02placergolddeposits.th.jpg (http://img600.imageshack.us/img600/883/02placergolddeposits.jpg)

Here we have only 41 units of Gold. Both deposits are marked as "Exhaustible bonus resource" (Underlined in red on the left)

Let's go on the City screen.

http://img600.imageshack.us/img600/1281/03colonistcollectsgoldo.th.jpg (http://img600.imageshack.us/img600/1281/03colonistcollectsgoldo.jpg)

Send our Colonist to extract Gold from "Placer Gold deposit". His output is 1 Gold/turn.

Stop all our units and press 20 times the next turn button. Next stop: Turn 20.

http://img600.imageshack.us/img600/2772/04remainingplacergoldde.th.jpg (http://img600.imageshack.us/img600/2772/04remainingplacergoldde.jpg)

Let's go to the map and check the situation with our Placer Gold deposit. According to the screen "Remaining placer gold = 22". We had 41 Gold on turn 1, thus 41 - 22 = 19. Our colonist should extract 19 gold during 20 - 1 = 19 turns. Let's check the city screen.

http://img600.imageshack.us/img600/6213/05cityscreencollectsgol.th.jpg (http://img600.imageshack.us/img600/6213/05cityscreencollectsgol.jpg)

Ok, nothing lost! We can continue.....

Next stop on Turn 41.

http://img600.imageshack.us/img600/8567/06remainingplacergoldde.th.jpg (http://img600.imageshack.us/img600/8567/06remainingplacergoldde.jpg)

Our colonist collected practically all gold from the placer gold field that now has only 1 Gold.

Next turn 42.

http://img600.imageshack.us/img600/5498/07placergolddepositisex.th.jpg (http://img600.imageshack.us/img600/5498/07placergolddepositisex.jpg)

Red alarm message "Bonus return is exhausted. Placer Gold". The "Placer Gold" icon disappears from the map. Previously bonus tile has only wood and furs.

Let's open city screen.

http://img600.imageshack.us/img600/8579/08cityscreenonturn42.th.jpg (http://img600.imageshack.us/img600/8579/08cityscreenonturn42.jpg)

Turn 42. We have 41 Gold in our city. As you remember the Placer Gold deposit had 41 gold on turn 1. All gold is collected. Now the colonist can work on this tile only as Lumberjack or Fur Trapper.

As you remember, we have a second gold deposit near our city. To speed up the process let's construct Gold mine on Gold-bonus tile and make a number of turns. We stop on turn 78 because now our Gold deposit has only 1 Gold (Underlined in red on the left)

http://img600.imageshack.us/img600/8482/10lastgoldunitingolddep.th.jpg (http://img600.imageshack.us/img600/8482/10lastgoldunitingolddep.jpg)

Next turn, and the second Gold deposit is exhausted

http://img600.imageshack.us/img600/759/11thesecondgolddepositi.th.jpg (http://img600.imageshack.us/img600/759/11thesecondgolddepositi.jpg)

Similar red alarm message, Gold icon also disappears from the map.

Now all available gold near our city is collected. Let's check the city.

http://img600.imageshack.us/img600/326/12goldsummary.th.jpg (http://img600.imageshack.us/img600/326/12goldsummary.jpg)

We had 69 Gold in hard rock deposit and 41 Gold on Placer goldfield on Turn 1. 69 + 41 = 110. We have exactly 110 Gold! Nothing was lost or stolen! Great!

Interesting observations during testing:


Natives extract the limited resources (Gold, Silver, etc.) if the such bonus resources are located within the native city border. Native unit must work on this bonus tile to extract a resource. Very possible situation when such resource will be fully exhausted, If it is located too long inside the native city and the natives collect it. During testing I observed how placer gold bonus was fully exhausted by natives. Additionally I found the natives sell only a part of such resource. Where the rest? It's a good question. I don't know. You can ask a local leader by himself/herself.Information for modders:

Exhaustible bonus resources
Changed files are:

CvGameTextMgr.cpp
CvInfos.cpp
CvInfos.h
CvPlot.cpp
CvPlot.h
CyInfoInterface2.cpp
CyPlot.cpp
CyPlot.h
CyPlotInterface1.cppAll places in the source files are marked as

// VET AmountResoursesCouple of new tags are added in the CIV4BonusInfos.xml file

<iMinAmount>10</iMinAmount>
<iMaxAmount>15</iMaxAmount>Such tags are added for all mineral resources in the mod (Iron, Silver, Gold). I used such combinations of Min/Max:

Iron 100/200
Silver 50/80
Gold 20/30
Placer Gold 10/15Everybody can adjust in Notepad++ these values as he/she want. Mineral resources could be made unlimited in quantity if these two tags will be removed from the corresponding section of CIV4BonusInfos.xml file.

Now all mineral resources in "1492: Global Colonization" mod - Clay, Ore (not Iron!!!), Coal, Saltpeter, Sulfur, Silver, Gold, Gems - now are limited and can be exhausted. Stone is only one exception.

4. New logic in the Warehouse capacity calculation.

"Amount Resources and New City Capacity" mod made by NeseryozniyVET has also one additional very interesting feature, namely a new logic in the Warehouse capacity calculation.

Original CivIV:Colonization we had a limit on the amount of EACH type of material, stored in a city warehouse. This created an absurd situation when a warehouse full of just one good (Tobacco, Cotton, etc). Now this moment is corrected.

Please, reopen the last image and read a green-color text.

http://img600.imageshack.us/img600/326/12goldsummary.th.jpg (http://img600.imageshack.us/img600/326/12goldsummary.jpg)

City warehouse has 72 Wood + 110 Gold + 31 Furs = 213 units (in summary). Exactly such quantity we can see on the top of the city screen.

213 - is a current warehouse status
900 - is a maximal warehouse capacity

Food (78) as usually is exluded from the callulations.

Thus, now we can store in warehouse much more goods of the SAME type.

Information for modders:

Changed file is:

CvCity.cppAll places in the source file are marked as

//VET NewCapacityCheck file GlobalDefinesAlt.xml (here you can ON/OFF this feature):


<Define><!-- VET NewCapacity. Default: 0 -->
<DefineName>NEW_CAPACITY</DefineName><!-- CvCity.cpp -->
<iDefineIntVal>1</iDefineIntVal>
</Define>and GlobalDefines.xml (here you can adjust the warehouse capacity)


<Define>
<DefineName>CITY_YIELD_CAPACITY</DefineName>
<iDefineIntVal>300</iDefineIntVal>
</Define>

Скачать можно: здесь (http://forums.civfanatics.com/downloads.php?do=file&id=16163)

Размер: 3.3 Mb

Установка:

1. Распаковать в директорию \Mods.

Пример:
C:\Program Files\2K Games\Firaxis Games\Sid Meier's Civilization IV Colonization\Mods.
Если директория Mods отсутствует, то ее необходимо создать.
Правильным расположением является: C:\Program Files\2K Games\Firaxis Games\Sid Meier's Civilization IV Colonization\Mods\1492 Gold Rush.
2. Загрузка осуществляется через "Advanced" и "Load a Mod".

Это версия полностью на английском. Требует установленного 1.01 патча.

Я настоятельно рекомендую использовать в "1492: Gold Rush" в качестве карты Earth33.py скрипт и выбирать карту размера Huge. Не все ресурсы появляются на картах меньшего размера. Если какие-то ресурсы не сгенерились, то начните новую игру.

Известный баг: Карты, сгенерированные некоторыми скриптами, имеют очень странную окраску моря. Этот баг отсутствует у карт, сгенерированных скриптом Earth33.py. Именно поэтому я и рекомендую использовать именно Earth33.py.


Final information for modders:

Source codes are included in the archive.

The modified source codes are collected in SDK directory.

All changes in the source codes are marked with markers. I used original markers of Aymerick, NeseryoznijVET and KJ Jansson.

All credits to NeseryoznijVET and Aymerick, whose mods I used for the compilation of my [MODCOMP].

NeseryozniyVET
11.12.2010, 13:34
Я тут немного потестировал и мне показалось, что количество ресурсов в залежах надо бы увеличить. Я шахты построить не успел, как железо и золото уже закончилось.
Как альтернатива, можно сделать чтоб железо и золото (кроме рассыпного) можно было добывать только из шахт. Убрать обычный бонус производства тайла, но удвоить бонус от шахты. В таком случае шахты будут обязательными для добычи ресурса и 2 типа золота будут иметь существенные отличия.

Под новую вместимость склада, ИИ прийдется подстраивать. В ближайшие дни займусь.

kabjans
11.12.2010, 21:01
Я тут немного потестировал и мне показалось, что количество ресурсов в залежах надо бы увеличить. Я шахты построить не успел, как железо и золото уже закончилось.

Я специально уменьшил количество ресурсов в золотых месторождениях, чтобы было видно как твой мод работает. Железо и серебро я особо не урезал. Одновременно в пояснениях я показал где в минимоде можно изменить эти значения. Так что каждый может выставить свои значения или убрать исчерпаемые ресурсы вообще.



Как альтернатива, можно сделать чтоб железо и золото (кроме рассыпного) можно было добывать только из шахт. Убрать обычный бонус производства тайла, но удвоить бонус от шахты. В таком случае шахты будут обязательными для добычи ресурса и 2 типа золота будут иметь существенные отличия.

В "1492: Золотая лихорадка" так и сделано. Обычный бонус от холма убран, оставлены только бонусные железо и золото, которые исчезают с карты, когда игрок их полностью выработает.

Хотя нет, ты, мне кажется, имеешь в виду немного другое. Надо подумать, можно ли это сделать просто через редактирование xml файлов или придется править исходные коды. С ходу не могу ответить....



Под новую вместимость склада, ИИ прийдется подстраивать. В ближайшие дни займусь.

Вот именно эта твоя фишка с новой вместимостью склада вызвала наибольший интерес на немецком форуме (http://www.civforum.de/showthread.php?t=71607). Обсуждение пошло по двум путям.

1. Насколько правильно ИИ понимает новую вместимость склада.
Немцы собираются исследовать это детально. У них вроде бы есть такая возможность через console guide / cheating (http://www.civforum.de/attachment.php?attachmentid=517944&d=1290351614). Я консолью ни разу не пользовался и при возможности посмотрю как эта штука работает. Там одно ограничение. Консоль подстраивали под их ТАС мод, поэтому не факт, что консоль можно будет использовать на других модах.

2. Сейчас там обсуждается идея приложить твою методу расчета вместимости склада и перенести ее на транспортные корабли. Весьма возможно, что и это будет сделано. Весьма интересные идеи уже высказал raystuttgart. Он предлагает ввести

1 unit = 1 full cargo point.

100 goods = 1 cargo point.

Если он сможет реализовать свою идею, то тогда будет возможен к примеру такой вариант перевозки людей и товаров на каравелле:

Caravel (2 cargo points) смогут транспортировать

или 2 юнита (2 cargo points, как сейчас),

или 1 юнит (1 cargo point)
ПЛЮС, например, 10 units food + 20 unit Wood + 30 unit Silver + 40 unit Iron.
Здесь 10+20+30+40=100 goods или 1 cargo point.

Весьма интересно, поскольку не надо будет гонять корабли с полупустыми трюмами.

NeseryozniyVET
12.12.2010, 17:21
Адаптировал ИИ для новой вместимости города http://rapidshare.com/files/436480420/ARaNCC.rar или http://forums.civfanatics.com/downloads.php?do=file&id=14881 Дофига исправлять пришлось. Весь день промучился.
Кстате, теперь при переполнении склада в первую очередь исчезают ресурсы, которые нельзя продать в европе.

Надо подумать, можно ли это сделать просто через редактирование xml файлов или придется править исходные коды. С ходу не могу ответить..." В XML легко делается.
В CIV4ImprovementInfos.xml для IMPROVEMENT_MINE увеличиваешь значения в <YieldIncreases>
В CIV4BonusInfos.xml для BONUS_IRON и других обнуляем <YieldChanges>

Новую вместимость для юнитов тоже попробую сделать.

Кстате, странный цвет воды в Золотой Лихорадке из-за папки Assets\Art\Terrain\Water. Если ее убрать, то вода становится нормальной. Правда, это не работает на карте Земли.

P.S. А когда начнешь основной мод доделывать?

kabjans
13.12.2010, 15:09
Адаптировал ИИ для новой вместимости города http://rapidshare.com/files/436480420/ARaNCC.rar или http://forums.civfanatics.com/downloads.php?do=file&id=14881 Дофига исправлять пришлось. Весь день промучился.
Кстате, теперь при переполнении склада в первую очередь исчезают ресурсы, которые нельзя продать в европе.

Большое спасибо, уже скачал. Вечером посмотрю, а затем исправлю вместимость городского склада в "Золотой лихорадке".

Ресурсы, как я вижу, ты не корректировал, поэтому там менять нечего.


Кстате, теперь при переполнении склада в первую очередь исчезают ресурсы, которые нельзя продать в европе.

Ты, как я понимаю, имеешь в виду ресурсы, на торговлю которыми король наложил эмбарго. Вполне разумно, согласен.


В XML легко делается.
В CIV4ImprovementInfos.xml для IMPROVEMENT_MINE увеличиваешь значения в <YieldIncreases>
В CIV4BonusInfos.xml для BONUS_IRON и других обнуляем <YieldChanges>

Да, я именно это и имел в виду. Мне такую фишку давно хотелось ввести, но боялся недовольных замечаний игроков, что мол железо или серебро есть, но его не взять без шахты. А построить шахту надо время и специалист с инструментами. Сейчас же, когда новое распределение ресурсов уже сделано, подобное дополнение, когда без шахты ничего не добудешь, выглядит очень даже разумным. Кроме того в реальной жизни так и есть. Практически все минеральные ресурсы добываются либо шахтным способом, либо в карьерах, если глубина залегания пласта невелика. Исключением являются россыпи золота и драгоценных камней.

В связи с этим наверное стоит ввести и еще одно ограничение.

Все "европейское население" Колонизации условно делится на три сословия:
- рядовые граждане (колонист, солдат) и полевые специалисты (лесоруб, рыбак, и т.д.)
- мастеровые (профессионалы, которые работают в мастерских в городе)
- высшее сословие (профессионалы, которые работают в горсовете или церкви).

Сейчас возможно поставить, к примеру колониста или бургомистра на полевые работы и отдача от них будет одинакова. В реальности это на так. Выгони какого-нибудь нынешнего губернатора в поле, так он там и подохнет от голода. Аналогичный по качеству результат будет, если посадить любого встречного в руководящее кресло.

Поэтому я собираюсь ввести систему штрафных баллов, если юнит работает не на подходящей по уровню должности. Так к примеру,

- рядовые граждане не имеют минусов при работе на полевых профессиях (0 штрафных баллов),
- рядовые граждане, работающие в городских мастерских, будут иметь -1 к производительности,
- рядовые граждане, работающие на высших городских должностях, будут иметь -2. А с учетом количества плюсов это выльется в то, что рядовой колонист в губернаторском кресле не будет вообще генерить колоколов.

Аналогично и в противоположную сторону.
- губернатор на полевых работах -2
- губернатор в мастероских -1
- губернатор в церкви - без минусов, т.е. как сейчас.

Вполне разумно должно получиться.



Кстате, странный цвет воды в Золотой Лихорадке из-за папки Assets\Art\Terrain\Water. Если ее убрать, то вода становится нормальной. Правда, это не работает на карте Земли.

Я все элементы отрабатываю только на карте Земли. Там площадь существенно больше и поэтому практически всегда все ресурсы, чтоя ввожу где-нибудь, да появляются. На малых картах я никогда не проверяю, но тут решил посмотреть и естественно сразу же увидел этот баг с окраской воды.

Самое смешное, что я тоже об этом же самом подумал, когда попробовал "Золотую лихорадку" на обычной карте. Убрал папку RRWater, запускаю мод и у меня снова тот же беловатый цвет. Я решил, что этот цвет не от файлов в папке Assets\Art\Terrain\Water.

Скажу честно, далее копать я не стал, поскольку идея "Золотой лихорадки" была в доведении для забугорных мододелов твоей реализации исчерпаемых ресурсов. Почти полгода прошло, но никто из них пока этого не сделал и как, я понял из обсуждения на их-фанатиках, даже не разобрался что к чему в твоем моде. Сейчас, как говорил меченый Мишка, "процесс пошел". То есть свою цель "Золотая лихорадка" частично уже выполнила.

Сегодня вечерком еще разок посмотрю почему вода такого странного цвета. Помнится у Кайлрика в одном из модов был такой баг, от которого спасал лишь перезапуск компа. Простой перезапуск самой игры результата не давал. Возможно, комбинация этих двух действий
1. удалить папку RRWater
2. перезапустить комп
и уберет эту белесую окраску воды.



P.S. А когда начнешь основной мод доделывать?

Я основной мод собираю постоянно. Отработку отдельных элементов делаю за пределами мода. Когда все работает, как надо, то ввожу в основной мод и иду дальше. Единственная проблема - очень мало свободного времени. Максимум два-три часа в день удается выкроить на работу над модом. Это основная причина задержки.

romello
05.01.2011, 12:59
Привет Kabjans!!! Самое главное, что есть желание доделать мод. И уже появился еще один мини-мод!
Давненько тебя не было.
Ну все. Теперь буду сообщать о проблемах на 7 винде х 64. Жду с нетерпением огранки и окончательной доделки этого громадного мода

Vik9
19.01.2011, 13:31
kabjans, с возвращением:good:

kabjans
21.01.2011, 15:00
Привет Kabjans!!! Самое главное, что есть желание доделать мод. И уже появился еще один мини-мод!
Давненько тебя не было.
Ну все. Теперь буду сообщать о проблемах на 7 винде х 64. Жду с нетерпением огранки и окончательной доделки этого громадного мода


kabjans, с возвращением:good:
Спасибо на добром слове, друзья!

Несмотря на дикую занятость, работа над модом продолжается, причем сразу по нескольким направлением. Во-первых, я продолжаю работать собственно по моду "1492: Глобальная Колонизация". Это основное направление.

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

Недавно вышел весьма интересный мод, который сдвигает время начала Колонизации с 1492 года на почти тысячу лет назад, точнее в 476 год. Мод называется Medieval: Conquests. Прочитать о нем и скачать можно по этой ссылке (http://forums.civfanatics.com/showthread.php?t=407186). Средневековые рыцари и многое другое уже есть и нормально функционирует. Я по мере возможностей помогаю автору править очевидные огрехи, благо собственного опыта достаточно. Это второе направление моей работы.

И наконец, третье направление работы связано с нашими коллегами с немецкого форума. Там собралась очень сильная и единая команда (немецкая выправка и страсть к порядку никуда не денутся, даже при работе над игровым модом). У них две новости, что могут быть интересны для почитателей Колонизации.

Вышла очередная версия ТАС мода. Скачать можно отсюда (http://download.civforum.de/civ4col/TAC/INSTALL_MANUELL_TAC%202.02a_inoffiziell%20.zip). Называется TAC 2.02a_inoffiziell. Не пугайтесь относительно названия. Игра прекрасно работает на английском, если кто не хочет играть на немецком. Русского языка там, увы нет. Многие огрехи игры выправлены и введена масса нового и очень интересного. Очень рекомендую попробовать.

Далее, вскоре выйдет еще одна версия игры, которую делает один из участников команды ТАС мода. Парень работает очень профессионально и вводит в игру массу нового. В его работе мод "1492: Глобальная Колонизация" присутствует практически полностью. Я ему передал практически все свои наработки на ресурсам на данный момент. Плюс в его моде будет масса совершенно новых фишек и дополнений, о которых мы лишь мечтали. Желающие могут зайти в этот раздел (http://www.civforum.de/forumdisplay.php?f=279)и сами посмотреть картинки или даже прочитать. Текст обсуждений в основном на немецком.

И в заключении, самые последние новости о работе французов над их модом Dawn of A New Era. Они опубликовали планы своих работ. Планы по времени выхода версий и тому, что там будет. Желающие могут прочитать здесь (http://forums.civfanatics.com/showpost.php?p=10102886&postcount=4). Небольшое знание французского существенно облегчит понимание. :) А если без шуток, то где-то к лету мы получим версию 1.36, где будет существеннейшим образом переделана экономическая составляющая игры. Кстати в ней с индейцами можно будет заниматься бартером, а не торговлей за европейские деньги. Плюс будет масса других вкусностей. Короче ждем-с...

Ну вот, хотел только поблагодарить за добрые слова, а вышел почти обзор по ситуации в мире мододелов-колонизаторов.

kabjans
15.03.2011, 15:43
Любителям "Колонизации" очень советую заглянуть на эту страницу (http://www.civforum.de/showthread.php?t=71031&page=17). Можно также полистать страницы в этой и соседних темах. Картинки из готовящегося к выходу мода ответят на многие ваши вопросы, даже если вы не читаете по-немецки.

NeseryozniyVET
16.03.2011, 16:52
Любителям "Колонизации" очень советую заглянуть на эту страницу (http://www.civforum.de/showthread.php?t=71031&page=17). Можно также полистать страницы в этой и соседних темах. Картинки из готовящегося к выходу мода ответят на многие ваши вопросы, даже если вы не читаете по-немецки.Ого:shock::good:
А я уже думал что работа над модом прекратилась.
Как скоро ждать релиза?

kabjans
17.03.2011, 10:25
Ого:shock::good:
А я уже думал что работа над модом прекратилась.
Как скоро ждать релиза?

Привет, NeseryozniyVET!

Нет, конечно, далеко не прекратилась. Просто работа сейчас идет в двух направлениях. Я собираю свой собственный мод, одновременно работая вместе с Raystuttgart над его модом.

Его мод очень во многом повторяет "1492: Глобальную Колонизацию". Собственно поэтому я ему и помогаю, передавая свои идеи и готовые наработки для реализации в его моде. Наше сотрудничество в работе над модом зашло так далеко, что Raystuttgart предложил мне быть соавтором. Однако я решительно отказался, поскольку всегда считал и считаю, что автор у мода должен быть только один. Тогда и только тогда все то, что автор задумал, может быть реализовано так, как он хочет и видит. Абсолютно одинаково думающих людей практически не бывает, а значит каждому из соавторов всегда надо идти на компромисс, соглашаясь с чем-то, что не нравится. В итоге получится нечто среднее, что не устроит ни одного, ни другого. Собственный мод - это не коммерческий проект. Это своего рода "фан" и он должен быть либо полным, либо его вообще не надо.

Кроме того далеко не со всеми идеями Raystuttgart я согласен, но это его мод и он его делает так, как он считает нужным. Его к примеру не устраивает твоя идея об исчерпаемых ресурсах. Для меня же это ценнейшее дополнение, которое делает игру намного более увлекательной, заставляя игрока не просто тупо сидеть на бесконечном по объеме ресурсе, а вести его поиск и, если необходимо, то войну за ресурс. Аналогичная ситуация по многим другим позициям.

Вместе с тем в своем моде Raystuttgart реализует массу новых и интереснейших идей, в частности переговоры с местными племенами, торговлю товарами роскоши в собственных колониях, плюс естественно масса новых ресурсов и технологических цепочек по их производству, и т.д и т.п.

Я во все детали особо не вникаю, поскольку в Колонизацию давно не играл, но боюсь, что скоро мне придется загрузить игру не для обкатки собственного мода, а именно для игры, поскольку в самое ближайшее время у меня будет превью-версия его мода. Это будет своего рода тестирование-полировка. Причем не секретная, поскольку баги и исправления выкладывать можно на открытом форуме. Выкладывать превью-версию в общий доступ, пока увы нельзя. Но обсуждать превью-версию, я повторяю, можно.

Выход же готовой версии этого мода жестко завязан на выход ТАС 2.03. Первым должен выходит мод ТАС 2.03, и только следом может выйти мод Raystuttgart. Это их немецкие заморочки и договоренности и я в них не влезаю. Когда у меня на руках будет превью-версия, то я выложу краткое описание того, что в ней есть и возможно некоторые скрины.

Одновременно я продолжаю работать над собственной версией мода "1492: Глобальную Колонизацию". Насколько это будет кому-то нужно и интересно, я не знаю, но для меня это не важно, поскольку фан я получаю не от самой игры, а от копания в механике и логике игры.

Кстати, большое спасибо, NeseryozniyVET, за "наводку" на очень интересную книгу по программированию. Я имею в виду "Освой С++ за 21 день", которую ты упомянул в свой теме. Книгу я естественно нашел и сейчас читаю. Начальные уроки даже сам запрограммировал и посмотрел как это работает. Здорово и главное понятно! Сейчас бы времени свободного побольше, то глядишь бы и ..... Эх, мечты, мечты.

NeseryozniyVET
17.03.2011, 17:28
А что это за мод такой ТАС 2.03? Какая его основная идея?


Одновременно я продолжаю работать над собственной версией мода "1492: Глобальную Колонизацию". Насколько это будет кому-то нужно и интересно, я не знаю, но для меня это не важно, поскольку фан я получаю не от самой игры, а от копания в механике и логике игры.Как только выпустишь готовую версию игроки сразу появятся

P.S. У меня ту книгу за 21 день прочитать не получилось. Некоторые темы по 2 - 3 дня осваивал. Так что весь курс прошел за 33 дня. А более менее в програмировани освоился только после написания Vet Screen мода.

kabjans
18.03.2011, 10:05
А что это за мод такой ТАС 2.03? Какая его основная идея?

Если кратко, то ТАС 2.03 - это улучшенная и супер-продвинутая версия мода TAC 2.02a inoffiziell, который уже сейчас доступен для скачивания.

TAC 2.02a inoffiziell выпустили, по-моему, в декабре прошлого года и это самая последняя законченная разработка немецкой команды. Пару сообщений выше, я давал ссылку на скачивание. Стараясь остаться в пределах разумного, то есть не вводя массу новых ресурсов, юнитов и прочего, что напрочь разрушает баланс игры, немцы в ТАС моде отполировали Колонизацию до блеска, убрав кучу багов и глупостей разработчиков. Так, по крайней мере, они сами говорят. Я скачал их TAC 2.02a inoffiziell, поскольку меня интересовало, как они реализовали идею Whalingboat. Остальное я не смотрел, поэтому говорить хорошо или плохо сделано, не могу. Желающие сами могут скачать и посмотреть.
 
Относительно ТАС 2.03 я точно знаю, что это будет самой последней версией целой ТАС команды. После этого каждый из членов команды сможет клепать свои версии, где уже будет то, что каждому хочется. Сейчас это запрещено. Звучит конечно смешно, но надо понимать психологию немцев. "Ordnung muß sein!" - "Порядок превыше всего!" или говоря по-нашему "Шаг влево, шаг вправо - расстрел!" Внести что-то новое в уже согласованное - совершенно невозможно. Помню, когда я выпустил "1492: Slavery Market. The Orient. Port-Royal", где была введена работорговля с Африкой, то естественно ожидал, что немцы включать это в свой ТАС мод, тем более, что ТАС означает The Authentic Colonization (ТАС), то есть "подлинная, достоверная" колонизация, такая, как она была на самом деле. Работорговля в то время была? Была, более того это время ее расцвета! Откуда же тогда негры на Американском континенте появились в таком количестве уже в 16-17 веках? Ветром, что ли занесло. Значит надо работорговлю включать? Надо! Но немцы отказались, причем категорически! Естественно я спорить не стал. Но это лишний раз доказывает, что если работаешь над модом, то должен делать его один. Два и более членов в команде - это неизбежный компромисс, который лишь мешает. В данном случае отказ от работорговли поставил под очень большое сомнение "Authentic" характер их версии колонизации.

Впрочем, это лишь детали. При любых, когда ТАС 2.03 появится, а это будет очень скоро, я данную версию обязательно скачаю и буду смотреть, что и как там реализовано.

kabjans
07.04.2011, 22:38
Только получил информацию о разработке и датах выхода ТАС версий. Даю ее в переводе на русский:

"Сегодня команда, разрабатывающая ТАС мод, обсуждала время выхода ближайших версий. Предварительно решено, что в конце мая будет выпущена версия TAC 2.02b. Через примерно 6 недель появится версия 2.03, которая будет финальной версией мода"

Дополнительная доступная мне информация:

После выхода версия 2.03 отдельные члены группы смогут выпускать свои собственные моды и сценарии. Он из них, RWL уже находится в стадии тестирования и отладки. Знаю и об одном сценарии, который будет заточен под мистику. Детали, увы, автор просил не разглашать.

Если кого заинтересует, то полистайте эти страницы.

Скотобойня (http://www.civforum.de/showpost.php?p=4065660&postcount=250)

Избушка охотника (http://www.civforum.de/showpost.php?p=4066045&postcount=252)

Новые професии: часть 1 (http://www.civforum.de/showpost.php?p=4085770&postcount=313), часть 2 (http://www.civforum.de/showpost.php?p=4096664&postcount=332)

По ссылкам, что я привел выше, вы найдете совершенно обалденную графику, которую я ввожу в мой новый "1492" мод, частично делаю для RWL мода. Одновременно я делаю эту графику доступной для других разработчиков. Вопрос "кто первый сказал "Мяу"" меня не интересует в принципе, тем более, что эту графику я лишь конвертирую из различных игр и адаптирую для Колонизации вообще и своего мода в частности.

И на закуску.

Мельница на пшеничном поле (http://www.civforum.de/showpost.php?p=4099463&postcount=338)

Это самое последнее, что я собрал. Вчера несколько часов правил, но получилось здорово. Сегодня у меня один мой знакомый немец-мододел попросил этот файл. Ничего не обещал, но возможно (я стучу по дереву) мельница ко всему еще и заработает, то есть крылья начнут вращаться. Привинтить звук будет делом техники.

http://img13.imageshack.us/img13/3797/millinthegame.jpg

NeseryozniyVET
08.04.2011, 22:57
С такими наворотами это уже будет не мод, а addon!

kabjans
24.04.2011, 13:47
С такими наворотами это уже будет не мод, а addon!

Ну, на addon я естественно не претендую, да это мне и не надо, как ты понимаешь. Мод делаю для собственного удовольствия, причем так, чтобы в нем устраивало абсолютно все.

Вот самое последнее, что только что закончил.

Основная идея.
Здания в городе могут "расти", например, склад: WAREHOUSE => WAREHOUSE_EXPANSION. Аналогично по другим зданиям. Но это в городе.

Теперь что происходит за пределами городской черты? Единожды построенное улучшение остается неизменным до конца игры. Почему так и можно ли изменить? Да, можно и вот пример как.

Технологическая цепочка выглядит так:

BONUS_HONEY

4715

Посылаем рабочего стоить улей "Build Bee Hive"
4716

Bee Hive - это простейшее улучшение на бонусной клетке. Его описание дано на этом снимке из СивПедии. Через несколько ходов (я для ускорения поставил минимум) это улучшение автоматом превращается в улучшение второго уровня, то есть в пасеку (Apiary).

4713 (http://img20.imageshack.us/img20/1772/05beehiveincivpedia.jpg)

Обязательным условием такого перехода является наличие работника, который трудится на данной клетке. То есть сделано точно также, как в случае поселков-городов в Цивилизации.

Построит сразу пасеку на бонусной клетке невозможно. Введены соответствующие ограничения.

Вот момент непосредственно перед переходом Bee Hive => Apiary.

4717

И наконец последнее улучшение на этой же бонусной клетке.

Apiary (пасека)

4718

Приведенные здесь снимки собственно простейший вариант улучшений, что я делаю. Вчера специально для крестьянина сделал в черновом виде цепочку "изба => усадьба => поместье". Для нее осталось лишь графику отполировать до нужного уровня и правильно вычислить время перехода с одного уровня на другой.

В общем, работа над модом идет непрерывно, хотя я ее и не рекламирую особо.

P.S. Извиняюсь за качество картинок. В новом формате форума присоединить их правильно слишком мудрено. В результате получилось довольно плохо, так как прочитать текст на снимках практически невозможно. В этом смысле старый форум был на порядок лучше. Но это ИМХО.

micheline
24.04.2011, 18:21
:punk:
Главное не прекращай работу.
Верь в свои силы!

NeseryozniyVET
25.04.2011, 01:37
В общем, работа над модом идет непрерывно, хотя я ее и не рекламирую особо.А много еще работы осталось сделать до релиза?

Master of wishes
25.04.2011, 23:28
Доброго времени суток) Тут вопрос поднимался про кнопку докупки зданий что её убрать можно... помню было написано даже как, всё перелистал, нет нифига(( Толи потёрли толи ещё чего, но точно помню что было. Может кто подскажет ? Как и что править и где?
Интересно посмотреть будет на глобальный мод. Выдержки и творчества желаю в этом деле афтору)

kabjans
26.04.2011, 01:44
Доброго времени суток) Тут вопрос поднимался про кнопку докупки зданий что её убрать можно... помню было написано даже как, всё перелистал, нет нифига(( Толи потёрли толи ещё чего, но точно помню что было. Может кто подскажет ? Как и что править и где?
Интересно посмотреть будет на глобальный мод. Выдержки и творчества желаю в этом деле афтору)

Привет и спасибо всем за поддержку. Быстро сделать не обещаю, поскольку делаю мод один, но когда доведу его до надлежащего вида, то точно выложу в общий доступ.

Примерно через месяц-два появится RWL мод, о котором я говорил выше и в котором есть практически все наработки, что я делаю для своего мода "1492: Глобальная Колонизация". Вместе с тем, я далеко не со всем согласен с автором RWL мода, но со своими критическими замечаниями в его работу не лезу. В конце концов каждый мододел делает свой мод прежде всего под себя, основываясь на своих знаниях и идеях. Насколько они хороши и интересны, судить будут те, кто в мод будет играть.

Теперь относительно твоего вопроса. Я порылся в своих заметках и нашел ответ.


Строительство любых зданий в городе ускорить путем выплаты некой суммы денег невозможно. В файле CvMainInterface.py находишь строки


# BUTTONS
screen.setImageButton("HurryGold", ArtFileMgr.getInterfaceArtInfo("INTERFACE_EUROPE_PURCHASE_UNIT").getPath(), CITIZEN_BAR_WIDTH - (SMALL_BUTTON_SIZE), yResolution - BOTTOM_CENTER_HUD_HEIGHT - TRANSPORT_AREA_HEIGHT - (STACK_BAR_HEIGHT / 2) - SMALL_BUTTON_SIZE, SMALL_BUTTON_SIZE * 2, SMALL_BUTTON_SIZE * 2, WidgetTypes.WIDGET_HURRY, gc.getInfoTypeForString("HURRY_GOLD"), -1)
self.appendtoHideState(screen, "HurryGold", HIDE_TYPE_CITY, HIDE_LEVEL_HIDE)затем необходимо закрыть эти обе строки


# BUTTONS
# screen.setImageButton("HurryGold", ArtFileMgr.getInterfaceArtInfo("INTERFACE_EUROPE_PURCHASE_UNIT").getPath(), CITIZEN_BAR_WIDTH - (SMALL_BUTTON_SIZE), yResolution - BOTTOM_CENTER_HUD_HEIGHT - TRANSPORT_AREA_HEIGHT - (STACK_BAR_HEIGHT / 2) - SMALL_BUTTON_SIZE, SMALL_BUTTON_SIZE * 2, SMALL_BUTTON_SIZE * 2, WidgetTypes.WIDGET_HURRY, gc.getInfoTypeForString("HURRY_GOLD"), -1)
# self.appendtoHideState(screen, "HurryGold", HIDE_TYPE_CITY, HIDE_LEVEL_HIDE)Для этого ставишь в начале каждой строчки по такому # значку. После этого строительство зданий в городе ускорить больше нельзя. Это чистый Питон, так что можно делать прямо не выходя из игры.

Перед изменениями обязательно сделай резервную копию CvMainInterface.py.

NeseryozniyVET
26.04.2011, 15:55
Так может это дело сразу в SDK исправить.
Файл CvCity.cpp
Функция CvCity::canHurry
Найти if (getHurryYieldDeficit(eHurry, eYield) > 0) (их там два)
и после этого написать return false;
А Оригинальные коды в блоках этих условий закомментируй двумя слэшами (//), чтоб место в DLL не занимали.

После этого в функции CvCity::hurryGold закоментируй (но это не обязательно, так как он теперь при любом раскладе будет добавлять 0. Он теперь только занимает место в DLL и требует время на вычисления)

PlayerTypes eParent = GET_PLAYER(getOwnerINLINE()).getParent();
if (eParent != NO_PLAYER)
{
for (int iYield = 0; iYield < NUM_YIELD_TYPES; ++iYield)
{
YieldTypes eYield = (YieldTypes) iYield;
iGold += getHurryYieldDeficit(eHurry, eYield) * GET_PLAYER(eParent).getYieldSellPrice(eYield) * GC.getHurryInfo(eHurry).getYieldCostEuropePercent() / 100;
}
}

После этого ускорять производство можно будет только если в городе есть все необходимые ресурсы

P.S. Как успехи с освоением C++ ?

kabjans
26.04.2011, 20:09
Так может это дело сразу в SDK исправить.
Файл CvCity.cpp
Функция CvCity::canHurry
Найти if (getHurryYieldDeficit(eHurry, eYield) > 0) (их там два)
и после этого написать return false;
А Оригинальные коды в блоках этих условий закомментируй двумя слэшами (//), чтоб место в DLL не занимали.

После этого в функции CvCity::hurryGold закоментируй (но это не обязательно, так как он теперь при любом раскладе будет добавлять 0. Он теперь только занимает место в DLL и требует время на вычисления)

PlayerTypes eParent = GET_PLAYER(getOwnerINLINE()).getParent();
if (eParent != NO_PLAYER)
{
for (int iYield = 0; iYield < NUM_YIELD_TYPES; ++iYield)
{
YieldTypes eYield = (YieldTypes) iYield;
iGold += getHurryYieldDeficit(eHurry, eYield) * GET_PLAYER(eParent).getYieldSellPrice(eYield) * GC.getHurryInfo(eHurry).getYieldCostEuropePercent() / 100;
}
}После этого ускорять производство можно будет только если в городе есть все необходимые ресурсы

P.S. Как успехи с освоением C++ ?

Спасибо, NeseryozniyVET, за предложенный вариант.

Лично для себя, так я полностью убираю возможность покупки зданий независимо от того, есть необходимые материалы в городе или нет. В реале имей хоть мешок денег, но здание моментально никак появиться не сможет. В игре же при наличии денег можно покупать по зданию каждый ход. А это уже глупость.

Твой вариант помягче, поскольку ты закрываешь лишь возможность закупки и моментальной доставки недостающих товаров из Европы, что весьма разумно. Когда следующий раз я залезу в SDK, то попробую исправить.


P.S. Как успехи с освоением C++ ?Потихоньку продвигаюсь, но успехи могли бы быть и получше, если бы занимался подольше. Увы, но текущие дела не позволяют часами сидеть за компом.

Master of wishes
26.04.2011, 20:29
Лично для себя, так я полностью убираю возможность покупки зданий независимо от того, есть необходимые материалы в городе или нет. В реале имей хоть мешок денег, но здание моментально никак появиться не сможет. В игре же при наличии денег можно покупать по зданию каждый ход. А это уже глупость.

Полностью согласен. Сам смысл строительства и долгого игрового процесса пропадает.

Спасибо за быстрый ответ и подробное описание, всё "не работает" (в смысле кнопки больше нет).
Ато нервировало до безобразия =))

NeseryozniyVET
26.04.2011, 20:36
ИИ кнопкой не пользуется!!
Чтоб и ИИ не ускорял строительство, достаточно весь код в CvCity::canHurry заменить на return false;

kabjans
26.04.2011, 21:06
ИИ кнопкой не пользуется!!
Чтоб и ИИ не ускорял строительство, достаточно весь код в CvCity::canHurry заменить на return false;

А может быть даже и хорошо, что ИИ получает некий бонус в виде возможности ускорения строительства. ИИ и так сидит на сплошных читах, так что одним больше, одним меньше. Не велика потеря.

romello
05.05.2011, 00:05
Привет всем! Вижу что работа идет)))
Это радует.
Качаю мод немецкой команды. Поиграю отпишусь

kabjans
05.05.2011, 20:29
Привет всем! Вижу что работа идет)))
Это радует.
Качаю мод немецкой команды. Поиграю отпишусь

Привет, romello! У немцев почти готова следующая версия ТАС 2.03. Сейчас они ее переводят на английский. А следом за ней выйдет мод одного из авторов ТАС команды, который включает примерно 99% от "1492: Глобальной Колонизации" плюс масса совершенно нового. Я же параллельно и независимо работаю над своей версией "1492: ГК".

romello
08.05.2011, 03:07
немцы молодцы. шикарные изменения в интерфейс и спасибо за то, что убрали кучу лагов, если они реализуют этот интерфейс на моде "1492..." думаю это будет уже не мод. а аддон, как тут кто-то сказал.
исчерпаемые ресурсы тоже очень хорошее изменение, я думаю эти изменения в общем моде будут здорово смотреться.

kabjans, моды немцев не смогу скачать. ибо на месяц уезжаю в командировку на чукотку. Аляску не увижу))) но дыхание природы буду чувствовать)))

kirgre
21.07.2011, 21:32
Сижу и облизываюсь :0 Жду релиза. Очень.

romello
23.07.2011, 00:11
Всем привет! Кто-нибудь играл в новые моды, которые должны были быть выпущены немцами и французами?
Я вот на их сайты как-то залез, но никакой путной информации не нашел. Мож я искал не там?

dralexz
12.08.2011, 10:31
Приветствую.
Автор еще занимается модом? А то нашел ошибки и не знаю расписывать их или нет?
Или может кто даст ссылку на иностранный мод - немецкий, но лучше на английском)) Который схожий с этим.
Спасибо.

kabjans
13.08.2011, 20:43
Привет!

На пару дней вернулся к домой и пока снова не уехал отвечаю.


Всем привет! Кто-нибудь играл в новые моды, которые должны были быть выпущены немцами и французами?
Я вот на их сайты как-то залез, но никакой путной информации не нашел. Мож я искал не там?

Да, я видел ("играл") в оба мода. Кратко по порядку.

1. Немецкий RWL мод, что я видел, был самом первой Preview версией. Тогда это была закрытое тестирование, поэтому публичной ссылки не было.
Сейчас автор мода ее выложил на немецком форуме (http://www.civforum.de/showthread.php?t=71031&page=4).



Или может кто даст ссылку на иностранный мод - немецкий, но лучше на английском)) Который схожий с этим.
Спасибо.

Итак, Preview-Release RWL можно скачать по прямой ссылке отсюда (http://remixshare.com/dl/9ngw1/TAC%202.02a_inoffiziell.7z).

Сам мод на английском и на немецком.

На название не обрашайте внимание. Это именно RWL мод (версия 22.04.2011), где соединены разработки большой группы немецких моддеров-изготовителей TAC мода с идеями "1492. Global Colonization". Я самым теснейшим образом работал вместе с автором RWL мода до отъезда в командировку в конце весны, передавая ему свои разработки по ресурсам, улучшениям и прочему. Далеко не все им было принято (к примеру, автор не согласен с идеей исчепаемых минеральных ресурсов). Я не стал настаивать, а просто продолжил делать свой собствненный мод, помогая ему там, где мог. Осенью, когда я окончательно вернусь из поездок, то надеюсь продолжить совместную работу.

Финальная версия RWL мода появится ТОЛЬКО после выхода финальной версии TAC мода, которая несколько задерживается.

2. Французский мод.
Самая новейшая версия: Dawn of a New Era 2.00 (DoaNE) MOD (версия от 07.08.2011)
Прямая ссылка на все версии этого мода тут (http://www.atomicgamer.com/directory.php?id=29946).

Скачивать надо Dawn of a New Era 2.00 (DoaNE) MOD.

Сам мод на английском и на французском.

В "Dawn of a New Era 2.00" очень много новшеств. Абсолютно новый экран (точнее нескольких экранов) Европы, новая система иммиграции в Новый Свет, переработанная торговля с индейцами и многое-многое другое.

Повторяю, мод вводит очень много нового в игру, поэтому может быть сложен непосвященному. Авторы обещают напечатать мануал или нечто подобное, где объяснят все нововведения.
Пока же некоторые пояснения можно прочитать на их родном форуме (http://www.civfr.com/forums/index.php?showforum=358).

Все обсуждение на нем идет естественно на французском. Прекрасный повод вспомнить французский язык тем, кто когда-то его изучал.



Автор еще занимается модом? А то нашел ошибки и не знаю расписывать их или нет?

Да, занимаюсь, но в теплое время (с конца весны до середины осени) я в постоянных командировках. Только что приехал из России, в ближайший понедельник утром улетаю в Пиренеи.

Новую версию я делаю с нуля, при этом естественно использую наработки из уже опубликованной "1492. Global Colonization". Это значит, что ее ошибки вполне могут перекочевать в новую версию. Поэтому я буду очень признателен, если вкратце перечислишь найденные тобой баги. Это поможет мне повнимательнее посмотреть на слабые места. Заранее большое спасибо.

dralexz
16.08.2011, 18:35
Привет.
За ссылки спасибо, но я их уже нашел и опробовал.
TAC_2.02 и TAC 2.02b_inoffiziell:
В общих чертах: моды отшлифовывают оригинал, до того чем он должен был быть. Мои отзывы самые положительные! Играть было очень приятно!
TAC 2.02b_inoffiziell - хорош! НО вот RWL, как его описывают и какие скрины выкладывают, я жду с большей охотой!
Dawn of a New Era 2.00 - не разобрался до конца, но как я понял изменения в интерфейсе, но не принципе игры и не в расширении возможностей (ресурсы, юниты и прочее). Д и пираты не хотят торговать с Европой - виснут(

Касательно 1492. Global Colonization - затянуло!
На в скидку, то что портило впечатления:
- АИ тупит по страшному! Не развивается: 300 ходов, а у него 2-3 маленькие колонии. Улучшения строит только на специи, в основном.
- Постройка фермы и ранчо, должны давать разное кол-во зерна, например 3/2 вместо 2/2.
- ГЛАВНОЕ: продажа товаров в Европе дает двойной доход. Можно сидеть в Европе купить-продать и заработать(((
- Некоторые жители повышают свою профессию до Индейцев (добытчик золота и драг камней).
- на экране Европы пропадает кнопка "Найма", если разрешение по горизонтали меньше 1000.
- Имхо. Карты лучше отдельно: Америка, Африка, Китай...

romello
18.08.2011, 13:49
Спс за ссылки кабьянс!
Но все равно буду ждать мод!!! Только в твой буду играть!

Fitovec
23.11.2011, 14:08
эх, как жаль что самые интересные моды не на русском((( Открыл для себя новую колонизацию только неделю назад, оч. захотелось поставить норм. мод.... открыл. а на русском только "Русская Америка".... оч. хотелось этот мод на русском, но Автору не интересно его на русский перевести...... оч. жаль.

Tyddyner
18.08.2012, 13:36
Скажите, будут ли вестись и далее работы над модом? Просто есть несколько недоработок - например, в эпическом сценарии короли побеждают примерно к 1527 году (тут надо сильно сдвинуть временные рамки), некоторые профессионалы превращаются в индейцев, совершенно непонятно, что делать с рабами да и сильно не хватает технологического древа - например, нам доступна газета до массового внедрения печатного станка, а сразу после - телеграф. Кроме того, не хватает железных дорог и африканского экрана, где мы могли бы по настоящему закупать рабов.

kabjans
20.08.2012, 11:47
Скажите, будут ли вестись и далее работы над модом? Просто есть несколько недоработок - например, в эпическом сценарии короли побеждают примерно к 1527 году (тут надо сильно сдвинуть временные рамки), некоторые профессионалы превращаются в индейцев, совершенно непонятно, что делать с рабами да и сильно не хватает технологического древа - например, нам доступна газета до массового внедрения печатного станка, а сразу после - телеграф. Кроме того, не хватает железных дорог и африканского экрана, где мы могли бы по настоящему закупать рабов.

Работа над модом "1492: Global Colonization" ведется.

До сих пор были опубликованы ряд разработок.
- "1492: Global Colonization. Resource Pack", где введена масса новых ресурсов.
- "1492: Gold Rush 1.1" - где введены исчерпаемые минеральные ресурсы (в том числе россыпное золото). Этот мод основан исключительно на работе NeseryozniyVET, за что ему моя искренная благодарность.
В рамках этого мода я смог также реализовать рост восполнимых ресурсов (животные, морские продукты), если бонусная клетка вообще или какое-то время не обрабатывается. Эта часть пока не опубликована.
- "1492: Reefs and Weather" - где введены климатические явления (штормы, тайфуны, встречный и попутный ветер), рифы и т.д. Нынешняя версия этого мода (3.0, где переработана графика и введена зависимость скорости корабля от его повреждений, опять-таки благодаря разработкам NeseryozniyVET) пока не опубликована.
- "1492: Slavery Market. The Orient. Port-Royal" -где введены новые локации Африки, Востока и Порт Ройяля. Именно в Африке "рабы" станут живым товаром.
- "1492: Codex" - где разделены функции губернатора, представляющего в городе своего короля и обеспечивающего в нем порядок и рост производства, и "мятежного жителя", сеющего анархию и создающего предреволюционную ситуацию. В зависимости от этого рост производства может быть с плюсом (в городе порядок) или с минусом (в городе хаос).
- ранее была опубликована работа "Model: Mortally Dangerous Colonization" - где в частности введены пираты и дикие животные.

Конечный продукт - мод "1492: Global Colonization" - будет включать в себя все эти отдельные моды плюс то, что сейчас еще находится в стадии разработки.

В частности, сейчас я обдумываю как лучше отменить зависимость роста населения города от количества еды в нем. Еда, по-моему, должны быть одним из необходимых условий для роста населения, но не она должна определять когда население города возрастет. В принципе есть несколько вариантов как этом можно было реализовать. Все они достаточно сложны (слишком многое в игре завязано на еду), либо неоптимальны с точки зрения быстродействия. В общем, пока думаю....

И последнее. Играть придется на глобальной карте Земли, то есть плыть из Европы в Америку через всю Атлантику или Индию вокруг Африки, где путешественник может попасть в шторм, сесть на рифы или стать добычей пирата. Мод "1492: Global Colonization" разрабатывается именно под эту идею.

NeseryozniyVET
20.08.2012, 23:41
О! Появился!
Сколько еще до релиза осталось? А то твои коллеги уже TAC 2.03_final выпустили. Хочется и на полную версию твоего мода посмотреть.

kirgre
21.08.2012, 03:59
Присоединяюсь. Тоже хочу его посмотреть.

Можно ли скачать где-нибудь то, что есть сейчас? Кстати, хотелось бы, чтобы колония размера 22+ не занимала 3-4 клетки на карте. Не знаю, исправляемо это или нет, в ТАС - не исправлено.
Да, и будут ли государства иметь соответствующую площадь, Россия, например? Или будет просто по 2 королевских города на государство?

kabjans
21.08.2012, 12:01
Привет, NeseryozniyVET!


О! Появился!

Скорее просто забежал на форум, вернувшись из пятимесячной поездки. До зимы, к сожалению, предстоят еще как минимум две поездки, но к счастью, не такие длительные.



Сколько еще до релиза осталось?

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

Поэтому на данном этапе я избрал другую тактику. Все то, что будет включено в конечную версию "1492: Глобальная колонизация" мода, должно четко работать в отдельных минимодах или [MODCOMP] как их называют на civfanatics.com. Отсюда и появление перечисленных выше [MODCOMP] "1492: Gold Rush 1.1", "1492: Reefs and Weather", "1492: Slavery Market. The Orient. Port-Royal", "1492: Codex". Каждый из них посвящен чему-то одному и собственно поэтому отловить баг в таком минимоде намного проще.

Эти минимоды взаимно не перекрывают, а лишь дополняют друг друга. Из них, как из кирпичиков, любой желающий может без труда собрать свой собственный вариант мода, совместив вместе SDK, Python, xml, и получить желаемый результат. Это можно сделать быстро и просто, тем более, что все исходные коды включены в эти минимоды. Максимум, что реально необходимо править при таком совмещении - GameFont.tga и GameFont75.tga. Но это опять таки работа максимум на полчаса. Я пока эту работу не делаю, поскольку необходимо сделать еще несколько существенных корректировок.

Одну из них я уже назвал в своем предыдущем сообщении. Это отвязка прироста населения в городе от количества еды в нем.

Почему это необходимо сделать?

Потому что совершенно непонятно как прирост населения связан с запасами еды в городе. Я могу свести всю еду из моих соседних городов в один, рост населения в котором мне необходим. Или я могу элементарно купить еду у аборигенов (она там стоит очень дешево), завести ее в любой свой город и бац! - на следующий ход иметь еще одного жителя. Прямо как в сказке, однако! При больших запасах еды лишь мыши заводятся, да и то не сами по себе, а прибегают с округи на ее запах. А тут - бац! - и готовый колонист. Скажите, что это всего лишь игра. Правильно, игра и возможны упрощения. Но проблема еще и в том, что АИ сделан так, что этот элементарный трюк он не знает! А значит его не использует, то есть игрок получает огромный перевес над тупым АИ, поскольку может повторять этот прием нужное количество раз.

Теперь представим другой вариант. Каждый житель города генерит некое количество очков "рождаемости". К примеру, 2. Каждый ход город прибавляет по паре очков рождаемости на каждого жителя. Чем больше город по населению, тем быстрее он набирает "очки рождаемости". Когда количество набранных очков превышает некий предел, происходит появление нового жителя. Совершенно просто и разумно. Маленький по населению город растет медленно. Это происходит на начальных стадиях игры, когда иммиграция европейцев является определяющим фактором роста населения новой колонии. На более продвинутом этапе игры внутренний рост за счет "рождаемости" в городах делает внешную иммиграцию менее важной. Тоже понятно и логично!
К сожалению, это пока никто не делал, так что опереться (или говоря по-простому с3.14здить :))) готовое решение мне не откуда. Поэтому приходится искать собственный вариант решения.

Я не хочу полностью дублировать YIELD_FOOD, создавая новый YIELD_BIRTH_RATE, к примеру. Такое дублирование было возможно на более простом примере, когда я делал "копию" YIELD_BELLS вводя YIELD_CODEX в минимоде "1492: Codex". В случае еды все намного сложнее, так как игра заточена именно на добывание еды и дальнейший рост населения. Поэтому YIELD_FOOD связан слишком со многим. Но, ...

В игре есть такое понятие как foodConsumption, то есть количество еды съеденной всеми жителями данного города за данный ход. Мы его видим на экране города. Это "-Х Consumed". На снимке в левом нижнем углу. Мы непосредственно можем использовать это значение для вычисления рождаемости.

http://img337.imageshack.us/img337/5986/cityscreen01.jpg (http://img337.imageshack.us/img337/5986/cityscreen01.jpg)

Почему?

Потому что еду съедает только находящийся в городе или работающий на прилегающих к городу клетках колонист. То есть как раз тот юнит, который и должен генерить "очки рождаемости". Другими словами "количество съеденной всеми жителями города за ход еды" и есть количество "очков рождаемости", сгенерированными жителями за ход.

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



А то твои коллеги уже TAC 2.03_final выпустили.

Пока не видел, элементарно некогда. Но судя по номеру это уже конечная версия их мода.



Сколько еще до релиза осталось? Хочется и на полную версию твоего мода посмотреть.



Присоединяюсь. Тоже хочу его посмотреть.


Привет, kirgre! Мне тоже интересно посмотреть, но пока мод в стадии разработки. Желающие могут сами уже сейчас собрать свою версию из уже сделанного.

Или еще проще подождать конца недели (26.08.2012), когда появится первая версия мода "Religion and Revolution". Я им передал массу своих наработок из "1492: Глобальная колонизация". Далеко не со всем, что в этом моде есть я согласен, по крайней мере на момент моего последнего посещения тамошнего форума пять с половиной месяцев назад. Что там разрабы сделали за это врямя - я не знаю. Читать сотни страниц их форума у меня нет времени.



Кстати, хотелось бы, чтобы колония размера 22+ не занимала 3-4 клетки на карте. Не знаю, исправляемо это или нет, в ТАС - не исправлено.

Да, это исправимо. Открываешь текстовым редактором (к примеру, Notepad++) файл GlobalArtDefines.xml. Он находится тут: \Assets\XML\ArtCIV4\GlobalArtDefines.xml
Находишь в нем

<Define>
<DefineName>GAME_CITY_SIZE_EXP_MODIFIER</DefineName>
<fDefineFloatVal>1.05</fDefineFloatVal>
</Define>

Меняешь 1.05 на 0.5 (или 0.4), сохраяешь и видишь свой город в пределах одной клетки.



Да, и будут ли государства иметь соответствующую площадь, Россия, например? Или будет просто по 2 королевских города на государство?

Я деляю мод под реальную карту Земли, то есть Россия будет занимать свою реальную территорию. На 1492 год это лишь европейская территория, затем с возможностью расширения на восток в Сибирь. Два города должны быть у России. Один из них наверняка должен быть Архангельск, второй - возможно Москва или, как вариант Нижний Новгород. Два города необходимы для того, чтобы Россия как государство имело возможность расширения морским и сухопутным путями. Для основных европейских игроков (Испания, Португалия и т.д.) предусматривается только морская экспансия.

NeseryozniyVET
21.08.2012, 18:33
Сделал очки рождаемости (на правильность работы не проверял)

5539

kabjans
21.08.2012, 23:06
Сделал очки рождаемости (на правильность работы не проверял)

5539

Большое спасибо, NeseryozniyVET!

Я скачал и попробовал скомпилировать твой вариант BirthPoints.

При этом получил 4 сообщения об ошибках.

1. я исправил сам, поскольку там была лишняя скобка.

2. сообщение выглядит так:

CvGameCoreDLL\CvGlobals.cpp(2788): error C2662: 'CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD' : cannot convert 'this' pointer from 'const CvGlobals' to 'CvGlobals &'

и относится к этому участку кода:


//VET BirthPoints - begin 4/4
int CvGlobals::firstYield() const
{//YIELD_FOOD должен быть равен 0 в CvEnums.h
if (getBASE_BIRTH_POINTS_THRESHOLD() != 0) //line 2788
{return 0;}
return 1;//YIELD_FOOD не учитываем
}
//VET BirthPoints - end 4/4

3 и 4 сообщения такие:

CvGameCoreDLL\CvCity.cpp(5856): error C2475: 'CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD' : forming a pointer-to-member requires explicit use of the address-of operator ('&') and a qualified name
CvGameCoreDLL\CvCity.cpp(5856): error C2475: 'CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD' : forming a pointer-to-member requires explicit use of the address-of operator ('&') and a qualified name

Оба они относятся к одной и той же строке:


bool bUseBirthPoints = (GC.getBASE_BIRTH_POINTS_THRESHOLD != 0); //line 5856

Эти два последних сообщения об ошибке можно обойти, если строку 5856 в CvCity.cpp записать так:


bool bUseBirthPoints = true;

Абсолютно не уверен, что делаю правильно, (я очень далек от программирования) - но это помогло.

Сейчас смотрю как "объехать" оставшуюся ошибку...

Дополнено:

"Убрать" сообщение об ошибке можно если закрыть только проблемный участок кода


//VET BirthPoints - begin 4/4
int CvGlobals::firstYield() const
{//YIELD_FOOD должен быть равен 0 в CvEnums.h
/*
if (getBASE_BIRTH_POINTS_THRESHOLD() != 0) //line 2788
{return 0;}
return 1;//YIELD_FOOD не учитываем
*/
return 0;
}
//VET BirthPoints - end 4/4

Я поставил именно return 0, поскольку интерес предствляет случай, когда getBASE_BIRTH_POINTS_THRESHOLD() != 0.

В этом случае скомпилировать без ошибок CvGameCoreDLL.dll возможно, но реально BirthPoints не работают. Сразу же оговорюсь, что никаких изменений в CvMainInterface.py я не делал, поскольку питон для меня вообще темный лес.

Итак, я основал город, посадил в него 5 жителей, прирост еды за ход был равен нулю. Прогнал 100 ходов, прироста за счет рождаемости не было.
Затем при этом же CvGameCoreDLL.dll я увеличил на порядок значение BASE_BIRTH_POINTS_THRESHOLD, установив 2000 вместо 200. Результат тот же, за 100 ходов прироста населения не было.

Аналогичный результат (компиляция без ошибок, отсутствие прироста населения за счет BirthPoints) получается, если проблемный участок кода закрыт, но return 1.

Сейчас буду смотреть твой вариант более подробно.....

NeseryozniyVET
21.08.2012, 23:41
//line 2788
в файлах CvGlobals.h и CvGlobals.cpp после функии firstYield() убери слово const поскольку я функцию getBASE_BIRTH_POINTS_THRESHOLD() обявил без слова const. (Хотя можно в этих же файлах добавить const после getBASE_BIRTH_POINTS_THRESHOLD(). Хотя , лучше без этого const.)

//line 5856
После GC.getBASE_BIRTH_POINTS_THRESHOLD поставь (), чтоб получилось (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)


для BASE_BIRTH_POINTS_THRESHOLD установи маленькие значения, например 10

Скинь мне скомпилированый DLL, я у себя потестирую.

NeseryozniyVET
22.08.2012, 01:49
Вот сделал мод
http://rghost.ru/39925196

Вроде работает
Осталось только проверить поведение еды при разных комбинациях включения новой вместимости и очков рождения. Дело в том, что при включении очков рождаимости еда становится обычным грузом, как например доски. Каждый житель производит столько очков рождаимости сколько потребляет еды (по умолчанию 2). И еще, производство очков рождаимости за ход не могут быть больше чем количество еды в городе плюс излишек производства еды в этом ходу (В городе 5 жителей производят 5*2=10 ОР. В городе 3 еды и производится 12 еды. Излишек еды 12-10=2. Так как 3+2<10, то в этом ходу город произведет только 5 ОР заместь 10 возможных).
Информация об очках рождаимости в верхнем левом углу экрана города.

kabjans
22.08.2012, 09:38
Вот сделал мод
http://rghost.ru/39925196

Вроде работает
Осталось только проверить поведение еды при разных комбинациях включения новой вместимости и очков рождения.


Большое спасибо, NeseryozniyVET!

Твой мод скачал, но проверить смогу лишь вечером. Я сейчас не имею доступа к компу с установленной игрой. Поэтому и результаты тестов будут только вечером.

kabjans
22.08.2012, 22:43
Вот сделал мод
http://rghost.ru/39925196

Вроде работает
Осталось только проверить поведение еды при разных комбинациях включения новой вместимости и очков рождения.

Как и обещал выше, привожу результаты тестов.

В основе твой мод "BirthPoints_and_NewCapacity" работает правильно. ОГРОМНОЕ СПАСИБО!!!


Каждый житель производит столько очков рождаемости сколько потребляет еды (по умолчанию 2).

Логично, согласен на все сто.


производство очков рождаемости за ход не могут быть больше чем количество еды в городе плюс излишек производства еды в этом ходу
(В городе 5 жителей производят 5*2=10 ОР. В городе 3 еды и производится 12 еды. Излишек еды 12-10=2. Так как 3+2<10, то в этом ходу город произведет только 5 ОР заместь 10 возможных).

Тоже абсолютно правильно и логично. Прирост жителей возможен, когда они уверены, что прокормят свои чада. Пока еды в городе мало - о росте рождаемости можно забыть. Когда еды достаточно, причем даже если ее запасы не растут (я специально проверял этот вариант, о нем чуть ниже), то рост населения идет со скоростью 2 ОР на жителя. Тут все верно!

Итак вариант, когда нет прироста еды за ход, то есть все, что жители производят за ход - все съедается.
Город: 5 жителей, накоплено 48 еды, 0 прирост еды за ход.
Рост очков рождаемости: 2 ОР х 5 жителей = 10 ОР, то есть так, как и должно быть.
Прогнал эту ситуацию более 60 ходов (BASE_BIRTH_POINTS_THRESHOLD = 200), пока не родился новый житель.
Количество еды в городе за это время естественно не изменилось и осталось тем же, что и было в самом начале 48.

Тут все работает абсолютно правильно.

Первая ошибка возникает при отрицательном приросте еды за ход, то есть когда еды в городе производится меньше, чем ее потребляется. Пока выполняется условие

производство очков рождаемости за ход не могут быть больше чем количество еды в городе плюс излишек производства еды в этом ходу

прирост остается постоянным. Пока все правильно. Затем по мере уменьшения запасов еды он падает до нуля. Тоже все верно.

Но далее идет собственно ошибка. Наступает момент, когда прирост очков рождаемости - нулевой, запас еды в городе тоже нулевой, каждый ход мы имеем -Х FOOD (minus X FOOD), но население города при этом не уменьшается. Такой ситуация может оставаться сколь угодно долго.

По-моему, проблема кроется в участке кода (файл CvCity.cpp), ответственном за CvCity::doGrowth().

В оригинале это выглядит так:


void CvCity::doGrowth()
{
int iDiff;

CyCity* pyCity = new CyCity(this);
CyArgsList argsList;
argsList.add(gDLL->getPythonIFace()->makePythonObject(pyCity)); // pass in city class
long lResult=0;
gDLL->getPythonIFace()->callFunction(PYGameModule, "doGrowth", argsList.makeFunctionArgs(), &lResult);
delete pyCity; // python fxn must not hold on to this pointer
if (lResult == 1)
{
return;
}

iDiff = foodDifference();

changeFood(iDiff);
changeFoodKept(iDiff);

setFoodKept(range(getFoodKept(), 0, ((growthThreshold() * getMaxFoodKeptPercent()) / 100)));

if (getFood() >= growthThreshold())
{
if (AI_isEmphasizeAvoidGrowth())
{
setFood(growthThreshold());
}
else
{

UnitTypes eUnit = (UnitTypes)GC.getCivilizationInfo(getCivilizationType()).getCivilizationUnits(GC.getDefineINT("DEFAULT_POPULATION_UNIT"));
if (NO_UNIT != eUnit)
{
CvUnit* pUnit = GET_PLAYER(getOwnerINLINE()).initUnit(eUnit, (ProfessionTypes) GC.getCivilizationInfo(GET_PLAYER(getOwnerINLINE()).getCivilizationType()).getDefaultProfession(), getX_INLINE(), getY_INLINE());

changeFood(-(std::max(0, (growthThreshold() - getFoodKept()))));
}

gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), gDLL->getText("TXT_KEY_CITY_GROWTH", getNameKey()), "AS2D_POSITIVE_DINK", MESSAGE_TYPE_INFO, GC.getYieldInfo(YIELD_FOOD).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);


// ONEVENT - City growth
gDLL->getEventReporterIFace()->cityGrowth(this, getOwnerINLINE());
}
}
else if (getFood() < 0)
{
changeFood(-(getFood()));
if (getPopulation() > 1)
{
if (!AI_removeWorstPopulationUnit(false))
{
AI_removeWorstPopulationUnit(true);
}

gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), gDLL->getText("TXT_KEY_CITY_STARVING", getNameKey()), "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_INFO, GC.getYieldInfo(YIELD_FOOD).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), getX_INLINE(), getY_INLINE(), true, true);
}
else if (!isNative())
{
changeOccupationTimer(2);
}
}
}

Если я понимаю правильно, то тут логика довольно-таки простая.

Если запас накопленной еды (getFood()) больше или равен пределу, при котором происходит рост населения города (growthThreshold())


if (getFood() >= growthThreshold())

и если рост населения не запрещен


if (AI_isEmphasizeAvoidGrowth())
{
setFood(growthThreshold());
}

то происходит рост населения.

Если же (я пока рассматриваю оригинальный код), городские запасы еды меньше нуля


getFood() < 0

то происходит убыль населения города. Другими словами кто-то умирает от голода.

В твоем же варианте именно последнего и не происходит. Население съедает больше еды, чем производит, а когда запасы продовольствия оказываются равны нулю, они не уменьшаются далее и никто не умирает. А по логике должен!

Это первая ошибка.

Аналогичная ситуация возникает и при переполнении городского склада.
Этот момент не столь очевиден, но как мне кажется, это все же логическая ошибка. Все дело в том, что после введения очков рождаемости, еда стала обычным продуктом. А с учетом введения новой системы расчета вместимости городского склада, при переполнении склада, происходит автоматическая потеря наиболее дешевого продукта, хранящегося на городском складе. Вполне естественно (если посмотреть на европейские цены), то самым дешевым оказывается еда. Поэтому еда и теряется в первую очередь. Не древесина или еще что-то из хранящегося на складе, а именно еда. Однако с учетом значимости еды для жителей, мне кажется, что еду следовало бы исключить из "черного списка" на выброс, а еще лучше вообще исключить из расчетов запасов хранящихся на складе.

Конечно, можно существенно увеличить вместимость склада, но в процессе развития города момент переполнения склада все равно когда-то наступит и еда снова падет первой жертвой.

Вот ряд снимков из игры, которые характеризуют сказанное. В данном примере показано как переполнение склада приводит к потере еды как самого дешевого товара, затем к снижению очков рождаемости, производимых за ход, и наконец фактически к голоду в городе. Но при этом голоде (еды нет вообще!) никто не умирает. Я привожи номера ходов, чтобы рассмотреть процесс в динамике

Ход 25 Склад пока не заполнен до краев.

http://img28.imageshack.us/img28/2392/turn25.jpg (http://imageshack.us/photo/my-images/28/turn25.jpg/)

Ход 27. "Эх, полным-полна моя коробочка!" :)

http://img687.imageshack.us/img687/186/turn27d.jpg (http://imageshack.us/photo/my-images/687/turn27d.jpg/)

Ход 29A. Первое сообщение о потере еды

http://img337.imageshack.us/img337/4010/turn29a.jpg (http://imageshack.us/photo/my-images/337/turn29a.jpg/)

Тот же ход 29B, но в городе. Еды потеряно 9 единиц. осталось тоже 9, но это пока больше, чем требуется четырем жителям (8)

http://img232.imageshack.us/img232/4747/turn29b.jpg (http://imageshack.us/photo/my-images/232/turn29b.jpg/)

Ход 32 Начало голода в городе, еды нет вообще, но жители все же потребляют 8 единиц еды за ход. Откуда только они ее берут?

http://img38.imageshack.us/img38/1074/turn32.jpg (http://imageshack.us/photo/my-images/38/turn32.jpg/)

Ход 42 Голод длится уже 10 ходов, все живы и продолжают питаться несуществующей едой.

http://img715.imageshack.us/img715/4498/turn42.jpg (http://imageshack.us/photo/my-images/715/turn42.jpg/)

И наконец последнее.

Это не относится непосредственно к моду "BirthPoints_and_NewCapacity", это скорее общий вопрос. Просто твой мод, где введены очки рождаемости и именно по этой причине происходит рост населения города, показал ненужность и, более того, вредность кнопки "AvoidGrowth". Запретить рост населения можно было, если в качестве критерия роста была еда. Там все логично. Нет еды - нет роста населения.

В твоем же случае такое ограниние ("Нет еды - нет роста населения") работает автоматически. А кнопка "AvoidGrowth" оказывается не просто лишней, но нелогичной и исторически ошибочной, особенно для периода средних веков, к которым относится эпоха колонизации. Тогда рост населения никак не ограничивался, к примеру, по религиозным соображениям.

Конечно, нет смысла закрывать AvoidGrowth в исходных кодах. Возможно проще и быстрее с помощью значка (#) прикрыть эту кнопку CvMainInterface.py?

Я помнится прикрывал значком (#) кнопку "HurryGold" (ускоренного строительства зданий в городе за деньги). Там все было просто. А вот с кнопкой "AvoidGrowth" так просто не получилось. Закрытие этих двух строк дает массу ошибок в питоне.


# GROWTH EMPHASIZE/DEMPHASIZE
screen.setImageButton("AvoidGrowth", ArtFileMgr.getInterfaceArtInfo("INTERFACE_BUTTONS_CANCEL").getPath(), xResolution * 1 / 100, CITY_TITLE_BAR_HEIGHT / 10, ScrollButtonSize, ScrollButtonSize, WidgetTypes.WIDGET_EMPHASIZE, -1, AVOID_GROWTH)
self.appendtoHideState(screen, "AvoidGrowth", HIDE_TYPE_CITY, HIDE_LEVEL_HIDE)

Может быть как-нибудь от этой кнопки можно избавиться в CvMainInterface.py?

NeseryozniyVET
23.08.2012, 02:26
На счет автомотической продажи еды. Может сделать новый параметр в GlobalDefinesAlt.xml в котором указать минимальное количество ходов, для которых будет сохранятся еда в городе? Например, если етот параметр равен 10 и в городе 4 жителя (потребляют 8 еды за ход), то еда будет продаватся пока ее количество больше 10 * 8 = 80.

Жители в твоем примере не умирают с голода, потому что никакого голода на скриншотах нету (Под едой нету отрицательного числа). Жители производят столько еды, сколько потребляют: 5 от рыбака + 2 от города + 1 от фермера = 8.

Завтра посмотрю как кнопку убрать.

kirgre
23.08.2012, 03:48
Вообще, насколько я помню, в оригинальной кол2 жители не умирают, а уезжают из города на глобальную карту.

По ресурсам: Будет ли древесина ресурсом исчерпаемым? Возможно ли сделать так, чтобы на клетке без улучшений и с лесной клеткой рядом постепенно вырастал лес? Будет смена тайла: равнина->поросль->лес. В случае, если лес - ресурс исчерпаемый, будет ли ёмкость "месторождения" постепенно возрастать до какого-то предела? Возможно ли сделать этот предел разным для разных типов ресурсов? Золото, допустим, 1750 единиц, а камень, которого всюду много - 15000?

Кстати, я предлагаю сделать так: для строительства корабля нужно не 900 молотков, к примеру, а 250 молотков и 650 единиц древесины.

Если будут рабы, м.б. сделать возможным восстание или побег, как в моде Pie's Ancient Europe?

Возможно, что это всё уже продумано и введено, но я написал, на всякий случай.

NeseryozniyVET
23.08.2012, 06:35
Для того чтоб избавится от кнопки надо убрать все коды связаные с названием "AvoidGrowth". Там два таких кода: первый ты указал, а второй начинается со строчки 2468

Подправил автоматическую продажу еды (DLL там старый, поэтому сам скомпилируй его из вложеных исходников. Я там только три файла изменил)
http://rghost.ru/39947697

kabjans
23.08.2012, 10:05
Подправил автоматическую продажу еды (DLL там старый, поэтому сам скомпилируй его из вложеных исходников. Я там только три файла изменил)
http://rghost.ru/39947697

BirthPoints_and_NewCapacity.7z скачивал несколько раз, но распаковать не получается. Архиватор пишет, что файл битый. Если можно, то перепакуй, пожалуйста, еще раз. Для экономии места можно без старого DLL. Он уже не нужен, а новый я сам скомпилирую за пару минут.


Для того чтоб избавится от кнопки надо убрать все коды связаные с названием "AvoidGrowth". Там два таких кода: первый ты указал, а второй начинается со строчки 2468

Спасибо, сегодня попробую прикрыть и эти строки.



if pCity.AI_isEmphasize(AVOID_GROWTH):
screen.overlayButtonGFC("AvoidGrowth", ArtFileMgr.getInterfaceArtInfo("INTERFACE_HIGHLIGHTED_BUTTON").getPath())
else:
screen.overlayButtonGFC("AvoidGrowth", None)




Вообще, насколько я помню, в оригинальной кол2 жители не умирают, а уезжают из города на глобальную карту.

Разве? По-моему жители без еды все же умирают. Хотя надо посмотреть...



По ресурсам: Возможно ли сделать этот предел разным для разных типов ресурсов? Золото, допустим, 1750 единиц, а камень, которого всюду много - 15000?


Можно. Размер исчерпаемого минерального ресурса уже сделан разным. Запас месторождения железной руды намного выше, чем угля, серы, соли, серебра или золота. Россыпное золото встречается лишь по берегам рек причем в малых количествах. Камень, поскольку он добывается исключительно в горах, ресурс неисчерпаемый.

Более того, я убрал халяву, когда все было везде. Если раньше железную руду можно было добывать на любом холме, то сейчас только из месторождений, которых мало. Поэтому если игрок хочет производить что-то из металла (инструменты или оружие), то он должен найти такое месторождение и удерживать его от захвата соперником.

Было бы здорово ввести в игру старателя (геолога), который мог бы открывать новые месторождения. Весной я уже сделал первые шаги в этом направлении через Events. Вроде бы работает, но полученный вариант меня пока полностью не устраивает.



По ресурсам: Будет ли древесина ресурсом исчерпаемым? Возможно ли сделать так, чтобы на клетке без улучшений и с лесной клеткой рядом постепенно вырастал лес? Будет смена тайла: равнина->поросль->лес. В случае, если лес - ресурс исчерпаемый, будет ли ёмкость "месторождения" постепенно возрастать до какого-то предела?

Древесина как исчерпаемый ресурс? В принципе почему бы и нет. За последние столетия запасы леса на Земле резко уменьшились, так что с точки зрения достоверности, все в порядке.

Смена клеток по типу "равнина->поросль->лес", если не ошибаюсь, делается через Events. Если прописать древесину как исчерпаемый ресурс, то можно ввести нулевой запас "месторождения" древесины на равнине, минимальный для поросли и максимальный для леса. Смена тайла в ряду "равнина->поросль->лес" будет автоматически повышать запас "месторождения" древесины.



.... ёмкость "месторождения" постепенно возрастать до какого-то предела?

Когда я делал восполнимыми животные месторождения (мех, рыба и т.д), я думал о верхнем пределе.

В идеале было бы здорово, если, к примеру, на бонусной клетке количество бобров (мех) достигает некоего максимума, то аналогичный бонус генерится на соседней клетке. Это совершенно разумно с точки здения природы. Каждая клетка - это некая ограниченная по размерам территория, на которой может прокормиться только определенное количество животных. Если максимальный предел превышен, то происходит миграция животных туда, где для них есть еда, то есть в нашем случае на соседнюю подходящюю клетку. В самом начале вновь появившаяся бонусная клетка очень бедная, но если она не обрабатывается и находится за пределами границ города, то запас "меха" на этой клетке постепенно возрастает растет.

Можно ли (и проще ли) это сделать через Events или необходимо более серьезное программирование (SDK), я пока не знаю. Этот момент на стадии обдумывания.

NeseryozniyVET
23.08.2012, 10:26
У меня нормально рапаковуется

Ладно, вот новый архив
http://rghost.ru/39949086

kabjans
23.08.2012, 10:53
У меня нормально рапаковуется

Ладно, вот новый архив
http://rghost.ru/39949086

То же самое.:(

Ошибка идет как при открывании 7-Zip, так и при WinRAR.

5545

kabjans
23.08.2012, 11:53
То же самое.:(

Ошибка идет как при открывании 7-Zip, так и при WinRAR.



После танца с бубном вокруг компьютера и установки самой распоследней версии 7-Zip (http://7-zip.en.softonic.com/download) открыть архив с третьего раза (!!!) удалось!

Почему такая фигня приключилось - не знаю. Вчерашний твой архив раскрылся старым архиватором без проблем и с первого раза. Впрочем, неважно. Бубен я повесил пока на стенку рядом с компом. :D

kabjans
23.08.2012, 13:36
Для того чтоб избавится от кнопки надо убрать все коды связаные с названием "AvoidGrowth". Там два таких кода: первый ты указал, а второй начинается со строчки 2468

Помогло! Кнопку "AvoidGrowth" удалось убрать. Но в данном случае я этим трюком пока не пользовался, и в дальнейшем использовал твой CvMainInterface.py файл без всяких изменений.



Подправил автоматическую продажу еды (DLL там старый, поэтому сам скомпилируй его из вложеных исходников. Я там только три файла изменил)
http://rghost.ru/39947697

Скомпилировал со второй попытки. Первая не удалась, поскольку в файле CvGlobals.cpp было дважды прописано одно и то же.


//VET BirthPoints - begin 3/4
int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
{return m_iBASE_BIRTH_POINTS_THRESHOLD;}

int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
{return m_iBASE_BIRTH_POINTS_THRESHOLD;}
//VET BirthPoints - end 3/4

а должно быть, как я понимаю, так:


//VET BirthPoints - begin 3/4
int CvGlobals::getBASE_BIRTH_POINTS_THRESHOLD()
{return m_iBASE_BIRTH_POINTS_THRESHOLD;}

int CvGlobals::getTURNS_FOR_FOOD()
{return m_iTURNS_FOR_FOOD;}
//VET BirthPoints - end 3/4

После этого скомпилировать удалось без проблем, но при входе в город выскакивает этот экран и .....

http://img853.imageshack.us/img853/3503/error1mx.jpg (http://imageshack.us/photo/my-images/853/error1mx.jpg/)

NeseryozniyVET
23.08.2012, 17:41
Пишет что в питон не выведена функция getTotalYieldStored
Я эту функцию в питон выводил, так что надо перекомпилировать заново DLL используя все файлы SDK, которые идут с моим модом. (эта функция выводится в питон через файлы CyCity.h, CyCity.cpp, CyCityInterface1.cpp)

kabjans
23.08.2012, 18:22
Пишет что в питон не выведена функция getTotalYieldStored
Я эту функцию в питон выводил, так что надо перекомпилировать заново DLL используя все файлы SDK, которые идут с моим модом. (эта функция выводится в питон через файлы CyCity.h, CyCity.cpp, CyCityInterface1.cpp)

Сейчас повторю компиляцию, но прошлый раз я в директорию с исходные кодами перенес все твои 12 файлов.

Минуточку....



Опаньки, получилось! Большое спасибо!

Не иначе как исправляя опечатку в CvGlobals.cpp я забыл забыл выполнить команду "Clean GameCore.dll", а тупо продолжил компиляцию.


На счет автомотической продажи еды. Может сделать новый параметр в GlobalDefinesAlt.xml в котором указать минимальное количество ходов, для которых будет сохранятся еда в городе? Например, если етот параметр равен 10 и в городе 4 жителя (потребляют 8 еды за ход), то еда будет продаватся пока ее количество больше 10 * 8 = 80.

Очень разумно. Это получается нечто НЗ - неприкосновенного запаса. Поскольку этот параметр задается в GlobalDefinesAlt.xml то его, равно как и BASE_BIRTH_POINTS_THRESHOLD, надо будет подбирать экспериментально.




Жители в твоем примере не умирают с голода, потому что никакого голода на скриншотах нету (Под едой нету отрицательного числа). Жители производят столько еды, сколько потребляют: 5 от рыбака + 2 от города + 1 от фермера = 8.

Тоже верно. В приведенном выше случае жители не голодали. Это я снова лопухнулся. Они просто съедали все производимое за ход.

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


Вообще, насколько я помню, в оригинальной кол2 жители не умирают, а уезжают из города на глобальную карту.

Я почему-то был твердо уверен, что они вымирают. Да, наверное надо хоть иногда запускать игру для игры, а не для моддинга. :confused:

kabjans
24.08.2012, 10:59
В самой последней версии, скомпилированной вчера, нашел довольно странное поведение при переполнении городского склада.

Начальная логика при переполненном складе случае была понятна:

Если склад переполнен, то теряются наиболее дешевые товары.
Поэтому когда еда стала обычным ресурсом, то именно она и терялась.

Затем был введен TURNS_FOR_FOOD или количество ходов, на которое будет накапливатся еда в городе (учитывая ее потребление всеми жителями города) вне зависмости от заполнености склада другими ресурсами при включеном NEW_CAPACITY.

Тоже все совершенно логично. Таким образом создавался некий городской "неприкосновенный запас" еды.

Однако в реальности почему-то получается по другому. Вот пример:

Город 4 человека. Запас еды 62. Это значение, равно как и население, по ходу игры не меняются.
TURNS_FOR_FOOD = 12.
Таким образом можно вычислить "неприкосновенный запас" еды для города. Он равен


2 еды х 4 человека х 12 ходов = 96 еды
Это значение больше, чем то количество еды, что есть в городе (62).
Из этого следует, что еда не будет исчезать при переполнении склада. Прекрасно!

Теперь смотрим что есть на складе. На городском складе есть древесина (самый дешевый товар, цена продажи 1 монета), шкуры, табак (продается за 3 монеты) и сигары (самый дорогой товар, 6 монет за штуку).

http://img140.imageshack.us/img140/303/wood1tabak3cigars6.jpg (http://imageshack.us/photo/my-images/140/wood1tabak3cigars6.jpg/)

При переполнении склада по логике должны были исчезать доски (древесина), как самый дешевый товар. Не еда, поскольку ее запас меньше критического (62<96), а именно древесина.

Реально же исчезают только (!!!) сигары или табак. Странно?

Я провел дополнительный тест, подселяя в город по очереди пионера (на складе появилось +150 инструментов), затем ветерана (+150 оружия) и наконец скаута (+150 лошадей).

После каждого такого подселения на следующий ход из склада исчезали по очереди 150 инструментов, 150 ружей, 150 лошадей. При этом количество древесины, как самого дешевого товара, оставалось неизменным.

http://img708.imageshack.us/img708/2286/lostgoodslongcorr.jpg (http://imageshack.us/photo/my-images/708/lostgoodslongcorr.jpg/)

Другими словами всегда исчезает не самый дешевый, а самый крайний справа товар. Почему не работает старая логика, когда исчезать должен самый дешевый товар, совершенно непонятно?

NeseryozniyVET
24.08.2012, 13:01
Вечером попробую разобратся.

NeseryozniyVET
24.08.2012, 20:31
В файле CvCity.cpp найди строчку номер 6095:
if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
и измени ее так чтоб получилось
((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании :confused:

kabjans
24.08.2012, 23:01
В файле CvCity.cpp найди строчку номер 6095:
if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
и измени ее так чтоб получилось
((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании :confused:

Спасибо, сейчас попробую.....

Скомпилировал и уже попробовал. Все работает прекрасно! При переполнении городского склада исчезает самый дешевый товар, в моем случае - древесина. То есть именно так, как и должно быть. Здорово!

ОГРОМНЕЙШЕЕ СПАСИБО, NeseryozniyVET! :worthy::worthy::worthy:

NeseryozniyVET
25.08.2012, 04:48
Проверь на нормальное удаление еды. Сделай чтоб еды было болше необходимого минимума, а потом переполняй склад.

kabjans
25.08.2012, 10:38
Проверь на нормальное удаление еды. Сделай чтоб еды было болше необходимого минимума, а потом переполняй склад.

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

kabjans
30.08.2012, 11:05
Привет, NeseryozniyVET!

Все эксперименты я проводил с учетом твоей последней корректировки:

В файле CvCity.cpp найди строчку номер 6095:
if ((iYieldStored != 0) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))
и измени ее так чтоб получилось
((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))

Случайно удалил нужное условие (которое и находило минимальную цену) при редактировании

Вот результаты тестов.

Проверь на нормальное удаление еды. Сделай чтоб еды было больше необходимого минимума, а потом переполняй склад.
При переполнении склада (в том числе и едой сверх "неприкосновенного запаса") первой исчезает избыточная еда. Когда запас еды оказывается равным неприкосновенному запасу, то еда больше не удаляется.

Для города с населением 2 человека мы имеем

2 еды х 2 человека х 12 ходов = 48 еды
Это для нормальной скорости. Если игра идет на марафоне, то 48 надо умножить на коэффициент 3, будет 144. Именно это я и наблюдаю.

Таким образом, данная часть мода работает совершенно правильно.

Однако затем возникает ошибка. Если до твоей последней корректировки с переполненного склада удалялся не самый дешевый, а самый крайний справа товар, то сейчас удаление идет в обратном порядке начиная с древесины и далее слева направо.

Для того, чтобы наверняка поймать эту ошибку я специально подредактировал CIV4YieldInfos.xml, задав новые цены при продаже:


древесина (2 монеты), хлопок (5), шкуры (6), сахар (7), табак (4), руда (3)

По логике должно быть

Если склад переполнен, то теряются наиболее дешевые товары.

После того, как запас еды стал равен неприкосновенному запасу, первой с переполненного склада исчезает древесина, что правильно, ибо она самый дешевый товар (2 монеты). Следующим кандидатом на удаление должна быть руда (3 монеты), поскольку после того, как вся древесина исчезла, именно она оказывается самым дешевым товаром. Однако вместо нее первым со склада исчезает хлопок (5 монет).

http://img440.imageshack.us/img440/4360/cottonasalostgoodsvar1.jpg (http://imageshack.us/photo/my-images/440/cottonasalostgoodsvar1.jpg/)

Если хлопка нет, то первыми исчезают шкуры (6 монет), затем более дешевый табак (4 монеты). До удаления железной руды, как самого дешевого товара дело не доходит.

http://img543.imageshack.us/img543/2559/fursasalostgoods.jpg (http://imageshack.us/photo/my-images/543/fursasalostgoods.jpg/)

Таким образом, в данном варианте программа не может найти самый дешевый товар, а удаляет самый первый из списка после еды:

CvEnums.h:

YIELD_FOOD,
YIELD_LUMBER,
YIELD_SILVER,
YIELD_COTTON,
YIELD_FUR,
YIELD_SUGAR,
YIELD_TOBACCO,
YIELD_ORE,
YIELD_CLOTH,
YIELD_COATS,
YIELD_RUM,
YIELD_CIGARS,
YIELD_TOOLS,
YIELD_MUSKETS,
YIELD_HORSES,
YIELD_TRADE_GOODS,

NeseryozniyVET
30.08.2012, 16:57
Просмотрел алгоритм, вроде, все правильно.
Может дело в том, что используется не цена в CIV4YieldInfos.xml, а цена в Европе, причем, если в товар в Европе продавать нельзя, то цена считается 0.

kabjans
31.08.2012, 10:47
Просмотрел алгоритм, вроде, все правильно.

Странно....



Может дело в том, что используется не цена в CIV4YieldInfos.xml, а цена в Европе, причем, если в товар в Европе продавать нельзя, то цена считается 0.

Да нет, не похоже. Я тестирование проводил на примере города, который стоил через WorldBuilder, размещая нужное количество поселенцев на какой-то определенной клетке. Корабль с поселенцами я останавливал на первом ходу и он оставался в начальной точке все время. Это означает, что с Европой я не торговал вообще, а следовательно король не мог вводить мне налоги, а я от этого предложения соответственно отказываться. Другими словами, ни один из моих товаров не подпадал под запрет на продажу в Европе.

Относительно цены я не совсем понял твою мысль. Все цены на торговлю с Европой и туземцами прописаны в CIV4YieldInfos.xml. В этом файле есть целый букет тегов, связанных с ценами. Для хлопка к примеру это выглядит так:


<iBuyPriceLow>3</iBuyPriceLow>
<iBuyPriceHigh>5</iBuyPriceHigh>
<iSellPriceDifference>2</iSellPriceDifference>
<iPriceChangeThreshold>800</iPriceChangeThreshold>
<iPriceCorrectionPercent>2</iPriceCorrectionPercent>
<iNativeBuyPrice>-1</iNativeBuyPrice>
<iNativeSellPrice>5</iNativeSellPrice>

Европейская цена находится в пределах от 3 до 5 монет.


<iBuyPriceLow>3</iBuyPriceLow>
<iBuyPriceHigh>5</iBuyPriceHigh>

Именно одно из этих значений - 3, 4 или 5 - мы видим, когда наводим курсор на значок хлопка на экране города. Естественно можно пойти на экран Европы, но и там мы увидем ту же самую цену. Поэтому европейские цены, действующие в данный момент, проще смотреть прямо на городском экране.

Однако эти цены, во-первых, колеблются в неких пределах (<iSellPriceDifference>), во-вторых, в оригинальной версии игры они очень близки или даже равны друг к другу.

Поэтому для прояснения ситуации я при тестировании твоего мода подредактировал CIV4YieldInfos.xml, задав новые цены при продаже:

древесина (2 монеты), хлопок (5), шкуры (6), сахар (7), табак (4), руда (3)

При этом оба значения <iBuyPriceLow> и <iBuyPriceHigh> были одними и теми же для данного товара. Это позволило мне избавиться от колебания европейских цен. Причем, обрати внимание на порядок цен. После дешевой древесины (2 монеты) я специально поставил более дорогие хлопок (5), шкуры (6), сахар (7), а лишь потом более дешевые табак (4) и руду (3). Однако при переполнении городского склада почему-то сперва исчезали более дорогие хлопок (5), шкуры (6), сахар (7), а лишь потом более дешевые табак (4) и руда (3). Причем, что самое важное - удаление излишков шло совершенно четко слева направо.

Возможно именно этот ньюанс позволит понять логику принятия решения какой товар удалять.

NeseryozniyVET
01.09.2012, 11:11
Будем искать ошибку так
Добавь новые строчки (отмечени красным) в алгоритм поиска самого дешевого ресурса


if (GC.getYieldInfo((YieldTypes)iYield).isCargo())
{
iYieldStored = getYieldStored((YieldTypes)iYield);
CvWString szBuffer = CvWString::format(L"/t%c, Stored%d, Price%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
//VET BirthPoints - begin 11/16
/*if ((iYieldStored > 0) && (aiPrices[iYield] < iMinPrice))
{
iLossYieldStored = iYieldStored;*/

if ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))//iYieldStored отрицательным быть не может
{
CvWString szBuffer = CvWString::format(L"/t/t%c, Stored%d, PriceNew%d, PriceOld%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield], iLossYield == -1 ? -1 : aiPrices[iLossYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);
iLossYieldStored = iYieldStored;
if (iYield == YIELD_FOOD)//это возможно только когда (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)
{iLossYieldStored -= iMinFood;}
//VET BirthPoints - end 11/16
iMinPrice = aiPrices[iYield];
iLossYield = iYield;
}
}

доведи склад до переполнения и смотри на сообщения
Синее сообщение - проверяемый ресурс, его количество на складе и цена продажи (проверить эти значения с значениями в городском экране)
Зеленое сообщение - прошедший проверку ресурс. Ресурс цена которого ниже цены ресурса в прошлом (нижнем) зеленом сообщении. В сообщении будет цена нового и старого ресурса для сравнения.
Проанализируй сообщения и определи какой ресурс и по каким причинам не прошол правильную проверку

kabjans
03.09.2012, 10:43
Будем искать ошибку так
Добавь новые строчки (отмечени красным) в алгоритм поиска самого дешевого ресурса


if (GC.getYieldInfo((YieldTypes)iYield).isCargo())
{
iYieldStored = getYieldStored((YieldTypes)iYield);
CvWString szBuffer = CvWString::format(L"/t%c, Stored%d, Price%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
//VET BirthPoints - begin 11/16
/*if ((iYieldStored > 0) && (aiPrices[iYield] < iMinPrice))
{
iLossYieldStored = iYieldStored;*/

if ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))//iYieldStored отрицательным быть не может
{
CvWString szBuffer = CvWString::format(L"/t/t%c, Stored%d, PriceNew%d, PriceOld%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield], iLossYield == -1 ? -1 : aiPrices[iLossYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);
iLossYieldStored = iYieldStored;
if (iYield == YIELD_FOOD)//это возможно только когда (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)
{iLossYieldStored -= iMinFood;}
//VET BirthPoints - end 11/16
iMinPrice = aiPrices[iYield];
iLossYield = iYield;
}
}

доведи склад до переполнения и смотри на сообщения
Синее сообщение - проверяемый ресурс, его количество на складе и цена продажи (проверить эти значения с значениями в городском экране)
Зеленое сообщение - прошедший проверку ресурс. Ресурс цена которого ниже цены ресурса в прошлом (нижнем) зеленом сообщении. В сообщении будет цена нового и старого ресурса для сравнения.
Проанализируй сообщения и определи какой ресурс и по каким причинам не прошол правильную проверку

Итак, начинаем искать. Вот отчет о том, что получилось и что я увидел на экране.

Твой вариант с новыми строчками я скомпилировал без проблем. Более того можно даже запустить игру без каких-либо сообщений об ошибке. Но, в конце самого первого хода при нажатии кнопки окончания хода происходит сбой и выброс на основной экран виндовса.

К счастью, я проводил тестирование на том же компе, где и компилировал CvGameCoreDLL.dll, поэтому нажав на экране об ошибке на кнопку "Debug", я сразу же увидел строку, из-за которой происходил сбой.


gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iLossYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);

Далее уже моя "самодеятельность". Я посмотрел как пишутся такого рода строки в исходных файлах и что им предшествует. После этого я внес небольшое изменение. Вместо "iLossYield" я записал "iYield".
В итоге конечная строка выглядела так:


gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);

Аналогичный трюк с заменой "iLossYield" на "iYield" я проделал и для следующей строки.

В итоге твой код получился в таком виде:



if (GC.getYieldInfo((YieldTypes)iYield).isCargo())
{
iYieldStored = getYieldStored((YieldTypes)iYield);
CvWString szBuffer = CvWString::format(L"/t%c, Stored%d, Price%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_BLUE"), getX_INLINE(), getY_INLINE(), true, true);
//VET BirthPoints - begin 11/16
/*if ((iYieldStored > 0) && (aiPrices[iYield] < iMinPrice))
{
iLossYieldStored = iYieldStored;*/

if ((iYieldStored != 0) && (aiPrices[iYield] < iMinPrice) && (!bBIRTH_POINTS || ((iYield != YIELD_FOOD) || (iYieldStored > iMinFood))))//iYieldStored отрицательным быть не может
{
CvWString szBuffer = CvWString::format(L"/t/t%c, Stored%d, PriceNew%d, PriceOld%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), iYieldStored, aiPrices[iYield], iLossYield == -1 ? -1 : aiPrices[iLossYield]);
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), getX_INLINE(), getY_INLINE(), true, true);
iLossYieldStored = iYieldStored;
if (iYield == YIELD_FOOD)//это возможно только когда (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0)
{iLossYieldStored -= iMinFood;}
//VET BirthPoints - end 11/16
iMinPrice = aiPrices[iYield];
iLossYield = iYield;
}
}


Я не специалист по С++ и поэтому возможно сделанные мной изменения неверны в принципе, однако после них я смог без труда запустить игру и увидеть синие и зеленые сообщения на экране. Насколько они достоверны зависит от того, насколько правильны были внесенные мной изменения. Если они неверны, то дальнейшее можно не читать, ибо это писано "вилами по воде".

Итак, город на два жителя, скорость игры нормальная, запас еды чуть больше "неприкосновенного" (48 еды), поэтому сначала удаляется небольшой избыток еды. На экране я вижу:

http://img442.imageshack.us/img442/6840/food01.jpg (http://imageshack.us/photo/my-images/442/food01.jpg/)

Количество хранящихся ресурсов (Stored) верно по всем позициям. Цена для еды -2147483648 довольно "странная", но "PricеOld -1" кажется правильной, так как еда действительно самый дешевый ресурс и стОит она именно 1 монету.

Далее постепенно опорожняем склад и наконец доходим до следующего варианта.

До удаления избытков:

http://img641.imageshack.us/img641/7724/beforenx.jpg (http://imageshack.us/photo/my-images/641/beforenx.jpg/)

Стоимость табака 4 монеты, железной руды 3. Поэтому по идее должна удаляться железная руда. Однако почему-то удаляется табак.

http://img849.imageshack.us/img849/7567/afterp.jpg (http://imageshack.us/photo/my-images/849/afterp.jpg/)

На экране мы видим сообщение об этом:

http://img266.imageshack.us/img266/4532/reporth.jpg (http://imageshack.us/photo/my-images/266/reporth.jpg/)

И опять те же странные значения по ценам: "2147483648" и "PricеOld -1". В данном случае "PricеOld -1" уже неверно, поскольку табак стоит 4 монеты, а не одну. А следовательно и в первом случае с едой этому значению верить нельзя.

Что в данном случае смущает меня больше всего?
Это одно и то же значение для цены на все без исключения товары. Я еще могу допустить, что на экране мы видим некое "внутреннее значение", которое программа использует для расчетов цен, но по логике оно должно быть разным для различных товаров. Тут же оно почему-то одно и то же по всем товарам.

В общем, получилось пока так.....

romello
08.09.2012, 14:25
Привет! Всем!!! Как же давно я в циву не играл...
Спасибо ребята, что делаете!!!

micheline
09.09.2012, 20:37
Привет
Надеюсь проблемы решаемы и у Вас получится
А мы пока будем ждать полного мода :)

NeserVET
09.09.2012, 23:19
Решение проблемы я ему отправил личным сообщением несколько дней назад. Но, видимо, он опять в командировке.

Добавь ! в условие if (GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))
и проверь заново
//VET NewCapacity - begin 6/9
if (bNEW_CAPACITY)
{
aiPrices[iYield] = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса
if (!GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))// непродоваемые в европе
{
aiPrices[iYield] += MIN_INT;
}
}
else
{
//VET NewCapacity - end 6/9

цены в сообщениях должны быть нормальными, только надо учесть что это цены за 1000 единиц ресурса.

Твое исправление влияет только на изображение ресурса на игровом экране отвечающее за сообщение. Вылет был из-за того что при самом первом проходе iLossYield равен (-1), а функция GC.getYieldInfo((YieldTypes)iYield) корректно работает только когда iYield >= 0 и меньше количества всех ресурсов в игре.

kabjans
10.09.2012, 09:43
Решение проблемы я ему отправил личным сообщением несколько дней назад. Но, видимо, он опять в командировке.

Нет, напротив ко мне гости приехали и мы неделю из-за стола не поднимались. :confused: А в командировку я уеду на несколько дней в самом конце этой недели.

Итак, что получилось в последнем варианте, когда вводится


if (!GET_PLAYER(getOwnerINLINE()).isYieldEuropeTradable(eYield))// непродоваемые в европе

Компиляция и запуск игры - без проблем.
Набор городом "очков рождаемости" и поддержание "неприкосновенного запаса" еды в переполненном городском складе тоже все работает правильно.

Затем идет та же самая ошибка.

Вот город на 2 жителя. Скорость нормальная, вместимость склада 100, "неприкосновенный запас" еды равен 48. Остальное при переполнении должно удаляться.

И тут снова, как и раньше удаление излишков идет строго слева направо, причем совершенно независимо от стоимость удаляемого товара. Я даже оставил на складе 100 единиц серебра, то есть товара следующего по списку после древесины (если идти слева направо).

http://img838.imageshack.us/img838/16/06silverincity.jpg (http://imageshack.us/photo/my-images/838/06silverincity.jpg/)

На следующий ход серебро было удалено, несмотря на то, что его цена была 19 монет и оно было самым дорогим товаром на переполненном складе.

http://img818.imageshack.us/img818/3214/silverlost.jpg (http://imageshack.us/photo/my-images/818/silverlost.jpg/)

Так же были удалены излишки хлопка (3 монеты) и шкур (5 монет). Самая крайняя справа и при этом дешевая же железная руда (3 монеты) осталась нетронутой.

Вот сообщения с экранаю Они не влезли в один снимок, поэтому я сделал три снимка по каждой позиции.
Сначала исчезло серебро:

http://img191.imageshack.us/img191/1884/lostsilver.jpg (http://imageshack.us/photo/my-images/191/lostsilver.jpg/)

Затем хлопок

http://img208.imageshack.us/img208/1603/nextlostcotton.jpg (http://imageshack.us/photo/my-images/208/nextlostcotton.jpg/)

И наконец самыми последними были удалены шкуры:

http://img812.imageshack.us/img812/9816/finallylostfurs.jpg (http://imageshack.us/photo/my-images/812/finallylostfurs.jpg/)

NeserVET
10.09.2012, 14:26
Ну теперь причина ясна: цены на все товары почему-то не высчитываются и равны нулю.
Прийдется искать причину.

kabjans
10.09.2012, 15:41
цены на все товары почему-то не высчитываются и равны нулю.

Именно так! Цены на все товары оказываются равными нулю и поэтому понятна логика программы, когда она удаляет ресурсы по порядку слева направо. Ведь при нулевой стоимости без разницы что удалять - серебро или древесину.

NeserVET
10.09.2012, 22:45
Будем выяснять почему нерправильно высчитываются цены на ресурсы.
Вставь
CvWString szBuffer = CvWString::format(L"%c, Price%d, Percent%d, Profit%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), aiPrices[iYield], getOverflowYieldSellPercent(), GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000));
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_YELOW"), getX_INLINE(), getY_INLINE(), true, true);
после строчки aiPrices[iYield] = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса

з.ы. Замени цвет синего сообщения на желтый (синий шрифт на твоих скринах не разобрать) и поменяй в сообщениях /t на \t

kabjans
10.09.2012, 23:09
Будем выяснять почему нерправильно высчитываются цены на ресурсы.
Вставь
CvWString szBuffer = CvWString::format(L"%c, Price%d, Percent%d, Profit%d", GC.getYieldInfo((YieldTypes)iYield).getChar(), aiPrices[iYield], getOverflowYieldSellPercent(), GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000));
gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_DEAL_CANCELLED", MESSAGE_TYPE_MINOR_EVENT, GC.getYieldInfo((YieldTypes)iYield).getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_YELOW"), getX_INLINE(), getY_INLINE(), true, true);
после строчки aiPrices[iYield] = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса

з.ы. Замени цвет синего сообщения на желтый (синий шрифт на твоих скринах не разобрать) и поменяй в сообщениях /t на \t

Готово. Вот снимок после 1 хода

http://img692.imageshack.us/img692/7259/turn1q.jpg (http://imageshack.us/photo/my-images/692/turn1q.jpg/)

Далее картинка не меняется. Цена везде остается нулевой, процент тоже нулевой, значения профит тоже не меняются....

NeserVET
10.09.2012, 23:15
Все понятно - формулу не правилно написал.
надо чтоб было
aiPrices[iYield] = (100 + getOverflowYieldSellPercent()) * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 10);// Цена за 1000 единиц ресурса
а сейчас используется такая
aiPrices[iYield] = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса

NeserVET
10.09.2012, 23:25
Только что дошло!! Выражение (100 + getOverflowYieldSellPercent()) одинаковое для всех ресурсов, поэтому его можно убрать и использовать такую формулу

aiPrices[iYield] = GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса

kabjans
10.09.2012, 23:25
Компилирую.....

Готовою. Ход 1:

http://img27.imageshack.us/img27/8803/turn1new.jpg (http://imageshack.us/photo/my-images/27/turn1new.jpg/)

Цены (за 1000 единиц товара) соответствуют минимальным в Европе по всем позициям!

Продолжаю тест, но он идет достаточно медленно из-за кучи сообщений после каждого хода.

ЗЫ. Я тестирую вариант


aiPrices[iYield] = (100 + getOverflowYieldSellPercent()) * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 10);// Цена за 1000 единиц ресурса

kabjans
11.09.2012, 00:07
Процесс идет очень медленно, но отключать проверку на каждом ходу я не хочу.

Поэтому для ускорения я добавил в город 100 лошадей (2 скаута)

Вот что было в городе перед удалением избытков

http://img442.imageshack.us/img442/8715/horses100.jpg (http://imageshack.us/photo/my-images/442/horses100.jpg/)

Цены такие: еда 2 (ее меньше, чем НЗ), шкуры 5, железная руда 2, лошади 6.

После удаления осталось

http://img440.imageshack.us/img440/5249/resultlp.jpg (http://imageshack.us/photo/my-images/440/resultlp.jpg/)

Самое главное в какой последовательности происходило удаление излишков со склада.

Первой исчезла самая дешевая (2 монеты) железная руда, 9 (что было на складе) плюс 3 (что произвели за ход). Итого потеря 12 единиц руды.
Вторыми исчезли шкуры (5 монет), тоже 9 плюс 3 единиц.
И наконец, последними исчезли самые дорогие (6 монет) лошади в количестве 18 штук.

Другими словами, удаление произошло ПРАВИЛЬНО!!!!

kabjans
11.09.2012, 00:33
Я продолжаю тест и завтра опишу результат....

NeserVET
11.09.2012, 00:57
ЗЫ. Я тестирую вариант


aiPrices[iYield] = (100 + getOverflowYieldSellPercent()) * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 10);// Цена за 1000 единиц ресурса
Я так понимаю getOverflowYieldSellPercent() это королевский налог, поэтому правильней, наверно, будет (100 - getOverflowYieldSellPercent()). Налог надо отнять, а не прибавить. Я прошлый раз ошибся. Но мы не продаем ресурсы, а выбираем самый дешевый, поэтому королевский налог можно не учитывать (зачем лишний раз напрягать проц), так как он одинаков для всех ресурсов.

kabjans
11.09.2012, 10:25
Я так понимаю getOverflowYieldSellPercent() это королевский налог, поэтому правильней, наверно, будет (100 - getOverflowYieldSellPercent()). Налог надо отнять, а не прибавить. Я прошлый раз ошибся. Но мы не продаем ресурсы, а выбираем самый дешевый, поэтому королевский налог можно не учитывать (зачем лишний раз напрягать проц), так как он одинаков для всех ресурсов.

Затрудняюсь сказать, что конкретно обозначает getOverflowYieldSellPercent(), но вряд ли это королевский налог. Для налога используется выражение getTaxRate().
-----------------------------------------------------------------------------------------------------
Дополнение:

Я посмотрел где и в какой связи в исходных кодах упоминается getOverflowYieldSellPercent().
OverflowYieldSellPercent связан со зданиями. Причем значение

<iOverflowSellPercent>50</iOverflowSellPercent>
встречается только для BUILDING_WAREHOUSE_EXPANSION. Все остальные здания имеют

<iOverflowSellPercent>0</iOverflowSellPercent>
Таким образом, OverflowSellPercent означает процент от цены, за которую товары будут продаваться при переполнении склада, если построен самый "крутой" склад (BUILDING_WAREHOUSE_EXPANSION). На более простых складах при их переполнении товары просто исчезают без всякой оплаты. Если проще, их со склада воруют .... :D

Второе упоминание getOverflowYieldSellPercent() есть в строке


int iProfit = getOverflowYieldSellPercent() * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, iLoss) / 100;

Но это тоже понятно. Если

<iOverflowSellPercent>0</iOverflowSellPercent>
то и нет никакого дохода. Товар просто теряется.
----------------------------------------------------------------------------------


Сегодня попробую вариант "с минусом":


aiPrices[iYield] = (100 - getOverflowYieldSellPercent()) * GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 10);// Цена за 1000 единиц ресурса

Вчера при тестировании заметил одну странную особенность. Я пока не могу ее точно сформулировать, поэтому сделал три снимка.

1.
http://img803.imageshack.us/img803/6193/02afternz.jpg (http://imageshack.us/photo/my-images/803/02afternz.jpg/)

2.
http://img51.imageshack.us/img51/8981/01aftersecondnzstabiliz.jpg (http://imageshack.us/photo/my-images/51/01aftersecondnzstabiliz.jpg/)

3.
http://img28.imageshack.us/img28/5037/032plus3nextturn.jpg (http://imageshack.us/photo/my-images/28/032plus3nextturn.jpg/)


Что конкретно кажется странным?

Во-первых, каждый снимок сделан после удаления избытков товара с переполненного склада. После, а не до!

Но, посмотри на количество товаров, имеющихся на складе (первая красная цифра после названия города):

1 снимок. 52 еды + 62 лошадей = 114
2. снимок: 48 еды + 58 лошадей = 106
3. снимок: 48 еды + 57 лошадей = 105

Непонятно, почему опорожнение склада за предыдущий ход идет не до максимально возможного минимума, равного 100?

Более того, опорожнение склада идет с учетом возможного роста запасов на складе в следующий ход.

А ведь получается именно так. Снова посмотри на снимки, но на этот раз на прибавку товара в следующий ход (зеленые цифры внизу):

1 снимок:
+4 еды + 3 шкуры + 3 руды = 14.
Это же значение получается, если (см. красные цифры о состоянии склада): 114 - 100 = 14

2 снимок:
+3 шкур + 3 руды = 6
Или 106 - 100 = 6

3 снимок:
+2 хлопка + 3 руды = 5
Или 105 - 100 = 5

Довольно-таки странная закономерность....

NeserVET
11.09.2012, 16:52
Все, getOverflowYieldSellPercent() нам вобще не нужно. Используй выражение
aiPrices[iYield] = GET_PLAYER(getOwnerINLINE()).getSellToEuropeProfit(eYield, 1000);// Цена за 1000 единиц ресурса

На счет бага
1) Замени строчку
int iTotalYields = getTotalYieldStored();// Количество всех ресурсов на складе
на
int iTotalYields;// Количество всех ресурсов на складе
2) А перед строчкой
if (bNEW_CAPACITY && (iTotalYields > iMaxCapacity))
добавь
iTotalYields = getTotalYieldStored();
Ошибка была из-за того, что сначала запоминалось количество всех ресурсов на складе и только потом происходило добавление ресурсов. Теперь же сначала подобавляются ресурсы и только потом запомнится количество всех ресурсов.

kabjans
11.09.2012, 17:38
Скомпилировал, начал тест....

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

kabjans
11.09.2012, 19:54
Скомпилировал Final Release CvGameCoreDLL.dll без проблем, запустил мод тоже нормально. Но на 4 ходу меня постоянно выбрасывало в десктоп.

Максимум, что я смог сделать, так это вытащить это сообщение:

Удалено, поскольку после повторной компиляции все работает правильно.


Для поиска ошибки я скомпилировал Final Debug CvGameCoreDLL.dll. Запуск - нормально, но.... все работает ПРАВИЛЬНО и без сбоев.

- удаляется самый дешевый товар,
- удаление происходит до уровня вместимости склада, равной 100,
- неприкосновенный запас еды сохраняется неизменным.

Вот три снимка.

Скорость нормальная. Цены: еда 1, серебро 19, хлопок 5, руда 4 монеты.

http://img833.imageshack.us/img833/97/firstcut02.jpg (http://imageshack.us/photo/my-images/833/firstcut02.jpg/)

http://img12.imageshack.us/img12/7933/03cut2.jpg (http://imageshack.us/photo/my-images/12/03cut2.jpg/)

http://img440.imageshack.us/img440/7572/04cut3.jpg (http://imageshack.us/photo/my-images/440/04cut3.jpg/)

Сейчас буду компилировать заново Final Release CvGameCoreDLL.dll и далее проверять уже с ним.

Дополнение:

Проверил с заново скомпилированным Final Release CvGameCoreDLL.dll. Все работает правильно и без сбоев. Поэтому сообщение об ошибке - удаляю.
Продолжаю тестирование....

NeserVET
11.09.2012, 23:23
а как с помощью Final Debug ошибки искать? А то я всегда Final Release компилирую и после вылета анализирую получившийся Civ4BeyondSword.exe.dmp

kabjans
12.09.2012, 00:13
а как с помощью Final Debug ошибки искать? А то я всегда Final Release компилирую и после вылета анализирую получившийся Civ4BeyondSword.exe.dmp

Несколько дней назад, когда я компилировал CvGameCoreDLL.dll, то по дефолту у меня стояла опция Final Debug. С этим файлом я и запустил мод, но тут случилась ошибка, Microsoft Visual Studio .NET 2003, где я компилировал CvGameCoreDLL.dll, была еще включена и у меня на экране выскочило предложение выполнить Debug. Я естественно согласился и меня программа (Microsoft Visual Studio .NET 2003) вывела прямиком на строку в коде, вызвавшую вылет на десктоп.

Все получилось само собой, моей заслуги тут нет никакой. и поэтому сегодня, когда снова был вылет, я начал поиск возможной ошибки с создания Final Debug CvGameCoreDLL.dll, надеясь повторить свой предыдущий опыт. Это не помогло, потому что и Final Debug CvGameCoreDLL.dll, и скомпилированная повторно Final Release CvGameCoreDLL.dll, вылета на десктоп больше не давали. Все работало четко и без сбоев.

Я раньше тоже делал .exe.dmp файлы, но найти с их помощью ошибку смог лишь один раз. Не иначе тоже повезло.

kabjans
20.09.2012, 23:35
Я вернулся из краткой поездки и продолжаю работу над модом.

Нашел как можно довольно просто вывести информацию об очках рождаемости на экран города. Получилось так:

http://imageshack.us/a/img802/1981/43245001.jpg (http://imageshack.us/photo/my-images/802/43245001.jpg/)

NeserVET
21.09.2012, 16:22
Я вернулся из краткой поездки и продолжаю работу над модом.

Нашел как можно довольно просто вывести информацию об очках рождаемости на экран города.Можно еще попробовать заменить число с бюстом на полосу прогресса (как в цивилизации), а подсказку оставить без изменений.

перед строчкой class CvMainInterface: добавить

g_szStoredBarName = "StoredBar"


перед строчкой # EMPHASIZE TABLE добавить


# CITY BUILDING STORED BAR
screen.addStackedBarGFC(g_szStoredBarName, iX, iY, iWeight, iHeight, InfoBarTypes.NUM_INFOBAR_TYPES, WidgetTypes.WIDGET_HELP_POPULATION, -1, -1)
screen.setStackedBarColors(g_szStoredBarName, InfoBarTypes.INFOBAR_STORED, gc.getInfoTypeForString("COLOR_GREAT_PEOPLE_STORED"))
screen.setStackedBarColors(g_szStoredBarName, InfoBarTypes.INFOBAR_RATE, gc.getInfoTypeForString("COLOR_GREAT_PEOPLE_RATE"))
screen.setStackedBarColors(g_szStoredBarName, InfoBarTypes.INFOBAR_RATE_EXTRA, gc.getInfoTypeForString("COLOR_EMPTY"))
screen.setStackedBarColors(g_szStoredBarName, InfoBarTypes.INFOBAR_EMPTY, gc.getInfoTypeForString("COLOR_EMPTY"))
screen.hide(g_szStoredBarName)

iX, iY, iWeight, iHeight, заменить на числа


перед строчкой # CURRENT PRODUCTION BAR FILL добавить


# CURRENT STORED BAR FILL
fGrowthThreshold = float(pHeadSelectedCity.growthThreshold())
fCurrentBirthPoints = float(pHeadSelectedCity.currentBirthPoints())
iFirst = ((float(pHeadSelectedCity.getBirthPoints())) / fGrowthThreshold)
screen.setBarPercentage(g_szStoredBarName, InfoBarTypes.INFOBAR_STORED, iFirst )
if (iFirst == 1):
iSecond = fCurrentBirthPoints / fGrowthThreshold
else:
iSecond = (fCurrentBirthPoints / fGrowthThreshold) / (1 - iFirst)
screen.setBarPercentage(g_szStoredBarName, InfoBarTypes.INFOBAR_RATE, iSecond )
screen.setBarPercentage(g_szStoredBarName, InfoBarTypes.INFOBAR_RATE_EXTRA, 0.0 )



после каждой строчки screen.hide("PopulationText") добавить

screen.hide(g_szStoredBarName)

kabjans
21.09.2012, 16:57
Можно еще попробовать заменить число с бюстом на полосу прогресса (как в цивилизации), а подсказку оставить без изменений.

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

Пока же наверху экрана слишком много цифровой информации, а с учетом того, что я буду туда добавлять значения для Yield_Codex (цифра + значок), а затем и для Исследований (тоже цифра + значок), то будет крутой перебор. Уменьшить - невозможно, поэтому приходится каким-то образом "оптимизировать".

kabjans
22.09.2012, 11:08
До "полоски прогресса" пока не дошел, потому что сначала хотел закончить свой вариант расположения информации вверху городского экрана.

Для начала я отвязал информацию о состоянии городского склада от названия города и перенес ее в левый верхний угол. Плюс добавил к ней иконку склада. Одновременно на освободившееся место рядом с названием города перенес данные об "очках рождаемости". Для них это самое подходящее место. В итоге получилось так:

http://imageshack.us/a/img339/6581/00toppartofthecityscree.jpg (http://imageshack.us/photo/my-images/339/00toppartofthecityscree.jpg/)

Пока не идеально, но мне кажется выглядит уже поприличнее. Этот вариант работает стабильно и вылетов нет. Но нет и подсказки при наведении мышки на данные склада (зеленые цифры и иконка). А хотелось бы!

Для того, чтобы эта подсказка появилась я подредактировал пять файлов. Ниже я привожу новые участки кода, плюс строки до и после них, чтобы было ясно куда конкретно я внес добавления.

1. В CvEnums.h добавил


WIDGET_HELP_POPULATION,
//KJ Warehouse START
WIDGET_HELP_WAREHOUSE,
//KJ Warehouse END
WIDGET_HELP_REBEL

2. В CyEnumsInterface.cpp:


.value("WIDGET_HELP_POPULATION", WIDGET_HELP_POPULATION)
//KJ Warehouse START
.value("WIDGET_HELP_WAREHOUSE", WIDGET_HELP_WAREHOUSE)
//KJ Warehouse END
.value("WIDGET_HELP_REBEL", WIDGET_HELP_REBEL)

3. В CvDLLWidgetData.h:


void parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse START
void parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse END
void parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);

4. В CvDLLWidgetData.cpp:


case WIDGET_HELP_POPULATION:
parsePopulationHelp(widgetDataStruct, szBuffer);
break;

//KJ Warehouse START
case WIDGET_HELP_WAREHOUSE:
parseWarehouseHelp(widgetDataStruct, szBuffer);
break;
//KJ Warehouse END

case WIDGET_HELP_REBEL:
parseRebelHelp(widgetDataStruct, szBuffer);
break;

и


void CvDLLWidgetData::parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
CvCity* pHeadSelectedCity;

pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();

if (pHeadSelectedCity != NULL)

{
// szBuffer.assign(gDLL->getText("TXT_KEY_MISC_FOOD_THRESHOLD", pHeadSelectedCity->getFood(), pHeadSelectedCity->growthThreshold())); //original, closed by KJ
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_BIRTHPOINTS_THRESHOLD", pHeadSelectedCity->getBirthPoints(), pHeadSelectedCity->currentBirthPoints(), pHeadSelectedCity->growthThreshold())); //KJ addon
}
}

//KJ Warehouse START
void CvDLLWidgetData::parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
CvCity* pHeadSelectedCity;

pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();

if (pHeadSelectedCity != NULL)
{
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_WAREHOUSE", pHeadSelectedCity->getTotalYieldStored(), pHeadSelectedCity->getMaxYieldCapacity()));
}
}
//KJ Warehouse END

void CvDLLWidgetData::parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
if (widgetDataStruct.m_iData1 == 1)
{
CvCity* pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();
if (pHeadSelectedCity != NULL)
{
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_REBEL_HELP", pHeadSelectedCity->getRebelPercent()));
}
}
else
{
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_REBEL_HELP", GET_TEAM(GC.getGameINLINE().getActiveTeam()).getRebelPercent()));
}
}

5. CvDLLWidgetData.h:


void parsePopulationHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse START
void parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);
//KJ Warehouse END
void parseRebelHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer);

Компилируем без ошибок, запускаем мод тоже без проблем. А дальше начинается какая-то мистика.

Если я работаю мышкой и после наведения ею на кнопку "Continue" я получаю немедленный вылет на десктоп.

http://imageshack.us/a/img341/7813/00continue.jpg (http://imageshack.us/photo/my-images/341/00continue.jpg/)

Если же я использую клавиатуру и просто нажимаю на этом экране кнопку "Enter", то могу спокойно продолжать игру.

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

http://imageshack.us/a/img12/6581/00toppartofthecityscree.jpg (http://imageshack.us/photo/my-images/12/00toppartofthecityscree.jpg/)

Я оставил только данные об изменении запасов на складе за ход. Все остальное - а именно текущее наполнение склада и его максимальная емкость - перемещены в подсказку.

Когда склад пополняется, это выглядит так

http://imageshack.us/a/img844/5329/warehousestatuspositive.jpg (http://imageshack.us/photo/my-images/844/warehousestatuspositive.jpg/)

Когда склад опорожняется, так:

http://imageshack.us/a/img703/5249/warehousestatusnegative.jpg (http://imageshack.us/photo/my-images/703/warehousestatusnegative.jpg/)

Можно конечно радоваться, ибо это именно тот вариант, что мне хотелось бы иметь, но на выходе меня ждут вторые грабли.

Снова, как и в случае с кнопкой "Continue", стоит мне навести курсор мыши на кнопку "Exit", следует моментальный вылет на десктоп.

http://imageshack.us/a/img3/8049/03exit.jpg (http://imageshack.us/photo/my-images/3/03exit.jpg/)

И опять же, если выходить с городского экране не мышкой, а с помощью клавиатуры (кнопка "Esc"), то вылета нет и можно спокойно продолжать игру.

Лично я с таким встречаюсь впервые. Вчера весь вечер потратил на поиск этих "граблей", но так и не нашел. :confused:

WIDGET_HELP_WAREHOUSE прописал в кодах правильно, остальное тоже вроде бы все нормально. В конце концов весь с клавиатурой все же работает именно так, как и должно быть! А лишь при наведении мышькой на кнопки "Continue" и "Exit" следует немедленный вылет. Почему?

NeserVET
22.09.2012, 15:36
В файле CvEnums.h новые значения надо добавлять в конец списка перед значением обозначающим количество всех значений, название которого начинается на NUM_. В твоем случае WIDGET_HELP_WAREHOUSE надо добавлять после WIDGET_GOTO_CITY перед NUM_WIDGET_TYPES.
Все дело в том что при кампиляции названия энумом заменяются на обычные числа начиная с нуля или того числа которое указано в самом первом энуме, причем число следующего энума на 1 больше предыдущего. Так вот, весь прикол в том что экзешник скомпилирован с теми значениями энумов которые установлены в оригинальном CvEnums.h, если ты добавляешь новый энум в середину списка, то все энумы после него становатся больше на 1. Но они становятся больше только в твоем DLL и питоне, а в экзешнике остаются старыми. В итоге при нажатии кнопки через пион передается число на 1 больше того что предусмотрено в экзешнике. Ну и естественно экзешник питается выполнить алгоритм, который не предусмотрен для выполнения с данными которые передаются при нажатии кнопки.

В подсказку можно добавить прибавление ресурсов



void CvDLLWidgetData::parseWarehouseHelp(CvWidgetDataStruct &widgetDataStruct, CvWStringBuffer &szBuffer)
{
if (GC.getNEW_CAPACITY() != 0)
{
CvCity* pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();
if (pHeadSelectedCity != NULL)
{
int iI, iJ, iNumProfessionInfos, iUnproducedYield, iYieldConsumed, iProducedYield;
int aiProducedYields[NUM_YIELD_TYPES];
bool bBIRTH_POINTS = (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0);
iNumProfessionInfos = GC.getNumProfessionInfos();
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{aiProducedYields[iI] = 0;}
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI);
if (iUnproducedYield < 0)
{
for (iJ = 0; iJ < iNumProfessionInfos; iJ++)
{
CvProfessionInfo& kProfession = GC.getProfessionInfo((ProfessionTypes)iJ);
if (kProfession.getYieldProduced() == iI)
{
iYieldConsumed = kProfession.getYieldConsumed();
if (iYieldConsumed != NO_YIELD)
{aiProducedYields[iYieldConsumed] += iUnproducedYield;}
}
}
}
aiProducedYields[iI] += pHeadSelectedCity->calculateNetYield((YieldTypes)iI);
}
iProducedYield = 0;
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
if ((bBIRTH_POINTS || (iI != YIELD_FOOD)) && GC.getYieldInfo((YieldTypes)iI).isCargo())
{iProducedYield += aiProducedYields[iI];}
}

szBuffer.assign(gDLL->getText("TXT_KEY_MISC_WAREHOUSE", pHeadSelectedCity->getTotalYieldStored(), iProducedYield, pHeadSelectedCity->getMaxYieldCapacity()));
}
}
}


В подсказку TXT_KEY_MISC_WAREHOUSE надо добавить новую строчку отображающую прибавление или убавление ресурсов. Как в подсказке про очки рождаимости.

kabjans
22.09.2012, 17:41
Исправил. Огромнейшее спасибо, VET, за помощь!

Вот результат:

http://imageshack.us/a/img204/3682/corrected.jpg (http://imageshack.us/photo/my-images/204/corrected.jpg/)

Все работает без сбоев, продолжаю тестирование и одновременно правку текстов.

NeserVET
23.09.2012, 00:22
Загрузку склада можно еще отобразить в виде полосы прогресса под изображением склада (там где все здания нарисованы).

micheline
23.09.2012, 21:55
Я чуствую его приближение! (глобального мода) :)
Автору дерзай и не останавливайся.

kabjans
24.09.2012, 16:03
В процессе тестирования выявил и исправил пару небольших багов, а также сделал некоторые корректировки параметров.

1. При рождении нового поселенца значения BirthPoints на экране города становились отрицательными. Через пару ходов все устаканивалось, но такого быть не может, так как значения BirthPoints не могут быть отрицательными по определению, ибо они привязаны к количеству потребляемой поселенцем еды.

Это происходило из-за того, что в CvCity.cpp на момент перехода расчет велся так:

setBirthPoints(iGrowthThreshold - iBirthPoints);а должно было быть так:

setBirthPoints(iBirthPoints - iGrowthThreshold);
В таком виде все работает правильно.

2. Второй баг, уже в CvMainInterface.py, я создал сам, когда убрал в подсказку количество товаров на складе и его максимальную вместимость и оставил на экране только прирост наполняемости склада за ход (iProdusedYield).

Все работало нормально до того момента, пока значения были iProdusedYield > 0 или iProdusedYield < 0. Но в ситуации, когда iProdusedYield = 0, значок склада с экрана просто исчезал. Для исправления этого я добавил в CvMainInterface.py строку с "else"

if iProdusedYield > 0:
szBuffer += u"+" + u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

elif iProdusedYield < 0:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

else:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>" #KJ addon if "iProdusedYield = 0"Так все работает правильно.

"BAD_GOLD_CHAR" пусть не смущает, так как в GameFont.tga значок склада я поместил вместо значка BAD_GOLD_CHAR, который в игре нигде не используется.

3. Удлинил до 10 ходов предупреждение о скором переполнении городского склада. Теперь в CvMainInterface.py это выглядит так:

elif iTotalYield + (10 * iProdusedYield) > iMaxYield: #"10 turns's alarm before Max Storage capacity"
szBuffer += u"255,255,0" #yellowКак и было сделано VET'ом в оригинале, цифры перед значком склада меняют цвет с зеленого на желтый, но желтыми они становятся за 10, а не за 2 хода до возможного переполнения склада. Из-за обилия информации я частенько упускал этот момент и склад оказывался набит до предела.

Теперь несколько замечаний по вновь введенным параметрам.

4. Неприкосновенный запас продовольствия, задаваемый через

<DefineName>TURNS_FOR_FOOD</DefineName>
<iDefineIntVal>12</iDefineIntVal>
При скорости игры 1 ход = 1 месяц мы имеем годовой запас продуктов питания. Очень разумно. Если память мне не изменяет, то в СССР был 90 дневный неприкосновенный запас продовольствия. Тут же годовой. Так что мы имеем вполне соизмеримые величины.

5. Как показывает практика городской склад (BUILDING_WAREHOUSE) не является тем зданием, которое строится самым первым. Ни игрок, ни тем более AI, не начинают стоить склад сразу.

Это означает, что при нормальной скорости игры на самом первом ходу в городе может храниться только 100 единиц товара. Честно сказать, я не знаю откуда идет эта цифра, ведь склада в городе на самом первом ходу пока нет, а BUILDING_TOWNHALL, который есть по дефолту, имеет

<iYieldStorage>0</iYieldStorage>
Другие доступные по дефолту здания тоже. Возможно эта сотня где-то прописана в исходных кодах, но, признаюсь, я специально не искал. Это не важно, просто примем эту сотню как данность. Итак, на самом первом ходу в городе может храниться не более 100 единиц товара.

А теперь представим ситуацию, когда город основан юнитом, имеющим профессию "Драгун" (PROFESSION_DRAGOON). Согласно CIV4ProfessionInfos.xml в экипировку этого юнита входят:

<YieldEquipedNums>
<YieldEquipedNum>
<YieldType>YIELD_HORSES</YieldType>
<iYieldAmount>50</iYieldAmount>
</YieldEquipedNum>
<YieldEquipedNum>
<YieldType>YIELD_MUSKETS</YieldType>
<iYieldAmount>50</iYieldAmount>
</YieldEquipedNum>
</YieldEquipedNums>
То есть уже в момент основания все доступные в городе 100 единиц будут сразу же заполнены. Любой товар, что будет производиться в городе или собираться на клетках вокруг него, моментально будет подпадать под возможные сокращения.

Для исправления этой ситуациидля в BUILDING_WAREHOUSE я ввел

<iYieldStorage>100</iYieldStorage>
Таким образом, сейчас при нормальной скорости получается суммарная вместимость города (без еще не построенного склада!) равна 100 + 100 = 200, то есть в 2 раза больше прежней. В этом случае даже при создании города драгуном не происходит моментального переполения еще не построенного "склада".

Соответственно в сторону повышения скорректированы и значения для BUILDING_WAREHOUSE

<iYieldStorage>900</iYieldStorage>
вместо

<iYieldStorage>100</iYieldStorage>
и для расширенного склада (BUILDING_WAREHOUSE_EXPANSION), где сейчас

<iYieldStorage>1500</iYieldStorage>
вместо

<iYieldStorage>200</iYieldStorage>
Эти изменения абсолютно необходимы, так как сейчас заполненность склада считается как сумма всех товаров, что хранятся в городе, а не отдельно по каждой из позиций, как это было в оригинальной игре.

6. Максимальное значение BirthPoints, при котором рождается новый колонист. В самом начале это значение было равно 200:

<DefineName>BASE_BIRTH_POINTS_THRESHOLD</DefineName>
<iDefineIntVal>200</iDefineIntVal>
Но насколько оно оптимально?

Для ответа на этот вопрос надо совершить небольшой экскурс в историю и демографию.

Как известно, рост населения в любом городе определяется четырьмя слагаемыми.

- рождаемость,
- смертность,
- иммиграция (в город)
- эмиграция (из города).

Таким образом,


Прирост населения = (Рождаемость - Смертность) + (Иммиграция - Эмиграция).
В первых скобках - естественный прирост населения, во вторых - искусственный (или механический).

В данном моде мы не разделяем по отдельности "Рождаемость" и "Смертность". Введенный параметер "BirthPoints" нужно рассматривать как естественный прирост населения, то есть как (Рождаемость - Смертность).

Безусловно, оба эти значения можно развести и параллельно с "BirthPoints" ввести "DeathPoints". Но тогда в какой-то момент, когда набирается некое количество "DeathPoints", нужно убивать одного из жителей города. Причем в обязательном порядке! Это неприятно и вряд ли будет приемлемо играющими, так как сейчас все юниты практически бессмертны. По крайней мере до тех пор, пока не началась война с туземцами или соседями-европейцами.

Поэтому "Смертность" проще ввести через генерацию случайных событий. К примеру, в густонаселенном городе (более 8 или 10 жителей) с вероятностью Х% вспыхивает эпидемия. Если в городе нет доступа к чистой воде (родник), или нет госпиталя, или лекарств, то тогда с очень высокой вероятностью один из жителей умирает. Если все вышеперечисленное есть, то город в период эпидемии ничего не производит и все заканчивается без потерь для игрока.

Мне кажется, что такое решение намного проще, чем введение параметра DeathPoints. Вероятностное событие может произойти, а может и не произойти. Тут все зависит от самого игрока.

Итак, мы имеем два компонента, ответственных за прирост населения города - естественный и искусственный.

Если изучить динамику роста городов в Новом Свете в период колонизации, то станет совершенно очевидно, что в первые как минимум 100 лет преобладающим механизмом был "искусственный" рост населения за счет:

- иммигрантов из Европы (в самом начале игры мы их постоянно возим из Европы),
- рабов из Африки (в данном моде отсутствуют, но они уже есть в "1492: Slavery Market. The Orient. Port-Royal"),
- захваченных или присоединившихся к европейцам местных аборигенов (в нашем случае, это UNIT_CONVERTED_NATIVE).

Кстати, массовый завоз рабов из Африки как раз и был связан с отсутствием необходимой рабочей силы во вновь основанных городах и в особенности на плантациях Нового Света.

То есть другими словами, параметр BASE_BIRTH_POINTS_THRESHOLD мы должны задать таким, чтобы в течение очень длительного периода времени население города не могло увеличиваться. Если оставить его равным 200, то новый житель в нем появится через 100 ходов. Считаем 1 ход = 1 месяц, получаем 100 месяцев или 100 : 12 = чуть больше 8 лет. Лично мне кажется, что это очень быстро.

Безусловно, увеличив BASE_BIRTH_POINTS_THRESHOLD до 300 или даже 500, мы получим более приемлемые значения. По крайней мере более правильные с исторической точки зрения. Поэтому моя рекомендация - использовать параметр BASE_BIRTH_POINTS_THRESHOLD с очень большим значением. Впрочем, это дело вкуса каждого из игроков и любой вправе поменять его сам. Параметр BASE_BIRTH_POINTS_THRESHOLD выведен в GlobalDefinesAlt.xml и его очень просто отредактировать.

Других изменений, за исключением незаконченного пока редактирования текстовых файлов, я не делал. Сейчас я правлю статьи с CONCEPT_FOOD, CONCEPT_NEW_STORAGE и CONCEPT_POPULATION_GROWTH.

Если мне ничего не помешает, то к концу этой недели мод "BirthPoints_and_NewCapacity" будет готов для публикации и представления игрокам.

Предлагаю его переименовать и назвать к примеру "New Colonists" ("Новые колонисты"). При этом в описании указать, что в данном моде изменена логика генерации новых поселенцев. Новый колонист (см. предлагаемый вариант названия мода) появляется не в результате накопления еды, а как следствия набора "очков рождаемости" всеми жителями данного города. Плюс естественно описать радикальные изменения, произведенные с городским складом.

Если новое название приемлемо, то тогда заставка твоего мода может выглядеть например так:

http://imageshack.us/a/img411/1116/mainsmall.jpg (http://imageshack.us/photo/my-images/411/mainsmall.jpg/)

Да, и последнее. При довольно продолжительном тестовом прогоне я открыл карту и видел, что и как делают мои европейские оппоненты и местные аборигены. Сразу же хочу сказать, что их поведение меня порадовало. Никто из них тупо не гнался за увеличением запасов еды. Все были заняты сбором или производством чего-то своего, имея при этом гарантированный запас продовольствия, который обеспечивал постоянный набор "очков рождаемости". И самое главное, это происходило независимо от того, что они делали в городе или на клетках вокруг города. Города росли не быстро, первоначально их рост происходил за счет прибытия новых колонистов из Европы, затем же они стали сами источниками новых поселенцев, которые постепенно расселялись по карте. Лично мне такое поведение очень даже понравилось.

NeserVET
24.09.2012, 17:23
Базовый размер склада задается параметром CITY_YIELD_CAPACITY.

код


if iProdusedYield > 0:
szBuffer += u"+" + u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

elif iProdusedYield < 0:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

else:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>" #KJ addon if "iProdusedYield = 0"



лучше заменить на



if iProdusedYield > 0:
szBuffer += u"+"
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"


результат бутет точно таким, а размер кода гораздо меньшим

Новые иконки можно добавить в файлах CvEnum.h (enum DllExport FontSymbols) через файл CyEnumsInterface.cpp.

kabjans
25.09.2012, 10:12
Базовый размер склада задается параметром CITY_YIELD_CAPACITY.

Ага, теперь вижу откуда эта сотня берется. Очень ценное наблюдение, спасибо!

При переходе на новый принцип расчета загруженности городского склада и из-за возникающих при этом проблем (что я описал выше на примере "Драгуна"), куда правильнее просто увеличить в пару раз параметр CITY_YIELD_CAPACITY, а не извращаться вводя iYieldStorage для BUILDING_TOWNHALL.

Кроме того при таком решении автоматически увеличивается CITY_YIELD_CAPACITY не только для европейцев, но и для аборигенов, что важно при торговле с ними. Введение же дополнительного iYieldStorage для BUILDING_TOWNHALL такого не позволяло делать, поскольку аборигены не могут строить BUILDING_TOWNHALL.


код


if iProdusedYield > 0:
szBuffer += u"+" + u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

elif iProdusedYield < 0:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"

else:
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>" #KJ addon if "iProdusedYield = 0"



лучше заменить на



if iProdusedYield > 0:
szBuffer += u"+"
szBuffer += u"%i%c" % (iProdusedYield, CyGame().getSymbolID(FontSymbols.BAD_GOLD_CHAR)) + u"</font>"


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

В предложенном тобой варианте все работает, как и раньше. Насколько быстрее сказать не могу, но явно должно быть некое ускорение, раз этот участок кода в 3 раза короче.




Новые иконки можно добавить в файлах CvEnum.h (enum DllExport FontSymbols) через файл CyEnumsInterface.cpp.
Да, я знаю, но тут проблема не в добавлении новых иконок в CvEnum.h и CyEnumsInterface.cpp. Это работа займет не больше минуты, так как они встречаются в исходных кодах лишь в двух местах:


CvGameCoreDLL\CvEnums.h (1 hits)
Line 829: BAD_GOLD_CHAR,
CvGameCoreDLL\CyEnumsInterface.cpp (2 hits)
Line 508: .value("BAD_GOLD_CHAR", BAD_GOLD_CHAR)
Line 508: .value("BAD_GOLD_CHAR", BAD_GOLD_CHAR)

Основная проблема возникает в GameFont.tga со строкой, где должны быть расположены новые иконки. Она уже заполнена полностью. Я имею ввиду естественно оригинальный размер GameFont.tga, равный 640х320. В моде "1492: Глобальная Колонизация" я использую в 3 раза более длинный GameFont.tga с размером 1920х320.

Безусловно можно использовать такой же размер GameFont.tga файла и для данного мода, вот только надо ли это делать? Ведь часть иконок, типа BAD_GOLD_CHAR или GREAT_PEOPLE_CHAR, нигде в игре не используются. Это настоящие пустышки, оставшие от Цивилизации 4. Их я собственно и использовал даже без переименования в CvEnum.h и CyEnumsInterface.cpp, что кстати тоже можно было сделать совершенно безболезненно. В конце концов для обычного игрока без разницы, что там внутри кодов, а для профессионального мододела и так все ясно.

В моде "1492: Глобальная Колонизация" мне в обязательном порядке придется вносить изменения в порядок иконок в CvEnum.h и CyEnumsInterface.cpp, поскольку кроме BIRTHPOINTS_CHAR и WAREHOUSE_CHAR там возможно будут добавлен ряд новых иконок. Но все это будет делаться уже в "длинном" (1920х320) GameFont.tga файле.

kabjans
27.09.2012, 20:42
"New Colonists" ("Новые колонисты")

http://imageshack.us/a/img411/1116/mainsmall.jpg (http://imageshack.us/photo/my-images/411/mainsmall.jpg/)

Автор:
NeseryozniyVET - программирование (С++, Python)
при участии kabjans (KJ Jansson) - идея, тестирование, графика.
Рабочее название мода: "BirthPoints_and_NewCapacity"

Ссылка на скачивание: http://rghost.net/40609102

"New Colonists" ("Новые колонисты") версия 1.1: http://rghost.net/40682579

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

Генерация новых поселенцев.

В оригинальной версии Колонизации новый житель города появляется при накопления в городе достаточного количества еды. Данное решение разработчиков игры выглядит мягко говоря довольно странным, поскольку от переедания дети, как известно, не рождаются. Тем не менее до сих пор было именно так. ;)

Мод "Новые колонисты" кардинально изменяет условия появления нового жителя в городе. Каждый колонист, находящийся в городе (будь то работающий в городском здании или на клетке около города), не только потребляет определенное количество еды за ход, но одновременно генерит так называемые "очки рождаемости" (BirthPoints). Сумма этих очков, сгенерированных всеми жителями города, есть скорость прироста (Change per turn) BirthPoints для данного города.

Вся информация по "очкам рождаемости" выведена в верхнюю часть городского экрана рядом с названием города и его населением. Цифра показывает уже набранное количество BirthPoints. Наведя стрелку мыши на эту цифру или на расположенный рядом значок, можно получить всю информацию по "очкам рождаемости".

http://imageshack.us/a/img341/93/summaryofcityscreenpopu.jpg (http://imageshack.us/photo/my-images/341/summaryofcityscreenpopu.jpg/)

При наборе городом некого критического количества "очков рождаемости" (Threshold) в нем появляется новый житель.

http://imageshack.us/a/img826/695/newcolonist.jpg (http://imageshack.us/photo/my-images/826/newcolonist.jpg/)

Скорость генерации новых поселенцев.

Рост населения в любом городе определяется четырьмя слагаемыми.

- рождаемость,
- смертность,
- иммиграция (в город)
- эмиграция (из города),

которые можно описать простейшей формулой,


Прирост населения = (Рождаемость - Смертность) + (Иммиграция - Эмиграция).

В первых скобках - естественный прирост населения, во вторых - искусственный (или механический).

"Очки рождаемости" (BirthPoints) следует рассматривать как естественный прирост населения, то есть как (Рождаемость - Смертность).

На начальных этапах игры преобладающим механизмом является "искусственный" (или механический) рост населения за счет прибытия новых иммигрантов из Европы, а также захваченных или присоединившихся к европейцам местных аборигенов (UNIT_CONVERTED_NATIVE).

В данной версии мода параметры подобраны таким образом, чтобы в городе, котором проживает 1 житель (на самом деле их 100, но в игре они отображаются как 1 житель), при игре на марафоне (GAMESPEED_MARATHON) и при условии 1 ход = 1 месяц, новый родившийся житель появлялся только через 50 лет.

Это сделано не только для того, чтобы придать определенную историческую достоверность скорости роста городов в Новом Свете в период колонизации, но и для поддержания относительного баланса на поздних стадиях игры. В итоге малонаселенный город генерит новых жителей очень медленно, а густонаселенный - не генерит их через несколько ходов. Все это описано в СивПедии в разделе "Концепции", см. "Population Growth".

http://imageshack.us/a/img585/4804/01populationgrowth.jpg (http://imageshack.us/photo/my-images/585/01populationgrowth.jpg/)

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

Для этого необходимо в текстовом редакторе Notepad поменять ряд параметров:

Сейчас мы имеем:

CIV4GameSpeedInfo.xml:

GAMESPEED_MARATHON


<iMonthIncrement>1</iMonthIncrement>
<iTurnsPerIncrement>900</iTurnsPerIncrement>
GlobalDefinesAlt.xml:


<DefineName>BASE_BIRTH_POINTS_THRESHOLD</DefineName>
<iDefineIntVal>400</iDefineIntVal>

В приведенном выше примере при BASE_BIRTH_POINTS_THRESHOLD = 400 новый колонист родится в городе с население 1 житель через 50 лет.

Если поменять 400 на 500, то для рождения нового жителя понадобится уже 62.5 года, если на 300, то только 37.5 года. И т.д. Логика, я думаю, понятна.


Значение еды при новой системе генерации жителей.

Как и в реальной жизни, еда остается важнейшим условием существования города. Первоначально игроку необходимо запастись хотя бы минимальным количеством еды, гарантирующим отсуствие голода в городе. Если это условие выполнено, то жители начинают генерить "очки рождаемости". Если в городе голод - то жители покидают город и появляются на глобальной карте, как это и было в оригинальной игре. При нехватке еды или невозможности ее производить продовольствие можно завести из другого своего города, Европы или же купить у аборигенов. Все это описано в в СивПедии в разделе "Концепции", см. "Food".

http://imageshack.us/a/img849/3316/02food.jpg (http://imageshack.us/photo/my-images/849/02food.jpg/)

Обратите внимание на появление нового понятия - "Неприкосновенный запас" ("Emergence Food Reserve"). Он рассчитывается как количество еды, которое необходимо всем жителям данного города при условии, что в город в течение 12 ходов не поступает или не производится его жителями никакое продовольствие. Понятие "Неприкосновенный запас" используется при работе городского склада в новых условия.

Расчет вместимости "городского склада".

В оригинальной версии Колонизации для каждого товара, хранящегося на городском складе, был выделен свой размер хранения. К примеру, при нормальной скорости на складе можно было хранить только 100 единиц руды. Если руды оказывалось больше, то избыток просто исчезал. При этом очень часто можно было наблюдать картину, когда все остальные ячейки склада, за исключением той, что относилась к еде, были совершенно пусты. Другими словами склад был практически пустой, но хранить производимый или добываемый в данном городе товар, в нем было невозможно. Любое превышение верхнего предела по данной позиции означало немедленную потерю данного товара.

Для еды правда было сделано исключение, поскольку при переполнении ячейки "Продовольствие" еда не исчезала, а появлялся новый колонист. При желании этот процесс можно было ускорить, свозя продовольствие из соседних городов или массово закупая его у аборигенов. Основная проблема была в том, что этот трюк был прекрасно известен игроку, но не AI, который управляет поведением остальных участников игры.

В данном моде расчет вместимости городского склада ведется намного более правильно и логично. Любой товар, включая еду, который имеется в наличии, добывается, собирается или производится в данном городе, хранится на городском складе. Сумма всех хранимых на складе в данный момент товаров - Stored goods (заполненность склада), прирост за ход - Change per turn, а Maх Capacity - максимальное количество товаров, которое может храниться на городском складе.

Вся информация о состоянии склада выведена в верхнюю часть городского экрана. Цифры, изображающие прирост хранимых товаров за ход могут быть со знаком "плюс" (склад пополняется) или "минус" (склад опорожняется). Обычно они зеленого цвета, однако за 10 ходов до возможного переполнения склада они меняют цвет и становятся желтыми. Когда же склад переполнен - эти цифры становятся красными. Очень рекомендуется в процессе игры следить за этими данными, вовремя вывозить (продавать) готовые товары или при необходимости строить расширенный склад.

http://imageshack.us/a/img708/8595/summaryofcityscreenstor.jpg (http://imageshack.us/photo/my-images/708/summaryofcityscreenstor.jpg/)

Таким образом, в данном моде возможно избежать ситуации, описанной выше на примере руды. Максимальный размер хранимых товаров одного вида ограничен только вместимостью склада.

Переполнение "городского склада".

Во избежании быстрого переполнения склада в данном моде в 3 раза увеличен параметер CITY_YIELD_CAPACITY (GlobalDefines.xml). Это позволяет избегать потери товаров в начальной стадии игры, когда настоящий городской склад еще не построен, а город основан юнитом, имеющим вооружение и лошадей (к примеру, драгуном).

Однако в любой игре может наступить момент, когда склад, даже расширенный, все же будет переполнен. В этом случае действует простой принцип: "С переполненного склада исчезает самый дешевый товар". Поскольку продовольствие является одним из самых дешевых товаров, то оно также может исчезнуть. Однако в отличие от других дешевых товаров типа древесины или руды, потеря продовольствие идет не до нуля, а до размера "Неприкосновенного запаса". В этос случае сначала теряется еда, превышающая НЗ, затем следующий самый дешевый товар. Возможен иной вариант, когда город густонаселен, склад уже переполнен, а "Неприкосновенный запас" еще полностью не созданю В этом случае с переполненного склада будет исчезать не продовольствие, другие самые дешевые товары, даже если их стоимость в разы выше стоимости продовольствия.

Все это описано в СивПедии в разделе "Концепции", см. "City Storage" .

http://imageshack.us/a/img818/9488/03citystorage.jpg (http://imageshack.us/photo/my-images/818/03citystorage.jpg/)

NeserVET
28.09.2012, 22:22
Я сделал несколько изменений
1) Немного подправил алгоритм в CvCity::doYields() после строчки //VET NewCapacity - begin 8/9
2) Сделал новую функцию CvCity::calculateTotalProducedYields() и заменил ею алгоритмы в CvDLLWidgetData.cpp и CvMainInterface.py

http://vet.civfanatics.ru/EoW/ColonistsPach.rar

P.S. для редактирования фалов (*.XML, *.py, *.cpp, *.h) лучше пользоваться Notepad++ (http://notepad-plus-plus.org/download/v6.1.8.html)

kabjans
29.09.2012, 00:26
Я сделал несколько изменений
1) Немного подправил алгоритм в CvCity::doYields() после строчки //VET NewCapacity - begin 8/9
2) Сделал новую функцию CvCity::calculateTotalProducedYields() и заменил ею алгоритмы в CvDLLWidgetData.cpp и CvMainInterface.py

http://vet.civfanatics.ru/EoW/ColonistsPach.rar

P.S. для редактирования фалов (*.XML, *.py, *.cpp, *.h) лучше пользоваться Notepad++ (http://notepad-plus-plus.org/download/v6.1.8.html)

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

Я сам использую для редактирования всех файлов только Notepad++, а обычный текстовой редактор Notepad назвал для тех, у кого есть просто винда, игра и желание поэкспериментировать с данными. Для простейших изменений, к примеру цифр, его вполне достаточно. Для более серьезных вещей безусловно лучше использовать Notepad++ или его аналоги.

kabjans
01.10.2012, 10:07
Я сделал несколько изменений
1) Немного подправил алгоритм в CvCity::doYields() после строчки //VET NewCapacity - begin 8/9
2) Сделал новую функцию CvCity::calculateTotalProducedYields() и заменил ею алгоритмы в CvDLLWidgetData.cpp и CvMainInterface.py


Привет, NeseryozniyVET!

Патч, оптимизирующий вывод данных на экран, мне удалось-таки совместить с текущей версией мода. При первой компиляции я получил букет ошибок:


CvGameCoreDLL\CvCity.cpp(4191): error C2065: 'pHeadSelectedCity' : undeclared identifier
CvGameCoreDLL\CvCity.cpp(4191): error C2227: left of '->calculateActualYieldProduced' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4205): error C2227: left of '->calculateNetYield' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4191): error C2227: left of '->getBaseRawYieldProduced' must point to class/struct/union type is ''unknown-type''
CvGameCoreDLL\CvCity.cpp(4191): error C3861: 'pHeadSelectedCity': identifier not found, even with argument-dependent lookup
CvGameCoreDLL\CvCity.cpp(4205): error C3861: 'pHeadSelectedCity': identifier not found, even with argument-dependent lookup
Однако как следует из первой строки все они имели одну первопричину:

'pHeadSelectedCity' : undeclared identifier
Я сначала по-дурости попытался выполнить "пожелания" программы-компилятора, а именно ввести и описать новую переменную 'pHeadSelectedCity'. Обычно такой трюк приводил меня в конце концов к успеху. После пары попыток мне действительно удалось это сделать и я смог без ошибок скомпилировать CvGameCoreDLL.dll. Однако вскоре оказалось, это был тупиковый путь. Мод с новой CvGameCoreDLL.dll запускался, но CvMainInterface.py естественно выдавал ошибку, поскольку TotalProducedYields не были правильно рассчитаны (если они вообще хоть как-то рассчитались).

Поэтому мне ничего не оставалось как вернуться к моему старому способу и посмотреть как и где описывается, в частности

pHeadSelectedCity->или нечто подобное и

calculateActualYieldProduced((YieldTypes)iI)
или нечто подобное.

Оказалось, что в CvCity.cpp вполне можно обойтись без pHeadSelectedCity->, что я незамедлительно и применил.

В итоге в патч были внесены небольшие изменения и сейчас эти участка кода выглядят так:
// iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
iUnproducedYield = calculateActualYieldProduced((YieldTypes)iI) - getBaseRawYieldProduced((YieldTypes)iI); //KJ correction

и

// aiProducedYields[iI] += pHeadSelectedCity->calculateNetYield((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
aiProducedYields[iI] += calculateNetYield((YieldTypes)iI); //KJ correction
В таком виде CvGameCoreDLL.dll компилируется без ошибок, мод запускается без проблем, а на городском экране все отражается правильно. По-видимому, так и должно быть.

Посмотри, пожалуйста, еще разок на этот участок кода:

CvCity.cpp:


//VET NewCapacity - begin 2/9
int CvCity::calculateTotalProducedYields() const
{

int iI, iJ, iNumProfessionInfos, iUnproducedYield, iYieldConsumed, iProducedYield;
int aiProducedYields[NUM_YIELD_TYPES];
bool bBIRTH_POINTS;

for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
aiProducedYields[iI] = 0;
}
iNumProfessionInfos = GC.getNumProfessionInfos();
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
// iUnproducedYield = pHeadSelectedCity->calculateActualYieldProduced((YieldTypes)iI) - pHeadSelectedCity->getBaseRawYieldProduced((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
iUnproducedYield = calculateActualYieldProduced((YieldTypes)iI) - getBaseRawYieldProduced((YieldTypes)iI); //KJ correction

if (iUnproducedYield < 0)
{
for (iJ = 0; iJ < iNumProfessionInfos; iJ++)
{
CvProfessionInfo& kProfession = GC.getProfessionInfo((ProfessionTypes)iJ);
if (kProfession.getYieldProduced() == iI)
{
iYieldConsumed = kProfession.getYieldConsumed();
if (iYieldConsumed != NO_YIELD)
{
aiProducedYields[iYieldConsumed] += iUnproducedYield;
}
}
}
}
// aiProducedYields[iI] += pHeadSelectedCity->calculateNetYield((YieldTypes)iI); //KJ closed due to error 'pHeadSelectedCity' : undeclared identifier
aiProducedYields[iI] += calculateNetYield((YieldTypes)iI); //KJ correction
}
bBIRTH_POINTS = (GC.getBASE_BIRTH_POINTS_THRESHOLD() != 0);
iProducedYield = 0;
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
if ((bBIRTH_POINTS || (iI != YIELD_FOOD)) && GC.getYieldInfo((YieldTypes)iI).isCargo())
{
iProducedYield += aiProducedYields[iI];
}
}
return iProducedYield;
}

Если такие изменения допустимы, то я выложу версию с патчем. Заранее большое спасибо.

NeseryozniyVET
01.10.2012, 10:26
Да, так и должно быть. Просто при создании функции я скопировал алгоритм из подсказки и забыл поудалять pHeadSelectedCity->.

kabjans
01.10.2012, 10:43
Да, так и должно быть. Просто при создании функции я скопировал алгоритм из подсказки и забыл поудалять pHeadSelectedCity->.

Большое спасибо! Сегодня вечером выложу линк на версию с патчем.

kabjans
01.10.2012, 19:40
"New Colonists" ("Новые колонисты") версия 1.1: http://rghost.net/40682579

micheline
01.10.2012, 20:18
Спасибо за мод.
Ждем глобальную связку. :)

NeseryozniyVET
01.10.2012, 22:22
"New Colonists" ("Новые колонисты") версия 1.1: http://rghost.net/40682579С весией ты погорячился. Изменения в патче настолько незначительные, что на одну десятую не тянут. Скорей всего 1,0,1.

kabjans
01.10.2012, 22:32
Привет, NeseryozniyVET!

У меня есть маленький вопрос по ресурсам.

Сейчас мы выводим на экран подсказку по исчерпаемым ресурсам в таком виде:

http://imageshack.us/a/img152/6594/02currentextensionoffie.jpg (http://imageshack.us/photo/my-images/152/02currentextensionoffie.jpg/)

Тут сверху вниз идут:


Название ресурса (Россыпное золото)
Текуший запас месторождения: 40
Ресурс исчерпаемый


В CvGameTextMgr.cpp это выглядит так:


eBonus = pPlot->getBonusType();

if (eBonus != NO_BONUS)

{
szTempBuffer.Format(L"%c " SETCOLR L"%s" ENDCOLR, GC.getBonusInfo(eBonus).getChar(), TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription());
szString.append(NEWLINE);
szString.append(szTempBuffer);
// VET AmountResourses - begin 1/2
if (pPlot->getAmount() > 0) // если ресурс исчерпаемый
{
// szTempBuffer.Format(L" (%d)", pPlot->getAmount()); //KJ new format of data

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_BONUS_STATUS")); //added by KJ

szTempBuffer.Format(L" %d", pPlot->getAmount());
szString.append(szTempBuffer); // добавляем количество ресурсов в подсказку на экране

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_AMOUNT_BONUS")); //added by KJ
}
// VET AmountResourses - end 1/2

Насколько я понимаю тут логика предельно простая:


if (eBonus != NO_BONUS) - если есть бонус, то ..... дальше по тексту.

Мне удалось ввести восполнимые ресурсы в твой код. А количественно восполнимые ресурсы могут как увеличиваться, так и уменьшаться. Для этого нужны новые по содержанию подсказки на экране (новые ссылки вместо TXT_KEY_BONUS_STATUS и TXT_KEY_AMOUNT_BONUS).

Вот тут то и возник вопрос.

Как правильно прописать в CvGameTextMgr.cpp такое условие:


если есть BONUS_1 или BONUS_2 или BONUS_3
то ...... (вариант 1)

если есть BONUS_4 или BONUS_5 или BONUS_6
то ..... (вариант 2)

Я попробовал к примеру такой вариант


if (eBonus == ((BonusTypes)GC.getDefineINT("BONUS_1")) || (BonusTypes)GC.getDefineINT("BONUS_2")) || (BonusTypes)GC.getDefineINT("BONUS_3")))

но ничего не получилось. CvGameCoreDLL.dll скомпилировалась без проблем, но подсказки вообще исчезли....

Заранее большое спасибо!

Да, и еще маленькое дополнение. Снимок, который я привел в этом сообщении сделан из комбинированного мода, в котором я за пару часов соединил "Новых колонистов" и "Золотую лихорадку". Все прошло на удивление гладко и без единого бага!

NeseryozniyVET
02.10.2012, 15:40
Ну если бонусы прописаны в Enums.h то есть два варианта
1


if((eBonus == BONUS_1) || (eBonus == BONUS_2) || (eBonus == BONUS_3))
{
вариант 1
}
else if ((eBonus == BONUS_4) || (eBonus == BONUS_5) || (eBonus == BONUS_6))
{
вариант 2
}
else //все остальные бонусы, если для них нужен особый вариант
{
вариант 3
}

2


switch (eBonus)
{
case BONUS_1:
case BONUS_2:
case BONUS_3:
{
вариант 1
}
break;
case BONUS_4:
case BONUS_5:
case BONUS_6:
{
вариант 2
}
break;
default: //все остальные бонусы
{
вариант 3
}
break;
}


Выделеное красным можно не делать, если нету третьего варианта

kabjans
02.10.2012, 16:54
Ну если бонусы прописаны в Enums.h то есть два варианта
1


if((eBonus == BONUS_1) || (eBonus == BONUS_2) || (eBonus == BONUS_3))
{
вариант 1
}
else if ((eBonus == BONUS_4) || (eBonus == BONUS_5) || (eBonus == BONUS_6))
{
вариант 2
}
else //все остальные бонусы, если для них нужен особый вариант
{
вариант 3
}

2


switch (eBonus)
{
case BONUS_1:
case BONUS_2:
case BONUS_3:
{
вариант 1
}
break;
case BONUS_4:
case BONUS_5:
case BONUS_6:
{
вариант 2
}
break;
default: //все остальные бонусы
{
вариант 3
}
break;
}


Выделеное красным можно не делать, если нету третьего варианта

А разве бонусы когда-либо прописывались в CvEnums.h?

В исходных кодах для CivIV:BTS и CivIVColonization есть только такое описание:


enum BonusTypes // Exposed to Python
{
NO_BONUS = -1,
};

Я уже пробовал вариант с выражением типа


eBonus == BONUS_GOLD

но компилятор выдает ошибку. Причем именно на строке, где eBonus == BONUS_GOLD.

Минуточку, сейчас еще разок проверю....

kabjans
02.10.2012, 17:26
Вот попробовал так:


eBonus = pPlot->getBonusType(); //original

// if (eBonus != NO_BONUS) //original
if (eBonus == BONUS_SILVER)
{
szTempBuffer.Format(L"%c " SETCOLR L"%s" ENDCOLR, GC.getBonusInfo(eBonus).getChar(), TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription());
szString.append(NEWLINE);
szString.append(szTempBuffer);
// VET AmountResourses - begin 1/2
if (pPlot->getAmount() > 0) // если ресурс исчерпаемый
{
// szTempBuffer.Format(L" (%d)", pPlot->getAmount()); //KJ new format of data

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_BONUS_STATUS")); //added by KJ

szTempBuffer.Format(L" %d", pPlot->getAmount());
szString.append(szTempBuffer); // добавляем количество ресурсов в подсказку на экране

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_AMOUNT_BONUS")); //added by KJ
}
// VET AmountResourses - end 1/2
}

Здесь использовал выражение if (eBonus == BONUS_SILVER)

При компиляции произошла ошибка.


CvGameCoreDLL\CvGameTextMgr.cpp(2279): error C2065: 'BONUS_SILVER' : undeclared identifier
CvGameCoreDLL\CvGameTextMgr.cpp(2279): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'BonusTypes' (or there is no acceptable conversion)

Строка номер 2279 это именно строка с if (eBonus == BONUS_SILVER).

NeseryozniyVET
03.10.2012, 01:22
Перепутал BONUS с YIERLD.
Ну тогда первый вариант и заменить на BONUS_1 заменить на GC.getDefineINT("BONUS_1"). Но это плохой вариант, так как каждый раз при добавлении или изменении бонусов надо будет перекомпилировать DLL.
Лучше делать проверку по свойствам. По каким свойствам ты хочешь разделить ресурсы в подсказке ?

kabjans
03.10.2012, 10:55
Ну тогда первый вариант и заменить на BONUS_1 заменить на GC.getDefineINT("BONUS_1"). Но это плохой вариант, так как каждый раз при добавлении или изменении бонусов надо будет перекомпилировать DLL.
Лучше делать проверку по свойствам. По каким свойствам ты хочешь разделить ресурсы в подсказке ?

Список бонусов в принципе уже известен и вряд ли он будет сильно корректироваться в дальнейшем. По крайней мере перечисляемые ниже пункты 1, 2, 3 останутся неизменными.

Все бонусы разделяются на

1. обычные бонусы

Это табак, хлопок, зерно, сахар, бананы. Позже этот список будет расширен чаем, кофе, какао и т.д. Все это сеется или собирается игроком в обычном режиме.

Для этой категории бонусов на экране абсолютно достаточно той информации, что уже есть, то есть ничего не надо ни добавлять, ни изменять.

2. невосполнимые минеральные ресурсы

Сейчас это железная руда, серебро, золото и россыпное золото. Позже будут добавлены уголь, драгоценные камни, глина, сера и селитра.
Камень как бонус - неисчерпаемый ресурс.

Все эти исчерпаемые бонусные ресурсы сейчас прекрасно описываются той подсказкой, что я приводил выше, а именно:

http://imageshack.us/a/img152/6594/02currentextensionoffie.jpg

Тут сверху вниз идут:

Название ресурса (Россыпное золото)
Текуший запас месторождения: 40
Ресурс исчерпаемый

С ними все в порядке, поэтому и для них менять или править ничего не надо.

3. воспроизводимые животные и растительные ресурсы

В оригинальной версии игры это, к примеру BONUS_DEER, BONUS_FUR и продукты моря: BONUS_CRAB и BONUS_FISH. Позже в этот список будут добавлены прежде всего обычная древесина (BONUS_LUMBER), ценные породы древесины (BONUS_VALUABLE_WOOD) и слоновая кость (BONUS_IVORY).

Сейчас воспроизводимые животные и растительные ресурсы работают по предельно простому принципу.

На первом ходу есть некий начальный запас этого ресурса.
Если клетка, на которой находится данный воспроизводимый ресурс, находится за пределами города, то данный ресурс каждый ход увеличивается, к примеру на 2. (эффект "дикой" природы, пока еще не тронутой цивилизацией)
Если клетка находится в пределах городской черты, но не обрабатывается - то только на 1, (сказывается влияние близлежащего города.)
Если клетка с данным бонусом обрабатывается в данном городе, то запас уменьшается на количество извлеченного ресурса и увеличивается на 1. При активной добыче шкур или древесины в какой-то момент наступает полное истощение бонусной клетки, поскольку скорость воспроизводства заведомо меньше скорости добычи. Бонус просто исчезает с карты, как это происходит сейчас с исчерпаемыми минеральными ресурсами.

Эта логика прекрасно работает и именно для данной категории "Воспроизводимых животных и растительных ресурсов" очень хотелось бы изменить подсказку.

А для этого надо как-то добраться (???) в CvGameTextMgr.cpp до TXT_KEY_BONUS_STATUS и TXT_KEY_AMOUNT_BONUS и разделить их на две части


1. TXT_KEY_BONUS_STATUS и TXT_KEY_AMOUNT_BONUS - для невосполнимых минеральных ресурсов (что уже есть)

и новые


2. TXT_KEY_BONUS_STATUS_2 и TXT_KEY_AMOUNT_BONUS_2 - для воспроизводимых животных и растительных ресурсов.

Вопрос только как это сделать?



Ну тогда первый вариант и заменить на BONUS_1 заменить на GC.getDefineINT("BONUS_1"). Но это плохой вариант, так как каждый раз при добавлении или изменении бонусов надо будет перекомпилировать DLL.

У меня сейчас нет под рукой компилятора и игры, поэтому мне сложно воспроизвести по памяти результат, но почти что такой вариант я точно пробовал. Моя строка выглядела так:


if (eBonus == (BonusTypes)GC.getDefineINT("BONUS_GOLD"))

В этом случае я мог скомилировать CvGameCoreDLL.dll, но подсказки вообще исчезли. Вариант типа


if (eBonus == GC.getDefineINT("BONUS_GOLD"))
я, насколько мне помнится, не пробовал. Сегодня вечером проверю и его, а затем отпишу что получилось.



Но это плохой вариант, так как каждый раз при добавлении или изменении бонусов надо будет перекомпилировать DLL.

Перекомпиляция и дополнительная правка уже готового кода меня совершенно не пугает. Это потребует несколько минут времени.

kabjans
03.10.2012, 12:21
Ну тогда первый вариант и заменить на BONUS_1 заменить на GC.getDefineINT("BONUS_1").

Нашел в своих заметках ответ компилятора.

Если


if (eBonus == GC.getBonusInfo(BONUS_SILVER))
то компилятор выдает лишь одно сообщение об ошибке:


CvGameCoreDLL\CvGameTextMgr.cpp(2282): error C2065: 'BONUS_SILVER' : undeclared identifier

Дальнейшая компиляция невозможна.

kabjans
03.10.2012, 13:32
Нашел решение!

Профессиональных программистов и людей, хоть немного знакомым с С++, убедительно прошу далее не читать, а если все же прочитаете, то не плеваться. Лучше вспомните табличку в американских кабаках времен Дикого Запада.



"В пианиста не стрелять! Он играет как умеет!"

Итак снимки с результатами.

Серебро (невосполнимый минеральный ресурс)

http://imageshack.us/a/img706/6294/silvercf.jpg (http://imageshack.us/photo/my-images/706/silvercf.jpg/)

Рыба (один из воспроизводимых ресурсов)

http://imageshack.us/a/img19/2954/fishg.jpg (http://imageshack.us/photo/my-images/19/fishg.jpg/)

Найденное решение наверняка идиотское с точки зрения программирования. но оно работает!

Для получения желаемого результата надо было условия выбора прописать так:


if ((eBonus == 5) || (eBonus == 6))

то тогда читаются "TXT_KEY_BONUS_STATUS" и "TXT_KEY_AMOUNT_BONUS"

А если


if ((eBonus == 3) || (eBonus == 4))

то тогда читаются "TXT_KEY_BONUS_STATUS_2" и "TXT_KEY_AMOUNT_BONUS_2".

Номера после "eBonus ==" соответствуют порядковым номерам соответствующих бонусов в CIV4BonusInfos.xml, если начинать счет с нуля.

Наверняка эти же цифры можно описать покрасивше, но "пианист" этого не Шмог сделать. Сорри!

NeseryozniyVET
04.10.2012, 12:12
if (eBonus == GC.getBonusInfo(BONUS_SILVER))
то компилятор выдает лишь одно сообщение об ошибке:
BONUS_SILVER должно быть в кавычках

Второй тип ресурсов определяется условиями
if (GC.getBonusInfo(eBonus).getMaxAmount() > 0)
или
if (pPlot->getAmount() > 0)
Аналогичным образом можно определять и третий тип ресурса.
Создаешь новый параметр для бонусов по аналогии с моим максимальным количеством iMaxAmount. Что-то типа пополняемость, естественное восстановление и т.д. (только на английском). Этот новый параметр будет отвечать за пополнение месторождения (популяции) ресурса.

kabjans
04.10.2012, 19:14
BONUS_SILVER должно быть в кавычках

Второй тип ресурсов определяется условиями
if (GC.getBonusInfo(eBonus).getMaxAmount() > 0)
или
if (pPlot->getAmount() > 0)


Я пробовал различные варианты для eBonus == , в том числе и эти два (как с кавычками, так и без).


if (eBonus == GC.getBonusInfo("BONUS_SILVER"))


if (eBonus == GC.getDefineINT("BONUS_SILVER"))

В самом лучшем случае файл компилируется, но подсказка на экране не появляется. Собственно поэтому я и остановился на простейшем варианте написания условий для eBonus ==.

Действительно, в самом начале этого раздела в CvGameTextMgr.cpp мы видим:


eBonus = pPlot->getBonusType();

if (eBonus != NO_BONUS)

и далее тра-ля-ля условия.

Что означает выражение "if (eBonus != NO_BONUS)"?

В самом общем виде - "Если есть бонус". А если прочитать его по частям, то получим: "Если неверно условие, что нет бонуса". В данном случае NO_BONUS означает для меня "нет бонуса", но программа его воспринимает как -1. Но -1 это число, поэтому совершенно разумно было предположить, что программа готова принять вместо -1 некие иные цифры.

Но что это могут быть за цифры и откуда они возмуться?

Я предположил, что цифры - номера имеющихся в игре бонусов, а они могут взяться только из CIV4BonusInfos.xml. При этом цифры должны означать порядковый номер бонуса при расчете сверху вниз, начиная с нуля. Такое правило жестко действует в CIV4YieldInfos.xml, поэтому разумно было допустить, что и для случая с бонусами оно также будет действовать.

Когда я проверил эти предположение, введя


// KJ comments: for Exhaustible bonus resources

if ((eBonus == 5) || (eBonus == 6) || (eBonus == 7) || (eBonus == 12))

//List of Exhaustible bonus resources according to CIV4BonusInfos.xml:
// 5 - BONUS_SILVER
// 6 - BONUS_GOLD
// 7 - BONUS_PLACER_GOLD
//12 - BONUS_IRON

и


// KJ comments: for Renewable bonus resources

if ((eBonus == 1) || (eBonus == 3) || (eBonus == 4) || (eBonus == 9))

//List of Renewable bonus resources according to CIV4BonusInfos.xml:
// 1 - BONUS_DEER
// 3 - BONUS_CRAB
// 4 - BONUS_FISH
// 9 - BONUS_FUR

то все заработало, как и требовалось. Пара снимков в предыдущем моем сообщении сделана с уже скомпилированного мода.

В готовом виде этот участок кода выглядит так:


eBonus = pPlot->getBonusType();

// if (eBonus != NO_BONUS) //original; closed by KJ

//KJ addon START
// KJ comments: for Exhaustible bonus resources

if ((eBonus == 5) || (eBonus == 6) || (eBonus == 7) || (eBonus == 12))

//List of Exhaustible bonus resources according to CIV4BonusInfos.xml:
// 5 - BONUS_SILVER
// 6 - BONUS_GOLD
// 7 - BONUS_PLACER_GOLD
//12 - BONUS_IRON

{
szTempBuffer.Format(L"%c " SETCOLR L"%s" ENDCOLR, GC.getBonusInfo(eBonus).getChar(), TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription());

szString.append(NEWLINE);
szString.append(szTempBuffer);
// VET AmountResourses - begin 1/2
if (pPlot->getAmount() > 0) // если ресурс исчерпаемый
{
szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_BONUS_STATUS")); //added by KJ

szTempBuffer.Format(L" %d", pPlot->getAmount());
szString.append(szTempBuffer); // добавляем количество ресурсов в подсказку на экране

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_AMOUNT_BONUS")); //added by KJ
}
}
// VET AmountResourses - end 1/2

// KJ comments: for Renewable bonus resources

if ((eBonus == 1) || (eBonus == 3) || (eBonus == 4) || (eBonus == 9))

//List of Renewable bonus resources according to CIV4BonusInfos.xml:
// 1 - BONUS_DEER
// 3 - BONUS_CRAB
// 4 - BONUS_FISH
// 9 - BONUS_FUR

{
szTempBuffer.Format(L"%c " SETCOLR L"%s" ENDCOLR, GC.getBonusInfo(eBonus).getChar(), TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription());

szString.append(NEWLINE);
szString.append(szTempBuffer);
// VET AmountResourses - begin 1/2
if (pPlot->getAmount() > 0) // если ресурс исчерпаемый
{
szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_BONUS_STATUS_2")); //added by KJ

szTempBuffer.Format(L" %d", pPlot->getAmount());
szString.append(szTempBuffer); // добавляем количество ресурсов в подсказку на экране

szString.append(CvWString::format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR))); //added by KJ
szString.append(gDLL->getText("TXT_KEY_AMOUNT_BONUS_2")); //added by KJ
}
// VET AmountResourses - end 1/2
}
//KJ addon END

Единственное неудобство, что надо четко помнить о порядковом номере при добавлении новых бонусов и их вводить надо после уже введенных. Если же будут добавлены такие бонусы, которые подпадут под условия 2 (исчерпаемые) или 3 (возобновляемые ресурсы), то их при любых нужно будет специально прописывать в этом разделе CvGameTextMgr.cpp. Но это работа на пару минут.




Аналогичным образом можно определять и третий тип ресурса.
Создаешь новый параметр для бонусов по аналогии с моим максимальным количеством iMaxAmount. Что-то типа пополняемость, естественное восстановление и т.д. (только на английском). Этот новый параметр будет отвечать за пополнение месторождения (популяции) ресурса.

Безусловно можно, но это довольно сложно и по-моему излишне.

Я поступил намного проще.

В CvPlot.cpp у тебя есть такой участок кода:


void CvPlot::doTurn()
{

....

// VET AmountResourses - begin 2/24
BonusTypes eBonus = (BonusTypes)m_eBonusType;
if (eBonus != NO_BONUS) // если на тайле есть месторождение ресурса
{
CvBonusInfo& kBonusInfo = GC.getBonusInfo(eBonus);
if (kBonusInfo.getMaxAmount() > 0) // если ресурс исчерпуемый
{
YieldTypes eYield;
for (int i = 0; i < NUM_YIELD_TYPES; i++) // перебираем отдачу
{
eYield = (YieldTypes)i; // тип отдачи
if (kBonusInfo.getYieldChange(eYield) > 0) // если ресурс увеличивает отдачу
{
int iAmountYields = 0; // расход месторождения за этот ход
if (getPlotCity() != NULL) // если на тайле город
{
iAmountYields = kBonusInfo.getYieldChange(eYield);
}
else
{
CvCity* pWorkingCity = getWorkingCity();
if ((pWorkingCity != NULL) && (pWorkingCity->getUnitWorkingPlot(this) != NULL)) // если тайл в пределах городских границ и на тайле трудится горожанин
{
iAmountYields = calculateYield(eYield, false, /*OnlyBonus*/true);
}
}
if (iAmountYields > 0) // если есть расход месторождения
{
setAmount(m_iAmount - iAmountYields); // уменьшаем запас месторождения
if (m_eBonusType != NO_BONUS) // если месторождение не израсходовано
{
if (m_iAmount < iAmountYields) // если в месторождении меньше ресурса чем полная отдача ресурса
{
updateYield(true); // пересчитуем отдачу от тайла
}
}
}
}
}
}
}
// VET AmountResourses - end 2/24
....
}

Здесь ты вычисляешь уменьшения исчерпаемого ресурса за ход. Для этого, как я понимаю, вводится временная переменная iAmountYields. Сразу извиняюсь с терминами, возможно они не совсем правильны и на русский переводятся как-то иначе. Тем не менее я решил "перехватить" расчет с помощью iAmountYields.

В твоем варианте iAmountYields - расход месторождения за этот ход. От себя добавлю "для исчерпаемого минерального ресурса".

Что сделал я? Добавил свою пару переменных после int iAmountYields


int iAmountYields = 0; // расход месторождения за этот ход
//KJ addon Renewable resourses START
int iAmountYields2 = 0; // увеличение запаса ресурса за этот ход для тайлов внутри городской черты
int iAmountYields3 = 0; // увеличение запаса ресурса за этот ход за пределами городской черты
//KJ addon Renewable resourses END

Естественно увеличение запаса ресурса возможно только для восполняемого ресурса. Причем здесь я сразу же разделил эту прибавку на два возможных варианта: в пределах города и за пределами города.

В итоге приведенный участок кода теперь выглядит так:


void CvPlot::doTurn()
{

....

// VET AmountResourses - begin 2/24
BonusTypes eBonus = (BonusTypes)m_eBonusType;
if (eBonus != NO_BONUS) // если на тайле есть месторождение ресурса
{
CvBonusInfo& kBonusInfo = GC.getBonusInfo(eBonus);
if (kBonusInfo.getMaxAmount() > 0) // если ресурс исчерпаемый
{
YieldTypes eYield;
for (int i = 0; i < NUM_YIELD_TYPES; i++) // перебираем отдачу
{
eYield = (YieldTypes)i; // тип отдачи
if (kBonusInfo.getYieldChange(eYield) > 0) // если ресурс увеличивает отдачу
{
int iAmountYields = 0; // расход месторождения за этот ход
//KJ addon Renewable resourses START
int iAmountYields2 = 0; // увеличение запаса ресурса за этот ход для тайлов внутри городской черты
int iAmountYields3 = 0; // увеличение запаса ресурса за этот ход за пределами городской черты
//KJ addon Renewable resourses END

if (getPlotCity() != NULL) // если на тайле город
{
iAmountYields = kBonusInfo.getYieldChange(eYield);
}

if (CvCity* pWorkingCity = getWorkingCity())
{
if ((pWorkingCity != NULL) && (pWorkingCity->getUnitWorkingPlot(this) != NULL)) // если тайл в пределах городских границ и на тайле трудится горожанин

//KJ addon Renewable resourses START
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы
{
iAmountYields = calculateYield(eYield, false, /*OnlyBonus*/true); // уменьшения запаса ресурса происходит НА ВЕЛИЧИНУ БОНУСА
}

if ((eYield == YIELD_FUR) || (eYield == YIELD_FOOD)) // Renewable resourses YIELD_FUR and YIELD_FOOD (ONLY BONUS_CRAB and )
{
iAmountYields = calculateYield(eYield, false) + 1; // уменьшения запаса ресурса происходит на величину БОНУСА + БАЗОВАЯ ОТДАЧА с тайла, + 1 для корректировки
}
}
//KJ comments START
/*
Если тайл в пределах городских границ, НО на тайле НЕ трудится горожанин.
Ввести корректировку (псевдо-коэффициент) для возобновляемых ресурсов
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
else
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields2 = 0; //увеличения запаса ресурса НЕ происходит
}

else
{
iAmountYields2 = calculateYield(eYield, false, /*OnlyBonus*/true) * 1 / 2 - 2; // увеличение запаса ресурса на +1 за счет восстанавления в пределах городской черты
}
}
//KJ addon END
}

//KJ addon START
/*
Если тайл ЗА ПРЕДЕЛАМИ городских границ.
Введена корректировка (псевдо-коэффициент) для возобновляемых ресурсов, равная +2.
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
if (getPlotCity() == NULL) // если на тайле НЕТ города
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields3 = 0;
}

else // возобновляемые ресурсы восстанавливаются со скоростью iAmountYields3
{
iAmountYields3 = 2; // увеличение запаса ресурса на +2 за счет восстанавления за пределами городской черты
}
}
//KJ addon END

//KJ addon START
if ((iAmountYields > 0) || (iAmountYields2 > 0) || (iAmountYields3 > 0)) // если есть расход ИЛИ приход месторождения

{
//корректировка запаса ресурса в зависимости от iAmountYields, iAmountYields2 и iAmountYields3
setAmount(m_iAmount - iAmountYields + iAmountYields2 + iAmountYields3); // уменьшаем запас месторождения + увеличиваем за счет восстанавления для животных и растительных ресурсов
//KJ addon END
if (m_eBonusType != NO_BONUS) // если месторождение не израсходовано
{
if (m_iAmount < iAmountYields) // если в месторождении меньше ресурса, чем полная отдача ресурса
{
updateYield(true); // пересчитываем отдачу от тайла
}
}
}
}
}
}
}
// VET AmountResourses - end 2/24
....
}
Дополнительные пояснения даны по-русски прямо в самом коде, поэтому детально их расписывать вряд ли необходимо.

В итоге вместо уменьшения минерального ресурса


setAmount(m_iAmount - iAmountYields)
мы получаем дифференцированный ответ:


//корректировка запаса ресурса в зависимости от iAmountYields, iAmountYields2 и iAmountYields3
setAmount(m_iAmount - iAmountYields + iAmountYields2 + iAmountYields3); // уменьшаем запас месторождения + увеличиваем за счет восстанавления для животных и растительных ресурсов
когда минеральные ресурсы уменьшаются как и должно быть, а восполнимые ресурсы увеличиваются в зависимости от того где они - в пределах городской черты или вне ее. Псевдо-коэффициенты при расчетах iAmountYields2 и iAmountYields3 я подобрал экспериментально, поскольку величины бонусов известны заранее.

Все работает так, как и планировалось. Плюс все предельно просто, а ошибок я пока не нашел.

NeseryozniyVET
05.10.2012, 14:17
Ты не учел вариант когда в месторождении ресурса меньше чем отдача от бонуса и после пополнения ресурса стало больше или равно чем отдача от бонуса


void CvPlot::doTurn()
{

....

// VET AmountResourses - begin 2/24
BonusTypes eBonus = (BonusTypes)m_eBonusType;
if (eBonus != NO_BONUS) // если на тайле есть месторождение ресурса
{
CvBonusInfo& kBonusInfo = GC.getBonusInfo(eBonus);
if (kBonusInfo.getMaxAmount() > 0) // если ресурс исчерпаемый
{
YieldTypes eYield;
for (int i = 0; i < NUM_YIELD_TYPES; i++) // перебираем отдачу
{
eYield = (YieldTypes)i; // тип отдачи
if (kBonusInfo.getYieldChange(eYield) > 0) // если ресурс увеличивает отдачу
{
int iOldAmount = m_iAmount; // запас месторождения до изменений
int iAmountYields = 0; // расход месторождения за этот ход
//KJ addon Renewable resourses START
int iAmountYields2 = 0; // увеличение запаса ресурса за этот ход для тайлов внутри городской черты
int iAmountYields3 = 0; // увеличение запаса ресурса за этот ход за пределами городской черты
//KJ addon Renewable resourses END

if (getPlotCity() != NULL) // если на тайле город
{
iAmountYields = kBonusInfo.getYieldChange(eYield);
}

if (CvCity* pWorkingCity = getWorkingCity())
{
if ((pWorkingCity != NULL) && (pWorkingCity->getUnitWorkingPlot(this) != NULL)) // если тайл в пределах городских границ и на тайле трудится горожанин

//KJ addon Renewable resourses START
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы
{
iAmountYields = calculateYield(eYield, false, /*OnlyBonus*/true); // уменьшения запаса ресурса происходит НА ВЕЛИЧИНУ БОНУСА
}

if ((eYield == YIELD_FUR) || (eYield == YIELD_FOOD)) // Renewable resourses YIELD_FUR and YIELD_FOOD (ONLY BONUS_CRAB and )
{
iAmountYields = calculateYield(eYield, false) + 1; // уменьшения запаса ресурса происходит на величину БОНУСА + БАЗОВАЯ ОТДАЧА с тайла, + 1 для корректировки
}
}
//KJ comments START
/*
Если тайл в пределах городских границ, НО на тайле НЕ трудится горожанин.
Ввести корректировку (псевдо-коэффициент) для возобновляемых ресурсов
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
else
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields2 = 0; //увеличения запаса ресурса НЕ происходит
}

else
{
iAmountYields2 = calculateYield(eYield, false, /*OnlyBonus*/true) * 1 / 2 - 2; // увеличение запаса ресурса на +1 за счет восстанавления в пределах городской черты
}
}
//KJ addon END
}

//KJ addon START
/*
Если тайл ЗА ПРЕДЕЛАМИ городских границ.
Введена корректировка (псевдо-коэффициент) для возобновляемых ресурсов, равная +2.
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
if (getPlotCity() == NULL) // если на тайле НЕТ города
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields3 = 0;
}

else // возобновляемые ресурсы восстанавливаются со скоростью iAmountYields3
{
iAmountYields3 = 2; // увеличение запаса ресурса на +2 за счет восстанавления за пределами городской черты
}
}
//KJ addon END

//KJ addon START
if ((iAmountYields > 0) || (iAmountYields2 > 0) || (iAmountYields3 > 0)) // если есть расход ИЛИ приход месторождения

{
//корректировка запаса ресурса в зависимости от iAmountYields, iAmountYields2 и iAmountYields3
setAmount(m_iAmount - iAmountYields + iAmountYields2 + iAmountYields3); // уменьшаем запас месторождения + увеличиваем за счет восстанавления для животных и растительных ресурсов
//KJ addon END
if (m_eBonusType != NO_BONUS) // если месторождение не израсходовано
{
if ((m_iAmount < iAmountYields) || (iOldAmount < iAmountYields)) // если в месторождении стало или было меньше ресурса, чем полная отдача ресурса
{
updateYield(true); // пересчитываем отдачу от тайла
}
}
}
}
}
}
}
// VET AmountResourses - end 2/24


И я все-таки рекомендую сделать новый параметр для бонуса естественное пополнение. Во-первых не надо будет помнить порядок ресурсов в XML, а во-вторых - можно для каждого бонуса делать разныое пополнение.

kabjans
05.10.2012, 15:50
Ты не учел вариант когда в месторождении ресурса меньше чем отдача от бонуса и после пополнения ресурса стало больше или равно чем отдача от бонуса


void CvPlot::doTurn()
{

....

// VET AmountResourses - begin 2/24
BonusTypes eBonus = (BonusTypes)m_eBonusType;
if (eBonus != NO_BONUS) // если на тайле есть месторождение ресурса
{
CvBonusInfo& kBonusInfo = GC.getBonusInfo(eBonus);
if (kBonusInfo.getMaxAmount() > 0) // если ресурс исчерпаемый
{
YieldTypes eYield;
for (int i = 0; i < NUM_YIELD_TYPES; i++) // перебираем отдачу
{
eYield = (YieldTypes)i; // тип отдачи
if (kBonusInfo.getYieldChange(eYield) > 0) // если ресурс увеличивает отдачу
{
int iOldAmount = m_iAmount; // запас месторождения до изменений
int iAmountYields = 0; // расход месторождения за этот ход
//KJ addon Renewable resourses START
int iAmountYields2 = 0; // увеличение запаса ресурса за этот ход для тайлов внутри городской черты
int iAmountYields3 = 0; // увеличение запаса ресурса за этот ход за пределами городской черты
//KJ addon Renewable resourses END

if (getPlotCity() != NULL) // если на тайле город
{
iAmountYields = kBonusInfo.getYieldChange(eYield);
}

if (CvCity* pWorkingCity = getWorkingCity())
{
if ((pWorkingCity != NULL) && (pWorkingCity->getUnitWorkingPlot(this) != NULL)) // если тайл в пределах городских границ и на тайле трудится горожанин

//KJ addon Renewable resourses START
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы
{
iAmountYields = calculateYield(eYield, false, /*OnlyBonus*/true); // уменьшения запаса ресурса происходит НА ВЕЛИЧИНУ БОНУСА
}

if ((eYield == YIELD_FUR) || (eYield == YIELD_FOOD)) // Renewable resourses YIELD_FUR and YIELD_FOOD (ONLY BONUS_CRAB and )
{
iAmountYields = calculateYield(eYield, false) + 1; // уменьшения запаса ресурса происходит на величину БОНУСА + БАЗОВАЯ ОТДАЧА с тайла, + 1 для корректировки
}
}
//KJ comments START
/*
Если тайл в пределах городских границ, НО на тайле НЕ трудится горожанин.
Ввести корректировку (псевдо-коэффициент) для возобновляемых ресурсов
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
else
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields2 = 0; //увеличения запаса ресурса НЕ происходит
}

else
{
iAmountYields2 = calculateYield(eYield, false, /*OnlyBonus*/true) * 1 / 2 - 2; // увеличение запаса ресурса на +1 за счет восстанавления в пределах городской черты
}
}
//KJ addon END
}

//KJ addon START
/*
Если тайл ЗА ПРЕДЕЛАМИ городских границ.
Введена корректировка (псевдо-коэффициент) для возобновляемых ресурсов, равная +2.
Этот псевдо-коэффициент РАВЕН НУЛЮ для исчерпаемых минеральных ресурсов и БОЛЬШЕ НУЛЯ для возобновляемых ресурсов
*/
if (getPlotCity() == NULL) // если на тайле НЕТ города
{
if ((eYield == YIELD_SILVER) || (eYield == YIELD_ORE) || (eYield == YIELD_GOLD)) // минеральные ресурсы невосполнимы
{
iAmountYields3 = 0;
}

else // возобновляемые ресурсы восстанавливаются со скоростью iAmountYields3
{
iAmountYields3 = 2; // увеличение запаса ресурса на +2 за счет восстанавления за пределами городской черты
}
}
//KJ addon END

//KJ addon START
if ((iAmountYields > 0) || (iAmountYields2 > 0) || (iAmountYields3 > 0)) // если есть расход ИЛИ приход месторождения

{
//корректировка запаса ресурса в зависимости от iAmountYields, iAmountYields2 и iAmountYields3
setAmount(m_iAmount - iAmountYields + iAmountYields2 + iAmountYields3); // уменьшаем запас месторождения + увеличиваем за счет восстанавления для животных и растительных ресурсов
//KJ addon END
if (m_eBonusType != NO_BONUS) // если месторождение не израсходовано
{
if ((m_iAmount < iAmountYields) || (iOldAmount < iAmountYields)) // если в месторождении стало или было меньше ресурса, чем полная отдача ресурса
{
updateYield(true); // пересчитываем отдачу от тайла
}
}
}
}
}
}
}
// VET AmountResourses - end 2/24


И я все-таки рекомендую сделать новый параметр для бонуса естественное пополнение. Во-первых не надо будет помнить порядок ресурсов в XML, а во-вторых - можно для каждого бонуса делать разныое пополнение.

Большое спасибо за уточнение. Я посмотрю, что смогу сделать для восполнимого ресурса.

Правда для начала я попытаюсь понять почему в CIV4UnitInfos.xml не работает этот участок


<YieldChanges>
<YieldChange>
<YieldType>YIELD_ORE</YieldType>
<iYieldChange>-Х</iYieldChange>
</YieldChange>
</YieldChanges>

где iYieldChange есть некая величина МИНУС Х.

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

С другой стороны требуется исключить возможность добычи минеральных ресурсов остальными юнитами. Раньше это было сделать очень просто, введя в CIV4UnitInfos.xml к примеру условие, где Х = 3:


<YieldChanges>
<YieldChange>
<YieldType>YIELD_ORE</YieldType>
<iYieldChange>-3</iYieldChange>
</YieldChange>
</YieldChanges>

Если на бонусной клетке было 3 единицы, к примеру руды, то колонист добывать ее не мог. У него вообще не было профессии шахтера.

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

NeseryozniyVET
07.10.2012, 11:49
Правда для начала я попытаюсь понять почему в CIV4UnitInfos.xml не работает этот участокОграничений в кодах не нашел - должен работать.

kabjans
08.10.2012, 11:56
Ограничений в кодах не нашел - должен работать.

Вот это и странно....

Я ввожу ограничение на возможность добычи руды для юнита, ставя в CIV4UnitInfos.xml, к примеру, -4, что фактически означает полный запрет на добычу руды, но юнит как ни в чем не бывало продолжает добывать руду в количествах, определяемых в CIV4BonusInfos.xml:

<YieldChanges>
<YieldIntegerPair>
<YieldType>YIELD_ORE</YieldType>
<iValue>3</iValue>
</YieldIntegerPair>
</YieldChanges>


Для городских профессий (те, что в зданиях) все работает штатно. Если для этого же самого юнита я ставлю в CIV4UnitInfos.xml, к примеру, -2 на производство колоколов, то данный юнит действительно производит на 2 колокола меньше, чем должен.

А вот для полевых профессий - типа шахтера - это почему-то не работает....

Небольшое пояснение относительно того, для чего это надо.

В оригинальной версии любой юнит мог производить все что угодно. Можно было, к примеру, загнать рыбака или администратора (UNIT_STATESMAN) в шахту и они добывали бы одинаковое количество руды. Можно в эту же шахту было направить шахтера и тогда он добывал бы в 2 раза больше руды. На первый взгляд вроде бы логично.

Но наскольно разумно такое решение?

Абсолютно невозможно представить работающего в шахте администратора (UNIT_STATESMAN). Или возвращаясь в наше время - нынешних президентов, премьеров или кого-нибудь из их многочисленной челяди во власти, если конечно их туда не отправили по решению суда. Но даже и в этом случае, их производительность по определению должна быть очень низкой, практически нулевой, так как они не приспособлены и не обучены для такой работы.

Каков же выход? Очень простой. Нужно четко разделить все профессии на три класса.

Полевые профессии - шахтер, рыбак, пахарь и т.д.
Городские мастеровые - плотник, кузнец, винодел и т.д.
Высшее сословие - администратор и священник.

Для первой категории юнитов, владеющих полевыми профессиями, ввести большие минусы на занятие должностей администратора или священника, к примеру -2. Это будет означать, что рыбак может работать в качестве администратора, но его отдача как работника, будет очень низкой. За примерами из нашей жизни ходить далеко не надо. Бывший президент, а ныне премьер России Медведев. По первой профессии - дворник, но оказавшись наверху административной лестницы, запомнился переводом стрелок часов, "отливанием в граните" и массой иных глупостей.

Для представителей же высших сословий напротив, нужно ввести ограничение при их работе в "полевых" условиях, вводя большие минусы при работе в поле, на шахте или в море (рыбалка).

Для городских мастеровых должен быть некий промежуточный вариант, когда они наиболее производительны только в своей должности, а все что профессионально выше или ниже них, то идет с минимальным минусом (-1).

Собственно для этого мне и нужно работающий механизм введения минусов. Пока же он работает только для городских профессий.

Как говорил Семен Семенович Горбунков из "Бриллиантовой руки", выбирая халат в комиссионке.

- А у Вас есть точно такой же, но с перламутровыми пуговицами?
- К сожалению, нет.
- Будем искать....

Ну и я продолжу поиск причины ... :)

kabjans
08.10.2012, 13:17
Вот кстати еще одна небольшая иллюстрация к описанной выше проблеме.

- Бонусная клетка ТАБАК.
- BONUS_TOBACCO не подпадает ни под какие ограничения. Это естественно ни минеральный исчерпаемый, ни восполняемый растительный ресурс. Табак - самый обычный бонус.

Для него в CIV4BonusInfos.xml имеем:


<Type>BONUS_TOBACCO</Type>
<Description>TXT_KEY_BONUS_TOBACCO</Description>
<Civilopedia>TXT_KEY_YIELD_TOBACCO_PEDIA</Civilopedia>
<ArtDefineTag>ART_DEF_BONUS_TOBACCO</ArtDefineTag>
<BuildingType>BUILDING_BONUS_TOBACCO</BuildingType>
<YieldChanges>
<YieldIntegerPair>
<YieldType>YIELD_TOBACCO</YieldType>
<iValue>3</iValue>
</YieldIntegerPair>
</YieldChanges>
<iAIObjective>0</iAIObjective>
.........

Для колониста я исключительно для пробы ввожу в CIV4UnitInfos.xml:


<YieldChanges>
<YieldChange>
<YieldType>YIELD_TOBACCO</YieldType>
<iChange>-2</iChange>
</YieldChange>
</YieldChanges>


То есть в итоге должно быть

+3 - 2 = 1

+3 с бонуса, - 2 с юнита, работающего на сборе табака. Этот юнит должен собирать только 1 единицу табака с бонусной клетки.

Однако в реальности колонист может собирать 3 единицы табака, то есть то количество, что прописано в CIV4BonusInfos.xml.

На снимке снизу я специально впечатал участок с описанием запасов табака на бонусной клетке.

http://imageshack.us/a/img204/4378/tobacco.jpg (http://imageshack.us/photo/my-images/204/tobacco.jpg/)

Это подтверждает, что сейчас ни один из "полевых" бонусов не может быть уменьшен через CIV4UnitInfos.xml.

Дополнено: Клетка, где колонист может собирать табак, единственная в пределах данного города. Других клеток с табаком - нет

NeseryozniyVET
10.10.2012, 15:06
А ты попробуй отдачу ресурсов сделать маленькую, а спецам побышеный бонус при обработке.

kabjans
10.10.2012, 15:34
Итак, мне удалось-таки подкорректировать исходные коды мода таким образом, чтобы с одной стороны восстановить утраченные возможности введения минусов для юнитов, а с другой не разрушить уже прекрасно работающие ископаемые ресурсы. Для этого пришлось довольно значительно подправить один из разделов CvPlot.cpp, а именно
int CvPlot::calculatePotentialYield ...

В конечном (измененном) виде он выглядит так:



// VET AmountResourses - begin 15/24
//int CvPlot::calculatePotentialYield(YieldTypes eYield, PlayerTypes ePlayer, ImprovementTypes eImprovement, bool bIgnoreFeature, RouteTypes eRoute, UnitTypes eUnit, bool bDisplay) const
int CvPlot::calculatePotentialYield(YieldTypes eYield, PlayerTypes ePlayer, ImprovementTypes eImprovement, bool bIgnoreFeature, RouteTypes eRoute, UnitTypes eUnit, bool bDisplay, bool bOnlyBonus) const
// VET AmountResourses - end 15/24
{
TeamTypes eTeam = ((ePlayer != NO_PLAYER) ? GET_PLAYER(ePlayer).getTeam() : NO_TEAM);

if (getTerrainType() == NO_TERRAIN)
{
return 0;
}

if (!isPotentialCityWork())
{
return 0;
}

// VET AmountResourses - begin 16/24

//int iYield = calculateNatureYield(eYield, eTeam, bIgnoreFeature); // Оригинальный код

//KJ variant 09.10.12
//All mineral exhausted resources are located ONLY on BONUS tiles
//Thus, this section should be closed START

//KJ int iNoBonusYield = calculateNatureYield(eYield, eTeam, bIgnoreFeature, /*without bonus*/true);
//KJ int iYield = iNoBonusYield;
//KJ int iBonusYield = calculateNatureYield(eYield, eTeam, bIgnoreFeature) - iNoBonusYield;

//Thus, this section should be closed END

int iYield = calculateNatureYield(eYield, eTeam, bIgnoreFeature); // Оригинальный код, restored by KJ
// VET AmountResourses - end 16/24

if (eImprovement != NO_IMPROVEMENT)
{

// VET AmountResourses - begin 17/24
//iYield += calculateImprovementYieldChange(eImprovement, eYield, ePlayer); // Оригинальный код

//KJ variant 09.10.12
//All mineral exhausted resources are located ONLY on BONUS tiles
//Thus, this section should be closed START

// iNoBonusYield = calculateImprovementYieldChange(eImprovement, eYield, ePlayer, false, /*without bonus*/true);
// iYield += iNoBonusYield;
// iBonusYield += calculateImprovementYieldChange(eImprovement, eYield, ePlayer) - iNoBonusYield;

//Thus, this section should be closed END

iYield += calculateImprovementYieldChange(eImprovement, eYield, ePlayer); // Оригинальный код, restored by KJ

// VET AmountResourses - end 17/24

}

if (eRoute != NO_ROUTE)
{
if(iYield > 0)
{
iYield += GC.getRouteInfo(eRoute).getYieldChange(eYield);
}
}

if (ePlayer != NO_PLAYER)
{
if (isWater())
{
if (!isImpassable())
{
iYield += GET_PLAYER(ePlayer).getSeaPlotYield(eYield);

CvCity* pWorkingCity = getWorkingCity();
if (pWorkingCity != NULL)
{
if (!bDisplay || pWorkingCity->isRevealed(eTeam, false))
{
iYield += pWorkingCity->getSeaPlotYield(eYield);
}
}
}
}

if (isRiver())
{
if (!isImpassable())
{
CvCity* pWorkingCity = getWorkingCity();
if (NULL != pWorkingCity)
{
if (!bDisplay || pWorkingCity->isRevealed(eTeam, false))
{
iYield += pWorkingCity->getRiverPlotYield(eYield);
}
}
}
}

CvCity* pCity = getPlotCity();
if (pCity != NULL)
{
if (!bDisplay || pCity->isRevealed(eTeam, false))
{
//city plot extra
if (iYield > 0 || !GC.getYieldInfo(eYield).isCargo())
{
iYield += GC.getYieldInfo(eYield).getCityChange();
iYield += GET_PLAYER(pCity->getOwnerINLINE()).getCityExtraYield(eYield);
}

if (eYield != YIELD_FOOD && GC.getYieldInfo(eYield).isCargo())
{
//cities get food and one other yield
YieldTypes bestYield = NO_YIELD;
int bestOutput = 0;
for (int i = 0; i < NUM_YIELD_TYPES; i++)
{
//ignore food and lumber
if ((i != YIELD_FOOD) && (i != YIELD_LUMBER))
{
int natureYield = calculateNatureYield((YieldTypes) i, pCity->getTeam(), false);
if (natureYield > bestOutput)
{
bestYield = (YieldTypes) i;
bestOutput = natureYield;
}
}
}

if (eYield != bestYield)
{
iYield = 0;
}
}

iYield = std::max(iYield, GC.getYieldInfo(eYield).getMinCity());
}
}
}

if (eUnit != NO_UNIT)
{
if (iYield > 0)
{
if (isValidYieldChanges(eUnit))
{
// VET AmountResourses - begin 18/24

//iYield += GC.getUnitInfo(eUnit).getYieldChange(eYield); // Оригинальный код

//KJ variant 09.10.12
//All mineral exhausted resources are located ONLY on BONUS tiles
//Thus, this section should be closed START

/*
int iYieldChange = GC.getUnitInfo(eUnit).getYieldChange(eYield);
if (iYield <= iBonusYield) // Если отдача от тайла равна отдаче от ресурса

{
iBonusYield += iYieldChange;
}
else
{
iYield += iYieldChange;
}
*/

//Thus, this section should be closed END

iYield += GC.getUnitInfo(eUnit).getYieldChange(eYield); // Оригинальный код, restored by KJ

// VET AmountResourses - end 18/24

if (getBonusType() != NO_BONUS)
{
if (GC.getBonusInfo(getBonusType()).getYieldChange(eYield) > 0)
{

// VET AmountResourses - begin 19/24

//iYield += GC.getUnitInfo(eUnit).getBonusYieldChange(eYield); // Оригинальный код

//KJ variant 09.10.12
//All mineral exhausted resources are located ONLY on BONUS tiles
//Thus, this section should be closed START
/*
iBonusYield += GC.getUnitInfo(eUnit).getBonusYieldChange(eYield);
*/
//Thus, this section should be closed END

iYield += GC.getUnitInfo(eUnit).getBonusYieldChange(eYield); // Оригинальный код, restored by KJ

// VET AmountResourses - end 19/24

}
}
}
}
}

iYield += GC.getGameINLINE().getPlotExtraYield(m_iX, m_iY, eYield);

if (ePlayer != NO_PLAYER)
{
if (GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield) > 0)
{
if (iYield >= GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield))
{
iYield += GC.getDefineINT("EXTRA_YIELD");
}
}
}

int iModifier = 100;
if (eUnit != NO_UNIT)
{
iModifier += GC.getUnitInfo(eUnit).getYieldModifier(eYield);
}

// VET AmountResourses - begin 20/24

// return std::max(0, (iYield * iModifier) / 100); // Оригинальный код

//KJ variant 09.10.12
//All mineral exhausted resources are located ONLY on BONUS tiles
//Thus, this section should be closed START

/*
iYield *= iModifier;
iBonusYield *= iModifier;
int iAmount = m_iAmount * 100;
if ((iAmount > 0) && (iBonusYield > iAmount)) // если ресурс исчерпаемый и его запас меньше отдачи от месторождения
{
iBonusYield = iAmount;
}
if (bOnlyBonus)
{
return std::max(0, iBonusYield / 100);
}
iYield += iBonusYield;
return std::max(0, iYield / 100);
*/
//Thus, this section should be closed END

//KJ variant 09.10.12 START

iYield *= iModifier;
int iAmount = m_iAmount * 100;

if ((iAmount > 0) && (iYield > iAmount)) // если ресурс исчерпаемый и его запас меньше отдачи от месторождения
{
iYield = iAmount;
}

return std::max(0, iYield / 100);
//KJ variant 09.10.12 END

// VET AmountResourses - end 20/24
}


Как видно из приведенных изменений, я отказался от разделения iNoBonusYield, iYield и iBonusYield. Дело в том, что в моем варианте все минеральные Yield представлены исключительно как бонусы. К примеру железная руда есть только в месторождениях. Ни на одной другой клетке, за исключением бонусной (где собственно расположено месторождение), железной руды нет вообще. Именно поэтому я не вижу смысла разделять iNoBonusYield, iYield и iBonusYield. Тем более, что с ними невозможно вводить минусы для опреденных юнитов, что собственно и было основной целью данной "правки".

Итак, CvGameCoreDLL.dll скомпилирован без ошибок, начинаем игру.

На карте находим месторождение железной руды. Оно именуется как "Iron", названия я пока не правил. Запас железной руды в данном месторождении равен 20. Я специально уменьшил его на порядок, чтобы не добывать руду в течение сотни с лишним ходов.

http://imageshack.us/a/img231/9291/01iron.jpg (http://imageshack.us/photo/my-images/231/01iron.jpg/)

Основывам рядом с месторождением город и селим в нем колониста (UNIT_COLONIST) и шахтера (UNIT_MINER). Для колониста в CIV4UnitInfos.xml прописаны ограничения:

<YieldChanges>
<YieldChange>
<YieldType>YIELD_ORE</YieldType>
<iChange>-2</iChange>
</YieldChange>
<YieldChange>
<YieldType>YIELD_TOBACCO</YieldType>
<iChange>-2</iChange>
</YieldChange>
</YieldChanges>

То есть колонист может добывать руды или собирать табака на 2 единицы меньше. чем обычный юнит. Ниже будет дано пояснение для чего это сделано.

Для железной руды в CIV4BonusInfos.xml прописано:

<YieldChanges>
<YieldIntegerPair>
<YieldType>YIELD_ORE</YieldType>
<iValue>1</iValue>
</YieldIntegerPair>
</YieldChanges>


Для табака (обычный ресурс, взят в качестве примера) в CIV4BonusInfos.xml прописано:

<YieldChanges>
<YieldIntegerPair>
<YieldType>YIELD_TOBACCO</YieldType>
<iValue>3</iValue>
</YieldIntegerPair>
</YieldChanges>


То есть при данном раскладе по логике должно быть так:

UNIT_COLONIST:

Железная руда
+1 (с бонусной клетки) -2 (штраф на добычу руды) = -1 (то есть добыча руды невозможна)

Табак:
+3 (с бонусной клетки) -2 (штраф на сбор табака) = +1 (то есть сбор табака возможен)


Теперь посмотрим какие профессии доступны колонисту.

http://imageshack.us/a/img715/7296/02nominerprofessionforc.jpg (http://imageshack.us/photo/my-images/715/02nominerprofessionforc.jpg/)

Как видно из приведенного выше снимка колониста невозможно поставить на добычу железной руды. Однако он может собирать табак в количестве 1 единицы. То есть мы имеем как раз тот вариант, что только что рассчитали.

Теперь посмотрим на возможности у второго юнита. Это шахтер (UNIT_MINER). Для него я ничего не правил и он может (как это и было в оригинале) добывать руду в 2 раза более эффективно. Он может также собирать табак, но уже как обычный юнит.

http://imageshack.us/a/img844/5547/03minerprofessionisavai.jpg (http://imageshack.us/photo/my-images/844/03minerprofessionisavai.jpg/)

Приведенные на снимке цифры это прекрасно иллюстрируют. Железной руды он добывает в 2 раза больше, чем обычный юнит, то есть 2 единицы, а табака 3 единицы, то есть ровно столько, сколько прописано в CIV4BonusInfos.xml.

Идем дальше и строим шахту.

http://imageshack.us/a/img5/9162/04buildmine.jpg (http://imageshack.us/photo/my-images/5/04buildmine.jpg/)

Опять-таки для ускорения ставим на бонусную клетку ораву строителей и они моментально сооружают шахту.

http://imageshack.us/a/img72/5206/05mineisready.jpg (http://imageshack.us/photo/my-images/72/05mineisready.jpg/)

Шахта готова и сейчас на ней можно добывать 3 единицы железной руды.

Повторно проводим аналогичный расчет для колониста.

UNIT_COLONIST:

Железная руда:
+3 (с бонусной клетки + шахты) -2 (штраф на добычу руды) = 1 (то есть добыча возможна)
http://imageshack.us/a/img16/8499/06nowprofessionminerisa.jpg (http://imageshack.us/photo/my-images/16/06nowprofessionminerisa.jpg/)

Действительно, на построенной шахте колонист может добывать руду, но всего лишь 1 единицу. Для сравнения профессиональный шахтер на этой же шахте может добывать 6 единиц руды:

http://imageshack.us/a/img26/3223/07expertoreminerisworki.jpg (http://imageshack.us/photo/my-images/26/07expertoreminerisworki.jpg/)

или то же самое в городе:

http://imageshack.us/a/img440/1635/08cityonturn1.jpg (http://imageshack.us/photo/my-images/440/08cityonturn1.jpg/)

Итак, сейчас можно ставить колониста на добычу руды, но труд его будет крайне неэффективным. Из этого следует, что для работы на шахте нужен профессиональный шахтер. Любой другой юнит там будет практически бесполезен. Аналогичные минусы я введу и по другим юнитам. Колонист в данном случае взят в качестве примера.

Шахтера можно купить в Европе или обучить колониста работе шахтера. Пока это возможно только в школе-колледже-университете, который нужно построить в городе. Однако я планирую добавить возможность обучения колониста профессии шахтера при его работе на шахте. У Kailric'a помнится был прекрасный мод, где такой способ получениея профессии был реализован. Причем обучение было разделено на два этапа, когда сначала неумеха-колонист превращался в подмастье (только 50% от максимальной производительности), а лишь в конце обучения становился профессиональным мастером (100% производительность). Тот маленький плюсик (+1) при добыче руды колонистом как раз и оставлен мной для реализации этой идеи.

Итак, продолжим добывать железную руду. Довольно скоро месторождение почти иссякнет. За один ход до этого мы имеем:

http://imageshack.us/a/img844/1060/09oneturnbeforeexhausti.jpg (http://imageshack.us/photo/my-images/844/09oneturnbeforeexhausti.jpg/)

или то же самое в городе:

http://imageshack.us/a/img692/5514/10incity.jpg (http://imageshack.us/photo/my-images/692/10incity.jpg/)

Как мы видели выше, профессиональный шахтер может добывать железной руды больше (+6), но месторождение содержит только 2 единицы руды, поэтому на следующий ход он сможет добыть только 2 единицы.

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

На следующий ход бонусная клетка опустела

http://imageshack.us/a/img818/9407/11bonusexhausted.jpg (http://imageshack.us/photo/my-images/818/11bonusexhausted.jpg/)

А в городском складе прибавилось ровно столько железной руды, сколько ее было в месторождении, то есть 20 единиц.

http://imageshack.us/a/img705/6039/12city.jpg (http://imageshack.us/photo/my-images/705/12city.jpg/)

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

kabjans
10.10.2012, 15:39
А ты попробуй отдачу ресурсов сделать маленькую, а спецам побышеный бонус при обработке.

Привет, NeseryozniyVET!

Мы с тобой практически одновременно тут появились. В приведенном выше сообщении я как раз этот вариант и реализовал. Внесенные изменения в исходный код я впечатаю в сообщание вечером, а то в этом броузоре какие-то кракозябры вместо букв лезут.


Добавил в предыдущее сообщение скорректированный участок в исходных кодах.

kabjans
19.10.2012, 11:55
Несколько снимков из рабочей версии мода, включающего в себя как минимум 4 части:

- "Новые колонисты", где рождение новых колонистов больше не связано с запасами еды на городском складе,
- "1492: Золотая лихорадка", где введены исчерпаемые минеральные ресурсы (в том числе россыпное золото),
- "1492: Закон и порядок" ("1492: Codex") - где разделены функции губернатора, представляющего в городе своего короля и обеспечивающего в нем порядок и рост производства, и "мятежного жителя", сеющего анархию и создающего предреволюционную ситуацию.
- "Радиус города на 2 клетки", где, как ясно из названия, доступная для обработки территория вокруг города увеличена с 8 до 20 клеток.
Плюс еще несколько мелких добавлений.

Обычный CvGameCoreDLL.dll работает без сбоев, но я все же дополнительно скомпилировал debug CvGameCoreDLL.dll и начал проверку рабочей версии на наличие ошибок с помощью этого самого debug CvGameCoreDLL.dll. Несколько багов поймать не только удалось, но и, выяснив причину, устранить. Как несложно догадаться все они были "рукотворными" и связаны с некритичными ошибками в xml файлах. Насколько это нужно было делать - сказать трудно, поскольку обычный CvGameCoreDLL.dll их не видит, но то, что теперь этих ошибок нет, явно пойдет на пользу стабильности мода.

Кроме того в результате теста удалось заметить и устранить несколько графических багов на экране. Они были связаны с неправильным изображением иконок "молотка" и "рождаемости". Если так называемый "hammer bug" хорошо известен тем, кто увеличивает количество yields в игре, то с иконкой рождаемости пришлось изрядно повозиться. По логике она должна была работать без проблем. Я несколько раз пропахал все дорожку, начиная от исходных кодов и заканчивая GameFont_75.tga, но безуспешно. Единственным объяснением на сей момент является то, что иконки,


BIRTHPOINT_CHAR,
WAREHOUSE_CHAR,
совершенно правильно прописанные в CvEnums.h, превышают MAX_NUM_SYMBOLS, следы которого теряются в ехе файле игры.

Для решения проблемы пришлось дополнительно прописать появление иконки рождаемости в CvGameTextMgr.cpp


szString.append(gDLL->getText("TXT_KEY_MISC_BIRTHPOINTS_INFO", pCity->getBirthPoints(), pCity->growthThreshold()));
szString.append(gDLL->getSymbolID(BIRTHPOINT_CHAR));
Только это полностью убрало графический баг с иконкой рождаемости.

В итоге информации о городе выглядит сейчас так:

http://imageshack.us/a/img337/8332/01cityinfo.jpg (http://imageshack.us/photo/my-images/337/01cityinfo.jpg/)

Если заглянуть сейчас в город, то там можно также увидеть кое-что новое. Работающий губернатор повышает производительность труда всех работников. Если же в городе появляется "мятежный житель", то он будет понижать производительность труда. На данном снимке показан только первый вариант, поскольку в данном случае я проверял совсем другое. Если кого-то заинтересуют, то можете пройти посмотреть по ссылке (http://forums.civfanatics.com/showthread.php?t=456053)на их-фанатики, гдя я выкладывал всю механику появления и работы "губернатора" и "мятежного жителя". Сейчас все это уже включено в данную версию и работает штатно.

http://imageshack.us/a/img266/3719/02cityinfo.jpg (http://imageshack.us/photo/my-images/266/02cityinfo.jpg/)

Итак, перейдем к следующему этапу.

Обычная работающая шахта. Запас железной руды практически исчерпан.

http://imageshack.us/a/img805/7153/03workingmine.jpg (http://imageshack.us/photo/my-images/805/03workingmine.jpg/)

На следующем ходу руда заканчивается. Обычно после этого шло автоматичесое разрушение уже пустой и соответственно бесполезной шахты. Напомню, теперь все минеральные ресурсы распределяются только в качестве бонусов. Если вся руда добыта, бонус удаляется с карты. Добывать на холме без бонуса что-либо (железную руду, серебро, и т.д.) невозможно. Их там попросту нет! Поэтому шахта без бонуса бесполезна. На следующем снимке это и происходит:

http://imageshack.us/a/img803/6192/04bonusexhausted2.jpg (http://imageshack.us/photo/my-images/803/04bonusexhausted2.jpg/)

Одним из "мнимых" недостатков исчерпаемых ресурсов является то, что игрок что-то теряет. Когда на их-фанатиках я предлагал введение исчерпаемых ресурсов, мне прежде всего указывали на этот момент. Игрок видите ли понастроил инфрастуктуру для производства, к примеру, оружия (руда -> железо -> инструменты -> оружие), а тут, бац! и исходный материал для всей цепочки (железная руда) закончился. Все производство останавливается. Мол, такое не годится!

Но так ли это плохо? Ведь в реальности происходит именно так. Кроме того мы же заранее знаем сколько руды мы сможем добыть из данного месторождения, поэтому можем планировать объемы производства и скорости добычи. Более того, зная об ограниченности наших запасов руды, можем заранее начать поиск новых месторождений на пока закрытых участках карты. А найдя там новое месторождение, просто застолбить его, основав рядом свою колонию.

Но такие открытия месторождений возможны только на уже сгенерированной на первом ходу карте. Старателя (или говоря современным языком "геолога"), который мог бы открывать месторождения руд в ходе игры, пока нет.

Можно ли его ввести? Сложно сказать. Геология как поиск и открытие новых месторождений в ходе игры пока реализована только в моде "Эволюция войны" NeseryozniyVET. Но там, если мне не изменяет память, генерация очков геологии идет через город, а не через юнит, перемещающийся по карте и тем самым производящий геологоразведку. Впрочем, я могу ошибаться, так как смотрел как работает геология в "Эволюция войны" несколько месяцев назад.

Поэтому на данном этапе я начал поиск более простых и менее трудоемких способов открытия новых месторождений в ходе игры. Два из них я представляю в данном сообщении. Оба реализованы через генератор случайных событий.

Первый способ связан с уже опустевшей шахтой. Когда вся руда добыта, то на следующем ходу появляется такое сообщение:

http://imageshack.us/a/img442/6448/05trigger2.jpg (http://imageshack.us/photo/my-images/442/05trigger2.jpg/)

Шахтеров понять можно. Что им делать в пустой шахте, где нечего добывать? Шахту можно разрушить, но "среди местных жителей ходит легенда о больших запасах руды где-то поблизости". Игроку я оставил только один выбор. "Ладно, пусть шахта пока стоит и разрушать ее не надо. Стоит проверить эту легенду". Так на карте вместо обычной работающей шахты появляется "depleted mine", которая ничего не производит и на которой никто не работает.

http://imageshack.us/a/img13/7598/06depletedmine2.jpg (http://imageshack.us/photo/my-images/13/06depletedmine2.jpg/)

Насколько данная клетка нужна для иного производства? Пока вокруг города было 8 клеток, то вероятность этого была 1/8. Сейчас, когда вокруг города 20 свободных клеток, то это уже лишь 1/20. Таким образом, бесполезную пока шахту можно какое-то время не трогать.

Тем более, что есть шанс (он уже работает, но я его пока не прописал в виде сообщений на экране), что на неработающей шатхе старатель или местные мальчишки :)))) смогут найти новую, неизвестную пока рудную жилу. Другими словами, здесь "depleted mine" используестся для открытия нового месторождения, что и показано на снимке:

http://imageshack.us/a/img850/5412/07irondepositdiscovered.jpg (http://imageshack.us/photo/my-images/850/07irondepositdiscovered.jpg/)

После этого на клетку с вновь открытым бонусом можно послать работника, который снова построит действующую шахту. Возможно (?), имеет смысл сделать эту шахту иной по виду, более дорогой по стоимости и трудозатратам на ее строительство, назвав к примеру "шахтой глубокого заложения".

http://imageshack.us/a/img542/2191/08destroydepletedmine.jpg (http://imageshack.us/photo/my-images/542/08destroydepletedmine.jpg/)

Лежащие буквально на поверхности месторожения россыпного золота могут быть открыты иным способом. Наш скаут (я его авансом называю тут "старатель" или "prospector"), путешествуя по карте, имеет небольшой шанс найти необнаруженное пока месторождение россыпного золота. Выглядит это так:

Обнаружение россыпи

http://imageshack.us/a/img411/8177/09placergolddepositdisc.jpg (http://imageshack.us/photo/my-images/411/09placergolddepositdisc.jpg/)

и ее появление на карте.

http://imageshack.us/a/img836/4779/10placergolddepositdisc.jpg (http://imageshack.us/photo/my-images/836/10placergolddepositdisc.jpg/)

Все это происходит в процессе игры.

Я прекрасно понимаю, что это очень грубое приближении к реальной геологии, но пока есть и реально работает только оно.

NeseryozniyVET
19.10.2012, 16:19
MAX_NUM_SYMBOLS как и все остальные MAX_NUM_enums, вроде, используются только в DLL. Поэтому новые энумы нужно добавлять до MAX_NUM_enums. То есть, MAX_NUM_enums должен быть всегда в конце списка.
Если хочешь использовать новые иконки в текстовых файлах, то надо редактировать CvDllTranslator.cpp. Там изменения элементарные - сам догадаешся.
В моем моде все месторождения генерируются при создании карты, только они не видны. Чтоб увидеть месторождение надо чтоб на тайле накопились очки геологии. С помощью юнита накапливать очки геологии очень просто - начисляем их на тайл где стоит юнит. У меня очки геологии генерирует город и начисляет их на тайл с самым маленьким количеством этих очков. Все эти большие и сложные алгоритмы сделаны для максимально быстрого нахождения этого тайла.

romello
21.10.2012, 11:52
Спасибо парни за то, что вы делаете!
Обязательно скачаю мод и сыграю в него!

RadialBlur
22.10.2012, 12:08
Впечатления, конечно, непередаваемые, выглядит роскошно.
Но такой смешной вопрос: обновлялся ли первый пост с адресом мода, и лежит ли там его актуальная версия?
Я тут с таким огромным удовольствием вспоминаю старенькую игрушечку, захотел, конечно, попробовать установить и здешнее счастье, и, откровенно говоря, смущает отсутствие каких-либо дат в первой записи здесь (обычно на форуме при редактировании внизу добавляет плашку с датой редактирования, а тут не вижу).
Собственно, лежит ли там последний билд, и где его взять, если его там нет?

kabjans
02.11.2012, 14:01
MAX_NUM_SYMBOLS как и все остальные MAX_NUM_enums, вроде, используются только в DLL. Поэтому новые энумы нужно добавлять до MAX_NUM_enums. То есть, MAX_NUM_enums должен быть всегда в конце списка.

Новые строки с


BIRTHPOINT_CHAR,
WAREHOUSE_CHAR,

я прописал неподсредственно над строкой с


#ifdef _USRDLL
MAX_NUM_SYMBOLS
#endif

Про эти "грабли" я помню, так как частенько на них наступал, поэтому тут все было сделано правильно.

А MAX_NUM_SYMBOLS я нашел в ехе файле, когда открыл его в Notepad++. Информации конечно это дало немного, но внутри по крайней мере было упоминание о MAX_NUM_SYMBOLS. Собственно поэтому я и предположил о максимально возможном количестве символов.

Кроме того, на их-фанатиках упоминалось о максимальном количестве бонусов, которые можно добавить. Если память мне не изменяет, то называлась цифра в 72. Если специально не изголяться, то можно ввести только 72 бонуса. Умельцы правда в каком-то из модов смогли обойти и это ограничение.



Если хочешь использовать новые иконки в текстовых файлах, то надо редактировать CvDllTranslator.cpp. Там изменения элементарные - сам догадаешся.

Все верно, CvDLLTranslator.cpp и CvDLLTranslator.h довольно просты для понимания и редактирования. Но есть одно небольшое "но". Они отсутствуют среди исходных кодов Колонизации. Оба эти файла есть в CivIVBTS, но их нет в CivIVColonization.

Последняя версия Колонизации - это сильно кастрированаая Цивилизация 4 BTS. Как оказалось, CvDLLTranslator.cpp и CvDLLTranslator.h файла пали жертвой как раз этой операции, а их функцию разработчики перенесли в оставшиеся исходные коды. Перенесли судя по всему не совсем удачно, поскольку при введении малейших изменений система иконок начинает давать сбои. Одним из таких сбоев был "hammer bug", когда при увеличении количество yields в игре исчезал значок "молотка". Примерно то же самое случилось и с иконкой рождаемости.

Но в обоих случаях лекарство от этих граблей уже найдено. Сейчас и "молоток" и "рождаемость" отображаются правильно и поэтому пока наверное нет смысла возвращать CvDLLTranslator.cpp и CvDLLTranslator.h.


В моем моде все месторождения генерируются при создании карты, только они не видны. Чтоб увидеть месторождение надо чтоб на тайле накопились очки геологии. С помощью юнита накапливать очки геологии очень просто - начисляем их на тайл где стоит юнит. У меня очки геологии генерирует город и начисляет их на тайл с самым маленьким количеством этих очков. Все эти большие и сложные алгоритмы сделаны для максимально быстрого нахождения этого тайла.

Большое спасибо за пояснение. Механику открытия месторождений в EoW я представлял довольно близко, но не совсем так, как ты описал. Твой вариант с открытием месторождений прекрасно подходит для Цивилизации, когда у тебя временной промежуток исчисляется тысячелетиями. В этом случае месторождения железа или алюминия, естественно не нужны дикарям, бегающим с палкой или камнем за мамонтом за 2 тысячелетия до нашей эры.

В Колонизации же временной интервал сжат до 3-4-х сотен лет. Поэтому все месторождения, сгенерированные на материке на первом ходу, должны быть сразу видны. Это необходимо игроку для выбора оптимального места расположения своих городов. Запас в месторождении я рассчитываю так, чтобы истощение наступало во второй половине игры. Таким образом, где-то к середине игры появляется необходимость открытия новых запасов руды.

После длительных поисков, массы экспериментов в Blender и NifScope мне удалось-таки сделать юнит "Старатель". В качестве "Старателя" мне нужен был "некий юнит + навъюченная лошадь". "Юнит на коне" мне не подходидил по целому ряду причин. Среди файлов Цивилизации 4 BTS удалось найти "великого торговца", где был именно "юнит + навьюченный верблюд", но верблюд как-то плохо смотрится в Сибири или в дебрях Амазонки. Поэтому поиск пришлось продолжать довольно долго. Плюс разбираться с нуля с анимацией юнитов, чем я вообще никогда не занимался. В общем, пока удалось собрать такого "Старателя". Обе части (человек и лошадь) двигаются синхронно, у лошади в качестве багажа - мешки, оружие, лопата и кирка.

Пока в NifScope он выглядит так

http://img198.imageshack.us/img198/5404/prospectorinns.jpg (http://imageshack.us/photo/my-images/198/prospectorinns.jpg/)

и в игре

http://img842.imageshack.us/img842/8283/prospectoringame.jpg (http://imageshack.us/photo/my-images/842/prospectoringame.jpg/)

"Старателя" я еще не прописал в файлах, но это по задумке должен быть очень дорогой юнит, который можно только купить в Европе. Этот юнит должен быть вооружен для защиты от диких зверей, туземцев или европейцев из других стран в состоянии войны. Он должен иметь запас инструментов для ведения изысканий. И наконец "Старатель" должен иметь лошадь, чтобы не тащить все это на своем горбу.

Именно "Старателю" будет поручена задача поиска месторождений. Как именно? Пока сказать трудно. Теоретически есть несколько вариантов решения этой проблемы.

1. Через систему случайных событий, как это было сделано для скаута. Но в отличие от скаута, который может найти только россыпные месторождения золота, серебра и драгоценных камней (пока не введены), старатель сможет открывать также и рудные месторождения.

Для этого старателю нужно дать команду на перемещение по карте. Такая команда в игре уже есть, ей соответствует кнопка "Explore". В принципе, перевод еxplore на русский дает как минимум два варианта. Это "исследование местности", но это и "поиск полезных ископаемых". Так что вводить новую кнопку типа "Prospect" вряд ли стоит. В данном варианте "Старатель" будет просто перемещаться по карте и на каждой клетке у него есть очень маленький шанс найти что-то полезное.

Или напротив жестко прописать, что первое месторождение он открывает, к примеру, на 10 ходу, второе на 50, третье на 100, и т.д. Мне кажется это тоже можно сделать через систему случайных событий.

Однако при выполнеии команды "Explore" есть пара неприятных моментов.

Во-первых, юнит, получивший эту команду, перемещается до тех пор, пока на карте еще есть неоткрытые клетки. Скаут, который открыл все сухопутные клетки на карте, просто останавливается. Отсюда следует, что "Старатель" тоже в какой-то момент остановится. Но, как я уже сказал выше, старатель - очень дорогой юнит и потребность в нем возникает к середине игры, а значит большинство клеток на карте к этому времени может быть уже открыто. То есть команда "Explore" работать у старателя уже не будет.

Если порыться в исходных кодах, то можно найти это ограничение на перемещения после открытия всех клеток. Мне кажется, что оно здесь:

CvTeamAI.cpp:


bool CvTeamAI::AI_isExploringNeeded(CvUnit* pUnit) const

....
if (iUnrevealedLandPlots == 0)
{
return false;
}
.....

Если просто закрыть этот участок кода, то тогда абсолютно все юниты, получившие команду "Explore", будут двигаться вечно, что безусловно плохо. Поэтому я хочу попробовать такой вариант:


//KJ Prospector START
//UNIT_PROSPECTOR must continue to explore territory even if all tiles are revealed (iUnrevealedLandPlots == 0).

// original closed by KJ as test START
/*
if (iUnrevealedLandPlots == 0)
{
return false;
}
*/
// original closed by KJ as test END

if (iUnrevealedLandPlots == 0)
{

//here UNIT_PROSPECTOR must have number 30 in CIV4UnitInfos.xml. Calculation starts from 0.

if (pUnit->getUnitType() == 30) //OK with compilation, must be tested ingame
{
return true;
}

else
{
return false;
}
}

//KJ Prospector END

Здесь логика простая. Если юнит, выполняющий команду "Explore", наш старатель (UNIT_PROSPECTOR), то он продолжает исследования. Если это любой другой юнит - то дальнейшие исседования карты невозможны. Профессиональных программистов прошу не морщиться. Да, тут жестко прописан конкретный юнит, но мне так проще, пусть это категорически не принято среди профи. По крайней мере такой вариант я могу скомпиллировать без проблем.

2. Второй возможный вариант поиска месторождений старателем через цепочку "Старатель" => "Лагерь старателя" => открытие месторождения. Но это опять таки будет работать через систему случайных событий, где пара "Старатель" + "Лагерь старателя" с некой вероятностью открывают месторождения. Это более логичное решение, поскольку на поиск месторождения должно тратиться время в 4-6 ходов, пока лагерь есть на карте. Этот вариант - пока лишь на уровне идеи, поскольку в принципе ясно как сделать лагерь за 1 ход, но как из лагеря сделать снова старателя с лошадью через 4-6 ходов, пока не совсем понятно.

3. И наконец третий вариант открытия месторождений - через "MISSION_PROSPECT" (от слова "prospect" - проводить разведку, искать полезные ископаемые). Это наиболее сложный вариант, поскольку в нем нужно прописывать не только миссию (что несложно), но и в CvUnit.cpp писать новые разделы CvUnit::canProspect... и bool CvUnit:: prospect..., что находится далеко за пределами моих возможностей. Однако и тут открытие месторождения должно быть случайным, то есть фактически таким же как и для случайных событий, описанных в вариантах 1 и 2.

В общем, необходимо подумать, как лучше решить вопрос с открытием месторождений....


Впечатления, конечно, непередаваемые, выглядит роскошно.
Но такой смешной вопрос: обновлялся ли первый пост с адресом мода, и лежит ли там его актуальная версия?
Я тут с таким огромным удовольствием вспоминаю старенькую игрушечку, захотел, конечно, попробовать установить и здешнее счастье, и, откровенно говоря, смущает отсутствие каких-либо дат в первой записи здесь (обычно на форуме при редактировании внизу добавляет плашку с датой редактирования, а тут не вижу).
Собственно, лежит ли там последний билд, и где его взять, если его там нет?

Необходимо дать небольше пояснение. Мод "1492: Глобальная Колонизация", обсужение которого ведется в этой теме, представляет собой компилляцию массы маленьких MODCOMP (под-модов). Каждый из таких MODCOMPов достаточно прост и касается лишь одного из новшеств. Это делается специально для выявления и устранения возможных багов, связанных в введением именно данного новшества.

В первом посту этой темы есть (или наверное точнее была) ссылка на одну из составляющих мода "1492: Глобальная Колонизация", а именно на "1492: Global Colonization. Resource Pack". Как следует из данного там описания в "Resource Pack" введены новые товары, новые професии и т.д. Тестирование показало ошибки и недоработки, за что особое спасибо всем попробовавшим и написавшим в этой теме. В конечной версии мода все они будут исправлены.

Но "1492: Global Colonization. Resource Pack" - это только маленькая часть того, что должно быть включено.

Уже сейчас можно наверняка сказать, что точно будет включено:

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

И многое-многое другое, в том числе работорговля, пиратство, игра на глобальной карте Земли и т.д., что еще предстоит доработать прежде, чем вносить в финальную сборку.

Снимки, приведенные в моем последнем сообщении на этой странице, сделаны из мода, где включены как минимум 4 MODCOMPа ("Новые колонисты", "1492: Золотая лихорадка", "1492: Закон и порядок", "Радиус города на 2 клетки"). Эту сборку я тестирую и пока не выявил критических сбоев.

В конечном виде мод "1492: Глобальная Колонизация" пока отсутствует и поэтому нигде не публиковался. Однако все составные части будущего мода доступны и любой желающий может уже сейчас собрать из них свой вариант игры.

kirgre
02.11.2012, 14:45
Кабьянс, я тут подумал, что мог бы сделать перевод текстов мода на русский. Это бы помогло незнающим аглицкий. Не быстро, конечно, но всё же... Есть смысл?

kabjans
02.11.2012, 15:24
Кабьянс, я тут подумал, что мог бы сделать перевод текстов мода на русский. Это бы помогло незнающим аглицкий. Не быстро, конечно, но всё же... Есть смысл?

Привет, kirgre!

Перевод на русский безусловно имеет смысл, но только переводить надо конечный вариант, когда все (или почти все) сделано и тексты-описания в дальнейшем радикально меняться не будут. Пока же все находится в стадии постоянных изменений, причем эти изменения касаются как текстов-описаний, так и различных деталей.

К примеру, несколькими сообщениями выше я показал, как на заброшенной шахте можно заново открыть запасы руды. На тот момент это было единственное решение для "Квеста с заброшенной шахтой". Но сейчас, когда появился юнит "Старатель" решений для этого квеста будет как минимим три:

1. Заброшенная шахта не нужна, на этом месте будет построено другое улучшение (к примеру, посажена виноградная лоза, разведены овцы, и т.д.)
2. Заброшенная шахта должна быть обязательно сохранена. У меня (игрока) есть свободные деньги на немедленное приглашение (покупку) старателя. (Старатель тут же появляется в городе или на заброшенной шахте).
3. Заброшенная шахта должна быть обязательно сохранена, но у меня (игрока) в данной момент нет денег на немедленное приглашение (покупку) старателя. Я сделаю это при первой же возможности.

И это только один пример. Поэтому заниматься переводом сейчас - пустая трата времени.

Пока же все новые описания я собираю в отдельные xml файлы, так что объем перевода не будет слишком большим, а нововведения не надо будет вылавливать по крупицам в море уже переведенного русским издателем игры.

П.Ы. У меня нет русского варианта игры, поэтому мне сложно судить что там есть....

kirgre
02.11.2012, 16:27
У меня версия от 1С лицензионка. Там, насколько я слышал, перевод технически отличается от того, что сделан наш-фанатиками тут, на форуме (порядок тегов языков в хмл разный). Так что, по-хорошему надо будет делать перевод и на пиратку, и на 1С лицензию отдельно.

ЗЫ: Да, кстати, насколько сложно сделать будет дерево технологий?

kabjans
02.11.2012, 16:46
У меня версия от 1С лицензионка. Там, насколько я слышал, перевод технически отличается от того, что сделан наш-фанатиками тут, на форуме (порядок тегов языков в хмл разный). Так что, по-хорошему надо будет делать перевод и на пиратку, и на 1С лицензию отдельно.

Мне сложно судить о качестве переводов, выполненных 1С или наш-фанатиками, поскольку я всегда пользуюсь оригинальным языком игры. Это, с одной стороны, позволяет избежать недоразумений, связанных с качеством перевода, а с другой, дает возможность вспомнить языки, которые когда-то довелось изучать.


ЗЫ: Да, кстати, насколько сложно сделать будет дерево технологий?

Как делать дерево технологии в принципе понятно. У Kailric'a есть соответствующий мод на их-фанатиках. Вопрос в том, что конкретно туда надо включать и какие фишки за это игрок может получать. В принципе, я не исключаю, что небольшое технологическое древо будет сделано для мода "1492: ГК". По крайней мере несколько технологий, связанных с местными обычаями, культивированием местных культур, охотой и т.д. были бы весьма к месту.

kirgre
02.11.2012, 17:03
Идея у меня вот какая: Сделать невозможным строительство зданий высших уровней (начиная от "фабрики") без знания станков и парового привода. Будет интересней и реалистичней, не?
Тогда и вашу идею с глубокой шахтой можно реализовать. Для строительства простой шахты ничего не надо, а для строительства улучшенной - паровой двигатель для осушения её.
Профессию можно обозвать изобретателем, работать может в школе/колледже/университете. Ну или отдельную лабораторию строить, хотя лаборатория в 1500 году будет выглядеть странновато. Можно сделать проще, хотя тоже не очень реально - Все ремесленные спецы и ученики генерируют немного "очков новаторства", для открытия технологии, допустим, "научный метод" к 1650 году, когда можно будет строить лабораторию.

kabjans
05.11.2012, 23:51
В процессе тестирования нашел небольшую неувязку в скоростях роста народонаселения для различных наций.

В CvPlayer.cpp есть такой участок кода:


int CvPlayer::getGrowthThreshold(int iPopulation) const
{
int iThreshold;

//VET BirthPoints - begin 1/1
int iBASE_BIRTH_POINTS_THRESHOLD = GC.getBASE_BIRTH_POINTS_THRESHOLD();

if (iBASE_BIRTH_POINTS_THRESHOLD != 0)
{
iThreshold = iBASE_BIRTH_POINTS_THRESHOLD;
}

else
{
iThreshold = GC.getDefineINT("BASE_CITY_GROWTH_THRESHOLD");
}

iThreshold += (iPopulation * GC.getDefineINT("CITY_GROWTH_MULTIPLIER"));
//VET BirthPoints - end 1/1

Меня собственно интересует первая часть этого участка, а именно:


if (iBASE_BIRTH_POINTS_THRESHOLD != 0)
{
iThreshold = iBASE_BIRTH_POINTS_THRESHOLD;
}
Этот участок означает, что если рост города происходит за счет очков рождаемости (то есть если iBASE_BIRTH_POINTS_THRESHOLD != 0), то новый житель появляется когда iThreshold = iBASE_BIRTH_POINTS_THRESHOLD. Все просто и понятно.

Но именно здесь и кроется небольшой подвох.

Как известно сейчас рост населения города происходит по двум причинам.

1. за счет рождаемости внутри города (набор очков рождаемости). Эта величина, как следует из приведенного выше участка кода постоянна для всех наций.

2. за счет прибытия иммигрантов из Европы. Но иммиграция зависит от скорости набора крестов, а последняя величина разная у различных наций. Она самая высокая у англичан, остальные нации набирают кресты медленнее. Отсюда вытекает неравномерность развития. Таким образом, при игре за Англию игрок получает примерно 25% преимущество по скорости роста населения.

Эту неравномерность достаточно просто убрать, если слегка подкорректировать приведенный выше участок кода.


int CvPlayer::getGrowthThreshold(int iPopulation) const
{
int iThreshold;
//VET BirthPoints - begin 1/1

int iBASE_BIRTH_POINTS_THRESHOLD = GC.getBASE_BIRTH_POINTS_THRESHOLD();

if (iBASE_BIRTH_POINTS_THRESHOLD != 0)
{

if
//здесь ввести дополнее условие:

//если игрок - Франция, Испания или Голландия

//то

{
iThreshold = (iBASE_BIRTH_POINTS_THRESHOLD - 100);
}

else //в противном случае, то есть когда игрок - Англия
{
iThreshold = iBASE_BIRTH_POINTS_THRESHOLD;
}
}

else
{iThreshold = GC.getDefineINT("BASE_CITY_GROWTH_THRESHOLD");}

iThreshold += (iPopulation * GC.getDefineINT("CITY_GROWTH_MULTIPLIER"));

//VET BirthPoints - end 1/1

В выражении для всех наций за исключением Англии

iThreshold = (iBASE_BIRTH_POINTS_THRESHOLD - 100);

- 100 как раз и будет теми 25%, которые уровняют рост народонаселения для всех игроков, поскольку iBASE_BIRTH_POINTS_THRESHOLD = 400. При игре за все нации кроме Англии рождение нового поселенца произойдет быстрее на 25%.

Как грамотно и самое главное правильно прописать это условие


//если игрок - Франция, Испания или Голландия

Я перепробовал массу вариантов, но безуспешно. :huh:

kabjans
06.11.2012, 02:05
Вроде бы нашел нечто подходящее в исходных кодах. В очень "сыром виде" для Франции это выглядит так:



for (int iPlayer = 0; iPlayer < MAX_PLAYERS; ++iPlayer)
{
CvPlayer& kLoopPlayer = GET_PLAYER((PlayerTypes)iPlayer);

if (kLoopPlayer.getCivilizationType() == 1)
{
iThreshold = (iBASE_BIRTH_POINTS_THRESHOLD - 100);
}
}


А вот снимок из игры:

http://img600.imageshack.us/img600/2186/bothh.jpg (http://imageshack.us/photo/my-images/600/bothh.jpg/)

Тут два города. Слева французский, у него Threshold = 900. Справа - английский, у которого Threshold = 1200.

Игра идет на скорости 3х, поэтому 300 х 3 = 900, а 400 х 3 = 1200.

В GlobalDefinesAlt.xml задано только одно значение


<Define>
<DefineName>BASE_BIRTH_POINTS_THRESHOLD</DefineName>
<iDefineIntVal>400</iDefineIntVal>
</Define>

Дополнено:

Странно, но эту строку


if (kLoopPlayer.getCivilizationType() == 1)

игра принимает за данность и абсолютно все европейские цивилизации имеют Threshold = 900, кроме Англии, у которой, как и положено Threshold = 1200. Я думал, что для каждой нации надо прописывать свое условие.

В принципе, для конкретно данного приложения меня это вполне устраивает, но хотелось бы понять логику программы, поскольку есть идеи как этот же трюк применить в других случаях. ....:rolleyes:

kabjans
06.11.2012, 16:00
Вроде бы нашел нечто подходящее в исходных кодах.

Еще вчера вечером, когда я писал эти строки, у меня было подозрение, что найденное решение неверно. Поэтому я и написал "вроде бы".

Кроме того меня смeщало и другое:


Странно, но эту строку


if (kLoopPlayer.getCivilizationType() == 1)

игра принимает за данность и абсолютно все европейские цивилизации имеют Threshold = 900, кроме Англии, у которой, как и положено Threshold = 1200. Я думал, что для каждой нации надо прописывать свое условие.

После проверки все встало на свои места.

Найденный вариант работает только если играть за Англию.

Причина тоже ясна. Перебор идет через номер игрока (Player), а не порядковый номер цивилизации из CIV4CivilizationInfos.xml, как я ранее думал. Если я начну за Францию или любую другую страну, то именно у меня будет самым высоким iThreshold. Все остальные нации получат 25% снижение для iThreshold. что неверно.



В принципе, для конкретно данного приложения меня это вполне устраивает, но хотелось бы понять логику программы, поскольку есть идеи как этот же трюк применить в других случаях. ....

Увы, но найденное мной псевдо-"решение" не годится :hammer: и вопрос остается открытым.

Как правильно прописать условие в данном примере:


if
//если игрок - Франция, Испания или Голландия

//то
{
iThreshold = (iBASE_BIRTH_POINTS_THRESHOLD - 100);
}

else
{
iThreshold = iBASE_BIRTH_POINTS_THRESHOLD;
}
:help:

kabjans
14.11.2012, 01:44
Увы, но найденное мной псевдо-"решение" не годится :hammer: и вопрос остается открытым.

Вопрос снимается.

Мне удалось найти предельно простое и элегантное решение. Теперь каждая нация, включая аборигенов, имеет свой собственный NationalPopulationCoefficient, который определяет величину Threshold, при достижении которого в городе данной нации рождается новый житель.

Вот снимок из игры:

http://img836.imageshack.us/img836/8313/resultxq.jpg (http://imageshack.us/photo/my-images/836/resultxq.jpg/)

Параметры:

- скорость нормальная,
- BASE_BIRTH_POINTS_THRESHOLD = 400

- NationalPopulationCoefficient:
-- для Англии 500
-- Франции 200
-- Испании 100
-- Голландии 300

-- для аборигенов из племени Arawak 40.

На снимке видим значения Threshold. Они равны 400 + NationalPopulationCoefficient. У каждой нации свое значение Threshold.

В данном примере все значения NationalPopulationCoefficient взяты с потолка. Это сделано для того, чтобы увидеть разницу. В конечном варианте они должны быть скорректированы с учетом демографических особенностей европейских переселенцев и местных аборигенов. К примеру, рождаемость в племени аборигенов Крайнего Севера, будет значительно ниже, чем у их более южных собратьев, живущих в краях, "где среди пампасов бегают бизоны"...

NeseryozniyVET
17.11.2012, 21:28
Вот это ты намудрил!!
Скорость набора крестов завистит от CvPlayer::immigrationThreshold(). А она в свою очередь зависит от GC.getTraitInfo(eTrait).getImmigrationThresholdModifier(). Так что надо было просто убрать TRAIT_TOLERANT из Assets\XML\Civilizations\CIV4TraitInfos.xml и все его упоминания в других файлах.

kabjans
19.11.2012, 12:23
Вот это ты намудрил!!
Скорость набора крестов завистит от CvPlayer::immigrationThreshold(). А она в свою очередь зависит от GC.getTraitInfo(eTrait).getImmigrationThresholdModifier(). Так что надо было просто убрать TRAIT_TOLERANT из Assets\XML\Civilizations\CIV4TraitInfos.xml и все его упоминания в других файлах.

Ты абсолютно прав относительно параметра, влияющего на скорость набора крестов, а следовательно и на скорость иммиграции из Европы. Именно эти 25% и привлекли мое внимание при тестировании. Они прописаны в CIV4TraitInfos.xml в строке:


<iImmigrationThresholdModifier>-25</iImmigrationThresholdModifier>
Если ставится задача уровнять скорости роста населения для всех наций, то простейшее решение - элементарно обнулить все значения iImmigrationThresholdModifier, заменив в этой строке -25 на 0:

<iImmigrationThresholdModifier>0</iImmigrationThresholdModifier>

При этом отпадает необходимость убирать TRAIT_TOLERANT.

Но что мы получим в результате?

Как известно сейчас рост населения города происходит по двум причинам:


Рост населения города = за счет рождаемости внутри города + за счет прибытия иммигрантов из Европы

1. за счет рождаемости внутри города (набор очков рождаемости). Эта величина постоянна для всех наций.
2. за счет прибытия иммигрантов из Европы. Обнулив iImmigrationThresholdModifier, мы уровняем и этот параметр для всех наций.

В итоге скорости роста населения у всех наций будут равны, поскольку равны скорости естественного прироста населения в городах Нового Света и равны скорости иммиграции из Европы.

Это простейшее из возможных решений. Но, увы, далеко не самое лучшее.

В игре разработчики нагородили массу глупостей и несуразностей. Но в вопросе иммиграции поселенцев из Европы они были совершенно правы, по крайней мере английских. Достаточно вспомнить религиозные распри в Англии, унесшие жизни почти четверти всего населения. Или опять-таки религиозные (так называемые гугенотские) войны между католиками и протестантами (гугенотами), которые раздирали Францию при последних королях династии Валуа (1562-1598). Именно данные события в этих странах и были основной движущей силой иммиграции их граждан в Новый Свет. Люди просто бежали из стран, где их убивали из-за их религиозных взглядов.

Собственно возможно поэтому в игре разработчики в качестве символа иммиграции и избрали значок креста. Учитывая сказанное выше, было бы исторически неправильным обнулять значения iImmigrationThresholdModifier для английских и французских королей, уравнивая скорость иимиграции из этих стран с Испанией и Португалией, которые те времена были сравнительно более моноконфессиональными государствами, а следовательно иммиграция их жителей в Новый Свет имела иную причину.

Отсюда следует, что iImmigrationThresholdModifier должны быть различными для различных наций. К примеру, -25 для Англии и Франции, и 0 для Испании и Португалии. Но как раз это и приводит к той неувязке в скоростях роста народонаселения для различных наций, с которой я начал обсуждение этой проблемы. Второе слагаемое различно для разных наций:


Рост населения города = за счет рождаемости внутри города + за счет прибытия иммигрантов из Европы

Полностью решить проблему прекрасно позволяет введение iNationalPopulationCoefficient. Каждая их наций в игре - не только европейские поселенцы, но и местные аборигены - имеют свой собственный предел iThreshold, при достижении которого в городе данной нации рождается новый житель. Здесь мы корректируем первое слагаемое:


Рост населения города = за счет рождаемости внутри города + за счет прибытия иммигрантов из Европы

В итоге сейчас мы можем подобрать такие комбинации для iImmigrationThresholdModifier и iNationalPopulationCoefficient, при которых ни одна из европейских наций не получит бонусов в росте населения.

Одновременно, iNationalPopulationCoefficient позволяет корректировать скорость роста наций местных аборигенов. Причем для каждой нации iNationalPopulationCoefficient может быть своим. Выше я уже приводил пример, когда поселения народностей Крайнего Севера растут медленне, чем у их более южных собратьев. Причина - более суровый климат на севере. Одновременно поселения всех без исключения местных аборигенов должны расти несколько быстрее, чем города европейцев в Новом Свете. Причина также очевидна: аборигены живут в данной местности веками, прекрасно адаптировались к местным условиям, имеют иммунитет против местных болезней и т.д. У только что прибывших европейцев ничего этого нет.

Значения <iNationalPopulationCoefficient> выведены в CIV4CivilizationInfos.xml, поэтому их легко править, если при тестировании что-то пойдет не так.

Мне кажется, такое решение намного более правильным по целому ряду причин.

kirgre
21.11.2012, 09:27
Kabjans, решение с населением технически и логически верно, но так ведь у Англии в оригинальной игре таким образом (за счёт +25% к эмиграции) и появлялось преимущество в населении... По крайней мере, на начальных этапах игры, когда колонистов в Европе массово не купишь. В твоём варианте получается, что преимущество Англии скомпенсировано в 0. Таки в чём цимес?

kabjans
21.11.2012, 11:01
Kabjans, решение с населением технически и логически верно, но так ведь у Англии в оригинальной игре таким образом (за счёт +25% к эмиграции) и появлялось преимущество в населении... По крайней мере, на начальных этапах игры, когда колонистов в Европе массово не купишь. В твоём варианте получается, что преимущество Англии скомпенсировано в 0. Таки в чём цимес?

У тех стран, к примеру той же Англии, преимущество в более быстром росте населения на начальном этапе как было, так и останется. Ведь +25% к эмиграции в Новый Свет предложенный мной вариант никак не отменяет. Однако это преимущество верно только для начального этапа игры.

Проблема в неравномерности роста населения возникает при длительной игре, поскольку эти "+25% к эмиграции" работают на протяжении всей игры. И вот именно здесь - на продвинутых этапах игры - и требуется небольшая компенсация для наций, у которых нет плюса к эмиграции. Именно эту функцию и выполняет NationalPopulationCoefficient.

Значения <iNationalPopulationCoefficient> выведены в CIV4CivilizationInfos.xml, поэтому их любой сможет поправить по своему желанию. Лезть для этого в исходные коды игры и компилировать заново CvGameCoreDLL.dll не потребуется. Достаточно уметь пользоваться Блокнотом (Notepad).

micheline
27.12.2012, 22:10
Разработчиков мода (и его частей) с приближающемся! :)

kabjans
28.12.2012, 13:39
Разработчиков мода (и его частей) с приближающемся! :)

Большое спасибо и естественно взаимно!

Очень кратко о том что сделано за последний месяц:

1. кардинально переработана иммиграция в Новый Свет.

Теперь туда едут в основном простые поселенцы, бывшие каторжники и уголовники. Редко среди них будут попадаться обладатели "полевых" профессий - фермеры, лесорубы, рыбаки и т.д. Еще реже - специалисты с "городскими" профессиями - кузнецы, строители и т.д. Практически никогда - высшее сословие: администраторы и служители культа.

Для последних предполагается использовать особый режим генерации, типа того, как это было сделано в моде "1492: Codex", когда при основании второго города король сам посылает администратора для управления своими колониями.

Аналогично будет сделано и для служителей культа, когда церковное руководство будет посылать священников в Новый Свет, которые будут проводить службы в церквях или миссионеров для "обращения туземцев в веру Христову".

С солдатами, по-видимому, тоже следует поступать аналогичным образом.

Если следовать логике мода "1492: Глобальная колонизация", то европейский король - единственный и полноправный хозяин колоний в Новом Свете. Он заинтересован в порядке (администратор) и безопасности своих владений (солдат), церковь же - в следовании поселенцев вере Христовой (священник).

Каждый игрок в праве следовать этим правилам или напротив выступать против них, генеря "колокола свободы" и в итоге провозглашая независимость.

2. новая система обучения.

Отказ от свободного и неограниченного притока специалистов из Европы потребовал введения корректив в систему обучения в Новом Свете. Сейчас обучение возможно по трем типам:

Тип 1: обучение колонистов среди туземцев. Эту часть я пока не трогал, она осталась практически без изменений.

Тип 2: обучение в процессе работы.

Это совершенно новый тип обучения и его я перенес из немецкого мода "ТАС 2.03", внеся ряд существенных дополнений и изменений.

Логика в данном случае предельно простая. Колонист, прибывший из Европы и не имеющий никакой професии, начинает работать к примеру дровосеком. Если он занят без перерыва на этой работе, к примеру, 10 месяцев (1 ход = 1 месяц), то у него есть шанс стать профессиональным лесорубом либо сразу после непрерывного 10-месячного махания топором, либо с задержкой на 1-3 месяца. (ЗЫ, мне тоже приходилось валить лес, но нас - молодых тогда еще ребят - обучили этому делу максимум за час. Так что 10 месяцев это ооочень много, если сравнивать с реальной жизнью.)

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

"Стаж непрерывной работы на данном месте" (извиняюсь за бюрократический сленг) для разных профессий различен. Он минимален для традиционных в Европе "полевых" профессиий (рыбак, лесоруб, фермер), немного больше для неизвестных европейцам "полевых" профессий (разведения табака, выращивание какао и т.д.), еще больше для "городских профессий и максимально большой для профессий высшего уровня (администратор, священник).

Эта часть уже полностью реализована и работает коррестно.

3 Тип: обучение в школах, колледжах, университетах.

В данном разделе мне лишь частично удалось исправить ситуацию.

Прежде всего простейший вопрос: о каком собственно обучении идет речь?
Ответ: речь идет о профессиональном обучении, то есть колонист после обучени получает профессию.

Что мы имеем в оригинальной версии игры? Для примера я возьму марафонскую скорость. Обучение в школе - 60 циклов, в колледже - 45, в университете - 30.

НО!!!

Школа выпускают лишь специалистов самых простейших профессий - типа рыбаков, фермеров и т.д. Но учат их 60 циклов!
Университет же выпускает высшее сословие (администраторов, священников), но на это требуется всего 30 циклов!

Ясно же, что система обучения стоит на голове. Я изменил логику и сейчас она более соответствует действительности.

Обучение в школе самое короткое, но школа и дает лишь простейшие профессии, колледж - обучение длиннее, но и профессии после нее колонист получает более сложные, университет - самое длительное обучение, но зато там можно обучить самым сложным профессиям. В этом случае система обучения становится с головы на ноги.

Нечто подобное было в прошлом. Достаточно вспомнить систему профобучения в СССР: профучилище (рабочий), техникум (мастер), институт (инженер).

Сроки обучения в школах, клледжах, университетах легко согласовать с обучением на рабочем месте по типу 2.

Как вариант такое соотношение:
(первая цифра - простейшая "полевая" профессия, вторая цифра - городская профессия, третья цифра - наиболее сложная профессия)

Обучение на рабочем месте: 10 - 30 - 90
Обучение в учебном заведении: 15 - 30 - 45

Из цифр следует, что учиться полевым профессиям лучше работая, а не протирая штаны за партой.
Для городских профессий разницы нет, но необходимо наличия коллежда, а это время и деньги (стройматериалы)
Однако колледж необходим как ступень для строительства университета, поскольку высшие по сложности профессии лучше получать именно учась, а не работая на них.

Описанное выше также реализовано и работает корректно.

Здесь можно было бы поставить точку, но есть небольшой ньюанс, на котором я споткнулся. Он заключается в том, что колледж и университет выпускают всех специалистов одновременно. К примеру ниверситет через 45 циклов может выпустить как простейшего дровосека, так и администратора. Если первый будет бесплатным, то за последнего придется дополнительно выложить некое количество монет.

Но учатся-то они одинакое по продолжительности время! А, если по уму, то должны разное.

Дровосек в университете или коллежде должен заканчивать обучение через столько же циклов, как и в школе. Если в школе у него на обучение уходит 15 циклов, то в колледже или университете у него должна быть возможность закончить обучение через те же самые 15 циклов, а не сидеть там в 2 или 3 раза дольше положенного.

Совершенно аналогично для кузнеца. Его можно обучить только в колледже или университете, в школе - нельзя. На обучение в колледже требуется 30 циклов + некая кучка монет. Так и в университете кузнеца мы должны получить через те же самые 30 циклов + кучка монет.

Вместо этого и дровосек, и кузнец (я взял их обоих исключительно в качестве примера) торчат в университете втрое или в коллежде вдвое дольше положенного. Я пытаюсь исправить это, но пока, увы, безуспешно...

Что имеем на данный момент?

В CvUnit.cpp решение об окончании обучения описывается так:


if (pCity != NULL)
{
if (getYieldStored() >= pCity->educationThreshold())
{
if (isHuman())
{
CvPopupInfo* pPopupInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, pCity->getID(), getID());
gDLL->getInterfaceIFace()->addPopup(pPopupInfo, getOwnerINLINE());
}
else
{
pCity->AI_educateStudent(getID());
}
}
}

Берется educationThreshold() для данного города и сравнивается с накопленным количеством очков обучения getYieldStored(). Если их накоплено больше или столько же, как и необходимо, то процесс обучения заканчивается и колонист получает одну из доступных в данном городе специальностей.

Если я не ошибаюсь, то выбор доступных специальностей идет через

CvPopupInfo* pPopupInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, pCity->getID(), getID());

Я пробил исходные коды на "BUTTONPOPUP_CHOOSE_EDUCATION". Возможны три места, где программа составляет список юнитов, находящихся в данном городе на момент окончания образования. Это

1. CvDLLButtonPopup.cpp


case BUTTONPOPUP_CHOOSE_EDUCATION:
if (pPopupReturn->getButtonClicked() == GC.getNumUnitInfos())
{
CvCity* pCity = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCity(info.getData1());
if (pCity != NULL)
{
gDLL->getInterfaceIFace()->selectCity(pCity, true);

CvPopupInfo* pInfo = new CvPopupInfo(BUTTONPOPUP_CHOOSE_EDUCATION, info.getData1(), info.getData2());
gDLL->getInterfaceIFace()->addPopup(pInfo, GC.getGameINLINE().getActivePlayer(), false, true);
}
}
else if (pPopupReturn->getButtonClicked() >= 0)
{
gDLL->sendDoTask(info.getData1(), TASK_EDUCATE, info.getData2(), pPopupReturn->getButtonClicked(), false, false, false, false);
}
break;

2. тот же самый CvDLLButtonPopup.cpp:


case BUTTONPOPUP_CHOOSE_EDUCATION:
{
PlayerTypes ePlayer = GC.getGameINLINE().getActivePlayer();
CvCity* pCity = GET_PLAYER(ePlayer).getCity(info.getData1());
if (NULL == pCity || pCity->getOwnerINLINE() != ePlayer)
{
gDLL->getInterfaceIFace()->popupSetAsCancelled(pPopup);
}
else
{
gDLL->getInterfaceIFace()->lookAtCityOffset(pCity->getID());
}

}
break;

3. CvGameTextMgr.cpp:


case BUTTONPOPUP_CHOOSE_EDUCATION:
{
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvCity* pCity = kPlayer.getCity(info.getData1());
CvUnit* pUnit = kPlayer.getUnit(info.getData2());
if (pCity != NULL && pUnit != NULL)
{
BuildingTypes eSchoolBuilding = pCity->getYieldBuilding(YIELD_EDUCATION);
if (eSchoolBuilding != NO_BUILDING)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_EDUCATION", pUnit->getNameOrProfessionKey(), pCity->getNameKey(), GC.getBuildingInfo(eSchoolBuilding).getTextKeyWide());
}
}

}
break;

В принципе понятно, что именно программа делает. Она составляет список юнитов, находящихся в данном городе. Я подозреваю, что этот списоск есть Data2(). А когда приходит момент выбора специальности обучившимся студентом, то выдает этот список для выбора одной из профессий.

Мне до сих пор ни разу не приходилось встречаться с Data1() или Data2() "врЕменными матрицами" (вряд ли термин верный, поэтому прошу специалистов не бить сильно ногами). По-моему, именно в них зашита та информация, которую мне нужно выправить. Пока я ищу пути как это можно сделать. Если кто-то знает, как это сделать, то я буду очень признателен за совет. Заранее большое спасибо!

С наступающим Новым Годом всех, кто находит время заходить на форум и читать данную тему.

kirgre
31.12.2012, 13:28
С Новым Годом всех!

micheline
16.01.2013, 20:44
Э, я дико извиняюсь. Тут есть кто живой?:huh:

kabjans
19.01.2013, 03:14
Э, я дико извиняюсь. Тут есть кто живой?:huh:

Есть! А что кого-то уже понесли?


Как шутят в Одессе

Группа людей со скорбными лицами и музыкальными инструментами. Впереди бригадир - дирижер. Звонок. Выходит жилец.
Бригадир (вежливо приподнимает шляпу): Ай-я-яй, мне уже говорили. Такое горе!
Жилец: Какое горе?
Бригадир: У вас похороны?
Жилец: Похороны?
Бригадир: Ришельевская шесть, квартира семь?
Жилец: Да.
Бригадир: Ну?
Жилец: Что?
Бригадир: Будем хоронить?
Жилец: Кого?
Бригадир: Что значит "кого"? Кто должен лучше знать, я или ты? Ну, не валяй дурака, выноси.
Жилец: Кого?
Бригадир: У меня люди. Оркестр. Пятнадцать человек живых людей. Они могут убить, зарезать любого, кто не вынесет сейчас же. Маня, прошу.
Толстая Маня, в носках и мужских ботинках, ударила в тарелки и посмотрела на часы.
Жилец: Минуточку, кто вас сюда прислал?
Бригадир: Откуда я знаю? Может быть, и ты. Что, я всех должен помнить?
Из коллектива вылетает разъяренный Тромбон.
Тромбон: Миша, тут будет что-нибудь, или мы разнесем эту халабуду вдребезги пополам. Я инвалид, вы же знаете.
Бригадир: Жора, не изводите себя. У людей большое горе, они хотят поторговаться. Назовите свою цену, поговорим как культурные люди. Вы же еще не слышали наше звучание.
Жилец: Я себе представляю.
Бригадир: Секундочку. Вы услышите наше звучание - вы снимете с себя последнюю рубаху. Эти люди чувствуют чужое горе, как свое собственное.
Жилец: Я прекрасно представляю.
Бригадир: Встаньте там и слушайте сюда. Тетя Маня, прошу сигнал на построение. Толстая Маня ударила в тарелки и посмотрела на часы.
Бригадир (прошелся кавалерийским шагом): Константин, застегнитесь, спрячьте свою нахальную татуировку с этими безграмотными выражениями. Вы все время пишете что-то новое. Если вы ее не выведете, я вас отстраню от работы. Федор Григорьевич, вы хоть и студент консерватории, возможно, вы даже культурнее нас - вы знаете ноты, но эта ковбойка вас унижает. У нас, слава Богу, есть работа - уличное движение растет. Мы только в июле проводили пятнадцать человек.
Теперь вы, Маня. Что вы там варите на обед, меня не интересует, но от вас каждый день пахнет жареной рыбой. Переходите на овощи или мы распрощаемся. Прошу печальный сигнал.
(Оркестр играет фантазию, в которой с трудом угадывается похоронный марш).
Жилец (аплодирует): Большое спасибо, достаточно. Но все это напрасно. Наверное, кто-то пошутил.
Бригадир: Может быть, но нас это не касается. Я пятнадцать человек снял с работы. Я не даю юноше закончить консерваторию. Мадам Зборовская бросила хозяйство на малолетнего бандита, чтоб он был здоров. Так вы хотите, чтоб я понимал шутки? Рассчитайтесь, потом посмеемся все вместе.
Из группы музыкантов вылетает разъяренный Тромбон.
Тромбон: Миша, что вы с ним цацкаетесь? Дадим по голове и отыграем свое, гори оно огнем!
Бригадир: Жора, не изводите себя. Вы же еще не отсидели за то дело, зачем вы опять нервничаете?
Жилец: Почем стоит похоронить?
Бригадир: С почестями?
Жилец: Да.
Бригадир: Не торопясь?
Жилец: Да.
Бригадир: По пятерке на лицо.
Жилец: А без покойника?
Бригадир: По трешке, хотя это унизительно.
Жилец: Хорошо, договорились. Играйте, только пойте:
в память Сигизмунд Лазаревича и сестру его из Кишинева.
(Музыканты по сигналу Мани начинают играть и петь:
"Безвременно, безвременно... На кого ты нас оставляешь? Ты туда, а мы - здесь. Мы здесь, а ты - туда". За кулисами крики, плач, кого-то понесли).
Бригадир (повеселел): Вот вам и покойничек!
Жилец: Нет, это мой сосед Сигизмунд Лазаревич. У него сегодня был день рождения.

micheline
19.01.2013, 19:55
Есть! А что кого-то уже понесли?

Таки, да? ;)

micheline
09.03.2013, 18:34
Есть кто? :/

kabjans
12.03.2013, 16:57
Работа над модом продолжается. Я не пишу о каждом внесенном дополнении на форуме, поскольку, во-первых, это требует массы времени, а во-вторых, шаг или даже несколько шагов вперед, сделанные вчера, могут оказаться путем в тупик.

Вот один из примеров.

Дерево - единственный источник "молотков" в оригинальной игре и во всех модах, вышедших до сих пор. Это работает по схеме "Дерево" => "Плотник" => "Молоток".

Но почему? Ведь испокон веков как минимум два исходных материала использовались и до сих пор используются при строительстве - дерево и камень.

Камень как неисчерпаемый ресурс уже есть в моде "1492". Вполне естественно было сделать его вторым источником "молотков", тем более, что это достаточно просто. В результате появилась цепочка "Камень" => "Каменщик" => "Молоток", для которой были созданы юниты "каменотес" и "каменщик". Для последнего уже как профессионала-каменщика была создана оригинальная инфрастуктура в виде зданий, где "каменщик" будет работать, превращая "камень" => "молоток", то есть фактически строя здания в городе.

Все это построение было совершенно гармонично и правильно до тех пор, пока не была введена специализация городов. Что это значит? Практически все юниты могут заложить обычный город, что сейчас доступно в оригинальной игре. Но есть два типа юнитов, которые могут заложить город-форт (военные юниты) или город-монастырь (монахи). Причем форт и монастырь - это не улучшения в пределах уже существующего города, а именно полноценные города, развивающиеся по своим принципам с соответствующей инфраструктурой. К примеру в городе-монастере никогда не будет защитных сооружений или производства оружия. и т.д.

Однако при введенной специализации городов использование уже сделанных моделей развития


"Дерево" => "Плотник" => "Молоток"
плюс


"Камень" => "Каменщик" => "Молоток"
оказалось логически неверным. Возникали два вопроса "что строить" и "кто в построенном здании будет работать". Если игрок эти вопросы может решить без труда, то для тупого ИИ они могут оказаться неразрешимыми. Простого и понятного ответа на эти вопросы не было и схему пришлось переделывать.

Для этого в мод "1492" понадобилось ввести и адаптировать пару дополнительных мини-модов, а именно "MultipleYieldsConsumed & MultipleYieldsProduced" и "Multiple Professions per Building". Плюс ввести нового юнита "строителя".

Лишь после этого удалось реализовать логически правильную конструкцию: юнит строитель может работать либо как профессиональный плотник (использует древесину при строительстве), либо как профессиональный каменщик (использует камень). Для строителя создана своя инфраструктура "WorkPlace" = "WorkShop" = "WorkHouse". Возникшая в прошлой схеме двойная глупость, когда каменшик работал в домике плотника и строил здания из дерево столь же эффективно, как и плотник - исчезла.

Это один из примеров работы над модом.

Сейчас в мод "1492" добавлен внутренний рынок, когда произведенные в городе товары в основном потребляются жителями данного города. Исторически это абсолютно правильно. В период колонизации никто в Европу не гонял галеоны, наполненные доверху промышленными товарами, изготовленными колонистами Нового Света. В Европу шло практичеки исключительно одно сырье: хлопок, шерсть, прочие необработанные материалы.

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

Если ввести эту особенность достаточно рано (до 1536 года), то монеты должны быть фальшивыми, поскольку старейший монетный двор Америки, начал чеканку только в 1536 году. Кроме того стоимость монет можно сделать выше стоимости металлов (серебро, золото), используемых при их изготовлении.

Для логически правильного осуществления этой идеи требуются достаточно серьезные правки в исходных кодах или ... На данный момент я уже испробовал два совершенно различных варианта решения и при компиляции без единой ошибки (!!!), игра в обоих случаях падает на одном и том же месте. Почему - пока неясно. В общем, сейчас готового решения по данному вопросу у меня нет. Есть еще один перспективный вариант, но для его проверки мне надо добраться до компьютера с исходными кодами и модом...