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