Прототипы

Материал из DeusExMachina
(перенаправлено с «Создание новых прототипов»)
Перейти к: навигация, поиск

1.0 Введение

Для работы с текстовыми и не очень файлами (в основном они будут иметь расширение XML) можно использовать даже Блокнот, но автор настоятельно рекомендует обзавестись качественным текстовым редактором, который поможет вам даже без его изучения. Разработчики предлагают для этого SciTE с набором своих плагинов, украшающих махиновский регистр. Автору же привычнее более современный Notepad++ с лучшей цветовой палитрой «из коробки».

Совет! Если не знаете, где ещё искать необходимый параметр, выходящий за рамки редактируемого вами файла — Notepad++ вам поможет: просто воспользуйтесь «поиском по файлам» и, если искомая строчка имеет место где-то быть, — он её отыщет.


1.1 Оружие

1) Файлы

Файлы оружия располагаются по адресу data/gamedata/gameobjects и имеют самые разные названия. К сожалению, в оригинальных файлах сам чёрт ногу сломит, поэтому мы будем описывать этот раздел, обратившись к проекту Weapon Xml Editor — программе, позволяющей редактировать основную часть характеристик оружия. Вместе с программой предоставляются удобно и бережно переписанные файлы оружия для EM и М113, которыми автор и воспользуется здесь:

  • allguns.xml — Файл простого оружия.
  • ammunition.xml — Файл боеприпасов и взрывных волн.


В остальных поставляемых с программой файлах находится бортовое (боковое) и специальное оружие, в силу технических причин неподвластное WXE, но с вырезанным (перенесённым в allguns) лишним оружием, а также файл, к которому игра обращается при поиске тех же файлов оружия и не только его.


2) Параметры орудий

Рассмотрим параметры орудия Флаг:

<Prototype
        Class              = "BulletLauncher" — Класс оружия «Огнестрельное»
        Name               = "flag01" — Имя объекта
        ModelFile          = "flag01" — Обращение к 3d-модели
        ResourceType       = "BIG_GUN" — Тип слота (типоразмер оружия)
        Mass               = "1.0" — Масса
        BulletPrototype    = "raybullet" — Тип боеприпасов «Патроны»
        ExplosionType      = "MACHINEGUN" — Графический эффект при попадании «Пулемёт»
        Damage             = "320" — Урон
        FiringRate         = "14" — Скорострельность
        GroupingAngle      = "3" — Разброс оружия (0 соответствует 100% точности, 5 — 0%)
        FiringRange        = "2000" — Дальнобойность
        RecoilForce        = "1000" — Отдача
        FiringType         = "ShotGun" — Тип выстрела «Дробовик»
        Price              = "8960" — Цена
        Decal              = "DC_BIG_MACHINEGUN" — Отметина/отверстие после попадания в цель
        ChargeSize         = "1" — Объём магазина
        RechargingTime     = "4" — Время перезарядки в секундах
        Durability         = "200" — Прочность
        NumBulletsInShot   = "20" — Количество «пуль» в одном выстреле (дробь)
        BlastWavePrototype = "smallBlastWave" — Тип взрывной волны при попадании
>


Существуют также такие параметры как (некоторые могут работать исключительно в Меридиане 113):

TurningSpeed — Скорость поворота станка/башни.


TracerRange = "1" + TracerEffect — Эффект трассера (шлейф от пролетевшего снаряда, искусственный).


WithShellsPoolLimit = "true" - Являются ли патроны конечными.


ShellsPoolSize — Максимальный боекомплект. (Работает только если WithShellsPoolLimit = "true")


ApplyAffixes = "false" — Невозможность генерации вариантов разного качества (аффиксы).


CanBeUsedInAutogenerating = "0" — Невозможность использования генератором ботов.


CanBeDroppedFromEnemies = "false" — Невозможность дропа ботами.


VisibleInEncyclopedia = "false" — Отсутствие отображения в Энциклопедии. В Ex Machina (не Meridian 113) также используется для выставления оружию невозможности дропа ботами.


IgnoreStopAnglesWhenFire = "true" — Игнорирование углов прицела во время стрельбы.


WithAngleLimit = "false" — Полное игнорирование углов прицела.


ActionDist — Дистанция прицеливания, после которой орудие перестаёт наводиться.


InitialVelocity — Начальная скорость снаряда (вероятно, вне зависимости от параметра ускорения у самого снаряда).


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

3) Параметры боеприпасов

