Настройка логики. Часть 1 — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Настройка логики. Часть 1 — различия между версиями

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

Перейти к: навигация, поиск
(Часть 2)
(Настройки логики)
Строка 2: Строка 2:
  
  
=Настройки логики=
+
<center><font size=6>Настройки логики</font></center>
  
==3.1. Система флагов (path_walk, path_look)==
+
=Система флагов (path_walk, path_look)=
 
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем "'''''wp00'''''":<br>
 
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем "'''''wp00'''''":<br>
 
'''''wp00|flag1|flag2'''''<br>
 
'''''wp00|flag1|flag2'''''<br>
Строка 37: Строка 37:
 
:<ini>on_signal = pressed | другая_схема</ini>
 
:<ini>on_signal = pressed | другая_схема</ini>
  
==3.1.1. Более подробное описание путей. ==
+
==Более подробное описание путей.==
  
 
Настройка:<br>
 
Настройка:<br>
Строка 119: Строка 119:
 
----
 
----
  
===Случайный выбор пути===
+
==Случайный выбор пути==
 
По поводу точек пути '''''path_walk'''''.<br>
 
По поводу точек пути '''''path_walk'''''.<br>
 
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.<br>
 
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.<br>
Строка 132: Строка 132:
 
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 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''''' НПС будет ходить в три раза чаще.
  
==3.2. Схемы поведения сталкеров.==
+
=Схемы поведения сталкеров.=
 
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.<br>
 
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.<br>
 
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.<br>
 
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.<br>
  
==3.2.1. Схема walker==
+
==Схема walker==
 
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. <br>
 
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. <br>
  
Строка 159: Строка 159:
 
Файл: ''gamedata\scripts\xr_walker.script''
 
Файл: ''gamedata\scripts\xr_walker.script''
  
==3.2.2. Схема remark==
+
==Схема remark==
 
Схема используется для синхронизации\связки других схем.<br>
 
Схема используется для синхронизации\связки других схем.<br>
  
Строка 197: Строка 197:
 
Файл: ''gamedata\scripts\xr_remark.script''
 
Файл: ''gamedata\scripts\xr_remark.script''
  
==3.2.3. Схема sleeper==
+
==Схема sleeper==
 
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.<br>
 
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.<br>
  
Строка 213: Строка 213:
 
Файл: ''gamedata\scripts\xr_sleeper.script''
 
Файл: ''gamedata\scripts\xr_sleeper.script''
  
==3.2.4. Схема kamp==
+
==Схема kamp==
 
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.<br>
 
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.<br>
 
 
Строка 232: Строка 232:
 
Файл: ''gamedata\scripts\xr_kamp.script''
 
Файл: ''gamedata\scripts\xr_kamp.script''
  
==3.2.5. Схема camper==
+
==Схема camper==
 
Свойства камперов:
 
Свойства камперов:
 
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;<br>
 
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;<br>
Строка 270: Строка 270:
 
Файл: ''gamedata\scripts\xr_camper.script''
 
Файл: ''gamedata\scripts\xr_camper.script''
  
==3.2.5.1. Схема sniper==
+
==Схема sniper==
 
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.<br>
 
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.<br>
  
Строка 285: Строка 285:
 
Файл: ''gamedata\scripts\xr_camper.script''
 
Файл: ''gamedata\scripts\xr_camper.script''
  
==3.2.6. Схема follower==  
+
==Схема follower==  
 
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.<br>
 
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.<br>
 
<u>Пути не задаются</u>.<br>
 
<u>Пути не задаются</u>.<br>
Строка 318: Строка 318:
 
Файл: ''gamedata\scripts\xr_attendant.script''
 
Файл: ''gamedata\scripts\xr_attendant.script''
  
==3.2.7. Схема zoneguard==
+
==Схема zoneguard==
 
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.<br>
 
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.<br>
  
Строка 347: Строка 347:
 
Файл: ''gamedata\scripts\xr_zoneguard.script''
 
Файл: ''gamedata\scripts\xr_zoneguard.script''
  
==3.2.8. Схема wounded==
+
==Схема wounded==
 
Схема раненного. Определяет поведение NPC в состоянии "раненный".<br>
 
Схема раненного. Определяет поведение NPC в состоянии "раненный".<br>
 
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.
 
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.
Строка 384: Строка 384:
 
Файл: ''gamedata\scripts\xr_wounded.script''
 
Файл: ''gamedata\scripts\xr_wounded.script''
  
==3.2.9. Схема rest==
+
==Схема rest==
 
Чувак гуляет, хавает, спит.<br>
 
Чувак гуляет, хавает, спит.<br>
 
Нормально не работает, посему в релизе не используется.<br>
 
Нормально не работает, посему в релизе не используется.<br>
Строка 390: Строка 390:
 
Файл: ''gamedata\scripts\xr_rest.script''
 
Файл: ''gamedata\scripts\xr_rest.script''
  
==3.2.10. Схема heli_hunter==
+
==Схема heli_hunter==
 
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:<br>
 
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:<br>
 
В активную схему вставляется параметр:<ini>heli_hunter = {+info -info =func !func ~number}true/false</ini>
 
В активную схему вставляется параметр:<ini>heli_hunter = {+info -info =func !func ~number}true/false</ini>
Строка 404: Строка 404:
 
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.<br>
 
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.<br>
  
==3.2.11. Patrol==
+
==Схема Patrol==
 
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:<br>
 
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:<br>
  
Строка 441: Строка 441:
  
 
Файл: ''gamedata\scripts\xr_patrol.script''
 
Файл: ''gamedata\scripts\xr_patrol.script''
 
==3.3. Секции.==
 
==3.3.1. Секция combat==
 
Показывает, что происходит, когда NPC срывается в бой.<br>
 
 
'''''on_combat = combat'''''<br>
 
 
'''[combat]'''<br>
 
'''''on_info =  {+info -info =func !func ~number}%+info -info =func%''''' -  эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.<br>
 
 
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр '''''combat_type'''''.<br>
 
 
В следующем примере сталкер сражается:<br>
 
:*по-камперски, если враг - актёр и он дальше Х метров;
 
:*по-монолитовски, если любой враг дальше Y метров;
 
:*иначе - движковый бой.
 
<ini>[logic]
 
active = walker
 
on_combat = combat
 
 
[walker]
 
path_walk = ...
 
 
[combat]
 
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, <br>{=fighting_ge_Y_meters} monolith</ini>
 
 
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.<br>
 
<lua>function fighting_dist_ge_20(actor, npc)
 
    return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) >= 400
 
end</lua>
 
'''''Примечание''''': 400 – это 20<sup>2</sup>. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.<br>
 
 
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:<br>
 
<ini>[logic]
 
active = nil
 
on_combat = combat
 
 
[combat]
 
combat_type = zombied</ini>
 
 
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом  '''''combat_type'''''.<br>
 
'''''Помните(!)''''': оверрайд всегда будет перекрывать настройку в секции '''''combat'''''. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:<br>
 
<ini>[logic]
 
active = walker1
 
on_combat = combat
 
 
[walker1]
 
...
 
[walker2]
 
...
 
[walker3]
 
...
 
combat_type = monolith
 
 
[combat]
 
combat_type = camper</ini>
 
 
В файле ''xr_effects.script'' есть функция отключающая секцию '''''combat''''' - '''''disable_combat_handler'''''<br>
 
 
Файл: ''gamedata\scripts\xr_combat.script''
 
 
==3.3.2 Секция death==
 
Схема показывает, что происходит при смерти NPC.<br>
 
 
'''''on_death = death'''''<br>
 
 
'''[death]'''<br>
 
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти NPC.<br>
 
 
'''''Пример использования секции''''':<ini>[logic]
 
...
 
on_death = death@mil_freedom_max_combat1
 
 
[death@mil_freedom_max_combat1]
 
on_info = %=military_max_dead +sar2_death_47%</ini>
 
 
Файл: ''gamedata\scripts\xr_death.script''
 
 
==3.3.3. Cекция hit==
 
Схема показывает, что происходит при нанесении повреждения NPC.<br>
 
 
'''''on_hit = hit'''''<br>
 
 
'''[hit]'''<br>
 
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если NPC нанесён хит.<br>
 
 
'''''on_hit''''' НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).<br>
 
 
'''''Пример использования секции''''':<ini>[logic]
 
...
 
on_hit = on_hit@agr_factory_hold_fake
 
 
[on_hit@agr_factory_hold_fake]
 
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%</ini>
 
 
Файл: ''gamedata\scripts\xr_hit.script''
 
 
==3.3.4. Секция actor_dialogs==
 
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.<br>
 
 
'''''actor_dialogs = actor_dialogs'''''<br>
 
 
'''[actor_dialogs]'''<br>
 
'''''id = <название_диалога>''''' - доступные диалоги, перечислять через запятую.<br>
 
'''''disable = <название_диалога>''''' - запрещенные диалоги, тоже через запятую.<br>
 
 
'''''Пример использования секции''''':<ini>[logic]
 
...
 
actor_dialogs = actor_dialogs
 
 
[actor_dialbr>
 
:*'''''story_id''''' – числовое значениеogs]
 
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end</ini>
 
 
Файл: ''gamedata\scripts\xr_meet.script''
 
 
==3.3.5. Секция use==
 
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.
 
 
'''''on_use = use'''''<br>
 
 
'''[use]'''<br>
 
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.<br>
 
 
Пример использования секции:<ini>[logic]
 
...
 
on_use = use@mil_dolg_leader
 
 
[use@mil_dolg_leader]
 
on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%</ini>
 
 
Файл: ''gamedata\scripts\xr_use.script''
 
 
==3.3.6. Секция combat_ignore==
 
Если для NPC установлена данная секция то он, не переходит в боевой режим.<br>
 
Для секции нет дополнительных полей.<br>
 
 
'''''combat_ignore = combat_ignore'''''
 
 
'''[combat_ignore]'''
 
 
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:<br>
 
 
'''[walker] '''<br>
 
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.<br>
 
 
Если для оверрайда задать значение '''''always''''', то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.<br>
 
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.<br>
 
 
В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:<br>
 
:*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20м;<br>
 
:*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;<br>
 
:*'''''fighting_actor''''' - текущий враг актёр?;<br>
 
:*'''''check_fighting''''' - проверка (по '''''story_id''''') того, что нашим врагом есть хотя бы кто-то один из списка.<br>
 
 
Пример использования секции:<br>
 
<ini>[logic]
 
...
 
combat_ignore = combat_ignore
 
 
[combat_ignore]</ini>
 
 
Файл: ''gamedata\scripts\xr_combat_ignore.script''
 
  
 
=[[Часть 2]]=
 
=[[Часть 2]]=
  
 
[[Категория:A-Life]][[Категория:Скрипты]]
 
[[Категория:A-Life]][[Категория:Скрипты]]

Версия 14:51, 1 мая 2012

Содержание

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


Настройки логики

Система флагов (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_callbackstate manager-ом. Соответственно, если t=0, то сигнал будет установлен после отыгрывания init анимации. Это используется, например, с анимацией press, которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.
В пути path_look можно сделать:
wp00|a=press|t=0|sigtm=pressed
А затем переключить схему:
on_signal = pressed | другая_схема

Более подробное описание путей.

Настройка:
Logic 1.JPG

На карту для каждого walker-а нужно поставить:

  1. Путь path_walk, по которому walker ходит.
  2. Путь path_look, состоящий из точек, в которые walker смотрит.

Walker-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.

Если персонаж должен стоять на месте, то ему задается одна точка пути path_walk и как минимум одна точка пути path_look, хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.

Правила расстановки флажков в путях рассмотрим на нескольких примерах:

Пример 1:

Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом:
Logic 2.JPG

Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути path_walk существуют флажки.
У каждого вейпоинта есть имя: wp00, wp01 и т.д.
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘|’. Пишеться a=anim, где anim – название анимации. Если мы напишем a=threat то персонаж пойдет в состоянии данжер, если a=raid то побежит с оружием наизготовку и т.д.

Примечание: В точках пути path_walk используются анимации ТОЛЬКО из раздела «Ходячие состояния»!

Пример 2:

Logic 3.JPG

Разговор персонажа.

Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существуют следующие поля:
s = имя_звуковой_схемы - (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.

Пример 3:

Logic 4.JPG

В примере 3 используется только поле s, чтобы задать тему разговора, и флажок sc, чтобы показать, что звук проигрывается не разово, а периодически.
Остальные параметры (sp, sf, st) задавать НЕ РЕКОМЕНДУЕТСЯ, значения по умолчанию приемлемы для большинства скриптов.
Параметр sa также использовать НЕ РЕКОМЕНДУЕТСЯ. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути path_look, о котором будет написано ниже.
Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь path_look.

Пример 4:

усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него:

Logic 5.JPG

Что добавилось в этом примере? Путь 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:

Logic 6.JPG

В этом примере проходя через точку wp00, персонаж с вероятностью 30% посмотрит в точку wp00 в течение 5 секунд, но с вероятностью 70% посмотрит в точку wp01 в течении 10 секунд.

По умолчанию при остановках персонаж играет анимацию idle, если он не в состоянии crouch, либо анимацию hide, если он в состоянии crouch.

Если требуется другая анимация, можно ее указать с помощью флажка:

a = имя_анимации - (по умолчанию idle).
Пишеться a=anim, где anim – название анимации. Если мы напишем a=hide, то персонаж сядет в состоянии данжер, если a=guard, то встанет с оружием наизготовку и т.д.

Примечание: В точках пути path_look используются анимации ТОЛЬКО из раздела «Стоячие и сидячие состояния»!


Случайный выбор пути

По поводу точек пути path_walk.
Есть ещё один интересный факт: следующую точку пути path_walk можно задавать рандомно.
Например:Random path.jpg

Нам требуется, чтобы НПС стоящий в точке p0 патрулировал территорию по двум цикличным маршрутам:
p0 -> p1 -> p2 -> p0
p0 -> p3 -> p4 -> p0

Чтобы задать вариацию выбора маршрута относительно точки p0, нужно в ссылке на следующую точку пути указать не одну, а две точки:
p0:links = p1(1), p3(1)
Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек p1 или p3. После возврата в точку p0 выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:
p0:links = p1(1), p3(1)
а в точке p1, также задать выбор:
p1:links = p2(1), p3(1)

НО! Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема НЕ ПРИЕМЛЕМА и, лично у меня, вызывает вылет:Error random path.jpg

Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 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 – числовое значение;
  • actor – без комментариев;
  • nil – позиция вычисленная АИ автоматически;
  • <имя работы>,<имя гулага> - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).
Пример:
target = logic@cit_killers_base_guard, cit_killers
  • <path_name>,<point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>,<имя точки>).
Пример:
target = cit_killers_kamp5,0


Примечание: теперь если значение не задано, то оно равно nil а не actor, как было раньше.

То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение nil, то персонаж развернется в позицию, которую посчитает АИ.


Стандартные сигналы remarkа для параметра переключения схемы on_signal:

  • sound_end – по окончании проигрывания звуковой схемы
  • anim_end – по окончании проигрывания анимации
  • action_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 = 2 - насколько далеко сталкер будет сидеть от центра лагеря, 2- по умолчанию.
def_state_moving = run - дефолтное состояние, в котором NPC будет идети к точке кампа.


Примечание: Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит.

Чтобы этого не случалось в секции кемпа указывать 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 - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.


Примечание: У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),

то он тупо продолжает стоять на старом месте и ждать следующей пули.
Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кампера. Используйте 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 - вокруг командира.

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

Часть 2

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