Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Wecoc's "Mosaic" Shop System v1.0

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Wecoc's "Mosaic" Shop System v1.0

Mensaje por Wecoc el Miér 22 Mayo 2013 - 1:43

Wecoc's "Mosaic" Shop System v1.0


Hice una nueva Tienda para que haya más variedad.
No es demasiado complicada, solo es cosa de reorganización de ventanas y poca cosa más.

MUY IMPORTANTE: requiere el script Window_Selectable +

Lo importante de éste script es que es bastante configurable, solo toqueteando algunas cosas del módulo que tiene al principio podéis montarlo a vuestro gusto, pero la idea general es que los iconos salen en tabla (o "mosaico" xD) y su precio sale en una ventana a parte arriba y se mueve.

He hecho tres versiones básicas, en los comentarios del script puse cómo recrearlas. Pero bueno, la 1 y la 3 son bastante parecidas en cuanto a lo visual, así que pongo solo la 1 y la 2.

VERSIÓN 1

Spoiler:


VERSIÓN 2

Spoiler:


Instrucciones

Poned el script encima de main y debajo del Window_Selectable +

Código

Código:
#==============================================================================
# WECOC'S "MOSAIC" SHOP SYSTEM v1.0
#------------------------------------------------------------------------------
# By: Wecoc
#------------------------------------------------------------------------------
# Este script de shop muestra los objetos en mosaico y no en lista.
# Tiene ciertas partes configurables, usando el module NewShopWecoc.
# Os adjunto algunas opciones posibles. Espero que os guste el script.
# Podéis editarlo si queréis, para hacerle lo que queráis.

=begin

  ------------------------------
  VERSIÓN 1
 
  COLUMN_MAX = 4
  ROW_HEIGHT = 64
  SHOW_OWN_BIG = true
  TEXT_SIZE = 16
  TEXT_BOLD = true
  SHOW_BIG_PSTATUS = true
  SHOW_OWN_SMALL = false
  SHOW_SMALL_PSTATUS = false
  SHOW_NUMBER = true
  ------------------------------
  VERSIÓN 2
 
  COLUMN_MAX = 10
  ROW_HEIGHT = 32
  SHOW_OWN_BIG = false
  TEXT_SIZE = 14
  TEXT_BOLD = true
  SHOW_BIG_PSTATUS = false
  SHOW_OWN_SMALL = true
  SHOW_SMALL_PSTATUS = true
  SHOW_NUMBER = false
  ------------------------------
  VERSIÓN 3
 
  COLUMN_MAX = 3
  ROW_HEIGHT = 45
  SHOW_OWN_BIG = true
  TEXT_SIZE = 20
  TEXT_BOLD = false
  SHOW_BIG_PSTATUS = false
  SHOW_OWN_SMALL = false
  SHOW_SMALL_PSTATUS = false
  SHOW_NUMBER = false
=end
#==============================================================================

#------------------------------------------------------------------------------
# MODULE GLOBALS
#------------------------------------------------------------------------------

module NewShopWecoc
  # -------------------------
  COLUMN_MAX = 4 # Indica cuantas columnas tienen Window_Buy y Window_Sell
  ROW_HEIGHT = 64 # Indica cuanto mide el cursor de alto
  # -------------------------
  SHOW_OWN_BIG = true  # Si es true, sale el nombre del item,
                        # y bajo cada item marca "Tienes: x"
    TEXT_SIZE = 16 # Tamaño del texto "Tienes: x"
    TEXT_BOLD = true # Si es true el texto "Tienes: x" está en negrita.
 
    SHOW_BIG_PSTATUS = true # Solo si SHOW_OWN_BIG está activado, si este es true
                            # en armas y protectores te dice si es mejor que el que
                            # lleva puesta cada actor.
      MINUS = Color.new(255,  0,  0) # Color cuando es peor que el que lleva
      EQUAL = Color.new(255, 255,  0) # Color cuando es igual que el que lleva
      PLUS  = Color.new(  0, 255,  0) # Color cuando es mejar que el que lleva
      OFF  = Color.new(100, 110, 120) # Color cuando no puede llevarlo
  # -------------------------
  SHOW_OWN_SMALL = false # Si es true, sale el número de items que tienes
  SHOW_SMALL_PSTATUS = false # Si es true sale si el arma o protector son mejores
                            # que el que lleva el jugador ($game_party.actors[0])
  # -------------------------
  SHOW_NUMBER = false # Si es true la ventana del número de objetos a comprar
                      # funciona como siempre, y  si es false se desactiva.
end

#------------------------------------------------------------------------------
# Window_ShopBuy
#------------------------------------------------------------------------------

