Мануал по моддингу игры Arcanum: Of Steamworks and Magick Obscura
Как создать Quest для игры Арканум
Простое пособие от Jesse I. Beall Version 1.0 Довольно давно этот мануал находится в архиве Arcanum-City. Здесь он — с некоторыми исправлениями и дополнениями. Мануал однозначно рабочий. Проверил на себе, хотя мелкие неточности попадаются.
При решении поставленной задачи Вам потребуется следующий инструментарий.
Редакторы WorldEd и ScrMaker (они есть в самой игре)
1. Определение квеста
Квест определяется в двух файлах: /mes/gamquestlog.mes и /rules/gamequest.mes. Посмотрим на каждый файл.
/mes/gamequestlog.mes: Этот файл содержит текст, который будет добавлен в раздел «Квесты» («полученные задания») в Вашем журнале сразу после того, как Вы о нём узнаете. Тот же текст будет использован в случае принятия, выполнения и провала.
В нашем примере, файл /mes/gamequestlog.mes содержит следующее:
{1000}{Mercutio просит уничтожить крыс в его погребе.}
В этом задании (всего-то) надо поубивать несколько (пару вроде) крыс. Понятен и синтаксис написания.
/rules/gamequest.mes: Информация содержащаяся здесь определяет сложность, изменение кармы, и входные точки диалога, который управляет квестом.
Номер квеста: Номер, по которому квест будет опознаваться, который должен совпадать с номером в /mes/gamequestlog.mes. Также будем использовать этот номер для определения квеста в диалогах и скриптах.
Сложность квеста: Это число от 1 до 20, где 1 самый лёгкий и 20 сложный. Количество опыта для PC при выполнении зависит от этого числа.
Изменение кармы: Изменение кармы PC после прохождения. Может быть 0 (без изменений), положительное число (станешь хорошим), или отрицательное (станешь плохим).
Первая, вторая и третья группы: Эти числа показывают входные строки диалога для различных стадий квеста в трех различных состояниях (нормально, плохая реакция и тупой персонаж PC). Квест может находиться в 7 состояниях:
Первая группа Нормальный диалог
Неизвестно(0)
Известно (1)
Принято (2)
Выполняемый (3)
Выполнен (4)
Другое (5)
Завален (6)
6
7
8
8
-1
-1
-1
«Работа есть?»
«Я подумаю об этом»
«Я их перебью»
«Я их перебью»
No Dialog
No Dialog
No Dialog
Это простое пособие и здесь не будет рассмотрено построение диалога для других групп (плохих и тупых ). Мы увидим как это работает чуть позже, когда посмотрим на управляющий диалог.
2. Определение глобальных переменных
Мы используем глобальные переменные, чтобы следить, сколько монстров PC убил. Глобальные переменные определяются в /semes/globalvars.mes. В нашем примере файл содержит:
{0}{Number of critters in Mercutios cellar that the PC has killed.}
Мы будем использовать переменную по числу {0}. Остальное лишь описание, помогающее нам помнить, что она считает (кол-во убитых монстров — в данном случае).
Вроде переменные инициализируются нулем 0 (zero). В документации, которая сейчас доступна не говорится об этом, но мы можем ее инициализировать сами.
3. Создание скриптов
В этом примере будем использовать 2 скрипта: 00002Mercutio.scr и 00003MercutioQuest.scr (как я писал в предыдущем мануале, номера скриптов должны быть оригинальными. В данном примере — они являются таковыми для нового модуля, но при внедрении в оригинальную игру они должны быть другими — типа 8000 и старше (примечание san)). Первый будет связан с диалогом, а второй будет следить за убиванием чудищ и будет предельно прост. Посмотрим на первый.
/scr/00003MercutioQuest.scr: Скрипт будет добавлять 1 к Global Var 0 каждый раз как крыса в Mercutios подвале убита.
Содержание скрипта:
Name: Mercutios Quest Flags: None Lines: 2
Global Variable 0 = Global Variable 0 + 1
return and RUN default
Создаем этот скрипт по шагам:
Запускаем Script Maker.
Из Меню выбираем File->Properties.
Набираем Mercutios Quest в Description. Нажимаем OK.
Из Меню выбираем Line->Action.
Из списка выбираем (num) = (num) + (num). Нажимаем OK.
Из списка выбираем Global Variable. Набираем 0. Нажимаем OK.
Из списка выбираем Global Variable. Набираем 0. Нажимаем OK.
Набираем 1. Нажимаем OK.
Из меню Line->Action.
Из списка выбираем return and RUN default.
Из меню File->Save и записываем как 00003MercutioQuest.scr в /scr директорию Вашего модуля.
Этот скрипт, как увидим позже, присоединяется к каждому монстру в точку присоединения Dying. Каждый раз, как одна из крыс в подвале Mercutio будет убита, этот скрипт будет запущен и увеличит Global Variable 0 на 1.
/scr/0002Mercutio.scr: Этот скрипт будет управлять диалогом с Mercutio. Кроме того что Mercutio даёт нам, он также будет продавцом, и мы сможем с ним поторговать. Скрипт будет также проверять, убили ли мы обоих чудищ и награждать нас соответственно. Давайте посмотрим на скрипт:
Name: Mercutios Script Flags: None Lines: 9
IF npc Attachee has met pc triggerer before THEN dialog 60 ELSE dialog 1
goto line 8
IF Global Variable 0 == 2 THEN goto line 4 ELSE dialog 50
goto line 8
set PC triggerer quest 1000 to state 4
gold of triggerer: adjust by 100
reaction of npc Attachee to pc triggerer: adjust by 10
dialog 40
return and SKIP default
Чтобы понять скрипт лучше, посмотрим на /dlg/0002Mercutio.dlg , который рассматривается ниже. Рассмотрим каждую строку скрипта отдельно:
IF npc Attachee has met pc triggerer before THEN dialog 60 ELSE dialog 1 Первая строка проверяет, говорили ли вы с Mercutio (npc) раньше. Если да, то диалог начинается на строке 60 (It is good to see you again. What can I do for you?). Иначе, если это первый раз, то со строки 1 (Greetings traveler! I am Mercutio. What can I do for you?), где Mercutio представляется.
goto line 8 Когда диалог возвращает управление в скрипт, оно перейдет на строку, которую вызовет диалог. Поэтому, мы перейдем на последнюю строку, где скрипт заканчивается.
IF Global Variable 0 == 2 THEN goto line 4 ELSE dialog 50 Эта строчка скрипта вызывается из диалога когда PC говорит Mercutio , что всех поубивал (Ive gotten rid of those critters in your cellar.). Скрипт проверяет Global Variable 0 , чтобы увидеть оба ли монстра мертвы. Если ДА, то скрипт переходит на строку 4, в противном случае — возвращает управление в диалог в строку 50 (I think there are still some critters left. Go back down and make sure you got them all.).
goto line 8 То же что и строка 1.
set PC triggerer quest 1000 to state 4 Когда квест пройден, ставим состояние квеста в Пройден (4).
gold of triggerer: adjust by 100 Даем PC 100 золота. Если число отрицательное, то золото заберется у PC.
reaction of npc Attachee to PC triggerer: adjust by 10 Так как PC помог Mercutio с чудищами, мы увеличиваем отношение Mercutio к PC на 10. Если число отрицательное, то отношение станет хуже.
dialog 40 Возвращаем управление в диалог на 40-ю строку (Thank you! Here are the coins I owe you.) где Mercutio благодарит PC.
return and SKIP default Возвращаем управление игре и говорим не делать действие по умолчанию для диалога с npc (в случае если скрипт присоединен к точке присоединения Mercutio, Dialog).
Я не буду пояснять, как создавать строки по шагам. Думаю на этот момент Вы уже достаточно с этим разобрались.
4. Создание диалога
Теперь посмотрим на /dlg/0002Mercutio.dlg который содержит диалог, дающий квест и позволяющий торговать с Mercutio. Вот как это выглядит:
{1}{Greetings traveler! I am Mercutio. What can I do for you?}{Greetings traveler! I am Mercutio. What can I do for you?}{}{}{}{}
{2}{Q:1000}{}{1}{}{}{}
{3}{B:}{}{1}{}{}{}
{4}{Nothing right now.}{}{1}{}{0}{}
{5}{The following are quest responses.}{}{}{}{}{}
{6}{Do you have any jobs for me?}{}{1}{}{10}{qu 1000 1}
{7}{Ive been thinking about that job you mentioned.}{}{1}{}{20}{}
{8}{Ive gotten rid of those critters in your cellar.}{}{1}{}{-2}{}
{10}{Yes, I do. Ive been having some problems with critters in my basement. Ill give you 100 coins if you get rid of them.}{Yes, I do. Ive been having some problems with critters in my basement. Ill give you 100 coins if you get rid of them.}{}{}{}{}
{11}{Ill do it.}{}{1}{}{30}{qu 1000 2}
{12}{Ill think about it.}{}{1}{}{0}{}
{20}{Have you decided to take up the job?}{Have you decided to take up the job?}{}{}{}{}
{21}{Yes.}{}{1}{}{30}{qu 1000 2}
{22}{I have to think about it some more.}{}{1}{}{0}{}
{30}{Excellent! Let me know when youve gotten rid of them.}{Excellent! Let me know when youve gotten rid of them.}{}{}{}{}
{31}{Okay.}{}{1}{}{0}{}
{40}{Thank you! Here are the coins I owe you.}{Thank you! Here are the coins I owe you.}{}{}{}{}
{41}{E:}{}{1}{}{0}{}
{50}{I think there are still some critters left. Go back down and make sure you got them all.}{I think there are still some critters left. Go back down and make sure you got them all.}{}{}{}{}
{51}{Okay.}{}{1}{}{0}{}
{60}{It is good to see you again. What can I do for you?}{It is good to see you again. What can I do for you?}{}{}{}{}
{61}{Q:1000}{}{1}{}{}{}
{62}{B:}{}{1}{}{}{}
{63}{Nothing right now.}{}{1}{}{0}{}
Хорошо, чуть сложновато. Прочтите Eventscripts.doc для большей информации по параметрам. Давайте разберем и проанализируем:
{1}{Greetings traveler! I am Mercutio. What can I do for you?}{Greetings traveler! I am Mercutio. What can I do for you?}{}{}{}{}
{2}{Q:1000}{}{1}{}{}{}
{3}{B:}{}{1}{}{}{}
{4}{Nothing right now.}{}{1}{}{0}{}
Строка {1} сказана Mercutio когда он первый раз говорит с PC. Как вы помните, мы отметили это в скрипте.
Строка {2} — сгенерированный диалог . Эта строка заменится на соответствующую из /rules/gamequest.mes. Мы посмотрим на этот текст.
Строка {3} — также сгенерированный диалог. Посмотрите в GeneratedDialog.doc для большей информации. Если PC выберет эту строку, то появится окошко торговли.
Строка {4} Выход из диалога и возвращение управления скрипту.
{5}{The following are quest responses.}{}{}{}{}{}
{6}{Do you have any jobs for me?}{}{1}{}{10}{qu 1000 1}
{7}{Ive been thinking about that job you mentioned.}{}{1}{}{20}{}
{8}{Ive gotten rid of those critters in your cellar.}{}{1}{}{-2}{}
В этой точке диалога, состояние quest 1000 — 0 значит это первый разговор Mercutio и PC. Поэтому строка {2} заменится на {6}, давая PC опцию в диалоге спросить про работу. Когда PC выберет это, состояние quest 1000 установится на 1 (Известно) и пропустит управление в строку диалога {10}.
Строка {7} будет показана, если состояние quest 1000 — 1 (Известно). Если PC выберет ее, то управление перейдет на строку {20}.
Строка {8} показывается сразу для двух состоянийquest 1000- для 2 и 3. Если PC выбирает ее, то управление передается в скрипт на строку 2, где Global Variable 0 проверяется на равенство с 2. Если да, то управление перейдет сразу на строку диалога {40}(Thank you! Here are the coins I owe you.). В противном случае, на {50}(I think there are still some critters left. Go back down and make sure you got them all.).
Строка {5}, это то, о чем я не очень уверен. Эта строка должна быть, чтобы не дать стокам {6}, {7} и {8} появиться как опции диалога в первом разговоре с Mercutio. Эта строка не имеет никаких параметров ({}{}{}{}{}), и я догадываюсь, что компилятор не дает ее как опцию в диалоге и останавливает чтение диалога здесь.
{10}{Yes, I do. Ive been having some problems with critters in my basement. Ill give you 100 coins if you get rid of them.}{Yes, I do. Ive been having some problems with critters in my basement. Ill give you 100 coins if you get rid of them.}{}{}{}{}
{11}{Ill do it.}{}{1}{}{30}{qu 10002}
{12}{Ill think about it.}{}{1}{}{0}{}
Когда игрок спрашивает Mercutio есть ли работа, управление попадает на строку {10}, где Mercutio описывает свое горе с чудищами в погребке. PC получает опцию {11} принять квест. Если да, состояние quest 1000 ставится 2 (Принято) и управление передается на строку {30}. Если PC выберет {12}, управление вернется в скрипт и диалог кончится, оставляя квест quest 1000 как 1 (Известный).
{20}{Have you decided to take up the job?}{Have you decided to take up the job?}{}{}{}{}
{21}{Yes.}{}{1}{}{30}{qu 1000 2}
{22}{I have to think about it some more.}{}{1}{}{0}{}
В строке {20}, Mercutio спрашивает игрока, согласен ли он теперь выполнить квест, если PC прежде сказал, что подумает (line {12}).
PC берет квест выбирая строку {21} и состояние quest 1000 ставится в 2 (Принят). Управление переходит на строчку диалога {30}.
В строке {22}, PC может сказать Mercutio все еще думает. Диалог заканчивается и управление переходит в скрипт.
{30}{Excellent! Let me know when youve gotten rid of them.}{Excellent! Let me know when youve gotten rid of them.}{}{}{}{}
{31}{Okay.}{}{1}{}{0}{}
Mercutio говорит строку {30}, после того как PC берет квест в строке {11}. Единственный ответ в строке {31} заканчивает диалог и возвращает управление в скрипт.
{40}{Thank you! Here are the coins I owe you.}{Thank you! Here are the coins I owe you.}{}{}{}{}
{41}{E:}{}{1}{}{0}{}
Если посмотрите на строку 7 скрипта (не диалога), то увидите, что управление в ней переходит в диалог (строку {40}), как только квест будет успешно проверен на готовность.
Строка {41} — сгенерированный диалог. Проверьте GeneratedDialog.doc для более полной информации. Подходящая строка ухода будет подставлена сюда, что закончит диалог и вернет управление в скрипт.
{50}{I think there are still some critters left. Go back down and make sure you got them all.}{I think there are still some critters left. Go back down and make sure you got them all.}{}{}{}{}
{51}{Okay.}{}{1}{}{0}{}
Если проверка провалилась, то управление переходит в диалог (строка {50}). Mercutio скажет что еще кто-то остался.
Строка {51} заканчивает диалог и передает управление в скрипт.
{60}{It is good to see you again. What can I do for you?}{It is good to see you again. What can I do for you?}{}{}{}{}
{61}{Q:1000}{}{1}{}{}{}
{62}{B:}{}{1}{}{}{}
{63}{Nothing right now.}{}{1}{}{0}{}
Последний блок диалога управляет разговором, если Mercutio и PC уже разговаривали. Это проверяется строкой скрипта 0. Если PC говорил с Mercutio раньше, то скрипт отдает управление в диалог (строка {60}).
Строка {61} — сгенерированный диалог. Она будет заменена на строку {6} (Do you have any jobs for me?), строку {7} (I’ve been thinking about that job you mentioned.), или {8} (I’ve gotten rid of those critters in your cellar.). Это зависит от состояния квеста (посмотрите на табличку выше).
Строка {62} — сгенерированный диалог.
Строка {63} — выходит из диалога и отдает управление в скрипт.
Ну, это все про диалог. Нет так и сложно, правда?
5. WorldEd
Думаю, что многие из вас уже довольно хорошо управляются с WorldEd. Не буду погружаться в детали рисования карт. Просто покажу по шагам как сделать Mercutio, его инвентарь, чудищ и присоединить к ним скрипты. Поехали:
Откройте домашнюю карту.
Создайте мужчину-продавца (male human shopkeeper). Оденьте его. Он будет Mercutio.
Создайте контейнер (ну сундук, например). Нажмите правую кнопку на нем и выберете Edit. Из списка Inventory Source, выбирайте Smith (Quality) или любой другой. Жмите OK , чтобы закрыть диалог.
Правый click на сундуке снова, выберете Remember for Substitute.
Правый click на Mercutio, выберете Set Substitute Inventory.
Правый click на Mercutio еще раз и выбирайте Edit. Click на Scripts. Выбор точки присоединения Dialog. Тип 2 в Script окошке. Жмите OK , чтобы закрыть Script Attachment диалог. Жмите OK , чтобы закрыть и NPC диалог.
Сохраните домашнюю карту.
Откройте карту погреба.
Создайте двух крыс.
Правый click на одной из крыс, выбирайте Edit. Click на Scripts. Выбор точки присоединения Dying. Тип 3 в Script окошке. Жмите OK , чтобы закрыть Script Attachment диалог. Жмите OK , чтобы закрыть и NPC диалог.
Повторите предыдущий шаг с другой крысой.
Запишите карту погреба.
Откомпилируйте.
6. Запускаем модуль
Ну, если я все правильно рассказал и вы следовали за мной правильно (прим. переводчика и я правильно перевел (подтвеждаю, все работает, но учтите примечание san) ), то вы сможете пройтись к Mercutio, начать разговор с ним, поговорить о торговле или квесте. Проверьте все опции диалога. Вы можете убить крыс, перед тем как говорить с Mercutio.
Ваш журнал обновится при изменении состояния квеста на Известный, принятый или Выполненный. Провалить этот квест нельзя. Разве что вас убьют крысы.
7. Контактная информация
Если имеете какие-то предложения, поправки, критику или просто спасибо, то пишите на gix@sulanet.com. Меня также можно найти на Vault Network . Мое прозвище DeviantBoi.
8. История создания
August 31, 2001: Version 1.0. Первый постинг этого пособия.
(Прим. Переводчика: Если будете писать автору — пишите на аглицком языке.) Перевод: 1 сентября 2001 г.
Если Вы вдумчиво прочитали и разобрались с этим конкретным скриптом — Вы можете создать и любой другой (похожий), скриптовый язык не сложный и, более-менее понятный. Экспериментируйте. Пригодится и описание приемов работы с ScrMaker.
Как видно при прочтении, диалоги почти не переведены, но написаны настолько примитивным английским, что Вы это сделаете легко и сами.
Вопросы, замечания и предложения по поводу прочитанного можно высказать на Форуме.