PDA

Просмотр полной версии : Требуется помощь специалистов!



kabjans
27.04.2010, 15:57
Требуется помощь специалистов!

Игра: Колонизация 2.

Расположение зданий в городе прописывается в файле CvMainInterface.py. Выглядит это так


# CITY BUILDINGS GRID MAP
BUILDING_DATA = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]

BUILDING_DATA[0] = [40, 33, 33, 18] #Bells
BUILDING_DATA[1] = [60, 42, 33, 18] #Hammers
BUILDING_DATA[2] = [40, 66, 33, 18] #Coats
BUILDING_DATA[3] = [0, 33, 33, 18] #Cloth
BUILDING_DATA[4] = [80, 0, 33, 18] #Rum
BUILDING_DATA[5] = [20, 42, 33, 18] #Cigars
BUILDING_DATA[6] = [60, 8, 33, 18] #Tools
BUILDING_DATA[7] = [40, 0, 33, 18] #Crosses
BUILDING_DATA[8] = [0, 66, 33, 18] #Muskets
BUILDING_DATA[9] = [0, 0, 33, 18] #Horses
BUILDING_DATA[10] = [80, 33, 33, 18] #Dock
BUILDING_DATA[11] = [60, 74, 33, 18] #WareHouse
BUILDING_DATA[12] = [20, 8, 33, 18] #Education
BUILDING_DATA[13] = [80, 74, 33, 18] #Wall
BUILDING_DATA[14] = [20, 74, 33, 18] #Print

BUILDING_GRID = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
Первые две цифры - это координаты здания на экране города.

Задача:
Необходимо на одном и том же месте построить одно из двух зданий. Если строишь здание 1, значит здание 2 построить невозможно. Место уже занято. И соответственно наоборот.

Что имеем:

Во-первых, в файле CvMainInterface.py нужно задать одни и те же координаты для двух разных зданий. Например, вместо

<div class='quotetop'>Цитата</div>
BUILDING_DATA[0] = [40, 33, 33, 18] #Bells
BUILDING_DATA[1] = [60, 42, 33, 18] #Hammers[/b]можно записать

<div class='quotetop'>Цитата</div>
BUILDING_DATA[0] = [40, 33, 33, 18] #Bells
BUILDING_DATA[1] = [40, 33, 33, 18] #Hammers[/b]
В данном случае оба здания #Hammers и #Bells могут быть построены на том же месте.

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

Вопрос:
Как сделать, чтобы первое построенное здание полностью исключало возможность строить на этом же самом месте второе здание?
Повторяю, условие: строить надо на одном и том же месте!
Какие есть предложения?

NeseryozniyVET
27.04.2010, 21:43
Вопрос непонял.
Если надо чтоб наличие одного здания запрещало постройку другого, то зачем описывать проблемы интерфейса?
Если надо чтоб картинки зданий были в разных местах, то зачем задавать им одинаковые координаты?

kabjans
27.04.2010, 22:34
<div class='quotetop'>Цитата(NeseryozniyVET * 27.4.2010, 20:43) 334491</div>

Вопрос непонял.
Если надо чтоб наличие одного здания запрещало постройку другого, то зачем описывать проблемы интерфейса?
Если надо чтоб картинки зданий были в разных местах, то зачем задавать им одинаковые координаты?
[/b]
Опишу общую идею и зачем это делается.

Колонисты высаживаются на берег. Затем закладывают поселение вообще без единого здания в нем.

Далее строится первое здание.

Это может быть обычное административное здание, то есть обычный вариант, как сейчас.

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

Соотвественно в каждом из типов поселениий - обычном городе или городе-крепости можно строить свои типы зданий. Это дает как минимум 2-кратное увеличение площадей под городское или крепостное строительство.

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

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

Во французской версии Dawn of New Era 1.33-1.34 подобная особенность есть, то есть там можно строить либо лавку табачника, либо мастерскую по пошиву одежды, либо винокурню. И все на одной и той же клетке. Что построил первым, то и можешь улучшать до предела. Что не построил, то уже и не построишь. Именно такое мне и надо для осуществления моей идеи.

