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

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

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

Перейти к: навигация, поиск
Содержание

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

Набор дополнительных настроек логики у разных объектов

Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.

Схема ph_idle

Схема по сути ничего не делает, представляет некое промежуточное состояние объекта. Аналог схемы sr_idle, только для физического объекта.

[ph_idle]
hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт,

если объект получит хит по кости number.

on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт, если актор взаимодействует с объектом.
tips = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.
nonscript_usable = true/false - возможность стандартных (нескриптовых) действий над объектом: взять объект в интерфейс, открыть инвентарь.

В игре используется в одном случае - для объектов с именем секции inventory_box, то беж тайников.
'Пример использования схемы:
[logic]
active = ph_idle
 
[ph_idle]
hit_on_bone = 1|%+agroprom_u_light_4%|2|%+agroprom_u_light_4%|3|%+agroprom_u_light_4%|4|%+agroprom_u_light_4%
on_info = {+agroprom_u_light_4} nil %=turn_off_object%

Файл: gamedata\scripts\ph_idle.script


Схема ph_door

Схема для работы двери.
Примечание: для двустворчатых ворот задается все аналогично.

[ph_door]
locked = true/false - заперта ли дверь. По умолчанию false.
closed = true/false - закрыта ли дверь. По умолчанию true.
show_tips = true/false - нужно ли показывать подсказку при наведении на дверь. По умолчанию true.
tip_open = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.

Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если locked равен false, то по умолчанию tip_door_open, иначе tip_door_locked.

tip_close = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.

Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если locked равен false, то по умолчанию tip_door_close, иначе пустое значение.

snd_open_start = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран при попытке открыть дверь.
snd_close_start = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран при попытке закрыть дверь.
snd_close_stop = <название_звуковой_темы> - имя темы из файла sound_theme.script. Звук, который будет отыгран, когда дверь захлопнется до конца.
on_use = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт, если актор взаимодействует с дверью.

Обычно используется для переключения схемы.

hit_on_bone = <number>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - определяет, что произойдёт,

если дверь получит хит по кости number.

no_force = true/false - по умолчанию false.

Пример использования схемы:
[logic]
active = ph_door@locked
 
[ph_door@locked]
locked = true
snd_open_start = trader_door_unlock
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%
 
