PDA

Просмотр полной версии : Осваиваем питон (от простого к сложному)



swan
12.08.2006, 18:05
Начну с описания простейших действий в питоне для CivIV (vanilla & Warlords)

1. Каждый файл скрипта, чтобы он мог быть прочитан цивой должен быть прописан по специально отведенным для этого местам.

Место #1 - первичный вызов.
В файле %CivDir%\Mods\%ModDir%\Assets\Python\EntryPoints\CvEventInterface.py в самом начале прописываются строки:


import CvUtil
from CvPythonExtensions import *

после строки "import CvUtil" вписывается строка означающая главный файл обработчика событий - например он у наз называется CvModEventManager.py, соответственно прописываемая строка у нас будет выглядеть так:


import CvModEventManager

команда import означает, что файл на который она указывает должен полностью обрабатываться вместе с данным файлом

Примечание если ваш файл обработчика событий называется CvEventManager.py то первичный вызов можно не использовать

Место #2 - вторичные вызовы.
в файле обработчика событий (по предыдущему примеру он у нас называется CvModEventManager.py и находится в папке %CivDir%\Mods\%ModDir%\Assets\Python в свою очередь могут быть прописаны все подключаемые модули. Например у нас есть 2 собственных модуля, которые нужно подключить:
1. Модуль где прописано, что при взятии определенного города определенной нацией он будет переименован - например он будет находиться в файле CapturedCityRen.py
2. Модуль, где прописано, что в определенном турне на карте появится определенный ресурс - например он находиться в файле SetResources.py
Соответственно в начале файла нам следует прописать их вызовы для обработки - это будет выглядеть так


import CapturedCityRen
import SetResources


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

ЗЫ убедительная просьба указывать название способа сверху поста (например "добавление ресурса на карту")

swan
12.08.2006, 19:06
Эвент: Добавление ресурса на карту в процессе игры. Пример возникновения эвента относительно номера игрового хода

Для добавления ресурса нам потребуется импортировать данные из: CvPythonExtensions (импорт данных), import CvUtil, PyHelpers, Popup и pickle - соответственно начало модуля будет выглядеть так:


from CvPythonExtensions import *
import CvUtil
import PyHelpers
import Popup
import pickle

Далее идет инициализации глобальных переменных gc и PyPlayer:


gc = CyGlobalContext()
PyPlayer = PyHelpers.PyPlayer

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

Действие по добавлению ресурса очень простое:
<div class='quotetop'>Цитата</div>

gc.getMap().plot(int x_coord, int y_coord).setBonusType(int bonus_type)
[/b]
Здесь на плот c координатами x_coord, y_coord устанавливается бонус bonus_type

int x_coord и int y_coord могут иметь значения координаты карты не превышающие её размера мо осям x,y (обратите внимание что все отсчеты начинаются с нуля - т.е. первый плот первого столбца будет иметь координату 0, 0, а десятый плот второго столбца координату 1, 9)

int bonus_type берет значения из CIV4BonusInfos.xml - число означает порядковый номер описанного там бонуса (отсчет с нуля) - например 0 == Алюминий, 6 == нефть

Пример использования данного события относительно даты:
[code]
from CvPythonExtensions import *
import CvUtil
import PyHelpers
import Popup
import pickle

# globals
gc = CyGlobalContext()
PyPlayer = PyHelpers.PyPlayer

### Constants ###
iUranium = 8
iCrab = 13

i10BC = 50
i0AD = 51

class ModResources:

NeverMind
20.08.2006, 17:56
Очень хорошее дело. Было бы здорово взять какой нибудь сценарий и разобрать, какой код и как там используется. В принципе, питон не такая страшная штука. С близкими к нулю познаниями в программировании (мой случай) можно делать небольшие, но приятные вещи.

Несколько полезных ссылок по Python в CIV:

Документация по классам питона в Warlords http://civilization4.net/files/modding/PythonAPI/

Документация по классам питона в ванильной CIV 1.61: http://civilization4.net/files/modding/PythonAPI_original/

Инструкция по питону на civ4wiki: http://civ4wiki.com/wiki/index.php/Python_Tutorial

Примеры игрового кода на их-фанатиках: http://forums.civfanatics.com/showthread.php?t=152856

Blacksun
20.08.2006, 23:38
Спасибо Newer Mind - Все таки самую ценную информацию по программированию я получаю от тебя. Ты не думай - что мне не приходится лазить в Питон... (Последнюю неделю или больше - я в нем просто ночевал) (Это когда пробовали решить проблему с Русскими буквами). Когда я полазил по Питону - я понял, что СДК - шкой лучше управлять через Питон... (По моему она и писалась - как поддержка Питона). Да и раньше - Мосты ( которые еще предстоит доделать) - может мне легче будет их сделать, реализовав все это в Питоне. Потому что в СДК - невозможно отследить весь путь... (все куда то уходит и все откуда то появляется...). Причем - все равно - весь крутеж начинается в СДК ???. (Очень странная смесь...). Так что получается, что без СДК - невозможно чего то глубоко понять в Питоне, а без Питона - невозможно отследить весь путь какого нибудь объекта в СДК. И еще - на их фанатиках описана связь (Шикарно описана) СДК и ХМЛ. Если перевести ту статью и поместить в Осваиваем СДК - это будет отличным подспорьем даже для начинающих изучать эту науку. Потому что очень многое берется из ХМЛ. (там можно даже делать простейшее программирование). А если ты уже знаешь что то про ту или иную переменную, которая уже описана в ХМЛ - то и СДК понимать будет гораздо легче (Питон в том числе).

NeverMind
21.08.2006, 00:23
Так это здорово, буду знать к кому обратиться. А то у меня перманентно возникают разные идеи по питону, и я даже додумываюсь до того, где именно и что надо поменять, но не всегда додумываюсь- на что. :D

А ты про какую статью? Ссылку сразу давай, чтобы все посмотрели. :secret:

Blacksun
21.08.2006, 02:23
Вот ссылка на ту статью (http://forums.civfanatics.com/showthread.php?t=166935) Она (ссылка) лежит на модиках в описании файла XMLShema... Эту статью, которая лежит по этой ссылке - перевести бы на русский. А там, по моему очень подробно описывается - как создать XML файл (свой) и как прописать его в СДК... (и по моему даже в Питоне).

Blacksun
06.09.2006, 07:30
<div align="center">СВЯЗЬ СДК И ПИТОНА.</div>
<div align="center">(Вызов функций, описанных в СДК, через Питон)</div>

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

CyPlayer.cpp, CyPlayer.h.

Если эти функции не описаны в этих файлах, то их надо прописать самому.

Для примера попробуем описать функцию AI_getAttitudeVal для Питона, находящуюся в классе CvPlayerAI. Но при этом попробуем создать свою функцию в классе CvPlayer (т.к. класс CvPlayerAI в Питон не передается). Если бы мы сразу хотели передать эту функцию, то ее пришлось бы описывать в файле CvPlayer.h таким образом:


virtual int AI_getAttitudeVal(PlayerTypes ePlayer, bool bForced = true) = 0;

Что вызывает вылет программы (системная ошибка)

Так что нам приходится создавать свою функцию. Мы ее прописываем так:


int getAttitudeVal(PlayerTypes ePlayer, PlayerTypes ePlayerHuman);

Флаг bForsed опускаем, но добавляем второго игрока, так как отношения проверяются между двумя игроками. (в этом то и была ошибка в первой редакции).

После этого прописываем эту функцию в файле Cyplayer.h. Здесь надо ее прописать также, как она была прописана в файле CvPlayer.h, только тип PlayerTypes надо заменить на int:


int getAttitudeVal(int /*PlayerTypes*/ ePlayer, int /*PlayerTypes*/ ePlayerHuman);

Далее создаем функцию getAttitudeVal в файле CvPlayer.cpp

[code]
int CvPlayer::getAttitudeVal(PlayerTypes ePlayer, PlayerTypes ePlayerHuman)
{

Kerim
02.11.2006, 21:06
А можно в питоне приодолеть лимит цив не в 18 а скажем в 100.

Blacksun
02.11.2006, 21:15
<div class='quotetop'>Цитата(Kerim * 2.11.2006, 21:06) 134743</div>

А можно в питоне приодолеть лимит цив не в 18 а скажем в 100.
[/b]

Это можно преодолеть только в СДК (Зайди на мой сайт - там один мод цепляет 50 цив... (26 из которых - тебе придется создать самому...) :biglol:

Kerim
02.11.2006, 21:29
26 создам а остальные что ами создадутся что-ли:)))

kaizer
04.11.2006, 17:43
Хочу реализовать одну свою идею по сглаживанию рендома, для этого мне надо залезть в алгоритм боя. Не поскажешь, где искать, а то по отсутствию опыта получается много бесполезной возни (хотя именно она и увеличивает этот опыт :) )

