Zum Inhalt springen

Modul:Firestone/Hero: Unterschied zwischen den Versionen

Aus Firestone Idle Rpg Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 4: Zeile 4:


local H = {}
local H = {}
-- eigene Loader-Funktion, die beide Schreibweisen probiert
local function loadHeroData()
    -- 1. kanonisch (englisch)
    local ok1, data1 = pcall(mw.loadData, 'Module:Firestone/Data/Heroes')
    if ok1 and type(data1) == 'table' and next(data1) ~= nil then
        return data1
    end


    -- 2. lokalisiert (deutsch)
-- immer über dein Util laden, weil das bei dir funktioniert
     local ok2, data2 = pcall(mw.loadData, 'Modul:Firestone/Data/Heroes')
local function getHeroes()
     if ok2 and type(data2) == 'table' and next(data2) ~= nil then
    -- zuerst die deutsche Schreibweise
         return data2
     local heroes = Util.loadTable('Modul:Firestone/Data/Heroes')
     if type(heroes) == 'table' and next(heroes) then
         return heroes
     end
     end


     -- 3. Fallback über dein Util (das ja bei den Karten funktioniert)
     -- dann englisch, falls dein Wiki doch "Module:" intern nutzt
     local data3 = Util.loadTable('Modul:Firestone/Data/Heroes')
     heroes = Util.loadTable('Module:Firestone/Data/Heroes')
     if type(data3) == 'table' and next(data3) ~= nil then
     if type(heroes) == 'table' and next(heroes) then
         return data3
         return heroes
     end
     end


     -- alles leer → nil zurück
     -- sonst leere Tabelle
     return nil
     return {}
end
end


-- Seite, auf der die Helden liegen
-- I18n holen
local HEROES = loadHeroData() or {}
 
-- I18n holen (wie bei dir)
local function getI18n()
local function getI18n()
     if type(I18n) == "table" and type(I18n.get) == "function" then
     if type(I18n) == "table" and type(I18n.get) == "function" then
Zeile 42: Zeile 34:
end
end


-- Skins normalisieren (dein Code)
-- Skins normalisieren
local function normalizeSkins(skins)
local function normalizeSkins(skins)
     local list = {}
     local list = {}
Zeile 48: Zeile 40:
         return list
         return list
     end
     end
     local numeric = {}
     local numeric = {}
     for k,v in pairs(skins) do
     for k, v in pairs(skins) do
         if type(k) == "number" then
         if type(k) == "number" then
             numeric[k] = v
             numeric[k] = v
Zeile 56: Zeile 49:
         end
         end
     end
     end
     local idx = {}
     local idx = {}
     for k in pairs(numeric) do
     for k in pairs(numeric) do
Zeile 61: Zeile 55:
     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]
     end
     end
     return list
     return list
end
end


-- Avatar bauen (dein Tabber-Weg)
-- Avatar bauen
local function buildAvatarMarkup(hero, realKey, i18)
local function buildAvatarMarkup(hero, realKey, i18)
     local frame      = mw.getCurrentFrame()
     local frame      = mw.getCurrentFrame()