[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %-esc_close_door%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop
 
[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed
on_info = {+esc_close_door} ph_door@closed
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

Файл: gamedata\scripts\ph_door.script

Схема ph_button

Схема работы кнопки.
При нажатии на кнопку переключает секции и выдает инфопоршн.

[ph_button]
anim_blend = true/false – плаваня, сглаженная анимация.
anim = <название_анимации> – анимация, которая отыгрывается при нажатии на кнопку.
on_press = {+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт при нажатии на кнопку.
tooltip = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.

Пример использования схемы:
[logic]
active = ph_button@rad_on
 
[ph_button@rad_on]
anim_blend  = true
anim        = lab_primary_switcher_idle
tooltip     = tips_rad_switcher_press
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%

Файл: gamedata\scripts\ph_button.script

Схема ph_code

Схема для осуществления ввода цифрового пароля. При введении указанного кода выдает инфопоршн.

[ph_code] code = <код> - установка кода.
on_code = {+info -info =func !func ~number}%+info -info =func% - что произойдёт при вводе правильного пароля.
on_check_code = <код> | {+info -info =func !func ~number}%+info -info =func% - что произойдёт при вводе установленного пароля.
tips = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка при наведении.

Пример использования схемы:
[logic]
active = ph_code
 
[ph_code]
code = 1287975
on_code = nil %+rad_code_door_unlocked%
[logic]
active = ph_code@lock
 
[ph_code@lock]
on_check_code1 = 2011533 | %+bun_codelock_open%
on_check_code2 = 342089 | %+bun_codelock_open%

Файл: gamedata\scripts\ph_code.script

Схема ph_gate

То же самое, что и ph_door, но для ворот, состоящих из двух дверей:

[ph_gate]
state - <параметр> - состояние, в котором дверь находится при инициализации (по умолчанию none). Возможны следующие значения:

  • open - в открытом состоянии;
  • closed - в закрытом состоянии;
  • none - в текущем (дефолтном или оставшемся от предыдущей схемы).

locking - <параметр> - блокировка дверей (по умолчанию none). Возможны следующие значения:

  • stick - прилипание дверей к крайним состояниям.
  • soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:
  • open - блокировать в открытом состоянии;
  • closed - в закрытом;
  • none - не используется (мягкая блокировка возможна только в крайних положениях);
  • hard - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:
  • open - блокировать в открытом состоянии;
  • closed - в закрытом;
  • none - в текущем.
  • none - дверь не заблокирована

left_limit/right_limit = <number> - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.
breakable = true/false - определяет можно ли сломать ворота. По умолчанию true.
Звуковые параметры аналогичны ph_door.

Пример использования схемы:
[logic]
active = ph_gate@locked
 
[ph_gate@locked]
state = closed
locking = hard
on_info = {+val_chase_start} ph_gate@unlocked
 
[ph_gate@unlocked]
state = closed
locking = stick

Файл: gamedata\scripts\ph_gate.script

Схема ph_sound

Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).

[ph_sound]
snd = <название_звуковой_темы> - имя темы из файла sound_theme.script из таблицы ph_snd_themes.
looped = true/false - зацикленное воспроизведение звука. По умолчанию - false.
min_idle = <number> - минимальное время простоя перед включением звука (мс). По умолчанию - 0.
max_idle = <number> - максимальное время простоя перед включением звука (мс). По умолчанию - 0.
random = true/false - если true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - false.
no_hit = true/false - будет ли схема реагировать на нанесённый хит. По умолчанию - true.

Примечание: если задать random = true и looped = true, то схема сыпется.

Поддерживается сигнал sound_end.

Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil.

Специфическим образом создается звуковая схема.
В sound_theme.script в начале файла есть секция ph_themes, в которой и описываются темы для физ объектов.

Например:
ph_snd_themes["gar_seryi_shooting"] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}

Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.

Пример использования схемы:
[logic]
active = ph_sound
 
[ph_sound]
snd = gar_bandits_seryi
min_idle = 1000
max_idle = 5000

Файл: gamedata\scripts\ph_sound.script

Схема ph_force

Схема позволяет пнуть предмет в указанную сторону.

[ph_force]
force = <number> - сила, которая прикладывается к объекту. Измеряется в убитых енотах.
time = <number> - время прикладывания силы к предмету (в миллисекундах).
delay = <number> - задержка (в секундах) перед применением силы.
point = <имя_пути> - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).
point_index = <number> - индекс точки патрульного пути, в стону которого полетит предмет.

Пример использования схемы:
[logic]
active = ph_idle
 
[ph_idle]
on_info = {+rad_here_i_come} ph_force 
 
[ph_force]
force = 1500
time = 500
delay = 0
point = rad_barrel_drop
point_index = 0

Файл: gamedata\scripts\ph_appforce.script

Схема ph_on_death

Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.

[ph_on_death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты при разрушении.

Примечание: использовать исключительно с разрушаемыми физическими объектами (physic_destroyable_object).

Пример использования схемы:
[logic]
active = ph_on_death
 
[ph_on_death]
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%

Файл: gamedata\scripts\ph_death.script

Схема ph_car

Настройка управления наземным транспортом.

[ph_car]
usable = {+info -info =func !func ~number} - условия для юзабелености объекта.
show_tips = true/false - отображать ли подсказку. По умолчанию - true.
tip_use = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка, в случае, если условия для usable выполнились.

По умолчанию - tip_car_use.

tip_locked = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text. Подсказка, в случае, если условия для usable не выполнились. По умолчанию - tip_car_locked.

В случае, если параметр usable не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.

path_walk = <имя_пути> - путь движения транспорта.
path_fire = <имя_пути> - вероятно, точки пути по которым возможна стрельба.
auto_fire = true/false - разрешить стрелять на ходу. По умолчанию - false.
fire_time = <number> - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.
fire_repeat = inf/<number> - вероятно, время через которое возможна повторная стрельба. inf = -1.
fire_range = <number> - дальность стрельбы. По умолчанию - 50 метров.
target = <параметр> - цель для стрельбы. Возможны следующие параметры:

  • points - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;
  • actor - без комментариев;
  • story_id - персонаж с указанным story_id.

track_target = true/false - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - false.
on_target_vis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт, если цель будет в прямой видимости.

В качестве параметра возможны два значения: actor, story_id персонажа.

on_target_nvis = <параметр>|{+info -info =func !func ~number} %+info -info =func% <название_схемы> - что произойдёт, если цель пропадёт из

области прямой видимости. В качестве параметра возможны два значения: actor, story_id персонажа.

invulnerable = true/false - неуязвимость. Если true, транспорт игнорирует все хиты. По умолчанию false.
headlights = on/off - вкл./выкл. свет от фар.
on_death_info = info - выдача инфопоршня при уничтожении транспорта.

Поддерживается сигнал arrived.

Пример использования схемы:
[logic]
active = ph_car@fire
 
[ph_car@fire]
path_walk = pri_wave3_btr_walk
path_fire = pri_wave3_btr_look
fire_repeat = inf
auto_fire = true
on_target_vis = actor | ph_car@fight_actor2
on_death_info = pri_wave3_btr_dead
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%

Файл: gamedata\scripts\ph_car.script

Схема ph_oscillate

Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)

