Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Scene_Shop mejorado

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2013-01-23, 16:29

Código:
#Todo este tochazo en su conjunto es la Scene_Shop, junto a las Window editadas

module SLV_Vocab
  
  SHOP_TEXT = 1 # 0 = texto default, 1 = texto del module
  
  ATK = "Ata"                 #Ataque
  PDEF = "Arm"                #Armadura física
  MDEF = "Res"                #Armadura mágica
  
  STR = "Fue"                 #Fuerza
  DEX = "Dex"                 #Destreza
  AGI = "Agi"                 #Agilidad
  INT = "Int"                 #Inteligencia
  
end

#==============================================================================
# ** Window_ShopNumber
#------------------------------------------------------------------------------
#  This window is for inputting quantity of items to buy or sell on the
#  shop screen.
#==============================================================================

class Window_ShopNumber < Window_Base
  def initialize
    super(0, 128, 308, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    @max = 1
    @price = 0
    @number = 1
  end
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    self.contents.font.color = normal_color
    self.contents.draw_text(122, 128, 32, 32, "×")
    self.contents.draw_text(158, 128, 24, 32, @number.to_s, 2)
    domination = $data_system.words.gold
    cx = contents.text_size(domination).width
    total_price = @price * @number
    #self.contents.draw_text(4, 224, 268-cx-2, 32, current_gold.to_s, 2)
    self.cursor_rect.set(304, 128, 32, 32)
    # Draw total price and currency units
    #self.contents.font.color = normal_color
    self.contents.draw_text(30, 128, 50, 32, @price.to_s, 2)
    self.contents.draw_text(4, 192, 268-cx-2, 32, total_price.to_s, 2)
    self.contents.draw_text(4, 160, 268, 32, "-------------------------------------------------", 2)
    self.contents.font.color = system_color
    self.contents.draw_text(272-cx, 192, cx, 32, domination, 2)
  end
end

#==============================================================================
# ** Window_ShopBuy
#------------------------------------------------------------------------------
#  This window displays buyable goods on the shop screen.
#==============================================================================

class Window_ShopBuy < Window_Selectable
  def initialize(shop_goods)
    super(0, 128, 308, 352)
    @shop_goods = shop_goods
    get_item_sets
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    shop_goods : goods
  #--------------------------------------------------------------------------    
  
  
  def get_item_sets
    @shop_clone = @shop_goods
    @item_set = []
    @weapon_set = []
    @armor_set = []
    
    for goods_item in @shop_clone
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
        @item_set.push(item) if item != nil
      when 1
        item = $data_weapons[goods_item[1]]
        @weapon_set.push(item) if item != nil
      when 2
        item = $data_armors[goods_item[1]]
        @armor_set.push(item) if item != nil
      end
    end
  end
  
  def refresh(n)
    #Editado para que sólo muestre un tipo de objetos (items, armas o protectores)
    @kind = n
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    case @kind
    when 0
      @data = @item_set
    when 1
      @data = @weapon_set
    when 2
      @data = @armor_set
    end
    self.index = 0
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

class Window_ShopSell < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 128, 640, 352)
    @column_max = 2
    refresh
    self.index = 0
  end
  
end

#==============================================================================
# ** Window_ShopStatus
#------------------------------------------------------------------------------
#  This window displays number of items in possession and the actor's equipment
#  on the shop screen.
#==============================================================================

