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

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

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

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

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


Секции.

Секция combat

Показывает, что происходит, когда NPC срывается в бой.

on_combat = combat

[combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.

Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.

В следующем примере сталкер сражается:

  • по-камперски, если враг - актёр и он дальше Х метров;
  • по-монолитовски, если любой враг дальше Y метров;
  • иначе - движковый бой.
[logic]
active = walker
on_combat = combat
 
[walker]
path_walk = ...
 
[combat]
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, <br>{=fighting_ge_Y_meters} monolith

Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.

function fighting_dist_ge_20(actor, npc)
    return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400 
end

Примечание: 400 – это 202. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.

Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:

[logic]
active = nil
on_combat = combat
 
[combat]
combat_type = zombied

Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type.
Помните(!): оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:

[logic]
active = walker1
on_combat = combat
 
[walker1]
...
[walker2]
...
[walker3]
...
combat_type = monolith
 
[combat]
combat_type = camper

В файле xr_effects.script есть функция отключающая секцию combat - disable_combat_handler

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

Секция death

Схема показывает, что происходит при смерти NPC.

on_death = death

[death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти NPC.

Пример использования секции:
[logic]
...
on_death = death@mil_freedom_max_combat1
 
[death@mil_freedom_max_combat1]
on_info = %=military_max_dead +sar2_death_47%

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

Cекция hit

Схема показывает, что происходит при нанесении повреждения NPC.

on_hit = hit

[hit]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если NPC нанесён хит.

on_hit НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).

Пример использования секции:
[logic]
...
on_hit = on_hit@agr_factory_hold_fake
 
[on_hit@agr_factory_hold_fake]
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%

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

Секция actor_dialogs

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

actor_dialogs = actor_dialogs

[actor_dialogs]
id = <название_диалога> - доступные диалоги, перечислять через запятую.
disable = <название_диалога> - запрещенные диалоги, тоже через запятую.

Пример использования секции:
[logic]
...
actor_dialogs = actor_dialogs
 
[actor_dialogs]
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end

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

Секция use

Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.

on_use = use

[use]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.

Пример использования секции:
[logic]
...
on_use = use@mil_dolg_leader
 
[use@mil_dolg_leader]
on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%

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

Секция combat_ignore

Если для NPC установлена данная секция то он, не переходит в боевой режим.
Для секции нет дополнительных полей.

combat_ignore = combat_ignore

[combat_ignore]

В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:

[walker]
combat_ignore_cond = {+info –info =func !func ~number} – условия для игнорирования боя.

Если для оверрайда задать значение always, то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.

В файле xr_condition.script есть функции, используемые для работы с кондлистом оверрайда:

  • fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20 м;
  • fighting_dist_ge – универсальная функция, проверка расстояния для игрока;
  • fighting_actor - текущий враг актёр?;
  • check_fighting - проверка (по story_id) того, что нашим врагом есть хотя бы кто-то один из списка.

Пример использования секции:

[logic]
...
combat_ignore = combat_ignore
 
[combat_ignore]

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

Секция dont_spawn_character_supplies

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

[dont_spawn_character_supplies]

Секция threshold

Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров.

threshold = threshold

[threshold]
max_ignore_distance = <number> - (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.
ignore_monster = <number> - (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.

Примечание: второй параметр следует менять ОЧЕНЬ осторожно. Помните, в него нужно вписывать значение от 0 до 1!

Пример использования секции:
[logic]
...
threshold = threshold@mil_fbarier
 
[threshold@mil_fbarier]
max_ignore_distance = 150
ignore_monster = 0.1

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

Секция Danger

Секцию необходимо указывать только для какой-то конкретной схемы!

danger = danger_condition

[danger_condition]
ignore_distance = <number> - расстояние свыше которого игнорируется "живая" опасность (150 метров по умолчанию).
ignore_distance_grenade = <number> - расстояние свыше которого игнорируется граната (15 метров по умолчанию).
ignore_distance_corpse = <number> - расстояние свыше которого игнорируется труп (10 метров по умолчанию).
ignore_distance_hit = <number> - расстояние свыше которого игнорируется хит (150 метров по умолчанию).
ignore_distance_sound = <number> - расстояние свыше которого игнорируется звук (50 метров по умолчанию).
danger_inertion_time_grenade = <number> - время, спустя которое, NPC забудет о гранате (20000 миллисекунд по умолчанию).
danger_inertion_time_corpse = <number> - время, спустя которое, NPC забудет о трупе (10000 миллисекунд по умолчанию).
danger_inertion_time_hit = <number> - время, спустя которое, NPC забудет о хите (60000 миллисекунд по умолчанию).
danger_inertion_time_sound = <number> - время, спустя которое, NPC забудет о звуке (15000 миллисекунд по умолчанию).
danger_inertion_time_ricochet = <number> - время, спустя которое, NPC забудет о рикошете (30000 миллисекунд по умолчанию).
danger_expiration_time = <number> - время, через которое денжер перестанет быть акутальным. (5000 миллисекунд по умолчанию)

Примечание: NPC в принципе игнорируют авто с секцией m_car.

Примечание: если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера danger_condition@1, danger_condition@2 и так далее.

Пример использования секции:
[camper@dar_military_scout_camper3]
...
danger = danger_condition@scout
 
[danger_condition@scout]
ignore_distance       = 10
ignore_distance_grenade = 10
ignore_distance_corpse  = 0
ignore_distance_danger_hit     = 20
ignore_distance_sound   = 0 
danger_inertion_time_hit = 1

Файл: gamedata_1006\scripts\xr_danger.script

Секция game_info

"Обучает" NPC рассказывать у костра истории и легенды. Секция прописывается в custom_data NPC.

[game_info]
stories = "<название_звуковой_темы>" - имена звуковых тем из файла sound_theme.script.

Несколько тем перечислять через запятую.
Существуют следующие истории и легенды:

  • story_01 - Граница зоны и граната за 1 действие;
  • story_02 - Про трамплин и про камешки;
  • story_03 - Про то, как группа Вильнова вернулась;
  • story_04 - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;
  • story_05 - Про то, как духманам с контролером сражаться;br>
  • story_06 - Про дверцу, водку и избушку;br>
  • legend_01 - Про эксперимент в Зоне, который производят инопланетяне;
  • legend_02 - Об особо засекреченных лабораториях в зоне;
  • legend_03 - Легенда о проводнике;
  • legend_04 - Легенда о темном Сталкере;
  • legend_05 - Легенда о том что глубоко в Зоне спать нельзя.
Пример использования секции:
[game_info]
stories = "story_04, legend_03, legend_04"

Секция dont_spawn_loot

Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в custom_data персонажа прописать следующую секцию:
[dont_spawn_loot]

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

Оверрайды

Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).

combat_ignore_cond = {+info –info =func !func ~number} – условия для игнорирования боя.
combat_ignore_keep_when_attacked = true/false - NPC продолжает игнорировать бой, даже если в него стреляют – только в случае стрельбы игрока!!!
combat_type = {+info –info =func !func ~number} <параметр> - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:

  • camper
  • monolith
  • zombied
  • nil

on_combat = {+info –info =func !func ~number} %+info -info =func% - определяет поведение NPC при его уходе в бой.
companion_enabled = true/false - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы xr_attendant.script.

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

Отметки на минимапе

Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр show_spot. Возможно наличие условия.

[walker]
show_spot = {+info -info =func !func ~number} true/false - показывать или нет на карте. По умолчанию true.

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

Схемы для монстров

Схема mob_walker

Работает аналогично схеме обычного walker. Но есть некоторые отличия:

[mob_walker]
path_walk = <имя_пути> - путь перемещения.
path_look = <имя_пути> - путь обзора.
no_reset = true/false - не сбрасывать action предыдущей схемы (если нужно сохранить, например, звук). По умолчанию false.

Примечание: У кровосососов можно управлять невидимостью, для этого необходимо указать параметр state:

state = invis/vis - включить/выключить невидимость.
Пример использования схемы:
[mob_walker]
path_walk = x18_snork_walk_1
path_look = x18_snork_look

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

Схема mob_eluder

Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.

[mob_eluder]
path = <имя_пути> - работает как обычно path_walk. Набор точек патрульного пути.
time_capture = <number> - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.
time_release = <number> - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.
min_dist = <number> - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.
max_dist = <number> - если расстояние до врага больше этого, то он переходит под eluder. По умолчанию – 10 метров.

Примечание: работает нестабильно.

Пример использования схемы:
[mob_eluder]
path = dar_way_checker

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

Схема mob_remark

Ремарковая схема, только не для сталкеров, а для монстров.

[mob_remark]
state = <параметр> - специфическое состояние данного конкретного монстра (для кровососов - невидимость).
dialog_cond = {+info, =func, -info, !func ~number} - условия для открытия окна диалога.
anim = <название_анимации> - анимации монстра, перечисляются через запятую.
anim.head = <название_анимации> - анимации головы монстра, перечисляются через запятую.
tip = <параметр> - какой значок под светится, при наведении на него курсора.
snd = <название_звуковой_темы> - какой звук издает.
time = <number> - время проигрывания анимаций, используется только для отладки.

Пример использования схемы:
[mob_remark@hold]
anim = stand_idle_0
time = 50000

Файл gamedata\scripts\mob_remark.script

Схема mob_jump

Схема mob_jump служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.

[mob_jump]
path_jump = <имя_пути> - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).

Реальная точка учитывает позицию path_jump[0] + смещение, заданное с помощью offset.

ph_jump_factor = <number> - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.

Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.

offset = <vector> - смещение по осям x, y, z соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде).

