<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Inicio on Kakele Online MMORPG: Juego Multiplataforma Píxel Gratuito</title><link>https://kakele.io/es/</link><description>Recent content in Inicio on Kakele Online MMORPG: Juego Multiplataforma Píxel Gratuito</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>© 2012-2026 ViVa Games. All rights reserved.</copyright><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kakele.io/es/index.xml" rel="self" type="application/rss+xml"/><item><title>Fuegos, Bailes y Dragones: Guía del Nuevo Evento de Kakele MMORPG</title><link>https://kakele.io/es/news/the-solstice-festival/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://kakele.io/es/news/the-solstice-festival/</guid><description>¡El solsticio de verano llegó a Kakele Online! Conoce el evento inspirado en la Noche de Kupala y el legendario Dragón de Wawel, con mecánicas comunitarias y recompensas exclusivas.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/the-solstice-festival/featured.png"/></item><item><title>¿El cielo se derrumbará en Kakele?! Descubre las mecánicas de Hymalaya en la nueva expansión de nuestro MMORPG 2D</title><link>https://kakele.io/es/news/spoiler-hymalaya/</link><pubDate>Thu, 21 May 2026 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/spoiler-hymalaya/</guid><description>Nina, la capibara residente del blog, responde las preguntas de los jugadores sobre la nueva expansión de Kakele. Ella explica la trágica lore detrás de la división del reino congelado de Hymalaya en dos partes — Hyma y Laya —, el sufrimiento del Rey de la Noche y da un consejo directo sobre cómo resolver la nueva mecánica de esferas para avanzar en misiones.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/spoiler-hymalaya/featured.png"/></item><item><title>¡Lanzamiento del Servidor SA-Open PvP Black y El Desafío del Cazador!</title><link>https://kakele.io/es/news/south-america-black/</link><pubDate>Tue, 31 Mar 2026 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/south-america-black/</guid><description>Un nuevo servidor South America Open PvP se lanza el 2 de abril con inicio desde cero en el Nivel 1, combate rebalanceado y una competencia de Bestiario de una semana con premios de Premium.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/south-america-black/featured.png"/></item><item><title>La Canción del Hielo Eterno</title><link>https://kakele.io/es/news/song-of-eternal-ice/</link><pubDate>Thu, 15 Jan 2026 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/song-of-eternal-ice/</guid><description>La primera expansión de 2026 para el MMORPG 2D gratis y multiplataforma: renovación visual completa, grandes mejoras de interfaz, nuevos eventos, rebalanceo de PvP y muchísimas mejoras de calidad de vida impulsadas por la comunidad.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/song-of-eternal-ice/featured.png"/></item><item><title>El Continente de Gangan</title><link>https://kakele.io/es/news/continent-of-gangan/</link><pubDate>Thu, 10 Jul 2025 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/continent-of-gangan/</guid><description>¡La expansión más esperada del año ha llegado! Descubre el místico continente de Gangan con temática oriental, con actualizaciones masivas de contenido, nuevos sistemas y mejoras de calidad de vida.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/continent-of-gangan/featured.png"/></item><item><title>Los Orcos de Walfendah</title><link>https://kakele.io/es/news/orcs-of-walfendah/</link><pubDate>Mon, 02 Dec 2024 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/orcs-of-walfendah/</guid><description>¡Es hora de compartir con ustedes los cambios planeados de la expansión 4.9! Primero que nada, decidimos renombrar la expansión 4.9 a 2024.3. Este nuevo nombre es más claro e intuitivo. De ahora en adelante, usaremos esta plantilla para futuras expansiones (2025.1, 2025.2, etc&amp;hellip;).</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/orcs-of-walfendah/featured.png"/></item><item><title>El Levantamiento de los Ciborgs</title><link>https://kakele.io/es/news/ciborgs-uprising/</link><pubDate>Fri, 30 Aug 2024 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/ciborgs-uprising/</guid><description>Estamos emocionados de traerles algo que todos han estado esperando ansiosamente: ¡el lanzamiento de la Expansión 4.8 del Juego Kakele! Esta expansión está llena de nuevas características emocionantes, una gran cantidad de mejoras y un montón de contenido fresco que sabemos que van a amar.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/ciborgs-uprising/featured.png"/></item><item><title>La Isla de Sohterra</title><link>https://kakele.io/es/news/island-of-sohterra/</link><pubDate>Fri, 22 Mar 2024 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/island-of-sohterra/</guid><description>Estamos emocionados de anunciar algo que todos han estado esperando ansiosamente: ¡el lanzamiento de la nueva Expansión del Juego Kakele, Expansión 4.7!</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/island-of-sohterra/featured.jpg"/></item><item><title>La Isla de Saint Mardi</title><link>https://kakele.io/es/news/island-of-saint-mardi/</link><pubDate>Sat, 25 Nov 2023 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/island-of-saint-mardi/</guid><description>¡Descubran la misteriosa isla de Saint Mardi en Kakele 4.6! Nuevo contenido, aventuras y desafíos los esperan en esta emocionante actualización al mundo de Kakele.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/island-of-saint-mardi/featured.png"/></item><item><title>Las Minas Enanas</title><link>https://kakele.io/es/news/dwarven-mines/</link><pubDate>Tue, 25 Jul 2023 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/dwarven-mines/</guid><description>¿Están listos para el nuevo contenido que abarca niveles 50-800+? Descubran las nuevas montañas y minas enanas y adéntrense en la exploración de sus cuevas.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/dwarven-mines/featured.png"/></item><item><title>Las Tierras Subacuáticas Místicas</title><link>https://kakele.io/es/news/mystical-underwater-lands/</link><pubDate>Fri, 21 Apr 2023 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/mystical-underwater-lands/</guid><description>¡Bienvenidos a la actualización 4.4 y las tierras subacuáticas místicas de Kakele, hogar del reino de sirenas Maio, bosques de coral y ruinas hundidas!</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/mystical-underwater-lands/featured.jpg"/></item><item><title>Sobre las Nubes de Choia</title><link>https://kakele.io/es/news/over-the-clouds-of-choia/</link><pubDate>Sat, 31 Dec 2022 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/over-the-clouds-of-choia/</guid><description>¡Ha llegado el momento de darles las grandes noticias sobre la próxima actualización! Los cíclopes están ansiosos por desafiarlos a luchas épicas, batallas de jefes y rompecabezas.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/over-the-clouds-of-choia/featured.jpg"/></item><item><title>Los Bastardos de la Luz</title><link>https://kakele.io/es/news/bastards-of-light/</link><pubDate>Sat, 09 Jul 2022 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/bastards-of-light/</guid><description>¡Bienvenidos a la Actualización 4.2 de Kakele! Hemos estado ocupados arreglando errores, rehaciendo características existentes y añadiendo nuevas cosas al juego.</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/bastards-of-light/featured.jpg"/></item><item><title>El Continente Oscuro</title><link>https://kakele.io/es/news/dark-continent/</link><pubDate>Thu, 28 Apr 2022 10:00:00 +0000</pubDate><guid>https://kakele.io/es/news/dark-continent/</guid><description>¡Estamos emocionados de anunciar la nueva actualización, Kakele 4.1! Es la primera actualización después de que hemos completado 2 años en línea, ¡y no podemos esperar a lanzarla!</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://kakele.io/news/dark-continent/featured.jpg"/></item><item><title>¡Bienvenido a Kakele Online!</title><link>https://kakele.io/es/welcome/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/welcome/</guid><description>&lt;style>
.centered-image {
display: flex;
justify-content: center;
align-items: center;
max-width: 100%;
}
.centered-image img {
max-width: 100%;
height: auto;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
&lt;/style>
&lt;div class="centered-image">&lt;img src="https://kakele.io/images/kakele.webp" alt="Bienvenido a Kakele Online"
width="450" height="250"
/>
&lt;/div>
&lt;p>¡Este es nuestro sitio web! Contiene información adicional sobre el juego, el personal del juego, la comunidad y más. Cuando tengas tiempo, dedica unos minutos a navegar por aquí. No olvides unirte a nuestras comunidades, donde puedes conocer más jugadores de Kakele.&lt;/p></description></item><item><title>Asociación</title><link>https://kakele.io/es/partnership/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/partnership/</guid><description>&lt;h2 class="relative group">¿Qué tipo de programas de asociación están disponibles?
&lt;div id="qué-tipo-de-programas-de-asociación-están-disponibles" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#qu%c3%a9-tipo-de-programas-de-asociaci%c3%b3n-est%c3%a1n-disponibles" aria-label="Ancla">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>¡Damos la bienvenida a cualquiera que quiera ayudarnos a crecer! Para formalizar y organizar las cosas un poco más, actualmente ofrecemos dos tipos de Asociación:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Creador de contenido&lt;/strong>: aquellos que hacen contenido en YouTube, Twitch y otras plataformas de video sobre Kakele;&lt;/li>
&lt;li>&lt;strong>Fansite&lt;/strong>: aquellos que crean un sitio web o blog con información sobre el juego&lt;/li>
&lt;li>&lt;strong>¿Tienes otras ideas para asociaciones?&lt;/strong> ¡Envíanos un email a &lt;a
href="mailto:contact@kakele.io?subject=Partnership%20Inquiry">contact@kakele.io&lt;/a>
!&lt;/li>
&lt;/ul>
&lt;h2 class="relative group">¿Qué hay para mí?
&lt;div id="qué-hay-para-mí" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#qu%c3%a9-hay-para-m%c3%ad" aria-label="Ancla">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>¡Eres libre de crear cualquier contenido que desees como Socio de Kakele! Como entusiasta del juego, tu objetivo debería ser crear tu propia comunidad y aumentar tu presencia en la plataforma de streaming que estés usando. ¡Con eso estarás creciendo en número de suscriptores y espectadores! ¡Además, todo eso es para que te lo quedes!&lt;/p></description></item><item><title>Contacto y Acerca de</title><link>https://kakele.io/es/contact-about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/contact-about/</guid><description>&lt;p>Para contactarnos envía un email a &lt;a
href="mailto:contact@kakele.io">contact@kakele.io&lt;/a>
. También estamos disponibles para chatear a través de nuestras cuentas de redes sociales y Discord, que puedes encontrar en la parte inferior de cualquier página del sitio web.&lt;/p>
&lt;p>Kakele está desarrollado por ViVa Games LLC. Para contacto o consultas:&lt;/p>
&lt;p>&lt;strong>Empresa:&lt;/strong> ViVa Games LLC&lt;br>
&lt;strong>Dirección:&lt;/strong> 1501 Lincoln Blvd Num 1138, Venice, CA 90291, USA&lt;br>
&lt;strong>Email:&lt;/strong> &lt;a
href="mailto:contact@kakele.io">contact@kakele.io&lt;/a>
&lt;/p>
&lt;p>&lt;strong>Sitio Web de ViVa Games:&lt;/strong> &lt;a
href="https://vivagames.online"
target="_blank"
>vivagames.online&lt;/a>
&lt;/p>
&lt;h2 class="relative group">Acerca de Kakele
&lt;div id="acerca-de-kakele" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#acerca-de-kakele" aria-label="Ancla">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>Kakele Online es un MMORPG 2D clásico inspirado en juegos RPG clásicos. ¡Tratamos de reunir la mejor experiencia de juego de todos los RPGs clásicos en un solo juego, Kakele! En Kakele pasas tu tiempo luchando contra monstruos, explorando el mundo, encontrando cofres del tesoro, haciendo alianzas o declarando guerras contra otros. Una trivia del juego: la gente no suele pronunciar el nombre del juego correctamente. La última letra, e, debería ser la más fuerte, igual que en &amp;lsquo;Pelé&amp;rsquo;, el mejor jugador de fútbol de todos los tiempos :)&lt;/p></description></item><item><title>Descargas</title><link>https://kakele.io/es/downloads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/downloads/</guid><description>&lt;p>¡Te recomendamos encarecidamente que instales Kakele a través de las tiendas oficiales de juegos! ¡Tu juego se actualizará automáticamente y evitarás errores del juego de esta manera! &lt;a
href="https://kakele.io/es">Visita nuestras tiendas oficiales de juegos&lt;/a>
para acceder a las descargas oficiales. Los enlaces de abajo son descargas directas que requieren actualizaciones manuales. Recomendamos usar las tiendas oficiales de aplicaciones para actualizaciones automáticas.&lt;/p>
&lt;p>Si aún deseas instalar Kakele manualmente, por favor revisa las opciones a continuación:&lt;/p></description></item><item><title>Drops de Twitch</title><link>https://kakele.io/es/drops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/drops/</guid><description>&lt;p>COPIA Y PEGA el código de abajo dentro de la aplicación cliente del juego:&lt;/p>
&lt;style>
.oauth-code-container {
background: #f5f5f5;
border: 2px solid #ddd;
border-radius: 8px;
padding: 1rem;
margin: 1rem 0;
font-family: monospace;
word-break: break-all;
min-height: 60px;
display: flex;
align-items: center;
justify-content: center;
}
.oauth-code-container p {
margin: 0;
font-size: 1rem;
color: #ff0000;
}
&lt;/style>
&lt;div id="twitch-code" class="oauth-code-container">
&lt;div>
&lt;p>&lt;/p>
&lt;/div>
&lt;/div>
&lt;script>
let str = window.location.href;
let paramName = 'code';
let endDelimiter = '\u0026scope=';
let tokenStartPosition = str.indexOf(paramName + '=') + paramName.length + 1;
let tokenEndPosition = str.indexOf(endDelimiter);
let tokenString = str.substr(tokenStartPosition, tokenEndPosition - tokenStartPosition);
let el = document.getElementById('twitch-code').querySelector('div p')
el.style.wordBreak = "break-all";
el.innerHTML = tokenString;
navigator.clipboard.writeText(tokenString);
&lt;/script></description></item><item><title>Enlace de Discord</title><link>https://kakele.io/es/discord-link/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/discord-link/</guid><description>&lt;p>COPIA Y PEGA el código de abajo dentro de la aplicación cliente del juego:&lt;/p>
&lt;style>
.oauth-code-container {
background: #f5f5f5;
border: 2px solid #ddd;
border-radius: 8px;
padding: 1rem;
margin: 1rem 0;
font-family: monospace;
word-break: break-all;
min-height: 60px;
display: flex;
align-items: center;
justify-content: center;
}
.oauth-code-container p {
margin: 0;
font-size: 1rem;
color: #ff0000;
}
&lt;/style>
&lt;div id="discord-code" class="oauth-code-container">
&lt;div>
&lt;p>&lt;/p>
&lt;/div>
&lt;/div>
&lt;script>
let str = window.location.href;
let paramName = 'access_token';
let endDelimiter = '\u0026expires_in=';
let tokenStartPosition = str.indexOf(paramName + '=') + paramName.length + 1;
let tokenEndPosition = str.indexOf(endDelimiter);
let tokenString = str.substr(tokenStartPosition, tokenEndPosition - tokenStartPosition);
let el = document.getElementById('discord-code').querySelector('div p')
el.style.wordBreak = "break-all";
el.innerHTML = tokenString;
navigator.clipboard.writeText(tokenString);
&lt;/script></description></item><item><title>FAQ</title><link>https://kakele.io/es/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/faq/</guid><description>&lt;p>¡Hola! Si alguna de estas preguntas está desactualizada o si crees que deberíamos agregar nuevas preguntas, ¡por favor contáctanos en &lt;a
href="mailto:contact@kakele.io">contact@kakele.io&lt;/a>
! ¡Gracias!&lt;/p>
&lt;p>Importante: Asegúrate siempre de leer la versión más reciente del FAQ, ya que lo actualizamos regularmente con nuevas preguntas y respuestas. El FAQ puede quedar desactualizado tras nuevas expansiones del juego. Este FAQ está actualizado con la versión 2026.1.1 de Kakele.&lt;/p>
&lt;h2 class="relative group">Preguntas Generales
&lt;div id="preguntas-generales" class="anchor">&lt;/div>
&lt;span
class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100">
&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700 !no-underline" href="#preguntas-generales" aria-label="Ancla">#&lt;/a>
&lt;/span>
&lt;/h2>
&lt;p>&lt;strong>P:&lt;/strong> ¿Qué es Kakele Online?&lt;br>
&lt;strong>R:&lt;/strong> Kakele Online es un juego 2D multijugador masivo en línea de mundo abierto. En Kakele, te unes con jugadores de todo el mundo para luchar contra monstruos, explorar cuevas misteriosas, completar misiones y tareas, recoger objetos valiosos, ¡y mucho más!&lt;/p></description></item><item><title>Muro de Ofertas</title><link>https://kakele.io/es/offerwall/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/offerwall/</guid><description>&lt;p>
&lt;style>
.offerwall-iframe-container {
width: 100%;
margin: 0;
padding: 0;
}
@media (max-width: 1024px) {
.offerwall-iframe-container {
position: relative;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
width: 100vw;
padding: 0;
}
.offerwall-iframe-container iframe {
width: 100vw;
border-radius: 0;
}
article header h1 {
display: none;
}
article section {
margin-top: 0;
}
}
.offerwall-iframe-container iframe[src=""] {
display: none;
}
.offerwall-iframe-container iframe[src]:not([src=""]) {
display: block;
}
&lt;/style>
&lt;div class="offerwall-iframe-container">
&lt;iframe id="offerwall" title="Offerwall" height="650px" width="100%" style="border: none; border-radius: 8px;"
sandbox="allow-downloads allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts allow-top-navigation allow-top-navigation-by-user-activation allow-top-navigation-to-custom-protocols allow-storage-access-by-user-activation allow-document-domain allow-camera allow-microphone allow-display-capture allow-clipboard-read allow-clipboard-write allow-geolocation allow-payment"
src="">
&lt;/iframe>
&lt;/div>
&lt;style>
.shop-login-wrapper {
max-width: 500px;
margin: 0 auto;
padding: 1rem;
}
.shop-login-form-group {
margin-bottom: 1rem;
}
.shop-login-form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
}
.shop-login-form-group input {
width: 100%;
padding: 0.5rem;
color: #000;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
.shop-login-form-group input:disabled {
background-color: #f5f5f5;
color: #666;
cursor: not-allowed;
opacity: 0.6;
}
.shop-login-actions {
text-align: center;
margin: 1rem 0;
}
.shop-login-actions button {
margin: 0 0.5rem;
padding: 0.75rem 1.5rem;
background-color: rgb(153, 27, 27);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
font-weight: bold;
}
.shop-login-actions button:hover {
background-color: rgb(133, 17, 17);
}
.shop-login-actions button:disabled {
background-color: #666;
cursor: not-allowed;
opacity: 0.5;
}
.shop-login-status {
text-align: center;
margin-top: 1rem;
padding: 0.5rem;
border-radius: 4px;
}
.shop-login-status.shop-login-success {
color: #10b981;
background-color: #d1fae5;
}
.shop-login-status.shop-login-error {
color: #ef4444;
background-color: #fee2e2;
}
&lt;/style>
&lt;div class="shop-login-wrapper" id="shop-login-wrapper">
&lt;form id="shop-login-form" novalidate>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-email">Email de la Cuenta Kakele:&lt;/label>
&lt;input type="email" id="shop-login-email" name="email" required placeholder="tu@email.com" />
&lt;/div>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-player">Nombre del Personaje:&lt;/label>
&lt;input type="text" id="shop-login-player" name="player_name" required placeholder="Nombre de tu personaje" />
&lt;/div>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-streamer">(Opcional) Código de Streamer:&lt;/label>
&lt;input type="text" id="shop-login-streamer" name="streamer_code" placeholder="(Opcional) Código de streamer" />
&lt;/div>
&lt;div class="shop-login-actions">
&lt;button type="submit" id="shop-login-submit">Iniciar Sesión&lt;/button>
&lt;/div>
&lt;div class="shop-login-status" id="shop-login-status">&lt;/div>
&lt;/form>
&lt;/div>
&lt;script>
(function () {
const form = document.getElementById('shop-login-form');
const statusEl = document.getElementById('shop-login-status');
const submitBtn = document.getElementById('shop-login-submit');
const elementId = 'offerwall';
const baseUrl = 'https:\/\/offerwall.kakele.io\/';
document.addEventListener('DOMContentLoaded', function () {
populateUserFormFromUrl('shop-login-email', 'shop-login-player', 'shop-login-streamer');
});
window.addEventListener('message', (event) => {
if (event.data &amp;&amp; event.data.type === 'user-id-modal-shown') {
window.location.reload();
}
});
function setStatus(msg, type) {
statusEl.textContent = msg || '';
statusEl.className = 'shop-login-status' + (type ? ' shop-login-' + type : '');
}
function performLogin(email, playerName, streamerCode) {
setStatus('Iniciando sesión...', '');
submitBtn.disabled = true;
const inputs = form.querySelectorAll('input');
inputs.forEach(input => input.disabled = true);
try {
let userId = email;
if (streamerCode) {
const cleanCode = streamerCode.startsWith('#') ? streamerCode.substring(1) : streamerCode;
userId += ':' + cleanCode;
} else {
userId += ':';
}
userId += ':' + playerName;
const targetElement = document.getElementById(elementId);
if (!targetElement) {
throw new Error('Elemento de destino no encontrado.');
}
const separator = baseUrl.includes('?') ? '&amp;' : '?';
let newSrc = baseUrl + separator + 'user-id=' + encodeURIComponent(userId);
const trackingId = typeof getParamFromUrl === 'function'
? getParamFromUrl('tracking_id')
: new URLSearchParams(window.location.search).get('tracking_id');
if (trackingId) {
newSrc += '&amp;tracking_id=' + encodeURIComponent(trackingId);
}
targetElement.src = newSrc;
if (!window._analyticsUserIdSet) {
fetch('https://kakele-7dttx.ondigitalocean.app/webhook/user_validation?xsolla_key=93pUU39i9bcb&amp;ignore_too_many_payments=true', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user_id: userId })
}).then(function (res) {
if (!res.ok) return;
return res.json();
}).then(function (json) {
if (json &amp;&amp; json.analytics_user_id) {
setGtagUserId(json.analytics_user_id);
}
}).catch(function () { });
}
setStatus('¡Inicio de sesión iniciado! Si es necesario, actualiza la página.', 'success');
} catch (err) {
console.error(err);
setStatus('Error de inicio de sesión. Inténtalo de nuevo.', 'error');
inputs.forEach(input => input.disabled = false);
submitBtn.disabled = false;
}
}
form.addEventListener('submit', function (e) {
e.preventDefault();
const email = form.email.value.trim();
const playerName = form.player_name.value.trim();
const streamerCode = form.streamer_code.value.trim();
if (!email || !playerName) {
setStatus('Completa todos los campos obligatorios.', 'error');
return;
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
setStatus('Ingresa una dirección de email válida.', 'error');
return;
}
performLogin(email, playerName, streamerCode);
});
})();
&lt;/script>&lt;/p></description></item><item><title>Pago Completado</title><link>https://kakele.io/es/paid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/paid/</guid><description>&lt;p>¡Si has completado un pago, felicidades! Dependiendo del método de pago, puede tardar varias horas en procesarse. El pago aparecerá como &amp;ldquo;completado&amp;rdquo; en la aplicación del juego una vez que se procese, y los KCs se acreditarán a tu cuenta. Por favor contáctanos en &lt;a
href="mailto:contact@kakele.io?subject=">contact@kakele.io&lt;/a>
si tienes alguna pregunta.&lt;/p>
&lt;p>Al hacer clic en Hecho, si tus monedas aún no están activadas, inicia sesión en tu cuenta y navega a la Tienda y luego al menú Comprar Monedas nuevamente para verificar el estado del pago. Después de eso, debería aparecer un mensaje de que las monedas han sido actualizadas. Las monedas son las piezas de oro azules.&lt;/p></description></item><item><title>Rankings</title><link>https://kakele.io/es/rankings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/rankings/</guid><description>&lt;p>¡Ve a los mejores jugadores de diferentes servidores en Kakele Online! Selecciona un servidor a continuación para ver los rankings actuales de jugadores, incluyendo sus niveles, vocaciones, logros y más.&lt;/p>
&lt;link rel="stylesheet" href="https://cdn.datatables.net/2.3.2/css/dataTables.dataTables.min.css" />
&lt;link rel="stylesheet" href="https://cdn.datatables.net/fixedcolumns/5.0.4/css/fixedColumns.dataTables.min.css" />
&lt;script src="https://code.jquery.com/jquery-3.7.1.min.js">&lt;/script>
&lt;script src="https://cdn.datatables.net/2.3.2/js/dataTables.min.js">&lt;/script>
&lt;script src="https://cdn.datatables.net/fixedcolumns/5.0.4/js/dataTables.fixedColumns.min.js">&lt;/script>
&lt;script src="https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js">&lt;/script>
&lt;style>
.rankings-select {
color: #000;
}
.rankings-error {
color: #dc3545;
font-weight: bold;
}
.rankings-loading {
font-weight: bold;
}
.world-green { color: #0c7625; font-weight: bold; }
.world-orange { color: #fc780c; font-weight: bold; }
.world-lime { color: #0cf30c; font-weight: bold; }
.world-violet { color: #6533c3; font-weight: bold; }
.world-blue { color: #004cff; font-weight: bold; }
.world-pink { color: #f843b3; font-weight: bold; }
.world-red { color: #dd1125; font-weight: bold; }
.world-white { color: #e7ebee; font-weight: bold; }
.world-emerald { color: #6ff69c; font-weight: bold; }
.world-black { color: #333; font-weight: bold; }
.text-success { color: #28a745; font-weight: bold; }
.text-danger { color: #dc3545; font-weight: bold; }
.text-muted { color: #6c757d; }
&lt;/style>
&lt;script>
const RANKINGS_MESSAGES = {
loading: 'Cargando clasificaciones, espera...',
selectWorld: 'Seleccionar Mundo',
selectType: 'Tipo de Clasificación',
typeTotalExperience: 'Experiencia Total',
typeDailyExperience: 'Experiencia Diaria',
typeWeeklyExperience: 'Experiencia Semanal',
typeMonthlyExperience: 'Experiencia Mensual',
error: 'Error al cargar datos de clasificaciones. Inténtalo de nuevo.',
dataGenerating: 'Los datos aún se están generando para hoy. Inténtalo de nuevo más tarde.',
none: 'Ninguna',
globalWarWins: 'Victorias de Guerra Global',
columns: {
rank: 'Posición',
name: 'Nombre',
level: 'Nivel',
experience: 'Experiencia',
vocation: 'Vocación',
gold: 'Oro',
petPoints: 'Puntos de Mascota',
attack: 'Ataque',
armor: 'Armadura',
magic: 'Magia',
achievements: 'Logros',
loginPoints: 'Puntos de Conexión',
bestiary: 'Bestiario',
guild: 'Gremio'
}
};
function getWorldsList() {
const select = document.getElementById('worlds');
const worlds = [];
for (let i = 0; i &lt; select.options.length; i++) {
const value = select.options[i].value;
if (value &amp;&amp; value !== 'global') {
worlds.push(value);
}
}
return worlds;
}
function getUTCDateString(daysOffset = 0) {
const date = new Date();
date.setUTCDate(date.getUTCDate() + daysOffset);
const year = date.getUTCFullYear();
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
const day = String(date.getUTCDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
async function fetchWorldData(world, dayOffset = 0) {
try {
const dateString = getUTCDateString(dayOffset);
const url = `https://files.kakele.io/rankings/${world}-${dateString}.zlib`;
const dataResponse = await fetch(url);
if (!dataResponse.ok) {
return null;
}
const compressedData = await dataResponse.arrayBuffer();
const decompressedData = pako.inflate(compressedData, { to: 'string' });
const worldData = JSON.parse(decompressedData);
return worldData;
} catch (error) {
console.warn(`Failed to fetch data from ${world} for day offset ${dayOffset}:`, error);
return null;
}
}
async function fetchWorldsData(worlds, experienceMode) {
const allData = [];
let totalGlobalWarWins = 0;
const getComparisonOffset = (mode) => {
switch (mode) {
case 'daily-experience': return -1;
case 'weekly-experience': return -7;
case 'monthly-experience': return -30;
default: return null;
}
};
const comparisonOffset = getComparisonOffset(experienceMode);
const needsComparison = comparisonOffset !== null;
const promises = worlds.map(async (world) => {
const todayData = await fetchWorldData(world, 0);
if (!todayData) {
return null;
}
let comparisonData = null;
if (needsComparison) {
comparisonData = await fetchWorldData(world, comparisonOffset);
}
if (todayData.content &amp;&amp; worlds.length > 1) {
todayData.content.forEach(player => {
player.world = world;
});
}
if (needsComparison) {
const comparisonMap = new Map();
if (comparisonData &amp;&amp; comparisonData.content) {
comparisonData.content.forEach(player => {
comparisonMap.set(player.name, parseInt(player.experience));
});
}
todayData.content.forEach(player => {
const comparisonExp = comparisonMap.get(player.name);
if (comparisonExp !== undefined) {
const todayExp = parseInt(player.experience);
player.originalExperience = todayExp;
player.experience = todayExp - comparisonExp;
} else {
player.originalExperience = parseInt(player.experience);
player.experience = 0;
}
});
}
if (todayData.content) {
allData.push(...todayData.content);
}
if (todayData.global_war_wins) {
totalGlobalWarWins += parseInt(todayData.global_war_wins);
}
return todayData;
});
await Promise.all(promises);
allData.sort((a, b) => parseInt(b.experience) - parseInt(a.experience));
return {
content: allData,
global_war_wins: totalGlobalWarWins
};
}
async function worldSelect(selectObject) {
const loadingElement = document.getElementById('loading-table');
const tableContainer = document.getElementById('rankings-table-container');
const rankingTypeSelect = document.getElementById('ranking-type');
if (!selectObject.value) {
await createTableFromJSON({ content: [] });
return;
}
loadingElement.innerHTML = '&lt;div class="rankings-loading">' + RANKINGS_MESSAGES.loading + '&lt;/div>';
tableContainer.style.opacity = '0.5';
try {
const worlds = selectObject.value === 'global'
? getWorldsList()
: [selectObject.value];
const experienceMode = rankingTypeSelect ? rankingTypeSelect.value : 'total-experience';
const data = await fetchWorldsData(worlds, experienceMode);
if (!data.content || data.content.length === 0) {
await createTableFromJSON({ content: [] }, experienceMode);
loadingElement.innerHTML = '&lt;div class="rankings-error">' + RANKINGS_MESSAGES.dataGenerating + '&lt;/div>';
tableContainer.style.opacity = '1';
return;
}
await createTableFromJSON(data, experienceMode);
updateGlobalWar(data, selectObject);
tableContainer.style.opacity = '1';
} catch (error) {
console.error('Rankings loading error:', error);
loadingElement.innerHTML = '&lt;div class="rankings-error">' + RANKINGS_MESSAGES.error + '&lt;/div>';
tableContainer.style.opacity = '1';
}
}
async function rankingTypeSelect(selectObject) {
const element = document.getElementById('worlds');
if (element &amp;&amp; element.value) {
await worldSelect(element);
}
}
function updateGlobalWar(data, selectObject) {
const option = selectObject.selectedOptions[0];
const baseText = option.value === 'global' ? '🌍 Global' : option.text.split(' (')[0];
if (option.value === 'global') {
option.text = baseText;
} else {
const warWins = parseInt(data.global_war_wins);
option.text = baseText + " (" + warWins + " " + RANKINGS_MESSAGES.globalWarWins + ")";
}
}
function calculateLevel(experience, maxExperienceAtLevel) {
let start = 1, end = 10000;
while (start != end) {
const level = Math.floor((start + end) / 2);
if (maxExperienceAtLevel[level] &lt; experience) {
start = level + 1;
} else {
end = level;
}
}
return start;
}
function formatNumber(num) {
return new Intl.NumberFormat().format(num);
}
function getWorldColorClass(world) {
if (world.includes('green')) return 'world-green';
if (world.includes('emerald')) return 'world-emerald';
if (world.includes('orange')) return 'world-orange';
if (world.includes('lime')) return 'world-lime';
if (world.includes('violet')) return 'world-violet';
if (world.includes('blue')) return 'world-blue';
if (world.includes('pink')) return 'world-pink';
if (world.includes('red')) return 'world-red';
if (world.includes('white')) return 'world-white';
if (world.includes('black')) return 'world-black';
return '';
}
function createTableHeader() {
const thead = document.querySelector('#rankings-table thead');
if (thead) {
thead.remove();
}
const table = document.getElementById('rankings-table');
const newThead = document.createElement('thead');
const headerRow = document.createElement('tr');
const headers = [
RANKINGS_MESSAGES.columns.rank,
RANKINGS_MESSAGES.columns.name,
RANKINGS_MESSAGES.columns.level,
RANKINGS_MESSAGES.columns.experience,
RANKINGS_MESSAGES.columns.vocation,
RANKINGS_MESSAGES.columns.guild,
RANKINGS_MESSAGES.columns.attack,
RANKINGS_MESSAGES.columns.armor,
RANKINGS_MESSAGES.columns.magic,
RANKINGS_MESSAGES.columns.petPoints,
RANKINGS_MESSAGES.columns.gold,
RANKINGS_MESSAGES.columns.achievements,
RANKINGS_MESSAGES.columns.loginPoints,
RANKINGS_MESSAGES.columns.bestiary
];
headers.forEach(headerText => {
const th = document.createElement('th');
th.textContent = headerText;
headerRow.appendChild(th);
});
newThead.appendChild(headerRow);
table.insertBefore(newThead, table.firstChild);
}
async function createTableFromJSON(data, experienceMode = 'total-experience') {
createTableHeader();
const maxExperienceAtLevel = [];
for (let level = 0; level &lt;= 10000; ++level) {
if (level &lt; 200) {
maxExperienceAtLevel.push(10 * level * level * level - 1);
} else if (level &lt; 1200) {
maxExperienceAtLevel.push(Math.floor(10 * level * level * level * level / 200) - 1);
} else {
maxExperienceAtLevel.push(Math.floor(Math.floor(10 * level * level * level * level / 200) * level / 1200) - 1);
}
}
if ($.fn.DataTable.isDataTable('#rankings-table')) {
$('#rankings-table').DataTable().destroy();
}
const tableBody = document.getElementById("rankings-table-body");
tableBody.innerHTML = "";
const tableData = [];
const isGlobalView = data.content.length > 0 &amp;&amp; data.content[0].world;
for (let i = 0; i &lt; data.content.length; i++) {
const player = data.content[i];
const experience = parseInt(player.experience);
const experienceForLevel = player.originalExperience ? parseInt(player.originalExperience) : experience;
const level = calculateLevel(experienceForLevel, maxExperienceAtLevel);
let guildDisplay;
if (isGlobalView) {
const guildText = player.guild || RANKINGS_MESSAGES.none;
const colorClass = getWorldColorClass(player.world);
guildDisplay = `&lt;span class="${colorClass}">${guildText}&lt;/span>`;
} else {
guildDisplay = player.guild || RANKINGS_MESSAGES.none;
}
let experienceDisplay;
if (experienceMode === 'daily-experience' || experienceMode === 'weekly-experience' || experienceMode === 'monthly-experience') {
const diffFormatted = experience > 0 ? `+${experience.toLocaleString()}` : experience.toLocaleString();
const diffClass = experience > 0 ? 'text-success' : (experience &lt; 0 ? 'text-danger' : 'text-muted');
experienceDisplay = `&lt;span class="${diffClass}">${diffFormatted}&lt;/span>`;
} else {
experienceDisplay = experience.toLocaleString();
}
const rowData = [
i + 1,
player.name,
level,
experienceDisplay,
player.vocation,
guildDisplay,
parseInt(player.total_attack).toLocaleString(),
parseInt(player.total_armor).toLocaleString(),
parseInt(player.total_magic).toLocaleString(),
parseInt(player.pet_points).toLocaleString(),
parseInt(player.gold).toLocaleString(),
parseInt(player.achievements).toLocaleString(),
parseInt(player.login_points).toLocaleString(),
parseInt(player.bestiary).toLocaleString()
];
tableData.push(rowData);
}
const columns = [
{ "title": RANKINGS_MESSAGES.columns.rank },
{ "title": RANKINGS_MESSAGES.columns.name },
{ "title": RANKINGS_MESSAGES.columns.level },
{ "title": RANKINGS_MESSAGES.columns.experience },
{ "title": RANKINGS_MESSAGES.columns.vocation },
{ "title": RANKINGS_MESSAGES.columns.guild },
{ "title": RANKINGS_MESSAGES.columns.attack },
{ "title": RANKINGS_MESSAGES.columns.armor },
{ "title": RANKINGS_MESSAGES.columns.magic },
{ "title": RANKINGS_MESSAGES.columns.petPoints },
{ "title": RANKINGS_MESSAGES.columns.gold },
{ "title": RANKINGS_MESSAGES.columns.achievements },
{ "title": RANKINGS_MESSAGES.columns.loginPoints },
{ "title": RANKINGS_MESSAGES.columns.bestiary }
];
const dataTable = $('#rankings-table').DataTable({
"data": tableData,
"order": [[3, "desc"], [0, "asc"]],
"pageLength": 25,
"autoWidth": false,
"deferRender": true,
"orderClasses": false,
"paging": true,
"searching": true,
"info": true,
"scrollX": true,
"processing": true,
"fixedColumns": {
"left": 2
},
"columns": columns,
"language": {
"search": "Buscar:",
"lengthMenu": "Mostrar _MENU_ entradas",
"info": "Mostrando _START_ a _END_ de _TOTAL_ entradas",
"infoEmpty": "Mostrando 0 a 0 de 0 entradas",
"infoFiltered": "(filtrado de _MAX_ entradas totales)",
"paginate": {
"first": "Primero",
"last": "Último",
"next": "Siguiente",
"previous": "Anterior"
}
}
});
document.getElementById('loading-table').innerHTML = "";
}
document.addEventListener('DOMContentLoaded', async function () {
await createTableFromJSON({ content: [] }, 'total-experience');
});
&lt;/script>
&lt;div class="rankings-container">
&lt;div class="rankings-header">
&lt;div style="display: flex; gap: 20px; align-items: center; flex-wrap: wrap;">
&lt;div>
&lt;label for="worlds" class="rankings-label">Seleccionar Mundo:&lt;/label>
&lt;select id="worlds" onchange="worldSelect(this)" class="rankings-select">
&lt;option value="">Seleccionar Mundo&lt;/option>
&lt;option value="global">🌍 Global&lt;/option>
&lt;option value="europe-green">🇪🇺 Europe Green&lt;/option>
&lt;option value="europe-orange">🇪🇺 Europe Orange&lt;/option>
&lt;option value="north-america-lime">🇺🇸 North America Lime&lt;/option>
&lt;option value="north-america-violet">🇺🇸 North America Violet&lt;/option>
&lt;option value="south-america-black">🇧🇷 South America Black&lt;/option>
&lt;option value="south-america-blue">🇧🇷 South America Blue&lt;/option>
&lt;option value="south-america-pink">🇧🇷 South America Pink&lt;/option>
&lt;option value="south-america-red">🇧🇷 South America Red&lt;/option>
&lt;option value="south-america-emerald">🇧🇷 South America Emerald&lt;/option>
&lt;option value="southeast-asia-white">🌏 Southeast Asia White&lt;/option>
&lt;/select>
&lt;/div>
&lt;div>
&lt;label for="ranking-type" class="rankings-label">Tipo de Clasificación:&lt;/label>
&lt;select id="ranking-type" onchange="rankingTypeSelect(this)" class="rankings-select">
&lt;option value="total-experience">Experiencia Total&lt;/option>
&lt;option value="daily-experience">Experiencia Diaria&lt;/option>
&lt;option value="weekly-experience">Experiencia Semanal&lt;/option>
&lt;option value="monthly-experience">Experiencia Mensual&lt;/option>
&lt;/select>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div id="rankings">
&lt;div id="loading-table">&lt;/div>
&lt;div id="rankings-table-container">
&lt;table id="rankings-table">
&lt;tbody id="rankings-table-body">
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Tienda</title><link>https://kakele.io/es/shop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/shop/</guid><description>&lt;p>
&lt;div class="shop-iframe-container">
&lt;iframe id="shop" title="Shop" height="900px" width="100%" style="border: none; border-radius: 8px;"
sandbox="allow-downloads allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts allow-top-navigation allow-top-navigation-by-user-activation allow-top-navigation-to-custom-protocols allow-storage-access-by-user-activation"
src="">
&lt;/iframe>
&lt;/div>
&lt;style>
.shop-login-wrapper {
max-width: 500px;
margin: 0 auto;
padding: 1rem;
}
.shop-login-form-group {
margin-bottom: 1rem;
}
.shop-login-form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
}
.shop-login-form-group input {
width: 100%;
padding: 0.5rem;
color: #000;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
.shop-login-form-group input:disabled {
background-color: #f5f5f5;
color: #666;
cursor: not-allowed;
opacity: 0.6;
}
.shop-login-actions {
text-align: center;
margin: 1rem 0;
}
.shop-login-actions button {
margin: 0 0.5rem;
padding: 0.75rem 1.5rem;
background-color: rgb(153, 27, 27);
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
font-weight: bold;
}
.shop-login-actions button:hover {
background-color: rgb(133, 17, 17);
}
.shop-login-actions button:disabled {
background-color: #666;
cursor: not-allowed;
opacity: 0.5;
}
.shop-login-status {
text-align: center;
margin-top: 1rem;
padding: 0.5rem;
border-radius: 4px;
}
.shop-login-status.shop-login-success {
color: #10b981;
background-color: #d1fae5;
}
.shop-login-status.shop-login-error {
color: #ef4444;
background-color: #fee2e2;
}
&lt;/style>
&lt;div class="shop-login-wrapper" id="shop-login-wrapper">
&lt;form id="shop-login-form" novalidate>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-email">Email de la Cuenta Kakele:&lt;/label>
&lt;input type="email" id="shop-login-email" name="email" required placeholder="tu@email.com" />
&lt;/div>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-player">Nombre del Personaje:&lt;/label>
&lt;input type="text" id="shop-login-player" name="player_name" required placeholder="Nombre de tu personaje" />
&lt;/div>
&lt;div class="shop-login-form-group">
&lt;label for="shop-login-streamer">(Opcional) Código de Streamer:&lt;/label>
&lt;input type="text" id="shop-login-streamer" name="streamer_code" placeholder="(Opcional) Código de streamer" />
&lt;/div>
&lt;div class="shop-login-actions">
&lt;button type="submit" id="shop-login-submit">Iniciar Sesión&lt;/button>
&lt;/div>
&lt;div class="shop-login-status" id="shop-login-status">&lt;/div>
&lt;/form>
&lt;/div>
&lt;script>
(function () {
const form = document.getElementById('shop-login-form');
const statusEl = document.getElementById('shop-login-status');
const submitBtn = document.getElementById('shop-login-submit');
const elementId = 'shop';
const baseUrl = 'https:\/\/shop-v2.kakele.io\/';
document.addEventListener('DOMContentLoaded', function () {
populateUserFormFromUrl('shop-login-email', 'shop-login-player', 'shop-login-streamer');
});
window.addEventListener('message', (event) => {
if (event.data &amp;&amp; event.data.type === 'user-id-modal-shown') {
window.location.reload();
}
});
function setStatus(msg, type) {
statusEl.textContent = msg || '';
statusEl.className = 'shop-login-status' + (type ? ' shop-login-' + type : '');
}
function performLogin(email, playerName, streamerCode) {
setStatus('Iniciando sesión...', '');
submitBtn.disabled = true;
const inputs = form.querySelectorAll('input');
inputs.forEach(input => input.disabled = true);
try {
let userId = email;
if (streamerCode) {
const cleanCode = streamerCode.startsWith('#') ? streamerCode.substring(1) : streamerCode;
userId += ':' + cleanCode;
} else {
userId += ':';
}
userId += ':' + playerName;
const targetElement = document.getElementById(elementId);
if (!targetElement) {
throw new Error('Elemento de destino no encontrado.');
}
const separator = baseUrl.includes('?') ? '&amp;' : '?';
let newSrc = baseUrl + separator + 'user-id=' + encodeURIComponent(userId);
const trackingId = typeof getParamFromUrl === 'function'
? getParamFromUrl('tracking_id')
: new URLSearchParams(window.location.search).get('tracking_id');
if (trackingId) {
newSrc += '&amp;tracking_id=' + encodeURIComponent(trackingId);
}
targetElement.src = newSrc;
if (!window._analyticsUserIdSet) {
fetch('https://kakele-7dttx.ondigitalocean.app/webhook/user_validation?xsolla_key=93pUU39i9bcb&amp;ignore_too_many_payments=true', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ user_id: userId })
}).then(function (res) {
if (!res.ok) return;
return res.json();
}).then(function (json) {
if (json &amp;&amp; json.analytics_user_id) {
setGtagUserId(json.analytics_user_id);
}
}).catch(function () { });
}
setStatus('¡Inicio de sesión iniciado! Si es necesario, actualiza la página.', 'success');
} catch (err) {
console.error(err);
setStatus('Error de inicio de sesión. Inténtalo de nuevo.', 'error');
inputs.forEach(input => input.disabled = false);
submitBtn.disabled = false;
}
}
form.addEventListener('submit', function (e) {
e.preventDefault();
const email = form.email.value.trim();
const playerName = form.player_name.value.trim();
const streamerCode = form.streamer_code.value.trim();
if (!email || !playerName) {
setStatus('Completa todos los campos obligatorios.', 'error');
return;
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
setStatus('Ingresa una dirección de email válida.', 'error');
return;
}
performLogin(email, playerName, streamerCode);
});
})();
&lt;/script>
&lt;style>
#shop-login-wrapper {
display: none;
}
&lt;/style>
&lt;script>
(function () {
const shopModeKey = 'kakele_shop_mode';
function safeGetStorage(key) {
try {
return window.localStorage.getItem(key);
} catch (e) {
return null;
}
}
function safeSetStorage(key, value) {
try {
window.localStorage.setItem(key, value);
} catch (e) {
}
}
const urlParams = new URLSearchParams(window.location.search);
const incomingTrackingId = urlParams.get('tracking_id');
if (incomingTrackingId) {
safeSetStorage(shopModeKey, 'web');
}
const isPtPage = window.location.pathname.startsWith('/pt-br/');
const useWebShop = !isPtPage || safeGetStorage(shopModeKey) === 'web';
if (!useWebShop) {
return;
}
var webShopLogin = document.getElementById('shop-login-wrapper');
var pixBlock = document.getElementById('pix-wrapper');
if (webShopLogin) webShopLogin.style.display = 'block';
if (pixBlock) pixBlock.style.display = 'none';
})();
&lt;/script>
&lt;/p></description></item><item><title>Wiki</title><link>https://kakele.io/es/wiki/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kakele.io/es/wiki/</guid><description>&lt;p>¡Bienvenido a la Wiki de Kakele Online! Aquí puedes encontrar información completa sobre todos los elementos del juego. Haz clic en cualquier categoría a continuación para ver información detallada.&lt;/p>
&lt;style>
.wiki-nav {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 16px;
margin: 20px 0;
padding: 20px;
background: rgba(2, 6, 23, 0.4);
}
.wiki-category-btn {
position: relative;
background: linear-gradient(135deg, rgba(59, 130, 246, 0.1), rgba(147, 51, 234, 0.1));
border: 2px solid rgba(59, 130, 246, 0.3);
color: #e2e8f0;
padding: 18px 24px;
border-radius: 12px;
cursor: pointer;
text-align: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
text-decoration: none;
font-weight: bold;
font-family: inherit;
font-size: 16px;
overflow: hidden;
backdrop-filter: blur(10px);
}
.wiki-category-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
transition: left 0.5s;
}
.wiki-category-btn:hover::before {
left: 100%;
}
.wiki-category-btn:hover {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.2), rgba(147, 51, 234, 0.2));
border-color: rgba(59, 130, 246, 0.6);
box-shadow: 0 8px 25px rgba(59, 130, 246, 0.3);
color: #ffffff;
}
.wiki-section-content {
display: none;
margin-top: 20px;
padding: 20px;
background: linear-gradient(135deg, rgba(2, 6, 23, 0.6), rgba(30, 41, 59, 0.4));
backdrop-filter: blur(15px);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.wiki-loading {
text-align: center;
padding: 60px;
color: #94a3b8;
font-style: italic;
font-size: 16px;
background: rgba(15, 23, 42, 0.3);
border-radius: 12px;
border: 1px dashed rgba(59, 130, 246, 0.3);
}
.wiki-section-title {
background: linear-gradient(90deg, #3b82f6, #8b5cf6);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
border-bottom: 3px solid rgba(59, 130, 246, 0.3);
padding-bottom: 15px;
margin-bottom: 25px;
font-size: 24px;
font-weight: bold;
text-align: center;
}
.wiki-table {
background: rgba(2, 6, 23, 0.8);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(59, 130, 246, 0.2);
width: 100%;
}
.wiki-table table {
width: 100%;
border-collapse: collapse;
}
.wiki-table th {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.8), rgba(147, 51, 234, 0.8));
color: #ffffff;
text-align: center;
padding: 16px 12px;
font-weight: bold;
font-size: 16px;
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
border-bottom: 2px solid rgba(59, 130, 246, 0.5);
}
.wiki-table td {
text-align: center;
padding: 14px 12px;
color: #e2e8f0;
border-bottom: 1px solid rgba(59, 130, 246, 0.1);
transition: all 0.2s ease;
font-size: 16px;
width: auto;
vertical-align: middle;
}
.wiki-table tr {
border: none;
}
.wiki-table tr:nth-child(even) {
background: rgba(15, 23, 42, 0.6);
}
.wiki-table tr:nth-child(odd) {
background: rgba(30, 41, 59, 0.4);
}
.wiki-table tr:hover {
background: linear-gradient(90deg, rgba(59, 130, 246, 0.1), rgba(147, 51, 234, 0.1));
box-shadow: 0 4px 15px rgba(59, 130, 246, 0.2);
}
.creature {
background-size: 32px 32px !important;
background-repeat: no-repeat !important;
background-position: center !important;
background-color: black !important;
width: 36px;
height: 36px;
display: inline-block;
margin-right: 8px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
vertical-align: middle;
}
.creature:hover {
border-color: rgba(59, 130, 246, 0.8);
box-shadow: 0 4px 16px rgba(59, 130, 246, 0.4);
}
.item {
background-size: 34px 34px !important;
background-repeat: no-repeat !important;
background-position: center !important;
background-color: black !important;
width: 38px;
height: 38px;
display: inline-block;
margin-right: 8px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
vertical-align: middle;
}
.item:hover {
border-color: rgba(59, 130, 246, 0.8);
box-shadow: 0 4px 16px rgba(59, 130, 246, 0.4);
}
@media (max-width: 1024px) {
.wiki-nav {
grid-template-columns: 1fr;
gap: 12px;
padding: 15px;
}
.wiki-category-btn {
padding: 16px 20px;
font-size: 16px;
}
.wiki-section-content {
padding: 20px 15px;
margin-top: 20px;
}
.wiki-section-title {
font-size: 20px;
}
.wiki-table {
overflow-x: auto;
border: 0;
}
.wiki-table table {
overflow-x: auto;
white-space: normal;
}
.wiki-table th,
.wiki-table td {
padding: 12px 8px;
word-wrap: break-word;
}
.wiki-table,
.wiki-table table,
.wiki-table tbody,
.wiki-table tr,
.wiki-table th,
.wiki-table td {
display: block;
}
.wiki-table thead {
display: none;
}
.wiki-table tr {
background: rgba(15, 23, 42, 0.9);
border: 1px solid rgba(59, 130, 246, 0.3);
border-radius: 8px;
margin-bottom: 16px;
padding: 16px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.wiki-table td {
text-align: right;
padding: 12px 0;
border: none;
border-bottom: 1px solid rgba(59, 130, 246, 0.3);
border-top: none;
font-size: 16px;
display: block;
word-wrap: break-word;
overflow-wrap: break-word;
position: relative;
overflow: hidden;
line-height: 40px;
}
.wiki-table td span {
word-wrap: break-word;
}
.wiki-table td div {
float: left;
max-width: 100%;
box-sizing: border-box;
}
.wiki-table td[data]:before {
content: attr(data);
font-weight: bold;
color: #94a3b8;
float: left;
max-width: 50%;
box-sizing: border-box;
}
.wiki-table td:last-child {
border-bottom: none;
}
.creature,
.item {
vertical-align: middle;
margin-bottom: 0;
}
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.wiki-loading {
animation: pulse 2s infinite;
}
.wiki-datatable {
background: rgba(2, 6, 23, 0.8);
color: #e2e8f0;
}
.wiki-datatable thead th {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.8), rgba(147, 51, 234, 0.8));
color: #ffffff;
border-bottom: 2px solid rgba(59, 130, 246, 0.5);
}
.wiki-datatable tbody td {
background: rgba(15, 23, 42, 0.6);
color: #e2e8f0;
border-bottom: 1px solid rgba(59, 130, 246, 0.1);
}
.wiki-datatable tbody tr:nth-child(even) td {
background: rgba(30, 41, 59, 0.4);
}
.wiki-datatable tbody tr:hover td {
background: linear-gradient(90deg, rgba(59, 130, 246, 0.1), rgba(147, 51, 234, 0.1));
}
.dataTables_wrapper {
color: #e2e8f0;
}
.dataTables_filter input {
background: rgba(15, 23, 42, 0.8);
border: 1px solid rgba(59, 130, 246, 0.3);
color: #e2e8f0;
border-radius: 4px;
padding: 6px 12px;
}
.dataTables_length select {
background: rgba(15, 23, 42, 0.8);
border: 1px solid rgba(59, 130, 246, 0.3);
color: #e2e8f0;
border-radius: 4px;
padding: 4px 8px;
}
&lt;/style>
&lt;div class="wiki-container">
&lt;div class="wiki-nav">
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('spells-section'); loadWiki('spells')">
✨ Hechizos
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('equipments-section'); loadWiki('equipments')">
🛡️ Equipamiento
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('weapons-section'); loadWiki('weapons')">
⚔️ Armas
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('monsters-section'); loadWiki('monsters')">
👹 Monstruos
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('pets-section'); loadWiki('pets')">
🐾 Mascotas
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('mounts-section'); loadWiki('mounts')">
🐎 Monturas
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('addons-section'); loadWiki('addons')">
👕 Complementos
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('outfits-section'); loadWiki('outfits')">
👗 Vestimentas
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('foods-section'); loadWiki('foods')">
🍖 Comidas y Consumibles
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('items-section'); loadWiki('items')">
🎒 Otros Objetos
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('pet_foods-section'); loadWiki('pet_foods')">
🦴 Comida para Mascotas
&lt;/button>
&lt;button class="wiki-category-btn" onclick="toggleWikiSection('npcs-section'); loadWiki('npcs')">
🌍 NPCs
&lt;/button>
&lt;/div>
&lt;div id="spells-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Hechizos&lt;/h2>
&lt;div id="spells-loading" class="wiki-loading">Haz clic en &amp;#34;✨ Hechizos&amp;#34; para cargar datos de hechizos...&lt;/div>
&lt;div id="spells-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="equipments-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Equipamiento&lt;/h2>
&lt;div id="equipments-loading" class="wiki-loading">Haz clic en &amp;#34;🛡️ Equipamiento&amp;#34; para cargar datos de equipamiento...&lt;/div>
&lt;div id="equipments-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="weapons-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Armas&lt;/h2>
&lt;div id="weapons-loading" class="wiki-loading">Haz clic en &amp;#34;⚔️ Armas&amp;#34; para cargar datos de armas...&lt;/div>
&lt;div id="weapons-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="monsters-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Monstruos&lt;/h2>
&lt;div id="monsters-loading" class="wiki-loading">Haz clic en &amp;#34;👹 Monstruos&amp;#34; para cargar datos de monstruos...&lt;/div>
&lt;div id="monsters-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="pets-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Mascotas&lt;/h2>
&lt;div id="pets-loading" class="wiki-loading">Haz clic en &amp;#34;🐾 Mascotas&amp;#34; para cargar datos de mascotas...&lt;/div>
&lt;div id="pets-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="mounts-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Monturas&lt;/h2>
&lt;div id="mounts-loading" class="wiki-loading">Haz clic en &amp;#34;🐎 Monturas&amp;#34; para cargar datos de monturas...&lt;/div>
&lt;div id="mounts-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="addons-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Complementos&lt;/h2>
&lt;div id="addons-loading" class="wiki-loading">Haz clic en &amp;#34;👕 Complementos&amp;#34; para cargar datos de complementos...&lt;/div>
&lt;div id="addons-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="outfits-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Vestimentas&lt;/h2>
&lt;div id="outfits-loading" class="wiki-loading">Haz clic en &amp;#34;👗 Vestimentas&amp;#34; para cargar datos de vestimentas...&lt;/div>
&lt;div id="outfits-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="foods-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Comidas y Consumibles&lt;/h2>
&lt;div id="foods-loading" class="wiki-loading">Haz clic en &amp;#34;🍖 Comidas y Consumibles&amp;#34; para cargar datos de comidas...&lt;/div>
&lt;div id="foods-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="items-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Otros Objetos&lt;/h2>
&lt;div id="items-loading" class="wiki-loading">Haz clic en &amp;#34;🎒 Otros Objetos&amp;#34; para cargar datos de objetos...&lt;/div>
&lt;div id="items-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="pet_foods-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">Comida para Mascotas&lt;/h2>
&lt;div id="pet_foods-loading" class="wiki-loading">Haz clic en &amp;#34;🦴 Comida para Mascotas&amp;#34; para cargar datos de comida para mascotas...&lt;/div>
&lt;div id="pet_foods-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;div id="npcs-section" class="wiki-section-content">
&lt;h2 class="wiki-section-title">NPCs&lt;/h2>
&lt;div id="npcs-loading" class="wiki-loading">Haz clic en &amp;#34;🌍 NPCs&amp;#34; para cargar datos de NPCs...&lt;/div>
&lt;div id="npcs-content" class="wiki-table">&lt;/div>
&lt;/div>
&lt;/div>
&lt;link rel="stylesheet" href="https://cdn.datatables.net/2.3.2/css/dataTables.dataTables.min.css" />
&lt;script src="https://code.jquery.com/jquery-3.7.1.min.js">&lt;/script>
&lt;script src="https://cdn.datatables.net/2.3.2/js/dataTables.min.js">&lt;/script>
&lt;script>
const WIKI_ERROR_MESSAGE = 'Error al cargar contenido. Inténtalo de nuevo más tarde.';
const WIKI_LANGUAGE = 'es';
function getWikiLanguageSuffix(langCode) {
const languageMap = {
'en': 'english',
'pt-br': 'portuguese',
'es': 'spanish',
'pl': 'polish'
};
return languageMap[langCode] || 'english';
}
async function loadWiki(wiki) {
const loadingElement = document.getElementById(wiki + "-loading");
const contentElement = document.getElementById(wiki + "-content");
if (!loadingElement || !contentElement) return;
try {
const languageSuffix = getWikiLanguageSuffix(WIKI_LANGUAGE);
const response = await fetch('https://raw.githubusercontent.com/contact-kakele/kakele-data/main/wiki/' + wiki + '_' + languageSuffix + '.html');
if (!response.ok) throw new Error('Failed to load content');
const html = await response.text();
loadingElement.remove();
const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;
const table = tempDiv.querySelector('table');
if (table) {
setupDataTable(wiki, table, contentElement);
} else {
const content = document.createElement("div");
content.innerHTML = html;
contentElement.appendChild(content);
}
} catch (error) {
loadingElement.innerHTML = '&lt;p style="color: #ff6b6b;">' + WIKI_ERROR_MESSAGE + '&lt;/p></description></item></channel></rss>