Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4131 miembros registrados.
El último usuario registrado es salyantoyoutube.

Nuestros miembros han publicado un total de 84723 mensajes en 12058 argumentos.

[XP] Organizar items como el creador quiera

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Organizar items como el creador quiera

Mensaje por Wecoc el 2016-11-19, 17:46

A raíz de un post que leí en Universo Maker, he decidido hacer éste script.

El script permite solucionar éste problema típico:

Ledai escribió:No sé si os habrá pasado que por ahorrar en espacios en la Base de datos, en especial en la sección de objetos, dejáis hueco para algunos objetos del mismo tipo, pero con el tiempo, esos objetos aumentan su catálogo y terminas teniendo que continuar poniéndolos debajo de otros que han sido creados posteriormente, lo que genera un desorden tipológico en el propio menú de Juego pues se quedan colocados por orden de ID de objeto en la lista de objetos de la BD

Aunque no los "catalogues" en sí, es típico ir añadiendo items a lo largo del proceso del juego y que luego no te convenza el órden en el que aparecen en el juego. Intentar reordenarlos en la Base de Datos es inviable porque tendrías que cambiar cada evento donde se usen y quizá incluso scripts. Por eso hice éste script que lo único que cambia es el órden en el que se muestran en las ventanas.

Las instrucciones vienen en el script, ya veréis, es fácil de usar.

Código:
#==============================================================================
# ** [XP] Custom Item Sorting
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#------------------------------------------------------------------------------
#  Éste script sirve para ordenar los items con el órden que se quiera
#  en vez de por ID como es habitual. Eso sí, siguen ordenándose así:
#     Items - Weapons - Armors
#  Solo se ordenan las ID dentro de cada tipo por separado.
#
#  Para hacerlo buscad al principio del script las constantes:
#     SORTED_ITEMS, SORTED_WEAPONS, SORTED_ARMORS
#  y ahí definís el órden que queráis. Las que no se incluyan se añadirán al
#  final por órden de ID.
#------------------------------------------------------------------------------
# * Para testearlo usad en una llamada de script lo siguiente:
#     $game_party.add_everything
#
#  Ésto añade al grupo un item/weapon/armor de cada
#------------------------------------------------------------------------------
#  ATENCIÓN! No es compatible con el sistema IGOS
#
#  El script ordena los items en:
#     Scene_Item, Scene_Battle (Items), Scene_Equip, Scene_Shop
#  Si usáis otros sistemas que muestren los items se tendrán que adaptar
#
#  Métodos modificados:
#     Window_Item       :refresh
#     Window_EquipItem  :refresh
#     Window_ShopBuy    :refresh
#     Window_ShopSell   :refresh
#==============================================================================

module Custom_Sort
  
  # Ordenar objetos
  SORTED_ITEMS = [1, 3, 2, 5, 7, 9, 11, 16, 15, 13, 19]
  
  # Ordenar armas
  SORTED_WEAPONS = [1, 4, 3, 2]
  
  # Ordenar protectores
  SORTED_ARMORS = [4, 5, 6, 1, 3, 2]
  
end

#==============================================================================

class Array
  def sort_ids(array)
    return self if self.size == 0 or array.size == 0
    name = self[0].class.name
    r = self.map { |item| item.id }
    result = []
    for i in 0...array.size
      result[i] = nil
    end
    for i in 0...r.size
      id = r[i] ; result[array.index(id)] = id if array.include?(id)
    end
    result.compact!
    for i in 0...r.size
      id = r[i] ; result.push(id) if !result.include?(id)
    end
    case name
    when "RPG::Item"
      result.map! { |id| $data_items[id] }
    when "RPG::Weapon"
      result.map! { |id| $data_weapons[id] }
    when "RPG::Armor"
      result.map! { |id| $data_armors[id] }
    end
    return result
  end

  def sort_ids!(array)
    self.replace(self.sort_ids(array))
  end
end

#==============================================================================

class Game_Party
  def add_everything(n=1)
    for i in 1...$data_items.size
      gain_item(i, n)   if $data_items[i].name != ""
    end
    for i in 1...$data_weapons.size
      gain_weapon(i, n) if $data_weapons[i].name != ""
    end
    for i in 1...$data_armors.size
      gain_armor(i, n)  if $data_armors[i].name != ""
    end
  end
end

#==============================================================================
# ** Window_Item
#==============================================================================

class Window_Item < Window_Selectable
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    data_items   = []
    data_weapons = []
    data_armors  = []
    # Add item
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        data_items.push($data_items[i])
      end
    end
    data_items.sort_ids!(Custom_Sort::SORTED_ITEMS)
    # Also add weapons and items if outside of battle
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          data_weapons.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          data_armors.push($data_armors[i])
        end
      end
      data_weapons.sort_ids!(Custom_Sort::SORTED_WEAPONS)
      data_armors.sort_ids!(Custom_Sort::SORTED_ARMORS)
    end
    @data.concat(data_items)
    @data.concat(data_weapons)
    @data.concat(data_armors)
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

#==============================================================================
# ** Window_EquipItem
#------------------------------------------------------------------------------
#  This window displays choices when opting to change equipment on the
#  equipment screen.
#==============================================================================

