Encuentros por Evento

Los encuentros por evento son batallas contra Pokémon salvajes que se activan mediante un evento de mapa en lugar del sistema de encuentros aleatorios. Este método es esencial para crear encuentros especiales como Pokémon legendarios, encuentros estáticos (Pokémon que el jugador ve en el mapa y con los que interactúa) y Pokémon de regalo.

A diferencia de los encuentros aleatorios que ocurren al caminar por hierba alta o cuevas, los encuentros por evento te dan control total sobre las circunstancias de la batalla: qué Pokémon aparece, a qué nivel, con qué habilidad, si es shiny, qué ocurre después de la batalla, etc.

El Comando pbWildBattle

El comando principal para iniciar un encuentro con un Pokémon salvaje por evento es pbWildBattle. Este comando inicia una batalla contra un Pokémon salvaje específico y devuelve el resultado de la batalla.

Sintaxis básica

pbWildBattle(species, level, result_variable = nil, can_run = true, can_lose = false)
Parámetro Tipo Descripción
species Symbol El identificador interno de la especie Pokémon (ej: :MEWTWO).
level Integer El nivel del Pokémon salvaje (1-100).
result_variable Integer/nil Número de variable del juego donde se almacena el resultado. Opcional.
can_run Boolean Si el jugador puede huir de la batalla. Por defecto true.
can_lose Boolean Si el jugador puede perder sin game over. Por defecto false.

Ejemplo básico

# Encuentro simple con un Pikachu nivel 10
pbWildBattle(:PIKACHU, 10)

Este comando inicia una batalla estándar contra un Pikachu de nivel 10. El jugador puede huir y si pierde, verá la pantalla de game over como en cualquier derrota.

Resultados de la Batalla

El comando pbWildBattle devuelve un valor que indica el resultado de la batalla. Puedes almacenar este resultado en una variable del juego para tomar decisiones posteriores:

# Almacena el resultado en la variable 1 del juego
pbWildBattle(:SNORLAX, 30, 1)

Los posibles valores del resultado son:

Valor Constante Significado
1 Victoria El jugador ganó la batalla (derrotó o capturó al Pokémon).
2 Derrota El jugador perdió la batalla.
3 Huida El jugador huyó de la batalla.
4 Captura El jugador capturó al Pokémon.
5 Empate Ambos Pokémon cayeron al mismo tiempo.

Puedes usar ramificaciones condicionales (Conditional Branch) en el evento para verificar el resultado:

# Evento de encuentro con Snorlax
pbWildBattle(:SNORLAX, 30, 1)
# Comprobar resultado almacenado en variable 1
if $game_variables[1] == 4  # Capturado
  pbMessage("¡Has capturado a Snorlax! El camino está libre.")
  # Activar interruptor para eliminar el evento
  pbSetSelfSwitch(event_id, "A", true)
elsif $game_variables[1] == 1  # Derrotado
  pbMessage("Snorlax ha sido derrotado, pero volverá...")
elsif $game_variables[1] == 3  # Huida
  pbMessage("Has huido. Snorlax sigue bloqueando el camino.")
end

Configurar el Pokémon del Encuentro

Para personalizar las características del Pokémon salvaje más allá de especie y nivel, puedes usar el método pbWildBattleCore o modificar el Pokémon antes de la batalla:

Pokémon Shiny

# Forzar que el Pokémon sea shiny
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.shiny = true
}
pbWildBattle(:GYARADOS, 30)
Events.onWildPokemonCreateForEvent.clear

Forma específica

# Generar un Pokémon con forma alternativa
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.form = 1  # Forma Alola, Galar, etc. según la especie
}
pbWildBattle(:VULPIX, 25)
Events.onWildPokemonCreateForEvent.clear

Habilidad específica

# Asignar una habilidad específica
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.ability_index = 2  # Habilidad oculta (índice 2)
}
pbWildBattle(:EEVEE, 20)
Events.onWildPokemonCreateForEvent.clear

