Фреймворк и визуальный редактор для квестов на Ren'Py
Привет, Лига!
Появилось свободное время и захотелось мне воплотить давнюю мечту - перенести один из моих придуманных сюжетов в игру. История мрачная, жуткая, отлично подходящая под жанр триллер, а может даже немного и хоррор. Активных действий в ней не так много, зато диалогов и размышлений - тьма. Поэтому было решено взять Ren'Py, вооружиться ИИшками, чтобы были заглушки, на которых можно все тестировать, и начать изучать доселе невиданный мир разработки видеоигр. Нужно оговориться, что бэкграунд у меня довольно посредственный, я бэк-разработчик на питухоне, игрушки раньше не делал, но все бывает в первый раз.
В какой-то момент я задумался. что в рамках новеллы мне тесно, и мне вспомнилась одна из моих любимых игр - The 7th Guest. Квест с видом от первого лица, в котором можно было передвигаться по объемным экранам-сценам, кликать на различные предметы, декорации и головоломки. Затем мне вспомнилась другая не менее значимая ля меня игра - Zero Escape. Визуальная новелла с квестовыми сегментами аля "выберись из комнаты". "Вот оно!" - подумалось мне, буду делать визуальную новеллу с квест сегментами. Геймплей интереснее, история и персонажи все еще во главе всего. Но вот проблема, Ren'Py не поддерживает такого из коробки. Надо было что-то придумать.
И я придумал! Вместо того, чтобы насиловать не предназначенный для этого движок, я начал писать фреймворк на его основе. Ren'Py сам по себе все еще отвечает за визуальную новеллу, а фреймворк отвечает за квестовые сегменты. Разделяй и властвуй! Смысл всего затеянного был в удобстве и универсальности написания квестовых комнат для любого разработчика, именно из этого я исходил, когда начинал его писать. Но давайте от описаний к другим описаниям :D
Главные плюсы:
1) Распределение обязанностей. Для построения квестов существуют такие сущности: квест - это весь сегмент от точки входа до точки выхода(коих может быть много). Комната - это часть квеста, которая олицетворяет собой одно замкнутое(хотя это необязательно) помещение. Сцена - это часть комнаты. Один из экранов, которые могут быть показаны в комнате. Это могут быть и отдельные виды камер, например, на каждую из стен в квадратной комнате, приближение чего-либо или сцена отдельной головоломки. К сцене так же крепятся другие сущности: хотспот - зона взаимодействия мира и мыши, а так же объект - чаще всего пнг-картинка, которая представляет из себя какую-то зону интереса, может быть отображена или скрыта. А к этому всему(хотспотам, объектам, сценам и комнатам) могут быть применены условия и события. Еще два ключевых элемента управления квестом. Пока не устали? Дальше интереснее.
2) Универсальность. Благодаря внутренней структуре разработчики могут писать свои расширения(extension). По умолчанию есть несколько основных условий и несколько основных событий. Например, перейти на другую сцену, добавить предмет в инвентарь, сделать хотспот кликабельным - это примеры базовых событий. А значение флага(еще одного ключевого элемента), выбран ли предмет в руке - это примеры базовых условий. И события, и условия, и даже какие-то новые ключевые элементы разработчик может добавлять с помощью расширений. Достаточно лишь описать его по шаблону в json файле и прописать логику на примитивном пайтоне. Таким образом можно добавить различные поведения для игры: таймеры, счетчики, систему репутации, здоровье, рассудок и прочее-прочее, на что хватит фантазии.
3) Визуальный редактор. Это отдельная гордость. Не нужно больше по несколько часов настраивать квесты с помощью кода, достаточно лишь открыть редактор, сделать все необходимое в нем, сохранить и продолжить писать код новеллы на сценарном языке Ren'Py.
И именно на редакторе хотелось бы остановиться поподробнее и наконец показать, что это, и с чем это едят.
Я ведь говорил про универсальность? Редактор сам по себе является отдельным приложением, написанном на пайтоне с использованием PySide6. Изначально редактор был прямо внутри игры, назывался Developer Mode, но Ren'Py так плохо рендерил большое количество изменяемых объектов, что было принято решение сделать редактор выносным. Открываете редактор - выбираете любой проект, хоть уже существующий, хоть пустой, работаем со всем, что есть. А затем нужно всего лишь уcтановить фреймворк. Как? Очень просто, это уже встроенно в редактор.
Настраиваем пути так, как нужно, выбираем язык, в данный момент или русский, или английский, но любой разработчик может сделать перевод, универсальность же, выбираем разрешение по умолчанию, и айда устанавливать сам фреймворк.
В редактор уже зашит фреймворк, достаточно кликнуть на установить, все необходимые файлы скопируются по необходимым путям и можем наслаждаться разработкой. Далее буду показывать на демонстрационном варианте, на котором все это и разрабатывалось, и тестировалось. Особо чувствительные к ИИ-изображениям, извиняюсь заранее.
И вот мы приступаем к работе. Красные выделены хотспоты, синим - выбранный в данный момент объект. Все хотспоты подписаны, не потеряемся. Разберем кратко интерфейс. К сожалению, менюшек слишком много, а я не UI\UX-дизайнер, чтобы сделать это максимально красиво, поэтому как видим, есть ползунки, менюшки просто листаются вниз-вверх.
Начнем с левого блока:
1) Список квестов
2) Список комнат
3) Список сцен
4)Список флагов(неких состояний, на которых завязаны условия и события)
Правый блок:
5) Инспектор, показывающий нам свойства выбранного хотспота или объекта
6) Список объектов, находящихся на выбранной сцене с возможностью добавлять\редактировать\дублировать и ставить один объект выше другого(какой из них на каком плане находится)
7) Список хотспотов с возможностью переименования, удаления или добавления вершин. Да, забыл упомянуть, хотспот - это некий полигон, состоящий из соединенных вершин.
8) Настройка условий активности(кликабельности) и видимости хотспота и только видимости у объекта. Сами объекты не являются кликабельными.
9) Настройка взаимодействия хотспота - главная магия алгоритмов.
Переключим сцену на table_closeup, то есть "Стол крупным планом". В самой игре это работает по нажатию на огромный хотспот, расположенный по всему столу.
Здесь мы видим два хотспота: back - вернуться на сцену main(Общий вид), и key_hotspot, который отвечает за подбор ключа в инвентарь. Сам ключ - это пнг-изображение, а в рамках фреймворка - объект. Объект сам по себе не кликабельным, с ним нельзя взаимодействовать, это просто изображение, которое можно вертеть по своей оси и которому можно изменить размер. Поэтому рисуем вокруг него хотспот и задаем правила в поле, которое чуть раньше я описывал в правом блоке под номером 9
Настраивается все довольно просто, все флаги, события, условия - это выпадающие списки, не нужно ничего особо запоминать, все сделано для удобства. В данном случае алгоритм очень простой и понятный:
Условие: Если флаг key_taken = false, то происходят 4 действия в заданном порядке:
1) Выводится сообщение: "Вы взяли ключ",
2) Ключ добавляется в инвентарь как предмет,
3) Флагу key_taken присваивается значение True
4) Совершается переход на сцену main
Флаг visible_when, существующий у всех объектов, становится равен false, то есть ключ перестает быть видимым, если флаг key_taken перестанет быть false. Все просто и лаконично.
Рассказывать можно было бы еще очень много, но оставлю это на следующие части, если вдруг эта окажется полезной. Фреймворк вместе с редактором будут распространяться на безвозмездной основе на itchi.io как только я буду уверен в их полной готовности увидеть свет.
Спасибо за ваше внимание, собратья игроделы!
И напоследок демонстрация, как этот квест выглядит внутри самой игры.
















