Гайд по созданию квестов

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

О системе:

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

Механика

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

Данные квеста:

В этой части находятся всевозможные необходимые настройки квеста.
Рассмотрим каждый конфиг по порядку
quest_single - принимает значения true\false. Если включена(true) эта настройка, то во время выполнения квеста одним из игроков, этот квест станет недоступным для других, до тех пор пока его не выполнит игрок взявший данный квест.
quest_repeat - принимает значения true\false. Если включена(true) эта настройка, то данный квест может быть выполнен повторно(через определенный промежуток времени)
quest_num - номер квеста
quest_name - имя квеста, выводится в списке квестов
quest_req_rep - минимальное количество репутации необходимое для того что бы участвовать в данном квесте. Отмечу что у каждого нпц в процессе игры может сложится отрицательное или положительное мнение относительно игрока. Репутация так же влияет на размер наград за выполнение квеста. Если нпц плохо к вам относится, то он зажмет часть награды, а если хорошо, подкинет сверху деньжат.
quest_rang - Ранг квеста бывает от E, до S, во многом влияет на сложность квеста, к примеру во время сопровождения C ранга на вас могут даже не напасть, а вот при S ранге на вас будут нападать постоянно. Так же если игрок низкого ранга, то миссии более высокого ранга не отображаются.
quest_for_clan - квесты как правило выполняются во благо кому-то. В данном параметре указывается для кого квест, к примеру для обычных жителей селения, или для шиноби, или для какого то конкретного клана.
После выполнения репутация изменится автоматически, в зависимости от исхода миссии. На сколько сильно изменится репутация зависит от ранга миссии.
quest_vs_clan - клан во вред которому миссия, в остальном см. выше.
Для создания нелинейных цепочек квестов можно использовать следующие параметры:
quest_cond, quest_cond_other, quest_cond_status.
quest_cond - номер квеста который стоит проверить, на статус.
quest_cond_other - принимает значения true\false. Если включена(true) эта настройка, то проверяется у всех игроков на статус записанный в quest_cond_status.
quest_cond_status - может принимать статус - unstarted\started\complited\failed (не начат\начат\выполнен\провален)
Используя эти параметры, можно легко сделать сложную линейку квестов с несколькими концовками.
Пример 1:
quest_cond = 2
quest_cond_other = true
quest_cond_status = started
Это означает что если кто то взял 2 квест, то этот квест появится в списке доступных.
Квест:
Есть квест А, в котором нужно убит цель. Когда берется этот квест, срабатывает квест Б, в котором может быть миссия по защите объекта, который необходимо убить по квесту А.
Пример 2:
quest_cond = 2
quest_cond_other = false
quest_cond_status = faled
Это означает что квест станет доступным в случае если игрок провалит квест #2.
Квест:
Есть квест А, в котором нам предлагают убить кого то, при встрече с объектом, он нам предлагает его не убивать. У нас есть выбор Да\Нет. И в случае отказа нпц может к примеру дать нам миссию по защите его от убийц. Именно в таких ситуациях можно делать сюжетные развилки. Если да - один сюжет, если нет - другой.
В случае отказа\провала и тд, откроется данный квест, в котором можно пойти по другому "пути"
quest_stages очень важный параметр, равен количеству "этапов" в квесте. По мере выполнения какого либо пункта в квесте "этап" увеличивается на 1. Поговорили с нпц, этап увеличится на 1, выполнили его просьбу по нахождению предмета, "этап" увеличивается на 1, отдали найденную вещь - "этап" увеличивается на 1. Когда этап равен quest_stages, считается что квест выполнен полностью. Отмечу что отсчет этапа начинается с 0, а не с 1.
Пример:
quest_npc[0] = Npc_Unit[1] // взяли миссию, "этап" увеличивается на 1
quest_npc[1] = Npc_Unit[2] // поговорили с нпц, "этап" увеличивается на 1
quest_npc[2] = Npc_Unit[3] // поговорили с нпц, "этап" увеличивается на 1
quest_npc[3] = Npc_Unit[1] // сдали миссию, "этап" увеличивается на 1
Сумма должна быть равна quest_stages.
PS: в прочем это я сам буду делать, это чисто для представления возможностей создания квестов.
quest_rew
quest_exp
quest_money
В квестах предусмотрено 3 типа награды, это итем\опыт\деньги.
Когда вы ознакомились с настройками, перейдем к созданию самого интересного, диалогов.

