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

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

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

Перейти к: навигация, поиск
(3.8.1. Синтаксис скрипта Logic)
(Пример достаточно сложной логики)
 
(не показана 41 промежуточная версия 9 участников)
Строка 1: Строка 1:
 
{{Шаблон:Настройка логики}}
 
{{Шаблон:Настройка логики}}
  
N4WGQc  <a href="http://jnpycjwlphzn.com/">jnpycjwlphzn</a>, [url=http://sxviahccmyob.com/]sxviahccmyob[/url], [link=http://tfsnqatxtexh.com/]tfsnqatxtexh[/link], http://lflhekicxxoi.com/
+
=Скрипт logic=
  
==3.8.2. Вот пример достаточно сложной логики:==
+
Скрипт '''''logic''''' управляет переключением схем.<br>
 +
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.<br>
  
[logic]<br>
+
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.<br>
active = walker<br>
+
combat_ignore = combat_ignore<br>
+
on_hit = hit<br>
+
on_death = death<br>
+
  
[hit]<br>
+
В секции должно присутствовать одно из полей:<br>
on_info = %+alert%<br>
+
:*'''''active = <название_схемы>''''' - активная схема, запускающаяся первой.<br>
 +
:*'''''cfg = <имя_ltx_файла_с_настройками>''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').<br>
  
[death]<br>
+
Пример. Настройки простого '''''walker''''':<ini>[logic]
on_info = %+alert +trup3%<br>
+
active = walker
  
[walker]<br>
+
[walker]
path_walk = walk_svoboda3<br>
+
path_walk = walk1
path_look = look_svoboda3<br>
+
path_look = look1</ini>
combat_ignore_cond = {-alert}<br>
+
on_timer = 25000 | remark<br>
+
  
[remark]<br>
+
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:<br>
anim = idle<br>
+
:*'''''on_actor_dist_le = <number>|<название_схемы>''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.<br>
snd = stalker_talk_kampfire<br>
+
:*'''''on_actor_dist_le_nvis = <number>|<название_схемы>''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.<br>
no_move = true<br>
+
:*'''''on_actor_dist_ge = <number>|<название_схемы>''''' - если дистанция в метрах до игрока больше '''''number'''''.<br>
no_rotate = true<br>
+
:*'''''on_actor_dist_ge_nvis = <number>|<название_схемы>''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.<br>
on_hit = hit<br>
+
:*'''''on_signal = <имя_сигнала>|<название_схемы>''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.<br>
on_death = death<br>
+
:*'''''on_info = <название_схемы>''''' - срабатывает всегда.<br>
combat_ignore_cond = {-alert}<br>
+
:*'''''on_timer = <number>|<название_схемы>''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.<br>
 +
:*'''''on_game_timer = <number>|<название_схемы>''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.<br>
 +
:*'''''on_actor_in_zone = <имя_зоны>|<название_схемы>''''' – если актер в находится в указанной зоне (указывается имя рестриктора).<br>
 +
:*'''''on_actor_not_in_zone = <имя_зоны>|<название_схемы>''''' – если актер не в указанной зоне (указывается имя рестриктора).<br>
 +
:*'''''on_npc_in_zone = <number>|<имя_зоны>|<название_схемы>''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.<br>
 +
:*'''''on_npc_not_in_zone = <number>|<имя_зоны>|<название_схемы>''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.<br>
 +
:*'''''on_actor_inside = <название_схемы>''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').<br>
 +
:*'''''on_actor_outside = <название_схемы>''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').<br>
  
[combat_ignore]<br>
+
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''<nowiki>'</nowiki> давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.<br>
  
Рассмотрим ее пошагово. Вначале сталкер работает по схеме walker-a. При этом он игнорирует бой, пока не будет поставлен инфопоршн alert. Он ждет 25 секунд, после чего переходит в схему remark. В ремарке он проигрывает идловую анимацию, говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут (on_hit) или убьют (on_death), будет поставлен инфопоршн alert и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн trup3 который сообщит о том, что этот сталкер убит.<br>
+
C любыми из вышеперечисленных параметров можно работать следующим образом:<br>
 +
'''''on_info = {…} %…%'''''<br>
 +
'''''on_info2 = {…} %…%'''''<br>
 +
'''''on_info3 = {…} %…%'''''<br>
 +
и так далее до посинения<br>
  
А вот логика его противника:<br>
+
А также условия для переключения на описанные выше секции.<br>
[logic]<br>
+
'''''combat_ignore_cond = '''''<br>
active = walker<br>
+
'''''on_hit ='''''<br>
combat_ignore = combat_ignore<br>
+
'''''on_death ='''''<br>
 +
'''''on_combat ='''''<br>
 +
'''''on_use ='''''<br>
  
[walker]<br>
+
==Синтаксис скрипта Logic==
path_walk = soldier_walk1<br>
+
path_look = soldier_look1<br>
+
combat_ignore_cond = always<br>
+
team = assault_group<br>
+
on_signal = assault | camper<br>
+
  
[camper]<br>
+
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:<br><ini>[logic]
path_walk = soldier_walk1_2<br>
+
active = walker@first
path_look = soldier_look1_2<br>
+
radius = 5<br>
+
on_info = {+trup1 +trup2 +trup3} walker2<br>
+
  
[walker2]<br>
+
[walker@first]
path_walk = soldier_walk1_3<br>
+
path_walk = walk1
path_look = soldier_look1_3<br>
+
path_look = look1
 +
on_actor_dist_le = 5 | walker@second
  
 +
[walker@second]
 +
path_walk = walk2
 +
path_look = look2</ini>
 +
Выше рассмотрено безусловное переключение секций.<br>
 +
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые "'''''эффекты'''''", которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.<br>
 +
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. <br>
  
[combat_ignore]<br>
+
'''''Пример''''':<ini>on_actor_dist_le = 5 | {условие} walker@second %эффекты%</ini>
 +
Условия могут быть следующими:<br>
 +
:*'''''+infoportion''''' - требуется присутствие инфопорции "'''''infoportion'''''" у актора;<br>
 +
:*'''''-infoportion''''' - требуется отсутствие инфопорции "'''''infoportion'''''" у актора;<br>
 +
:*'''''=function''''' - требуется, чтобы функция "'''''function'''''" вернула '''''true''''';<br>
 +
:*'''''!function''''' - требуется, чтобы функция "'''''function'''''" вернулся '''''false''''';<br>
 +
:*'''''~number''''' - вероятность выполнения условия.<br>
  
Он идет в схеме walker, игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы assault_group. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал assault, то переходит в схему camper. В этой схеме у него не прописан combat_ignore, поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн trup1, trup2 или trup3 и когда все трое будут убиты, то он переключится на схему walker2 (подойдет к костру).<br>
+
Эффекты могут быть следующими:<br>
 +
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция "'''''infoportion'''''";<br>
 +
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция "'''''infoportion'''''";<br>
 +
:*'''''=function''''' - в случае включения секции стартует функция "'''''function'''''".<br>
  
==3.9. Схемы логики space_restrictor==
+
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:<br>
  
Общее замечание: Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.
+
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:
 +
:<ini>on_actor_in_zone = restrictor_name | {~30} walker@second</ini>
 +
:Если условий несколько, например:
 +
:<ini>on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth</ini>
 +
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.<br>
 +
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.<br>
 +
:Неудачный пример:
 +
:<ini>on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth</ini>
 +
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.<br>
  
==3.9.1. Схема [sr_idle]==
 
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.<br>
 
Сама по себе схема ничего не делает.<br>
 
Пример настроек рестриктора:<br>
 
  
[logic]<br>
+
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:<ini>on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%</ini>
active = sr_idle<br>
+
  
[sr_idle]<br>
+
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':<ini>on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth</ini>
on_actor_inside = nil %+esc_actor_inside%<br>
+
  
Обратите внимание, что после срабатывания проверки активная схема переключается в nil, чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать nil.<br>
+
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:<ini>[logic]
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.<br>
+
active = {=actor_friend} walker@friendly, walker@enemy</ini>
  
файл \gamedata\scripts\sr_idle.script<br>
+
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:<ini>
 +
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%</ini>
 +
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.<br>
  
==3.9.2. Секция [sr_no_weapon]==
+
Пример работы с секцией '''''nil'''''.  
Данная схема убирает оружие у игрока при входе в зону.<br>
+
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:<ini>[logic]
Пример настроек рестриктора:<br>
+
active = sr_idle
  
[logic]<br>
+
[sr_idle]
active = sr_no_weapon<br>
+
on_actor_inside = nil %+esc_actor_inside%</ini>
 +
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.<br>
  
[sr_no_weapon]<br>
+
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.
  
файл \gamedata\scripts\sr_no_weapon.script<br>
+
==Пример достаточно сложной логики==
 +
<ini>[logic]
 +
active = walker
 +
combat_ignore = combat_ignore
 +
on_hit = hit
 +
on_death = death
  
==3.9.3. Секция [sr_sound]==
+
[hit]
 +
on_info = %+alert%
  
snd = Перечень имён звуков разделенных запятыми.
+
[death]
 +
on_info = %+alert +trup3%
  
type = Типы звуков через запятые. Для удобства введены типы наборов звуков. Т.е., например, чтобы не перечислять каждый раз весь набор звуков скрипа деревянного пола, можно указать тип floor_wooden.
+
[walker]
 +
path_walk = walk_svoboda3
 +
path_look = look_svoboda3
 +
combat_ignore_cond = {-alert}
 +
on_timer = 25000 | remark
  
*delay = Задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.
+
[remark]
 +
anim = idle
 +
snd = stalker_talk_kampfire
 +
no_move = true
 +
no_rotate = true
 +
combat_ignore_cond = {-alert}
  
*idle =  Длина периода игнорирования входа в зону после начала последнего проигранного звука. Чтоб, например, завывание было не чаще, чем раз в несколько минут. В секундах игрового времени. По умолчанию 0.
+
[combat_ignore]</ini>
 +
Рассмотрим ее пошагово.<br>
 +
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.<br>
  
*rnd = Вероятность (в процентах) того, что звук отыграется. По умолчанию 100.
+
А  вот логика его противника:<ini>[logic]
 +
active = walker
 +
combat_ignore = combat_ignore
  
*position = Задает имя пути, в вершинах которого может отыграться звук. Есть зарезервированное значение random. Оно означает случайное место в радиусе 15…50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.
+
[walker]
 +
path_walk = soldier_walk1
 +
path_look = soldier_look1
 +
combat_ignore_cond = always
 +
team = assault_group
 +
on_signal = assault | camper
  
*slide_velocity = Скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3
+
[camper]
 +
path_walk = soldier_walk1_2
 +
path_look = soldier_look1_2
 +
radius = 5
 +
on_info = {+trup1 +trup2 +trup3} walker2
  
*slide_sound_once = true\false
+
[walker2]
true - проиграть звук один раз, даже если он не дошел до последней точки пути.
+
path_walk = soldier_walk1_3
false – если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию false.
+
path_look = soldier_look1_3
  
*play_at_actor = true/false Заставляет звук играться от позиции актера постоянно. Если он будет равен true и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.
 
  
Предназначение данной схемы: отыграть звук при входе актёра в рестриктор.
+
[combat_ignore]</ini>
  
Поддерживается sound_end.
+
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).<br>
  
Обязательно нужно задать либо snd, либо type. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актёра в рестриктор отыгрывается случайный звук из этого списка.
+
=Схемы логики space_restrictor=
  
Место, из которого может отыграться звук, задаётся одним из трёх:
+
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.
- случайное;
+
- случайная вершина заданного пути;
+
- позиция игрока.
+
  
Пример настроек рестриктора:
+
==Схема sr_idle==
 +
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.<br>
 +
Сама по себе схема ничего не делает.<br>
  
[logic]<br>
+
'''[sr_idle]'''<br>
active = sr_sound<br>
+
'''''on_actor_inside = nil %+esc_actor_inside%'''''<br>
  
[sr_sound]<br>
+
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.<br>
type = floor_wooden<br>
+
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.<br>
snd = ambient\wind1, ambient\sparks1<br>
+
rnd = 50<br>
+
position = random<br>
+
idle = 120<br>
+
delay = 3
+
  
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью slide_velocity.
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_idle
  
[logic]<br>
+
[sr_idle]
active = sr_sound
+
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%</ini>
  
[sr_sound]<br>
+
файл ''gamedata\scripts\sr_idle.script''
type = random<br>
+
position = way<br>
+
slide_velocity = 8<br>
+
slide_sound_once = true
+
  
Файл \gamedata\scripts\sr_sound.script
+
==Схема sr_no_weapon==
 +
Данная схема убирает оружие у игрока при входе в зону.<br>
  
==3.9.4. Секция [sr_tip]==
+
'''[sr_no_weapon]'''<br>
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор
+
  
name = Название новости.<br>
+
'''''Пример использования схемы''''':<ini>[logic]
type = по умолчанию «news»<br>
+
active = sr_no_weapon
Тип  новостей: «news» – отсылается как глобальная новость, «tips» - отсылается то имени sender-a
+
*sender = если тип = «tips», то от sender задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение. По умолчанию это иконка торговца.
+
  
*cond = Необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.
+
[sr_no_weapon]</ini>
  
*single = true/false (по умолчанию false). Если параметр в true, то типс будет выдан только один раз,
+
файл ''gamedata\scripts\sr_no_weapon.script''
  
Пример настроек рестриктора:
+
==Схема sr_sound==
  
[logic]<br>
+
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.<br>
active = sr_tip
+
  
[sr_tip]<br>
+
'''[sr_sound]'''<br>
name = tips_esc_trader_about_pda<br>
+
'''''snd = <путь_звукового_файла>''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').<br>
type = tips<br>
+
'''''type = <параметр>''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:<br>
cond = {+infoportion1 –infoportion2 }<br>
+
:*'''''floor_wooden''''';<br>
*showtime = msec – время в миллисекундах, в течение которого сообщение будет находится на экране. – ПОКА НЕ РАБОТАЕТ НОРМАЛЬНО!
+
:*'''''rats_panic''''';<br>
 +
:*'''''random'''''.<br>
 +
'''''delay = <number>''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.<br>
 +
'''''idle = <number>''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.
 +
:Чтоб, например, "завывание" было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.<br>
 +
'''''rnd = <number>''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.<br>
 +
'''''position = <имя_пути>''''' - задает имя пути, в вершинах которого может отыграться звук.
 +
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.<br>
 +
'''''slide_velocity = <number>''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.<br>
 +
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,
 +
:иначе если '''''false''''' и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.<br>
 +
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.
 +
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.<br>
  
Если необходимо проиграть только 1 раз, а это случается часто, то можно добавить следующую строку:
+
Поддерживается сигнал '''''sound_end'''''.<br>
on_actor_inside = nil
+
  
файл \gamedata\scripts\sr_tip.script
+
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.<br>
  
==3.9.5. Sr_light==
 
Зона, в которой фонарики у неписей будут включены независимо от времени суток.
 
  
Работает следующим образом:<br>
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_idle
  
[logic]<br>
+
[sr_idle]
active = sr_light<br>
+
on_actor_inside = sr_sound@shooting
  
[sr_light]<br>
+
[sr_sound@shooting]
light_on = true/false (свет включен/выключен)<br>
+
snd = characters_voice\scenario\garbage\grey_grey_1
 +
play_at_actor = true
 +
on_signal = sound_end| nil
 +
on_timer = 20000| nil</ini>
  
Также работает вместе с кондлистом:<br>
+
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:<ini>[logic]
 +
active = sr_sound
  
[logic]<br>
+
[sr_sound]
active = sr_light<br>
+
type = random
 +
position = way
 +
slide_velocity = 8
 +
slide_sound_once = true</ini>
  
[sr_light]<br>
+
Файл ''gamedata\scripts\sr_sound.script''
light_on = true/false (свет включен/выключен)<br>
+
on_info = {+info1} section %+info2%
+
  
==3.9.6. Sr_territory==
+
==Схема sr_tip==
 +
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.<br>
  
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.
+
'''[sr_tip]'''<br>
Пока что она отлавливает только хиты и смерть сталкеров. Пример использования примерно следующий:
+
'''''name = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.<br>
 +
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.<br>
 +
'''''sender = <параметр>''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.
 +
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.<br>
 +
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.<br>
 +
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.<br>
 +
'''''timeout = <number>''''' - задержка вывода сообщения в секундах. По умолчанию - 0.<br>
 +
'''''showtime = <number>''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.<br>
  
[logic]<br>
+
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.<br>
active = sr_territory@outside<br>
+
  
[sr_territory@outside]<br>
+
'''''Пример использования схемы''''':<ini>[logic]
on_actor_inside = sr_territory@inside<br>
+
active = sr_idle
  
[sr_territory@inside]<br>
+
[sr_idle]
on_actor_outside = sr_territory@outside<br>
+
on_actor_inside = sr_tip
territory_hit = {-bar_dolg_territory_1_hit} %+bar_dolg_territory_1_hit%, {-bar_dolg_territory_2_hit}<br>
+
%+bar_dolg_territory_2_hit%, {-bar_dolg_territory_3_hit} %+bar_dolg_territory_3_hit%
+
territory_death = {-bar_dolg_territory_kill} %+bar_dolg_territory_kill%<br>
+
  
 +
[sr_tip]
 +
name = rad_barman_spam
 +
type = tips
 +
cond = {+bar_deactivate_radar_done}
 +
sender = barman
 +
on_actor_inside = nil
 +
showtime = 25000</ini>
  
То есть здесь видно, что когда игрок находится внутри рестриктора, то считается количество нанесенных хитов, а также учитывается был ли кто-то убит или нет. Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.
+
файл ''gamedata\scripts\sr_tip.script''
  
==3.9.7. Sr_mapspot==
+
==Схема sr_light==
 +
Зона, управляющая вкл\откл фонариков NPC.
  
При входе в рестриктор он сам себя подсвечивает на карте.<br>
+
'''[sr_light]'''<br>
 +
'''''light_on = true/false''''' - свет включен/выключен.<br>
  
Параметры:<br>
+
'''''Пример использования схемы''''':<ini>[logic]
hint - id подсказки в string table (обязательный параметр)<br>
+
active = sr_light
location - название типа подсветки (не обязательный параметр, по умолчанию "crlc_small")<br>
+
  
Пример:<br>
+
[sr_light]
[logic]<br>
+
light_on = true</ini>
active = sr_mapspot<br>
+
  
[sr_mapspot]<br>
+
Файл: ''gamedata\scripts\sr_light.script''
hint = “gar_swamp”<br>
+
location = crcl_big<br>
+
  
==3.9.8. Sr_particle==
+
==Схема sr_territory==
  
Данная система отыгрывает партиклы как статичные так и движущиеся в указанном месте и в указанное время. Работет она следующим образом:
+
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.
 +
Пока что она отлавливает только хиты и смерть NPC.<br>
  
1) для партикловой системы с путем камеры:
+
'''[sr_territory]'''<br>
    [sr_particle]
