赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 350 |
最后登录 | 2016-3-1 |
在线时间 | 5 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 5 小时
- 注册时间
- 2011-9-10
- 帖子
- 6
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 天使无双 于 2011-9-21 21:55 编辑
仿照火纹升级系统做的随机升级脚本
非火纹前期作品的按属性成长率升级,而是升级时尽量逼近(较大大概率事件)数据库里预设的属性值。
新手第一次发脚本,不足之处多多包涵- #===============================================================================
- #-仿照火纹升级系统做的随机升级脚本
- #
- #-火纹中前期作品中,人物升级时每个属性是按几率上升的,这使得很多玩家不停的S/L以
- # 追求属性的最优化。后面几作中,人物每一级的属性值也有一个table,但是升级时增长
- # 的数值还是随机的,不过增长为预设值的可能性较大。这使得人物属性不会因玩家不停
- # 的S/L而变得太离谱导致游戏失去趣味。
- #-人物升级时读取数据库中下一级的属性值,减去现有属性(嗑药增加/减少的不算),得
- # 到预期升级增加值,根据正态分布函数normal_level_up(parameter,temp,n)产生增加值。
- #-修改了经验变更函数,使每次升级均有提示。原来若一次性连升多级,只显示最后一级的
- # 增长情况。
- #-函数normal_level_up(parameter,temp,n)中参数n为偏离值,即你希望产生的数值与预期
- # 值的差距有多大,预设的hp,mp为1.5,atk等为1,大家根据自己数据库中每级属性平均
- # 增长值设置,可为小数。(p.s.若n设置过大(比如1k)可能会造成升级时运算量过大)
- #-建议人物最大等级不超过50级,平均每级属性增长值不超过2(0.75以下最好)。饭要一
- # 口一口吃,路要一步一步走,属性要一点一点凹……平均一级属性增加50点,谁还去凹你
- # 那一两点;若偏离值n设得过大,可能这一级角色变成神,下一级就是衰神……
- #-升级时属性不会增加负数(即就算凹点凹得比预设值高但升级时属性也不会减少)。
- #-属性增加值取值范围为预期值的2倍,预期值为负数时,取值范围为0,1。
- #-------------------------------------------------------------------------------
- #-不足之处:因没有负增长,理论上讲,当前属性高于预设值时,属性增长为0的概率应为增
- # 长为负的概率+增长为0的概率(即对负无穷大到0做一个积分)。但实际上增长预期值为
- # 负数时,是按照预期值为0计算的,属性增加值取值范围为0,1。当偏离值n设为1时增长
- # 值为0的概率约为73.6%。n越大,取0的概率越小,当n为无穷大时,取0或1的概率均为50%
- #-没有进一步优化的原因:1、懒!
- # 2、大学概率周公教的,不知道怎么把正态函数的累计概率写成
- # 编程公式。
- # 3、降低游戏难度,完全逼近预设数值就失去凹点的乐趣了。
- #-改进方法:对于n过大又实在要追求完美的童鞋们可以采取以下两种方法:
- # 1、将n改小(n设太大属性增加值就像跳床一样起伏不定......囧)
- # 2、在normal_level_up函数里面的loop do中t = rand([u,0].max*2+1)后面
- # 加一句:
- # break if u<0 && t==0 && rand()<0.85
- #-------------------------------------------------------------------------------
- #-修改过的类:Game_Actor、Game_Battler、Vocab
- #===============================================================================
- class Game_Actor < Game_Battler
- #--------------------------------------------------------------------------
- # ● 定义升级时显示的属性增加值的实例变量
- #--------------------------------------------------------------------------
- attr_reader :maxhp_temp
- attr_reader :maxmp_temp
- attr_reader :atk_temp
- attr_reader :def_temp
- attr_reader :spi_temp
- attr_reader :agi_temp
- #以上定义升级时显示的属性增加值的实例变量
-
- #以下重新定义升级函数,在升级时可显示属性变化
- def level_up
- @level += 1
- #以下将本次升级属性增加值清零
- @maxhp_temp = 0
- @maxmp_temp = 0
- @atk_temp = 0
- @def_temp = 0
- @spi_temp = 0
- @agi_temp = 0
- #以上将本次升级属性增加值清零
- for learning in self.class.learnings
- learn_skill(learning.skill_id) if learning.level == @level
- end
-
- #以下产生本次升级的属性增加值
- @maxhp_temp = normal_level_up(0,@maxhp_plus_temp,1.5)
- @maxmp_temp = normal_level_up(1,@maxmp_plus_temp,1.5)
- @atk_temp = normal_level_up(2,@atk_plus_temp,1)
- @def_temp = normal_level_up(3,@def_plus_temp,1)
- @spi_temp = normal_level_up(4,@spi_plus_temp,1)
- @agi_temp = normal_level_up(5,@agi_plus_temp,1)
- #以上产生本次升级的属性增加值
- @maxhp_plus_temp +=@maxhp_temp
- @maxmp_plus_temp +=@maxmp_temp
- @atk_plus_temp += @atk_temp
- @def_plus_temp += @def_temp
- @spi_plus_temp += @spi_temp
- @agi_plus_temp += @agi_temp
- end
- def display_level_up(new_skills)
- $game_message.new_page
- text = sprintf(Vocab::LevelUp, @name, Vocab::level, @level)
- $game_message.texts.push(text)
- #以下显示本次属性增加值
- text = sprintf(Vocab::LevelUp_temp1,@maxhp_temp,@maxmp_temp,@atk_temp)
- $game_message.texts.push(text)
- text = sprintf(Vocab::LevelUp_temp2,@def_temp,@spi_temp,@agi_temp)
- $game_message.texts.push(text)
- #以上显示本次属性增加值
- for skill in new_skills
- text = sprintf(Vocab::ObtainSkill, skill.name)
- $game_message.texts.push(text)
- end
- end
- #以上重新定义升级函数,在升级时可显示属性变化
-
- #--------------------------------------------------------------------------
- # ● 重定义经验变更使其每次升级均显示升级状态(原来只显示最后一次升级情况)
- # exp : 新经验
- # show : 显示等级提示标志
- #--------------------------------------------------------------------------
- def change_exp(exp, show)
- last_skills = skills
- @exp = [[exp, 9999999].min, 0].max
- while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
- last_skills = skills
- level_up
- display_level_up(skills - last_skills)
- end
- while @exp < @exp_list[@level]
- level_down
- end
- @hp = [@hp, maxhp].min
- @mp = [@mp, maxmp].min
- end
- #以上重定义经验变更函数
-
-
-
- #--------------------------------------------------------------------------
- # ● 升级时属性随机上升的概率
- # 正态分布函数
- # parameter为属性代码:0--hp,1--mp,2--atk,3--def,4--spi,5--agi
- # temp为当前属性较1级时增加的点数(*_plus_temp),当前等级标准点数-temp=期望增加点数
- # n为偏离值,在实数范围内,68.3%的值分布在期望值的正负n之内
- # 95.5%的值分布在期望值的正负2n之内
- # 99.7%的值分布在期望值的正负3n之内
- # 若增加值为整数,一角色1级基础atk为10,随机升级到3级时atk为12,则
- # atk_plus_temp=12-10=2
- # 4级标准atk为14,则3级升级到4级时,atk期望增加值为14-10-2 = 2
- # atk升级偏离值n若为1,则升级时有39.9%的可能性为2
- # 有24.2%的可能性为1或3
- # 有5.4%的可能性为0或4
- # 有0.3%的可能性为5(不会有负数)
- #--------------------------------------------------------------------------
- def normal_level_up(parameter,temp,n)
- t = 0
- u = actor.parameters[parameter,@level]-actor.parameters[parameter,1]-temp
- loop do
- t = rand([u,0].max*2+1)
- #break if u<0 && t==0 && rand()<0.85 #n值过大的童鞋可以加上这一句
- break if rand()<1/(n*Math.sqrt(2*Math::PI))*Math.exp(-(t-u)**2/(2*n**2))
- end
- return t
- end
- #以上定义升级时属性上升的概率
-
- #以下将属性基本值重新定义人物1级时候的数值
- #--------------------------------------------------------------------------
- # ● 获取基本体力最大值
- #--------------------------------------------------------------------------
- def base_maxhp
- return actor.parameters[0, 1]
- end
- #--------------------------------------------------------------------------
- # ● 获取基本魔力最大值
- #--------------------------------------------------------------------------
- def base_maxmp
- return actor.parameters[1, 1]
- end
- #--------------------------------------------------------------------------
- # ● 获取基本攻击力
- #--------------------------------------------------------------------------
- def base_atk
- n = actor.parameters[2, 1]
- for item in equips.compact do n += item.atk end
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取基本防御力
- #--------------------------------------------------------------------------
- def base_def
- n = actor.parameters[3, 1]
- for item in equips.compact do n += item.def end
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取基本精神力
- #--------------------------------------------------------------------------
- def base_spi
- n = actor.parameters[4, 1]
- for item in equips.compact do n += item.spi end
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取基本敏捷
- #--------------------------------------------------------------------------
- def base_agi
- n = actor.parameters[5, 1]
- for item in equips.compact do n += item.agi end
- return n
- end
- #以上将属性基本值重新定义人物1级时候的数值
-
- end
- #Game_Actor
- class Game_Battler
-
- #以下定义当前等级属性较1级时增加的点数
- attr_reader :maxhp_plus_temp #体力
- attr_reader :maxmp_plus_temp #魔力
- attr_reader :atk_plus_temp #攻击
- attr_reader :def_plus_temp #防御
- attr_reader :spi_plus_temp #智商
- attr_reader :agi_plus_temp #敏捷
- #以上定义当前等级属性较1级时增加的点数
-
- #--------------------------------------------------------------------------
- # ● 清除能力值变量
- #--------------------------------------------------------------------------
- def clear_extra_values
- @maxhp_plus = 0
- @maxmp_plus = 0
- @atk_plus = 0
- @def_plus = 0
- @spi_plus = 0
- @agi_plus = 0
- @maxhp_plus_temp = 0 #体力
- @maxmp_plus_temp = 0 #魔力
- @atk_plus_temp = 0 #攻击
- @def_plus_temp = 0 #防御
- @spi_plus_temp = 0 #智商
- @agi_plus_temp = 0
- end
-
- #以下重新定义属性计算公式
-
- #--------------------------------------------------------------------------
- # ● 获取 最大体力值
- #--------------------------------------------------------------------------
- def maxhp
- return [[base_maxhp + @maxhp_plus + @maxhp_plus_temp, 1].max, maxhp_limit].min
- end
- #--------------------------------------------------------------------------
- # ● 获取 最大魔力值
- #--------------------------------------------------------------------------
- def maxmp
- return [[base_maxmp + @maxmp_plus + @maxmp_plus_temp, 0].max, 9999].min
- end
- #--------------------------------------------------------------------------
- # ● 获取 攻击力
- #--------------------------------------------------------------------------
- def atk
- n = [[base_atk + @atk_plus + @atk_plus_temp, 1].max, 999].min
- for state in states do n *= state.atk_rate / 100.0 end
- n = [[Integer(n), 1].max, 999].min
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取 防御力
- #--------------------------------------------------------------------------
- def def
- n = [[base_def + @def_plus + @def_plus_temp, 1].max, 999].min
- for state in states do n *= state.def_rate / 100.0 end
- n = [[Integer(n), 1].max, 999].min
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取 精神力
- #--------------------------------------------------------------------------
- def spi
- n = [[base_spi + @spi_plus + @spi_plus_temp, 1].max, 999].min
- for state in states do n *= state.spi_rate / 100.0 end
- n = [[Integer(n), 1].max, 999].min
- return n
- end
- #--------------------------------------------------------------------------
- # ● 获取 敏捷
- #--------------------------------------------------------------------------
- def agi
- n = [[base_agi + @agi_plus + @agi_plus_temp, 1].max, 999].min
- for state in states do n *= state.agi_rate / 100.0 end
- n = [[Integer(n), 1].max, 999].min
- return n
- end
- #以上重新定义属性计算公式
- end
- #Game_Battler
- #以下定义升级时属性增加值的显示格式
- module Vocab
- LevelUp_temp1 = "HP增加%s,MP增加%s,攻击增加%s"
- LevelUp_temp2 = "防御增加%s,精神增加%s,敏捷增加%s"
- end
- #Vocab
- #以上定义升级时属性增加值的显示格式
复制代码 |
|