[ph_oscillate]
joint = <имя_кости> - имя кости объекта к которой будет применена сила.
period = <number> - время прикладывания силы в миллисекундах.
force = <number> - собственно сила прикладывания в ньютонах.
correct_angle = <number> - угол относительно оси Y.

Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.

Пример использования схемы:
[logic]
active = ph_oscillate
 
[ph_oscillate]
joint = bone05
period = 3000
force = 500
correct_angle = 5

Файл: gamedata\scripts\ph_oscillate.script

Секция ph_heavy

Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать. В кастом дате пишем: [ph_heavy].

Принцип работы прожектора:

В точках look пути, в которые смотрит прожекторщик, нужно прописать: sl=<имя_прожектора>

Например:

wp00|sl=esc_sl1

Тогда при повороте в эту точку персонаж повернет в нее и прожектор.


Логика вертолёта

Общие сведения:

  • Вертолёт работает на «логике».
  • На вертолёт реагируют аномалии.
  • Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.
  • Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.
  • У вертолёта есть универсальная боевая схема на манер сталкеров.
  • Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.

Схема heli_move

Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).

Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.

Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.

Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look.

[heli_move]
path_move = <имя_пути> - путь полёта.
path_look = <имя_пути> - точки в которые будет смотреть вертолёт.
engine_sound = true/false - вкл/выкл звук двигателя вертолёта. По умолчанию true.
invulnerable = true/false - неуязвимость. Если true, вертолёт игнорирует все хиты. По умолчанию false.
immortal = true/false - бессмертие. Если true, вертолёт получает повреждения, но не умирает. По умолчанию false.
mute = true/false - отключает универсальные реплики пилотов вертолета. По умолчанию false.
rocket_delay = <number> - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).
default_velocity = <number> - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.

Параметры, задаваемые в именах вершин пути path_move:

  • e – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано e=actor (можно сокращённо e=a), то огонь будет вестись по актору. Если задано e=число, стрелять будет по объекту со story_id равным числу.
  • w – (сокр. от weapon) каким оружием стрелять.
Возможные значения:
  • w=1 – стрелять только пулемётом;
  • w=2 – стрелять только ракетами.
По умолчанию стреляет всем.
  • v - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.
  • dv - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.
  • die - убить вертолёт.
  • flame - начать дымить (как будто подбили).

Параметры, задаваемые в именах вершин пути path_look:

  • e - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.
  • w – см. такой же параметр для пути path_move.
  • t - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.

Файл: gamedata\scripts\heli_move.script

Универсальная боевая схема: heli_combat

Общие сведения:
В универсальной боевой схеме вертолёт не привязан к путям.
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.

Примечание: отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:

combat_ignore = true/false - true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться "отомстить" тому, от кого он получил хит.
combat_enemy = <параметр> - враг. Возможны следующие значения:

  • nil - враг отсутствует;
  • actor - без комментариев;
  • story_id - персонаж с указанным story_id.

combat_use_rocket = true/false - можно ли вертолёту пользоваться ракетами.
combat_use_mgun = true/false - можно ли вертолёту пользоваться пулемётом.
combat_velocity = <number> - скорость, с которой вертолет будет делать боевые заходы.
combat_safe_altitude = <number> - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).

