WINTERSANDS: Код и сборка

Мирные жители засыпают, просыпается программист! С вами trickster.kaja, рассказ о том, как делать визуальные новеллы точно не надо, и ненавязчивая реклама Ren'Py.

И с этим мы сейчас разберемся!
И с этим мы сейчас разберемся!

КРОВЬ МАГОВ НЕ ОТСТИРЫВАЕТСЯ

Юрий Гагарин был первым человеком в космосе, а я – первым человеком, который узнал о WINTERSANDS и держал в руках ту самую толстую тетрадь. Мы с j.s. знаем друг друга со средней школы, и немалая часть истории родилась в брожении по парку в Кузьминках или по Старому Арбату, а концепты персонажей – в моих учебниках по английскому (j.s. – в моих кончилось место).

Еще третий, обязательный пункт: разрисовать учебник по истории эльфами
Еще третий, обязательный пункт: разрисовать учебник по истории эльфами
WINTERSANDS: Код и сборка

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

REWIND: СТРАДАЮЩЕЕ СРЕДНЕВЕКОВЬЕ

Прошлое. 2013 год. Я юный программист, и мы с моей подругой-художницей arashell сели пилить фан-новеллу к одному известному симулятору свиданий. Про Хэллоуин, но страшно было не по этой причине :’D

Сомнительный жизненный выбор выглядит так
Сомнительный жизненный выбор выглядит так

Просто я начала пилить новеллу на движке для 2D ретро-адвенчур. Простота Adventure Game Studio оказалось обманчивой: на деле он принес мне дни и ночи однотипной и неинтересной работы.