С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.

Примечание: фактически mob_jump - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал jumped. Т.е. on_signal = jumped | имя_схемы_или_nil – является обязательным параметром в схеме, чтобы знать куда переходить дальше.
При выборе позиции используется первая точка патрульного пути (0-вой индекс).

Пример использования схемы:
[mob_jump]
path_jump = aes_snork_jump1
ph_jump_factor = 1.8
offset = 0,0,0
on_signal = jumped | mob_walker2

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

Схема mob_camp

Свойства схемы:

  • Сидит на позиции, смотрит в точку;
  • Можно задать несколько позиций и время смены позиции;
  • Перемещается между позициями бегом;
  • При виде врага переходит под универсальную схему (комбат/паника и т.д);
  • Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;
  • Если враг уходит далеко - монстр возвращается на позицию;

[mob_camp]
path_home = <имя_пути> - путь, состоящий из точек, в которых будет находиться монстр.
path_look = <имя_пути> - путь, состоящий из точек, в которые будет смотреть монстр.
time_change_point = <number> - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.
home_min_radius = <number> - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.
home_max_radius = <number> - максимальный радиус от врага до camp-точки. По умолчанию - 40 метров.
skip_transfer_enemy = true/false – управляет передачей врагов от друзей. Если установлено в true и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные group разнести).

Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше home_min_radius - атакуем врага, пока враг не исчезнет или дистанция не будет больше home_max_radius.
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.
Выбор текущей позиции производится случайным образом.
Индексы точек пути для path_home и path_look должны совпадать (т.е. монстр сидит во второй точке path_home и смотрит во вторую точку path_look).