Blacksun
04.11.2006, 18:31
<div class='quotetop'>Цитата(Kaizer * 4.11.2006, 17:43) 135138</div>

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

Какой рандом используется для боя - можно узнать в файлах CvUnit.cpp и CvUnitAI.cpp (Где то на форуме я давал даже функции, которые заведуют рандомом боя (для групповых атак и для дуэли...). Возможно тебе придется посмотреть еще файлы CvSelectionGroup и CvSelectionGroupAI - cpp.

kaizer
04.11.2006, 18:34
Спасибо сейчас посмотрю.

NeverMind
28.12.2006, 20:27
Сегодня обнаружил, что питоновские файлы могут (должны?) работать даже не в своих каталогах. По ошибке поставил файл экрана не в Python\Screens, где он в ассетах игры, а просто в Python. Все работает. :whistle:

Дело было именно с чистыми ассетами, еще раз потом проверял.

swan
29.12.2006, 10:21
Когда делали русик под 2.08 - vpadlo это знал - подлечим по мере возможности

NeverMind
29.12.2006, 12:38
Очень ценное пояснение, спасибо :rolleyes:

А кого и от чего все таки будут лечить - питон, русик, vpadlo? :D

swan
29.12.2006, 13:14
<div class='quotetop'>Цитата</div>
кого и от чего все таки будут лечить - питон, русик, vpadlo?[/b]
меня подлечим :lol:
Попробуем подлечить это через SDK или наоборот как дополнительный вариант сделаем - всё зависит от функционала

NeverMind
29.12.2006, 13:34
swan, ты определенно человек-загадка. Каждое твое пояснение еще больше озадачивает. :applau2:

- Питон-файлы работают даже не в своих каталогах
- Будем это лечить

А зачем это лечить? Какие в этом недостатки? Почему тогда это не лечит Firaxis? Давайте заодно все и подлечимся. :D

Kerim
01.01.2007, 15:01
В следующей версии цивы вылечат.

NeverMind
09.01.2007, 13:57
Лечат, когда что то болит. Было бы неплохо, если бы в следующую версию включили обязательный антифлудерский патч. Может и подлечили бы некоторых. :whistle:

Kerim, если тебе нечего сказать по существу темы, и никаких вопросов по данной теме у тебя не возникает, то просто "отмечаться" в этой теме тебе совсем необязательно. :secret:

Dimon157
13.08.2007, 14:24
Для C++ в MS Visual Studio усть очень удобная штука "Go to definition" и "Go to declaration". Есть ли что-то подобное для Питона?

Blacksun
13.08.2007, 14:37
<div class='quotetop'>Цитата(Dimon_157 * 13.8.2007, 15:38) 195568</div>

Для C++ в MS Visual Studio усть очень удобная штука "Go to definition" и "Go to declaration". Есть ли что-то подобное для Питона?
[/b]

По мому нет.

Dimon157
13.08.2007, 14:50
Сам отвечу на свой вопрос.
Выбирать здесь http://wiki.python.org/moin/PythonEditors

Мне понравились Eclipse и SPE.

Eclipse:
[attachmentid=2556]

SPE:
[attachmentid=2557]

Жаль что SPE иногда вылетает на сохранении.

Если кто заинтересовался могу написать help по установке.

Blacksun
15.08.2007, 16:44
Пиши. Мне пригодится.

Dimon157
15.08.2007, 17:19
Eclipse:
1) Качаем Eclipse Classic (http://www.eclipse.org/downloads/) (140Mb)
2) Через Eclipse качаем плагин (~3Mb). Инструкции (http://www.fabioz.com/pydev/manual_101_install.html)

SPE:
1) Качаем Python (http://www.python.org/download/) (10.4Mb)
2) Качаем wxPython (http://www.wxpython.org/download.php) Prebuilt Binaries (7.16Mb)
3) Наконец качаем SPE (http://pythonide.stani.be/) (1.23Mb)

NeverMind
16.08.2007, 00:31
<div class='quotetop'>Цитата(Dimon_157 * 15.8.2007, 18:33) 195882</div>

Eclipse:
1) Качаем Eclipse Classic (http://www.eclipse.org/downloads/) (140Mb)
2) Через Eclipse качаем плагин (~3Mb). Инструкции (http://www.fabioz.com/pydev/manual_101_install.html)[/b]

140m? :shock: Он того действительно стоит или это для профессионалов? Вроде все в Блокноте делается...ну конечно, на элементарном уровне. :shy2: Скачаю хоть посмотреть.

Dimon157
16.08.2007, 14:51
Реально стоит. Перепробовал штук 6 разных ide. Eclipse рулит однозначно. См. скрин: нажал на комментарий справа и сразу перешел на нужное место.

segrix
16.08.2007, 17:24
Хочу начать разбираться с Питоном...
Народ, подскажите, пожалуйста, какую функцию Питона я должен применить, чтобы написать "ААА", например, на экране финансового советника где-нибудь.

Blacksun
16.08.2007, 17:58
<div class='quotetop'>Цитата(Dimon_157 * 15.8.2007, 18:33) 195882</div>


1) Качаем Python (http://www.python.org/download/) (10.4Mb)

[/b]

А если он уже установлен на компе ?

Dimon157
16.08.2007, 18:47
Если на компе версия не ниже 2.3 то все ок

2sergix: посмотри тут (http://www.civfanatics.ru/forum/index.php?s=&showtopic=3379&view=findpost&p=195591) и тут (http://www.civfanatics.ru/forum/index.php?showtopic=4090)

NeverMind
16.08.2007, 19:41
<div class='quotetop'>Цитата</div>
нажал на комментарий справа и сразу перешел на нужное место.[/b]
Действительно, уже только из-за этого стоит попробовать, убедил. :yes:

protonicus
14.10.2008, 13:51
пытался сделать что бы при создании юнита создавался такой же с помощью питона.
пока в оригинальном assets (так что с import все в порядке должно быть)

в файле CvEventManager.py нашел две функции, которые как я понял срабатывают при создании юнита:
onUnitCreated(self, argsList) - событие для юнита
onUnitBuilt(self, argsList) - событие для города.

добавил в них строчки вызова создания юнита (как я понял из cvUtils.py) CvUtil.spawnUnit(iUnit, pPlot, pPlayer)
[code]
def onUnitCreated(self, argsList):

Dimon157
15.10.2008, 04:23
логи включены? что говорят?

protonicus
15.10.2008, 15:20
какие логи?
если внутриигровые то в них вообще про это ничего не говорится.
а другие я ** как включить

в этом смысле я даже не могу поверить что в переменных хранится :(
это мой первый опыт в питоне для цивы

наверно нада с hello world начать выводом на игровой экран

NeverMind
20.10.2008, 12:07
Включи логи в CivilizationIV.ini. Потом они появятся в папке Logs в My Games (или там, куда переносятся CustomAssets).

Dimon157
20.10.2008, 16:58
2Protonicus: вот как я питон с нуля осваивал - почитай эту (http://www.civfanatics.ru/forum/index.php?showtopic=3379) тему.

protonicus
21.10.2008, 02:01
ура!
включил логи - ошибка была в том что я писал City и Player,
всесто city и player. Старая сишная заковырка.

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

Dimon157
21.10.2008, 14:23
Избранная статья на Википедии
http://ru.wikipedia.org/wiki/Python

Dimon157
24.10.2008, 13:32
Эмпирическим путем пришел к выводу что лучше использовать gc.get... чем Py...
Пример1:
gc.getMissionInfo - работает
PyInfo.MissionInfo - не работает
Пример2:
gc.getPlayer - работает
PyPlayer - работает, но некорректно

К тому же gc.get... задокументирован, в отличие от Py...

Moonlight Shadow New
10.09.2009, 17:08
Знатоки питона, скажите пожалуйста какой смысл несет параметр bRecalculate (булевское значение, используется в нескольких функциях)

NeseryozniyVET
10.09.2009, 17:38
<div class='quotetop'>Цитата(Moonlight Shadow New * 10.9.2009, 16:08) 306497</div>
Знатоки питона, скажите пожалуйста какой смысл несет параметр bRecalculate (булевское значение, используется в нескольких функциях)[/b]Булевские переменные обично используются в качестве разрешений на использование какого либа кода. Но для подробного ответа надо название файла

swan
10.09.2009, 18:03
Булевые значения принимают варианты либо 0 - false (ложное), либо 1 - true (истинное) - применение булевых значений у функций зависит от ситуации - чаще всего разрешение или запрет, но иногда не только это

Gesse
23.09.2009, 20:37
Такой вопрос, как определить тип улучшения (feature) на заданной клетке ? Какая функция за это отвечает ?

P.S. Вопрос снят, уже разобрался :)

Blacksun
24.09.2009, 11:37
<div class='quotetop'>Цитата(Gesse * 23.9.2009, 20:37) 308121</div>

Такой вопрос, как определить тип улучшения (feature) на заданной клетке ? Какая функция за это отвечает ?

P.S. Вопрос снят, уже разобрался :)
[/b]

Мог бы и написать... КАК ?

Gesse
24.09.2009, 12:57
Да там все элементарно :)
Я просто не знал как точно функция называется, для запроса типа улучшения.
Допустим нам нужно узнать тип улучшения на клетке с координатами x и y
тогда мы пишем:


thisPlot = CyMap().plot(iX,iY)
iFeature = gc.getInfoTypeForString(thisPlot.getFeatureType())

и для вывода инфы на экран:
[code]
CvUtil.pyPrint(&#39;feature type is&#39;

Dimon157
15.11.2009, 11:22
Хочу предупредить что при установке Eclipse+PyDev версию PyDev стоит брать 1.3.23, а не новую, поскольку в новой может не работать outline.

Igor3
15.12.2009, 17:50
Cod:
self.recon[unit.getID()] = (unit,plot.getX(),plot.getY())

Вопрос: что записывается в "unit"? Ведь unit.getID() не тоже что и unit?

Как узнать есть ли ещё у Плеера(2) юнит с ID=1216257, не убит ли он или т.п.?

Спасибо за ответы. :bye:

NeseryozniyVET
15.12.2009, 20:04
<div class='quotetop'>Цитата(Igor3 * 15.12.2009, 17:50) 318017</div>

Cod:
self.recon[unit.getID()] = (unit,plot.getX(),plot.getY())

Вопрос: что записывается в "unit"? Ведь unit.getID() не тоже что и unit?

Как узнать есть ли ещё у Плеера(2) юнит с ID=1216257, не убит ли он или т.п.?

Спасибо за ответы. :bye:
[/b]
unit - указатель на конкретный юнит в игре
unit.getID() - порядковый индекс юнита в файле Assets\XML\Units\CIV4UnitInfos.xml (тип юнита:танк, мечник, лучник и т.д.)

Igor3
16.12.2009, 20:54
<div class='quotetop'>Цитата</div>
unit.getID() - порядковый индекс юнита в файле Assets\XML\Units\CIV4UnitInfos.xml (тип юнита:танк, мечник, лучник и т.д.) [/b]

(тип юнита:танк, мечник, лучник и т.д.) - Тип юнита выдаёт Int getUnitType.
C этим .getID() основная засада :huh1: - я думал, что это уникальный номер юнита в игре. Всё таки, что эта функция выдаёт?



CvUtil.pyPrint("unit %s %s %d %d autorecon execute %d %d" %(unit, player.getUnit(unit.getID()), unit.getID(), ARunit, x, y))

Логи:
<div class='quotetop'>Цитата</div>
PY:unit <CvPythonExtensions.CyUnit object at 0x28778E68> <CvPythonExtensions.CyUnit object at 0x184F3B58> 114689 114689 autorecon execute 81 35[/b]

Можно ли "unit" представить в виде числа, если это уникальный номер игрока в игре?

NeseryozniyVET
16.12.2009, 21:43
unit.getID()
мне кажется что:
unit - это указатель или ссылка на класс. Задается в 16-ричной системе
getID() - метод класса unit. Если он возвращает не тип юнита, тогда, может, индекс юнита в игре.

Lilit09304
18.04.2010, 14:54
Помогите разобраться с кодом.

В папку мода /Assets/Python помещаю файл CvEventManager.py, в нём такой код. Смысл в том, чтобы каждый ход сканировалась карта и с определённой вероятностью удаляла ресурс, в данном случае нефть.

[code]def onEndPlayerTurn(self, argsList):

NeseryozniyVET
18.04.2010, 21:59
<div class='quotetop'>Цитата(Lilit09304 * 18.4.2010, 13:54) 333362</div>
Помогите разобраться с кодом.
В папку мода /Assets/Python помещаю файл CvEventManager.py, в нём такой код. Смысл в том, чтобы каждый ход сканировалась карта и с определённой вероятностью удаляла ресурс, в данном случае нефть.
Запускаю игру, и ничего не происходит, такое ощущение, что Цива вообще не читает этот файл. Пробовал вызывать функции из другого PY файла, всё равно не работает. Помогите, пожалуйста, разобраться, что я делаю неправильно.
[/b]Во-первых строчка iGameTurn, iPlayer = argsList для даного кода ненужна (Может эти переменные в другом месте задействованы)
Во-вторых циклы for x in range(1, 123) и for y in range(1, 67) будут перебирать координаты X с 1 до 123 и Y c 1 до 67 это неправильно: координаты начинаются с 0 и заканчуются CyMap().getGridWidth() - 1 и CyMap().getGridHeight() - 1.
В-третих не определена con.iOil. Заменим ее на CvUtil.findInfoTypeNum(gc.getBonusInfo, gc.getNumBonusInfos(), &#39;BONUS_OIL&#39;)
В-четвертых после pCurrent.getBonusType должны быть дужки pCurrent.getBonusType()
В-пятых в pCurrent.setBonusType(NONE) термин NONE скорей всего неправилен. Заменим его на BonusTypes.NO_BONUS или на (-1)

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

[code]

Lilit09304
18.04.2010, 23:08
<div class='quotetop'>Цитата(NeseryozniyVET * 18.4.2010, 20:59) 333407</div>

P.S. если все равно не заработало, то вылажи логи.
[/b]
Спасибо, но всё равно не работает :(

Вот конец файла PythonErr2.log:
[code]load_module CvEventManager
Traceback (most recent call last):

NeseryozniyVET
18.04.2010, 23:33
Заблокируй диезом (#) выражения CyInterface().addImmediateMessage(szText, "") и szText = u"Oil abandoned: %d, %d" %(x,y)

Lilit09304
19.04.2010, 00:32
<div class='quotetop'>Цитата(NeseryozniyVET * 18.4.2010, 22:33) 333421</div>

Заблокируй диезом (#) выражения CyInterface().addImmediateMessage(szText, "") и szText = u"Oil abandoned: %d, %d" %(x,y)
[/b]

Всё равно не помогает. Может, я не в той функции код пишу, или нужны ещё какие-нибудь файлы в папке Assets/Python? Я правильно понимаю, что onEndPlayerTurn вызывается каждый раз после хода игрока? Извините, возможно вопросы глупые, но я только начал разбираться. Заранее спасибо.

NeseryozniyVET
19.04.2010, 01:48
Вот рабочий код[code]

Lilit09304
19.04.2010, 14:00
Спасибо, теперь всё работает!

Lilit09304
24.05.2010, 11:20
Как можно проверить, есть ли у цивилизации определённое чудо света? Скажем, есть ли у игрока iPlayer чудо света BUILDING_EIFFEL_TOWER (для примера). Может быть, у кого-нибудь есть образец кода. Заранее спасибо.

NeseryozniyVET
24.05.2010, 22:57
<div class='quotetop'>Цитата(Lilit09304 * 24.5.2010, 10:20) 336853</div>
Как можно проверить, есть ли у цивилизации определённое чудо света? Скажем, есть ли у игрока iPlayer чудо света BUILDING_EIFFEL_TOWER (для примера). Может быть, у кого-нибудь есть образец кода. Заранее спасибо[/b][code]

Lilit09304
25.05.2010, 13:47
Спасибо!

kabjans
25.05.2010, 14:34
<div class='quotetop'>Цитата(NeseryozniyVET * 19.4.2010, 0:48) 333428</div>[quote]
Вот рабочий код[code]

NeseryozniyVET
25.05.2010, 19:30
Выражение if Game.getSorenRandNum(100, "Gold abandoned") > 99 означает: берм случайное число от 0 до 100 (вроде без последнего числа (100)) и если оно больше 99. Другими словами условие невозможно. Лучше написать: if Game.getSorenRandNum(10000, "Gold abandoned") < 100, тогда это будет 1%.

vfilatov
22.07.2010, 12:26
Подскажите, в чём моя ошибка.
Пытаюсь сделать питон-мод, который для начала просто обрабатывал бы любое событие, например, onBeginActivePlayerTurn.

Структура мода такая:
[code]
%CivDir%

NeseryozniyVET
22.07.2010, 13:26
1) Это не С++ поэтому точку с запятой ставить в конце строчек ненадо
2)заместь f = open("D:\\Temp\\_mod.log", "a") напиши f = open("_mod.log", "w"). Файл сохранится в папке с игрой (там где экзэшник от BtS).
Посмотри как у меня в VetScreenMod&#39;е в CvMainInterface.py сделана запись и чтение файла. (Искать по слову LoadAndSave)

vfilatov
22.07.2010, 13:45
<div class='quotetop'>Цитата(NeseryozniyVET * 22.7.2010, 13:26) 343244</div>

1) Это не С++ поэтому точку с запятой ставить в конце строчек ненадо
2)заместь f = open("D:\\Temp\\_mod.log", "a") напиши f = open("_mod.log", "w"). Файл сохранится в папке с игрой (там где экзэшник от BtS).
Посмотри как у меня в VetScreenMod&#39;е в CvMainInterface.py сделана запись и чтение файла. (Искать по слову LoadAndSave)
[/b]
Про точку с запятой я знаю, но она не мешает, а без неё мне код режет глаз.
Код сохранения рабочий, если его скопировать в отдельный скрипт и запустить, всё отработает нормально.
В VetScreenMod&#39;е сохранение вроде бы также и сделано, через open/write/close


f = open(g_szFileName, &#39;w&#39;)
f.write(text)
f.close()


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

vfilatov
23.07.2010, 14:56
М-да, проблема была в том, что события BeginActivePlayerTurn не существует, я его нашёл в BUG Mod, но там они сами его генерируют. Поэтому у меня ничего и не вызывалось. Стандартное: BeginPlayerTurn.

pashaintel
30.07.2010, 20:04
Давно хотел спросить у специалистов. Можно ли как нибудь в питоне вызвать функцию из длл,если она не прописана в Су-файлах. К примеру, в Су.City есть только getBonusGoodHappiness(), а changeBonusGoodHappiness(int iChange) прописана только в Cv.City, в Cy.City её нет. Так вот,как бы её использовать без редактирования длл, а то пакет СДК больно неохота опять ставить.

NeseryozniyVET
30.07.2010, 20:44
<div class='quotetop'>Цитата(Пашок * 30.7.2010, 19:04) 344547</div>
Давно хотел спросить у специалистов. Можно ли как нибудь в питоне вызвать функцию из длл,если она не прописана в Су-файлах. К примеру, в Су.City есть только getBonusGoodHappiness(), а changeBonusGoodHappiness(int iChange) прописана только в Cv.City, в Cy.City её нет.[/b]В птоне можно вызвать только функции прописаные в CyCityInterface1.cpp

freeman23
22.11.2010, 20:26
Доброго времени суток!
Возникла проблема, но как ни бился, ничего не выходит. Если жива еще тема и спецы, может кто подскажет?!

Цель: добавить возможность разрушать свои города в BTS
Реализация: ничего умнее не придумал, как в момент переименования города проверить имя, если оно равно 0 (ноль), то вызывать функцию kill.
Код из CvEventManager.py :


def __eventEditCityNameApply(self, playerID, userData, popupReturn):
'Edit City Name Event'
iCityID = userData[0]
bRename = userData[1]
player = gc.getPlayer(playerID)
city = player.getCity(iCityID)
cityNameOld = city.getName()
cityName = popupReturn.getEditBoxString(0)

if (cityName == "0"):
if (city.getPopulation() < 4 and not city.isCapital()):
message = "You have destroyed the city of %s!!!" %(cityNameOld,)
CyInterface().getHeadSelectedCity().kill()
CyInterface().addImmediateMessage(message,"AS2D_BOMBARDED")
#gc.getActivePlayer().raze(city)
else:
if (len(cityName) > 30):
cityName = cityName[:30]
city.setName(cityName, not bRename)

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

1. Подскажите, может есть какая-то функция синхронизации...
2. gc.getActivePlayer().raze(city) тоже не работает... мало того, через 10 ходов владения городом city.canRaze становится false и функция raze не отрабатывает. до 10 ходов все ОК!
3. Ну и если совсем не лень, как можно было бы оформить данное решение более эстетично. CheckBox какой-нить повесить или кнопку в меню города? Примерчик бы.

NeseryozniyVET
23.11.2010, 08:18
Могу только на третий ответить. Там есть кнопка в верхнем правом углу экрана города. CvMainInterface.py
http://www.civfanatics.ru/threads/7425-Vet-Screen-Mod-2.4/page7

NeseryozniyVET
23.11.2010, 14:05
Вот случайно нашел, может то что ты ищешь. CyGame().isPitbossHost() во всех случаях что мне встречались имеет вид


if (CyGame().isPitbossHost()):
return

Везде используется для прерывания выполнения активных функций.

freeman23
25.11.2010, 01:09
Вот случайно нашел, может то что ты ищешь. CyGame().isPitbossHost() во всех случаях что мне встречались имеет вид


if (CyGame().isPitbossHost()):
return

Везде используется для прерывания выполнения активных функций.

Спасибо, но это совсем не то :(
Мне нужно не прервать функцию, а выполнить полностью и передать изменения серверу...

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

raZor_2009
01.05.2011, 14:56
я сейчас делаю мод earth1200AD, с количеством игроков разобрался, теперь мне нужно сделать так, чтобы страны появлялись в разное время. Какие файлы Python надо импортировать в Consts.py, чтобы это все заработало?

Oni15rus
18.05.2011, 00:39
Здравствуйте!Нужна подсказка как перекинуть державы и некоторых лидеров из одного мода в другой?А именно в Rise of Mankind из Thomas War.Заранее спасибо!!!

NeseryozniyVET
18.05.2011, 20:40
Здравствуйте!Нужна подсказка как перекинуть державы и некоторых лидеров из одного мода в другой?А именно в Rise of Mankind из Thomas War.Заранее спасибо!!!это надо XML файлы править. Их много и работы минимум на день. Если есть желание целый день нудной работой заниматся объясню как делать.

NeseryozniyVET
19.05.2011, 02:46
Дружище объясни как перекинуть.Мне не лень!
Цивилизации задаются в файле мод\Assets\XML\Civilizations\CIV4CivilizationInfos.xml (описание каждой цивилизации начинается <CivilizationInfo> и заканчивается </CivilizationInfo>)
ссылки тэгов начинающиеся на TXT_KEY_ находятся в файлах папки мод\Assets\XML\Text
ссылка тэга <DefaultPlayerColor> находится в файле мод\Assets\XML\Interface\CIV4PlayerColorInfos.xml, а там ссылки на файл мод\Assets\XML\Interface\CIV4ColorVals.xml
ссылка тэга <ArtDefineTag> находится в файле мод\Assets\XML\Art\CIV4ArtDefines_Civilization.xml
значение тэга <ArtStyleType> задается в мод\Assets\XML\GlobalTypes.xml в тэге <ArtStyleTypes> и используется в файлах мод\Assets\XML\Buildings\CIV4CityLSystem.xml и мод\Assets\XML\Buildings\CIV4PlotLSystem.xml. В этих же файлах могут используются (для дворца или других построек) значения тэга <LSystem> из файла мод\Assets\XML\Art\CIV4ArtDefines_Building.xml
ссылка тэга <UnitArtStyleType> находится в файле мод\Assets\XML\Civilizations\CIV4UnitArtStyleTypeInfos.xml


Лидеры задаются в файле мод\Assets\XML\Civilizations\CIV4LeaderHeadInfos.xml
ссылки тэгов начинающиеся на TXT_KEY_ находятся в файлах папки мод\Assets\XML\Text
ссылка тэга <ArtDefineTag> находится в файле мод\Assets\XML\Art\CIV4ArtDefines_Leaderhead.xml

Здания задаются в файле мод\Assets\XML\Buildings\CIV4BuildingInfos.xml
ссылки тэгов начинающиеся на TXT_KEY_ находятся в файлах папки мод\Assets\XML\Text
ссылка тэга <Class> находится в файле мод\Assets\XML\Buildings\CIV4BuildingClassInfos.xml
ссылки тэга <ArtDefineTag> находится в файле мод\Assets\XML\Art\CIV4ArtDefines_Building.xml и используется в файле мод\Assets\XML\Buildings\CIV4CityLSystem.xml

Юниты задаются в файле мод\Assets\XML\Units\CIV4UnitInfos.xml
ссылки тэгов начинающиеся на TXT_KEY_ находятся в файлах папки мод\Assets\XML\Text
ссылка тэга <Class> находится в файле мод\Assets\XML\Units\CIV4UnitClassInfos.xml
ссылки тэга <UnitMeshGroup> находится в файле мод\Assets\XML\Art\CIV4ArtDefines_Unit.xml

3D Модэли и кнопки находятся в папке мод\Assets\Art

Oni15rus
19.05.2011, 16:59
А поподробнее нельзя?Например нужно перебросить державу Аргентину.Что и как делать?И например лидера Филиппа второго котоый есть у Испании в Thomas War и его нет у них в Rise of Makkind.В какие папки и тексты заходить?

NeseryozniyVET
19.05.2011, 20:37
А поподробнее нельзя?Например нужно перебросить державу Аргентину.Что и как делать?И например лидера Филиппа второго котоый есть у Испании в Thomas War и его нет у них в Rise of Makkind.В какие папки и тексты заходить?Открой файл CIV4CivilizationInfos.xml и найди там Аргентину (скорей всего надо искать по слову ARGENTINA) и перенеси в соответствующий файл в другом моде. Потом запомни все названия ссылок тэгов начинающиеся на TXT_KEY_, это текстовые названия и описания, их тоже надо будет переносить из соответствующих файлов. Там же указаны лидеры, уникальные юниты, уникальные здания и стартовые технологии. По ссылке тэга <ArtDefineTag> в файле CIV4ArtDefines_Civilization.xml указаны адреса кнопок и 3D модэлей.
То же самое надо проделать и с цветом, лидерами, юнитами и зданиями.

Oni15rus
19.05.2011, 21:35
Первое я сделал.Но вот где эти TXT брать?

NeseryozniyVET
19.05.2011, 22:57
Первое я сделал.Но вот где эти TXT брать?ссылки тэгов начинающиеся на TXT_KEY_ находятся в файлах папки мод\Assets\XML\Text

Oni15rus
19.05.2011, 23:03
В этой папке Text все файлы называются по-разному.В другом моде та-же картина.

NeseryozniyVET
20.05.2011, 00:00
В этой папке Text все файлы называются по-разному.В другом моде та-же картина.В этой папке названия файлов не имеют значения, так что желательно создать свои файлы.

idler
18.07.2011, 21:13
Ув. Гуру.
Немного пытаюсь разобраться в принципах питонного скриптования, основной вопрос, как правильно отлаживать питон скрипты для civ4? Хотябы смотреть значения интересующих переменных в процессе выполнения скрипта.
Как редактор использую Eclipse, не получится ли его в качестве дебагера использовать?

NeseryozniyVET
19.07.2011, 00:29
Немного пытаюсь разобраться в принципах питонного скриптования, основной вопрос, как правильно отлаживать питон скрипты для civ4?
В папке Мои Документы/My Games/BeyondTheSword найти файл CivilizationIV.ini, открыть его.
Убедиться, что в нем проставлены следующие значения: LoggingEnabled = 1 (по умолчанию там 0). Сохранить.
В Мои документы\My Games\Beyond the Sword\Logs\PythonErr.log будут указаны ошибки.

Хотябы смотреть значения интересующих переменных в процессе выполнения скрипта.В файле Assets\Python\Screens\CvMainInterface.py функцией screen.setLabel или screen.setText

idler
20.07.2011, 09:37
Большое спасибо, вроде сдвинулся :).
А HAP Debugger не получится задействовать? Читал, что должен работать на релизе 1.52, но что-то не очень хочет.

Rigel
16.03.2015, 13:12
Давненько тема не обновлялась :(
Ну понадеюсь на "а вдруг" )

Может кто подсказать как в питоне сделать бонус/штраф к силе юнита в зависимости от наличия в текущем и смежных стеках союзных или вражеских юнитов. Ну просто для примера:
Если наши, скажем 5 юнитов, окружили одного вражеского, то они имеют бонус к силе +50%.

Хочется наконец реализовать пользу от крупных группировок войск и от окружений.

Ramzay1945
08.07.2015, 19:05
Если тема еще живая - кто-нибудь, подскажите.
Возможно ли через питон сделать ивент, который зоздает новое государство из старого и его вассалов. Например, если за Польшу завассалить Литву, что бы создать Речь-Посполиту.
И заодно, создание нового государства, если количество городов старого превышает определенное число, например, если Московское царство или Новгород насоздавали больше 15 городов - образуется Россия.
Хотелось бы знать для начала, есть ли такая возможность?

Мюрат
27.07.2015, 16:18
Если тема еще живая - кто-нибудь, подскажите.
Возможно ли через питон сделать ивент, который зоздает новое государство из старого и его вассалов. Например, если за Польшу завассалить Литву, что бы создать Речь-Посполиту.
И заодно, создание нового государства, если количество городов старого превышает определенное число, например, если Московское царство или Новгород насоздавали больше 15 городов - образуется Россия.
Хотелось бы знать для начала, есть ли такая возможность?
Только через СДК, и то большие проблемы со сменой государств. На начало партии прописано кол-во стран и их состав, в том же RFC моде все страны есть изначально, просто не имеют юнитов на карте. Если только прописывать скрипт с переходом городов к новой стране при определенных условиях, но она должна быть на карте сценария. Флаги для страны тоже менять нельзя, ну по крайней мере никто не решил эту проблему из мододелов.

Ramzay1945
03.08.2015, 16:52
Кто-нибудь занимается интерфейсом?
Есть ли возможность через питон добавить ползунок в список цивилизаций с очками с правой стороны экрана?
Просто на низких разрешениях экрана если количество цив превышает 28, то они перекрывают кнопки в правом верхнем углу.
Прокручивать список цив в данном случае было бы просто верхом удобства)

Ostap352
03.08.2015, 17:40
Кто-нибудь занимается интерфейсом?
Есть ли возможность через питон добавить ползунок в список цивилизаций с очками с правой стороны экрана?
Просто на низких разрешениях экрана если количество цив превышает 28, то они перекрывают кнопки в правом верхнем углу.
Прокручивать список цив в данном случае было бы просто верхом удобства)

Реализовано на civforum.de. Глянь в этом моде http://civ.zulan.net/misc/PB_Mod_v4.zip

Ostap352
03.08.2015, 17:43
Если тема еще живая - кто-нибудь, подскажите.
Возможно ли через питон сделать ивент, который зоздает новое государство из старого и его вассалов. Например, если за Польшу завассалить Литву, что бы создать Речь-Посполиту.
И заодно, создание нового государства, если количество городов старого превышает определенное число, например, если Московское царство или Новгород насоздавали больше 15 городов - образуется Россия.
Хотелось бы знать для начала, есть ли такая возможность?

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

Ostap352
03.08.2015, 17:46
Давненько тема не обновлялась :(
Ну понадеюсь на "а вдруг" )

Может кто подсказать как в питоне сделать бонус/штраф к силе юнита в зависимости от наличия в текущем и смежных стеках союзных или вражеских юнитов. Ну просто для примера:
Если наши, скажем 5 юнитов, окружили одного вражеского, то они имеют бонус к силе +50%.

Хочется наконец реализовать пользу от крупных группировок войск и от окружений.

Сделано в CaveMan2Cosmos. Скомпилировать отдельную длл не получается.

Ramzay1945
04.08.2015, 23:37
Реализовано на civforum.de. Глянь в этом моде http://civ.zulan.net/misc/PB_Mod_v4.zip

Отлично, адаптировал)
только не нравится одно, в стандартном интерфейсе за списком был фон. Здесь за списком фона нет. Как можно добавить за список какой-нибудь фон, что бы буквы не сливались объектами на карте?

