Wake of Gods Forum | Форум Во Имя Богов
Python-скрипты для Героев - Printable Version

+- Wake of Gods Forum | Форум Во Имя Богов (http://wforum.heroes35.net)
+-- Forum: Герои Меча и Магии 3.5 WoG/ERA (/forumdisplay.php?fid=99)
+--- Forum: Моды (/forumdisplay.php?fid=104)
+---- Forum: Теория, идеи, обсуждение (/forumdisplay.php?fid=184)
+---- Thread: Python-скрипты для Героев (/showthread.php?tid=3409)


Python-скрипты для Героев - Sav - 18.10.2011 23:41

Некоторое время назад, после того как я узнал о существовании Boost.python, у меня появилась мысль - прикрутить к Героям интерпретатор Питона, чтобы была возможность писать на нём скрипты, в качестве альтернативы и, в идеале, замены ERM.

На данный момент, фактически, получилось выполнить из игры python-скрипт вообще (т. е. практического значения этот результат почти не имеет, только исследовательское-творческое).
http://dl.dropbox.com/u/21241104/WoG/H3Py.zip

Архив распаковывать в папку с игрой.
В архиве:
- Папка "Lib" - стандартные библиотеки python.
- "boost_python-vc90-mt-1_47.dll" - библиотека boost.python, обеспечивающая связь python с программой.
- "H3Py.era" в "EraPlugins" - собственно, написанная мной dll`ка, из которой и выполняется скрипт.
- "script.py" в "Data\py" - скрипт, который будет выполняться из игры.

В результате работы плагина должно наблюдаться следующее:
При нажатии на ЛКМ на карте приключений выполняется "Data\py\script.py". Потом из результата работы скрипта берётся переменная k (если она не была объявлена в скрипте, то будет вылет с ошибкой), преобразуется в C-шный int и записывается в ERM-переменную v2. После этого выполняется ERM-команда "IF:M^%V2^;", т. е. v2 выводится на экран.

script.py, естественно, можно изменять, в т. ч. и в процессе игры.


Было бы хорошо, если бы кто-нибудь, у кого не установлены Python и Boost.python, протестировал, работает ли это у него так, как я описал. Вроде должно, но я не вполне уверен.


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


P.S. Исходники не выкладываю, т. к. особо нечего. Sm Но если кому-то хочется - дам.


P.P.S. Забыл совсем, - естественно, всё для Эры 1.9.


RE: Python-скрипты для Героев - etoprostoya - 18.10.2011 23:59

Не запускается, требует python27.dll. Есть Python 2.6 и 3.1, если что.

Потом ещё требует MSVCP90.dll и MSVCR90.dll.


RE: Python-скрипты для Героев - Sav - 19.10.2011 00:20

Понятно. Спасибо, как только смогу, добавлю эти dll. А то как-то я забыл вообще про dll в системных папках. Sm

Кстати, никто не знает способа, как можно было бы эти dll'ки слить в одну, чтобы всё равно они нормально вызывались? Наверное, некритично, но, получается, целый зоопарк dll'ек вырисовывается. Sm


RE: Python-скрипты для Героев - Berserker - 19.10.2011 00:24

Sav, молодец, интересная работа.


RE: Python-скрипты для Героев - etoprostoya - 19.10.2011 00:32

Кстати, может те 22 мегабайта питоновских скриптов в папке "Lib" тоже попытаться сделать библиотекой?


RE: Python-скрипты для Героев - Sav - 19.10.2011 00:58

Berserker Wrote:Sav, молодец, интересная работа.
Спасибо. Sm

etoprostoya Wrote:Кстати, может те 22 мегабайта питоновских скриптов в папке "Lib" тоже попытаться сделать библиотекой?
У меня с ходу не получилось найти, как это сделать, и возможно ли вообще.
Но, по-моему, этим надо будет нормально, заняться, необходимость пихать папку "Libs" в корневой каталог игры как-то напрягает.


RE: Python-скрипты для Героев - fireman - 19.10.2011 16:11

Интересная вещь, как раз в инсте питон изучаем, может и я чего-нибудь наскриптую когда-нибудь или под себя нормально изменю


RE: Python-скрипты для Героев - Sav - 19.10.2011 22:38

Добавил python27.dll, msvcp90.dll и msvcr90.dll.
http://dl.dropbox.com/u/21241104/WoG/H3Py.zip

Соответственно, снова просьба - проверить работоспособность. Особенно тем, у кого не установлено всяких программистких штучек, связанных с Python и Visual Studio.

Ссылку в первом посте обновил.


RE: Python-скрипты для Героев - etoprostoya - 20.10.2011 00:02

Работает! :thumb_up:


RE: Python-скрипты для Героев - Sav - 20.10.2011 00:52

Уже хорошо. Sm

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

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

Каждый скрипт из Data\py импортируется как отдельный python-модуль в начале игры (фактически - выполняется). В скрипте должны быть объявлены функции, переменные и т. п. Также в каждом скрипте должен находиться словарь "triggers_", в котором ключом является строка - название триггера, а объектом - список функций, содержащих код этого триггера.

Функция "выполнить триггер" работает так: проходит по всем модулям из Data\py, ищет в "triggers_" каждого ключ, соотвествующий аргументу - названию триггера и выполняет подряд все функции из списка, соответствующего ключу. Если "triggers_" нет или в нём нет соответствующего ключа, в этом модуле ничего не выполняется.

Таким образом допустимо огромное число триггеров, а привязка идёт ислключительно по названию. Многие (а может и все) стандартные триггеры реализуются через события Эры. Новые тоже легко добавляются - нужно просто вызвать функцию запуска триггеров в нужном месте с нужным названием.

В идеале хорошо бы заменить словарь "triggers_" на соответствующие триггерам декораторы функций, но не знаю, насколько это реально.


RE: Python-скрипты для Героев - Berserker - 20.10.2011 15:30

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


RE: Python-скрипты для Героев - Sav - 21.10.2011 23:51

Berserker Wrote:Ещё остаётся проблема сериализации-сохрания-десириализации-загрузки данных модулей, размер этих данных, возможность отгрузки/перезагрузки модулей на лету и другие "мелочи".

Пока придумал вот что:


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

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

При сохранении игры сохраняется код скриптов из оперативной памяти (просто строки: имена файлов и их содержимое), а так же словари данных (скорее всего, при помощи стандартного питоновского модуля "pickle").

При загрузке игры сохранённый код скриптов выполняются (каждый в своём модуле), после этого распаковываются словари данных.

При экспортировании - код скриптов из оперативной памяти записывается в файлы.

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


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

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

Как с кампаниями - не знаю. Просто не обладаю информацией, о том, что там куда сохраняется.


RE: Python-скрипты для Героев - GhostManSD - 27.10.2011 16:17

Sav, не проще написать в boost библиотеку, которая ставит хук на событие, а уже это событие экспортируется как функция в Python? Вот самый простой пример, который я смог найти, но его, кажется, для человека с твоими способностями более чем достаточно: Extending Python with C++.
Вообще, идея благодатная, может упростить скриптописание в разы.
Оффтоп: кому-нибудь известны методы прикручивания ассемблера в код на C++, который будет скомпилирован gcc из MinGW?


RE: Python-скрипты для Героев - etoprostoya - 27.10.2011 17:27

(27.10.2011 16:17)GhostManSD Wrote:  Оффтоп: кому-нибудь известны методы прикручивания ассемблера в код на C++, который будет скомпилирован gcc из MinGW?

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html


RE: Python-скрипты для Героев - Sav - 27.10.2011 17:55

GhostManSD, для реализации триггеров мне же надо вызвать Python-скрипт из C++ библиотеки (это embedding, а не extending).
А для реализации ресейверов, конечно, потребуется экспортировать функции, структуры и объекты в Python.


RE: Python-скрипты для Героев - Sav - 29.10.2011 00:11

Стоит ли сохранять лог ошибок для всех запусков или лучше очищать при каждом?

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

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


И ещё: стоит ли заморачиваться с выводом лога ошибки в игре (как сделано с ошибками ERM)? Мне кажется, достаточно просто сообщения о произошедшей ошибке, но это отчасти продиктовано геморройностью реализации вывода ошибки в игре (в отличие от вывода в файл лога).


RE: Python-скрипты для Героев - GhostManSD - 29.10.2011 00:18

Sav, а как тебе вариант располагать их в отдельной директории с особыми именами?
./python/logs/log-[$date]-[$time].txt

etoprostoya, спасибо!


RE: Python-скрипты для Героев - Sav - 29.10.2011 00:37

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

В принципе, много файлов мне даже больше нравится.


RE: Python-скрипты для Героев - fireman - 29.10.2011 03:51

Sav, а можно сделать опцией?

Надо как-то сообщать об ошибках, как иначе, если не лог в игре?


RE: Python-скрипты для Героев - Sav - 29.10.2011 09:54

fireman Wrote:Sav, а можно сделать опцией?
Что конкретно? Sm
В принципе, что угодно можно, но вещи вроде лога - через правку конфига. Могу, впрочем написать отдельную gui-шку для работы с этим конфигом.

fireman Wrote:Надо как-то сообщать об ошибках, как иначе, если не лог в игре?

Я думаю, в игре можно просто показать сообщение "В скрипте x при срабатывании триггера y произошла ошибка. Подробности смотрите в файле z."
А в файле полный лог, в стандартом для ошибок в питоне виде.


RE: Python-скрипты для Героев - fireman - 29.10.2011 12:32

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

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


RE: Python-скрипты для Героев - Sav - 29.10.2011 12:39

Лог я как раз думаю по-умолчанию включить.

А в игре ошибки можно отображать в системных сообщениях (как чат).


RE: Python-скрипты для Героев - fireman - 29.10.2011 12:41

Sav, как чат, это гениально.

Кстати, а питон скрипты только на вог работать должны или везде, где есть эра?


RE: Python-скрипты для Героев - Sav - 29.10.2011 14:27

К Вогу привязки нет. К Эре, по большому счёту, тоже.

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

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

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

Также, если к тому времени, когда выйдет Хота на базе Эры, эта разработка не потеряет смысла, я переведу её на основу Хоты.


RE: Python-скрипты для Героев - fireman - 30.10.2011 01:58

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


RE: Python-скрипты для Героев - etoprostoya - 30.10.2011 01:59

И бордель устроить, ага.


RE: Python-скрипты для Героев - fireman - 30.10.2011 02:22

etoprostoya, блэкджек и шлюхи, ХотА без них никак, наверно её из-за этого и не выпустили, но питон спасёт.


RE: Python-скрипты для Героев - Sav - 30.10.2011 10:25

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

Конкретно pygame - во-первых, не знаю, совместим ли он питоном 2.7, а во-вторых, не представляю, как интегрировать его элементы в Героев. В отдельном окне должно быть можно запустить, да.


RE: Python-скрипты для Героев - fireman - 30.10.2011 14:23

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


RE: Python-скрипты для Героев - Sav - 31.10.2011 01:13

Сходу прикрутить pygame не вышло. Фэйлит "import pygame" при попытке "from pygame.base import *". Какие-то проблемы при работе со скомпилированной библиотекой base.


RE: Python-скрипты для Героев - GhostManSD - 31.10.2011 14:17

pygame не нужен. Можно мини-игры не хуже реализовать, если написать Pythonic вариант DL. Нам же не нужна там 3D графика, верно?


RE: Python-скрипты для Героев - Sav - 31.10.2011 18:54

Реализовывать real-time мини-игры через DL - это извращение какое-то, если вообще реально.
Правда pygame в отдельном окне - тоже ничего хорошего.

Так или иначе, кроме как "просто скопировать и запустить", у меня не было идей по прикручиванию pygame. Раз уж оно "просто не запустилось", боюсь, от бубна толку будет мало.


RE: Python-скрипты для Героев - GhostManSD - 01.11.2011 01:45

(31.10.2011 18:54)Sav Wrote:  Реализовывать real-time мини-игры через DL - это извращение какое-то, если вообще реально.
Если в ФМ всякие новые красивые менюшки реализованы через DL, то имеет смысл запилить.


RE: Python-скрипты для Героев - Sav - 01.11.2011 10:04

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


RE: Python-скрипты для Героев - Berserker - 01.11.2011 15:54

Переходники к ерм функциям? Огромная работа, игра не стоит свеч.


RE: Python-скрипты для Героев - Sav - 01.11.2011 20:03

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


RE: Python-скрипты для Героев - Berserker - 01.11.2011 21:08

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


RE: Python-скрипты для Героев - Sav - 01.11.2011 22:16

А будет ли тогда смысл во всём этом? Если всё всё равно делается командами erm, то спорный вопрос, что большее зло - erm`овские индексы, неудобные циклы и т. п. или геморрой со словарём триггеров, с вызовом ExecErmCmd (причём абсолютно для любого взаимодействия с Героями) и связи с ним через erm-переменные. Только для питона придётся ещё качать 20 метров стандартных библиотек и засорять корневой каталог кучей dll`ек и папкой Lib.
Конечно, можно написать виртуальные классы, со свойствами, вызывающими ExecErmCmd, для эмуляции геройских структур (это, в общем-то, не сложно на питоне, к тому же даже реверса не потребуется никакого), но это решение мне не очень нравится.

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

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


RE: Python-скрипты для Героев - Sav - 01.11.2011 23:00

Уфф, встроил наконец-то ExecErmCmd. Sm

Вопрос: есть ли смысл встраивать остальные функции Эры? В принципе, теперь не проблема, но многие из них в питоне будут малополезны.


RE: Python-скрипты для Героев - Berserker - 01.11.2011 23:01

Что значит всё? ЕРМ-переменные используются только как посредники между итоговым кодом и ЕРМ. Суть динамического языка в лёгкости отладки (например, просмотр любых данных в консоли), загрузке/отгрузке и возможности редактировать код прямо на лету (нет стадии компиляции). Иначе берём компилируемый язык + вызываем ExecErmCmd для команд. Не для циклов, не для логики, не для хранения данных.

Sav, сделай механизм универсального вызова машинных функций. В ЕРМ-то аналог есть.


RE: Python-скрипты для Героев - Sav - 02.11.2011 17:59

Berserker Wrote:Что значит всё?
Это про "А будет ли тогда смысл во всём этом?" или "Если всё всё равно делается командами erm"? Sm

Если про второе: всё - значит любая связь с игрой: взятие каких-либо данных из игры, запись их в игру, вызовы игровых функций.


Berserker Wrote:ЕРМ-переменные используются только как посредники между итоговым кодом и ЕРМ.
Да, но с учётом того, что ExecErmCmd придётся использовать постоянно, с erm-переменными тоже придётся взаимодействовать постоянно. Просто неудобно: мало того, что надо производить действия через ExecErmCmd, так ещё и параметры пихать в erm-переменные для этого надо и результаты забирать оттуда. Отсюда возникает вопрос: а не нафиг ли это, не лучше ли просто писать всё на erm, пусть у него есть свои минусы?


Berserker Wrote:Суть динамического языка в лёгкости отладки (например, просмотр любых данных в консоли), загрузке/отгрузке и возможности редактировать код прямо на лету (нет стадии компиляции).
Всё это всё равно в той или иной степени есть в ERM (с Эрой 1.9) и в питоне (не знаю как получится с консолью, но запись данных в файл и там, и там есть).

Berserker Wrote:Не для циклов, не для логики, не для хранения данных.
Но эти вещи тоже нужны. Они не являются аргументом против компилируемых языков (я с ними, кстати, вообще не сравнивал), но являются аргументами против ERM.

Berserker Wrote:Sav, сделай механизм универсального вызова машинных функций. В ЕРМ-то аналог есть.
А зачем, если можно вызвать SN:E через ExecErmCmd? Sm

Но если серьёзно - попытаюсь сделать.


RE: Python-скрипты для Героев - Berserker - 02.11.2011 18:14

Quote:SN:E
Так это медленно. В том плане, что проходит сперва через ProcessErm. А от машинных функций в циклах нужна скорость.


RE: Python-скрипты для Героев - Sav - 19.11.2011 20:57

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

В связи с этим вопрос: можно ли из dll'ки показывать/скрывать консоль, при этом чтобы именно в этой показываемой консоли был стандартный ввод и вывод? Что-то я, сколько ни парился, не смог сделать этого ни на уровне питона, ни на уровне C.
Запускать отдельную программу - совсем геморройно из-за необходимости передачи специфических данных.


RE: Python-скрипты для Героев - Berserker - 19.11.2011 21:03

AllocConsole/FreeConsole, если под консолью имелась в виду именно консоль.
Функции автоматом ставят SetStdHandle.


RE: Python-скрипты для Героев - etoprostoya - 19.11.2011 21:33

Примерчик.
Code:
AllocConsole();
DWORD Written;
char Buffer[256];
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO BufferInfo;
GetConsoleScreenBufferInfo( hOutput, &BufferInfo );
//SetConsoleTextAttribute( hOutput, (WORD)WHITE );
WriteConsole( hOutput, "Консоль открыта\n", 11, &Written, NULL );
//SetConsoleTextAttribute( hOutput, (WORD)Color16bit );
WriteConsole( hOutput, Buffer, strlen(Buffer), &Written, NULL );
SetConsoleTextAttribute( hOutput, BufferInfo.wAttributes );



RE: Python-скрипты для Героев - Sav - 20.11.2011 00:31

Спасибо.


RE: Python-скрипты для Героев - GhostManSD - 09.03.2012 23:22

Sav, есть какие продвижения?


RE: Python-скрипты для Героев - Sav - 09.03.2012 23:26

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


RE: Python-скрипты для Героев - fireman - 03.01.2013 00:21

А планируется ли справочник в случае удачной прикрутки?


RE: Python-скрипты для Героев - Sav - 03.01.2013 00:42

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

Будет описание того, как этим пользоваться вообще. Если после достаточной готовности проекта им никто не будет пользоваться (а я думаю, так и будет Sm ) - то я, скорее всего, ограничусь импортом функций патчера и функций и триггеров Эры, так что справочник не понадобится.
Ну а если буду добавлять какие-то свои триггеры и функции - конечно, я их документирую. И исходники, думаю, открою. Могу открыть и прямо сейчас, если это кому-то интересно.