Ну, это неудобно. Я должен был взять выходной, чтобы отдохнуть, восстановиться и подготовиться к следующему спринту; и я также должен был сократить свое рабочее время, чтобы избежать выгорания.

Что на самом деле произошло, так это то, что сразу после этого я решил сделать небольшую предварительную работу, чтобы собрать инструмент, который поможет мне позже, а затем я просто не останавливался до тех пор, пока примерно 15 часов спустя, разрушив мой график сна, а сегодня удалось только 4 часа. Мне нужно приложить больше усилий, чтобы вернуться к нормальному распорядку дня.

Диалоговый инструмент

Итак, вот что я сделал. Как вы, возможно, помните, рабочий процесс перехода от Tiled к серверу состоит в том, чтобы сохранить карту в Tiled, а затем запустить скрипт, который проанализирует и загрузит эту карту в базу данных Firestore. Затем при перезапуске серверной части MMO другой скрипт загружает данные из Firestore в Redis, где они находятся в памяти для быстрого извлечения.

Я хотел сделать что-то подобное для Twine. Разница, однако, в том, что Twine имеет открытый исходный код и написан на Vue.js, с которым у меня был большой опыт. Поэтому вместо того, чтобы писать собственный синтаксический анализатор для загрузки Twine в Firestore, я решил создать форк кодовой базы Twine и напрямую добавить возможность загрузки в сам Twine.

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

Итак, теперь Twine буквально напрямую загружает и сохраняет данные в той же базе данных, из которой MMO будет извлекать данные. Я все еще собираюсь загрузить эти данные в Redis, чтобы они находились в памяти для быстрого поиска, но я могу поиграть с оптимизацией позже.

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

Как это работает

Вот как я буду использовать диалоговый инструмент для создания диалогов NPC:

Шаг 1: Напишите диалог

В Twine я создам новую историю, дам ей имя NPC и напишу ответный диалог. Внутри здесь я могу установить различные локальные переменные, которые управляют внешним видом и поведением диалога. Например, на приведенном ниже снимке экрана вы можете увидеть (set: _ENDVN to true), который установит специальную локальную переменную, которая приведет к закрытию диалога в этот момент. Я буду хранить некоторые из этих переменных в данных игрока для каждого NPC, чтобы в диалоге можно было узнать об индивидуальном выборе игрока. Я также смогу связать такие вещи, как система инвентаря, с диалогом с помощью специальных переменных.

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

Большая часть приведенных здесь метаданных не имеет отношения к игре, они предназначены для рендеринга в самом графическом интерфейсе Twine. Важными битами являются поле text, которое содержит фактический текст прохода, и различные UUID, которые помогают им соединяться друг с другом.

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

С помощью этой системы становится возможным быстро писать диалоги NPC и добавлять их к NPC в редакторе карты в Tiled. Хотя я мог бы, возможно, избежать необходимости использовать UUID, я считаю, что это более гибко, поскольку становится возможным, чтобы несколько NPC использовали один и тот же диалог (например, общие NPC).

Сводка задач 9-го дня

Пока что я немного отстаю от задач, слишком увлекся модификациями шпагата. Но результат радует, так что я рада, что сделала это.

Завтра продолжу работу над собственно разбором диалога.