Module:GameInfo/Skills: Difference between revisions
From SpiritVale Wiki
More actions
No edit summary Tags: Mobile edit Mobile web edit |
No edit summary Tags: Mobile edit Mobile web edit |
||
| Line 1,170: | Line 1,170: | ||
local mechanics = _safe_tbl(tabs_obj.mechanics) | local mechanics = _safe_tbl(tabs_obj.mechanics) | ||
local effects = _safe_tbl(tabs_obj.effects) | local effects = _safe_tbl(tabs_obj.effects) | ||
-- New schema | |||
local mechanics_mods = _safe_tbl(mechanics.mods) | |||
local mechanics_keywords = _safe_tbl(mechanics.keywords) | |||
local effects_cards = _safe_tbl(effects.cards) | local effects_cards = _safe_tbl(effects.cards) | ||
local | -- Soft fallback support to avoid regressions during rollout | ||
local | if #mechanics_mods == 0 then | ||
mechanics_mods = _safe_tbl(mechanics.grid) | |||
end | |||
if #mechanics_keywords == 0 then | |||
local old_keywords = _safe_tbl(tabs_obj.keywords) | |||
mechanics_keywords = _safe_tbl(old_keywords.pills) | |||
end | |||
if #effects_cards == 0 then | |||
local old_events = _safe_tbl(tabs_obj.events) | |||
local merged = {} | |||
for _, card in ipairs(_safe_tbl(effects.cards)) do | |||
table.insert(merged, card) | |||
end | |||
for _, card in ipairs(_safe_tbl(old_events.cards)) do | |||
table.insert(merged, card) | |||
end | |||
effects_cards = merged | |||
end | |||
local mechanics_count = _to_int( | |||
mechanics.count, | |||
#mechanics_mods + #mechanics_keywords | |||
) | |||
local effects_count = _to_int( | |||
effects.count, | |||
#effects_cards | |||
) | |||
local tab_specs = { | local tab_specs = { | ||
{ key = "mechanics", title = "Mechanics" | { key = "mechanics", title = "Mechanics (" .. tostring(mechanics_count) .. ")" }, | ||
{ key = "effects", title = "Effects (" .. tostring(effects_count) .. ")" }, | { key = "effects", title = "Effects (" .. tostring(effects_count) .. ")" }, | ||
} | } | ||
| Line 1,209: | Line 1,236: | ||
end | end | ||
local function render_ref_icon(parent, icon) | |||
icon = _safe_tbl(icon) | |||
local page = _safe_str(icon.page, "") | |||
local alt = _safe_str(icon.alt, "") | |||
if page ~= "" then | |||
parent:node(_render_file_image(page, alt, 52)) | |||
local | else | ||
parent:node(_question_badge()) | |||
end | end | ||
end | end | ||
local function render_effect_stats(parent, stats, kind) | |||
stats = _safe_tbl(stats) | |||
kind = _safe_str(kind, ""):lower() | |||
: | if kind == "event" then | ||
local sub = parent:tag("div"):addClass("sv-ref-sub") | |||
if stats.text ~= nil then | |||
_apply_value(sub, stats, level) | |||
else | |||
_apply_value(sub, { text = "—" }, level) | |||
end | end | ||
return | |||
end | end | ||
if next(stats) ~= nil then | |||
local srow = parent:tag("div"):addClass("sv-ref-stats") | |||
local d = srow:tag("span"):addClass("sv-ref-stat") | |||
_apply_value(d, stats.duration, level) | |||
local c = srow:tag("span"):addClass("sv-ref-stat") | |||
_apply_value(c, stats.chance, level) | |||
local st = srow:tag("span"):addClass("sv-ref-stat") | |||
_apply_value(st, stats.stacks, level) | |||
end | |||
end | end | ||
local function render_ref_card(parent, card | local function render_ref_card(parent, card) | ||
card = _safe_tbl(card) | card = _safe_tbl(card) | ||
local kind = _safe_str(card.kind, "") | |||
local title = _safe_str(card.title, "—") | local title = _safe_str(card.title, "—") | ||
local page = _safe_str(card.page, "") | local page = _safe_str(card.page, "") | ||
| Line 1,256: | Line 1,285: | ||
local container = parent:tag("div"):addClass("sv-ref-card") | local container = parent:tag("div"):addClass("sv-ref-card") | ||
if kind ~= "" then | |||
container:addClass("sv-ref-card--" .. _slugify(kind)) | |||
end | |||
local ico = container:tag("div"):addClass("sv-ref-ico") | local ico = container:tag("div"):addClass("sv-ref-ico") | ||
| Line 1,269: | Line 1,301: | ||
end | end | ||
render_effect_stats(text, card.stats, kind) | |||
end | end | ||
| Line 1,288: | Line 1,308: | ||
:addClass("sv-tabpanel") | :addClass("sv-tabpanel") | ||
:attr("role", "tabpanel") | :attr("role", "tabpanel") | ||
:attr("data-panel", " | :attr("data-panel", "mechanics") | ||
: | |||
if #mechanics_mods > 0 then | |||
local section = panel:tag("div"):addClass("sv-tab-section") | |||
section:tag("div"):addClass("sv-tab-section-title"):wikitext("Modifiers") | |||
local gridwrap = section:tag("div"):addClass("sv-kw-grid") | |||
for _, item in ipairs(mechanics_mods) do | |||
item = _safe_tbl(item) | |||
local cell = gridwrap:tag("div"):addClass("sv-kw-cell") | |||
cell:tag("div") | |||
:addClass("sv-kw-label") | |||
:wikitext(mw.text.nowiki(_safe_str(item.label, ""))) | |||
local v = cell:tag("div"):addClass("sv-kw-value") | |||
_apply_value(v, item.value, level) | |||
end | |||
end | |||
if #mechanics_keywords > 0 then | |||
local section = panel:tag("div"):addClass("sv-tab-section") | |||
section:tag("div"):addClass("sv-tab-section-title"):wikitext("Keywords") | |||
local pills = section:tag("div"):addClass("sv-tab-pills") | |||
for _, kw in ipairs(mechanics_keywords) do | |||
local wt = _render_keyword_pill(frame, kw) | |||
if wt then | |||
pills:tag("span"):addClass("sv-pill"):wikitext(wt) | |||
end | |||
end | |||
end | |||
if #mechanics_mods == 0 and #mechanics_keywords == 0 then | |||
panel:tag("div"):addClass("sv-tab-empty"):wikitext("—") | |||
end | end | ||
end | end | ||
| Line 1,301: | Line 1,350: | ||
:addClass("sv-tabpanel") | :addClass("sv-tabpanel") | ||
:attr("role", "tabpanel") | :attr("role", "tabpanel") | ||
:attr("data-panel", " | :attr("data-panel", "effects") | ||
:attr("hidden", "hidden") | :attr("hidden", "hidden") | ||
local grid = panel:tag("div"):addClass("sv-ref-grid") | if #effects_cards > 0 then | ||
local grid = panel:tag("div"):addClass("sv-ref-grid") | |||
for _, card in ipairs(effects_cards) do | |||
render_ref_card(grid, card) | |||
end | |||
else | |||
panel:tag("div"):addClass("sv-tab-empty"):wikitext("—") | |||
end | end | ||
end | end | ||