Часть 1.
3.1. Система флагов (path_walk, path_look)
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени waypoint-а, например, для точки с именем "wp00": wp00|flag1|flag2.
Флаги точек пути path_walk:
a=state
Выбирает состояние тела при перемещении (Только из раздела – Ходячие состояния). Список состояний можно взять в gamedata\scripts\state_lib.script.
p=percent
Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.
sig=name
Установить сигнал с именем name сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля on_signal логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути path_look.
Флаги точек пути path_look:
a=state
Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов Стоячие и Сидячие состояния) Список состояний можно взять в gamedata\scripts\state_lib.script
t=msec
Время в миллисекундах, которое персонаж должен смотреть в заданную точку. ‘*’ – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000. Для конечных (терминальных) вершин пути path_walk, у которых не более 1-й соответствующей точки path_look, значение t всегда считается бесконечным и его явно задавать не нужно.
sig=name
После поворота в точку path_look, установить сигнал с именем name.
syn
Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком syn не прибудут все персонажи с данным team-ом (team задается в виде текстовой строки в customdata). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою idle анимацию.
sigtm=signal
Устанавливает сигнал при вызове time_callback-а state manager-ом. Соответственно, если t=0, то сигнал будет установлен после отыгрывания init анимации. Это используется, например, с анимацией press, которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.
В пути path_look можно сделать: wp00 | a=press | t=0 | sigtm=pressed
А затем переключить схему: on_signal = pressed | другая_схема
3.1.1. Более подробное описание путей (walker)
Настройка:
На карту для каждого walker'а нужно поставить:
Путь path_walk, по которому walker ходит.
Путь path_look, состоящий из точек, в которые walker смотрит.
Walker'ов может быть от одного или больше. Они могут действовать независимо, или взаимодействовать друг с другом.
[walker]
team = ... - имя команды, произвольная текстовая строка. Все walker'ы в одной команде должны иметь один и тот же team. Желательно в team задавать имя уровня и имя места, где стоят walker'ы, например: escape_bridge, escape_factory, это уменьшит шанс ошибиться и дать разным командам общее имя.
path_walk = ... - имя пути, описанного в п. 1
path_look = ... - (не обязательно) имя пути, описанного в п. 2. Если персонаж должен только ходить по маршруту, path_look можно не задавать. Если персонаж должен стоять на месте, то ему задается одна точка пути path_walk и как минимум одна точка пути path_look.
Правила расстановки флажков в путях рассмотрим на нескольких примерах.
Пример 1:
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом:
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути path_walk существуют флажки. У каждого вейпоинта есть имя: wp00, wp01 и т.д. Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘|’. Пишется a = anim, где anim – название анимации из пункта 2.4.4. настоящей документации. Если мы напишем a = threat, то персонаж пойдет в состоянии danger, если a = raid - то побежит с оружием наизготовку, и т.д.
В точках пути path_walk используются анимации только из раздела «Ходячие состояния»!
Пример 2:
Разговор персонажа.
Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существует поле: s = имя_звуковой_схемы (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.
Пример 3:
В примере 3 используется только поле s, чтобы задать тему разговора, и флажок sc, чтобы показать, что звук проигрывается не разово, а периодически. Остальные параметры (sp, sf, st) задавать не рекомендуется, значения по умолчанию приемлемы для большинства скриптов. Параметр sa также использовать не рекомендуется. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути path_look, о котором будет написано ниже в этом документе. Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь path_look.
Пример 4:
Усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него. Что добавилось в этом примере? Путь path_look с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.
Далее, в точках путей path_walk и path_look, которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки. Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1. Теперь персонаж будет останавливаться в точках path_walk, помеченных флажком, и смотреть в точку path_look, помеченную тем же самым флажком.
Если точка path_walk не помечена флажком, персонаж проходит ее не останавливаясь. Одной точке path_walk может соответствовать несколько точек path_look. Тогда персонаж выберем случайно одну из подходящих точек.
По аналогии с path_walk, в точках пути path_look можно использовать различные флажки, меняющие поведение:
p = 100 – вероятность, с которой персонаж посмотрит именно в эту точку. Значения p всех подходящих точек суммируются, т.е. если у одной точки p = 100, а у другой 300, то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400). Во избежание путаницы, рекомендуется задавать p так, чтобы их сумма составляла 100. По умолчанию у всех точек p = 100.
t = ... время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)
Пример 5:
В этом примере, проходя через точку wp00, персонаж с вероятностью 30% посмотрит в точку wp00 в течение 5 секунд, но с вероятностью 70% посмотрит в точку wp01 в течении 10 секунд.
По умолчанию при остановках персонаж играет анимацию idle, если он не в состоянии crouch, либо анимацию hide, если он в состоянии crouch. Если требуется другая анимация, можно ее указать с помощью флажка:
a = имя_анимации (по умолчанию idle). Пишется a = anim, где anim – название анимации из пункта 2.4.4. настоящей документации. Если мы напишем a = hide, то персонаж сядет в состоянии danger, если a = guard, то встанет с оружием наизготовку и т.д.
В точках пути path_look используются анимации только из раздела «Ходячие состояния»!
3.2. Схемы поведения сталкеров.
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.
В файле \gamedata\scripts\modules.script указаны все загружаемые схемы.
3.2.1. Схема walker
Это базовая схема, в которой персонаж перемещается по патрульному пути (path_walk) и останавливается в определенных точках и выполняет соответствующие действия.
[walker]
path_walk = имя пути - основной путь, по которому ходит NPC
path_look = имя пути - путь, куда смотрит NPC
team - команда для синхронизации
В точках path_walk, которым соответствуют точки пути path_look (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.
def_state_moving1 - состояние, в котором сталкер движется к первой точке пути, если она близко (patrol по умолчанию)
def_state_moving2 - состояние, в котором сталкер движется к первой точке пути, если она не слишком далеко (rush по умолчанию)
def_state_moving3 - состояние, в котором сталкер движется к первой точке пути, если она далеко (sprint по умолчанию)
def_state_standing - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.
Файл: \gamedata\scripts\xr_walker.script
3.2.2. Схема remark
Схема используется для синхронизации\связки других схем.
[remark]
snd_anim_synс = true/false - Указывает на то необходимо ли синхронизировать звук с анимацией либо нет
snd - звук ремарка, по умолчанию nil
anim - анимация ремарка, по умолчанию wait
target - куда смотрит сталкер. Есть следующие варианты
story_id – числовое значение
actor – без комментариев
nil – позиция вычисленная АИ автоматически
<имя работы>,<имя гулага> смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг сталкера, для которого задана данная секция ремарка).
Пример:
target = logic@cit_killers_base_guard, cit_killers , - можно указывать смотреть в вершину патрульного пути (<имя пути>, <имя точки>).
Внимание, теперь если значение не задано, то оно равно nil а не actor, как было раньше. То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение nil, то персонаж развернется в позицию, которую посчитает AI.
Стандартные сигналы для remark:
sound_end – по окончании проигрывания звуковой схемы
anim_end – по окончании проигрывания анимации
action_end – по окончании проигрывания и того и другого, если они синхронизированы
Пример синхронизации анимации и звука в схеме remark:
[remark]
anim - анимация
snd - звук
snd_anim_sync = true - синхронизация
on_signal = action_end | следующая схема
3.2.3. Схема sleeper
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из одного поинта. Спящий будет садиться спать в нулевой точке пути, и разворачиваться при этом в сторону первой точки.
[sleeper]
path_main = ... - имя пути
wakeable = true – может ли проснуться быстро (если true, то спит на корточках и во сне бормочет)
Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).
Файл: \gamedata\scripts\xr_sleeper.script
3.2.4. Схема kamp
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.
[kamp]
center_point = kamp_center – имя точки вокруг которой NPC будет устраиваться.
radius = 2 - насколько далеко сталкер будет сидеть от центра лагеря, 2 - по умолчанию.
def_state_moving = run - дефолтное состояние, в котором сталкер будет идети к точке кампа.
Файл: \gamedata\scripts\xr_kamp.script
Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой равно:
_task
path_walk = _task
Если точка кемпа расположена в чистом поле то, path_walk прописывать не надо.
3.2.5. Схема camper
Свойства кемперов:
Кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передигается по патрульным путям
Кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возращается в состояние кемпера.
В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим danger - то смотрим в направление в danger. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага.
Кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.
[camper]
path_walk = patrol_path
path_look = patrol_path
radius = ... – расстояние в метрах, если расстояние между кэмпером и противником меньше указанного, кэмпер уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.
no_retreat = true - персонаж при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.
def_state_moving = ... - (состояние из стейт менеджера), в котором мы движемся на ближайшую точку пути при враге.
def_state_moving_fire = ... - (состояние из стейт менеджера (sneak_fire)), в котором мы отстреливаемся от врага, во время движения на ближайшую точку пути.
def_state_campering = ... - (состояние из стейт менеджера (hide)), в котором мы ожидаем врага, находясь на пути.
def_state_campering_fire = ... (состояние из стейт менеджера (hide_fire)), в котором мы отстреливаемся от врага, находясь на пути.
attack_sound = имя_звуковой_темы - возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме "fight_attack". Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав в секции кемпера пустой атрибут.
shoot = ... - Задаем тип стрельбы. Возможные значения:
always - значение по умолчанию, стреляет всегда, когда можно
- не стреляет вообще.
terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.
У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули. Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walkerов в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов.
3.2.5.1. Схема sniper
Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20сек. Внимание! Ставить снайперу только 2 точки look.
В кастом дате кемпера прописать:
sniper = true
Файл: \gamedata\scripts\xr_camper.script
3.2.6. Схема follower
В custom_data прописан как follower. NPC идет за NPC лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint. Пути не задаются.
[follower]
leader = ... - story_id лидера из game.ltx (число!).
formation_line = true - постарается идти сбоку от лидера, в противном случае будет идти сзади.
distance = ... - расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.
state_if_leader_in_meet - это есть строка с именем состояния из state_manager, которое будет назначено follower'ам, если командир пребывает в состоянии meet.
anim_walk = state - состояние, в котором фолловер идет за лидером.
anim_run = state - состояние, в котором фолловер бежит за лидером.
anim_sprint = state - состояние, в котором фолловер спринтует за лидером.
Файл: \gamedata\scripts\xr_ attendant.script
Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта. Пример:
t = { section = "logic@bar_arena_follower_2",
idle = 0,
prior = 7, state = {0}, squad = squad, group = groups[0],
in_rest = "", out_rest = "",
dependent = "logic@bar_arena_leader",
predicate = function(obj)
return obj:character_community() == "dolg"
end
}
3.2.7. Схема zoneguard
NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока
[zoneguard]
path_walk = ... - путь перемещения
path_look = ... - путь обзора
team = ... - имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока)
zone_guard = ... - имя зоны, в пределах которой игрок будет атакован
zone_warn = ... - имя зоны, в пределах которой начинать разговор с игроком
walker_team = ... - team для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team)
no_move = ... - если true, персонаж окликнет игрока с места и не будет подбегать к нему
snd_greet = ... - имя звуковой схемы, из которой будет проигран звук при обнаружении персонажа
ignore_friends = ... - true - будет игнорировать дружественных ему персонажей.
ignore_cond = {+info -info =func !func} - условия, при которых NPC игнорирует игрока
no_danger = ... - если true, то не отыгрывает угрожающую анимацию, нейтралам.
anim = ... - какую отыгрывает анимацию, если игрок ему не враждебен.
snd_anim_sync = ... - если true, то npc будет синхронизировать звук с анимацией
Файл: \gamedata\scripts\xr_zoneguard.script
3.2.8. Схема wounded (раненый)
[logic]
wounded = wounded
[walker]
wounded = wounded
[wounded]
hp_state = HP|condstate@condsound|HP|condstate@condsound
hp_state_see = HP|condstate@condsound|HP|condstate@condsound
psy_state = PSY|condstate@condsound|PSY|condstate@condsound
hp_victim = HP|condvictim|HP|condvictim
hp_cover = HP|condbool|HP|condbool
hp_fight = HP|condbool|HP|condbool
syndata = state@sound|state@sound
help_dialog = story_id
help_start_dialog = story_id
Где:
condstate – кондлист, возвращающий состояние персонажа, либо true. Если он возвращает true – нпс обидится на игрока
condsound – кондлист, возвращающий саунд тему.
HP – пороговые значение здоровья персонажа
PSY – пороговые значения пси здоровья персонажа
condvictim – кондлист, возвращающий направление куда смотреть. Возможные значения: nil, actor, number. В случае числа – будет смотреть на персонажа с указанными стори айди.
condbool – кондлист, возвращаюзий true либо false.
Значения полей:
hp_state – поведение персонажа когда он не видит игрока
hp_state_see – поведение персонажа, когда он видит игрока
psy_state – поведение персонажа при псиатаках
hp_victim – куда смотреть, в зависимости от ХП
hp_cover – идти в укрытие или нет, в зависимости от ХП
hp_fight – разрешено воевать или нет, в зависимости от ХП
syndata – синхропары для красоты.
help_dialog – story_id диалога вместо дефолтного actor_help_wounded. Если вам по сюжету необходимо заменить диалог другим, то вы в этом поле прописываете id другого диалога.
Также мы вставляем стартовый диалог раненого. Если мы его прописываем, то все актёрские диалоги для раненых должны иметь такой precondition: dialogs.allow_wounded_dialog.
Пример. В качестве примера взята дефолтная настройка.
hp_state = 30|help_me@help|10|wounded_heavy@help_heavy
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|
{=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy
hp_victim = 30|actor|10|nil
hp_cover = 30|true|10|false
hp_fight = 30|true|10|false
syndata = wounded@help
Где:
best_pistol – проверка на то, что лучшее оружие НПС является пистолетом.
Файл: \gamedata\scripts\xr_wounded.script
3.2.9. Схема rest
Чувак гуляет, хавает, спит. Пока нормально не работает.
Файл: \gamedata\scripts\xr_rest.script
3.2.10. Схема heli_hunter
Может стрелять, либо не стрелять по вертолету в зависимости от условий. Делается это так:
[camper@bar_freedom_attack_sniper_1]
path_walk = camper_1_walk
path_look = camper_1_look
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 %=bar_freedom_angry_actor%
meet_talk_enabled = true
meet_dialog = bar_svoboda_dialog
heli_hunter = {-bar_ecolog_crush_heli_down} true, false
Если раньше оверрайд хелихантера понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена.
3.2.11. Patrol
Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в кустовой дате следующее:
[patrol]
path_walk = path_walk
path_look = path_look
formation = back
commander = true
move_type = ...
formation - описывет способ построения и не является обязательным. Возможны следующие варианты:
back - мужики идут чуть позади командира в два ряда (по умолчанию)
line - шеренга
around - вокруг командира
commander = true - типа назначат командиром, желательно, чтобы такой красивый он был один.
move_type = ... - задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib.
При остановке командора в meet мужики останавливаются.
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:
ret=0...2
0 - линия
1 – вокруг старшего
2 – по бокам
При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано a = assault, то командор помчится с орудием убийства на перевес, а остальные его откопируют.
Что еще не сделано или глючит:
нет возможности автоматически перестроить команду (нужно от Шурика то, что записано в todo листе)
все идут молча (когда будет манагер баек, то сделаем)
командор пока не отдает команд (нет озвучки)
не рекомендуется включать спринт (глючит).
3.3. Секции.
3.3.1. Секция combat
Показывает, что происходит, когда NPC срывается в бой.
on_combat = combat
[combat]
on_info = %+info -info =func% - эффекты, которые вызываются на каждом раунде боя.
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр combat_type.
В следующем примере сталкер сражается:
по-кемперски, если враг = актёр и он дальше Х метров
по-монолитовски, если любой враг дальше Y метров
иначе - движковый бой
[logic]
active = walker
on_combat = combat
[walker]
path_walk = ...
[combat]
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, {=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
Примечание – мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:
[logic]
active = nil
on_combat = combat
[combat]
combat_type = zombied
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом combat_type. Помните: оверрайд всегда будет перекрывать настройку в секции combat. Т.е., если у вас логика на 5 секций и в четырёх нужен кемперский комбат, а в пятой монолитовский, то можно задать так:
[logic]
active = walker1
on_combat = combat
[walker1]
...
[walker2]
...
[walker3]
...
[walker4]
...
[walker5]
...
combat_type = monolith
[combat]
combat_type = camper
scheme - задает тип боя (monolith, camper, zombied), иначе - универсальный бой)
disable_combat_handler – функция отключающая секцию combat.
Файл: \gamedata\scripts\xr_combat.script .
3.3.2 Секция death
Схема показывает, что происходит при смерти NPC.
on_death = death
[death]
on_info = %+info -info =func%
Файл: \gamedata\scripts\xr_death.script .
3.3.3. Cекция hit
Схема показывает, что происходит при нанесении повреждения NPC.
Причем on_hit не срабатывает на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).
on_hit = hit
[hit]
on_info = %+info -info =func%
Файл: \gamedata\scripts\xr_hit.script .
3.3.4. Секция actor_dialogs
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.
actor_dialogs = actor_dialogs
[actor_dialogs]
id = ... - доступные диалоги через запятую.
disable = ... - запрещенные диалоги, тоже через запятую.
Файл: \gamedata\scripts\xr_meet.script .
3.3.5. Секция use
Схема показывает, что произойдет, если игрок юзнет NPC.
on_use = use
[use]
on_info = %+info -info =func%
Файл: \gamedata\scripts\xr_use.script .
3.3.6. Секция combat_ignore
Если NPC в этой схеме то он не переходит в боевой режим. В любой другой схеме:
[walker]
combat_ignore_cond = {+info –info =func !func} – условия для игнорирования боя (если написать always, то в данной схеме игрок будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется).
В схеме нет дополнительных полей.
[walker]
combat_ignore = combat_ignore
[combat_ignore]
Функции, используемые для работы с кондлистом комбат игнора:
fighting_dist_ge_20 - текущий враг на расстоянии больше или равном 20 м.
fighting_dist_ge (х) – (х - расстояние в метрах)универсальная функция для combat_ignore, проверка расстояния для игрока.
fighting_actor - текущий враг - актёр?
check_fighting - проверка (по story_id) того, что нашим врагом есть хотя бы кото-то один из списка.
Файл: \gamedata\scripts\xr_combat_ignore.script
Авторы
Статья создана:
GSC Game World (оригинал)