Definir una Cinta

Las cintas (ribbons) son marcas honoríficas que se otorgan a los Pokémon como reconocimiento de logros. Pueden obtenerse al ganar concursos, completar desafíos de batalla, superar ciertas condiciones especiales o como recompensas de eventos. Las cintas se muestran en la pantalla de resumen del Pokémon y no tienen efecto directo en combate, aunque algunas pueden tener funciones especiales (como la Cinta Esfuerzo). Se definen en el archivo PBS ribbons.txt.

Ubicación del archivo

PBS/ribbons.txt

Formato de una entrada de cinta

Cada cinta se define como un bloque con un identificador interno entre corchetes, seguido de sus propiedades:

[HOENNCOOL]
Name        = Cinta Cool de Hoenn
IconPosition = 0
Description = Cinta otorgada a un Pokémon genial. Se otorga en concursos de Hoenn.

Propiedades disponibles

PropiedadDescripciónObligatoria
NameNombre visible de la cinta que se muestra en la pantalla de resumen.
IconPositionPosición del icono de la cinta en la imagen de iconos (Graphics/UI/ribbons.png). Los iconos se cuentan desde 0.
DescriptionDescripción de la cinta que aparece al seleccionarla en la pantalla de resumen.
FlagsFlags opcionales para la cinta (uso interno, rara vez necesario).No

Cintas predeterminadas

Pokémon Essentials incluye una amplia colección de cintas predefinidas que replican las de los juegos oficiales. Estas son algunas de las más importantes:

Cintas de concurso (Hoenn)

ID internoNombreDescripción
HOENNCOOLCinta Cool de HoennConcurso Cool de rango Normal.
HOENNCOOLSUPERCinta Cool Super de HoennConcurso Cool de rango Super.
HOENNCOOLHYPERCinta Cool Hyper de HoennConcurso Cool de rango Hyper.
HOENNCOOLMASTERCinta Cool Master de HoennConcurso Cool de rango Master.
HOENNBEAUTYCinta Belleza de HoennConcurso de Belleza de rango Normal.
HOENNCUTECinta Dulzura de HoennConcurso de Dulzura de rango Normal.
HOENNSMARTCinta Ingenio de HoennConcurso de Ingenio de rango Normal.
HOENNTOUGHCinta Dureza de HoennConcurso de Dureza de rango Normal.

Cintas de combate

ID internoNombreDescripción
WINNINGCinta TriunfoOtorgada por superar la racha de 7 victorias en la Torre Batalla.
VICTORYCinta VictoriaOtorgada por superar la racha de 49 victorias en la Torre Batalla.
ABILITYCinta HabilidadOtorgada al superar la Fábrica Batalla.
GREATABILITYCinta Gran HabilidadOtorgada al superar la Fábrica Batalla en nivel superior.

Cintas especiales

ID internoNombreDescripción
CHAMPIONCinta CampeónOtorgada al entrar en el Salón de la Fama.
EFFORTCinta EsfuerzoOtorgada a un Pokémon que ha alcanzado el máximo de EVs (510).
ALERTCinta AlertaOtorgada al Pokémon con gran vivacidad.
SHOCKCinta ChoqueOtorgada al Pokémon que causa gran impresión.
DOWNCASTCinta MelancolíaUn Pokémon que a veces se pone triste.
CARELESSCinta DescuidoUn Pokémon algo despistado.
RELAXCinta RelaxUn Pokémon que sabe relajarse.
SNOOZECinta SiestaUn Pokémon al que le gusta dormir.
SMILECinta SonrisaUn Pokémon que siempre sonríe.
GORGEOUSCinta PreciosaUna cinta lujosa y cara.
ROYALCinta RealUna cinta extremadamente lujosa.
GORGEOUSROYALCinta Preciosa RealLa cinta más lujosa que existe.
FOOTPRINTCinta HuellaOtorgada por el anciano de las huellas al Pokémon con máxima felicidad.
BIRTHDAYCinta CumpleañosCinta conmemorativa de cumpleaños.
SPECIALCinta EspecialUna cinta de evento especial.
CLASSICCinta ClásicaCinta de un evento de distribución especial.
PREMIERCinta PremierCinta de estreno de un evento.