У них это прописано в виде CTR (CoatTobaccoRum) тага в CIV4BuildingInfos.xml. Они поменяли только CvMainInterface.py и CIV4BuildingInfos.xml с Civ4BuildingSchema.xml. Все остальные изменения внутри CvGameCoreDLL.dll.

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

Snake_B
28.04.2010, 02:07
<div class='quotetop'>Цитата(kabjans * 27.4.2010, 21:34) 334499</div>

<div class='quotetop'>Цитата(NeseryozniyVET * 27.4.2010, 20:43) 334491

Вопрос непонял.
Если надо чтоб наличие одного здания запрещало постройку другого, то зачем описывать проблемы интерфейса?
Если надо чтоб картинки зданий были в разных местах, то зачем задавать им одинаковые координаты?
[/b]
Опишу общую идею и зачем это делается.

Колонисты высаживаются на берег. Затем закладывают поселение вообще без единого здания в нем.

Далее строится первое здание.

Это может быть обычное административное здание, то есть обычный вариант, как сейчас.
[/b][/quote]

ну.... всё правильно Вет сказал... вы не в ту сторону копаете... для ваших зданий:
1. прописываете одинаковые координаты (как вы и хотели)... и всё, больше от интерфейса вам ни чего не нужно...
2. развитие отдельных линеек реализуется вообще как не фиг делать... та линейка которая идёт у города (обычного) требует наличия "адм.здания" (каждое здание города отдельно), линейка крепости требует наличия "смотровой башни"... всё это на сколько я понимаю различия цивы и колонизации делается одинаково... через xml...
3. собственно проблема я так понимаю именно в первом здании.... на сколько я помню в цивилизации в xml постройка одного здания не может запретить постройку другого...

и вот это уже надо делать в питоне или в сдк....


теоретически можно реализовать и в xml.... но в циве, на счет колонизации я не знаю...

1. адм.здания и смотровые башни прописать как национальное чудо и в "CIV4BuildingClassInfos" в тэге "iMaxPlayerInstances = Максимальное количество зданий данного класса для каждого игрока" прописать им -1
2. в городе разрешить 3 нац.чуда (пример для цивы)

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

п.с. с другой стороны... после постройки первого нац.чуда, можно построить и второе... так что или 1 нац.чудо на город (может в колонизации это можно реализовать?) или питон / сдк...

swan
28.04.2010, 05:51
Я вот не помню - под рукой колонизации нет - если там в BuidingInfos реализовано как в обычной циве - то поковыряйтесь на предмет того, как реализованы электростанции в обычной циве - там есть момент "или-или" - т.е. если строишь электростанцию другого типа - то предыдущего типа рушится и на её место ставится новый тип.

kabjans
28.04.2010, 10:37
<div class='quotetop'>Цитата</div>
1. прописываете одинаковые координаты (как вы и хотели)... и всё, больше от интерфейса вам ни чего не нужно...[/b]
Согласен.

<div class='quotetop'>Цитата</div>
2. развитие отдельных линеек реализуется вообще как не фиг делать... та линейка которая идёт у города (обычного) требует наличия "адм.здания" (каждое здание города отдельно), линейка крепости требует наличия "смотровой башни"... всё это на сколько я понимаю различия цивы и колонизации делается одинаково... через xml...
3. собственно проблема я так понимаю именно в первом здании.... на сколько я помню в цивилизации в xml постройка одного здания не может запретить постройку другого...[/b]
Частично верно. Но как обойти проблему первого здания я в принципе решил. Сегодня вечером опробую идею на игре. Там вообще в СДК лесть не надо, все можно в xml прописать.

Но решение необходимо не только для первого здания, а для всех построек в городе.

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

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

<div class='quotetop'>Цитата</div>
1. адм.здания и смотровые башни прописать как национальное чудо и в "CIV4BuildingClassInfos" в тэге "iMaxPlayerInstances = Максимальное количество зданий данного класса для каждого игрока" прописать им -1
2. в городе разрешить 3 нац.чуда (пример для цивы) [/b]
Итак, первое предложение - через национальное чудо.

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

