Mudanças entre as edições de "Módulo:Teste"

De Wiki Gla
Ir para navegação Ir para pesquisar
Etiqueta: Reversão manual
m
 
(29 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
-- Módulo:Blueno — dados do personagem
--[[
local M = {
Module:Guild – Dados dos componentes da base de guild.
    tier = "Ouro",
Uso: {{#invoke:Guild|main|n=Ferreiro}}
    tags = {"DPS", "Lutador", "Fruta do Diabo"},
Predefinição: {{Guild|n=Ferreiro}}
]]


    order = {"Punch", "Shigan", "Tekkai Punch", "Air Door", "Tekkai Rin", "Juji Rankyaku", "Tekkai Sai", "Air Door"},
local p = {}


     skills = {
local function normalize(name)
         ["Punch"] = {
    if not name or name == "" then return nil end
            desc = {
    local s = mw.text.trim(name):lower()
                pt = "Blueno desfere um soco no inimigo.",
    s = mw.ustring.gsub(s, "ó", "o")
                en = "Blueno throws a punch at an enemy.",
    s = mw.ustring.gsub(s, "ã", "a")
                es = "Blueno le da un puñetazo a su enemigo.",
    s = mw.ustring.gsub(s, "á", "a")
                pl = "Blueno wyprowadza cios w przeciwnika."
    s = mw.ustring.gsub(s, " ", "")
             }
    return s
end
 
local map = {
    designer = "Designer",
    cofre = "Cofre",
    salaoprincipal = "Salão Principal",
    salao = "Salão Principal",
    quartos = "Quartos",
    saladeguerra = "Sala de Guerra",
    salaguerra = "Sala de Guerra",
    treinamento = "Treinamento",
    ferreiro = "Ferreiro",
    cozinha = "Cozinha",
}
 
local data = {
     Designer = {
         label = "Designer",
        levels = {
            { image = "Designer_lvl1.png", stats = { "1 pilar de artefato disponível", "27 símbolos disponíveis", "1 plano de fundo disponível", "6 cores disponíveis", "2% de EXP", "4% de sorte", "5% de pontos de aliança" } },
            { image = "Designer_lvl2.png", stats = { "2 pilares de artefato disponíveis", "9 planos de fundo disponíveis", "47 símbolos disponíveis", "12 cores disponíveis", "4% de EXP", "9% de sorte", "12% de pontos de aliança" } },
            { image = "Designer_lvl3.png", stats = { "2 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "72 símbolos disponíveis", "30 cores disponíveis", "6% de EXP", "15% de sorte", "22% de pontos de aliança" } },
            { image = "Designer_lvl4.png", stats = { "3 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "92 símbolos disponíveis", "30 cores disponíveis", "8% de EXP", "22% de sorte", "35% de pontos de aliança" } },
            { image = "Designer_lvl5.png", stats = { "4 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "112 símbolos disponíveis", "30 cores disponíveis", "10% de EXP", "30% de sorte", "50% de pontos de aliança" } },
        },
    },
    Cofre = {
        label = "Cofre",
        levels = {
            { image = "Cofre_lvl1.png", stats = { "10% de bônus pra aliança" } },
            { image = "Cofre_lvl2.png", stats = { "+ 100 espaços extra no cofre", "25% de bônus pra aliança" } },
            { image = "Cofre_lvl3.png", stats = { "+ 200 espaços extra no cofre", "45% de bônus pra aliança" } },
            { image = "Cofre_lvl4.png", stats = { "+ 300 espaços extra no cofre", "75% de bônus pra aliança" } },
            { image = "Cofre_lvl5.png", stats = { "+ 400 espaços extra no cofre", "100% de bônus pra aliança" } },
        },
    },
    ["Salão Principal"] = {
        label = "Salão Principal",
        levels = {
            { image = "SalaoPrincipal_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "SalaoPrincipal_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "SalaoPrincipal_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "SalaoPrincipal_lvl4.png", stats = { "Descrição do nível 4" } },
             { image = "SalaoPrincipal_lvl5.png", stats = { "Descrição do nível 5" } },
         },
         },
 
    },
         ["Shigan"] = {
    Quartos = {
             desc = {
         label = "Quartos",
                pt = "Blueno avança em direção ao seu adversário, desferindo um poderoso Shigan. Se o golpe for usado à distância apropriada, a habilidade pode ser reutilizada para Blueno entrar por uma de suas portas e surgir atrás do inimigo, desferindo um chute adicional.",
        levels = {
                en = "Blueno moves toward his adversary, delivering a powerful Shigan. If the hit is used at the proper distance, the ability can be reused for Blueno to enter one of his doors and emerge behind the enemy to deliver an additional kick.",
             { image = "Quartos_lvl1.png", stats = { "Descrição do nível 1" } },
                es = "Blueno se desplaza hacia su adversario, asestando un poderoso Shigan. Cuando se realiza a la distancia ideal, permite a Blueno reutilizar la habilidad entrando por una de sus puertas y apareciendo detrás del enemigo para asestar una patada poderosa.",
            { image = "Quartos_lvl2.png", stats = { "Descrição do nível 2" } },
                pl = "Blueno rusza w kierunku swojego przeciwnika, uderzając go potężnym Shiganem. Jeżeli cios zostanie użyty na odpowiedniej odległości, umiejętność pozwoli Blueno użyć techniki ponownie, otwierając jedno z jego drzwi za przeciwnikiem, by dodatkowo go kopnąć."
            { image = "Quartos_lvl3.png", stats = { "Descrição do nível 3" } },
            }
            { image = "Quartos_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "Quartos_lvl5.png", stats = { "Descrição do nível 5" } },
         },
         },
 
    },
        ["Tekkai Punch"] = {
    ["Sala de Guerra"] = {
            desc = {
        label = "Sala de Guerra",
                pt = "Blueno levanta o braço e ativa o Tekkai, endurecendo-o. Em seguida, ele golpeia o chão, quebrando o piso à sua frente e reduzindo a velocidade de movimento dos inimigos em {{debuff:60}} por {{sec:3 segundos}}.",
        levels = {
                en = "Blueno raises his arm and activates Tekkai, hardening it. He then strikes the ground, shattering the floor in front of him and reducing enemies' movement speed by {{debuff:60}} for {{sec:3 seconds}}.",
            { image = "SalaDeGuerra_lvl1.png", stats = { "Descrição do nível 1" } },
                es = "Blueno alza su brazo y activa el Tekkai, endureciéndolo. Luego golpea el suelo, destrozando el terreno delante de él y reduciendo la velocidad de movimiento de los enemigos en {{debuff:60}} durante {{sec:3 segundos}}.",
            { image = "SalaDeGuerra_lvl2.png", stats = { "Descrição do nível 2" } },
                pl = "Blueno podnosi rękę i aktywuje Tekkai, utwardzając ją. Następnie uderza w ziemię, niszcząc teren przed sobą i zmniejszając szybkość ruchu przeciwników o {{debuff:60}} na {{sec:3 sekundy}}."
            { image = "SalaDeGuerra_lvl3.png", stats = { "Descrição do nível 3" } },
            }
            { image = "SalaDeGuerra_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "SalaDeGuerra_lvl5.png", stats = { "Descrição do nível 5" } },
         },
         },
        ["Air Door"] = {
    desc = {
        pt = "Blueno usa o poder de sua Akuma no Mi para criar uma porta no ar que leva à sua própria Dimensão de Portas. Dentro dela, Blueno se torna invulnerável a danos e sua velocidade de movimento aumenta em {{ms:200}} por {{sec:3 segundos}}.",
        en = "Blueno uses his Akuma no Mi power to create a door in the air that leads to his own Door Dimension. Inside it, Blueno becomes invulnerable to damage and his movement speed is increased by {{ms:200}} for {{sec:3 seconds}}.",
        es = "Blueno usa el poder de su Fruta del Diablo para crear una puerta en el aire que lleva a la Dimensión Puerta. En ella, Blueno se vuelve invulnerable y aumenta su velocidad de movimiento en {{ms:200}} durante {{sec:3 segundos}}.",
        pl = "Blueno używa mocy Akuma no Mi, aby stworzyć drzwi w powietrzu prowadzące do jego Wymiaru Drzwi. W jego wnętrzu Blueno staje się niewrażliwy na obrażenia, a jego szybkość ruchu zwiększa się o {{ms:200}} na {{sec:3 sekundy}}."
     },
     },
     suborder = { "Trap Door", "Kaiten Door", "Tekkai Sai Door" },
     Treinamento = {
    subskills = {
        label = "Treinamento",
        ["Trap Door"] = {
        levels = {
            desc = {
            { image = "Treinamento_lvl1.png", stats = { "Descrição do nível 1" } },
                pt = "Blueno cria uma porta no chão por {{sec:2.5 segundos}}, imobilizando inimigos por {{sec:0.6 segundos}}.",
            { image = "Treinamento_lvl2.png", stats = { "Descrição do nível 2" } },
                en = "Blueno creates a door in the ground for {{sec:2.5 seconds}}, immobilizing enemies for {{sec:0.6 seconds}}.",
            { image = "Treinamento_lvl3.png", stats = { "Descrição do nível 3" } },
                es = "Blueno crea una puerta en el suelo por {{sec:2.5 segundos}}, inmovilizando a los enemigos por {{sec:0.6 segundos}}.",
            { image = "Treinamento_lvl4.png", stats = { "Descrição do nível 4" } },
                pl = "Blueno tworzy drzwi w ziemi na {{sec:2.5 sekundy}}, unieruchamiając wrogów na {{sec:0.6 sekundy}}."
            { image = "Treinamento_lvl5.png", stats = { "Descrição do nível 5" } },
            }
         },
         },
        ["Kaiten Door"] = {
    },
            desc = {
    Ferreiro = {
                pt = "Blueno emerge e chuta à frente, causando dano e confusão por {{sec:5 segundos}}.",
        label = "Ferreiro",
                en = "Blueno emerges and kicks forward, causing damage and confusion for {{sec:5 seconds}}.",
        levels = {
                es = "Blueno emerge y patea hacia delante, causando daño y confusión durante {{sec:5 segundos}}.",
            { image = "Ferreiro_lvl1.png", stats = { "Descrição do nível 1" } },
                pl = "Blueno wynurza się i kopie do przodu, zadając obrażenia i dezorientację przez {{sec:5 sekund}}."
             { image = "Ferreiro_lvl2.png", stats = { "Descrição do nível 2" } },
            },
            { image = "Ferreiro_lvl3.png", stats = { "Descrição do nível 3" } },
            -- <<< NÍVEL 1: ordem dos filhos do 'Kaiten Door'
            { image = "Ferreiro_lvl4.png", stats = { "Descrição do nível 4" } },
            suborder = { "Kaiten Door — Cyclone", "Kaiten Door — Maelstrom" },
            { image = "Ferreiro_lvl5.png", stats = { "Descrição do nível 5" } },
             subskills = {
                ["Kaiten Door — Cyclone"] = {
                    desc = {
                        pt = "Versão Cyclone: mais alcance e dano moderado.",
                        en = "Cyclone variant: longer reach and moderate damage.",
                        es = "Variante Cyclone: mayor alcance y daño moderado.",
                        pl = "Wariant Cyclone: większy zasięg i umiarkowane obrażenia."
                    }
                },
                ["Kaiten Door — Maelstrom"] = {
                    desc = {
                        pt = "Versão Maelstrom: dano em área mais alto e recarga maior.",
                        en = "Maelstrom variant: higher AoE damage with longer cooldown.",
                        es = "Variante Maelstrom: mayor daño en área y tiempo de recarga mayor.",
                        pl = "Wariant Maelstrom: większe obrażenia obszarowe i dłuższy czas odnowienia."
                    }
                }
            }
         },
         },
         ["Tekkai Sai Door"] = {
    },
             desc = {
    Cozinha = {
                pt = "Blueno cria uma porta elevada e cai com um soco usando Tekkai, reduzindo MS em {{debuff:80}} por {{sec:4 segundos}}.",
         label = "Cozinha",
                en = "Blueno opens a higher door and drops with a Tekkai punch, reducing MS by {{debuff:80}} for {{sec:4 seconds}}.",
        levels = {
                es = "Blueno abre una puerta elevada y cae con un puñetazo Tekkai, reduciendo MS en {{debuff:80}} durante {{sec:4 segundos}}.",
             { image = "Cozinha_lvl1.png", stats = { "Descrição do nível 1" } },
                pl = "Blueno otwiera wyższe drzwi i spada z uderzeniem Tekkai, zmniejszając MS o {{debuff:80}} przez {{sec:4 sekundy}}."
            { image = "Cozinha_lvl2.png", stats = { "Descrição do nível 2" } },
            }
             { image = "Cozinha_lvl3.png", stats = { "Descrição do nível 3" } },
        }
            { image = "Cozinha_lvl4.png", stats = { "Descrição do nível 4" } },
    }
            { image = "Cozinhalvl5.gif", stats = { "Descrição do nível 5" } },
},
 
 
        ["Tekkai Rin"] = {
             desc = {
                pt = "Blueno utiliza o Tekkai para aumentar o peso e a resistência do próprio corpo e então começa a girar, chutando o chão com força e devastando tudo em seu caminho. Ele finaliza o movimento com um golpe poderoso, reduzindo a velocidade de movimento dos inimigos em {{debuff:80}} por {{sec:4 segundos}}. Inimigos que não são jogadores ficam atordoados por {{sec:2 segundos}}, enquanto inimigos jogadores são empurrados.",
                en = "Blueno uses Tekkai to increase his body's weight and resilience, then begins to spin, forcefully kicking the ground and devastating everything in his path. He finishes the move with a powerful strike, reducing enemies' movement speed by {{debuff:80}} for {{sec:4 seconds}}. Non-player enemies are stunned for {{sec:2 seconds}}, while player enemies are pushed back.",
                es = "Blueno utiliza Tekkai para aumentar su peso y la resistencia de su cuerpo, luego comienza a girar, pateando con fuerza el suelo y destruyendo todo a su paso. Termina el ataque con un golpe poderoso que reduce la velocidad de movimiento de los enemigos en {{debuff:80}} durante {{sec:4 segundos}}. Los enemigos no jugadores quedan aturdidos durante {{sec:2 segundos}}, mientras que los jugadores son empujados hacia atrás.",
                pl = "Blueno używa Tekkai, aby zwiększyć wagę i odporność ciała, następnie zaczyna się obracać, kopiąc w ziemię i dewastując wszystko na swojej drodze. Kończy ruch potężnym ciosem, zmniejszając szybkość ruchu przeciwników o {{debuff:80}} na {{sec:4 sekundy}}. Przeciwnicy niebędący graczami są ogłuszeni na {{sec:2 sekundy}}, podczas gdy gracze zostają odrzuceni."
            }
         },
         },
    },
}


        ["Juji Rankyaku"] = {
function p.getComponent(name)
            desc = {
    local key = map[normalize(name)]
                pt = "Blueno levanta uma perna, liberando um Rankyaku vertical à frente. Inimigos atingidos ficam atordoados por {{sec:2 segundos}}. Em seguida, ele gira e executa outro Rankyaku em uma grande área frontal.",
    if not key then return nil end
                en = "Blueno raises one leg, unleashing a vertical Rankyaku forward. Hit enemies are stunned for {{sec:2 seconds}}. He then spins and executes another Rankyaku across a wide frontal area.",
    return data[key]
                es = "Blueno levanta una pierna y lanza un Rankyaku vertical hacia delante. Al impactar, deja aturdidos a los enemigos golpeados durante {{sec:2 segundos}}. Aprovechando este impulso, gira y ejecuta otro Rankyaku, propulsándolo horizontalmente a través de una amplia zona.",
end
                pl = "Blueno podnosi nogę, wykonując pionowy cięcie Rankyaku do przodu. Trafieni przeciwnicy zostają ogłuszeni na {{sec:2 sekundy}}. Wykorzystując siłę działającą na niego, Blueno obraca się, by wykonać kolejny Rankyaku, tym razem poziomo, aby trafić większy obszar."
            }
        },


         ["Tekkai Sai"] = {
function p.main(frame)
            desc = {
    local args = frame:getParent().args or {}
                pt = "Blueno combina habilmente suas técnicas Geppou e Soru, iniciando uma série de movimentos rápidos enquanto se desloca de um lado para o outro. Aproveitando sua velocidade, Blueno mergulha para baixo e desfere um poderoso soco, utilizando o Tekkai para aumentar sua resistência e massa. Isso causa grande dano em uma ampla área e reduz a velocidade de movimento dos inimigos em {{debuff:100}} por {{sec:6 segundos}}.",
    local n = args.n or args[1] or ""
                en = "Blueno skillfully combines his Geppou and Soru techniques, initiating a series of swift movements as he darts from side to side. Taking advantage of his speed, Blueno dives downward and delivers a powerful punch while using Tekkai to bolster his resilience and weight. This deals extensive damage over a wide area and reduces enemies' movement speed by {{debuff:100}} for {{sec:6 seconds}}.",
    local comp = p.getComponent(n)
                es = "Blueno combina hábilmente sus técnicas Geppou y Soru, iniciando una serie de movimientos rápidos mientras se desplaza de un lado a otro. Aprovechando su velocidad acelerada, Blueno se lanza hacia abajo y asesta un puñetazo mientras utiliza Tekkai para reforzar su resistencia y peso. Esto causa un daño considerable en una amplia zona y reduce la velocidad de movimiento de los enemigos en {{debuff:100}} durante {{sec:6 segundos}}.",
    if not comp then
                pl = "Blueno zręcznie łączy techniki Geppou i Soru, inicjując serię szybkich ruchów, przemieszczając się z boku na bok. Wykorzystując nabraną prędkość, Blueno nurkuje w dół i zadaje potężny cios, używając przy tym Tekkai, aby wzmocnić swoją wytrzymałość i masę. Zadaje to znaczne obrażenia na dużym obszarze i zmniejsza szybkość ruchu przeciwników o {{debuff:100}} na {{sec:6 sekund}}."
         return ""
            }
    end
         }
    local html = {}
     }
    html[#html + 1] = '<div class="utab">'
}
    html[#html + 1] = '<section class="utab__section" data-tab="' .. mw.text.nowiki(comp.label) .. '">'
    for i, lvl in ipairs(comp.levels) do
        html[#html + 1] = '<div class="utab__level" data-level="' .. i .. '">'
        html[#html + 1] = '<div class="utab__content">'
        html[#html + 1] = '<div class="utab__mediaImage">[[File:' .. lvl.image .. ']]</div>'
        html[#html + 1] = '<ul class="utab__statList">'
        for _, stat in ipairs(lvl.stats) do
            html[#html + 1] = '<li>' .. stat .. '</li>'
        end
        html[#html + 1] = '</ul>'
        html[#html + 1] = '</div>'
         html[#html + 1] = '</div>'
    end
    html[#html + 1] = '</section>'
    html[#html + 1] = '</div>'
     return table.concat(html)
end


return M
return p

Edição atual tal como às 17h59min de 7 de fevereiro de 2026

A documentação para este módulo pode ser criada em Módulo:Teste/doc

--[[
Module:Guild – Dados dos componentes da base de guild.
Uso: {{#invoke:Guild|main|n=Ferreiro}}
Predefinição: {{Guild|n=Ferreiro}}
]]

local p = {}

local function normalize(name)
    if not name or name == "" then return nil end
    local s = mw.text.trim(name):lower()
    s = mw.ustring.gsub(s, "ó", "o")
    s = mw.ustring.gsub(s, "ã", "a")
    s = mw.ustring.gsub(s, "á", "a")
    s = mw.ustring.gsub(s, " ", "")
    return s
end

local map = {
    designer = "Designer",
    cofre = "Cofre",
    salaoprincipal = "Salão Principal",
    salao = "Salão Principal",
    quartos = "Quartos",
    saladeguerra = "Sala de Guerra",
    salaguerra = "Sala de Guerra",
    treinamento = "Treinamento",
    ferreiro = "Ferreiro",
    cozinha = "Cozinha",
}

local data = {
    Designer = {
        label = "Designer",
        levels = {
            { image = "Designer_lvl1.png", stats = { "1 pilar de artefato disponível", "27 símbolos disponíveis", "1 plano de fundo disponível", "6 cores disponíveis", "2% de EXP", "4% de sorte", "5% de pontos de aliança" } },
            { image = "Designer_lvl2.png", stats = { "2 pilares de artefato disponíveis", "9 planos de fundo disponíveis", "47 símbolos disponíveis", "12 cores disponíveis", "4% de EXP", "9% de sorte", "12% de pontos de aliança" } },
            { image = "Designer_lvl3.png", stats = { "2 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "72 símbolos disponíveis", "30 cores disponíveis", "6% de EXP", "15% de sorte", "22% de pontos de aliança" } },
            { image = "Designer_lvl4.png", stats = { "3 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "92 símbolos disponíveis", "30 cores disponíveis", "8% de EXP", "22% de sorte", "35% de pontos de aliança" } },
            { image = "Designer_lvl5.png", stats = { "4 pilares de artefato disponíveis", "34 planos de fundo disponíveis", "112 símbolos disponíveis", "30 cores disponíveis", "10% de EXP", "30% de sorte", "50% de pontos de aliança" } },
        },
    },
    Cofre = {
        label = "Cofre",
        levels = {
            { image = "Cofre_lvl1.png", stats = { "10% de bônus pra aliança" } },
            { image = "Cofre_lvl2.png", stats = { "+ 100 espaços extra no cofre", "25% de bônus pra aliança" } },
            { image = "Cofre_lvl3.png", stats = { "+ 200 espaços extra no cofre", "45% de bônus pra aliança" } },
            { image = "Cofre_lvl4.png", stats = { "+ 300 espaços extra no cofre", "75% de bônus pra aliança" } },
            { image = "Cofre_lvl5.png", stats = { "+ 400 espaços extra no cofre", "100% de bônus pra aliança" } },
        },
    },
    ["Salão Principal"] = {
        label = "Salão Principal",
        levels = {
            { image = "SalaoPrincipal_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "SalaoPrincipal_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "SalaoPrincipal_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "SalaoPrincipal_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "SalaoPrincipal_lvl5.png", stats = { "Descrição do nível 5" } },
        },
    },
    Quartos = {
        label = "Quartos",
        levels = {
            { image = "Quartos_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "Quartos_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "Quartos_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "Quartos_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "Quartos_lvl5.png", stats = { "Descrição do nível 5" } },
        },
    },
    ["Sala de Guerra"] = {
        label = "Sala de Guerra",
        levels = {
            { image = "SalaDeGuerra_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "SalaDeGuerra_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "SalaDeGuerra_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "SalaDeGuerra_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "SalaDeGuerra_lvl5.png", stats = { "Descrição do nível 5" } },
        },
    },
    Treinamento = {
        label = "Treinamento",
        levels = {
            { image = "Treinamento_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "Treinamento_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "Treinamento_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "Treinamento_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "Treinamento_lvl5.png", stats = { "Descrição do nível 5" } },
        },
    },
    Ferreiro = {
        label = "Ferreiro",
        levels = {
            { image = "Ferreiro_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "Ferreiro_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "Ferreiro_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "Ferreiro_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "Ferreiro_lvl5.png", stats = { "Descrição do nível 5" } },
        },
    },
    Cozinha = {
        label = "Cozinha",
        levels = {
            { image = "Cozinha_lvl1.png", stats = { "Descrição do nível 1" } },
            { image = "Cozinha_lvl2.png", stats = { "Descrição do nível 2" } },
            { image = "Cozinha_lvl3.png", stats = { "Descrição do nível 3" } },
            { image = "Cozinha_lvl4.png", stats = { "Descrição do nível 4" } },
            { image = "Cozinhalvl5.gif",  stats = { "Descrição do nível 5" } },
        },
    },
}

function p.getComponent(name)
    local key = map[normalize(name)]
    if not key then return nil end
    return data[key]
end

function p.main(frame)
    local args = frame:getParent().args or {}
    local n = args.n or args[1] or ""
    local comp = p.getComponent(n)
    if not comp then
        return ""
    end
    local html = {}
    html[#html + 1] = '<div class="utab">'
    html[#html + 1] = '<section class="utab__section" data-tab="' .. mw.text.nowiki(comp.label) .. '">'
    for i, lvl in ipairs(comp.levels) do
        html[#html + 1] = '<div class="utab__level" data-level="' .. i .. '">'
        html[#html + 1] = '<div class="utab__content">'
        html[#html + 1] = '<div class="utab__mediaImage">[[File:' .. lvl.image .. ']]</div>'
        html[#html + 1] = '<ul class="utab__statList">'
        for _, stat in ipairs(lvl.stats) do
            html[#html + 1] = '<li>' .. stat .. '</li>'
        end
        html[#html + 1] = '</ul>'
        html[#html + 1] = '</div>'
        html[#html + 1] = '</div>'
    end
    html[#html + 1] = '</section>'
    html[#html + 1] = '</div>'
    return table.concat(html)
end

return p