| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2014-2-17 |
| 在线时间 | 37 小时 |
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 37 小时
- 注册时间
- 2012-7-30
- 回帖
- 124
|
发表于 2012-8-2 02:43:20
|
显示全部楼层
本帖最后由 devilg 于 2012-8-6 23:25 编辑
我又后悔了。。。。
再更正几个bug。
[pre lang="ruby" line="1"]=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!=nil && fucks.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 > 0
end
for i in @weapons.keys.sort
result.push($data_weapons[i[0]].dup.fix(i[1])) if @weapons > 0
end
for i in @armors.keys.sort
result.push($data_armors[i[0]].dup.fix(i[1])) if @armors > 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[/pre]������ |
评分
-
查看全部评分
|