Создание скриптовой сцены — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Создание скриптовой сцены — различия между версиями

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

Перейти к: навигация, поиск
(Новая страница: «==Создание скриптовой сцены== Если Вы хотите создать интересную скриптовую сцену в своём м...»)
 
(оформление)
Строка 15: Строка 15:
 
Gamedata\configs\scripts\ - создаём файлы для кажого нпс (killer_1.ltx и т.д.)
 
Gamedata\configs\scripts\ - создаём файлы для кажого нпс (killer_1.ltx и т.д.)
 
;Вот тут начинается самое интересное. Начнём с Командира.
 
;Вот тут начинается самое интересное. Начнём с Командира.
<code>[logic@killer_commander_1] — обязательная секция.
+
<ini>[logic@killer_commander_1] — обязательная секция.
 
active = animpoint@stay — активная секция логики, т. е. То, что нпс делает сразу, по умолчанию.
 
active = animpoint@stay — активная секция логики, т. е. То, что нпс делает сразу, по умолчанию.
  
Строка 59: Строка 59:
 
combat_ignore_cond = true
 
combat_ignore_cond = true
 
combat_ignore_keep_when_attacked = true — всё то же, но без бессмертия.
 
combat_ignore_keep_when_attacked = true — всё то же, но без бессмертия.
</code>
+
</ini>
  
 
;Логика первого конвоира «киллера»:
 
;Логика первого конвоира «киллера»:
<code>
+
<ini>
 
[logic@killer_1]
 
[logic@killer_1]
 
active = animpoint@stay
 
active = animpoint@stay
Строка 139: Строка 139:
 
on_info = {=actor_in_zone(sr_rasstrel_1)} %=play_sound(jup_a12_stalker_assaulter_1_argue) =actor_enemy%
 
on_info = {=actor_in_zone(sr_rasstrel_1)} %=play_sound(jup_a12_stalker_assaulter_1_argue) =actor_enemy%
 
on_info2 = {=actor_has_weapon} nil %=actor_enemy% - и тут аналогично, разве что реплику можно записать другую.
 
on_info2 = {=actor_has_weapon} nil %=actor_enemy% - и тут аналогично, разве что реплику можно записать другую.
</code>
+
</ini>
 
Вообще можно было и подробнее объяснить, но не буду разжёвывать то, что Вы можете прочитать в других уроках, я лишь учу использовать эти знания в нужном направлении.
 
Вообще можно было и подробнее объяснить, но не буду разжёвывать то, что Вы можете прочитать в других уроках, я лишь учу использовать эти знания в нужном направлении.
  
Строка 145: Строка 145:
 
Диалог тут всего один — с командиром. Вообще хорошо бы использовать цифры в id диалогов, но лично мне удобнее называть их именами нпс (кому принадлежит диалоги) и местом действия. Если диалогов несколько — в одном задании, то я ставлю цифры _1, _2 и т.д.
 
Диалог тут всего один — с командиром. Вообще хорошо бы использовать цифры в id диалогов, но лично мне удобнее называть их именами нпс (кому принадлежит диалоги) и местом действия. Если диалогов несколько — в одном задании, то я ставлю цифры _1, _2 и т.д.
 
;Внимание! Диалог прописан стартовым для нпс (вернее мы ещё пропишем), поэтому 0 фраза — принадлежит НПС! (диалоги так себе, сделаны для заглушки).
 
;Внимание! Диалог прописан стартовым для нпс (вернее мы ещё пропишем), поэтому 0 фраза — принадлежит НПС! (диалоги так себе, сделаны для заглушки).
Gamedata\configs\gameplay\dialogs.xml (название конечного файла может быть любым, можете создать свой файл для диалогов).
+
'''Gamedata\configs\gameplay\dialogs.xml''' (название конечного файла может быть любым, можете создать свой файл для диалогов).
<code> <dialog id="gr_fabrika_commander">
+
<xml> <dialog id="gr_fabrika_commander">
 
<dont_has_info>rasstrelyat</dont_has_info>  
 
<dont_has_info>rasstrelyat</dont_has_info>  
 
<dont_has_info>na_rasstrel</dont_has_info> - делаем диалоги одноразовым.
 
<dont_has_info>na_rasstrel</dont_has_info> - делаем диалоги одноразовым.
Строка 176: Строка 176:
 
</phrase>
 
</phrase>
 
</phrase_list>
 