class Window_ShopStatus < Window_Base
  def initialize
    super(308, 128, 332, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    refresh
  end
  
  def refresh_item
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32, 220, 32, "Recuperación de VIT:")
    self.contents.draw_text(4, 128, 220, 32, "Recuperación de MP:")
    self.contents.font.color = normal_color
    self.contents.draw_text(90, 64, 30, 32, "+", 1)
    self.contents.draw_text(90, 96, 30, 32, "%", 1)
    self.contents.draw_text(180, 64, 60, 32, @item.recover_hp.to_s, 2)
    self.contents.draw_text(180, 96, 60, 32, @item.recover_hp_rate.to_s, 2)
    self.contents.draw_text(90, 160, 30, 32, "+", 1)
    self.contents.draw_text(90, 192, 30, 32, "%", 1)
    self.contents.draw_text(180, 160, 60, 32, @item.recover_sp.to_s, 2)
    self.contents.draw_text(180, 192, 60, 32, @item.recover_sp_rate.to_s, 2)
  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 = system_color
    self.contents.draw_text(4, 0, 200, 32, "En inventario:")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
    
    # Dibuja los efectos de los objetos
    if @item.is_a?(RPG::Item)
      refresh_item
      return
    elsif @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor)
      refresh_equipment
    end
  end
  
  def refresh_equipment
    self.contents.clear
    if @item == nil
      return
    end
    self.contents.font.color = system_color
    if SLV_Vocab::SHOP_TEXT == 0
      self.contents.draw_text(4, 64, 30, 32, $data_system.words.atk)
      self.contents.draw_text(4, 96, 30, 32, $data_system.words.pdef)
      self.contents.draw_text(4, 128, 30, 32, $data_system.words.mdef)
      self.contents.draw_text(4, 160, 30, 32, $data_system.words.str)
      self.contents.draw_text(4, 192, 30, 32, $data_system.words.dex)
      self.contents.draw_text(4, 224, 30, 32, $data_system.words.agi)
      self.contents.draw_text(4, 256, 30, 32, $data_system.words.int)
    else
      self.contents.draw_text(4, 64, 30, 32, SLV_Vocab::ATK)
      self.contents.draw_text(4, 96, 30, 32, SLV_Vocab::PDEF)
      self.contents.draw_text(4, 128, 30, 32, SLV_Vocab::MDEF)
      self.contents.draw_text(4, 160, 30, 32, SLV_Vocab::STR)
      self.contents.draw_text(4, 192, 30, 32, SLV_Vocab::DEX)
      self.contents.draw_text(4, 224, 30, 32, SLV_Vocab::AGI)
      self.contents.draw_text(4, 256, 30, 32, SLV_Vocab::INT)
    end
      # Draw actor's name
    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
    # Equipment adding information
    for i in 0...$game_party.actors.size
      # Get actor
      actor = $game_party.actors[i]
      # If equippable, then set to normal text color. If not, set to
      # invalid text color.
      if actor.equippable?(@item)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text(25 + 70 * i, 32, 60, 32, actor.name)
      # Get current equipment
      if @item.is_a?(RPG::Weapon)
        item1 = $data_weapons[actor.weapon_id]
      elsif @item.kind == 0
        item1 = $data_armors[actor.armor1_id]
      elsif @item.kind == 1
        item1 = $data_armors[actor.armor2_id]
      elsif @item.kind == 2
        item1 = $data_armors[actor.armor3_id]
      else
        item1 = $data_armors[actor.armor4_id]
      end
      # If equippable
      if actor.equippable?(@item)
        # If weapon
        # Sólo las armas pueden modificar el ataque de los personajes
        if @item.is_a?(RPG::Weapon)
          atk1 = item1 != nil ? item1.atk : 0
          atk2 = @item != nil ? @item.atk : 0
          atk_change = atk2 - atk1
        end
          pdef1 = item1 != nil ? item1.pdef : 0
          pdef2 = @item != nil ? @item.pdef : 0
          pdef_change = pdef2 - pdef1
          
          mdef1 = item1 != nil ? item1.mdef : 0
          mdef2 = @item != nil ? @item.mdef : 0
          mdef_change = mdef2 - mdef1
          
          str1 = item1 != nil ? item1.str_plus : 0
          str2 = @item != nil ? @item.str_plus : 0
          str_change = str2 - str1
          
          dex1 = item1 != nil ? item1.dex_plus : 0
          dex2 = @item != nil ? @item.dex_plus : 0
          dex_change = dex2 - dex1
          
          agi1 = item1 != nil ? item1.agi_plus : 0
          agi2 = @item != nil ? @item.agi_plus : 0
          agi_change = agi2 - agi1
          
          int1 = item1 != nil ? item1.int_plus : 0
          int2 = @item != nil ? @item.int_plus : 0
          int_change = int2 - int1

        # Draw parameter change values


        # Draw atk change
        # No dibujará el cambio de ataque de objetos que no sean armas
        if @item.is_a?(RPG::Weapon)
        if atk_change > 0
          self.contents.font.color = text_color(4)
        elsif atk_change <0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        end
        self.contents.draw_text(30 + 70 * i, 64, 60, 32, sprintf("%+d", atk_change), 1)
        
        # Draw pdef change
        if pdef_change > 0
          self.contents.font.color = text_color(4)
        elsif pdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 96, 60, 32, sprintf("%+d", pdef_change), 1)
        # Draw mdef change
        if mdef_change > 0
          self.contents.font.color = text_color(4)
        elsif mdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 128, 60, 32, sprintf("%+d", mdef_change), 1)
        # Draw str change
        if str_change > 0
          self.contents.font.color = text_color(4)
        elsif str_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 160, 60, 32, sprintf("%+d", str_change), 1)
        # Draw dex change
        if dex_change > 0
          self.contents.font.color = text_color(4)
        elsif dex_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 192, 60, 32, sprintf("%+d", dex_change), 1)
        # Draw agi change
        if agi_change > 0
          self.contents.font.color = text_color(4)
        elsif agi_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 224, 60, 32, sprintf("%+d", agi_change), 1)
        # Draw int change
        if int_change > 0
          self.contents.font.color = text_color(4)
        elsif int_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 256, 60, 32, sprintf("%+d", int_change), 1)
      end
    end
  end
end


#------------------------------------------------------------------------------
#  This window is used to choose your business on the shop screen.
#==============================================================================

