SoC. Анимации NPC — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Erlik (обсуждение | вклад) (→Часть вторая.) |
(→Добавление звуков в script_sound) |
||
(не показаны 16 промежуточные версии 8 участников) | |||
Строка 6: | Строка 6: | ||
Вся изложенная ниже схема является единым целым и ее можно ставить в ltx –ный файл логики любому вашему НПС целиком. Она будет зациклена и повторяться по кругу если кое-где поставить другие варианты перехода от одной ремарки к другой. | Вся изложенная ниже схема является единым целым и ее можно ставить в ltx –ный файл логики любому вашему НПС целиком. Она будет зациклена и повторяться по кругу если кое-где поставить другие варианты перехода от одной ремарки к другой. | ||
− | < | + | <ini>[logic] |
active = remark@base | active = remark@base | ||
danger = danger_condition | danger = danger_condition | ||
Строка 25: | Строка 25: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog </ | + | meet_dialog = escape_lager_guard_start_dialog </ini> |
В базовой ремарке мой чувак использует анимку Волка - hello_wpn – одной рукой машет ГГ, другой держит ствол. | В базовой ремарке мой чувак использует анимку Волка - hello_wpn – одной рукой машет ГГ, другой держит ствол. | ||
Строка 37: | Строка 37: | ||
В моей схеме: «чего стоишь сталкер, подходи, будем разговаривать» (esc_bridge_soldiers) отдавая салют, и на второй дистанции - «разбежались сосунки и т.д». (esc_lager_killer) | В моей схеме: «чего стоишь сталкер, подходи, будем разговаривать» (esc_bridge_soldiers) отдавая салют, и на второй дистанции - «разбежались сосунки и т.д». (esc_lager_killer) | ||
В строчке meet_state_wpn - реакция НПС если эктор с пушкой в руках. У меня в этой схеме он встает в позу '''ward''' – руки за спиной, голова наклонена вниз. Словом поза тюремщика или надсмотрщика (ward примерно так и переводится). | В строчке meet_state_wpn - реакция НПС если эктор с пушкой в руках. У меня в этой схеме он встает в позу '''ward''' – руки за спиной, голова наклонена вниз. Словом поза тюремщика или надсмотрщика (ward примерно так и переводится). | ||
− | В этой позе НПС на дистанции ближе 10 метров орет | + | В этой позе НПС на дистанции ближе 10 метров орет «повторяю для тупых - отошел к дальней стене камеры…» (cit_base_guard_talk_to_actor2), а если ГГ подойдет еще ближе - «ты щас сдохнешь падла, понял…» (gar_bandits_seryi) и еще несколько рандомных фраз, которые заданы звуковой темой gar_bandits_seryi. |
К начальной анимке также можно добавлять любую звуковую тему через строчку snd. В данной ремарке ее нет. | К начальной анимке также можно добавлять любую звуковую тему через строчку snd. В данной ремарке ее нет. | ||
Строка 45: | Строка 45: | ||
− | < | + | <ini>[remark@sit] |
anim = sit_ass | anim = sit_ass | ||
snd = mil_guard_to_max | snd = mil_guard_to_max | ||
Строка 54: | Строка 54: | ||
;on_timer = 30000| remark@ raciya | ;on_timer = 30000| remark@ raciya | ||
on_signal = sound_end| remark@raciya | on_signal = sound_end| remark@raciya | ||
− | danger = danger_condition</ | + | danger = danger_condition</ini> |
Строка 65: | Строка 65: | ||
Следующая схема. | Следующая схема. | ||
− | < | + | <ini>[remark@raciya] |
anim = choose | anim = choose | ||
snd = bar_arena_public | snd = bar_arena_public | ||
Строка 82: | Строка 82: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
Анимка '''choose''' – ГГ что-то высматривает: оглядывается по сторонам, прикладывает руку ко лбу, так же как это делам мы, когда смотрим вдаль против солнца. | Анимка '''choose''' – ГГ что-то высматривает: оглядывается по сторонам, прикладывает руку ко лбу, так же как это делам мы, когда смотрим вдаль против солнца. | ||
Строка 91: | Строка 91: | ||
Через 120 секунд - переход к следующей ремарке: on_timer = 120000| remark@work | Через 120 секунд - переход к следующей ремарке: on_timer = 120000| remark@work | ||
− | < | + | <ini>[remark@work] |
anim = caution | anim = caution | ||
no_move = true | no_move = true | ||
Строка 98: | Строка 98: | ||
on_timer = 30000| remark@work2 | on_timer = 30000| remark@work2 | ||
meet = no_meet | meet = no_meet | ||
− | danger = danger_condition</ | + | danger = danger_condition</ini> |
Анимка '''caution''' – ГГ слегка согнувшись, что-то внимательно высматривает на земле, руки прикладывает к коленям. А затем радостно сообщает - «ребята у нас появилась работа». Видимо, что-то высмотрел интересное. | Анимка '''caution''' – ГГ слегка согнувшись, что-то внимательно высматривает на земле, руки прикладывает к коленям. А затем радостно сообщает - «ребята у нас появилась работа». Видимо, что-то высмотрел интересное. | ||
Через 30 секунд - снова переход. | Через 30 секунд - снова переход. | ||
− | < | + | <ini>[remark@work2] |
anim = search | anim = search | ||
no_move = true | no_move = true | ||
Строка 110: | Строка 110: | ||
on_timer = 30000| remark@zombied | on_timer = 30000| remark@zombied | ||
meet = no_meet | meet = no_meet | ||
− | danger = danger_condition</ | + | danger = danger_condition</ini> |
− | Анимка '''search''' - поиск, только более развернутый. ГГ встает на колени или на корточки и начинает что искать. Что он при этом произносит – узнаете, когда послушаете. | + | Анимка '''search''' - поиск, только более развернутый. ГГ встает на колени или на корточки и начинает что-то искать. Что он при этом произносит – узнаете, когда послушаете. |
Через 30 секунд переход к схеме зомби. | Через 30 секунд переход к схеме зомби. | ||
− | < | + | <ini>[remark@zombied] |
anim = trans_zombied | anim = trans_zombied | ||
snd = pri_followers_leader_phrase1_1 | snd = pri_followers_leader_phrase1_1 | ||
Строка 131: | Строка 131: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
Анимка '''trans_zombied''' - падает на колени, головой двигает вверх-вниз. | Анимка '''trans_zombied''' - падает на колени, головой двигает вверх-вниз. | ||
'''trans_1''' - также стоит на коленях, только головой вращает по кругу. | '''trans_1''' - также стоит на коленях, только головой вращает по кругу. | ||
− | '''trans_0''' – то же самое, только более энергичней. Или наоборот - | + | '''trans_0''' – то же самое, только более энергичней. Или наоборот - извиняюсь если перепутал. |
− | Схема раненый. Тут все понятно. | + | Схема "раненый". Тут все понятно. |
− | < | + | <ini>[remark@wounded] |
anim = wounded_heavy_3 | anim = wounded_heavy_3 | ||
snd = help_heavy | snd = help_heavy | ||
Строка 145: | Строка 145: | ||
meet = no_meet | meet = no_meet | ||
on_timer = 30000| remark@dinner | on_timer = 30000| remark@dinner | ||
− | danger = danger_condition</ | + | danger = danger_condition</ini> |
Строка 154: | Строка 154: | ||
Схема обед. | Схема обед. | ||
− | < | + | <ini>[remark@dinner] |
anim = sit_knee | anim = sit_knee | ||
no_move = true | no_move = true | ||
Строка 169: | Строка 169: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
'''sit_knee''' - чувак сидит на заднице, опираясь на руку. | '''sit_knee''' - чувак сидит на заднице, опираясь на руку. | ||
Строка 176: | Строка 176: | ||
Звуковая тема wait – это пауза, в которой непись ничего не говорит. | Звуковая тема wait – это пауза, в которой непись ничего не говорит. | ||
− | < | + | <ini>[remark@dynamite] |
anim = dynamite | anim = dynamite | ||
no_move = true | no_move = true | ||
Строка 182: | Строка 182: | ||
meet = no_meet | meet = no_meet | ||
on_timer = 30000| remark@claim | on_timer = 30000| remark@claim | ||
− | danger = danger_condition</ | + | danger = danger_condition</ini> |
'''dynamite''' – закладка динамита. Как это выглядит – помните долговца на милитари у стены с динамитом? | '''dynamite''' – закладка динамита. Как это выглядит – помните долговца на милитари у стены с динамитом? | ||
− | < | + | <ini>[remark@claim] |
anim = claim | anim = claim | ||
snd = esc_wolf_thanks | snd = esc_wolf_thanks | ||
Строка 193: | Строка 193: | ||
meet = meet@claim | meet = meet@claim | ||
danger = danger_condition | danger = danger_condition | ||
− | on_timer = 60000| remark@story</ | + | on_timer = 60000| remark@story</ini> |
Строка 201: | Строка 201: | ||
− | < | + | <ini>[meet@claim] |
meet_state = 7|refuse@mil_collect_phrase5| 5|probe_2@mil_collect_phrase6 | meet_state = 7|refuse@mil_collect_phrase5| 5|probe_2@mil_collect_phrase6 | ||
meet_state_wpn = 7|backoff@gar_dm_bandit_demand | meet_state_wpn = 7|backoff@gar_dm_bandit_demand | ||
Строка 208: | Строка 208: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
Анимка '''refuse''' - непись пожимает плечами и произносит mil_collect_phrase5 - «не срать». | Анимка '''refuse''' - непись пожимает плечами и произносит mil_collect_phrase5 - «не срать». | ||
− | '''probe_2''' - судя по сопровождающим ее звукам (независимо от прописанной мной звуковой темы) – это анимка Круглова (его манипуляции с прибором). Если у вашего НПС будет в руках оружие - то смотреться она будет куда интереснее, так как выглядит будто непись проверяет свой ствол, совершая массу интересных движений. | + | '''probe_2''' - судя по сопровождающим ее звукам (независимо от прописанной мной звуковой темы) – это анимка Круглова (его манипуляции с прибором, а может Сахарова - впрочем, это не важно). Если у вашего НПС будет в руках оружие - то смотреться она будет куда интереснее, так как выглядит будто непись проверяет свой ствол, совершая массу интересных движений. |
Фраза mil_collect_phrase6 - «опа – с нами новое мясо». | Фраза mil_collect_phrase6 - «опа – с нами новое мясо». | ||
Строка 217: | Строка 217: | ||
− | < | + | <ini>[remark@story] |
anim = mode_shlem | anim = mode_shlem | ||
no_move = true | no_move = true | ||
Строка 233: | Строка 233: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
Строка 241: | Строка 241: | ||
'''probe''' - укороченный вариант probe_2 и probe_1 | '''probe''' - укороченный вариант probe_2 и probe_1 | ||
− | < | + | <ini>[remark@story_end] |
anim = probe_3 | anim = probe_3 | ||
no_move = true | no_move = true | ||
Строка 252: | Строка 252: | ||
[danger_condition] | [danger_condition] | ||
− | ignore_distance = 10</ | + | ignore_distance = 10</ini> |
'''probe_3''' - интересная анимка (похоже что кругловская)- чувак срывается с места в панике, затем сгибается как будто от боли, хватается за голову. | '''probe_3''' - интересная анимка (похоже что кругловская)- чувак срывается с места в панике, затем сгибается как будто от боли, хватается за голову. | ||
agr_doctor_1 - базар доктора в тайнике стрелка. | agr_doctor_1 - базар доктора в тайнике стрелка. | ||
− | + | Теперь поясню строчки | |
+ | <pre> | ||
on_actor_dist_ge = 30| %+passage_to_story_end% | on_actor_dist_ge = 30| %+passage_to_story_end% | ||
on_info = {+passage_to_story_end} remark@story_end</pre> | on_info = {+passage_to_story_end} remark@story_end</pre> | ||
Строка 270: | Строка 271: | ||
P.S. : Кажется понял почему у меня стопорилась схема при использовании перехода on_signal = sound_end|. Дело в том, что если в имени звука, по завершении которого схема должна перейти к новому блоку стоит флажок seq, то он вроде как отыграется только один раз (если в этой теме нет дополнительных реплик). Следовательно по второму кругу он просто не будет срабатывать, а значит и схема застопорится. Так что для этого нужно ставить звук в имени которого в файле sound_script есть флажок rnd. Тема mil_guard_to_max как раз с флажком seq (и реплика только одна - без вариантов). Потому здесь (в схеме sit) она и будет стопориться на втором круге, если не заменить тему на другую. | P.S. : Кажется понял почему у меня стопорилась схема при использовании перехода on_signal = sound_end|. Дело в том, что если в имени звука, по завершении которого схема должна перейти к новому блоку стоит флажок seq, то он вроде как отыграется только один раз (если в этой теме нет дополнительных реплик). Следовательно по второму кругу он просто не будет срабатывать, а значит и схема застопорится. Так что для этого нужно ставить звук в имени которого в файле sound_script есть флажок rnd. Тема mil_guard_to_max как раз с флажком seq (и реплика только одна - без вариантов). Потому здесь (в схеме sit) она и будет стопориться на втором круге, если не заменить тему на другую. | ||
Но это еще надо проверить. | Но это еще надо проверить. | ||
− | Закоментированные строчки - пред которыми стоит ; - может смело | + | Закоментированные строчки - пред которыми стоит ; - может смело выкидывать - это остатки проб разных вариантов. |
== Часть вторая. == | == Часть вторая. == | ||
Строка 276: | Строка 277: | ||
Еще одна схема. На этот раз в нее добавлены еще постэффекты. | Еще одна схема. На этот раз в нее добавлены еще постэффекты. | ||
− | < | + | <ini>[logic] |
active = remark@base | active = remark@base | ||
danger = danger_condition | danger = danger_condition | ||
Строка 287: | Строка 288: | ||
meet = meet | meet = meet | ||
on_actor_dist_le = 2| remark@punch | on_actor_dist_le = 2| remark@punch | ||
− | danger = danger_condition </ | + | danger = danger_condition </ini> |
С первой ремаркой все понятно. Переход ко второй на дистанции ближе 2 метров. | С первой ремаркой все понятно. Переход ко второй на дистанции ближе 2 метров. | ||
− | < | + | <ini>[remark@punch] |
anim = punch | anim = punch | ||
snd = cit_jail_guard_sneer | snd = cit_jail_guard_sneer | ||
Строка 307: | Строка 308: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
'''punch'''– анимка удара рукой (или прикладом). Так как я не специалист по боксу, то не скажу точно | '''punch'''– анимка удара рукой (или прикладом). Так как я не специалист по боксу, то не скажу точно | ||
Строка 316: | Строка 317: | ||
ствола вправо или влево. | ствола вправо или влево. | ||
'''backoff2''' - более веселая анимка backoff. | '''backoff2''' - более веселая анимка backoff. | ||
− | НПС покажет ГГ что-то вроде фака, перед тем как помахать стволом и | + | НПС покажет ГГ что-то вроде фака, перед тем как помахать стволом и при этом скажет что-то весьма нелицеприятное. |
''' | ''' | ||
'''%=run_cam_effector(fatigue)%''' - это вызов анимации камеры ''fatigue'' из папки anims. | '''%=run_cam_effector(fatigue)%''' - это вызов анимации камеры ''fatigue'' из папки anims. | ||
Строка 329: | Строка 330: | ||
В следующей схеме идет продолжение постпроцесса – первые 15 секунд. Потом его остановка: on_timer = 15000| %=stop_postprocess(1777)%. | В следующей схеме идет продолжение постпроцесса – первые 15 секунд. Потом его остановка: on_timer = 15000| %=stop_postprocess(1777)%. | ||
− | < | + | <ini>[remark@doctor_wakeup] |
anim = doctor_wakeup | anim = doctor_wakeup | ||
snd = cit_doctor_start_dlg | snd = cit_doctor_start_dlg | ||
Строка 345: | Строка 346: | ||
use = true | use = true | ||
use_wpn = true | use_wpn = true | ||
− | meet_dialog = escape_lager_guard_start_dialog</ | + | meet_dialog = escape_lager_guard_start_dialog</ini> |
Начальная анимация - '''doctor_wakeup''' – доктор в мертвом городе. НПС склонится вниз – как будто над чьим то телом (по задумке – над меченым) и начнет базарить. Но совсем не то, что стоит у меня в строчке snd. Видимо, данная анимка завязана со звуком, и иначе не идет. | Начальная анимация - '''doctor_wakeup''' – доктор в мертвом городе. НПС склонится вниз – как будто над чьим то телом (по задумке – над меченым) и начнет базарить. Но совсем не то, что стоит у меня в строчке snd. Видимо, данная анимка завязана со звуком, и иначе не идет. | ||
Строка 354: | Строка 355: | ||
Схема – пленный. | Схема – пленный. | ||
− | < | + | <ini>[remark@prisoner] |
anim = prisoner | anim = prisoner | ||
snd = agr_krot_fear | snd = agr_krot_fear | ||
Строка 372: | Строка 373: | ||
[danger_condition] | [danger_condition] | ||
− | ignore_distance = 10</ | + | ignore_distance = 10</ini> |
Строка 396: | Строка 397: | ||
Анимки '''psy_shoot, psy_armed, psycho_pain, psycho_shoot'''– пока остаются на стадии исследования. Так как с ними либо глючит, либо вылетает. | Анимки '''psy_shoot, psy_armed, psycho_pain, psycho_shoot'''– пока остаются на стадии исследования. Так как с ними либо глючит, либо вылетает. | ||
+ | |||
+ | |||
+ | |||
+ | == '''Добавление звуков в script_sound<br>''' == | ||
+ | |||
+ | |||
+ | Открываем файл script_sound.ltx и видим множество секций типа:<br> | ||
+ | <code>[sleep_rnd] | ||
+ | stalker = 1,states\sleep\sleep_</code> | ||
+ | |||
+ | sleep_rnd - это имя секции, его то мы и будем писать в логику;<br> | ||
+ | states\sleep\sleep_ - путь к звуковому файлу, который будем проигрывать ;<br> | ||
+ | =1 - похоже это указывает на то что звук рандомный, так как реплики ключевых персонажей = 0<br> | ||
+ | |||
+ | По такому принципу можно добавить свои звуки в логику, но они '''ОБЯЗАТЕЛЬНО''' должны соответствовать требованиям (формат OGG, т.д.)<br> | ||
+ | |||
+ | Запускаем игру и видим, что при срабатывании звука у нас стабильный вылет.<br> | ||
+ | Значит едем дальше: открываем файл scripts\sound_theme.script,<br> | ||
+ | |||
+ | спускаемся до строки: | ||
+ | <code>theme = { | ||
+ | -- погода | ||
+ | weather = { exec = sound_theme.weather_class, | ||
+ | types = {weather_bad = {min_snd = 3, | ||
+ | max_snd = 5, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), | ||
+ | max_ids = {}}, | ||
+ | </code><br> | ||
+ | |||
+ | Видим кучу секций вида:<br> | ||
+ | <code>help = {min_snd = 3, max_snd = 5, rnd = | ||
+ | 100, prior = 5, rnd_id = id(), into_id = id(), | ||
+ | max_ids = {}},</code> | ||
+ | |||
+ | |||
+ | Help - имя звука, если здесь оно такое то в script_sound должна быть секция help_seq, без этого мы вылет конечно не словим, но и звук не услышим.<br> | ||
+ | min_snd = 3 - минимальное громкость звука, то есть слышим мы его на расстоянии 3 метра.<br> | ||
+ | max_snd = 5 - аналогично, минимальному только максимальное расстояние, много ставить не стоит.<br> | ||
+ | rnd = 100, prior = 5 -вероятно отвечают за вероятность проигрыша звука, но это пока не проверено.<br> | ||
+ | Вот и все, в итоге мы должны получить в файле script_sound: | ||
+ | <code>[название_seq] | ||
+ | stalker = 0,scenario\Своя_папка\свой_звук<br></code> | ||
+ | А в sound_theme:<br> | ||
+ | <code>название = {min_snd = 3, max_snd = 5, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}}</code><br> | ||
+ | В логике получается пишем '''название_seq''' | ||
+ | |||
+ | |||
Строка 401: | Строка 448: | ||
'''erlik''' | '''erlik''' | ||
---- | ---- | ||
+ | |||
+ | [[Категория:Скрипты]] |
Текущая версия на 05:56, 21 сентября 2013
Недавно решил поэкспериментировать с анимками НПС, и теперь выкладываю результаты моих опытов над "людьми". Разумеется, опытные модмейкеры все это давно знают – поэтому материал предназначен для новичков, которые еще не освоили как прописывать неписям разные прикольные анимки, а заодно и озвучку через логику. Все анимки взяты из файла state_lib. script. Анимки, которые имеются в движке, но не вписаны в указанный файл, не рассматриваются. Это тема для отдельной статьи. Озвучка взята из файла sound_script (папка misc). Конечно, хотелось использовать и звуковые темы не вписанные в этот файл, но имеющиеся в папке sounds - но с этим еще надо разобраться.
Часть первая.
Вся изложенная ниже схема является единым целым и ее можно ставить в ltx –ный файл логики любому вашему НПС целиком. Она будет зациклена и повторяться по кругу если кое-где поставить другие варианты перехода от одной ремарки к другой.
[logic] active = remark@base danger = danger_condition meet = meet [remark@base] anim = hello_wpn no_move = true target = actor meet = meet on_actor_dist_le = 2| remark@sit [meet] meet_state = 10|salut@esc_bridge_soldiers| 5|salut_free@esc_lager_killer meet_state_wpn = 10|ward@cit_base_guard_talk_to_actor2| 5|probe_2@gar_bandits_seryi victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
В базовой ремарке мой чувак использует анимку Волка - hello_wpn – одной рукой машет ГГ, другой держит ствол. Это начальная анимка, которая будет отрабатываться НПС, пока ГГ не подойдет на дистанцию встречи. В секции meet задается схема реагирования НПС при подходе к нему эктора. В строчке meet_state – реакция при подходе безоружного ГГ. На расстоянии 10 метров НПС отдает честь, затем встает в позицию «смирно» - руки по швам. Это анимка salut. Ближе 5 метров – тоже самое, дальше переходит в позицию «вольно». Это анимка salut_free. В секции meet можно задавать и то, что НПС будет базарить при виде эктора. В моей схеме: «чего стоишь сталкер, подходи, будем разговаривать» (esc_bridge_soldiers) отдавая салют, и на второй дистанции - «разбежались сосунки и т.д». (esc_lager_killer) В строчке meet_state_wpn - реакция НПС если эктор с пушкой в руках. У меня в этой схеме он встает в позу ward – руки за спиной, голова наклонена вниз. Словом поза тюремщика или надсмотрщика (ward примерно так и переводится). В этой позе НПС на дистанции ближе 10 метров орет «повторяю для тупых - отошел к дальней стене камеры…» (cit_base_guard_talk_to_actor2), а если ГГ подойдет еще ближе - «ты щас сдохнешь падла, понял…» (gar_bandits_seryi) и еще несколько рандомных фраз, которые заданы звуковой темой gar_bandits_seryi. К начальной анимке также можно добавлять любую звуковую тему через строчку snd. В данной ремарке ее нет.
Переходим к следующей схеме. Так как все эти схему у меня завязаны вместе, то переход ко второй ремарке произойдет, когда ГГ подойдет к НПС на дистанцию ближе двух метров. Прописано этой в строчке on_actor_dist_le = 2| remark@sit
[remark@sit] anim = sit_ass snd = mil_guard_to_max no_move = true target = actor meet = no_meet ;on_actor_dist_le = 2| remark@raciya ;on_timer = 30000| remark@ raciya on_signal = sound_end| remark@raciya danger = danger_condition
Итак, что делает НПС в этой ремарке.
Сидит на заднице - sit_ass, орет - mil_guard_to_max – «макс, у нас тут проблема на хуторе нарисовалась, собирай народ…»
В секции meet прописано отсутствие встречи, так как задано no_meet . Так что разговаривать с ГГ непись не будет. После отработки заданной звуковой темы идет переход к к ремарке remark@ raciya.
Сделано это через строчку on_signal = sound_end| remark@raciya.
Переведу: на сигнал «конец звуковой темы» переходим к схеме remark@raciya.
Следующая схема.
[remark@raciya] anim = choose snd = bar_arena_public no_move = true target = actor meet = meet@raciya on_timer = 120000| remark@work ;on_actor_dist_ge = 35| remark@work danger = danger_condition [meet@raciya] meet_state = 7|binocular@val_escort_guards| 5|guard_rac@mil_pavlik_to_ara meet_state_wpn = 7|hide_rac@mil_ara_ambush victim = 7|actor victim_wpn = 7|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
Анимка choose – ГГ что-то высматривает: оглядывается по сторонам, прикладывает руку ко лбу, так же как это делам мы, когда смотрим вдаль против солнца. Звуковая тема – что то там из реплик на арене. При встрече – смотрит в бинокль (если он у него есть) и издевательски базарит - «скоро ты будешь работать обедом для мутантов» (в этой теме реплик несколько). На 5 метрах достает рацию (если есть) - анимка guard_rac и базарит реплики из темы предателя Павлика на милитари «все чисто можете подходить». При угрозе стволом - анимка hide_rac («сидит с рацией»), базар - «это засада, уходим» Через 120 секунд - переход к следующей ремарке: on_timer = 120000| remark@work
[remark@work] anim = caution no_move = true snd = mil_max_before_collect target = actor on_timer = 30000| remark@work2 meet = no_meet danger = danger_condition
Анимка caution – ГГ слегка согнувшись, что-то внимательно высматривает на земле, руки прикладывает к коленям. А затем радостно сообщает - «ребята у нас появилась работа». Видимо, что-то высмотрел интересное. Через 30 секунд - снова переход.
[remark@work2] anim = search no_move = true snd = mil_collect_phrase3 target = actor on_timer = 30000| remark@zombied meet = no_meet danger = danger_condition
Анимка search - поиск, только более развернутый. ГГ встает на колени или на корточки и начинает что-то искать. Что он при этом произносит – узнаете, когда послушаете. Через 30 секунд переход к схеме зомби.
[remark@zombied] anim = trans_zombied snd = pri_followers_leader_phrase1_1 no_move = true target = actor on_timer = 60000| remark@wounded meet = meet@zombied danger = danger_condition [meet@zombied] meet_state = 5|trans_0@hail meet_state_wpn = 5|trans_1@hail victim = 5|actor victim_wpn = 5|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
Анимка trans_zombied - падает на колени, головой двигает вверх-вниз. trans_1 - также стоит на коленях, только головой вращает по кругу. trans_0 – то же самое, только более энергичней. Или наоборот - извиняюсь если перепутал.
Схема "раненый". Тут все понятно.
[remark@wounded] anim = wounded_heavy_3 snd = help_heavy target = actor meet = no_meet on_timer = 30000| remark@dinner danger = danger_condition
wounded_heavy_3 – это анимка тяжелораненого. (есть еще и другие анимки раненого).
Чувак скрючившись, грохнется на землю. Но на ней не остается, а тут же встает и бежит в сторону в денжере. Что и понятно – здоровье то у него норм. Остальные неписи видевшие как чувак упал, так же срываются в денжере с места.
Ищут того, кто «стрелял». Не удивляйтесь, но так они запрограммированы.
Схема обед.
[remark@dinner] anim = sit_knee no_move = true target = actor meet = meet@dinner danger = danger_condition on_actor_dist_ge = 15| remark@dynamite [meet@dinner] meet_state = 5|eat_bread@wait| 3|eat_energy@wait meet_state_wpn = 5|eat_kolbasa@wait| 3|eat_vodka@val_escort_dead victim = 8|actor victim_wpn = 8|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
sit_knee - чувак сидит на заднице, опираясь на руку. eat_bread, eat_kolbasa, eat_energy, eat_vodka - тут я думаю ничего объяснять не надо. Чувак хавает и пьет. Пригубив водки, произносит – «пусть земля тебе будет пухом» При отходе эктора на дистанцию больше 15 метров - переход к схеме динамит. Звуковая тема wait – это пауза, в которой непись ничего не говорит.
[remark@dynamite] anim = dynamite no_move = true target = actor meet = no_meet on_timer = 30000| remark@claim danger = danger_condition
dynamite – закладка динамита. Как это выглядит – помните долговца на милитари у стены с динамитом?
[remark@claim] anim = claim snd = esc_wolf_thanks target = actor meet = meet@claim danger = danger_condition on_timer = 60000| remark@story
Анимка claim - НПС подзывает ГГ рукой.
snd = esc_wolf_thanks - здесь НПС произносит
фразу волка: «меченый теперь тебе проход в лагерь открыт, подходи».
[meet@claim] meet_state = 7|refuse@mil_collect_phrase5| 5|probe_2@mil_collect_phrase6 meet_state_wpn = 7|backoff@gar_dm_bandit_demand victim = 7|actor victim_wpn = 7|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
Анимка refuse - непись пожимает плечами и произносит mil_collect_phrase5 - «не срать». probe_2 - судя по сопровождающим ее звукам (независимо от прописанной мной звуковой темы) – это анимка Круглова (его манипуляции с прибором, а может Сахарова - впрочем, это не важно). Если у вашего НПС будет в руках оружие - то смотреться она будет куда интереснее, так как выглядит будто непись проверяет свой ствол, совершая массу интересных движений. Фраза mil_collect_phrase6 - «опа – с нами новое мясо».
backoff - обычная анимка. Непись начинает махать стволом в разные стороны – типа убери ствол, меченый. Фраза - gar_dm_bandit_demand - «бабки артефакты гони», «ты че козел не врубаешься», «гони бабло или бошку отстрелим». Так как тема рандомная (с окончанием rnd в имени темы в файле sound_script – то и фраз несколько)
[remark@story] anim = mode_shlem no_move = true target = actor meet = meet@story danger = danger_condition on_actor_dist_ge = 30| %+passage_to_story_end% on_info = {+passage_to_story_end} remark@story_end [meet@story] meet_state = 10|probe@wait| 5|probe_1@hail meet_state_wpn = 10|probe_2@wait| 5|suicide@mil_crazy victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
mode_shlem - анимка то ли Круглова, то ли Сахарова. Непись будет что то вертеть в руках.
probe_1 – тоже самое что и probe_2 , только здесь он плечами вроде бы не дергает.
suicide - самоубийство. Советую посмотреть – тем более с озвучкой mil_crazy.
probe - укороченный вариант probe_2 и probe_1
[remark@story_end] anim = probe_3 no_move = true snd = agr_doctor_1 target = actor on_signal = sound_end| remark@base ;on_timer = 180000| remark@ base meet = no_meet danger = danger_condition [danger_condition] ignore_distance = 10
probe_3 - интересная анимка (похоже что кругловская)- чувак срывается с места в панике, затем сгибается как будто от боли, хватается за голову. agr_doctor_1 - базар доктора в тайнике стрелка.
Теперь поясню строчки
on_actor_dist_ge = 30| %+passage_to_story_end% on_info = {+passage_to_story_end} remark@story_end
Когда эктор отойдет от НПС дальше чем 30 метров, ГГ выдается инфопоршень passage_to_story_end. После его получения - on_info - произойдет переход к базовой ремарке. Сам инфопоршень необходимо регистрировать в соответствующих файлах. Так как мой НПС находится на кордоне, то поршень я сунул в файл info_l01escape. Сообственно инфопоршень в строчке on_actor_dist_ge писать не обязательно(я его использовал только для примера) - можно просто поставить имя следующей ремарки - и в нужный момент произойдет переход. Но инфопоршень может понадобиться для других случаев.
Как я уже говорил в начале, схему можно сделать полностью зацикленной. Нужно лишь в тех блоках, где идет переход к следующей схеме через on_signal поставить таймер или дистанцию. Почему так - не знаю. Но у меня по второму кругу схема стопорилась на тех блоках, где шел переход через on_signal = sound_end|. По таймеру же все прекрасно крутится. Схема из второй части - как раз зацикленная.
P.S. : Кажется понял почему у меня стопорилась схема при использовании перехода on_signal = sound_end|. Дело в том, что если в имени звука, по завершении которого схема должна перейти к новому блоку стоит флажок seq, то он вроде как отыграется только один раз (если в этой теме нет дополнительных реплик). Следовательно по второму кругу он просто не будет срабатывать, а значит и схема застопорится. Так что для этого нужно ставить звук в имени которого в файле sound_script есть флажок rnd. Тема mil_guard_to_max как раз с флажком seq (и реплика только одна - без вариантов). Потому здесь (в схеме sit) она и будет стопориться на втором круге, если не заменить тему на другую. Но это еще надо проверить. Закоментированные строчки - пред которыми стоит ; - может смело выкидывать - это остатки проб разных вариантов.
Часть вторая.
Еще одна схема. На этот раз в нее добавлены еще постэффекты.
[logic] active = remark@base danger = danger_condition meet = meet [remark@base] anim = hello_wpn no_move = true target = actor meet = meet on_actor_dist_le = 2| remark@punch danger = danger_condition
С первой ремаркой все понятно. Переход ко второй на дистанции ближе 2 метров.
[remark@punch] anim = punch snd = cit_jail_guard_sneer meet = meet@punch target = actor on_signal = sound_end| %=run_cam_effector(fatigue)% on_timer = 60000| remark@doctor_wakeup %=run_postprocess(deadcity_wake:1777:false)% danger = danger_condition [meet@punch] meet_state = 5|hide_s_left@wait| 4|hide_s_right@wait meet_state_wpn = 5|backoff2@threat_back victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
punch– анимка удара рукой (или прикладом). Так как я не специалист по боксу, то не скажу точно как именно называется этот удар с правой в челюсть. Если поставите ее в meet_state_wpn на дистанции 2 метра - ГГ получит реальный удар в морду прикладом ствола. Так как я эксперементировал на своем торговце - то он (будучи безоружным) бил чисто кулаком. А если вместо запуска анимации камеры %=run_cam_effector(fatigue)% поставите запуск функции %=killactor%, то НПС кинется вас убивать.
hide_s_left и hide_s_right - непись присядет с разворотом ствола вправо или влево. backoff2 - более веселая анимка backoff. НПС покажет ГГ что-то вроде фака, перед тем как помахать стволом и при этом скажет что-то весьма нелицеприятное. %=run_cam_effector(fatigue)% - это вызов анимации камеры fatigue из папки anims. Земля уйдет из под ног ГГ. Ненадолго. Сработает сразу же после окончания фразы cit_jail_guard_sneer. А ровно через минуту от начала работы схемы – запуск постпроцесса %=run_postprocess(deadcity_wake:1777:false)% и переход к следующей схеме.
deadcity_wake – это постпроцесс, который должен был использоваться в Мертвом городе, если бы разрабы МГ все таки доделали. Если не видели - обязательно посмотрите.Сначала черный экран, затем прояснение с раздвоением картинки и красным фоном.
В следующей схеме идет продолжение постпроцесса – первые 15 секунд. Потом его остановка: on_timer = 15000| %=stop_postprocess(1777)%.
[remark@doctor_wakeup] anim = doctor_wakeup snd = cit_doctor_start_dlg meet = meet@doctor_wakeup target = actor on_timer = 15000| %=stop_postprocess(1777)% on_timer2 = 180000| remark@prisoner danger = danger_condition [meet@doctor_wakeup] meet_state = 3|sleep@cit_jail_guard_sleep| 2|sleep_sit@wait meet_state_wpn = 3|wounded_zombie@wait victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog
Начальная анимация - doctor_wakeup – доктор в мертвом городе. НПС склонится вниз – как будто над чьим то телом (по задумке – над меченым) и начнет базарить. Но совсем не то, что стоит у меня в строчке snd. Видимо, данная анимка завязана со звуком, и иначе не идет. Фразу прописанную мною - cit_doctor_start_dlg – нпс произнесет потом. Обе озвучки длинные – та, что идет с анимкой – монолог доктора в подземелье агропрома в тайнике Стрелка – типа, «что ж ты меченый в растяжку полез, сам же придумал эту хрень…» Моя озвучка - cit_doctor_start_dlg – неиспользованный монолог доктора в мертвом городе. Через 180 секунд – завершение схемы и переход к следующей.
Схема – пленный.
[remark@prisoner] anim = prisoner snd = agr_krot_fear meet = meet@prisoner target = actor on_timer = 60000| remark@base danger = danger_condition [meet@prisoner] meet_state = 5|help_me@gar_dm_newbie_no_money meet_state_wpn = 5|hands_up@agr_dont_shoot victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog [danger_condition] ignore_distance = 10
Анимка – prisoner – пленный. Помните Шустрого у бандитов? Вот это она и есть.
Фраза - agr_krot_fear – не смотря на то, что в названии звуковой темы имя Крота, орет ее Шустрый: типа братцы я тут, спасите.
help_me - машет рукой сидя на одном колене и орет, что у него "нет денег" - gar_dm_newbie_no_money . hands_up - руки кверху и орет "не убивай дяденька" (или типа того) - agr_dont_shoot.
Через 60 секунд возврат к базовой ремарке.
Часть третья.
В файле state_lib – большая библиотека анимок. Я успел попробовать только часть. У одного бармена их 12. Правда, из пяти опробованных мной сработала только одна bar_sleep - НПС положит голову на руки сложенные перед лицом и будет спать стоя.
Анимки - barman_talk_freу, barman_shock, barman_wait_danger, barman_walk_danger - никакого эффекта не дали. Видимо, они работают только на бармене. Остальные пробуйте сами.
Анимка psy_pain – пораженный пси-излучением. Чувак сядет на колени, начнет трясти головой и бить себе руками по голове.
psycho_pain – вроде бы тоже самое, только чувак обхватывает голову руками и так сидит.
Анимки psy_shoot, psy_armed, psycho_pain, psycho_shoot– пока остаются на стадии исследования. Так как с ними либо глючит, либо вылетает.
Добавление звуков в script_sound
Открываем файл script_sound.ltx и видим множество секций типа:
[sleep_rnd]
stalker = 1,states\sleep\sleep_
sleep_rnd - это имя секции, его то мы и будем писать в логику;
states\sleep\sleep_ - путь к звуковому файлу, который будем проигрывать ;
=1 - похоже это указывает на то что звук рандомный, так как реплики ключевых персонажей = 0
По такому принципу можно добавить свои звуки в логику, но они ОБЯЗАТЕЛЬНО должны соответствовать требованиям (формат OGG, т.д.)
Запускаем игру и видим, что при срабатывании звука у нас стабильный вылет.
Значит едем дальше: открываем файл scripts\sound_theme.script,
спускаемся до строки:
theme = {
-- погода
weather = { exec = sound_theme.weather_class,
types = {weather_bad = {min_snd = 3,
max_snd = 5, rnd = 100, prior = 5, rnd_id = id(), into_id = id(),
max_ids = {}},
Видим кучу секций вида:
help = {min_snd = 3, max_snd = 5, rnd =
100, prior = 5, rnd_id = id(), into_id = id(),
max_ids = {}},
Help - имя звука, если здесь оно такое то в script_sound должна быть секция help_seq, без этого мы вылет конечно не словим, но и звук не услышим.
min_snd = 3 - минимальное громкость звука, то есть слышим мы его на расстоянии 3 метра.
max_snd = 5 - аналогично, минимальному только максимальное расстояние, много ставить не стоит.
rnd = 100, prior = 5 -вероятно отвечают за вероятность проигрыша звука, но это пока не проверено.
Вот и все, в итоге мы должны получить в файле script_sound:
[название_seq]
stalker = 0,scenario\Своя_папка\свой_звук<br>
А в sound_theme:
название = {min_snd = 3, max_snd = 5, rnd = 100, prior = 5, rnd_id = id(), into_id = id(), max_ids = {}}
В логике получается пишем название_seq
erlik