+
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.<br>
    name = explosions\campfire_03 -имя партикловой системы
+
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от "рук" актора, будучи в этой зоне.<br>
    path = particle_test.anm      -имя пути камеры
+
    mode = 1                      -(обязательно !!!)
+
    looped = true/false          -флаг зацикленности партиклов
+
  
(обязательно с расширением ANM !!!) Здесь партиклы будут молча перемещаться по anm-пути из папки gamedata\anims.
+
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.<br>
         
+
2) для партикловой системы с обычным патрульным путем (из way-point'ов):
+
    [sr_particle]
+
    name = explosions\campfire_03  -имя партикловой системы
+
    path = part_points            -имя патрульного пути
+
    mode = 2                      -(обязательно !!!)
+
    looped = true/false            -флаг зацикленности партиклов
+
  
В вейпоинтах можно задавать флаги:
+
'''''Пример использования схемы''''':<ini>[logic]
<br\>s=имя_звуковой_темы
+
active = sr_territory@1
<br\>d=число время задержки перед проигрыванием (задается в миллисекундах. Если не задано, то 0).
+
<br\>s=имя звуковой темы в sound_themes.ph_snd_themes из которой будет случайно выбран звук для проигрывания во время проигрывания партикла. Звук не зацикливается и играет только один раз.. Результат = партиклы отыгрываются во всех вейпоинтах одновременно (или с задержкой см. выше).
+
<br>При looped=true по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал particle_end выдаваться не будет. При looped=false сигнал будет выдан, когда все  источники партиклов отыграют.
+
<br>Поддерживается кондлист. Если рестриктор переходит в другую секцию, то автоматически перестают отыгрываться партиклы и замолкают звуки при них. Этот рестриктор является объектом, отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.
+
<br>
+
  
==3.9.9. Sr_sound_act==
+
[sr_territory@1]
Итого, схема, которая играет саунд в голове актера. Всякие там переговоры по ПДА и прочие фейки
+
territory_death = sr_idle@1 %+bar_arena_territory_death%</ini>
  
[sr_sound_act]<br>
+
Файл: ''gamedata\scripts\sr_territory.script''
snd = ambient\random\new_drone1    --имя звукового файла<br>
+
*delay = 2000                          --задержка перед проигрыванием <br>
+
*delay_max = 4000 -- между проигрыванием звука будет взят случайный промежуток между delay и delay_max.<br>
+
*on_signal = sound_end | nil          --по сигналу можно перейти в другую секцию.<br>
+
theme =  <имя темы из ph_sound_themes><br>
+
* stereo = true/false (по умолчанию false). При установке этого параметра к файлу, который задан параметром snd или в звуковой теме будут добавляться (автоматически) суффиксы _r и _l для загрузки левого и правого каналов и, соответственно, вся эта фигня будет играться.<br>
+
  
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз. Схема поддерживает кондлист.<br>
+
==Схема sr_mapspot==
 +
При входе в рестриктор он сам себя подсвечивает на карте.<br>
  
==3.9.10 Sr_timer==
+
'''[sr_mapspot]'''<br>
 +
'''''hint = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.<br>
 +
'''''location = <имя_метки>''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.<br>
  
Пример использования:<br>
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_idle
 +
 +
[sr_idle]
 +
on_actor_inside = sr_mapspot
  
[logic]<br>
+
[sr_mapspot]
active = sr_timer@1<br>
+
hint = gar_swamp
 +
location = crcl_big</ini>
  
[sr_timer@1]<br>
+
Файл: ''gamedata\scripts\sr_mapspot.script''
type = dec<br>
+
start_value = 10000<br>
+
on_value = 0 | sr_timer@2<br>
+
  
[sr_timer@2]<br>
+
==Схема sr_particle==
type = inc<br>
+
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.<br>
on_value = 15000 | nil %+info1%<br>
+
  
Описания полей:<br>
+
'''[sr_particle]'''<br>
type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec).<br>
+
'''''name = <имя_партикла>''''' - путь до партикла относительно файла ''particles.xr''.<br>
Если поле не задано - счетчик будет инкриментирующий<br>
+
'''''path = <имя_пути>''''' - точки движения партикла. Возможны два случая:
start_value - начальное значение счетчика в РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.<br>
+
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');<br>
 +