class Window_ShopBuy < Window_Selectable
 
  # initialize teniendo en cuenta COLUMN_MAX y ROW_HEIGHT
  def initialize(shop_goods)
    super(0, 128, 640, 352)
    @column_max = NewShopWecoc::COLUMN_MAX
    self.rowHeight=NewShopWecoc::ROW_HEIGHT
    @shop_goods = shop_goods
    refresh
    self.index = 0
  end
 
  # item está exactamente igual
  def item
    return @data[self.index]
  end
 
  # refresh está igual excepto con la corrección del @row_height
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for goods_item in @shop_goods
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
      when 1
        item = $data_weapons[goods_item[1]]
      when 2
        item = $data_armors[goods_item[1]]
      end
      if item != nil
        @data.push(item)
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * @row_height)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
 
  # draw_item es el más configurable
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item # Objeto
      number = $game_party.item_number(item.id)
    when RPG::Weapon # Arma
      number = $game_party.weapon_number(item.id)
      for i in 0...$game_party.actors.size
        number += 1 if $game_party.actors[i].weapon_id == item.id
      end
    when RPG::Armor # Protector
      number = $game_party.armor_number(item.id)
      for i in 0...$game_party.actors.size
        number += 1 if $game_party.actors[i].armor1_id == item.id
        number += 1 if $game_party.actors[i].armor2_id == item.id
        number += 1 if $game_party.actors[i].armor3_id == item.id
        number += 1 if $game_party.actors[i].armor4_id == item.id
      end
    end
    if item.price <= $game_party.gold and number < 99
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
 
  if NewShopWecoc::SHOW_OWN_BIG # SHOW_OWN_BIG = true
    cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
    cursor_height = NewShopWecoc::ROW_HEIGHT
    column_max = NewShopWecoc::COLUMN_MAX
 
    x = index % column_max * 640 / column_max
    y = index / column_max * cursor_height
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x+2, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.font.size = NewShopWecoc::TEXT_SIZE #16
    self.contents.font.bold = NewShopWecoc::TEXT_BOLD
    self.contents.draw_text(x + 30, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 30, y+20, 212, 32, "Tienes: "+number.to_s, 0)
    self.contents.font.size = 25
    if NewShopWecoc::SHOW_BIG_PSTATUS # SHOW_BIG_PSTATUS = true
      case item
      when RPG::Weapon # Arma
        for i in 0...$game_party.actors.size
          itemcomp = $game_party.actors[i].weapon_id
          if $game_party.actors[i].equippable?(item)
            if itemcomp == 0 or $data_weapons[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "+", 0)
            elsif $data_weapons[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "=", 0)
            elsif $data_weapons[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "-", 0)
            end
          else # No lo puede equipar
            if self.contents.font.color != disabled_color
              self.contents.font.color = NewShopWecoc::OFF
            end
            self.contents.draw_text(x+15+i*30, y+36, 212, 32, "/", 0)
          end
        end
      when RPG::Armor # Protectores
        for i in 0...$game_party.actors.size
          case item.kind
            when 0 ; itemcomp = $game_party.actors[i].armor1_id
            when 1 ; itemcomp = $game_party.actors[i].armor2_id
            when 2 ; itemcomp = $game_party.actors[i].armor3_id
            when 3 ; itemcomp = $game_party.actors[i].armor4_id
          end
          if $game_party.actors[i].equippable?(item)
            if itemcomp == 0 or $data_armors[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "+", 0)
            elsif $data_armors[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "=", 0)
            elsif $data_armors[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "-", 0)
            end
          else # No lo puede equipar
            if self.contents.font.color != disabled_color
              self.contents.font.color = NewShopWecoc::OFF
            end
            self.contents.draw_text(x+15+i*30, y+36, 212, 32, "/", 0)
          end
        end
      end
    end
    else # SHOW_OWN_BIG = false
      cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
      cursor_height = NewShopWecoc::ROW_HEIGHT
      column_max = NewShopWecoc::COLUMN_MAX
 
      x = index%column_max * 640/column_max + cursor_width/2-12
      y = index/column_max * cursor_height + cursor_height/2-12
      rect = Rect.new(x, y, self.width / @column_max - 32, 32)
      self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
      bitmap = RPG::Cache.icon(item.icon_name)
      opacity = self.contents.font.color == normal_color ? 255 : 128
      self.contents.blt(x, y, bitmap, Rect.new(0, 0, 24, 24), opacity)
 
      if NewShopWecoc::SHOW_OWN_SMALL # SHOW_OWN_SMALL = true
        self.contents.font.size = NewShopWecoc::TEXT_SIZE # 16
        self.contents.font.bold = NewShopWecoc::TEXT_BOLD
        self.contents.draw_text(x+18, y+5, 32, 32, number.to_s, 0)
      end
      if NewShopWecoc::SHOW_SMALL_PSTATUS # SHOW_SMALL_PSTATUS = true
        self.contents.font.size = NewShopWecoc::TEXT_SIZE # 16
        self.contents.font.bold = NewShopWecoc::TEXT_BOLD
        case item
        when RPG::Weapon # Arma
          itemcomp = $game_party.actors[0].weapon_id
          if $game_party.actors[0].equippable?(item)
            if itemcomp == 0 or $data_weapons[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "+", 0)
            elsif $data_weapons[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "=", 0)
            elsif $data_weapons[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "-", 0)
            end
          end
        when RPG::Armor # Protectores
          case item.kind
            when 0 ; itemcomp = $game_party.actors[0].armor1_id
            when 1 ; itemcomp = $game_party.actors[0].armor2_id
            when 2 ; itemcomp = $game_party.actors[0].armor3_id
            when 3 ; itemcomp = $game_party.actors[0].armor4_id
          end
          if $game_party.actors[0].equippable?(item)
            if itemcomp == 0 or $data_armors[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "+", 0)
            elsif $data_armors[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "=", 0)
            elsif $data_armors[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+18, y-14, 32, 32, "-", 0)
            end
          end
        end
      end 
    end
  end

  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#------------------------------------------------------------------------------
# Window_ShopSell
#------------------------------------------------------------------------------