class Window_ShopCommand2 < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  #Window nueva para elegir entre comprar items, armas y protectores
  def initialize
    super(0, 64, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["Objetos", "Armas", "Protectores"]
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #    index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    x = 4 + index * 160
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end

#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  This class performs shop screen processing.
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Make help window
    @help_window = Window_Help.new
    # Make command window
    @command_window = Window_ShopCommand.new
    @command_window2 = Window_ShopCommand2.new
    @command_window2.visible = false
    @command_window2.active = false
    # Make gold window
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    # Make dummy window
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # Make buy window
    @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # Make sell window
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
    # Make quantity input window
    @number_window = Window_ShopNumber.new
    @number_window.active = false
    @number_window.visible = false
    # Make status window
    @status_window = Window_ShopStatus.new
    @status_window.visible = false
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @number_window.dispose
    @status_window.dispose
    @command_window2.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    @status_window.update if @status_window.visible == true
    @command_window2.update
    # If command window is active: call update_command
    if @command_window.active
      update_command
      return
    end
    
    if @command_window2.active
      update_command2
      return
    end
    
    # If buy window is active: call update_buy
    if @buy_window.active
      update_buy
      return
    end
    # If sell window is active: call update_sell
    if @sell_window.active
      update_sell
      return
    end
    # If quantity input window is active: call update_number
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when command window is active)
  #--------------------------------------------------------------------------
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to buy mode
        @command_window.active = false
        @command_window.visible = false
        @command_window2.active = true
        @command_window2.visible = true
      when 1  # sell
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to sell mode
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
      when 2  # quit
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to map screen
        $scene = Scene_Map.new
      end
      return
    end
  end
  
  def update_command2
    # If B button was pressed
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window2.active = false
      @command_window2.visible = false
      @command_window.active = true
      @command_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @dummy_window.visible = true
      return
    end
    if Input.trigger?(Input::C)
      case @command_window2.index
      when 0 #Buy items
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 0
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 1 #Buy weapons
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 1
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 2 #Buy armors
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 2
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      end
      return
    end
  end
        
  #--------------------------------------------------------------------------
  # * Frame Update (when buy window is active)
  #--------------------------------------------------------------------------
  def update_buy
    # Set status window item
    @status_window.item = @buy_window.item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window2.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @buy_window.item
      # If item is invalid, or price is higher than money possessed
      if @item == nil or @item.price > $game_party.gold
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Get items in possession count
      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 99 items are already in possession
      if number == 99
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Calculate maximum amount possible to buy
      max = @item.price == 0 ? 99 : $game_party.gold / @item.price
      max = [max, 99 - number].min
      # Change windows to quantity input mode
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, @item.price)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when sell window is active)
  #--------------------------------------------------------------------------
  def update_sell
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @sell_window.item
      # Set status window item
      @status_window.item = @item
      # If item is invalid, or item price is 0 (unable to sell)
      if @item == nil or @item.price == 0
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Get items in possession count
      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
      # Maximum quanitity to sell = number of items in possession
      max = number
      # Change windows to quantity input mode
      @sell_window.active = false
      @sell_window.visible = false
      @number_window.set(@item, max, @item.price / 2)
      @number_window.active = true
      @number_window.visible = true
      @status_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when quantity input window is active)
  #--------------------------------------------------------------------------
  def update_number
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play shop SE
      $game_system.se_play($data_system.shop_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Buy process
        $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
        # Refresh each window
        @gold_window.refresh
        @buy_window.refresh(@buy_kind)
        @status_window.refresh
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Sell process
        $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
        # Refresh each window
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
  end
end




Este tocho-script de 700 líneas (de entre las que 650 son copiadas del Maker xD) es un edit del Scene_Shop original de RMXP. Incluye el apaño previo que le hice para mostrar los cambios en los parámetros al elegir armas/protectores, los efectos de los items, y añade una nueva ventana para elegir entre comprar items, armas y protectores.

Para usarlo, pegarlo encima de Main y listos.

No pido créditos, que este pergeño no merece ser llamado script xD.

Edito (24/4/14): versión estable y corregida del script. Pido disculpas a todos los que usasen una versión anterior con errores. La versión actual incluye un module vocab al principio para poder usar abreviaciones en la tienda, dado que los nombres por default de los parámetros son demasiado largos para que quepan en la ventana.

Edito (4/4/15): versión compatible con IGOS aquí.


Última edición por silvanash el 2015-04-04, 13:27, editado 5 veces
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por Wecoc el 2013-01-23, 17:26

¿Y todos esos fallos?

Screen 1:
Spoiler:
La ventana queda mal (hay un hueco negro) y los Elixires salen 3 veces sin venir a cuento.



Screen 2:
Spoiler:
El cursor queda mal posicionado y no funcionan Q y W



Screen 3:
Spoiler:
La espada tambien sale doble, y en la ventana de los parámetros queda todo recortado, tanto los nombres como los parámetros.



Además si usa tanto RTP, quizá habría valido más la pena usar algún alias, ¿no?
Silva tío, ¿qué es esto? xDD
avatar
Wecoc
Administrador
Administrador



Créditos 12286

Gracias : 646

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2013-01-23, 17:30

LOL.

Se me olvidaba que también edité la posición y el tamaño de las ventanas, y no copié esas nuevas posiciones en los scripts. Pues nada, a copiar todos los intialize xDDDDD.

Creo que será mejor que copie todas las Windows que edité, en lugar de sólo la parte que creo que cambié, viendo cómo está esto.

Lo de que no queda la letra... Bueno, la Font.size por default del Maker es una exageración. Con ese tamaño de fuente, la mitad de las líneas de texto acaban con palabras recortadas cuando haces un mostrar mensaje. Ahí ya no puedo hacer nada xDD.

Lo de que se duplican los objetos no sé por qué pasa, la verdad. Yo tengo el script y no me ha pasado eso.

Pues nada, a reapañar esto.

Edito: ya he posteado el script con los initializes. Ahora ya no debería haber errores.
Ya de paso, dejo una captura de cómo se ve en mi portátil.

Spoiler:

No hay espacios negros ni objetos duplicados. Esas armas son las primeras 10 armas de la base de datos, y no parece haber conflictos con ninguna ID. Y la font de la captura es Arial tamaño 20.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2014-04-22, 21:26

Spammazo:

He hecho una revisión del código porque me saltaron unos bugs horribles al probar el script en otro proyecto. Dejo aquí la nueva versión:

Código:
#Todo este tochazo en su conjunto es la Scene_Shop, junto a las Window editadas

#==============================================================================
# ** Window_ShopNumber
#------------------------------------------------------------------------------
#  This window is for inputting quantity of items to buy or sell on the
#  shop screen.
#==============================================================================

class Window_ShopNumber < Window_Base
  def initialize
    super(0, 128, 308, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    @max = 1
    @price = 0
    @number = 1
  end
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    self.contents.font.color = normal_color
    self.contents.draw_text(122, 128, 32, 32, "×")
    self.contents.draw_text(158, 128, 24, 32, @number.to_s, 2)
    domination = $data_system.words.gold
    cx = contents.text_size(domination).width
    total_price = @price * @number
    #self.contents.draw_text(4, 224, 268-cx-2, 32, current_gold.to_s, 2)
    self.cursor_rect.set(304, 128, 32, 32)
    # Draw total price and currency units
    #self.contents.font.color = normal_color
    self.contents.draw_text(30, 128, 50, 32, @price.to_s, 2)
    self.contents.draw_text(4, 192, 268-cx-2, 32, total_price.to_s, 2)
    self.contents.draw_text(4, 160, 268, 32, "-------------------------------------------------", 2)
    self.contents.font.color = system_color
    self.contents.draw_text(272-cx, 192, cx, 32, domination, 2)
  end
end

#==============================================================================
# ** Window_ShopBuy
#------------------------------------------------------------------------------
#  This window displays buyable goods on the shop screen.
#==============================================================================

class Window_ShopBuy < Window_Selectable
  def initialize(shop_goods)
    super(0, 128, 308, 352)
    @shop_goods = shop_goods
    get_item_sets
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    shop_goods : goods
  #--------------------------------------------------------------------------   
 
 
  def get_item_sets
    @shop_clone = @shop_goods
    @item_set = []
    @weapon_set = []
    @armor_set = []
   
    for goods_item in @shop_clone
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
        @item_set.push(item) if item != nil
      when 1
        item = $data_weapons[goods_item[1]]
        @weapon_set.push(item) if item != nil
      when 2
        item = $data_armors[goods_item[1]]
        @armor_set.push(item) if item != nil
      end
    end
  end
 
  def refresh(n)
    #Editado para que sólo muestre un tipo de objetos (items, armas o protectores)
    @kind = n
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    case @kind
    when 0
      @data = @item_set
    when 1
      @data = @weapon_set
    when 2
      @data = @armor_set
    end
    self.index = 0
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

class Window_ShopSell < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 128, 640, 352)
    @column_max = 2
    refresh
    self.index = 0
  end
 
end

#==============================================================================
# ** Window_ShopStatus
#------------------------------------------------------------------------------
#  This window displays number of items in possession and the actor's equipment
#  on the shop screen.
#==============================================================================

class Window_ShopStatus < Window_Base
  def initialize
    super(308, 128, 332, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    refresh
  end
 
  def refresh_item
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32, 220, 32, "Recuperación de VIT:")
    self.contents.draw_text(4, 128, 220, 32, "Recuperación de MP:")
    self.contents.font.color = normal_color
    self.contents.draw_text(90, 64, 30, 32, "+", 1)
    self.contents.draw_text(90, 96, 30, 32, "%", 1)
    self.contents.draw_text(180, 64, 60, 32, @item.recover_hp.to_s, 2)
    self.contents.draw_text(180, 96, 60, 32, @item.recover_hp_rate.to_s, 2)
    self.contents.draw_text(90, 160, 30, 32, "+", 1)
    self.contents.draw_text(90, 192, 30, 32, "%", 1)
    self.contents.draw_text(180, 160, 60, 32, @item.recover_sp.to_s, 2)
    self.contents.draw_text(180, 192, 60, 32, @item.recover_sp_rate.to_s, 2)
  end
 
  def refresh_weapon
   
  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 = system_color
    self.contents.draw_text(4, 0, 200, 32, "En inventario:")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
   
    # Dibuja los efectos de los objetos
    if @item.is_a?(RPG::Item)
      refresh_item
      return
    end
    # Equipment adding information
    for i in 0...$game_party.actors.size
      # Get actor
      actor = $game_party.actors[i]
      # If equippable, then set to normal text color. If not, set to
      # invalid text color.
      if actor.equippable?(@item)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      # Draw actor's name
      self.contents.draw_text(25 + 70 * i, 32, 60, 32, actor.name)
      # Get current equipment
      if @item.is_a?(RPG::Weapon)
        item1 = $data_weapons[actor.weapon_id]
      elsif @item.kind == 0
        item1 = $data_armors[actor.armor1_id]
      elsif @item.kind == 1
        item1 = $data_armors[actor.armor2_id]
      elsif @item.kind == 2
        item1 = $data_armors[actor.armor3_id]
      else
        item1 = $data_armors[actor.armor4_id]
      end
      # If equippable
      if actor.equippable?(@item)
        # If weapon
        # Sólo las armas pueden modificar el ataque de los personajes
        if @item.is_a?(RPG::Weapon)
          atk1 = item1 != nil ? item1.atk : 0
          atk2 = @item != nil ? @item.atk : 0
          atk_change = atk2 - atk1
        end
          pdef1 = item1 != nil ? item1.pdef : 0
          pdef2 = @item != nil ? @item.pdef : 0
          pdef_change = pdef2 - pdef1
         
          mdef1 = item1 != nil ? item1.mdef : 0
          mdef2 = @item != nil ? @item.mdef : 0
          mdef_change = mdef2 - mdef1
         
          str1 = item1 != nil ? item1.str_plus : 0
          str2 = @item != nil ? @item.str_plus : 0
          str_change = str2 - str1
         
          dex1 = item1 != nil ? item1.dex_plus : 0
          dex2 = @item != nil ? @item.dex_plus : 0
          dex_change = dex2 - dex1
         
          agi1 = item1 != nil ? item1.agi_plus : 0
          agi2 = @item != nil ? @item.agi_plus : 0
          agi_change = agi2 - agi1
         
          int1 = item1 != nil ? item1.int_plus : 0
          int2 = @item != nil ? @item.int_plus : 0
          int_change = int2 - int1

        # Draw parameter change values
        self.contents.font.color = system_color
        self.contents.draw_text(4, 64, 30, 32, $data_system.words.atk)
        self.contents.draw_text(4, 96, 30, 32, $data_system.words.pdef)
        self.contents.draw_text(4, 128, 30, 32, $data_system.words.mdef)
        self.contents.draw_text(4, 160, 30, 32, $data_system.words.str)
        self.contents.draw_text(4, 192, 30, 32, $data_system.words.dex)
        self.contents.draw_text(4, 224, 30, 32, $data_system.words.agi)
        self.contents.draw_text(4, 256, 30, 32, $data_system.words.int)

        # Draw atk change
        # No dibujará el cambio de ataque de objetos que no sean armas
        if @item.is_a?(RPG::Weapon)
        if atk_change > 0
          self.contents.font.color = text_color(4)
        elsif atk_change <0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        end
        self.contents.draw_text(30 + 70 * i, 64, 60, 32, sprintf("%+d", atk_change), 1)
       
        # Draw pdef change
        if pdef_change > 0
          self.contents.font.color = text_color(4)
        elsif pdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 96, 60, 32, sprintf("%+d", pdef_change), 1)
        # Draw mdef change
        if mdef_change > 0
          self.contents.font.color = text_color(4)
        elsif mdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 128, 60, 32, sprintf("%+d", mdef_change), 1)
        # Draw str change
        if str_change > 0
          self.contents.font.color = text_color(4)
        elsif str_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 160, 60, 32, sprintf("%+d", str_change), 1)
        # Draw dex change
        if dex_change > 0
          self.contents.font.color = text_color(4)
        elsif dex_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 192, 60, 32, sprintf("%+d", dex_change), 1)
        # Draw agi change
        if agi_change > 0
          self.contents.font.color = text_color(4)
        elsif agi_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 224, 60, 32, sprintf("%+d", agi_change), 1)
        # Draw int change
        if int_change > 0
          self.contents.font.color = text_color(4)
        elsif int_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 256, 60, 32, sprintf("%+d", int_change), 1)
      end
      # Draw item
      # Desactivado el draw item por falta de espacio para escribir los nombres
      #if item1 != nil
        #x = 10 + 70 * i
        #y = 64
        #bitmap = RPG::Cache.icon(item1.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, 70, 32, item1.name)
      #end
    end
  end
