Создание квеста(полный разбор) — S.T.A.L.K.E.R. Inside Wiki

Создание квеста(полный разбор)

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

Итак, я VIKman и хочу Вас научить делать квесты. Для этого мы создадим нового NPC и сделаем квест чтобы взять у него флеш-карту.) Для всего этого нам понадобится:

Папка config:
	gameplay\character_desc_escape.xml
	gameplay\dialogs_escape.xml
	gameplay\info_l01escape.xml
	gameplay\npc_profile.xml
	gameplay\tasks_escape.xml
	game_story_ids.ltx
	misc\quest_items.ltx
	scripts\tester_logic.ltx -- его мы создадим
	text\rus\stable_dialogs_escape.xml
	text\rus\string_table_items.xml
Папка scripts
	escape_dialog.script	
И естественно all.spawn

BEGIN

Первым делом снимем координаты, где будет находится наш флешко-датель.)

У меня вот такие координаты: position = -172.21215820313,-19.941787719727,-161.09272766113, game_vertex_id = 52, level_vertex_id = 76655

Распаковываем с ACDC all.spawn открываем alife_l01_escape.ltx и пишем в самый конец:

	[870]
; cse_abstract properties
section_name = stalker -//это для игры тут пишется к примеру если ето у тебя сталкера или бандюки то должно быть section_name = stalker
name = tester -//пишем что хотим
position = -172.21215820313,-19.941787719727,-161.09272766113 -//позиция
direction = 0,0,0 -// направление взгляда(можно писать всегда нули)
 
 
; cse_alife_trader_abstract properties
money = 5000 -//его бабло
character_profile = tester -//ссылка на профиль в character_desc_локация(раз создаем в алайф эскейп значит и профиль будет искатсья в чарактер_деск_ескейп)
 
 
; cse_alife_object properties
game_vertex_id = 52 -// гейм вертекс
distance = 0
level_vertex_id = 76655 -//левел вертекс
object_flags = 0xffffffbf
custom_data = <<END
 
 
[logic]
cfg = scripts\tester_logic.ltx -// ссылка на логику
 
 
; cse[smart_terrains]
none = true
END
story_id = 6001 -//его стори айди
 
; cse_visual properties
visual_name = actors\soldier\soldier_beret_1 -// его визуал
 
 
upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = -172.21215820313,-19.941787719727,-161.09272766113 -//опять пишем позицию
upd:o_model = 0
upd:o_torso = 0.028013030067086,0,0.9996075630188
upd:g_team = 0
upd:g_squad = 1
upd:g_group = 2
 
 
upd:next_game_vertex_id = 65535-//честно не знаю что это, я всегда пишу эти цифры
upd:prev_game_vertex_id = 65535-//не знаю, но пишем всегда это
upd:distance_from_point = 0
upd:distance_to_point = 0
 
 
; cse_alife_human_abstract properties
predicate5 = 1,2,2,1,2
predicate4 = 0,1,1,1
 
	; cse_ph_skeleton properties
 
upd:start_dialog =
 
; se_stalker properties


Дальше опишем в character_desc_escape.xml нашего НПС-а:

	<!---------------------------------------tester------------------->
	<specific_character id="tester" team_default = "1">
<name>Факер Марезфакер</name>
<icon>ui_npc_u_green_stalker_3</icon>  <!--его иконка-->
<bio>Сталкер.</bio>
 
<class>tester</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>   <!--этого лучше не знать-->
 
<rank>150</rank>
<reputation>5</reputation>
<money min="500" max="1000" infinitive="0"/>
 
<snd_config>characters_voice\human_01\stalker\</snd_config>  <!--его голос-->
<crouch_type>-1</crouch_type>
 
<visual>actors\novice\green_stalker_3</visual>  <!--его визуал-->
<supplies>
	[spawn] \n      <!--его инвентарь,что в нем есть-->
	wpn_ak74u \n
	ammo_5.45x39_fmj = 10 \n
	</supplies>
 
<start_dialog>hello_dialog</start_dialog>      <!--его диалоги-->
<actor_dialog>test_kvest_dialog_npc</actor_dialog>
	</specific_character>


