Настройка логики. Часть 3 — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(→3.8.1. Синтаксис скрипта Logic) |
Losiara (обсуждение | вклад) (→Пример достаточно сложной логики) |
||
(не показана 41 промежуточная версия 9 участников) | |||
Строка 1: | Строка 1: | ||
{{Шаблон:Настройка логики}} | {{Шаблон:Настройка логики}} | ||
− | + | =Скрипт logic= | |
− | + | Скрипт '''''logic''''' управляет переключением схем.<br> | |
+ | В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.<br> | ||
− | [logic] | + | Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.<br> |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | В секции должно присутствовать одно из полей:<br> | |
− | + | :*'''''active = <название_схемы>''''' - активная схема, запускающаяся первой.<br> | |
+ | :*'''''cfg = <имя_ltx_файла_с_настройками>''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').<br> | ||
− | [ | + | Пример. Настройки простого '''''walker''''':<ini>[logic] |
− | + | active = walker | |
− | [walker] | + | [walker] |
− | path_walk = | + | path_walk = walk1 |
− | path_look = | + | path_look = look1</ini> |
− | + | ||
− | + | ||
− | + | Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:<br> | |
− | + | :*'''''on_actor_dist_le = <number>|<название_схемы>''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.<br> | |
− | + | :*'''''on_actor_dist_le_nvis = <number>|<название_схемы>''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.<br> | |
− | + | :*'''''on_actor_dist_ge = <number>|<название_схемы>''''' - если дистанция в метрах до игрока больше '''''number'''''.<br> | |
− | + | :*'''''on_actor_dist_ge_nvis = <number>|<название_схемы>''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.<br> | |
− | + | :*'''''on_signal = <имя_сигнала>|<название_схемы>''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.<br> | |
− | + | :*'''''on_info = <название_схемы>''''' - срабатывает всегда.<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> | ||
− | + | '''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''<nowiki>'</nowiki> давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.<br> | |
− | + | C любыми из вышеперечисленных параметров можно работать следующим образом:<br> | |
+ | '''''on_info = {…} %…%'''''<br> | ||
+ | '''''on_info2 = {…} %…%'''''<br> | ||
+ | '''''on_info3 = {…} %…%'''''<br> | ||
+ | и так далее до посинения<br> | ||
− | А | + | А также условия для переключения на описанные выше секции.<br> |
− | + | '''''combat_ignore_cond = '''''<br> | |
− | + | '''''on_hit ='''''<br> | |
− | + | '''''on_death ='''''<br> | |
+ | '''''on_combat ='''''<br> | ||
+ | '''''on_use ='''''<br> | ||
− | + | ==Синтаксис скрипта Logic== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:<br><ini>[logic] | |
− | + | active = walker@first | |
− | + | ||
− | + | ||
− | + | ||
− | [ | + | [walker@first] |
− | path_walk = | + | path_walk = walk1 |
− | path_look = | + | path_look = look1 |
+ | on_actor_dist_le = 5 | walker@second | ||
+ | [walker@second] | ||
+ | path_walk = walk2 | ||
+ | path_look = look2</ini> | ||
+ | Выше рассмотрено безусловное переключение секций.<br> | ||
+ | Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые "'''''эффекты'''''", которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.<br> | ||
+ | Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. <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> | ||
− | + | Эффекты могут быть следующими:<br> | |
+ | :*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция "'''''infoportion'''''";<br> | ||
+ | :*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция "'''''infoportion'''''";<br> | ||
+ | :*'''''=function''''' - в случае включения секции стартует функция "'''''function'''''".<br> | ||
− | + | '''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:<br> | |
− | + | :'''''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> | ||
− | |||
− | |||
− | |||
− | |||
− | + | '''''Примечание''''': несколько условия или эффектов разделяются пробелами:<ini>on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%</ini> | |
− | + | ||
− | + | Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''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> | |
− | + | ||
− | + | В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:<ini>[logic] | |
− | + | active = {=actor_friend} walker@friendly, walker@enemy</ini> | |
− | + | В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:<ini> | |
+ | combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%</ini> | ||
+ | Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.<br> | ||
− | + | Пример работы с секцией '''''nil'''''. | |
− | + | Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:<ini>[logic] | |
− | + | active = sr_idle | |
− | [ | + | [sr_idle] |
− | + | on_actor_inside = nil %+esc_actor_inside%</ini> | |
+ | То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.<br> | ||
− | + | '''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее. | |
− | + | ==Пример достаточно сложной логики== | |
+ | <ini>[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]</ini> | |
+ | Рассмотрим ее пошагово.<br> | ||
+ | Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.<br> | ||
− | + | А вот логика его противника:<ini>[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]</ini> | |
− | + | Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).<br> | |
− | + | =Схемы логики space_restrictor= | |
− | + | '''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема sr_idle== | |
+ | Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.<br> | ||
+ | Сама по себе схема ничего не делает.<br> | ||
− | [ | + | '''[sr_idle]'''<br> |
− | + | '''''on_actor_inside = nil %+esc_actor_inside%'''''<br> | |
− | + | Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.<br> | |
− | + | Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''''Пример использования схемы''''':<ini>[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%</ini> | |
− | + | файл ''gamedata\scripts\sr_idle.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема sr_no_weapon== | |
+ | Данная схема убирает оружие у игрока при входе в зону.<br> | ||
− | + | '''[sr_no_weapon]'''<br> | |
− | + | ||
− | + | '''''Пример использования схемы''''':<ini>[logic] | |
− | + | active = sr_no_weapon | |
− | + | ||
− | + | ||
− | + | [sr_no_weapon]</ini> | |
− | + | файл ''gamedata\scripts\sr_no_weapon.script'' | |
− | + | ==Схема sr_sound== | |
− | + | Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.<br> | |
− | + | ||
− | [ | + | '''[sr_sound]'''<br> |
− | + | '''''snd = <путь_звукового_файла>''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').<br> | |
− | type = | + | '''''type = <параметр>''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:<br> |
− | + | :*'''''floor_wooden''''';<br> | |
− | * | + | :*'''''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> | ||
− | + | Поддерживается сигнал '''''sound_end'''''.<br> | |
− | + | ||
− | + | Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.<br> | |
− | |||
− | |||
− | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:<ini>[logic] | |
+ | active = sr_sound | ||
− | [ | + | [sr_sound] |
− | + | type = random | |
+ | position = way | ||
+ | slide_velocity = 8 | ||
+ | slide_sound_once = true</ini> | ||
− | + | Файл ''gamedata\scripts\sr_sound.script'' | |
− | + | ||
− | + | ||
− | == | + | ==Схема 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> | ||
− | + | Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.<br> | |
− | + | ||
− | [ | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | файл ''gamedata\scripts\sr_tip.script'' | |
− | == | + | ==Схема sr_light== |
+ | Зона, управляющая вкл\откл фонариков NPC. | ||
− | + | '''[sr_light]'''<br> | |
+ | '''''light_on = true/false''''' - свет включен/выключен.<br> | ||
− | + | '''''Пример использования схемы''''':<ini>[logic] | |
− | + | active = sr_light | |
− | + | ||
− | + | [sr_light] | |
− | [ | + | light_on = true</ini> |
− | + | ||
− | + | Файл: ''gamedata\scripts\sr_light.script'' | |
− | + | ||
− | + | ||
− | == | + | ==Схема sr_territory== |
− | + | Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора. | |
+ | Пока что она отлавливает только хиты и смерть NPC.<br> | ||
− | + | '''[sr_territory]'''<br> | |
− | + | '''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.<br> | |
− | + | '''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от "рук" актора, будучи в этой зоне.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''''Пример использования схемы''''':<ini>[logic] | |
− | < | + | active = sr_territory@1 |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | = | + | [sr_territory@1] |
− | + | territory_death = sr_idle@1 %+bar_arena_territory_death%</ini> | |
− | + | Файл: ''gamedata\scripts\sr_territory.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема sr_mapspot== | |
+ | При входе в рестриктор он сам себя подсвечивает на карте.<br> | ||
− | == | + | '''[sr_mapspot]'''<br> |
+ | '''''hint = <имя_текса>''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.<br> | ||
+ | '''''location = <имя_метки>''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.<br> | ||
− | Пример использования:< | + | '''''Пример использования схемы''''':<ini>[logic] |
+ | active = sr_idle | ||
+ | |||
+ | [sr_idle] | ||
+ | on_actor_inside = sr_mapspot | ||
− | [ | + | [sr_mapspot] |
− | + | hint = gar_swamp | |
+ | location = crcl_big</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_mapspot.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема sr_particle== | |
− | + | Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.<br> | |
− | + | ||
− | + | '''[sr_particle]'''<br> | |
− | + | '''''name = <имя_партикла>''''' - путь до партикла относительно файла ''particles.xr''.<br> | |
− | + | '''''path = <имя_пути>''''' - точки движения партикла. Возможны два случая: | |
− | + | :#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');<br> | |
+ | :#Когда указывается имя патрульного пути.<br> | ||
+ | '''''mode = <параметр>''''' - параметр обязательный и имеет два значения: | ||
+ | :* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';<br> | ||
+ | :* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.<br> | ||
+ | '''''looped = true/false''''' - флаг зацикленности партиклов.<br> | ||
− | + | '''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').<br> | |
− | + | Поддерживается сигнал '''''particle_end'''''. | |
− | == | + | В вейпоинтах патрульного пути можно задавать флаги:<br> |
− | + | :*'''''s=<название_звуковой_темы>''''' - звук проигрываемый во время движения;<br> | |
+ | :*'''''d=<number>''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.<br> | ||
− | + | При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.<br> | |
+ | При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.<br> | ||
− | + | Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.<br> | |
− | + | ||
− | Пример | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_particle.script'' | |
− | + | ==Схема sr_sound_act== | |
− | + | Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки. | |
− | [ | + | '''[sr_sound_act]'''<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> | ||
− | + | Поддерживается сигнал '''''sound_end'''''. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.<br> | |
− | + | ||
− | [logic] | + | '''''Пример использования схемы''''':<ini>[logic] |
− | active = | + | 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</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_sound2d.script'' | |
− | + | ||
− | + | ||
− | + | ==Схема sr_timer== | |
− | + | Схема использовать для производства каких либо действий в зависимости от состояния таймера. | |
− | + | ||
− | + | ||
− | + | '''[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''. | ||
− | == | + | '''''Пример использования схемы''''':<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_psy_antenna== | |
− | + | Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.<br> | |
− | + | ||
− | + | ||
− | + | '''[sr_psy_antenna]'''<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> | ||
− | + | '''''Пример использования схемы''''':<ini>[logic] | |
+ | active = sr_psy_antenna@good_helmet | ||
− | + | [sr_psy_antenna@good_helmet] | |
− | + | eff_intensity = -10 | |
+ | hit_intensity = 0 | ||
+ | phantom_prob = 45</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_psy_antenna.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ==Схема sr_teleport== | |
− | + | Схема позволяет телепортировать актора в пределах локации. | |
− | + | ||
− | + | ||
− | + | '''[sr_teleport]'''<br> | |
− | + | ||
− | + | ||
− | + | ||
− | == | + | '''''point = <имя_пути>''''' - патрульный путь из одной точки, куда переместится актор.<br> |
+ | '''''look = <имя_пути>''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.<br> | ||
+ | '''''prob = <number>''''' - вероятность перемещения в заданную точку. По умолчанию - 100.<br> | ||
+ | '''''timeout = <number>''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.<br> | ||
− | + | Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.<br> | |
− | ( | + | |
− | [ | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_teleport.script'' | |
− | + | ==Схема sr_sleep== | |
+ | Появилась возможность задавать зоны сна.<br> | ||
− | + | '''[sr_sleep]'''<br> | |
− | + | '''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.<br> | |
+ | '''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны. | ||
+ | '''''dream_prob = <number>''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран. | ||
− | + | Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.<br> | |
− | + | Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.<br> | |
− | + | В файле ''misc\dream.ltx'' задаются настройки снов.<br> | |
− | + | ||
− | + | Секция '''''videos'''''.<br> | |
− | + | Полями задаются пути к видео файлам со снами.<br> | |
− | + | Секция '''''dreams'''''. Поля:<br> | |
+ | '''''regular_probability = <number>''''' - вероятность проигрывания обычных сновидений в целом;<br> | ||
+ | '''''regular = <секции>''''' - список секций с настройками для обычных сновидений;<br> | ||
+ | '''''scene = <секции>''''' - список секций с настройками для сценарных сновидений.<br> | ||
− | + | Настройки обычных сновидений:<br> | |
+ | '''''dream = <название>''''' - имя поля из секции '''''videos''''';<br> | ||
+ | '''''probability = <number>''''' - чем больше, тем больше вероятность проигрывания сна;<br> | ||
+ | '''''type = nightmare/normal/happy''''' - тип сна.<br> | ||
− | + | Настройки сценарных сновидений:<br> | |
− | + | '''''dream = <название>''''' - имя поля из секции '''''videos''''';<br> | |
− | + | '''''cond = {+info -info =func !func ~number} - условия срабатывания;<br> | |
− | + | '''''to_regular = <number>,<тип>''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. <'''''number'''''>, <'''''тип'''''> аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.<br> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | '''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает. | |
− | + | ||
− | + | ||
− | Файл | + | Файл: ''gamedata\scripts\sr_sleep.script'' |
− | + | ==Схема sr_cutscene== | |
− | + | ||
− | + | Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.<br> | |
− | + | ||
− | [ | + | '''[sr_cutscene]'''<br> |
− | + | '''''point = <имя_пути>''''' - путь в первую точку которого переносится игрок.<br> | |
− | + | '''''look = <имя_пути>''''' - путь в первую точку которого смотрит игрок.<br> | |
− | + | '''''pp_effector = <имя_постэффекта>''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).<br> | |
+ | '''''cam_effector = <имя_анимации_камеры>''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).<br> | ||
− | + | Поддерживается сигнал '''''cameff_end'''''.<br> | |
− | + | ||
− | + | '''''Пример использования схемы''''':<ini>[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</ini> | ||
− | + | Файл: ''gamedata\scripts\sr_cutscene.script'' | |
− | + | ||
− | + | ||
− | + | ||
− | + | ---- | |
− | + | ||
− | + | ||
− | + | ||
− | |||
+ | <font size = 5>[[Часть 4]]</font> | ||
[[Категория:A-Life]][[Категория:Скрипты]] | [[Категория:A-Life]][[Категория:Скрипты]] |
Текущая версия на 09:11, 6 января 2017
Содержание |
---|
Настройка логики. Часть 0 |
Содержание
Скрипт logic
Скрипт logic управляет переключением схем.
В custom_data любого персонажа (кроме свободных) должна присутствовать секция [logic].
Функции, на которые ссылается секция [logic] должны находится в файлах gamedata\scripts\xr_effects.script или gamedata\scripts\xr_conditions.script.
В секции должно присутствовать одно из полей:
- active = <название_схемы> - активная схема, запускающаяся первой.
- cfg = <имя_ltx_файла_с_настройками> - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки gamedata\config\scripts).
- active = <название_схемы> - активная схема, запускающаяся первой.
[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).
- on_actor_dist_le = <number>|<название_схемы> - если дистанция в метрах до игрока меньше либо равно number.
Примечание: если происходит переключение между несколькими одноименными схемами (например несколькими 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";
- -infoportion - в случае включения секции у актора будет убрана инфопорция "infoportion";
- =function - в случае включения секции стартует функция "function".
- +infoportion - в случае включения секции у актора будет установлен инфопорция "infoportion";
Примечание: для условия переключения схемы {~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.
- floor_wooden;
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 = <имя_пути> - точки движения партикла. Возможны два случая:
- Когда указывается путь анимации камеры (путь учитывается относительно папки gamedata\anims);
- Когда указывается имя патрульного пути.
- Когда указывается путь анимации камеры (путь учитывается относительно папки gamedata\anims);
mode = <параметр> - параметр обязательный и имеет два значения:
- 1 - устанавливается в случае указания анимации камеры для параметра path;
- 2 - устанавливается в случае указания патрульного пути для параметра path.
- 1 - устанавливается в случае указания анимации камеры для параметра path;
looped = true/false - флаг зацикленности партиклов.
Примечание: для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение .anm (например arena.anm).
Поддерживается сигнал particle_end.
В вейпоинтах патрульного пути можно задавать флаги:
- s=<название_звуковой_темы> - звук проигрываемый во время движения;
- d=<number> - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.
- s=<название_звуковой_темы> - звук проигрываемый во время движения;
При 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 - инрементирующий, т.е. отчёт по возрастанию.
- dec - декриментирующий, т.е. обратный отсчёт;
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