Теперь рассмотрим пример боеприпаса. Поскольку raybullet, используемый Флагом, не обладает абсолютно никакими параметрами, попадая в цель моментально и по прямой траектории — выберем что-нибудь поинтереснее.


Ракета для бортовой системы Мрак:

<Prototype
        Class            = "Rocket" — Класс боеприпаса «Ракета»
        Name             = "mrak_rocket" — Имя объекта
        ModelFile        = "rockets_big01" — Обращение к 3d-модели снаряда
        Price            = "2200" — Стоимость снаряда
        Velocity         = "200" — Скорость полёта снаряда
        Acceleration     = "100" — Дополнительное стартовое ускорение снаряда на первых метрах
        FlyTime          = "5.0" — Время полёта снаряда
        MinTurningRadius = "50" — Минимальный радиус поворота снаряда
        Size             = "0.5 0.5 10" — Размер физической модели снаряда
>


Помимо этого там также повторяются параметры ExplosionType и BlastWavePrototype. Зачем — не уточнено, но возможно это может позволить совместить эффекты оружия и его боеприпаса. В любом случае, как подсказывает образец raybullet, в прототипе боеприпаса этой характеристики может и не быть, а значит она более требуется в прототипе орудия.


4) Взрывные волны

А вот параметры взрывной волны someBlastWaveRocket01, используемой в том числе и для Мрака:

<Prototype
        Radius              = "50.0" — Радиус взрыва
        Effect              = "ET_PS_AIRWAVE1" — Графический эффект
        WaveForceIntensity  = "1.0" — Сила физического воздействия
        WaveDamageIntensity = "120.0" — Урон
>


1.2 Автомобили

1) Файлы

С оружием более или менее разобрались, перейдём к более мудрёной части — автомобилям. Основную долю необходимого для изменения машин можно найти в файлах:

  • data/gamedata/gameobjects/vehicles.xml
  • data/gamedata/gameobjects/vehicleparts.xml
  • data/gamedata/resourcetypes.xml


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


2) Параметры прототипов

Для начала рассмотрим пример прототипа Урала и его настроек:

<Prototype
        Class                 = "Vehicle"
        Name                  = "Ural" — Имя прототипа
        ResourceType          = "VEHICLE"
        PressingForce         = "2.0" — Прижимная сила
        DiffRatio             = "4.0" — Коэффициент передаточного числа
        MaxEngineRpm          = "8000" — Максимальные обороты двигателя
        LowGearShiftLimit     = "3000" — Обороты двигателя для понижения передачи
        HighGearShiftLimit    = "5500" — Обороты двигателя для повышения передачи
        SteeringSpeed         = "0.6" — Скорость поворота руля
        BlastWave             = "bigBlastWave" — Тип взрывной волны
        CameraHeight          = "5" — Высота камеры от центра машины
        CameraMaxDist         = "22" — Дистанция удаления камеры (колёсико мыши)
        HornSound             = "ET_S_HORN03" — Звук гудка
        DecisionMatrix        = "vehiclemain.lua"
        LookRadius            = "200.0" — Радиус обзора бота
        IntersectionRadius    = "7.0" — Дальность дропа лута
        TakingRadius          = "30.0" — Радиус возможности подбора лута
        DriftCoeff            = "0.08" — Коэффициент заноса
        MassSize              = "5 3 12" — Распределение массы на нос-центр-корму
        MassTranslation       = "0 -2.3 0" — Положение центра массы
        DestroyEffectPiercing = "ET_PS_VEH_EXP1_MED" — Эффект при уничтожении снарядом
        DestroyEffectBlast    = "ET_PS_VEH_EXP2_MED" — Эффект при уничтожении взрывом
        DestroyEffectEnergy   = "ET_PS_VEH_EXP3_MED" — Эффект при уничтожении энергией
        DestroyEffectWater    = "ET_PS_VEH_EXP2_MED" — Эффект при утоплении
        Abstract              = "true" — Не меняется
        AdditionalWheelsHover = "0" — Дополнительная высота подвески
>


В М113 настройки слегка обновились (описания могут быть неточными):

