Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

Доброго времени суток, господа корсары! Сегодня я расскажу вам как планировалось и осуществлялось… создание острова и квестово-диалоговая архитектура. Какими плагинами я воспользовался для создания ландшафта и диалоговой системы. И с какими проблемами пришлось столкнуться в процессе их встраивания в игру.

Зачем новый остров?

Для начала отвечу на один важный вопрос: зачем я начал создавать остров, если в первой своей статье говорил что планирую делать ремейк именно на моделях оригинальной игры? На то есть несколько причин:

  • Создание острова не показалось мне сложной задачей, если воспользоваться специальными плагинами. Со зданиями сложнее, но их можно собрать как конструктор на основе оригинальных, либо использовать из готового пака.
  • Изначально я думал о том, чтобы постепенно переделывать локации и объединять их в единый открытый мир, но возникает проблема с квестами. Квесты целиком и полностью завязаны на идентификаторах локаций, и если они будут переноситься до объединения мира(а оно так и будет), то спустя какое-то время, сшивание мира будет казаться все более и более дорогой задачей. А значит, скорее всего, никогда не будет реализованной.
  • Я хочу сделать мир максимально бесшовным. Конечно абордажи так сделать скорее всего не получится, потому что не понятно как это должно выглядеть в случае условного мановара и тартаны. Но это не повод оставлять устаревшую локационную систему.
  • В конце-концов разработке присущ хаос, поэтому проект нужно постоянно видоизменять, чтобы кусочки пазла вставали в правильное положение. Локационная система никак в этот пазл не вписывалась.

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

Создание острова

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

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

Как вы могли видеть в моих видеороликах, на стартовой локации находился остров Антигуа, поэтому я решил начать переработку именно с него. Но вот с чего начать…? Первое о чем я подумал - это масштабы. Насколько оригинальный остров большой? Сколько игроку потребуется времени на x1 скорости, чтобы его пробежать? Я создал новый ландшафт с максимальным размером 255x255, поставил персонажа на край карты и устроил ему пробежку на противоположную часть по диагонали. Получилось 10 минут на стандартной скорости бега, что весьма немало. Затем я примерил эту карту на не самый большой в игре остров, и получилось что он больше этой карты примерно в 2.5 раза. Стало понятно, что сохранить пропорции островов не выйдет, придется урезать масштабы. Уменьшив остров в 3 раза получилась такая картина:

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

В целом по основным путям можно будет пробежаться менее чем за 5 минут без ускорялок и спринта, что вполне допустимо. Значит о конях или быстром перемещении на нем можно не задумываться. Но теперь порт не сможет вмещать в себя большие эскадры, и это потенциально бьет по другим частям игры… как с этим быть, пока что непонятно.

После того как я определился с масштабами, мне нужно было спланировать где будут проходить дороги, где лучше поставить горы, а где пляжи. На помощь пришли карты из ККС:

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

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

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

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

Я не буду описывать весь процесс в деталях, ибо там нет ничего интересного. Итоговые результаты вы могли видеть в этой мини статье:

Диалоги

О, диалоги… на мой взгляд, наиболее плохо реализованная часть игры. Как в технической, так и в геймплейной части. Чтобы понять почему в технической, то достаточно посмотреть на код:

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

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

Почему же мне не нравится геймплейная часть? Да потому что это выглядит как обычные субтитры! А субтитры должны добавляться как вспомогательная часть, поверх озвучки и отображения эмоций персонажа на экране. В корсарах же, у персонажей нет эмоций, по понятным техническим причинам. А значит, было бы вполне логично добавлять своеобразные вставки рассказчика, что-то типа: “В его глазах читался неистовый силы гнев, способный утащить на морское дно самого дьявола!”. Но тогда текущее диалоговое окно не вписывается в этот концепт…

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

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

Logic Driver Pro. Есть бесплатная версия с урезанным функционалом.
Logic Driver Pro. Есть бесплатная версия с урезанным функционалом.

Это очень мощный инструмент построенный на стейт машинах! Каждый блок можно кастомизировать добавляя ему пользовательские поля, которые затем используются в логике диалога. Более того, это решение также отлично подходит для создания квестовой логики, что нам только на руку. Ну и разумеется его можно применить для написания логики ИИ, боевой системы и т.д. К сожалению, продукт имеет много подводных камней, некоторые действия могут привести к фаталам и вылету движка. Но на безрыбье…

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

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

