此是为毛毛叔制作的物品容量的功能,结构简单,但涉及修改范围较广,提问区多次,具备一定代表性,固有此修改流程的教程。
一、创建物品容量的变量,修改范围Game_System类: 因为毛毛叔的要求容量随人物级别变化并在随时强行修改,固该容量应由“基数+变数”两部分组成,“变数”即人物级别,依照要求为队伍一号角色级别。 先在Game_System类设定基数: 建立实例变量并赋予读写属性 attr_accessor :warehouse # 仓库基数 在initialize部分初始化,角色默认初始级别为1,仓库容量初始为10,所以基数为9: @warehouse = 9 # 仓库基数
定义返回仓库容量的方法 def warehouse_number # 容量 = 基数 + 角色级别 return @warehouse + $game_party.actors[0].level end 定义强行直接仓库容量的方法,因角色级别为不可随意更改的变量,所以可通过修改基数入手。 def set_warehouse(n) # 基数 = 设定数 – 角色级别(即强制修改为:基数 + 角色级别= 设定数) @warehouse = n - $game_party.actors[0].level end 二、对获得物品设限,修改范围Game_Party类: 根据容量对获得的物品总数进行限制,具体在Game_Party类内操作。 首先定义返回物品总数的方法: def warehouse_all_numbers s = 0 @items.each{|i,j| s += j} #累加道具总数 @weapons.each{|i,j| s += j} #累加武器总数 @armors.each{|i,j| s += j} #累加防具总数 return s end 定义判断物品是否饱和的方法: def warehouse_full?(sum) # 返回(物品总数 + 新加入物品数 > 仓库容量) return (warehouse_all_numbers + sum) > $game_system.warehouse_number end 定义仓库饱和后,友情提示的显示窗: def warehouse_wds(name,sum) # name为物品名,sum为丢弃数量 name == nil ? text = "仓库已饱和" : text = "仓库饱和,丢弃多余的#{sum}个#{name}" # 根据文字内容设定新窗体大小。 w = text.size * 7 x = 320 - w/2 wds = Window_Base.new(x,120,w + 32,64) wds.contents = Bitmap.new(wds.width - 32, wds.height - 32) wds.contents.draw_text(0,0,w,32,text,1) wds.opacity = 200 # 音效 $game_system.se_play($data_system.decision_se) # 窗店画面位置修正 if $scene.is_a?(Scene_Shop) wds.x -= 150 wds.y += 100 end # 装备画面位置修正 if $scene.is_a?(Scene_Equip) wds.y -= 100 end # 窗体消失效果。 40.times{|i| wds.opacity -= 20 if i > 30 wds.contents_opacity -= 20 if i > 30 Graphics.update} # 释放掉窗体,切莫使用实例变量。 wds.dispose end 根部修改,为获得方法设限: def gain_item(item_id, n) # 更新 hash 的个数数据 if item_id > 0 # 若仓库已饱和 if warehouse_full?(n) # 分别计算获得与舍弃的物品数量 a = n n = $game_system.warehouse_number - warehouse_all_numbers s = a – n # 友情提示显示窗 warehouse_wds($data_items[item_id].name,s) end @items[item_id] = [[item_number(item_id) + n, 0].max, 99].min end end #-------------------------------------------------------------------------- # ● 增加武器 (减少) # weapon_id : 武器 ID # n : 个数 #-------------------------------------------------------------------------- def gain_weapon(weapon_id, n) # 更新 hash 的个数数据 if weapon_id > 0 # 若仓库已饱和 if warehouse_full?(n) # 分别计算获得与舍弃的物品数量 a = n n = $game_system.warehouse_number - warehouse_all_numbers s = a – n # 友情提示显示窗 warehouse_wds($data_weapons[weapon_id].name,s) end @weapons[weapon_id] = [[weapon_number(weapon_id) + n, 0].max, 99].min end end #-------------------------------------------------------------------------- # ● 增加防具 (减少) # armor_id : 防具 ID # n : 个数 #-------------------------------------------------------------------------- def gain_armor(armor_id, n) # 更新 hash 的个数数据 if armor_id > 0 # 若仓库已饱和 if warehouse_full?(n) # 分别计算获得与舍弃的物品数量 a = n n = $game_system.warehouse_number - warehouse_all_numbers s = a – n # 友情提示显示窗 warehouse_wds($data_armors[armor_id].name,s) end @armors[armor_id] = [[armor_number(armor_id) + n, 0].max, 99].min end end
三:修改战斗结算画面饱和提示显示窗的出现时机,修改范围Scene_Battle 2类 建立变量接收获得的宝物(约166行treasures = treasures[0..5]的下面) @temp = treasures 将约181-190行获得宝物的方法剪切掉。 for item in treasures case item when RPG::Item $game_party.gain_item(item.id, 1) when RPG::Weapon $game_party.gain_weapon(item.id, 1) when RPG::Armor $game_party.gain_armor(item.id, 1) end end 将其放在约218行战斗结束“battle_end(0)”的前面,这样做是为将饱和提示窗延迟到宝物获得提示的后面出现。 # 隐藏宝物提示窗口 @result_window.visible = false # 获得宝物,treasures换成了可直接跨方法使用的实例变量@temp。 for item in @temp case item when RPG::Item $game_party.gain_item(item.id, 1) when RPG::Weapon $game_party.gain_weapon(item.id, 1) when RPG::Armor $game_party.gain_armor(item.id, 1) end end
四、对装备窗口做特殊处理,修改范围Scene_Equip类:
约106与112 的两处, @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id) 可看到为获取装备变化数值,这里有伤风化又脱又穿,因仅是临时变化,实际装备总量并没有改变,但若总量恰好等于仓库最大容量,脱下时会因超容而舍弃,造成物品丢失,有两种修改方式,一是先将equip方法改成先穿后脱,第二种则是我使用暂时扩容的方式: # 暂时扩大仓库1个容量 $game_system.warehouse += 1 @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id) # 获取变更装备后的能力值 new_atk = @actor.atk new_pdef = @actor.pdef new_mdef = @actor.mdef # 返回到装备 @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id) # 恢复仓库容量 $game_system.warehouse -= 1
对更换装备做特殊情况处理(约211行): # 获取角色欲更换身体部位的物品ID。 temp_id = @actor.weapon_id if @right_window.index == 0 temp_id = @actor.armor1_id if @right_window.index == 1 temp_id = @actor.armor2_id if @right_window.index == 2 temp_id = @actor.armor3_id if @right_window.index == 3 temp_id = @actor.armor4_id if @right_window.index == 4 # 若物品栏为空,身体部分不为空(即脱下)时,仓库饱和 if item == nil and temp_id > 0 and $game_party.warehouse_full?(1) == true # 则仅做饱和提示,不更换装备 $game_party.warehouse_wds(nil,0) else # 否则临时扩容进行装备更换 $game_system.warehouse += 1 # 变更装备 @actor.equip(@right_window.index, item == nil ? 0 : item.id) $game_system.warehouse -= 1 end 五:为物品窗口添加丢弃功能,修改范围Scene_Item类: 约74行新添加: # 当按下“L”(默认为Q)键时 if Input.trigger?(Input::L) # 音效 $game_system.se_play($data_system.decision_se) # 获得当前物品数据 @item = @item_window.item # 根据物品所属种类,选择不同的舍弃方法。 case @item when RPG::Item $game_party.lose_item(@item.id, 1) when RPG::Weapon $game_party.lose_weapon(@item.id, 1) when RPG::Armor $game_party.lose_armor(@item.id, 1) end # 重新描绘当前物品的数量 @item_window.draw_item(@item_window.index) # 若当前不能使,即为0时,重新描绘整个物品窗口, # 之所以不直接使用@item_window.refresh,是为降低资源消耗 unless $game_party.item_can_use?(@item.id) @item_window.refresh end return end 六:为主菜单添加仓库容量信息,修改范围Window_Steps: 寸土寸金,就从相对次要的步数窗口剥削些领土吧: 约22-24行, self.contents.draw_text(4, -5, 120, 32, "步数") self.contents.draw_text(4, 32, 120, 32, "仓库") self.contents.font.color = normal_color self.contents.draw_text(4, -5, 120, 32, $game_party.steps.to_s, 2) self.contents.draw_text(4, 32, 120, 32,$game_system.warehouse_number.to_s, 2) 之所以写出修改流程,是方便她人整合脚本,毕竟该功能虽冲突风险较大,但实现起来却非常简单。 OK,完工了。
范例下载,注意查毒 ftp://[email protected]/个人文件夹/美兽(555)/物品总量设限/物品总量设限.rar |