:#Когда указывается имя патрульного пути.<br>
 +
'''''mode = <параметр>''''' - параметр обязательный и имеет два значения:
 +
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';<br>
 +
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.<br>
 +
'''''looped = true/false''''' - флаг зацикленности партиклов.<br>
  
Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по специфическому условию on_value. В общем случае on_value Можно использовать для производства каких либо действий в зависимости от состояния счетчика. Например:<br>
+
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').<br>
  
on_value = 5000| %+info1% | 1000| %+info2%<br>
+
Поддерживается сигнал '''''particle_end'''''.
  
==3.9.11. Sr_psy_antenna==
+
В вейпоинтах патрульного пути можно задавать флаги:<br>
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.
+
:*'''''s=<название_звуковой_темы>''''' - звук проигрываемый во время движения;<br>
 +
:*'''''d=<number>''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.<br>
  
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга.  
+
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.<br>
 +
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.<br>
  
eff_intensity = - увеличение/уменьшение в % от базового значения интенсивности излучения.
+
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.<br>
hit_ intensity = - увеличение/уменьшение в % от базового значения наносимого повреждения.
+
  
Пример зоны, которая добавляет 70% излучения:
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_idle
  
[logic]<br>
+
[sr_idle]
active = sr_psy_antenna
+
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle
  
[sr_psy_antenna]<br>
+
[sr_particle]
eff_intensity = 70<br>
+
name = anomaly2\gravity_blast_03     
hit_ intensity = 70
+
path = sar_poltergeist_1_way                 
 +
mode = 2
 +
looped = false             
 +
on_signal = particle_end | sr_idle@2</ini>
  
Пример зоны, которая убирает 30% излучения:
+
Файл: ''gamedata\scripts\sr_particle.script''
  
[logic]<br>
+
==Схема sr_sound_act==
active = sr_psy_antenna
+
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.
  
[sr_psy_antenna]<br>
+
'''[sr_sound_act]'''<br>
intensity = -30<br>
+
'''''snd = <путь_звукового_файла>''''' - имя звукового файла относительно папки ''gamedata\sounds''.<br>
 +
'''''delay = <number>''''' - задержка перед проигрыванием. По умолчанию - 0.<br>
 +
'''''delay_max = <number>''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.<br>
 +