Ostap352
05.08.2015, 08:36
Отлично, адаптировал)
только не нравится одно, в стандартном интерфейсе за списком был фон. Здесь за списком фона нет. Как можно добавить за список какой-нибудь фон, что бы буквы не сливались объектами на карте?
Посмотрел в БТС. Нету никакого фона... В RTW тоже не наблюдается... Поищу в графических модах на ихфанатиках, если те уже открылись... :(

Ramzay1945
05.08.2015, 09:35
Посмотрел в БТС. Нету никакого фона... В RTW тоже не наблюдается... Поищу в графических модах на ихфанатиках, если те уже открылись... :(

Как доберусь до игры - сделаю скрин, тогда будет ясно, что именно я имел ввиду)

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

http://media.moddb.com/images/mods/1/27/26711/civ4screenshot0153.1.jpg
http://media.moddb.com/images/mods/1/27/26711/1.jpg

Ostap352
05.08.2015, 17:36
Как доберусь до игры - сделаю скрин, тогда будет ясно, что именно я имел ввиду)

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

http://media.moddb.com/images/mods/1/27/26711/civ4screenshot0153.1.jpg
http://media.moddb.com/images/mods/1/27/26711/1.jpg

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

Ramzay1945
06.08.2015, 12:41
Попробовал. Получается, ползунов есть, увеличивать/уменьшать список можно, но фон неизменен. Даже если выключить отображение лидеров, фон все равно будет светиться. Висеть в воздухе...

