Настройка логики. Часть 4
Материал из S.T.A.L.K.E.R. Inside Wiki
Содержание |
---|
Настройка логики. Часть 0 |
Содержание
- 1 Набор дополнительных настроек логики у разных объектов
- 2 Смарттерейны и гулаги.
Набор дополнительных настроек логики у разных объектов
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.
Схема 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 - в текущем (дефолтном или оставшемся от предыдущей схемы).
- open - в открытом состоянии;
locking - <параметр> - блокировка дверей (по умолчанию none). Возможны следующие значения:
- stick - прилипание дверей к крайним состояниям.
- soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:
- open - блокировать в открытом состоянии;
- closed - в закрытом;
- none - не используется (мягкая блокировка возможна только в крайних положениях);
- open - блокировать в открытом состоянии;
- hard - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:
- open - блокировать в открытом состоянии;
- closed - в закрытом;
- none - в текущем.
- open - блокировать в открытом состоянии;
- none - дверь не заблокирована
- stick - прилипание дверей к крайним состояниям.
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_rep = inf/<number> - вероятно, время через которое возможна повторная стрельба. inf = -1.
fire_range = <number> - сектор стрельбы. По умолчанию - 50 градусов.
target = <параметр> - цель для стрельбы. Возможны следующие параметры:
- points - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;
- actor - без комментариев;
- story_id - персонаж с указанным story_id.
- points - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;
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 - вкл./выкл. звук двигателя.
headlights = on/off - вкл./выкл. свет от фар.
on_death_info = {+info -info =func !func ~number} %+info -info =func% - что произойдёт при уничтожении транспорта.
Поддерживается сигнал 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 – стрелять только ракетами.
- w=1 – стрелять только пулемётом;
- По умолчанию стреляет всем.
- v - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.
- dv - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.
- die - убить вертолёт.
- flame - начать дымить (как будто подбили).
- e – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано e=actor (можно сокращённо e=a), то огонь будет вестись по актору. Если задано e=число, стрелять будет по объекту со story_id равным числу.
Параметры, задаваемые в именах вершин пути path_look:
- e - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.
- w – см. такой же параметр для пути path_move.
- t - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.
- e - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.
Файл: gamedata\scripts\heli_move.script
Универсальная боевая схема: heli_combat
Общие сведения:
В универсальной боевой схеме вертолёт не привязан к путям.
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.
Примечание: отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:
combat_ignore = true/false - true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться "отомстить" тому, от кого он получил хит.
combat_enemy = <параметр> - враг. Возможны следующие значения:
- nil - враг отсутствует;
- actor - без комментариев;
- story_id - персонаж с указанным story_id.
- nil - враг отсутствует;
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
Смарттерейны и гулаги.
3.11.1. Смарттеррейн.
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.
Как поставить smart terrain?
Для всех smart terrain нужно:
1) Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).
2) В его custom data прописать настройки.
3) Расставить пути для соответствующих схем поведения.
Параметры custom data:
[gulag1]
type = тип гулага
capacity = макс. вместимость в людях
- offline = может ли гулаг образоваться в offline (true(по дефолту)/false)
- squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)
- groups = набор group через запятые
- stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)
- idle = min, max время бездействия smart_terrain после ухода последнего npc
- cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.
Указывать тип гулага нужно без кавычек.
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.
Все времена задаются в часах игрового времени и могут быть дробными.
Пути:
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2)
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.
3.11.2. Гулаги.
Гулаг - средство объединения нескольких сталкеров под централизованным управлением. Основные особенности:
А) Есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем поведения);
Б) Работы имеют приоритеты;
В) Гулаг назначает на работы сталкеров входящих в гулаг, начиная с работ с наивысшим приоритетом;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.
Гулаг создается следующим образом:
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.
2. Определяем максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.
[gulag1]
type = тип гулага
capacity = макс. вместимость в людях
- offline = может ли гулаг образоваться в offline (true/false)
- squad = squad, который будет проставлен всем сталкерам под гулагом
- groups = набор group через запятые
- stay = min, max время пребывания npc под smart_terrain
- idle = min, max время бездействия smart_terrain после ухода последнего npc
- cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.
- respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.
Указывать тип гулага нужно без кавычек.
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.
Все времена задаются в часах игрового времени и могут быть дробными.
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:
if gulag_type == "gar_dolg" then return npc_community == "dolg" end
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага.
function loadStates(gname, type)
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:
if type == "gar_maniac" 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 часов, то гулаг находится в дневном состоянии, иначе в ночном.
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:
function loadJob(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
Описание полей:
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.
In_rest, out_rest - рестрикторы, которые устанавливаются персонажу на данное задание.
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx, где указываются реальные настройки схемы поведения, которая соответствует текущей работе.
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например:
predicate = function(obj) return obj:profile_name() == "soldier_commander" end
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:
;---------------------------- ;-- GARBAGE MANIAC ;---------------------------- [logic@gar_maniac_camper] active = camper@gar_maniac_camper [camper@gar_maniac_camper] path_walk = walk1 path_look = look1 [logic@gar_maniac_sleeper] active = sleeper@gar_maniac_sleeper [sleeper@gar_maniac_sleeper] path_main = sleep wakeable = true
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:
1) пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.
2) в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)
3) в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.
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
3.12. Логика вертолёта
Общие сведения:
Вертолёт работает на «логике».
На вертолёт реагируют аномалии.
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.
У вертолёта есть универсальная боевая схема на манер сталкеров.
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.
3.12.1. Схема heli_move:
Общие сведения: Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look
Настройки:
- engine_sound = true/false (по умолчанию true)
Вкл/выкл звук двигателя вертолёта.
- invulnerable = true/false (по умолчанию false)
Неуязвимость. Если true, вертолёт игнорирует все хиты.
- immortal = true/false (по умолчанию false)
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.
- mute = true/false (по умолчанию false)
Отключает универсальные реплики пилотов вертолета.
- rocket_delay = msec (время в миллисекундах реального времени)
Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)
- default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)
Параметры, задаваемые в именах вершин пути 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) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.
3.12.2. Универсальная боевая схема: heli_combat
Общие сведения:
В универсальной боевой схеме вертолёт не привязан к путям.
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.
Настройки:
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:
combat_ignore = true/false true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.
combat_enemy = nil/actor/StoryID С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.
combat_use_rocket = true/false Можно ли вертолёту пользоваться рокетами.
combat_use_mgun = true/false Можно ли вертолёту пользоваться пулемётом.
combat_velocity = <число> Скорсть, с которой вертолет будет делать боевые заходы
combat_safe_altitude = <число> Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:
heli_set_enemy_actor - сделать актёра врагом вертолёту heli_start_flame - поджечь вертолёт heli_die - убить вертолёт
combat_velocity = - боевая скорость в этой секции указывается в м/с combat_safe_altitude = - высота боевая в метрах, может принимать отрицательные значения combat_use_rocket = - true/false использовать ли ракеты в этой секции combat_use_mgun = - true/false использовать ли пулемет в этой секции
3.15. Передача параметров в функции.
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.
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 для определения того, что сталкер подошел на нужную дистанцию к лидеру |
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 - если строка, то считается, что это имя пути и в сторону первой точки производится Пример: [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) | Играть звук от указанного объекта.
|
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(Ссылка)