Настройка логики. Часть 1 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→3.2.7. Схема zoneguard) |
(→3.2.7. Схема zoneguard) |
||
Строка 311: | Строка 311: | ||
'''[zoneguard]'''<br> | '''[zoneguard]'''<br> | ||
− | '''''path_walk = < | + | '''''path_walk = <имя_пути>''''' - путь перемещения.<br> |
− | '''''path_look = < | + | '''''path_look = <имя_пути>''''' - путь обзора.<br> |
'''''team = <имя_команды>''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).<br> | '''''team = <имя_команды>''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).<br> | ||
'''''zone_guard = <имя_зоны>''''' - зона в пределах которой игрок будет атакован.<br> | '''''zone_guard = <имя_зоны>''''' - зона в пределах которой игрок будет атакован.<br> | ||
Строка 318: | Строка 318: | ||
'''''walker_team = <имя_команды>''''' - для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').<br> | '''''walker_team = <имя_команды>''''' - для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').<br> | ||
'''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.<br> | '''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.<br> | ||
− | '''''snd_greet = <название_звуковой_темы>''''' - звук которой будет проигран при обнаружении | + | '''''snd_greet = <название_звуковой_темы>''''' - звук которой будет проигран при обнаружении игрока.<br> |
'''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.<br> | '''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.<br> | ||
'''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.<br> | '''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.<br> | ||
− | '''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию | + | '''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.<br> |
'''''anim = <название_анимации>''''' - какую отыгрывает анимацию, если игрок ему не враждебен.<br> | '''''anim = <название_анимации>''''' - какую отыгрывает анимацию, если игрок ему не враждебен.<br> | ||
'''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.<br> | '''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.<br> |
Версия 16:39, 29 апреля 2012
Содержание |
---|
Настройка логики. Часть 0 |
Содержание
- 1 Настройки логики
- 1.1 3.1. Система флагов (path_walk, path_look)
- 1.2 3.1.1. Более подробное описание путей.
- 1.3 3.2. Схемы поведения сталкеров.
- 1.4 3.2.1. Схема walker
- 1.5 3.2.2. Схема remark
- 1.6 3.2.3. Схема sleeper
- 1.7 3.2.4. Схема kamp
- 1.8 3.2.5. Схема camper
- 1.9 3.2.5.1. Схема sniper
- 1.10 3.2.6. Схема follower
- 1.11 3.2.7. Схема zoneguard
- 1.12 3.2.8. Схема wounded (раненый)
- 1.13 3.2.9. Схема rest
- 1.14 3.2.10. Схема heli_hunter
- 1.15 3.2.11. Patrol
- 1.16 3.3. Секции.
- 1.17 3.3.1. Секция combat
- 1.18 3.3.2 Секция death
- 1.19 3.3.3. Cекция hit
- 1.20 3.3.4. Секция actor_dialogs
- 1.21 3.3.5. Секция use
- 1.22 3.3.6. Секция combat_ignore
Настройки логики
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-а нужно поставить:
- Путь path_walk, по которому walker ходит.
- Путь path_look, состоящий из точек, в которые walker смотрит.
Walker-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.
Если персонаж должен стоять на месте, то ему задается одна точка пути path_walk и как минимум одна точка пути path_look, хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.
Правила расстановки флажков в путях рассмотрим на нескольких примерах:
Пример 1:
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом:
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути path_walk существуют флажки.
У каждого вейпоинта есть имя: wp00, wp01 и т.д.
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘|’. Пишеться a=anim, где anim – название анимации. Если мы напишем a=threat то персонаж пойдет в состоянии данжер, если 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, которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки (в ACDC поле flags). Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1.
Теперь персонаж будет останавливаться в точках path_walk, помеченных флажком, и смотреть в точку path_look, помеченную тем же самым флажком.
Если точка path_walk не помечена флажком, персонаж проходит ее не останавливаясь.
Одной точке path_walk может соответствовать несколько точек path_look. Тогда персонаж выберем случайно одну из подходящих точек.
По аналогии с path_walk, в точках пути path_look можно использовать различные флажки, меняющие поведение:
p = 100 – вероятность, с которой персонаж посмотрит именно в эту точку. Значения p всех подходящих точек суммируются, т.е. если у одной точки p = 100, а у другой p = 300, то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).
Во избежание путаницы, рекомендуется задавать p так, чтобы их сумма составляла 100.
По умолчанию у всех точек p = 100.
t = 5000 - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)
Пример 5:
В этом примере проходя через точку wp00, персонаж с вероятностью 30% посмотрит в точку wp00 в течение 5 секунд, но с вероятностью 70% посмотрит в точку wp01 в течении 10 секунд.
По умолчанию при остановках персонаж играет анимацию idle, если он не в состоянии crouch, либо анимацию hide, если он в состоянии crouch.
Если требуется другая анимация, можно ее указать с помощью флажка:
a = имя_анимации - (по умолчанию idle).
Пишеться a=anim, где anim – название анимации. Если мы напишем a=hide, то персонаж сядет в состоянии данжер, если a=guard, то встанет с оружием наизготовку и т.д.
Примечание: В точках пути path_look используются анимации ТОЛЬКО из раздела «Стоячие и сидячие состояния»!
Случайный выбор пути
По поводу точек пути path_walk.
Есть ещё один интересный факт: следующую точку пути path_walk можно задавать рандомно.
Например:
Нам требуется, чтобы НПС стоящий в точке p0 патрулировал территорию по двум цикличным маршрутам:
p0 -> p1 -> p2 -> p0
p0 -> p3 -> p4 -> p0
p0:links = p1(1), p3(1)Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек p1 или p3. После возврата в точку p0 выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:
p0:links = p1(1), p3(1)а в точке p1, также задать выбор:
p1:links = p2(1), p3(1)
НО! Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема НЕ ПРИЕМЛЕМА и, лично у меня, вызывает вылет:
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:p1:links = p2(0.75), p3(0.25)то соответственно в точку p2 НПС будет ходить в три раза чаще.
3.2. Схемы поведения сталкеров.
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.
В файле gamedata\scripts\modules.script указаны все загружаемые схемы.
3.2.1. Схема walker
Это базовая схема, по которой персонаж, перемещается по патрульному пути (path_walk) и останавливается в определенных точках и выполняет соответствующие действия.
[walker]
path_walk = <имя пути> - основной путь, по которому ходит NPC
path_look = <имя пути> - путь, куда смотрит NPC
team = <имя_команды> - команда для синхронизации
def_state_moving1 = <название_анимации> - состояние, в котором NPC движется к первой точке пути, если она близко (patrol по умолчанию)
def_state_moving2 = <название_анимации> - состояние, в котором NPC движется к первой точке пути, если она не слишком далеко (rush по умолчанию)
def_state_moving3 = <название_анимации> - состояние, в котором NPC движется к первой точке пути, если она далеко (sprint по умолчанию)
def_state_standing = <название_анимации> - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.
В точках path_walk, которым соответствуют точки пути path_look (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.
[walker@pri_followers_leader_wave1_wait] path_walk = wave1_leader_walk2 path_look = wave1_leader_look2 def_state_moving1 = assault def_state_moving2 = assault team = followers
Файл: gamedata\scripts\xr_walker.script
3.2.2. Схема remark
Схема используется для синхронизации\связки других схем.
Примечание: не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.
[remark]
snd_anim_synс = true/false - по умолчанию false. Указывает на то необходимо ли синхронизировать звук с анимацией.
snd = <название_звуковой темы> - звук ремарка, берётся из файла sound_theme.script. По умолчанию nil.
anim = <название_анимации> - анимация ремарка, по умолчанию wait.
target = <параметр> - куда смотрит сталкер. Есть следующие варианты:
- story_id – числовое значение;
- actor – без комментариев;
- nil – позиция вычисленная АИ автоматически;
- <имя работы>,<имя гулага> - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).
- story_id – числовое значение;
- Пример:
target = logic@cit_killers_base_guard, cit_killers
- <path_name>,<point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>,<имя точки>).
- <path_name>,<point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>,<имя точки>).
- Пример:
target = cit_killers_kamp5,0
- Примечание: теперь если значение не задано, то оно равно nil а не actor, как было раньше. То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение nil, то персонаж развернется в позицию, которую посчитает АИ.
Стандартные сигналы remarkа для параметра переключения схемы on_signal:
- sound_end – по окончании проигрывания звуковой схемы
- anim_end – по окончании проигрывания анимации
- action_end – по окончании проигрывания и того и другого, если они синхронизированы
- sound_end – по окончании проигрывания звуковой схемы
[remark@esc_lager_volk2] anim = guard_rac snd = esc_wolf_radio target = actor on_signal = sound_end| remark@esc_lager_volk3
Файл: gamedata\scripts\xr_remark.script
3.2.3. Схема sleeper
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.
[sleeper]
path_main = <имя пути> - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.
wakeable = true/false – может ли проснуться быстро (если true, то спит на корточках и во сне бормочет).
Примечание: Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).
[sleeper@esc_blockpost_sleep1] path_main = sleep1 wakeable = false
Файл: gamedata\scripts\xr_sleeper.script
3.2.4. Схема kamp
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.
[kamp]
center_point = kamp_center – имя точки вокруг которой NPC будет устраиваться.
radius = 2 - насколько далеко сталкер будет сидеть от центра лагеря, 2- по умолчанию.
def_state_moving = run - дефолтное состояние, в котором NPC будет идети к точке кампа.
Примечание: Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит. Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой <path_kamp_name>_task
path_walk = <kamp_center>_task
Если точка кемпа расположена в чистом поле то, path_walk прописывать необязательно.
[kamp@esc_blockpost_kamp1] center_point = kamp path_walk = kamp_task def_state_moving = raid
Файл: gamedata\scripts\xr_kamp.script
3.2.5. Схема camper
Свойства кемперов:
- кемпер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;
- кемперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кемпера;
- В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;
- кемперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.
[camper]
path_walk = path_walk - путь по которому ходит NPC.
path_look = path_look - путь, куда смотрит NPC.
radius = number – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию этот радиус равен 20 метрам.
no_retreat = true/false - NPC при виде врага не будет ломиться на ближайшую точку path_walk, а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите кемперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.
def_state_moving = <название_анимации> - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию assault.
def_state_moving_fire = <название_анимации> - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути. По умолчанию sneak_fire.
def_state_campering = <название_анимации> - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию hide.
def_state_campering_fire = <название_анимации> - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию hide_fire.
attack_sound = <имя_звуковой_темы> - возможность переопределять снайперам/кемперам звук атаки. По дефолту он равен звуковой теме fight_attack. Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение false.
shoot = <тип_стрельбы> - возможны следующие значения:
- always - значение по умолчанию, стреляет всегда, когда можно;
- none - не стреляет вообще;
- terminal - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.
- always - значение по умолчанию, стреляет всегда, когда можно;
Примечание: У кемпера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела), то он тупо продолжает стоять на старом месте и ждать следующей пули.
Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кемпера. Используйте walker в таких случаях, а кемперов стоить ставить для атак по путям и как снайперов.
[camper@dar_military_scout_hide] path_walk = walk_hide path_look = look_hide radius = 10 no_retreat = true def_state_moving = assault def_state_campering = hide_na shoot = always
Файл: gamedata\scripts\xr_camper.script
3.2.5.1. Схема sniper
Разновидность кемпера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.
Примечание: Ставить снайперу только 2 точки look.
sniper = trueПример:
[camper@esc_blockpost_camper_day] path_walk = camper_day_walk path_look = camper_day_look sniper = true def_state_campering = threat
Файл: gamedata\scripts\xr_camper.script
3.2.6. Схема follower
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме run, если свыше 20 – догоняет в режиме sprint.
Пути не задаются.
[follower]
leader = number - story_id лидера из game.ltx (число!).
formation_line = true/false - постарается идти сбоку от лидера, в противном случае будет идти сзади.
distance = number - расстояние в метрах, на котором будет идти от лидера attendant. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.
state_if_leader_in_meet = <название_анимации> - это есть строка с именем состояния из state_manager, которое будет назначено follower-ам, если командир пребывает в состоянии meet.
anim_walk = <название_анимации> - состояние, в котором фолловер идет за лидером.
anim_run = <название_анимации> - состояние, в котором фолловер бежит за лидером.
anim_sprint = <название_анимации> - состояние, в котором фолловер спринтует за лидером.
[smart_terrains] none = trueИначе NPC засосёт в гулаг и никуда он не пойдёт.
Если все это происходит под гулагом, то вместо story_id лидера, мы прописываем его секцию логики в файле скрипта.
t = { section = "logic@bar_arena_follower_2", idle = 0, prior = 7, state = {0}, squad = squad, group = groups[0], ... }В данном случае для параметра leader необоходимо указать строку bar_arena_follower_2.
Примечание: в релизе игры данная схема не используется.
Файл: gamedata\scripts\xr_attendant.script
3.2.7. Схема zoneguard
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.
[zoneguard]
path_walk = <имя_пути> - путь перемещения.
path_look = <имя_пути> - путь обзора.
team = <имя_команды> - имя команды синхронизированных zoneguard-ов (из всей команды только 1 будет реагировать на игрока).
zone_guard = <имя_зоны> - зона в пределах которой игрок будет атакован.
zone_warn = <имя_зоны> - зона в пределах которой NPC будет начинать разговор с игроком.
walker_team = <имя_команды> - для схемы перемещения его в состоянии walker (если не задан, используется значение из поля team).
no_move = true/false - персонаж окликнет игрока с места и не будет подбегать к нему.
snd_greet = <название_звуковой_темы> - звук которой будет проигран при обнаружении игрока.
ignore_friends = true/false - будет игнорировать дружественных ему персонажей.
ignore_cond = {+info -info =func !func ~number} - условия, при которых NPC игнорирует игрока.
no_danger = true/false - отыгрывать или нет угрожающую анимацию будучи нейтралом.
anim = <название_анимации> - какую отыгрывает анимацию, если игрок ему не враждебен.
snd_anim_sync = true/false - будет ли синхронизирован звук с анимацией.
[zoneguard] path_walk = mil_freedom_zoneguard_walk_kill2 path_look = mil_freedom_zoneguard_look_kill2 zone_warn = mil_freedom_leader_warn_zone zone_guard = mil_freedom_leader_kill_zone no_move = true team = freedom_bodyguards3
Файл: gamedata\scripts\xr_zoneguard.script
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 = задает изначальный режим перемещения, по умолчанию patrol. Вообще, значение этого поля есть название ходячей анимации из state_mgr_lib</code>
formation - описывет способ построения и не является обязательным. Возможны следующие варианты: back - мужики идут чуть позади командира в два ряда (по умолчанию) line - шеренга around - вокруг командира
При остановке командора в 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
400 – это 202 . Примечание – мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:
[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(pасстояние в метрах) – универсальная функция для combat_ignore, проверка расстояния для игрока
fighting_actor -- текущий враг актёр?
check_fighting -- проверка (по story_id) того, что нашим врагом есть хотя бы кто-то один из списка
Файл: \gamedata\scripts\xr_combat_ignore.script