Interaction entity

```
***Основная статья***

```

Описание взаимодействия между объектами в игровом мире производится с помощью системы **interactions**. Файлы, отвечающие за это находятся в **resource/set/interaction\_entity**. Разделение на отдельные файлы внутри этой папки необязательно, но позволит Вам, как разработчику, легко ориентироваться при редактировании данных параметров.

Для того, чтобы какой-то объект (сущность, юнит, модель) начал взаимодействовать с окружающим миром по определенным правилам, необходимо в файле описания модели (.def) указать его свойства (props). Например - {props “flesh” “human”} или {props “steel” “vehicle” “tank” “turret”}. При задании свойства дополняют друг друга. Например, если в файле описания модели написано {props “vehicle” “car”}, а затем {props “car” “wheeled”}, то результирующими будут свойства “vehicle” “car” “wheeled”.

Файлы взаимодействий имеют следующую структуру:

{"<свойство>" {<физические параметры>} {on <событие> } }

При этом внутри события условия и действия могут произвольно комбинироваться.

## Физические параметры

Для объектов могут быть заданы следующие физические параметры:

* {friction <значение>} - коэффициент трения. Характеризует, во сколько раз сила трения больше чем сила, с которой действует тело. Изменяется в диапазоне от нуля до бесконечности. Значение по умолчанию равно 1;
* {restitution <значение>} - коэффициент упругости. Изменяется в диапазоне от нуля до единицы. Значение по умолчанию равно 0.3;
* {blast\_absorption <значение>} - коэффициент поглощения взрывной волны. Означает, сколько единиц энергии (кг. тротила) поглощает в себе каждый волюм. Изменяется в диапазоне от нуля до бесконечности. Значение по умолчанию равно нулю.

Пример записи физических параметров: {friction 0.5} {restitution 0.2} {blast\_absorption 2}

## События

Ключевым понятием в системе interactions является событие. События делятся на встроенные и определяемые пользователем. В системе interactions встроены следующие события:

* spawn – при появлении сущности на карте;
* break – происходит при поломке компонента;
* repair – после ремонта компонента;
* bullet\_hit – при попадании в какой-то из волюмов сущности пули;
* blast\_hit – при достижении волюмов сущности взрывной волны, приходит один раз на сущность;
* blast – при достижении волюмов сущности взрывной волны, приходит на каждый волюм;
* pierce – при пробивании волюма пулей;
* contact – при столкновении волюма с волюмами других сущностей;
* overlap begin– при пересечении волюмов, в начале пересечения;
* overlap end – при пересечении волюмов, в конце пересечения;
* ground\_hit – при ударе об землю;
* terrain “<имя>” enter – при входе сущности в новый тип территории;
* terrain “<имя>” leave – при выходе сущности из текущего типа территории;
* animation\_end – при окончании анимации;
* operatable on – при включении режима функционирования (у техники);
* operatable off – при выключении режима функционирования (у техники);
* board in – вначале посадки при подходе к нужному месту (у людей);
* board out – при высадке из техники (у людей);
* seat – при посадке на конкретное место в технике (у людей);
* collect in – при взятии экипажа (у техники)
* collect out – при высадке экипажа (у техники).

Формат записи обработчиков событий: {on <событие> … } Например: {on spawn … } или: {on terrain “ground” enter … }

Кроме того, пользователь может определять свои события, которые затем можно вызвать действием **call**. Пользовательские события записываются так же, как и встроенные, но в двойных кавычках. Формат записи определяемых пользователем событий: {on “<имя события>” … } Вызов события: {call “<имя события>”}

По умолчанию события для различных свойств вызываются последовательно в порядке, обратном их определению в файле interaction.set (по сути определяется порядком включаемых файлов). Например, если для объекта заданы свойства {props “steel” “car”}, то событие вызовется как для свойства “steel”, так и для свойства “car”. Но так как свойство “car” определено во включаемом файле “car.inc” после свойства “steel”, определенного в “generic.inc”, то вначале вызовется событие для свойства “car”, а затем для “steel”. Для того, чтобы вызвалось событие только для последнего свойства, оно определяется со словом **overload**. {on <событие> overload … } При этом может понадобиться вызов событий для остальных свойств, который можно осуществить посредством действия {inherited}.