Единственным необходимым параметром является path_look.
Если не установлен path_home, в качестве камперской точки учитывается позиция и нода объекта при спауне.

Для того чтобы монстр смотрел в разные точки на кампер-позиции, path_look может состоять из нескольких точек.

Примечание: обязательные требованием является:

  • home_min_radius < home_max_radius;
  • Количество точек путей path_look и path_home должно быть равным.

P.S. mob_camp можно использовать как альтернативу к монстрам под рестрикторами.

Пример использования схемы:
[mob_camp]
path_home = aes2_snork_walk3
path_look = aes2_snork_look3
home_min_radius  = 10
home_max_radius = 15

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

Схема mob_home

Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на mob_home, а старые гулаги постепенно переводить на mob_home. У кого рестрикторы работают хорошо и красиво, их можно не трогать.

[mob_home]
path_home = <имя_пути> - точка, вокруг которой будут держаться монстр.
home_min_radius = <number> - минимальный радиус от врага до path_home точки. По умолчанию - 20 метров.
home_max_radius = <number> - максимальный радиус от врага до path_home точки. По умолчанию - 40 метров.
aggressive_home - в назначенную точку path_home монстры бегут а не идут.

Описание:
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри home_min радиуса, иначе прячутся в укрытия. Отсюда следует, что home_min_radius желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. home_max_radius сделан по принципу большого рестриктера в схеме mob_camp.

Примечание: добавлена возможность задания минимального и максимального радиусов для схемы mob_home в флагах первой точки пути (path_home). Для этого введены флаги minr и maxr. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из секции. Если не задано ни там, ни там, то берутся дефолтные значения.

Пример использования схемы:
[mob_home@gar_boars_nest]
path_home = home
home_min_radius = 25
home_max_radius = 50
aggressive_home

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

Схема mob_fake_death

Появилась схема mob_fake_death для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.

[mob_fake_death]

При входе в схему зомби падает, при выходе из схемы встает.

Пример использования схемы:
[mob_fake_death]
on_actor_dist_le = 5 | nil

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

Секции для монстров

Секция mob_combat

Секция работает аналогично схеме combat для NPC.

on_combat = mob_combat

[mob_combat]
on_info = {+info -info =func !func ~number}%+info -info =func% - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.

Пример использования секции:
[logic@val_sos_bs]
...
on_combat = mob_combat
 
[mob_combat]
on_info = nil %=disable_combat_handler%

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

Секция mob_death

Секция работает аналогично схеме death для NPC.

on_death = mob_death

[mob_death]
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти монстра.

Пример использования секции:
[logic@gar_boars_nest_rush]
...
on_death = mob_death@gar_boars_rush
 
[mob_death@gar_boars_rush]
on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%

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

Оверрайды для монстров

actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.
npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.
friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.
braindead = true/false - если true, то монстр игнорирует любые атаки.

Общая секция spawner

Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в Level editor флажок no_move_in_offline и отключен can_switch_offline. Спавнер прописывается в custom_data объекта перед секцией logic.

[spawner]
cond = {+info -info =func !func ~number} - условия для спавна.

Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.

После того, как объект заспавнился, его берет под управление скрипт Logic.

Пример использования секции:
[spawner]
cond = {+esc_boar_dogs_restrictor}

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

Спавн монстров дневных и ночных

[spawner]
cond = {=is_day} – спавнить монстра только днем (если надо ночью, то пишем {!is_day})
check_distance = true – проверка на наличие персонажа рядом.
min_distance = 100 – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).



Часть 3

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