class Window_ShopSell < Window_Selectable
 
  # initialize teniendo en cuenta COLUMN_MAX y ROW_HEIGHT
  def initialize
    super(0, 128, 640, 352)
    @column_max = NewShopWecoc::COLUMN_MAX
    self.rowHeight=NewShopWecoc::ROW_HEIGHT
    refresh
    self.index = 0
  end
 
  # item está exactamente igual
  def item
    return @data[self.index]
  end
 
  # refresh está igual excepto con la corrección del @row_height
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    for i in 1...$data_weapons.size
      if $game_party.weapon_number(i) > 0
        @data.push($data_weapons[i])
      end
    end
    for i in 1...$data_armors.size
      if $game_party.armor_number(i) > 0
        @data.push($data_armors[i])
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * @row_height)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
 
  # draw_item es el más configurable
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item # Objeto
      number = $game_party.item_number(item.id)
    when RPG::Weapon # Arma
      number = $game_party.weapon_number(item.id)
    when RPG::Armor # Protector
      number = $game_party.armor_number(item.id)
    end
    if item.price > 0
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
 
  if NewShopWecoc::SHOW_OWN_BIG # SHOW_OWN_BIG = true
    cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
    cursor_height = NewShopWecoc::ROW_HEIGHT
    column_max = NewShopWecoc::COLUMN_MAX
 
    x = index % column_max * 640 / column_max
    y = index / column_max * cursor_height
 
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x+2, y+4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.font.size = NewShopWecoc::TEXT_SIZE #16
    self.contents.font.bold = NewShopWecoc::TEXT_BOLD
    self.contents.draw_text(x + 30, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 30, y+20, 212, 32, "Tienes: "+number.to_s, 0)
    self.contents.font.size = 25
    if NewShopWecoc::SHOW_BIG_PSTATUS # SHOW_BIG_PSTATUS = true
      case item
      when RPG::Weapon
        for i in 0...$game_party.actors.size
          itemcomp = $game_party.actors[i].weapon_id
          if $game_party.actors[i].equippable?(item)
            if itemcomp == 0 or $data_weapons[itemcomp].price < item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "+", 0)
            elsif $data_weapons[itemcomp].price == item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "=", 0)
            elsif $data_weapons[itemcomp].price > item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "-", 0)
            end
          else
            if self.contents.font.color != disabled_color
              self.contents.font.color = NewShopWecoc::OFF
            end
            self.contents.draw_text(x+15+i*30, y+36, 212, 32, "/", 0)
          end
        end
      when RPG::Armor
        for i in 0...$game_party.actors.size
          case item.kind
            when 0 ; itemcomp = $game_party.actors[i].armor1_id
            when 1 ; itemcomp = $game_party.actors[i].armor2_id
            when 2 ; itemcomp = $game_party.actors[i].armor3_id
            when 3 ; itemcomp = $game_party.actors[i].armor4_id
          end
          if $game_party.actors[i].equippable?(item)
            if itemcomp == 0 or $data_armors[itemcomp].price < item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "+", 0)
            elsif $data_armors[itemcomp].price == item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "=", 0)
            elsif $data_armors[itemcomp].price > item.price
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+15+i*30, y+36, 212, 32, "-", 0)
            end
          else
            if self.contents.font.color != disabled_color
              self.contents.font.color = NewShopWecoc::OFF
            end
            self.contents.draw_text(x+15+i*30, y+36, 212, 32, "/", 0)
          end
        end
      end
    end
    else # SHOW_OWN_BIG = false
      cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
      cursor_height = NewShopWecoc::ROW_HEIGHT
      column_max = NewShopWecoc::COLUMN_MAX
 
      x = index%column_max * 640/column_max + cursor_width/2-12
      y = index/column_max * cursor_height + cursor_height/2-12
      rect = Rect.new(x, y, self.width / @column_max - 32, 32)
      self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
      bitmap = RPG::Cache.icon(item.icon_name)
      opacity = self.contents.font.color == normal_color ? 255 : 128
      self.contents.blt(x, y, bitmap, Rect.new(0, 0, 24, 24), opacity)
 
      if NewShopWecoc::SHOW_OWN_SMALL # SHOW_OWN_SMALL = true
        self.contents.font.size = NewShopWecoc::TEXT_SIZE # 16
        self.contents.font.bold = NewShopWecoc::TEXT_BOLD
        self.contents.draw_text(x+18, y+5, 32, 32, number.to_s, 0)
      end
      if NewShopWecoc::SHOW_SMALL_PSTATUS # SHOW_SMALL_PSTATUS = true
        self.contents.font.size = NewShopWecoc::TEXT_SIZE # 16
        self.contents.font.bold = NewShopWecoc::TEXT_BOLD
        case item
        when RPG::Weapon # Arma
          itemcomp = $game_party.actors[0].weapon_id
          if $game_party.actors[0].equippable?(item)
            if itemcomp == 0 or $data_weapons[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "+", 0)
            elsif $data_weapons[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "=", 0)
            elsif $data_weapons[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "-", 0)
            end
          end
        when RPG::Armor # Protectores
          case item.kind
            when 0 ; itemcomp = $game_party.actors[0].armor1_id
            when 1 ; itemcomp = $game_party.actors[0].armor2_id
            when 2 ; itemcomp = $game_party.actors[0].armor3_id
            when 3 ; itemcomp = $game_party.actors[0].armor4_id
          end
          if $game_party.actors[0].equippable?(item)
            if itemcomp == 0 or $data_armors[itemcomp].price < item.price # MÁS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::PLUS
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "+", 0)
            elsif $data_armors[itemcomp].price == item.price # IGUAL
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::EQUAL
              end
              self.contents.draw_text(x+18, y-10, 32, 32, "=", 0)
            elsif $data_armors[itemcomp].price > item.price # MENOS
              if self.contents.font.color != disabled_color
                self.contents.font.color = NewShopWecoc::MINUS
              end
              self.contents.draw_text(x+18, y-14, 32, 32, "-", 0)
            end
          end
        end
      end 
    end
  end
 
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#------------------------------------------------------------------------------
# Window_ShopGold
#------------------------------------------------------------------------------

