на главную
об игре

Forts "Создания собственного оружия на базе Cannon. Часть 2"

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

Файлы которые будут использоваться
Файлы которые будут использоваться

Настройка параметров оружия.

Для начало сканируем cannon.lua из каталога "..\Forts\data\weapons" в каталог "название_мода\weapons\" (необходимо переименовать).

Пример его содержимое:

Спойлер

Scale = 1

SelectionWidth = 95.0

SelectionHeight = 60.0

SelectionOffset = { -18, -60.5 }

RecessionBox =

{

Size = { 200, 25 },

Offset = { -300, -70 },

}

CanFlip = false

FireEffect = "effects/fire_cannon.lua"

ConstructEffect = "effects/device_construct.lua"

CompleteEffect = "effects/device_complete.lua"

DestroyEffect = "effects/cannon_explode.lua"

ShellEffect = "effects/shell_eject_cannon.lua"

ReloadEffect = "effects/reload_cannon.lua"

Projectile = "свое_название"

WeaponMass = 120.0

HitPoints = 550.0

EnergyProductionRate = 0.0

MetalProductionRate = 0.0

EnergyStorageCapacity = 0.0

MetalStorageCapacity = 0.0

MinWindEfficiency = 1

MaxWindHeight = 0

MaxRotationalSpeed = 0

DeviceSplashDamage = 150

DeviceSplashDamageMaxRadius = 400

DeviceSplashDamageDelay = 0.2

IncendiaryRadius = 120

IncendiaryRadiusHeated = 150

StructureSplashDamage = 200

StructureSplashDamageMaxRadius = 150

ReloadEffectOffset = -1.5

BarrelLength = 100.0

MinFireClearance = 500

FireClearanceOffsetInner = 20

FireClearanceOffsetOuter = 40

AttractZoomOutDuration = 5

ReloadTime = 26.0

MinFireSpeed = 6000.0 -- Move to Ammo/пораметры боеприпаса

MaxFireSpeed = 6000.1 -- Move to Ammo/пораметры боеприпаса

MinFireRadius = 600.0

MaxFireRadius = 1200.0

MinVisibility = 0.7

MaxVisibilityHeight = 1000

MinFireAngle = -20

MaxFireAngle = 30

KickbackMean = 40 -- Move to Ammo/пораметры боеприпаса

KickbackStdDev = 5 -- Move to Ammo/пораметры боеприпаса

MouseSensitivityFactor = 0.5

PanDuration = 0

FireStdDev = 0.01 -- Move to Ammo/пораметры боеприпаса

FireStdDevAuto = 0.012 -- Move to Ammo/пораметры боеприпаса

Recoil = 600000

EnergyFireCost = 2000.0 -- Move to Ammo/пораметры боеприпаса

MetalFireCost = 50.0 -- Move to Ammo/пораметры боеприпаса

ShowFireAngle = true

TargetIcon =

{

Persistent = true,

Texture = "ui/textures/mouse_target.tga",

Width = 32,

Height = 32,

}

dofile("effects/device_smoke.lua")

SmokeEmitter = StandardDeviceSmokeEmitter

Sprites =

{

{

Name = "свое_название-base",

States =

{

Normal = { Frames = { {texture = path .. "/weapons/свое_название/base.png" }, mipmap = true, }, },

Idle = Normal,

},

},

{

Name = "свое_название-head",

States =

{

Normal = { Frames = { {texture = path .. "/weapons/свое_название/head.png" }, mipmap = true, }, },

Idle = Normal,

},

},

{

Name = "свое_название-barrel",

States =

{

Normal = { Frames = { {texture = path .. "/weapons/свое_название/barrel.png" }, mipmap = true, }, },

Idle = Normal,

},

},

}

Root =

