Система прапорів (path_walk, path_look)
У точках шляхів можна задавати прапори, що змінюють поведінку персонажа. Прапори задаються прямо в імені waypoint -а, наприклад, для точки з іменем " wp00 ": wp00|flag1|flag2
Прапори точок шляху path_walk :
- a=state
- Вибирає стан тіла при переміщенні (Тільки з розділу "Ходячі стани")
- Список станів можна взяти в gamedata\scripts\state_lib.script
- p=%
- Можливість зупинитися у точці у відсотках (0 – 100). За промовчанням 100, тобто. сталкер ніколи не проходить повз точки зупинки.
- sig=name
- Встановити сигнал з ім'ям name відразу після прибуття в точку (до повороту) для подальшої перевірки за допомогою поля on_signal логічної схеми. Якщо потрібно встановити сигнал після повороту – використовуйте відповідний прапорець шляху path_look .
Прапори точок шляху path_look :
- a =state
- Вибирає стан тіла під час стояння (або сидіння) на місці. (З розділів "Стоячі" та "Сидячі" стани)
- Список станів можна взяти в gamedata\scripts\state_lib.script
- t=msec - час у мілісекундах, який персонаж повинен дивитися у задану точку.
- * - Безкінечний час. Допустимі значення в діапазоні [1000, 30000], за замовчуванням – 5000.
- Для кінцевих (термінальних) вершин шляху path_walk , які мають не більше 1-ї відповідної точки path_look , значення t завжди вважається нескінченним і його явно ставити не потрібно.
- sig=name
- Після повороту в точку path_look встановити сигнал з ім'ям name .
- syn
- Наявність прапорця затримає встановлення сигналу до тих пір, поки в точку з прапорцем syn не прибудуть усі персонажі з даним team -ом ( team задається у вигляді текстового рядка в customdata ). До тих пір, поки решта персонажів не прибуде, очікує персонаж буде відігравати свою idle анімацію.
- sigtm=signal
- Встановлює сигнал під час виклику time_callback -а state manager -ом. Відповідно, якщо t = 0 , то сигнал буде встановлений після відігравання init анімації. Це використовується, наприклад, з анімацією press , яка складається з двох частин: 1 – натискаємо на кнопку, 2 – опускаємо руку.
- Дорогою path_look можна зробити:
-
wp00 | a = press|t= 0 |sigtm=pressed
- А потім переключити схему:
-
on_signal = pressed | інша_схема
Більш детальний опис шляхів.
Налаштування:
На карту для кожного walker-а потрібно поставити:
- Шлях path_walk , яким walker ходить.
- Шлях path_look , Що складається з точок, в які Walker дивиться.
Walker -ів може бути 1 або більше. Вони можуть діяти незалежно або взаємодіяти один з одним.
Якщо персонаж повинен стояти на місці, то йому задається одна точка шляху path_walk і як мінімум одна точка шляху path_look , хоча і можна не задавати точку погляду зовсім (гра автоматично визначить точку за замовчуванням ту, в яку НПС спочатку дивився), робити цього не слід .
Правила розміщення прапорців у коліях розглянемо на кількох прикладах:
Приклад 1:
Персонаж патрулює територію довкола двох будиночків. Маршрут будується так:
Як зробити, щоб персонаж між певними точками біг чи крався? Для цього в дорозі path_walk є прапорці.
Кожен вейпоїнт має ім'я: wp00 , wp01 і т.д.
Прапорці задаються на ім'я. Їх потрібно відокремлювати від імені за допомогою символу ' | '. Пишатися a = anim , де anim - назва анімації. Якщо ми напишемо a = threat то персонаж піде в стані данжер, якщо a = raid то побіжить зі зброєю напоготові і т.д.
Примітка : У точках шляху path_walk використовуються анімації ТІЛЬКИ з розділу «Ходячі стани»!
Приклад 2:
Розмова персонажа.
Щоб персонаж говорив, переміщаючись маршрутом, потрібно визначити в кожній точці список тем, на які він може говорити. І тому існують такі поля:
s = имя_звуковой_схемы - (за умовчанням звук вимкнено). Декілька тим можна перераховувати через кому.
Приклад 3:
У прикладі 3 використовується тільки поле s для того, щоб задати тему розмови, і прапорець sc , щоб показати, що звук програється не разово, а періодично.
Інші параметри ( sp , sf , st ) задавати НЕ РЕКОМЕНДУЄТЬСЯ, значення за замовчуванням прийнятні для більшості скриптів.
Параметр sa також використовувати НЕ РЕКОМЕНДУЄТЬСЯ. Якщо потрібно розпочати звук одночасно з анімацією, краще скористатися полями шляху path_look , про який буде написано нижче.
Якщо персонаж не тільки ходить маршрутом, але повинен також зупинятися та грати анімації, потрібно задати йому шлях path_look .
Приклад 4:
вдосконалимо приклад 1, щоб персонаж, проходячи повз отвор між домами, зупинявся і заглядав у нього:
Що додалося у цьому прикладі? Шлях path_look із двома точками. Зв'язок між точками цього шляху рекомендується відразу видалити в редакторі, оскільки він все одно не використовується.
Далі, у точках шляхів path_walk і path_look , які обведені малюнку пунктирною лінією, у редакторі ставимо спільні прапорці (в ACDC поле flags ). Наприклад, у верхній парі точок ставимо прапорець 0, а нижній парі точок – прапорець 1.
Тепер персонаж буде зупинятися в точках path_walk , помічених прапорцем, і дивитися в точку path_look , позначену тим самим прапорцем.
Якщо точка path_walk не позначена прапорцем, персонаж проходить її, не зупиняючись.
Однієї точки path_walk може відповідати кілька точок path_look . Тоді персонаж виберемо випадково одну з потрібних точок.
За аналогією з path_walk , в точках шляху path_look можна використовувати різні прапорці, що змінюють поведінку:
p = 100 - ймовірність, з якою персонаж подивиться саме в цю точку. Значення всіх підходящих точок підсумовуються, тобто. якщо в однієї точки p = 100 , а в іншій p = 300 , то персонаж подивиться в першу з ймовірністю 25%! (Тобто 100 з 400). Щоб уникнути плутанини, рекомендується задавати p так, щоб їхня сума становила 100 . За замовчуванням у всіх точок p = 100 .
t = 5000 - час, який персонаж затримається у цій точці (за замовчуванням 5000 мсек)
Приклад 5:
У цьому прикладі проходячи через точку wp00 персонаж з ймовірністю 30% подивиться в точку wp00 протягом 5 секунд, але з ймовірністю 70% подивиться в точку wp01 протягом 10 секунд.
За замовчуванням при зупинках персонаж грає анімацію idle , якщо він не в змозі crouch , або анімацію hide , якщо він в змозі crouch .
Якщо потрібна інша анімація, можна вказати її за допомогою прапорця:
a = ім'я_анімації - (за замовчуванням idle ).
Пишатися a = anim , де anim - назва анімації. Якщо ми напишемо a = hide , то персонаж сяде в стані данжер, якщо a = guard , то стане зі зброєю напоготові і т.д.
Примітка : У точках шляху path_look використовуються анімації ТІЛЬКИ з розділу «Стоячі та сидячі стани»!
Система прапорів для монстрів
Прапори шляху руху:
s=ім'я_звукової_теми
- Встановлює звукову тему на шляху до цієї точки ( idle , eat , attack , attack_hit , take_damage , die , threaten , steal , panic , growling ).
з
- Встановлює положення ходьби навприсядки.
r
- Встановлює положення ходьби біг.
sig=name
- Встановити сигнал з ім'ям name відразу після прибуття в точку (до повороту) для подальшої перевірки за допомогою поля on_signal логічної схеми.
b=vis/invis
- Прапор виключно для кровососу. Керує невидимістю ( vis - відключена, invis - включена).
Прапори шляху огляду:
t=msec
- Час у мілісекундах, на який потрібно чекати, дивлячись у крапку.
a=state
- Анімація ( stand_idle , sit_idle , lie_idle , eat , sleep , rest , attack , look_around , turn ).
Випадковий вибір шляху
Щодо точок шляху path_walk .
Є ще один цікавий факт: наступну точку шляху path_walk можна задавати рандомно.
Наприклад:
Нам потрібно, щоб НПС, що стоїть у точці p0 , патрулював територію за двома циклічними маршрутами:
p0 -> p1 -> p2 -> p0
p0 -> p3 -> p4 -> p0
Щоб задати варіацію вибору маршруту щодо точки p0 потрібно в посиланні на наступну точку шляху вказати не одну, а дві точки:
p0: links = p1 ( 1 ) , p3 ( 1 )
Таким не хитрим чином, НПС для продовження шляху рандомно вибере одну із запропонованих точок p1 або p3 . Після повернення в точку p0 вибір пройде знову. Варіювати вибір можна в будь-якій точці, наприклад, можна зробити так:
p0: links = p1 ( 1 ) , p3 ( 1 )
а в точці p1 , також задати вибір:
p1: links = p2 ( 1 ) , p3 ( 1 )
АЛЕ! Не слід робити вибір між двома шляхами, якщо в дорозі одна точка! Ось така схема не прийнята і, особисто в мене, викликає виліт:
Цифри в дужках означають ту саму ймовірність, з якою НПС піде в крапку. Якщо цифри задати однакові, то й ймовірність вибору для кожної точки буде рівна, якщо ж, наприклад, в одній із точок вказати значення 0.75, а в іншій 0.25:
p1: links = p2 ( 0.75 ) , p3 ( 0.25 )
то відповідно до точки p2 НПС ходитиме втричі частіше.
Схеми поведінки сталкерів.
Існує певний набір схем, які описують поведінку персонажа. Вони прописуються у нього в custom_data або, у випадку гулагу, у відповідних файлах, що описують роботи цього гулагу. Нижче наведено перелік цих схем.
У файлі gamedata\scripts\modules.script вказані всі схеми, що завантажуються.
Схема Walker
Це базова схема, за якою персонаж, переміщається патрульним шляхом ( path_walk ) і зупиняється у певних точках і виконує відповідні дії.
[walker]
path_walk = <ім'я_шляху> - основний шлях, яким ходить NPC
path_look = <ім'я_шляху> - шлях, куди дивиться NPC
team = <ім'я_команди> - команда для синхронізації
def_state_moving1 = <назва_анімації> - стан, в якому NPC точці шляху, якщо вона близько ( patol за замовчуванням)
def_state_moving2 = <назва_анімації> - стан, в якому NPC рухається до першої точки шляху, якщо вона не надто далеко ( rush за умовчанням)
def_state_moving3 = <назва_анімації> - стан, в якому NPC рухається до першої точки шляху, якщо вона далеко ( sprint за замовчуванням)
def_state_standing = <назва_анімації> - дефолтний стан в якому він стоїть і дивиться на точку, якщо в цій точці не заданий інший стан.
У точках path_walk , яким відповідають точки шляху path_look (стоять однакові прапорці), персонаж зупиняється і дивиться в певну точку, при цьому відігруючи (або не відігруючи) певну анімацію.
Приклад використання схеми:
[walker@pri_followers_leader_wave1_wait] path_walk = wave1_leader_walk2 path_look = wave1_leader_look2 def_state_moving1 = assault def_state_moving2 = assault team = followers
Файл: gamedata\scripts\xr_walker.script
Схема remark
Схема використовується для синхронізації зв'язки інших схем.
Примітка : не використовуйте цю схему як активну - це викликає неправильну поведінку NPC.
[remark]
snd_anim_synс = true/false - за промовчанням false . Вказує на те, чи потрібно синхронізувати звук з анімацією.
snd = <назва_звукової_теми> - звук ремарка, що береться з файлу sound_theme.script . Типово nil .
anim = <назва_анімації> - анімація ремарка, за умовчанням wait .
target = <параметр> – куди дивиться сталкер. Є такі варіанти:
-
- story_id – числове значення у ТЧ та ЧН або рядкове, із зазначенням додаткового параметра та самого SID, у ЗП, у прикладі нижче вказана частина логіки монолітівця-проповідника у Прип'яті, коли той стріляє у Айса;
- Приклад (ЗП):
-
target = story | pri_a17_military_sergeant_morozov
- actor – без коментарів;
- nil – позиція обчислена АІ автоматично;
- <ім'я роботи>,<ім'я гулага> - дивитися на сталкера який знаходиться на певній роботі під гулагом (другий параметр необов'язковий. У цьому випадку береться гулаг NPC, для якого задана дана секція ремарка).
- Приклад:
-
target = logic@cit_killers_base_guard, cit_killers
- <path_name>,<point_number> - можна вказувати дивитися на вершину патрульного шляху (<ім'я шляху>,<ім'я точки>).
- Приклад:
-
target = cit_killers_kamp5, 0
Примітка : тепер якщо значення не задано, воно одно nil а не actor , як було раніше.
- Тобто якщо ви хочете, щоб персонаж у ремарку дивився на актора - необхідно явно прописувати це. Якщо встановлено значення nil , то персонаж розгорнеться у позицію, яку вважатиме АІ.
Стандартні сигнали remark а для параметра перемикання схеми on_signal :
-
- sound_end – після закінчення програвання звукової схеми
- anim_end – після закінчення програвання анімації
- action_end - після закінчення програвання і того й іншого, якщо вони синхронізовані
Приклад використання схеми:
[remark@esc_lager_volk2] anim = guard_rac snd = esc_wolf_radio target = actor on_signal = sound_end| remark@esc_lager_volk3
Файл: gamedata\scripts\xr_remark.script
Схема sleeper
Схема сидячого та сплячого NPC. Необхідно поставити патрульний шлях, щонайменше з одного поінту. Сплячий сідатиме спати в першій точці шляху, і розвертатиметься при цьому у бік нульової точки.
[sleeper]
path_main = <ім'я_шляху> - точка в якій NPC спатиме - другий поінт, розвернувшись у нульовий поінт.
wakeable = true/false – чи може прокинутися швидко (якщо true , то спить навпочіпки і уві сні бурмоче).
Якщо шлях складається з двох точок, то зв'язок потрібно робити від першої точки до нульової (або двонаправлену) .
Приклад використання схеми :
[sleeper@esc_blockpost_sleep1] path_main = sleep1 wakeable = false
Файл: gamedata\scripts\xr_sleeper.script
Схема kamp
Схема сталкера, що сидить у певному радіусі навколо зазначеної точки (біля багаття), і розташованого обличчям до цієї точки.
[kamp]
center_point = <ім'я_шляху> - ім'я точки навколо якої NPC буде влаштовуватися.
radius = <number> - наскільки далеко сталкер сидітиме від центру табору. За замовчуванням – 2 метри.
def_state_moving = <назва_анімації> - дефолтний стан, у якому NPC йтиме до точки кампа. За замовчуванням walk
Якщо точка кампа знаходиться в багатті, то в офлайні сталкера прийдуть на неї, а коли вони перейдуть в онлайн , то опиняться всередині багаття, де і отримають хіт.
- Щоб цього не траплялося в секції кемпа вказувати path_walk з однієї точки, назва якої <path_kamp_name>_task :
path_walk = <ім'я_шляху>_task
- Якщо точка кемпа розташована в чистому полі, path_walk прописувати необов'язково.
Приклад використання схеми :
[kamp@esc_blockpost_kamp1] center_point = kamp_center path_walk = kamp_center_task def_state_moving = raid
Файл: gamedata\scripts\xr_kamp.script
Схема camper
Властивості камер:
- Кампер стоїть на точці і дивиться в напрямку, куди Ви його поставили в редакторі або пересувається патрульними шляхами;
- Кампери перемикаються на універсальний комбат, тільки якщо бачать ворога ближче ніж за 30 метрів. Якщо він вижив, він повертається у стан кампера;
- У будь-яких інших випадках діють за власною скриптовою схемою. Якщо бачимо ворога – стріляємо. Якщо чуємо денжер - то дивимося у напрямок у данжері. Якщо бачимо гранату – тікаємо від гранати. Якщо бачили ворога, а ворог зник, то дивимось у точку, де бачили востаннє ворога;
- Кампери не борються в русі. Якщо вони бачать ворога – вони зупиняються, стріляють, а потім продовжують рух.
[camper]
path_walk = <ім'я_шляху> - шлях яким ходить NPC.
path_look = <ім'я_шляху> - точки, в які дивиться NPC.
radius = <number> – якщо відстань між NPC і противником менше зазначеного, він йде в універсальний комбат. За замовчуванням – 20 метрів.
no_retreat = true/false - NPC, побачивши ворога, не буде ломитися на найближчу точку path_walk , а відразу перейде в режим вбивства.
- Потрібно це в тому випадку, якщо ви хочете зробити сценку, коли одні наїжджають на інших. Ставте камери з вищезазначеним прапорцем. Вони йдуть своїми патрульними шляхами і виносять ворогів.
def_state_moving = <назва_анімації> - стан, у якому NPC рухається на найближчу точку шляху ворога. За замовчуванням - assault .
def_state_moving_fire = <назва_анімації> - стан, у якому NPC відстрілюється від ворога, під час руху на найближчу точку шляху.
- За замовчуванням - sneak_fire .
def_state_campering = <назва_анімації> - стан, у якому NPC очікує ворога, перебуваючи по дорозі. За замовчуванням - hide .
def_state_campering_fire = <назва_анімації> - стан, у якому NPC відстрілюється від ворога, перебуваючи по дорозі. Типово hide_fire .
attack_sound = <ім'я_звукової теми> - можливість перевизначати снайперам/камперам звук атаки. По дефолту він дорівнює звуковій темі fight_attack .
- Можна змінити будь-яке інше (для сценічних потреб) чи взагалі відключити, прописавши значення false .
shoot = <тип_стрільби> - можливі такі значення:
-
- always – значення за умовчанням, стріляє завжди, коли можна;
- none – не стріляє взагалі;
- terminal – стріляє тільки коли знаходиться на останній точці патрульного шляху. Це зроблено для полегшення побудови атакуючих сцен.
Примітка: Кампер має один великий мінус – коли йому наноситься хіт і він не знає звідки хіт наноситься (не бачить противника, не чує пострілу),
- то він тупо продовжує стояти на старому місці і чекати на наступну кулю.
- Зважаючи на це, не варто розставляти кемперів у випадку, коли сталкери повинні захищатися і тримати позицію в тому випадку, якщо є кілька напрямків, звідки гравець або сталкери зможуть атакувати поставленого камери. Використовуйте walker у таких випадках, а камперів варто ставити для атак по коліях і як снайперів.
Приклад використання схеми:
[camper@dar_military_scout_hide] path_walk = walk_hide path_look = look_hide radius = 10 no_retreat = true def_state_moving = assault def_state_campering = hide_na shoot = always
Файл: gamedata\scripts\xr_camper.script
Схема sniper
Різновид Кампера. Відрізняються тим, що стріляють лише одиночними пострілами і не дивляться точками патрульного шляху, а сканують простір між ними. Швидкість сканування від точки до точки фіксована і дорівнює 20 секунд.
У кастом даті кемпера прописати:
sniper = true
Приклад:
[camper@esc_blockpost_camper_day] path_walk = camper_day_walk path_look = camper_day_look sniper = true def_state_campering = threat
Примітка : Ставити снайперу лише 2 точки look .
Файл: gamedata\scripts\xr_camper.script
Схема follower
NPC іде за NPC-лідером. Якщо до лідера відстань менше 5 метрів, він йде, якщо від 5 до 20 – біжить у режимі run , якщо понад 20 – наздоганяє у режимі sprint .
Шляхи не задаються .
[follower]
leader = <number> - story_id лідера з game.ltx (число!).
formation_line = true/false - постарається йти збоку від лідера, інакше йтиме ззаду.
distance = <number> - відстань у метрах, на якій йтиме від лідера attendant . За замовчуванням – 1,5 метра, якщо йде ланцюгом, то 5 метрів.
state_if_leader_in_meet = <назва_анімації> - це рядок з ім'ям стану з state_manager , який буде призначений follower -ам, якщо командир перебуває в стані meet .
anim_walk = <назва_анімації> - стан, у якому фоловер йде за лідером.
anim_run = <назва_анімації> - стан, у якому фоловер біжить за лідером.
anim_sprint = <назва_анімації> - стан, у якому фоловер спринтує за лідером.
Примітка : Не забути прописати:
-
[smart_terrains] none = true
- Інакше NPC засмокче в гулаг і нікуди він не піде.
Якщо це відбувається під гулагом, то замість story_id лідера, ми прописуємо його секцію логіки у файлі скрипта.
Приклад:
t = { section = "logic@bar_arena_follower_2", idle = 0, prior = 7, state = {0}, squad = squad, group = groups[0], ... }
В даному випадку для параметра leader необхідно вказати рядок bar_arena_follower_2 .
Примітка : у релізі гри ця схема не використовується.
Файл: gamedata\scripts\xr_attendant.script
Схема zoneguard
NPC має дві зони (може бути одна). Він ходить шляхом, але коли гравець заходить у зону, відриває від справ, підбігає до гравця, наставляє на гравця зброю (може кричати, може говорити), якщо гравець заходить у другу зону – атакує гравця.
[zoneguard]
path_walk = <ім'я_шляху> – шлях переміщення.
path_look = <ім'я_шляху> - шлях огляду.
team = <ім'я_команди> - ім'я команди синхронізованих zoneguard -ів (з усієї команди лише 1 реагуватиме на гравця).
zone_guard = <ім'я_зони> - зона в межах якої гравець буде атакований.
zone_warn = <ім'я_зони> - зона в межах якої NPC розпочинатиме розмову з гравцем.
walker_team = <ім'я_команди> - для схеми переміщення його може walker (якщо не заданий, використовується значення з поля team ).
no_move = true/false - персонаж окликне гравця з місця і не підбігатиме до нього.
snd_greet = <назва_звукової теми> - звук якої буде програний при виявленні гравця.
ignore_friends = true/false - ігноруватиме дружніх йому персонажів.
ignore_cond = {+info -info =func !func ~number} - умови, за яких NPC ігнорує гравця.
no_danger = true/false - відігравати чи ні загрозливу анімацію, будучи нейтралом.
anim = <назва_анімації> - яку відіграє анімацію, якщо гравець не ворожий.
snd_anim_sync = true/false - чи синхронізуватиметься звук з анімацією.
Приклад використання схеми :
[zoneguard] path_walk = mil_freedom_zoneguard_walk_kill2 path_look = mil_freedom_zoneguard_look_kill2 zone_warn = mil_freedom_leader_warn_zone zone_guard = mil_freedom_leader_kill_zone no_move = true team = freedom_bodyguards3
Файл: gamedata\scripts\xr_zoneguard.script
Схема wounded
Схема пораненого. Визначає поведінку NPC може "поранений".
Примітка : не рекомендується задавати схему як активну.
[wounded]
hp_state = <HP>|<назва_анімації>@<назва_звукової_теми> - поведінка NPC при значенні рівня його здоров'я рівному HP , коли він не бачить гравця.
hp_state_see = <HP>|<назва_анімації>@<назва_звукової_теми> - поведінка NPC при значенні рівня його здоров'я рівному HP , коли він бачить гравця.
psy_state = <PSY>|<назва_анімації>@<назва_звукової_теми> - поведінка NPC при псіатаках, залежно від рівня пси-здоров'я рівному PSY .
hp_victim = <HP>|<параметр> - куди буде дивитися NPC при значенні рівня здоров'я рівному HP , можливі параметри:
-
- story_id - числове значення;
- actor - без коментарів;
- nil - позиція обчислена АІ автоматично.
hp_cover = <HP>|true/false - йти в укриття чи ні, залежно від значення рівня здоров'я, що дорівнює HP .
hp_fight = <HP>|true/false - дозволено воювати чи ні, залежно від значення рівня здоров'я, що дорівнює HP .
syndata = <назва_анімації>@<назва_звукової_теми> - синхропари для краси.
help_dialog = <назва_діалогу> - можливість встановити діалог замість стандартного actor_help_wounded .
help_start_dialog = <назва_діалогу> - можливість встановити стартовий діалог.
Примітка : бажано, щоб усі встановлені акторські діалоги для поранених мали умову появи наступного виду:
-
<precondition > dialogs.allow_wounded_dialog </precondition >
Примітка : якщо необхідно поставити кілька станів, залежно від різного значення рівня здоров'я, самі стани потрібно розділяти символом '|':
-
hp_state = 30 | help_me@help | 10 |wounded_heavy@help_heavy
- Тут визначаться два стани при рівні здоров'я 30 та 10 відповідно.
- Для параметрів hp_state_see , psy_state , hp_victim , hp_cover , hp_fight спосіб такий самий.
Приклад використання схеми (як приклад взято дефолтне налаштування) :
hp_state= 30|help_me@help|10|wounded_heavy@help_heavy hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|psy_shoot,psy_pain@wounded_psy_shoot,wounded_psy hp_victim = 30|actor|10|nil hp_cover = 30|true|10|false hp_fight = 30|true|10|false syndata = wounded@help ;best_pistol – проверка на то, что лучшее оружие NPC является пистолетом.
Файл: gamedata\scripts\xr_wounded.script
Схема rest
Чувак гуляє, хаває, спить.
Нормально не працює, тому в релізі не використовується.
Файл: gamedata\scripts\xr_rest.script
Схема heli_hunter
Хеліхантер може стріляти або не стріляти вертольотом в залежності від умов. Робиться це так:
В активну схему вставляється параметр:
heli_hunter = { +info -info =func !func ~number } true/false
Приклад:
[camper@bar_freedom_attack_sniper_1] path_walk = camper_1_walk path_look = camper_1_look on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 <br>%=bar_freedom_angry_actor% meet_talk_enabled = true meet_dialog = bar_svoboda_dialog heli_hunter = {-bar_ecolog_crush_heli_down} true
Якщо раніше оверрайд розумів лише значення true чи false , нині він розуміє кондлист, який якщо повертає true - то стрілянина по вертольоту у цій схемі дозволена.
Схема Patrol
Отже є попередня система патруля. Є варіацією kamp тільки у стані ходьби. Для її роботи прописуємо в custom_data наступне:
[patrol]
path_walk = <ім'я_шляху> - шлях яким ходить NPC.
path_look = <ім'я_шляху> - точки, в які дивиться NPC.
formation = <параметр> - описує спосіб побудови і не є обов'язковим. Можливі такі варіанти:
-
- back - мужики йдуть трохи позаду командира у два ряди (за умовчанням);
- line – шеренга;
- around – навколо командира.
commander = true/false - чи NPC призначений командиром, бажано, щоб такий гарний він був один. false – за замовчуванням.
move_type = <назва_анімації> - задає початковий режим переміщення за промовчанням patrol .
Під час зупинки командора в meet мужики зупиняються.
Якщо командор помирає, автоматично буде обрано інший. Командиром стає той, хто першим потрапив під схему. Способи побудови задаються у вейпоінтах наступним чином:
ret = 0 ... 2
-
- 0 – лінія;
- 1 – навколо старшого;
- 2 – з боків.
Під час руху командор працює як звичайний walker і супроводжуючі його кадри повторюють його дії. Тобто, якщо в параметрах вейпоінта прописано a = assault , то командор помчить зі знаряддям вбивства на перевагу, а решта його відкопують.
Що ще не зроблено або глючить:
-
- немає можливості автоматично перебудувати команду;
- всі йдуть мовчки;
- командор поки що не віддає команд;
- не рекомендується вмикати спринт.
Приклад використання схеми :
[patrol@val_escort_captive_wait] path_walk = captive_wait_walk path_look = captive_wait_look commander = true formation = back
Файл: gamedata\scripts\xr_patrol.script
Схема meet
Схема, що дозволяє налаштувати ситуацію, коли НПС зустрічає актора.
[meet]
meet_state/meet_state_wpn = <number>|<назва_анімації>@<назва_звукової_теми> – задає анімацію та озвучку персонажа,
- в залежності від відстані до актора, що дорівнює number . Для ситуації коли актор беззбройний і озброєний відповідно.
victim/victim_wpn = <number>|<параметр> - задає об'єкт, який повинен буде дивитися персонаж, залежно від відстані рівне number .
- Для ситуації коли актор беззбройний і озброєний відповідно. Можливі такі значення:
-
- actor - дивитись на гравця;
- story_id - дивитися на персонажа із зазначеним story_id ;
- nil – нікуди.
-
use/use_wpn = true/false/self – налаштування юзабельності персонажа.
- При установці значення self NPC сам юзнет гравця, як тільки зможе дотягнутися.
zone = <ім'я_зони>|<назва_анімації>@<назва_звукової_теми> - якщо актор буде помічений у зазначеному рестрикторі,
- то NPC відіграватиме задану анімацію і вимовлятиме заданий звук.
meet_dialog = <назва_діалогу> - можливість встановити стартовий діалог NPC.
synpairs = <назва_анімації>@<назва_звукової_теми> - Якщо при якомусь наборі умов
- зустріч відіграватиме саме цей стан і цю звукову тему – вони синхронізуватимуться по рандомним анімаціям стану тіла.
abuse = true/false - за умовчанням true , якщо false , то неюзающийся противник нічого очікувати ображатися.
precond = usability/visibility .
Будь-який рядок можна задавати кондлистом ( {+info -info =func !func ~number} ).
Для полегшення налаштування зустрічі зроблено можливість спрощеного завдання дефолту:
[walker] meet = default_meet
Саму секцію default_meet ставити не треба. Усі налаштування і так візьмуться з дефолту. За дефолтом зустріч налаштована з наступними параметрами:
[default_meet] meet_state = 30|hello@hail|20|wait@wait meet_state_wpn = 30|backoff@threat_weap victim = 30|actor victim_wpn = 30|actor use = true use_wpn = false syndata = hello@hail|backoff@threat_weap
Якщо потрібно, щоб сталкер не розмовляв з гравцем у даній секції, необхідно прописати йому meet = no_meet .
Тепер про те, як за допомогою цього конструктора зібрати реакцію на актора, яка вам потрібна.
- Ситуація 1 .
Гравець далеко підкликає нас рукою, при наближенні просить прибрати зброю, потім згоден говорити.
[meet] meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap victim = 50| actor victim_wpn = 50| actor use = true< use_wpn = false
- Ситуація 2 .
Сталкер побачивши нас просить прибрати зброю. Після цього підходить і розмовляє з нами. Якщо ми починаємо йти від нього або дістаємо зброю – починає нас стріляти.
[meet] meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info% meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait victim = 50|actor victim_wpn = 50|actor use = {-info2} self, false use_wpn = false
Тут:
info – інфопорція, яка вказує на те, що ми вже опустили зброю і були досить близько до NPC;
info2 – інфопорція, яка встановлюється в діалозі і говорить, що персонаж уже сказав нам все, що хотів;
killactor – функція xr_effects.script яка ображає NPC на гравця.
- Ситуація 3 .
Персонаж ходить патрульним шляхом на заставі табору. Якщо гравець має допуск до табору – пропускає його та вітається, інакше спершу відлякує, а якщо гравець пробрався до табору – то ображається на нього. При цьому діалог залежить від того, має гравець допуск до табору чи ні.
[camper] path_walk = path_walk path_look = path_look meet = meet [meet] meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back victim = 30|actor victim_wpn = 30|actor use = true use_wpn = true zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse meet_dialog = {+info} dialog1, dialog2
Тут:
true – замість анімації атакувати гравця;
info – інфопорція, яка каже, що маємо допуск до табору;
warnzone – рестриктор, у якому нас попереджають;
kampzone – рестриктор, у якому нас убивають;
dialog1 – стартовий діалог NPC, якщо ми маємо допуск до табору;
dialog2 – стартовий діалог NPC, якщо ми не маємо допуску до табору.
Файл: gamedata\scripts\xr_meet.script
ПЕРЕЛІК НАЛАШТУВАННЯ ЛОГІКИ ПО ЧАСТИНАМ:
Частина 0: https://stalker-news.info/forum/kvesty-ta-lohika-tch/nalashtuvannia-lohiky-chastyna-0/
Частина 1: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-1/
Частина 2: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-2/
Частина 3: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-3/
Частина 4: https://stalker-news.info/forum/kvesty-ta-lohika-pp/nalashtuvannia-lohiky-chastyna-4/