Меню

Пда

Чатик

Поиск

Главная » Статьи » Моды и моддинг » Моддинг

Настройка логики (часть 3)
Настройка логики (часть 3)
3.8.1. Синтаксис скрипта Logic
Пример: для того, чтобы персонаж ходил по пути walk1, а при приближении игрока на дистанцию
5 метров, переключался на путь walk2 (но только при условии, что он видит игрока), нужно
написать следующее:
[logic] active = walker1
[walker1] path_walk = walk1 path_look = look1 on_actor_dist_le = 5 | walker2
[walker2] path_walk = walk2 path_look = look2
Выше рассмотрено безусловное переключение секций. Перед именем секции в фигурных скобках
{} можно задавать дополнительные условия, а после имени секции - так называемые "эффекты",
которые заключить в знаки процента: %%. Эффекты будут применены только в случае активации
секции. Можно не задавать имя секции, а задать только условия и/или эффекты. Тогда активной
останется старая секция, но условия и эффекты будут все равно обработаны. Если все условия в
фигурных скобках не выполняются, секция активирована не будет.
Пример:
on_actor_dist_le = 5 | {условие} walker2 %эффекты%
Условия могут быть следующими:
+infoportion - требуется присутствие infoportion у actor -infoportion - требуется отсутствие
infoportion у actor =func - требуется, чтобы func вернула true !func - требуется, чтобы func вернулся
false
Эффекты могут быть следующими:
+infoportion - в случае включения секции у actor будет установлен infoportion -infoportion - в
случае включения секции у actor будет убран infoportion =func - в случае включения секции
стартует функция func
Несколько условия или эффектов разделяются проблемами:
on_actor_dist_le = 5 | {+info1 -info2 +info3} walker2 %+info4 =func%
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева
направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если
установлен info1, будет включена схема walker2, иначе, если установлен info2, будет включена
схема walker3, иначе будет включен walker4:
on_actor_dist_le = 5 | {+info1} walker2, {+info2} walker3, walker4
В описанном выше поле active секции logic, можно также задавать условия, например:
[logic] active = {=actor_friend} walker@friendly, walker@enemy В логических условиях теперь
принимается ключевое слово never, которое означает, что условие ложно. Например:
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %...эффекты...
%
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг - игрок в костюме,
но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%)
секции never. Таким образом, выбор секции never равносилен отсутствию секции
(несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.
Пример работы с секцией nil. Секция nil выводит из-под скриптовых схем персонажа, монстра или
объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись
1 раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом
апдейте проверяют это условие.
[logic] active = sr_idle
[sr_idle] on_actor_inside = nil %+esc_actor_inside% То есть, при входе актера в рестриктор выдается
инфопоршн и рестриктор уходит в секцию nil, больше не проверяя наличие игрока. NB: Обратно
из секции nil под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.
3.8.2. Вот пример достаточно сложной логики:
[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 on_hit = hit on_death
= death combat_ignore_cond = {-alert}
[combat_ignore]
Рассмотрим ее пошагово. Вначале сталкер работает по схеме walker-a. При этом он игнорирует
бой, пока не будет поставлен инфопоршн alert. Он ждет 25 секунд, после чего переходит в схему
remark. В ремарке он проигрывает идловую анимацию, говорит на указанные темы, не
поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут (on_hit) или
убьют (on_death), будет поставлен инфопоршн alert и он перестанет игнорировать бой (понятно,
что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все
остальные). Если его убьют, то также будет поставлен инфопоршн trup3 который сообщит о том,
что этот сталкер убит.
А вот логика его противника: [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 (подойдет к костру).
3.9. Схемы логики space_restrictor
Общее замечание: Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот
не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше
2 метров.
3.9.1. Схема [sr_idle]
Предназначение данной схемы – включить другую схему при срабатывании одного из
стандартных условий логической схемы. Сама по себе схема ничего не делает. Пример настроек
рестриктора:
[logic] active = sr_idle
[sr_idle] on_actor_inside = nil %+esc_actor_inside%
Обратите внимание, что после срабатывания проверки активная схема переключается в nil, чтобы
не продолжать бесполезную проверку на каждом апдейте. Можно не задавать nil. Часто эта схема
работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему
уже кого-то спавнит.
файл \gamedata\scripts\sr_idle.script
3.9.2. Секция [sr_no_weapon]
Данная схема убирает оружие у игрока при входе в зону. Пример настроек рестриктора:
[logic] active = sr_no_weapon
[sr_no_weapon]
файл \gamedata\scripts\sr_no_weapon.script
3.9.3. Секция [sr_sound]
snd = Перечень имён звуков разделенных запятыми.
type = Типы звуков через запятые. Для удобства введены типы наборов звуков. Т.е., например,
чтобы не перечислять каждый раз весь набор звуков скрипа деревянного пола, можно указать тип
floor_wooden.
· delay = Задержка перед проигрыванием звука в секундах реального времени, по умолчанию
0.
· idle = Длина периода игнорирования входа в зону после начала последнего проигранного
звука. Чтоб, например, завывание было не чаще, чем раз в несколько минут. В секундах
игрового времени. По умолчанию 0.
· rnd = Вероятность (в процентах) того, что звук отыграется. По умолчанию 100.
· position = Задает имя пути, в вершинах которого может отыграться звук. Есть
зарезервированное значение random. Оно означает случайное место в радиусе 15…50
метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.
· slide_velocity = Скорость (м/с) передвижения звука по точкам патрульного пути. По
умолчанию - 3
· slide_sound_once = true\false
true - проиграть звук один раз, даже если он не дошел до последней точки пути. false – если звук
закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию false.
· play_at_actor = true/false Заставляет звук играться от позиции актера постоянно. Если он
будет
равен true и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.
Предназначение данной схемы: отыграть звук при входе актёра в рестриктор.
Поддерживается sound_end.
Обязательно нужно задать либо snd, либо type. Можно их задать вместе. На базе этих параметров
составляется список звуков. При входе актёра в рестриктор отыгрывается случайный звук из этого
списка.
Место, из которого может отыграться звук, задаётся одним из трёх: - случайное; - случайная
вершина заданного пути; - позиция игрока.
Пример настроек рестриктора:
[logic] active = sr_sound
[sr_sound] type = floor_wooden snd = ambient\wind1, ambient\sparks1 rnd = 50 position = random idle =
120 delay = 3
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает
отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки
на патрульном пути) со скоростью slide_velocity.
[logic] active = sr_sound
[sr_sound] type = random position = way slide_velocity = 8 slide_sound_once = true
Файл \gamedata\scripts\sr_sound.script
3.9.4. Секция [sr_tip]
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор
name = Название новости. type = по умолчанию «news» Тип новостей: «news» – отсылается как
глобальная новость, «tips» - отсылается то имени sender-a
· sender = если тип = «tips», то от sender задаёт условный строковый идентификатор иконки
персонажа, от которого якобы пришло сообщение. По умолчанию это иконка торговца.
· cond = Необходимые логические условия, при которых подсказка сработает. По дефолту,
сработает при входе в зону.
· single = true/false (по умолчанию false). Если параметр в true, то типс будет выдан только
один раз,
Пример настроек рестриктора:
[logic] active = sr_tip
[sr_tip] name = tips_esc_trader_about_pda type = tips cond = {+infoportion1 –infoportion2 }
· showtime = msec – время в миллисекундах, в течение которого сообщение будет находится
на экране. – ПОКА НЕ РАБОТАЕТ НОРМАЛЬНО!
Если необходимо проиграть только 1 раз, а это случается часто, то можно добавить следующую
строку: on_actor_inside = nil
файл \gamedata\scripts\sr_tip.script
3.9.5. Sr_light
Зона, в которой фонарики у неписей будут включены независимо от времени суток.
Работает следующим образом:
[logic]
active = sr_light
[sr_light]
light_on = true/false (свет включен/выключен)
Также работает вместе с кондлистом:
[logic]
active = sr_light
[sr_light]
light_on = true/false (свет включен/выключен)
on_info = {+info1} section %+info2%
3.9.6. Sr_territory
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.
Пока что она отлавливает только хиты и смерть сталкеров. Пример использования примерно
следующий:
[logic] active = sr_territory@outside
[sr_territory@outside] on_actor_inside = sr_territory@inside
[sr_territory@inside] on_actor_outside = sr_territory@outside territory_hit = {-bar_dolg_territory_1_hit}
%+bar_dolg_territory_1_hit%, {-bar_dolg_territory_2_hit} %+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%
То есть здесь видно, что когда игрок находится внутри рестриктора, то считается количество
нанесенных хитов, а также учитывается был ли кто-то убит или нет. Поскольку схема работает
только с игроком – то хиты и смерть засчитываются только от игрока.
3.9.7. Sr_mapspot
При входе в рестриктор он сам себя подсвечивает на карте.
Параметры:
hint - id подсказки в string table (обязательный параметр)
location - название типа подсветки (не обязательный параметр, по умолчанию
"crlc_small")
Пример: [logic] active = sr_mapspot
[sr_mapspot] hint = "gar_swamp” location = crcl_big
3.9.8. Sr_particle
Данная система отыгрывает партиклы как статичные так и движущиеся в указанном месте и в
указанное время. Работет она следующим образом:
· Для партикловой системы с путем камеры:
[sr_particle]
name = explosions\campfire_03 -имя партикловой системы
path = particle_test.anm -имя пути камеры
mode = 1 (обязательно !!!)
looped = true/false -флаг зацикленности партиклов
(обязательно с расширением ANM !!!) Здесь партиклы будут молча перемещаться
по пути.
· Для партикловой системы с обычным патрульным путем:
[sr_particle]
name = explosions\campfire_03 -имя партикловой системы
path = part_points -имя патрульного пути
mode = 2 (обязательно !!!)
looped = true/false -флаг зацикленности партиклов
В вейпоинтах можно задавать флаг s=имя_звуковой_темы и d=число время задержки перед
проигрыванием (задается в миллисекундах, если не задано, то 0). Далее, s - имя звуковой темы в
sound_themes.ph_snd_themes из которой будет случайно выбран звук для проигрывания во время
проигрывания партикла. Звук не зацикливается и играет только один раз... результат - партиклы
отыгрываются во всех вейпоинтах одновременно (или с задержкой см. выше).
При looped=true по окончании проигрывания партиклов, они будут запускаться сначала, но уже
без задержек. Сигнал particle_end выдаваться не будет. При looped=false сигнал будет выдан, когда
все источники партиклов отыграют. Поддерживается кондлист. Если рестриктор переходит в
другую секцию, то автоматически перестают отыгрываться партиклы и замолкают звуки при них.
Этот рестриктор является объектом, отслеживающим партиклы и нет никакой необходимости
чтобы игрок в него заходил.
3.9.9. Sr_sound_act
Итого, схема, которая играет саунд в голове актера. Всякие там переговоры по PDA и прочие
фейки.
[sr_sound_act]
· snd = ambient\random\new_drone1 --имя звукового файла
· delay = 2000 --задержка перед проигрыванием
· delay_max = 4000 -- между проигрыванием звука будет взят случайный промежуток между
delay и delay_max.
· on_signal = sound_end | nil --по сигналу можно перейти в другую секцию.
· theme = <имя темы из ph_sound_themes>
· stereo = true/false (по умолчанию false). При установке этого параметра к файлу, который
задан параметром snd или в звуковой теме будут добавляться (автоматически) суффиксы _r
и _l для загрузки левого и правого каналов и, соответственно, вся эта фигня будет играться.
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из
звуков прописанных в теме, если указывается звук, то он отыгрывается один раз. Схема
поддерживает кондлист.
3.9.10 Sr_timer
Пример использования:
[logic] active = sr_timer@1
[sr_timer@1] type = dec start_value = 10000 on_value = 0 | sr_timer@2
[sr_timer@2] type = inc on_value = 15000 | nil %+info1%
Описания полей: type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec). Если
поле не задано - счетчик будет инкриментирующий start_value - начальное значение счетчика в
РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для
инкриментирующих, если не задано, то считается с 0.
Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по
специфическому условию on_value. В общем случае on_value Можно использовать для
производства каких либо действий в зависимости от состояния счетчика. Например:
on_value = 5000| %+info1% | 1000| %+info2%
3.9.11. Sr_psy_antenna
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре).
Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к
интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг
в друга, пересекать друг друга.
eff_intensity = - увеличение/уменьшение в % от базового значения интенсивности излучения. hit_
intensity = - увеличение/уменьшение в % от базового значения наносимого повреждения.
Пример зоны, которая добавляет 70% излучения:
[logic] active = sr_psy_antenna
[sr_psy_antenna] eff_intensity = 70 hit_ intensity = 70
Пример зоны, которая убирает 30% излучения:
[logic] active = sr_psy_antenna
[sr_psy_antenna] intensity = -30
3.9.12. Sr_teleport
Собственно, телепорт. Настраиваются следующим образом:
[logic] active = sr_teleport
[sr_teleport] timeout = 0
point1 = point1 look1 = look1 prob1 = 10
point2 = point2 look2 = look2 prob2 = 20
где: timeout - задержка в срабатывании телепорта в миллисекундах. point - одноточечный
патрульный путь куда переместить look - одноточечный патрульный путь куда повернуть.
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше
примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую.
Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с
особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст
эффект втягивания.
3.9.13. Sr_sleep и настройка снов.
Появилась возможность задавать зоны сна.
[sr_sleep]
· cond = <condlist>
· type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по
умолчанию all). Влияет (группирует) только на несценарные сны.
· dream_prob = <число от 0 до 100> - вероятность просмотра несценарных сновидений в
данной зоне (по умолчанию 80). В противном случае будет только черный экран.
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас
производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая
иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую. Сновидения
теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при
выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных
или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность
отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого
конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом
ограничивать по нему сны воспроизводимые в sr_sleep.
В файле misc\dream.ltx задаются настройки снов.
Секция videos. Полями задаются пути к видеофайлам со снами.
Секция dreams. Поля: regular_probability = <число от 0 до 100> - вероятность проигрывания
обычных сновидений в целом regular - список секций с настройками для обычных сновидений
scene - список секций с настройками для сценарных сновидений
Настройки обычных сновидений: dream - имя поля из секции videos probability = <число больше
0> - чем больше, тем больше вероятность проигрывания сна. type = nightmare/normal/happy - тип
сна.
Настройки сценарных сновидений: dream - имя поля из секции videos cond = <condlist> - условия
срабатывания to_regular = <вероятность,тип> - необязательное поле. Дает возможность переводить
сценарный сон после первого отыгрыша в разряд обычных. <вероятность, тип> аналогичны
probability и type из настроек обычных сновидений соответственно.
3.9.14. Sr_cutscene
Эта схема предназначена для проведения анимации камеры c некоторым эффектом (pp_effector).
Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения
игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления
игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает
управление.
[sr_cutscene] point = <имя пути> - путь в первую точку которого переносится игрок look = <имя
пути> - путь в первую точку которого смотрит игрок
· pp_effector = <имя файла с эффектом> - файл, расположенный в папке
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения) cam_effector = <имя
файла с анимацией камеры> - файл, расположенный в папке gamedata\anims\camera_effects\ и
содержащий анимацию камеры (имя файла пишется без расширения)
3.10. Набор дополнительных настроек логики у разных
объектов.
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно
при необходимости переводить объекты.
3.10.1. Схема работы двери, секция [ph_door]
NB! Для двухстворчатых ворот задается все аналогично.
locked = false\true Заперта ли дверь. По дефолту – false.
Closed = false\true Закрыта ли дверь. По дефолту - true
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked) Подсказка, которая
появляется около прицела при наведении на дверь, если дверь закрыта.
tip_close = (если locked == false, то tip_door_close, иначе пустое значение) Подсказка, которая
появляется около прицела при наведении на дверь, если дверь открыта.
snd_init = Звук, который будет отыгран сразу при включении схемы.
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.
Примеры: Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то
можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении
схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:
[logic] active = ph_door@locked
[ph_door@locked] locked = true snd_open_start = trader_door_locked on_info =
{+esc_trader_can_leave} ph_door@unlocked
[ph_door@unlocked] locked = false snd_init = trader_door_unlock snd_open_start =
trader_door_open_start snd_close_start = trader_door_close_start snd_close_stop =
trader_door_close_stop файл \gamedata\scripts\ph_door.script
3.10.2. Схема работы кнопки, секция [ph_button]
При нажатии на кнопку переключает секции и выдает инфопоршн.
[logic] active = ph_button@locked
[ph_button@locked] anim_blend = false anim = button_false on_press = ph_button@unlocked %
+cit_jail_door_opened%
on_press – что происходит при нажатии anim – анимация, которая отигрывается при нажатии на
кнопку anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false
Файл \Gamedata\scripts\ph_button.script
· tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на
кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот
девайс можно нажимать.
Пример настройки кнопки:
[logic] active = ph_button@active
[ph_button@active] anim = lab_switcher_idle tooltip = tips_labx16switcher_press on_press =
ph_button@deactivated %+terrain_test%
[ph_button@deactivated] anim = lab_switcher_off
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры
сообщение следует писать с использованием токенов. Например:
<string id="tips_labx16switcher_press">
<text>Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)</text>
</string>
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:
[logic] active = ph_button@locked
[ph_button@locked] anim = button_false – анимация несрабатывания кнопки. on_info =
{+val_prisoner_door_unlocked} ph_button@unlocked on_press = ph_button@unlocked %
+val_prisoner_door_unlocked%
[ph_button@unlocked] anim = button_true on_info = {-val_prisoner_door_unlocked} ph_button@locked
on_press = ph_button@locked %-val_prisoner_door_unlocked%
Авторы
Статья создана:
· GSC Game World
Категория: Моддинг | Добавил: Gluck (22.07.2012)
Просмотров: 579 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наши партнеры


Книги сталкер
Найти другие книги

Новые Темы

Популярные Темы

Новые Файлы

Популярные Файлы

В вылазке: 3
Новичков: 3
Сталкеров: 0


Кто был сегодня на сайте:


Вакансии
Яндекс.Метрика Рейтинг@Mail.ru
Яндекс.Метрика