# Базовая настройка DEF-файла

Def-файл (definition) - это текстовый документ, в котором прописаны все необходимые настройки и свойства модели.&#x20;



## Основные свойства

Подключить описания основных свойств юнита в его .def файл можно с помощью инструкций  [include](../../bazovaya-informaciya-o-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh/instrukciya-include) и списка свойств в блоке  `{props [...]}`.\
Общие описания свойств юнитов находятся в папке `main\scene\properties`, файлы с расширениями .ext и .inc:

{% hint style="info" %}
**Шаблон подключения основных свойств юнита:**

```
(include "/properties/[type_name].ext")
(include "/properties/shadow/[type_shadow].inc" scale(data))
(include "/properties/selection/[type_selection].inc" scale(data))
{props [property list]}
```
{% endhint %}

<table><thead><tr><th width="270">Файл</th><th>Описание</th></tr></thead><tbody><tr><td>[type_name].ext</td><td><p>Файлы, содержащие базовые описания основных видов техники:</p><ul><li>airborne.ext</li><li>cannon.ext</li><li>car.ext</li><li>armoredcar.ext</li><li>moto.ext</li><li>tank.ext</li><li>marine.ext</li><li>railway.ext</li><li>trailer.ext</li></ul><p>Каждый из указанных файлов включает в себя описание vehicle.ext</p></td></tr><tr><td>shadow/[type_shadow].inc</td><td>Описание отбрасываемой тени.<br>Вызов инструкции происходит с указанием значения аргумента  scale для задания размеров тени</td></tr><tr><td>selection/[type_selection].inc</td><td><p>Описание спрайта выделения юнита (селектора):</p><ul><li>airborne.inc</li><li>cannon.inc</li><li>vehicle.inc</li><li>vehicle_elongate.inc</li></ul><p>Вызов инструкции происходит с указанием значения аргумента scale для задания размеров селектора.</p></td></tr></tbody></table>

<details>

<summary>Примеры включения основных свойств в .def файл юнита техники</summary>

Для машин:

```
{game_entity
    (include "/properties/car.ext")
    (include "/properties/shadow/tank.inc" scale(1.0))
    (include "/properties/selection/vehicle.inc" scale(1.1))
    {props "vehicle" "car" "wheeled" "windowed" "truck" "vision_lev03"}
}
```

Для танков:

```
{Entity
    (include "/properties/tank.ext")
    (include "/properties/shadow/tank.inc" scale(1.0))
    (include "/properties/selection/vehicle.inc" scale(1.1))
    ("bone_rotator")
    {props "medium" "turret_rotator" "vision_lev05"}
}
```

Для мотоциклов:

```
(include "/properties/moto.ext")
(include "/properties/shadow/moto.inc" scX(0.5) scY(0.6) psfX(-7) psfY(0))
(include "/properties/selection/vehicle.inc" scale(0.7))
{props "explosion_throw_crew" "turn_over" "vision_lev00"}
```

Чтобы соориентироваться, какие именно файлы и теги необходимо вписать в .def настраиваемой модели, можно посмотреть набор включений в .def файлах аналогичных моделей техники.

</details>

## Привязка 3д-модели

3д модель техники включается в файл .def с помощью блока extension. \
В качестве значения параметра используется имя .mdl файла, взятое в кавычки.\
Название .mdl файла для каждого юнита уникально.

```
{extension "model_name.mdl"}
```

{% hint style="info" %}
Файл model\_name.mdl получается в результате экспорта модели в ресурсы игры.
{% endhint %}

<details>

<summary>Привязка 3д-модели на примере немецкого грузовика Opel Blitz</summary>

```
{extension "opel_blitz.mdl"}
```

</details>

## Описание волюмов

<figure><img src="https://lh7-us.googleusercontent.com/22f9xG3CrBCPy4ezuKEzxpIrklYbtXfFpIwQMoL2FM3v5dpuKvFiXZrLTh_e1scOlHX2LvVc0C1G6Z-7yCfKwPf0KPVJ1QygoCTVlukG6pq9dlJJpqlnZ8nyGJuYt1mcB9t-FEid9Cgi6PKkXPHL6b8" alt=""><figcaption></figcaption></figure>

## Экипаж

### Включение экипажа

Подключение описания экипажа происходит с помощью вызова нужной инструкции [define](../../bazovaya-informaciya-o-gem-rts/obshaya-informaciya-o-konfiguracionnykh-failakh/instrukciya-define), либо с помощью блока {extension}, в котором в качестве значения необходимо  указать имя соответствующего SDL файла, содержащего описание экипажа.