</phrase_list>
</dialog></code>
+
</dialog></xml>
 
;Теперь надо подготовить скрипты.
 
;Теперь надо подготовить скрипты.
Gamedata\scripts\dialogs.script
+
'''Gamedata\scripts\dialogs.script'''
 
У нас всего две функции — убрать хабар и заспавнить ПМ.
 
У нас всего две функции — убрать хабар и заспавнить ПМ.
<code> function spawn_pm()
+
<lua> function spawn_pm()
 
  alife():create("wpn_pm", vector():set(103.57, 9.15, -44.95), 0.0,0.0)
 
  alife():create("wpn_pm", vector():set(103.57, 9.15, -44.95), 0.0,0.0)
  end</code>
+
  end</lua>
 
Позицию вычисляйте сами в нужном Вам месте.
 
Позицию вычисляйте сами в нужном Вам месте.
<code>function drop_npc_items(actor, npc, p)
+
<lua>function drop_npc_items(actor, npc, p)
 
local item = 0
 
local item = 0
 
for i, v in pairs(p) do
 
for i, v in pairs(p) do
Строка 192: Строка 192:
 
end
 
end
 
end
 
end
end</code>
+
end</lua>
 
Функция должна убить все вещи (не проверялось).
 
Функция должна убить все вещи (не проверялось).
 
Всё, скрипты готовы.
 
Всё, скрипты готовы.
Строка 200: Строка 200:
 
Итак, почти всё готово, но в игре схему посмотреть не удастся. Нужно подключить всё, создать нужные сквады, прописать логику, подключить диалоги. Начнём.
 
Итак, почти всё готово, но в игре схему посмотреть не удастся. Нужно подключить всё, создать нужные сквады, прописать логику, подключить диалоги. Начнём.
 
Подключаем диалог командиру(профиль Вы уже должны были сделать, не буду объяснять как):
 
Подключаем диалог командиру(профиль Вы уже должны были сделать, не буду объяснять как):
<start_dialog>gr_fabrika_commander</start_dialog>
+
<code><start_dialog>gr_fabrika_commander</start_dialog></code>
  
 
;Создаём сквады:
 
;Создаём сквады:
gamedata\configs\misc\squad_descr.ltx
+
'''gamedata\configs\misc\squad_descr.ltx'''
  
<code>[killer_commander_1]:online_offline_group ; Командир
+
<ini>[killer_commander_1]:online_offline_group ; Командир
 
faction = army
 
faction = army
 
npc =  killer_commander_1
 
npc =  killer_commander_1
Строка 214: Строка 214:
 
npc = killer_1, killer_2
 
npc = killer_1, killer_2
 
target_smart = killers_smart
 
target_smart = killers_smart
</code>
+
</ini>
;Включаем сквады в симуляцию (спавн при начале игры)
+
Включаем сквады в симуляцию (спавн при начале игры)
gamedata\configs\misc\simulation.ltx
+
'''gamedata\configs\misc\simulation.ltx'''
В simulation.ltx создаете поле [start_position_<имя уровня>]
+
В '''simulation.ltx''' создаете поле [start_position_<имя уровня>]
 
В нем пишите строку <ид сквада> = <имя смарта>
 
В нем пишите строку <ид сквада> = <имя смарта>
  
<code>[start_position_jupiter]
+
<ini>[start_position_jupiter]
 
killer_commander_1 = killers_smart
 
killer_commander_1 = killers_smart
killers_squad = killers_smart</code>
+
killers_squad = killers_smart</ini>
  
;Там же, но в simulation_objects_props.ltx прописываем смарт:
+
;Там же, но в '''simulation_objects_props.ltx''' прописываем смарт:
 
под ;---------smarts--------------
 
под ;---------smarts--------------
<code>[killers_smart]:default_base
+
<ini>[killers_smart]:default_base
 
territory = 1
 
territory = 1
 
sim_avail = true
 
sim_avail = true
Строка 233: Строка 233:
 
sim_avail = false
 
sim_avail = false
 
[killers_squad]:default_squad
 
[killers_squad]:default_squad
sim_avail = false</code>
+
sim_avail = false</ini>
  
;Прописываем звуки, если таковые имеются (внимание, звуки для речи сталкеров кидать только в «gamedata\sounds\characters_voice\scenario»)
+
Прописываем звуки, если таковые имеются (внимание, звуки для речи сталкеров кидать только в '''«gamedata\sounds\characters_voice\scenario»''')
gamedata\configs\misc\script_sound.ltx
+
'''gamedata\configs\misc\script_sound.ltx'''
  
 
для примера приведу монолог торговца:
 
