AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  ConnexionConnexion  



Le deal à ne pas rater :
SSD interne Crucial BX500 2,5″ SATA – 500 Go à 29,99€
29.99 €
Voir le deal

Partagez
 

 [VX] Inventaire limité

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Happyroms
Noble Lv.8
Noble Lv.8
Happyroms


Inscrit le : 03/11/2012
Messages : 290

[VX] Inventaire limité Empty
MessageSujet: [VX] Inventaire limité   [VX] Inventaire limité Icon_minitimeJeu 7 Mar 2013 - 20:45

Limitation des objets

Description: Limite les objets dans le menu "objet"
Auteur: modern algebra
Instruction: Placer le script eu dessus de main
Screen:

[VX] Inventaire limité 15my4b7
[VX] Inventaire limité Jpii4x

Script:

Code:
#==============================================================================
#  SCRIPT DE INVENTÁRIO LIMITADO
#  Versão: 1.1c
#  Autor: modern algebra
#  Traduzido por: Krmona
#  Data: 27 de setembro de 2009
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Descrição:
#    Este script lhe permite criar um inventário com uma capacidade máxima de
#  itens configurável além de um sistema de baú também limitado e a opção de
#  jogar itens fora ou destruí-los 
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Instruções:
#    Cole esse script acima de Main
#
#    As regiões editáveis estão nas linhas:
#=== 62 à 73
#=== Nome das constantes do script
#
#=== 93 à 96
#=== Efeitos sonoros das ações no script
#
#=== 118 à 121
#=== Dados gerais como capacidade máxima
#
#    Para que um item não possa ser jogado fora, vá até seu Histórico e digite:
#
#      \NONDISCARD
#
#    Para que um item, fuja do padrão da linha 118 do script, vá até ele no Banco
#  de Dados e digite em seu Histórico:
#
#      \STACKMAX[x]
#
#  Sendo X o valor que determinará a capacidade máxima do mesmo sem que ele ocupe 2 ou + slots
#
#    Para mudar a carga máxima de um inventário basta que você crie um evento e
#    ponha em
#  Chamar Script:
#
#      resize_inventory (x)

#  Sendo X a carga máxima que o baú poderá suportar.
#==============================================================================

#==============================================================================
# *** Vocab
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Sumário:
#    Constantes  - MA_LOOT_LABEL, MA_COMMAND_DISCARD, MA_COMMAND_EXCHANGE,
#                  MA_AMOUNT_PREFIX, MA_COMMAND_USE, MA_COMMAND_DESTROY,
#                  MA_WARNING_LABEL, MA_WARNING_YES, MA_WARNING_NO
#==============================================================================

module Vocab
  #==========================================================================
  # * Constants
  #==========================================================================
  #//////////////////////////////////////////////////////////////////////////
  # Nome das constantes
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  MA_AMOUNT_PREFIX = "x"          # Prefixo de quantidade do item
  MA_LOOT_LABEL = "Descartar"          # Nome da aba de descarte
  MA_COMMAND_DISCARD = "Jogar Fora"  # Comando para jogar itens fora
  MA_COMMAND_EXCHANGE = "Guardar" # Nome do botão de guardar itens
  MA_COMMAND_TAKE = "Pegar"        # Pegar itens
  MA_COMMAND_USE = "Usar"          # Usar um item
  MA_COMMAND_DESTROY = "Destruir"  # Destruir item (quase inutil tendo o Descartar)
  # Question printed when deciding whether or not to leave inventory when loot
  # still has items in it
  MA_WARNING_LABEL = "#{MA_COMMAND_DESTROY} todos os itens #{MA_LOOT_LABEL}?"
  MA_WARNING_YES = "Sim"          # Sair do inventário (confirmação)
  MA_WARNING_NO = "Não"            # Continua no inventário caso você tenha clicado em sair sem querer
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  # Fim da nomeação das constantes
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# *** Som
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Sumário:
#    Constantes  - MA_DISCARD_SE, MA_EXCHANGE_SE, MA_TAKE_SE, MA_DESTROY_SE
#==============================================================================