Пример простого квеста в 3 этапа(взять квест, найти предмет, сдать квест)

раскрыть
scope ListsFromBook initializer Init

StartQuest

    QuestHead
        quest_single = false
        quest_repeat = false
        quest_num = 44
        quest_name = "Страницы из книги"
        quest_req_rep = 50
        quest_rang = E
        quest_for_clan = konoha_shinobi 
        quest_vs_clan = none
        quest_cond = 0
        quest_cond_other = false
        quest_cond_status = unstarted
        quest_stages = 2
        quest_rew = 'I00G'
        quest_exp = 0
        quest_money = 100
        quest_npc[0] = Npc_Unit[38]
        quest_npc[2] = Npc_Unit[38]
    EndQuestHead
   
      IsNpcIdAndStage(38, 1)
    
        
        Replicas
            npc_ask ="Черт, мой отчет унесло, теперь мне не избежать гнева Цунаде-сама"
            quest_tips = "Соберите листы из отчета которые разлетелись по всему городу"
            
            strHELP = "Спросить в чем нужна помощь"
            strMEAN = "Согласится помочь"
            strEXIT = "Сказать что нет времени"
            
            qweHELP = "В чем проблема?"
            qweMEAN = "Ладно, мне не сложно, могу и помочь"
            qweEXIT = "Удачи в охоте на отчет"
            
            ansHELP = "Выручи друг! Я был беспечен, оставил отчет на столе, а когда подул ветер его сдуло, к сожалению я нашел не все листы, если я не принесу все листы, я получу серьезную взбучку от Хокаге, выручай!"
            ansMEAN = "Огромное спасибо! Если бы не ты, мне бы урезали жалование"
            ansEXIT = "Значит, не сможешь помочь? Очень жаль..." 
        EndReplicas

        QuestActions
            MeanAction
                CreateNItemInRange(Report, 5, "Лист из репорта","Вы собрали все страницы, вернитесь и доложите об этом", 6000., -12000., 2000., false, onDIRT)
            EndAction
        EndQuestActions
        
      IsNpcIdAndStage(38, 3)
    
        
        Replicas
            strMEAN = "Отдать листы"
            qweMEAN = "Хоть это было и хлопотно, я собрал все листы"
            ansMEAN = "Ты уже все их собрал, огромное тебе спасибо"
        EndReplicas

        QuestActions
        EndQuestActions
    
EndQuest

endscope

Пример сложного квеста

раскрыть
scope SupportHome initializer Init
StartQuest
QuestHead
quest_single = true
quest_repeat = false
quest_num = 82
quest_name = "Больной"
quest_req_rep = 50
quest_rang = E
quest_for_clan = konoha_shinobi
quest_vs_clan = none
quest_cond = 0
quest_cond_other = false
quest_cond_status = unstarted
quest_stages = 18
quest_rew = 'I00G'
quest_exp = 0
quest_money = 100
quest_npc[0] = Npc_Unit[162];
quest_npc[2] = Npc_Unit[43];
quest_npc[4] = Npc_Unit[94];
quest_npc[5] = Npc_Unit[94];
quest_npc[6] = Npc_Unit[94];
quest_npc[8] = Npc_Unit[2];
quest_npc[9] = Npc_Unit[94];
quest_npc[10] = Npc_Unit[40];
quest_npc[12] = Npc_Unit[257];
quest_npc[14] = Npc_Unit[258];
quest_npc[16] = Npc_Unit[258];
quest_npc[18] = Npc_Unit[162];
EndQuestHead

IsNpcIdAndStage(162, 1)


Replicas
npc_ask ="Вы шиноби? Выполни пожалуйста мою просьбу, я очень хорошо заплачу!"
quest_tips = "Отправтесь в селение Листа и найдите там хорошего медика."
strHELP = "Детали миссии"
strMEAN = "Продолжить миссию"
strEXIT = "Отказатся от миссии"
qweHELP = "Хорошо заплатишь говоришь? Интересно. И что же ты хочешь что бы я сделал?"
qweMEAN = "Что ж, у меня сегодня хорошее настроение, так что я помогу тебе."
qweEXIT = "У меня нет настроения решать чужие проблемы, ты уж извини."
ansHELP = "Спаси моего брата, он внезапно заболел, местные врачи не могут ему помочь. Возможно врач из селения Листа мог бы ему помочь."
ansMEAN = "Поторопись, неизвестно сколько еще мой брат продержится."
ansEXIT = "Чертовы шиноби..."
EndReplicas
QuestActions
MeanAction
CreateQuestAdventure(5000.,-12000., 4000., "Наконец я добрался до селения Листа, теперь нужно найти хорошего медика... наверно стоит узнать у жителей где можно найти медика", "");
EndAction
EndQuestActions