для примера приведу монолог торговца:
<code>
+
<ini>
 
trader_monolog1
 
trader_monolog1
  
Строка 247: Строка 247:
 
path = scenario\trader\trader_monolog1
 
path = scenario\trader\trader_monolog1
 
shuffle = seq
 
shuffle = seq
idle = 0,0,100</code>
+
idle = 0,0,100</ini>
;Будьте внимательны при создании персонажа — проверьте, включили ли Вы его в npc_profile.xml и spawn_section.ltx!
+
;Будьте внимательны при создании персонажа — проверьте, включили ли Вы его в '''npc_profile.xm'''l и '''spawn_section.ltx'''!
 
Прописываем логику для смарт_террейна и включаем логику нпс:
 
Прописываем логику для смарт_террейна и включаем логику нпс:
gamedata\configs\scripts\gr(название Вашей локации)\smart\killers_smart.ltx
+
'''gamedata\configs\scripts\gr(название Вашей локации)\smart\killers_smart.ltx'''
<code>
+
<ini>
 
[smart_terrain];killers_smart
 
[smart_terrain];killers_smart
 
squad_id = 11(id сквада в игре)
 
squad_id = 11(id сквада в игре)

Версия 19:37, 15 августа 2013

Создание скриптовой сцены

Если Вы хотите создать интересную скриптовую сцену в своём моде (сцены вообще хорошо влияют на сюжет и на динамику игры, так что использование сцен — обязательно), но ещё не знаете как — то милости прошу, что смогу объяснить — объясню в своём уроке. Урок, собственно, предназначен для внутренного пользования команды Oblivion Lost, но мы не жадные, учитесь на здоровье.

Нам потребуется
Нормальный текстовый редактор (я использую Notepad++), SDK 0.7, ясный ум и прямые руки. Файлов потребуется много, так что их описывать буду уже на месте.

p.s. присутствуют орфографические ошибки, т.к. автор в процессе написания статьи немного устал.

N.B.! Предполагается, что Вы уже имеете минимальные знания в модострое.

Начнём.

Предисловие. Описание схемы

Игрок входит в ворота фабрики и на него тут же наставляют стволы. - Стоять! Оружие на землю! Медленно подошёл ко мне (командир)! Игрок подходит (если попытается бежать — убьют), разговаривает с командиром. Тот объясняет, что в Зоне сталкеры находятся нелегально, поэтоум он может нас расстрелять... если только не игрок не поделится хабаром. Хабара у игрока не так много, но командир забирает всё. - Расстреляйте его — говорит командир и уходит. Конвоиры ведут игрока к стенке... По пути — неприметно лежит ПМ. Если подобрать его — есть шанс на спасение...

Схема(нажмите на картинку, чтобы увеличить).

Шаг 1. Рисуем схему и расставляем объекты на карте

Собственно без схемы — никуда. У меня уже есть готовая сцена, можете взять её за основу. Называется она «Расстрел» и придумана Григорием Белым (Dezertir1w2), после некоторых раздумий воплощена мной (Ким). Некоторые скрипты написаны прямо на схеме, т. к. я ещё и думал в этой же схеме. Нарисовать можно проще, а можно сложнее — кто как привык работать. Итак, что мы видим на схеме? Непонятные овалы, звёздочки, параллепипиды и линии. Овал — это space_restrictor, звёздочка — animpoint(space_cover), линия — путь (way). Всё это нужно будет расставить в sdk (ну и присвоить нужные имена). Думаю с этим у Вас проблем не возникнет, ну на крайний случай можете заглянуть в соседние уроки. Важно не перепутать названия, иначе сцена просто не будет работать. И ещё. Необходимо поставить smart_terrain, чтобы нпс спавнились в нужном нам месте и получали нужную логику (об этом позднее).

Шаг 2. Подготавливаем логику

Gamedata\configs\scripts\ - создаём файлы для кажого нпс (killer_1.ltx и т.д.)

Вот тут начинается самое интересное. Начнём с Командира.
[logic@killer_commander_1] — обязательная секция.
active = animpoint@stay — активная секция логики, т. е. То, что нпс делает сразу, по умолчанию.
 