<Prototype
        HitForce                     = "100" — Урон при таране (вместо PressingForce)
        MinNotIdleRpm                = "3000" — Зв. имитация оборотов двигателя на мин. скорости
        IdleEngineSoundSpeed         = "0.5" — Скорость проигрывания звука двигателя стоя
        EngineRpmForNormalSound      = "6000" — Зв. имитация оборотов двигателя на полном ходу
        SteeringN                    = "6.0" — Скорость поворота руля (вместо SteeringSpeed)
        SteeringTime                 = "5.0" — Тяжесть поворота руля
        WheelSpringCoeffSmall        = "4000.0" — Минимальная упругость амортизаторов 
        WheelSpringCoeffBig          = "8000.0" — Максимальная упругость амортизаторов
        WheelUpDampingCoeff          = "100.0f" —  Гашение разжатия амортизаторов
        WheelDownDampingCoeff        = "600.0f" — Гашение сжатия амортизаторов
        WheelSuspensionRange         = "0.50" — Диапазон хода амортизаторов
        WheelCriticalSuspensionDelta = "0.3" — Критическое смещение колеса
        AllowedRoles                 = "roleRam roleCoward" — Роли в командной тактике ботов
        GadgetWeaponForDrop          = "cooling_system_guns" — Оружейные гаджеты для дропа
        GadgetVehicleForDrop         = "additional_stability" — Автомобильные гаджеты для дропа
        ForMultiplayer               = "false" — Невозможность добавления в мультиплеер
        ThrowRagdollOnCriticalDeath  = "true" — Индивидуальный параметр у роботов (в значении false)
        PhysicsDisabled              = "false" — Отключение физики (при значении true)
>


Далее идёт блок MainPartDescription — рассмотрим одну из его строчек:

<Prototype
        id               = "CABIN_BIG_GUN_1" — Техническое(!) название оружейного слота кабины
        partResourceType = "BIG_GUN" — Тип оружия, которое можно установить в слот
        lpName           = "LP_BIG01" — Лоадпоинт (точка загрузки) на 3d-модели кабины, 
                                              на который устанавливается орудие
>


Здесь описывается что и куда на машине можно установить реально, то есть в 3d-объёме: кабину и кузов с указанием типа шасси, и оружие, которое можно установить на эти части. В будущем обратите внимание на «двойные» лоадпоинты у бортового вооружения и их отсутствие у специального оружия: можно сделать вывод, что установка по схеме «шасси > корпус > орудие» не так принципиальна и при соблюдении некоторых интуитивных условий во избежание багов — игра позволит установить практически что и куда угодно в одному богу рандома известных количествах. Перечень типов оружия и ходовых можно найти и изменить в resourcetypes.xml и vehicleparttypes.xml — мы к ним ещё вернёмся.


В конце идёт блок Parts, в котором указывается конкретное шасси для этой машины, а за ним — блок Wheels, где слева на право, в порядке возрастания номеров лоадпоинтов на шасси к нему прикручиваются колёса с соответствующим именем. steering = "correct" там определяет рулевые колёса. Если заменить correct на inverse — поворот колеса будет осуществляться в обратную сторону, как при рулении кормой.


3) Готовые сборки

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

<Prototype
        Class                 = "Vehicle"
        Name                  = "Ural01"
        VisibleInEncyclopedia = "false"
        ParentPrototype       = "Ural" >
        <Parts>
                <Part id = "CABIN"           Prototype = "uralCab01" />
                <Part id = "BASKET"          Prototype = "uralCargo01" />
                <Part id = "CABIN_SMALL_GUN" Prototype = "hornet01" /> 
        </Parts>
</Prototype>


В этот прототип также можно добавить строки HealthRegeneration = "1.0" и DurabilityRegeneration = "0.03", чтобы получить регенерацию конструкции и брони как у машины Лисы. В М113 также есть параметр CanDropChests = "false", для запрета дропа лута машиной.

4) Параметры частей и деталей

За корпусом и всем остальным плавно переходим к следующему в нашем списке файлу — vehicleparts.xml. В отличии от vehicles.xml, где лишь главенствует последовательность «сначала прототип, потом сборка», необходимая для нормальной загрузки информации, то тут всё разбито на строгие категории: chassis, cabins, baskets и wheels — поэтому соблюдаем внимательность и не пишем куда попало.


Параметры шасси Урала:

<Prototype
        Class          = "Chassis"
        Name           = "uralChassis" — Имя объекта
        ModelFile      = "uralChassis" — Обращение к 3d-модели
        ResourceType   = "URAL_CHASSIS" — Тип шасси
        NodeScale      = "1 1 1" — Не изменяется
        Price          = "40000" — Цена (в игре цена шасси будет приравнена к единице)
        RepairCoef     = "0.2" — Коэффициент стоимости ремонта конструкции автомобиля
        Mass           = "80.0" — Масса
        MaxHealth      = "2000" — Уровень конструкционной прочности
        MaxFuel        = "600" — Объём топливного бака
        BrakingSound   = "ET_S_BRAKE01" — Звук торможения
        PneumoSound    = "ET_S_PNEUMO_BRAKE01" — Не используется
        GearShiftSound = "ET_S_GEAR_SHIFT01" — Не используется
        LoadPoints     = "LP_CAB01 LP_BSK01" — Лоадпоинты, используемые для
                                                   установки чего-либо
>


Параметры 5-ой кабины:

<Prototype
        Class                   = "Cabin"
        Name                    = "uralCab05"
        ModelFile               = "uralCab05"
        ResourceType            = "URAL_CABIN"
        NodeScale               = "1 1 1"
        Mass                    = "90.0" — Масса
        Durability              = "120" — Уровень брони
        DurCoeffsForDamageTypes = "12 10 -15" — Устойчивость брони к разным типам урона
        MaxPower                = "120"
        MaxTorque               = "280" — Мощность двигателя
        EngineHighSound         = "ET_S_ENGINE_URAL_5_HIGH" — Звук двигателя в движении
        BlowEffect              = "ET_PS_VEH_PART_BLOW_BIG_CAB" — Эффект при столкновении
        Price                   = "70000" — Цена
        RepairCoef              = "0.4" — Коэффициент стоимости ремонта брони кабины
        FuelConsumption         = "0.4" — Коэффициент расхода горючего
        MaxSpeed                = "155.0" — Ограничение скорости
        LoadPoints              = "LP_BIG01 LP_BIG02"
>


В М113 появляется параметр LP_Scales, в котором указываются лоадпоинты для таранов и их размеры. Помимо этого меняется система устойчивости к урону: в EM она определяется скорее количеством единиц брони, где при завышенных значениях урон перестаёт наноситься вовсе. В М113 броня не имеет такого свойства, а степени защищённости обозначают процент оной для всей машины и больше не могут обладать отрицательными значениями. В EM эти степени работают иначе и не поддерживают значения больше 25 единиц, приводя к ошибке в случае перехода этой границы.


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


Параметры 5-ого кузова:

<Prototype
        Class                   = "Basket"
        Name                    = "uralCargo05"
        ModelFile               = "uralCargo05"
        ResourceType            = "URAL_BASKET"
        Durability              = "115" — Уровень брони
        DurCoeffsForDamageTypes = "10 15 -15" — Устойчивость брони к разным типам урона
        NodeScale               = "1 1 1"
        BlowEffect              = "ET_PS_VEH_PART_BLOW_BIG_CARGO"
        Price                   = "58000" — Цена
        RepairCoef              = "0.3" — Коэффициент стоимости ремонта брони кузова
        Mass                    = "60.0" — Масса
        LoadPoints              = "LP_BIG01 LP_SIDE01L LP_SIDE01R"
>


Далее опять два блока, но вместо GadgetDescription будет RepositoryDescription:

<RepositoryDescription
        RepositorySize = "7 9">
        <Slot
                Name = "BASKET_BIG_GUN_0"
                Pos  = "10 0"
        />
        <Slot
                Name = "BASKET_SIDE_GUN_0"
                Pos  = "10 5"
        />
</RepositoryDescription>


Тут указывается ширина и длинна «багажника», слоты оружия и их расположение поверх него. У кабин этих слотов может быть всего два и их расположение определено движком игры — поэтому в прототипе кабины они не указываются.


Колёса Урала (первое левое):

<Prototype
        Class               = "Wheel"
        Name                = "uralWheel01l"
        ModelFile           = "uralWheel01l"
        NodeScale           = "1 1 1"
        Mass                = "17" — Масса
        SuspensionModelFile = "uralSusp01" — Обращение к 3d-модели подвески
        SuspensionCFM       = "0.0013" — Жёсткость амортизатора
        SuspensionERP       = "0.25"
        SuspensionRange     = "1.0"
        mU                  = "1.0" 
        EffectType          = "BIGWHEEL" — Эффект горения
>


В М113 настройки подвески переехали (или дополнились) новыми параметрами в прототипе машины — вы уже имели возможность ознакомиться с ними.

Похожим образом можно также изменять и добавлять новые гаджеты, расположенные в gadgets.xml – оружейные типа GADGET_WEAPON и автомобильные типа GADGET_COMMON.