Otorgar cintas por script

Puedes dar cintas a los Pokémon del jugador usando comandos de script. El método principal es giveRibbon:

Dar una cinta al primer Pokémon del equipo

# Otorgar la Cinta Campeón al primer Pokémon
$player.party[0].giveRibbon(:CHAMPION)
pbMessage(_I("¡Tu Pokémon ha recibido la Cinta Campeón!"))

Dar una cinta a todo el equipo

# Otorgar la Cinta Campeón a todo el equipo (al entrar al Salón de la Fama)
$player.party.each do |pkmn|
  pkmn.giveRibbon(:CHAMPION)
end
pbMessage(_I("¡Todos tus Pokémon han recibido la Cinta Campeón!"))

Dar una cinta a un Pokémon elegido por el jugador

# Permitir al jugador elegir a qué Pokémon dar la cinta
pbChoosePokemon(1, 2)  # Variable 1 = índice, Variable 2 = validación
pkmn = $player.party[pbGet(1)]
if pkmn
  pkmn.giveRibbon(:EFFORT)
  pbMessage(_I("¡#{pkmn.name} ha recibido la Cinta Esfuerzo!"))
end

Comprobar si un Pokémon tiene una cinta

# Verificar si el primer Pokémon tiene la Cinta Campeón
if $player.party[0].hasRibbon?(:CHAMPION)
  pbMessage(_I("Este Pokémon ya tiene la Cinta Campeón."))
else
  pbMessage(_I("Este Pokémon no tiene la Cinta Campeón."))
end

# Contar cintas de un Pokémon
count = $player.party[0].numRibbons
pbMessage(_I("Este Pokémon tiene #{count} cintas."))

# Verificar si algún Pokémon del equipo tiene la cinta
has_it = $player.party.any? { |p| p.hasRibbon?(:CHAMPION) }

Quitar cintas

# Quitar una cinta a un Pokémon
$player.party[0].takeRibbon(:EFFORT)
pbMessage(_I("Se ha retirado la Cinta Esfuerzo."))

Visualización en la pantalla de resumen

Las cintas aparecen en la pantalla de resumen del Pokémon, generalmente en la última pestaña (pestaña de cintas/marcas). Cada cinta se muestra como un icono pequeño. Al seleccionar una cinta, se muestra su nombre y descripción.

Los iconos se cargan desde:

Graphics/UI/ribbons.png

Esta imagen es un sprite sheet donde cada cinta ocupa un espacio fijo. La propiedad IconPosition de cada cinta indica qué posición del sprite sheet usar.

Crear una cinta personalizada

Para añadir una cinta nueva a tu juego, sigue estos pasos:

Paso 1: Añadir la entrada en ribbons.txt

[EXPLORER]
Name        = Cinta Explorador
IconPosition = 50
Description = Otorgada al Pokémon que ha acompañado a su entrenador por 100 mapas diferentes.

Paso 2: Crear el icono

Edita Graphics/UI/ribbons.png y añade un icono en la posición 50. El icono debe tener el mismo tamaño que los demás (generalmente 32×32 o 64×64 píxeles, según la configuración de tu proyecto).

Diseña el icono con:

Paso 3: Implementar la lógica de obtención

Crea el código que otorgue la cinta cuando se cumpla la condición. Por ejemplo, para una cinta que se otorga al visitar 100 mapas:

# En un evento Common Event o en un script que se ejecute al cambiar de mapa
$PokemonGlobal.maps_visited ||= []
unless $PokemonGlobal.maps_visited.include?($game_map.map_id)
  $PokemonGlobal.maps_visited.push($game_map.map_id)
end

if $PokemonGlobal.maps_visited.length >= 100
  pkmn = $player.party[0]
  unless pkmn.hasRibbon?(:EXPLORER)
    pkmn.giveRibbon(:EXPLORER)
    pbMessage(_I("¡#{pkmn.name} ha recibido la Cinta Explorador\\npor acompañarte en más de 100 lugares!"))
  end
end

Paso 4: Compilar

Compila el juego desde el menú de depuración para que el nuevo dato se cargue.

Ejemplo: Cinta de evento especial

