Control de Eventos por Scripts

Los eventos de RPG Maker XP pueden ser controlados y manipulados mediante scripts de Ruby. Essentials proporciona varias funciones para obtener referencias a eventos, moverlos, cambiar sus gráficos, y controlar su comportamiento usando switches y self switches.

Obtener Referencia a un Evento

Para manipular un evento por script, primero necesitas obtener una referencia al mismo.

get_self — El evento actual

# Dentro de un Script del propio evento:
evento = get_self

Devuelve el objeto Game_Event del evento que está ejecutando el script.

get_character — Cualquier evento por ID

# Obtener un evento por su ID en el mapa actual
evento = get_character(5)    # Evento con ID 5

# Obtener al jugador
jugador = get_character(0)   # 0 = jugador
# o también:
jugador = $game_player

# Obtener el propio evento
yo = get_character(-1)       # -1 = este evento

Acceder a eventos por ID directamente

# Acceder a un evento del mapa actual por su ID
evento = $game_map.events[ID_DEL_EVENTO]

# Ejemplo: obtener el evento con ID 3
evento3 = $game_map.events[3]

Mover Eventos con pbMoveRoute

La función pbMoveRoute permite definir una secuencia de movimientos para un evento:

# Mover un evento siguiendo una ruta
pbMoveRoute(evento, [
  PBMoveRoute::Down,        # Mover abajo
  PBMoveRoute::Down,        # Mover abajo de nuevo
  PBMoveRoute::Right,       # Mover a la derecha
  PBMoveRoute::Right,       # Mover a la derecha de nuevo
  PBMoveRoute::TurnUp       # Girar hacia arriba
])

Constantes de movimiento disponibles

Constante Acción
PBMoveRoute::Down Mover abajo
PBMoveRoute::Left Mover a la izquierda
PBMoveRoute::Right Mover a la derecha
PBMoveRoute::Up Mover arriba
PBMoveRoute::TurnDown Girar hacia abajo
PBMoveRoute::TurnLeft Girar a la izquierda
PBMoveRoute::TurnRight Girar a la derecha
PBMoveRoute::TurnUp Girar hacia arriba
PBMoveRoute::Wait Esperar un frame
PBMoveRoute::TurnTowardPlayer Girar hacia el jugador
PBMoveRoute::TurnAwayFromPlayer Girar en sentido opuesto al jugador
PBMoveRoute::StepAnime Activar animación de paso

Mover al jugador

# Mover al jugador con pbMoveRoute
pbMoveRoute($game_player, [
  PBMoveRoute::Up,
  PBMoveRoute::Up,
  PBMoveRoute::Right
])

Cambiar Gráficos de Eventos

Puedes cambiar el sprite de un evento por script:

# Cambiar el gráfico del evento actual
evento = get_self
evento.character_name = "NPC 01"    # Nombre del archivo de charset
evento.character_hue = 0            # Tono de color (0 = normal)

# Hacer invisible un evento (quitar su gráfico)
evento.character_name = ""

# Cambiar la dirección del sprite
evento.direction = 2   # 2=abajo, 4=izq, 6=der, 8=arriba

Switches Globales

Los switches globales son interruptores booleanos (ON/OFF) que afectan a todo el juego. Son compartidos entre todos los mapas:

# Activar un switch global
$game_switches[10] = true

# Desactivar un switch global
$game_switches[10] = false

# Comprobar un switch global
if $game_switches[10]
  pbMessage("El switch 10 está activado.")
end

Los switches globales se definen en RPG Maker XP (Database > System). Se usan comúnmente para:

Self Switches (A, B, C, D)

Los Self Switches son interruptores locales de cada evento. Cada evento tiene 4 self switches: A, B, C y D. Son independientes para cada evento en cada mapa.

# Activar Self Switch "A" del evento actual (dentro del evento)
# Normalmente se hace con el comando de evento "Control Self Switch"

# Por script, dentro del propio evento:
key = [$game_map.map_id, @event_id, "A"]
$game_self_switches[key] = true
$game_map.need_refresh = true

Usos comunes de Self Switches

Ejemplo: Objeto recogible con Self Switch