module Sound
  #==========================================================================
  # * Constantes
  #==========================================================================
  #//////////////////////////////////////////////////////////////////////////
  # Escolha o nome dos sons
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  MA_DISCARD_SE = "Move"  # SE que toca quando você joga um item fora
  MA_EXCHANGE_SE = "Move"  # SE que toca quando você guarda um item no baú
  MA_TAKE_SE = "Equip"    # SE que toca quando você pega um item
  MA_DESTROY_SE = "Close1" # SE que toca quando você destrói um item
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  # Fim da escolha dos sons
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# *** RPG
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Sumário:
#    Constantes  - MA_DEFAULT_STACK_AMOUNT, MA_DEFAULT_INVENTORY_SIZE,
#                  MA_EMPTYSLOTS_ICON_ID, MA_WARN_WINDOW
#    Classses Modificadas - BaseItem
#==============================================================================

module RPG
  #==========================================================================
  # * Constantes
  #==========================================================================
  #//////////////////////////////////////////////////////////////////////////
  # Escolha as opções gerais
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  MA_DEFAULT_STACK_AMOUNT = 3    # Quantidade máxima de um mesmo item para que ele seja considerado "2" no inventário
  MA_DEFAULT_INVENTORY_SIZE = 18 # Quantidade máxima de itens no inventário
  MA_EMPTYSLOTS_ICON_ID = 144    # ID do ícone nos slots vazios
  MA_WARN_WINDOW = true          # Deseja que, quando for sair do inventário, apareça a mensagem de confirmação: Deseja mesmo sair?
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  # Fim da seleção
  #//////////////////////////////////////////////////////////////////////////
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  # \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #== FIM DAS CONFIGURAÇÕES - INÍCIO DO SCRIPT                              |
  # //////////////////////////////////////////////////////////////////////////
  #//////////////////////////////////////////////////////////////////////////
  #==========================================================================
  # ** BaseItem
  #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  #  Sumário:
  #    Métodos - ma_stack_amount, ma_discardable?
  #==========================================================================
  class BaseItem
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Stack Amount
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def ma_stack_amount
      return self.note[/\\STACKMAX\[(\d+)\]/i] != nil ? $1.to_i : RPG::MA_DEFAULT_STACK_AMOUNT
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Non-Discardable
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def ma_discardable?
      return self.note[/\\NONDISCARD/i] == nil
    end
  end
end

#==============================================================================
# ** Game Temp
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new public instance variables - slots_to_discard
#==============================================================================

class Game_Temp
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader  :slots_to_discard # A Game_LimitedInventory object
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias algmod_grafikal009_init_tmp_lim_inventory_94n6 initialize
  def initialize
    # Run Original method
    algmod_grafikal009_init_tmp_lim_inventory_94n6
    # Create Inventory object
    @slots_to_discard = Game_LimitedInventory.new (-1)
  end
end

#==============================================================================
# ** Game LimInvSlot
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This class holds the data on a single slot of the inventory
#==============================================================================

class Game_LimInvSlot
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader  :item_type # The type of item held in this slot
  attr_reader  :item_id  # The ID of the item currently held
  attr_reader  :amount    # The number of items this slot holds
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize
    @item_type = -1
    @item_id = 0
    @amount = 0
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Add Item
  #    n        : the amount to add
  #    item_type : the type of item being added
  #    item_id  : the ID of item being added
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def add_item (n, item_type = -1, item_id = 0)
    # Set item if that is sent through
    if item_type != -1
      @item_type = item_type
      @item_id = item_id
    end
    x = space_left
    # Check amount
    if n > x
      # If more given than can fit
      @amount += x
      return n - x
    else
      # If the n given will fit
      @amount += n
      return 0
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Remove Item
  #    n : the amount to remove
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def remove_item (n)
    @amount -= n
    if @amount <= 0
      n = -1*@amount
      # Delete item from this slot
      @item_type = -1
      @item_id = 0
      @amount = 0
      return n
    end
    return 0
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Item
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def item
    return case @item_type
    when -1 then nil                    # No item stored
    when 0 then $data_items[@item_id]  # Item
    when 1 then $data_weapons[@item_id] # Weapon
    when 2 then $data_armors[@item_id]  # Armour
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Space Left
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def space_left
    return 1 if item == nil
    return item.ma_stack_amount - @amount
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Equal?
  #    other : another Game_LimInvSlot
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def == (other)
    return false if !other.is_a? (Game_LimInvSlot)
    return false if other.item_type != @item_type
    return false if other.item_id != @item_id
    return false if other.amount != @amount
    return super (other)
  end
end

#==============================================================================
# ** Game_LimitedInventory
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This is an array to store the party's inventory
#==============================================================================

