[XP] New Shop Interface

Started by Leon_Westbrooke, January 23, 2008, 04:53:16 pm

Previous topic - Next topic

MarkHest

That looks realy awesome! However the script download links are unfunctional  :'(

After 3 years, chould you uppdate the links for little me?  ;)
   

ForeverZer0

Spoiler: ShowHide


I don't think he will be re-uploading anytime in the near future. He has not even logged onto the forum in almost half a year.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Jragyn

Its the version I modified for myself adding in my edits of:
J::BUY/SELL via variables!

But here, go ahead and use it if you like.
(Read the topic above for more information about it, if you can't figure it out yourself)

Spoiler: ShowHide
#===============================================================================
#  Leon's Shopping System, Modified by Jragyn!
#===============================================================================
# This shopping system has been modified to recieve variable multipliers
# against prices. Used for raising or decreasing shop prices at any
# point in the game.
module J
# The number after buy/sell rate is the variable it corresponds to.

  BUY_RATE  = 26  #This variable is typically set to 100, representing 100% buy rate.
  SELL_RATE = 27  #This variable is typically set to 50, representing half price selling.

  DIVISOR   = 100 #A global price modifier. 100 = 1x, 50 = 2x, 200 = 0.5x pricing.
end
#===============================================================================
class Scene_Title
  alias new_game_buy_sell command_new_game
  def command_new_game
    new_game_buy_sell
#==============================================#
# These are the default prices that            #
# are setup upon a new game.                   #
#==============================================#
    $game_variables[J::BUY]  = 100             #
    $game_variables[J::SELL] = 50              #
#==============================================#
  end
end
#===============================================================================

#===============================================================================
#  Window_Shop_Info
#===============================================================================
class Window_Shop_Info < Window_Base
  def initialize
    super(160, 0, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    refresh
  end
 
  def refresh(selection = 0)
    self.contents.clear
    if selection == 0
      self.contents.draw_text(0, 0, 448, 32, "Buy, sell, or leave?", 1)
    else
      self.contents.draw_text(0, 0, 448, 32, "Press 'SHIFT' for compatabilitiy.", 1)
    end
  end
end
#===============================================================================
#  END Window_Shop_Info
#===============================================================================


#===============================================================================
#  Window_Shop_Option
#===============================================================================
class Window_Shop_Option < Window_Selectable
  def initialize
    super(0, 0, 160, 128)
    @option = ["Buy", "Sell", "Leave"]
    @item_max = @option.size
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.index = 0
    self.active = true
    refresh
  end
 
  def refresh
    self.contents.clear
    for i in 0...@option.size
      y = i * 32
      self.contents.draw_text(0, y, 128, 32, @option[i], 1)
    end
  end
end
#===============================================================================
#  END Window_Shop_Option
#===============================================================================


#===============================================================================
#  Window_Shop_Gold
#===============================================================================
class Window_Shop_Gold < Window_Base
  def initialize
    super(0, 128, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    refresh
  end
 
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, 60, 32, $data_system.words.gold + ":")
    self.contents.font.color = normal_color
    self.contents.draw_text(0, 0, 128, 32, $game_party.gold.to_s, 2)
  end
end
#===============================================================================
#  END Window_Shop_Gold
#===============================================================================


#===============================================================================
#  Window_Shop_Own
#===============================================================================
class Window_Shop_Own < Window_Base
  def initialize
    super(0, 192, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    item = nil
    refresh(item)
  end
 
  def refresh(item)
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(0, 0, 48, 32, "Own:")
    if item == nil
      return
    end
    self.contents.font.color = normal_color
    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.draw_text(0, 0, 128, 32, number.to_s, 2)
  end
end
#===============================================================================
#  END Window_Shop_Own
#===============================================================================


#===============================================================================
#  Window_Shop_List
#===============================================================================
class Window_Shop_List < Window_Selectable
  def initialize(shop_goods)
    super(160, 64, 480, 192)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.active = false
    self.index = 0
    self.visible = false
    @shop_goods = shop_goods
    @sell = false
  end
 
  def item
    if @data != nil
      return @data[index]
    end
  end
 
  def refresh
    @sell = false
    @option_index = nil
    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 * 32)
      self.contents.font.name = $defaultfonttype
      self.contents.font.size = $defaultfontsize
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
 
  def refresh_sell(option_index)
    @sell = true
    @option_index = option_index
    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 * 32)
      self.contents.font.name = $defaultfonttype
      self.contents.font.size = $defaultfontsize
      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 @option_index == nil
      if (item.price * $game_variables[J::BUY_RATE] / J::DIVISOR) <= $game_party.gold and number < 99
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
    else
      self.contents.font.color = normal_color
    end
    x = 4
    y = index * 32
    if item.price == 0
      self.contents.font.color = disabled_color
    else
      self.contents.font.color = normal_color
    end
    if @sell == false
      if (item.price * $game_variables[J::BUY_RATE] / J::DIVISOR) <= $game_party.gold and number < 99
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
    end
    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, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    if @option_index == nil
      item_price = (item.price * $game_variables[J::BUY_RATE] / J::DIVISOR)
      self.contents.draw_text(x + 350, y, 88, 32, item_price.to_s, 2)
    else
      item_sell = (item.price * $game_variables[J::SELL_RATE] / J::DIVISOR).round
      self.contents.draw_text(x + 350, y, 88, 32, item_sell.to_s, 2)
    end
  end
end
#===============================================================================
#  END Window_Shop_List
#===============================================================================


#===============================================================================
#  Window_Shop_Description_Item
#===============================================================================
class Window_Shop_Description_Item < Window_Base
  def initialize
    super(90, 256, 460, 192)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.visible = false
    item = nil
    refresh(item)
  end
 
  def refresh(item)
    self.contents.clear
    if item == nil
      return
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(28, 0, 120, 32, item.name)
    self.contents.draw_text(0, 32, 428, 32, item.description)
    self.contents.font.color = system_color
    self.contents.draw_text(0, 64, 120, 32, "Range:")
    self.contents.draw_text(0, 96, 140, 32, "% HP Recovered:")
    self.contents.draw_text(0, 128, 140, 32, "% SP Recovered:")
    self.contents.draw_text(230, 96, 120, 32, "HP Recovered:")
    self.contents.draw_text(230, 128, 120, 32, "SP Recovered:")
    self.contents.font.color = normal_color
    self.contents.draw_text(150, 96, 90, 32, item.recover_hp_rate.to_s)
    self.contents.draw_text(150, 128, 90, 32, item.recover_sp_rate.to_s)
    self.contents.draw_text(360, 96, 90, 32, item.recover_hp.to_s)
    self.contents.draw_text(360, 128, 90, 32, item.recover_sp.to_s)
    case item.scope
    when 0
      self.contents.draw_text(70, 64, 120, 32, "None")
    when 1
      self.contents.draw_text(70, 64, 120, 32, "One Enemy")
    when 2
      self.contents.draw_text(70, 64, 120, 32, "All Enemies")
    when 3
      self.contents.draw_text(70, 64, 120, 32, "One Ally")
    when 4
      self.contents.draw_text(70, 64, 120, 32, "All Allies")
    when 5
      self.contents.draw_text(70, 64, 120, 32, "One Dead Ally")
    when 6
      self.contents.draw_text(70, 64, 120, 32, "All Dead Allies")
    when 7
      self.contents.draw_text(70, 64, 120, 32, "User")
    end
  end
end
#===============================================================================
#  END Window_Shop_Description_Item
#===============================================================================


#===============================================================================
#  Window_Shop_Description_Equipment
#===============================================================================
class Window_Shop_Description_Equipment < Window_Base
  def initialize
    super(0, 256, 640, 224)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.visible = false
    item = nil
    refresh(item)
  end
 
  def refresh(item)
    self.contents.clear
    if item == nil
      return
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(0, 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(28, 0, 120, 32, item.name)
    self.contents.draw_text(0, 32, 460, 32, item.description)
    self.contents.font.color = system_color
    if item.is_a?(RPG::Weapon)
      self.contents.draw_text(0, 64, 75, 32, "Attack:")
      self.contents.draw_text(0, 96, 120, 32, "Phys. Def:")
      self.contents.draw_text(0, 128, 120, 32, "Mag. Def:")
      self.contents.draw_text(165, 64, 120, 32, "Str:")
      self.contents.draw_text(165, 96, 120, 32, "Dex:")
      self.contents.draw_text(165, 128, 120, 32, "Agi:")
      self.contents.draw_text(165, 160, 120, 32, "Int:")
      self.contents.draw_text(290, 64, 120, 32, "Elements:")
      self.contents.draw_text(470, 64, 120, 32, "Inflicts:")
    else
      self.contents.draw_text(0, 64, 120, 32, "Phys. Def:")
      self.contents.draw_text(0, 96, 120, 32, "Mag. Def:")
      self.contents.draw_text(0, 128, 120, 32, "Evade:")
      self.contents.draw_text(0, 160, 120, 32, "Auto:")
      self.contents.draw_text(165, 64, 120, 32, "Str:")
      self.contents.draw_text(165, 96, 120, 32, "Dex:")
      self.contents.draw_text(165, 128, 120, 32, "Agi:")
      self.contents.draw_text(165, 160, 120, 32, "Int:")
      self.contents.draw_text(370, 64, 120, 32, "Guards Against:")
    end
    self.contents.font.color = normal_color
    if item.is_a?(RPG::Weapon)
      self.contents.draw_text(60, 64, 75, 32, item.atk.to_s)
      self.contents.draw_text(90, 96, 75, 32, item.pdef.to_s)
      self.contents.draw_text(90, 128, 75, 32, item.mdef.to_s)
      self.contents.draw_text(195, 64, 50, 32, item.str_plus.to_s, 2)
      self.contents.draw_text(195, 96, 50, 32, item.dex_plus.to_s, 2)
      self.contents.draw_text(195, 128, 50, 32, item.agi_plus.to_s, 2)
      self.contents.draw_text(195, 160, 50, 32, item.int_plus.to_s, 2)
      self.contents.font.size = 14
      for i in 0...item.element_set.size
        x = 265 + i % 2 * 75
        y = 80 + i / 2 * 14
        self.contents.draw_text(x, y, 120, 32, $data_system.elements[item.element_set[i]])
      end
      for i in 0...item.plus_state_set.size
        x = 445 + i % 2 * 75
        y = 80 + i / 2 * 14
        self.contents.draw_text(x, y, 120, 32, $data_states[item.plus_state_set[i]].name)
      end
    else
      self.contents.draw_text(90, 64, 75, 32, item.pdef.to_s)
      self.contents.draw_text(90, 96, 75, 32, item.mdef.to_s)
      self.contents.draw_text(60, 128, 75, 32, item.eva.to_s)
      if $data_states[item.auto_state_id] != nil
        self.contents.draw_text(55, 160, 75, 32, $data_states[item.auto_state_id].name)
      end
      self.contents.draw_text(195, 64, 50, 32, item.str_plus.to_s, 2)
      self.contents.draw_text(195, 96, 50, 32, item.dex_plus.to_s, 2)
      self.contents.draw_text(195, 128, 50, 32, item.agi_plus.to_s, 2)
      self.contents.draw_text(195, 160, 50, 32, item.int_plus.to_s, 2)
      self.contents.font.size = 14
      @defense = []
      for i in 0...item.guard_element_set.size
        @defense.push($data_system.elements[item.guard_element_set[i]])
      end
      for i in 0...item.guard_state_set.size
        @defense.push($data_states[item.guard_state_set[i]].name)
      end
      for i in 0...@defense.size
        x = 265 + i % 4 * 80
        y = 80 + i / 4 * 14
        self.contents.draw_text(x + 15, y, 85, 32, @defense[i])
      end
    end
    self.contents.font.size = $defaultfontsize
  end
end
#===============================================================================
#  END Window_Shop_Description_Equipment
#===============================================================================


#===============================================================================
#  Window_Shop_Actors
#===============================================================================
class Window_Shop_Actors < Window_Base
  def initialize
    super(84, 32, 472, 416)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.visible = false
    self.active = false
    self.z += 100
    item = nil
    refresh(item)
  end
 
  def refresh(item)
    self.contents.clear
    if item == nil
      return
    end
    for i in 0...$game_party.actors.size
      x = i%2 * 236
      y = i/2 * 192
      draw_actor_graphic($game_party.actors[i], x + 16, y + 48)
      draw_actor_name($game_party.actors[i], x + 48, y + 8)
      pdef1 = item.pdef
      mdef1 = item.mdef
      str1 = item.str_plus
      dex1 = item.dex_plus
      agi1 = item.agi_plus
      int1 = item.int_plus
      atk2 = 0
      eva2 = 0
      pdef2 = 0
      mdef2 = 0
      str2 = 0
      dex2 = 0
      agi2 = 0
      int2 = 0
      if item.is_a?(RPG::Weapon)
        if $data_weapons[$game_party.actors[i].weapon_id] != nil
          atk1 = item.atk
          atk2 = $data_weapons[$game_party.actors[i].weapon_id].atk
          pdef2 = $data_weapons[$game_party.actors[i].weapon_id].pdef
          mdef2 = $data_weapons[$game_party.actors[i].weapon_id].mdef
          str2 = $data_weapons[$game_party.actors[i].weapon_id].str_plus
          dex2 = $data_weapons[$game_party.actors[i].weapon_id].dex_plus
          agi2 = $data_weapons[$game_party.actors[i].weapon_id].agi_plus
          int2 = $data_weapons[$game_party.actors[i].weapon_id].int_plus
        end
      else
        eva1 = item.eva
        case item.kind
        when 0
        if $data_armors[$game_party.actors[i].armor1_id] != nil
          eva2 = $data_armors[$game_party.actors[i].armor1_id].eva
          pdef2 = $data_armors[$game_party.actors[i].armor1_id].pdef
          mdef2 = $data_armors[$game_party.actors[i].armor1_id].mdef
          str2 = $data_armors[$game_party.actors[i].armor1_id].str_plus
          dex2 = $data_armors[$game_party.actors[i].armor1_id].dex_plus
          agi2 = $data_armors[$game_party.actors[i].armor1_id].agi_plus
          int2 = $data_armors[$game_party.actors[i].armor1_id].int_plus
        end
        when 1
        if $data_armors[$game_party.actors[i].armor2_id] != nil
          eva2 = $data_armors[$game_party.actors[i].armor2_id].eva
          pdef2 = $data_armors[$game_party.actors[i].armor2_id].pdef
          mdef2 = $data_armors[$game_party.actors[i].armor2_id].mdef
          str2 = $data_armors[$game_party.actors[i].armor2_id].str_plus
          dex2 = $data_armors[$game_party.actors[i].armor2_id].dex_plus
          agi2 = $data_armors[$game_party.actors[i].armor2_id].agi_plus
          int2 = $data_armors[$game_party.actors[i].armor2_id].int_plus
        end
        when 2
        if $data_armors[$game_party.actors[i].armor3_id] != nil
          eva2 = $data_armors[$game_party.actors[i].armor3_id].eva
          pdef2 = $data_armors[$game_party.actors[i].armor3_id].pdef
          mdef2 = $data_armors[$game_party.actors[i].armor3_id].mdef
          str2 = $data_armors[$game_party.actors[i].armor3_id].str_plus
          dex2 = $data_armors[$game_party.actors[i].armor3_id].dex_plus
          agi2 = $data_armors[$game_party.actors[i].armor3_id].agi_plus
          int2 = $data_armors[$game_party.actors[i].armor3_id].int_plus
        end
        when 3
        if $data_armors[$game_party.actors[i].armor4_id] != nil
          eva2 = $data_armors[$game_party.actors[i].armor4_id].eva
          pdef2 = $data_armors[$game_party.actors[i].armor4_id].pdef
          mdef2 = $data_armors[$game_party.actors[i].armor4_id].mdef
          str2 = $data_armors[$game_party.actors[i].armor4_id].str_plus
          dex2 = $data_armors[$game_party.actors[i].armor4_id].dex_plus
          agi2 = $data_armors[$game_party.actors[i].armor4_id].agi_plus
          int2 = $data_armors[$game_party.actors[i].armor4_id].int_plus
        end
        end
      end
      color1 = Color.new(25, 210, 25, 255)
      color2 = Color.new(210, 25, 25, 255)
      if $game_party.actors[i].equippable?(item)
        self.contents.font.color = normal_color
        # PDEF
        if (pdef1 - pdef2) > 0
          self.contents.font.color = color1
        elsif (pdef1 - pdef2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 25, y + 80, 70, 32, (pdef1 - pdef2).to_s, 2)
        # MDEF
        if (mdef1 - mdef2) > 0
          self.contents.font.color = color1
        elsif (mdef1 - mdef2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 25, y + 112, 70, 32, (mdef1 - mdef2).to_s, 2)
        # STR
        if (str1 - str2) > 0
          self.contents.font.color = color1
        elsif (str1 - str2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 125, y + 48, 70, 32, (str1 - str2).to_s, 2)
        # DEX
        if (dex1 - dex2) > 0
          self.contents.font.color = color1
        elsif (dex1 - dex2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 125, y + 80, 70, 32, (dex1 - dex2).to_s, 2)
        # AGI
        if (agi1 - agi2) > 0
          self.contents.font.color = color1
        elsif (agi1 - agi2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 125, y + 112, 70, 32, (agi1 - agi2).to_s, 2)
        # INT
        if (int1 - int2) > 0
          self.contents.font.color = color1
        elsif (int1 - int2) < 0
          self.contents.font.color = color2
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(x + 125, y + 144, 70, 32, (int1 - int2).to_s, 2)
        if item.is_a?(RPG::Weapon)
          self.contents.font.color = system_color
          self.contents.draw_text(x, y + 48, 80, 32, "Atk:")
          self.contents.draw_text(x, y + 80, 80, 32, "Pdef:")
          self.contents.draw_text(x, y + 112, 80, 32, "Mdef:")
          self.contents.draw_text(x + 110, y + 48, 80, 32, "Str:")
          self.contents.draw_text(x + 110, y + 80, 80, 32, "Dex:")
          self.contents.draw_text(x + 110, y + 112, 80, 32, "Agi:")
          self.contents.draw_text(x + 110, y + 144, 80, 32, "Int:")
          self.contents.font.color = normal_color
          #  ATTACK
          if (atk1 - atk2) > 0
            self.contents.font.color = color1
          elsif (atk1 - atk2) < 0
            self.contents.font.color = color2
          else
            self.contents.font.color = normal_color
          end
          self.contents.draw_text(x + 25, y + 48, 70, 32, (atk1 - atk2).to_s, 2)
          #  ELSE if armor...
        else
          self.contents.font.color = system_color
          self.contents.draw_text(x, y + 48, 80, 32, "Eva:")
          self.contents.draw_text(x, y + 80, 80, 32, "Pdef:")
          self.contents.draw_text(x, y + 112, 80, 32, "Mdef:")
          self.contents.draw_text(x + 110, y + 48, 80, 32, "Str:")
          self.contents.draw_text(x + 110, y + 80, 80, 32, "Dex:")
          self.contents.draw_text(x + 110, y + 112, 80, 32, "Agi:")
          self.contents.draw_text(x + 110, y + 144, 80, 32, "Int:")
          self.contents.font.color = normal_color
          if (eva1 - eva2) > 0
            self.contents.font.color = color1
          elsif (eva1 - eva2) < 0
            self.contents.font.color = color2
          else
            self.contents.font.color = normal_color
          end
          self.contents.draw_text(x + 25, y + 48, 70, 32, (eva1 - eva2).to_s, 2)
        end
      else
        self.contents.font.color = disabled_color
        self.contents.draw_text(x + 10, y + 80, 120, 32, "Cannot Equip")
        self.contents.font.color = normal_color
      end
    end
  end
end
#===============================================================================
#  END Window_Shop_Actors
#===============================================================================


#===============================================================================
#  Window_Shop_Amount
#===============================================================================
class Window_Shop_Amount < Window_Selectable
 
  attr_accessor :amount
 
  def initialize
    super(80, 208, 480, 96)
    @item_max = 1
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = $defaultfonttype
    self.contents.font.size = $defaultfontsize
    self.visible = false
    self.z += 100
    @amount = 1
    item = $data_items[1]
    option_index = 0
    refresh(item, option_index)
  end
 
  def refresh(item, option_index)
    self.contents.clear
    if item == nil
      return
    end
    if option_index == nil
      return
    end
    if option_index == 0
      self.contents.font.color = system_color
      self.contents.draw_text(0, 0, 200, 32, "How many?")
      self.contents.font.color = normal_color
      if $game_party.gold < (@amount * (item.price * $game_variables[J::BUY_RATE] / J::DIVISOR))
        self.contents.font.color = disabled_color
      end
      bitmap = RPG::Cache.icon(item.icon_name)
      opacity = self.contents.font.color == normal_color ? 255 : 128
      self.contents.blt(0, 36, bitmap, Rect.new(0, 0, 24, 24), opacity)
      self.contents.draw_text(28, 32, 120, 32, item.name)
      self.contents.draw_text(335, 32, 10, 32, "x")
      self.contents.draw_text(280, 32, 30, 32, @amount.to_s, 2)
      self.cursor_rect.set(284, 32, 32, 32)
      self.contents.draw_text(370, 32, 70, 32, (@amount * (item.price * $game_variables[J::BUY_RATE] / J::DIVISOR)).to_s, 2)
    else
      self.contents.font.color = system_color
      self.contents.draw_text(0, 0, 200, 32, "How many?")
      self.contents.font.color = normal_color
      bitmap = RPG::Cache.icon(item.icon_name)
      opacity = self.contents.font.color == normal_color ? 255 : 128
      self.contents.blt(0, 36, bitmap, Rect.new(0, 0, 24, 24), opacity)
      self.contents.draw_text(28, 32, 120, 32, item.name)
      self.contents.draw_text(335, 32, 10, 32, "x")
      self.contents.draw_text(280, 32, 30, 32, @amount.to_s, 2)
      self.cursor_rect.set(284, 32, 32, 32)
      self.contents.draw_text(370, 32, 70, 32, (@amount * (item.price * $game_variables[J::SELL_RATE] / J::DIVISOR)).to_s, 2)
    end
  end
end
#===============================================================================
#  END Window_Shop_Amount
#===============================================================================


#===============================================================================
#  Scene_Shop
#===============================================================================
class Scene_Shop
  def main
    @counter = 0
    @info_window = Window_Shop_Info.new
    @option_window = Window_Shop_Option.new
    @gold_window = Window_Shop_Gold.new
    @own_window = Window_Shop_Own.new
    @list_window = Window_Shop_List.new($game_temp.shop_goods)
    @desc_item_window = Window_Shop_Description_Item.new
    @desc_equip_window = Window_Shop_Description_Equipment.new
    @actor_window = Window_Shop_Actors.new
    @amount_window = Window_Shop_Amount.new
   
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
   
    @info_window.dispose
    @option_window.dispose
    @gold_window.dispose
    @own_window.dispose
    @list_window.dispose
    @desc_item_window.dispose
    @desc_equip_window.dispose
    @actor_window.dispose
    @amount_window.dispose
  end
 
  def update
    @info_window.update
    @option_window.update
    @gold_window.update
    @own_window.update
    @list_window.update
    @desc_item_window.update
    @desc_equip_window.update
    @actor_window.update
    @amount_window.update
   
    if @option_window.active
      update_option
      return
    end
   
    if @list_window.active
      update_list
      return
    end
   
    if @actor_window.visible
      update_actors
      return
    end
   
    if @amount_window.active and @option_window.index == 0
      update_amount
      return
    end
   
    if @amount_window.active and @option_window.index == 1
      update_sell
      return
    end
  end
 
  def update_option
    @info_window.refresh(0)
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      case @option_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        @list_window.refresh
        @option_window.active = false
        @list_window.visible = true
        @list_window.active = true
        @list_window.index = 0
      when 1
        $game_system.se_play($data_system.decision_se)
        @list_window.refresh_sell(@option_window.index)
        @option_window.active = false
        @list_window.visible = true
        @list_window.active = true
        @list_window.index = 0
      when 2
        $game_system.se_play($data_system.cancel_se)
        $scene = Scene_Map.new
        return
      end
    end
  end
 
  def update_list
    @info_window.refresh(1)
    @item = @list_window.item
    if @counter != 1
      if @item.is_a?(RPG::Item)
        @desc_item_window.refresh(@item)
        @counter = 1
      else
        @desc_equip_window.refresh(@item)
        @counter = 1
      end
    end
    @own_window.refresh(@list_window.item)
    if Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN) or Input.repeat?(Input::UP) or Input.repeat?(Input::DOWN)
      @counter = 0
    end
    if @item.is_a?(RPG::Item)
      if @counter != 1
        @desc_item_window.refresh(@item)
        @counter = 1
      end
      @desc_item_window.visible = true
      @desc_equip_window.visible = false
    else
      if @counter != 1
        @desc_equip_window.refresh(@item)
        @counter = 1
      end
      @desc_item_window.visible = false
      @desc_equip_window.visible = true
    end
    if Input.trigger?(Input::B)
      @counter = 0
      $game_system.se_play($data_system.cancel_se)
      @desc_item_window.visible = false
      @desc_equip_window.visible = false
      @desc_item_window.refresh(nil)
      @desc_equip_window.refresh(nil)
      @option_window.active = true
      @list_window.visible = false
      @list_window.active = false
      @own_window.refresh(nil)
      return
    end
    if Input.trigger?(Input::A)
      unless @item.is_a?(RPG::Item)
        $game_system.se_play($data_system.decision_se)
        @actor_window.refresh(@item)
        @actor_window.visible = true
        @list_window.active = false
        return
      else
        $game_system.se_play($data_system.buzzer_se)
      end
    end
    if Input.trigger?(Input::C)
      if @item == nil or @item.id == 0 or @item.price == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @option_window.index == 0
        case @item
        when RPG::Item
          if $game_party.item_number(@item.id) >= 99
            $game_system.se_play($data_system.buzzer_se)
            return
          end
        when RPG::Weapon
         if $game_party.weapon_number(@item.id) >= 99
            $game_system.se_play($data_system.buzzer_se)
            return
          end
        when RPG::Armor
          if $game_party.armor_number(@item.id) >= 99
            $game_system.se_play($data_system.buzzer_se)
            return
          end
        end
      end
      $game_system.se_play($data_system.decision_se)
      @amount_window.visible = true
      @amount_window.active = true
      @list_window.active = false
      return
    end
  end
 
  def update_actors
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @actor_window.visible = false
      @list_window.active = true
    end
  end
 
  def update_amount
    @amount_window.refresh(@item, @option_window.index)
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @amount_window.amount = 1
      @amount_window.visible = false
      @amount_window.active = false
      @list_window.active = true
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.gold >= (@amount_window.amount * (@item.price * $game_variables[J::BUY_RATE] / J::DIVISOR))
        $game_system.se_play($data_system.decision_se)
        $game_party.lose_gold(@amount_window.amount * (@item.price * $game_variables[J::BUY_RATE] / J::DIVISOR))
        case @item
        when RPG::Item
          $game_party.gain_item(@item.id, @amount_window.amount)
        when RPG::Weapon
          $game_party.gain_weapon(@item.id, @amount_window.amount)
        when RPG::Armor
          $game_party.gain_armor(@item.id, @amount_window.amount)
        end
        @gold_window.refresh
        @amount_window.amount = 1
        @amount_window.visible = false
        @amount_window.active = false
        @list_window.active = true
        @list_window.refresh
        return
      else
        $game_system.se_play($data_system.buzzer_se)
      end
    end
    if Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount -= 1
      if @amount_window.amount == 0
        @amount_window.amount = 1
      end
      return
    end
    if Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount += 1
      case @item
      when RPG::Item
        if ($game_party.item_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.item_number(@item.id))
        end
      when RPG::Weapon
        if ($game_party.weapon_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.weapon_number(@item.id))
        end
      when RPG::Armor
        if ($game_party.armor_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.armor_number(@item.id))
        end
      end
      return
    end
    if Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount += 10
      case @item
      when RPG::Item
        if ($game_party.item_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.item_number(@item.id))
        end
      when RPG::Weapon
        if ($game_party.weapon_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.weapon_number(@item.id))
        end
      when RPG::Armor
        if ($game_party.armor_number(@item.id) + @amount_window.amount) > 99
          @amount_window.amount = (99 - $game_party.armor_number(@item.id))
        end
      end
      return
    end
    if Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount -= 10
      if @amount_window.amount < 1
        @amount_window.amount = 1
      end
      return
    end
  end
 
  def update_sell
    @amount_window.refresh(@item, @option_window.index)
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @amount_window.amount = 1
      @amount_window.visible = false
      @amount_window.active = false
      @list_window.active = true
      return
    end
    if Input.trigger?(Input::C)
      if @item.price == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      case @item
      when RPG::Item
        $game_party.gain_gold(@amount_window.amount * (@item.price * $game_variables[J::SELL_RATE] / J::DIVISOR))
        $game_party.lose_item(@item.id, @amount_window.amount)
      when RPG::Weapon
        $game_party.gain_gold(@amount_window.amount * (@item.price * $game_variables[J::SELL_RATE] / J::DIVISOR))
        $game_party.lose_weapon(@item.id, @amount_window.amount)
      when RPG::Armor
        $game_party.gain_gold(@amount_window.amount * (@item.price * $game_variables[J::BUY_RATE] / J::DIVISOR))
        $game_party.lose_armor(@item.id, @amount_window.amount)
      end
      @gold_window.refresh
      @amount_window.amount = 1
      @amount_window.visible = false
      @amount_window.active = false
      @list_window.active = true
      @list_window.refresh_sell(@option_window.index)
      @desc_equip_window.refresh(nil)
      @desc_item_window.refresh(nil)
    end
    if Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount -= 1
      if @amount_window.amount < 1
        @amount_window.amount = 1
      end
    end
    if Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      case @item
      when RPG::Item
        @amount_window.amount += 1
        if @amount_window.amount > $game_party.item_number(@item.id)
          @amount_window.amount = $game_party.item_number(@item.id)
        end
      when RPG::Weapon
        @amount_window.amount += 1
        if @amount_window.amount > $game_party.weapon_number(@item.id)
          @amount_window.amount = $game_party.weapon_number(@item.id)
        end
      when RPG::Armor
        @amount_window.amount += 1
        if @amount_window.amount > $game_party.armor_number(@item.id)
          @amount_window.amount = $game_party.armor_number(@item.id)
        end
      end
    end
    if Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      case @item
      when RPG::Item
        @amount_window.amount += 10
        if @amount_window.amount > $game_party.item_number(@item.id)
          @amount_window.amount = $game_party.item_number(@item.id)
        end
      when RPG::Weapon
        @amount_window.amount += 10
        if @amount_window.amount > $game_party.weapon_number(@item.id)
          @amount_window.amount = $game_party.weapon_number(@item.id)
        end
      when RPG::Armor
        @amount_window.amount += 10
        if @amount_window.amount > $game_party.armor_number(@item.id)
          @amount_window.amount = $game_party.armor_number(@item.id)
        end
      end
    end
    if Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @amount_window.amount -= 10
      if @amount_window.amount < 1
        @amount_window.amount = 1
      end
    end
  end
 
end


Enjoy.
A bright light can either illuminate or blind, but how will you know which until you open your eyes?