Editing Module:InfoboxHeroGive feedback
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
| Latest revision | Your text | ||
| Line 30: | Line 30: | ||
local sb_module = require('Module:StreetBrawlAbilities') | local sb_module = require('Module:StreetBrawlAbilities') | ||
local get_stat, has_stat, has_override_or_stat, stat_number | |||
local get_stat | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| Line 190: | Line 185: | ||
link = 'Health Regen', | link = 'Health Regen', | ||
icon = 'Health regen.png', | icon = 'Health regen.png', | ||
sig_figs = | sig_figs = 2, | ||
}, | }, | ||
{ | { | ||
| Line 328: | Line 323: | ||
-- name: literal, or function(ctx) -> string. when: function(ctx) -> boolean. | -- name: literal, or function(ctx) -> string. when: function(ctx) -> boolean. | ||
local CATEGORIES = { | local CATEGORIES = { | ||
{ name = 'Heroes' }, | |||
{ | { | ||
name = function(ctx) return | name = function(ctx) return ctx.hero_en end, | ||
-- Silver (Transformed) is documented on Silver's page and shares her category. | -- Silver (Transformed) is documented on Silver's page and shares her category. | ||
when = function(ctx) return ctx.hero_en ~= 'Silver (Transformed)' end, | when = function(ctx) return ctx.hero_en ~= 'Silver (Transformed)' end, | ||
}, | }, | ||
{ | { | ||
| Line 451: | Line 442: | ||
-- Data access | -- Data access | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- Stats live at the top level for vitality, and under .Weapon for weapon stats. | |||
get_stat = function(hero, stat) | |||
if hero == nil or stat == nil then return nil end | |||
local value = hero[stat] | |||
if value == nil and hero.Weapon then | |||
value = hero.Weapon[stat] | |||
if value == nil and hero.Weapon.AltFire then | |||
value = hero.Weapon.AltFire[stat] | |||
end | |||
end | |||
return value | |||
end | |||
-- The raw Boon (Level) and Spirit scaling values for a stat, if any. | |||
local function get_scaling(hero, stat) | |||
local out = {} | |||
for _, scaling_type in ipairs({ 'Level', 'Spirit' }) do | |||
local scaling = hero[scaling_type .. 'Scaling'] | |||
local value = scaling and stat and scaling[stat] | |||
if value ~= nil and value ~= 0 then | |||
out[#out + 1] = { type = scaling_type, value = value } | |||
end | |||
end | |||
return out | |||
end | |||
-- True when the hero has a non-zero base value, or any scaling, for a stat. | |||
has_stat = function(hero, stat) | |||
local value = get_stat(hero, stat) | |||
if value ~= nil and value ~= 0 then return true end | |||
return #get_scaling(hero, stat) > 0 | |||
end | |||
has_override_or_stat = function(ctx, param, stat) | has_override_or_stat = function(ctx, param, stat) | ||
| Line 523: | Line 547: | ||
if row.stat and row.scaling ~= false then | if row.stat and row.scaling ~= false then | ||
local parts = {} | local parts = {} | ||
for _, scaling in ipairs( | for _, scaling in ipairs(get_scaling(ctx.hero, row.stat)) do | ||
parts[#parts + 1] = hero_module.write_scalar_str(scaling.value, scaling.type) | parts[#parts + 1] = hero_module.write_scalar_str(scaling.value, scaling.type) | ||
end | end | ||
| Line 660: | Line 684: | ||
local tags = {} | local tags = {} | ||
for i = 1, 3 do | for i = 1, 3 do | ||
local tag = hero_module. | local tag = hero_module.get_hero_tag({ args = { ctx.hero_en, tostring(i) } }) | ||
if tag ~= '' then | if tag and tag ~= '' and not tag:find('Error:', 1, true) then | ||
tags[#tags + 1] = tag | tags[#tags + 1] = tag | ||
end | end | ||
| Line 680: | Line 704: | ||
return '' | return '' | ||
end | end | ||
if get_stat(ctx.hero, 'IsDisabled') ~= false then return '' end | |||
local out = {} | local out = {} | ||
for _, category in ipairs(CATEGORIES) do | for _, category in ipairs(CATEGORIES) do | ||
if category.when == nil or category.when(ctx) then | |||
local name = category.name | local name = category.name | ||
if type(name) == 'function' then name = name(ctx) end | if type(name) == 'function' then name = name(ctx) end | ||
| Line 699: | Line 720: | ||
-- Entry point | -- Entry point | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- |key= accepts a hero_* key or the hero's English name; unknown values fall back | |||
-- to the target dummy, the default character in Sandbox mode. | |||
local function resolve_hero_key(provided) | |||
if provided == nil or provided == '' then return DEFAULT_HERO_KEY end | |||
if hero_data_all[provided] ~= nil then return provided end | |||
local wanted = mw.ustring.lower(provided) | |||
for key, hero in pairs(hero_data_all) do | |||
if hero.Name and mw.ustring.lower(hero.Name) == wanted then return key end | |||
end | |||
return DEFAULT_HERO_KEY | |||
end | |||
function p.render(frame) | function p.render(frame) | ||
| Line 712: | Line 745: | ||
end }) | end }) | ||
local hero_key = resolve_hero_key(args.key) | |||
local hero_key = | |||
local hero = hero_data_all[hero_key] | local hero = hero_data_all[hero_key] | ||