Module:Sandbox/User:Sfoxrs/ecb
Documentation for this module may be created at Module:Sandbox/User:Sfoxrs/ecb/doc
-- <pre>
local p = {}
local htnmlext = require('Module:Mw.html extension')
local yesno = require ("Module:Yesno")
local lang = mw.getContentLanguage()
function p.main(frame)
local args = frame:getParent().args
local damage = tonumber(args.damage) or 0
local target = args.target --primary, secondary
local souls = yesno(args.souls) or false
local vuln = yesno(args.vuln) or false
local slayerPerk = yesno(args.slayerPerk) or false
local slayerAbility = yesno(args.slayerAbility) or false
local spider = args.spider --0%, 2%, 3%
local addinfo = yesno(args.addinfo) or false
return calculateDamage(damage,target,souls,vuln,slayerPerk,slayerAbility,spider,addinfo)
end
function calculateDamage(damage,target,souls,vuln,slayerPerk,slayerAbility,spider,addinfo)
local amountHealed = 0
local damageFromSpecSoulsAvg = 0
local damageFromSpecSoulsMin = 0
local damageFromSpecSoulsMax = 0
--values without direct split soul damage modifiers
local vulnMod = 1; if(vuln) then vulnMod = 1.1 end
local slayerPerkMod = 1; if(slayerPerk) then slayerPerkMod = 1.07 end
local slayerAbilityMod = 1; if(slayerAbility) then slayerAbilityMod = 1.15 end
local spiderMod = 1; if (spider=="2%") then spiderMod = 1.02 elseif (spider=="3%") then spiderMod = 1.03 end
local noVulnDamage = math.max(1, math.ceil(damage/(vulnMod*slayerPerkMod*slayerAbilityMod*spiderMod)) )
local noVulnAmountHealed = 0
local noVulnDamageFromSpecSoulsAvg = 0
local noVulnDamageFromSpecSoulsMin = 0
local noVulnDamageFromSpecSoulsMax = 0
--soul split heals
if target=="Primary" then
amountHealed = math.floor(math.min(2000,damage)*.1) + math.floor(math.max(0,math.min(2000,damage-2000))*.05) + math.floor(math.max(0,damage-4000)*.0125)
noVulnAmountHealed = math.floor(math.min(2000,noVulnDamage)*.1) + math.floor(math.max(0,math.min(2000,noVulnDamage-2000))*.05) + math.floor(math.max(0,noVulnDamage-4000)*.0125)
elseif target=="Secondary" then
amountHealed = math.floor(math.min(2000,damage)*.1*.5) + math.floor(math.max(0,math.min(2000,damage-2000))*.05*.5) + math.floor(math.max(0,damage-4000)*.0125*.5)
noVulnAmountHealed = math.floor(math.min(2000,noVulnDamage)*.1*.5) + math.floor(math.max(0,math.min(2000,noVulnDamage-2000))*.05*.5) + math.floor(math.max(0,noVulnDamage-4000)*.0125*.5)
end
local avgIncreaseHealed = math.floor(amountHealed*.375)
local maxIncreaseHealed = math.floor(amountHealed*.5)
local noVulnAvgIncreaseHealed = math.floor(noVulnAmountHealed*.375)
local noVulnMaxIncreaseHealed = math.floor(noVulnAmountHealed*.5)
--split soul damage
--avg with amulet of souls
damageFromSpecSoulsAvg = math.floor(math.floor(math.floor(math.floor( (.5*math.floor(amountHealed*4) + .5*math.floor((amountHealed+avgIncreaseHealed)*4)) * vulnMod) * slayerPerkMod) * slayerAbilityMod) * spiderMod)
noVulnDamageFromSpecSoulsAvg = .5*math.floor(noVulnAmountHealed*4) + .5*math.floor((noVulnAmountHealed+noVulnAvgIncreaseHealed)*4)
--min with amulet of souls or no amulet of souls
damageFromSpecSoulsMin = math.floor(math.floor(math.floor(math.floor( math.floor(amountHealed*4) * vulnMod) * slayerPerkMod) * slayerAbilityMod) * spiderMod)
noVulnDamageFromSpecSoulsMin = math.floor(noVulnAmountHealed*4)
--max with amulet of souls
damageFromSpecSoulsMax = math.floor(math.floor(math.floor(math.floor( math.floor((amountHealed+maxIncreaseHealed)*4) * vulnMod) * slayerPerkMod) * slayerAbilityMod) * spiderMod)
noVulnDamageFromSpecSoulsMax = math.floor((noVulnAmountHealed+noVulnMaxIncreaseHealed)*4)
--table for output
local size = 30
local check = {
[true] = 'Yes check',
[false] = 'X mark'
}
local resultsDiv = mw.html.create( 'div' )
local resultsTable = mw.html.create( 'table' )
resultsTable:addClass( 'wikitable' )
:IF(addinfo)
:addClass( 'align-center-1 align-center-2 align-center-3 align-center-4 align-center-5 align-center-6' )
:ELSE()
:addClass( 'align-center-1 align-center-2 align-center-3 align-center-4 align-center-5' )
:END()
:tag( 'caption' )
:IF(addinfo)
:wikitext( 'Damage from Split Soul. This is calculated based on whether the target is a primary or a secondary target, whether the player has the Amulet of souls/Essence of Finality amulet equipped, and if the target is affected by a combination of: Vulnerability, a Slayer perk, a Slayer ability, and the NopeNopeNope perk. The Damage Increase column describes the increase coming from the Split Soul damage. The Increase from Split Soul damage modifiers column describes the base damage hitsplat and Split Soul damage increase with Split Soul damage modifiers to without Split Soul damage modifiers. ' )
:css('text-align', 'left')
:ELSE()
:wikitext( 'Damage from Split Soul. This is calculated based on whether the target is a primary or a secondary target, whether the player has the Amulet of souls/Essence of Finality amulet equipped, and if the target is affected by a combination of: Vulnerability, a Slayer perk, a Slayer ability, and the NopeNopeNope perk. The Damage Increase column describes the increase coming from the Split Soul damage. ' )
:css('text-align', 'left')
:END()
:tag( 'tr' )
:tag( 'th' )
:wikitext( 'Damage from Split Soul (' .. target .. ' target)' .. "<br/>Active Split Soul damage modifiers:")
:IF(vuln)
:wikitext(string.format("[[File:Vulnerability icon.png|link=Vulnerability|%dpx]]",size))
:END()
:IF(slayerPerk)
:wikitext(string.format("[[File:Demon_Slayer_(perk).png|link=Demon_Slayer_(perk)|%dpx]][[File:Dragon_Slayer_(perk).png|link=Dragon_Slayer_(perk)|%dpx]][[File:Undead_Slayer.png|link=Undead_Slayer|%dpx]]",size,size,size))
:END()
:IF(slayerAbility)
:wikitext(string.format("[[File:Demon_Slayer_(ability).png|link=Demon_Slayer_(ability)|%dpx]][[File:Dragon_Slayer_(ability).png|link=Dragon_Slayer_(ability)|%dpx]][[File:Undead_Slayer_(ability).png|link=Undead_Slayer_(ability)|%dpx]]",size,size,size))
:END()
:IF(spider~="0%")
:wikitext(string.format("[[File:NopeNopeNope_status_icon.png|link=Player-owned_farm#Perks|%dpx]]",size) .. spider)
:END()
:IF(vuln==false and slayerPerk==false and slayerAbility==false and spider=="0%")
:wikitext( ' None' )
:END()
:IF(addinfo)
:attr( 'colspan', 6 )
:ELSE()
:attr( 'colspan', 5 )
:END()
:done()
:done()
:tag( 'tr' )
:tag( 'th' )
:wikitext( string.format("[[File:Amulet_of_souls_(or).png|link=]]") .. string.format('[[File:%s.svg|20px|link=]]', check[yesno(souls)]) )
:done()
:tag( 'th' )
:wikitext( 'Base Hitsplat<br/>' .. string.format("[[File:Ranged-icon.png|link=]]") )
:done()
:tag( 'th' )
:wikitext( 'Split Soul damage<br/>' .. string.format("[[File:Split Soul hitsplat.png|link=]]") )
:done()
:tag( 'th' )
:wikitext( 'Total damage<br/>' .. string.format("[[File:Ranged-icon.png|link=]]") .. "+" .. string.format("[[File:Split Soul hitsplat.png|link=]]") )
:done()
:tag( 'th' )
:wikitext( 'Damage Increase<br/>(%)' )
:done()
:IF(addinfo)
:tag( 'th' )
:wikitext( 'Increase from Split Soul<br/>damage modifiers' )
:done()
:END()
:done()
:IF(souls)
:tag( 'tr' )
:tag( 'td' )
:wikitext( '<b>Average</b>' )
:done()
:tag( 'td' )
:wikitext( string.format("<b>%s</b>",lang:formatNum(damage)) )
:done()
:tag( 'td' )
:wikitext( string.format("<b>%s</b>",lang:formatNum(damageFromSpecSoulsAvg)) )
:done()
:tag( 'td' )
:wikitext( string.format("<b>%s</b>",lang:formatNum(damage+damageFromSpecSoulsAvg)) )
:done()
:tag( 'td' )
:wikitext( string.format("<b>%.2f</b>",lang:formatNum(damageFromSpecSoulsAvg/damage*100)) .. "<b>%</b>" )
:done()
:IF(addinfo)
:tag( 'td' )
:wikitext( string.format("<b>%.2f</b>", lang:formatNum(((damage+damageFromSpecSoulsAvg)/(noVulnDamage+noVulnDamageFromSpecSoulsAvg)-1)*100)) .. "<b>%</b>" )
:done()
:END()
:done()
:END()
:tag( 'tr' )
:tag( 'td' )
:IF(souls)
:wikitext( 'Minimum' )
:ELSE()
:wikitext( 'Damage' )
:END()
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damage)) )
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damageFromSpecSoulsMin)) )
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damage+damageFromSpecSoulsMin)) )
:done()
:tag( 'td' )
:wikitext( string.format("%.2f",lang:formatNum(damageFromSpecSoulsMin/damage*100)) .. "%" )
:done()
:IF(addinfo)
:tag( 'td' )
:wikitext( string.format("%.2f", lang:formatNum(((damage+damageFromSpecSoulsMin)/(noVulnDamage+noVulnDamageFromSpecSoulsMin)-1)*100)) .."%" )
:done()
:END()
:done()
:IF(souls)
:tag( 'tr' )
:tag( 'td' )
:wikitext( 'Maximum' )
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damage)) )
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damageFromSpecSoulsMax)) )
:done()
:tag( 'td' )
:wikitext( string.format("%s",lang:formatNum(damage+damageFromSpecSoulsMax)) )
:done()
:tag( 'td' )
:wikitext( string.format("%.2f",lang:formatNum(damageFromSpecSoulsMax/damage*100)) .. "%" )
:done()
:IF(addinfo)
:tag( 'td' )
:wikitext( string.format("%.2f", lang:formatNum(((damage+damageFromSpecSoulsMax)/(noVulnDamage+noVulnDamageFromSpecSoulsMax)-1)*100)) .."%" )
:done()
:END()
:done()
:END()
:done()
--return results (table)
resultsDiv:node(tostring(resultsTable))
return resultsDiv
end
return p