- Регистрация
- 10 Окт 2025
- Сообщения
- 97
- Реакции
- 103
- Баллы
- 28
- Лучшие ответы
- 0
MDS - это скриптовый файл, который управляет анимацией модели. Если ASC-файл хранит только саму анимацию (координаты костей в каждом кадре), то MDS - это инструкция, которая указывает движку игры:
- Какой файл анимации использовать
- Какой отрезок анимации взять
- Когда проигрывать звуки и эффекты
- Когда наносить урон и много чего еще
Структура MDS-файла
Model ("Имя_модели")
{
meshAndTree ("Файл.ASC" DONT_USE_MESH)
registerMesh ("Файл.ASC")
aniEnum
{
// Здесь перечисляются все анимации
}
}
registerMesh - регистрирует визуальную модель (тело, броню), которую можно динамически надевать на скелет через скрипты. Эту строку можно пропустить, если вы используете модели (меши), которые уже есть в игре
Основные команды внутри aniEnum
1. ani - основная анимация
Разберем пример ниже:
ani ("s_stand" 1 "s_stand" 0.5 0.5 M. "stand_pause2.asc" F 0 -1)
Параметр | Значение |
|---|---|
"s_stand" | Название анимации. Префис s_ - это state-анимация (циклическое состояние: стоим, бежим и т.п.). Префикс t_ - transition-анимация (переход между состояниями: стояли, потом побежали) |
1 | Слой (чем выше число, тем выше приоритет анимации) |
"s_stand" | Следующая анимация (указывается для зацикливания, либо для перехода состояния, если бы мы использовали transition-анимацию) |
0.5 | Blend-in - время плавного входа их предыдущей анимации (сек.) |
0.5 | Blend-out - время плавного выхода после окончания анимации (сек.) |
M. | Флаги:
|
"stand_pause2.asc" | Название ASC-файла с анимацией |
F | Направление анимации.
|
0 | Начальный кадр анимации |
-1 | Конечный кадр (-1 значит до конца файла). Лучше указывать реальное количество кадров в анимации |
2. aniAlias - анимация-псевдоним
Создает новую анимацию на основе существующей, зачастую с обратным направлением:
aniAlias ("t_strafe_r" 1 "s_stand" 0.1 0.1 M. "t_strafe_l" R)
3. aniBlend - смешивание анимаций
Создает переход между двумя анимациями без отдельного ASC-файла. Используется для плавной смены скоростей (например, стояние -> бег):
aniBlend("t_stand_2_run" "s_run" 0.2 0.2)
4. aniComb - комбинирование анимаций
Собирает одну анимацию из нескольких заранее подготовленных кусков. Пример ситуации: прицеливание из лука. Персонаж может поворачиваться в разные стороны, но анимания наклона лука и натяжения тетивы остается одниаковой. Вместо того, чтобы создавать 36 отдельных анимаций для всех углов поворота, создаются 9 базовых фаз, а aniComb плавно смешивает их между собой:
ani ("C_BOW_1" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMT.ASC" F 1 1)
ani ("C_BOW_2" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMT.ASC" F 1 1)
ani ("C_BOW_3" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMT.ASC" F 1 1)
ani ("C_BOW_4" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMC.ASC" F 1 1)
ani ("C_BOW_5" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMC.ASC" F 1 1)
ani ("C_BOW_6" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMC.ASC" F 1 1)
ani ("C_BOW_7" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMD.ASC" F 1 1)
ani ("C_BOW_8" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMD.ASC" F 1 1)
ani ("C_BOW_9" 4 "" 0.0 0.0 .. "HUM_BOWAUTOAIMD.ASC" F 1 1)
aniComb ("S_BOWAIM" 1 "S_BOWAIM" 0.0 0.0 M. "C_BOW_" 9)
Параметр | Значение |
|---|---|
"S_BOWAIM" | Название новой (собираемой) анимации |
1 | Слой анимации |
"S_BOWAIM" | Следующая анимация (обычно она же для зацикливания) |
0.0 | Blend-in |
0.0 | Blend-out |
M. | Флаги (M - движение) |
"C_BOW_" | Префикс анимаций-частей |
9 | Количество частей для комбинирования |
Анимации с префиксом C_BOW_ - это отдельные кадрый или короткие отрезки, каждый из которых соответствует определенному углу наклона/поворота. Когда в игре запускается S_BOWAIM, движок берет все 9 частей (C_BOW_1 ... C_BOW_9). Поскольку у каждой части одинаковое количество кадров, движок может плавно переходить между ними, создавая анимацию прицеливания под любым углом.
Также может применяться для анимаций заклинаний с разными направлениями, прицеливании из арбалета.
5. modelTag - метка модели
Задает глобальные свойства для всей модели:
modelTag ("DEF_HIT_LIMB" "ZS_RIGHTHAND")
События внутри анимации
Внутри блока ani можно размещать события, которые срабатывают на определенных кадрах.
1. *eventTag - управление логикой боя
В качестве примера возьмем код анимации комбо-удара двуручного меча:
ani ("S_2HATTACK" 1 "S_2HATTACK" 0.0 0.2 M. "HUM_2HATTACKCOMBOT2_M03.ASC" F 1 116)
{
*eventTag (0 "DEF_HIT_LIMB" "ZS_RIGHTHAND")
*eventTag (0 "DEF_OPT_FRAME" "6 46 86")
*eventTag (0 "DEF_HIT_END" "35 75 100")
*eventTag (0 "DEF_WINDOW" "15 40 55 80")
*eventSFX (5 "WHOOSH" EMPTY_SLOT)
*eventSFX (86 "BACK" EMPTY_SLOT)
}
Тег | Что делает |
|---|---|
DEF_HIT_LIMB | Указывает, какая кость наносит урон (рука, оружие). Проще говоря, вы указывает движку какая часть модели является точкой удара. В примере указывается правая рука |
DEF_OPT_FRAME | Задает номера кадров, на которых происходит проверка на попадание. Именно в эти моменты игра проверяет, пересекается ли кость удара (DEF_HIT_LIMB) с врагом. Несколько чисел = несколько ударов в комбо |
DEF_HIT_END | Последний кадр, в котором система еще ждет нажатия кнопки атаки для продолжения комбо. Если нажали кнопку атаки до того, как анимация дошла до этого кадра, то после окончания текущего удара начнется следующий. Если нажали после - комбо прервется. В примере выше если игрок нажал удар, скажем, на 25 кадре, то после 30-го кадра начнется второй удар. Если нажал на 35 кадре - анимация прервется и пресонаж вернется в изначальную стойку |
DEF_WINDOW | Этот тег связан с предыдущим. Если DEF_HIT_END определяет до какого кадра можно нажать кнопку атаки для продолжения комбо, то DEF_WINDOW определяет длительность окна, в течение которого нажатие кнопки атаки будет засчитано для продолжения комбо-удара. В примере выше это окна 15 -> 40, 40 -> 55, 55 -> 80 кадров. Разные интервалы означают, что меняется темп атаки: где-то удар наносится медленне, где-то быстрее. |
Существуют и другие события. Например, события, отвечающие за появление/исчезновение предметов в руках:
ani ("T_BSANVIL_S0_2_S1" 1 "S_BSANVIL_S1" 0.0 0.0 M. "HUM_BSANVIL_JUE00.ASC" F 4 9)
{
*eventTag (4 "DEF_INSERT_ITEM" "ZS_LEFTHAND")
*eventTag (4 "DEF_CREATE_ITEM" "ZS_RIGHTHAND" "Itmw_1H_Mace_L_04")
}
DEF_INSERT_ITEM - вставляет предмет из инвентаря в указанную часть модели.
DEF_REMOVE_ITEM - убирает предмет обратно в инвентарь. Противоположность DEF_INSERT_ITEM, часто применяется с ним в связке.
ani ("T_DUDEL_STAND_2_S0" 1 "S_DUDEL_S0" 0.0 0.0 M. "EXTREMO_DUDEL.ASC" F 0 35)
{
// Взять предмет в руку
*eventPFX (15 1 "PAUKEFX" "ZS_CROSSBOW" ATTACH)
*eventTag (21 "DEF_INSERT_ITEM" "ZS_LEFTHAND")
*eventPFXStop (33 1)
}
ani ("S_DUDEL_S0" 1 "S_DUDEL_S0" 0.1 0.1 M. "EXTREMO_DUDEL.ASC" F 35 70)
ani ("T_DUDEL_S0_2_STAND" 1 "" 0.0 0.0 M. "EXTREMO_DUDEL.ASC" R 0 35)
{
// Убрать предмет из руки
*eventPFXStop (15 1)
*eventTag (18 "DEF_REMOVE_ITEM")
*eventPFX (34 1 "PAUKEFX" "ZS_CROSSBOW" ATTACH)
}
DEF_DESTROY_ITEM - уничтожает предмет. Используется для расходников (например косяков).
ani ("T_JOINT_S0_2_STAND" 1 "" 0.0 0.2 M. "HUM_SMOKEHERB_LAYER_M01.ASC" F 41 200 FPS:10)
{
*eventPFX (60 1 "LIGHTSMOKE" "ZS_RIGHTHAND" ATTACH)
*eventPFXStop (85 1)
*eventSFX (100 "SMOKE_JOINT" R:1000 EMPTY_SLOT)
*eventPFX (100 2 "LIGHTSMOKE" "ZS_RIGHTHAND" ATTACH)
*eventPFXStop (125 2)
*eventTag (192 "DEF_DESTROY_ITEM")
}
2. *eventSFX и *eventSFXGrnd - управление звуками
*eventSFX - проигрывает обычный звуковой эффект. В примере с анимацией комбо-удара двуручного меча была такая строка:
*eventSFX (5 "WHOOSH" R:1000 EMPTY_SLOT)
*eventSFXGrnd - звук с привязкой к поверхности. Делает то же самое, что и eventSFX, но с привязкой к материалу поверхности, на которой стоит персонаж.
*eventSFXGrnd (8 "RUN")
Список материалов:
- EARTH - Земля/трава (суффикс _Earth)
- STONE - Камень (суффикс _Stone)
- METAL - Металл (суффикс _Metal)
- WOOD - Дерево (суффикс _Wood)
- WATER - Вода (суффикс _Water)
- SAND - Песок (суффикс _Sand)
- SNOW - Снег (суффикс _Snow)
3. *eventPFX и *eventPFXStop - управление частицами
*eventPFX - запускает эффект частиц (искры, магическое свечение).
*eventPFX (27 2 "FIRE_MEDIUM" "BIP01 R HAND" ATTACH)
ATTACH привязывает эффект к кости (двигается с персонажем). Без него эффект частиц останется висеть в воздухе.
*eventPFXStop - останавливает ранее запущенный эффект по его ID.
*eventPFX (27 2 "FIRE_MEDIUM" "BIP01 R HAND" ATTACH)
*eventPFXStop (47 2)
*eventMMStartAni - запускает морф-анимацию (независимая анимация, наложенная поверх основного скелета). Главное применение - анимация лица (мимики)
*eventMMStartAni (1 "T_HURT")
*eventMMStartAni (7 "S_NEUTRAL")