Veliri. Дневник разработки 4
диалоги и миссии
Приветствую, DTF. Я все еще продолжаю делать ММО игру:)
Расскажу про то, как устроены диалоги и миссии в моей игре с технической точки зрения.
Диалоги
Диалоги в игре являются самостоятельными объектами, хотя чаще всего они, конечно же, связаны с заданиями. Пример простейшей схемы диалога будет выглядеть примерно так:
То есть диалог состоит из массива страниц, внутри которых есть текст и заготовленный набор ответов (а еще портрет персонажа который говорит).
Ответ содержит в себе текст, который будет показан игроку, номер страницы на которую попадет игрок, если выберет именно этот ответ, и какое-то действие, которое произойдет после выбора.
Действия ответов могут содержать в себе все что угодно, от смены страницы или диалога, до обмена предметов или принятия/провала задания.
мой страшненький редактор диалогов
Диалог диспетчера базы, который предлагает задание. Если игрок ответит “запросить задание”, то сервер пойдет искать доступные для игрока задания и, в случае если найдет такое, то сменит диалог приветствия на диалог брифинга, а если не найдет, то отдаст вторую страницу.
Задания
Задания в игре бывают разные (доставка, убийство, сопровождение, исследования и тд), но все они работают по единому принципу. Чтобы не городить огород из логики под каждый тип заданий, я сделал универсальную структуру задания, где логику определяют “действия”, и туда можно затолкать все, на что хватит фантазии и геймплея).
В упрощенном варианте это выглядит примерно так:
Каждое действие является атомарным, то есть его уже нельзя поделить на под-действия т.к. там уже нечего делить.
Например некоторые из них:
достигнуть точки х:у
завязать разговор с нпс
добыть определенный предмет (в трюм)
убить кого-то
Но действия это не только пункты, которые надо выполнить игроку, это также определенные задачи серверу:
создать предмет, который надо доставить
сгенерировать нпс, которого надо убить/сопроводить
создать персональную локацию
ну и прочие такие вещи Х)
Например самое элементарное задание по доставке предмета будет состоять из четырёх действий, первое из которых будет для сервера, а не игрока (сгенерировать предмет доставки).
Все действия отслеживаются по порядку (если конечно не указан специальный флаг), и нельзя выполнить действие под номером 4 не получив статус “завершено” в действиях 1, 2 и 3.
Следит за выполнением миссии очень некрасивый код из набора if’оф под каждый тип действия.
Каждое действие имеет свою реализацию, но, например, достигнуть х:у выглядит так:
В конце каждого задания надо поговорить с базой, которая выдаст специальный диалог с ответом, действие которого будет “завершить задание”, если игрок завершил все действия задания, то он попадет на страницу с наградой, а если нет, то “иди работай...”
Хоть все задания работают в одной системе, я делю их на 3 вида:
Типовые - такие миссии как доставка, сопровождение и убийство имеют одинаковый конфиг (который генерируется из заготовки), у них различны диалоги брифинга, завершения задания ну и немного мета в действиях (например ид предмета который надо сгенерить/доставить).
Сложные в открытом мире - задания которые не вписываются в шаблоны и их придется делать руками :С, “в открытом мире” значит что для них не надо генерировать локации и связывать их телепортами и, обычно, ограничиваются стандартными действиями.
Персональные - это миссии, во время выполнения которых для каждого игрока генерируются персональные локации. На текущий момент это сюжетные миссии, из-за сложности сценариев предполагающие уникальные действия я пока их не доделал :С
Примерно так оно и работает. ¯\_(ツ)_/¯