[animpoint@stay]
cover_name = killer_commander_1 — название анимпоинта, в котором будет находится нпс.
avail_animations = animpoint_stay_table — активная анимация, в данном случае — просто стоять
(анимация неправильная, т. к. табл — это за столом, надо сменить на другую, стоящую).
use_camp = false — запрет на использование фонарика (чтобы не выдать нпс в темноте).
on_info = {+poshel_ti} nil %=actor_enemy%
 - при получении инфопоршня « poshel_ti» активирует схему, при которой игрок становится врагом, т. е. Это тот самый отрицательный диалоги (о нём позднее).
on_info2 = {=npc_in_zone(sr_poimali_1)} %=play_sound(jup_a12_stalker_assaulter_1_argue)%
 - при входи игрока в зону(рестриктор) включает звук (Стоять! Оружие на землю! Медленно подошёл ко мне!).
on_info3 = {+na_rasstrel} %=play_sound(jup_a12_stalker_assaulter_1_argue) =disable_ui% | animpoint@bye
 — отобрав хабар отыгрывает звук (Расстрелять его. (ну, пока что я поставил звук из ЗП, т. к. не записали нужные реплики)),
выключает ui (полностью выключает, нет возможности двигаться) и переключает на следующую схему.
invulnerable = true — нпс бессмертен, чтобы игрок случайно его не убил (ну или монстр какой).
out_restr = sr_poimali_1 — при боевой схеме держится за этим рестриктором.
gather_items_enabled = false — не подбирает валяющиеся предметы.
help_wounded_enabled = false — не просит помощи, если ранен.
corpse_detection_enabled = false — не обыскивает трупы.
 
[animpoint@bye] 
cover_name = killer_commander_1 — название анимпоинта.
avail_animations = salut_free — активная анимация (вроде как козыряет)
on_signal = anim_end | %=play_sound(jup_b207_freedom_leader_about_depot)% - получив сигнал «конец анимации» отыгрывает звук (ну, я пока пройдусь тут).
on_signal2 = sound_end |  walker@za_povorot %=enable_ui% - получив сигнал «конец звука» включает следующую схему и включает ui, игрок может двигаться.
use_camp = false
invulnerable = true
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true — игнорирует ранение.
combat_ignore_keep_when_attacked = true — игнорирует атаку на него.
 
[walker@za_povorot] — схема walker
path_walk = way_za_povorot_walk — наш путь, установленный в сдк.
path_look  = way_za_povorot_look — точки, куда нпс будет смотреть.
on_info = {=path_end} nil %=remove_squad(killer_commander_1)% - при получении сигнала «путь окончен» удаляет сквад  killer_commander_1,
состоящий из одного нпс — командира (больше он не нужен, а потом можно будет заспавнить снова).
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
combat_ignore_cond = true
combat_ignore_keep_when_attacked = true — всё то же, но без бессмертия.
 
Логика первого конвоира «киллера»
 
[logic@killer_1]
active = animpoint@stay
 
[animpoint@stay]
cover_name = killer_1 — имя анимпоинта.
avail_animations = animpoint_stay_table — отыгрываемая анимация.
use_camp = false — не использует фонарик.
on_info = {+na_rasstrel} %=play_sound(jup_a12_stalker_assaulter_1_argue)% | walker@na_rasstrel_1 — при получении инфопоршня « na_rasstrel» отыгрывает звук
«ну, сталкер, пошли» и включает следующую схему.
invulnerable = true
out_restr = sr_poimali_1
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
 
[walker@na_rasstrel_1]
path_walk = way_na_rasstrel_1_walk — путь.
path_look  = way_na_rasstrel_1_look
on_info = {=dist_to_actor_ge(5)} nil %+rasstrelyat =actor_enemy% - если расстояние до игрока больше 5 метров, то выдаётся инфопоршень «rasstrelyat»
(зачем? Ответ ниже) и делает игрока врагом.
on_info2 = {=actor_has_weapon} nil %=actor_enemy% - если игрок будет с оружием — то он станет врагом (нпс будет атаковать).
on_info3 = {=npc_in_zone(sr_rasstrel_1)} animpoint@rasstrel — как только нпс приходит в зону расстрела — включается следующая схема.
on_info4 = {=dist_to_actor_ge(50)} nil %=kill_actor% - если игрок вдруг смог убежать от конвоиров — через 50 метров он просто умрёт (игра окончена). 
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
 
