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
- Crea un nuevo evento en el mapa donde quieres que aparezca el Pokémon.
- Asigna un gráfico al evento: usa el sprite del Pokémon de la carpeta
Graphics/Characters/. - Configura el trigger como "Acción del jugador" para que se active al hablar con él.
- En los comandos del evento, añade el código de la batalla.
- 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:
- Self Switch A: Generalmente se usa para marcar que el evento ya ocurrió.
- Self Switch B, C, D: Disponibles para estados intermedios (por ejemplo, el Pokémon fue derrotado pero no capturado).
# 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
- Siempre reproduce el grito del Pokémon (
Pokemon.play_cry(:SPECIES)) antes de iniciar la batalla para dar una señal auditiva al jugador. - Añade un mensaje de advertencia antes de encuentros legendarios para que el jugador pueda guardar la partida.
- Usa
can_run = falsepara encuentros legendarios que solo deben ocurrir una vez. - Para encuentros que el jugador debe poder reintentar, no desactives el Self Switch si el resultado es derrota del Pokémon.
- Guarda el resultado de la batalla en una variable para tomar decisiones condicionales después.
- Considera usar
can_lose = trueen encuentros legendarios para evitar game over.
Resolución de Problemas
El evento no inicia la batalla
- Verifica que el identificador de la especie es correcto (debe ser un Symbol como
:PIKACHU). - Comprueba que la especie existe en tu archivo
PBS/pokemon.txt. - Asegúrate de que el nivel está en el rango 1-100.
El Pokémon siempre reaparece
- Verifica que estás activando el Self Switch correcto después de la batalla.
- Comprueba que la segunda página del evento tiene como condición el Self Switch que activas.
- Usa
@event_iden lugar de un ID numérico fijo para referirte al evento actual.
El resultado de la batalla siempre es 0
- Asegúrate de pasar el número de variable como tercer parámetro a
pbWildBattle. - Comprueba que la variable referenciada no está siendo sobrescrita por otro script.