class Window_ShopGold < Window_Base
  # Ésta es la ventana del precio de cada objeto.
  # No es excesivamente configurable.
 
  def initialize
    @buying = true
    super(230,0,120,64)
    self.z = 9980
    self.contents = Bitmap.new(width - 32, height - 32)
  end
 
  def refresh
    self.contents.clear
    if @item == nil
      return
    end
    case @item
    when RPG::Item
      number = $game_party.item_number(@item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(@item.id)
    when RPG::Armor
      number = $game_party.armor_number(@item.id)
    end
 
    self.contents.font.color = normal_color
    if @item.price == 0
      self.contents.font.color = disabled_color
    end
    if ($game_party.gold < @item.price) and buying?
      self.contents.font.color = disabled_color
    end
    if number == 99 and buying?
      self.contents.font.color = disabled_color
    end
    if buying?
      gold = $data_system.words.gold
      self.contents.draw_text(0,0,120-32,32,@item.price.to_s+gold,1)
    else
      gold = $data_system.words.gold
      self.contents.draw_text(0,0,120-32,32,(@item.price/2).to_s+gold,1)
    end
  end

  def buying?
    return @buying
  end
 
  def buying=(value)
    @buying = value
  end
 
  def item=(value)
    @item=value
  end
end

#==============================================================================
# Scene_Shop
#==============================================================================

class Scene_Shop
  def main
    # Window_Help.- Ventana con la descripción de cada objeto
    @help_window = Window_Help.new
    # Window_ShopCommand.- Comprar - Vender - Salir
    @command_window = Window_ShopCommand.new
 
    # Window_Gold.- Ventana con el dinero que posee el grupo
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
 
    # Window_Base.- Ventana vacía para cuando no estás ni comprando ni vendiendo
    @dummy_window = Window_Base.new(0, 128, 640, 352)
 
    # Window_ShopBuy.- Ventana con los objetos a comprar
    @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
 
    # Window_ShopSell.- Ventana con los objetos a vender
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
 
    # Window_ShopNumber.- Muestra el número de objetos a comprar
    @number_window = Window_ShopNumber.new
    @number_window.z = 1000
    @number_window.active = false
    @number_window.visible = false

    # Window_ShopGold.- Ventana con el precio de cada objeto
    @shopgold_window = Window_ShopGold.new
    @shopgold_window.visible = false

    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @shopgold_window.dispose
    @number_window.dispose
  end

  def update
    # Update a todas las ventanas
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    if @command_window.active
      update_command # Control del comando: Comprar - Vender - Salir
      return
    end
    if @buy_window.active
      update_buy # Control de la ventana Comprar
      return
    end
    if @sell_window.active
      update_sell # Control de la ventana Vender
      return
    end
    if @number_window.active
      update_number # Control de la ventana Number
      return
    end
  end
 
  # Control del comando: Comprar - Vender - Salir
  def update_command
    if Input.trigger?(Input::B) # Cancelas
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C) # Aceptas
      case @command_window.index
      when 0  # Comprar
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @dummy_window.visible = false
        @buy_window.active = true
        @buy_window.visible = true
        @buy_window.refresh
   
        @shopgold_window.buying = true
        shopgold_position # Posición de la ventana de precio
        @shopgold_window.visible = true
        @shopgold_window.refresh
      when 1  # Vender
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
   
        @shopgold_window.buying = false
        shopgold_position # Posición de la ventana de precio
        @shopgold_window.visible = true
        @shopgold_window.refresh
      when 2  # Salir
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Map.new
      end
      return
    end
  end
 
  # Control de la ventana Comprar
  def update_buy
    if Input.press?(Input.dir4) # Moverse por la ventana
      @shopgold_window.buying = true
      shopgold_position # Posición de la ventana de precio
      @shopgold_window.visible = true
      @shopgold_window.refresh
    end
    if Input.trigger?(Input::B) # Cancelas
      $game_system.se_play($data_system.cancel_se)
      @shopgold_window.visible = false
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @help_window.set_text("")
      return
    end
    if Input.trigger?(Input::C) # Aceptas
      @item = @buy_window.item
      if @item == nil or @item.price > $game_party.gold
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @item
      when RPG::Item
        number = $game_party.item_number(@item.id)
      when RPG::Weapon
        number = $game_party.weapon_number(@item.id)
      when RPG::Armor
        number = $game_party.armor_number(@item.id)
      end
      if number == 99
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if NewShopWecoc::SHOW_NUMBER # Ventana Number
        $game_system.se_play($data_system.decision_se)
        max = @item.price == 0 ? 99 : $game_party.gold / @item.price
        max = [max, 99 - number].min
        @number_window.set(@item, max, @item.price)
        @number_window.active = true
        @number_window.visible = true
        @buy_window.active = false
        @shopgold_window.visible = false
      else
        $game_system.se_play($data_system.shop_se)
        case @item
        when RPG::Item
          $game_party.gain_item(@item.id, 1)
        when RPG::Weapon
          $game_party.gain_weapon(@item.id, 1)
        when RPG::Armor
          $game_party.gain_armor(@item.id, 1)
        end
        $game_party.lose_gold(@item.price)
        @buy_window.refresh
        @gold_window.refresh
        @shopgold_window.refresh
      end
    end
  end

  # Control de la ventana Vender
  def update_sell
    if Input.press?(Input.dir4) # Moverse por la ventana
      @shopgold_window.buying = false
      shopgold_position # Posición de la ventana de precio
      @shopgold_window.visible = true
      @shopgold_window.refresh
    end
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @shopgold_window.visible = false
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @help_window.set_text("")
      return
    end
    if Input.trigger?(Input::C)
      @item = @sell_window.item
      if @item == nil or @item.price == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if NewShopWecoc::SHOW_NUMBER # Ventana Number
        $game_system.se_play($data_system.decision_se)
        case @item
        when RPG::Item
          number = $game_party.item_number(@item.id)
        when RPG::Weapon
          number = $game_party.weapon_number(@item.id)
        when RPG::Armor
          number = $game_party.armor_number(@item.id)
        end
        max = number
        @sell_window.active = false
        @shopgold_window.visible = false
        @number_window.set(@item, max, @item.price / 2)
        @number_window.active = true
        @number_window.visible = true
      else
        $game_system.se_play($data_system.shop_se)
        $game_party.gain_gold(@item.price / 2)
        case @item
        when RPG::Item
          $game_party.lose_item(@item.id, 1)
        when RPG::Weapon
          $game_party.lose_weapon(@item.id, 1)
        when RPG::Armor
          $game_party.lose_armor(@item.id, 1)
        end
        @gold_window.refresh
        @sell_window.refresh
        @shopgold_window.item = @sell_window.item
        @shopgold_window.refresh
      end
    end
  end
 
  # Control de la ventana Number
  def update_number
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @number_window.active = false
      @number_window.visible = false
      case @command_window.index
      when 0  # buy
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        @sell_window.active = true
        @sell_window.visible = true
      end
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.shop_se)
      @number_window.active = false
      @number_window.visible = false
      case @command_window.index
      when 0  # Comprar
        $game_party.lose_gold(@number_window.number * @item.price)
        case @item
        when RPG::Item
          $game_party.gain_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.gain_weapon(@item.id, @number_window.number)
        when RPG::Armor
          $game_party.gain_armor(@item.id, @number_window.number)
        end
        @gold_window.refresh
        @buy_window.refresh
        @shopgold_window.refresh
   
        @buy_window.active = true
        @shopgold_window.visible = true
      when 1  # Vender
        $game_party.gain_gold(@number_window.number * (@item.price / 2))
        case @item
        when RPG::Item
          $game_party.lose_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.lose_weapon(@item.id, @number_window.number)
        when RPG::Armor
          $game_party.lose_armor(@item.id, @number_window.number)
        end
        @gold_window.refresh
        @sell_window.refresh
        @shopgold_window.item = @sell_window.item
        @shopgold_window.refresh

        @sell_window.active = true
        @shopgold_window.visible = true
      end
      return
    end
  end
 
  def shopgold_position # Posición de la ventana (queda centrada con el cursor)
    if @buy_window.visible == true
      @shopgold_window.item = @buy_window.item
      cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
      cursor_height = NewShopWecoc::ROW_HEIGHT
      column_max = NewShopWecoc::COLUMN_MAX
      window_width = @shopgold_window.width
      index = @buy_window.index
 
      @shopgold_window.x = index%column_max * 640/column_max +
                          cursor_width/2-(window_width/2)+16
      @shopgold_window.x = [@shopgold_window.x, 5].max
      @shopgold_window.x = [@shopgold_window.x, 640-5-@shopgold_window.width].min
      @shopgold_window.y = index/column_max*cursor_height-
                          @buy_window.top_row*cursor_height+76
    else
      @shopgold_window.item = @sell_window.item
      cursor_width = 640/NewShopWecoc::COLUMN_MAX-32
      cursor_height = NewShopWecoc::ROW_HEIGHT
      column_max = NewShopWecoc::COLUMN_MAX
      window_width = @shopgold_window.width
      index = @sell_window.index
 
      @shopgold_window.x = index%column_max * 640/column_max +
                          cursor_width/2-(window_width/2)+16
      @shopgold_window.x = [@shopgold_window.x, 5].max
      @shopgold_window.x = [@shopgold_window.x, 640-5-@shopgold_window.width].min
      @shopgold_window.y = index/column_max*cursor_height-
                          @sell_window.top_row*cursor_height+76
    end
  end
