Портирование системы частиц Aurora, ч.2 - Spirit Of Half-Life
Продолжаем вспоминать с чего всё начиналось.
GoldSource, после того, как на нём был выпущен Counter-Strike, получил большое обновление и довольно продвинутый сетевой код, что в свою очередь сделало движок пригодным к созданию как синглплеерных так и мультиплеерных игр.
Надо отметить, что для любительского моддинга начала нулевых GoldSource был если не идеальным выбором, то близким к нему, по совокупности характеристик:
- Уже ставший привычным со времён первого Quake процесс создания уровней
- Скелетная анимация, позволявшая делать не условных уродцев, как в первом Quake, а вполне приличных NPC с кучей различных анимаций
- Продвинутая система ИИ, позволявшая монстрам искать укрытия, действовать в составе групп и выполнять скриптовые анимации, т.е. включать в игры кинематографический элемент
- Бесшовная система смены уровней, позволявшая игроку возвращаться туда, где он уже был и находить всё в прежнем состоянии - трупы и декали оставались на местах
- Продвинутый звуковой движок - настройки реверберации, липсинк для NPC, возможность динамически менять параметры звуков
- Наконец, игровой код был написан на C++, вместо ограниченного QC, что, хотя и повышало порог вхождения, но при этом давало возможность очень глубоких модификаций игровых сценариев. Впоследствии это ещё не раз себя проявит
При таком впечатляющем наборе возможностей, движку недоставало ровно одного - настроек кастомизации NPC и больше возможностей для создания игровых сценариев, отличных от родительской игры - Half-Life.
Поначалу, конечно, народ с удовольствием делал "продолжения" приключений Гордона Фримена, но сами понимаете, вскоре захотелось использовать движок для других сюжетов, другого сеттинга, а возможно даже - и для другого жанра.
С оригинальными библиотеками от Valve сделать это было довольно проблематично. Проще говоря, вам всякий раз приходилось редактировать код, чтобы добавить нового NPC или оружие (почему-то чаще всего это был автомат Калашникова).
При очевидном запросе со стороны мододелов рано или поздно должен был появиться соответствующий мод, расширяющий возможности как левел-дизайнеров, так и создателей модов на GoldSource в целом. И он появился под названием Spirit Of Half-Life. Тулкит был тепло встречен сообществом, поскольку предлагал множество новых возможностей.
- Система иерархического связывания объектов (movewith в терминологии Spiritа). Вы могли прикрепить дверь к поезду, кнопку к двери и всё это перемещалось синхронно, соблюдая заданные дизайнером позиции относительно друг друга. Правда иногда могло отстать или застрять, но альтернативы подобной системе всё равно не было.
- Кастомизация NPC - отредактировав буквально пару строчек, вы могли изменить модель NPC и набор фраз, которые он говорит в различных ситуациях (в бою, при ранении, при общении с другими NPC, когда увидит врага, и т.д.). Также вы могли менять общее поведение NPC, делая друзей врагами, а врагов - нейтралами. Была возможность менять матрицу отношений динамически прямо во время игры.
- Система локусов - в определённом смысле отражала концепцию ключевого слова this из C++. Какие-либо эффекты применялись не к цели, имя которой было указано в текстовом поле объекта, а к тому, кто активировал эту цель.
Поясню на примере. В Half-Life был объект env_render, динамически менявший режим рендеринга. К примеру, он мог включить полупрозрачность выбранного объекта. Но, как вы понимаете, это применялось только к объекту, имя которого было задано левел-дизайнером и не могло быть изменено. С системой локусов можно было делать конструкции из триггера и env_render. Таким образом, каждый объект пересёкший триггер, активировал env_render, который применял эффекты на того, кто его активировал. Соответственно, любой предмет, прошедший сквозь триггер, становился полупрозрачным. Конечно, в наше время подобными механиками никого не удивишь, такое элементарно пишется на C# или аналогичном скриптовом языке, но тогда, в 2000-м, особенно после ограниченных возможностей сценариев в Quake, это было в диковинку. - Расширенная система сценариев для NPC. Теперь они могли не просто проиграть выбранную анимацию, а использовать более общие действия, опираясь на свой ИИ. Например, атаковать указанного монстра, вне зависимости от того, где тот находился, либо проложить путь к заданной точке, нажать там на кнопку и ожидать дальнейших действий.
- Ну и наконец, система частиц Aurora. Она появилась уже в финальной версии тулкита и была одним из немногих улучшений, влияющих не на игровые сценарии, а на визуальную составляющую игры.
Разумеется я перечислил здесь далеко не всё. Возможностей было гораздо больше и в целом тулкит был тепло встречен как общемировым, так и русскоязычным сообществом моддеров Half-Life. Но к сожалению, в этой бочке мёда (а как иначе?), обнаружилась и приличная ложка дёгтя.
На момент создания Спирита Laurie Cheers был обычным студентом и язык C++ знал слабо. А может роль сыграла банальная невнимательность и лень, как говорится, кто из нас не без греха? Следствием этого, при определённом сочетании настроек тех или иных возможностей, мы получали выброс исключения и, соответственно, остановку всей игры.
Любопытно, что автор сам знал о части этих проблем и честно предупреждал об этом в документации - мол, вот на такой-то демо-карте, если воспроизвести эффект несколько раз, то вероятно будет вылет. А может и не будет. Как повезёт, в общем.
Так же часть сценариев банально ломалась при смене уровней (в частности, объекты скреплённые movewith), при сохранении и последующей загрузке сохранённой игры, часть возможностей ломала поведение оригинальной Half-Life, из-за чего игра становилась непроходимой (хотя это не то, чтобы многих волновало, но всё же).
Таким образом, как вы уже наверное догадались, в сообществе снова возник запрос на перемены. Spirit of Half-Life нуждался в доведении до стабильного состояния. На автора надежды уже не было, после выхода версии 1.2 (в которой как раз и появилась система частица Aurora), его захантили в Rare (ну или он сам добровольно туда устроился) и дальнейшая разработка была остановлена.
И вот товарищи, с этого момента, можно сказать и начался мой удивительный путь в разработку, было принято поворотное решение. Если бы я тогда рассудил как-то иначе, очень может быть, что спустя примерно полгода, я бы просто переключился на какую-то другую деятельность и к моддингу бы впоследствии уже никакого отношения не имел. И не создал бы ни Xash3D ни Paranoia 2: Savior, ни язык HeadShot, ни находящийся в разработке сейчас XashNT.
Но решение было принято, и решение было довольно простым: раз уж этот Spirit такой глючный, что на его базе невозможно делать игру, постоянно ожидаешь какого-то подвоха, особенно после смены уровней, то кто-то должен его исправить. А раз желающих нет, придётся сделать это самому.
На тот момент я разбирался в программировании ещё хуже, чем автор Спирита. Однако, как выяснилось, врождённое пролетарское чутьё, каким-то непостижимым образом, позволяло мне исправлять баги даже если я не всегда понимал, что именно делаю. К тому же часть багов была уже исправлена (пусть и неидеальным образом) силами сообщества форума Half-Life.ru (ныне почившего). Список багов и их исправлений были собраны в отдельной теме форума, которая впоследствии мне очень помогла сделать первые шаги.
Впрочем, после быстрого исправления всего упомянутого в теме, я оказался в интересном положении - со слабым знанием языка, с кучей багов, посаженных также не слишком опытным автором, и без особого понимания где именно их искать и как исправлять. Как вы понимаете, не существует руководства типа "как исправить чужие ошибки, если вы знаете язык ещё хуже, чем их автор". Потому я и упомянул про пролетарское чутьё. Иначе ничем объяснить тот факт, что я не только правильно локализовывал места ошибок, но и достаточно грамотно их исправлял.
Конечно, исправить удалось далеко не всё. Но тулкит стал в разы стабильнее, прекратились вылеты и глюки после смены уровней. Правда уже тогда во мне проявилось желание не просто исправлять ошибки в чужих проектах, но и пытаться реализовать своё видение тех или иных систем.
То, что я в итоге сделал, получило название "Sprit Custom Build 1.3". Автор оригинального тулкита ознакомился с моей поделкой и дал ряд комментариев относительно проделанной работы. За исправленные баги, разумеется, хвалил, за попытку хоть немного отойти от его концепции - порицал. Мне стало ясно, что на модификации чужих проектов далеко не уедешь и надо создавать свой собственный. Так, 13 декабря 2004-го года и появился бренд Xash. Ну впрочем, это уже совсем другая история.
В своём тулките, я разумеется, позаимствовал некоторые элементы концепции Spirit, в частности систему иерархии объектов, которая была значительно расширена в возможностях. Помимо кастомизации NPC была добавлена возможность создания скриптовых оружий. Впоследствии, когда тулкит был портирован уже на собственный движок Xash3D, там появилась физика и мощный визуал - зеркала, порталы, динамический свет и тени, система растительности, а в очередном Xash Custom Build (по традиции, сделанным сторонним разработчиком) - и бамп-маппинг.
Также, во время работы над Paranoia 2: Savior, мной была исправлена большая порция ошибок оригинального Спирита, которые я попросту не замечал ранее, в 2004-м. Впрочем, выпускать новые кастом-билды Спирита я тоже не забывал и делал это вплоть до 2011-го года. Правда параллельно со мной в этот процесс включились пользователи с официального форума Спирита, но свои релизы они продолжали называть в моем формате - Custom Build и придерживались сквозной нумерации. Для интересующихся могу отметить, что все эти наработки не канули в лету, а по прежнему доступны к скачиванию, например тут. Мои билды, это 1.3, 1.7 и 1.9. Версия 1.8 - вроде бы от Laurie Cheers, версия 1.4 - от пользователей его форума, авторов версий 1.5 и 1.6 уже не вспомню. А кто делал Spirinity я не имею понятия, на тот момент уже не следил за проектом. Однако мы немного отвлеклись.
Можно сказать, менялось и улучшалось практически всё. Кроме одного момента - той самой системы частиц Aurora. У меня с ней связано забавное когнитивное искажение - я считал её полностью рабочей и не требующей никакого вмешательства с моей стороны. В архитектуру и принципы работы тоже не вдавался, внёс лишь три изменения:
- Обнулены переменные классов частиц, создаваемые динамически. Laurie сделать это поленился или забыл, из-за чего частицы иногда себя вели довольно непредсказуемым образом
- Добавлена правильная трансформация частиц в пространстве объекта, к которому они были прикреплены (а также возможность прикреплять их к аттачменту на модели) - благодаря этому, стало возможным делать хвосты от ракет и тому подобные вещи. До моего исправления, система оставалась чисто статичной (мы к этому вернёмся в третьей части)
- Визуализация частиц обновлялась, чтобы соответствовать кастомному рендереру модов XashXT и Paranoia 2: Savior, частицы получили возможность освещения при помощи лайтмап и динамических источников, к ним также применялись глобальныя настройки тумана
Де-факто, Aurora стала стандартом системы частиц для Half-Life. Слишком многие моды на Спирите её использовали. Да и я этому поспособствовал, не пытаясь её переписать или создать альтернативу.
Любопытно, что подобной позиции придерживался не только я, но и тов. XaeroX, автор знаменитого тулкита HLFX. Он не только поддержал эту систему у себя, но и создал к ней визуальный редактор Particle Effects Editor.
Ввиду этой поддержки, сложилась ситуация, когда мне снова потребовалось сохранить с ней совместимость. Конечно я не планирую брать её исходный код к себе в XashNT, достаточно будет лишь написать рантайм-конвертор параметров в формат, понятный нативной системе частиц самого XashNT. Но стоит отметить сам факт, как порой сила привычки и инерция мышления бережно сохраняют и продлевают жизнь пусть и не самым оптимальным концепциям.
Ну а почему я упомянул про неоптимальность концепции, какие именно ошибки были допущены автором в архитектере Aurora, почему многие её возможности система так и не были использованы большинством, мы с вами поговорим в заключительной, третьей части.