Movimientos en Campo

Los movimientos en campo (también llamados movimientos HM o movimientos de campo) son movimientos que los Pokémon pueden usar fuera del combate para interactuar con el mundo. Estos incluyen Corte, Surf, Fuerza, Vuelo, Flash, Cascada, Buceo, Golpe Roca, Treparocas, Remolino, Despejar y Cabezazo.

Lista de movimientos de campo

Movimiento Nombre interno Efecto en campo
Corte (Cut) CUT Corta árboles pequeños que bloquean el camino.
Surf SURF Permite al jugador desplazarse por el agua.
Fuerza (Strength) STRENGTH Permite empujar rocas con eventos de tipo boulder.
Vuelo (Fly) FLY Abre el mapa regional para volar a ciudades visitadas.
Flash FLASH Ilumina cuevas oscuras.
Cascada (Waterfall) WATERFALL Permite subir cascadas de agua.
Buceo (Dive) DIVE Permite sumergirse en aguas profundas y volver a la superficie.
Golpe Roca (Rock Smash) ROCKSMASH Rompe rocas frágiles que bloquean el camino. Puede iniciar un combate salvaje.
Treparocas (Rock Climb) ROCKCLIMB Permite escalar paredes rocosas marcadas.
Remolino (Whirlpool) WHIRLPOOL Disipa remolinos de agua que bloquean el paso.
Despejar (Defog) DEFOG Despeja la niebla en mapas con clima de niebla.
Cabezazo (Headbutt) HEADBUTT Golpea árboles para encontrar Pokémon salvajes escondidos.

Cómo funcionan los movimientos de campo

Los movimientos de campo se gestionan mediante el sistema de HiddenMoveHandlers. Este sistema define dos handlers principales para cada movimiento:

HiddenMoveHandlers::CanUseMove

Este handler comprueba si el movimiento puede usarse en la situación actual. Verifica condiciones como:

HiddenMoveHandlers::CanUseMove.add(:CUT, proc { |move, pkmn, showmsg|
  # Verificar si hay un árbol cortable en frente
  facingEvent = $game_player.pbFacingEvent
  if !facingEvent || facingEvent.name != "Tree"
    pbMessage(_INTL("No se puede usar aquí.")) if showmsg
    next false
  end
  next true
})

HiddenMoveHandlers::UseMove

Este handler ejecuta el efecto del movimiento cuando se usa con éxito:

HiddenMoveHandlers::UseMove.add(:CUT, proc { |move, pokemon|
  # Mostrar animación del Pokémon usando Corte
  pbHiddenMoveAnimation(pokemon)
  # Eliminar el árbol
  facingEvent = $game_player.pbFacingEvent
  if facingEvent
    pbSmashEvent(facingEvent)
    pbMessage(_INTL("¡{1} usó Corte!", pokemon.name))
  end
  next true
})

Configurar mapas para movimientos de campo

Para que los movimientos de campo funcionen correctamente, necesitas configurar los mapas con los elementos adecuados:

Terrain Tags (Etiquetas de terreno)

Los terrain tags son valores asignados a los tiles del mapa que determinan cómo interactúan con los movimientos de campo:

Terrain Tag Uso
Water Tiles de agua donde se puede usar Surf.
Waterfall Tiles de cascada donde se puede usar Cascada.
WaterfallCrest El tile superior de una cascada.
DeepWater Agua profunda donde se puede usar Buceo.
Whirlpool Remolinos de agua que se despejan con Remolino.
RockClimb Paredes escalables con Treparocas.
RockClimbCrest El tile superior de una pared de treparocas.

Eventos del mapa

Algunos movimientos de campo interactúan con eventos del mapa en lugar de terrain tags:

Ejemplo: Configurar un árbol cortable

  1. En RPG Maker, crea un nuevo evento en el mapa.
  2. Ponle el nombre Tree.
  3. Asigna el gráfico del árbol cortable.
  4. Configura la prioridad como "Mismo nivel que el héroe".
  5. El trigger debe ser "Acción del jugador" o "Contacto del jugador".
  6. El sistema de Essentials se encargará del resto.

Ejemplo: Configurar Surf

  1. En el editor de tilesets, asigna el terrain tag Water a los tiles de agua.
  2. Asegúrate de que los tiles de agua estén configurados como intransitables para el jugador a pie.
  3. El handler de Surf detectará automáticamente los tiles de agua y permitirá al jugador navegar.

Crear un movimiento de campo personalizado

Puedes añadir tus propios movimientos de campo registrando handlers de CanUseMove y UseMove:

# Handler para comprobar si se puede usar
HiddenMoveHandlers::CanUseMove.add(:SWEETSCENT, proc { |move, pkmn, showmsg|
  # Solo funciona en hierba alta o cuevas con encuentros
  if !$PokemonEncounters.pbEncounterPossibleHere?
    pbMessage(_INTL("No parece haber Pokémon salvajes aquí.")) if showmsg
    next false
  end
  next true
})

# Handler para ejecutar el efecto
HiddenMoveHandlers::UseMove.add(:SWEETSCENT, proc { |move, pokemon|
  pbHiddenMoveAnimation(pokemon)
  pbMessage(_INTL("¡{1} usó Dulce Aroma!", pokemon.name))
  # Iniciar un encuentro salvaje
  $PokemonEncounters.pbGenerateEncounter
  next true
})

La Base de Sky: Uso de HMs sin medallas

La Base de Sky incluye una opción para permitir el uso de movimientos HM sin necesidad de tener la medalla correspondiente. Esta característica facilita el desarrollo y permite diseños de juego más flexibles.

Configuración

En el archivo de configuración del proyecto, puedes activar o desactivar el requisito de medallas para los HMs:

# En la configuración de La Base de Sky
# Si es true, los HMs se pueden usar sin medalla
POKEMON_HM_SIN_MEDALLA = true

Cuando esta opción está activada:

Nota: Incluso con esta opción activada, el Pokémon sigue necesitando conocer el movimiento HM correspondiente para poder usarlo en el campo.

Resumen de archivos relevantes

Archivo/Sección Contenido
Field_HiddenMoves Handlers principales de CanUseMove y UseMove para cada HM.
Field_Surf Lógica específica de Surf (montar, desmontar, movimiento en agua).
Field_Fly Lógica de Vuelo y selección de destino en el mapa regional.
Field_DiveSurf Lógica de Buceo (sumergirse y emerger).
Game_MapMetadata Metadatos del mapa que pueden afectar a los movimientos de campo (cueva oscura, etc.).