Registrarse

[RPG - Scripting] [Essentials] Obtener el internal name de movimientos

orken

Software dev por profesión y por afición
Buenas, estoy tratando de añadir un objeto clave para poder exportar el equipo que tienes al formato requerido por Pokemon Showdown, no tengo experiencia ni en RPG Maker ni en Ruby, pero si tengo varios años de experiencia como programador.

El propósito de esto es poder añadir el objeto a diversos juegos creados en RPG Maker y así poder hacer dualockes con un colega, además de compartirlo con la comunidad para quien quiera añadirlo en sus juegos.

De momento tengo un bucle que recorre la lista de pokes, obtengo el apodo, el nombre de la especie y el género... en teoría, el formato de pokemon showdown espera lo siguiente:

Código:
Chorizo (Charmeleon) (M)  @ Charcoal 
Ability: Compound Eyes 
Level: 20 
EVs: 7 HP / 8 Atk / 6 Def / 9 SpA / 5 SpD / 13 Spe 
Impish Nature 
IVs: 3 HP / 23 Def / 22 SpA / 16 SpD / 6 Spe 
- Metal Burst 
- U-turn 
- Horn Attack 
- Flare Blitz
De momento, lo que estoy consiguiendo es que me escriba en un archivo txt lo siguiente; se puede ver que Monferno lleva un Repelente, pero Pokemon Showdown esperaría el nombre en inglés, en este caso Repel.

He realizado varias pruebas y el nombre no debe ser idéntico, ya que aparentemente, Pokemon Showdown te asigna el objeto en relación en base a la relevancia con los objetos que contenga, en el caso de "Cascabel Concha", cuyo ID interno es SHELLBELL, podríamos indicarle esto, y automáticamente nos debería de asignar "Shell bell" a nuestro poke.

Código:
Inferno (Monferno) (M) @ Repelente
Jaws (Gible) (M) 
Iberdrola (Heliolisk) (M) 
JackiChwan (Shroomish) (M) 
Cranidos (Cranidos) (M) 
OTRAVEZNO! (Vibrava) (F)
Este es el código que tengo de momento, de momento, estoy obteniendo el nombre del objeto a través de PBItems.GetName(...), pero lo que necesitaría sería o bien el nombre en inglés, que dudo que sea posible, o bien el nombre interno del objeto.
Ruby:
ItemHandlers::UseFromBag.add(:SHOWDOWN,proc{|item|
  file = File.new("export.txt", "w")
  for poke in $Trainer.party
    #shodown #1 line : apodo + 
    speciesName = PBSpecies.getName(poke.species)
    file.write(poke.name + " (" + speciesName + ") ")
    #Definimos el género del poke
    gender = " "
    case poke.gender
    when 0
      gender = "(M) "
    when 1
      gender = "(F) "
    end
  file.write(gender)
  #Añadimos el objeto
  itemname = PBItems.getName(poke.item)
  #Si itemname.length es mayor que cero y distinto de nil (PENDIENTE DE MEJORAR)
  if itemname.length > 0 && itemname != nil 
    file.write("@ " + itemname)
  end

  file.write("\n")
  end
  Kernel.pbMessage(_INTL("Se ha debido de crear un archivo de texto"))
})
¿Cómo puedo encontrar el ID interno de los distintos objetos? Además de esto, ¿Existe una documentación un poco más específica que me pueda ayudar con estas cosas?
 

Manurocker95

Doctorando en Ingeniería Biomédica & Game Dev
Miembro insignia
¿Cómo puedo encontrar el ID interno de los distintos objetos? Además de esto, ¿Existe una documentación un poco más específica que me pueda ayudar con estas cosas?
El internalID es el que estableces en el PBS > items.txt. Ejemplo:

1672605425795.png


Aunque decirte que a partir de Essentials 20, puedes utilizar la Standard Library de Ruby 3.0 (aquí tienes mi tutorial: [Script] - Ruby Standard Library (RSL) para Pokémon Essentials 20.1+ | Whack a Hack Foro! ) para exportar el equipo fácilmente a un JSON compatible con showdown con algo tipo (proveniente de AceOfSpadesProduc100 en PokeCommunity):

Código:
$:.push File.join(Dir.pwd, "Ruby Library 3.0.0")
require 'json'

ESSENTIALS_IV_TO_SHOWDOWN = { HP: 'HP', ATTACK: 'Atk', DEFENSE: 'Def', SPECIAL_ATTACK: 'SpA', SPECIAL_DEFENSE: 'SpD', SPEED: 'Spe' }