В файле npc_profile.xml прописываем класс непися:

	<character id="escape_trader">	
	<class>Trader</class>
	<specific_character>escape_trader</specific_character>
</character>
	<!---------------------------------------------------------------TEST---------------------------------------------------->
	<character id="tester">	
	<class>tester</class>
	<specific_character>tester</specific_character>
</character>


В файле game_story_ids.ltx прописываем его SID который должен совпадать с его id из all.spawn:

	  ; Escape (0-99)
	  6001          = "tester"

Дадим неписю логику, создадим файл: scripts\tester_logic.ltx , мне понравилась чтобы он сидел на пятой точке, пишем:

	[logic]
active = remark1
danger = danger_ignore
 
[danger_ignore]
ignore_distance = 5
 
[remark1]
anim = sit_ass
no_move = true


Фуххх, вроде непся создали переходим к долгожданному квесту))))

Нам нужно создать инфопоршены для этого в файле с адресом: gameplay\info_l01escape.xml после <game_information_portions> пишем:

<info_portion id="test_kvest_start">
	<task>test_kvest</task>       <!--обращение к таску-->
	</info_portion>
	<info_portion id="test_kvest_have"></info_portion>
	<info_portion id="test_kvest_done"></info_portion>

Итак мы создали направление на задание <task>test_kvest</task>, что ж пропишем его. Для этого открываем файл по адресу gameplay\tasks_escape.xml и пишем в самом начале:

	<!------------------------------------------------------------test---------->
	<game_task id="test_kvest">       <!--название таска из gameplay\info_l01escape.xml-->
<title>Принести КПК Сидору</title>       <!--название которое будет писатся в кпк-->
<objective>
	<text>Бежать к сталкеру</text>      <!--название части таска в кпк-->
	<icon>ui_iconsTotal_lost_thing</icon>      <!--иконка таска-->
	<infoportion_complete>test_kvest_done</infoportion_complete>      <!--инфопоршень из info_l01escape.xml при его получении, часть таска выполняется-->
</objective>
<objective>
	<text>Бежать к сталкеру</text>      <!--название части таска в кпк-->
	<map_location_type hint="Факер Мазерфакер">green_location</map_location_type>      <!--обозначение на карте-->
	<object_story_id>tester</object_story_id>      <!--сюда пишем наш sid из game_story_ids.ltx, который в свою очередь определяется по story_id из all.spawn-->
	<infoportion_complete>test_kvest_have</infoportion_complete>      <!--инфопоршень из info_l01escape.xml при его получении, часть таска выполняется-->
</objective>
<objective>
	<text>Вернуться к Сидору</text>      <!--название части таска в кпк-->
	<map_location_type hint="Сидорович">blue_location</map_location_type>      <!--обозначение на карте-->
	<object_story_id>Escape_Trader</object_story_id>      <!--сюда пишем наш sid из game_story_ids.ltx, который в свою очередь определяется по story_id из all.spawn-->
	<infoportion_complete>test_kvest_done</infoportion_complete>	      <!--инфопоршень из info_l01escape.xml при его получении, часть таска выполняется-->
</objective>
	</game_task>
<!------------------------------------------------------------test---------->

Таск готов! После всего этого я уже устал писать это всё, ну да ладно, продолжим)))

Создадим наш новый КПК который нам даст наш многоуважаемый Факер Мазерфакер)))

Для этого откроем файл misc\quest_items.ltx и пропише секцию нашего кпк:

	[moy_kpk]:identity_immunities
GroupControlSection	= spawn_group
discovery_dependency = 
$spawn = "devices\quest_items\moy_kpk"
;$prefetch 	= 32
class= II_ATTCH
cform= skeleton
visual= equipments\item_pda.ogf
radius= 1
;script_binding= stalker.object_init
quest_item	= true
 
description         = item_moy_kpk_desc
 
inv_name	= item_moy_kpk_name
inv_name_short= item_moy_kpk_name
inv_weight	= 0.2
 
inv_grid_width= 2
inv_grid_height= 1
inv_grid_x	= 6
inv_grid_y	= 13
cost= 0