end

Otros

- NO es compatible con VX ni VXAce ni tengo intención de pasarlo a esas plataformas.
- NO es compatible con otros scripts de Tienda (en general)
- SÍ es compatible con los demás scripts
- SÍ puedo haceros pequeñas modificaciones del código si lo deseáis para vuestro proyecto.
- Podéis darme créditos o no, lo dejo a vuestra elección.


Última edición por Wecoc el Sáb 25 Mayo 2013 - 17:59, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12291

Gracias : 564

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Wecoc's "Mosaic" Shop System v1.0

Mensaje por J&L el Miér 22 Mayo 2013 - 2:09

¿Pero cómo que podemos dar créditos o no? Hay que ser menos humilde, Wecoc, que las contribuciones que haces son muy buenas. Me ha gustado mucho y me gustaría reemplazar el script de tienda que teníamos en mente. Un par de preguntas rápidas...

¿Sería muy complicado desactivar la opción de "Vender" permanentemente sin destrozar nada?
avatar
J&L
Soñador
Soñador

0/3

Créditos 332

Gracias : 6

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Wecoc's "Mosaic" Shop System v1.0

Mensaje por orochii el Miér 22 Mayo 2013 - 7:34

Yo supongo, o al menos así es como yo me lo planteo, que los créditos deben venir como agradecimiento, algo que nazca de quien los dé, no como una condición o una imposición. Si fuera que se están forrando o que me podrían forrar a mí de billetón por que me acrediten entonces seh xD (igual en esos casos yo por ejemplo hago las de otros scripters de por ahí, pido una copia gratis :3).