Movimientos personalizados

# Dar movimientos específicos al Pokémon
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.forget_all_moves
  pokemon.learn_move(:FLAMETHROWER)
  pokemon.learn_move(:EARTHQUAKE)
  pokemon.learn_move(:THUNDER)
  pokemon.learn_move(:BLIZZARD)
}
pbWildBattle(:DRAGONITE, 55)
Events.onWildPokemonCreateForEvent.clear

Género específico

# Forzar género masculino o femenino
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.makeMale    # o pokemon.makeFemale
}
pbWildBattle(:NIDORAN_M, 15)
Events.onWildPokemonCreateForEvent.clear

IVs y naturaleza específicos

# Pokémon con IVs perfectos y naturaleza fija
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  # IVs perfectos (31 en todas las estadísticas)
  GameData::Stat.each_main { |s| pokemon.iv[s.id] = 31 }
  # Naturaleza específica
  pokemon.nature = :ADAMANT
}
pbWildBattle(:RAYQUAZA, 70)
Events.onWildPokemonCreateForEvent.clear

Encuentros Legendarios

Los Pokémon legendarios requieren un diseño de evento más elaborado. Aquí se muestra un ejemplo completo de un encuentro legendario:

Diseño del evento

# Evento de Mewtwo en Cueva Celeste
# Página 1: Interruptor "MEWTWO_AVAILABLE" activado, Self Switch A desactivado
# Gráfico: sprite de Mewtwo en el mapa
# Trigger: Acción del jugador (hablar/interactuar)

pbMessage("¡Un Pokémon poderoso te observa desde las sombras!")
pbMessage("\\se[Pokemon Cry - MEWTWO]")

# Configurar Mewtwo con características especiales
Events.onWildPokemonCreateForEvent += proc { |_sender, e|
  pokemon = e[0]
  pokemon.shiny = false
  # 3 IVs perfectos garantizados (como en los juegos oficiales)
  stats = [:HP, :ATTACK, :DEFENSE, :SPECIAL_ATTACK, :SPECIAL_DEFENSE, :SPEED]
  perfect_stats = stats.sample(3)
  perfect_stats.each { |s| pokemon.iv[s] = 31 }
}

# Batalla: no se puede huir, no se puede perder (vuelve al mapa)
pbWildBattle(:MEWTWO, 70, 1, false, true)
Events.onWildPokemonCreateForEvent.clear

if $game_variables[1] == 4  # Capturado
  pbMessage("¡Felicidades! Has capturado a Mewtwo.")
  pbSetSelfSwitch(@event_id, "A", true)  # Desaparece el evento
elsif $game_variables[1] == 1  # Derrotado
  pbMessage("Mewtwo ha sido derrotado...")
  pbMessage("Quizás vuelva a aparecer si lo buscas de nuevo.")
  # Opcionalmente: desactivar el evento temporalmente
elsif $game_variables[1] == 2  # Perdiste
  pbMessage("Has sido derrotado por Mewtwo...")
  pbMessage("Pero Mewtwo sigue aquí. Vuelve cuando estés preparado.")
end

Legendarios que reaparecen

Si deseas que un legendario reaparezca después de ser derrotado (para dar al jugador otra oportunidad de capturarlo), simplemente no actives el Self Switch cuando el resultado sea derrota. El evento seguirá mostrándose y el jugador podrá intentarlo de nuevo.

Para hacer que reaparezca después de un cierto evento (como volver a derrotar la Liga Pokémon):

# En el evento de la Liga Pokémon, después de ganar:
pbSetSelfSwitch(MEWTWO_EVENT_ID, "A", false, CUEVA_CELESTE_MAP_ID)
pbMessage("Se dice que Mewtwo ha vuelto a aparecer en la Cueva Celeste...")

Encuentros Estáticos

Los encuentros estáticos son Pokémon que el jugador puede ver en el mapa antes de iniciar la batalla. Son muy comunes para Pokémon especiales como Snorlax bloqueando un camino o un Sudowoodo que parece un árbol.

