Gimnasio Pokémon

Los Gimnasios Pokémon son una parte fundamental de cualquier juego de la saga. En Pokémon Essentials, configurar un gimnasio implica crear el mapa del gimnasio, definir al Líder como entrenador, programar el flujo de eventos (diálogos pre-batalla, combate y post-batalla), otorgar medallas y configurar los efectos que estas desbloquean. Esta guía cubre todos los aspectos necesarios para implementar gimnasios completos y funcionales.

Estructura general de un Gimnasio

Un gimnasio en Essentials se compone de los siguientes elementos:

Crear el mapa del Gimnasio

Para crear el mapa del gimnasio:

  1. En RPG Maker XP, crea un nuevo mapa con las dimensiones adecuadas. Un gimnasio típico puede ser de 15×20 o 20×25 tiles.
  2. Usa el tileset apropiado — Essentials incluye tilesets de interior de gimnasio. Puedes usar Inside_gym o similares.
  3. Diseña el suelo del gimnasio con el tipo temático del Líder (agua, fuego, roca, etc.).
  4. Coloca la plataforma del Líder al fondo del mapa.
  5. Diseña un camino principal desde la entrada hasta el Líder, con desvíos opcionales para entrenadores y el puzle.

Recuerda configurar los metadatos del mapa en el PBS map_metadata.txt. Un gimnasio normalmente no necesita configuración especial de metadatos más allá de la música de fondo:

[MAP_ID]
Name = Gimnasio de Ciudad Ejemplo
MapPosition = 0,10,12
BattleBack = indoor

Configurar los metadatos del mapa

En el archivo map_metadata.txt, asegúrate de que el mapa del gimnasio tenga configurados los campos necesarios. El campo BattleBack define el fondo de batalla dentro del gimnasio. Puedes usar fondos estándar como indoor o crear un fondo personalizado para cada gimnasio temático.

Si tu gimnasio tiene música propia, configúrala con el campo MapWildBattleBGM o simplemente cambia la BGM del mapa mediante un evento de Autorun al entrar.

Evento del Líder de Gimnasio

El Líder del gimnasio es un evento NPC que sigue un flujo de tres fases: pre-batalla, batalla y post-batalla. Esto se controla con un Self Switch (interruptor local).

Fase 1: Pre-batalla (Self Switch A = OFF)

En la primera página del evento, el Líder se presenta, habla sobre su tipo favorito y desafía al jugador:

# Evento del Líder - Página 1 (Sin condición)
# Gráfico: Sprite del Líder
# Trigger: Acción del jugador

pbMessage(_I("¡Bienvenido a mi gimnasio!"))
pbMessage(_I("Soy Petra, la Líder del Gimnasio de tipo Roca."))
pbMessage(_I("¡Veamos si puedes superar la solidez de mis Pokémon!"))

# Iniciar combate contra el entrenador
if pbTrainerBattle(:LEADER_Petra, "Petra", 0)
  # Victoria del jugador
  pbMessage(_I("¡Increíble! Has demostrado una gran fuerza."))
  pbMessage(_I("Te has ganado la Medalla Roca."))
  # Dar medalla
  $game_switches[SW_BADGE_1] = true
  pbReceiveBadge(1)
  # Dar MT como recompensa
  pbReceiveTM(:TM39)
  pbMessage(_I("Esa MT contiene Tumba Rocas. ¡Úsala bien!"))
  # Activar Self Switch para post-batalla
  pbSetSelfSwitch(pbMapId, @event_id, "A", true)
else
  # Derrota del jugador (el jugador pierde)
  pbMessage(_I("Todavía te falta entrenamiento. ¡Vuelve cuando estés listo!"))
end

Fase 2: Post-batalla (Self Switch A = ON)

En la segunda página del evento (condición: Self Switch A = ON), el Líder tiene un diálogo diferente indicando que ya fue derrotado:

# Evento del Líder - Página 2 (Self Switch A = ON)
pbMessage(_I("¡Has demostrado ser un gran entrenador!"))
pbMessage(_I("La Medalla Roca te permite usar Corte fuera de combate."))
pbMessage(_I("Sigue adelante y conquista la Liga Pokémon."))

Otorgar medallas: pbReceiveBadge