И русифицируем его в файле text\rus\string_table_items.xml

	<string id="item_moy_kpk_desc">
<text>КПК с информацие. Доступ без пароля не возможен</text>
	</string>
	<string id="item_moy_kpk_name">
<text>КПК с информацией</text>
	</string>

КПК готов, блин теперь создадим замудреный диалог:

1.Говарим с Сидором о задании

2.Факер Мазерфакер нам дает КПК

3.Отдаем сидору КПК

BEGIN!!! (ВПЕРЕД(кто не в курсе дела))

Пропишем путь к диалогу, открываем файл gameplay\character_desc_escape.xml и tradery дописываем 2 диалога:

Ищем Сидора аха вот он

	<specific_character id="escape_trader" no_random = "1">
<name>escape_trader_name</name>
<icon>ui_npc_u_trader</icon>
<bio>escape_trader_bio</bio>
 
<class>trader</class>
<community>trader</community>
<visual>actors\trader\trader</visual>
 
<rank>330</rank>
<reputation>23</reputation>
<money min="100000" max="100000" infinitive="1"/> 
<supplies>
	[spawn] \n
	wpn_knife \n
</supplies>
 
<start_dialog>escape_trader_start_dialog</start_dialog>
<actor_dialog>escape_trader_talk_info</actor_dialog>
<actor_dialog>escape_trader_jobs</actor_dialog>
<actor_dialog>tm_trader_dialog</actor_dialog>
<actor_dialog>tm_trader_reward</actor_dialog>
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
	</specific_character>

Значит пишем:

	<specific_character id="escape_trader" no_random = "1">
<name>escape_trader_name</name>
<icon>ui_npc_u_trader</icon>
<bio>escape_trader_bio</bio>
 
<class>trader</class>
<community>trader</community>
<visual>actors\trader\trader</visual>
 
<rank>330</rank>
<reputation>23</reputation>
<money min="100000" max="100000" infinitive="1"/> 
<supplies>
	[spawn] \n
	wpn_knife \n
</supplies>
 
<start_dialog>escape_trader_start_dialog</start_dialog>
<actor_dialog>escape_trader_talk_info</actor_dialog>
<actor_dialog>escape_trader_jobs</actor_dialog>
<actor_dialog>tm_trader_dialog</actor_dialog>
<actor_dialog>tm_trader_reward</actor_dialog>
<actor_dialog>escape_trader_done_blockpost_box</actor_dialog>
<actor_dialog>test_kvest_dialog</actor_dialog>        <!--наш диалог-->
<actor_dialog>test_kvest_dialog_done</actor_dialog>        <!--наш диалог-->
	</specific_character>

А путь к диалогу у Факера Мазерфакера уже прописан:

<actor_dialog>test_kvest_dialog_npc</actor_dialog>

Переходим непосредственно к самому диалогу. Открываем gameplay\dialogs_escape.xml и в самом начале после строки <game_dialogs> пишем:

	    <dialog id="test_kvest_dialog">
<dont_has_info>test_kvest_start</dont_has_info>         <!--проверка, не получил ли ГГ инфопоршень раньше, если получил то диалог не срабатывает-->
       <phrase_list>
	            <phrase id="0">
	                <text>test_kvest_dialog_0</text>
               <next>11</next>
           </phrase>
           <phrase id="1">
               <text>test_kvest_dialog_1</text>
	<give_info>test_kvest_start</give_info>         <!--даем инфопоршень-->
           </phrase>
           <phrase id="11">
               <text>test_kvest_dialog_11</text>
               <next>1</next>
               <next>2</next>
           </phrase>
           <phrase id="2">
               <text>test_kvest_dialog_2</text>
           </phrase>
       </phrase_list>
   </dialog>
 
   <dialog id="test_kvest_dialog_done">