5) Типы и типоразмеры

Последний файл — resourcetypes.xml — необходим в случае, если вы создали новый прототип машины или орудия и желаете, чтобы новые элементы конструкции соответствовали своим новым типам, то есть чтобы они могли быть установлены лишь туда, куда нам надо. В блоке VEHICLE_PART указывайте новые типы шасси, кабины и кузова, а в блоке GUN — типоразмер оружия. Параметр geomsize у частей машин значения не имеет, а вот у оружия он определяет реальный размер слота каждого типа. В случае появления оружия совершенно нового типоразмера вам также потребуется файл vehicleparttypes.xml, расположившийся по-соседству. В нём соединяются между собой типы оружия и его слоты. Например маленькое орудие с geomsize 2*2 имеет тип SMALL_GUN, а слоты под него бывают такими: CABIN_SMALL_GUN, CABIN_SMALL_GUN_1, BASKET_SMALL_GUN_0, BASKET_SMALL_GUN_1.

Внимание! Если вы собрались использовать автоматические караваны М113 — знайте, что оружие на них устанавливается в слоты с названиями, определяемыми дополнительно движком игры, а не содержимым приведённых выше файлов, поэтому стоит воздержаться от лишних изменений в названиях.

Внимание! Хотя типов гаджетов в resourcetypes.xml целых три — из-за технических ограничений работать будут только первые два, поэтому плодить их смысла не имеет.


1.3 Описания

Последним штрихом в добавлении нового будет присвоение ему нормальных, внутриигровых имён и изображений. Этот пункт не является обязательным, однако, чтобы вы не тратили время на поиски в желании довести свой мод до кондиции, опишу что, да как.

  • data/if/diz/model_names.xml — Здесь прописываются названия практически для всего и вся.

  • data/if/strings/uidescription.xml — Описания для Энциклопедии. После собственного имени объекта должно быть добавлена приписка _diz.

  • data/if/ico/modelicons.xml — Пути к изображениям для конкретных объектов. Изображения оружия, гаджетов и частей машин принято хранить в папке inventorydlg по-соседству.


1.4 Добавление в игру

Итак, после того как вы убедились, что теперь у вас есть новый прототип машины, все необходимые сборные части, их собранный воедино вариант и что каждый элемент соответствует новому типу автомобиля — можно приступать к введению этого агрегата в игровой процесс. Есть несколько методов обнаружить ваше творение в игре:


1) Консольный вызов

Открываем файл data/scripts/cheats.lua и находим там функцию GiveVehicle(num) — в игре она соответствует читу truck() или car(), позволяющему пересесть на новую машину. Указывайте личное имя вашей собранной машины из vehicles.xml и добавляйте его в список машин на вызов по аналогии с теми, которые там уже прописаны. Новая цифра в списке и станет номером вашей машины для использования его с читом. В функции giveguns() вы можете указать новое оружие какого-либо типоразмера, только не забудьте установить ниже такое число random, чтобы оно в него попадало (номер орудия определяется его позицией в списке).


2) Приобретение в городе

Добавить товар на продажу можно в фаилах dynamicscene.xml в папках с каждой картой. Например на карте Край единственное поселение с авторынком — город Южный — в этом файле будет называться TheTown. В его магазине TheTown_Workshop (тип workshop), в блоке <CabinsAndBaskets> можно указать кабины и кузова для замены, а ниже, в блоке <Vehicles> — машины на продажу. Кстати говоря, хотя машины там указываются уже собранные изначально — в магазине им можно принудительно задать и другие части конструкции. Оружие можно закинуть в магазин типа shop, имеющий в Южном название TheTown_Shop и идущий сразу после авторынка.


3) Генерация машин

Если возможность использования ботами конкретного оружия устанавливается в параметрах самого оружия, то противников в спаунер необходимо заносить отдельно. Файл data/gamedata/gameobjects/infection.xml отвечает за генерацию врагов. Позиции для появления машин указываются в dynamicscene.xml карты, а тут определяется, в каких из них какие именно машины появиться могут. Ищем параметр VehiclesPrototypes и указываем в нём последовательно те сборки машин, которые вам там нужны. Использование готовых сборок, казалось бы, не очень-то должно способствовать настоящему ГЕНЕРИРОВАНИЮ, но, по факту, весь этот процесс тут работает по одним ему известным принципам. В М113 задача упростилась и вместо сборок там указываются голые прототипы.


4) Установка на карту и вызов событием

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