class Game_LimitedInventory
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variable
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader  :max_size # The maximum number of slots. If -1, infinite.
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #    size : the number of slots available
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize (size)
    @max_size = size
    clear
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Clear
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def clear
    @items = []
    @weapons = []
    @armors = []
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Resize
  #    size : the number of slots available
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def resize (size)
    old_size = slots.size
    # If new size is smaller
    if size < old_size
      # Save discarded items
      index = slots.size - 1
      while slots.size > @max_size
        slot = slots[index]
        if slot.item.ma_discardable?
          type, id, n = slot.item_type, slot.item_id, slot.amount
          # Discard additional slots
          remove_item (type, id, n)
          $game_temp.slots_to_discard.add_item (type, id, n)
        else
          index -= 1
        end
        break if index < 0
      end
    end
    @max_size = size
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Add Item
  #    type : the type of item being added
  #    id  : the ID of item being added
  #    n    : the amount to add
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def add_item (type, id, n = 1)
    array = case type
    when 0 then @items
    when 1 then @weapons
    when 2 then @armors
    end
    sort_index = 0
    # Go through all slots
    array.each { |slot|
      # If you can place the item in this slot
      if slot.item_id == id
        n = slot.add_item (n, type, id)
        break if n == 0
        sort_index += 1
      elsif slot.item_id < id
        sort_index += 1
      else
        break
      end
    }
    if n > 0
      # If there are empty slots
      while @max_size == -1 || ((@items.size + @weapons.size + @armors.size) < @max_size)
        slot = Game_LimInvSlot.new
        n = slot.add_item (n, type, id)
        array.insert (sort_index, slot)
        sort_index += 1
        break if n == 0
      end
    end
    return n
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Remove Item
  #    type : the type of item being removed
  #    id  : the ID of item being removed
  #    n    : the amount to remove
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def remove_item (type, id, n = 1)
    array = case type
    when 0 then @items
    when 1 then @weapons
    when 2 then @armors
    end
    # Go through all slots in reverse order
    array.reverse.each { |slot|
      # If this slot has the right item in it, remove from this slot
      if slot.item_type == type && slot.item_id == id
        n = slot.remove_item (n)
        array.delete (slot) if slot.amount == 0
        break if n == 0
      end
    }
    return n
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get Item Slots
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def slots
    return @items + @weapons + @armors
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Check Space
  #    item : an RPG::Item, RPG::Weapon, or RPG::Armor object
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def enough_space? (slot)
    return true if @max_size == -1 || slots.size < @max_size
    # Check array for other instances of the item
    array = [@items, @weapons, @armors][slot.item_type]
    array.each { |i|
      if i.item_id > slot.item_id
        break
      elsif i.item_id == slot.item_id
        return true if i.space_left < slot.item.ma_stack_amount
      end
    }
    return false
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Equals?
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def == (other)
    return false unless other.is_a? (Game_LimitedInventory)
    return false if @max_size != other.max_size
    return false if slots != other.slots
    return super (other)
  end
end

#==============================================================================
# ** Game Actor
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - change_equip
#==============================================================================

class Game_Actor
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Change Equip
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mdrnalgbra_gkl009_invlimits_cng_eqp_82h4 change_equip
  def change_equip (*args)
    # Run Original Method
    mdrnalgbra_gkl009_invlimits_cng_eqp_82h4 (*args)
    # Since you gain items before you lose them, check if item is Loot when it
    # could be in Party inventory
    if !$game_temp.slots_to_discard.slots.empty?
      # Take as many from loot as possible
      $game_temp.slots_to_discard.slots.reverse.each { |slot|
        break unless $game_party.limit_inventory.enough_space? (slot)
        item, type, id, n = slot.item, slot.item_type, slot.item_id, slot.amount
        $game_party.gain_item (item, n)
        $game_temp.slots_to_discard.remove_item (type, id, n)
      }
    end
  end
end

#==============================================================================
# ** Game Party
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new instance variable - limit_inventory
#    aliased methods - initialize, gain_item
#==============================================================================