class Window_EquipItem < Window_Selectable
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    data_weapons = []
    data_armors  = []
    # Add equippable weapons
    if @equip_type == 0
      weapon_set = $data_classes[@actor.class_id].weapon_set
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
          data_weapons.push($data_weapons[i])
        end
      end
    end
    # Add equippable armor
    if @equip_type != 0
      armor_set = $data_classes[@actor.class_id].armor_set
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0 and armor_set.include?(i)
          if $data_armors[i].kind == @equip_type-1
            data_armors.push($data_armors[i])
          end
        end
      end
    end
    data_weapons.sort_ids!(Custom_Sort::SORTED_WEAPONS)
    data_armors.sort_ids!(Custom_Sort::SORTED_ARMORS)
    @data.concat(data_weapons)
    @data.concat(data_armors)
    # Add blank page
    @data.push(nil)
    # Make a bit map and draw all items
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, row_max * 32)
    for i in 0...@item_max-1
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    case item
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#==============================================================================
# ** Window_ShopBuy
#==============================================================================

class Window_ShopBuy < Window_Selectable
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    data_items   = []
    data_weapons = []
    data_armors  = []
    for goods_item in @shop_goods
      case goods_item[0]
      when 0 # Item
        item = $data_items[goods_item[1]]
        data_items.push(item) if item != nil
      when 1 # Weapon
        item = $data_weapons[goods_item[1]]
        data_weapons.push(item) if item != nil
      when 2 # Armor
        item = $data_armors[goods_item[1]]
        data_armors.push(item) if item != nil
      end
    end
    data_items.sort_ids!(Custom_Sort::SORTED_ITEMS)
    data_weapons.sort_ids!(Custom_Sort::SORTED_WEAPONS)
    data_armors.sort_ids!(Custom_Sort::SORTED_ARMORS)
    @data.concat(data_items)
    @data.concat(data_weapons)
    @data.concat(data_armors)
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

#==============================================================================
# ** Window_ShopSell
#==============================================================================

class Window_ShopSell < Window_Selectable
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    data_items   = []
    data_weapons = []
    data_armors  = []
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        data_items.push($data_items[i])
      end
    end
    for i in 1...$data_weapons.size
      if $game_party.weapon_number(i) > 0
        data_weapons.push($data_weapons[i])
      end
    end
    for i in 1...$data_armors.size
      if $game_party.armor_number(i) > 0
        data_armors.push($data_armors[i])
      end
    end
    data_items.sort_ids!(Custom_Sort::SORTED_ITEMS)
    data_weapons.sort_ids!(Custom_Sort::SORTED_WEAPONS)
    data_armors.sort_ids!(Custom_Sort::SORTED_ARMORS)
    @data.concat(data_items)
    @data.concat(data_weapons)
    @data.concat(data_armors)
    # If item count is not 0, make a bitmap and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

ATENCIÓN! No lo confundáis con éste: Organizar items como el jugador quiera
En ese el órden lo escoje el jugador a su gusto, mientras que en éste lo define el creador del proyecto.
avatar
Wecoc
Administrador
Administrador



Créditos 9213

Gracias : 491

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Dariel Lopez el 2016-11-19, 22:30

Uf, si hubiera tenido ese script pero para Vx Ace en mi primer juego me habría ahorrado mucho trabajo porque me pasó exactamente lo mismo que dices más arriba, porque después de crear muchos items importantes en mi juego como que era muy molesto estar buscando en el menú los que usaba seguido y tuve que moverlos de uno por uno en la base de datos para ponerlos en el orden que quería además de corregir varios eventos en donde el jugador ganaba algunos de esos items importantes.
¿No habrá manera de pasarlo a Vx Ace por si acaso alguien lo necesita?
avatar
Dariel Lopez
Veterano
Veterano

0/3

Créditos 566

Gracias : 29

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Wecoc el 2016-11-19, 23:15

No tengo ni idea de VX ni VX Ace, solo controlo XP, de hecho actualmente solo tengo el XP instalado. Como el script no cambia cosas internas del maker, solo el "display" de los items, puede que incluso serviera el mismo script para ámbos RPG maker, pruébalo si quieres. En todo caso no creo que sea difícil pasarlo para quien sepa RGSS3, los problemas de incompatibilidad del script en éste caso no vienen tanto de un maker a otro sinó con scripts personalizados, puesto que el modo en el que se editan los métodos no permite usar alias.
avatar
Wecoc
Administrador
Administrador



Créditos 9213

Gracias : 491

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Dariel Lopez el 2016-11-20, 02:48

Lo probé en Ace sin modificarle nada al script y me marcó este error:
Script ´Custom Item Sorting´line157: TypeError ocurred.
superclass mismatch for class Window_EquipItem.
avatar
Dariel Lopez
Veterano
Veterano

0/3

Créditos 566

Gracias : 29

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Wecoc el 2016-11-20, 09:03

Ya veo... Según parece en VX Ace Window_EquipItem depende de otra ventana distinta en vez de Window_Selectable. Seguramente los cambios sean todos problemas estructurales pequeños como ese, pero como dije yo no puedo hacer nada sin el programa.
avatar
Wecoc
Administrador
Administrador



Créditos 9213

Gracias : 491

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Ledai el 2016-11-28, 12:42

Mega gracias por el aporte, en serio que era un problema "menor" que me ha preocupado casi que desde siempre, o desde que me enteré que se ordenaban por ID; ahora el aspecto final de cualquier juego mejorará mucho la jugabilidad, pues siempre resulta muy liado tener que buscar los items en el menú cuando se aparecen tan desordenados.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 2354

Gracias : 170

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Organizar items como el creador quiera

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.