<div class='quotetop'>Цитата</div>
п.с. с другой стороны... после постройки первого нац.чуда, можно построить и второе... так что или 1 нац.чудо на город (может в колонизации это можно реализовать?) или питон / сдк...[/b]
Вот именно это и есть самое плохое, плюс именно это и есть на данный момент в Колонизации без каких-либо изменений в xml, лишь задав одни и те же координаты файле CvMainInterface.py. Одно строится поверх другого.

NeseryozniyVET правильно сформулировал задачу:

<div class='quotetop'>Цитата</div>
... надо чтоб наличие одного здания запрещало постройку другого.[/b]
В этом смысле второе предложение от swan:

<div class='quotetop'>Цитата</div>
поковыряйтесь на предмет того, как реализованы электростанции в обычной циве - там есть момент "или-или" - т.е. если строишь электростанцию другого типа - то предыдущего типа рушится и на её место ставится новый тип.[/b]
на первый взгляд более перспективно. Но и там тоже есть один крайне неприятный момент, на который я часто нарывался, играя в Цивилизацию. Можно построить тепловую станцию на угле, затем вместо нее построить электростанцию. Тепловая, естественно исчезнет из города. НО! Возможность-то ее строительства останется! То есть ее снова можно построить, а значит возможен замкнутый круг, когда АИ будет тупо строить то, простейшее административное здание, то смотровую башню. И так до бесконечности, полностью остановив развитие колонии.

То есть вопрос опять-таки прежний.

Если надо чтоб наличие одного здания запрещало постройку другого. Как это сделать?

Французам в Dawn of New Era 1.33-1.34 это как-то удалось. Вот, что я нарыл на данный момент.

Таг bCTR (CoatTobaccoRum) прописан в CIV4BuildingInfos.xml и Civ4BuildingSchema.xml.

В CIV4BuildingInfos.xml так

[code]

NeseryozniyVET
28.04.2010, 22:11
В файлах CIV4BuildingInfos.xml и CIV4BuildingsSchema.xml создай новый тэг iConstructType под тэгом iSpecialBuildingPriority. Зделай все по аналогии с iSpecialBuildingPriority.
Потом зайди в файлы SDK CvInfos.cpp и CvInfos.h. Найди класс CvBuildingInfo и опять для нового тэга зделай все по аналогии с iSpecialBuildingPriority. Затем зайди в файл CvCity.cpp, найди bool CvCity::canConstruct и напиши там
[code]

kabjans
29.04.2010, 00:29
Большое спасибо, NeseryozniyVET, начал пробовать этот вариант. С ходу не получилось, что совершенно не странно. Сейчас буду искать причину.

SpecialBuildingPriority прописан в этих файлах.

<div class='quotetop'>Цитата</div>
Search "SpecialBuildingPriority" (16 hits in 6 files)
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CvCity.cpp (2 hits)
Line 5191: if (kBuilding.getSpecialBuildingPriority() < kNextBuilding.getSpecialBuildingPriority())
Line 5191: if (kBuilding.getSpecialBuildingPriority() < kNextBuilding.getSpecialBuildingPriority())
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CvCityAI.cpp (1 hits)
Line 1180: int iValue = kLoopBuilding.getSpecialBuildingPriority();
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CvGameTextMgr.cpp (2 hits)
Line 4732: if (kBuilding.getSpecialBuildingPriority() > kNextBuilding.getSpecialBuildingPriority())
Line 4732: if (kBuilding.getSpecialBuildingPriority() > kNextBuilding.getSpecialBuildingPriority())
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CvInfos.cpp (7 hits)
Line 4090: m_iSpecialBuildingPriority(0),
Line 4261: int CvBuildingInfo::getSpecialBuildingPriority() const
Line 4263: return m_iSpecialBuildingPriority;
Line 4487: stream->Read(&m_iSpecialBuildingPriority);
Line 4572: stream->Write(m_iSpecialBuildingPriority);
Line 4653: pXML->GetChildXmlValByName(&m_iSpecialBuildingPriority, "iSpecialBuildingPriority");
Line 4653: pXML->GetChildXmlValByName(&m_iSpecialBuildingPriority, "iSpecialBuildingPriority");
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CvInfos.h (2 hits)
Line 1084: DllExport int getSpecialBuildingPriority() const;
Line 1161: int m_iSpecialBuildingPriority;
C:\Program Files\2K Games\Firaxis Games\Sid Meier&#39;s Civilization IV Colonization\Mods\1492 ACSystem\1492 ACSystem\CvGameCoreDLL\CyInfoInterface1.cpp (2 hits)
Line 258: .def("getSpecialBuildingPriority", &CvBuildingInfo::getSpecialBuildingPriority, "int ()")
Line 258: .def("getSpecialBuildingPriority", &CvBuildingInfo::getSpecialBuildingPriority, "int ()")[/b]
По-видимому в этих же файлах мне надо и ConstructType прописать, а то CvGlobals.cpp ругается очень нехорошими словами.

