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

Налаштування логіки. Частина 1


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

Система прапорів (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 | інша_схема

Більш детальний опис шляхів.

Налаштування:

image

На карту для кожного walker-а потрібно поставити:

  1. Шлях path_walk , яким walker ходить.
  2. Шлях path_look , Що складається з точок, в які Walker дивиться.

Walker -ів може бути 1 або більше. Вони можуть діяти незалежно або взаємодіяти один з одним.

Якщо персонаж повинен стояти на місці, то йому задається одна точка шляху path_walk і як мінімум одна точка шляху path_look , хоча і можна не задавати точку погляду зовсім (гра автоматично визначить точку за замовчуванням ту, в яку НПС спочатку дивився), робити цього не слід .

Правила розміщення прапорців у коліях розглянемо на кількох прикладах:

Приклад 1:

Персонаж патрулює територію довкола двох будиночків. Маршрут будується так:

image

Як зробити, щоб персонаж між певними точками біг чи крався? Для цього в дорозі path_walk є прапорці.
Кожен вейпоїнт має ім'я: wp00 , wp01 і т.д.
Прапорці задаються на ім'я. Їх потрібно відокремлювати від імені за допомогою символу ' '. Пишатися a = anim , де anim - назва анімації. Якщо ми напишемо a = threat то персонаж піде в стані данжер, якщо a = raid то побіжить зі зброєю напоготові і т.д.

Примітка : У точках шляху path_walk використовуються анімації ТІЛЬКИ з розділу «Ходячі стани»!

Приклад 2:

image

Розмова персонажа.

Щоб персонаж говорив, переміщаючись маршрутом, потрібно визначити в кожній точці список тем, на які він може говорити. І тому існують такі поля:
s = имя_звуковой_схемы - (за умовчанням звук вимкнено). Декілька тим можна перераховувати через кому.

Приклад 3:

 

image

У прикладі 3 використовується тільки поле s для того, щоб задати тему розмови, і прапорець sc , щоб показати, що звук програється не разово, а періодично.
Інші параметри ( sp , sf , st ) задавати НЕ РЕКОМЕНДУЄТЬСЯ, значення за замовчуванням прийнятні для більшості скриптів.
Параметр sa також використовувати НЕ РЕКОМЕНДУЄТЬСЯ. Якщо потрібно розпочати звук одночасно з анімацією, краще скористатися полями шляху path_look , про який буде написано нижче.
Якщо персонаж не тільки ходить маршрутом, але повинен також зупинятися та грати анімації, потрібно задати йому шлях path_look .

Приклад 4:

вдосконалимо приклад 1, щоб персонаж, проходячи повз отвор між домами, зупинявся і заглядав у нього:

image

Що додалося у цьому прикладі? Шлях 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:

image

У цьому прикладі проходячи через точку 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 можна задавати рандомно.
Наприклад:

image

 

Нам потрібно, щоб НПС, що стоїть у точці 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 )

АЛЕ! Не слід робити вибір між двома шляхами, якщо в дорозі одна точка! Ось така схема не прийнята і, особисто в мене, викликає виліт:

image

Цифри в дужках означають ту саму ймовірність, з якою НПС піде в крапку. Якщо цифри задати однакові, то й ймовірність вибору для кожної точки буде рівна, якщо ж, наприклад, в одній із точок вказати значення 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


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

   
ВідповіcтиЦитата