Las cintas de eventos son perfectas para distribuciones especiales o misiones secundarias:

# Definir en ribbons.txt
[FESTIVAL]
Name        = Cinta Festival
IconPosition = 51
Description = Otorgada a los Pokémon que participaron en el Festival Anual de la Ciudad.

# Evento NPC que otorga la cinta
# Condición: Game Switch [FESTIVAL_ACTIVE] = ON

pbMessage(_I("¡Bienvenido al Festival Pokémon!"))
pbMessage(_I("Como recuerdo, tu Pokémon recibirá una cinta especial."))

pbChooseNonEggPokemon(1, 2)
pkmn = $player.party[pbGet(1)]
if pkmn
  if pkmn.hasRibbon?(:FESTIVAL)
    pbMessage(_I("¡#{pkmn.name} ya tiene la Cinta Festival!"))
  else
    pkmn.giveRibbon(:FESTIVAL)
    pbMessage(_I("¡#{pkmn.name} ha recibido la Cinta Festival!"))
  end
end

Cintas con funciones especiales

Aunque la mayoría de las cintas son puramente cosméticas, puedes programar funciones especiales asociadas:

Cinta que permite acceso a un área

# Bloquear acceso a una zona VIP
has_vip = $player.party.any? { |p| p.hasRibbon?(:ROYAL) }
if has_vip
  pbMessage(_I("Tienes un Pokémon con la Cinta Real. Puedes pasar."))
  # Transferir al jugador a la zona VIP
  pbTransferPlayer(MAP_ID, X, Y)
else
  pbMessage(_I("Solo los entrenadores con un Pokémon con Cinta Real pueden entrar."))
end

NPC que valora las cintas

# NPC que cuenta las cintas totales del equipo
total = 0
$player.party.each { |p| total += p.numRibbons }
pbMessage(_I("¡Tu equipo tiene un total de #{total} cintas!"))
if total >= 20
  pbMessage(_I("¡Impresionante! Eres un verdadero coleccionista de cintas."))
elsif total >= 10
  pbMessage(_I("¡Muy bien! Tienes una bonita colección."))
elsif total > 0
  pbMessage(_I("Un buen comienzo. ¡Sigue recolectando cintas!"))
else
  pbMessage(_I("Vaya, no tienes ninguna cinta. ¡Intenta ganar algunas!"))
end

Cinta Esfuerzo automática

La Cinta Esfuerzo se otorga automáticamente cuando un Pokémon alcanza el máximo de EVs (510 puntos totales). Sin embargo, si deseas otorgarla manualmente vía NPC (como en los juegos oficiales):

# NPC que otorga la Cinta Esfuerzo
pbMessage(_I("Déjame ver a tu Pokémon..."))
pbChooseNonEggPokemon(1, 2)
pkmn = $player.party[pbGet(1)]
if pkmn
  total_evs = pkmn.ev.values.sum
  if total_evs >= Pokemon::EV_LIMIT
    if pkmn.hasRibbon?(:EFFORT)
      pbMessage(_I("Este #{pkmn.name} ya tiene la Cinta Esfuerzo."))
    else
      pkmn.giveRibbon(:EFFORT)
      pbMessage(_I("¡Tu #{pkmn.name} se ha esforzado mucho!"))
      pbMessage(_I("Le otorgo la Cinta Esfuerzo como reconocimiento."))
    end
  else
    pbMessage(_I("Tu #{pkmn.name} aún puede esforzarse más."))
    pbMessage(_I("Vuelve cuando haya alcanzado su máximo potencial."))
  end
end

Acceder a datos de cintas por script

# Obtener información de una cinta
ribbon_data = GameData::Ribbon.get(:CHAMPION)
pbMessage("Nombre: #{ribbon_data.name}")
pbMessage("Descripción: #{ribbon_data.description}")

# Verificar si una cinta existe
if GameData::Ribbon.exists?(:EXPLORER)
  pbMessage("La Cinta Explorador está definida.")
end

# Iterar sobre todas las cintas
GameData::Ribbon.each do |ribbon|
  pbMessage("#{ribbon.id} - #{ribbon.name}")
end

Consejos y buenas prácticas