Участок кода в CvCity.cpp, где есть bool CvCity::canConstruct в Колонизации выглядит так:
[spoiler]
[code]bool CvCity::canConstruct(BuildingTypes eBuilding, bool bContinue, bool bTestVisible, bool bIgnoreCost) const
{

NeseryozniyVET
29.04.2010, 01:47
Я перепутал CvGlobals с CvInfos.
Искать CvBuildingInfo надо в CvInfos.cpp и CvInfos.h. Перечитай предидущий пост, я его исправил.

В CvCity.cpp код вставляй в самый конец перед return true;

Прикрепи архив с СvCity.cpp

Хальк Юсдаль
29.04.2010, 02:05
В недавних модкомпонентах к циве мне попадался один на апрейды зданий, когда строились не вместо, а после. В смысле улучшались в более лучшие. Тут пока решается не совсем такой вопрос, но для дальнейший игры подобные апгрейды зданий могут быть интересными.

Snake_B
29.04.2010, 13:56
<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515</div>

Но решение необходимо не только для первого здания, а для всех построек в городе.

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

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

эм... линейки должны пересекаться или нет?
т.е. если мы строим крепость, то мы можем построить в ней только "крепостные" здания или для каждого здания выбор идёт отдельно, независимо от первого здания?

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515</div>

<div class='quotetop'>Цитата
1. адм.здания и смотровые башни прописать как национальное чудо и в "CIV4BuildingClassInfos" в тэге "iMaxPlayerInstances = Максимальное количество зданий данного класса для каждого игрока" прописать им -1
2. в городе разрешить 3 нац.чуда (пример для цивы) [/b]
Итак, первое предложение - через национальное чудо.

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

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

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515</div>

Тут плохо то, что такое "чудо" можно будет иметь только одно на всю колонию.[/b]

НЕТ... вот здесь я написал:
<div class='quotetop'>Цитата</div>
в "CIV4BuildingClassInfos" в тэге "iMaxPlayerInstances = Максимальное количество зданий данного класса для каждого игрока" прописать им -1[/b]
это даст неограниченное количество этих зданий у игрока,

т.е. это утверждение - "такое "чудо" можно будет иметь только одно на всю колонию." НЕ ВЕРНО.

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515</div>

<div class='quotetop'>Цитата
п.с. с другой стороны... после постройки первого нац.чуда, можно построить и второе... так что или 1 нац.чудо на город (может в колонизации это можно реализовать?) или питон / сдк...[/b]
Вот именно это и есть самое плохое, плюс именно это и есть на данный момент в Колонизации без каких-либо изменений в xml, лишь задав одни и те же координаты файле CvMainInterface.py. Одно строится поверх другого.[/b][/quote]

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

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515</div>

Но как обойти проблему первого здания я в принципе решил.
[/b]

и как?

kabjans
29.04.2010, 15:10
<div class='quotetop'>Цитата(NeseryozniyVET * 29.4.2010, 0:47) 334595</div>

Я перепутал CvGlobals с CvInfos.
Искать CvBuildingInfo надо в CvInfos.cpp и CvInfos.h. Перечитай предидущий пост, я его исправил.

В CvCity.cpp код вставляй в самый конец перед return true;

Прикрепи архив с СvCity.cpp
[/b]
Архив с СvCity.cpp и СvCity.h тут. [attachmentid=6537]

<div class='quotetop'>Цитата(Хальк Юсдаль * 29.4.2010, 1:05) 334596</div>

В недавних модкомпонентах к циве мне попадался один на апрейды зданий, когда строились не вместо, а после. В смысле улучшались в более лучшие. Тут пока решается не совсем такой вопрос, но для дальнейший игры подобные апгрейды зданий могут быть интересными.
[/b]
Все верно. Как раз этот момент особых проблем не вызывает. Тут можно просто обойтись элементарным требование: апгрейд здания типа А требует наличия в городе простейшего здания типа А. Я такое уже делал в намного более сложных комбинациях. Все выполняется простым редактированием одного единственного CIV4BuildingInfos.xml файла. Здесь же задачка посложнее. Надо запретить строительство второго здания, если на этом месте в городе уже построено первое.

NeseryozniyVET
29.04.2010, 17:01
Все, исправил ошибки, вот готовый код.[code]

kabjans
29.04.2010, 17:05
<div class='quotetop'>Цитата(NeseryozniyVET * 29.4.2010, 16:01) 334676</div>[quote]
Все, исправил ошибки, вот готовый код.[code]

Хальк Юсдаль
29.04.2010, 19:08
<div class='quotetop'>Цитата</div>
Все верно. Как раз этот момент особых проблем не вызывает. Тут можно просто обойтись элементарным требование: апгрейд здания типа А требует наличия в городе простейшего здания типа А. Я такое уже делал в намного более сложных комбинациях. Все выполняется простым редактированием одного единственного CIV4BuildingInfos.xml файла. Здесь же задачка посложнее. Надо запретить строительство второго здания, если на этом месте в городе уже построено первое.[/b]

Тогда уже я чего-то не понимаю, ведь если здание на том месте не построено, на другом его уже не построишь, так вроде должно быть?
Тогда почему бы не модифицировать уже имеющиеся условия постройки, так чтобы нельзя было построить здание B, если уже имеется простейшее здание типа А? Ну и вынести это в CIV4BuildingInfos.xml ещё одним тегом.

kabjans
29.04.2010, 21:14
Итак, поехали.
<div class='quotetop'>Цитата</div>
В файлах CIV4BuildingInfos.xml и CIV4BuildingsSchema.xml создай новый тэг iConstructType под тэгом iSpecialBuildingPriority. Зделай все по аналогии с iSpecialBuildingPriority.[/b]
Смотрим как прописан тэг SpecialBuildingPriority.

Запускаем Search "SpecialBuildingPriority" (16 hits in 6 files)
<div class='quotetop'>Цитата</div>

1.CvGameCoreDLL\CvCity.cpp (2 hits)
Line 5188: if (kBuilding.getSpecialBuildingPriority() < kNextBuilding.getSpecialBuildingPriority())
Line 5188: if (kBuilding.getSpecialBuildingPriority() < kNextBuilding.getSpecialBuildingPriority())

2. CvGameCoreDLL\CvCityAI.cpp (1 hits)
Line 1180: int iValue = kLoopBuilding.getSpecialBuildingPriority();

3. CvGameCoreDLL\CvGameTextMgr.cpp (2 hits)
Line 4732: if (kBuilding.getSpecialBuildingPriority() > kNextBuilding.getSpecialBuildingPriority())
Line 4732: if (kBuilding.getSpecialBuildingPriority() > kNextBuilding.getSpecialBuildingPriority())

4. CvGameCoreDLL\CvInfos.cpp (7 hits)
Line 4090: m_iSpecialBuildingPriority(0),
Line 4261: int CvBuildingInfo::getSpecialBuildingPriority() const
Line 4263: return m_iSpecialBuildingPriority;
Line 4488: stream->Read(&m_iSpecialBuildingPriority);
Line 4573: stream->Write(m_iSpecialBuildingPriority);
Line 4653: pXML->GetChildXmlValByName(&m_iSpecialBuildingPriority, "iSpecialBuildingPriority");
Line 4653: pXML->GetChildXmlValByName(&m_iSpecialBuildingPriority, "iSpecialBuildingPriority");

5. CvGameCoreDLL\CvInfos.h (2 hits)
Line 2620: DllExport int getSpecialBuildingPriority() const;
Line 3223: int m_iSpecialBuildingPriority;

6. CvGameCoreDLL\CyInfoInterface1.cpp (2 hits)
Line 258: .def("getSpecialBuildingPriority", &CvBuildingInfo::getSpecialBuildingPriority, "int ()")
Line 258: .def("getSpecialBuildingPriority", &CvBuildingInfo::getSpecialBuildingPriority, "int ()")[/b]
По аналогии с iSpecialBuildingPriority прописываем iConstructType. Нумерация файлов сохранена.

1. CvCity.cpp
[code]

NeseryozniyVET
30.04.2010, 01:50
Во-первых, изменения надо делать только в трех файлах SDK: CvInfos.h CvInfos.cpp и CvCity.cpp. В остальных файлах изменения надо удалить.
Во-вторых, замени в указаных строчках (там где ошибки) getSpecialBuilding() на getSpecialBuildingType()

kabjans
30.04.2010, 10:28
<div class='quotetop'>Цитата(NeseryozniyVET * 30.4.2010, 0:50) 334728</div>

Во-первых, изменения надо делать только в трех файлах SDK: CvInfos.h CvInfos.cpp и CvCity.cpp. В остальных файлах изменения надо удалить.
Во-вторых, замени в указаных строчках (там где ошибки) getSpecialBuilding() на getSpecialBuildingType()
[/b]
Спасибо, попробую этот вариант...

Поскольку возникли вопросы, то объясняю основную идею подробнее.

Исходные данные.

1. Расположение всех зданий в городе строго привязано к определенным местам.
2. На каждом месте может быть построено только одно здание.
3. Если это здание не построено, то данное место остается пустым (Пример: нет нужного ресурса, поэтому нет смысла строить здание. Как вариант: город на острове из одной клетки, вокруг только вода. Строить здания по производству сигар, рома и т.д. бессмысленно, ресурсов все равно нет).
4. Возможности расположить здания плотнее друг к другу путем уменьшения их размеров на экране и пр. крайне ограничены. Выигрыш дает лишь 25% увеличение количество построек, да и то за счет ухудшения графики.

Предлагаемый вариант решения:

1. Введение четкой специализации городов: обычный город, город-крепость, и т.д. Вариантов может быть масса в зависимости от выбранной эпохи и воображения игрока. Можно даже город-курорт строить по типу Тропико.
2. На каждой клетке города можно строить лишь одно из зданий, но выбирать можно из нескольких вариантов. Для этого нескольким зданиям задаются одни и те же координаты на экране. Но построив первое здание, другого уже на этом же месте построить нельзя.
3. Проблема пустых (незанятых постройками) мест в городе решается, поскольку строить можно то, что необходимо исходя из специализации города, доступных ресурсов и т.д.
4. По этой же причине отпадает и проблемы с количеством зданий и постройкой новых зданий.

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

<div class='quotetop'>Цитата(Snake_B * 29.4.2010, 12:56) 334646</div>

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515

Но решение необходимо не только для первого здания, а для всех построек в городе.

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

Предлагаемые изменения дают как минимум (!) двухкратное увеличение площадей под строительство. А следовательно намного более интересную инфраструктуру можно создать на городском или крепостном экранах.[/b]
эм... линейки должны пересекаться или нет?
т.е. если мы строим крепость, то мы можем построить в ней только "крепостные" здания или для каждого здания выбор идёт отдельно, независимо от первого здания?[/b][/quote]
- Линейки пересекаться могут лишь по второстепенным зданиям, типа кузницы и др. Основное направление развития города определяется первым специализированным зданием (либо административное, либо военное, либо религиозное, если строится религиозный центр).
- Тут зависит как прописать координаты. В принципе выбор зданий должен быть одинаков для всех типов поселений. Но вполне разумно вводить ограничения. К примеру если это город-крепость, по супер-церковь там строить наверное нет смысла. Достаточно часовни. А вот вокруг города-монастыря с супер-церковью в центре крепостных стен быть не должно.

<div class='quotetop'>Цитата(Snake_B * 29.4.2010, 12:56) 334646</div>

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

<div class='quotetop'>Цитата(Snake_B * 29.4.2010, 12:56) 334646</div>

<div class='quotetop'>Цитата(kabjans * 28.4.2010, 9:37) 334515

Но как обойти проблему первого здания я в принципе решил.
[/b]
и как?
[/b][/quote]
Высадка колонистов происходит на пустой берег. На следующий ход идет закладка поселения. Единственным зданием в котором будет к примеру "палатка". Затем несколько вариантов развития, где для строительства простейшего административного здания или простейшей башки нужно наличие этой самой "палатки". Если вместо нее строится простейшее административное здание, то далее развитие идет по обычной схеме города. Если вместо палатки строится простейшая башня, то развитие идет по линии города-крепости. То есть как пройти начальную точку в принципе понятно. Осталось сделать второй шаг, а именно ввести запрет на многократное строительство на одном месте многих зданий.

<div class='quotetop'>Цитата(Хальк Юсдаль * 29.4.2010, 18:08) 334690</div>

<div class='quotetop'>Цитата
Все верно. Как раз этот момент особых проблем не вызывает. Тут можно просто обойтись элементарным требование: апгрейд здания типа А требует наличия в городе простейшего здания типа А. Я такое уже делал в намного более сложных комбинациях. Все выполняется простым редактированием одного единственного CIV4BuildingInfos.xml файла. Здесь же задачка посложнее. Надо запретить строительство второго здания, если на этом месте в городе уже построено первое.[/b]
Тогда уже я чего-то не понимаю, ведь если здание на том месте не построено, на другом его уже не построишь, так вроде должно быть?
[/b][/quote]
Да, так.

<div class='quotetop'>Цитата(Хальк Юсдаль * 29.4.2010, 18:08) 334690</div>

Тогда почему бы не модифицировать уже имеющиеся условия постройки, так чтобы нельзя было построить здание B, если уже имеется простейшее здание типа А? Ну и вынести это в CIV4BuildingInfos.xml ещё одним тегом.
[/b]
Вот именно это и необходимо сделать. Но этот тэг надо правильно прописать в исходных кодах, чтобы он заработал. Пока же у меня одно здание строится поверх другого. В этом и есть основная загвоздка.

NeseryozniyVET
30.04.2010, 12:03
Я заметил ты в CvCity.cpp кроме моего кода еще изменений с новым параметром сделал. Твои изменения ненужны.
Немного теории. В файле CvInfos.h перечисляются свойства объектов. В файле CvInfos.cpp эти свойства описуются. SpecialBuildingPriority свойство объекта здание которое является целым числом. Наше новое свойство ConstructType тоже целое число, а значит оно описыватся должно также как и SpecialBuildingPriority.
Во всех остальных файлах идет использование свойств в зависимости от их назначания, а так как назначения у SpecialBuildingPriority и нашего ConstructType разные, то и использоватся они будут совершенно по-разному.

kabjans
30.04.2010, 14:43
<div class='quotetop'>Цитата(NeseryozniyVET * 30.4.2010, 11:03) 334745</div>

Я заметил ты в CvCity.cpp кроме моего кода еще изменений с новым параметром сделал. Твои изменения ненужны.
Немного теории. В файле CvInfos.h перечисляются свойства объектов. В файле CvInfos.cpp эти свойства описуются. SpecialBuildingPriority свойство объекта здание которое является целым числом. Наше новое свойство ConstructType тоже целое число, а значит оно описыватся должно также как и SpecialBuildingPriority.
Во всех остальных файлах идет использование свойств в зависимости от их назначания, а так как назначения у SpecialBuildingPriority и нашего ConstructType разные, то и использоватся они будут совершенно по-разному.
[/b]
Извиняюсь, я напутал с CvCity.cpp файлом, не тот положил в архив. :huh1: Оригинальный файл, конечно без этой моей вставки.

Я одновременно пробую пройти двумя путями. Либо через "SecondSpecialBuilding", либо через "ConstructType". Но в обоих случаях пока безуспешно.

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

[code]//addon

Хальк Юсдаль
30.04.2010, 15:02
<div class='quotetop'>Цитата</div>
Вот именно это и необходимо сделать. Но этот тэг надо правильно прописать в исходных кодах, чтобы он заработал. Пока же у меня одно здание строится поверх другого. В этом и есть основная загвоздка.[/b]
Тогда почему бы просто не скопировать тот тег в файлах SDK, немного переименовав его конечно, прописать его по соседству с прежним. И вместо условия, что если нет здания такого типа строить нельзя, прописать, что если есть здание такого типа, то строить нельзя. Я подобным образом делал устаревание прокачек. Взял код, который относился к возможности прокачки при наличии технологии, и скопировав его поставил условие, что при наличие технологии прокачка не доступна.

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

P.S. Хотя по моим объяснениям может сложиться, что я играю в Капитана Очевидность, и проблема в другом. Хм.

kabjans
30.04.2010, 15:36
<div class='quotetop'>Цитата(Хальк Юсдаль * 30.4.2010, 14:02) 334773</div>

<div class='quotetop'>Цитата
Вот именно это и необходимо сделать. Но этот тэг надо правильно прописать в исходных кодах, чтобы он заработал. Пока же у меня одно здание строится поверх другого. В этом и есть основная загвоздка.[/b]
Тогда почему бы просто не скопировать тот тег в файлах SDK, немного переименовав его конечно, прописать его по соседству с прежним. И вместо условия, что если нет здания такого типа строить нельзя, прописать, что если есть здание такого типа, то строить нельзя. Я подобным образом делал устаревание прокачек. Взял код, который относился к возможности прокачки при наличии технологии, и скопировав его поставил условие, что при наличие технологии прокачка не доступна.

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

P.S. Хотя по моим объяснениям может сложиться, что я играю в Капитана Очевидность, и проблема в другом. Хм.
[/b][/quote]
Вот именно шаманством и можно назвать мои попытки "программирования" в той части, где я залезаю в исходные коды игры. Естественно, я сначала сам попробовал поковыряться. Долго пробовал, и так, и этак. Какалось бы, вот она морковка, только рот открой, ан нет. Не получилось.

А бросать идею неохота. Может интересно получиться. Французы, .... :censored: , сделали это, сами не поняв, что можно из этого вытянуть, и сидят со своими кодами, не давая их никому. Мне это уже несколько человек из разных стран независимо друг от друга подтвердили. Каждый нашел в их моде что-то интересное для себя, а перенести в свой мод и улучшить, не получается. Кодов то нет и в ближайшее время не будет. Тем паче, что французы новую версию грозятся выпустить. Правда когда это будет, совершенно неизвестно. Да и на их форуме никакой информации. Я туда недавно ходил, так на их форуме сообще все вымерло, на их главном француском форуме последние сообщения месячной давности. Так что, увы, принцип "ни сам ни гам, ни другим не дам", работает на все 100.

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

NeseryozniyVET
30.04.2010, 16:32
<div class='quotetop'>Цитата(kabjans * 30.4.2010, 13:43) 334768</div>[quote]Сейчас CodeBlocks выдает такое сообщение об ошибке:[code]CvArea.cpp
CvArtFileMgr.cpp
CvCity.cpp
CvCity.cpp(1577) : error C2440: &#39;initializing&#39; : cannot convert from &#39;int&#39; to &#39;SpecialBuildingTypes&#39;

kabjans
01.05.2010, 00:40
Получилось! :applau2: :applau2: :applau2:

NeseryozniyVET ОГРОМНЕЙШЕЕ ТЕБЕ СПАСИБО! :worthy: :worthy: :worthy:

Зачистил свои ошибки в исходных кодах, затем скомпилировал без ошибок CvGameCoreDLL.dll, и ввел необходимые изменения в CIV4BuildingInfos.xml, CIV4BuildingsSchema.xml, CIV4CivilizationInfos.xml и CvMainInterface.py.

А дальше начал испытание. Все прекрасно работает. Причем именно так, как надо!

Более того вводя в CIV4BuildingInfos.xml различные значения "х"

[code]