К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects.script есть группа функций для работы с вертолётом из его custom data:
heli_set_enemy_actor - сделать актёра врагом вертолёту;
heli_start_flame - поджечь вертолёт;
heli_die - убить вертолёт.

Файл: gamedata\scripts\heli_combat.script

Смарттерейны и гулаги.

Smart Terrain

Под смарттеррейном понимается шейп или зона, которая обеспечивает "захват" НПС под гулаг, после чего, они начинают выполнять работы предусмотренные этим гулагом. Не нужно ставить большой радиус шейпа для смарта, максимум - один метр.

Как поставить smart terrain?
Для всех smart terrain нужно:

  1. Поставить smart_terrain с необходимым shape;
  2. В его custom_data прописать настройки;
  3. Расставить пути для соответствующих схем поведения.

Параметры custom_data:
[smart_terrain]
type = <имя_гулага> - название гулага. Не смарта - а именно гулага!

Имя смарта смотрим в параметре name спавн секции.

cond = {+info -info =func !func ~number} - условия, при выполнении которых, гулаг может существовать.

Если условия перестали выполняться - то "подчинённые" распускаются и попадают под управление их custom_data.

capacity = <number> - численность "жителей" гулага. Должно быть меньше либо равно количеству работ, но никак не больше!
respawn = <имя_респавна> - респавн для гулага. Указывать только один! Вызывает каждый раз, когда кто-то из НПС заступает на работу.
preset = <название_предустановки> - указывается имя одной из секций в файле config\misc\smart_terrain_presets.ltx.

Служит для условия того, какой группировки и какого ранго НПС могут заполнять гулаг.
Если не указывать, то будет взято имя секции из этого же файла исходя из названия уровня, на котором находится гулаг.

idle = <min_time>, <max_time> - минимальное и максимальное время (в игровых часах) бездействия гулага,

после того, как гулаг покинул (по разным причинам) последний НПС. Будет взято случайное число из этого промежутка.
Если указать одно число, то будет взято в промежутке от ноля, до этого числа.(?)

stay = <min_time>, <max_time> stay = quick/medium/long/default - минимальное и максимальное время (в игровых часах) пребывания всех НПС под гулагом.

Конкретные значения можно посмотреть в файле config\misc\smart_terrain.ltx в секции smart_terrain_stay_time.(?)

squad = <number> - сквад, который будет прописываться всем сталкерам под гулагом. Если не указано, то будет взят squad из профиля НПС.
group = <number>, <number>, ... - набор group через запятые. Если не указано, то будет взят gruop из профиля НПС.

Гулаги

Гулаг - средство объединения нескольких сталкеров под централизованным управлением.
Основные особенности:

  • Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);
  • Работы имеют приоритеты;
  • Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;
  • Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.

Рекомендации по планированию гулага:

  1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.
  2. Определяем максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.
  3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.
  4. В редакторе ставиться объект smart_terrain (источник ошибок – иногда ставят space_restictor). Гулагу смарта нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали гулаг esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk.

Создание гулага:
1. Создать smart_terrain и настроить его custom_data согласно описанию выше.


2. В скрипте scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:
if gulag_type == "имя_гулага" then
	return npc_community == "имя_группировки"
end

В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. Приниматься под гулаг будет только НПС с указанной группировкой.


3. В файле scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага в функции function loadStates(gname, type). В нее передается имя смарта и имя гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:
if type == "имя_гулага" then
	return function(gulag)
		if level.get_time_hours() >= 7 and level.get_time_hours() <= 22 then
			return 0  -- день
		else
			return 1  -- ночь
		end
	end
end
В данном случае, если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии (0), иначе в ночном(1).


4. В файле scripts\gulag_название_уровня.script необходимо описать работы гулага. В функции load_job(sj, gname, type, squad, groups) загружаются все допустимые работы. В саму функцию передаются следующие параметры:

  • sj – сама табличка работ гулагов.
  • gname – имя нашего смар-тиррейна. Оно используется как префикс.
  • type – имя гулага.
  • squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие.
В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.