Zeile 87: Zeile 82:
         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)


     for _,id in ipairs(skins) do
     for _, id in ipairs(skins) do
         local idNorm  = Util.norm(id)
         local idNorm  = Util.norm(id)
         local label    = skinLabels[idNorm] or id
         local label    = skinLabels[idNorm] or id
         local filename = string.format("%s_%s.png", realKey, id)
         local filename = string.format("%s_%s.png", realKey, id)
         panels[#panels+1] =
         panels[#panels+1] =
             label .. "=\n" ..
             label .. "=\n" ..
Zeile 100: Zeile 96:
end
end


-- UI: {{Firestone|hero|ui|...}}
-- UI-Zweig
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 = {}
     for i = 3, #args do
     for i = 3, #args do
         path[#path+1] = args[i]
         path[#path+1] = args[i]
     end
     end
     local val = Util.deepGet(uiRoot, path)
     local val = Util.deepGet(uiRoot, path)
     if type(val) == "string" then
     if type(val) == 'string' then
         return mw.text.trim(val)
         return mw.text.trim(val)
     end
     end
     return ""
     return ''
end
end


-- LISTE: {{Firestone|hero|list}}
-- LISTE: {{Firestone|hero|list}} oder {{#invoke:Firestone|main|hero|list}}
function H.list(frame, args)
function H.list(frame, args)
     local heroes  = HEROES
     local heroes  = getHeroes()
     local iconSize = args.icon_size or args.size or "32"
     local iconSize = args.icon_size or args.size or "32"


    -- wenn wirklich nichts geladen werden konnte, dann sagen wir das so
     if not next(heroes) then
     if not next(heroes) then
         return "<div class='error'>[Hero.list] mw.loadData() war leer.</div>"
         return "<div class='error'>[Hero.list] keine Helden gefunden – lädt über Util.loadTable('Modul:Firestone/Data/Heroes').</div>"
     end
     end


     -- sortierte Namen
     -- Namen sortieren
     local names = {}
     local names = {}
     for name in pairs(heroes) do
     for name in pairs(heroes) do
Zeile 132: Zeile 131:


     local panels = {}
     local panels = {}
     for _,name in ipairs(names) do
     for i, name in ipairs(names) do
         local ok, card = pcall(function()
         local ok, card = pcall(function()
             return frame:expandTemplate{
             return frame:expandTemplate{
                 title = 'Card/Hero',
                 title = 'Card/Hero',   -- deine Vorlage
                 args  = {
                 args  = {
                     [1]      = name,
                     [1]      = name,
Zeile 142: Zeile 141:
             }
             }
         end)
         end)
         if not ok or not card or card == "" then
         if not ok or not card or card == "" then
             card = "<div class='error'>[Hero.list] Karte für „" .. name .. "“ nicht gefunden.</div>"
             card = "<div class='error'>[Hero.list] Karte für „"..name.."“ nicht gefunden.</div>"
         end
         end
         panels[#panels+1] = name .. "=\n" .. card
         panels[#panels+1] = name .. "=\n" .. card
        if i < #names then
            panels[#panels+1] = "|-|"
        end
     end
     end


     local content = table.concat(panels, "\n|-|\n")
     local content = table.concat(panels, "\n")
     return frame:extensionTag('tabber', content)
     return frame:extensionTag('tabber', content)
end
end
Zeile 154: Zeile 158:
-- normaler Held
-- normaler Held
function H.handle(frame, args)
function H.handle(frame, args)
    local heroes = getHeroes()
     local name = args[2]
     local name = args[2]
     if Util.isEmpty(name) then
     if Util.isEmpty(name) then
Zeile 159: Zeile 165:
     end
     end


    local heroes = HEROES
     local realKey = Util.pickKey(heroes, name)
     local realKey = Util.pickKey(heroes, name)
     if not realKey then
     if not realKey then
Zeile 168: Zeile 173:
     local i18  = getI18n()
     local i18  = getI18n()


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

Version vom 12. November 2025, 14: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 = {}

-- immer über dein Util laden, weil das bei dir funktioniert
local function getHeroes()
    -- zuerst die deutsche Schreibweise
    local heroes = Util.loadTable('Modul:Firestone/Data/Heroes')
    if type(heroes) == 'table' and next(heroes) then
        return heroes
    end

    -- dann englisch, falls dein Wiki doch "Module:" intern nutzt
    heroes = Util.loadTable('Module:Firestone/Data/Heroes')
    if type(heroes) == 'table' and next(heroes) then
        return heroes
    end

    -- sonst leere Tabelle
    return {}
end

-- 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 normalisieren
local function normalizeSkins(skins)
    local list = {}
    if type(skins) ~= "table" then
        return list
    end

    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 bauen
local function buildAvatarMarkup(hero, realKey, i18)
    local frame      = mw.getCurrentFrame()
    local skinLabels = ((i18.ui or {}).skins) or {}
    local skins      = normalizeSkins(hero.skins)

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

    local panels = {}

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

    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
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: {{Firestone|hero|list}} oder {{#invoke:Firestone|main|hero|list}}
function H.list(frame, args)
    local heroes   = getHeroes()
    local iconSize = args.icon_size or args.size or "32"

    -- wenn wirklich nichts geladen werden konnte, dann sagen wir das so
    if not next(heroes) then
        return "<div class='error'>[Hero.list] keine Helden gefunden – lädt über Util.loadTable('Modul:Firestone/Data/Heroes').</div>"
    end

    -- Namen sortieren
    local names = {}
    for name in pairs(heroes) do
        names[#names+1] = name
    end
    table.sort(names)

    local panels = {}
    for i, name in ipairs(names) do
        local ok, card = pcall(function()
            return frame:expandTemplate{
                title = 'Card/Hero',   -- deine Vorlage
                args  = {
                    [1]       = name,
                    icon_size = iconSize,
                },
            }
        end)

        if not ok or not card or card == "" then
            card = "<div class='error'>[Hero.list] Karte für „"..name.."“ nicht gefunden.</div>"
        end

        panels[#panels+1] = name .. "=\n" .. card
        if i < #names then
            panels[#panels+1] = "|-|"
        end
    end

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

-- normaler Held
function H.handle(frame, args)
    local heroes = getHeroes()

    local name = args[2]
    if Util.isEmpty(name) then
        return ""
    end

    local realKey = Util.pickKey(heroes, name)
    if not realKey then
        return name
    end

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

    if Util.isEmpty(args[3]) then
        return realKey
    end

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

    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