Project1
标题:
仿火纹升级系统
[打印本页]
作者:
天使无双
时间:
2011-9-21 21:55
标题:
仿火纹升级系统
本帖最后由 天使无双 于 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
#以上定义升级时属性增加值的显示格式
复制代码
作者:
天使无双
时间:
2011-9-21 21:55
随机升级脚本.jpg
(45.09 KB, 下载次数: 12)
下载附件
保存到相册
2011-9-21 21:17 上传
升级时的属性显示
作者:
RPGmaster
时间:
2011-9-21 22:48
于是升级时不能用图片代替么= =
还是说
这个是默认的升级提示?
作者:
天使无双
时间:
2011-9-22 03:33
是在默认的升级提示display_level_up上修改的,需要用图片显示的话也可以,属性变化值的变量是:
@maxhp_temp,@maxmp_temp,@atk_temp,@def_temp,@spi_temp,@agi_temp
作者:
天使喝可乐
时间:
2011-9-22 08:15
感觉只有火纹那种系统适合这种升级加法
对于传统RPG 既然是追求最佳属性 那么为什么要让玩家S/L后才能得到 而不是直接得到?持续让人S/L的无用功会使游戏可玩性降低 尤其是 会破坏融入感 玩家融入游戏后却在升级时要不断S/L 完全无法融入游戏世界 对游戏的认同感也会降低 游戏可玩性会大大的下降
作者:
天使无双
时间:
2011-9-23 00:02
恩,确实在设计的时候就是以SLG游戏为框架的。下一步准备仿造曹操传做一个仇恨系统,或者叫目标引导系统,通过目标仇恨值、预设的剧情参数、当前行动可对目标造成的伤害、效果等来确定NPC下一步的行动...总之就是AI模拟吧
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1