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