Y asdasds, respecto al tema xD, pues me imaginaba la tienda como la versión 2 cuando leí el nombre del tema, sólo que quizá con el nombre junto al precio (dentro de la ventanita flotante). Me gusta el cambio. BTW, la dependencia del Window_Selectable+ es por las columnas, ¿no? Bueno da igual, ta guaypa (?) la tienda.

Saludos,
Orochiiman!! (nana nana nana~♪)
avatar
orochii
Reportero

0/3

Créditos 7595

Gracias : 403

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Wecoc's "Mosaic" Shop System v1.0

Mensaje por Wecoc el Miér 22 Mayo 2013 - 15:20

J&L: La verdad es que los créditos siempre me han dado bastante igual, y no me enfadaré con nadie por usar algo sin dar créditos xD Al menos con cosas que publico así... "públicamente". Sería distinto si me robaran cosas de mi proyecto, claro.

Bueno, como eso del Sell no lo toqué sería igual de complicado que con la tienda default. Sería modificar los comandos del Window_ShopCommand para que solo hubiera Comprar y Salir y cambiar la llamada de éstos en el Input C del Scene_Shop.
No es complicado pero hay que saber un poco de scripts. Si necesitas que te lo haga me lo dices por MP.

Orochii: Eso que dices sería solo modificar la ventana para que a parte del price también saliera el name. No creo que fuera complicado xD La verdad es que queda un poco lioso así sin saber el nombre y con iconos iguales entre ellos. Otra opción sería poner el nombre en la descripción. "Mega Eter - Recupera los PM de un aliado"

Spoiler:
Es un script que hace tiempo que quería hacer, inspirado en la Shop de Boktai, en la que si te fijas sale el precio de una manera similar pero la distribución es diferente xD

avatar
Wecoc
Administrador
Administrador



Créditos 12291

Gracias : 564

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Wecoc's "Mosaic" Shop System v1.0

Mensaje por Wecoc el Vie 5 Ene 2018 - 16:06

Este script es bastante viejo ya y tiene algunos problemas relacionados con lo de Window_Selectable +
Por lo visto afecta a algunos scripts que usan Window_Selectable para otras cosas (por ejemplo el Window_Message, por defecto más o menos va bien pero si usas UMS o parecidos entonces no).

La solución es usar un Window_Selectable alternativo (al que llamé Window_Selectable_Plus) para que el normal siga como siempre.
Hay muchas cosas que hoy en día no habría montado como monté pero bueno, detalles... Con ese arreglo tirará bien todo.

Window_Selectable + (Versión Window_Selectable_Plus)

Código:
#==============================================================================
# [Herramienta de scripter] Window_Selectable +
#------------------------------------------------------------------------------
# This window class contains cursor movement and scroll functions.
# Nuevas funciones para la class Window_Selectable [V. Window_Selectable_Plus]
# by: Wecoc (no hace falta dar créditos)
#==============================================================================