{

Name = "свое_название",

Angle = 0,

Pivot = { 0, -0.57 },

PivotOffset = { 0, 0 },

Sprite = "свое_название-base",

UserData = 0,

ChildrenBehind =

{

{

Name = "Head",

Angle = 0,

Pivot = { 0, -0.05 },

PivotOffset = { 0.1, 0 },

Sprite = "свое_название-head",

UserData = 50,

ChildrenBehind =

{

{

Name = "Barrel",

Angle = 0,

Pivot = { -0.5, -0.15},

PivotOffset = { 0.5, 0 },

Sprite = "свое_название-barrel",

UserData = 100,

},

{

Name = "Hardpoint0",

Angle = 90,

Pivot = { 0, 0.05 },

PivotOffset = { 0, 0 },

},

{

Name = "Chamber",

Angle = 0,

Pivot = { -0.32, -0.15 },

PivotOffset = { 0, 0 },

},

},

},

},

}

Из примера умышлено была уделена строчка кода анимации перезарядки, поскольку если текстуры будут меняться кардинально, то она и не нужна (поскольку придется потратить много времени на новые текстуры анимации). Однако, если это все же нужно, то пример ниже:

Спойлер

{

Name = "cannon-reload",

States =

{

Normal = { Frames = { { texture = "weapons/cannon/Cannon-Reload01.png" }, mipmap = true, }, },

Idle = Normal,

Reload =

{

Frames =

{

{ texture = "weapons/cannon/Cannon-Reload03.png", duration = 120, },

mipmap = true,

duration = 0.1,

},

},

ReloadEnd =

{

Frames =

{

{ texture = "weapons/cannon/Свое_название-Reload04.png" },

{ texture = "weapons/cannon/Свое_название-Reload05.png" },

{ texture = "weapons/cannon/Свое_название-Reload06.png" },

{ texture = "weapons/cannon/Свое_название-Reload07.png" },

{ texture = "weapons/cannon/Свое_название-Reload08.png" },

{ texture = "weapons/cannon/Свое_название-Reload09.png" },

{ texture = "weapons/cannon/Свое_название-Reload10.png" },

{ texture = "weapons/cannon/Свое_название-Reload11.png" },

{ texture = "weapons/cannon/Свое_название-Reload12.png" },

{ texture = "weapons/cannon/Свое_название-Reload13.png" },

{ texture = "weapons/cannon/Свое_название-Reload14.png" },

{ texture = "weapons/cannon/Свое_название-Reload15.png" },

{ texture = "weapons/cannon/Свое_название-Reload01.png" },

mipmap = true,

duration = 0.1,

},

NextState = "Normal",

},

},

},

Однако сама по себе анимация не будет работает - ее нужно подключит.

ChildrenInFront =

{

{

Name = "LoaderBottom",

Angle = 0,

Pivot = { -0.41, -0.085 },

PivotOffset = { 0, 0 },

Sprite = "Свое_название-reload",

UserData = 100,

},

},

},

В местах обращения к текстуре (texture = "weapons/cannon/base.dds") необходимо добавить "path ..", тем самым получив: texture = path .. "/weapons/свое_название/

Пояснение:

Спойлер

::1

Масса оружия \ WeaponMass \ В оригинале 120.0

::2

Точки попадания \ HitPoints \ В оригинале 550.0

::3

Коэффициент производства энергии \ EnergyProductionRate \ В оригинале 0.0

::4

Скорость производства металла \ MetalProductionRate \ В оригинале 0.0

::5

Емкость хранилища энергии \ EnergyStorageCapacity \ В оригинале 0.0

::6

Емкость для хранения металла \ MetalStorageCapacity \ В оригинале 0.0

::7

Минимальная эффективность \ MinWindEfficiency \ В оригинале 1

::8

Максимальная высота ветра \ MaxWindHeight \ В оригинале 0

::9

Максимальная скорость вращения \ MaxRotationalSpeed \ В оригинале 0

::10

Повреждение устройств в результате взрыва \ DeviceSplashDamage \ В оригинале 150

::11