El comando principal para otorgar una medalla es:

pbReceiveBadge(número_medalla)

Donde número_medalla es un valor entre 1 y 8 (o más, si has configurado medallas adicionales). Al ejecutar este comando:

Para verificar si el jugador tiene una medalla específica:

# Comprobar si tiene la medalla 1
if $player.badge_count >= 1
  pbMessage(_I("Ya tienes la primera medalla."))
end

# Comprobar una medalla específica
if $player.badges[0]  # Medalla 1 (índice 0)
  pbMessage(_I("Tienes la Medalla Roca."))
end

Efectos de las medallas

Las medallas tienen dos tipos de efectos principales en Pokémon Essentials:

1. Obediencia de Pokémon intercambiados

Los Pokémon obtenidos por intercambio solo obedecen al jugador si su nivel no supera el límite asociado a las medallas:

Medallas Nivel máximo de obediencia
0 medallas Nivel 10
1 medalla Nivel 20
2 medallas Nivel 30
3 medallas Nivel 40
4 medallas Nivel 50
5 medallas Nivel 60
6 medallas Nivel 70
7 medallas Nivel 80
8 medallas Todos los niveles

Estos valores se configuran en el script Settings bajo la constante BADGE_FOR_OBEDIENCE.

2. Uso de MOs/HMs fuera de combate

Cada medalla puede desbloquear el uso de un movimiento de campo (HM). La configuración se realiza en Settings:

# En Settings
BADGE_FOR_CUT       = 1   # Medalla necesaria para usar Corte
BADGE_FOR_FLASH     = 2   # Medalla para Destello
BADGE_FOR_ROCKSMASH = 3   # Medalla para Golpe Roca
BADGE_FOR_SURF      = 4   # Medalla para Surf
BADGE_FOR_FLY       = 5   # Medalla para Vuelo
BADGE_FOR_STRENGTH  = 6   # Medalla para Fuerza
BADGE_FOR_DIVE      = 7   # Medalla para Buceo
BADGE_FOR_WATERFALL = 8   # Medalla para Cascada

Conteo de medallas

Puedes usar el conteo de medallas para controlar la progresión del juego:

# Obtener el número total de medallas
total = $player.badge_count

# Usar en condiciones
if $player.badge_count >= 4
  pbMessage(_I("¡Tienes al menos 4 medallas! Puedes acceder a la Ruta 8."))
end

# Bloquear acceso sin suficientes medallas
if $player.badge_count < 3
  pbMessage(_I("Necesitas al menos 3 medallas para pasar."))
  exit
end

Estatua del Gimnasio

Las estatuas del gimnasio son los pilares decorativos que se colocan en la entrada. Para crear una estatua informativa:

# Evento de la Estatua - Trigger: Acción del jugador
# Gráfico: Objeto estático (pilar/estatua)

if $player.badges[0]  # Si tiene la medalla de este gimnasio
  pbMessage(_I("Gimnasio Pokémon de Ciudad Roca\\n" +
               "Líder: Petra\\n" +
               "Medalla Roca\\n" +
               "\\\"La entrenadora sólida como la montaña\\\"\\n" +
               "Superado por: " + $player.name))
else
  pbMessage(_I("Gimnasio Pokémon de Ciudad Roca\\n" +
               "Líder: Petra\\n" +
               "Medalla Roca\\n" +
               "\\\"La entrenadora sólida como la montaña\\\""))
end

NPC Guía del Gimnasio

El Guía del Gimnasio (Gym Guide) es un NPC clásico que aparece junto a la entrada y ofrece consejos al jugador:

# Evento del Guía - Página 1 (Self Switch A = OFF, antes de vencer al Líder)
pbMessage(_I("¡Hola! Este es el Gimnasio de tipo Roca."))
pbMessage(_I("Los Pokémon de tipo Agua y Planta tienen ventaja aquí."))
pbMessage(_I("Si tu equipo tiene esos tipos, ¡tienes buenas posibilidades!"))

# Evento del Guía - Página 2 (Self Switch A = ON, después de vencer al Líder)
pbMessage(_I("¡Enhorabuena! ¡Has conseguido la Medalla Roca!"))
pbMessage(_I("El siguiente gimnasio está en Ciudad Cascada."))
pbMessage(_I("¡Buena suerte en tu viaje!"))