class Window_Selectable_Plus < Window_Base
  
  attr_reader   :index
  attr_reader   :help_window
  
  def initialize(x, y, width, height)
    super(x, y, width, height)
    @item_max = 1 # Número máximo de elementos que contiene la ventana.
    @column_max = 1 # Número máximo de columnas
    @index = -1
    @virtualOy=0 # y en la que sale el primer item de la lista. Defecto: 0
    @row_hplus=0 # Viene definido más abajo.
    self.rowHeight=32 # Separación entre filas. Defecto: 32
    @column_spacing=32 # Separación entre columnas. Defecto: 32
  end
  
  def count # Número de ítems
    return @item_max || 0
  end
  
  def index=(index)
    if @index!=index
      @index = index
      self.refresh
    end
    if self.active and @help_window != nil
      update_help
    end
    update_cursor_rect
  end

  def rowHeight # Separación entre filas
    return @row_height || 32
  end
  
  def rowHeight=(value)
    if @row_height != value
      @row_height = [1,value].max
      @row_hplus = (([32,@row_height].max)-32)/2
    # @row_hplus controla mejor la separación para encuadrar los items.
    # No hace falta cambiarlo porque lo hace solo, cuando se cambia @row_height.
    # Nótese que su valor default es 0/2 = 0
      update_cursor_rect
    end
  end
  
  def columns # Número de columnas
    return @column_max || 1
  end
  
  def columns=(value)
    if @column_max != value
      @column_max=[1,value].max
      update_cursor_rect
    end
  end
  
  def columnSpacing # Separación entre columnas
    return @column_spacing || 32
  end
  
  def columnSpacing=(value)
    if @column_spacing != value
      @column_spacing=[0,value].max
      update_cursor_rect
    end
  end
  
  def row_max # Número máximo de filas
    return (@item_max + @column_max - 1) / @column_max
  end

  def top_row # El número de fila superior, que se muestra en la ventana, donde
    # 0 es la fila superior de los elementos.
    # Divide la coordenada de origen y por lo que vale el alto de una fila.
    return ((self.oy+@virtualOy) / (@row_height || 32)).to_i
  end
  
  def top_item # El item correspondiente al top_row, que variará según la columna
    return top_row * @column_max
  end

  def top_row=(row)
    if row > row_max - 1
      row = row_max - 1
    end
    if row < 0
      row = 0
    end
    self.oy = row * @row_height
  end

  def page_row_max # Número máximo de filas que se pueden mostrar a la vez.
    return ((self.height - 32) / @row_height).to_i
  end
  def page_item_max # Número máximo de items que se pueden mostrar a la vez.
    return page_row_max * @column_max
  end

  def help_window=(help_window)
    @help_window = help_window
    if self.active and @help_window != nil
      update_help
    end
  end
  
  def update_cursor_rect
    if @index < 0
      self.cursor_rect.empty
      return
    end
    row = @index / @column_max
    if row < self.top_row
      self.top_row = row
    end
    if row > self.top_row + (self.page_row_max - 1)
      self.top_row = row - (self.page_row_max - 1)
    end
    cursor_width = self.width / @column_max - 32
    x = @index % @column_max * (cursor_width + @column_spacing)
    y = @index / @column_max * @row_height - self.oy
    self.cursor_rect.set(x, y, cursor_width, @row_height)
  end

  def update
    super
    if self.active and @item_max > 0 and @index >= 0
      if Input.repeat?(Input::DOWN) # Pulsar abajo
        #if (Input.trigger?(Input::DOWN) and (@item_max % @column_max)==0) or
        if (Input.trigger?(Input::DOWN) and (@column_max==1)) or
           @index < @item_max - @column_max
          $game_system.se_play($data_system.cursor_se)
          @index = (@index + @column_max) % @item_max
          update_cursor_rect
        end
      end
      if Input.repeat?(Input::UP) # Pulsar arriba
        if (Input.trigger?(Input::UP) and (@item_max%@column_max)==0) or
           @index >= @column_max
          $game_system.se_play($data_system.cursor_se)
          @index = (@index - @column_max + @item_max) % @item_max
          update_cursor_rect
        end
      end
      if Input.repeat?(Input::RIGHT) # Pulsar Derecha
        if @column_max >= 2 and @index < @item_max - 1
          $game_system.se_play($data_system.cursor_se)
          @index += 1
          update_cursor_rect
        end
      end
      if Input.repeat?(Input::LEFT) # Pulsar Izquierda
        if @column_max >= 2 and @index > 0
          $game_system.se_play($data_system.cursor_se)
          @index -= 1
          update_cursor_rect
        end
      end
      if Input.repeat?(Input::R) # Pulsar R (o RePag)
        if self.top_row + (self.page_row_max - 1) < (self.row_max - 1)
          $game_system.se_play($data_system.cursor_se)
          @index = [@index + self.page_item_max, @item_max - 1].min
          self.top_row += self.page_row_max
          update_cursor_rect
        end
      end
      if Input.repeat?(Input::L) # Pulsar L (o AvPag)
        if self.top_row > 0
          $game_system.se_play($data_system.cursor_se)
          @index = [@index - self.page_item_max, 0].max
          self.top_row -= self.page_row_max
          update_cursor_rect
        end
      end
    end
    if self.active and @help_window != nil
      update_help
    end
    update_cursor_rect
  end
end


#==============================================================================
# [Herramienta de scripter] Window_Command +
#------------------------------------------------------------------------------
# This window deals with general command choices.
# Nuevas funciones para la class Window_Command
# by: Wecoc (no hace falta dar créditos)
#==============================================================================

