#==============================================================================
# ■ RGSS2 - 物品上限修改 by Calendar99
#------------------------------------------------------------------------------
#  使用方法: 物品/武器/护甲备注中写<持有上限 n>,则持有上限为n
#  例 <持有上限 10> <持有上限 = 10>
#
#  兼容性说明:脚本中覆盖定义较多,请尽量置于其他脚本上方
#==============================================================================

module CLD99
  module Item
    
    ALLOW_GAIN_BY_EVENT = true
    # 是否允许通过事件强制获得超过上限的道具
    # true 允许 false 禁止
    
    DEFAULT_MAX_LIMIT = 999
    # 默认持有上限
    
    REG_MAX_LIMIT = /<持有上限[ :=]*(\d+)>/
    # 自定义持有上限的正则表达式(没有脚本基础的不要动这个)
    
    #--------------------------------------------------------------------------
    # ● 获取持有上限
    #--------------------------------------------------------------------------
    def self.max_limit(note)
      if note =~ CLD99::Item::REG_MAX_LIMIT then $1.to_i 
      else CLD99::Item::DEFAULT_MAX_LIMIT end
    end
    
  end  
end

class RPG::Item
  def max_limit;CLD99::Item.max_limit(self.note);end  
end

class RPG::Weapon
  def max_limit;CLD99::Item.max_limit(self.note);end  
end

class RPG::Armor
  def max_limit;CLD99::Item.max_limit(self.note);end  
end
  
class Scene_Shop
  #--------------------------------------------------------------------------
  # ● [覆盖]更新买入选择
  #--------------------------------------------------------------------------
  def update_buy_selection
    @status_window.item = @buy_window.item
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      @help_window.set_text("")
      return
    end
    if Input.trigger?(Input::C)
      @item = @buy_window.item
      number = $game_party.item_number(@item)
      if @item == nil or @item.price > $game_party.gold or number >= @item.max_limit ##购买条件修正
        Sound.play_buzzer
      else
        Sound.play_decision
        max = @item.price == 0 ? @item.max_limit : $game_party.gold / @item.price ## 可购入数量修正
        max = [max, @item.max_limit - number].min ## 可购入数量修正
        @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
  end
end
  
class Scene_Battle
  #--------------------------------------------------------------------------
  # ● [覆盖]显示所获得的掉落物品
  #--------------------------------------------------------------------------
  def display_drop_items
    drop_items = $game_troop.make_drop_items
    for item in drop_items
      next if $game_party.item_number(item) >= item.max_limit ## 战斗掉落修正
      $game_party.gain_item(item, 1)
      text = sprintf(Vocab::ObtainItem, item.name)
      $game_message.texts.push(text)
    end
    wait_for_message
  end
end

class Window_ShopBuy
  #--------------------------------------------------------------------------
  # ● [覆盖]绘制商品
  #     index : 商品索引
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    number = $game_party.item_number(item)
    enabled = (item.price <= $game_party.gold and number < item.max_limit) ## 绘制修正
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    draw_item_name(item, rect.x, rect.y, enabled)
    rect.width -= 4
    self.contents.draw_text(rect, item.price, 2)
  end
end

class Game_Party
  #--------------------------------------------------------------------------
  # ● [覆盖]获得/损失物品
  #--------------------------------------------------------------------------
  def gain_item(item, n, include_equip = false)
    number = item_number(item)
    case item
    when RPG::Item
      @items[item.id] = [[number + n, 0].max, item.max_limit].min ## 持有上限修正
    when RPG::Weapon
      @weapons[item.id] = [[number + n, 0].max, item.max_limit].min ## 持有上限修正
    when RPG::Armor
      @armors[item.id] = [[number + n, 0].max, item.max_limit].min ## 持有上限修正
    end
    n += number
    if include_equip and n < 0
      for actor in members
        while n < 0 and actor.equips.include?(item)
          actor.discard_equip(item)
          n += 1
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● [别名修改]战斗测试队伍设置
  #--------------------------------------------------------------------------
  alias setup_battle_test_members_for_max_limit setup_battle_test_members
  def setup_battle_test_members
    setup_battle_test_members_for_max_limit
    for i in 1...$data_items.size
      if $data_items[i].battle_ok?
        @items[i] = $data_items[i].max_limit unless $data_items[i].name.empty? ## 持有数修正
      end
    end
  end
  
  unless CLD99::Item::ALLOW_GAIN_BY_EVENT # 不是必定运行
    #--------------------------------------------------------------------------
    # ● [别名修改]获得/损失物品
    #--------------------------------------------------------------------------
    alias :gain_item_for_limit :gain_item
    def gain_item(item, n, include_equip = false)
      return if n > 0 && item_number(item) >= item.max_limit ## 获取修正
      gain_item_for_limit(item, n, include_equip)
    end
  end
end