Current time: 27.11.2024, 13:23 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Python-скрипты для Героев
Author Message
Sav Offline

Posts: 2180
Post: #1

Некоторое время назад, после того как я узнал о существовании 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.
(This post was last modified: 19.10.2011 22:32 by Sav.)
18.10.2011 23:41
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #2

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

Потом ещё требует MSVCP90.dll и MSVCR90.dll.
(This post was last modified: 19.10.2011 00:23 by etoprostoya.)
18.10.2011 23:59
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #3

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

Кстати, никто не знает способа, как можно было бы эти dll'ки слить в одну, чтобы всё равно они нормально вызывались? Наверное, некритично, но, получается, целый зоопарк dll'ек вырисовывается. Sm
19.10.2011 00:20
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #4

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
19.10.2011 00:24
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #5

Кстати, может те 22 мегабайта питоновских скриптов в папке "Lib" тоже попытаться сделать библиотекой?
19.10.2011 00:32
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #6

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

etoprostoya Wrote:Кстати, может те 22 мегабайта питоновских скриптов в папке "Lib" тоже попытаться сделать библиотекой?
У меня с ходу не получилось найти, как это сделать, и возможно ли вообще.
Но, по-моему, этим надо будет нормально, заняться, необходимость пихать папку "Libs" в корневой каталог игры как-то напрягает.
19.10.2011 00:58
Find all posts by this user Quote this message in a reply
fireman Offline
Forum Moderators

Posts: 1426
Post: #7

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


Новости по WoG 3.59, ХотА и другим модам.
19.10.2011 16:11
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #8

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

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

Ссылку в первом посте обновил.
(This post was last modified: 19.10.2011 22:39 by Sav.)
19.10.2011 22:38
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #9

Работает! :thumb_up:
20.10.2011 00:02
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #10

Уже хорошо. Sm

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

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

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

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

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

В идеале хорошо бы заменить словарь "triggers_" на соответствующие триггерам декораторы функций, но не знаю, насколько это реально.
20.10.2011 00:52
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #11

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
20.10.2011 15:30
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #12

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

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


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

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

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

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

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

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


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

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

Как с кампаниями - не знаю. Просто не обладаю информацией, о том, что там куда сохраняется.
(This post was last modified: 21.10.2011 23:51 by Sav.)
21.10.2011 23:51
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #13

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


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
27.10.2011 16:17
Visit this user's website Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #14

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

http://www.ibiblio.org/gferg/ldp/GCC-Inl...HOWTO.html
27.10.2011 17:27
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #15

GhostManSD, для реализации триггеров мне же надо вызвать Python-скрипт из C++ библиотеки (это embedding, а не extending).
А для реализации ресейверов, конечно, потребуется экспортировать функции, структуры и объекты в Python.
(This post was last modified: 27.10.2011 17:56 by Sav.)
27.10.2011 17:55
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group