```
("name_crew_define")
```

```
{extension "name_crew.ext"}
```

<details>

<summary>Примеры включения описания экипажа в .def юнита</summary>

Включение экипажа с помощью файла .ext

```
{extension "crew.ext"}
```

Включение экипажа вызовом инструкции define

```
("crew_4_human_extended")
```

</details>

### Анимации посадки экипажа в технику

Блок параметра **boarder** отвечает за анимации посадки (и высадки) членов экипажа на технике, а также за их позу. \
Для каждого члена экипажа (командир, стрелок, пассажир, заряжающий и т.п.) и типа техники указывается свое значение анимации и позы.

<details>

<summary>Пример блока boarder</summary>

```
{boarder
    {anm "passenger"
        {forward 
            {begin "board_body"} 
            {end "seat_passenger"}
        }
        {reverse 
            {end "emit_body" 1}
        }
    }
    {anm "gunner"
        {forward 
            {end "pose_61K_gunlayer_right" 10}
        }
        {reverse 
            {end "emit_tank_1"}
        }
    }
    {anm "charger"
        {forward 
            {begin "board_LowTank_stand"} 
            {end "pose_61K_gunlayer_right" 10}
        }
        {reverse 
            {end "emit_tank_1"}
        }
    }
}
```

</details>

Чтобы подставить нужную анимацию конкретному члену экипажа необходимо название анимации вставить в значение begin (посадка) и end (высадка)

<details>

<summary>Пример назначения анимаций посадки и высадки для стрелка №1</summary>

```
{anm "gunner1"
    {forward 
        {begin "board_SdKfz251-1"} 
        {end "seat_sd251_mgunner"} 
        {base "doors"}
    }
    {reverse 
        {end "emit_body" 1} 
        {base "doors"}
    }
}
```

В блоке параметра **base** прописана анимация открытия дверей\люка на технике. \
Как только будет использована анимация gunner1,  на технике запустится анимация doors.

</details>

### Размещение экипажа по местам

#### Видимые пассажиры

Описание размещения экипажа осуществляется через вызов соответствующих инструкции define. При вызове инструкции передаются нужные значения аргументов.&#x20;

<details>

<summary>Примеры описания логики размещения экипажа</summary>

```
("crew_human" place(gunner1) bone(gunner1) door(emit3) animation(gunner))
("crew_human" place(gunner2) bone(gunner2) door(emit4) animation(gunner))
("crew_human" place(gunner3) bone(gunner3) door(emit3) animation(gunner))
("crew_human" place(gunner4) bone(gunner4) door(emit4) animation(gunner))
("crew_human" place(seat1) bone(seat01) door(emit3) animation(passenger))
("crew_human" place(seat2) bone(seat02) door(emit4) animation(passenger))
("crew_human" place(seat3) bone(seat03) door(emit3) animation(passenger))
("crew_human" place(seat4) bone(seat04) door(emit4) animation(passenger))
```

Инструкция "crew\_human" вызывается для каждого из членов экипажа, определяя для каждого стрелка или пассажира его кость места размещения в технике и кость посадки в технику.

* place(gunner№)- стрелки
* place(seat№) - пассажиры
* bone(gunner№) - кости размещения стрелков
* bone(seat№) -  кости размещения пассажиров
* emit№ - кости посадки в технику

</details>

#### Невидимые пассажиры

Если пассажиров в машине не видно (например, они скрыты под тентом), то вызывается инструкция "passenger\_N\_human\_invisible", где значение N соответствует количеству пассажиров.&#x20;

<details>

<summary>Пример вызова инструкции для невидимых пассажиров</summary>

Для 10 пассажиров, которые скрыты под тентом

```
("passenger_10_human_invisible")
```

</details>

#### Особенности описания экипажа танка

Для членов экипажа танков инструкция "crew\_human" вызывается с указанием значения аргумента place, которое соответствует роли члена экипажа:

* commander
* charger
* driver
* gunner

&#x20;Значения аргумента place для дополнительных стрелков:

* gunner2 - видимый стрелок; например, пулеметчик в башне;
* gunner3/gunner4 и так далее - невидимые стрелки в танке.

{% hint style="warning" %}
Если для невидимого стрелка  задать значение gunner2 - это испортит анимацию люков при посадке экипажа.&#x20;
{% endhint %}

<details>

<summary>Пример описания экипажа танка</summary>