class Game_Party
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader  :limit_inventory # A Game_LimitedInventory object
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modlg_lm_inv_grafkal_init_4n56 initialize
  def initialize
    # Run Original method
    modlg_lm_inv_grafkal_init_4n56
    # Create Inventory object
    @limit_inventory = Game_LimitedInventory.new (RPG::MA_DEFAULT_INVENTORY_SIZE)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Gain Items (or lose)
  #    item          : Item
  #    n            : Number
  #    include_equip : Include equipped items
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias drnlgbr_grafikal_limited_inventory_gn_itm_94n6 gain_item
  def gain_item(item, n, include_equip = false)
    # Run Original method
    drnlgbr_grafikal_limited_inventory_gn_itm_94n6 (item, n, include_equip)
    if item != nil
      type = item.is_a? (RPG::Item) ? 0 : item.is_a? (RPG::Weapon) ? 1 : 2
      # Gain or lose item depending on everything.
      if n > 0
        n2 = @limit_inventory.add_item (type, item.id, n)
        n -= n2
        # If it is a nondiscardable item and you cannot hold all of them
        if !item.ma_discardable?
          while n2 > 0
            # Find first nondiscardable item in the inventory
            for i in 0...@limit_inventory.slots.size
              slot = @limit_inventory.slots[i]
              if slot.item.ma_discardable?
                l_type, id = slot.item_type, slot.item_id
                # Find smallest slot of that item
                while l_type == slot.item_type && id == slot.item_id
                  i += 1
                  slot = @limit_inventory.slots[i]
                end
                l_item, l_n = @limit_inventory.slots[i - 1].item, @limit_inventory.slots[i - 1].amount
                break
              end
            end
            # Remove that item from inventory
            lose_item (l_item, l_n)
            $game_temp.slots_to_discard.add_item (l_type, id, l_n)
            n3 = @limit_inventory.add_item (type, item.id, n2)
            n -= n3
            n2 = n3
          end
        end
      else
        n2 = @limit_inventory.remove_item (type, item.id, -1*n)
        n += n2
        n2 *= -1
      end
    end
    return if item == nil
    # Send rest to loot
    if n2 > 0
      $game_temp.slots_to_discard.add_item (type, item.id, n2)
    elsif n2 < 0
      $game_temp.slots_to_discard.remove_item (type, item.id, -1*n2)
    end
  end
end

#==============================================================================
# ** Game Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - command_end
#    new method - resize_inventory
#==============================================================================

class Game_Interpreter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Resize Inventory
  #    new_size : the size you now want the inventory to be
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def resize_inventory (new_size)
    $game_party.limit_inventory.resize (new_size)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Command End
  #``````````````````````````````````````````````````````````````````````````
  #  If there are items in $game_temp.loot, open up the inventory
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_grid_inventory_open_inventory_end_command command_end
  def command_end
    # Run Original Method
    modalg_grid_inventory_open_inventory_end_command
    unless $game_temp.slots_to_discard.slots.empty?
      $scene = Scene_Item.new
    end
  end
end

#==============================================================================
# ** Window Item
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    overwritten methods - draw_item, item_rect
#    aliased method - item, refresh, dispose, top_row=
#==============================================================================

