Manipular Objetos

Esta página explica cómo manipular objetos mediante scripts en Pokémon Essentials. Los objetos del jugador se almacenan en el objeto $bag (la mochila), y existen diversas funciones para dar, quitar, comprobar y seleccionar objetos por script.

El objeto $bag

La mochila del jugador se representa mediante la variable global $bag, que es una instancia de la clase PokemonBag. Esta clase gestiona todos los objetos del jugador, organizados por bolsillos.

Métodos principales de $bag

Método Descripción Ejemplo
$bag.add(item, qty) Añade una cantidad de un objeto a la mochila. Devuelve true si se pudo añadir. $bag.add(:POTION, 5)
$bag.remove(item, qty) Quita una cantidad de un objeto de la mochila. Si no se indica cantidad, quita 1. $bag.remove(:POTION, 3)
$bag.has?(item, qty) Comprueba si el jugador tiene al menos qty unidades del objeto. Si no se indica cantidad, comprueba si tiene al menos 1. $bag.has?(:POTION)
$bag.quantity(item) Devuelve la cantidad del objeto que tiene el jugador. $bag.quantity(:POKEBALL)
$bag.can_add?(item, qty) Comprueba si se puede añadir esa cantidad del objeto. Útil si hay límite de espacio en el bolsillo. $bag.can_add?(:POTION, 10)
$bag.pockets Devuelve un array con todos los bolsillos y su contenido. $bag.pockets

Dar objetos al jugador

La forma más común de dar un objeto al jugador es mediante las funciones de alto nivel, que incluyen mensajes y animaciones automáticas.

pbReceiveItem

Muestra un mensaje de que el jugador recibió el objeto, con fanfarria y animación. Ideal para eventos de historia, NPCs que dan regalos, etc.

# Dar 1 Poción al jugador con mensaje
pbReceiveItem(:POTION)

# Dar 3 Súper Pociones
pbReceiveItem(:SUPERPOTION, 3)

La función devuelve true si el objeto se añadió correctamente. Si la mochila está llena, mostrará un mensaje al jugador indicando que no tiene espacio.

pbItemBall

Se usa específicamente para objetos que el jugador recoge del suelo (Item Balls en el mapa). Muestra un mensaje apropiado para esa situación.

# El jugador recoge un objeto del suelo
pbItemBall(:NUGGET)

# Recoger varias unidades
pbItemBall(:ULTRABALL, 3)

Devuelve true si el objeto fue recogido. Esta función se utiliza normalmente en los eventos de objetos del mapa (ver Objetos en el Mapa).

Dar objetos silenciosamente

Si necesitas dar un objeto sin mostrar ningún mensaje (por ejemplo, al inicio del juego), puedes usar $bag.add directamente:

# Dar objetos sin mensaje
$bag.add(:POTION, 5)
$bag.add(:POKEBALL, 10)
$bag.add(:TOWNMAP)   # Cantidad 1 por defecto

Quitar objetos al jugador

Para quitar objetos de la mochila del jugador:

# Quitar 1 Poción
$bag.remove(:POTION)

# Quitar 3 Poké Balls
$bag.remove(:POKEBALL, 3)

# Quitar con verificación previa
if $bag.has?(:OLDROD)
  $bag.remove(:OLDROD)
  pbMessage(_INTL("Entregaste la Caña Vieja."))
end

Comprobar objetos

Puedes verificar si el jugador posee un objeto determinado de varias maneras:

Comprobar si tiene al menos 1

if $bag.has?(:BICYCLE)
  pbMessage(_INTL("¡Ya tienes una Bicicleta!"))
end

Comprobar cantidad mínima

if $bag.has?(:POKEBALL, 5)
  pbMessage(_INTL("Tienes suficientes Poké Balls."))
else
  pbMessage(_INTL("Necesitas al menos 5 Poké Balls."))
end

Obtener la cantidad exacta

qty = $bag.quantity(:RARECANDY)
pbMessage(_INTL("Tienes {1} Caramelos Raros.", qty))

Comprobar cualquier objeto de un grupo

# Comprobar si tiene alguna baya
tiene_baya = false
GameData::Item.each do |item|
  next unless item.pocket == 5  # Bolsillo de bayas
  if $bag.has?(item.id)
    tiene_baya = true
    break
  end
end

Diálogos de selección de objetos

pbChooseItem

Abre la mochila y permite al jugador seleccionar un objeto. Devuelve el símbolo del objeto seleccionado, o nil si el jugador cancela.

# Abrir la mochila y elegir un objeto
item = pbChooseItem
if item
  pbMessage(_INTL("Elegiste: {1}", GameData::Item.get(item).name))
else
  pbMessage(_INTL("No elegiste nada."))
end

pbChooseApricorn

