function GetWeaponDPS(bp,weapon)
local DPS = {}
DPS.Damage = 0
DPS.RateOfFire = 0
DPS.DPS = 0
-- enable debug text
local bugtext = false
local WeaponEco = __blueprints[weapon.ProjectileId].Economy or nil
if WeaponEco and bp.Economy.BuildRate > 1 and WeaponEco.BuildTime > 1 and (WeaponEco.BuildCostEnergy > 1 or WeaponEco.BuildCostMass > 1) then
if bugtext == true then
LOG(' BuildTime')
end
local MuzzleSalvoSize = weapon.MuzzleSalvoSize or 1
DPS.RateOfFire = 1 / (__blueprints[weapon.ProjectileId].Economy.BuildTime / bp.Economy.BuildRate)
if weapon.NukeInnerRingDamage > 0 then
DPS.Damage = weapon.NukeInnerRingDamage + weapon.NukeOuterRingDamage
else
DPS.Damage = weapon.Damage * MuzzleSalvoSize
end
elseif weapon.DoTPulses then
if bugtext == true then
LOG(' DoTPulses')
end
DPS.RateOfFire = 1 / (math.round(10/weapon.RateOfFire) / 10)
DPS.Damage = weapon.Damage * weapon.MuzzleSalvoSize * weapon.DoTPulses
elseif weapon.ContinuousBeam then
-- ual0401
if bugtext == true then
LOG(' Continuous Beam')
end
--LOG(' weapon.BeamCollisionDelay='..weapon.BeamCollisionDelay)
local temp = weapon.BeamCollisionDelay == 0 and 1 or weapon.BeamCollisionDelay
--LOG(' temp='..temp)
DPS.RateOfFire = 1 / (weapon.BeamCollisionDelay == 0 and 1 or weapon.BeamCollisionDelay)
DPS.Damage = weapon.Damage * 10
elseif (weapon.BeamLifetime and weapon.BeamLifetime > 0) then
-- xsb2301 xea0002
if bugtext == true then
LOG(' Pulse Beam')
end
local BeamCollisionDelay = weapon.BeamCollisionDelay or 0
local BeamLifetime = weapon.BeamLifetime or 1
if BeamLifetime > 5 then
BeamLifetime = 5
end
DPS.RateOfFire = 1 / (math.round(10/weapon.RateOfFire) / 10)
DPS.Damage = weapon.Damage * BeamLifetime * 10
elseif (weapon.RackSalvoReloadTime and weapon.RackSalvoReloadTime > 0) and not weapon.RackSalvoFiresAfterCharge then
if bugtext == true then
LOG(' Salvos')
end
-- Salvos don't use weapon.RateOfFire
DPS.RateOfFire = 1 / ((weapon.MuzzleSalvoSize * weapon.MuzzleSalvoDelay + weapon.RackSalvoReloadTime))
DPS.Damage = weapon.Damage * weapon.MuzzleSalvoSize
else
-- ueb2101
if bugtext == true then
LOG(' One Shot')
end
local ProjectilesPerOnFire = weapon.ProjectilesPerOnFire or 1
local AttackGroundTries = weapon.AttackGroundTries or 1
local MuzzleSalvoSize = weapon.MuzzleSalvoSize or 1
-- don't use ProjectilesPerOnFire if MuzzleSalvoSize is present.
if MuzzleSalvoSize > 1 and ProjectilesPerOnFire > 1 then
if MuzzleSalvoSize ~= ProjectilesPerOnFire then
WARN('unit ['..bp.BlueprintId..'] has wrong ProjectilesPerOnFire in Weapon ['..weapon.DisplayName..']')
end
ProjectilesPerOnFire = 1
end
DPS.RateOfFire = 1 / (math.round(10/weapon.RateOfFire) / 10)
DPS.Damage = weapon.Damage * MuzzleSalvoSize * ProjectilesPerOnFire
end
if DPS.RateOfFire == 0 then DPS.RateOfFire = 1 end
--LOG(' Damage: '..DPS.Damage..' - RateOfFire: '..DPS.RateOfFire..' - new DPS: '..(DPS.Damage*DPS.RateOfFire))
DPS.DPS = DPS.Damage*DPS.RateOfFire
return DPS
end
Statistics: Posted by Uveso — 22 Jul 2018, 23:24
Statistics: Posted by nine2 — 22 Jul 2018, 23:15
Statistics: Posted by Louvegarde — 22 Jul 2018, 16:52
Statistics: Posted by JoonasTo — 13 Jun 2018, 17:38
Statistics: Posted by Exotic_Retard — 13 Jun 2018, 16:42
Statistics: Posted by JoonasTo — 13 Jun 2018, 14:46
Statistics: Posted by Exotic_Retard — 13 Jun 2018, 12:41
Statistics: Posted by Exotic_Retard — 13 Jun 2018, 01:52
IF(Turreted=True;MuzzleCount;MuzzleSalvoSize)*IF(AND(RackFireTogether=True;MuzzleSalvoSize=1);RackCount;1)*IF(BeamLifetime>0;(Beamlifetime+0.1)/0.1;1)*IF(DotPulses>0;DotPulses;1)*Fragments*Damage/(IF((MuzzleSalvoSize-1)*MuzzleSalvoDelay>1/RateOfFire;(MuzzleSalvoSize-1)*MuzzleSalvoDelay;IF(MuzzleSalvoSize*MuzzleSalvoDelay>1/RateOfFire;MuzzleSalvoSize*MuzzleSalvoDelay;1/RateOfFire))+RackSalvoChargeTime+RackSalvoReloadTime) = DPS
Statistics: Posted by JoonasTo — 13 Jun 2018, 01:24