```
("crew_human" place(gunner) door1(emit1) door2(emit2) visor(main))
("crew_human" place(driver) door1(emit0) door2(emit0) visor(driver))
("crew_human" place(charger) door1(emit1) door2(emit2) visor(main))
("crew_human" place(commander) door1(emit1) door2(emit2) visor(back))
("crew_human" place(gunner3) door1(emit1) door2(emit2) visor(main))
```

Стрелок gunner3 - невидимый

</details>

## Включения&#x20;

### Инвентарь

Включение описания инвентаря осуществляется с помощью блока параметра {extender "inventory"}&#x20;

```
{extender "inventory"
    {box
        {item "item_name" [data]}
    }
}

```

<details>

<summary>Пример включения описания инвентаря</summary>

```
{extender "inventory"
    {box
        {item "ammo bullet90 ap usa std" 45}
        {item "ammo bullet90 fg usa std" 25}
        {item "browning" filled {user "mgun"}}
        {item "ammo hmgun" 550}
        {item "ammo mgun" 2500}
    }
}
```

</details>

### Номер борта

```
{extender "enumerator"}
```

### Камуфляж

Не обязательный параметр. \
Включение описания камуфляжа происходит при помощи параметра `extension`. В качестве значения параметра используется имя файла, содержащего описание камуфляжа `camouflage.ext`

```
{extension "camouflage.ext"}
```

{% hint style="info" %}
Файл camouflage.ext должен находиться в папке с файлом модели.&#x20;
{% endhint %}

<details>

<summary>Пример содержимого файла camouflage.ext</summary>

```
;SDL
{extender "bodykit"
    {"camouflage"
        {delay 10}
        {"leafbush_01b_scale07" "turret"}
        {"leafbush_01b_scale05" "visor1"}
        {"leafbush_01b_scale07" "visor2"}
        {"leafbush_01b_scale07" "engine"}
        {"leafbush_01b_scale07" "seat01"}
        {"leafbush_01b_scale07" "seat02"}
    }           
}
```

leafbush\_01b\_scale07,  leafbush\_01b\_scale05 - названия модели камуфляжа

turret, visor1, visor2, engine... - название костей модели техники, на которые линкуется указанная модель камуфляжа

</details>

### Зрение

Подключение зрения юнита осуществляется с помощью блока sensor, который содержит блоки с параметрами визора {visor \[data]}, типа зрения {vision \[data]} и кости, к которой крепится визор {bone \[data]}. Значениями параметров являются имена визора, типа зрения и кости, заключенными в кавычки.

{% hint style="info" %}
**Шаблон описания зрения юнита:**

```
{Sensor
    {visor "[visor_name]"
        {vision "[vision_name]"}
        {bone "[bone_name]"}
    }
}
```
{% endhint %}

Описание визоров юнита техники может быть вынесено для удобства в отдельный файл и подключено в .def с помощью параметра `extension.` Значением параметра является имя файла, содержащего описание визоров юнита, заключенного в кавычки.

```
{extension "sensor.ext"}
```

<details>

<summary>Пример содержимого файла sensor.ext</summary>

```
;SDL
{sensor
    {visor "main"
        {vision "field_gun_main"}
        {bone "visor"}
    }
    {visor "view-around"
        {vision "field_gun_around"}
        {bone "basis"}
    }
}
```

</details>

{% hint style="info" %}
Файл sensor.ext должен находиться в папке с файлом модели.&#x20;
{% endhint %}

## Вооружение

Блок {Weaponry} содержит описание элементов вооружения юнита

<details>

<summary>Пример описания вооружения</summary>



```
{Weaponry
    ("restore_ik_time")
    {place "gun"
        {RestoreIKAfterAim}
        {weapon "90mm_t15" filled}
        {gunner "gunner"}
        {charger "gunner"}
        {abm_tank_cannon}
        {basic}
    }
    {place "mgun"
        {type "aa"}
        {gunner "gunner2"}
        {charger "gunner2"}
        {LinkBone "mgun_aa"}
        {LinkAnimation "off"}
        {abm_mgun_heavy}
        {basic}
    }
    {place "mgun2"
        {type "coaxial"}
        {weapon "browning_m19" filled}
        {foresight "foresight5"}
        {gunner "gunner"}
        {charger "gunner"}
        {sequential_aim}
        {abm_mgun}
        {basic}
    }
    {place "mgun1"
        {type "hull"}
        {weapon "browning_m19" filled}
        {foresight "foresight4"}
        {gunner "driver"}
        {charger "driver"}
        {abm_mgun}
        {basic}
    }
}
```

</details>

### Установка пулеметов