Некоторые события определены как пользовательские, но вызываются из игры. Таким образом для техники (vehicle) вызываются следующие пользовательские события: “move\_on”, “move\_off” – сигнализирующие о начале и окончании передвижения; “stop\_on”, “stop\_off” – противоположные “move\_on” и “move\_off”; “exhaust” – при увеличении нагрузки на двигатель; “engine\_on”, “engine\_off” – при запуске и остановке двигателя. Для людей (human) вызываются события перезарядки “reload”, бросания гранаты “grenade”, выстрела “fire”, взятия оружия в руки “take”, выпускания дыма изо рта при курении “smoke”. Для животных (animal) вызывается событие “idle”, когда они ничего не делают. Также для сущностей, которые могут падать по физике (столбы, деревья), определенных как pillar, вызывается событие “fallen” в начале падения.

## Условия

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

* bullet “<тэги>” – тэги пули (можно проверять внутри событий bullet\_hit, pierce);
* volume “<тэги>” – тэги волюма (внутри событий bullet\_hit, blast, pierce, contact, overlap, ground\_hit);
* component “<тэги>” – тэги компонента (внутри событий break, repair);
* work “<тэги>” – проверить работоспособность компонент с заданными тэгами;
* bone “имя кости” – имя кости (внутри событий collect, board, seat);
* effector “<свойства>” – свойства сущности (props), с которой происходит взаимодействие (внутри события contact);
* dead – состояние смерти;
* operatable – состояние работоспособности;
* min\_energy <значение> – энергия взрывной волны больше заданного значения (внутри события blast);
* min\_speed <значение> – скорость сущности больше заданной (внутри событий ground\_hit, contact);
* min\_mass <значение> – масса сущности больше заданной (внутри событий hit во взаимодействиях с территориями);
* rand <значение> – заданное значение больше чем случайная величина в интервале от 0 до 1 (rand 0.1 будет выполняться в 10% проверок);
* name “<тэги>” – тэги оружия (внутри события take);

Формат записи условий:

{if <условие 1> {<действия>}

else <условие 2> {<действия>}

else

{if <условие 3> { {<действия>} } }

Также можно проверять обратные условия, при этом перед условием ставится слово not. Например: {on blast {if volume “wheel” {if min\_energy 0.5 {if rand 0.7 {<действия>} } } else volume “body” {if bullet “shell fg” {<действия>} else not bullet “big” {<действия>} } } }

## Действия

Ответной реакцией объекта на события окружающей среды являются его действия. Действия делятся на следующие категории:

1. управление анимациями;
2. управление звуками;
3. управление волюмами, компонентами и зонами;
4. управление спецэффектами;
5. управление экипажем;
6. управление здоровьем;
7. другие действия.

### Управление анимациями

Для запуска анимации служит действие ani\_play. Формат записи действия:

{ani\_play “<имя анимации>” <скорость> <флажки>}

Параметр скорости указывает, во сколько раз будет отличаться скорость в игре по отношению к оригинальной скорости. Значение больше единицы ускоряет анимацию, меньше единицы – замедляет. При этом могут задаваться дополнительные флажки, которые записываются через пробел. **loop** – означает, что анимация зациклена; **resume** – возобновить анимацию (после действия ani\_stop); **callback** – генерировать событие animation\_end в момент окончания анимации;

Примеры записи для запуска анимации: {ani\_play “walk”} – запускает анимацию с именем “walk” для проигрывания один раз. {ani\_play “run” 1.5 loop} – зациклено запускает анимацию с именем “run” со скоростью в полтора раза быстрее оригинальной. Пример записи с генерацией события: {on spawn {ani\_play “pick” callback} } {on animation\_end “pick” <действия> } Запускает анимацию, по окончании которой происходит событие animation\_end. Следует отметить, что если анимации с заданным именем не существует, то ничего не запускается, но событие animation\_end приходит сразу же.

Для остановки анимации существует действие ani\_stop. Формат записи действия:

{ani\_stop “<имя анимации>”}

### Управление звуками

При написании interaction для какой-либо сущности необходимо разделить звуки на 2 категории: те, которые могут постоянно запускаться и останавливаться (например, звук работающего двигателя, пение птиц, …) и однократно проигрываемые звуки (например, звук взрыва танка, звук падающего дерева).

Звуки первой категории лучше всего сначала привязать к сущности в событии **spawn**. Для того, чтобы это сделать, существует действие **link\_sound**. Формат записи действия: {link\_sound “<имя звука interaction>” “<группа звука>.<имя>”} Имя звука interaction – имя, с которым в дальнейшем будут работать действия запуска и остановки звука. Группа звука и имя задаются через точку и определяют конкретный звук из файла настроек звуков set\sound.set. Например: {on spawn {link\_sound “engine” “engine.tank”} } После привязки звука для того, чтобы его запустить, необходимо выполнить действие play\_sound. Формат записи: {play\_sound “<имя звука interaction>” <флаг зацикливания>} По умолчанию флаг зацикливания звука равен 0.

Например: {on “move\_on” {play\_sound “engine” 1} } Для остановки таким образом проигрываемого звука существует действие stop\_sound. Формат записи действия: {stop\_sound “<имя звука interaction>”}

Например: {on “move\_off” {stop\_sound “engine”} }

Для звуков второй категории (однократно проигрываемых для сущности) определено действие start\_sound. Формат записи: {start\_sound “<группа звука>.<имя>”} Например: {on “explosion” {start\_sound “death.tank”} }

### Управление волюмами, компонентами и зонами:

#### Управление волюмами

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

* visible – видим другими объектами игрового мира и может закрывать собой какие-либо объекты;
* bullet – является препятствием при трассировке пуль (может быть пробит либо пуля застряет внутри);
* overlap – информирует о пересечении с волюмами других сущностей;
* obstacle – используется для автоматической генерации зон - препятствий для других сущностей;
* contact – может сталкиваться с волюмами других объектов;
* contact\_ground - может сталкиваться с землей;
* blast – на волюм может действовать взрывная волна.

В системе interactions можно по определенным событиям изменять свойства волюмов. Например, если на волюм действует взрывная волна, то при определенном пороге он может сломаться. При этом он теряет в дальнейшем свойство действия на него взрывной волны, или, например, при полном физическом уничтожении, все свойства. Для работы с волюмами используются действия volume и volumes. При этом можно как запрещать какие-то свойства, так и разрешать. Действие volume распространяется на текущий волюм в контексте. Формат записи: {volume <enable/disable> <свойства>} Volumes же действует на все волюмы, имеющие заданный тэг. Формат записи: {volumes “<тэги>” <enable/disable> <свойства>} Пример использования: {on blast {if volume “body” {if min\_energy 1.0 {volumes “body” disable blast bullet visible} } } } или: {on pierce {if volume “head” {if bullet “shell” {volume disable bullet} } } }

#### Управление компонентами

В то время как волюмы отражают физическую структуру модели, компоненты отражают компонентную структуру. Они могут ломаться, ремонтироваться, влияя на функциональность и изменяя при этом визуальный вид модели. Компоненты могут обладать следующими свойствами:

* work – означает что компонент рабочий и его можно сломать. При поломке вызывается событие on break;
* repair – означает, что после того, как компонент сломается, его можно будет отремонтировать. После ремонта приходит событие on repair;
* break\_by\_pierce – означает, что при пробивании волюма(ов), из которых состоит компонент, он ломается;

Для работы с компонентами служат действия component и components, аналогичные действиям работы с волюмами. Формат записи: {component <enable/disable> <свойства>}. Components действует на все компоненты, имеющие заданный тэг. Формат записи: {components “<тэги>” <enable/disable> <свойства>} Пример использования: {on blast {if component “wheel” {component disable work} } } После выключения у компонента колеса свойства “work”, автоматически вызывается событие on break. {on break {if component “wheel” {chassis\_work 0} } } Или: {on “explosion” {components “turret” disable work repair} } {on break {if component “turret” {ik\_enable “turret” 0} } } Вид компонента зависит от его свойств. Если он не работоспособен, то его вид берется из модели “\_x”, если он не работоспособен, и его нельзя отремонтировать, то из модели “\_xx”.

#### Управление зонами

Зоны необходимы юниту для того, чтобы создавать препятствия другим при поиске пути. При сильном изменении структуры объектов (например, полном разрушении стены дома) необходимо отключить препятствия. Для этого используется действие **area**. Формат записи: {area <enable/disable> <”тэги”>} Например: {on pierce {if volume “wall1” {area disable “wall1”} } }

### Управление спецэффектами

Спецэффекты можно разделить на 2 категории: те, которые постоянно прилинкованы к объекту и периодически включаются/выключаются(например, дым из выхлопной трубы у машины, пыль из-под колес, горение) и те, которые иногда появляются при определенных обстоятельствах (попадание снаряда в землю, падение объекта на землю, разрушение строений, и т.д.). Спецэффекты первой категории необходимо прилинковать к сущности в момент появления. Для этого существует действие **add\_view**. Формат записи действия: {add\_view “<название спецэффекта>” “<имя спецэффекта interaction>” “<имя кости>”} <название спецэффекта> - имя .def - файла со спецэффектом (без расширения); <имя спецэффекта interaction> - имя, с которым в дальнейшем будут работать действия запуска, остановки этого спецэффекта и т.д.; <имя кости> - задает кость, к которой будет прилинкован спецэффект. Если в спецэффекте не указано направление, то он будет направлен по оси “OX”. Пример записи: {add\_view “smoke\_black” “smoke1” “FXSmoke1”}

Для того, чтобы запустить прилинкованный спецэффект, необходимо выполнить действие **view start**. Формат записи: {view start “<имя спецэффекта interaction>”} Например: {view start “<smoke1>”}

Для того, чтобы приостановить спецэффект с возможностью дальнейшего запуска, служит действие **view pause**. Формат записи: {view pause “<имя спецэффекта interaction>”} Например: {view pause “<smoke1>”}

Для того, чтобы остановить спецэффект без возможности дальнейшего запуска, служит действие view stop. Формат записи: {view stop “<имя спецэффекта interaction>”} Например: {view stop “<smoke1>”}

Кроме этого можно скрывать и показывать виды (view). Для этого существуют действия **view show** и **view hide**. Формат записи: {view show “<имя спецэффекта interaction >”} {view hide “<имя спецэффекта interaction >”} Действия **view show** и **view hide** полезны при работе со спрайтовыми видами, в то время как **view start**, **view stop**, **view pause** необходимы для работы в основном с видами – системами частиц.

Со спецэффектами второй категории необходимо работать с помощью действия **spawn**, которое будет рассмотрено далее.

### Управление экипажем

Для управления экипажем техники используются действия **crew\_enable** и **kill\_crew**. Действие **crew\_enable** разрешает либо запрещает посадку экипажа в заданное место или группу. Формат записи: {crew\_enable <place/group> “<имя>” <флаг разрешения>} Например, чтобы запретить посадку экипажа не место водителя, необходимо написать: {crew\_enable place “driver” 0} Для того, чтобы запретить посадку пассажиров в кузов машины, необходимо выполнить действие: {crew\_enable group “passengers” 0} Действие **kill\_crew** необходимо для убивания экипажа (имеется в виду экипаж, который полностью скрыт в технике, например, водитель танка). При этом задается конкретное место. Формат записи: {kill\_crew “<место>”} Например: {on pierce {if volume “turret” {kill\_crew “gunner”} } }

### Управление здоровьем

У таких юнитов, как люди, животные, и др. может быть здоровье. Для управления здоровьем существуют следующие действия:

* health\_damage\_pierce – при изменении здоровья от пробивания. Формат записи: {health\_damage\_pierce “<событие попадания>” “<событие повреждения>” “<событие смерти>” “<событие уничтожения>” {“<тэги оружия>” <отбираемое здоровье>} {“<тэги оружия>” <отбираемое здоровье>} {“<тэги оружия>” <отбираемое здоровье>} {…} } Аргументами действия являются пользовательские события попадания, повреждения, смерти и уничтожения, а также список, в котором перечислены различные тэги оружия и отбираемое здоровье. Событие попадания вызывается, когда здоровье не отбирается (пуля потеряла пробивную способность). Событие повреждения вызывается, если после отбирания здоровья у юнита его результирующее здоровье больше нуля. Событие смерти вызывается, если результирующее здоровье после отбирания меньше нуля. Событие уничтожения вызывается, если результирующее здоровье после отбирания меньше нуля, и по абсолютной величине оно в пять раз превышает максимальное исходное здоровье. Пример записи: {on bullet\_hit {health\_damage\_pierce “hit” “damage” “die” “explosion” {“big shell” 5000} {“shell” 1000} {“rifle” 100} {“mgun” 30} {“smg” 25} {“pistol” 20} } }

* health\_damage\_blast – при изменении здоровья от взрывной волны. Формат записи: {health\_damage\_blast “<событие попадания>” “<событие повреждения>” “<событие смерти>” “<событие уничтожения>” {<энергия волны> <отбираемое здоровье>} {<энергия волны> <отбираемое здоровье>} {<энергия волны> <отбираемое здоровье>} {…} } События вызываются по схеме, описанной при повреждении от пробивания. При этом отбираемое здоровье линейно интерполируется между указанными значениями.

* health\_damage\_crush – при изменении здоровья от задавливания. Формат записи: {health\_damage\_crush “<событие задавливания живого>” “<событие задавливания мертвого>” } Аргументами действия являются события задавливания живого юнита (здоровье больше нуля) и задавливания мертвого юнита (вызывалось действия die). Например: {on contact {if effector “vehicle” {health\_damage\_crush “die” “crush”}}}

### Другие действия:

#### spawn

Для того, чтобы заданная сущность появилась в игровом мире, существует действие **spawn**. Существует несколько вариантов записи этого действия. {spawn “<имя сущности>” <дополнительные опции> {<действия>} } Спаунит сущность с заданным именем в текущей позиции, развернутую по направлению текущего воздействия (если не заданы доп. опции). В дополнительных параметрах с помощью опций **noposition** можно принудительно задать вместо позиции воздействия центр объекта, а с помощью **nonormal** – не разворачивать новую сущность по направлению воздействия. Также можно задать смещение относительно текущей позиции с помощью параметра **offset <x> <y> <z>**. Внутри этого действия можно использовать другие действия, которые будут применяться к уже появившемуся объекту. Примеры: {on bullet\_hit {if volume “crown” {spawn “tree\_hit\_small”} } } При этом появится спецэффект попадания в крону дерева в месте попадания пули, при чем он будет развернут в направлении полета пули. {on bullet\_hit {spawn “ex\_bomb\_big” nonormal} {spawn “shellhole\_big” nonormal} } В данном случае спецэффект взрыва не будет развернут в направлении полета попавшей в сущность пули.

Другой вариант записи действия: {spawn “<имя сущности>” “<имя кости>” <направление>} Спаунит сущность, развернутую в заданном направлении от заданной кости текущей сущности. Направление задается буквой оси (x, y, z), либо словом random, означающим выбор произвольной оси. Пример использования: {spawn “circledust\_norm” “FXshot” x} Спаунит спецэффект дыма из кости, ориентируя его по оси x. Или, при разрывании человека: {spawn “human\_hand” “handl” {impulse up 1 0.5 dir 8 4 cx 0 12 cy 0 12 fx 0 60 fy 0 60 fz 80 40 } } При этом появляется сущность “рука человека” в позиции кости левой руки, и к ней применяется действие приложения импульса.

#### able

С помощью действия able можно управлять свойствами сущности. Формат записи действия: {able <свойство> <флажок включения>} В данный момент у юнитов определены следующие свойства:

* personage – является персонажем;
* creature – имеется здоровье;
* crew – может управлять техникой;
* repair – может ремонтировать;
* drop – может бросить предметы на землю;
* talk – может говорить;
* select – юнит можно выделить;
* collect – его можно взять другим юнитом;
* examine – можно покопаться у него в инвентаре;
* inventory – инвентарный ящик;
* weapon – оружие, лежащее на земле;
* ammo – боеприпасы, лежащие на земле.

Например: {on “explosion” {able examine 0} } По умолчанию флажок включения равен 1.

#### blastwave

Для того чтобы в определенном месте игрового пространства воспроизвести действие взрывной волны, необходимо выполнить действие blastwave. Формат записи: {blastwave c4 <масса взрывчатки> r0 <радиус0> r1 <радиус1>} После этого действия всем сущностям в радиусе r1 придет событие on blast. При этом энергия взрывной волны постоянна и равна заданной массе до радиуса r0, а затем в интервале от r0 до r1 убывает до 0. К примеру, следующая запись: {blastwave c4 4 r0 5 r1 8} Наносит повреждения взрывной волной с энергией, эквивалентной четырем килограммам взрывчатки. При этом всем юнитам, находящимся в радиусе до пяти метров, приходит взрывная волна с энергией 4 кг, а затем она линейно ослабевает до нуля на расстоянии от пяти до восьми метров.

#### bullet\_detonate

В некоторых случаях при попадании снарядов в определенные волюмы сущности необходимо принудительно взорвать снаряд. Для этого существует действие bullet\_detonate. Формат записи: {bullet\_detonate} Пример использования: {on bullet\_hit {if volume “wheel” {if bullet “shell fg” {bullet\_detonate} } } }

#### chassis\_work

При повреждениях компонент, влияющих на двигательные функции техники, необходимо иметь возможность отключать либо включать возможность передвижения. Для этого существует действие chassis\_work. Формат записи: {chassis\_work <флажок включения>} Пример с проверкой работоспособностей компонент, влияющих на шасси: {if work “engine” {if work “mover” {chassis\_work 1} else {chassis\_work 0} } else {chassis\_work 0} }

#### weapon\_work

При повреждениях компонент, влияющих на способность стрельбы, имеется возможность отключать либо включать оружие. Для этого существует действие weapon\_work. Формат записи: {weapon\_work <флажок включения>} Например: {if work “gun” {weapon\_work “gun” 1} else {weapon\_work “gun” 0} }

#### clear\_inventory

При взрыве объектов должен очищаться инвентарь, который у них есть. Для этого используется действие clear\_inventory. Формат записи: {clear\_inventory} Пример использования: {on “explosion” {clear\_inventory} }

#### delete

В игровом процессе при полном разрушении либо уничтожении объекта необходимо сделать так, чтобы он исчез с игрового мира. Для этого существует действие delete. Формат записи: {delete} Пример использования: {on “explosion” {delete} }

#### hide

Аналогичное действию delete существует действие hide. Оно необходимо для плавного исчезновения объектов (например, мелких кусков). Формат записи: {hide <время исчезновения>} Время исчезновения задается в секундах. При этом объект за это время переходит из полностью непрозрачного в полностью прозрачный.

#### die

При убивании людей либо разрушении техники до состояния, при котором ее уже невозможно восстановить (превращение в груду металла), объекты умирают, но при этом не удаляются с игрового мира. Для этого существует действие die. Формат записи: {die} Пример использования: {on pierce {if volume “head” {die} } }

#### ik\_enable

Для разрешения или запрещения работы инверсной кинематики костей скелета сущностей можно использовать действие ik\_enable. Формат записи: {ik\_enable “<имя кости>” <флажок включения>} Пример использования: {on pierce {if volume “turret” {ik\_enable “turret” 0} } }

#### say

Для того, чтобы юнит что-то сказал, необходимо вызвать действие say. Формат записи: {say “<фраза>”} Набор фраз задается в interface\text\says

#### tear

При разрушении объектов возникает необходимость отрывания каких-либо кусков (например, отрывание башен у танков, колес у машин, и т.д.) Для этого используется действие tear. Оторванная часть после этого ведет себя как самостоятельный объект. Существует два способа записи действия: {tear bone “<имя кости>” props “<свойства оторванной части>” {<действия>} } {tear bone from\_volume props “<свойства оторванной части>” {<действия>} } В первом варианте явно задается кость, которую необходимо оторвать, во втором она берется из текущего волюма (в который, например, попал снаряд). Свойства оторванной части задают props, по которым будет функционировать interaction оторванной части. Внутри этого действия можно использовать другие действия, которые будут применяться к оторванному объекту. Пример использования действия: {on pierce {if bullet “shell ap” {if volume “wheel” {tear bone from\_volume props “steel small part”} } } } При этом пробитое снарядом колесо оторвется, будет действовать как самостоятельная сущность со свойствами “стальная маленькая часть”.

#### impulse

Для того, чтобы приложить заданный импульс к объекту (например, после отрывания колеса), используется действие impulse. Формат записи: {impulse up <значение> dir <значение> cx <значение> cy <значение> cz <значение> fx <значение> fy <значение> fz <значение> } Все параметры этого действия не являются обязательными. Значения параметров являются величинами с разбросом. Например, значение up 5 2 означает 5±2, т.е. параметр up принимает случайное значение от трех до семи с равномерной вероятностью. Параметр up задает вектор скорости, направленный вверх в мировых координатах, длиной, равной значению up. Параметр dir задает коэффициент, с помощью которого учитывается вектор направления скорости воздействующего предмета (пули, другого объекта при столкновении). Параметры cx, cy, cz определяют смещение точки приложения импульса от центра объекта либо от точки взаимодействия с предметом (пуля, другая сущность). Параметры fx, fy, fz определяют дополнительный вектор силы, прикладываемой к объекту. Пример записи действия, применительно к отрыванию колеса: {if volume “wheel” {tear bone from\_volume props “steel small part” {impulse up 3 1 dir 3 1} } }

## Отладка

Отладка предусмотрена как на этапе запуска игры при загрузке файлов **interaction**, так и в процессе игры. Если при загрузке возникают ошибки, то можно, не выходя из игры, исправить их и продолжить загрузку дальше. В процессе игры можно также не выходя из нее подправить файлы с описаниями **interaction**, и чтобы они вступили в силу, дать консольную команду **ed\_reloadInteractions**.

### На старых версиях.

Также существует несколько set’ов, которые можно изменить в консоли для выдачи отладочной информации. При этом нужно выделить сущность, для которой нужно посмотреть отладочную информацию. debugevent 1 – выводит имена происходящих событий; debugpierce 1 – выводит информацию о пробивании волюмов; debugblast 1 – информация о воздействии взрывной волны на волюмы; Можно включить вывод списка анимаций, запущенных у объекта. Для этого нужно его выделить, нажать F10, и выбрать animation, либо ввести в консоли debug show “animation”. Также можно узнать список звуков, которые прилинкованы к сущности и текущее их состояние. Для этого нужно ее выделить, нажать F10, и выбрать sound, либо ввести в консоли debug show “sound”.