#==============================================================================
# ■ 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