IsNpcIdAndStage(43, 3)


Replicas
npc_ask ="Тебе что то нужно?"
quest_tips = "Отправляйтесь к стадиону и отыщите медика"
strMEAN = "Спросить о враче"
qweMEAN = "Да. Я ищу хорошего врача, не знаешь где его можно найти?"
ansMEAN = "Да, есть тут неподалеку хороший врач, он живет неподалеку от стадиона"
EndReplicas
QuestActions
MeanAction
CreateQuestAdventure(3900.,-13000., 500., "Так, я у стадиона, но где же искать этого врача? Нужно поспрашивать у местных... Хм, может быть эта девушка знает.", "");
EndAction
EndQuestActions

IsNpcIdAndStage(94, 5)


Replicas
npc_ask ="*Девушка занимается своей работой и не замечает вас*"
strMEAN = "Спросить о враче"
qweMEAN = "Эй сестренка, не подскажешь где я могу найти врача? Мне сказали, что он живет тут неподалеку от стадиона."
ansMEAN = "Да, он живет неподалеку, но сейчас его тут нету."
EndReplicas
QuestActions
EndQuestActions

IsNpcIdAndStage(94, 6)


Replicas
npc_ask ="*Девушка занимается своей работой и не замечает вас*"
quest_tips = "Отправляйтесь к стадиону и отыщите врача"
strMEAN = "Спросить о местонахождении врача"
qweMEAN = "А немогла бы ты мне подсказать, где его можно найти?"
ansMEAN = "Хорошо, скажу, но только если ты поможешь мне немного с работой, видишь, я тут зашиваюсь просто."
EndReplicas
QuestActions
EndQuestActions

IsNpcIdAndStage(94, 7)


Replicas
npc_ask ="*Девушка занимается своей работой и не замечает вас*"
quest_tips = "Отыщите травницу, она должна быть недалеко от селения Листа"
strGOLD = "Купить рамен (150 рё)"
strMEAN = "Помочь с работой"
strEVIL = "Применить угрозу"
qweGOLD = "Хорошо, давай так, я куплю у тебя порцию рамена, а ты мне расскажещь, идет?"
qweMEAN = "Хорошо, чем я могу тебе помочь?"
qweEVIL = "Слушай, сестричка, я на миссии и я не в настроении, по этому не шути со мной и скажи где этот чертов врач, иначе мне придется поговорить с тобой по другому"
ansGOLD = "Что ж, клиенту я не могу отказать, медик ушел к травнице, она живет рядом с селением, давай я тебе покажу на карте, а то ненайдешь же."
ansMEAN = "Да ладно, я же пошутила, сейчас я тебе скажу куда идти"
ansEVIL = "*Угроза подействовала, и девушка быстро рассказала где можно найти травника*"
EndReplicas
QuestActions
CreateQuestAdventureWithTrap(2400., -15700., 350., Bandit, 5, "Вы попали в западню устроенную бандитами. Разберитесь с ними и поторопитесь узнать о судьбе врача у травницы.")
GoldAction
PayMoney(150)
EndAction
EndQuestActions

IsNpcIdAndStage(2, 9)


Replicas
npc_ask ="Тебе что то нужно, может быть травы или что то еще?"
quest_tips = "Вернитесь в селение и узнайте, вернулся ли врач"
strMEAN = "Спросить о судьбе врача"
qweMEAN = "Послушайте, я ищу врача, мне сказали что он пошел к вам за травами, он приходил к вам?"
ansMEAN = "Да, заходил что бы купить лечебных трав, но он уже ушел. Ты видимо разменулся с ним."
EndReplicas
QuestActions
EndQuestActions

IsNpcIdAndStage(94, 10)


Replicas
npc_ask ="*Девушка как обычно занимается своей работой и не замечает вас*"
quest_tips = "Отправляйтесь к северным воротам и узнайте у стражников о враче"
strMEAN = "Спросить пришел ли врач"
qweMEAN = "Эй, сестренка, врач случайно не приходил? А то мне травница сказала, что он уже ушел назад."
ansMEAN = "Нет, он еще не приходил, возможно он пошел к своим пациентам. Что бы наверняка узнать, спроси у стражников у южных ворот селения, они должны были его видеть, и возможно знают где он"
EndReplicas
QuestActions
EndQuestActions