'''''theme = <название_звуковой_темы>''''' - имя темы из файла ''sound_theme.script''.<br>
 +
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,
 +
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.<br>
  
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их "живучести"<br>
+
Поддерживается сигнал '''''sound_end'''''.
<br>
+
phantom_prob = 40 - вероятность проявления фантомов в процентах<br>
+
min_phantom_idle = 3000 - мин время их существования в состоянии idle<br>
+
max_phantom_idle = 5000 - макс время их существования в состоянии idle<br>
+
  
==3.9.12. Sr_teleport==
+
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.<br>
Собственно, телепорт. Настраиваются следующим образом:<br>
+
  
[logic]<br>
+
'''''Пример использования схемы''''':<ini>[logic]
active = sr_teleport<br>
+
active = sr_idle
  
[sr_teleport]<br>
+
[sr_idle]
timeout = 0<br>
+
on_actor_inside = sr_sound_act
  
point1 = point1<br>
+
[sr_sound_act]
look1 = look1<br>
+
theme = sar_monolith_call
prob1 = 10<br>
+
delay = 10000
 +
delay_max = 15000
 +
stereo = true
 +
on_info = {+sar2_monolith_miracle} sr_idle@end</ini>
  
point2 = point2<br>
+
Файл: ''gamedata\scripts\sr_sound2d.script''
look2 = look2<br>
+
prob2 = 20<br>
+
  
где:<br>
+
==Схема sr_timer==
timeout - задержка в срабатывании телепорта в миллисекундах.<br>
+
Схема использовать для производства каких либо действий в зависимости от состояния таймера.
point - одноточечный патрульный путь куда переместить<br>
+
look - одноточечный патрульный путь куда повернуть.<br>
+
  
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.<br>
+
'''[sr_timer]'''<br>
 +
'''''type = dec/inc''''' - тип счётчика.
 +
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;<br>
 +
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.<br>
 +
'''''start_value = <number>''''' - начальное значение счетчика в реальных миллисекундах.
 +
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.<br>
 +