# Página 1: Self Switch A está OFF
# Gráfico: Poké Ball en el suelo
# Trigger: Action Button

pbMessage("¡Has encontrado una Poción!")
pbReceiveItem(:POTION)
# Activar Self Switch A → cambia a Página 2

# Página 2: Self Switch A está ON
# Gráfico: vacío (sin sprite)
# Sin contenido → el objeto ya fue recogido

pbSetSelfSwitch y pbGetSelfSwitch

Essentials proporciona funciones específicas para manipular Self Switches de otros eventos sin tener que construir la clave manualmente:

pbSetSelfSwitch

# Cambiar el Self Switch de un evento específico
# pbSetSelfSwitch(event_id, switch_name, value, map_id = 0)

# Activar Self Switch "A" del evento 5 en el mapa actual
pbSetSelfSwitch(5, "A", true)

# Desactivar Self Switch "B" del evento 12 en el mapa 25
pbSetSelfSwitch(12, "B", false, 25)

# Activar Self Switch "C" de todos los eventos de este mapa
# (útil para limpiar todos los objetos recogibles, por ejemplo)
for id in $game_map.events.keys
  pbSetSelfSwitch(id, "C", true)
end

pbGetSelfSwitch

# Consultar el estado de un Self Switch
# pbGetSelfSwitch(event_id, switch_name, map_id = 0)

# ¿El evento 5 tiene el Self Switch "A" activado?
if pbGetSelfSwitch(5, "A")
  pbMessage("El evento 5 ya fue activado.")
end

# Comprobar un Self Switch de otro mapa
if pbGetSelfSwitch(3, "B", 25)
  pbMessage("El evento 3 del mapa 25 tiene B activado.")
end

Switches Globales vs Self Switches

Característica Switches Globales Self Switches
Alcance Todo el juego Un evento específico en un mapa
Cantidad Ilimitados (definidos en Database) 4 por evento (A, B, C, D)
Acceso $game_switches[N] pbGetSelfSwitch(id, letra)
Uso ideal Progreso de historia, desbloqueos Estado individual de un evento

Activar/Desactivar Eventos con Switches

La forma más común de controlar la visibilidad de un evento es usar condiciones de página:

# En el editor de eventos de RPG Maker XP:
# Página 1 — Condición: Switch 15 = OFF
#   → El evento está visible y activo

# Página 2 — Condición: Switch 15 = ON
#   → Página vacía (el evento desaparece)

# Para desactivar el evento desde otro script:
$game_switches[15] = true
$game_map.need_refresh = true  # Refrescar el mapa

Patrones Comunes de Scripting de Eventos

NPC guardián (bloquea el paso hasta cierta condición)

# Página 1: Switch "TieneObjeto" está OFF
# Trigger: Player Touch o Event Touch
pbMessage("¡No puedes pasar! Necesitas el Pase VIP.")

# Página 2: Switch "TieneObjeto" está ON
# Sin contenido o movimiento lateral
# → El NPC se aparta y el jugador puede pasar

Evento de batalla con entrenador

# Página 1: Self Switch A = OFF
# Trigger: Event Touch o Player Touch

if TrainerBattle.start(:YOUNGSTER, "Pepe")
  # El jugador ganó
  pbMessage("¡Bien jugado!")
end
# → Activar Self Switch A

# Página 2: Self Switch A = ON
# Trigger: Action Button
pbMessage("¡Me ganaste limpiamente!")

Teletransportar al jugador

# Teletransportar al jugador a otro mapa
pbSEPlay("Door exit")
pbFadeOutIn {
  $game_temp.player_transferring = true
  $game_temp.player_new_map_id = 25     # ID del mapa destino
  $game_temp.player_new_x = 10          # Coordenada X
  $game_temp.player_new_y = 8           # Coordenada Y
  $game_temp.player_new_direction = 2   # Dirección (2=abajo)
}
Importante: Después de modificar switches o self switches por script, recuerda llamar a $game_map.need_refresh = true para que los cambios se reflejen inmediatamente en el mapa. Sin esto, los eventos podrían no actualizar sus páginas hasta que el jugador cambie de mapa.