Zum Inhalt springen

Modul:Firestone/Hero: Unterschied zwischen den Versionen

Aus Firestone Idle Rpg Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 5: Zeile 5:
local H = {}
local H = {}


-- alle Heldentabellen zusammenziehen
-- nur die eigentlichen Helden laden
local HEROES = Util.mergeSources{
local HEROES = Util.loadTable('Modul:Firestone/Data/Heroes')
    'Modul:Firestone/Data/Heroes',
    'Modul:Firestone/Data/Guardians',
    'Modul:Firestone/Data/WM',
}


-- I18n holen
-- I18n holen
Zeile 23: Zeile 19:
end
end


-- ========= FIX: Skins aus mw.loadData sauber einsammeln =========
-- Skins in eine saubere Liste bringen
-- erlaubt sowohl { "Wild", "Cheerleader" }
-- als auch { [1] = "Wild", [2] = "Cheerleader" }
-- und auch { wild = "Wild" } usw.
local function normalizeSkins(skins)
local function normalizeSkins(skins)
     local list = {}
     local list = {}
Zeile 33: Zeile 26:
     end
     end


     -- numerische Keys erstmal getrennt sammeln (weil #skins bei loadData oft 0 ist)
     -- numerische zuerst einsammeln (loadData macht da gern komische Dinge)
     local numeric = {}
     local numeric = {}
     for k, v in pairs(skins) do
     for k, v in pairs(skins) do
Zeile 39: Zeile 32:
             numeric[k] = v
             numeric[k] = v
         else
         else
            -- z.B. skins = { wild = "Wild" }
             list[#list+1] = v
             list[#list+1] = v
         end
         end
     end
     end


    -- numerische Keys sortieren, damit 1,2,3 in richtiger Reihenfolge kommen
     local idx = {}
     local idx = {}
     for k in pairs(numeric) do
     for k in pairs(numeric) do
Zeile 50: Zeile 41:
     end
     end
     table.sort(idx)
     table.sort(idx)
     for _, k in ipairs(idx) do
     for _, k in ipairs(idx) do
         list[#list+1] = numeric[k]
         list[#list+1] = numeric[k]
Zeile 60: Zeile 50:
-- ========================================================================
-- ========================================================================
-- Avatar/Skins: {{Firestone|hero|Talia|avatar}}
-- Avatar/Skins: {{Firestone|hero|Talia|avatar}}
-- default:  Talia.png
-- extra:    Talia_Wild.png, Talia_Cheerleader.png ...
-- Labels:    aus i18.ui.skins
-- ========================================================================
-- ========================================================================
local function buildAvatarMarkup(hero, realKey, i18)
local function buildAvatarMarkup(hero, realKey, i18)
     local frame = mw.getCurrentFrame()
     local frame     = mw.getCurrentFrame()
 
     local skinLabels = ((i18.ui or {}).skins) or {}
     local skinLabels = ((i18.ui or {}).skins) or {}
     local skins      = normalizeSkins(hero.skins)
     local skins      = normalizeSkins(hero.skins)


     -- FALL: keine Skins → nur Standardbild
     -- keine Skins → nur Standardbild
     if #skins == 0 then
     if #skins == 0 then
         return string.format(
         return string.format(
Zeile 79: Zeile 65:
     end
     end


     -- wir müssen Tabber über extensionTag ausgeben,
     -- Tabber bauen
    -- sonst zeigt er nur den Wikitext an
     local panels = {}
     local panels = {}


     -- 1) Default-Tab = Heldenname
     -- Standard (Name des Helden)
     local heroDisplayName = hero.name or realKey
     local heroDisplayName = hero.name or realKey
     panels[#panels+1] =
     panels[#panels+1] =
Zeile 89: Zeile 74:
         string.format("[[Datei:%s.png|210px|class=avatar-img|link=%s]]", realKey, realKey)
         string.format("[[Datei:%s.png|210px|class=avatar-img|link=%s]]", realKey, realKey)


     -- 2) alle Skins
     -- weitere Skins
     for _, id in ipairs(skins) do
     for _, id in ipairs(skins) do
         local idNorm  = Util.norm(id)
         local idNorm  = Util.norm(id)
Zeile 100: Zeile 85:
     end
     end


    -- jetzt mit extensionTag wrappen
     local content = table.concat(panels, "\n|-|\n")
     local content = table.concat(panels, "\n|-|\n")
     return frame:extensionTag('tabber', content)
     return frame:extensionTag('tabber', content)
Zeile 107: Zeile 91:
-- UI-Zweig: {{Firestone|hero|ui|basics|class}}
-- UI-Zweig: {{Firestone|hero|ui|basics|class}}
function H.ui(frame, args)
function H.ui(frame, args)
     local i18 = getI18n()
     local i18   = getI18n()
     local uiRoot = (i18.ui) or {}
     local uiRoot = i18.ui or {}


     local path = {}
     local path = {}
Zeile 120: Zeile 104:
     end
     end
     return ''
     return ''
end
-- Liste/Tabber aller Helden: {{Firestone|hero|list}}
function H.list(frame, args)
    -- Icon-Größe optional aus dem Aufruf
    local iconSize = args.icon_size or args.size or "32"
    -- Namen einsammeln
    local names = {}
    for name, _ in pairs(HEROES) do
        names[#names+1] = name
    end
    table.sort(names)
    local out = {}
    out[#out+1] = "<tabber>"
    for i, name in ipairs(names) do
        -- deine Vorlage:Card/Hero aufrufen
        local card = frame:expandTemplate{
            title = 'Vorlage:Card/Hero',
            args  = {
                name,                -- = {{{1}}}
                icon_size = iconSize, -- = {{{icon_size}}} in der Vorlage
            },
        }
        out[#out+1] = string.format("%s=\n%s", name, card)
        if i < #names then
            out[#out+1] = "|-|"
        end
    end
    out[#out+1] = "</tabber>"
    return table.concat(out, "\n")
end
end


Zeile 129: Zeile 149:
     end
     end


    -- nur in den Heroes nachgucken
     local realKey = Util.pickKey(HEROES, name)
     local realKey = Util.pickKey(HEROES, name)
     if not realKey then
     if not realKey then
Zeile 172: Zeile 193:
         return ""
         return ""
     end
     end
     return tostring(v)
     return tostring(v)
end
end


return H
return H

Version vom 12. November 2025, 08:27 Uhr

Die Dokumentation für dieses Modul kann unter Modul:Firestone/Hero/Doku erstellt werden

-- Modul:Firestone/Hero
local Util = require('Modul:Firestone/Util')
local I18n = require('Modul:Firestone/I18n')

local H = {}

-- nur die eigentlichen Helden laden
local HEROES = Util.loadTable('Modul:Firestone/Data/Heroes')

-- I18n holen
local function getI18n()
    if type(I18n) == "table" and type(I18n.get) == "function" then
        local ok, data = pcall(I18n.get)
        if ok and type(data) == "table" then
            return data
        end
    end
    return I18n or {}
end

-- Skins in eine saubere Liste bringen
local function normalizeSkins(skins)
    local list = {}
    if type(skins) ~= "table" then
        return list
    end

    -- numerische zuerst einsammeln (loadData macht da gern komische Dinge)
    local numeric = {}
    for k, v in pairs(skins) do
        if type(k) == "number" then
            numeric[k] = v
        else
            list[#list+1] = v
        end
    end

    local idx = {}
    for k in pairs(numeric) do
        idx[#idx+1] = k
    end
    table.sort(idx)
    for _, k in ipairs(idx) do
        list[#list+1] = numeric[k]
    end

    return list
end

-- ========================================================================
-- Avatar/Skins: {{Firestone|hero|Talia|avatar}}
-- ========================================================================
local function buildAvatarMarkup(hero, realKey, i18)
    local frame      = mw.getCurrentFrame()
    local skinLabels = ((i18.ui or {}).skins) or {}
    local skins      = normalizeSkins(hero.skins)

    -- keine Skins → nur Standardbild
    if #skins == 0 then
        return string.format(
            "[[Datei:%s.png|210px|class=avatar-img|link=%s]]",
            realKey,
            realKey
        )
    end

    -- Tabber bauen
    local panels = {}

    -- Standard (Name des Helden)
    local heroDisplayName = hero.name or realKey
    panels[#panels+1] =
        heroDisplayName .. "=\n" ..
        string.format("[[Datei:%s.png|210px|class=avatar-img|link=%s]]", realKey, realKey)

    -- weitere Skins
    for _, id in ipairs(skins) do
        local idNorm   = Util.norm(id)
        local label    = skinLabels[idNorm] or id
        local filename = string.format("%s_%s.png", realKey, id)

        panels[#panels+1] =
            label .. "=\n" ..
            string.format("[[Datei:%s|210px|class=avatar-img|link=%s]]", filename, realKey)
    end

    local content = table.concat(panels, "\n|-|\n")
    return frame:extensionTag('tabber', content)
end

-- UI-Zweig: {{Firestone|hero|ui|basics|class}}
function H.ui(frame, args)
    local i18    = getI18n()
    local uiRoot = i18.ui or {}

    local path = {}
    for i = 3, #args do
        path[#path+1] = args[i]
    end

    local val = Util.deepGet(uiRoot, path)
    if type(val) == 'string' then
        return mw.text.trim(val)
    end
    return ''
end

-- Liste/Tabber aller Helden: {{Firestone|hero|list}}
function H.list(frame, args)
    -- Icon-Größe optional aus dem Aufruf
    local iconSize = args.icon_size or args.size or "32"

    -- Namen einsammeln
    local names = {}
    for name, _ in pairs(HEROES) do
        names[#names+1] = name
    end
    table.sort(names)

    local out = {}
    out[#out+1] = "<tabber>"

    for i, name in ipairs(names) do
        -- deine Vorlage:Card/Hero aufrufen
        local card = frame:expandTemplate{
            title = 'Vorlage:Card/Hero',
            args  = {
                name,                 -- = {{{1}}}
                icon_size = iconSize, -- = {{{icon_size}}} in der Vorlage
            },
        }

        out[#out+1] = string.format("%s=\n%s", name, card)

        if i < #names then
            out[#out+1] = "|-|"
        end
    end

    out[#out+1] = "</tabber>"
    return table.concat(out, "\n")
end

-- normaler Held: {{Firestone|hero|Talia|...}}
function H.handle(frame, args)
    local name = args[2]
    if Util.isEmpty(name) then
        return ""
    end

    -- nur in den Heroes nachgucken
    local realKey = Util.pickKey(HEROES, name)
    if not realKey then
        return name
    end

    local hero = HEROES[realKey]
    local i18  = getI18n()

    -- nur {{Firestone|hero|Talia}} → Key
    if Util.isEmpty(args[3]) then
        return realKey
    end

    -- Avatar?
    if Util.norm(args[3]) == "avatar" then
        return buildAvatarMarkup(hero, realKey, i18)
    end

    -- restlicher Pfad
    local path, i = {}, 3
    while args[i] do
        path[#path+1] = args[i]
        i = i + 1
    end

    local v     = Util.deepGet(hero, path)
    local last  = path[#path] and tostring(path[#path]) or ""
    local nlast = Util.norm(last)

    if nlast == "unlock_at" then
        return Util.heroUnlockText(v, i18)
    elseif nlast == "awakening_id" then
        return Util.heroAwakeningText(v, i18)
    end

    if v == nil and nlast == "name" then
        return realKey
    end

    v = Util.autotrFrom(i18, last, v)
    if v == nil then
        return ""
    end

    return tostring(v)
end

return H