SoC. Анімації NPC
Матеріал із S.T.A.L.K.E.R. Inside Wiki
Нещодавно вирішив поекспериментувати з аніма НПС, і тепер викладаю результати моїх дослідів над "людьми". Зрозуміло, досвідчені модмейкери все це давно знають – тому матеріал призначений для новачків, які ще не освоїли, як прописувати неписам різні прикольні анімики, а заразом і озвучку через логіку. Усі анімації взяті з файлу state_lib. script. Анімації, які є в движку, але не вписані у вказаний файл, не розглядаються. Це тема окремої статті. Озвучення взято з файлу sound_script (папка misc). Звичайно, хотілося використовувати і звукові теми, які не вписані в цей файл, але наявні в папці sounds - але з цим ще треба розібратися.
Зміст
Частина перша.
Вся викладена нижче схема є єдиним цілим і її можна ставити в файл логіки будь-якому вашому НПС цілком. Вона буде зациклена і повторюватися по колу, якщо подекуди поставити інші варіанти переходу від однієї ремарки до іншої.
У базовій ремарку мій чувак використовує аніму Вовка - hello_wpn - однією рукою махає ГГ, інший тримає стовбур. Це початкова аніма, яка відпрацьовуватиметься НПС, поки РР не підійде на дистанцію зустрічі. У секції meet визначається схема реагування НПС при підході до нього ектора. У рядку meet_state – реакція під час підходу беззбройного ГГ. На відстані 10 метрів НПС віддає честь, потім встає у позицію «смирно» – руки по швах. Це анімаціяsalut. Ближче 5 метрів – те саме, далі переходить у позицію «вільно». Це анімаціяsalut_free.У секції meet можна задавати і те, що НПС буде базарити побачивши ектора. У моїй схемі: «чого стоїш сталкер, підходь, розмовлятимемо» (esc_bridge_soldiers) віддаючи салют, і на другій дистанції – «розбіглися сосунки і т.д». (esc_lager_killer)У рядку meet_state_wpn - реакція НПС, якщо ектор з гарматою в руках. У мене в цій схемі він встає в позу - руки за спиною, голова нахилена вниз. Словом поза тюремника чи наглядача (ward приблизно так і перекладається). У цій позі НПС на дистанції ближче 10 метрів репетує «повторюю для тупих – відійшов до дальньої стіни камери…» (cit_base_guard_talk_to_actor2), а якщо ГГ підійде ще ближче – «ти зараз здохнеш падла, зрозумів…» (gar_bandits_seryi) , які задано звуковою темою gar_bandits_seryi. До початкової анімації також можна додавати будь-яку звукову тему через рядок snd. У цьому ремарку її немає.
Переходимо до наступної схеми. Оскільки всі ці схеми у мене зав'язані разом, то перехід до другої ремарки відбудеться, коли РР підійде до НПС на дистанцію ближче двох метрів. Прописано це в рядку on_actor_dist_le = 2 remark@sit
Отже, що робить НПС у цій ремарку. Сидить на дупі -sit_ass, репетує - mil_guard_to_max - «макс, у нас тут проблема на хуторі намалювалася, збирай народ ...» У секції meet прописано відсутність зустрічі, так як задано no_meet . Тож розмовляти з ГГ непис не буде. Після відпрацювання заданої звукової теми йде перехід до ремарку remark@raciya. Зроблено це через рядок on_signal=sound_end remark@raciya. Переведу: на сигнал "кінець звукової теми" переходимо до схеми remark@raciya.
Анімаціяchoose- ГГ щось виглядає: оглядається на всі боки, прикладає руку до лоба, так само як це справам ми, коли дивимося вдалину проти сонця. Звукова тема – щось там із реплік на арені. При зустрічі - дивиться в бінокль (якщо він у нього є) і знущально базарит - "скоро ти працюватимеш обідом для мутантів" (у цій темі реплік кілька). На 5 метрах дістає рацію (якщо є) – анімаguard_racі базар репліки з теми зрадника Павлика на мілітарі «все чисто можете підходити». При загрозі стволом - анімаціяhide_rac(«сидить з рацією»), базар - «це засідка, йдемо» Через 120 секунд - перехід до наступної ремарки: on_timer = 120000 remark@work
Анімаціяcaution- ГГ злегка зігнувшись, щось уважно виглядає на землі, руки прикладає до колін. А потім радісно повідомляє – «хлопці у нас з'явилася робота». Мабуть, щось виглядало цікаве. Через 30 секунд – знову перехід.
Анімаціяsearch- пошук, тільки більш розгорнутий. ГГ встає навколішки або навпочіпки і починає щось шукати. Що він у своїй вимовляє – дізнаєтеся, коли послухаєте. Через 30 секунд перехід до схеми зомбі.
Анімаціяtrans_zombied- падає навколішки, головою рухає вгору-вниз.trans_1- також стоїть навколішки, тільки головою обертає по колу.trans_0– те саме, тільки енергійніше. Або навпаки - перепрошую, якщо переплутав.
Схема "поранений". Тут усе зрозуміло.
wounded_heavy_3- це анімація тяжко пораненого. (є ще й інші анімики пораненого). Чувак скрючившись, впаде на землю. Але на ній не залишається, а відразу встає і біжить убік у денжері. Що й зрозуміло – здоров'я щось у нього норм. Інші неписи, що бачили, як чувак упав, так само зриваються в денжері з місця. Шукають того, хто стріляв. Не дивуйтеся, але вони запрограмовані.
sit_knee- чувак сидить на дупі, спираючись на руку. - тут я думаю нічого пояснювати не треба. Чувак хаває та п'є. Пригубивши горілки, вимовляє – «хай земля тобі буде пухом». При відході ектора на дистанцію більше 15 метрів – перехід до схеми динаміт. Звукова тема wait – це пауза, у якій неписнічого не каже.
dynamite– закладка динаміту. Як це виглядає – пам'ятаєте боргівця на мілітарі біля стіни з динамітом?
Анімкаclaim- НПС називає ГГ рукою. snd = esc_wolf_thanks – тут НПС вимовляє фразу вовка: «мічений тепер тобі прохід у табір відкритий, підходь».
Анімаціяrefuse- непис знизує плечима і вимовляє mil_collect_phrase5 - «не срать».probe_2- судячи з звуків, що супроводжують її (незалежно від прописаної мною звукової теми) - це аніма Круглова (його маніпуляції з приладом, а може Сахарова - втім, це не важливо). Якщо у вашого НПС буде в руках зброя - то виглядатиме вона буде куди цікавіше, тому що виглядає ніби непис перевіряє свій ствол, здійснюючи масу цікавих рухів. Фраза mil_collect_phrase6 - "опа - з нами нове м'ясо".
backoff- звичайна аніма. Непис починає махати стволом у різні боки – типу прибери ствол, мічений. Фраза - gar_dm_bandit_demand - «бабки артефакти гони», «ти че козел не врубаєшся», «гоні бабло чи бошку відстрілимо». Так як тема рандомна (із закінченням rnd у імені теми у файлі sound_script – те й кілька фраз)
mode_shlem- анімація чи Круглова, чи Сахарова. Непис щось крутитиме в руках.probe_1- теж саме що і probe_2, тільки тут він плечима начебто не смикає.suicide- самогубство. Раджу подивитися – тим більше із озвучкою mil_crazy.probe- укорочений варіант probe_2 та probe_1
probe_3- цікава анімація (схоже, що кругловська) - чувак зривається з місця в паніці, потім згинається ніби від болю, хапається за голову. agr_doctor_1 - базар лікаря в тайнику стрілка.
Тепер поясню рядки
Коли ектор відійде від НПС далі ніж 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) вона і стопоритиметься на другому колі, якщо не замінити тему на іншу. Але це ще треба перевірити. Закоментовані рядки - перед якими стоїть; – може сміливо викидати – це залишки проб різних варіантів.
Частина друга.
Ще одна схема. Цього разу до неї додані щепостефекти.
Із першою ремаркою все зрозуміло. Перехід до другої на дистанції ближчий за 2 метри.
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)%.
Початкова анімація -doctor_wakeup- доктор у мертвому місті. НПС схилиться вниз – ніби над чиїмось тілом (за задумом – над міченим) і почне базарити. Але зовсім не те, щостоїть у мене в рядку snd. Мабуть, ця анімація зав'язана зі звуком, інакше не йде. Фразу прописану мною - cit_doctor_start_dlg - нпс скаже потім. Обидві озвучки довгі - та, що йде з анімацією - монолог лікаря в підземеллі агропрому в схованці Стрілка - типу, "що ж ти мічений у розтяжку поліз, сам же придумав цю хрень ..." Через 180 секунд – завершення схеми та перехід до наступної.
Анімація -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 - це ім'я секції, його ми й будемо писати в логіку; states\sleep\sleep_ - шлях до звукового файлу, який будемо програвати; =1 - схоже це свідчить про те що звук рандомний, оскільки репліки ключових персонажів = 0
За таким принципом можна додати свої звуки в логіку, але вони повинні обов'язково відповідати вимогам (формат OGG, т.д.).
Запускаємо гру та бачимо, що при спрацьовуванні звуку у нас стабільний виліт. Значить їдемо далі: відкриваємо файл scripts \ sound_theme.script,
спускаємося до рядка:
Бачимо купу секцій виду:
Help - ім'я звуку, якщо тут воно таке то в script_sound має бути секція help_seq, без цього ми виліт звичайно не зловимо, але й звук не почуємо. min_snd = 3 – мінімальна гучність звуку, тобто чуємо ми його на відстані 3 метри. max_snd = 5 - аналогічно, мінімальному лише максимальну відстань, багато ставити не варто. rnd = 100, prior = 5 -імовірно відповідають за ймовірність програшу звуку, але це поки що не перевірено. От і все, в результаті ми повинні отримати у файлі script_sound:
А в sound_theme:
У логіці виходить пишемоназва_seq