'''''on_value = <number>|%+info -info =func% <название_схемы>''''' - производит действие в зависимости от состояния счётчика.<br>
 +
'''''string = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.
  
==3.9.13. Sr_sleep и настройка снов.==
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_idle
 +
 +
[sr_idle]
 +
on_actor_inside = sr_timer@1
 +
 +
[sr_timer@1]
 +
type = dec
 +
start_value = 1000000
 +
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%
 +
on_actor_outside = sr_idle
 +
on_info = {+bar_deactivate_radar_done} nil
 +
string = st_helmet_countdown</ini>
  
Появилась возможность задавать зоны сна.
+
Файл: ''gamedata\scripts\sr_timer.script''
  
[sr_sleep]
+
==Схема sr_psy_antenna==
*cond = <condlist>
+
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.<br>
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.
+
*dream_prob = <число от 0 до 100> - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.
+
  
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.<br>
+
'''[sr_psy_antenna]'''<br>
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.<br>
+
'''''eff_intensity = <number>''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.<br>
 +
'''''hit_intensity = <nymber>''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.<br>
 +
'''''phantom_prob = <nymber>''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.<br>
 +
'''''postprocess = <имя_постэффекта>''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.<br>
 +
'''''mute_sound_threshold = <number>''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.<br>
  
В файле misc\dream.ltx задаются настройки снов.<br>
+
'''''Пример использования схемы''''':<ini>[logic]
 +
active = sr_psy_antenna@good_helmet
  
Секция videos.<br>
+
[sr_psy_antenna@good_helmet]
Полями задаются пути к видеофайлам со снами.<br>
+
eff_intensity = -10
 +
hit_intensity = 0
 +
phantom_prob = 45</ini>
  
Секция dreams. Поля:<br>
+
Файл: ''gamedata\scripts\sr_psy_antenna.script''
regular_probability = <число от 0 до 100> - вероятность проигрывания обычных сновидений в целом <br>
+
regular - список секций с настройками для обычных сновидений<br>
+
scene - список секций с настройками для сценарных сновидений<br>
+
  
Настройки обычных сновидений:<br>
+
==Схема sr_teleport==
dream - имя поля из секции videos<br>
+
Схема позволяет телепортировать актора в пределах локации.
probability = <число больше 0> - чем больше, тем больше вероятность проигрывания сна.<br>
+
type = nightmare/normal/happy - тип сна.<br>
+
  
Настройки сценарных сновидений:<br>
+
'''[sr_teleport]'''<br>
dream - имя поля из секции videos<br>
+
cond = <condlist> - условия срабатывания<br>
+
to_regular = <вероятность,тип> - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. <вероятность, тип> аналогичны probability и type из настроек обычных сновидений соответственно.<br>
+
  
==3.9.14. Sr_cutscene==
+
'''''point = <имя_пути>''''' - патрульный путь из одной точки, куда переместится актор.<br>
 +
'''''look = <имя_пути>''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.<br>
 +
'''''prob = <number>''''' - вероятность перемещения в заданную точку. По умолчанию - 100.<br>
 +
'''''timeout = <number>''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.<br>
  
Эта схема предназначена для проведения анимации камеры c некоторым эффектом
+
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.<br>
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.<br>
+
  
[sr_cutscene]<br>
+
'''''Пример использования схемы''''':<ini>[logic]
point = <имя пути> - путь в первую точку которого переносится игрок<br>
+
active = sr_teleport
look = <имя пути> - путь в первую точку которого смотрит игрок<br>
+
*pp_effector = <имя файла с эффектом> - файл, расположенный в папке <br>
+
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)<br>
+
cam_effector = <имя файла с анимацией камеры> - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)<br>
+
  
==3.10. Набор дополнительных настроек логики у разных объектов.==
+
[sr_teleport]
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.
+
point1 = aes2_teleport_walk_exit1
 +
look1 = aes2_teleport_look_exit1
 +
prob1 = 10
 +
point2 = aes2_teleport_walk_exit2
 +
look2 = aes2_teleport_look_exit2
 +
prob2 = 20
 +
timeout = 0</ini>
  
==3.10.1. Схема работы двери, секция [ph_door]==
+
Файл: ''gamedata\scripts\sr_teleport.script''
  
NB! Для двухстворчатых ворот задается все аналогично.
+
==Схема sr_sleep==
 +
Появилась возможность задавать зоны сна.<br>
  
locked = false\true<br>
+
'''[sr_sleep]'''<br>
Заперта ли дверь. По дефолту – false.
+
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.<br>
 +
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.
 +
'''''dream_prob = <number>''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.
  
Closed = false\true<br>
+
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.<br>
Закрыта ли дверь. По дефолту - true
+
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.<br>
  
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)<br>
+
В файле ''misc\dream.ltx'' задаются настройки снов.<br>
Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.
+
  
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)<br>
+
Секция '''''videos'''''.<br>
Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.
+
Полями задаются пути к видео файлам со снами.<br>
  
snd_init = Звук, который будет отыгран сразу при включении схемы.
+
Секция '''''dreams'''''. Поля:<br>
 +
'''''regular_probability = <number>''''' - вероятность проигрывания обычных сновидений в целом;<br>
 +
'''''regular = <секции>''''' - список секций с настройками для обычных сновидений;<br>
 +
'''''scene = <секции>''''' - список секций с настройками для сценарных сновидений.<br>
  
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.
+
Настройки обычных сновидений:<br>
 +
'''''dream = <название>''''' - имя поля из секции '''''videos''''';<br>
 +
'''''probability = <number>''''' - чем больше, тем больше вероятность проигрывания сна;<br>
 +
'''''type = nightmare/normal/happy''''' - тип сна.<br>
  
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.
+
Настройки сценарных сновидений:<br>
 
+
'''''dream = <название>''''' - имя поля из секции '''''videos''''';<br>
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.
+
'''''cond = {+info -info =func !func ~number} - условия срабатывания;<br>
 
