Настройка логики. Часть 1 — S.T.A.L.K.E.R. Inside Wiki

Настройка логики. Часть 1

Материал из S.T.A.L.K.E.R. Inside Wiki

(перенаправлено с «Настройка логики»)
Перейти к: навигация, поиск
Содержание

Настройка логики. Часть 0
Настройка логики. Часть 1
Настройка логики. Часть 2
Настройка логики. Часть 3
Настройка логики. Часть 4


Настройки логики

Система флагов (path_walk, path_look)

В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени waypoint-а, например, для точки с именем "wp00":
wp00|flag1|flag2


Флаги точек пути path_walk:

  • a=state
Выбирает состояние тела при перемещении (Только из раздела "Ходячие состояния")
Список состояний можно взять в gamedata\scripts\state_lib.script
  • p=percent
Вероятность остановиться в точке в процентах (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_callbackstate manager-ом. Соответственно, если t=0, то сигнал будет установлен после отыгрывания init анимации. Это используется, например, с анимацией press, которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.
В пути path_look можно сделать:
wp00|a=press|t=0|sigtm=pressed
А затем переключить схему:
on_signal = pressed | другая_схема

Более подробное описание путей.

Настройка:
Logic 1.JPG

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

  1. Путь path_walk, по которому walker ходит.
  2. Путь path_look, состоящий из точек, в которые walker смотрит.

Walker-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.

Если персонаж должен стоять на месте, то ему задается одна точка пути path_walk и как минимум одна точка пути path_look, хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.

Правила расстановки флажков в путях рассмотрим на нескольких примерах:

Пример 1:

Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом:
Logic 2.JPG

Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути path_walk существуют флажки.
У каждого вейпоинта есть имя: wp00, wp01 и т.д.
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘|’. Пишеться a=anim, где anim – название анимации. Если мы напишем a=threat то персонаж пойдет в состоянии данжер, если a=raid то побежит с оружием наизготовку и т.д.

Примечание: В точках пути path_walk используются анимации ТОЛЬКО из раздела «Ходячие состояния»!

Пример 2:

Logic 3.JPG

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

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

Пример 3:

Logic 4.JPG

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

Пример 4:

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

Logic 5.JPG

Что добавилось в этом примере? Путь 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 всех подходящих точек суммируются, т.е. если у одной точки p = 100, а у другой p = 300, то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400). Во избежание путаницы, рекомендуется задавать p так, чтобы их сумма составляла 100. По умолчанию у всех точек p = 100.

t = 5000 - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)

Пример 5:

Logic 6.JPG

В этом примере проходя через точку 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 можно задавать рандомно.
Например:Random path.jpg

Нам требуется, чтобы НПС стоящий в точке 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)

НО! Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема НЕ ПРИЕМЛЕМА и, лично у меня, вызывает вылет:Error random path.jpg

Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 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 движется к первой точке пути, если она близко (patrol по умолчанию)
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. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.

[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



Часть 2 правка дС (дядя Саша - вопросы сюда imgal@mail.ru)

Другие места
LANGUAGE