Устройства для защиты от радиации \ DeviceSplashDamageMaxRadius \ В оригинале 400

::12

Устройства, которые могут быть повреждены \ DeviceSplashDamageDelay \ В оригинале 0.2

::13

Зажигательный радиус \ IncendiaryRadius \ В оригинале 120

::14

Нагреваемый радиус воспламенения \ IncendiaryRadiusHeated \ В оригинале 150

::15

Повреждение конструкции от брызг \ StructureSplashDamage \ В оригинале 200

::16

Максимальный радиус повреждения конструкции брызгами \ StructureSplashDamageMaxRadius \ В оригинале 150

::17

Смещение эффекта перезарядки \ ReloadEffectOffset \ В оригинале -1.5

::18

Длина ствола \ BarrelLength \ В оригинале 100.0

::19

Минимальный противопожарный зазор \ MinFireClearance \ В оригинале 500.0

::20

Компенсатор пожарной безопасности \ FireClearanceOffsetInner \ В оригинале 20

::21

Наружное cмещение противопожарного зазора \ FireClearanceOffsetOuter \ В оригинале 40

::22

Длительность уменьшения масштаба \ AttractZoomOutDuration \ В оригинале 5

::23

Время перезарядки \ ReloadTime \ В оригинале 26.0

::24

Минимальная скорость стрельбы \ MinFireSpeed \ В оригинале 6000.0 \ Пораметр боеприпаса.

::25

Максимальная скорость стрельбы \

MaxFireSpeed \ В оригинале 6000.1 \ Пораметр боеприпаса.

::26

Минимальный радиус поражения \ MinFireRadius \ В оригинале 600.0

::27

Максимальный радиус возгорания \ MaxFireRadius \ В оригинале 1200.0

::28

Минимальная видимость \ MinVisibility \ В оригинале 0.7

::29

Максимальная высота видимости \ MaxVisibilityHeight \ В оригинале 1000

::30

Минимальный угол обстрела \ MinFireAngle \ В оригинале -20

::31

Максимальный угол обстрела \ MaxFireAngle \ В оригинале 30

::32

Значение отката \ KickbackMean \ В оригинале 40 \ Пораметр боеприпаса.

::33

Откат StdDev \ KickbackStdDev \ В оригинале 5 \ Пораметр боеприпаса.

::34

Коэффициент чувствительности мыши \ MouseSensitivityFactor \ В оригинале 0.5

::35

Продолжительность панорамирования \

PanDuration \

\ В оригинале 0

::36

Огонь StdDev \ FireStdDev \ В оригинале 0.01 \ Пораметр боеприпаса.

::37

Автоматический запуск StdDev \ FireStdDevAuto \ В оригинале 0.012 \ Пораметр боеприпаса.

::38

Отступать \ Recoil \ В оригинале 600000

::39

Затраты на энергию при пожаре \ EnergyFireCost \ В оригинале 2000.0 \ Пораметр боеприпаса.

::40

Стоимость возгорания металла \ MetalFireCost \ В оригинале 50.0 \ Пораметр боеприпаса.

::41

Предел отдачи ствола \ BarrelRecoilLimit \ В оригинале -0.25

::42

Скорость отдачи ствола \ BarrelRecoilSpeed \ В оригинале -2

::43

Усилие возврата ствола \ BarrelReturnForce \ В оригинале 0.5

Настройка "листа" для оружия

Здесь настраивается: стоимость покупки, стоимость использования, а также эффекты для самого оружия.

Для начало поместим в каталог "название_мода\weapons\" projectile_list.lua (из "..\Forts\data\weapons"). Далее удаляем все, кроме:

Спойлер