+
'''''to_regular = <number>,<тип>''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. <'''''number'''''>, <'''''тип'''''> аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.<br>
Примеры:<br>
+
Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:
+
 
+
[logic]<br>
+
active = ph_door@locked<br>
+
 
+
[ph_door@locked]<br>
+
locked = true<br>
+
snd_open_start = trader_door_locked<br>
+
on_info = {+esc_trader_can_leave} ph_door@unlocked<br>
+
 
+
[ph_door@unlocked]<br>
+
locked = false<br>
+
snd_init = trader_door_unlock<br>
+
snd_open_start = trader_door_open_start<br>
+
snd_close_start = trader_door_close_start<br>
+
snd_close_stop = trader_door_close_stop<br>
+
файл \gamedata\scripts\ph_door.script<br>
+
 
+
==3.10.2. Схема работы кнопки, секция [ph_button]==
+
 
+
При нажатии на кнопку переключает секции и выдает инфопоршн.<br>
+
 
+
[logic]<br>
+
active      = ph_button@locked<br>
+
 
+
[ph_button@locked]<br>
+
anim_blend  = false<br>
+
anim        = button_false<br>
+
on_press    = ph_button@unlocked %+cit_jail_door_opened%<br>
+
  
on_press – что происходит при нажатии<br>
+
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.
anim – анимация, которая отигрывается при нажатии на кнопку<br>
+
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false<br>
+
  
Файл \Gamedata\scripts\ph_button.script<br>
+
Файл: ''gamedata\scripts\sr_sleep.script''
  
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.<br>
+
==Схема sr_cutscene==
Пример настройки кнопки:<br>
+
  
[logic]<br>
+
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.<br>
active = ph_button@active<br>
+
  
[ph_button@active]<br>
+
'''[sr_cutscene]'''<br>
anim = lab_switcher_idle<br>
+
'''''point = <имя_пути>''''' - путь в первую точку которого переносится игрок.<br>
tooltip = tips_labx16switcher_press<br>
+
'''''look = <имя_пути>''''' - путь в первую точку которого смотрит игрок.<br>
on_press = ph_button@deactivated %+terrain_test%<br>
+
'''''pp_effector = <имя_постэффекта>''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).<br>
 +