{% hint style="info" %}
Пулеметы не являются частью мэша модели, поэтому в файле 3d max их нет.
{% endhint %}

Описание пулеметов задается в .def файле юнита техники с помощью вложенного блока `{place "mgunN"}` блока `{Weaponry}`.\
Каждому пулемету соответствует свой блок `{place "mgunN"}`, где N - номер пулемета.

<figure><img src="https://lh7-us.googleusercontent.com/JhwLOPuEbE84b98qZEbaDUau5hDWnANxJVAO07m4lgdUDBB_rl2OSk8BK5suZSluMJmm2B7OPCfsOWabMLDTDXptDy0JMXmp2da4w33Peg1dLYVUYRbIaHZnTpfMFxGjql9s776qrVIYn_WuQS5Cfw" alt=""><figcaption></figcaption></figure>

Если пулемет не один, то прописывается соответствующее количество, с соблюдением названий костей прилинковки, экипажа и прочих параметров:

<figure><img src="https://lh7-us.googleusercontent.com/V9liNwOmBz9HgzoWgwIsAMOlYQLM-CS5wjkxBSkSws6LE8JlQWucrMW8nDMdyURpNSP5Cn0diMLy0zBOU5J4weAnwi18ikFQArrP6bFKAWy5rlfVDD9k-jGpdPWF4D1VNi_Z2eakftxdPKL73fJYdg" alt=""><figcaption></figcaption></figure>

### Лимиты угла наклона и поворота пулеметов

<figure><img src="https://lh7-us.googleusercontent.com/3uG_3PwJOG8z5bTfL_qJtRorKrjWvGmK5keSLYFZKh1LHO_mB5swZe7tXWYhqHWNFuTbfrQDEhw0Is-t4YSygij2aa22rvFQ1UTTdBNvaXCdlj3sgQ8Z2YGU-SgEK2j9Jy18rFjJVso_LqHkgl-stw" alt=""><figcaption></figcaption></figure>

## Описание ТТХ юнита

В .def юнита техники необходимо вписать ТТХ параметры и их значения:&#x20;

* вес,&#x20;
* описание шасси,
* максимальная скорость,&#x20;
* разгон,&#x20;
* скорость поворота,&#x20;
* объем топливного бака и др.&#x20;

Значения параметров настраивают в соответствии с концепцией игрового дизайна. \
В оригинальных играх серии Men of War геймдизайнеры настраивают эти параметры в соответствии с реальными характеристиками техники.

<figure><img src="https://lh7-us.googleusercontent.com/X7O_gIOs_4u8He20emOXCVBzGWlOCqR93aGsGcmtvWxDs7Tu5mFEBUOKjW0B5dnNIq6sGBqlJAwDdvEptq2i1Fv3M_vY7I1JRcGUIfNS4v79YjyMJBCvFRis23_RBajsC54PHYYgNnUV9GAl2qt3NBE" alt=""><figcaption></figcaption></figure>

## Шасси

### Гусеницы

Скорость вращения гусениц задается значением аргумента len. Чем выше значение - тем гусеницы крутятся медленнее.

<figure><img src="https://lh7-us.googleusercontent.com/g3OihEtkK6MRL8EYwTjyJb6PfrIFszLIZRBtHev2gPaAGG_3C5uvDBzbDTUrYaq5KBZiey5CdTQl0fZ7ii63jr3GCs0llwMIsHyzQBLSXYSNLgWNzI1WqjVjw0admFOOtBmp__2FBBZnqkYydxtXkA" alt=""><figcaption></figcaption></figure>

### Настройка шасси и подвесок

<figure><img src="https://lh7-us.googleusercontent.com/LuZ1F8Mmh683WmLOKKdryw8BMAEF8yw33CCb3QEVEQ2-yyRfxiXMPb_Egu_EPfTk4kz2npcjoSNu5KTVqQm7f3oQT3lQykpcfoWWNeeMeS8eXY8pd_luEsKQAbO7vShCk5dWxGbKTKKwdirRyxqVEAA" alt=""><figcaption></figcaption></figure>

## Настройка щитов

<figure><img src="https://lh7-us.googleusercontent.com/VTOUkiVHfvitSLh8ZGJIN5ePiw_fdjP1tpsKuUkwxUtiiId0KYtyF3jowC1dE87IgjD-v6LD1hvlEcrIducM-7I8qpzErlOUzBQXvXaanL6GxElCqViPliYdHZNENpo06p6AieGqpog9WVKyJ5RmNZk" alt=""><figcaption></figcaption></figure>
