PDA

Просмотр полной версии : [Решено] Как привязать терраформинг к эволюции улучшения?



swan
13.09.2009, 05:34
Кто может сделать (через питон или SDK) следующую привязку?:
Например существует такая эволюционная линия - хутор-->деревня-->село-->городок
я хотел бы создать такую линию - ферма-->ферма, но сделать к ней привязку терраформинга со следующими условиями:
Если в момент эволюции под фермой находится пустыня - то клетка превращается в равнину
Это исторически верное действие, поскольку копты, шумеры и инки в свое время отвоевывали у пустынь плодородные земли, когда отводили оросительные каналы в пустыни и натаскивали туда плодородный грунт (например, нильский ил у коптов) со временем земли превращались в плодородные без дополнительных условий, кроме условия, что земля будет обрабатываться, а не будет заброшена на много лет

Если в момент эволюции под фермой были луга - то клетка превращается в равнину
Это тоже вполне естественная реакция истощения черноземных земель при интенсивном землепользовании - исторически за последние 100 лет на территории одного только США по статистике количество плодородных черноземных земель из-за интенсивного землепользования сократилось на 23%, среди которых около 2% вплоть до почти полного опустынивания

Или может кто встречал где подобный компонент?

NeseryozniyVET
13.09.2009, 14:27
Сделай две фермы в XML. Одну из которых используй в питоне. Инструкция по тераморфингу на сайте есть. http://www.civfanatics.ru/forum/index.php?...mp;#entry306839 (http://www.civfanatics.ru/forum/index.php?showtopic=10074&pid=306839&st=0&#entry306839)

swan
13.09.2009, 15:42
<div class='quotetop'>Цитата</div>
Сделай две фермы в XML. Одну из которых используй в питоне. Инструкция по тераморфингу на сайте есть. http://www.civfanatics.ru/forum/index.php?...mp;#entry306839[/b]
Ты немного не понял чего я хочу.
В инструкции терраформинг привязан к действиям рабочих - сделано, что рабочий завершает действие и вместо N появляется M.
Здесь несколько иное действие должно происходить - ферма вырастает до чего-то, как например село до городка в обычных условиях и после этого остается та-же ферма (только счетчик роста обнуляется - но он и так обнуляется когда что-то во что-то переростает, пусть даже ферма в ту же самую ферму, а не во что-то иное), но при условии того, какая именно под ней находится территория происходит терраформирование. Как ситуация, так и скрипт несколько отличаются и скрипт получается немного посложнее, чем в инструкции.

pashaintel
13.09.2009, 16:11
Ну если предполагается рост только фермы,то решается всё довольно просто. Можно обойтись одним питоном. Вводим цепочку улучшений ферма - улучшенная ферма - плантация. В Cv.EventManager.py находим def onImprovementBuilt(self, argsList) и прописываем туда:
[code]if(iImprovement==gc.getInfoTypeForString(&#39;IMPROVEMENT_(улучшенная ферма))):

swan
13.09.2009, 16:25
Пашок - вроде как то, что надо, хотя не совсем уверен, что это к onImprovementBuilt() привязано - там всё же рост улучшения идет - случаем не какой нибудь bla_bla_ImprovementGrowth() или bla_bla_ImprovementEvolve() или что-то в этом роде?
Ну и по идее надо оставить ту же ферму - т.е. ферма грейдится - но так и остается такой-же фермой

pashaintel
13.09.2009, 16:52
<div class='quotetop'>Цитата(swan * 13.9.2009, 16:25) 306882</div>

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

swan
13.09.2009, 17:03
Об этом как-то не подумал - забыл, что так тоже можно, хотя это имеет свои минусы - после апгрейда до некоего уровня она прекратит автоматом грейдится ибо цепочка прервется на определенном уровне, чего не надо. Хотя я представляю как можно зациклить. Но всё же терзают меня смутные сомнения, что onImprovementBuilt() относится к завершению действия рабочего, а не к завершению эволюции улучшения

pashaintel
13.09.2009, 18:50
<div class='quotetop'>Цитата(swan * 13.9.2009, 17:03) 306887</div>

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

swan
13.09.2009, 19:38
Пашок. Уболтал. На днях поэкспериментирую :)

ЗЫ может таки посмотришь, чего можно поковырять, чтобы довести до ума компонент из соседней темы про зависимость производства спецов от числа торговых рейсов?

pashaintel
13.09.2009, 21:50
<div class='quotetop'>Цитата(swan * 13.9.2009, 19:38) 306901</div>

Пашок. Уболтал. На днях поэкспериментирую :)

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

Blacksun
14.09.2009, 12:22
Жалко в Питоне нет такого же механизма просмотра файлов как в VS2003. А то давно бы Питон разобрал... Мож уже есть ? (Чтобы все файлы можно было бы видеть и редактировать из одного редактора, чтобы можно было производить поиск по всем файлам).