Configuración del evento

  1. Crea un nuevo evento en el mapa donde quieres que aparezca el Pokémon.
  2. Asigna un gráfico al evento: usa el sprite del Pokémon de la carpeta Graphics/Characters/.
  3. Configura el trigger como "Acción del jugador" para que se active al hablar con él.
  4. En los comandos del evento, añade el código de la batalla.
  5. Crea una segunda página con el Self Switch A activado y sin gráfico ni comandos (el evento desaparece tras la captura/derrota).

Ejemplo: Snorlax bloqueando el camino

# Página 1: Condición = InterruptorLocal A desactivado
# Gráfico = Snorlax dormido
# Trigger = Acción del jugador

pbMessage("Un enorme Pokémon está dormido y bloquea el camino.")
if pbHasItem?(:POKEFLUTE)
  pbMessage("¿Usar la Pokéflauta?")
  if pbConfirmMessage("¿Quieres despertar a este Pokémon?")
    pbMessage("Has tocado la Pokéflauta...")
    pbSEPlay("Pokeflute")
    pbWait(40)
    pbMessage("¡El Pokémon se ha despertado y está furioso!")
    pbWildBattle(:SNORLAX, 30, 1, false)
    if $game_variables[1] == 4 || $game_variables[1] == 1
      pbSetSelfSwitch(@event_id, "A", true)
    end
  end
else
  pbMessage("No tienes nada para despertarlo...")
end

# Página 2: Condición = InterruptorLocal A activado
# (Sin gráfico ni comandos — el evento desaparece)

Pokémon de Regalo

Los Pokémon de regalo son encuentros donde un NPC da un Pokémon al jugador directamente, sin batalla. Aunque técnicamente no son "encuentros salvajes", se configuran de forma similar mediante eventos:

# NPC que regala un Eevee
pbMessage("¡Tengo un Pokémon especial para ti!")
if pbConfirmMessage("¿Quieres este Eevee?")
  if pbAddPokemon(:EEVEE, 5)
    pbMessage("¡Cuídalo bien!")
    pbSetSelfSwitch(@event_id, "A", true)
  else
    pbMessage("No tienes espacio en tu equipo ni en tu PC...")
  end
else
  pbMessage("Vuelve cuando quieras y será tuyo.")
end

Regalo con características especiales

# Pokémon de regalo con habilidad oculta y objeto equipado
pkmn = Pokemon.new(:EEVEE, 5)
pkmn.ability_index = 2           # Habilidad oculta (Anticipation)
pkmn.item = :EVERSTONE            # Objeto equipado
pkmn.ot_name = "Profesor Serbal"  # Entrenador original
pkmn.obtain_text = "Un regalo del Profesor."
if pbAddPokemonSilent(pkmn)
  pbMessage("¡Has recibido un Eevee especial del Profesor Serbal!")
  pbSetSelfSwitch(@event_id, "A", true)
end

Encuentro con Múltiples Pokémon

Puedes crear un encuentro por evento donde el jugador se enfrente a varios Pokémon salvajes a la vez (batalla doble salvaje):

# Batalla doble contra dos Pokémon salvajes
pbDoubleWildBattle(:PLUSLE, 20, :MINUN, 20, 1, false, true)

Los parámetros son similares a pbWildBattle pero incluyen dos pares de especie/nivel.

Manejo del Self Switch

Los Self Switches son fundamentales para controlar si un encuentro por evento puede repetirse o no:

# Activar Self Switch del evento actual
pbSetSelfSwitch(@event_id, "A", true)

# Activar Self Switch de un evento específico en otro mapa
pbSetSelfSwitch(event_id, "A", true, map_id)

# Desactivar (resetear) un Self Switch
pbSetSelfSwitch(@event_id, "A", false)

Consejos de Diseño

Resolución de Problemas

El evento no inicia la batalla

El Pokémon siempre reaparece

El resultado de la batalla siempre es 0