Box Auto-Sort es un plugin que añade funcionalidad de ordenamiento automático al sistema de almacenamiento de PC en Pokémon Essentials. Permite organizar los Pokémon en las cajas usando múltiples criterios de ordenamiento con vista previa opcional.
# En 000_Settings.rbmodule BoxAutoSort # Habilitar/deshabilitar el sistema completo ENABLED = true # Mostrar vista previa antes de ordenar (recomendado) SHOW_PREVIEW = false # Número máximo de Pokémon a mostrar en vista previa PREVIEW_COUNT = 30end
Si SHOW_PREVIEW está en false, los cambios se aplicarán inmediatamente sin confirmación. Se recomienda dejarlo en true para evitar ordenamientos accidentales.
# Ejemplo de uso directosorter = BoxAutoSort::BoxSorter.new($PokemonStorage, 0)sorter.sort_pokemon(:LEVEL_ASC) # Menor a mayorsorter.sort_pokemon(:LEVEL_DESC) # Mayor a menor
# Ordenamiento por tiposorter.sort_pokemon(:TYPE_PRIMARY) # Por tipo primariosorter.sort_pokemon(:TYPE_DUAL) # Por combinación completa# Orden de tipos (por ID):# NORMAL, FIGHTING, FLYING, POISON, GROUND, ROCK, BUG, GHOST, STEEL,# FIRE, WATER, GRASS, ELECTRIC, PSYCHIC, ICE, DRAGON, DARK, FAIRY
# El jugador puede acceder desde:# 1. Abrir el PC# 2. Hacer clic en el nombre de cualquier caja# 3. Seleccionar "Ordenar" del menú# 4. Elegir método de ordenamiento# 5. Confirmar en la vista previa
# También disponible desde:# 1. Acceder al PC desde cualquier Centro Pokémon# 2. Seleccionar "Box Auto-Sort" del menú principal# 3. Elegir qué caja ordenar# 4. Seleccionar método de ordenamiento
# Obtener todos los Pokémon en la caja (excluye espacios vacíos)pokemon_list = sorter.get_pokemon_list# Retorna: Array de [pokemon, posicion]# Ejemplo: [[pokemon1, 0], [pokemon2, 3], [pokemon5, 8]]
# Aplicar ordenamientosuccess = sorter.sort_pokemon(:LEVEL_ASC)# Retorna: true si se ordenó correctamente, false si hubo errorif success pbMessage("¡Caja ordenada exitosamente!")else pbMessage("No se pudo ordenar la caja.")end
# Obtener vista previa sin aplicar cambiospreview = sorter.preview_sort(:LEVEL_ASC)# Retorna: Array ordenado de [pokemon, posicion_original]# Los cambios NO se aplican a la caja
Estos métodos son usados internamente pero pueden ser útiles:
# Comparar por tipo primariodef compare_types(pkmn1, pkmn2) type1_id = GameData::Type.get(pkmn1.type1).id_number type2_id = GameData::Type.get(pkmn2.type1).id_number return type1_id <=> type2_idend# Comparar por tipo dualdef compare_types_dual(pkmn1, pkmn2) # Primero compara tipo primario, luego secundario result = compare_types(pkmn1, pkmn2) return result if result != 0 type1_id = GameData::Type.get(pkmn1.type2).id_number type2_id = GameData::Type.get(pkmn2.type2).id_number return type1_id <=> type2_idend# Comparar por fecha de capturadef compare_catch_date(pkmn1, pkmn2) return pkmn2.timeReceived <=> pkmn1.timeReceivedend# Comparar shiny primerodef compare_shiny_first(pkmn1, pkmn2) return -1 if pkmn1.shiny? && !pkmn2.shiny? return 1 if !pkmn1.shiny? && pkmn2.shiny? return 0end# Comparar por ID de especiedef compare_species_id(pkmn1, pkmn2) id1 = GameData::Species.get(pkmn1.species).id_number id2 = GameData::Species.get(pkmn2.species).id_number return id1 <=> id2end# Comparar por especie y formadef compare_form_id(pkmn1, pkmn2) result = compare_species_id(pkmn1, pkmn2) return result if result != 0 return pkmn1.form <=> pkmn2.formend
Ejemplo 1: Ordenamiento Personalizado desde Script
# Ordenar la primera caja por niveldef sort_first_box_by_level return if !$PokemonStorage sorter = BoxAutoSort::BoxSorter.new($PokemonStorage, 0) if sorter.sort_pokemon(:LEVEL_DESC) pbMessage("¡La primera caja ha sido ordenada por nivel!") else pbMessage("La caja está vacía o hubo un error.") endend# Llamar desde eventosort_first_box_by_level
def sort_all_boxes(method = :LEVEL_ASC) return if !$PokemonStorage sorted_count = 0 $PokemonStorage.maxBoxes.times do |box_index| sorter = BoxAutoSort::BoxSorter.new($PokemonStorage, box_index) sorted_count += 1 if sorter.sort_pokemon(method) end pbMessage("Se ordenaron #{sorted_count} cajas.")end# Usosort_all_boxes(:SPECIES_ID) # Ordenar todas por Pokédex Nacional
def custom_sort_with_preview(box_index, method) sorter = BoxAutoSort::BoxSorter.new($PokemonStorage, box_index) # Obtener vista previa preview = sorter.preview_sort(method) if preview.empty? pbMessage("La caja está vacía.") return end # Mostrar primeros 5 Pokémon del resultado message = "Primeros 5 Pokémon después de ordenar:\n" preview.first(5).each_with_index do |data, i| pokemon = data[0] message += "#{i+1}. #{pokemon.name} Nv.#{pokemon.level}\n" end pbMessage(message) # Confirmar if pbConfirmMessage("¿Aplicar este ordenamiento?") sorter.sort_pokemon(method) pbMessage("¡Caja ordenada!") endend
def smart_sort_box(box_index) sorter = BoxAutoSort::BoxSorter.new($PokemonStorage, box_index) pokemon_list = sorter.get_pokemon_list return if pokemon_list.empty? # Decidir método basado en contenido de la caja has_shinies = pokemon_list.any? { |pkmn, pos| pkmn[0].shiny? } all_same_species = pokemon_list.all? { |pkmn, pos| pkmn[0].species == pokemon_list[0][0].species } if has_shinies # Si hay shinies, ponerlos primero sorter.sort_pokemon(:SHINY_FIRST) pbMessage("Caja ordenada: Shiny primero") elsif all_same_species # Si todos son la misma especie, ordenar por nivel sorter.sort_pokemon(:LEVEL_DESC) pbMessage("Caja ordenada: Por nivel") else # Por defecto, ordenar por Pokédex sorter.sort_pokemon(:SPECIES_ID) pbMessage("Caja ordenada: Por Pokédex Nacional") endend
# Box Auto-Sort detecta automáticamente BW Storage System# y se integra con su interfazif PluginManager.installed?("BW Storage System") # Funcionalidad especial para BW Storageend