Я люблю превозмогать. Но попытки собрать на AGS современный интерфейс были ту мач. В итоге игра представляла собой набор статичных картинок (даже UI был прифотошоплен поверх каждого кадра). Картинки переключались в коде по счетчику кликов, а вместо кнопок были хотспоты на экране (о hover'е не приходилось даже мечтать). В первой части игры было 388 картинок. А во второй – 1 850.

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

Семь бед - один ответ

Добавляем сюда максимальное на тот момент разрешение 800x600 и невозможность нативным способом встроить новый шрифт – thanks but no thanks. При этом AGS не был плохим движком, просто под задачу он очевидно не подходил.

Каждой игре свое: Cat Lady и другие крутые игры Harvester Games сделаны именно на AGS
Каждой игре свое: Cat Lady и другие крутые игры Harvester Games сделаны именно на AGS

И вот, как водится, уже когда финальный билд собран, Google вдруг знакомит меня с Ren'Py. Окей, Google, у меня вопрос – где ты был раньше?

ALL HAIL REN'PY

Ren'Py – движок для создания визуальных новел. Базовыми функциями движка можно пользоваться даже без навыков программирования, а для всего остального есть Python.

Здесь есть все и встроенный туториал
Здесь есть все и встроенный туториал

По Ren’Py полно материалов и туториалов, есть активное сообщество на лемме, а автор PyTom продолжает активно развивать свой продукт.
Для написания скриптов Ren'Py при первом запуске предложит скачать текстовый редактор. Создатель продвигает Atom, Editra и jEdit, но можно поменять на другой, ваш любимый.

Я вот пользуюсь Editra<br />
Я вот пользуюсь Editra

Файлами со скриптом игры считаются все файлы с расширением .rpy из папки с проектом. Поэтому делите скрипт на сколько угодно файлов – как вам удобнее!

Как детектив Эми Сантьяго из «Бруклин 99», люблю, когда все четко
Как детектив Эми Сантьяго из «Бруклин 99», люблю, когда все четко

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

Финальная сборка: а утюг (меню разработчика) я отключила?!<br />
Финальная сборка: а утюг (меню разработчика) я отключила?!

Ren'Py позволяет создавать игры как на PC так и на мобильные платформы. Притом разные версии на Windows/Linux/Mac собираются из проекта автоматически, никакой дополнительной настройки не требуется. Сборка на Android технически тоже проста (iOS как всегда другой фрукт).

При сборке готовой игры в Ren'Py можно запаковать ассеты в архивы. При этом Ren’Py дает указать, какие файлы включать в билд для ПК, а какие – для мобильного приложения. Так из одного проекта можно собирать обе версии, хотя в каждой используется разный набор спрайтов персонажей и элементов интерфейса.

А теперь сделаем билд для Android, почему бы и нет?
А теперь сделаем билд для Android, почему бы и нет?

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

В WINTERSANDS не было навороченных мини-игр и ракет, летящих в космос (j.s. - пока? спасибо за идею!), но кое-какие любопытные задачи в практике Ren’Py мне все-таки попадались, например:

  • автоматический подбор оптимального разрешения игры для мобильной версии
  • мини-игра на поиск предметов
  • бродилка по карте с рандомными и заскриптованными событиями
WINTERSANDS: Код и сборка

ОНО ЖИВОЕ

Ren'Py не поддерживает анимацию, но варианты оживить статичную картинку есть всегда.

  • Можно задать смену изображений с помощью переходов. Если комбинировать эффекты с умом, выйдет симпатичная псевдо-анимация.
Когда кокоро делает доки-доки… погодите, что это было?!
  • Другой способ – запилить покадровую анимацию через ATL (Animation & Transformation). Тут главное не переборщить с количеством кадров.
Очи черные, красные и прекрасные от arashell. Для другого проекта, не беспокойтесь

JUST WORK, WOULD YOU KINDLY

Но не всегда работа в Ren'Py – путешествие по радуге на единороге. Иногда не работает то, что по всем канонам логики должно работать. А иногда все работает совсем не так, как ожидаешь.

Но есть такое слово – do it

Я так и не узнала, почему imagebutton теряет чувствительность к нажатию delete, а кнопка перехода в оконный режим никогда не в курсе, что ее нажали (¯\_(ツ)_/¯). К счастью, у большинства таких задач есть адекватные обходные решения, без смс, регистраций, костылей и велосипедов.

Крик души к собрату по цеху
Крик души к собрату по цеху

Пример: всего одна, но упорная проблема всплыла при сборке Android-версии: иконка Агаты решила, что не полезет в билд. Не помогали ни манипуляции с размером и весом картинок, ни 10-я по счету пересборка. А вот когда я склонировала проект и собрала приложение из новой сущности, все заработало. Типичный случай «вкл/выкл пробовали?».

Мои отношения с Ren’Py
Мои отношения с Ren’Py

Так что у движка есть плюсы и минусы.

Плюсы:

  1. простота использования при широких возможностях
  2. большинство механик, необходимых для новеллы, уже есть в движке
  3. удобная сборка сразу для нескольких платформ
  4. много инфы (ответы есть даже на те вопросы, которые еще не придуманы)

Минусы:

  1. если менять текст в скрипте, сделанные в этой точке сейвы умрут, а перевод отвалится (если изменения вносятся в уже рабочую сборку игры – удачи и терпения)
  2. чем больше изображений на экране, тем хуже все пашет (будет заметно, если персонажи анимированы и в кадре их много или если у вас мега-сложная мини-игра)
  3. нет нативного порта на консоли

IN THE MIDDLE OF SOME CALIBRATIONS

Но не все техномагия – в моей работе есть и другие виды творчества. Так, j.s. прописывает «драматургию» сцены, но финальная «режиссура» WINTERSANDS остается за мной.

В любой непонятной ситуации юзай любимые иконки
Например, эту, эту и еще вот эту
Например, эту, эту и еще вот эту

Сборка 10-15 страниц сценария занимает пару вечеров.

Итого: 65 таких страниц на демо-версию
Итого: 65 таких страниц на демо-версию

Сначала я собираю скелет из текста, расставляю все метки и логические переходы. Затем идет самая «любимая» моя часть – теги жирного шрифта (и изредка курсива).

Be bold! (копипаст тегов снится мне в кошмарах)
Be bold! (копипаст тегов снится мне в кошмарах)

Дальше я добавляю спрайты и эмоции персонажей: в одном окне текстовый редактор, в другом – игра. Я проверяю все сразу, смотрю, работает ли эмоция с текстом.

Перевод на русский я вношу, когда весь текст новеллы вычитан несколько раз несколькими людьми. Иначе любая правка «отвяжет» кусок перевода от оригинала, и придется заново генерить новые строки переводов и восстанавливать мэппинг. (Полностью избежать этого не удалось, но потери были минимальными.)

Звуки и музыку я вставляю в самый последний момент. Для демо-версии мы с j.s. сели вместе и в режиме live расставили всю звуковую часть примерно за полтора часа.

Финальная сборка обязательно тестируется на всех языках!

А еще бекапируется на внешнем диске и Google Drive, как завещала Кэмерон
А еще бекапируется на внешнем диске и Google Drive, как завещала Кэмерон

И ЧЕГО? ITCH.IO!

Наше демо живет на itch.io, и эту площадку мы заценили еще до фестиваля. Плюсы ее бесспорны:

  • бесплатный репозиторий для хранения файлов игры
  • удобный интерфейс для тех, кто будет ее скачивать (намного лучше, чем отправлять людей на Google Drive или Яндекс-диск)
  • возможность сверстать яркую, репрезентативную страницу игры
  • удобная внутренняя аналитика
Эта статистика fills me with determination
Эта статистика fills me with determination

А главное: itch.io активно продвигает игру сам и сейчас генерит нам больше всего посещений.

И dtf не забыли!
И dtf не забыли!

NO REST FOR THE WICKED

Я люблю игры и все, что с ними связано: меня бесконечно вдохновляет то, что делают Supergiant Games, Arkane и человек-оркестр Тоби Фокс. Люблю Borderlands во всех проявлениях, Dishonored, The Last of Us, Bioshock Infinite, Death Stranding и Detroit: Become Human. Люблю Троя Бейкера, и пусть он озвучивает все на свете! И еще Homestuck (да, там тоже про игру).

С WINTERSANDS я вставила ногу в дверной проем разработки игр и уже не хочу ее убирать. Хочу пробовать разные жанры, на разных движках. Было бы здорово, например, сделать двухмерный квест на Visionare Studio. Или разобраться в Unity 3D и выйти за рамки 2D. И если j.s. еще решится сесть за баранку геймдева, то сделать все, что угодно, и на чем угодно вместе с ней.

А кем вы видите себя через несколько лет?
А кем вы видите себя через несколько лет?

А пока буду двигать прогресс с WINTERSANDS, челленджи зовут! Хорошо делать то, что любишь, и любить то, что делаешь. Так что пойду проверю itch.io :^)

