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:GamePassives: Difference between revisions

From SpiritVale Wiki
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 45: Line 45:
end
end


-- CHANGED: tag body rows so we can center text without touching the hero row
-- Tag body rows so we can style/center without touching the hero row
local function addRow(tbl, label, value)
local function addRow(tbl, label, value)
     if value == nil or value == "" then
     if value == nil or value == "" then
Line 56: Line 56:
end
end


-- CHANGED: tag section header rows as body rows too (for centering)
-- Tag section header rows as body rows too (for centering)
local function addSectionHeader(tbl, label)
local function addSectionHeader(tbl, label)
     local row = tbl:tag("tr")
     local row = tbl:tag("tr")
Line 94: Line 94:
-- Formatting helpers
-- Formatting helpers
----------------------------------------------------------------------
----------------------------------------------------------------------
local function asUl(items)
    if type(items) ~= "table" or #items == 0 then
        return nil
    end
    return '<ul class="spiritvale-infobox-list"><li>'
        .. table.concat(items, "</li><li>")
        .. "</li></ul>"
end


local function formatBasePer(block)
local function formatBasePer(block)
Line 112: Line 121:
end
end


local function formatPassiveEffects(list)
-- Passive Effects: return rows (label/value), not a single text blob
local function passiveEffectRows(list)
     if type(list) ~= "table" or #list == 0 then
     if type(list) ~= "table" or #list == 0 then
         return nil
         return {}
     end
     end


     local parts = {}
     local rows = {}


     for _, eff in ipairs(list) do
     for _, eff in ipairs(list) do
Line 123: Line 133:
             local t = eff.Type or {}
             local t = eff.Type or {}
             local name = t.Name or eff.ID or "Unknown"
             local name = t.Name or eff.ID or "Unknown"
             local value = eff.Value or {}
             local value = eff.Value or {}
             local detail = {}
             local detail = {}


Line 137: Line 147:
             end
             end


             local seg = name
            -- Optional qualifiers (weapon/stance/etc.), if present in data
             if #detail > 0 then
             local qual = eff.Weapon or eff["Weapon"] or eff["Weapon Type"]
                 seg = seg .. " – " .. table.concat(detail, ", ")
                      or eff.Stance or eff["Stance"] or eff["Stance Type"]
             if type(qual) == "string" and qual ~= "" then
                 table.insert(detail, qual)
             end
             end


             table.insert(parts, seg)
            local right = (#detail > 0) and table.concat(detail, ", ") or "—"
             table.insert(rows, { label = name, value = right })
         end
         end
     end
     end


     if #parts == 0 then
     return rows
        return nil
    end
 
    return table.concat(parts, "<br />")
end
end


Line 196: Line 205:
     end
     end


    if #parts == 0 then
     return asUl(parts)
        return nil
    end
 
     return table.concat(parts, "<br />")
end
end


Line 230: Line 235:
     end
     end


    if #parts == 0 then
     return asUl(parts)
        return nil
    end
 
     return table.concat(parts, "<br />")
end
end


Line 247: Line 248:
             local action = ev.Action or "On event"
             local action = ev.Action or "On event"
             local name  = ev["Skill Name"] or ev["Skill ID"] or "Unknown skill"
             local name  = ev["Skill Name"] or ev["Skill ID"] or "Unknown skill"
             local seg    = string.format("%s → %s", action, name)
             table.insert(parts, string.format("%s → %s", action, name))
            table.insert(parts, seg)
         end
         end
     end
     end


    if #parts == 0 then
     return asUl(parts)
        return nil
    end
 
     return table.concat(parts, "<br />")
end
end


Line 286: Line 282:
     collect("Special",  mods["Special Modifiers"])
     collect("Special",  mods["Special Modifiers"])


    if #parts == 0 then
     return asUl(parts)
        return nil
    end
 
     return table.concat(parts, "<br />")
end
end


Line 380: Line 372:
     addSectionHeader(root, "General")
     addSectionHeader(root, "General")


     addRow(root, "Max level", rec["Max Level"] and tostring(rec["Max Level"]))
     addRow(root, "Max Level", rec["Max Level"] and tostring(rec["Max Level"]))


     -- CHANGED: Remove Classes from passives (template usage is on class pages)
     -- Classes intentionally removed (template is used on class pages)
     local users = rec.Users or {}
     local users = rec.Users or {}
    -- addRow(root, "Classes",  listToText(users.Classes)) -- removed
     addRow(root, "Summons",  listToText(users.Summons))
     addRow(root, "Summons",  listToText(users.Summons))
     addRow(root, "Monsters", listToText(users.Monsters))
     addRow(root, "Monsters", listToText(users.Monsters))
Line 410: Line 401:
                 end
                 end
             end
             end
             addRow(root, "Required skills", table.concat(skillParts, ", "))
             addRow(root, "Required Skills", table.concat(skillParts, ", "))
         end
         end


         addRow(root, "Required weapons", listToText(req["Required Weapons"]))
         addRow(root, "Required Weapons", listToText(req["Required Weapons"]))
         addRow(root, "Required stances", listToText(req["Required Stances"]))
         addRow(root, "Required Stances", listToText(req["Required Stances"]))
     end
     end


     ------------------------------------------------------------------
     ------------------------------------------------------------------
     -- Passive effects
     -- Passive Effects (one row per effect)
     ------------------------------------------------------------------
     ------------------------------------------------------------------
     local peText = formatPassiveEffects(rec["Passive Effects"])
     local peRows = passiveEffectRows(rec["Passive Effects"])
     if peText then
     if #peRows > 0 then
         addSectionHeader(root, "Passive effects")
         addSectionHeader(root, "Passive Effects")
         addRow(root, "Effects", peText)
         for _, r in ipairs(peRows) do
            addRow(root, r.label, r.value)
        end
    end
 
    ------------------------------------------------------------------
    -- Status Effects
    ------------------------------------------------------------------
    local statusApps = formatStatusApplications(rec["Status Applications"])
    local statusRem  = formatStatusRemoval(rec["Status Removal"])
    if statusApps or statusRem then
        addSectionHeader(root, "Status Effects")
        addRow(root, "Applies", statusApps)
        addRow(root, "Removes", statusRem)
     end
     end


Line 433: Line 437:
         addSectionHeader(root, "Modifiers")
         addSectionHeader(root, "Modifiers")
         addRow(root, "Flags", modsText)
         addRow(root, "Flags", modsText)
    end
    ------------------------------------------------------------------
    -- Status
    ------------------------------------------------------------------
    local statusApps = formatStatusApplications(rec["Status Applications"])
    local statusRem  = formatStatusRemoval(rec["Status Removal"])
    if statusApps or statusRem then
        addSectionHeader(root, "Status effects")
        addRow(root, "Applies", statusApps)
        addRow(root, "Removes", statusRem)
     end
     end


Line 460: Line 453:
     if type(rec.Notes) == "table" and #rec.Notes > 0 then
     if type(rec.Notes) == "table" and #rec.Notes > 0 then
         addSectionHeader(root, "Notes")
         addSectionHeader(root, "Notes")
         addRow(root, "Notes", table.concat(rec.Notes, "<br />"))
         addRow(root, "Notes", asUl(rec.Notes) or table.concat(rec.Notes, "<br />"))
     end
     end