Сповіщення
Очистити все

SoC. Анімації NPC. Частина перша


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Нещодавно вирішив поекспериментувати з аніма НПС, і тепер викладаю результати моїх дослідів над "людьми". Зрозуміло, досвідчені модмейкери все це давно знають – тому матеріал призначений для новачків, які ще не освоїли, як прописувати неписам різні прикольні анімики, а заразом і озвучку через логіку. Усі анімації взяті з файлу state_lib. script. Анімації, які є в движку, але не вписані у вказаний файл, не розглядаються. Це тема окремої статті. Озвучення взято з файлу sound_script (папка misc). Звичайно, хотілося використовувати і звукові теми, які не вписані в цей файл, але наявні в папці sounds - але з цим ще треба розібратися.

Частина перша.

Вся викладена нижче схема є єдиним цілим і її можна ставити в файл логіки будь-якому вашому НПС цілком. Вона буде зациклена і повторюватися по колу, якщо подекуди поставити інші варіанти переходу від однієї ремарки до іншої.

[ 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 |  
 
 
 


Анімація 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 _ 
 
 
 


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 |			 _ _ 
 
 
 


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

PS: Здається, зрозумів чому у мене стопорилася схема при використанні переходу on_signal=sound_end|. Справа в тому, що якщо в імені звуку, по завершенні якого схема повинна перейти до нового блоку, стоїть прапорець seq, то він начебто відіграється лише один раз (якщо в цій темі немає додаткових реплік). Отже по другому колу він просто не спрацьовуватиме, а значить і схема зупиниться. Так що для цього потрібно ставити звук у імені якого у файлі sound_script є прапорець rnd. Тема mil_guard_to_max якраз із прапорцем seq (і репліка лише одна – без варіантів). Тому тут (у схемі sit) вона і стопоритиметься на другому колі, якщо не замінити тему на іншу. Але це ще треба перевірити. Закоментовані рядки - перед якими стоїть; – може сміливо викидати – це залишки проб різних варіантів.


   
Цитата