'''''cam_effector = <имя_анимации_камеры>''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).<br>
  
[ph_button@deactivated]<br>
+
Поддерживается сигнал '''''cameff_end'''''.<br>
anim = lab_switcher_off<br>
+
  
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:<br>
+
'''''Пример использования схемы''''':<ini>[logic]
<code>
+
active = sr_idle
    <string id="tips_labx16switcher_press">
+
        <text>Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)</text>
+
    </string>
+
</code>
+
  
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:<br>
+
[sr_idle]
 +
on_actor_inside = sr_cutscene
  
[logic]<br>
+
[sr_cutscene]
active = ph_button@locked<br>
+
point = agr_cutscene_walk
 +
look = agr_cutscene_look
 +
cam_effector = agroprom_demo
 +
on_signal = cameff_end | nil</ini>
  
[ph_button@locked]<br>
+
Файл: ''gamedata\scripts\sr_cutscene.script''
anim = button_false – анимация несрабатывания кнопки.<br>
+
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked<br>
+
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%<br>
+
  
[ph_button@unlocked]<br>
+
----
anim = button_true<br>
+
on_info = {-val_prisoner_door_unlocked} ph_button@locked<br>
+
on_press = ph_button@locked %-val_prisoner_door_unlocked%<br>
+
  
===[[Часть 4]]===
 
  
 +
<font size = 5>[[Часть 4]]</font>
  
 
[[Категория:A-Life]][[Категория:Скрипты]]
 
[[Категория:A-Life]][[Категория:Скрипты]]

Текущая версия на 09:11, 6 января 2017

Содержание

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

Скрипт logic

Скрипт logic управляет переключением схем.
В custom_data любого персонажа (кроме свободных) должна присутствовать секция [logic].

Функции, на которые ссылается секция [logic] должны находится в файлах gamedata\scripts\xr_effects.script или gamedata\scripts\xr_conditions.script.

В секции должно присутствовать одно из полей:

  • active = <название_схемы> - активная схема, запускающаяся первой.
  • cfg = <имя_ltx_файла_с_настройками> - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки gamedata\config\scripts).
Пример. Настройки простого walker:
[logic]
active = walker
 
[walker]
path_walk = walk1
path_look = look1

Переключение схем выполняется с помощью дополнительных условий схемы logic, которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:

  • on_actor_dist_le = <number>|<название_схемы> - если дистанция в метрах до игрока меньше либо равно number.
  • on_actor_dist_le_nvis = <number>|<название_схемы> - если дистанция в метрах до игрока меньше либо равно number без проверки на видимость.
  • on_actor_dist_ge = <number>|<название_схемы> - если дистанция в метрах до игрока больше number.
  • on_actor_dist_ge_nvis = <number>|<название_схемы> - если дистанция в метрах до игрока больше number без проверки на видимость.
  • on_signal = <имя_сигнала>|<название_схемы> - срабатывает по приходу сигнала имя_сигнала от текущей активной схемы.
  • on_info = <название_схемы> - срабатывает всегда.
  • on_timer = <number>|<название_схемы> - срабатывает через number миллисекунд после включения схемы.
  • on_game_timer = <number>|<название_схемы> – срабатывает через number секунд игрового времени, после включения схемы.
  • on_actor_in_zone = <имя_зоны>|<название_схемы> – если актер в находится в указанной зоне (указывается имя рестриктора).
  • on_actor_not_in_zone = <имя_зоны>|<название_схемы> – если актер не в указанной зоне (указывается имя рестриктора).
  • on_npc_in_zone = <number>|<имя_зоны>|<название_схемы> – если NPC со story_id равному number, в указанной зоне.
  • on_npc_not_in_zone = <number>|<имя_зоны>|<название_схемы> - если NPC со story_id равному number, не в указанной зоне.
  • on_actor_inside = <название_схемы> - зона проверяет, находится ли игрок внутри нее (используется со space_restrictor).
  • on_actor_outside = <название_схемы> - зона проверяет, находится ли игрок за ее пределами (используется со space_restrictor).

Примечание: если происходит переключение между несколькими одноименными схемами (например несколькими walker), то их можно нумеровать: walker1, walker2, хотя предпочтительнее через символ '@' давать более информативные названия: walker@day, walker@alarm и т.д.

C любыми из вышеперечисленных параметров можно работать следующим образом:
on_info = {…} %…%
on_info2 = {…} %…%
on_info3 = {…} %…%
и так далее до посинения

А также условия для переключения на описанные выше секции.
combat_ignore_cond =
on_hit =
on_death =
on_combat =
on_use =

Синтаксис скрипта Logic

Для того, чтобы персонаж ходил по пути walk1, а при приближении игрока на дистанцию 5 метров, переключался на путь walk2 (но только при условии, что он видит игрока), нужно написать следующее:
[logic]
active = walker@first
 
[walker@first]
path_walk = walk1
path_look = look1
on_actor_dist_le = 5 | walker@second
 
[walker@second]
path_walk = walk2
path_look = look2

Выше рассмотрено безусловное переключение секций.
Перед именем секции в фигурных скобках {} можно задавать дополнительные условия, а после имени секции - так называемые "эффекты", которые заключить в знаки процента %%. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет.

Пример:
on_actor_dist_le = 5 | {условие} walker@second %эффекты%

Условия могут быть следующими:

  • +infoportion - требуется присутствие инфопорции "infoportion" у актора;
  • -infoportion - требуется отсутствие инфопорции "infoportion" у актора;
  • =function - требуется, чтобы функция "function" вернула true;
  • !function - требуется, чтобы функция "function" вернулся false;
  • ~number - вероятность выполнения условия.

Эффекты могут быть следующими:

  • +infoportion - в случае включения секции у актора будет установлен инфопорция "infoportion";
  • -infoportion - в случае включения секции у актора будет убрана инфопорция "infoportion";
  • =function - в случае включения секции стартует функция "function".

Примечание: для условия переключения схемы {~number} определён следующий расчёт:

number сравнивается со случайным числом в диапазоне от 1 до 100, если number больше, то считается, что условие вернуло истину, например:
on_actor_in_zone = restrictor_name | {~30} walker@second
Если условий несколько, например:
on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth
В таком случае, переход на схему walker@second произойдёт с вероятностью 20%, на схему walker@third с вероятностью 55-20=35% и на схему walker@fourth с оставшейся вероятностью 100-55=45%.
Условия в данном случае необходимо выставлять исключительно в порядке возрастания.
Неудачный пример:
on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth
Здесь переход на схему walker@third никогда не будет определён, а вероятность перехода на схему walker@fourth составит 60%.


Примечание: несколько условия или эффектов разделяются пробелами:
on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен info_1, будет включена схема walker@second, иначе, если установлен info_2, будет включена схема walker@third, иначе будет включен walker@fourth:
on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth
В описанном выше поле active секции logic, можно также задавать условия, например:
[logic]
active = {=actor_friend} walker@friendly, walker@enemy
В логических условиях теперь принимается ключевое слово never, которое означает, что условие ложно. Например:
 
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%

Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции never. Таким образом, выбор секции never равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.

Пример работы с секцией nil.

Секция nil выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = nil %+esc_actor_inside%

То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию nil, больше не проверяя наличие игрока.

Примечание: обратно из секции nil под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.

Пример достаточно сложной логики

[logic]
active = walker
combat_ignore = combat_ignore
on_hit = hit
on_death = death
 
[hit]
on_info = %+alert%
 
[death]
on_info = %+alert +trup3%
 
[walker]
path_walk = walk_svoboda3
path_look = look_svoboda3
combat_ignore_cond = {-alert}
on_timer = 25000 | remark
 
[remark]
anim = idle
snd = stalker_talk_kampfire
no_move = true
no_rotate = true
combat_ignore_cond = {-alert}
 
[combat_ignore]

Рассмотрим ее пошагово.
Вначале сталкер работает по схеме walker. При этом он игнорирует бой, пока не будет поставлен инфопоршн alert'. Он ждет 25 секунд, после чего переходит в схему remark. В ремарке он проигрывает анимацию idle, говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут (on_hit) или убьют (on_death), будет поставлен инфопоршн alert и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн trup3 который сообщит о том, что этот NPC убит.

А вот логика его противника:
[logic]
active = walker
combat_ignore = combat_ignore
 
[walker]
path_walk = soldier_walk1
path_look = soldier_look1
combat_ignore_cond = always
team = assault_group
on_signal = assault | camper
 
[camper]
path_walk = soldier_walk1_2
path_look = soldier_look1_2
radius = 5
on_info = {+trup1 +trup2 +trup3} walker2
 
[walker2]
path_walk = soldier_walk1_3
path_look = soldier_look1_3
 
 
[combat_ignore]

Он идет в схеме walker, игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы assault_group. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал assault, то переходит в схему camper. В этой схеме у него не прописан combat_ignore, поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн trup1, trup2 или trup3 и когда все трое будут убиты, то он переключится на схему walker2 (подойдет к костру).

Схемы логики space_restrictor

Общее замечание: Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.

Схема sr_idle

Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.
Сама по себе схема ничего не делает.

[sr_idle]
on_actor_inside = nil %+esc_actor_inside%

Обратите внимание, что после срабатывания проверки активная схема переключается в nil, чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать nil.
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%

файл gamedata\scripts\sr_idle.script

Схема sr_no_weapon

Данная схема убирает оружие у игрока при входе в зону.

[sr_no_weapon]

Пример использования схемы:
[logic]
active = sr_no_weapon
 
[sr_no_weapon]

файл gamedata\scripts\sr_no_weapon.script

Схема sr_sound

Схема предназначена для отыгрывание звука при входе актора в space_restrictor.

[sr_sound]
snd = <путь_звукового_файла> - перечень имён звуков разделенных запятыми (путь учитывается относительно папки gamedata\sounds).
type = <параметр> - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице sound_types управляющего файла. Всего их три:

  • floor_wooden;
  • rats_panic;
  • random.

delay = <number> - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.
idle = <number> - длина периода игнорирования входа в зону после начала последнего проигранного звука.

Чтоб, например, "завывание" было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.

rnd = <number> - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.
position = <имя_пути> - задает имя пути, в вершинах которого может отыграться звук.

Есть зарезервированное значение random. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.

slide_velocity = <number> - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.
slide_sound_once = true\false - в случае значения true - проиграть звук один раз, даже если он не дошел до последней точки пути,

иначе если false – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию false.

play_at_actor = true/false - заставляет звук играться от позиции актера постоянно.

Если он будет равен true и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.

Поддерживается сигнал sound_end.

Обязательно нужно задать либо snd, либо type. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.


Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_sound@shooting
 
[sr_sound@shooting]
snd = characters_voice\scenario\garbage\grey_grey_1
play_at_actor = true
on_signal = sound_end| nil
on_timer = 20000| nil
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью slide_velocity. Пример:
[logic]
active = sr_sound
 
[sr_sound]
type = random
position = way
slide_velocity = 8
slide_sound_once = true

Файл gamedata\scripts\sr_sound.script

Схема sr_tip

Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.

[sr_tip]
name = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.
type = news/tips - параметр рудиментарный и не на что не влияет.
sender = <параметр> - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.

По умолчанию это иконка торговца. Возможны следующие значения: default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer.

cond = {+info -info =func !func ~number} - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.
single = true/false - если параметр в true, то типс будет выдан только один раз. По умолчанию false.
timeout = <number> - задержка вывода сообщения в секундах. По умолчанию - 0.
showtime = <number> - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.

Поддерживается сигнал tip_sended, только в случае установленного параметра single.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_tip
 
[sr_tip] 
name = rad_barman_spam
type = tips
cond = {+bar_deactivate_radar_done} 
sender = barman
on_actor_inside = nil
showtime = 25000

файл gamedata\scripts\sr_tip.script

Схема sr_light

Зона, управляющая вкл\откл фонариков NPC.

[sr_light]
light_on = true/false - свет включен/выключен.

Пример использования схемы:
[logic]
active = sr_light
 
[sr_light]
light_on = true

Файл: gamedata\scripts\sr_light.script

Схема sr_territory

Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора. Пока что она отлавливает только хиты и смерть NPC.

[sr_territory]
territory_hit = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.
territory_death = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые произойдут при смерти от "рук" актора, будучи в этой зоне.

Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.

Пример использования схемы:
[logic]
active = sr_territory@1
 
[sr_territory@1]
territory_death = sr_idle@1 %+bar_arena_territory_death%

Файл: gamedata\scripts\sr_territory.script

Схема sr_mapspot

При входе в рестриктор он сам себя подсвечивает на карте.

[sr_mapspot]
hint = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.
location = <имя_метки> - имя типа метки, зарегистрированное в файле config\ui\map_spots.xml и всех, что в него включены инклюдами. По умолчанию - crlc_small.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_mapspot
 
[sr_mapspot]
hint = gar_swamp
location = crcl_big

Файл: gamedata\scripts\sr_mapspot.script

Схема sr_particle

Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.

[sr_particle]
name = <имя_партикла> - путь до партикла относительно файла particles.xr.
path = <имя_пути> - точки движения партикла. Возможны два случая:

  1. Когда указывается путь анимации камеры (путь учитывается относительно папки gamedata\anims);
  2. Когда указывается имя патрульного пути.

mode = <параметр> - параметр обязательный и имеет два значения:

  • 1 - устанавливается в случае указания анимации камеры для параметра path;
  • 2 - устанавливается в случае указания патрульного пути для параметра path.

looped = true/false - флаг зацикленности партиклов.

Примечание: для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение .anm (например arena.anm).

Поддерживается сигнал particle_end.

В вейпоинтах патрульного пути можно задавать флаги:

  • s=<название_звуковой_темы> - звук проигрываемый во время движения;
  • d=<number> - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.

При looped = true, по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал particle_end выдаваться не будет.
При looped = false сигнал будет выдан, когда все источники партиклов отыграют.

Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle
 
[sr_particle]
name = anomaly2\gravity_blast_03      
path = sar_poltergeist_1_way                  
mode = 2 				
looped = false               
on_signal = particle_end | sr_idle@2

Файл: gamedata\scripts\sr_particle.script

Схема sr_sound_act

Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.

[sr_sound_act]
snd = <путь_звукового_файла> - имя звукового файла относительно папки gamedata\sounds.
delay = <number> - задержка перед проигрыванием. По умолчанию - 0.
delay_max = <number> - между проигрыванием звука будет взят случайный промежуток между delay и delay_max.
theme = <название_звуковой_темы> - имя темы из файла sound_theme.script.
stereo = true/false - при установке этого параметра к файлу, который задан параметром snd или в звуковой теме,

автоматически будут добавляться суффиксы _r и _l для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.

Поддерживается сигнал sound_end.

Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_sound_act
 
[sr_sound_act]
theme = sar_monolith_call
delay = 10000
delay_max = 15000
stereo = true
on_info = {+sar2_monolith_miracle} sr_idle@end

Файл: gamedata\scripts\sr_sound2d.script

Схема sr_timer

Схема использовать для производства каких либо действий в зависимости от состояния таймера.

[sr_timer]
type = dec/inc - тип счётчика.

  • dec - декриментирующий, т.е. обратный отсчёт;
  • inc - инрементирующий, т.е. отчёт по возрастанию.

start_value = <number> - начальное значение счетчика в реальных миллисекундах.

Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.

on_value = <number>|%+info -info =func% <название_схемы> - производит действие в зависимости от состояния счётчика.
string = <имя_текса> - строка с id текста зарегистрированного в папке gamedata\config\text.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_timer@1
 
[sr_timer@1]
type = dec
start_value = 1000000
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%
on_actor_outside = sr_idle
on_info = {+bar_deactivate_radar_done} nil
string = st_helmet_countdown

Файл: gamedata\scripts\sr_timer.script

Схема sr_psy_antenna

Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.

[sr_psy_antenna]
eff_intensity = <number> - увеличение/уменьшение в процентах от базового значения интенсивности излучения.
hit_intensity = <nymber> - увеличение/уменьшение в процентах от базового значения наносимого повреждения.
phantom_prob = <nymber> - вероятность проявления фантомов в процентах. По умолчанию - 0.
postprocess = <имя_постэффекта> - файл постэффекта, относительно папки gamedata\anims. Расширение ставить обязательно! По умолчанию - psy_antenna.ppe.
mute_sound_threshold = <number> - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.

Пример использования схемы:
[logic]
active = sr_psy_antenna@good_helmet
 
[sr_psy_antenna@good_helmet]
eff_intensity = -10
hit_intensity = 0
phantom_prob = 45

Файл: gamedata\scripts\sr_psy_antenna.script

Схема sr_teleport

Схема позволяет телепортировать актора в пределах локации.

[sr_teleport]

point = <имя_пути> - патрульный путь из одной точки, куда переместится актор.
look = <имя_пути> - патрульный путь из одной точки, куда будет смотреть актор после перемещения.
prob = <number> - вероятность перемещения в заданную точку. По умолчанию - 100.
timeout = <number> - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.

Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.

Пример использования схемы:
[logic]
active = sr_teleport
 
[sr_teleport]
point1 = aes2_teleport_walk_exit1
look1 = aes2_teleport_look_exit1
prob1 = 10
point2 = aes2_teleport_walk_exit2
look2 = aes2_teleport_look_exit2
prob2 = 20
timeout = 0

Файл: gamedata\scripts\sr_teleport.script

Схема sr_sleep

Появилась возможность задавать зоны сна.

[sr_sleep]
cond = {+info -info =func !func ~number} - условия, при выполнении которых сон будет возможен.
type = nightmare/normal/happy/all - задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на не сценарные сны. dream_prob = <number> - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.

Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.

В файле misc\dream.ltx задаются настройки снов.

Секция videos.
Полями задаются пути к видео файлам со снами.

Секция dreams. Поля:
regular_probability = <number> - вероятность проигрывания обычных сновидений в целом;
regular = <секции> - список секций с настройками для обычных сновидений;
scene = <секции> - список секций с настройками для сценарных сновидений.

Настройки обычных сновидений:
dream = <название> - имя поля из секции videos;
probability = <number> - чем больше, тем больше вероятность проигрывания сна;
type = nightmare/normal/happy - тип сна.

Настройки сценарных сновидений:
dream = <название> - имя поля из секции videos;
cond = {+info -info =func !func ~number} - условия срабатывания;
to_regular = <number>,<тип> - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. <number>, <тип> аналогичны probability и type из настроек обычных сновидений соответственно.

Примечание: до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.

Файл: gamedata\scripts\sr_sleep.script

Схема sr_cutscene

Эта схема предназначена для проведения анимации камеры c некоторым эффектом (pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.

[sr_cutscene]
point = <имя_пути> - путь в первую точку которого переносится игрок.
look = <имя_пути> - путь в первую точку которого смотрит игрок.
pp_effector = <имя_постэффекта> - файл, расположенный в папке gamedata\anims\ и содержащий эффект (имя файла пишется без расширения).
cam_effector = <имя_анимации_камеры> - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения).

Поддерживается сигнал cameff_end.

Пример использования схемы:
[logic]
active = sr_idle
 
[sr_idle]
on_actor_inside = sr_cutscene
 
[sr_cutscene]
point = agr_cutscene_walk
look = agr_cutscene_look
cam_effector = agroprom_demo
on_signal = cameff_end | nil

Файл: gamedata\scripts\sr_cutscene.script



Часть 4

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