<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.gla.com.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Droflax</id>
	<title>Wiki Gla - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gla.com.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Droflax"/>
	<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php/Especial:Contribui%C3%A7%C3%B5es/Droflax"/>
	<updated>2026-04-20T23:40:47Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Wbevents.json&amp;diff=38744</id>
		<title>Wbevents.json</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Wbevents.json&amp;diff=38744"/>
		<updated>2025-09-04T06:24:02Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;world_boss_events&amp;quot;: {&lt;br /&gt;
        &amp;quot;2025-05-02&amp;quot;: &amp;quot;/images/4/4c/Aokiji_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-05-16&amp;quot;: &amp;quot;/images/d/d1/Shai_hulud_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-05-30&amp;quot;: &amp;quot;/images/6/6e/Plesiosaur_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-06-13&amp;quot;: &amp;quot;/images/e/e4/Mihawk_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-06-27&amp;quot;: &amp;quot;/images/8/87/Bananawani_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-07-11&amp;quot;: &amp;quot;/images/6/6d/Hiking_bear_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-07-25&amp;quot;: &amp;quot;/images/1/1a/Byakko_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-08-08&amp;quot;: &amp;quot;/images/4/4c/Aokiji_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-08-22&amp;quot;: &amp;quot;/images/d/d1/Shai_hulud_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-09-05&amp;quot;: &amp;quot;/images/6/6e/Plesiosaur_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-09-19&amp;quot;: &amp;quot;/images/e/e4/Mihawk_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-10-03&amp;quot;: &amp;quot;/images/8/87/Bananawani_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-10-17&amp;quot;: &amp;quot;/images/6/6d/Hiking_bear_wb_event.png&amp;quot;,&lt;br /&gt;
        &amp;quot;2025-10-31&amp;quot;: &amp;quot;/images/1/1a/Byakko_wb_event.png&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Problemas_de_Conexion&amp;diff=38735</id>
		<title>Problemas de Conexion</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Problemas_de_Conexion&amp;diff=38735"/>
		<updated>2025-09-04T03:43:07Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Si estás enfrentando errores de conexión como '''10060''', '''10061''', '''10054''', '''444''', '''11001''', '''110''', '''1101''' o '''1102''', esta página ofrece soluciones prácticas para resolver el problema.&lt;br /&gt;
&lt;br /&gt;
== Reparar el Cliente ==&lt;br /&gt;
---- Este proceso puede corregir archivos o configuraciones corruptas que están impidiendo que GLA se conecte correctamente.&lt;br /&gt;
&lt;br /&gt;
Puedes hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
*'''A través del propio cliente del juego:'''&lt;br /&gt;
#Abre el juego.&lt;br /&gt;
#Haz clic en el ícono del martillo en la esquina superior derecha. &amp;lt;br&amp;gt; [[File:ConexaoReparo.png|link=]]&lt;br /&gt;
#Espera a que la reparación llegue al 100%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*'''Usando el programa &amp;quot;Reparar Grand Line Adventures&amp;quot;:''' &amp;lt;br&amp;gt;'''Este programa se instala junto con el juego.''' Para acceder a él, haz una de las siguientes acciones:&lt;br /&gt;
# Abre el menú de inicio de Windows y busca: '''Reparar Grand Line Adventures''' &lt;br /&gt;
# O presiona '''Windows + R''' y pega la ruta de abajo: &amp;lt;pre&amp;gt; &amp;lt;nowiki&amp;gt;%APPDATA%\Microsoft\Windows\Start Menu\Programs\Grand Line Adventures\Reparar Grand Line Adventures.lnk&amp;lt;/nowiki&amp;gt; &amp;lt;/pre&amp;gt; &lt;br /&gt;
# Espera a que la reparación llegue al 100%.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Consejo:''' Antes de probar los métodos en esta página, recomendamos reparar el cliente del juego.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Cloudflare WARP'''==&lt;br /&gt;
----'''Atención:''' este programa se recomienda para usuarios que experimentan alta pérdida de conexión o errores que impiden acceder al juego, como el aviso '''&amp;quot;La conexión falló. (444)&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para instalar y usar WARP:&lt;br /&gt;
#Ve al sitio web: https://one.one.one.one/&lt;br /&gt;
#Descarga la versión compatible con tu dispositivo.&lt;br /&gt;
#Instala el programa y ábrelo (el ícono aparecerá en la barra de tareas).&lt;br /&gt;
#Haz clic para '''conectar WARP'''.&lt;br /&gt;
Después de conectarte, intenta abrir el juego nuevamente.&lt;br /&gt;
&lt;br /&gt;
[[File:warp.gif|center|link=]]&lt;br /&gt;
&lt;br /&gt;
=='''Desactiva el Antivirus'''==&lt;br /&gt;
----'''Windows Defender''' u otros antivirus de pago pueden interferir con la conexión del juego. En algunos casos, detectan el juego erróneamente como una amenaza ('''falso positivo''') y bloquean su acceso a internet.&lt;br /&gt;
&lt;br /&gt;
Si sospechas que este es el problema:&lt;br /&gt;
#'''Desactiva temporalmente tu antivirus''' y el '''firewall'''.&lt;br /&gt;
#Abre el juego y haz la prueba.&lt;br /&gt;
#Si funciona, agrega Grand Line Adventures a la '''lista de exclusiones''' del antivirus para evitar futuros bloqueos.&lt;br /&gt;
Esto garantiza que el juego tenga acceso completo a la red sin interferencias.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Advertencia:''' Nunca dejes tu antivirus desactivado de forma permanente.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Renovar Dirección IP y DNS'''==&lt;br /&gt;
----&lt;br /&gt;
Renovar la IP y limpiar la caché DNS puede ayudar a solucionar problemas de red que afectan la conexión con el juego.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Abrir la consola de comandos (Símbolo del sistema)''' – Presiona &amp;lt;code&amp;gt;Windows + R&amp;lt;/code&amp;gt;, escribe &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; y presiona Enter.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Escribir los siguientes comandos''', uno por vez, presionando Enter después de cada línea:&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ipconfig /release&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ipconfig /renew&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ipconfig /flushdns&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Cerrar la consola y probar la conexión''' abriendo el juego nuevamente.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Nota:''' El comando &amp;lt;code&amp;gt;ipconfig /release&amp;lt;/code&amp;gt; desconectará temporalmente tu internet. La conexión se restaurará en el siguiente paso.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Cambiar el DNS'''==&lt;br /&gt;
----Cambiar el DNS puede mejorar la estabilidad de la conexión y resolver problemas de resolución del servidor.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para cambiar el DNS manualmente:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Abre el '''Panel de control''' y ve a '''Redes e Internet &amp;gt; Centro de redes y recursos compartidos'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic en '''Cambiar configuración del adaptador''' en el menú lateral.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic derecho en tu conexión activa (Wi-Fi o Ethernet) y selecciona '''Propiedades'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Selecciona '''Habilitar el protocolo de Internet versión 4 (TCP/IPv4)''' y haz clic en '''Propiedades'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Marca la opción '''Usar las siguientes direcciones de servidor DNS''' e ingresa los siguientes valores:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''8.8.8.8''' como DNS preferido. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''8.8.4.4''' como DNS alternativo. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic en '''Aceptar''' y reinicia tu conexión si es necesario.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Limpiar Caché de Red y Configuraciones Corruptas ==&lt;br /&gt;
----&lt;br /&gt;
Si ya intentaste las instrucciones anteriores y aún tienes problemas de conexión, puede que la caché de red de Windows esté dañada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Abre la consola de comandos (Símbolo del sistema) como administrador''' – escribe &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; en el menú de inicio, haz clic derecho y selecciona '''Ejecutar como administrador'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Escribe los siguientes comandos''', uno por uno, presionando Enter después de cada línea:&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh winsock reset&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh int ip reset&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh winhttp reset proxy&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Reinicia tu computadora''' después de ejecutar los comandos.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Resumen:''' Estos comandos eliminan configuraciones antiguas de proxy, DNS y red, ayudando a restablecer la conexión sin necesidad de formatear o reinstalar drivers.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verificar Proxy o VPN Activado ==&lt;br /&gt;
----Algunos programas o configuraciones pueden activar un proxy o VPN en Windows sin que el usuario lo sepa, lo que puede interferir con la conexión al juego.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para verificarlo y solucionarlo:&lt;br /&gt;
#Presiona '''Windows + R''', escribe &amp;lt;code&amp;gt;inetcpl.cpl&amp;lt;/code&amp;gt; y presiona Enter.&lt;br /&gt;
#En la ventana que se abre, ve a la pestaña '''Conexiones''' y haz clic en '''Configuración de LAN'''.&lt;br /&gt;
#Desmarca la opción '''Usar un servidor proxy para la LAN'''.&lt;br /&gt;
#Asegúrate de que la opción '''Detectar la configuración automáticamente''' esté marcada.&lt;br /&gt;
#Haz clic en '''Aceptar''' para confirmar y prueba la conexión nuevamente.&lt;br /&gt;
&lt;br /&gt;
==Actualizar el Controlador de Red ==&lt;br /&gt;
----Controladores obsoletos o corruptos pueden causar inestabilidad en la conexión, especialmente en juegos en línea.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para actualizar el controlador de red:&lt;br /&gt;
#Presiona '''Windows + X''' y selecciona '''Administrador de dispositivos'''.&lt;br /&gt;
#Expande la sección '''Adaptadores de red'''.&lt;br /&gt;
#Haz clic derecho sobre tu adaptador principal (Wi-Fi o Ethernet) y selecciona '''Actualizar controlador'''.&lt;br /&gt;
#Elige la opción '''Buscar controladores automáticamente'''.&lt;br /&gt;
#Una vez finalizado, reinicia tu computadora y prueba el juego nuevamente.&lt;br /&gt;
&lt;br /&gt;
== Reiniciar el Router Correctamente ==&lt;br /&gt;
----Apagar y encender rápidamente el router no siempre resuelve los problemas de red. Para forzar una reconexión limpia, es importante reiniciarlo correctamente.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación:&lt;br /&gt;
#Desconecta el router de la corriente durante al menos '''30 segundos'''.&lt;br /&gt;
#Espera ese tiempo y vuelve a conectarlo.&lt;br /&gt;
#Espera hasta que la conexión se restablezca (luces estabilizadas) y luego abre el juego.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Resumen:''' Este reinicio obliga a liberar IPs antiguas y puede solucionar fallos de conexión persistentes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; margin-top: 32px; font-size: 14px;&amp;quot;&amp;gt;&lt;br /&gt;
Si nada funciona, te recomendamos simplemente esperar. El problema podría estar en los servidores del juego.&lt;br /&gt;
&lt;br /&gt;
Mantente atento a nuestro [https://discord.gg/grandlineadventures Discord oficial], donde publicamos avisos cada vez que hay inestabilidades.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38722</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38722"/>
		<updated>2025-09-03T19:59:53Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38720</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38720"/>
		<updated>2025-09-03T19:59:33Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Problemas_de_Conexion&amp;diff=38577</id>
		<title>Problemas de Conexion</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Problemas_de_Conexion&amp;diff=38577"/>
		<updated>2025-09-02T19:38:48Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Criou página com 'Si estás enfrentando errores de conexión como '''10060''', '''10061''', '''10054''', '''444''', '''11001''', '''110''', '''1101''' o '''1102''', esta página ofrece solucion...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Si estás enfrentando errores de conexión como '''10060''', '''10061''', '''10054''', '''444''', '''11001''', '''110''', '''1101''' o '''1102''', esta página ofrece soluciones prácticas para resolver el problema.&lt;br /&gt;
&lt;br /&gt;
== Reparar el Cliente ==&lt;br /&gt;
---- Este proceso puede corregir archivos o configuraciones corruptas que están impidiendo que GLA se conecte correctamente.&lt;br /&gt;
&lt;br /&gt;
Puedes hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
*'''A través del propio cliente del juego:'''&lt;br /&gt;
#Abre el juego.&lt;br /&gt;
#Haz clic en el ícono del martillo en la esquina superior derecha. &amp;lt;br&amp;gt; [[File:ConexaoReparo.png|link=]]&lt;br /&gt;
#Espera a que la reparación llegue al 100%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*'''Usando el programa &amp;quot;Reparar Grand Line Adventures&amp;quot;:''' &amp;lt;br&amp;gt;'''Este programa se instala junto con el juego.''' Para acceder a él, haz una de las siguientes acciones:&lt;br /&gt;
# Abre el menú de inicio de Windows y busca: '''Reparar Grand Line Adventures''' &lt;br /&gt;
# O presiona '''Windows + R''' y pega la ruta de abajo: &amp;lt;pre&amp;gt; &amp;lt;nowiki&amp;gt;%APPDATA%\Microsoft\Windows\Start Menu\Programs\Grand Line Adventures\Reparar Grand Line Adventures.lnk&amp;lt;/nowiki&amp;gt; &amp;lt;/pre&amp;gt; &lt;br /&gt;
# Espera a que la reparación llegue al 100%.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Consejo:''' Antes de probar los métodos en esta página, recomendamos reparar el cliente del juego.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Cloudflare WARP'''==&lt;br /&gt;
----'''Atención:''' este programa se recomienda para usuarios que experimentan alta pérdida de conexión o errores que impiden acceder al juego, como el aviso '''&amp;quot;Conexión Fallida (444)&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para instalar y usar WARP:&lt;br /&gt;
#Ve al sitio web: https://one.one.one.one/&lt;br /&gt;
#Descarga la versión compatible con tu dispositivo.&lt;br /&gt;
#Instala el programa y ábrelo (el ícono aparecerá en la barra de tareas).&lt;br /&gt;
#Haz clic para '''conectar WARP'''.&lt;br /&gt;
Después de conectarte, intenta abrir el juego nuevamente.&lt;br /&gt;
&lt;br /&gt;
[[File:warp.gif|center|link=]]&lt;br /&gt;
&lt;br /&gt;
=='''Desactiva el Antivirus'''==&lt;br /&gt;
----'''Windows Defender''' u otros antivirus de pago pueden interferir con la conexión del juego. En algunos casos, detectan el juego erróneamente como una amenaza ('''falso positivo''') y bloquean su acceso a internet.&lt;br /&gt;
&lt;br /&gt;
Si sospechas que este es el problema:&lt;br /&gt;
#'''Desactiva temporalmente tu antivirus''' y el '''firewall'''.&lt;br /&gt;
#Abre el juego y haz la prueba.&lt;br /&gt;
#Si funciona, agrega Grand Line Adventures a la '''lista de exclusiones''' del antivirus para evitar futuros bloqueos.&lt;br /&gt;
Esto garantiza que el juego tenga acceso completo a la red sin interferencias.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Advertencia:''' Nunca dejes tu antivirus desactivado de forma permanente.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Renovar Dirección IP y DNS'''==&lt;br /&gt;
----Renovar la IP y limpiar la caché DNS puede ayudar a solucionar problemas de red que afectan la conexión con el juego.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación:&lt;br /&gt;
#Presiona '''Windows + R''', escribe &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; y presiona Enter para abrir la consola de comandos (Símbolo del sistema).&lt;br /&gt;
#En la consola, escribe los siguientes comandos en orden, presionando Enter después de cada uno: &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;ipconfig /release&amp;lt;/code&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;ipconfig /renew&amp;lt;/code&amp;gt; &amp;lt;/br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;code&amp;gt;ipconfig /flushdns&amp;lt;/code&amp;gt; &amp;lt;/br&amp;gt;&lt;br /&gt;
#Cierra la consola y prueba la conexión abriendo el juego nuevamente.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt; &lt;br /&gt;
'''Nota:''' El comando &amp;lt;code&amp;gt;ipconfig /release&amp;lt;/code&amp;gt; desconectará temporalmente tu internet. La conexión se restaurará en el siguiente paso.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Cambiar el DNS'''==&lt;br /&gt;
----Cambiar el DNS puede mejorar la estabilidad de la conexión y resolver problemas de resolución del servidor.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para cambiar el DNS manualmente:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Abre el '''Panel de control''' y ve a '''Redes e Internet &amp;gt; Centro de redes y recursos compartidos'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic en '''Cambiar configuración del adaptador''' en el menú lateral.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic derecho en tu conexión activa (Wi-Fi o Ethernet) y selecciona '''Propiedades'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Selecciona '''Habilitar el protocolo de Internet versión 4 (TCP/IPv4)''' y haz clic en '''Propiedades'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Marca la opción '''Usar las siguientes direcciones de servidor DNS''' e ingresa los siguientes valores:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''8.8.8.8''' como DNS preferido. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''8.8.4.4''' como DNS alternativo. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Haz clic en '''Aceptar''' y reinicia tu conexión si es necesario.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Limpiar Caché de Red y Configuraciones Corruptas ==&lt;br /&gt;
----&lt;br /&gt;
Si ya intentaste las instrucciones anteriores y aún tienes problemas de conexión, puede que la caché de red de Windows esté dañada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;'''Abre la consola de comandos (Símbolo del sistema) como administrador''' – escribe &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; en el menú de inicio, haz clic derecho y selecciona '''Ejecutar como administrador'''.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Escribe los siguientes comandos''', uno por uno, presionando Enter después de cada línea:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh winsock reset&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh int ip reset&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;netsh winhttp reset proxy&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;'''Reinicia tu computadora''' después de ejecutar los comandos.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Resumen:''' Estos comandos eliminan configuraciones antiguas de proxy, DNS y red, ayudando a restablecer la conexión sin necesidad de formatear o reinstalar drivers.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Verificar Proxy o VPN Activado ==&lt;br /&gt;
----Algunos programas o configuraciones pueden activar un proxy o VPN en Windows sin que el usuario lo sepa, lo que puede interferir con la conexión al juego.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para verificarlo y solucionarlo:&lt;br /&gt;
#Presiona '''Windows + R''', escribe &amp;lt;code&amp;gt;inetcpl.cpl&amp;lt;/code&amp;gt; y presiona Enter.&lt;br /&gt;
#En la ventana que se abre, ve a la pestaña '''Conexiones''' y haz clic en '''Configuración de LAN'''.&lt;br /&gt;
#Desmarca la opción '''Usar un servidor proxy para la LAN'''.&lt;br /&gt;
#Asegúrate de que la opción '''Detectar la configuración automáticamente''' esté marcada.&lt;br /&gt;
#Haz clic en '''Aceptar''' para confirmar y prueba la conexión nuevamente.&lt;br /&gt;
&lt;br /&gt;
==Actualizar el Controlador de Red ==&lt;br /&gt;
----Controladores obsoletos o corruptos pueden causar inestabilidad en la conexión, especialmente en juegos en línea.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación para actualizar el controlador de red:&lt;br /&gt;
#Presiona '''Windows + X''' y selecciona '''Administrador de dispositivos'''.&lt;br /&gt;
#Expande la sección '''Adaptadores de red'''.&lt;br /&gt;
#Haz clic derecho sobre tu adaptador principal (Wi-Fi o Ethernet) y selecciona '''Actualizar controlador'''.&lt;br /&gt;
#Elige la opción '''Buscar controladores automáticamente'''.&lt;br /&gt;
#Una vez finalizado, reinicia tu computadora y prueba el juego nuevamente.&lt;br /&gt;
&lt;br /&gt;
== Reiniciar el Router Correctamente ==&lt;br /&gt;
----Apagar y encender rápidamente el router no siempre resuelve los problemas de red. Para forzar una reconexión limpia, es importante reiniciarlo correctamente.&lt;br /&gt;
&lt;br /&gt;
Sigue los pasos a continuación:&lt;br /&gt;
#Desconecta el router de la corriente durante al menos '''30 segundos'''.&lt;br /&gt;
#Espera ese tiempo y vuelve a conectarlo.&lt;br /&gt;
#Espera hasta que la conexión se restablezca (luces estabilizadas) y luego abre el juego.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color:#eeeeee; padding:6px; margin: 0; border-left:4px solid #999;&amp;quot;&amp;gt;&lt;br /&gt;
'''Resumen:''' Este reinicio obliga a liberar IPs antiguas y puede solucionar fallos de conexión persistentes.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; margin-top: 32px; font-size: 14px;&amp;quot;&amp;gt;&lt;br /&gt;
Si nada funciona, te recomendamos simplemente esperar. El problema podría estar en los servidores del juego.&lt;br /&gt;
&lt;br /&gt;
Mantente atento a nuestro [https://discord.gg/grandlineadventures Discord oficial], donde publicamos avisos cada vez que hay inestabilidades.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38379</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38379"/>
		<updated>2025-08-31T06:25:02Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Skill&lt;br /&gt;
local p = {}&lt;br /&gt;
local kalifa = require(&amp;quot;Module:Kalifa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local name = a.name or a.nome or ''&lt;br /&gt;
    local icon = a.icon or ''&lt;br /&gt;
    local level = tonumber(a.level) or nil&lt;br /&gt;
    local energy = a.energy or nil&lt;br /&gt;
    local powerpve = a.powerpve or nil&lt;br /&gt;
    local powerpvp = a.powerpvp or nil&lt;br /&gt;
    local cooldown = a.cooldown or nil&lt;br /&gt;
    local video = a.video or ''&lt;br /&gt;
&lt;br /&gt;
    -- DEBUG: testeo de entrada&lt;br /&gt;
    local debugOutput = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        kalifaLoaded = kalifa and true or false,&lt;br /&gt;
        hasSkills = kalifa.skills and true or false,&lt;br /&gt;
        hasThisSkill = kalifa.skills and kalifa.skills[name] and true or false&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    local descs = kalifa.skills and kalifa.skills[name] or {}&lt;br /&gt;
&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        icon = icon,&lt;br /&gt;
        level = level,&lt;br /&gt;
        desc = descs,&lt;br /&gt;
        energy = energy,&lt;br /&gt;
        powerpve = powerpve,&lt;br /&gt;
        powerpvp = powerpvp,&lt;br /&gt;
        cooldown = cooldown,&lt;br /&gt;
        video = video,&lt;br /&gt;
        debug = debugOutput&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38378</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38378"/>
		<updated>2025-08-31T06:24:32Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38377</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38377"/>
		<updated>2025-08-31T06:24:20Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Skill&lt;br /&gt;
local p = {}&lt;br /&gt;
local kalifa = require(&amp;quot;Module:Kalifa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local name = a.name or a.nome or ''&lt;br /&gt;
    local icon = a.icon or ''&lt;br /&gt;
    local level = tonumber(a.level) or nil&lt;br /&gt;
    local energy = a.energy or nil&lt;br /&gt;
    local powerpve = a.powerpve or nil&lt;br /&gt;
    local powerpvp = a.powerpvp or nil&lt;br /&gt;
    local cooldown = a.cooldown or nil&lt;br /&gt;
    local video = a.video or ''&lt;br /&gt;
&lt;br /&gt;
    -- DEBUG: testeo de entrada&lt;br /&gt;
    local debugOutput = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        kalifaLoaded = kalifa and true or false,&lt;br /&gt;
        hasSkills = kalifa.skills and true or false,&lt;br /&gt;
        hasThisSkill = kalifa.skills and kalifa.skills[name] and true or false&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    local descs = kalifa.skills and kalifa.skills[name] or {}&lt;br /&gt;
&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        icon = icon,&lt;br /&gt;
        level = level,&lt;br /&gt;
        desc = descs,&lt;br /&gt;
        energy = energy,&lt;br /&gt;
        powerpve = powerpve,&lt;br /&gt;
        powerpvp = powerpvp,&lt;br /&gt;
        cooldown = cooldown,&lt;br /&gt;
        video = video,&lt;br /&gt;
        debug = debugOutput&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38376</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38376"/>
		<updated>2025-08-31T06:17:37Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Skill&lt;br /&gt;
local p = {}&lt;br /&gt;
local kalifa = require(&amp;quot;Module:Kalifa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local name = a.name or a.nome or ''&lt;br /&gt;
    local icon = a.icon or ''&lt;br /&gt;
    local level = tonumber(a.level) or nil&lt;br /&gt;
    local energy = a.energy or nil&lt;br /&gt;
    local powerpve = a.powerpve or nil&lt;br /&gt;
    local powerpvp = a.powerpvp or nil&lt;br /&gt;
    local cooldown = a.cooldown or nil&lt;br /&gt;
    local video = a.video or ''&lt;br /&gt;
&lt;br /&gt;
    -- Buscar las descripciones por nombre&lt;br /&gt;
    local descs = kalifa.skills and kalifa.skills[name] or {}&lt;br /&gt;
&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        icon = icon,&lt;br /&gt;
        level = level,&lt;br /&gt;
        desc = descs,&lt;br /&gt;
        energy = energy,&lt;br /&gt;
        powerpve = powerpve,&lt;br /&gt;
        powerpvp = powerpvp,&lt;br /&gt;
        cooldown = cooldown,&lt;br /&gt;
        video = video&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38375</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38375"/>
		<updated>2025-08-31T06:05:29Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#invoke:Droflax|skill&lt;br /&gt;
 |name={{{name|}}}&lt;br /&gt;
 |icon={{{icon|}}}&lt;br /&gt;
 |level={{{level|}}}&lt;br /&gt;
 |energy={{{energy|}}}&lt;br /&gt;
 |powerpve={{{powerpve|}}}&lt;br /&gt;
 |powerpvp={{{powerpvp|}}}&lt;br /&gt;
 |cooldown={{{cooldown|}}}&lt;br /&gt;
 |video={{{video|}}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38374</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38374"/>
		<updated>2025-08-31T06:05:20Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Skill&lt;br /&gt;
local p = {}&lt;br /&gt;
local kalifa = require(&amp;quot;Module:Kalifa&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local name = a.name or a.nome or ''&lt;br /&gt;
    local icon = a.icon or ''&lt;br /&gt;
    local level = tonumber(a.level) or nil&lt;br /&gt;
    local energy = a.energy or nil&lt;br /&gt;
    local powerpve = a.powerpve or nil&lt;br /&gt;
    local powerpvp = a.powerpvp or nil&lt;br /&gt;
    local cooldown = a.cooldown or nil&lt;br /&gt;
    local video = a.video or ''&lt;br /&gt;
&lt;br /&gt;
    -- Buscar descripciones por nombre&lt;br /&gt;
    local descs = kalifa.skills and kalifa.skills[name] or {}&lt;br /&gt;
&lt;br /&gt;
    -- Generar el objeto JSON&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = name,&lt;br /&gt;
        icon = icon,&lt;br /&gt;
        level = level,&lt;br /&gt;
        desc = descs, -- esto será un objeto con pt, es, en, pl&lt;br /&gt;
        energy = energy,&lt;br /&gt;
        powerpve = powerpve,&lt;br /&gt;
        powerpvp = powerpvp,&lt;br /&gt;
        cooldown = cooldown,&lt;br /&gt;
        video = video&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38359</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38359"/>
		<updated>2025-08-29T19:19:31Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38357</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38357"/>
		<updated>2025-08-29T19:19:18Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38355</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38355"/>
		<updated>2025-08-29T18:50:31Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#vardefine:lang|{{#if:{{{lang|}}}|{{{lang|}}}|pt}}}}&lt;br /&gt;
{{#invoke:Droflax|show|lang={{#var:lang}}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38354</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38354"/>
		<updated>2025-08-29T18:49:51Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Leer parámetro lang pasado desde la plantilla o URL&lt;br /&gt;
    local userLang = frame.args.lang or &amp;quot;pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[userLang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        userLang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38349</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38349"/>
		<updated>2025-08-29T18:44:23Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Intenta leer el argumento pasado en la plantilla&lt;br /&gt;
    local userLang = frame.args.lang or &amp;quot;pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[userLang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        userLang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38347</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38347"/>
		<updated>2025-08-29T18:43:24Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Opción 1: recibirlo como argumento desde la plantilla&lt;br /&gt;
    local userLang = frame.args.lang&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        [&amp;quot;pt-br&amp;quot;] = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[userLang] or textos[&amp;quot;pt-br&amp;quot;],&lt;br /&gt;
        userLang or &amp;quot;desconocido&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38346</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38346"/>
		<updated>2025-08-29T18:40:54Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    local lang = mw.language.getContentLanguage():getCode()&lt;br /&gt;
    local userLang = frame:callParserFunction(&amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang content: %s, uselang: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[userLang] or textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang,&lt;br /&gt;
        userLang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38345</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38345"/>
		<updated>2025-08-29T18:39:38Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Obtiene el idioma actual desde la variable {{uselang}}&lt;br /&gt;
    local lang = frame:preprocess(&amp;quot;{{uselang}}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38344</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38344"/>
		<updated>2025-08-29T18:38:25Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    local lang = frame:preprocess(&amp;quot;{{int:uselang}}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38343</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38343"/>
		<updated>2025-08-29T18:36:58Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Detecta el idioma actual de la interfaz con la magic word {{int:lang}}&lt;br /&gt;
    local lang = frame:preprocess(&amp;quot;{{int:lang}}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38342</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38342"/>
		<updated>2025-08-29T18:36:22Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    local lang = mw.language.getUserLanguage()&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38340</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38340"/>
		<updated>2025-08-29T18:34:24Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Idioma de la interfaz actual (ej: &amp;quot;es&amp;quot;, &amp;quot;pt&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;pl&amp;quot;)&lt;br /&gt;
    local lang = mw.language.getContentLanguage():getCode()&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(lang detectado: %s)&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;',&lt;br /&gt;
        textos[lang] or textos[&amp;quot;pt&amp;quot;],&lt;br /&gt;
        lang&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38338</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38338"/>
		<updated>2025-08-29T18:33:01Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.show(frame)&lt;br /&gt;
    -- Intentar leer ?lang= de la URL&lt;br /&gt;
    local lang = frame:callParserFunction(&amp;quot;url_param&amp;quot;, &amp;quot;lang&amp;quot;) or &amp;quot;pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local textos = {&lt;br /&gt;
        pt = &amp;quot;Olá! Você está vendo em português 🇧🇷&amp;quot;,&lt;br /&gt;
        es = &amp;quot;¡Hola! Estás viendo en español 🇪🇸&amp;quot;,&lt;br /&gt;
        en = &amp;quot;Hello! You are viewing in English 🇺🇸&amp;quot;,&lt;br /&gt;
        pl = &amp;quot;Cześć! Oglądasz po polsku 🇵🇱&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- si no existe, usar portugués como fallback&lt;br /&gt;
    local msg = textos[lang] or textos[&amp;quot;pt&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
    -- devolver un div con la prueba&lt;br /&gt;
    return string.format('&amp;lt;div style=&amp;quot;padding:10px;border:1px solid #ccc;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;', msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38285</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38285"/>
		<updated>2025-08-28T16:50:59Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Kalifa&lt;br /&gt;
return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        Kick = {&lt;br /&gt;
            pt = &amp;quot;Kalifa dá um poderoso chute em seu inimigo.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa lanza una potente patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Hitsuji_Gumo_Relax_Awa = {&lt;br /&gt;
            pt = &amp;quot;Kalifa usa os poderes de sua Akuma no Mi para criar bolhas de sabão e lançá-las à frente, causando dano a todos os inimigos e reduzindo a velocidade de movimento deles em '''60''' por '''3 segundos'''.&amp;lt;br&amp;gt;Acerta até '''2''' vezes.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa usa los poderes de su Fruta del Diablo para crear burbujas de jabón y lanzarlas hacia adelante, causando daño a todos los enemigos y reduciendo su velocidad de movimiento en 60 durante 3 segundos. Golpea 2 veces.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Ibara_Road = {&lt;br /&gt;
            pt = &amp;quot;Após saltar no ar, Kalifa gira seu chicote de espinhos ao seu redor, causando dano aos inimigos próximos e reduzindo o dano sofrido em '''30%'''. Inimigos atingidos pelo chicote sofrem sangramento por '''10''' turnos, com duração de '''3''' segundos, além de sofrerem uma redução de cura de '''50%''' pelo mesmo período.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Después de saltar por los aires, Kalifa gira su látigo de espinas a su alrededor, dañando a los enemigos cercanos y reduciendo su daño en un 30%. Los enemigos golpeados por el látigo sufren sangrado durante 10 turnos, que dura 8 segundos, mientras reciben un 50% menos de curación por la misma duración.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Geppo = {&lt;br /&gt;
            pt = &amp;quot;Geppo é uma das seis técnicas Rokushiki. Aqueles que a dominam podem pular e permanecer no ar por mais tempo do que o normal.Kalifa usa o Geppo para se mover em qualquer direção, tornando-se brevemente invulnerável e permitindo-lhe usar outras habilidades.&amp;lt;br&amp;gt;Pode ser cancelada ao pressionar o botão da habilidade novamente enquanto está ativa.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Geppo es una de las seis técnicas Rokushiki. Quienes la dominan pueden saltar y mantenerse en el aire por más tiempo de lo normal. Kalifa usa Geppo para moverse en cualquier dirección, volviéndose brevemente invulnerable y permitiéndole usar otras habilidades. Puede cancelarse al presionar el botón de habilidad nuevamente mientras está activa.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Chiyu_no_Awa = {&lt;br /&gt;
            pt = &amp;quot;Kalifa usa suas habilidades com bolhas de sabão não apenas para atacar, mas também para apoiar seus aliados. Com essa habilidade, ela cura os aliados próximos.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa usa sus burbujas de jabón no solo para atacar, sino también para apoyar a sus aliados. Con esta habilidad, puede curar a aliados cercanos.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Bubble_Master_Soap_Sheep = {&lt;br /&gt;
            pt = &amp;quot;Kalifa usa seus poderes para reunir bolhas de sabão ao seu redor, fazendo com que ela se pareça com uma ovelha. Quando ativa essa habilidade, ela se torna invulnerável por '''2,5 segundos'''. Após a invulnerabilidade acabar, as bolhas de sabão caem de seu corpo.&amp;lt;br&amp;gt;Inimigos que pisarem nas bolhas terão sua velocidade de movimento reduzida em '''80''' por '''4''' segundos. Em modos PvP, os inimigos que pisarem nas bolhas ficam confusos e escorregam nelas.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa usa sus poderes para reunir burbujas de jabón a su alrededor, haciéndola parecer una oveja. Cuando activa esta habilidad, se vuelve invulnerable durante 2.5 segundos. Luego de terminar la invulnerabilidad, las burbujas explotan causando daño. Los enemigos dentro de las burbujas ven reducida su velocidad en 80 durante 4 segundos. En modos PvP, los enemigos que pisan las burbujas quedan confundidos y pueden resbalar en ellas.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Rankyaku_Slash = {&lt;br /&gt;
            pt = &amp;quot;Kalifa usa o Rankyaku, uma das seis técnicas “Rokushiki“, para realizar um poderoso chute que cria uma lâmina de vento afiada, cortando todos os inimigos à sua frente.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa usa Rankyaku, una de las seis técnicas “Rokushiki”, para lanzar una afilada cuchilla de viento que corta a todos los enemigos frente a ella.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Hitsuji_Gumo_Tidal_Wave = {&lt;br /&gt;
            pt = &amp;quot;Kalifa usa os poderes de sua Akuma no Mi para gerar uma enorme onda de bolhas de sabão e lançá-la à frente como um tsunami. Esta onda causa dano e reduz a velocidade de movimento dos inimigos em '''100''' por '''5 segundos'''. Inimigos atingidos pela onda ficam '''ensaboados''' por '''20 segundos'''. Quando os aliados de Kalifa atingem inimigos ensaboados, '''50%''' do dano causado é convertido em cura própria, até '''15%''' da saúde máxima do aliado.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa usa los poderes de su Fruta del Diablo para generar una ola masiva de burbujas de jabón y lanzarla hacia adelante como un tsunami. La ola causa daño y reduce la velocidad de movimiento de los enemigos en 100 durante 6 segundos. Los enemigos golpeados por la ola quedan “enjabonados” durante 20 segundos. Cuando los aliados de Kalifa golpean a enemigos enjabonados, el 50% del daño causado se convierte en auto-curación, hasta un 15% de la vida máxima del aliado.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Golden_Awa = {&lt;br /&gt;
            pt = &amp;quot;Kalifa se move em alta velocidade, usando seus poderes de sabão para limpar tanto aliados quanto inimigos. Aliados atingidos pelas bolhas de sabão têm seus efeitos negativos removidos, incluindo redução de ataque, redução de velocidade de movimento, redução de defesa, envenenamento e queimaduras. Inimigos atingidos pelas bolhas têm seus efeitos positivos removidos, como bônus de ataque, bônus de velocidade de movimento e bônus de defesa.&amp;lt;br&amp;gt;Além disso, o ataque deles é reduzido em '''25%''' por '''8 segundos'''. Em instâncias PvE, esta habilidade reduz o ataque dos inimigos em '''25%''' e sua defesa em '''50%''' por '''8 segundos'''.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa se mueve a alta velocidad, usando sus poderes de jabón para limpiar tanto a aliados como enemigos. A los aliados, las burbujas les eliminan efectos negativos como reducción de ataque, movimiento, defensa, envenenamiento y quemaduras. A los enemigos, las burbujas eliminan efectos positivos como bonificaciones de ataque, velocidad de movimiento y defensa. Además, reduce su ataque en 25% durante 8 segundos. En PvE, también reduce el ataque de los enemigos en un 25% y su defensa en 50% durante 8 segundos.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38284</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38284"/>
		<updated>2025-08-28T16:46:37Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Kalifa&lt;br /&gt;
return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        Kick = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa da una poderosa patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        Ibara_Road = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa gira su látigo...&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38283</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38283"/>
		<updated>2025-08-28T16:42:14Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Kalifa&lt;br /&gt;
return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        Kick = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa da una poderosa patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        ibararoad = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa gira su látigo...&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38282</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38282"/>
		<updated>2025-08-28T16:41:57Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Kalifa&lt;br /&gt;
return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        kick = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa da una poderosa patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        ibararoad = {&lt;br /&gt;
            pt = &amp;quot;&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa gira su látigo...&amp;quot;,&lt;br /&gt;
            en = &amp;quot;&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38247</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38247"/>
		<updated>2025-08-27T19:19:50Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38245</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38245"/>
		<updated>2025-08-27T19:19:07Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38236</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38236"/>
		<updated>2025-08-27T18:32:26Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
            local localized = skillsData[skillKey] or {}&lt;br /&gt;
            local descPT = localized.pt or sk.desc or ''&lt;br /&gt;
            local descES = localized.es or sk.desc or ''&lt;br /&gt;
            local descEN = localized.en or sk.desc or ''&lt;br /&gt;
            local descPL = localized.pl or sk.desc or ''&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', descPT)&lt;br /&gt;
			    :attr('data-desc-pt', descPT)&lt;br /&gt;
			    :attr('data-desc-es', descES)&lt;br /&gt;
			    :attr('data-desc-en', descEN)&lt;br /&gt;
			    :attr('data-desc-pl', descPL)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38234</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38234"/>
		<updated>2025-08-27T18:27:28Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
    &lt;br /&gt;
    local query = mw.uri.getCurrentUri().query or &amp;quot;&amp;quot;&lt;br /&gt;
	local lang = query:match(&amp;quot;lang=([a-z]+)&amp;quot;) or &amp;quot;pt&amp;quot;&lt;br /&gt;
	if not (lang == &amp;quot;pt&amp;quot; or lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot;) then&lt;br /&gt;
	    lang = &amp;quot;pt&amp;quot; -- fallback&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
            local localized = skillsData[skillKey] or {}&lt;br /&gt;
            local descPT = localized.pt or sk.desc or ''&lt;br /&gt;
            local descES = localized.es or sk.desc or ''&lt;br /&gt;
            local descEN = localized.en or sk.desc or ''&lt;br /&gt;
            local descPL = localized.pl or sk.desc or ''&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', descPT)&lt;br /&gt;
			    :attr('data-desc-pt', descPT)&lt;br /&gt;
			    :attr('data-desc-es', descES)&lt;br /&gt;
			    :attr('data-desc-en', descEN)&lt;br /&gt;
			    :attr('data-desc-pl', descPL)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38233</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38233"/>
		<updated>2025-08-27T17:56:30Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
    &lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
	        local localized = skillsData[skillKey] or {}&lt;br /&gt;
	        local desc = localized[lang] or sk.desc or '' -- usar el idioma detectado&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', desc)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38232</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38232"/>
		<updated>2025-08-27T17:56:04Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
    &lt;br /&gt;
    local query = mw.uri.getCurrentUri().query or &amp;quot;&amp;quot;&lt;br /&gt;
	local lang = query:match(&amp;quot;lang=([a-z]+)&amp;quot;) or &amp;quot;pt&amp;quot;&lt;br /&gt;
	if not (lang == &amp;quot;pt&amp;quot; or lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot;) then&lt;br /&gt;
	    lang = &amp;quot;pt&amp;quot; -- fallback&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
	        local localized = skillsData[skillKey] or {}&lt;br /&gt;
	        local desc = localized[lang] or sk.desc or '' -- usar el idioma detectado&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', desc)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38231</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38231"/>
		<updated>2025-08-27T17:52:40Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
    &lt;br /&gt;
    local query = mw.uri.getCurrentUri().query or &amp;quot;&amp;quot;&lt;br /&gt;
	local lang = query:match(&amp;quot;lang=([a-z]+)&amp;quot;) or &amp;quot;pt&amp;quot;&lt;br /&gt;
	if not (lang == &amp;quot;pt&amp;quot; or lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot;) then&lt;br /&gt;
	    lang = &amp;quot;pt&amp;quot; -- fallback&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
            local localized = skillsData[skillKey] or {}&lt;br /&gt;
            local descPT = localized.pt or sk.desc or ''&lt;br /&gt;
            local descES = localized.es or sk.desc or ''&lt;br /&gt;
            local descEN = localized.en or sk.desc or ''&lt;br /&gt;
            local descPL = localized.pl or sk.desc or ''&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', descPT)&lt;br /&gt;
			    :attr('data-desc-pt', descPT)&lt;br /&gt;
			    :attr('data-desc-es', descES)&lt;br /&gt;
			    :attr('data-desc-en', descEN)&lt;br /&gt;
			    :attr('data-desc-pl', descPL)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38230</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38230"/>
		<updated>2025-08-27T17:51:47Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
    &lt;br /&gt;
    local query = mw.uri.getCurrentUri().query or &amp;quot;&amp;quot;&lt;br /&gt;
	local lang = query:match(&amp;quot;lang=([a-z]+)&amp;quot;) or &amp;quot;pt&amp;quot;&lt;br /&gt;
	if not (lang == &amp;quot;pt&amp;quot; or lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot;) then&lt;br /&gt;
	    lang = &amp;quot;pt&amp;quot; -- fallback&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
	local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
	local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
	local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
	local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
	local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
	&lt;br /&gt;
	local skillsPacked = args.skills or ''&lt;br /&gt;
	local idx = 0&lt;br /&gt;
	for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
	    local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
	    if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
	        idx = idx + 1&lt;br /&gt;
	        local name = sk.name or sk.nome or ''&lt;br /&gt;
	        local icon = sk.icon or ''&lt;br /&gt;
	        local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
	        local localized = skillsData[skillKey] or {}&lt;br /&gt;
	        local desc = localized[lang] or sk.desc or '' -- usar el idioma detectado&lt;br /&gt;
	&lt;br /&gt;
	        -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
	        local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'}, &amp;quot;, &amp;quot;)&lt;br /&gt;
	        local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
	&lt;br /&gt;
	        -- bloco do ícone&lt;br /&gt;
	        local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
	            :attr('data-index', idx)&lt;br /&gt;
	            :attr('data-nome', name)&lt;br /&gt;
	            :attr('data-desc', desc)&lt;br /&gt;
	            :attr('data-atr', attrs)&lt;br /&gt;
	            :attr('data-video', videoURL)&lt;br /&gt;
	            :attr('data-video-preload', 'auto')&lt;br /&gt;
	&lt;br /&gt;
	        iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
	&lt;br /&gt;
	        -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
	        descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38228</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38228"/>
		<updated>2025-08-27T17:44:44Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#invoke:Droflax|generate&lt;br /&gt;
 | nome    = {{{nome|}}}&lt;br /&gt;
 | avatar  = {{{avatar|}}}&lt;br /&gt;
 | tier    = {{{tier|}}}&lt;br /&gt;
 | banner  = {{{banner|}}}&lt;br /&gt;
 | desc    = {{{desc|}}}&lt;br /&gt;
 | classe  = {{{classe|}}}&lt;br /&gt;
 | artwork = {{{artwork|}}}&lt;br /&gt;
&lt;br /&gt;
 | skills  = {{{skills|}}}&lt;br /&gt;
 | skins   = {{{skins|}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#widget:Teste}}&lt;br /&gt;
{{#widget:Droflax}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38223</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38223"/>
		<updated>2025-08-27T17:30:40Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
            local localized = skillsData[skillKey] or {}&lt;br /&gt;
            local descPT = localized.pt or sk.desc or ''&lt;br /&gt;
            local descES = localized.es or sk.desc or ''&lt;br /&gt;
            local descEN = localized.en or sk.desc or ''&lt;br /&gt;
            local descPL = localized.pl or sk.desc or ''&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon')&lt;br /&gt;
			    :attr('data-index', idx)&lt;br /&gt;
			    :attr('data-nome', name)&lt;br /&gt;
			    :attr('data-desc', descPT)&lt;br /&gt;
			    :attr('data-desc-pt', descPT)&lt;br /&gt;
			    :attr('data-desc-es', descES)&lt;br /&gt;
			    :attr('data-desc-en', descEN)&lt;br /&gt;
			    :attr('data-desc-pl', descPL)&lt;br /&gt;
			    :attr('data-atr', attrs)&lt;br /&gt;
			    :attr('data-video', videoURL)&lt;br /&gt;
			    :attr('data-video-preload', 'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38222</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38222"/>
		<updated>2025-08-27T17:26:38Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#invoke:Droflax|generate&lt;br /&gt;
 | nome    = {{{nome|}}}&lt;br /&gt;
 | avatar  = {{{avatar|}}}&lt;br /&gt;
 | tier    = {{{tier|}}}&lt;br /&gt;
 | banner  = {{{banner|}}}&lt;br /&gt;
 | desc    = {{{desc|}}}&lt;br /&gt;
 | classe  = {{{classe|}}}&lt;br /&gt;
 | artwork = {{{artwork|}}}&lt;br /&gt;
&lt;br /&gt;
 | skills  = {{{skills|}}}&lt;br /&gt;
 | skins   = {{{skins|}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#widget:Teste}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38220</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38220"/>
		<updated>2025-08-27T17:25:09Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Kalifa&lt;br /&gt;
return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        kick = {&lt;br /&gt;
            pt = &amp;quot;Kalifa dá um poderoso chute em seu inimigo.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa da una poderosa patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;Kalifa delivers a powerful kick to her enemy.&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;Kalifa zadaje potężnego kopniaka przeciwnikowi.&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        ibararoad = {&lt;br /&gt;
            pt = &amp;quot;Kalifa gira seu chicote...&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa gira su látigo...&amp;quot;,&lt;br /&gt;
            en = &amp;quot;Kalifa spins her whip...&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;Kalifa kręci swoim biczem...&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38219</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38219"/>
		<updated>2025-08-27T17:25:06Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module:Teste (refactor to English class names)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skin vinda de {{skin}}&lt;br /&gt;
function p.skin(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        sprite = a.sprite or '',&lt;br /&gt;
        background = a.background or '',&lt;br /&gt;
        tooltip = a.tooltip or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Serializa uma skill vinda de {{skill}}&lt;br /&gt;
function p.skill(frame)&lt;br /&gt;
    local a = frame.args&lt;br /&gt;
    local obj = {&lt;br /&gt;
        name = a.name or a.nome or '',&lt;br /&gt;
        icon = a.icon or '',&lt;br /&gt;
        level = tonumber(a.level) or nil,&lt;br /&gt;
        desc = a.desc or '',&lt;br /&gt;
        energy = a.energy or nil,&lt;br /&gt;
        powerpve = a.powerpve or nil,&lt;br /&gt;
        powerpvp = a.powerpvp or nil,&lt;br /&gt;
        cooldown = a.cooldown or nil,&lt;br /&gt;
        video = a.video or ''&lt;br /&gt;
    }&lt;br /&gt;
    return mw.text.jsonEncode(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Componente principal (apenas novo modelo via |skills= e |skins=)&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local function fileURL(name)&lt;br /&gt;
        return tostring(mw.uri.fullUrl('Special:FilePath/' .. (name or '')))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Cargar datos de traducción desde módulo de personaje&lt;br /&gt;
    local characterData = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
    local skillsData = characterData.skills or {}&lt;br /&gt;
&lt;br /&gt;
    -- Tier -&amp;gt; classe css&lt;br /&gt;
    local tierRaw = args.tier or &amp;quot;&amp;quot;&lt;br /&gt;
    local tierKey = mw.ustring.lower(tierRaw)&lt;br /&gt;
    local tierMap = {&lt;br /&gt;
        bronze = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        bronce = &amp;quot;tier-bronze&amp;quot;,&lt;br /&gt;
        silver = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        prata = &amp;quot;tier-silver&amp;quot;,&lt;br /&gt;
        gold = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        ouro = &amp;quot;tier-gold&amp;quot;,&lt;br /&gt;
        diamond = &amp;quot;tier-diamond&amp;quot;,&lt;br /&gt;
        diamante = &amp;quot;tier-diamond&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    local tierClass = tierMap[tierKey]&lt;br /&gt;
&lt;br /&gt;
    -- Raiz&lt;br /&gt;
    local box = html:tag('div'):addClass('character-box')&lt;br /&gt;
    if tierClass then&lt;br /&gt;
        box:addClass(tierClass)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Header / topbar&lt;br /&gt;
    local header = box:tag('div'):addClass('character-header')&lt;br /&gt;
    local topbar = header:tag('div'):addClass('character-topbar')&lt;br /&gt;
    local nameBox = topbar:tag('div'):addClass('character-name-box')&lt;br /&gt;
&lt;br /&gt;
    local avatarImg = args.avatar or 'Franky_ts_medal.png'&lt;br /&gt;
    nameBox:wikitext(string.format('[[Arquivo:%s|class=topbar-icon|link=|alt=Avatar]]', avatarImg))&lt;br /&gt;
&lt;br /&gt;
    local nameGroup = nameBox:tag('div'):addClass('character-name-group')&lt;br /&gt;
    nameGroup:tag('div'):addClass('character-name'):wikitext(args.nome or '')&lt;br /&gt;
&lt;br /&gt;
    local classTags = nameGroup:tag('div'):addClass('class-tags')&lt;br /&gt;
    if tierRaw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        classTags:tag('div'):addClass('class-tag tier'):wikitext(tierRaw)&lt;br /&gt;
    end&lt;br /&gt;
    local classeString = args.classe or ''&lt;br /&gt;
    for classe in mw.text.gsplit(classeString, '/', true) do&lt;br /&gt;
        if classe and classe ~= '' then&lt;br /&gt;
            classTags:tag('div'):addClass('class-tag'):wikitext(classe)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    header:tag('div'):addClass('topbar-description'):wikitext(args.desc or '')&lt;br /&gt;
&lt;br /&gt;
    -- Banner (se existir arquivo)&lt;br /&gt;
    local banner = args.banner or ''&lt;br /&gt;
    local bannerTitle = (banner ~= '' and mw.title.new('Arquivo:' .. banner)) or nil&lt;br /&gt;
    if bannerTitle and bannerTitle.exists then&lt;br /&gt;
        header:tag('div'):addClass('banner'):wikitext(string.format(&lt;br /&gt;
            '[[Arquivo:%s|class=banner-image|link=|alt=Banner]]', banner))&lt;br /&gt;
    else&lt;br /&gt;
        header:tag('div'):addClass('banner')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Abas&lt;br /&gt;
    local tabs = header:tag('div'):addClass('character-tabs')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn active'):attr('data-tab', 'skills'):wikitext('Skills')&lt;br /&gt;
    tabs:tag('div'):addClass('tab-btn'):attr('data-tab', 'skins'):wikitext('Skins')&lt;br /&gt;
&lt;br /&gt;
    -- Artwork: parameter accepted for compatibility but intentionally not rendered in UI.&lt;br /&gt;
    -- (CSS forces .character-art display:none so legacy pages don't break layout)&lt;br /&gt;
    -- local artImg = args.artwork or 'Franky_ts_splash.png' -- ignored on purpose&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKILLS =====&lt;br /&gt;
    local skillsTab = box:tag('div'):addClass('tab-content active'):attr('id', 'skills')&lt;br /&gt;
    local iconBar = skillsTab:tag('div'):addClass('icon-bar')&lt;br /&gt;
    local skillsContainer = skillsTab:tag('div'):addClass('skills-container')&lt;br /&gt;
    local details = skillsContainer:tag('div'):addClass('skills-details')&lt;br /&gt;
    local descBox = details:tag('div'):addClass('desc-box')&lt;br /&gt;
&lt;br /&gt;
    local skillsPacked = args.skills or ''&lt;br /&gt;
    local idx = 0&lt;br /&gt;
    for obj in skillsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; and (sk.name or sk.nome) and (sk.name ~= '' or sk.nome ~= '') then&lt;br /&gt;
            idx = idx + 1&lt;br /&gt;
            local name = sk.name or sk.nome or ''&lt;br /&gt;
            local icon = sk.icon or ''&lt;br /&gt;
            local skillKey = string.lower(name:gsub(&amp;quot;%s+&amp;quot;, &amp;quot;&amp;quot;)) -- llave para Module:Kalifa&lt;br /&gt;
            local localized = skillsData[skillKey] or {}&lt;br /&gt;
            local descPT = localized.pt or sk.desc or ''&lt;br /&gt;
            local descES = localized.es or sk.desc or ''&lt;br /&gt;
            local descEN = localized.en or sk.desc or ''&lt;br /&gt;
            local descPL = localized.pl or sk.desc or ''&lt;br /&gt;
            -- ordem esperada pelo JS: PVE, PVP, Energia, Recarga&lt;br /&gt;
            local attrs = table.concat({sk.powerpve or '-', sk.powerpvp or '-', sk.energy or '-', sk.cooldown or '-'},&lt;br /&gt;
                &amp;quot;, &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local videoURL = (sk.video and sk.video ~= '') and fileURL(sk.video) or ''&lt;br /&gt;
&lt;br /&gt;
            -- bloco do ícone&lt;br /&gt;
            local iconWrap = iconBar:tag('div'):addClass('skill-icon'):attr('data-index', idx):attr('data-nome', name)&lt;br /&gt;
                :attr('data-desc', desc):attr('data-atr', attrs):attr('data-video', videoURL):attr('data-video-preload',&lt;br /&gt;
                    'auto')&lt;br /&gt;
&lt;br /&gt;
            iconWrap:wikitext(string.format('[[Arquivo:%s|class=skill-icon-img|link=]]', icon))&lt;br /&gt;
&lt;br /&gt;
            -- placeholder por índice (se precisar no DOM)&lt;br /&gt;
            descBox:tag('div'):addClass('skill-desc'):attr('data-index', idx)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    details:done()&lt;br /&gt;
    skillsContainer:tag('div'):addClass('video-container'):done()&lt;br /&gt;
    skillsTab:done()&lt;br /&gt;
&lt;br /&gt;
    -- ===== SKINS =====&lt;br /&gt;
    local skinsTab = box:tag('div'):addClass('tab-content'):attr('id', 'skins')&lt;br /&gt;
    local cardSkins = skinsTab:tag('div'):addClass('card-skins')&lt;br /&gt;
    cardSkins:tag('span'):addClass('card-skins-title'):wikitext('SKINS &amp;amp; SPOTLIGHTS')&lt;br /&gt;
&lt;br /&gt;
    local wrapper = cardSkins:tag('div'):addClass('skins-carousel-wrapper')&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow left'):wikitext('«')&lt;br /&gt;
    local carousel = wrapper:tag('div'):addClass('skins-carousel')&lt;br /&gt;
&lt;br /&gt;
    local skinsPacked = args.skins or ''&lt;br /&gt;
    for obj in skinsPacked:gmatch(&amp;quot;%b{}&amp;quot;) do&lt;br /&gt;
        local ok, sk = pcall(mw.text.jsonDecode, obj)&lt;br /&gt;
        if ok and type(sk) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local bannerFile = sk.background or ''&lt;br /&gt;
            local imageFile = sk.sprite or ''&lt;br /&gt;
            local tooltipRaw = sk.tooltip or ''&lt;br /&gt;
            local tooltipHtml = tooltipRaw:gsub(&amp;quot;'''([^']+)'''&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;%1&amp;lt;/b&amp;gt;&amp;quot;):gsub(&amp;quot;\n&amp;quot;, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            local skinCard = carousel:tag('div')&lt;br /&gt;
                :addClass('skin-card simple-tooltip simple-tooltip-inline tooltipstered'):attr('data-simple-tooltip',&lt;br /&gt;
                    tooltipHtml)&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-banner'):wikitext(bannerFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', bannerFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'banner')&lt;br /&gt;
&lt;br /&gt;
            skinCard:tag('div'):addClass('skin-sprite'):wikitext(imageFile ~= '' and&lt;br /&gt;
                                                                     string.format('[[Arquivo:%s|link=]]', imageFile) or&lt;br /&gt;
                                                                     ''):attr('alt', 'skin')&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    wrapper:tag('div'):addClass('skins-arrow right'):wikitext('»')&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38218</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38218"/>
		<updated>2025-08-27T17:03:42Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38217</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38217"/>
		<updated>2025-08-27T17:03:37Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38216</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38216"/>
		<updated>2025-08-27T17:03:34Z</updated>

		<summary type="html">&lt;p&gt;Droflax: Limpou toda a página&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38214</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38214"/>
		<updated>2025-08-27T17:00:19Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Detecta idioma desde la predefinición o usa pt por defecto&lt;br /&gt;
local function getLang(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local lang = args.lang&lt;br /&gt;
    if lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot; then&lt;br /&gt;
        return lang&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;pt&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local lang = getLang(frame)&lt;br /&gt;
    local data = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
&lt;br /&gt;
    html:tag('h2'):wikitext(args.name or &amp;quot;Personaje&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local skillsRaw = args.skills or &amp;quot;&amp;quot;&lt;br /&gt;
    for skillKey in skillsRaw:gmatch(&amp;quot;([^,%s]+)&amp;quot;) do&lt;br /&gt;
        local key = skillKey:lower()&lt;br /&gt;
        local desc = &amp;quot;&amp;quot;&lt;br /&gt;
        if data.skills and data.skills[key] then&lt;br /&gt;
            desc = data.skills[key][lang] or data.skills[key][&amp;quot;pt&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        html:tag('p'):wikitext(skillKey .. &amp;quot;: &amp;quot; .. desc)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38212</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38212"/>
		<updated>2025-08-27T16:59:10Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Droflax|generate&lt;br /&gt;
|name={{{name|}}}&lt;br /&gt;
|skills={{{skills|}}} &amp;lt;!-- ejemplo: Kick,Shield --&amp;gt;&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38211</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38211"/>
		<updated>2025-08-27T16:58:58Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Detecta idioma en URL (?lang=es, etc.)&lt;br /&gt;
local function getLang()&lt;br /&gt;
    local lang = mw.request.getQueryValue(&amp;quot;lang&amp;quot;)&lt;br /&gt;
    if lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot; then&lt;br /&gt;
        return lang&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;pt&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local lang = getLang()&lt;br /&gt;
    local data = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
&lt;br /&gt;
    html:tag('h2'):wikitext(args.name or &amp;quot;Personaje&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- Para este ejemplo, las habilidades se pasan separadas por comas&lt;br /&gt;
    local skillsRaw = args.skills or &amp;quot;&amp;quot;&lt;br /&gt;
    for skillKey in skillsRaw:gmatch(&amp;quot;([^,%s]+)&amp;quot;) do&lt;br /&gt;
        local key = skillKey:lower()&lt;br /&gt;
        local desc = &amp;quot;&amp;quot;&lt;br /&gt;
        if data.skills and data.skills[key] then&lt;br /&gt;
            desc = data.skills[key][lang] or data.skills[key][&amp;quot;pt&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        html:tag('p'):wikitext(skillKey .. &amp;quot;: &amp;quot; .. desc)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38209</id>
		<title>Predefinição:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Predefini%C3%A7%C3%A3o:Droflax&amp;diff=38209"/>
		<updated>2025-08-27T16:58:04Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Droflax|generate&lt;br /&gt;
|name={{{name|}}}&lt;br /&gt;
|skills={{{skills|}}}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38208</id>
		<title>Módulo:Droflax</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Droflax&amp;diff=38208"/>
		<updated>2025-08-27T16:57:54Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Detecta idioma en URL (?lang=es, etc.)&lt;br /&gt;
local function getLang()&lt;br /&gt;
    local lang = mw.request.getQueryValue(&amp;quot;lang&amp;quot;)&lt;br /&gt;
    if lang == &amp;quot;es&amp;quot; or lang == &amp;quot;en&amp;quot; or lang == &amp;quot;pl&amp;quot; then&lt;br /&gt;
        return lang&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;pt&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Función principal que recibe args de la predefinición&lt;br /&gt;
function p.generate(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local html = mw.html.create('div')&lt;br /&gt;
&lt;br /&gt;
    local lang = getLang()&lt;br /&gt;
    local data = mw.loadData(&amp;quot;Module:Kalifa&amp;quot;) or {}&lt;br /&gt;
&lt;br /&gt;
    html:tag('h2'):wikitext(args.name or &amp;quot;Personaje&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local skillsRaw = args.skills or &amp;quot;&amp;quot;&lt;br /&gt;
    for skillKey in skillsRaw:gmatch(&amp;quot;%S+&amp;quot;) do&lt;br /&gt;
        local key = skillKey:lower()&lt;br /&gt;
        local desc = &amp;quot;&amp;quot;&lt;br /&gt;
        if data.skills and data.skills[key] then&lt;br /&gt;
            desc = data.skills[key][lang] or data.skills[key][&amp;quot;pt&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        html:tag('p'):wikitext(key .. &amp;quot;: &amp;quot; .. desc)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38207</id>
		<title>Módulo:Kalifa</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=M%C3%B3dulo:Kalifa&amp;diff=38207"/>
		<updated>2025-08-27T16:57:42Z</updated>

		<summary type="html">&lt;p&gt;Droflax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
    skills = {&lt;br /&gt;
        kick = {&lt;br /&gt;
            pt = &amp;quot;Kalifa dá um poderoso chute em seu inimigo.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Kalifa da una poderosa patada a su enemigo.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;Kalifa delivers a powerful kick to her enemy.&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;Kalifa zadaje potężnego kopniaka przeciwnikowi.&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        shield = {&lt;br /&gt;
            pt = &amp;quot;Cria um escudo protetor por 5 segundos.&amp;quot;,&lt;br /&gt;
            es = &amp;quot;Crea un escudo protector por 5 segundos.&amp;quot;,&lt;br /&gt;
            en = &amp;quot;Creates a protective shield for 5 seconds.&amp;quot;,&lt;br /&gt;
            pl = &amp;quot;Tworzy tarczę ochronną na 5 sekund.&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Droflax</name></author>
	</entry>
</feed>