<dont_has_info>test_kvest_done</dont_has_info>         <!--проверка, не получил ли ГГ инфопоршень раньше, если получил то диалог не срабатывает-->
<has_info>test_kvest_have</has_info>         <!--проверка,есть ли у ГГ инфопоршень, если получил то диалог срабатывает-->
<precondition>escape_dialog.have_kpk</precondition>         <!--проверка из скрипта-->
       <phrase_list>
           <phrase id="0">
               <text>test_kvest_dialog_done_0</text>
               <next>1</next>
           </phrase>
           <phrase id="1">
               <text>test_kvest_dialog_done_1</text>
	<action>escape_dialog.money_give_test</action>              <!--вызов функции из скрипта-->
	<give_info>test_kvest_done</give_info>              <!--даем инфопоршень-->
	<action>escape_dialog.give_kpk_to_sidor</action>              <!--вызов функции из скрипта-->
           </phrase>
       </phrase_list>
   </dialog>
 
   <dialog id="test_kvest_dialog_npc">
<dont_has_info>test_kvest_have</dont_has_info>         <!--проверка, не получил ли ГГ инфопоршень раньше, если получил то диалог не срабатывает-->
<has_info>test_kvest_start</has_info>         <!--проверка,есть ли у ГГ инфопоршень, если получил то диалог срабатывает-->
       <phrase_list>
           <phrase id="0">
               <text>test_kvest_dialog_npc_0</text>
               <next>1</next>
           </phrase>
	          <phrase id="1">
               <text>test_kvest_dialog_npc_1</text>
	<give_info>test_kvest_have</give_info>              <!--даем инфопоршень-->
	<action>escape_dialog.give_kpk_to_actor</action>              <!--вызов функции из скрипта-->
               <next>2</next>
         </phrase>
           <phrase id="2">
	              <text>test_kvest_dialog_npc_2</text>
	                <action>dialogs.break_dialog</action>              <!--вызов функции из скрипта-->
	   </phrase>
	        </phrase_list>
	    </dialog>

Переводим наши каракули в файле text\rus\stable_dialogs_escape.xml

<!-------------------------------------------test------------------------>
	<string id="test_kvest_dialog_0">
<text>Даров, радиоктивное мясо.</text>
	</string>
	<string id="test_kvest_dialog_11">
<text>Слушай Меченный тебе я смотрю денег нужно подзаработать? Сходи к сталкеру одному он мне инфу должен.</text>
	</string>
	<string id="test_kvest_dialog_1">
<text>Да, давай схожу.</text>
	</string>
	<string id="test_kvest_dialog_2">
<text>Не, мне влом.</text>
	</string>
	<string id="test_kvest_dialog_done_0">
<text>Вот я принес.</text>
	</string>
	<string id="test_kvest_dialog_done_1">
<text>Молодец! Держи награду.</text>
	</string>
	<string id="test_kvest_dialog_npc_0">
<text>Эй, сталкер. Да ты мне Сидор сказал то что ты ему инфу должен принести.</text>
	</string>
	<string id="test_kvest_dialog_npc_1">
<text>Ой да, чувак на возьми.Спасибо, что напомнил, ато мне Сидор задницу надрал бы.</text>
	</string>
	<string id="test_kvest_dialog_npc_2">
<text>Давай. Я погнал.</text>
	</string>
<!-------------------------------------------test------------------------>

Прописываем спавн кпк в инвертарь эктора при разговоре с Сами-Знаете_Кем)))

Открываем escape_dialog.script и рисуем внутри вне всяких функций!!!

 
-- это наши функции вызываемые из диалога
function money_give_test(first_speaker, second_speaker) --ГГ получает деньги
	dialogs.relocate_money(first_speaker, 1000, "in")
end
function have_kpk(first_speaker, second_speaker) -- проверка есть ли у ГГ наш КПК
  	return first_speaker:object("moy_kpk") ~= nil
end
function give_kpk_to_sidor(first_speaker, second_speaker) -- ГГ отдает КПК
	dialogs.relocate_item_section(first_speaker, "moy_kpk", "out")
end
function give_kpk_to_actor(first_speaker, second_speaker) -- ГГ принимает КПК
	dialogs.relocate_item_section(first_speaker, "moy_kpk", "in")
end

Ну. Вроде все. Что ж если какие-то вылеты перепроверьте все пункты


Автор:VIKman

Выход:22.11.2010

Другие места
LANGUAGE