[animpoint@rasstrel]
cover_name = killer_1_1 — название анимпоинта.
avail_animations = animpoint_stay_table — анимация.
use_camp = false
on_info = {=actor_in_zone(sr_rasstrel_1)}  %=play_sound(jup_a12_stalker_assaulter_1_argue) =actor_enemy% - как только игрок войдёт в зону, нпс отыгрывает звук
«прощайся с жизнью!» и атакует его.
on_info2 = {=actor_has_weapon} nil %=actor_enemy% - если игрок достанет оружие — атаковать его (не забывайте про ПМ).
</code>
;Логика второго конвоира «киллера»:
<code>
[logic@killer_1]
active = animpoint@stay
 
[animpoint@stay]
cover_name = killer_2
avail_animations = animpoint_stay_table
use_camp = false
on_info = {+na_rasstrel} %=play_sound(jup_a12_stalker_assaulter_1_argue)% | remark@poshel — тут начинается отличие от первого киллера — 
схема walker включается не сразу, чтобы нпс шёл немного позади игрока (иллюзия конвоя, к сожалению в сталкере нет скрипта, чтобы нпс шёл позади игрока просто так).
invulnerable = true
out_restr = sr_poimali_1
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false
 
[remark@poshel]
anim = guard - анимация
target = story | actor — на кого нпс смотрит
on_timer = 500 | walker@na_rasstrel_1 — отсчитываем 500 игровых секунд (меньше минуты настоящего времени) и включаем схему walker.
 
[walker@na_rasstrel_1]
path_walk = way_na_rasstrel_2_walk
path_look  = way_na_rasstrel_2_look
on_info = {+rasstrelyat} %=actor_enemy% — а вот и ответ. т. к. нпс не может точно знать, где игрок будет через 500 игровых секунд, то нельзя включать такую схему,
при которой игрок отойдя от нпс на 5 метров — становится врагом. Игрок привязан к первому нпс и для него же и становится врагом. А чтобы второй нпс тоже считал игрока
 врагом — и нужен инфопоршень «rasstrelyat».
on_info2 = {=actor_has_weapon} nil %=actor_enemy% 
on_info3 = {=npc_in_zone(sr_rasstrel_1)} animpoint@rasstrel
on_info4 = {=dist_to_actor_ge(50)} nil %=kill_actor%
gather_items_enabled = false
help_wounded_enabled = false
corpse_detection_enabled = false — всё остальное так же.
 
[animpoint@rasstrel]
cover_name = killer_2_1
avail_animations = animpoint_stay_table
use_camp = false
on_info = {=actor_in_zone(sr_rasstrel_1)} %=play_sound(jup_a12_stalker_assaulter_1_argue) =actor_enemy%
on_info2 = {=actor_has_weapon} nil %=actor_enemy% - и тут аналогично, разве что реплику можно записать другую.
 

Вообще можно было и подробнее объяснить, но не буду разжёвывать то, что Вы можете прочитать в других уроках, я лишь учу использовать эти знания в нужном направлении.

Шаг 3. Диалоги

Диалог тут всего один — с командиром. Вообще хорошо бы использовать цифры в id диалогов, но лично мне удобнее называть их именами нпс (кому принадлежит диалоги) и местом действия. Если диалогов несколько — в одном задании, то я ставлю цифры _1, _2 и т.д.

Внимание! Диалог прописан стартовым для нпс (вернее мы ещё пропишем), поэтому 0 фраза — принадлежит НПС! (диалоги так себе, сделаны для заглушки).

Gamedata\configs\gameplay\dialogs.xml (название конечного файла может быть любым, можете создать свой файл для диалогов).

	<dialog id="gr_fabrika_commander">
			<dont_has_info>rasstrelyat</dont_has_info> 
			<dont_has_info>na_rasstrel</dont_has_info> - делаем диалоги одноразовым.
	<phrase_list>
		<phrase id="0">
			<text>Сталкер, ты вне закона на этой територии! Я тебя спокойно могу расстрелять. Гони хабар, если хочешь жить!</text>
			<next>10</next>
			<next>20</next>
		</phrase>
		<phrase id="10">
			<text>Да пошёл ты, вояки мне не указ.</text>
			<next>11</next>
		</phrase>
		<phrase id="20">
			<text>Вот, держи.</text>
			<action>dialogs_gr.drop_npc_items </action>
			<next>21</next>
		</phrase>
		<phrase id="11">
			<text>Конец тебе, бойцы, огонь!</text>
			<give_info>rasstrelyat</give_info>
			<action>dialogs.break_dialog</action>
		</phrase>
		<phrase id="21">
			<text>Молодец. Но ты всё равно вне закона. Бойцы, отведите его к стенке, да расстреляйте.</text>
			<action>dialogs_gr.spawn_pm</action>
			<give_info>na_rasstrel</give_info>
			<action>dialogs.break_dialog</action>
		</phrase>
	</phrase_list>
	</dialog>