Я создал несколько нод для обычного диалога:

  • Dialogue Node - просто выводит фразу от имени NPC.
  • Dialogue Reputation - выводит фразу от имени NPC в зависимости от репутации героя.
  • Dialogue Memory Node - выводит разные фразы от имени NPC по очереди
  • Dialogue Choice - фраза от ГГ
  • Dialogue Choice Reputation - фраза от ГГ в зависимости от репутации
  • Dialogue Memory Choice - разные фразы ГГ по очереди

Каждая нода позволяет указывать несколько вариантов текста выбирающегося рандомным образом.

И еще несколько нод, для диалогов куда можно интегрировать квестовые диалоги:

  • Integration Node - инкапсулирует в себе логику получения активных квестов и редиректа на них
  • Integration Choice Node - идентично первому, но представляется игроку как вариант выбора
  • Dialogue Agent - просто прослойка для удобного реюза группы выборов.
  • Link to parent node - вызывается из квестового диалога, чтобы система знала что делать дальше, продолжать диалог с NPC или закрыть диалог.

Вот пример, как это выглядит в сборке хозяина таверны:

Диалог чисто в виде наброска, в нем еще нет никакой логики кроме интеграции с квестами.
Диалог чисто в виде наброска, в нем еще нет никакой логики кроме интеграции с квестами.

Квесты

Хорошо, теперь немного отойдем в сторону, и займемся созданием архитектуры квестов.

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов
  • Talk with… - устанавливаем нам неочевидную задачу поговорить с кем-то. Допустим это может быть случайный разговор с прохожим. В дальнейшем мы можем через журнал рассказать игроку, с кем он должен поговорить.
  • Add Note To Journal - тут я думаю все понятно
  • Possessed on ship - срабатывает когда игрок садится на свой корабль
  • … в дальнейшем тут будут ноды на убийство цели, достижения какой-то локации и так далее.

Еще есть специальная нода подключаемая только к задачам на диалог - On Talk Node. В ней можно указать что нужно сделать, если пользователь выберет один из вариантов диалога. А еще каждой такой ноде можно указать срок сдачи(только я пока что не сделал логики его провала…)

Помимо прямых квестовых задач, я так же добавил ноды, которые производят действия:

  • Give Item - дает игроку какую-то вещь, или отнимает
  • Spawn Character - создает в мире NPC с заданными характеристиками
  • Spawn Ship - создает в мире корабль, работает в связке со Spawn Character

Теперь мы можем написать максимально простую логику:

Разработка ремейка методами чайника 9. Создание острова, архитектура диалогов и квестов

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

А вот так выглядят диалоги с NPC для этого квеста:

Все что остается сделать, чтобы запустить квест - это добавить его в список доступных квестов, и тогда он автоматически подключится для всех необходимых NPC. Все что необходимо знать для создания квестов - это название интеграционных нод у персонажа, куда можно встроить новый диалог. И теперь каждому конкретному квесту можно выделять свою папку!

А вот небольшая видео демонстрация на манекенах:

Да, диалоговое окно теперь будет находиться справа от NPC и содержать всю историю общения. И я ничуть не жалею о своем решении!

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

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

3434
38 комментариев

Я, наверное, ретроград, но мне не нравится.

Каждый инструмент избовляет тебя от части возможностей, взамен делая за тебя часть работы.
Конкретно этот выглядит так, будто он избавляет от части возможностей, взамен заставляя работать больше. Я не вижу преимущества в стрелочке с условием, вместо "if" в коде, в этом случае, в отличие, например, от Behavioral Tree или Animation Blueprint.

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

Вот тебе пример создания диалогового окна для персонажа в одной малоизвестной игре.

До третьей главы у него можно по клику на диалог "чекак?" взять квест. В процессе выполнения другого квеста получить информацию. А во всех остальных случаях ничего не значащий ответ.

Коротко, емко, удобно, вариативно, и нет никакого миллиарда стрелок.

Бесспорно, у вашего подхода есть плюсы. Но лично я не сторонник размазывания переменных по всему проекту. Это удобно если у вас много квестов которые друг с другом связаны, но в моем случае квесты по большей части унитарны.
+ в вашем кейсе, если придется менять диалоги, то придется менять и комментарии. А если в диалоге разные текста в зависимости от репутации и рандома...

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

Так что это скорее вопрос точки зрения и стоящих задач.

4

Сразу докину, как выглядит код "сдачи" квеста:

один инструмент стоит 18к рублей, другой 22к
40к чтобы сделать как-то ниже среднего
про gaea знаешь? https://quadspinner.com/
можно бесплатно создать до 1к ландшафт любой, хоть остров

1

Не пробовал... но я уже не буду новый инструмент изучать)

Молодчик. Круто, что движешься вперёд и проект продвигается!

Один вопрос. Хули так мало фепесов?