Создание сложных квестов
Итак, решили вы написать оригинальную миссию для игры. С чего начать? Бросаться писать скрипты? Приниматься за конструирование разветвленных диалогов? Или вообще все это отложить в сторону и сделать кое-какие наброски на бумаге. Первым делом, разумеется, нужно сделать кое-какие выкладки — подобрать действующих лиц, придумать крайне интересный и дух захватывающий сюжет, наконец, продумать, как будут выглядеть диалоги между NPC и будут ли они вообще фигурировать в игре. После этого уже можно приступать к чисто технической части — реализации задуманного. Если кто-то подумал, что работать мы будем в редакторе уровней и по неосторожности его запустил, пусть покинет программу — она нам сегодня не пригодится. Писать миссии и диалоги для S.T.A.L.K.E.R. мы будем исключительно в «Блокноте». Нет, вовсе не оттого, что недолюбливаем официальный инструментарий, а лишь потому, что официальный модмейкерский набор пока не позволяет править ни одиночные карты, ни квесты.
Краткий брифинг проведен. Время действовать. Начнем, пожалуй, с написания разветвленных диалогов. Запустите «Блокнот» и подгрузите в него файл character_desc_escape.xml, который проживает в директории gamedataconfiggameplay установленной игры (прим. — все архивы «Сталкера» должны быть «распечатаны»). Данный документ, по сути, содержит множество ссылок на определенные ветви диалогов, т.е. фактически служит лишь для объявления или инициализации разговорных блоков, но не более того. Давайте вживим в тело данного файла ссылку на новый диалог с торговцем — Сидоровичем (впрочем, никто не мешает вам создать новых персонажей, например канонического Ктулху, и закрепить за ними определенные диалоги). Для этого выполните следующие действия. Отыщите строку escape_trader_done_blockpost_box (прим. — меню поиска в «Блокноте» активируется при помощи горячих клавиш Ctrl + F, если кто не знает) и сразу же после нее (с новой строки) поместите следующую конструкцию: escape_trader_igromania Где escape_trader_igromania — название будущего диалога. Инициализация произведена. Двигаемся дальше — приступаем к внедрению кода диалога в файл dialogs_escape.xml из каталога gamedataconfiggameplay игры, в котором прописаны практически все игровые тексты в общем виде. Итак. Откройте «Блокнотом» файл dialogs_escape.xml и добавьте в конец документа — перед ключевым словом следующий блок:
escape_dialog.trader_alredy_give_job tutorial_end
escape_trader_ igromania0 1
escape_ trader_ igromania1 2
escape_ trader_ igromania2 3
escape_ trader_ igromania3
Давайте рассмотрим структуру данного диалога. В первой строке блока указывается название диалога, соответствующее определенной записи в файле character_desc_escape.xml. В нашем случае — это escape_trader_igromania. Последующие две строки отвечают за так называемое предварительное условие (precondition) и специальную информационную справку. Тег открывает огромный список фраз диалога, а , соответственно, его замыкает. Между ними, как мы уже сказали, размещаются различные реплики в общем виде. Каждая новая запись состоит из трех ключевых строк, содержащих так называемые теги phrase id, text и next. В первой из них указывается специальный идентификационный номер, указывающий на номер реплики. Нумерация начинается с нуля. Т.е., скажем, для первой записи значение параметра phrase id = «0», для второй — «1» и так далее. Во второй строке между тегами и содержится ключевое слово или «ключворд», которое представляет собой название строки — сам же текст вбивается в документ gamedataconfigtextrusstable_dialogs_escape.xml. Ну и, наконец, между тегами и помещается номер следующего узла или реплики. Таким образом, зная структуру диалогов, вы можете конструировать блоки, состоящие из 10, 100, 1000 записей. Лимит не установлен.
Полдела сделано. Осталось лишь насадить на сформированный каркас полноценные текстовые реплики NPC — не ключевые слова, не ссылки, а саму «начинку» в духе: «Эээй, Меченый...! Водки, водки давай... И побыстрее там, сколько уже можно ждать». Первым делом откройте «Блокнотом» файл stable_dialogs_escape.xml из директории gamedataconfigtextrus с установленной игрой и внедрите в конец документа перед тегом следующую конструкцию:
Слушай, Сидорович, есть у тебя какая-нибудь интересная работенка для меня? Что-нибудь экзотическое. Понимаешь, о чем я? Надоели убийства, надоели ограбления... Скукотища...
Ну, Меченый, повеселил ты меня. Давно я такого бреда не слышал. Ну, иди, иди и найди снежного человека, поговори с Ктулху...
Ктулху, говоришь?! А может быть, он есть, на самом деле есть. Ты об этом не думал. Сейчас пойду его поищу, ведь должен же он существовать: в зоне про него тоже немало слышал!
Ну, иди, иди, только вот будь добр — прихвати для меня по пути несколько дельных вещиц — что найдешь: консервы, части местных животин, ценные артефакты. В долгу не останусь.
Нетрудно заметить, что данный блок почти полностью копирует ранее написанный нами диалог в общем виде, с той лишь разницей, что между тегами и заключены уже не краткие названия строк на английском, а полноценные текстовые реплики на родном русском языке.
Квестострой
Диалог написан, а следовательно — первый этап работы по созданию новой миссии выполнен. Движемся дальше и приступаем к написанию самого задания. Вновь откройте текстовым редактором XML-документ dialogs_escape.xml из каталога gamedataconfiggameplay с установленной игрой. Отыщите свой диалог (прим. — если вы действовали согласно нашей инструкции, то проживать он должен в конце документа). И после строки escape_ trader_ igromania2 поместите следующий код: igromania_quest Данная команда приведет к старту квеста с незатейливым названием igromania_quest после появления на экране третьей записи диалога (прим. — помните, что отсчет-то ведется с нуля, а не с 1?). Итак, что же мы имеем на данный момент? Диалог есть, ссылка на квест есть, самого квеста... нету. Надо срочно эту проблему решить. Что ж, приступим. Подгрузите в «Блокнот» файл tasks_escape.xml из каталога gamedataconfiggameplay со «Сталкером» и вставьте в самое начало документа следующую конструкцию:
Типично русский квест
Поговорить с Ктулху ui_iconsTotal_storyline_eliminate_gunslinger igromania_quest_done
Раздобыть ценные артефакты и просто полезные в хозяйстве вещицы green_location Escape_Tutorial_Artefact igromania_quest_done
Встретиться со снежным человеком =) blue_location Escape_stalker_from_raid igromania_quest_done
Так, давайте посмотрим, что здесь к чему. Параметр, точнее говоря, тег с ключевым словом game_task id отвечает за идентификационный номер (правда, текстовый, а не цифровой) или название миссии. Между тегами проживает заголовок задания на русском, в нашем случае — Типично русский квест. Далее в пределах от элемента до содержится краткий текст квеста на чистейшем русском языке. Между тегами и задается определенный тип маркера или иконки, который будет отображаться на карте местности, в нашем примере — ui_iconsTotal_storyline_eliminate_gunslinger. В теле тега проживает ссылка на определенную запись в файле gamedataconfiggameplayinfo_l01escape.xml с текстом условия. Тег типа включает в себя информацию о графической подсказке на радаре, а — о квестовом объекте. Вот, в принципе, и все. Что? Зачем мы вживили в тело миссии несколько -блоков? Все просто. Три части задания, три независимых группы — Поговорить с Ктулху, сгонять за артефактами и встретиться со снежным человеком. С созданием квестовой основы покончено. Следующий шаг — обозначение целей и прописывание экранных подсказок. Передохнули, сил набрались? Тогда снова в бой! В очередной раз вооружитесь «Блокнотом». Откройте файл info_l01escape.xml из папки gamedataconfiggameplay со S.T.A.L.K.E.R., отыщите в нем тег и после него поместите следующую незатейливую конструкцию:
igromania_quest
Если внимательно приглядеться, то несложно обнаружить, что в теле каждого тега типа info_portion id прописывается определенное условие, название которого было ранее задано в файле tasks_escape.xml. Между тегами и указывается название квеста, для которого обозначаются условия, в нашем случае — igromania_quest. Так, с прописыванием условий разобрались. Что у нас там дальше по плану? Точно — экранные подсказки. Дабы организовать вывод текстовых подсказок, отображающихся на экране во время выполнения квеста, проделайте следующие действия. Откройте файл string_table_tasks_escape.xml из директории gamedataconfigtextrus с игрой и скопируйте в начало или конец файла следующий текстовый блок:
Поговори с Ктулху
Найди полезные предметы и артефакты
Встреться со снежным человеком
Приведенная выше структура состоит из трех блоков, каждый из которых, в свою очередь, содержит ровно по три строки. В первой строке, которая начинается с «кейворда» string_id, указывается определенное идентификационное имя строки на английском (без пробелов), во второй — между тегами и — начинка, текст подсказки, ну и, наконец, в третьей — тег , который закрывает блок подсказки. Диалог написан, квест сконструирован, условия прописаны, подсказки обозначены. Казалось бы, самое время — протестировать свежеиспеченную миссию в игре. Но не тут-то было. Мы же с вами не реализовали саму возможность выполнить квест, т.е. фактически не прописали стартер задания в тело диалога. Давайте вернемся к правке диалога и устраним данное недоразумение. Итак. Во-первых, сделайте диалог нелинейным. Для этого первым делом создайте как можно большее число реплик, а затем прикрутите к нужным блокам несколько команд для перехода к новым записям, например:
escape_trader_igromania_12 2 4 6 8 Из этого примера отчетливо видно, что игрок может сам сделать выбор — к какому звену диалога перейти: 2,4, 6 или 8.
После этого встройте в тело конечных «разговорных» блоков ссылки для активации нужных игровых скриптов, скажем:
Последние штрихи. Осталось лишь написать скрипты, ответственные за «выписку гонорара» игроку, а также передачу ценного предмета определенному NPC. Откройте файл gamedatascriptsescape_dialog.script при помощи «Блокнота» и вживите перед ключевым словом Trader следующий функциональный блок, точнее говоря — два блока:
function give_gold(first_speaker, second_speaker) dialogs.relocate_money(second_speaker, 84000, «in») end
function artifacts_and_obj (npc, actor) dialogs.relocate_item_section (npc, «object», «out») {здесь слово object необходимо заменить названием того элемента, который игрок должен передать шефу, например, vodka или conservi. end
Первая функция в приведенном примере отвечает за выдачу золотых игроку в сумме 84000, вторая — за изымание ценных артефактов и вещиц у Меченого.
1103 Прочтений • [Создание сложных квестов (#1493)] [16.05.2012] [Комментариев: 0]