El Self Switch A del Guía debe activarse al mismo tiempo que el del Líder. Puedes hacerlo desde el evento del Líder con:

# Desde el evento del Líder, activar el switch del Guía (evento ID 3, por ejemplo)
pbSetSelfSwitch(pbMapId, 3, "A", true)

Puzles de Gimnasio

Los puzles son opcionales pero añaden profundidad al gimnasio. Aquí algunos ejemplos clásicos:

Puzle de interruptores

Puertas que se abren al activar interruptores en el orden correcto:

# Evento del interruptor - Trigger: Acción del jugador
pbSEPlay("switch")
if $game_switches[100] == false
  $game_switches[100] = true
  pbMessage(_I("¡Has activado el interruptor! Una puerta se ha abierto."))
else
  $game_switches[100] = false
  pbMessage(_I("Has desactivado el interruptor. La puerta se ha cerrado."))
end

Puzle de suelo resbaladizo (hielo)

Usa el terreno de hielo que hace que el jugador se deslice en línea recta. Configura el tile de hielo con el terrain tag correspondiente en el tileset. En La Base de Sky, el terrain tag para hielo resbaladizo es :Ice.

Puzle de teleportadores

Plataformas que teletransportan al jugador a otra ubicación del mapa:

# Evento de teleportador - Trigger: Contacto del jugador
pbSEPlay("teleport")
$game_player.moveto(destino_x, destino_y)
$game_map.autoplay  # Refrescar el mapa

Puzle de plataformas giratorias

Plataformas que empujan al jugador en una dirección al pisarlas. Se configuran con terrain tags específicos que asocian direcciones de movimiento automático.

Entrenadores del Gimnasio

Los entrenadores dentro del gimnasio se configuran como cualquier otro entrenador NPC. Cada uno debe tener su propio Self Switch para no repetir el combate:

# Evento del Entrenador del Gimnasio
# Página 1 (Self Switch A = OFF) - Trigger: Contacto del jugador
# Gráfico: Sprite del entrenador mirando hacia el jugador

# Vista: detectar al jugador a distancia
pbTrainerIntro(:COOLTRAINER_M)
pbNoticePlayer(get_self)

pbMessage(_I("¡No pasarás sin pelear conmigo!"))
if pbTrainerBattle(:COOLTRAINER_M, "Carlos", 0)
  pbMessage(_I("¡Eres fuerte! El Líder te espera al fondo."))
end
pbTrainerEnd
pbSetSelfSwitch(pbMapId, @event_id, "A", true)

# Página 2 (Self Switch A = ON)
pbMessage(_I("El Líder del gimnasio es muy fuerte. ¡Prepárate!"))

Múltiples Gimnasios

Para implementar los 8 gimnasios estándar (o más), sigue estos pasos:

  1. Crea un mapa independiente para cada gimnasio.
  2. Define un interruptor global (Game Switch) para cada medalla, o usa directamente el array $player.badges.
  3. Numera las medallas del 1 al 8 en orden de progresión.
  4. Cada Líder debe usar pbReceiveBadge(N) con su número correspondiente.
  5. Configura los bloqueos de ruta para que el jugador deba obtener medallas en orden.

Revancha con Líderes de Gimnasio

Si deseas permitir revanchas con los Líderes, consulta la página de Revanchas. La mecánica básica es agregar una tercera página al evento del Líder:

# Evento del Líder - Página 3 (después de cierto punto de la historia)
# Condición: Game Switch [ELITE_FOUR_BEATEN] = ON

pbMessage(_I("¡Has vuelto! He entrenado mucho desde la última vez."))
pbMessage(_I("¿Te atreves a un combate de revancha?"))

if pbConfirmMessage(_I("¿Deseas luchar contra Petra?"))
  if pbTrainerBattle(:LEADER_Petra, "Petra", 1)  # Equipo 1 = equipo de revancha
    pbMessage(_I("¡Sigues siendo increíble!"))
  else
    pbMessage(_I("¡Esta vez he ganado yo! Ven cuando quieras."))
  end
end

Consejos y buenas prácticas