Настройка логики. Часть 1 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
ColR iT (обсуждение | вклад) (→3.2.5. Схема camper) |
(→Схема sniper) |
||
(не показаны 60 промежуточные версии 7 участников) | |||
Строка 2: | Строка 2: | ||
− | =Настройки логики | + | <center><font size=6>Настройки логики</font></center> |
− | = | + | =Система флагов (path_walk, path_look)= |
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем "'''''wp00'''''":<br> | В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем "'''''wp00'''''":<br> | ||
'''''wp00|flag1|flag2'''''<br> | '''''wp00|flag1|flag2'''''<br> | ||
Строка 16: | Строка 16: | ||
:Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.<br> | :Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.<br> | ||
*'''sig=name'''<br> | *'''sig=name'''<br> | ||
− | :Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля | + | :Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути *'''''path_look'''''.<br> |
Строка 37: | Строка 37: | ||
:<ini>on_signal = pressed | другая_схема</ini> | :<ini>on_signal = pressed | другая_схема</ini> | ||
− | == | + | ==Более подробное описание путей.== |
Настройка:<br> | Настройка:<br> | ||
Строка 115: | Строка 115: | ||
Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет с оружием наизготовку и т.д. <br> | Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет с оружием наизготовку и т.д. <br> | ||
− | '''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»! | + | '''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»! |
− | -- | + | ==Система флагов для монстров== |
+ | Флаги пути движения:<br> | ||
+ | '''''s=имя_звуковой_темы'''''<br> | ||
+ | :Устанавливает звуковую тему на пути в данную точку ('''''idle''''', '''''eat''''', '''''attack''''', '''''attack_hit''''', '''''take_damage''''', '''''die''''', '''''threaten''''', '''''steal''''', '''''panic''''', '''''growling''''').<br> | ||
+ | '''''с'''''<br> | ||
+ | :Устанавливает положение ходьбы вприсядку.<br> | ||
+ | '''''r'''''<br> | ||
+ | :Устанавливает положение ходьбы бег.<br> | ||
+ | '''''sig=name'''''<br> | ||
+ | :Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы.<br> | ||
+ | '''''b=vis/invis'''''<br> | ||
+ | :Флаг, исключительно для кровососа. Управляет невидимостью ('''''vis''''' - отключена, '''''invis''''' - включена). | ||
+ | |||
+ | Флаги пути обзора:<br> | ||
+ | '''''t=msec'''''<br> | ||
+ | :Время в миллисекундах, которое нужно ждать, смотря в точку.<br> | ||
+ | '''''a=state'''''<br> | ||
+ | :Анимация ('''''stand_idle''''', '''''sit_idle''''', '''''lie_idle''''', '''''eat''''', '''''sleep''''', '''''rest''''', '''''attack''''', '''''look_around''''', '''''turn''''').<br> | ||
− | + | ==Случайный выбор пути== | |
По поводу точек пути '''''path_walk'''''.<br> | По поводу точек пути '''''path_walk'''''.<br> | ||
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.<br> | Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.<br> | ||
Строка 132: | Строка 149: | ||
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:<br><ini>p1:links = p2(0.75), p3(0.25)</ini>то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще. | Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:<br><ini>p1:links = p2(0.75), p3(0.25)</ini>то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще. | ||
− | = | + | =Схемы поведения сталкеров.= |
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.<br> | Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.<br> | ||
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.<br> | В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.<br> | ||
− | == | + | ==Схема walker== |
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. <br> | Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. <br> | ||
'''[walker]'''<br> | '''[walker]'''<br> | ||
− | '''''path_walk = < | + | '''''path_walk = <имя_пути>''''' - основной путь, по которому ходит NPC<br> |
− | '''''path_look = < | + | '''''path_look = <имя_пути>''''' - путь, куда смотрит NPC<br> |
'''''team = <имя_команды>''''' - команда для синхронизации<br> | '''''team = <имя_команды>''''' - команда для синхронизации<br> | ||
'''''def_state_moving1 = <название_анимации>''''' - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)<br> | '''''def_state_moving1 = <название_анимации>''''' - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)<br> | ||
Строка 150: | Строка 167: | ||
В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.<br> | В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.<br> | ||
− | + | '''''Пример использования схемы''''':<br><ini>[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</ini> | ||
− | == | + | Файл: ''gamedata\scripts\xr_walker.script'' |
+ | |||
+ | ==Схема remark== | ||
Схема используется для синхронизации\связки других схем.<br> | Схема используется для синхронизации\связки других схем.<br> | ||
+ | |||
'''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC. | '''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC. | ||
'''[remark]'''<br> | '''[remark]'''<br> | ||
'''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.<br> | '''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.<br> | ||
− | '''''snd = < | + | '''''snd = <название_звуковой_темы>''''' - звук ремарка, берётся из файла ''sound_theme.script''. По умолчанию '''''nil'''''.<br> |
'''''anim = <название_анимации>''''' - анимация ремарка, по умолчанию '''''wait'''''.<br> | '''''anim = <название_анимации>''''' - анимация ремарка, по умолчанию '''''wait'''''.<br> | ||
'''''target = <параметр>''''' - куда смотрит сталкер. Есть следующие варианты:<br> | '''''target = <параметр>''''' - куда смотрит сталкер. Есть следующие варианты:<br> | ||
− | :*'''''story_id''''' – числовое значение<nowiki>;</nowiki><br> | + | :*'''''story_id''''' – числовое значение в ТЧ и ЧН или строковое, с указанием дополнительного параметра и самого SID, в ЗП, в примере ниже указана часть логики монолитовца-проповедника в Припяти, когда тот стреляет в Айса<nowiki>;</nowiki><br> |
+ | :Пример (ЗП):<br> | ||
+ | :<ini>target = story | pri_a17_military_sergeant_morozov</ini> | ||
:*'''''actor''''' – без комментариев<nowiki>;</nowiki><br> | :*'''''actor''''' – без комментариев<nowiki>;</nowiki><br> | ||
:*'''''nil''''' – позиция вычисленная АИ автоматически<nowiki>;</nowiki><br> | :*'''''nil''''' – позиция вычисленная АИ автоматически<nowiki>;</nowiki><br> | ||
Строка 170: | Строка 197: | ||
:Пример:<br> | :Пример:<br> | ||
:<ini>target = cit_killers_kamp5,0</ini> | :<ini>target = cit_killers_kamp5,0</ini> | ||
− | + | ||
+ | |||
+ | '''''Примечание''''': теперь если значение не задано, то оно равно '''''nil''''' а не '''''actor''''', как было раньше.<br> | ||
+ | :То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение '''''nil''''', то персонаж развернется в позицию, которую посчитает АИ.<br> | ||
Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': <br> | Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': <br> | ||
− | '''''sound_end''''' – по окончании проигрывания звуковой схемы<br> | + | :*'''''sound_end''''' – по окончании проигрывания звуковой схемы<br> |
− | '''''anim_end''''' – по окончании проигрывания анимации<br> | + | :*'''''anim_end''''' – по окончании проигрывания анимации<br> |
− | '''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы<br> | + | :*'''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы<br> |
− | + | '''''Пример использования схемы''''':<br><ini>[remark@esc_lager_volk2] | |
− | <ini>[remark] | + | anim = guard_rac |
− | anim = | + | snd = esc_wolf_radio |
− | snd = | + | target = actor |
− | + | on_signal = sound_end| remark@esc_lager_volk3</ini> | |
− | on_signal = | + | |
− | == | + | Файл: ''gamedata\scripts\xr_remark.script'' |
+ | |||
+ | ==Схема sleeper== | ||
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.<br> | Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.<br> | ||
'''[sleeper]'''<br> | '''[sleeper]'''<br> | ||
− | '''''path_main = < | + | '''''path_main = <имя_пути>''''' - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.<br> |
'''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).<br> | '''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).<br> | ||
+ | |||
'''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).<br> | '''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).<br> | ||
+ | |||
+ | '''''Пример использования схемы''''':<br><ini>[sleeper@esc_blockpost_sleep1] | ||
+ | path_main = sleep1 | ||
+ | wakeable = false</ini> | ||
Файл: ''gamedata\scripts\xr_sleeper.script'' | Файл: ''gamedata\scripts\xr_sleeper.script'' | ||
− | == | + | ==Схема kamp== |
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.<br> | Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.<br> | ||
'''[kamp]'''<br> | '''[kamp]'''<br> | ||
− | '''''center_point = | + | '''''center_point = <имя_пути>''''' – имя точки вокруг которой NPC будет устраиваться.<br> |
− | '''''radius = | + | '''''radius = <number>''''' - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.<br> |
− | '''''def_state_moving = | + | '''''def_state_moving = <название_анимации>''''' - дефолтное состояние, в котором NPC будет идти к точке кампа. По умолчанию - '''''walk'''''<br> |
− | |||
− | |||
− | Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.<br> | + | '''''Примечание''''': Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажутся внутри костра, где и получат хит.<br> |
+ | :Чтобы этого не случалось в секции кемпа указывать '''''path_walk''''' из одной точке, название которой '''''<path_kamp_name>_task''''':<ini>path_walk = <имя_пути>_task</ini>Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.<br> | ||
+ | |||
+ | '''''Пример использования схемы''''':<br><ini>[kamp@esc_blockpost_kamp1] | ||
+ | center_point = kamp_center | ||
+ | path_walk = kamp_center_task | ||
+ | def_state_moving = raid</ini> | ||
Файл: ''gamedata\scripts\xr_kamp.script'' | Файл: ''gamedata\scripts\xr_kamp.script'' | ||
− | == | + | ==Схема camper== |
− | Свойства | + | Свойства камперов: |
− | * | + | * кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;<br> |
− | * | + | * камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;<br> |
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;<br> | * В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;<br> | ||
− | * | + | * камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.<br> |
'''[camper]'''<br> | '''[camper]'''<br> | ||
− | '''''path_walk = | + | '''''path_walk = <имя_пути>''''' - путь по которому ходит NPC.<br> |
− | '''''path_look = | + | '''''path_look = <имя_пути>''''' - точки в которые смотрит NPC.<br> |
− | '''''radius = number''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию | + | '''''radius = <number>''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию - 20 метров.<br> |
− | '''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания. Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите | + | '''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания. |
− | '''''def_state_moving = <название_анимации>''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию '''''assault'''''.<br> | + | :Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите камперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.<br> |
− | '''''def_state_moving_fire = <название_анимации>''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути. По умолчанию '''''sneak_fire'''''.<br> | + | '''''def_state_moving = <название_анимации>''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию - '''''assault'''''.<br> |
− | '''''def_state_campering = <название_анимации>''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию '''''hide'''''.<br> | + | '''''def_state_moving_fire = <название_анимации>''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути. |
+ | :По умолчанию - '''''sneak_fire'''''.<br> | ||
+ | '''''def_state_campering = <название_анимации>''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию - '''''hide'''''.<br> | ||
'''''def_state_campering_fire = <название_анимации>''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.<br> | '''''def_state_campering_fire = <название_анимации>''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.<br> | ||
− | '''''attack_sound = <имя_звуковой_темы>''''' - возможность переопределять снайперам/ | + | '''''attack_sound = <имя_звуковой_темы>''''' - возможность переопределять снайперам/камперам звук атаки. По дефолту он равен звуковой теме '''''fight_attack'''''. |
+ | :Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение '''''false'''''.<br> | ||
'''''shoot = <тип_стрельбы>''''' - возможны следующие значения: | '''''shoot = <тип_стрельбы>''''' - возможны следующие значения: | ||
:*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;<br> | :*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;<br> | ||
:*'''''none''''' - не стреляет вообще;<br> | :*'''''none''''' - не стреляет вообще;<br> | ||
:*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.<br> | :*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.<br> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''''Примечание''''': У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),<br> | |
− | + | :то он тупо продолжает стоять на старом месте и ждать следующей пули.<br> | |
+ | :Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или сталкеры смогут атаковать поставленного кампера. Используйте '''''walker''''' в таких случаях, а камперов стоить ставить для атак по путям и как снайперов.<br> | ||
+ | '''''Пример использования схемы''''':<br><ini>[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</ini> | ||
− | Файл: | + | Файл: ''gamedata\scripts\xr_camper.script'' |
− | == | + | ==Схема sniper== |
− | + | Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд. | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | В кастом дате кемпера прописать:<br><ini>sniper = true</ini> | |
+ | Пример:<br><ini>[camper@esc_blockpost_camper_day] | ||
+ | path_walk = camper_day_walk | ||
+ | path_look = camper_day_look | ||
+ | sniper = true | ||
+ | def_state_campering = threat</ini> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''''Примечание''''': Ставить снайперу только 2 точки '''''look'''''.<br> | |
− | + | ||
− | + | Файл: ''gamedata\scripts\xr_camper.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | Файл: | + | |
− | == | + | ==Схема follower== |
+ | NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.<br> | ||
+ | <u>Пути не задаются</u>.<br> | ||
− | [ | + | '''[follower]'''<br> |
− | + | '''''leader = <number>''''' - '''''story_id''''' лидера из ''game.ltx'' (число!).<br> | |
+ | '''''formation_line = true/false''''' - постарается идти сбоку от лидера, в противном случае будет идти сзади.<br> | ||
+ | '''''distance = <number>''''' - расстояние в метрах, на котором будет идти от лидера '''''attendant'''''. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.<br> | ||
+ | '''''state_if_leader_in_meet = <название_анимации>''''' - это есть строка с именем состояния из '''''state_manager''''', которое будет назначено '''''follower'''''-ам, если командир пребывает в состоянии '''''meet'''''.<br> | ||
+ | '''''anim_walk = <название_анимации>''''' - состояние, в котором фолловер идет за лидером.<br> | ||
+ | '''''anim_run = <название_анимации>''''' - состояние, в котором фолловер бежит за лидером.<br> | ||
+ | '''''anim_sprint = <название_анимации>''''' - состояние, в котором фолловер спринтует за лидером.<br> | ||
− | |||
− | |||
− | + | '''''Примечание''''': Не забыть прописать: | |
− | + | <ini>[smart_terrains] | |
− | + | none = true</ini> | |
− | + | :Иначе NPC засосёт в гулаг и никуда он не пойдёт.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Если все это происходит под гулагом, то вместо '''''story_id''''' лидера, мы прописываем его секцию логики в файле скрипта.<br> | |
− | + | Пример:<lua>t = { section = "logic@bar_arena_follower_2", | |
− | + | idle = 0, | |
− | + | prior = 7, | |
− | + | state = {0}, | |
− | + | squad = squad, | |
− | + | group = groups[0], | |
− | + | ... | |
+ | }</lua>В данном случае для параметра '''''leader''''' необоходимо указать строку '''''bar_arena_follower_2'''''.<br> | ||
− | + | '''''Примечание''''': в релизе игры данная схема не используется.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Файл: ''gamedata\scripts\xr_attendant.script'' | |
− | + | ==Схема zoneguard== | |
− | + | У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''[zoneguard]'''<br> | |
− | + | '''''path_walk = <имя_пути>''''' - путь перемещения.<br> | |
+ | '''''path_look = <имя_пути>''''' - путь обзора.<br> | ||
+ | '''''team = <имя_команды>''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).<br> | ||
+ | '''''zone_guard = <имя_зоны>''''' - зона в пределах которой игрок будет атакован.<br> | ||
+ | '''''zone_warn = <имя_зоны>''''' - зона в пределах которой NPC будет начинать разговор с игроком.<br> | ||
+ | '''''walker_team = <имя_команды>''''' - для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').<br> | ||
+ | '''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.<br> | ||
+ | '''''snd_greet = <название_звуковой_темы>''''' - звук которой будет проигран при обнаружении игрока.<br> | ||
+ | '''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.<br> | ||
+ | '''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.<br> | ||
+ | '''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.<br> | ||
+ | '''''anim = <название_анимации>''''' - какую отыгрывает анимацию, если игрок ему не враждебен.<br> | ||
+ | '''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.<br> | ||
− | |||
− | == | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | Файл: ''gamedata\scripts\xr_zoneguard.script'' | |
− | + | ||
− | + | ==Схема wounded== | |
− | + | Схема раненного. Определяет поведение NPC в состоянии "раненный".<br> | |
− | + | '''''Примечание''''': не рекомендуется задавать схему в качестве активной. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''[wounded]'''<br> | |
+ | '''''hp_state = <HP>|<название_анимации>@<название_звуковой_темы>''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он не видит игрока.<br> | ||
+ | '''''hp_state_see = <HP>|<название_анимации>@<название_звуковой_темы>''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он видит игрока.<br> | ||
+ | '''''psy_state = <PSY>|<название_анимации>@<название_звуковой_темы>''''' - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному '''''PSY'''''.<br> | ||
+ | '''''hp_victim = <HP>|<параметр>''''' - куда будет смотреть NPC при значении уровня его здоровья равному '''''HP''''', возможные параметры:<br> | ||
+ | :*'''''story_id''''' - числовое значение; | ||
+ | :*'''''actor''''' - без комментариев; | ||
+ | :*'''''nil''''' - позиция вычисленная АИ автоматически. | ||
+ | '''''hp_cover = <HP>|true/false''''' - идти в укрытие или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.<br> | ||
+ | '''''hp_fight = <HP>|true/false''''' - разрешено воевать или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.<br> | ||
+ | '''''syndata = <название_анимации>@<название_звуковой_темы>''''' - синхропары для красоты.<br> | ||
+ | '''''help_dialog = <название_диалога>''''' - возможность установить диалог, вместо стандартного '''''actor_help_wounded'''''.<br> | ||
+ | '''''help_start_dialog = <название_диалога>''''' - возможность установить стартовый диалог.<br> | ||
− | |||
− | |||
− | + | '''''Примечание''''': желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:<br> | |
− | + | :<xml><precondition>dialogs.allow_wounded_dialog</precondition></xml> | |
− | + | '''''Примечание''''': если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:<br> | |
− | + | :<ini>hp_state= 30|help_me@help|10|wounded_heavy@help_heavy</ini> | |
− | + | :Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно. | |
− | + | :Для параметров '''''hp_state_see''''', '''''psy_state''''', '''''hp_victim''''', '''''hp_cover''''', '''''hp_fight''''' способ такой же. | |
− | + | '''''Пример использования схемы <small>(в качестве примера взята дефолтная настройка)'''''</small>:<br><ini>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|psy_shoot,psy_pain@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 – проверка на то, что лучшее оружие NPC является пистолетом.</ini> | ||
− | + | Файл: ''gamedata\scripts\xr_wounded.script'' | |
− | + | ==Схема rest== | |
− | + | Чувак гуляет, хавает, спит.<br> | |
− | + | Нормально не работает, посему в релизе не используется.<br> | |
− | + | ||
− | + | ||
− | + | Файл: ''gamedata\scripts\xr_rest.script'' | |
− | + | ==Схема heli_hunter== | |
− | + | Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:<br> | |
− | + | В активную схему вставляется параметр:<ini>heli_hunter = {+info -info =func !func ~number}true/false</ini> | |
− | + | ||
− | + | ||
− | + | ||
− | = | + | Пример:<ini>[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 <br>%=bar_freedom_angry_actor% | |
+ | meet_talk_enabled = true | ||
+ | meet_dialog = bar_svoboda_dialog | ||
+ | heli_hunter = {-bar_ecolog_crush_heli_down} true</ini> | ||
− | + | Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.<br> | |
− | + | ||
− | + | ==Схема patrol== | |
+ | Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:<br> | ||
− | + | '''[patrol]'''<br> | |
− | + | '''''path_walk = <имя_пути>''''' - путь по которому ходит NPC.<br> | |
− | + | '''''path_look = <имя_пути>''''' - точки в которые смотрит NPC.<br> | |
− | + | '''''formation = <параметр>''''' - описывет способ построения и не является обязательным. Возможны следующие варианты:<br> | |
+ | :*'''''back''''' - мужики идут чуть позади командира в два ряда (по умолчанию);<br> | ||
+ | :*'''''line''''' - шеренга;<br> | ||
+ | :*'''''around''''' - вокруг командира.<br> | ||
+ | '''''commander = true/false''''' - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. '''''false''''' - по умолчанию.<br> | ||
+ | '''''move_type = <название_анимации>''''' - задает изначальный режим перемещения, по умолчанию '''''patrol'''''.<br> | ||
− | + | При остановке командора в '''''meet''''' мужики останавливаются.<br> | |
− | + | ||
− | + | ||
− | + | Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:<br> | |
− | + | <ini>ret=0...2</ini> | |
+ | :*0 - линия; | ||
+ | :*1 – вокруг старшего; | ||
+ | :*2 – по бокам. | ||
− | + | При движении командор работает как обычный '''''walker''''' и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано '''''a=assault''''', то командор помчится с орудием убийства на перевес, а остальные его откопируют.<br> | |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | '''''Примечание''''': что еще не сделано или глючит:<br> | ||
+ | :*нет возможности автоматически перестроить команду; | ||
+ | :*все идут молча; | ||
+ | :*командор пока не отдает команд; | ||
+ | :*не рекомендуется включать спринт. | ||
− | + | '''''Пример использования схемы''''':<ini>[patrol@val_escort_captive_wait] | |
+ | path_walk = captive_wait_walk | ||
+ | path_look = captive_wait_look | ||
+ | commander = true | ||
+ | formation = back</ini> | ||
− | + | Файл: ''gamedata\scripts\xr_patrol.script'' | |
− | + | ||
− | + | ||
− | + | ==Схема meet== | |
− | + | Схема позволяющая настроить ситуацию, когда НПС встречает актора. | |
− | + | '''[meet]'''<br> | |
− | + | '''''meet_state/meet_state_wpn = <number>|<название_анимации>@<название_звуковой_темы>''''' – задает анимацию и озвучку персонажа, | |
+ | :в зависимости от расстояния до актера равному '''''number'''''. Для ситуации, когда актор безоружен и вооружён соответственно.<br> | ||
+ | '''''victim/victim_wpn = <number>|<параметр>''''' - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное '''''number'''''. | ||
+ | :Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:<br> | ||
+ | ::*'''''actor''''' - смотреть на игрока;<br> | ||
+ | ::*'''''story_id''''' - смотреть на персонажа со указанным '''''story_id''''';<br> | ||
+ | ::*'''''nil''''' - никуда.<br> | ||
+ | '''''use/use_wpn = true/false/self''''' - настройки юзабельности персонажа. | ||
+ | :При установки значения '''''self''''' NPC сам юзнет игрока, как только сможет дотянуться.<br> | ||
+ | '''''zone = <имя_зоны>|<название_анимации>@<название_звуковой_темы>''''' - если актор будет замечен в указанном рестрикторе, | ||
+ | :то NPC будет отыгрывать заданную анимацию и произносить заданный звук.<br> | ||
+ | '''''meet_dialog = <название_диалога>''''' - возможность установить стартовый диалог NPC.<br> | ||
+ | '''''synpairs = <название_анимации>@<название_звуковой_темы>''''' - Если при каком-то наборе условий | ||
+ | :встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.<br> | ||
+ | '''''abuse = true/false''''' - по умолчанию '''''true''''', если '''''false''''', то неюзающийся противник не будет обижаться.<br> | ||
+ | '''''precond = usability/visibility'''''.<br> | ||
− | + | Любую строку можно задавать кондлистом ('''''{+info -info =func !func ~number}''''').<br> | |
− | + | ||
− | + | ||
− | + | Для облегчения настройки встречи сделана возможность упрощенного задания дефолта:<br><ini>[walker] | |
− | + | meet = default_meet</ini>Саму секцию '''''default_meet''''' задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:<br> | |
− | [ | + | <ini>[default_meet] |
− | + | meet_state = 30|hello@hail|20|wait@wait | |
− | + | meet_state_wpn = 30|backoff@threat_weap | |
− | + | victim = 30|actor | |
− | [ | + | victim_wpn = 30|actor |
− | + | use = true | |
− | + | use_wpn = false | |
− | + | syndata = hello@hail|backoff@threat_weap</ini> | |
− | + | ||
− | + | '''''Примечание''''': если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему '''''meet = no_meet'''''.<br> | |
− | + | ||
− | + | ||
− | |||
− | |||
− | + | Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.<br> | |
− | + | ||
− | + | ||
− | + | *'''Ситуация 1'''.<br> | |
− | + | Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.<br><ini>[meet] | |
− | + | meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait | |
+ | meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap | ||
+ | victim = 50| actor | ||
+ | victim_wpn = 50| actor | ||
+ | use = true< | ||
+ | use_wpn = false</ini> | ||
− | + | *'''Ситуация 2'''.<br> | |
− | + | Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.<br><ini>[meet] | |
− | + | meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info% | |
+ | meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait | ||
+ | victim = 50|actor | ||
+ | victim_wpn = 50|actor | ||
+ | use = {-info2} self, false | ||
+ | use_wpn = false</ini>Здесь:<br> | ||
+ | '''''info''''' – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;<br> | ||
+ | '''''info2''''' – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;<br> | ||
+ | '''''killactor''''' – функция в ''xr_effects.script'' которая обижает NPC на игрока.<br> | ||
− | + | *'''Ситуация 3'''.<br> | |
− | + | Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.<br><ini>[camper] | |
+ | path_walk = path_walk | ||
+ | path_look = path_look | ||
+ | meet = meet | ||
− | + | [meet] | |
+ | meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back | ||
+ | meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back | ||
+ | victim = 30|actor | ||
+ | victim_wpn = 30|actor | ||
+ | use = true | ||
+ | use_wpn = true | ||
+ | zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse | ||
+ | meet_dialog = {+info} dialog1, dialog2</ini>Здесь:<br> | ||
+ | '''''true''''' – вместо анимации, атаковать игрока;<br> | ||
+ | '''''info''''' – инфопорция, которая говорит, что мы имеем допуск к лагерю;<br> | ||
+ | '''''warnzone''''' – рестриктор, в котором нас предупреждают;<br> | ||
+ | '''''kampzone''''' – рестриктор, в котором нас убивают;<br> | ||
+ | '''''dialog1''''' – стартовый диалог NPC, если мы имеем допуск в лагерь;<br> | ||
+ | '''''dialog2''''' – стартовый диалог NPC, если мы не имеем допуск в лагерь.<br> | ||
− | + | Файл: ''gamedata\scripts\xr_meet.script'' | |
− | + | ||
− | + | ||
− | + | ---- | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | |||
− | = | + | <font size = 5>[[Часть 2]]</font> |
[[Категория:A-Life]][[Категория:Скрипты]] | [[Категория:A-Life]][[Категория:Скрипты]] | ||
+ | правка дС (дядя Саша - вопросы сюда imgal@mail.ru) |
Текущая версия на 15:36, 16 сентября 2014
Содержание |
---|
Настройка логики. Часть 0 |
Система флагов (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 | другая_схема
Более подробное описание путей.
На карту для каждого 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 используются анимации ТОЛЬКО из раздела «Стоячие и сидячие состояния»!
Система флагов для монстров
Флаги пути движения:
s=имя_звуковой_темы
- Устанавливает звуковую тему на пути в данную точку (idle, eat, attack, attack_hit, take_damage, die, threaten, steal, panic, growling).
с
- Устанавливает положение ходьбы вприсядку.
r
- Устанавливает положение ходьбы бег.
sig=name
- Установить сигнал с именем name сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля on_signal логической схемы.
b=vis/invis
- Флаг, исключительно для кровососа. Управляет невидимостью (vis - отключена, invis - включена).
Флаги пути обзора:
t=msec
- Время в миллисекундах, которое нужно ждать, смотря в точку.
a=state
- Анимация (stand_idle, sit_idle, lie_idle, eat, sleep, rest, attack, look_around, turn).
Случайный выбор пути
По поводу точек пути 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 НПС будет ходить в три раза чаще.
Схемы поведения сталкеров.
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.
В файле gamedata\scripts\modules.script указаны все загружаемые схемы.
Схема 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
Схема remark
Схема используется для синхронизации\связки других схем.
Примечание: не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.
[remark]
snd_anim_synс = true/false - по умолчанию false. Указывает на то необходимо ли синхронизировать звук с анимацией.
snd = <название_звуковой_темы> - звук ремарка, берётся из файла sound_theme.script. По умолчанию nil.
anim = <название_анимации> - анимация ремарка, по умолчанию wait.
target = <параметр> - куда смотрит сталкер. Есть следующие варианты:
- story_id – числовое значение в ТЧ и ЧН или строковое, с указанием дополнительного параметра и самого SID, в ЗП, в примере ниже указана часть логики монолитовца-проповедника в Припяти, когда тот стреляет в Айса;
- story_id – числовое значение в ТЧ и ЧН или строковое, с указанием дополнительного параметра и самого SID, в ЗП, в примере ниже указана часть логики монолитовца-проповедника в Припяти, когда тот стреляет в Айса;
- Пример (ЗП):
target = story | pri_a17_military_sergeant_morozov
- actor – без комментариев;
- nil – позиция вычисленная АИ автоматически;
- <имя работы>,<имя гулага> - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).
- actor – без комментариев;
- Пример:
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
Схема 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
Схема kamp
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.
[kamp]
center_point = <имя_пути> – имя точки вокруг которой NPC будет устраиваться.
radius = <number> - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.
def_state_moving = <название_анимации> - дефолтное состояние, в котором NPC будет идти к точке кампа. По умолчанию - walk
Примечание: Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажутся внутри костра, где и получат хит.
- Чтобы этого не случалось в секции кемпа указывать path_walk из одной точке, название которой <path_kamp_name>_task:
path_walk = <имя_пути>_task
Если точка кемпа расположена в чистом поле то, path_walk прописывать необязательно.
[kamp@esc_blockpost_kamp1] center_point = kamp_center path_walk = kamp_center_task def_state_moving = raid
Файл: gamedata\scripts\xr_kamp.script
Схема camper
Свойства камперов:
- кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;
- камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;
- В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;
- камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.
[camper]
path_walk = <имя_пути> - путь по которому ходит NPC.
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
Схема sniper
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.
sniper = trueПример:
[camper@esc_blockpost_camper_day] path_walk = camper_day_walk path_look = camper_day_look sniper = true def_state_campering = threat
Примечание: Ставить снайперу только 2 точки look.
Файл: gamedata\scripts\xr_camper.script
Схема 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
Схема 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
Схема wounded
Схема раненного. Определяет поведение NPC в состоянии "раненный".
Примечание: не рекомендуется задавать схему в качестве активной.
[wounded]
hp_state = <HP>|<название_анимации>@<название_звуковой_темы> - поведение NPC при значении уровня его здоровья равному HP, когда он не видит игрока.
hp_state_see = <HP>|<название_анимации>@<название_звуковой_темы> - поведение NPC при значении уровня его здоровья равному HP, когда он видит игрока.
psy_state = <PSY>|<название_анимации>@<название_звуковой_темы> - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному PSY.
hp_victim = <HP>|<параметр> - куда будет смотреть NPC при значении уровня его здоровья равному HP, возможные параметры:
- story_id - числовое значение;
- actor - без комментариев;
- nil - позиция вычисленная АИ автоматически.
hp_cover = <HP>|true/false - идти в укрытие или нет, в зависимости от значения уровня здоровья равному HP.
hp_fight = <HP>|true/false - разрешено воевать или нет, в зависимости от значения уровня здоровья равному HP.
syndata = <название_анимации>@<название_звуковой_темы> - синхропары для красоты.
help_dialog = <название_диалога> - возможность установить диалог, вместо стандартного actor_help_wounded.
help_start_dialog = <название_диалога> - возможность установить стартовый диалог.
Примечание: желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:
<precondition>dialogs.allow_wounded_dialog</precondition>
Примечание: если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:
hp_state= 30|help_me@help|10|wounded_heavy@help_heavy
- Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно.
- Для параметров hp_state_see, psy_state, hp_victim, hp_cover, hp_fight способ такой же.
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|psy_shoot,psy_pain@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 – проверка на то, что лучшее оружие NPC является пистолетом.
Файл: gamedata\scripts\xr_wounded.script
Схема rest
Чувак гуляет, хавает, спит.
Нормально не работает, посему в релизе не используется.
Файл: gamedata\scripts\xr_rest.script
Схема heli_hunter
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:
heli_hunter = {+info -info =func !func ~number}true/falseПример:
[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 <br>%=bar_freedom_angry_actor% meet_talk_enabled = true meet_dialog = bar_svoboda_dialog heli_hunter = {-bar_ecolog_crush_heli_down} true
Если раньше оверрайд понимал только значения true либо false, то сейчас он понимает кондлист, который если возвращает true - то стрельба по вертолету в данной схеме разрешена.
Схема patrol
Итак, есть предварительная система патруля. Представляет собой вариацию kamp только в состоянии ходьбы. Для ее работы прописываем в custom_data следующее:
[patrol]
path_walk = <имя_пути> - путь по которому ходит NPC.
path_look = <имя_пути> - точки в которые смотрит NPC.
formation = <параметр> - описывет способ построения и не является обязательным. Возможны следующие варианты:
- back - мужики идут чуть позади командира в два ряда (по умолчанию);
- line - шеренга;
- around - вокруг командира.
- back - мужики идут чуть позади командира в два ряда (по умолчанию);
commander = true/false - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. false - по умолчанию.
move_type = <название_анимации> - задает изначальный режим перемещения, по умолчанию patrol.
При остановке командора в meet мужики останавливаются.
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:
ret=0...2
- 0 - линия;
- 1 – вокруг старшего;
- 2 – по бокам.
При движении командор работает как обычный walker и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано a=assault, то командор помчится с орудием убийства на перевес, а остальные его откопируют.
Примечание: что еще не сделано или глючит:
- нет возможности автоматически перестроить команду;
- все идут молча;
- командор пока не отдает команд;
- не рекомендуется включать спринт.
[patrol@val_escort_captive_wait] path_walk = captive_wait_walk path_look = captive_wait_look commander = true formation = back
Файл: gamedata\scripts\xr_patrol.script
Схема meet
Схема позволяющая настроить ситуацию, когда НПС встречает актора.
[meet]
meet_state/meet_state_wpn = <number>|<название_анимации>@<название_звуковой_темы> – задает анимацию и озвучку персонажа,
- в зависимости от расстояния до актера равному number. Для ситуации, когда актор безоружен и вооружён соответственно.
victim/victim_wpn = <number>|<параметр> - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное number.
- Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:
- actor - смотреть на игрока;
- story_id - смотреть на персонажа со указанным story_id;
- nil - никуда.
- actor - смотреть на игрока;
use/use_wpn = true/false/self - настройки юзабельности персонажа.
- При установки значения self NPC сам юзнет игрока, как только сможет дотянуться.
zone = <имя_зоны>|<название_анимации>@<название_звуковой_темы> - если актор будет замечен в указанном рестрикторе,
- то NPC будет отыгрывать заданную анимацию и произносить заданный звук.
meet_dialog = <название_диалога> - возможность установить стартовый диалог NPC.
synpairs = <название_анимации>@<название_звуковой_темы> - Если при каком-то наборе условий
- встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.
abuse = true/false - по умолчанию true, если false, то неюзающийся противник не будет обижаться.
precond = usability/visibility.
Любую строку можно задавать кондлистом ({+info -info =func !func ~number}).
[walker] meet = default_meetСаму секцию default_meet задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:
[default_meet] meet_state = 30|hello@hail|20|wait@wait meet_state_wpn = 30|backoff@threat_weap victim = 30|actor victim_wpn = 30|actor use = true use_wpn = false syndata = hello@hail|backoff@threat_weap
Примечание: если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему meet = no_meet.
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.
- Ситуация 1.
[meet] meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap victim = 50| actor victim_wpn = 50| actor use = true< use_wpn = false
- Ситуация 2.
[meet] meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info% meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait victim = 50|actor victim_wpn = 50|actor use = {-info2} self, false use_wpn = falseЗдесь:
info – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;
info2 – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;
killactor – функция в xr_effects.script которая обижает NPC на игрока.
- Ситуация 3.
[camper] path_walk = path_walk path_look = path_look meet = meet [meet] meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back victim = 30|actor victim_wpn = 30|actor use = true use_wpn = true zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse meet_dialog = {+info} dialog1, dialog2Здесь:
true – вместо анимации, атаковать игрока;
info – инфопорция, которая говорит, что мы имеем допуск к лагерю;
warnzone – рестриктор, в котором нас предупреждают;
kampzone – рестриктор, в котором нас убивают;
dialog1 – стартовый диалог NPC, если мы имеем допуск в лагерь;
dialog2 – стартовый диалог NPC, если мы не имеем допуск в лагерь.
Файл: gamedata\scripts\xr_meet.script
Часть 2
правка дС (дядя Саша - вопросы сюда imgal@mail.ru)