class Window_Item
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Refresh
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mdrnalg_gral9_ivntlim_rfrsh_2n45 refresh
  def refresh (inventory = $game_party.limit_inventory, columns = @column_max)
    if self.is_a? (Window_EquipItem)
      mdrnalg_gral9_ivntlim_rfrsh_2n45
      return
    end
    @is_loot = inventory == $game_temp.slots_to_discard
    @spacing = 32
    @data = []
    @empty_sprites.each { |sprite| sprite.dispose } unless @empty_sprites == nil
    @empty_sprites = []
    @column_max = columns
    for slot in inventory.slots
      next unless include?(slot.item)
      @data.push(slot)
      if slot.item.is_a?(RPG::Item) and slot.item_id == $game_party.last_item_id
        self.index = @data.size - 1
      end
    end
    @item_max = inventory.max_size == -1 ? @data.size : inventory.max_size
    create_contents
    # Calculate number of empty slots to draw
    empty_slots = (inventory.max_size == -1 || !$scene.is_a? (Scene_Item)) ? 0 : inventory.max_size - inventory.slots.size
    @wlh = (self.contents.height * @column_max) / ([@data.size + empty_slots, 1].max)
    @wlh = @wlh > 32 ? 32 : @wlh < WLH ? WLH : @wlh
    for i in 0...@data.size
      draw_item(i)
    end
    sprite_viewport = Viewport.new (self.x + 16, self.y + 16, self.width - 32, self.height - 32)
    viewport_adjusted = false
    for i in @data.size...empty_slots + @data.size
      rect = item_rect (i)
      if rect.y + rect.height > page_row_max*@wlh && !viewport_adjusted
        sprite_viewport.rect.height = rect.y
        viewport_adjusted = true
      end
      sprite = Sprite_Base.new (sprite_viewport)
      sprite.x, sprite.y = rect.x, rect.y
      sprite.visible = self.visible
      sprite.blend_type = 2
      empty_bmp = Bitmap.new (rect.width, rect.height) if empty_bmp == nil
      sprite.bitmap = empty_bmp.dup
      sprite.bitmap.fill_rect (0, 1, rect.width, rect.height - 2, Color.new (127, 127, 127, 105))
      @empty_sprites.push (sprite)
    end
    empty_bmp.dispose unless empty_bmp == nil
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Item Rect
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def item_rect (index)
    wlh = @wlh == nil ? WLH : @wlh
    rect = Rect.new(0, 0, 0, 0)
    rect.width = (contents.width + @spacing) / @column_max - @spacing
    rect.height = wlh
    rect.x = index % @column_max * (rect.width + @spacing)
    rect.y = index / @column_max * wlh
    return rect
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Set Top Row
  #    row : row shown on top
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def top_row=(row)
    old_oy = self.oy
    super (row)
    @empty_sprites.each { |sprite| sprite.y -= (self.oy - old_oy) }
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Item
  #    index : item number
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mdrnalgbr_rfl009_limitedinvntry_drwitm_2hd4 draw_item
  def draw_item(index)
    if self.is_a? (Window_EquipItem)
      mdrnalgbr_rfl009_limitedinvntry_drwitm_2hd4 (index)
      return
    end
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index].item
    if item != nil
      n = @data[index].amount
      enabled = @is_loot ? true : enable?(item)
      rect.width -= 4
      y = rect.y + ((rect.height - WLH) / 2)
      draw_item_name(item, rect.x, y, enabled)
      self.contents.draw_text(rect, sprintf("#{Vocab::MA_AMOUNT_PREFIX}%2d", n), 2) unless n < 2
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get Item
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias ma_grfkl_lim_nvtry_item_8rn item
  def item
    return ma_grfkl_lim_nvtry_item_8rn if self.is_a? (Window_EquipItem)
    return ma_grfkl_lim_nvtry_item_8rn == nil ? nil : ma_grfkl_lim_nvtry_item_8rn.item
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Sprite Disposal
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def dispose
    super
    @empty_sprites.each { |sprite| sprite.dispose } unless self.is_a? (Window_EquipItem)
  end
end

#==============================================================================
# ** Window_EmptyCount
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This window displays the number of free slots in the inventory.
#==============================================================================

class Window_EmptyCount < Window_Base
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #    inventory : a Game_LimitedInventory object
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize (inventory = $game_party.limit_inventory)
    super(Graphics.width - 128, 0, 128, WLH + 32)
    self.opacity = 0
    refresh (inventory)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Refresh
  #    inv : a Game_LimitedInventory object
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def refresh (inv)
    self.contents.clear
    # Draw Icon
    empty_slots = inv.max_size == -1 ? "8" : (inv.max_size - inv.slots.size).to_s
    tw = self.contents.text_size (empty_slots).width
    self.contents.draw_text (0, 0, 96, WLH, empty_slots, 2)
    draw_icon (RPG::MA_EMPTYSLOTS_ICON_ID, 68 - tw, 0)
  end
end

#==============================================================================
# ** Window_InvCommand
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This is a Window_Command, specialized to allow for frequent resetting of the
# commands
#==============================================================================

class Window_InvCommand < Window_Command
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Reset Commands
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def reset_commands (commands)
    @commands = commands
    @item_max = commands.size
    row_max = (commands.size + @column_max - 1) / @column_max
    self.height = (row_max*WLH) + 32
    self.create_contents
    refresh
  end
end

#==============================================================================
# ** Window Warning
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This window checks before destroying slot items
#==============================================================================

class Window_Warning < Window_Selectable
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def initialize
    x = (Graphics.width - 256) / 2
    y = (Graphics.height - (32 + 2*WLH)) / 2
    super (x, y, 256, 32 + 2*WLH)
    @item_max = 2
    @column_max = 2
    @index = 1
    create_contents
    # Draw Warning Label
    self.contents.draw_text (0, 0, contents.width, WLH, Vocab::MA_WARNING_LABEL, 1)
    # Draw Yes and No Options
    index = 0
    [Vocab::MA_WARNING_YES, Vocab::MA_WARNING_NO].each { |command|
      rect = item_rect (index)
      self.contents.draw_text (rect, command, 1)
      index += 1
    }
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get rectangle for displaying items
  #    index : item number
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def item_rect(index)
    rect = Rect.new(0, 0, 0, 0)
    rect.width = (self.contents.width / 4) - 10
    rect.height = WLH
    rect.x = rect.width + (index*(20 + rect.width))
    rect.y = WLH
    return rect
  end