end

#------------------------------------------------------------------------------
#  This window is used to choose your business on the shop screen.
#==============================================================================

class Window_ShopCommand2 < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  #Window nueva para elegir entre comprar items, armas y protectores
  def initialize
    super(0, 64, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["Objetos", "Armas", "Protectores"]
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #    index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    x = 4 + index * 160
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end

#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  This class performs shop screen processing.
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Make help window
    @help_window = Window_Help.new
    # Make command window
    @command_window = Window_ShopCommand.new
    @command_window2 = Window_ShopCommand2.new
    @command_window2.visible = false
    @command_window2.active = false
    # Make gold window
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    # Make dummy window
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # Make buy window
    @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # Make sell window
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
    # Make quantity input window
    @number_window = Window_ShopNumber.new
    @number_window.active = false
    @number_window.visible = false
    # Make status window
    @status_window = Window_ShopStatus.new
    @status_window.visible = false
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @number_window.dispose
    @status_window.dispose
    @command_window2.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    @status_window.update
    @command_window2.update
    # If command window is active: call update_command
    if @command_window.active
      update_command
      return
    end
   
    if @command_window2.active
      update_command2
      return
    end
   
    # If buy window is active: call update_buy
    if @buy_window.active
      update_buy
      return
    end
    # If sell window is active: call update_sell
    if @sell_window.active
      update_sell
      return
    end
    # If quantity input window is active: call update_number
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when command window is active)
  #--------------------------------------------------------------------------
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to buy mode
        @command_window.active = false
        @command_window.visible = false
        @command_window2.active = true
        @command_window2.visible = true
      when 1  # sell
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to sell mode
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
      when 2  # quit
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to map screen
        $scene = Scene_Map.new
      end
      return
    end
  end
 
  def update_command2
    # If B button was pressed
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window2.active = false
      @command_window2.visible = false
      @command_window.active = true
      @command_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @dummy_window.visible = true
      return
    end
    if Input.trigger?(Input::C)
      case @command_window2.index
      when 0 #Buy items
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 0
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 1 #Buy weapons
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 1
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 2 #Buy armors
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 2
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      end
      return
    end
  end
       
  #--------------------------------------------------------------------------
  # * Frame Update (when buy window is active)
  #--------------------------------------------------------------------------
  def update_buy
    # Set status window item
    @status_window.item = @buy_window.item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window2.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @buy_window.item
      # If item is invalid, or price is higher than money possessed
      if @item == nil or @item.price > $game_party.gold
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Get items in possession count
      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 99 items are already in possession
      if number == 99
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Calculate maximum amount possible to buy
      max = @item.price == 0 ? 99 : $game_party.gold / @item.price
      max = [max, 99 - number].min
      # Change windows to quantity input mode
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, @item.price)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when sell window is active)
  #--------------------------------------------------------------------------
  def update_sell
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @sell_window.item
      # Set status window item
      @status_window.item = @item
      # If item is invalid, or item price is 0 (unable to sell)
      if @item == nil or @item.price == 0
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Get items in possession count
      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
      # Maximum quanitity to sell = number of items in possession
      max = number
      # Change windows to quantity input mode
      @sell_window.active = false
      @sell_window.visible = false
      @number_window.set(@item, max, @item.price / 2)
      @number_window.active = true
      @number_window.visible = true
      @status_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when quantity input window is active)
  #--------------------------------------------------------------------------
  def update_number
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play shop SE
      $game_system.se_play($data_system.shop_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Buy process
        $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
        # Refresh each window
        @gold_window.refresh
        @buy_window.refresh(@buy_kind)
        @status_window.refresh
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Sell process
        $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
        # Refresh each window
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
  end
end


Ahora bien, he solucionado ese bug, pero resulta que vivo con un lag insufrible a la hora de comprar armas/armaduras. Sospecho que es debido al refresh de Window_ShopStatuss (que tiene que mostrar como 10 parámetros diferentes) y se ejecuta cada maldito frame. No tengo problemas para hacer el refresh de los objetos consumibles.

¿Puede alguien probar el script y comprobar si el lag es por el script o por culpa de Windows? Gracias.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por raizin el 2014-04-22, 21:41

No veo ninguna diferencia...
Es para el XP o para todas las versiones?
Y no me produce ningún lag.


Última edición por raizin el 2014-04-22, 21:45, editado 2 veces

raizin
Soñador
Soñador

0/3

Créditos 200

Gracias : 11

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2014-04-22, 21:44

Es sólo para XP. Usé las ventanas y escenas del RTP, y el VX y el ACE cambiaron el código de esas ventanas y no tengo ni idea de cómo funcionan ahí.

Si no te ha dado lag es que mi portátil es una maravilla de ingeniería electrónica, obra conjunta de Microsoft y AMD. Tiempos modernos, dijeron, será divertido, dijeron.

Aunque voy a ver si consigo sacar una versión que me dé menos lag a mí. No puedo permitirme tanto lag en mi propio juego.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por raizin el 2014-04-22, 21:45

¡Con razón! No me andaba porque uso el VX, luego utilizaré el VX ACE.
Lo probé en el XP, ahí si veo diferencia, pero...
De la nada, ya no se ven palabras.
PD: No me da lag. Y utilizo Windows 8.1, en una PC muy nueva.

raizin
Soñador
Soñador

0/3

Créditos 200

Gracias : 11

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2014-04-22, 22:15

El problema de que no se vea el texto es por el tamaño por default de la fuente. Con esa megafuente, es imposible que quepan cuatro personajes y 10 parámetros en una columna tan pequeña.

Puede que en un futuro le haga un module_vocab para poder usar abreviaciones dentro de la pantalla de tienda.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2014-04-24, 15:45

Doble post:

Corregido el lagazo que daba el script. Me ha costado, pero he averiguado cuál era el error (gracias a algo que dijo OZ y de lo que me he dado cuenta ahora). Resulta que cuando Window_ShopStatus va a dibujar los cambios de los stats, lo que hace es dibujar el nombre de cada héroe del grupo, luego lee su equipo, sus atributos, calcula la diferencia de atributos y los dibuja. El problema está en que la parte que dibuja el nombre de cada atributo estaba metida dentro del for i in $game_party.actors, lo que hacía que el programa dibujase cuatro veces seguidas los nombres de cada atributo (una por cada actor que tuviese dentro de la party). OZ dijo que las caídas en el framerate las notaba cuando el script tenía que dibujar las cosas, y me ha costado dos días arreglarlo. Sólo he tenido que dibujar el nombre de los atributos antes de hacer la comprobación de party.

Código:
#Todo este tochazo en su conjunto es la Scene_Shop, junto a las Window editadas

module SLV_Vocab
 
  SHOP_TEXT = 1 # 0 = texto default, 1 = texto del module
 
  ATK = "Ata"                #Ataque
  PDEF = "Arm"                #Armadura física
  MDEF = "Res"                #Armadura mágica
 
  STR = "Fue"                #Fuerza
  DEX = "Dex"                #Destreza
  AGI = "Agi"                #Agilidad
  INT = "Int"                #Inteligencia
 
end

#==============================================================================
# ** Window_ShopNumber
#------------------------------------------------------------------------------
#  This window is for inputting quantity of items to buy or sell on the
#  shop screen.
#==============================================================================

class Window_ShopNumber < Window_Base
  def initialize
    super(0, 128, 308, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    @max = 1
    @price = 0
    @number = 1
  end
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    self.contents.font.color = normal_color
    self.contents.draw_text(122, 128, 32, 32, "×")
    self.contents.draw_text(158, 128, 24, 32, @number.to_s, 2)
    domination = $data_system.words.gold
    cx = contents.text_size(domination).width
    total_price = @price * @number
    #self.contents.draw_text(4, 224, 268-cx-2, 32, current_gold.to_s, 2)
    self.cursor_rect.set(304, 128, 32, 32)
    # Draw total price and currency units
    #self.contents.font.color = normal_color
    self.contents.draw_text(30, 128, 50, 32, @price.to_s, 2)
    self.contents.draw_text(4, 192, 268-cx-2, 32, total_price.to_s, 2)
    self.contents.draw_text(4, 160, 268, 32, "-------------------------------------------------", 2)
    self.contents.font.color = system_color
    self.contents.draw_text(272-cx, 192, cx, 32, domination, 2)
  end
end

#==============================================================================
# ** Window_ShopBuy
#------------------------------------------------------------------------------
#  This window displays buyable goods on the shop screen.
#==============================================================================

class Window_ShopBuy < Window_Selectable
  def initialize(shop_goods)
    super(0, 128, 308, 352)
    @shop_goods = shop_goods
    get_item_sets
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #    shop_goods : goods
  #--------------------------------------------------------------------------   
 
 
  def get_item_sets
    @shop_clone = @shop_goods
    @item_set = []
    @weapon_set = []
    @armor_set = []
   
    for goods_item in @shop_clone
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
        @item_set.push(item) if item != nil
      when 1
        item = $data_weapons[goods_item[1]]
        @weapon_set.push(item) if item != nil
      when 2
        item = $data_armors[goods_item[1]]
        @armor_set.push(item) if item != nil
      end
    end
  end
 
  def refresh(n)
    #Editado para que sólo muestre un tipo de objetos (items, armas o protectores)
    @kind = n
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    case @kind
    when 0
      @data = @item_set
    when 1
      @data = @weapon_set
    when 2
      @data = @armor_set
    end
    self.index = 0
    # If item count is not 0, make a bit map and draw all items
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

class Window_ShopSell < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0, 128, 640, 352)
    @column_max = 2
    refresh
    self.index = 0
  end
 
end

#==============================================================================
# ** Window_ShopStatus
#------------------------------------------------------------------------------
#  This window displays number of items in possession and the actor's equipment
#  on the shop screen.
#==============================================================================

class Window_ShopStatus < Window_Base
  def initialize
    super(308, 128, 332, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    refresh
  end
 
  def refresh_item
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32, 220, 32, "Recuperación de VIT:")
    self.contents.draw_text(4, 128, 220, 32, "Recuperación de MP:")
    self.contents.font.color = normal_color
    self.contents.draw_text(90, 64, 30, 32, "+", 1)
    self.contents.draw_text(90, 96, 30, 32, "%", 1)
    self.contents.draw_text(180, 64, 60, 32, @item.recover_hp.to_s, 2)
    self.contents.draw_text(180, 96, 60, 32, @item.recover_hp_rate.to_s, 2)
    self.contents.draw_text(90, 160, 30, 32, "+", 1)
    self.contents.draw_text(90, 192, 30, 32, "%", 1)
    self.contents.draw_text(180, 160, 60, 32, @item.recover_sp.to_s, 2)
    self.contents.draw_text(180, 192, 60, 32, @item.recover_sp_rate.to_s, 2)
  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 = system_color
    self.contents.draw_text(4, 0, 200, 32, "En inventario:")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
   
    # Dibuja los efectos de los objetos
    if @item.is_a?(RPG::Item)
      refresh_item
      return
    elsif @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor)
      refresh_equipment
    end
  end
 
  def refresh_equipment
    self.contents.clear
    if @item == nil
      return
    end
    self.contents.font.color = system_color
    if SLV_Vocab::SHOP_TEXT == 0
      self.contents.draw_text(4, 64, 30, 32, $data_system.words.atk)
      self.contents.draw_text(4, 96, 30, 32, $data_system.words.pdef)
      self.contents.draw_text(4, 128, 30, 32, $data_system.words.mdef)
      self.contents.draw_text(4, 160, 30, 32, $data_system.words.str)
      self.contents.draw_text(4, 192, 30, 32, $data_system.words.dex)
      self.contents.draw_text(4, 224, 30, 32, $data_system.words.agi)
      self.contents.draw_text(4, 256, 30, 32, $data_system.words.int)
    else
      self.contents.draw_text(4, 64, 30, 32, SLV_Vocab::ATK)
      self.contents.draw_text(4, 96, 30, 32, SLV_Vocab::PDEF)
      self.contents.draw_text(4, 128, 30, 32, SLV_Vocab::MDEF)
      self.contents.draw_text(4, 160, 30, 32, SLV_Vocab::STR)
      self.contents.draw_text(4, 192, 30, 32, SLV_Vocab::DEX)
      self.contents.draw_text(4, 224, 30, 32, SLV_Vocab::AGI)
      self.contents.draw_text(4, 256, 30, 32, SLV_Vocab::INT)
    end
      # Draw actor's name
    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
    # Equipment adding information
    for i in 0...$game_party.actors.size
      # Get actor
      actor = $game_party.actors[i]
      # If equippable, then set to normal text color. If not, set to
      # invalid text color.
      if actor.equippable?(@item)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text(25 + 70 * i, 32, 60, 32, actor.name)
      # Get current equipment
      if @item.is_a?(RPG::Weapon)
        item1 = $data_weapons[actor.weapon_id]
      elsif @item.kind == 0
        item1 = $data_armors[actor.armor1_id]
      elsif @item.kind == 1
        item1 = $data_armors[actor.armor2_id]
      elsif @item.kind == 2
        item1 = $data_armors[actor.armor3_id]
      else
        item1 = $data_armors[actor.armor4_id]
      end
      # If equippable
      if actor.equippable?(@item)
        # If weapon
        # Sólo las armas pueden modificar el ataque de los personajes
        if @item.is_a?(RPG::Weapon)
          atk1 = item1 != nil ? item1.atk : 0
          atk2 = @item != nil ? @item.atk : 0
          atk_change = atk2 - atk1
        end
          pdef1 = item1 != nil ? item1.pdef : 0
          pdef2 = @item != nil ? @item.pdef : 0
          pdef_change = pdef2 - pdef1
         
          mdef1 = item1 != nil ? item1.mdef : 0
          mdef2 = @item != nil ? @item.mdef : 0
          mdef_change = mdef2 - mdef1
         
          str1 = item1 != nil ? item1.str_plus : 0
          str2 = @item != nil ? @item.str_plus : 0
          str_change = str2 - str1
         
          dex1 = item1 != nil ? item1.dex_plus : 0
          dex2 = @item != nil ? @item.dex_plus : 0
          dex_change = dex2 - dex1
         
          agi1 = item1 != nil ? item1.agi_plus : 0
          agi2 = @item != nil ? @item.agi_plus : 0
          agi_change = agi2 - agi1
         
          int1 = item1 != nil ? item1.int_plus : 0
          int2 = @item != nil ? @item.int_plus : 0
          int_change = int2 - int1

        # Draw parameter change values


        # Draw atk change
        # No dibujará el cambio de ataque de objetos que no sean armas
        if @item.is_a?(RPG::Weapon)
        if atk_change > 0
          self.contents.font.color = text_color(4)
        elsif atk_change <0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        end
        self.contents.draw_text(30 + 70 * i, 64, 60, 32, sprintf("%+d", atk_change), 1)
       
        # Draw pdef change
        if pdef_change > 0
          self.contents.font.color = text_color(4)
        elsif pdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 96, 60, 32, sprintf("%+d", pdef_change), 1)
        # Draw mdef change
        if mdef_change > 0
          self.contents.font.color = text_color(4)
        elsif mdef_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 128, 60, 32, sprintf("%+d", mdef_change), 1)
        # Draw str change
        if str_change > 0
          self.contents.font.color = text_color(4)
        elsif str_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 160, 60, 32, sprintf("%+d", str_change), 1)
        # Draw dex change
        if dex_change > 0
          self.contents.font.color = text_color(4)
        elsif dex_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 192, 60, 32, sprintf("%+d", dex_change), 1)
        # Draw agi change
        if agi_change > 0
          self.contents.font.color = text_color(4)
        elsif agi_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 224, 60, 32, sprintf("%+d", agi_change), 1)
        # Draw int change
        if int_change > 0
          self.contents.font.color = text_color(4)
        elsif int_change < 0
          self.contents.font.color = text_color(2)
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(30 + 70 * i, 256, 60, 32, sprintf("%+d", int_change), 1)
      end
    end
  end