Примерное описание работ гулага:

Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.
--' Garbage maniac
if type == "gar_maniac" then
	t = { section   = "logic@gar_maniac_camper",
	      idle      = 0,
	      prior     = 5,
	      state     = {0},
	      squad     = squad,
	      groups    = groups[1],
	      in_rest   = "", 
	      out_rest  = "",
	      info_rest = ""
	    }
	table.insert(sj, t)
	t = { section   = "logic@gar_maniac_sleeper",
	      idle      = 0,
	      prior     = 5,
	      state     = {1},
	      squad     = squad,
	      groups    = groups[1],
	      in_rest   = "",
	      out_rest  = "",
	      info_rest = ""
	    }
	table.insert(sj, t)		
end


Описание возможных полей для описания работы:
section – секция в config\misc\gulag_название_уровня.ltx, где указываются реальные настройки схемы поведения, которая соответствует текущей работе.
idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.
prior – приоритет задания. Сначала НПС занимают более приоритетные задания. Чем больше число, тем выше приоритет.
in_rest, out_rest - рестрикторы, которые устанавливаются персонажу на данное задание. Из in_rest НПС запрещено выходить , в out_rest - запрещено входить.
state - cостояние гулага. Необходимо для функции load_states, где определяется это состояние, т.е. в каких состояниях данная работа будет доступна.
squad - таблички сквадов, если нам нужно переопределять родные группы сталкеров на какие либо другие.
group - будет выбран из массива groups, который задан в custom_data.
info_rest - если на текущей работе что-то раздражает НПС, то будучи в зоны установленного инфо-рестриктора - раздражитель будет проигнорирован.
predicate - условие приема на работу. Указывать нужно функцию, возвращающую true или false.
position_threshold - расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.
timeout - это время, которым задается длительность работы. Если ее задать, то НПС будет выполнять работу именно заданное время,

после чего будет освобожден от работы (если уже ранее не был от нее освобожден). После освобождения работа может быть доступна для повторной выдачи.

online - если true - НПС на данной работе всегда в онлайне.
idle_after_death - в течении этого времени после смерти предыдущего "работника" данная работа будет недоступна.


5. В config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответствуют той или иной работе.
Настройка здесь соответствует настройке в обычной custom_data сталкера, с разницей:

  1. Пути следует указывать без префикса. То есть, если гулаг носит имя, например, gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в config\misc\gulag_название_уровня.ltx следует указывать только walk1.
  2. В именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения. Например: logic@gar_maniac_walker_gate.

3.11.3. Новые особенности смарттеррейнов

Возможности нового смарттеррейна (СТ):

1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.
2) Сталкеры идут на ближайшие работы.
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.
6) Работы могут находиться на разных уровнях.
7) Скриптовая зона СТ теперь не используется для захвата персонажей.
8) Симуляция заключается в миграции персонажей между разными СТ.

Что нужно переделать:

1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже) 5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли. 6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].


Настройки: -------------
Разрешения персонажам идти в определённые СТ ----

Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары "имя_СТ = condlist". Пример:

[smart_terrains]
strn_1 = условие1
strn_2 = условие2

Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него. Если не появилось ни одного эксклюзивного, то он согласен идти в любой.

Есть зарезервированное сочетание "none=true". Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.

Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:

communities = группирвка1, группировка2, ...

Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).


Изменение функций predicate() ----

В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:
name
community
class_id
story_id
profile_name

Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:

predicate = function(npc_info)
return npc_info.is_sniper == true
end

Изменение функций переключения состояния СТ ----

Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.


Состояния работ online/offline
t = { section = "logic@ЧЧЧЧЧЧЧЧ", 
idle = 0,
prior = 5, state = {0}, squad = squad, group = groups[1],
online = true,
in_rest = "", out_rest = ""
}
table.insert(sj, t)

Варианты задания этого поля
online = true - на этой работе персонаж всегда в онлайне,
online = false - на этой работе персонаж всегда в офлайне,
online не задано - на этой работе персонаж может прыгать онлайн<->офлайн по своему усмотрению.
3.11.3.1. Более доступное описание новых смарттеррейнов
Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:
1. Пишем в кастом дате где [gulag1] -> [smart_terrain]
2. В кастом дате товарищей по смарттеррейну пишем
[smart_terrains]
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.
[smart_terrains]
none = true


Передача параметров в функции

Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.

NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.

Описание функций с параметрами присутствующих в xr_conditions и xr_effects.

