Trigger Sounds

Материал из S.T.A.L.K.E.R. Wiki
Перейти к: навигация, поиск

Триггер (англ. trigger, спусковой крючок) — в компьютерных играх механизм, проверяющий присутствие каких-либо объектов игрового мира в заданном пространстве или расстояние от этих объектов до специальной точки. При выполнении условий (например, объект находится в триггерной зоне и этот объект — игрок) срабатывает определённое событие или цепь событий (скрипт).


Введение[править | править код]

Из раскрытого выше понятия триггера следует понимание, что Trigger Sounds (букв. триггерные звуки) это статические звуки с чётко определённым местоположением, которые срабатывают при вхождении игрока в зону триггера (зону срабатывания) этого звука. Далее приведено исследование реализаций триггерных звуков в бета-сборках, и в финальной версии игры.

Реализация в старых сборках 2003-2004 года[править | править код]

Откуда что пошло?

Старый сюжет, локация Кордон. О казарме на военном блокпосту.[1]

6. В домике активационная зона, которая издаст громкий звук скрипнувшей половицы (звук половицы)

  • Игрок вступает в зону активации (звук скрипнувшей половицы)
  • Солдаты испуганы («Там! В дддомике кто-то есть!»)
  • Один из солдат предполагает, что это в разваленный дом забрался сталкер (как раз там, где спрятался игрок)
  • Он убеждает напарника пойти проверить, но тот всеми силами отказывается.
  • Когда же он решается проверить, то подходит практически вплотную к дверному проему (лунный свет бросает тень в проем, возле притаившегося игрока), но потом, испугавшись, решает не проверять.
  • Он кричит, что никого нет, и возвращается к первому солдату.


В сборке 1935 в казарме на блокпосту военных действительно присутствуют статические триггерные звуки, отыгрывающие звуки скрипящих половиц в тех местах, где смоделированы гнилые проваливающиеся доски[2]. Такие звуки ещё можно наблюдать внутри домов в деревне. Рассмотрим далее, как они реализованы.

Сборка 1935 хороша тем, что вместе с ней поставлялись исходники локаций и LevelEditor. Поэтому далее работаем с ней. Откроем исходник Кордона, ищем нужный домик. Видим, что в том месте, где скрипит половица, стоит белый флажок, а вокруг него зелёная сфера. Белый флажок означает, что в этом месте находится spawn-элемент с говорящим названием script_zone (скриптовая зона). Зелёная сфера это шейп (shape), то есть некая зона на локации[3]. Так как script_zone это точка, и для того чтобы она стала зоной, нужно добавить shape и объединить оба объекта.[4] Так образовали триггер.

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

Раз наш спавн-объект называется script_zone, можно предположить, что триггер запускает некий скрипт. Скрипты уровня в 2004 году грузились через customdata (файл level.ltx) уровня. Файл находится в папке уровня.

Открываем level.ltx Кордона. Вот его содержимое (ключевой момент выделен):

; level script file [level_scripts] script = scr_trader, escape_raids, escape_sound_events, escape_raid_heli, level_news, escape_patrol2

[level_map] //тут опустил параметры карты

В секции [level_scripts] методом исключения обнаруживаем единственный подходящий под наши нужды скрипт. Он называется escape_sound_events.script и именно в нём прописано условие срабатывания триггера.

Открываем нужный скрипт. Что видим? Функцию с парой десятков однотипных строк.

function main() ... xr_events.SoundEvent( get_level_object( "sound_zone_01" ), actor, "ambient\\floor_creak1", ... , "ambient\\floor_creak3") ... end

SoundEvent — специальная функция звуковых оповещений, в том числе для проигрывания звука «под ногами». На входе — объект (ищем на уровне по имени вида sound_zone_01), инициатор (кто вызывает срабатывание, actor) и перечень проигрываемых звуков. Вот оно что! Их несколько, а далее xr_events.SoundEvent производит случайный выбор.

Реализация в Тени Чернобыля[править | править код]

Прошло три года, от xr_events не осталось и следа. Вернее — он в переименованном и сильно переписанном виде пока что ещё есть. Но секция скриптов уровня не работает, да и решение какое-то корявое… В общем, не выходит по-старому.

На выручку приходит нововведение - space_restrictor. По сути это и есть готовое решение для триггера (но shape всё равно необходим). Расписывать его функционал нет смысла, очень долго, остановимся только на практической реализации.

Ставим space_restrictor, ставим shape. Далее объединяем их. Переключаемся обратно в режим спавна, над списком спавн-объектов в командах выбираем Attach Object, кликаем по шейпу, готово.

А скрипт? Он не нужен. Теперь всё делается через логику. Кликаем правой кнопкой по нашему объекту, лезем в свойства нашего space_restrictor-а, и в customdata добавляем следующий код:

[logic] active = sr_idle

[sr_idle] on_actor_inside = [email protected]

[[email protected]] type = floor_wooden play_at_actor = true

Как оно работает: Основная секция [logic]: условие активации — смотреть в секции *имя* (вообще-то idle переводится как «отключение», но во всех скриптах логики это запуск)

Секция активации [sr_idle]: при вхождении ГГ в зону (событие on_actor_inside) — выполняем то, что находится в секции *имя*. При этом префикс sr_sound указывает нам на то, что под секцией лежит схема звукового space_restrictor-а. Поэтому движок будет искать в секции параметры именно этой схемы, а не какой-то другой.

Секция исполнения [email protected]: тип звука — деревянный пол, следующая строка — указание, что проигрываем звук от позиции игрока.

Что такое «тип» и где же тут сами звуковые файлы? Тип это «пред-установка», то есть указание типа подразумевает проигрывание случайно выбранного звука, из набора, перечисленного в описании типа. Пред-установки это очень удобно, так как скрип пола это очень частый случай применения схемы. Аналогично есть тип писка крыс (Помните, когда входим в какое-нибудь помещении лаборатории, то слышим писк разбегающихся крыс, хотя самих крыс давно нет? Так вот, это space_restrictor схемы sr_sound.)

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

На этом пока всё.

Примечания[править | править код]

  1. ^ Потом добавить название документа, так как статья — компиляция из неск. источников.
  2. ^ А тут бы иллюстрацию
  3. ^ Расширенное определение шейпа надо бы
  4. ^ Как оно делается в ТЧ - см. ниже.