Теперь надо подготовить скрипты.

Gamedata\scripts\dialogs.script У нас всего две функции — убрать хабар и заспавнить ПМ.

 function spawn_pm()
 	alife():create("wpn_pm", vector():set(103.57, 9.15, -44.95), 0.0,0.0)
 end

Позицию вычисляйте сами в нужном Вам месте.

function drop_npc_items(actor, npc, p)
	local item = 0
	for i, v in pairs(p) do
	item = npc:object(v)
	if item then
	npc:drop_item(item)
	end
	end
end

Функция должна убить все вещи (не проверялось). Всё, скрипты готовы.


Шаг 4. Соединяем все части воедино

Итак, почти всё готово, но в игре схему посмотреть не удастся. Нужно подключить всё, создать нужные сквады, прописать логику, подключить диалоги. Начнём. Подключаем диалог командиру(профиль Вы уже должны были сделать, не буду объяснять как):

<start_dialog>gr_fabrika_commander</start_dialog>
Создаём сквады

gamedata\configs\misc\squad_descr.ltx

[killer_commander_1]:online_offline_group ; Командир
faction = army
npc =  killer_commander_1
target_smart = killers_smart
 
[killers_squad]:online_offline_group ; бойцы
faction = army
npc = killer_1, killer_2
target_smart = killers_smart
 

Включаем сквады в симуляцию (спавн при начале игры) gamedata\configs\misc\simulation.ltx В simulation.ltx создаете поле [start_position_<имя уровня>] В нем пишите строку <ид сквада> = <имя смарта>

[start_position_jupiter]
killer_commander_1 = killers_smart
killers_squad = killers_smart
Там же, но в simulation_objects_props.ltx прописываем смарт

под ;---------smarts--------------

[killers_smart]:default_base
territory = 1
sim_avail = true
;----------squad----------
[killer_commander_1]:default_squad
sim_avail = false
[killers_squad]:default_squad
sim_avail = false

Прописываем звуки, если таковые имеются (внимание, звуки для речи сталкеров кидать только в «gamedata\sounds\characters_voice\scenario») gamedata\configs\misc\script_sound.ltx

для примера приведу монолог торговца:

 
trader_monolog1
 
[trader_monolog1]
type = npc
npc_prefix = false
path = scenario\trader\trader_monolog1
shuffle = seq
idle = 0,0,100
Будьте внимательны при создании персонажа — проверьте, включили ли Вы его в npc_profile.xml и spawn_section.ltx!

Прописываем логику для смарт_террейна и включаем логику нпс: gamedata\configs\scripts\gr(название Вашей локации)\smart\killers_smart.ltx

 
[smart_terrain];killers_smart
squad_id = 11(id сквада в игре)
max_population = 3 — количество допустимых сквадов в смарте
 
 
[exclusive] — эксклюзивная логика для нпс
killer_commander_1 = gr\killer_commander_1.ltx
killer_1 = gr\killer_1.ltx
killer_2 = gr\killer_2.ltx</code>
полный путь писать не нужно, достаточно указать папку, в которой лежит логика (в моём случае — gr, для локации Кордон).
==Credits==
Вот и всё. Если всё сделано правильно — при входе в ворота фабрики запускается сцена. Если в логике допущена ошибка — то игра вообще не запустится. На создание сцены с нуля уходит несколько часов, на отладку — ещё больше. Сцену можно усложнять, делать длинные переходы, разветвлнные диалоги, дополнительные задания... В общем — в пределах Вашей фантазии (и возможностей двжика).<br>
Всем спасибо, до новых встреч.<br>
Автор статьи - Ким Азимов ([[Участник:Kim|Kim]]) 2012 год<br>
Идея - Григорий Белый (Dezertir1w2) 2011 год.<br>
Свои вопросы и пожелания отправляйте на почту.
Другие места
LANGUAGE