не думаю, что он будет серьёзно мешать мне) можете скинуть?

Хитрец
06.08.2015, 12:50
Давно, я видел твой мод , Рамзай. Но я не думал, что он так разовьётся. Спасибо большое!

Не могу придумать никнейм
25.11.2015, 17:29
def listOfCitiesBeforeTheWar(self):
listOfCitiesBeforeTheWar = {}
for iPlayer in range(gc.getMAX_PLAYERS()):
for mCity in PyPlayer(iPlayer).getCityList():
tCities = (mCity.GetCy().getX(), mCity.GetCy().getY())
city = gc.getMap().plot(tCities[0], tCities[1]).getPlotCity()
iOwner = city.getOwner()
owner = gc.getPlayer(iOwner)
if not gc.getTeam(owner.getTeam()).isAtWar(gc.getPlayer(iPlayer).getTeam()):
listOfCitiesBeforeTheWar= {iPlayer: tCities}
return listOfCitiesBeforeTheWar

Просто скажите: почему он возвращает только нулевой элемент? В данной ситуации ассоциативный массив очень важен.

Ostap352
25.11.2015, 17:38
def listOfCitiesBeforeTheWar(self):
listOfCitiesBeforeTheWar = {}
for iPlayer in range(gc.getMAX_PLAYERS()):
for mCity in PyPlayer(iPlayer).getCityList():
tCities = (mCity.GetCy().getX(), mCity.GetCy().getY())
city = gc.getMap().plot(tCities[0], tCities[1]).getPlotCity()
iOwner = city.getOwner()
owner = gc.getPlayer(iOwner)
if not gc.getTeam(owner.getTeam()).isAtWar(gc.getPlayer(iPlayer).getTeam()):
listOfCitiesBeforeTheWar= {iPlayer: tCities}
return listOfCitiesBeforeTheWar