IsNpcIdAndStage(40, 11)


Replicas
npc_ask ="Эй, у тебя какое то дело ко мне?"
quest_tips = "Возможно с врачем что то случилось по дороге, возможно вы найдете подсказку если внимательно обследуете маршрут по которому шел врач."
strMEAN = "Спросить о враче"
qweMEAN = "Меня послали в селение что бы я нашел врача, и вот никак немогу с ним встретится, он случаем тут не проходил?"
ansMEAN = "Да, он сегодня он проходил тут, кажется к травнице отправился, но он еще не возвращался."
EndReplicas
QuestActions
MeanAction
CreateQuestAdventure(3270., -15900., 350., "Вы нашли место, где судя по следам совсем недавно было совершено нападение. Судя по всему кто-то напал на врача и увели куда то его. Благодаря следам вы сможете выследить их", "");
EndAction
EndQuestActions

IsNpcIdAndStage(257, 13)


Replicas
quest_tips = "*Вы заметили что старик явно врет* Обследуйте город, возможно вы найдете какие нить зацепки"
npc_ask ="Кхе-кхе, вам что то нужно, молодой человек?"
strMEAN = "Распросить о городе"
qweMEAN = "Старик, тут случаем не проходила группа людей вместе со стариком-врачем?"
ansMEAN = "Да нет, не видел я ничего."
EndReplicas
QuestActions
MeanAction
CreateQuestAdventure(-3950., -3300., 350., "Вы нашли крайне подозрительное место, нужно его исследовать, возможно врач там", "");
EndAction
EndQuestActions
IsNpcIdAndStage(258, 15)


Replicas
npc_ask ="*Эй! Вы шиноби листа? Меня похитили эти бандиты! Спасите меня!*"
quest_tips = "Выберитесь из пещеры"
strMEAN = "Спасти"
qweMEAN = "Я пришел за вами, давайте выбираться отсюда и поскорее"
EndReplicas
QuestActions
MeanAction
Escort(Npc_Unit[258],-3950., -3300., "Вы успешно выбрались из пещеры. Расскажите врачу о своей проблеме", "Врач не доставлен вовремя, миссия провалена", "Врач",'h00G')
EndAction
EndQuestActions

IsNpcIdAndStage(258, 17)


Replicas
npc_ask ="Вы сказали, что пришли за мной, у вас какое то дело ко мне?"
quest_tips = "Отправляйтесь к северным воротам и узнайте у стражников о враче"
strMEAN = "Рассказать о проблеме"
qweMEAN = "Старейшина одной деревни поручил мне миссию найти хорошего врача для его больного брата. В селении листа я узнал что вы лучший врач в округе, по этому я и искал вас. Не могли бы вы отправится со мной к больному?"
ansMEAN = "Хорошо, я вам помогу, как никак я обязан за спасение. Но нам нужно торопится, я не думаю что бандиты оставят нас просто так. Они хотели заставить меня изготоваливать наркотики и мне кажется от своей идеи они так просто не откажутся."
EndReplicas
QuestActions
MeanAction
Escort(Npc_Unit[258],12940., -23900., "Вы успешно добрались до деревушки. Поговорите со старейшиной.", "Врач не доставлен вовремя, миссия провалена", "Врач",'h00G')
EndAction
EndQuestActions

IsNpcIdAndStage(162, 19)


Replicas
npc_ask ="Ты вернуля! Ты нашел врача? Мой брат больше не может ждать!"
strMEAN = "Завершить миссию"
qweMEAN = "Да, я нашел врача, он один из лучших в селении Листа. Он поможет вашему брату."
ansMEAN = "Огромное спасибо тебе. Благодаря тебе жизнь моего брата спасена, по этому в знак благодарности, прими пожалуйста нашу семейную реликвию. Она передовалась из поколение в поколение. Это древнее оружие, еще времен мудреца 6 путей. Нам оно уже не нужно, мы уже много поколений обычные крестьяне, но я уверен используя его ты сможешь многим помочь."
EndReplicas
QuestActions
MeanAction
SetUnitPositionOnStartPosition(Npc_Unit[258]);
EndAction
EndQuestActions
EndQuest
endscope
`
ОЖИДАНИЕ РЕКЛАМЫ...