Permite al jugador seleccionar una bonguri (Apricorn) de su mochila:

apricorn = pbChooseApricorn
if apricorn
  pbMessage(_INTL("Elegiste un Bonguri."))
end

pbChoosePokemon con uso de objeto

Después de seleccionar un objeto, puedes pedir que el jugador elija un Pokémon para usarlo:

# Usar un objeto sobre un Pokémon
pbUseItem($bag, :RARECANDY)

Objetos equipados a Pokémon

Los Pokémon pueden llevar un objeto equipado. Estos métodos permiten manipular el objeto equipado:

Método Descripción
pkmn.item Devuelve el símbolo del objeto equipado, o nil si no tiene.
pkmn.item = :LEFTOVERS Equipa un objeto al Pokémon.
pkmn.hasItem? Devuelve true si el Pokémon tiene un objeto equipado.
pkmn.hasItem?(:LEFTOVERS) Devuelve true si el Pokémon tiene equipado ese objeto específico.
pkmn.item = nil Quita el objeto equipado del Pokémon.

Ejemplo: Equipar un objeto a un Pokémon del equipo

# Equipar Restos al primer Pokémon del equipo
pkmn = $player.party[0]
if pkmn
  pkmn.item = :LEFTOVERS
  pbMessage(_INTL("{1} ahora lleva Restos.", pkmn.name))
end

Ejemplo: Quitar y devolver objeto a la mochila

pkmn = $player.party[0]
if pkmn && pkmn.hasItem?
  item = pkmn.item
  pkmn.item = nil
  $bag.add(item)
  pbMessage(_INTL("Se devolvió {1} a la mochila.",
            GameData::Item.get(item).name))
end

Compatibilidad MT/MO

Para comprobar si un Pokémon puede aprender un movimiento de una MT o MO:

# Obtener el movimiento que enseña una MT
move = GameData::Item.get(:TM01).move

# Comprobar si el Pokémon puede aprenderlo
pkmn = $player.party[0]
if pkmn.compatible_with_move?(move)
  pbMessage(_INTL("{1} puede aprender {2}.",
            pkmn.name, GameData::Move.get(move).name))
else
  pbMessage(_INTL("{1} no es compatible con este movimiento.", pkmn.name))
end

Enseñar un movimiento de MT por script

# Enseñar el movimiento de la MT01 al primer Pokémon
pkmn = $player.party[0]
move = GameData::Item.get(:TM01).move
if pkmn.compatible_with_move?(move)
  pbLearnMove(pkmn, move)
end

Funciones útiles adicionales

Función Descripción
GameData::Item.get(:POTION) Obtiene los datos del objeto (nombre, precio, bolsillo, etc.).
GameData::Item.get(:POTION).name Devuelve el nombre visible del objeto.
GameData::Item.get(:POTION).pocket Devuelve el número de bolsillo del objeto.
GameData::Item.get(:POTION).price Devuelve el precio de compra del objeto.
GameData::Item.exists?(:MIOBJ) Comprueba si un objeto con ese ID interno existe en los datos compilados.
GameData::Item.get(:TM01).move Devuelve el movimiento asociado a una MT/MO.
$player.money Devuelve la cantidad de dinero del jugador.
$player.money += 1000 Añade dinero al jugador.
$player.money -= 500 Quita dinero al jugador (el motor lo limita a 0 como mínimo).

Ejemplo práctico: Tienda personalizada por evento

Puedes crear una tienda que venda objetos específicos desde un evento de RPG Maker:

# Tienda con objetos específicos
pbPokemonMart([
  :POTION,
  :SUPERPOTION,
  :ANTIDOTE,
  :PARALYZEHEAL,
  :POKEBALL,
  :GREATBALL
])

Tienda con precios personalizados

# Tienda con precios individuales (objeto, precio)
pbPokemonMart([
  [:POTION, 150],
  [:SUPERPOTION, 500],
  [:POKEBALL, 100]
])

Tienda que también compra objetos

# Tienda normal (compra y venta)
pbPokemonMart([:POTION, :SUPERPOTION, :POKEBALL])

# Tienda que solo vende (no compra al jugador)
pbPokemonMart([:POTION, :SUPERPOTION], _INTL("¿En qué puedo ayudarte?"), true)

Ejemplo: Intercambio de objetos con NPC

# Un NPC cambia 3 Bayas Aranja por 1 Caramelo Raro
if $bag.has?(:ORANBERRY, 3)
  if pbConfirmMessage(_INTL("¿Quieres cambiar 3 Bayas Aranja por 1 Caramelo Raro?"))
    $bag.remove(:ORANBERRY, 3)
    pbReceiveItem(:RARECANDY)
  end
else
  pbMessage(_INTL("Necesitas 3 Bayas Aranja para el intercambio."))
end