Просто скажите: почему он возвращает только нулевой элемент? В данной ситуации ассоциативный массив очень важен.

Вроде код адекватный. Лог питона есть?

Не могу придумать никнейм
25.11.2015, 17:40
Лога с собой нет, но он выглядел что-то вроде {0: (12, 45)}

Не могу придумать никнейм
25.11.2015, 17:50
Обыкновенный же массив возвращает все, как положено, но мне-то нужно связать эти две переменные, а это возможно только через ассоциативный массив.

Не могу придумать никнейм
28.11.2015, 18:39
Можно ли средствами питона сохранить массив таким образом, чтобы после завершения программы он остался сохраненным? Попытка записать его в файл не увенчалась успехом, либо же я что-то не так делаю. Если же это второй случай, то наверняка же существует записать его туда нормальным образом. Желательно, чтобы этот файл создавался в директории мода, а не где попало.

Ostap352
28.11.2015, 18:59
Можно ли средствами питона сохранить массив таким образом, чтобы после завершения программы он остался сохраненным? Попытка записать его в файл не увенчалась успехом, либо же я что-то не так делаю. Если же это второй случай, то наверняка же существует записать его туда нормальным образом. Желательно, чтобы этот файл создавался в директории мода, а не где попало.
Какой программы? Питон нормально редактируется даже блокнотом.

Не могу придумать никнейм
28.11.2015, 19:13
Ну так цивы. Редактирование кода тут не при чем. Мне нужна база данных, которой будет являться файл, созданный через питон функцией file().

Не могу придумать никнейм
28.11.2015, 19:22
Все, я знаю.

Не могу придумать никнейм
30.11.2015, 12:01
Не знаю уж, где спросить... если на карте имеются скажем 100 цивилизаций, игра сильно будет тормозить?

Defender
30.11.2015, 14:49
Не знаю уж, где спросить... если на карте имеются скажем 100 цивилизаций, игра сильно будет тормозить?

Зависит от мощности компа / размера карты / настроек графики.

Для примера: 4 ГБ оперативы, 29 цивилизаций (включая меня и варваров), размер карты: "Большая", графика: "Высокая", 4Х сглаживание, анимация отключена.
Ходы ИИ на поздних этапах игры занимают около полминуты (мб даже поменьше), тормозов нет. Если к этому добавить анимацию, появляются заметные тормоза.