NeseryozniyVET
14.09.2009, 17:55
<div class='quotetop'>Цитата(Blacksun * 14.9.2009, 11:22) 306972</div>
Жалко в Питоне нет такого же механизма просмотра файлов как в VS2003. А то давно бы Питон разобрал... Мож уже есть ? (Чтобы все файлы можно было бы видеть и редактировать из одного редактора, чтобы можно было производить поиск по всем файлам).[/b]Notepad++ производит поиск по всем открытым в нем файлам. Я сам пользуюсь и другим советую.

Blacksun
14.09.2009, 19:26
Спасибо! Скачал. :bye:

Moonlight Shadow New
15.09.2009, 11:16
<div class='quotetop'>Цитата(swan * 13.9.2009, 19:38) 306901</div>

Пашок. Уболтал. На днях поэкспериментирую :)
[/b]

Как поэксперементируешь не скажешь что вышло? :whistle:
А то есть мысль по росту улучшения сделать изменение feature, а принцип вроде бы там тот же...

Gesse
23.09.2009, 23:19
Originally posted by Swan
Но всё же терзают меня смутные сомнения, что onImprovementBuilt() относится к завершению действия рабочего, а не к завершению эволюции улучшения
Сомнения верны, этот блок относится к действию рабочего в данный момент.
Я поковыряюсь в Эволюции на днях, сейчас назрела пара идей, может что да выйдет -_- :huh:

Moonlight Shadow New
24.09.2009, 12:23
<div class='quotetop'>Цитата(Gesse * 23.9.2009, 23:19) 308149</div>

Сомнения верны, этот блок относится к действию рабочего в данный момент.
Я поковыряюсь в Эволюции на днях, сейчас назрела пара идей, может что да выйдет -_- :huh:
[/b]
Неа, не верны сомнения-)
Я использовал (надо бы описать) рост лесов помимо прямого выращивания выращиванием через TreeFarm описав что через некоторое количество турнов использования импровемент меняется на импровемент прямого выращивания лесов- которое вызывает соответствующую функцию в питоне и леса вырастают.