{

SaveName = "cannon",

ProjectileType = "mortar",

ProjectileSprite = "weapons/media/bullet",

ProjectileSpriteMipMap = false,

DrawBlurredProjectile = true,

ProjectileMass = 16,

ProjectileDrag = 0,

Impact = 20000,

DestroyShields = true,

DeflectedByShields = false,

PassesThroughMaterials = false,

ExplodeOnTouch = false,

ProjectileThickness = 10.0,

ProjectileShootDownRadius = 60,

BeamTileRate = 0.02,

BeamScrollRate = 0.0,

ProjectileDamage = 700.0, -- large enough to destroy an undamaged cannon

ProjectileSplashDamage = 30.0, -- low splash damage

ProjectileSplashDamageMaxRadius = 200.0,

ProjectileSplashMaxForce = 10000, -- moderate shockwave

SpeedIndicatorFactor = 0.25,

TrailEffect = "effects/cannon_trail.lua",

Effects =

{

Impact =

{

["device"] = "effects/impact_heavy.lua",

["foundations"] = "effects/impact_heavy_ground.lua",

["rocks01"] = "effects/impact_heavy_ground.lua",

["bracing"] = "effects/impact_heavy.lua",

["armour"] = "effects/impact_heavy.lua",

["door"] = "effects/impact_heavy.lua",

["default"] = "effects/impact_heavy.lua",

},

Deflect =

{

["armour"] = "effects/armor_ricochet.lua",

["door"] = "effects/armor_ricochet.lua",

["shield"] = "effects/energy_shield_ricochet.lua",

},

},

MomentumThreshold =

{

["armour"] = { Reflect = 0, Penetrate = 4000 },

["door"] = { Reflect = 0, Penetrate = 4000 },

},

},

После этого стоит добавить/заменить некоторые строчки кода. Пример:

Спойлер

table.insert(Projectiles,

{

SaveName = "Свое_название",

ProjectileType = "bullet",

ProjectileSprite = path .. "/weapons/media/cannon_maker",

ProjectileSpriteMipMap = false,

DrawBlurredProjectile = true,

DestroyShields = true,

ExplodeOnTouch = false,

SurvivesProjectileCollision = true,

ProjectileMass = 16,

ProjectileDrag = 0,

Impact = 20000,

ProjectileThickness = 10,

ProjectileShootDownRadius = 60,

AntiAirHitPoints = 150,

BeamTileRate = 0.02,

BeamScrollRate = 0.0,

ProjectileDamage = 700, -- large enough to destroy an undamaged cannon

ProjectileSplashDamage = 30, -- low splash damage

ProjectileSplashDamageMaxRadius = 200,

ProjectileSplashMaxForce = 10000, -- moderate shockwave

SpeedIndicatorFactor = 0.25,

TrailEffect = "effects/cannon_trail.lua",

Effects =

{

Impact =

{

["default"] = "effects/mushroom_cloud.lua",

},

Deflect =

{

["armour"] = "effects/armor_bullet_ricochet.lua",

["door"] = "effects/armor_bullet_ricochet.lua",

["shield"] = "effects/energy_shield_ricochet.lua",

},

DamageMultiplier =

{

{ SaveName = "bracing", Direct = 0 },

},

}

})

"Этим" выделены добавленные строчки.

Пояснение:

Спойлер

::1

Масса снаряда \ ProjectileMass \ В оригинале 16

::2

Сопротивление снаряда \ ProjectileDrag \ В оригинале 0

::3

Ударная волна \ Impact \ В оригинале 20000

::4

Толщина снаряда \ ProjectileThickness \ В оригинале 10

::5

Радиус поражения снарядом \ ProjectileShootDownRadius \ В оригинале 60

::6

Поражающие момент противовоздушной обороны \ AntiAirHitPoints \ В оригинале 150

::7

Скорость строительства луча (??) \ BeamTileRate \ В оригинале 0.02

::8

Скорость прокрутки луча (??) \ BeamScrollRate \ В оригинале 0.0

::9

Повреждение снарядом \ ProjectileDamage \ В оригинале 700 \ Достаточно большой, чтобы уничтожить неповрежденную пушку