class Window_Command_Plus < Window_Selectable_Plus
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     width    : window width
  #     commands : command text string array
  #--------------------------------------------------------------------------
  def initialize(width, commands)
    @starting=true
    super(0, 0, width, commands.size * 32 + 32)
    rowMax=((commands.length + self.columns - 1) / self.columns).to_i
    windowheight=(rowMax*self.rowHeight) + @virtualOy + 32
    self.height=[32,windowheight].max # Calcula la altura
    # de la ventana según los comandos del Window_Selectable.
    @item_max = commands.size
    @commands = commands
    self.active=true
    @starting=false
    @item_max = commands.size
    self.contents = Bitmap.new(width-32,@item_max*@row_height+@virtualOy)
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  
  def commands=(value) # Cambia los comandos.
    @commands=value
    @item_max=commands.length  
    self.update_cursor_rect
    self.refresh
  end
  
  def width=(value) # Cambia el ancho de ventana
    oldvalue=self.width
    super
    if !@starting && oldvalue!=value
     self.index=self.index
     self.update_cursor_rect
     self.refresh
    end
  end
  
  def height=(value) # Cambia el alto de ventana
    oldvalue=self.height
    super
    if !@starting && oldvalue!=value
     self.index=self.index
     self.update_cursor_rect
     self.refresh
    end
  end

  def itemCount # Cuenta el número de ítems.
    return @commands ? @commands.length : 0
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : item number
  #     color : text color
  #--------------------------------------------------------------------------
  def draw_item(index, color) # index = Número del item, color = Color del texto
    self.contents.font.color = color
    rect = Rect.new(4,@row_height*index+@virtualOy, self.contents.width-8,@row_height)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index])
  end
  #--------------------------------------------------------------------------
  # * Disable Item
  #     index : item number
  #--------------------------------------------------------------------------
  def disable_item(index)
    draw_item(index, disabled_color)
  end
  
  def select(index) # Selecciona una de las opciones
    self.index = index if index
  end
  
  def unselect() # Desmarca todas las opciones (quita el cursor)
    self.index = -1
  end
  
  def clear_command_list() # Elimina todas las opciones
    @list = []
  end
  
  def item_max() # Indica el número de opciones
    @list.size
  end
    
  def index=(index) # Va a un índice concreto
    @index = index
    update_help if self.active and @help_window != nil
    update_cursor_rect
  end
    
  def current_data() # Indica las opciones actuales
    @index >= 0 ? @list[@index] : nil
  end
end

#==============================================================================
# [Herramienta de scripter] Window_Selectable & Window_Command EXTRAS
#------------------------------------------------------------------------------
# Extras para las clases más básicas, usando el tool.
# Esta parte más que nada es para que mires qué hace cada cosa nueva.
# Solo tienes que editar las líneas que tienen ##
# Puede que esta última parte tengas que quitarla. Esto no afectará al Add-On.
#==============================================================================

#/////////// Window_Item ///////////#

class Window_Item < Window_Selectable_Plus
  def initialize
    super(0, 64, 640, 416)
    
    @column_max = 2
    self.rowHeight=32 ##
    @column_spacing=32 ##
    
    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
  
  def item
    return @data[self.index]
  end
  
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    @item_max = @data.size
    if @item_max > 0
      # Esta es la línea modificada:
      self.contents = Bitmap.new(width - 32, row_max * @row_height + @virtualOy)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + @column_spacing)
    y = index / 2 * @row_height + @virtualOy
    rect = Rect.new(x, y+@row_hplus, self.width / @column_max - 32, @row_height)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x,y+4+@row_hplus, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x+28, y+@row_hplus, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y+@row_hplus, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y+@row_hplus, 24, 32, number.to_s, 2)
  end
  
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

#/////////// Window_Skill ///////////#

class Window_Skill < Window_Selectable_Plus
  def initialize(actor)
    super(0, 128, 640, 352)
    @actor = actor
    
    @column_max = 2
    self.rowHeight=32 ##
    @column_spacing=32 ##

    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
  
  def skill
    return @data[self.index]
  end
  
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 0...@actor.skills.size
      skill = $data_skills[@actor.skills[i]]
      if skill != nil
        @data.push(skill)
      end
    end
    @item_max = @data.size
    if @item_max > 0
      # Esta es la línea modificada:
      self.contents = Bitmap.new(width - 32, row_max * @row_height + @virtualOy)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + @column_spacing)
    y = index / 2 * @row_height + @virtualOy
    rect = Rect.new(x, y+@row_hplus, self.width / @column_max - 32, @row_height)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x,y+4+@row_hplus,bitmap,Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y+@row_hplus, 204, 32, skill.name, 0)
    self.contents.draw_text(x + 232, y+@row_hplus, 48, 32, skill.sp_cost.to_s, 2)
  end
  
  def update_help
    @help_window.set_text(self.skill == nil ? "" : self.skill.description)
  end
end

#/////////// Window_EquipItem ///////////#

class Window_EquipItem < Window_Selectable_Plus
  def initialize(actor, equip_type)
    super(0, 256, 640, 224)
    @actor = actor
    @equip_type = equip_type
    
    @column_max = 2
    self.rowHeight=32 ##
    @column_spacing=32 ##
    
    refresh
    self.active = false
    self.index = -1
  end
  
  def item
    return @data[self.index]
  end
  
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    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.push($data_weapons[i])
        end
      end
    end
    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.push($data_armors[i])
          end
        end
      end
    end
    @data.push(nil)
    @item_max = @data.size
    # Esta es la línea modificada:
    self.contents = Bitmap.new(width - 32, row_max * @row_height + @virtualOy)
    for i in 0...@item_max-1
      draw_item(i)
    end
  end
  
  def draw_item(index)
    item = @data[index]
    x = 4 + index % 2 * (288 + @column_spacing)
    y = index / 2 * @row_height + @virtualOy + (@row_height-32)/2
    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
  
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

El script incluye como extras Window_Item, Window_Skill y Window_EquipItem, que ahora funcionan con Window_Selectable_Plus. Si los editáis con algún otro script y os crea incompatibilidades toda la parte de extras (más o menos desde la mitad del script hasta el final) se puede borrar.

Wecoc's "Mosaic" Shop System

Simplemente buscad Window_Selectable en el script (sale solo dos veces) y lo cambiáis por Window_Selectable_Plus

Quizá algún día tendré que ponerme a arreglar a fondo algunos de estos scripts viejos. En fin  
avatar
Wecoc
Administrador
Administrador



Créditos 12291

Gracias : 564

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Wecoc's "Mosaic" Shop System v1.0

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.