Ну, вот и все – мы давно хотели написать про свой процесс, и это было классно! Спасибо, что были с нами эти четыре недели. Надеемся, что фестиваль повторится, и не раз, и нам снова будет что показать. А пока – следите за новостями в наших пабликах, играйте в наше демо, и в целом, enjoy.

1010
7 комментариев

Я пока (только познакомившись) с очень приятным впечатлением от RenPy. Кроме того, что звук при игре из броузера тормозит. И у девушки на броузерном загрузчике всего 11 пальцев на руках :)
По поводу исчезнувшей иконки на мобильной версии: может, дело в этом. Файл screens.rpy, нашла, пока тыкалась в проекте, сейчас вспомнила.
   
## Если есть боковое изображение ("голова"), показывает её поверх текста.
## По стандарту не показывается на варианте для мобильных устройств — мало
## места.
if not renpy.variant("small"):
add SideImage() xalign 0.0 yalign 1.0

1
Ответить

Ну тут в целом вся статья это непроплаченная реклама Renpy. Но иногда это реально "Дормамму, я пришел договориться"))

Не, речь шла не про сайд-портрет гг, а про иконку самого apk-приложения в телефоне, именно она не подхватывалась. С учетом, что настройки там "положить две картинки с коректными названиями в base-папку", то дебажить было некуда.

Ответить

Это чистая вкусовщина, но предложу следующее: мгновенная смена эмоции-спрайта смотрится не очень. Для себя я добавлял простейший диссолв на 0.2 секунды. Он практически незаметен, но хорошо сглаживает переходы. Однако будьте внимательны: его не следует бездумно вызывать, если подразумеваются какие-то другие трансформации.

На тему "приятных" особенностей Ренпи: всегда раздражали и раздражают скрины. У них широча-а-айшие возможности, но пользоваться ими безумно неудобно. Это выливается — в лучшем случае — в монструозные конструкции IF(). А в моем случае еще и в неудобочитаемый таймер. Чтобы вспомнить, как он работает, нужно минут десять потратить.

1
Ответить

Рассматривала вариант с dissolve, но в итоге сознательно отказалась. Мне в целом нравятся быстрые переходы, а dissolve выделяет более сложные эмоции, аля, вздох с облачком пара или подмигивание))

В скринах есть некоторое количество непредсказуемости, это правда))

Ответить