Собственно, изложу свои мысли на тему. Вдруг кто подкинет стоящих идей. %) Напишу несколько велеречиво, повторяя известные всем опытным билдерам и кодерам истины, но надеюсь, что на этот сайт заходят не только они.
Все пишется на материале mud "Былины".
Вводная информация.
В маде имеются "триггера" Это небольшие программы на встроенном языке сценариев, которые связываются с некоторой сущностью в игре (комнатой, мобом или предметом), и запускаются при выполнении жестко задаваемых условий. Например "игрок ввел определенную команду", "игрок вошел в комнату", "монстр убит", "предмет подобрали". Параметрами события можно слегка манипулировать, например менять вероятность запуска триггера, но для обработки нового типа события надо добавлять новый тип триггера. Например в "Былинах" нет возможности прямо отследить событие "игрок умер", только по косвенным признакам.
Квест -- это цепочка триггеров. Например триггер на событие "игрок вошел к мобу" -- моб говорит несколько фраз, предлагая "взять" квест, и подсказывая, как это сделать. Затем триггер на команду или фразу -- выдача квеста, несколько триггеров, проверяющих, что игрок выполнил задание (нетрудно понять, что очень уж нетривиальные действия игрока проверить сложно или невозможно, из-за ограниченности системы триггеров), наконец триггер, который выдаст игроку награду за выполнение квеста -- деньги, опыт, предметы или очки параметров.
Формулировка проблемы.
Первая проблема -- ограниченность системы триггеров, скромные возможности встроенного языка и так далее. Это проблема технического характера, и ней уместней поговорить отдельно, да и решений, пусть частичных, есть немало -- например использовать встраиваемый язык типа Lua или Python, с организацией интерфейса для доступа к игровым сущностям.
Вторая проблема, о которой я и хотел бы написать -- игромеханическая. Квесты представляют собой разрозненную кучу сценариев, без каких-то единых механизмов. То есть. - Нет какой-то сводной информации о квестах в целом, статистики (разве что в виде файла на компьютере администратора игры). - Нет также и формализации правил -- вот это квест на 1-10 уровни, а на 11 и выше уровне на нем уже не дают опыта. Конечно, несложно написать в сценарии конкретного квеста такую проверку. Ну а если квестов десять? Сто? Если вы сами уже не помните, где какой? - Нет возможности гибко манипулировать параметрами группы квестов. Например повысить выдачу награды членам клана, который контролирует город, где "живет" NPC выдающий задание. Или урезать выдачу опыта для квестов на 10-20 уровень. - Каждый новый квест пишется "с нуля", хотя абсолютное большинство квестов сводится в общем-то к действиям "убить N указанных монстров", "принести N названных предметов", "пройти из точки А в точку Б". В разных сочетаниях, по-разному лбставленные, но эти элементы лежат в основе практически всех квестов в мадах.
Если размер мира -- пара десятков зон по сотне клеток в каждой и над ним работает первый разработчик, он же основатель проекта -- такая проблема не слишком актуальна. Но если мир разросся до многих тысяч локаций, а основателей проекта давно сменило уже даже не первое поколение "наследников" -- проблема становится весьма актуальной. Частично проблему может решить все то же использование вменяемого скриптового языка, позволяющего, к примеру, организацию библиотек функций, но это только частичное решение.
Предлагаемое решение.
Стандартный для всей игры механизм, определяющий выдачу заданий, их прохождение и вознаграждение за оные. Давайте прикинем функции, которые должна обеспечивать такая система.
- Хранение информации по квестам в целом и каждому квесту в отдельности. - Стандартные проверки на выполнение условий по взятию квеста. От уровня персонажа, до репутации у игровых фракций, если таковые есть. - Регистрация факта взятия и выполнения квеста -- опять-таки стандартным образом. - Отслеживание процесса выполнения задания, то есть прохождения персонажем этапов квеста, без "ручного" отслеживания состояния переменных и тому подобного. - Информирование игрока о квесте, в объеме, предусмотренном разработчиком. Факт взятия, суть задания, прохождение этапов, факт выполнение, обещанная награда. - Возможность сбора статистики по квестам, манипулирования параметрами как отдельного квеста, так и целых групп, выделяемых по разным признакам (уровень, тип награды, расположение, доступ по классам и так далее).
Резюме
Такая система решает сформулированную проблему, и многократно облегчает создание относительно простых квестов. Автор квеста может даже вовсе не владеть навыками программирования, а только указать NPC-квестодателя, условия выдачи (из списка стандартных), этапы квеста, их порядок, цель на каждом этапе (такой то монстр, такой-то предмет) и наконец награду (возможно жестко ограничиваемую параметрами выдачи, например уровнем квеста). Не нужно написание десятков скриптов, их проверка и отладка. Это позволит создавать квесты буквально сотнями, в том числе и автоматически. Тут конечно антураж будет прихрамывать...
Недостаток -- квест можно содержать только стандартные этапы, которые уже заложены в квестовый фреймворк. Если в нем не предусмотрен этап "подойти к NPC, предварительно надев 3 предмета из списка, содержащего 10 пунктов", то для добавления такого этапа придется или обращаться к кодерам, или вернуться к "старой школе" исполнения квестов. Возможным вариантом решения мне видятся вставки "скриптовых" этапов, подобно тому, как в листинг кода можно вставить участок на ассемблере. Условие -- скрипт по завершению должен оставить "состояние" квеста в виде, понятном фреймворку. Впрочем, если в фреймворк изначально заложено достаточно много вариантов этапов, то без таких вставок можно обойтись. 99,9% квестов будут им описываться полностью, для оставшейся десятой процента можно и не пожалеть пЫва кодеру. %)
Вот такая идея... Проблемы в ней конечно есть. Например, надо как-то показывать игроку, что вот этот NPC (а то и предмет, комната) предлагает квест, и его можно взять. Причем делать это надо стандартным же образом, иначе пропадает часть смысла фреймворка.... Плюс проблемы реализации, отслеживания этапов. Но плюсы, как мне кажется, перевешивают.
|