end


#------------------------------------------------------------------------------
#  This window is used to choose your business on the shop screen.
#==============================================================================

class Window_ShopCommand2 < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  #Window nueva para elegir entre comprar items, armas y protectores
  def initialize
    super(0, 64, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["Objetos", "Armas", "Protectores"]
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #    index : item number
  #--------------------------------------------------------------------------
  def draw_item(index)
    x = 4 + index * 160
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end

#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  This class performs shop screen processing.
#==============================================================================

class Scene_Shop
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Make help window
    @help_window = Window_Help.new
    # Make command window
    @command_window = Window_ShopCommand.new
    @command_window2 = Window_ShopCommand2.new
    @command_window2.visible = false
    @command_window2.active = false
    # Make gold window
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    # Make dummy window
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # Make buy window
    @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # Make sell window
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
    # Make quantity input window
    @number_window = Window_ShopNumber.new
    @number_window.active = false
    @number_window.visible = false
    # Make status window
    @status_window = Window_ShopStatus.new
    @status_window.visible = false
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @number_window.dispose
    @status_window.dispose
    @command_window2.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    @status_window.update if @status_window.visible == true
    @command_window2.update
    # If command window is active: call update_command
    if @command_window.active
      update_command
      return
    end
   
    if @command_window2.active
      update_command2
      return
    end
   
    # If buy window is active: call update_buy
    if @buy_window.active
      update_buy
      return
    end
    # If sell window is active: call update_sell
    if @sell_window.active
      update_sell
      return
    end
    # If quantity input window is active: call update_number
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when command window is active)
  #--------------------------------------------------------------------------
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to buy mode
        @command_window.active = false
        @command_window.visible = false
        @command_window2.active = true
        @command_window2.visible = true
      when 1  # sell
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Change windows to sell mode
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
      when 2  # quit
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to map screen
        $scene = Scene_Map.new
      end
      return
    end
  end
 
  def update_command2
    # If B button was pressed
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window2.active = false
      @command_window2.visible = false
      @command_window.active = true
      @command_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @dummy_window.visible = true
      return
    end
    if Input.trigger?(Input::C)
      case @command_window2.index
      when 0 #Buy items
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 0
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 1 #Buy weapons
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 1
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      when 2 #Buy armors
        $game_system.se_play($data_system.decision_se)
        @buy_window.active = true
        @buy_window.visible = true
        @buy_kind = 2
        @buy_window.refresh(@buy_kind)
        @status_window.visible = true
        @dummy_window.visible = false
        @command_window2.active = false
      end
      return
    end
  end
       
  #--------------------------------------------------------------------------
  # * Frame Update (when buy window is active)
  #--------------------------------------------------------------------------
  def update_buy
    # Set status window item
    @status_window.item = @buy_window.item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window2.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @buy_window.item
      # If item is invalid, or price is higher than money possessed
      if @item == nil or @item.price > $game_party.gold
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Get items in possession count
      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 99 items are already in possession
      if number == 99
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Calculate maximum amount possible to buy
      max = @item.price == 0 ? 99 : $game_party.gold / @item.price
      max = [max, 99 - number].min
      # Change windows to quantity input mode
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, @item.price)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when sell window is active)
  #--------------------------------------------------------------------------
  def update_sell
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Change windows to initial mode
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @status_window.item = nil
      # Erase help text
      @help_window.set_text("")
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get item
      @item = @sell_window.item
      # Set status window item
      @status_window.item = @item
      # If item is invalid, or item price is 0 (unable to sell)
      if @item == nil or @item.price == 0
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Get items in possession count
      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
      # Maximum quanitity to sell = number of items in possession
      max = number
      # Change windows to quantity input mode
      @sell_window.active = false
      @sell_window.visible = false
      @number_window.set(@item, max, @item.price / 2)
      @number_window.active = true
      @number_window.visible = true
      @status_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when quantity input window is active)
  #--------------------------------------------------------------------------
  def update_number
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play shop SE
      $game_system.se_play($data_system.shop_se)
      # Set quantity input window to inactive / invisible
      @number_window.active = false
      @number_window.visible = false
      # Branch by command window cursor position
      case @command_window.index
      when 0  # buy
        # Buy process
        $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
        # Refresh each window
        @gold_window.refresh
        @buy_window.refresh(@buy_kind)
        @status_window.refresh
        # Change windows to buy mode
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # sell
        # Sell process
        $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
        # Refresh each window
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        # Change windows to sell mode
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
  end