end

#==============================================================================
# ** Scene Equip
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - return_scene
#==============================================================================

class Scene_Equip
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Return Scene
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias rnalbr_grafikal009_invlimits_rtrn_scn_eqp_4wk4 return_scene
  def return_scene
    if $game_temp.slots_to_discard.slots.empty?
      rnalbr_grafikal009_invlimits_rtrn_scn_eqp_4wk4
    else
      $scene = Scene_Item.new
    end
  end
end

#==============================================================================
# ** Scene Battle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - battle_end
#==============================================================================

class Scene_Battle
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * End Battle
  #    result : Results (0: win, 1: escape, 2:lose)
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mrnagbr_gkal009_vntrylim_bttlend_5dm4 battle_end
  def battle_end(result)
    # Run original Method
    mrnagbr_gkal009_vntrylim_bttlend_5dm4 (result)
    if !$game_temp.slots_to_discard.slots.empty? && !$scene.is_a? (Scene_Gameover)
      $scene = Scene_Item.new
    end
  end
end

#==============================================================================
# ** Scene Item
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased methods - start, terminate
#==============================================================================

class Scene_Item
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Start processing
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def start
    super
    create_menu_background
    @activated_frame = false
    @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
    @help_window = Window_Help.new
    @help_window.width = Graphics.width
    @help_window.viewport = @viewport
    wlh = Window_Base::WLH
    @item_window = Window_Item.new(0, 32 + wlh, Graphics.width, Graphics.height - 32 - wlh)
    @item_window.help_window = @help_window
    @item_window.active = false
    @item_window.viewport = @viewport
    @active_window = @item_window
    @target_window = Window_MenuStatus.new(0, 0)
    @target_window.x = Graphics.width - @target_window.width
    @target_window.height = Graphics.height
    @target_window.z = 150
    hide_target_window
    # Create Empty Counter
    @emptycount_window = Window_EmptyCount.new
    @emptycount_window.viewport = @viewport
    # Create Loot Window
    wdth = Graphics.width / 2
    hght = Graphics.height - 64 - 2*wlh
    @loot_window = Window_Item.new (wdth, 64 + (2*wlh), wdth, hght)
    @loot_window.index = -1
    @loot_window.viewport = @viewport
    # Create Loot Label Window
    @lootlabel_window = Window_Base.new (wdth, 32 + wlh, wdth, 32 + wlh)
    @lootlabel_window.visible = false
    @lootlabel_window.contents.font.color = @lootlabel_window.system_color
    @lootlabel_window.contents.draw_text (0, 0, 240, wlh, Vocab::MA_LOOT_LABEL, 1)
    @lootlabel_window.viewport = @viewport
    commands = [Vocab::MA_COMMAND_USE, Vocab::MA_COMMAND_DISCARD]
    @command_window = Window_InvCommand.new (160, commands)
    @command_window.visible = false
    @command_window.active = 0
    @loot_window.active = false
    # If no loot, hide the window
    if $game_temp.slots_to_discard.slots.empty?
      @loot_window.visible = false
      @loot_window.refresh ($game_temp.slots_to_discard, 1)
      @overloaded_initially = false
    else
      show_loot
      @overloaded_initially = true
    end
    @last_index = $game_party.last_item_id
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Return Scene
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malg_grfk_inventoy_lmt_rtrnscn_1h45 return_scene
  def return_scene
    # If Still items left in Loot
    if RPG::MA_WARN_WINDOW && !$game_temp.slots_to_discard.slots.empty?
      # Give warning
      @warning_window = Window_Warning.new
      return
    end
    if @overloaded_initially
      $scene = Scene_Map.new
    else
      # Run Original Method
      malg_grfk_inventoy_lmt_rtrnscn_1h45
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Show Target Window
  #    right : Right justification flag (if false, left justification)
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def show_target_window(right)
    right = @loot_window.visible ? @active_window == @item_window : right
    @item_window.active = false
    width_remain = Graphics.width - @target_window.width
    @target_window.x = right ? width_remain : 0
    @target_window.visible = true
    @target_window.active = true
    if right
      @viewport.rect.set(0, 0, width_remain, @target_window.height)
      @viewport.ox = 0
    else
      @viewport.rect.set(@target_window.width, 0, width_remain, @target_window.height)
      @viewport.ox = @target_window.width
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Hide Target Window
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def hide_target_window
    @item_window.active = true
    @target_window.visible = false
    @target_window.active = false
    @viewport.rect.set(0, 0, Graphics.width, Graphics.height)
    @viewport.ox = 0
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Termination processing
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mdlg_graf009_invlimit_trmnte_itemscene_5bd3 terminate
  def terminate (*args)
    # Run Original Method
    mdlg_graf009_invlimit_trmnte_itemscene_5bd3 (*args)
    # Dispose of new windows
    @emptycount_window.dispose
    @loot_window.dispose
    @lootlabel_window.dispose
    @command_window.dispose
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update Frame
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malg_gfl009_limitedinventory_upt_2h45 update
  def update
    # If Warning Window Active
    if @warning_window != nil
      update_warning_window
      return
    end
    malg_gfl009_limitedinventory_upt_2h45
    @loot_window.update
    @command_window.update
    if @activated_frame
      @activated_frame = false
      return
    end
    if @loot_window.active
      update_item_selection
    elsif @command_window.active
      update_command_selection
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update Item Selection
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias moal_rfkl9_invntr_limit_upditmselect_1hr4 update_item_selection
  def update_item_selection
    @command_window.visible = false if @command_window.visible
    # Switch between windows by pressing Left or Right
    if @loot_window.visible && (Input.trigger? (Input::LEFT) || Input.trigger? (Input::RIGHT))
      Sound.play_cursor
      @active_window.index = -1
      loot_window_active = @loot_window.active
      @active_window.active = false
      @active_window = loot_window_active ? @item_window : @loot_window
      @active_window.active = true
      @active_window.index = 0
      @activated_frame = true
    end
    # IF ESC pressed
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      # If exchanging
      if @loot_window.index > -1 && @item_window.active
        slot = @active_window.ma_grfkl_lim_nvtry_item_8rn
        slot2 = @loot_window.ma_grfkl_lim_nvtry_item_8rn
        type, id, n = slot2.item_type, slot2.item_id, slot2.amount
        if slot != nil
          if !slot.item.ma_discardable? # Undiscardable Item
            Sound.play_buzzer
            return
          else
            type2, id2, n2 = slot.item_type, slot.item_id, slot.amount
            $game_temp.slots_to_discard.add_item (type2, id2, n2)
            $game_party.limit_inventory.remove_item (type2, id2, n2)
          end
        end
        $game_party.limit_inventory.add_item (type, id, n)
        $game_temp.slots_to_discard.remove_item (type, id, n)
        RPG::SE.new (Sound::MA_EXCHANGE_SE).play
        check_to_hide_loot
        @loot_window.active = false
        @loot_window.index = -1
      else # If selecting
        item = @active_window.item
        if item != nil && (@loot_window.active || item.ma_discardable? || $game_party.item_can_use? (item))
          Sound.play_decision
          @active_window = @loot_window.active ? @loot_window : @item_window
          start_command_window
        else
          Sound.play_buzzer
        end
      end
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update Command
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def update_command_selection
    removed_from_loot = false
    if Input.trigger?(Input::B)
      Sound.play_cancel
      # Deactivate Command Window
      @command_window.active = false
      @command_window.index = -1
      @command_window.visible = false
      # Reactivat previous Window
      @active_window.active = true
    elsif Input.trigger?(Input::C)
      if @active_window == @item_window
        case @command_window.index
        when 0 # Use
          moal_rfkl9_invntr_limit_upditmselect_1hr4
          @command_window.active = false if $game_party.item_can_use?(@item) && @item.scope != 0
        when 1 # Discard
          # Get slot
          slot = @item_window.ma_grfkl_lim_nvtry_item_8rn
          unless slot.item.ma_discardable?
            Sound.play_buzzer
            return
          end
          type, id, n = slot.item_type, slot.item_id, slot.amount
          # Discard additional slots
          $game_party.limit_inventory.remove_item (type, id, n)
          $game_temp.slots_to_discard.add_item (type, id, n)
          # Deactivate Command Window
          @command_window.active = false
          @command_window.index = -1
          @command_window.visible = false
          # Reactivate previous Window
          if @loot_window.visible
            @item_window.refresh ($game_party.limit_inventory, 1)
            @loot_window.refresh ($game_temp.slots_to_discard, 1)
          else
            show_loot
          end
          @item_window.active = true
          RPG::SE.new (Sound::MA_DISCARD_SE).play
        end
        @emptycount_window.refresh ($game_party.limit_inventory)
      else # Called from Loot Window
        slot = @loot_window.ma_grfkl_lim_nvtry_item_8rn
        # Get slot stats
        type, id, n = slot.item_type, slot.item_id, slot.amount
        case @command_window.index
        when 0 # Take
          # If inventory has empty spaces
          if $game_party.limit_inventory.enough_space? (@loot_window.ma_grfkl_lim_nvtry_item_8rn)
            # Remove from loot and add to Inventory
            n2 = $game_party.limit_inventory.add_item (type, id, n)
            $game_temp.slots_to_discard.remove_item (type, id, n - n2)
            RPG::SE.new (Sound::MA_TAKE_SE).play
            removed_from_loot = true
          else
            Sound.play_buzzer
          end
        when 1 # Exchange
          # Deactivate Command Window
          @command_window.visible = false
          @command_window.active = false
          # Activate Item Window
          @item_window.active = true
          @item_window.index = 0
          @active_window = @item_window
          Sound.play_decision
        when 2 # Destroy
          $game_party.drnlgbr_grafikal_limited_inventory_gn_itm_94n6 (slot.item, -1*n)
          $game_temp.slots_to_discard.remove_item (type, id, n)
          RPG::SE.new (Sound::MA_DESTROY_SE).play
          removed_from_loot = true
        end
        if removed_from_loot
          @command_window.active = false
          @command_window.visible = false
          check_to_hide_loot
        end
      end
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Update Warning
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def update_warning_window
    @warning_window.update
    if Input.trigger? (Input::B)
      # Play Cancel SE
      Sound.play_cancel
      # Dispose Warning
      @warning_window.dispose
      @warning_window = nil
    elsif Input.trigger? (Input::C)
      # Play Decision SE
      Sound.play_decision
      # When Yes
      if @warning_window.index == 0
        # End Scene
        clear_loot_slots
        return_scene
      end
      @warning_window.dispose
      @warning_window = nil
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Use Item (apply effects to non-ally targets)
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_grkl_liminv_ustmnntrgt_2hb4 use_item_nontarget
  def use_item_nontarget
    # Get last instance of this item in the inventory.
    id = @item_window.index
    while id == @item_window.index
      @item_window.index += 1
      id += 1 if @item == @item_window.item
    end
    @item_window.index -= 1
    modalg_grkl_liminv_ustmnntrgt_2hb4
    $game_party.last_item_id = @item_window.index
    # Refresh Item Window if that slot is now empty
    if @item_window.item == nil
      @item_window.refresh
      @emptycount_window.refresh ($game_party.limit_inventory)
      hide_target_window
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Show Loot
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def show_loot
    @loot_window.refresh ($game_temp.slots_to_discard, 1)
    @loot_window.update
    @loot_window.visible = true
    @lootlabel_window.visible = true
    @item_window.width = Graphics.width / 2
    @item_window.refresh ($game_party.limit_inventory, 1)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Check to Hide Loot
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def check_to_hide_loot
    @loot_window.refresh ($game_temp.slots_to_discard, 1)
    @emptycount_window.refresh ($game_party.limit_inventory)
    # If there are no more items in loot
    if $game_temp.slots_to_discard.slots.size == 0
      # Hide Loot Window
      @loot_window.visible = false
      @loot_window.active = false
      @loot_window.index = -1
      @lootlabel_window.visible = false
      @item_window.width = Graphics.width
      @item_window.index = 0
      @item_window.refresh ($game_party.limit_inventory, 2)
      @item_window.active = true
      @active_window = @item_window
    else
      @item_window.refresh ($game_party.limit_inventory, 1)
      @loot_window.active = true
    end
  end
Revenir en haut Aller en bas
 

[VX] Inventaire limité

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» [RESOLU][VXAce]Script d'inventaire limité.
» Modification de la limite du nombre d'item identique dans l'inventaire
» Limite d'argent
» Usage d'Objet Limité
» Script limite de Stats

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Maker VX :: Entraide :: Scripts :: Scripts VX - RGSS2 :: Objets et compétences-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Cookies | Forumactif.com