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 28: | Line 28: | ||
local dict_module = require('Module:Dictionary') | local dict_module = require('Module:Dictionary') | ||
local hero_module = require('Module:HeroData') | local hero_module = require('Module:HeroData') | ||
local get_stat, has_stat, has_override_or_stat, stat_number | |||
local get_stat | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
| Line 190: | Line 184: | ||
link = 'Health Regen', | link = 'Health Regen', | ||
icon = 'Health regen.png', | icon = 'Health regen.png', | ||
sig_figs = | sig_figs = 2, | ||
}, | }, | ||
{ | { | ||
| Line 320: | Line 314: | ||
-- The "Information" block. Manual input only; hidden entirely when all are empty. | -- The "Information" block. Manual input only; hidden entirely when all are empty. | ||
local INFO_ROWS = { | local INFO_ROWS = { | ||
{ param = 'release_date', label_dict = 'ReleaseDate', link = 'Heroes by release' }, | |||
{ param = 'pronouns', label_dict = 'Pronouns' }, | { param = 'pronouns', label_dict = 'Pronouns' }, | ||
{ param = 'voice_actor', label_dict = 'VoiceActor | { param = 'voice_actor', label_dict = 'VoiceActor' }, | ||
{ param = 'codenames', label_dict = 'Codenames', tooltip = 'Codenames used for this hero in the game files' }, | { param = 'codenames', label_dict = 'Codenames', tooltip = 'Codenames used for this hero in the game files' }, | ||
} | } | ||
| Line 328: | Line 322: | ||
-- 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 441: | Line 431: | ||
return 'Heroes with medium dash speed' | return 'Heroes with medium dash speed' | ||
end, | end, | ||
}, | }, | ||
} | } | ||
| Line 451: | Line 437: | ||
-- 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 542: | ||
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 679: | ||
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 699: | ||
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 715: | ||
-- 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 740: | ||
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] | ||