Módulo:Calculadora de Guardião da morte

De RuneScape Wiki
Ir para: navegação, pesquisa
Documentação do módulo
Esta documentação é transcluída de Predefinição:Sem documentação/doc. [editar] [atualizar]
Este módulo não possui nenhuma documentação. Por favor, considere adicionar uma documentação em Módulo:Calculadora de Guardião da morte/doc. [editar]
Módulo:Calculadora de Guardião da morte's a função main é invocada por Calculadora:Predefinição/Combate/Guardião da morte.

-- <pre>
local p = {}

local lang = mw.getContentLanguage()

function p.main(frame)
	local invokeArgs = frame.args
    local args = frame:getParent().args
    
    return p._main( invokeArgs, args )
end

function Heaviside(startinghp,hpThreshold)
	local unit = -999
	if(startinghp==hpThreshold) then unit = 1
	else unit = (startinghp-hpThreshold+math.abs(startinghp-hpThreshold))/(2*(startinghp-hpThreshold))
	end
	return unit
end
	
function p._main( invokeArgs, args )
    local maxhp = tonumber(args.maxhp)
    local currenthp = tonumber(args.currenthp)
    local damagetaken = tonumber(args.damagetaken)
    
    local DEBUG = false
    
    --calculating hp thresholds
    local halfhpThreshold = math.floor(maxhp/2)
    local quarterhpThreshold = math.floor(maxhp/4)
    
    --calculating damage taken due to death ward relic
    local Abovehalfunit = Heaviside(currenthp,halfhpThreshold)
    local Abovequarterunit = Heaviside(currenthp,quarterhpThreshold)
    local MaxOfTwoHeavisideFunctions = math.max(Abovehalfunit,Abovequarterunit)
    
    local prethreshdamage = math.max(0,Abovehalfunit*math.ceil(math.max(0,math.min(currenthp-halfhpThreshold,damagetaken))))
    local halfthreshdamage = math.max(0,MaxOfTwoHeavisideFunctions*math.ceil(math.max(0,math.min((math.min(currenthp,halfhpThreshold)-quarterhpThreshold),math.min(damagetaken,math.max((damagetaken-(currenthp-halfhpThreshold)),0))))*0.95))
    local quarterthreshdamage = math.max(0,math.ceil(math.max(0,(damagetaken-math.max(0,currenthp-quarterhpThreshold)))*0.9))
    
    --calculating total damage after death ward relic
    local finaldamage = math.min(currenthp, prethreshdamage+halfthreshdamage+quarterthreshdamage)
    local relicdamage = prethreshdamage+halfthreshdamage+quarterthreshdamage
    
    --returning results
    local res=""
    if (currenthp<relicdamage) then
    	res = res .. "<div style=\"font-weight:bold\">Dano recebido: " .. lang:formatNum(relicdamage) .. ". Devido aos pontos de vida atuais, o dano real sofrido é " .. lang:formatNum(currenthp) .. ".</div>"
    else
    	res = res .. "<div style=\"font-weight:bold\">Dano recebido: " .. lang:formatNum(relicdamage) .. "</div>"
    end
    res = res .. "<div style=\"font-weight:bold\">Pontos de vida restantes: " .. lang:formatNum(currenthp-finaldamage) .. "</div>"
    res = res .. "<br/>"
    res = res .. "Dano reduzido em: " .. lang:formatNum(math.min(0.1*damagetaken,damagetaken-relicdamage,damagetaken-finaldamage)) .. "<br/>"
    res = res .. "Redução de dano percentual: " .. string.format("%.2f",math.min(10,(1-relicdamage/damagetaken)*100,(1-finaldamage/damagetaken)*100)) .. "%</br>"
    
    --debug
    if DEBUG == true then
    	res = res .. "</br>"
    	res = res .. "prethreshdamage: " .. lang:formatNum(prethreshdamage) .. "</br>"
    	res = res .. "halfthreshdamage: " .. lang:formatNum(halfthreshdamage) .. "</br>"
    	res = res .. "quarterthreshdamage: " .. lang:formatNum(quarterthreshdamage) .. "</br>"
    end
	    
    return res
end

return p