end




Añadido también el module_vocab para usar abreviaciones dentro de la tienda. Está puesto justo al principio del código, para que sea fácil de editar.

Edito: el script corregido está en el post principal. El script que hay en un post que publiqué después del principal tiene el bug del lag.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por Avenger_K el 2014-05-09, 00:56

Me gusta bastante este script, sobretodo por lo de mostrar todos los parámetros de los personajes. Aun que la opción de elegir entre objetos, armas y armaduras no me atrae. ¿Hay algún modo de tener la opción default? O sea, que te salte directamente con las opciones de comprar, vender y salir.
Bye Bye!
avatar
Avenger_K
Soñador
Soñador

0/3

Créditos 338

Gracias : 15

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por BlazeCrimson el 2014-05-09, 01:56

No está mal el script, coincido con el comentario de Avenger_K, si pudiese sólo aplicarse los parámetros en armas y armaduras, sería genial.

De todas formas, gracias por el aporte :)

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1128

Gracias : 111

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por silvanash el 2014-05-09, 16:45

@Avenger_K: podría hacerlo, pero sería editar un montón de script para nada. Creo que los jugadores podrán sobrevivir teniendo las tres categorías en la tienda. Si te es realmente necesario, puedo editar el script y subir una versión más defult.

@Blaze: ¿a qué te refieres con "armas y armaduras"? El script sólo muestra los cambios de parámetros en armas y armaduras xD. Que yo sepa, sujetar una poción o usarla como escudo no cambia tus parámetros, y en el peor de los casos acabarás con una camisa manchada.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por zasentodalaboca10 el 2014-05-09, 17:25