def pbExportJSONToShowdown
  party = $Trainer.party.compact.map do |pokemon|
    next {
      name: pokemon.species.name.to_s.downcase,
      level: pokemon.level,
      item: pokemon.hasItem? ? pokemon.item.name : nil,
      ball: pokemon.poke_ball,
      moves: pokemon.moves.compact.reject { |move| move.id == 0 }.map { |move| move.name.to_s },
      form: pokemon.form,
      ability: pokemon.ability.name,
      ability_index: pokemon.ability_index,
      nature: pokemon.nature.id,
      ivs: pokemon.iv.select { |_, v| v < 31 }.transform_keys { |k| ESSENTIALS_IV_TO_SHOWDOWN[k] },
      evs: pokemon.ev.select { |_, v| v >= 0 }.transform_keys { |k| ESSENTIALS_IV_TO_SHOWDOWN[k] },
      happiness: pokemon.happiness,
      nickname: pokemon.name.to_s,
      language: pokemon.owner.language,
      timeReceived: pokemon.timeReceived.to_i,
      shiny: pokemon.shiny?,
      gender: pokemon.gender == 0 ? 'M' : 'F'
    }.compact
  end
  filename = @scene.pbEnterText(_INTL("Name for the team?"), 1, 12)
  Dir.mkdir("Saved teams/") if !Dir.exists?("Saved teams/")
    file = File.new("Saved teams/" + filename + ".json", "w+")
    file.write({ teams: [{ pokemon: party }] }.to_json)
end
Y podrías hacer el efecto inverso (importar) con:

Código:
$:.push File.join(Dir.pwd, "Ruby Library 3.0.0")
# Import the library
require 'json'
def pbImportFromShowdown
    filename = @scene.pbEnterText(_INTL("Name? (Case insensitive)"),1,12)
    begin
        file = File.read("Saved teams/" + filename + ".json")
        data_hash = JSON.parse(file)
        data_hash['teams'][0]['pokemon'].each do |i|
            #.upcase.gsub(/\W/,'').to_sym means to convert into uppercase, include only letters and no spaces, and convert into a Ruby symbol, a variable with a : at the beginning
            p = Pokemon.new(i['name'].upcase.gsub(/\W/,'').to_sym,i['level'] ? i['level'] : 50)
            plevel = i['level'] ? i['level'] : 50
            p.item = i['item'].upcase.gsub(/\W/,'').to_sym if i['item']
            p.poke_ball = i['ball'].upcase.gsub(/\W/,'').to_sym if i['ball']
            if i['moves'] && i['moves'].length > 0
                i['moves'].each do |j|
                    p.learn_move(j.upcase.gsub(/\W/,'').to_sym)
                end
            else
                p.reset_moves
            end
            p.form = i['form'] if i['form']
            if i['gender'] == 'M'
                p.makeMale
            else
                p.makeFemale
            end
            p.ability= i['ability'] if i['ability']
            p.ability_index = i['ability_index'] if i['ability_index']
            p.shiny = i['shiny'] if i['shiny']
            p.nature = i['nature'].upcase.gsub(/\W/,'').to_sym if i['nature']
            if i['ivs']
                p.iv[:HP] = i['ivs']['HP'] ? i['ivs']['HP'] : p.iv[:HP] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:ATTACK] = i['ivs']['Atk'] ? i['ivs']['Atk'] : p.iv[:ATTACK] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:DEFENSE] = i['ivs']['Def'] ? i['ivs']['Def'] : p.iv[:DEFENSE] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPECIAL_ATTACK] = i['ivs']['SpA'] ? i['ivs']['SpA'] : p.iv[:SPECIAL_ATTACK] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPECIAL_DEFENSE] = i['ivs']['SpD'] ? i['ivs']['SpD'] : p.iv[:SPECIAL_DEFENSE] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPEED] = i['ivs']['Spe'] ? i['ivs']['Spe'] : p.iv[:SPEED] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
            else
                p.iv[:HP] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:ATTACK] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:DEFENSE] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPECIAL_ATTACK] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPECIAL_DEFENSE] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
                p.iv[:SPEED] = [plevel / 2, Pokemon::IV_STAT_LIMIT].min
            end
            if i['evs']
                p.ev[:HP] = i['evs']['HP'] ? i['evs']['HP'] : p.ev[:HP] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:ATTACK] = i['evs']['Atk'] ? i['evs']['Atk'] : p.ev[:ATTACK] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:DEFENSE] = i['evs']['Def'] ? i['evs']['Def'] : p.ev[:DEFENSE] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPECIAL_ATTACK] = i['evs']['SpA'] ? i['evs']['SpA'] : p.ev[:SPECIAL_ATTACK] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPECIAL_DEFENSE] = i['evs']['SpD'] ? i['evs']['SpD'] : p.ev[:SPECIAL_DEFENSE] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPEED] = i['evs']['Spe'] ? i['evs']['Spe'] : p.ev[:SPEED] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
            else
                p.ev[:HP] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:ATTACK] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:DEFENSE] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPECIAL_ATTACK] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPECIAL_DEFENSE] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
                p.ev[:SPEED] = [plevel * 3 / 2, Pokemon::EV_LIMIT / 6].min
            end
            p.happiness = i['happiness'] if i['happiness']
            p.name = i['nickname'] if i['nickname']
            p.owner.language = i['language'] if i['language']
            p.timeReceived = Time.at(i['timeReceived']) if i['timeReceived']
            p.calc_stats
            (0) rescue nil; pbAddPokemonSilent(p)
        end
        pbMessage(_INTL($Trainer.name + "\\se[] obtained some Pokémon!\\me[Pkmn get]\\wtnp[30]"))
    rescue
        pbMessage(_INTL("An error occurred. Check for JSON-specific errors in a JSON validator, or refer to \"showdowntoessentialsguide.txt\" for team-specific errors."))
    end
end
 
Arriba