Module:Damage: Difference between revisions
From Elwiki
No edit summary |
No edit summary |
||
Line 2: | Line 2: | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local p = {} | local p = {} | ||
function string.starts(String,Start) | function string.starts(String, Start) | ||
return string.sub(String,1,string.len(Start))==Start | return string.sub(String, 1, string.len(Start)) == Start | ||
end | end | ||
-- Function wrapper for vardefine syntax in MW. | -- Function wrapper for vardefine syntax in MW. | ||
function var(name, dmg) | function var(name, dmg) | ||
return '{{#vardefine:{{formatnum:'..name..'|'..round(dmg)..'}}%}}' | return '{{#vardefine:{{formatnum:' .. name .. '|' .. round(dmg) .. '}}%}}' | ||
end | end | ||
Line 22: | Line 22: | ||
function inArgsStarts(key) | function inArgsStarts(key) | ||
for k,v in spairs(args) do | for k, v in spairs(args) do | ||
if string.starts(k, key) then | if string.starts(k, key) then | ||
return true | return true | ||
Line 29: | Line 29: | ||
end | end | ||
-- Handle trait table | -- Handle trait table | ||
local traits = {} | local traits, vars = {} | ||
if (inArgs('heavy')) then | if (inArgs('heavy')) then | ||
Line 58: | Line 49: | ||
end | end | ||
-- Define total/average damage calculation based on damage per hit and hit amount. | function list(mode) | ||
-- Define tables that hold the subsequent damage values. | |||
-- I know this isn't the best, but I don't want to work with nested tables in this language. | |||
local fvals, tvals, pvals1, pvals2, pvals12 = {} | |||
-- Check the specified mode and define the prefixes/suffixes first. | |||
local pr, su, pvp = '' | |||
if (mode == 'pvp') then | |||
pr = 'pvp_' | |||
su = '_pvp' | |||
pvp = 'pvp' | |||
end | |||
-- Define total/average damage calculation based on damage per hit and hit amount. | |||
function getTotal(dmg, hits, fval) | |||
local i = 1 | |||
fvals[fval] = 0 | |||
for k, v in spairs(args) do | |||
if string.starts(k, pr .. 'dmg') then | |||
-- Proceed to combine | |||
fvals[fval] = fvals[fval] + args[dmg .. i] * args[hits .. i] | |||
i = i + 1 | |||
end | |||
end | |||
-- Apply Useful modifier. | |||
if string.find(fval, 'useful') then | |||
fvals[fval] = fvals[fval] * args.useful_penalty | |||
end | end | ||
end | end | ||
-- Actually generate the values depending on arguments provided. | |||
getTotal(pr .. 'dmg', 'hits', 'total_damage' .. su) | |||
if inArgsStarts('avg_hits') then | |||
getTotal(pr .. 'dmg', 'avg_hits', 'average_damage' .. su) | |||
end | |||
if inArgsStarts('awk_dmg') then | |||
getTotal(pr .. 'awk_dmg', 'awk_hits', 'total_damage_awk' .. su) | |||
end | |||
if inArgsStarts('avg_awk_hits') then | |||
getTotal(pr .. 'awk_dmg', 'avg_awk_hits', 'average_damage_awk' .. su) | |||
end | |||
-- Handling traits | |||
-- Useful handled separately | |||
if inArgs('useful_penalty') then | |||
getTotal(pr .. 'dmg', 'hits_useful', 'total_damage_useful' .. su) | |||
if (inArgsStarts('avg_hits_useful')) then | |||
getTotal(pr .. 'dmg', 'avg_hits_useful', 'average_damage_useful' .. su) | |||
end | |||
end | end | ||
-- Multiply all values with traits and store them in another table. | |||
for k, v in spairs(fvals) do | |||
if not string.find(k, 'useful') then | |||
for kt, vt in spairs(traits) do | |||
if inArgs(kt) then | |||
local dmg_name = k .. '_' .. kt | |||
local dmg_formula = v * vt | |||
tvals[dmg_name] = dmg_formula | |||
end | |||
end | end | ||
end | end | ||
end | end | ||
-- Define passives and fill the respective tables. | |||
local passive2 = 0 | |||
if inArgs('passive2') then | |||
passive2 = split(args.passive2) | |||
for k, v in spairs(tvals) do | |||
local dmg_name = k .. '_passive2' | |||
local dmg_formula = v * passive2[1] | |||
pvals2[dmg_name] = dmg_formula | |||
end | |||
-- Useful separately. | |||
for k, v in spairs(fvals) do | |||
if (string.find(k, 'useful')) then | |||
pvals2[k .. '_passive2'] = v * passive2[1] | |||
end | |||
end | end | ||
end | end | ||
local passive1 = 0 | |||
if inArgs('passive1') then | |||
passive1 = split(args.passive1) | |||
for k, v in spairs(tvals) do | |||
local dmg_name = k .. '_passive1' | |||
local dmg_formula = v * passive1[1] | |||
pvals1[dmg_name] = dmg_formula | |||
end | |||
-- Useful separately | |||
for k, v in spairs(fvals) do | |||
if (string.find(k, 'useful')) then | |||
pvals1[k .. '_passive1'] = v * passive1[1] | |||
end | |||
end | end | ||
-- Combine both passives. | |||
if inArgs('passive2') then | |||
for k, v in spairs(pvals1) do | |||
pvals12[k .. '_passive2'] = v * passive2[1] | |||
end | |||
end | end | ||
end | end | ||
-- Merge all tables into one. | |||
tableMerge(fvals, tvals) | |||
tableMerge(fvals, pvals1) | |||
tableMerge(fvals, pvals2) | |||
tableMerge(fvals, pvals12) | |||
return fvals | |||
end | end | ||
local fvals = list() | |||
-- Get the actual variables with MW syntax. | -- Get the actual variables with MW syntax. | ||
for k,v in spairs(fvals) do | for k, v in spairs(fvals) do | ||
table.insert(vars, var(k, v)) | table.insert(vars, var(k, v)) | ||
end | end | ||
Line 171: | Line 181: | ||
-- Dump all values. | -- Dump all values. | ||
local ret = {} | local ret = {} | ||
for k,v in spairs(fvals) do | for k, v in spairs(fvals) do | ||
table.insert(ret, k..': '..v) | table.insert(ret, k .. ': ' .. v) | ||
end | end | ||
Line 182: | Line 192: | ||
-- Parse all variables | -- Parse all variables | ||
-- return frame:preprocess(table.concat(vars)) | -- return frame:preprocess(table.concat(vars)) | ||
end | end | ||
return p | return p |
Revision as of 22:32, 2 April 2022
Documentation for this module may be created at Module:Damage/doc
require('Module:CommonFunctions')
local getArgs = require('Module:Arguments').getArgs
local p = {}
function string.starts(String, Start)
return string.sub(String, 1, string.len(Start)) == Start
end
-- Function wrapper for vardefine syntax in MW.
function var(name, dmg)
return '{{#vardefine:{{formatnum:' .. name .. '|' .. round(dmg) .. '}}%}}'
end
-- Main process
function p.main(frame)
local args = getArgs(frame)
function inArgs(key)
if args[key] ~= nil then
return true
end
end
function inArgsStarts(key)
for k, v in spairs(args) do
if string.starts(k, key) then
return true
end
end
end
-- Handle trait table
local traits, vars = {}
if (inArgs('heavy')) then
traits.heavy = 1.44
end
if (inArgs('enhanced')) then
traits.enhanced = 0.8
end
-- Customizable for empowered, it had to be special lol.
if (inArgs('empowered')) then
if (args.empowered == 'true') then
traits.empowered = 1.2
else
traits.empowered = args.empowered
end
end
function list(mode)
-- Define tables that hold the subsequent damage values.
-- I know this isn't the best, but I don't want to work with nested tables in this language.
local fvals, tvals, pvals1, pvals2, pvals12 = {}
-- Check the specified mode and define the prefixes/suffixes first.
local pr, su, pvp = ''
if (mode == 'pvp') then
pr = 'pvp_'
su = '_pvp'
pvp = 'pvp'
end
-- Define total/average damage calculation based on damage per hit and hit amount.
function getTotal(dmg, hits, fval)
local i = 1
fvals[fval] = 0
for k, v in spairs(args) do
if string.starts(k, pr .. 'dmg') then
-- Proceed to combine
fvals[fval] = fvals[fval] + args[dmg .. i] * args[hits .. i]
i = i + 1
end
end
-- Apply Useful modifier.
if string.find(fval, 'useful') then
fvals[fval] = fvals[fval] * args.useful_penalty
end
end
-- Actually generate the values depending on arguments provided.
getTotal(pr .. 'dmg', 'hits', 'total_damage' .. su)
if inArgsStarts('avg_hits') then
getTotal(pr .. 'dmg', 'avg_hits', 'average_damage' .. su)
end
if inArgsStarts('awk_dmg') then
getTotal(pr .. 'awk_dmg', 'awk_hits', 'total_damage_awk' .. su)
end
if inArgsStarts('avg_awk_hits') then
getTotal(pr .. 'awk_dmg', 'avg_awk_hits', 'average_damage_awk' .. su)
end
-- Handling traits
-- Useful handled separately
if inArgs('useful_penalty') then
getTotal(pr .. 'dmg', 'hits_useful', 'total_damage_useful' .. su)
if (inArgsStarts('avg_hits_useful')) then
getTotal(pr .. 'dmg', 'avg_hits_useful', 'average_damage_useful' .. su)
end
end
-- Multiply all values with traits and store them in another table.
for k, v in spairs(fvals) do
if not string.find(k, 'useful') then
for kt, vt in spairs(traits) do
if inArgs(kt) then
local dmg_name = k .. '_' .. kt
local dmg_formula = v * vt
tvals[dmg_name] = dmg_formula
end
end
end
end
-- Define passives and fill the respective tables.
local passive2 = 0
if inArgs('passive2') then
passive2 = split(args.passive2)
for k, v in spairs(tvals) do
local dmg_name = k .. '_passive2'
local dmg_formula = v * passive2[1]
pvals2[dmg_name] = dmg_formula
end
-- Useful separately.
for k, v in spairs(fvals) do
if (string.find(k, 'useful')) then
pvals2[k .. '_passive2'] = v * passive2[1]
end
end
end
local passive1 = 0
if inArgs('passive1') then
passive1 = split(args.passive1)
for k, v in spairs(tvals) do
local dmg_name = k .. '_passive1'
local dmg_formula = v * passive1[1]
pvals1[dmg_name] = dmg_formula
end
-- Useful separately
for k, v in spairs(fvals) do
if (string.find(k, 'useful')) then
pvals1[k .. '_passive1'] = v * passive1[1]
end
end
-- Combine both passives.
if inArgs('passive2') then
for k, v in spairs(pvals1) do
pvals12[k .. '_passive2'] = v * passive2[1]
end
end
end
-- Merge all tables into one.
tableMerge(fvals, tvals)
tableMerge(fvals, pvals1)
tableMerge(fvals, pvals2)
tableMerge(fvals, pvals12)
return fvals
end
local fvals = list()
-- Get the actual variables with MW syntax.
for k, v in spairs(fvals) do
table.insert(vars, var(k, v))
end
-- Dump all values.
local ret = {}
for k, v in spairs(fvals) do
table.insert(ret, k .. ': ' .. v)
end
return frame:preprocess(table.concat(ret, "<br/>"))
-- Dump all variables
-- return table.concat(vars)
-- Parse all variables
-- return frame:preprocess(table.concat(vars))
end
return p