Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Join the Playtest on Steam Now: SpiritVale

Module:GameInfo/Skills: Difference between revisions

From SpiritVale Wiki
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 keywords  = _safe_tbl(tabs_obj.keywords)
local effects  = _safe_tbl(tabs_obj.effects)
local effects  = _safe_tbl(tabs_obj.effects)
local events    = _safe_tbl(tabs_obj.events)


-- 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 events_cards  = _safe_tbl(events.cards)


local effects_count = _to_int(effects.count, #effects_cards)
-- Soft fallback support to avoid regressions during rollout
local events_count  = _to_int(events.count, #events_cards)
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 = "keywords",  title = "Keywords"  },
{ key = "effects",  title = "Effects (" .. tostring(effects_count) .. ")" },
{ key = "effects",  title = "Effects (" .. tostring(effects_count) .. ")" },
{ key = "events",    title = "Events (" .. tostring(events_count) .. ")" },
}
}


Line 1,209: Line 1,236:
end
end


do
local function render_ref_icon(parent, icon)
local panel = panels:tag("div")
icon = _safe_tbl(icon)
:addClass("sv-tabpanel")
local page = _safe_str(icon.page, "")
:attr("role", "tabpanel")
local alt = _safe_str(icon.alt, "")
:attr("data-panel", "mechanics")
if page ~= "" then
 
parent:node(_render_file_image(page, alt, 52))
local gridwrap = panel:tag("div"):addClass("sv-kw-grid")
else
for _, item in ipairs(_safe_tbl(mechanics.grid)) do
parent:node(_question_badge())
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
end
end


do
local function render_effect_stats(parent, stats, kind)
local panel = panels:tag("div")
stats = _safe_tbl(stats)
:addClass("sv-tabpanel")
kind = _safe_str(kind, ""):lower()
:attr("role", "tabpanel")
 
:attr("data-panel", "keywords")
if kind == "event" then
:attr("hidden", "hidden")
local sub = parent:tag("div"):addClass("sv-ref-sub")


local pills = panel:tag("div"):addClass("sv-tab-pills")
if stats.text ~= nil then
for _, kw in ipairs(_safe_tbl(keywords.pills)) do
_apply_value(sub, stats, level)
local wt = _render_keyword_pill(frame, kw)
else
if wt then
_apply_value(sub, { text = "" }, level)
pills:tag("span"):addClass("sv-pill"):wikitext(wt)
end
end
return
end
end
end


local function render_ref_icon(parent, icon)
if next(stats) ~= nil then
icon = _safe_tbl(icon)
local srow = parent:tag("div"):addClass("sv-ref-stats")
local page = _safe_str(icon.page, "")
 
local alt = _safe_str(icon.alt, "")
local d = srow:tag("span"):addClass("sv-ref-stat")
if page ~= "" then parent:node(_render_file_image(page, alt, 52)) else parent:node(_question_badge()) end
_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, is_event)
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


if is_event then
render_effect_stats(text, card.stats, kind)
local sub = text:tag("div"):addClass("sv-ref-sub")
_apply_value(sub, card.type, level)
return
end
 
local stats = card.stats
if type(stats) == "table" and next(stats) ~= nil then
local srow = text: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


Line 1,288: Line 1,308:
:addClass("sv-tabpanel")
:addClass("sv-tabpanel")
:attr("role", "tabpanel")
:attr("role", "tabpanel")
:attr("data-panel", "effects")
:attr("data-panel", "mechanics")
:attr("hidden", "hidden")
 
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


local grid = panel:tag("div"):addClass("sv-ref-grid")
if #mechanics_mods == 0 and #mechanics_keywords == 0 then
for _, card in ipairs(effects_cards) do
panel:tag("div"):addClass("sv-tab-empty"):wikitext("—")
render_ref_card(grid, card, false)
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", "events")
:attr("data-panel", "effects")
:attr("hidden", "hidden")
:attr("hidden", "hidden")


local grid = panel:tag("div"):addClass("sv-ref-grid")
if #effects_cards > 0 then
for _, card in ipairs(events_cards) do
local grid = panel:tag("div"):addClass("sv-ref-grid")
render_ref_card(grid, card, true)
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