Категории

Язык
Окружение
Область
Интерпретатор
Платформа
ЯП
Проект

30 сентября 2014 г. 11:41 (ред. 30 сентября 2014 г. 14:42)
В начале двухтысячных свет увидела игра испанских разработчиков Severance: Blade of Darkness. Давайте поглядим, что она из себя представляла и как использовала Питон.
У меня дома на полках компьютерного стола разместилось некоторое количество дисков с программным обеспечением и играми. Периодически с дисками приключается ревизия и они уходят, поэтому сейчас на полках их остаётся всего около 30-ти. Вчера вечером мой взгляд упал на эту стопку, и я понял, о чём буду писать в очередной статье.

Эта статья посвящена игре Blade of Darkness и применению в ней Питона. Сразу признаюсь, что игру дальше первого обучающего уровня варваром никогда не проходил, а потому для меня самого остаётся загадкой, как этому диску до сих пор удаётся пережить ревизии. Видимо есть что-то в этой игре. Игре, в которую в те времена невозможно было играть по двум причинам: 1. требовательность к графическому процессору (игра едва ворочалась на первом 3Dfx) и объему оперативной памяти; 2. фактическая невозможность управления персонажем без джойстика.

Пожалуй, достаточно для вступления, айда к обзору.

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


Bin
В этой директории можно увидеть файл динамически связываемой библиотеки, содержащей интерпретатор Питона — python15.dll. Именно с его помощью отрабатывают скрипты, о которых будет рассказано далее. Обратите внимание на его размер — 667,7 кБ — весьма скромно. Это, конечно, не Lua за 275,9 кБ, но вполне по-божески. В этой же директории находятся и другие библиотеки, используемые в скриптах.


Config
Это директория со скриптами конфигурации игры и управления. Ничего особенного.


Data
В основном содержит файлы графического оформления, но встречается и скрипты, назначение которых — локализация игры. Файлы из Data/Menu содержат словари со строками локализации меню и HUD. В Data/ObjIds можно отыскать названия игровых объектов (предметов, оружие и пр.). Основная часть текстов, связанных с уровнями и персонажами находится в Data/Text.


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

Здесь всё: управление камерой, инвентарём и оружием, позиционирование предметов и персонажей, рассчёты физики предметов и частиц, последовательности анимации и кинематографические эффекты, отрисовка элементов ГИП (GUI), конфигурирование сетевой игры и пр. и пр.

В Lib/PythonLib находятся модули Питона. Судя по тому, что здесь есть модули, не использованные в скриптах, здешние модули входили в обычную поставку Питона, то есть, о выборочной сборке речи не идёт.


Maps
Директория содержит уровни игры. Хотите верьте, хотите нет, но уровни тоже сконфигурированы при помощи Питона. Здесь и расстановка объектов, и камера, и диалоги, и музыкальное оформление по районам.


Scripts
Если в Lib лежали составляющие организма игры, то здесь обретается мозг, координирующий действия тех составляющих. Здесь находятся файлы инициализации игровой машинерии. Здесь же можно отыскать сценарии скелетной анимации. Здесь же скрипты, привязывающие звуки к тем или иным анимациям. И прочее, по мелочи.


Stats
Здесь лежит файл CharData.py, отвечающий за характеристики игровых персонажей.


Обзор кода

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

В глаза бросается слабая структурированность проекта. За это говорят и отсутствие разбивки на модули, приводившее к необходимости файлов типа Lib/megaimport.py, и засорение глобального пространства имён (обратите внимание на обилие директив global) со всеми вытекающими из него проблемами быстродействия (см. Lib/Reference.py), и закомментированные, и повторяющиеся куски кода.

Обратите внимание — практически везде используются функции, но функционального программирования как такового здесь почти нет.

А ещё здесь никаким PEP-8 даже не пахнет, в силу того, что он тогда ещё не родился: верблюжий регистр в именах функций, методов, атрибутов, переменных; табуляция и несистематизированные импорты.

Примечательно, что для сохранение игровых данных, используя модуль cPickle.

Для отладки проекта, похоже использовали всё, что попадало под руку: это и классический print, и pdb, и собственное решение, основанный на Bdb класс отладки Bldb (Blade Python debugger).

Для того, чтобы использовать Сишные библиотеки (находятся, как мы помним, в директории Bin), разработчики запускали автогенератор обёрток SWIG (привет Дэвиду Бизли!) и использовали полученный код как есть без прикрас. Нужно ли говорить, что свиговские обёртки без прикрас выглядят довольно страшно.


Послесловие

Этот короткий обзор, конечно, лишь верхушка айсберга. При желании в коде можно отыскать ещё много интересного. Однако моей задачей было показать вам, что и в те теперь уже почти далёкие годы Питон уже использовался для создания игр. И, как видно из примера Blade of Darkness, использоваться он мог совершенно в разных частях игрового приложения.

Предвосхищая вопрос где взять эту фантасмагорию — ссылка на GOG (в Steam игра замечена не была), и модификация этого года, чтобы глаз радовался — Blade of Light.


Играйте в хорошие игры с друзьями, делайте хорошие игры при помощи Python.

P.S.: Джедаем быть хотите? Вам в Lib/cheats.py.