::10

Урон от попадания снаряда \ ProjectileSplashDamage\ В оригинале 30 \ Низкий урон от брызг

::11

Максимальный радиус повреждения от брызг снаряда \ ProjectileSplashDamageMaxRadius \ В оригинале 200

::12

Максимальная сила разбрязгивания снаряда \ ProjectileSplashMaxForce \ В оригинале 10000

::13

Коэффициент индикатора скорости \ SpeedIndicatorFactor \ В оригинале 0.25

А теперь приступим к настройке боеприпасов, для оружия.

Настройка боеприпасов.

Для начала переносим weapon_list.lua в каталог "название_мода\weapons\" (из "..\Forts\data\weapons") удаляем ненужное и добавляем дополнительный код.

То, что нужно оставить:

Спойлер

SaveName = "cannon",

FileName = "weapons/cannon.lua",

Icon = "hud-cannon-icon",

GroupButton = "hud-group-cannon",

Detail = "hud-detail-cannon",

Prerequisite = "factory",

BuildTimeComplete = 110.0,

ScrapPeriod = 8,

MetalCost = 900,

EnergyCost = 5000,

MetalRepairCost = 150,

EnergyRepairCost = 3000,

MaxSpotterAssistance = 1, -- major benefit from spotters

MaxUpAngle = StandardMaxUpAngle,

BuildOnGroundOnly = false,

SelectEffect = "ui/hud/weapons/ui_weapons",

ObserverBuildEvent = true,

Пример изменения:

Спойлер

table.insert(Sprites, ButtonSprite("hud-свое_название-icon", "HUD/HUD-cannon_maker", nil, ButtonSpriteBottom, nil, nil, path))

table.insert(Weapons, IndexOfWeapon("cannon"),

{

SaveName = "свое_название",

FileName = path .. "/weapons/свое_название.lua",

Icon = "hud-cannon_maker-icon",

GroupButton = "hud-group-cannon",

Detail = "hud-detail-cannon",

Prerequisite = "munitions",

MaxUpAngle = StandardMaxUpAngle,

BuildOnGroundOnly = false,

Enabled = true,

SelectEffect = "ui/hud/weapons/ui_weapons",

BuildTimeIntermediate = 75,

BuildTimeComplete = 150,

ScrapPeriod = 5,

MetalCost = 900,

EnergyCost = 5000,

MetalRepairCost = 0,

EnergyRepairCost = 0,

MetalReclaimMin = 0.5,

MetalReclaimMax = 0.9,

EnergyReclaimMin = 0.1,

EnergyReclaimMax = 0.4,

MaxSpotterAssistance = 0,

})

Пояснение:

Спойлер

::1

Промежуточное время сборки \ BuildTimeIntermediate \ В оригинале 75

::2

Время сборки завершено \ BuildTimeComplete \ В оригинале 150

::3

Период утилизации \ ScrapPeriod \ В оригинале 5

::4

Стоимость в металле \ MetalCost \ В оригинале 900

::5

Стоимость в энергии \ EnergyCost \ В оригинале 5000

::6

Стоимость ремонта в металле \ MetalRepairCost \ В оригинале 0

::7

Стоимость ремонта в энергии \ EnergyRepairCost \ В оригинале 0

::8

Минимальное количество металла для восстановленния \ MetalReclaimMin \ В оригинале 0.5

::9

Максимальное количество металла для восстановленния \ MetalReclaimMax \ В оригинале 0.5

::10

Минимальное потребление энергии \ EnergyReclaimMin \ В оригинале 0.1

::11

Максимальное потребление энергии \ EnergyReclaimMax \ В оригинале 0.4

::12

Максимальная помощь корректировщика \ MaxSpotterAssistance \ В оригинале 1 или 0

Во всех файлах .lua требуется называть свое оружие ОДИНАКОВО, тоже самое относится к текстурам.
Комментарии: 1
Ваш комментарий