| Latest revision |
Your text |
| Line 56: |
Line 56: |
| end | | end |
| return total | | return total |
| end
| |
|
| |
| -- Sums the barrier value and Spirit scaling contributed by a single record
| |
| -- layer (the base ability record, or one upgrade tier). Returns nil when the
| |
| -- layer grants no barrier at all; a tier that only raises the scaling still
| |
| -- counts, so "+0 value, +1.0 scaling" upgrades are not lost.
| |
| local function sum_barrier(layer, fields)
| |
| local value, scale, found = 0, 0, false
| |
| for _, field in ipairs(fields) do
| |
| local entry = layer[field]
| |
| if entry ~= nil then
| |
| local v = unwrap_value(entry) or 0
| |
| local s = 0
| |
| if type(entry) == "table" and type(entry["Scale"]) == "table" then
| |
| s = entry["Scale"]["Value"] or 0
| |
| end
| |
| if v ~= 0 or s ~= 0 then found = true end
| |
| value = value + v
| |
| scale = scale + s
| |
| end
| |
| end
| |
| if not found then return nil end
| |
| return value, scale
| |
| end
| |
|
| |
| -- Pads a whole-number scaling out to one decimal, so a running total of 2
| |
| -- reads "2.0" next to its "1.5" neighbours instead of "2". Values that already
| |
| -- carry decimals are left alone, which keeps precision on things like 0.75.
| |
| local function format_scale(scale)
| |
| local text = tostring(scale)
| |
| if not text:find(".", 1, true) then text = text .. ".0" end
| |
| return text
| |
| end
| |
|
| |
| -- Formats one barrier step. Spirit scaling goes through the compact {{Ss}}
| |
| -- form, expanded via the frame the surrounding #invoke is already running
| |
| -- under: module return values are not re-expanded, so a literal "{{Ss|0.8}}"
| |
| -- would reach the page as text. The plain fallback covers a nil frame
| |
| -- (module console).
| |
| local function format_barrier(value, scale)
| |
| local out = tostring(value)
| |
| if scale and scale ~= 0 then
| |
| local scale_text = format_scale(scale)
| |
| local frame = mw.getCurrentFrame()
| |
| if frame then
| |
| out = out .. " " .. frame:expandTemplate{
| |
| title = "Ss",
| |
| args = { scale_text, compact = "1", show_value = "1" },
| |
| }
| |
| else
| |
| out = out .. " ×" .. scale_text
| |
| end
| |
| end
| |
| return out
| |
| end | | end |
|
| |
|
| Line 168: |
Line 114: |
|
| |
|
| local p = {} | | local p = {} |
|
| |
| -- Renders the barrier an ability grants, with its Spirit Power scaling.
| |
| -- Both the value and the scaling accumulate across upgrades, so every step
| |
| -- after the first shows the running total: "100 x0.8 → 180 x1.5 (T2)".
| |
| -- A tier that only improves the scaling still gets its own segment.
| |
| function p.RenderBarrier(ability)
| |
| local fields = Lists.lists["barrier"]
| |
| local segments = {}
| |
|
| |
| local value, scale = sum_barrier(ability, fields)
| |
| if value then
| |
| table.insert(segments, format_barrier(value, scale))
| |
| else
| |
| value, scale = 0, 0
| |
| end
| |
|
| |
| local upgrades = ability["Upgrades"]
| |
| if type(upgrades) == "table" then
| |
| for i, tier in ipairs(upgrades) do
| |
| if type(tier) == "table" then
| |
| local delta_value, delta_scale = sum_barrier(tier, fields)
| |
| if delta_value then
| |
| value, scale = value + delta_value, scale + delta_scale
| |
| table.insert(segments,
| |
| format_barrier(value, scale) .. " (T" .. i .. ")")
| |
| end
| |
| end
| |
| end
| |
| end
| |
|
| |
| if #segments == 0 then return {} end
| |
| return { ["Barrier"] = table.concat(segments, " → ") }
| |
| end
| |
|
| |
|
| -- Renders charge count and time between charges. | | -- Renders charge count and time between charges. |
| Line 399: |
Line 312: |
| end | | end |
| end | | end |
| end
| |
|
| |
| return cells
| |
| end
| |
|
| |
| -- Renders Spirit Power scaling.
| |
| -- Shows the Scale.Value for abilities whose Scale.Type is "spirit".
| |
| function p.RenderSpiritScaling(ability)
| |
| local base_scale = nil
| |
| local base_prop = nil
| |
|
| |
| -- Find base Spirit scaling
| |
| for k, v in pairs(ability) do
| |
| if k ~= "Upgrades" and type(v) == "table" then
| |
| local scale = v["Scale"]
| |
| if type(scale) == "table"
| |
| and scale["Type"] == "spirit"
| |
| and type(scale["Value"]) == "number"
| |
| and scale["Value"] ~= 0 then
| |
| base_scale = scale["Value"]
| |
| base_prop = k
| |
| break
| |
| end
| |
| end
| |
| end
| |
|
| |
| local cells = {}
| |
|
| |
| if base_scale then
| |
| cells["Spirit Scaling"] = "×" .. base_scale
| |
| end
| |
|
| |
| local upgrades = ability["Upgrades"]
| |
| if type(upgrades) ~= "table" then return cells end
| |
|
| |
| local notes = {}
| |
|
| |
| for i, tier in ipairs(upgrades) do
| |
| if type(tier) == "table" then
| |
| local upgrade_scale = nil
| |
|
| |
| for k, v in pairs(tier) do
| |
| if type(v) == "table" then
| |
| local scale = v["Scale"]
| |
| if type(scale) == "table"
| |
| and scale["Type"] == "spirit"
| |
| and type(scale["Value"]) == "number"
| |
| and scale["Value"] ~= 0 then
| |
| upgrade_scale = scale["Value"]
| |
| break
| |
| end
| |
| end
| |
| end
| |
|
| |
| if upgrade_scale then
| |
| table.insert(notes,
| |
| "on T" .. i .. " gets +×" .. upgrade_scale .. " Spirit scaling")
| |
| end
| |
| end
| |
| end
| |
|
| |
| if #notes > 0 then
| |
| cells["Notes"] = table.concat(notes, ". ")
| |
| end | | end |
|
| |
|