Перейти к контенту

[CS] Создание квеста


Рекомендуемые сообщения

Не знаю как вы, но лично я задавался вопросом как создать простой квест в Чистом Небе?

Вот я и накатал "инструкцию":

[spoiler=Создание примитивного квеста в ЧН.]Инструкция основана на моде "SEMKI", который выложили ещё давным - давно на официальном форуме.

квест прост: активируется скриптом (action'ом в диалоге), при появлении инфопрошня считается выполненным.

Создаём в папке gamedata\scripts файл ваше_название_скрипта.script, в него пишем:

function ваше_название_функции()
xr_effects.give_inited_task(nil, nil, {"storyline", "name_of_your_quest", "bandit"})
end

name_of_your_quest - будет название квеста из tm_***.ltx

bandit - группировка (при наведении на точку в ПДА (т.е. которая "Весит" на рестрикторе например.) будет высвечиваться описание квеста и какая группировка её дала.)

 

далее берём файл gamedata\configs\misc\tm_***.ltx от соотв. локации и пишем в начале под строчку [list_tm_***]:

name_of_your_quest

и далее внизу аналогично существующим:

[name_of_your_quest]
type = storyline
task_type = additional
prior = 10
icon = ui_mt_image_attack_tower
target_cond = true
name = youself_quest_name
text = youself_quest_text
condlist_0 = {+info_for_done} complete
target_story_ids = 724
auto_name = false
auto_faction = true

type = storyline - тип: сюжетная линия (тут можно указать "Принести предметы, уничтожить смарт" итд...)

task_type = additional - тип: дополнительный (если напишете storyline, то будет отображаться, как сюжетка )

prior = 10 - приоритет (значение того, что при появлении квеста он автоматически будет активным)

icon = ui_mt_image_attack_tower - иконка, хотя я что толкьо не писал, получается стандартная

target_cond = true

name = youself_quest_name - имя из xml-массива

text = youself_quest_text - описание

condlist_0 = {+info_for_done} complete - при получении (+) инфопрошня info_for_done считать выполненным

target_story_ids = 724 - стори ИД на которого вешается метка (может быть тайник, труп, НПС, рестриктор, неважно...)

auto_name = false

auto_faction = true

 

прописываем описания в файлы из gamedata\configs\text\rus

также прописываем инфопрошни в игру (у нас это info_for_done)

P.S. target_story_ids = 724 - ID Йоги, лидера бандитов :)

 

в диалоги:

<action>ваше_название_скрипта.ваше_название_функции</action> -активируем

<give_info>info_for_done</give_info> - завершение

 

P.S. буду обновлять этот пост.

завтра распишу всё детально, "как прописать тексты, инфопрошни...", возможно выложу пример файликом

  • Полезно 2
Ссылка на комментарий

Stalkeroff, какие условия??? активируем фразой из диалога, там на фразу можно поставить <has_info></has_info>или <dont_has_info></dont_has_info>

вот те условие

и ещё можно на фразы прекондишоны вешать если ты не знаешь

Ссылка на комментарий

Работоспособность своего творения проверяли, уважаемый?

И где описаны ревардные функции?

Изменено пользователем Stalkeroff
Ссылка на комментарий

Stalkeroff, работает всё отлично. сам делал по простейшему моду SEMKI http://ifolder.ru/14391580 , который выложили давно на форуме gsc

кто выложил - не помню :(

 

И где описаны ревардные функции?

в скрипт прописываешь выдачу предмету актору, и дальше уже action-ом в диалоге

Ссылка на комментарий

Инструкция основана на моде "SEMKI"

Так может лучше было бы указать где этот мод валяется чем инструкции страчить? Маловато что-то для такого гоголя как квест.

Изменено пользователем sabir
Ссылка на комментарий

Проверено, работает. А есчё какие-нибудь примеры квестов по сложнее есть? (именно для CS)

 

Ну так, а голова на что? Сочиняй, обдумывай, твори.

ColR_iT

Изменено пользователем ColR_iT

«Разумная храбрость — это катахреза» из повести Стругацких «Стажёры»

FA58zbp.png

http://rghost.ru/45827792 5-этажка + школа №4 (из Припяти)

Ссылка на комментарий

Может тему закрепить в шапке? А то вроде как под формат подходит, хоть и коротко.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Хотелось б создать квест на болотах, в самом начале, после того как ГГ очнулся после выброса. Заходит он к торговцу а тот ему сливает координаты телепорта на другую локацию (Восток Янтаря), за кокую-нибудь мелочь. Собственно вопрос: Можно ли прописать к диалогу спаун на этот телепорт?

«Разумная храбрость — это катахреза» из повести Стругацких «Стажёры»

FA58zbp.png

http://rghost.ru/45827792 5-этажка + школа №4 (из Припяти)

Ссылка на комментарий

Возникли вот такие вопросы по квестам:

 

1) Как прописать выдачу инфопорции при входе в определённый сектор(портал) в здании.

2) Как прописать выдачу инфопорции при входе в определённый спэйс рестриктор.

3) Как прописать выдачу инфопорции по выбору из двух (не рандомно, а по наличию квестового персонажа в определённой точке).

 

Пока вроде всё.

«Разумная храбрость — это катахреза» из повести Стругацких «Стажёры»

FA58zbp.png

http://rghost.ru/45827792 5-этажка + школа №4 (из Припяти)

Ссылка на комментарий

RDS

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

2. Выдача инфопорции при вход в спейс рестриктор можно осуществить при помощи следующей логики определённых у этих рестрикторов:

[logic]
active = sr_idle 
[sr_idle]
on_actor_inside = nil %+info_portion_name%

При входе в рестриктор будет единожды выдана инфопорция, после чего схема уйдёт в nil, дабы не повторять выдачу многократно.

3. Вероятно одним из наиболее правильных решений, будет выдать нужный тебе инфопоршень именно в определённой точки непосредственно от самого НПС. Т.е. в логике персонажа, будучи на одной из точек, посредством

on_info = %+info_portion_name%

и выдать нужную тебе инфопорцию.

 

P.S. ИМХО, вопросы больше в ковырялку...

Изменено пользователем ColR_iT
Ссылка на комментарий

2. Можно и другим способом, не связанным с логикой, зато требующим работы со скриптом. Например:

if sr:inside(db.actor:position()) then
  ...
end

где sr - ссылка на искомый рестриктор.

А так это и на мой взгляд больше для ковырялки инфа.

Изменено пользователем Kirgudu
Ссылка на комментарий
Kirgudu, считаю, что спавнить рестрикторы через скрипт, не что иное как, расточительство, а если спавнить рестриктор через all.spawn, то почему бы для него разом и логику не написать, предварительно вынеся его в отдельный файл? Изменено пользователем ColR_iT
Ссылка на комментарий
ColR_iT, согласен. :) Но я имел в виду тот частный случай, когда рестриктор в all.spawn мы уже имеем, а логики на нём нет (редактировать же all.spawn по каким-либо причинам нежелательно), или она нужна более сложная, завязанная на скрипты. Примером может служить симуляция и обработка рестрикторов на защиту.
Ссылка на комментарий

Составлял квест дошло дело допрописи текстов ,но вот незадача информация о квесте в пда не отобразилась. Предыдущий свой квест делал так же, но все работало и отображалось. В чём причина не пойму . В файле stable_bio_name прописал

 

<string id="Sidor_qvest1">
<text>этот урод утомил Волка ,
замочи его.</text></string>
<string
id="Sidor_qvest_text">
<text>Проберись в подвалы
агропрома</text> </string>
<string
id="Sidor_qvest_title">
<text>Найти сталкера имя</text>
</string>
<string id="Sidor_qvest_text2">
<text>вернись
к Cидоровичу</text> </string>

 

 

В файле storyline_info_escape.xml прописал

 

<article id="Sidor_qvest56" name="Sidor_qvest_text" article_type="task"
group="Sidor_qvest_title">
       
<text>Sidor_qvest_tex1</text>
    </article>

 

Если кто знает в чом причина объясните.

 

post-41246-0-57518700-1460619374_thumb.jpg

Изменено пользователем нерон
Ссылка на комментарий

, В дереве диалога есть оператор action (смотри в примерах из игры) далее идет ссылка на функцию спавна, прописанную в одном из файлов скриптов (чаще в treasure meneger script). Или как вариант, в диалоге выдается infoporcion, которая и служит сигналом для спавна или перевода объекта в он-лайн, если он спавнится через ал-спавн.

Извиняюсь, не заметил, что тема CS, но там суть та же.

Изменено пользователем gruber
  • Полезно 1
Ссылка на комментарий
ЧН: Квест "Найти и принести два предмета".

 

Сегодня постараюсь подробно расписать создание задания "Найти и принести". Квест

будет активироваться через диалог секцией <action></action>, и завершаться

выдачей инфопорции <give_info></give_info>, думаю вам стоит прочесть статью по

написанию диалогов.

 

Список необходимых файлов и папок в папке gamedata:

configs\gameplay\ character_desc_marsh.xml dialogs_marsh.xml

info_marsh.xml

 

configs\misc\

tm_marsh.ltx

 

configs\text\rus\st_quest_bring_vodka_medkit.xml ;--\ Создать файл.

 

scripts\quest_bring_vodka_medkit.script ;--\ Создать файл.

 

Прописываем диалоги в "Характер нужного нам НПС'а", пусть это будет Холод:

Файл: character_desc_marsh.xml

Секция: <specific_character id="mar_csky_barman" team_default = "1">

После строки: <actor_dialog>treasure_dialog</actor_dialog>

Пишем: <actor_dialog>quest_find_vodka_medkit</actor_dialog>         <actor_dialog>quest_bring_vodka_medkit</actor_dialog>

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью.

 

Теперь нам нужно создать два диалога, на поиск "quest_find_vodka_medkit" и на принесение предмета "quest_bring_vodka_medkit":

Файл: dialogs_marsh.xml

В самом низу перед строкой "</game_dialogs>" создаем диалоги: 

<dialog id="quest_find_vodka_medkit"> 
  <dont_has_info>quest_vodka_medkit_give</dont_has_info> <!-- При получение инфопорции "quest_vodka_medkit_give" блокировать диалог. --> 
 	<precondition>quest_bring_vodka_medkit.not_have_vodka_medkit</precondition> <!-- 
Прекондишин для проверки скриптом на отсутствие предметов у ГГ. Если нет необходимых предметов диалог будет активен. --> 
 	<phrase_list> 
 	<phrase id="0"> 
 	 	<text>Мне нужна работа, есть что на примете?</text> 
 	 	<next>1</next> 
 	</phrase> 
 	<phrase id="1"> 
 	 	<text>Есть, нужна бутылка водки и аптечка.</text> 
 	 	<next>2</next> 
 	 	<next>3</next> 
</phrase> 
 	<phrase id="2"> 
 	 	<text>Хорошо, принесу.</text> 
 	 	<next>4</next> 
 	</phrase> 
 	<phrase id="3"> 
 	 	<text>Я передумал.</text> 
 	 	<action>dialogs.break_dialog</action> <!-- Экшен на завершение диалога. --> 
 	</phrase> 
 	<phrase id="4"> 
 	 	<text>Вот и славненько.</text> 
 	 	<give_info>quest_vodka_medkit_give</give_info> <!-- Получение инфопорции. --> 
 <action>quest_bring_vodka_medkit.give_quest_bring_vodka_medkit</action> <!-- Экшен на выдачу квеста. --> 
 	</phrase> 
 	</phrase_list> 
</dialog> 
 
<dialog id="quest_bring_vodka_medkit"> 
 	 	<has_info>quest_vodka_medkit_give</has_info>  <!-- Проверка, есть ли у нас инфопорция, при получение инфопорции "quest_vodka_medkit_give" диалог будет активен. 
--> 
  <dont_has_info>quest_vodka_medkit_done</dont_has_info> <!-- При получение инфопорции "quest_vodka_medkit_done" блокировать диалог. --> 
 	 	<precondition>quest_bring_vodka_medkit.have_vodka_medkit</precondition> <!-- Прекондишин для проверки скриптом на наличие предметов у ГГ. Если есть необходимые предметы диалог будет активен. --> 
 	<phrase_list> 
 	<phrase id="0"> 
 	 	<text>Задание выполнено, держи предметы.</text> 
 	<action>quest_bring_vodka_medkit.quest_bring_vodka_medkit_bring_object</action> 
<!-- Экшен на передачу предметов НПС'у. --> 
 	 	<next>1</next> 
 	</phrase> 
 	<phrase id="1"> 
 	 	<text>Благодарю, держи награду.</text> 
 <action>quest_bring_vodka_medkit.quest_bring_vodka_medkit_get_money</action> <!- Экшен на получение награды. --> 
  <give_info>quest_vodka_medkit_done</give_info> <!-- Получение инфопорции, получили инфопорцию "quest_vodka_medkit_done" завершили квест. --> 
 	</phrase> 
 	</phrase_list> 
</dialog>

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью.

 

Создание инфопорции:

Файл: info_marsh.xml

В самом низу перед строкой "</game_information_portions>" создаем инфопорции:

<info_portion id="quest_vodka_medkit_give"></info_portion> 
<info_portion id="quest_vodka_medkit_done"></info_portion> 

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью.

 

 

Создание самого квеста:

Файл: tm_marsh.ltx

В секцию [list_tm_marsh] вписываем:

quest_bring_vodka_medkit_1
quest_bring_vodka_medkit_2

В самом низу пишем:

[quest_bring_vodka_medkit_1]
auto_name = false ;--\ Автоматическое имя, не совсем понятно зачем здесь эта строка. 
type = storyline ;--\ Тип задания, есть варианты "bring_item - Принести предмет", "recover_item - Вернуть предмет", "eliminate_smart - Уничтожение смарта", "defend_smart - Защита смарта", "capture_smart - Захват смарта", "take_reward - Получение награды", "storyline - Сюжетное задание".
task_type = additional ;--\ Тип задания, есть вырианты "storyline - Сюжетное задание", "additional - Второстепенное задание". 
name = quest_find_vodka_medkit_name ;--\ Название задания, из text\rus\st_*.xml документа.
text = quest_bring_vodka_medkit_text ;--\ Описание задания, из text\rus\st_*.xml документа.
target_cond = {=actor_on_level(marsh)} true  ;--\ Условие для маркера. 
target_story_ids = 302  ;--\ Установка маркера на объект по его story_id, список story_id'ов game_story_ids.ltx.
prior = 10  ;--\ Приоритет задания, чем выше это число, тем приоритетней задание.
condlist_0 = {=actor_has_item(vodka)=actor_has_item(medkit)} complete  ;--\ Условие выполнения квеста, в данном случаи проверка на нахождение двух предметов у ГГ.
on_complete = %=give_inited_task(storyline:quest_bring_vodka_medkit_2:csky)%  ;--\ По завершению поиска необходимых предметов вклучаеться следующий квест "quest_bring_vodka_medkit_2". 

[quest_bring_vodka_medkit_2]
auto_name = false
type = storyline
task_type = additional 
name = quest_bring_vodka_medkit_name
text = quest_bring_vodka_medkit_text
target_cond = {=actor_on_level(marsh)} true
target_story_ids = 302 prior = 10 
condlist_0 = {+quest_vodka_medkit_done} complete ;--\ Условие выполнения квеста, в данном случаи при получение инфопорции "quest_vodka_medkit_done" считается выполненным. 

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью. 

 

Создание описания для квеста:

Файл: st_quest_bring_vodka_medkit.xml 

Пишем:

<?xml version="1.0" encoding="windows-1251" ?> 
<string_table> 
 
 	<string id="quest_find_vodka_medkit_name"> 
 	 	<text>Найти водку и аптечку для Холода.</text> 
 	</string> 
 	<string id="quest_bring_vodka_medkit_name"> 
	 	<text>Принести водку и аптечку Холоду.</text> 
 	</string> 
 	<string id="quest_bring_vodka_medkit_text"> 
 	 	<text>Найти и принести бутылку водки и аптечку.</text> 
 	</string> 
 
</string_table>

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью.

 

 

Создание скрипта на активацию квеста, проверку предметов и выдачу награды:

Файл: quest_bring_vodka_medkit.script

Пишем:

function give_quest_bring_vodka_medkit()
	xr_effects.give_inited_task(nil, nil, {"storyline", "quest_bring_vodka_medkit_1", "csky"})
end

-- возвращает false при проверке на наличие в инвентаре ГГ двух необходимых предметов
function not_have_vodka_medkit(first_speaker, second_speaker)
 	return ((db.actor:object("vodka") == nil) and (db.actor:object("medkit") == nil))
end

-- возвращает true при проверке на наличие в инвентаре ГГ двух необходимых предметов
function have_vodka_medkit(first_speaker, second_speaker)
 	return ((db.actor:object("vodka") ~= nil) and (db.actor:object("medkit") ~= nil))
end

-- передача предметов НПС'у
function quest_bring_vodka_medkit_bring_object(first_speaker, second_speaker)
	dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "vodka")
	dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "medkit")
end

-- получение награды
function quest_bring_vodka_medkit_get_money(first_speaker, second_speaker)
	dialogs.relocate_money(first_speaker, 800, "in")
end

Все, с этим файлом закончили, сохраняем и закрываем за не надобностью.

 

Ну вот урок по квесту "Найти и принести" завершен.

 

Автор урока и примера: ThirteenDogs ThirteenDogs.spaces.ru

 

 

Скачать урок и пример можно тут: https://yadi.sk/d/5vra5UtC38e9ff

Изменено пользователем Stalker_Monolit
  • Нравится 1
  • Полезно 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...