Gesse
24.09.2009, 12:39
Тут немного не то :)
Дело в том, что в здесь привязка же не к ходам, а к эволюции как таковой. Это не разовое действие, и не цикличное. т.е. у каждого тайла будет свой каунт времени (т.е. количество ходов), да и к тому же тут нужно каждый ход проверять, есть ли новые improvement типа фермы. Так же нужно чтобы у уже учтеных каунт времени не обновлялся при проверке тайлов.
И надо отвязатся от обрабатывания/необрабатывания клетки. Чтобы независимо было изменение.
Я просто сегодня вариант "TreeFarm" (в моем случае FarmEvent) уже пробывал, результат не порадовал пока :(

А по поводу onImprovementBuilt(), он отвечает за то что объект N заканчивает, действие H в месте М и появляется результат R.
Т.е. тут получается скрипт уже нужен дополнительный на каунт improvementпрописывать, который будет активироватся при появлении improvement и по истечению лимита ходов он активировал действие H в месте M.
И опять таки чтобы работало на всех improvement такого типа, нужно проверку каждый ход.

pashaintel
24.09.2009, 13:45
<div class='quotetop'>Цитата(Gesse * 24.9.2009, 12:39) 308227</div>

Тут немного не то :)
Дело в том, что в здесь привязка же не к ходам, а к эволюции как таковой. Это не разовое действие, и не цикличное. т.е. у каждого тайла будет свой каунт времени (т.е. количество ходов), да и к тому же тут нужно каждый ход проверять, есть ли новые improvement типа фермы. Так же нужно чтобы у уже учтеных каунт времени не обновлялся при проверке тайлов.
И надо отвязатся от обрабатывания/необрабатывания клетки. Чтобы независимо было изменение.
Я просто сегодня вариант "TreeFarm" (в моем случае FarmEvent) уже пробывал, результат не порадовал пока :(

А по поводу onImprovementBuilt(), он отвечает за то что объект N заканчивает, действие H в месте М и появляется результат R.
Т.е. тут получается скрипт уже нужен дополнительный на каунт improvementпрописывать, который будет активироватся при появлении improvement и по истечению лимита ходов он активировал действие H в месте M.
И опять таки чтобы работало на всех improvement такого типа, нужно проверку каждый ход.
[/b]
Повторю ещё раз, функция onImprovementBuilt прекрасно работает при любом появлении нового импрувмента на клетке,не обязательно при строительстве. Всё это не пи...шь,а многократно проверенный опыт на своём собственном моде. Я так терраформинг осуществил. При эволюции улучшения происходит преобразование земли. вместо этого можно впихнуть любой код,который поймёт питон.

Gesse
24.09.2009, 13:54
<div class='quotetop'>Цитата</div>
Повторю ещё раз, функция onImprovementBuilt прекрасно работает при любом появлении нового импрувмента на клетке,не обязательно при строительстве.[/b]
Ну возможно, это так и есть, просто когда я прописывал изменения типа улучшения, при изменении обьекта, срабатывало это только если действие активировать, т.е. задествовать рабочего или событие типа label.

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

pashaintel
24.09.2009, 14:32
Возможно,ты где то ошибся в коде. Я проиллюстрирую на примере эволюции дома в поселение(hamlet):
[code]def onImprovementBuilt(self, argsList):

Gesse
24.09.2009, 14:40
У меня все еще сложнее сделано, но всеравно, того что нужно не выходит, а именно когда ферма переходит из состояния 1 в состояние 2, тип земли под ней не меняется, зато если поставить каунт на время изменения, то все работает, но блин работает только на отдельно взятом улучшении.
Ну вообщем я еще поэксперементирую с onBeginGameTurn, потом уже буду думать дельше.
Просто единственное что у меня сейчас не выходит, так это организовать нормально проверку тайлов без сброса каунтов.

pashaintel
24.09.2009, 14:48
<div class='quotetop'>Цитата(Gesse * 24.9.2009, 14:40) 308251</div>

У меня все еще сложнее сделано, но всеравно, того что нужно не выходит, а именно когда ферма переходит из состояния 1 в состояние 2, тип земли под ней не меняется, зато если поставить каунт на время изменения, то все работает, но блин работает только на отдельно взятом улучшении.
Ну вообщем я еще поэксперементирую с onBeginGameTurn, потом уже буду думать дельше.
Просто единственное что у меня сейчас не выходит, так это организовать нормально проверку тайлов без сброса каунтов.
[/b]
Что-то непонятно. Выложи код,который не работает,посмотрим.

Gesse
24.09.2009, 18:42
<div class='quotetop'>Цитата(Пашок * 24.9.2009, 16:48) 308255</div>

Что-то непонятно. Выложи код,который не работает,посмотрим.
[/b]
Да все уже решил проблему.
Вообщем в твоем способе (можно на ты ?), изменения всетаки происходят сразу при строительстве фермы. Для этой задачи нам это не нужно было вовсе.
В том варианте который сделал я изменения регулируются по времени, параметром <iUpgradeTime></iUpgradeTime> в файле CIV4ImprovementInfos.xml
Подбираем нужное значение и со временем изменения происходят.
Но стоит тут же оговорится.
Изменения происходят только если клетка используется городом. Если нет то процесс стоит на месте.

Что-то не хочет файл в атач цеплятся... Потому даю ссылку на мой вариант Эволюции (http://www.filefront.com/14591991/Assets.rar)

pashaintel
24.09.2009, 18:56
Ну если нужна задержка по времени,то тогда так. А сделать,чтобы процесс шёл и на необрабатываемой клетке можно. Я это в СДК делал,можно ли через питон,пока не знаю,надо разбираться.

Gesse
24.09.2009, 19:01
Ну в любом случае глянь пока мои "наработки", может прийдет идея как сделать чтобы не зависило от того обрабатывается ли клетка городом или нет.
У меня просто пока закончились идеи :)

swan
10.10.2009, 19:20
По идее терраформинг от "роста" фермы в реале зависит от того - обрабатывается место или нет - поэтому всё вполне реалистично получается - разве что можно сделать такое, чтобы счетчик "роста" ферм обнулялся или уменьшался за те турны в которые клетка не обрабатывалась было бы более реалистично - но это имхо надо ковырять уже СДК и через него в ХМЛ добавлять булевый параметр позволяющий или не позволяющий сматывание счетчика при неиспользовании клетки, чтобы не все подряд типы улучшений сматывались, а только конкретные

Gesse
15.10.2009, 07:05
У меня есть идея как реализовать обратный отсчет... без ковыряния в SDK.
Ну может оно и не сработает, но всеже.
Может кто знает, если не трудно, подскажите в каком файле мне искать функцию вывода информации по выбранной курсором клетке ? (имею ввиду инфу которая повляется слева, над блоком с инфой о юните)
Ато что-то пересмотрел все файлы и нашел только обновление интерфейса кнопок действий юнита, при наведении на клетку...

NeseryozniyVET
15.10.2009, 16:59
<div class='quotetop'>Цитата(Gesse * 15.10.2009, 6:05) 310723</div>
У меня есть идея как реализовать обратный отсчет... без ковыряния в SDK.
Ну может оно и не сработает, но всеже.
Может кто знает, если не трудно, подскажите в каком файле мне искать функцию вывода информации по выбранной курсором клетке ? (имею ввиду инфу которая повляется слева, над блоком с инфой о юните)
Ато что-то пересмотрел все файлы и нашел только обновление интерфейса кнопок действий юнита, при наведении на клетку...[/b]Файл CvMainInterface.py ( def updateInfoPaneStrings( self ): )
Еще просмотри файл PyHelpers.py. Функции из него тоже часто используются.

Gesse
15.10.2009, 19:29
Спасибо, нашел... Сейчас сижу разбираюсь как именно связаны функции. :)