438.54 KB, 下载次数: 48
=begin 下面的系统是enchant系统。依稀记得英雄坛说的系统也有类似的功效(打造武器的系统) 不过为什么别人做过我就不能再写一个呢。 copywrong DevilG.版权没有翻版。。。翻吧。 使用方法: 1.设定等级 在物品库里的备注放入 atk1=1000 def1=0 agi1=0 spi1=0 hprec1=0 mprec1=0 等数值。atk1=1000 意味着物品提升一级将会提升额外的10点攻击(1000/100) atk1=111就是每级1.11攻击,会四舍五入。 hprec1等是被可用物品使用的。 这些数值是可以扩充的,别忘了增加相应处理语句。存储位也可以放在另一设定脚本里。 2.增加有等级的物品的方法: 在事件脚本内加入 balls = $data_weapons[1].dup balls.bonus = [0,100] $game_party.gain_item(balls,1) 其中 balls = $data_weapons[1].dup 获得武器库第一个武器:木棒 balls.bonus = [0,100] 增加武器的等级为0抚摸,100等级 $game_party.gain_item(balls,1)获得一个蛋成为三蛋 3.自定义抚摸 ENCHANT array包含了抚摸的名字,比如木棒-->爆炎木棒 ENCHANT NAME & DES用作抚摸效果的显示。 在def enchantBonus定义抚摸的效果:case type后加入when number 其他请参照注释和范例。 技术支持: 将游戏中所有的辨别item的key:item.id换成了[item.id,bonus]的array形式。 其中包括$game_party的@item hash list和角色的装备决定数值weapon_id等。 并对一些处理语句做出了修改,返还物品时做bonus的附加修改。 致想看完这个脚本的朋友:debug时我很容易写F**K,S**T等字样无视就好 我的编程style很烂,各种tab都是乱七八糟的。请多多包涵 由于只测试了武器木棒,出现bug请pm我。 兼容性/整合系统技术支持: 可能不支持修改过game_party中gain_item,items,item_number, game_actors中armor_id,weapons, armors, change_equip, RPG:ITEM,和window_base中draw_item_name的系统整合。 可能与装备显示的系统有冲突。 与游戏事件:失去物品可能不兼容。尤其是升级过后的装备。(等级不同所以key不同) update NOTE 将在武器和防具类的bonus更新语句放到了baseitem内。更新bonus内容时直接更新物品数据。 运行速度可能会变慢(处理语句变多) 处理了weapon_Id等的getter模式,提升了兼容性 对某些语句使用了alias。 修复了一个丢弃防具的bug。 添加了物品升级的函数。 更新了物品升级的语句(未测试) 修正上述废话。 =end module SHIT #Bonus初始化的状态。目前的状态是(抚摸,装备等级)[enchant,item level] SHITBONUS = [0,0] ENCHANT = ["爆炎","Shitty"] #FOLLOWING USED IN ARMOUR DESCRIPTION ENCHANTNAME = ["爆炎:","Shitty"] ENCHANTDES = ["提升5点攻击并攻击为火属性","大幅降低物品属性"] end module RPG class BaseItem attr_accessor:bonus #添加的bonus数据。 def fix(bonus=[0,0])#bonus的setter。将bonus变量导入到本类的@bonus变量里 @bonus = bonus enchantBonus(@bonus[0]) levelBonus(@bonus[1]) return self end def bonus#bonus的getter。若本类@bonus为nil则返回bonus初始化array。 return SHIT::SHITBONUS if @bonus == nil return @bonus end def showBonus?#是否在物品名旁显示bonus的返回boolean。若没有属性加成则不显示 atk1=0 def1=0 agi1=0 spi1=0 hit1=0 eva1=0 hprec1=0 mprec1=0 eval(@note) shittyarray=[atk1,def1,agi1,spi1,hprec1,mprec1]#将所有的变量放到array里 for shit in shittyarray return true if shit != 0#如果有则显示bonus加成 end return false end def lvlup @bonus =SHIT::SHITBONUS if @bonus == nil @bonus = @bonus.dup @bonus[1]+= 1 return self end def update_qualify(id,type) #id:物品编号。type:1=misc, 2=weap,3=armour #物品升级时的特殊要求。目前为100% case id when 1 end return true if rand(100)<100 return false end def enchantBonus(type) #common variables;atk,def,spi,agi,price #variables only weapon have :hit, twohand, fastatk,cri,elementset,stateset #only armour:eva,halfmp, double exp, list = [0, 0, 0, 0, 0, 0, 0, 0, 0, [], [], 0, 0, 0, 0, [], [], 0 ] #list format: [atk,def,spi,agi,price,hit,twohand,fastatk,cri,elementset,stateset,eva, halfmp,doubexp, auto_recov, halve_element_damage, state_resist,prevent_cri] #atk1 def2 spi3 agi4 pric5 hit6 2h7 fast8 cri9 elem10 stat11 eva12 #1/2mp13 2xexp14 hprec15 elementset16 stateset17 preventcri18 #elementset format:[elementid,element id] #stateset format:[stateid, stateid] #WARNING:7,8,9,13,14,15,18 MUST BE SET TO BOOLEAN(TRUE/FALSE) OR 0(NO CHANGE) case type when 1#name=火焰武器抚摸(+5攻击并攻击火焰化) list[0]=5#ATK+5 list[9]=[9]#ELEMENTSET PUSH 9(火焰) when 2#shitty:全属性-500 list[0]=-500 list[1]=-500 list[2]=-500 list[3]=-500 end @atk += list[0] if @atk != nil @def += list[1] if @def != nil @spi += list[2] if @spi != nil @agi += list[3] if @agi != nil @price += list[4] if @price != nil @hit += list[5] if @hit != nil @two_handed = list[6] if @two_handed != nil && list[6]!=0 @fast_attack = list[7] if @fast_attack!= nil && list[7]!=0 @critical_bonus = list[8] if @critical_bonus!= nil && list[8]!=0 @element_set += list[9] if @element_set!=nil && @two_handed != nil @state_set += list[10] if @state_set!=nil && @two_handed != nil @eva += list[11] if @eva != nil @half_mp_cost = list[12] if @half_mp_cost != nil && list[12]!=0 @double_exp_gain = list[13] if @double_exp_gain!= nil && list[13]!=0 @auto_hp_recover = list[14] if @auto_hp_recover!= nil && list[14]!=0 @element_set += list[15] if @element_set!=nil && @auto_hp_recover != nil @state_set += list[16] if @state_set!=nil && @auto_hp_recover != nil @prevent_critical = list[17] if @prevent_critical!= nil && list[17]!=0 end def levelBonus(level) atk1=0 def1=0 agi1=0 spi1=0 hit1=0 eva1=0 hprec1=0 mprec1=0 #能力扩充HERE eval(@note) @atk += (atk1*level/100).to_i if @atk!=nil @def += (def1*level/100).to_i if @def!=nil @spi += (spi1*level/100).to_i if @spi!=nil @agi += (agi1*level/100).to_i if @agi!=nil @hit += (hit1*level/100).to_i if @hit!=nil @eva += (eva1*level/100).to_i if @eva!=nil @hp_recovery += (hprec1*level/100).to_i if @hp_recovery!=nil @mp_recovery += (mprec1*level/100).to_i if @mp_recovery!=nil end end#end of class end#end of module class Window_Base#对物品名字表述的重新定义。 def draw_item_name(item, x, y, enabled = true) return if item == nil if item != nil draw_icon(item.icon_index, x, y, enabled) self.contents.font.color = normal_color self.contents.font.color.alpha = enabled ? 255 : 128 text = item.name text = SHIT::ENCHANT[item.bonus[0]-1]+text if item.bonus[0]!=0 && SHIT::ENCHANT[item.bonus[0]-1] != nil #print "fuck"+item[1][1].to_i.to_s #请忽略debug语句 text += ("+"+(item.bonus[1].to_s)) if item.bonus[1]!=0 && item.showBonus?#bonus name spec. here #如果物品有属性加成并有等级则显示+X在名字后面 self.contents.draw_text(x + 24, y, 172, WLH, text) end end end #对actor类的重新整理 class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 设置 # actor_id : 角色 ID #-------------------------------------------------------------------------- alias setup1 setup def setup(actor_id) setup1(actor_id) #将装备的key换成array形式 @weapon_id = [actor.weapon_id,SHIT::SHITBONUS] @armor1_id = [actor.armor1_id,SHIT::SHITBONUS] @armor2_id = [actor.armor2_id,SHIT::SHITBONUS] @armor3_id = [actor.armor3_id,SHIT::SHITBONUS] @armor4_id = [actor.armor4_id,SHIT::SHITBONUS] end #对装备key做getter处理 def weapon_id return @weapon_id[0] end def armor1_id return @armor1_id[0] end def armor2_id return @armor2_id[0] end def armor3_id return @armor3_id[0] end def @armor4_id return @armor4_id[0] end #-------------------------------------------------------------------------- # ● 获取武器对象数组 #-------------------------------------------------------------------------- def weapons#重新定义了武器获取模式:由于nil不再好判断,通过另一函数pushFucker处理 result = [] result = pushFucker(result,@weapon_id,true) if two_swords_style result = pushFucker(result,@armor1_id,true) end return result end #-------------------------------------------------------------------------- # ● 获取防具对象数组 #-------------------------------------------------------------------------- def armors#重新定义了防具获取模式:由于nil不再好判断,通过另一函数pushFucker处理 result = [] unless two_swords_style result = pushFucker(result,@armor1_id) end result = pushFucker(result,@armor2_id) result = pushFucker(result,@armor3_id) result = pushFucker(result,@armor4_id) return result end def pushFucker(result,itemshit,weapon = false) #如果系统存在这个武器那么在result表内增加加成过bonus的武器。否则push nil if weapon if $data_weapons[itemshit[0]]!=nil result.push($data_weapons[itemshit[0]].dup.fix(itemshit[1])) else result.push(nil) end else if $data_armors[itemshit[0]]!=nil result.push($data_armors[itemshit[0]].dup.fix(itemshit[1])) else result.push(nil) end end return result end #-------------------------------------------------------------------------- # ● 变更装备(目标对象) # equip_type : 装备部分(0~4) # item_id : 武器或防具ID # test : 测试标志(战斗测试或暂时装备用) #-------------------------------------------------------------------------- def change_equip(equip_type, item, test = false) last_item = equips[equip_type] unless test return if $game_party.item_number(item) == 0 if item != nil $game_party.gain_item(last_item, 1) $game_party.lose_item(item, 1) end #由于下面就要更新装备处理数值了,所以将物品key改成新的array形式: #[id,bonus]的形式。若是物品nil则key为0,初始bonus数值的array。 item = [item.id,item.bonus] if item != nil# item = [0,SHIT::SHITBONUS]if item == nil case equip_type when 0 # 武器 @weapon_id = item unless two_hands_legal? # 非双手装备的场合,自动卸下装备 change_equip(1, nil, test) end when 1 # 盾 @armor1_id = item unless two_hands_legal? # 非双手装备的场合,自动卸下装备 change_equip(0, nil, test) end when 2 # 头部防具 @armor2_id = item when 3 # 身体防具 @armor3_id = item when 4 # 装饰品 @armor4_id = item#_id end end #-------------------------------------------------------------------------- # ● 丢弃装备 # item : 要丢弃的武器或防具 # 在「包含装备品」选项钩上时使用。 #-------------------------------------------------------------------------- def discard_equip(item) if item.is_a?(RPG::Weapon) #同样的更改物品key的形式。 if @weapon_id == [item.id,item.bonus] @weapon_id = [0,SHIT::SHITBONUS] elsif two_swords_style and @armor1_id == [item.id,item.bonus] @armor1_id = [0,SHIT::SHITBONUS] end elsif item.is_a?(RPG::Armor) if not two_swords_style and @armor1_id == [item.id,item.bonus] @armor1_id = [0,SHIT::SHITBONUS] elsif @armor2_id == [item.id,item.bonus] @armor2_id = [0,SHIT::SHITBONUS] elsif @armor3_id == [item.id,item.bonus] @armor3_id = [0,SHIT::SHITBONUS] elsif @armor4_id == [item.id,item.bonus] @armor4_id = [0,SHIT::SHITBONUS] end end end alias level_up1 level_up def level_up level_up1 #在升级时同时升级装备。 level_up_armour([@weapon_id,@armor1_id,@armor1_id,@armor1_id,@armor1_id]) end def level_up_armour(shits)#升级装备的函数。shit是包括全数据的array fucks=equips i=0 for shit in shits shit[1]=[0,0] if shit[1]==[]#若是bonus为空,则初始化bonus shit[1][1]+= 1 if fucks[i]!=nil && fucks[i].update_qualify#自定义装备升级模式(比如只有装备黄盘才能升级成3d龙之类的) i += 1 end end end class Game_Party def items#对返还物品列表的函数更改。返还的是bonus加持过的物品。 result = [] for i in @items.keys.sort result.push($data_items[i[0]].dup.fix(i[1])) if @items[i] > 0 end for i in @weapons.keys.sort result.push($data_weapons[i[0]].dup.fix(i[1])) if @weapons[i] > 0 end for i in @armors.keys.sort result.push($data_armors[i[0]].dup.fix(i[1])) if @armors[i] > 0 end return result end def gain_item(item, n, include_equip = false)#获得物品时的更改。 #同样的,key从item.id换成了array形式。 return if item == nil #bonus form: [enchant id, bonus id] number = item_number(item) case item when RPG::Item @items[[item.id,item.bonus]] = [[number + n, 0].max, 99].min when RPG::Weapon @weapons[[item.id,item.bonus]] = [[number + n, 0].max, 99].min when RPG::Armor @armors[[item.id,item.bonus]] = [[number + n, 0].max, 99].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 def item_number(item) #第无数次更新key的形式。 case item when RPG::Item number = @items[[item.id,item.bonus]] when RPG::Weapon number = @weapons[[item.id,item.bonus]] when RPG::Armor number = @armors[[item.id,item.bonus]] end return number == nil ? 0 : number end end #以下语句是为了突破999属性的限制。并不是必须的,原脚本也无法完美显示4位攻击值。 class Game_Battler #-------------------------------------------------------------------------- # ● 获取 最大体力值 上限 #-------------------------------------------------------------------------- def maxhp_limit return 999999 end #-------------------------------------------------------------------------- # ● 获取 最大体力值 #-------------------------------------------------------------------------- def maxhp return [[base_maxhp + @maxhp_plus, 1].max, maxhp_limit].min end #-------------------------------------------------------------------------- # ● 获取 最大魔力值 #-------------------------------------------------------------------------- def maxmp return [[base_maxmp + @maxmp_plus, 0].max, 9999].min end #-------------------------------------------------------------------------- # ● 获取 攻击力 #-------------------------------------------------------------------------- def atk n = [[base_atk + @atk_plus, 1].max, 9999].min for state in states do n *= state.atk_rate / 100.0 end n = [[Integer(n), 1].max, 9999].min return n end #-------------------------------------------------------------------------- # ● 获取 防御力 #-------------------------------------------------------------------------- def def n = [[base_def + @def_plus, 1].max, 9999].min for state in states do n *= state.def_rate / 100.0 end n = [[Integer(n), 1].max, 9999].min return n end #-------------------------------------------------------------------------- # ● 获取 精神力 #-------------------------------------------------------------------------- def spi n = [[base_spi + @spi_plus, 1].max, 9999].min for state in states do n *= state.spi_rate / 100.0 end n = [[Integer(n), 1].max, 9999].min return n end #-------------------------------------------------------------------------- # ● 获取 敏捷 #-------------------------------------------------------------------------- def agi n = [[base_agi + @agi_plus, 1].max, 9999].min for state in states do n *= state.agi_rate / 100.0 end n = [[Integer(n), 1].max, 9999].min return n end end #=end
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |