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

[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. буду обновлять этот пост.

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

Ссылка на комментарий
Поделиться на других сайтах

Спасибо за ветку. Надеюсь вы продолжите, как обещали...

Ссылка на комментарий
Поделиться на других сайтах

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

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

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

Ссылка на комментарий
Поделиться на других сайтах

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

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

Изменено пользователем Stalkeroff
Ссылка на комментарий
Поделиться на других сайтах

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

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

 

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

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

Ссылка на комментарий
Поделиться на других сайтах

Ай да молодец! Не думай что издеваюсь, просто я через логику и all.spawn делал. Описывать не решусь - нудно очень.

Ссылка на комментарий
Поделиться на других сайтах

Инструкция основана на моде "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
Ссылка на комментарий
Поделиться на других сайтах

ЧН: Квест "Найти и принести два предмета".

 

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

будет активироваться через диалог секцией <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
Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

×
×
  • Создать...