Перед началом стоит изучить предыдущую часть. Поскольку подготовка была завершена, приступим настройка свойств самого оружия.
Настройка параметров оружия.
Для начало сканируем 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 требуется называть свое оружие ОДИНАКОВО, тоже самое относится к текстурам.
будет 3 часть?