Vaya, este script me encanta, lastima que no sea para el VX ACE :/
avatar
zasentodalaboca10
Iniciado
Iniciado

2/3

Créditos 55

Gracias : 6

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por BlazeCrimson el 2014-05-09, 18:34

@Silvanash escribió:Que yo sepa, sujetar una poción o usarla como escudo no cambia tus parámetros, y en el peor de los casos acabarás con una camisa manchada.


 Smile  con lo cara que sale la tintorería en estos tiempos, ¡que las manchas de superpoción no hay quien las quite!

Intentaré explicarme mejor, como dicen una imagen vale más que mil palabras así que...:

Imagen:

Me refería, dejar todo estándar, excepto las tiendas de armas y armaduras, que mantuvieran la tabla de la derecha que tu script presenta, pues aporta mucha más información y mejor detallada. Si estuviera este apaño lo utilizaría para mi proyecto.
(Por ciertas razones la tienda de objetos la necesito sin editar, además prefiero que "objetos", "armas" y "armaduras no estén en diferentes pestañas)

¡Nos leemos!  gcool 

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1128

Gracias : 111

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por Avenger_K el 2014-05-09, 22:13

Creo que tanto BlazeCrimson como yo te estaríamos muy agradecidos si pudieras subir una versión mas default o al menos indicar como nosotros podemos editarlo.
Bye Bye!
avatar
Avenger_K
Soñador
Soñador

0/3

Créditos 338

Gracias : 15

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

Mensaje por UmbriaChronicles el 2015-01-14, 19:10

Muchas gracias por el script silvanash! Funciona perfectamente. Por cierto, estaría bien que en el futuro hicieras una versión donde la tienda no se divida en "objetos, armaduras y armas", ya que en muchos juegos los vendedores sólo venden un tipo de item y no los 3 (por ejemplo los herreros sólo venden armas y armaduras, los alquimistas sólo objetos, etc.).

Un saludo!
avatar
UmbriaChronicles
Novato
Novato

0/3

Créditos 76

Gracias : 2

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Scene_Shop mejorado

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.