xr_conditions.script
actor_in_zone(restr) Функция проверки, что актёр в рестрикторе restr
actor_out_zone(restr) Функция проверки, что актёр не в рестрикторе restr
actor_enemy Функция проверки что актор - враг. Например: {=actor_enemy} означает "если актёр враг"
killactor Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору
fighting_dist_ge(p) Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).
distance_to_obj_le(sid:dist) Проверка дистанции до обьекта заданного story_id.

Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру
и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо
подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить
большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.

health_le(health) Проверка того, что здоровье npc <= health.
heli_health_le(health) Аналогично предыдущему, только для вертолета.
enemy_group(group1:group2:...) Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).
health_le(health) Проверка того, что здоровье npc <= health.
hitted_by(sid1:sid2:...) Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.

Пример:

  [hit]
  on_info = {=hitted_by(407:408)} %+val_escort_combat%.
killed_by(sid1:sid2:...) Аналогично предыдущему, но для случая смерти npc. Используется в секции death..
is_alive(sid)<br\>is_alive_one(sid1:sid2:...)<br\>is_alive_all(sid1:sid2:...) Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.
is_dead(sid)
is_dead_one(sid1:sid2:...)
is_dead_all(sid1:sid2:...)
Аналогично предыдущему, только проверка на "мертвость".
check_fighting(sid1:sid2:...) Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.
gulag_empty(gulag_name) Проверка того, что гулаг пуст или вообще не существует.
gulag_population_le(gulag_name:num) Проверка того, что количество народу в гулаге <= num.
gulag_casualities_ge(gulag_name:num) Проверка того, что гулаг понес потери => num.

NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.

signal(строка) Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.
xr_effects.script
heli_set_enemy(story_id) Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.
set_gulag_enemy_actor(gulag_name) Сделать актера врагом для данного гулага
hit_npc(direction:bone:power:impulse:reverse) Нанести хит по npc.

Параметры:

  direction - если строка, то считается, что это имя пути и в сторону первой точки производится 
толчек. Если же это число, то оно рассматривается как story_id персонажа от которого должен
поступить хит. bone - строка. Имя кости, по которой наносится удар. power - сила удара impulse - импульс reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.

Пример:

  [death]
  on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%
set_friends(sid1:sid2:...)
set_enemies(sid1:sid2:...)
Установить друзьями/врагами данного npc и указанных в списке по story_id.
play_snd(snd_name:delay=0) Играть звук в голове актёра.

snd_name - путь к звуку относительно папки sounds delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.

play_snd_now (sid:snd_name) Играть звук от указанного объекта.
  • звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.
hit_obj(sid, bone, power, impulse, hit_src=npc:position()) Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате.

Параметры: actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]

  sid - story_id обьекта, по которому наносится хит.
  bone - строка. Имя кости, по которой наносится удар.
  power - сила удара.
  impulse - импульс.
  hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. 
Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.
actor_has_item(section) Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.
Функции для работы с HUD'ом.
disable_ui_elements(...)<br\>enable_ui_elements(...) Отключение/включение элементов HUD'а.

Параметры:

  weapon - спрятать/показать руки с оружием.
  input - отключить/включить клавиатуру.
  hud - спрятать/показать индикаторы на экране.
  all - отключить/включить все элементы.

Пример:

  on_info = %=disable_ui_elements(weapon:input)%
disable_ui<br\>enable_ui Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.

Пример:

  on_info = %=enable_ui%
run_cam_effector(file_name) Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.

Пример:

  on_info = %=run_cam_effector(prison_0)%
run_postprocess(file_name:id:loop) Запуск постпроцесса.

Параметры:

  file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.
  id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.
  loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.
stop_postprocess(id) Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.
drop_actor_inventory(имя_пути) Выбрасываем все предметы из инвентаря актера в первую точку заданного

пути. Пример:

  on_info = %=drop_actor_inventory(drop_point)%

3.16. Настройка звуковых групп.

Новый принцип создания звуковых групп:
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = <текстовая строка>
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:
soundgroup = bar_dolg_kampfire1
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях.
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group

Пример:
[kamp@esc_bridge_post1]
center_point = kamp_point
soundgroup = esc_bridge_soldiers

Ссылки

Оригинальный doc (Ссылка)

Доки скриптеров 1935(Ссылка)

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