Нещодавно вирішив поекспериментувати з аніма НПС, і тепер викладаю результати моїх дослідів над "людьми". Зрозуміло, досвідчені модмейкери все це давно знають – тому матеріал призначений для новачків, які ще не освоїли, як прописувати неписам різні прикольні анімики, а заразом і озвучку через логіку. Усі анімації взяті з файлу 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) вона і стопоритиметься на другому колі, якщо не замінити тему на іншу. Але це ще треба перевірити. Закоментовані рядки - перед якими стоїть; – може сміливо викидати – це залишки проб різних варіантів.