Project1

标题: 仿火纹升级系统 [打印本页]

作者: 天使无双    时间: 2011-9-21 21:55
标题: 仿火纹升级系统
本帖最后由 天使无双 于 2011-9-21 21:55 编辑

仿照火纹升级系统做的随机升级脚本
非火纹前期作品的按属性成长率升级,而是升级时尽量逼近(较大大概率事件)数据库里预设的属性值。
新手第一次发脚本,不足之处多多包涵
  1. #===============================================================================
  2. #-仿照火纹升级系统做的随机升级脚本
  3. #
  4. #-火纹中前期作品中,人物升级时每个属性是按几率上升的,这使得很多玩家不停的S/L以
  5. # 追求属性的最优化。后面几作中,人物每一级的属性值也有一个table,但是升级时增长
  6. # 的数值还是随机的,不过增长为预设值的可能性较大。这使得人物属性不会因玩家不停
  7. # 的S/L而变得太离谱导致游戏失去趣味。
  8. #-人物升级时读取数据库中下一级的属性值,减去现有属性(嗑药增加/减少的不算),得
  9. # 到预期升级增加值,根据正态分布函数normal_level_up(parameter,temp,n)产生增加值。
  10. #-修改了经验变更函数,使每次升级均有提示。原来若一次性连升多级,只显示最后一级的
  11. # 增长情况。
  12. #-函数normal_level_up(parameter,temp,n)中参数n为偏离值,即你希望产生的数值与预期
  13. # 值的差距有多大,预设的hp,mp为1.5,atk等为1,大家根据自己数据库中每级属性平均
  14. # 增长值设置,可为小数。(p.s.若n设置过大(比如1k)可能会造成升级时运算量过大)
  15. #-建议人物最大等级不超过50级,平均每级属性增长值不超过2(0.75以下最好)。饭要一
  16. # 口一口吃,路要一步一步走,属性要一点一点凹……平均一级属性增加50点,谁还去凹你
  17. # 那一两点;若偏离值n设得过大,可能这一级角色变成神,下一级就是衰神……
  18. #-升级时属性不会增加负数(即就算凹点凹得比预设值高但升级时属性也不会减少)。
  19. #-属性增加值取值范围为预期值的2倍,预期值为负数时,取值范围为0,1。
  20. #-------------------------------------------------------------------------------
  21. #-不足之处:因没有负增长,理论上讲,当前属性高于预设值时,属性增长为0的概率应为增
  22. # 长为负的概率+增长为0的概率(即对负无穷大到0做一个积分)。但实际上增长预期值为
  23. # 负数时,是按照预期值为0计算的,属性增加值取值范围为0,1。当偏离值n设为1时增长
  24. # 值为0的概率约为73.6%。n越大,取0的概率越小,当n为无穷大时,取0或1的概率均为50%
  25. #-没有进一步优化的原因:1、懒!
  26. #                       2、大学概率周公教的,不知道怎么把正态函数的累计概率写成
  27. #                          编程公式。
  28. #                       3、降低游戏难度,完全逼近预设数值就失去凹点的乐趣了。
  29. #-改进方法:对于n过大又实在要追求完美的童鞋们可以采取以下两种方法:
  30. #           1、将n改小(n设太大属性增加值就像跳床一样起伏不定......囧)
  31. #           2、在normal_level_up函数里面的loop do中t = rand([u,0].max*2+1)后面
  32. #           加一句:
  33. #             break if u<0 && t==0 && rand()<0.85
  34. #-------------------------------------------------------------------------------
  35. #-修改过的类:Game_Actor、Game_Battler、Vocab
  36. #===============================================================================



  37. class Game_Actor < Game_Battler
  38.   #--------------------------------------------------------------------------
  39.   # ● 定义升级时显示的属性增加值的实例变量
  40.   #--------------------------------------------------------------------------
  41.   attr_reader   :maxhp_temp
  42.   attr_reader   :maxmp_temp
  43.   attr_reader   :atk_temp
  44.   attr_reader   :def_temp
  45.   attr_reader   :spi_temp
  46.   attr_reader   :agi_temp
  47.   #以上定义升级时显示的属性增加值的实例变量
  48.   
  49.   #以下重新定义升级函数,在升级时可显示属性变化
  50.   def level_up
  51.     @level += 1
  52.     #以下将本次升级属性增加值清零
  53.     @maxhp_temp = 0
  54.     @maxmp_temp = 0
  55.     @atk_temp = 0
  56.     @def_temp = 0
  57.     @spi_temp = 0
  58.     @agi_temp = 0
  59.     #以上将本次升级属性增加值清零
  60.     for learning in self.class.learnings
  61.       learn_skill(learning.skill_id) if learning.level == @level
  62.     end
  63.    
  64.     #以下产生本次升级的属性增加值
  65.     @maxhp_temp = normal_level_up(0,@maxhp_plus_temp,1.5)
  66.     @maxmp_temp = normal_level_up(1,@maxmp_plus_temp,1.5)
  67.     @atk_temp = normal_level_up(2,@atk_plus_temp,1)
  68.     @def_temp = normal_level_up(3,@def_plus_temp,1)
  69.     @spi_temp = normal_level_up(4,@spi_plus_temp,1)
  70.     @agi_temp = normal_level_up(5,@agi_plus_temp,1)
  71.     #以上产生本次升级的属性增加值
  72.     @maxhp_plus_temp +=@maxhp_temp
  73.     @maxmp_plus_temp +=@maxmp_temp
  74.     @atk_plus_temp += @atk_temp
  75.     @def_plus_temp += @def_temp
  76.     @spi_plus_temp += @spi_temp
  77.     @agi_plus_temp += @agi_temp
  78.   end
  79.   def display_level_up(new_skills)
  80.     $game_message.new_page
  81.     text = sprintf(Vocab::LevelUp, @name, Vocab::level, @level)
  82.     $game_message.texts.push(text)
  83.     #以下显示本次属性增加值
  84.     text = sprintf(Vocab::LevelUp_temp1,@maxhp_temp,@maxmp_temp,@atk_temp)
  85.     $game_message.texts.push(text)
  86.     text = sprintf(Vocab::LevelUp_temp2,@def_temp,@spi_temp,@agi_temp)
  87.     $game_message.texts.push(text)
  88.     #以上显示本次属性增加值
  89.     for skill in new_skills
  90.       text = sprintf(Vocab::ObtainSkill, skill.name)
  91.       $game_message.texts.push(text)
  92.     end
  93.   end
  94.   #以上重新定义升级函数,在升级时可显示属性变化
  95.   
  96.   #--------------------------------------------------------------------------
  97.   # ● 重定义经验变更使其每次升级均显示升级状态(原来只显示最后一次升级情况)
  98.   #     exp  : 新经验
  99.   #     show : 显示等级提示标志
  100.   #--------------------------------------------------------------------------
  101.   def change_exp(exp, show)
  102.     last_skills = skills
  103.     @exp = [[exp, 9999999].min, 0].max
  104.     while @exp >= @exp_list[@level+1] and @exp_list[@level+1] > 0
  105.       last_skills = skills
  106.       level_up
  107.       display_level_up(skills - last_skills)
  108.     end
  109.     while @exp < @exp_list[@level]
  110.       level_down
  111.     end
  112.     @hp = [@hp, maxhp].min
  113.     @mp = [@mp, maxmp].min
  114.   end
  115. #以上重定义经验变更函数
  116.   

  117.   
  118. #--------------------------------------------------------------------------
  119. # ● 升级时属性随机上升的概率
  120. # 正态分布函数
  121. # parameter为属性代码:0--hp,1--mp,2--atk,3--def,4--spi,5--agi
  122. # temp为当前属性较1级时增加的点数(*_plus_temp),当前等级标准点数-temp=期望增加点数
  123. # n为偏离值,在实数范围内,68.3%的值分布在期望值的正负n之内
  124. #                         95.5%的值分布在期望值的正负2n之内
  125. #                         99.7%的值分布在期望值的正负3n之内
  126. # 若增加值为整数,一角色1级基础atk为10,随机升级到3级时atk为12,则
  127. # atk_plus_temp=12-10=2
  128. # 4级标准atk为14,则3级升级到4级时,atk期望增加值为14-10-2 = 2
  129. # atk升级偏离值n若为1,则升级时有39.9%的可能性为2
  130. #                              有24.2%的可能性为1或3
  131. #                              有5.4%的可能性为0或4
  132. #                              有0.3%的可能性为5(不会有负数)
  133. #--------------------------------------------------------------------------
  134.   def normal_level_up(parameter,temp,n)
  135.     t = 0
  136.     u = actor.parameters[parameter,@level]-actor.parameters[parameter,1]-temp
  137.     loop do
  138.       t = rand([u,0].max*2+1)
  139.       #break if u<0 && t==0 && rand()<0.85 #n值过大的童鞋可以加上这一句
  140.       break if rand()<1/(n*Math.sqrt(2*Math::PI))*Math.exp(-(t-u)**2/(2*n**2))
  141.     end
  142.     return t
  143.   end
  144. #以上定义升级时属性上升的概率

  145. #以下将属性基本值重新定义人物1级时候的数值

  146.   #--------------------------------------------------------------------------
  147.   # ● 获取基本体力最大值
  148.   #--------------------------------------------------------------------------
  149.   def base_maxhp
  150.     return actor.parameters[0, 1]
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 获取基本魔力最大值
  154.   #--------------------------------------------------------------------------
  155.   def base_maxmp
  156.     return actor.parameters[1, 1]
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 获取基本攻击力
  160.   #--------------------------------------------------------------------------
  161.   def base_atk
  162.     n = actor.parameters[2, 1]
  163.     for item in equips.compact do n += item.atk end
  164.     return n
  165.   end
  166.   #--------------------------------------------------------------------------
  167.   # ● 获取基本防御力
  168.   #--------------------------------------------------------------------------
  169.   def base_def
  170.     n = actor.parameters[3, 1]
  171.     for item in equips.compact do n += item.def end
  172.     return n
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   # ● 获取基本精神力
  176.   #--------------------------------------------------------------------------
  177.   def base_spi
  178.     n = actor.parameters[4, 1]
  179.     for item in equips.compact do n += item.spi end
  180.     return n
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 获取基本敏捷
  184.   #--------------------------------------------------------------------------
  185.   def base_agi
  186.     n = actor.parameters[5, 1]
  187.     for item in equips.compact do n += item.agi end
  188.     return n
  189.   end
  190. #以上将属性基本值重新定义人物1级时候的数值
  191.   
  192. end
  193. #Game_Actor

  194. class Game_Battler
  195.   
  196.   #以下定义当前等级属性较1级时增加的点数
  197.   attr_reader   :maxhp_plus_temp          #体力
  198.   attr_reader   :maxmp_plus_temp          #魔力
  199.   attr_reader   :atk_plus_temp            #攻击
  200.   attr_reader   :def_plus_temp            #防御
  201.   attr_reader   :spi_plus_temp            #智商
  202.   attr_reader   :agi_plus_temp            #敏捷
  203.   #以上定义当前等级属性较1级时增加的点数
  204.   
  205.   #--------------------------------------------------------------------------
  206.   # ● 清除能力值变量
  207.   #--------------------------------------------------------------------------
  208.   def clear_extra_values
  209.     @maxhp_plus = 0
  210.     @maxmp_plus = 0
  211.     @atk_plus = 0
  212.     @def_plus = 0
  213.     @spi_plus = 0
  214.     @agi_plus = 0
  215.     @maxhp_plus_temp = 0         #体力
  216.     @maxmp_plus_temp = 0         #魔力
  217.     @atk_plus_temp = 0          #攻击
  218.     @def_plus_temp = 0          #防御
  219.     @spi_plus_temp = 0          #智商
  220.     @agi_plus_temp = 0
  221.   end
  222.   
  223.   #以下重新定义属性计算公式
  224.   
  225.   #--------------------------------------------------------------------------
  226.   # ● 获取 最大体力值
  227.   #--------------------------------------------------------------------------
  228.   def maxhp
  229.     return [[base_maxhp + @maxhp_plus + @maxhp_plus_temp, 1].max, maxhp_limit].min
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 获取 最大魔力值
  233.   #--------------------------------------------------------------------------
  234.   def maxmp
  235.     return [[base_maxmp + @maxmp_plus + @maxmp_plus_temp, 0].max, 9999].min
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ● 获取 攻击力
  239.   #--------------------------------------------------------------------------
  240.   def atk
  241.     n = [[base_atk + @atk_plus + @atk_plus_temp, 1].max, 999].min
  242.     for state in states do n *= state.atk_rate / 100.0 end
  243.     n = [[Integer(n), 1].max, 999].min
  244.     return n
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ● 获取 防御力
  248.   #--------------------------------------------------------------------------
  249.   def def
  250.     n = [[base_def + @def_plus + @def_plus_temp, 1].max, 999].min
  251.     for state in states do n *= state.def_rate / 100.0 end
  252.     n = [[Integer(n), 1].max, 999].min
  253.     return n
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 获取 精神力
  257.   #--------------------------------------------------------------------------
  258.   def spi
  259.     n = [[base_spi + @spi_plus + @spi_plus_temp, 1].max, 999].min
  260.     for state in states do n *= state.spi_rate / 100.0 end
  261.     n = [[Integer(n), 1].max, 999].min
  262.     return n
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # ● 获取 敏捷
  266.   #--------------------------------------------------------------------------
  267.   def agi
  268.     n = [[base_agi + @agi_plus + @agi_plus_temp, 1].max, 999].min
  269.     for state in states do n *= state.agi_rate / 100.0 end
  270.     n = [[Integer(n), 1].max, 999].min
  271.     return n
  272.   end
  273.   #以上重新定义属性计算公式
  274. end
  275. #Game_Battler

  276. #以下定义升级时属性增加值的显示格式
  277. module Vocab
  278.   LevelUp_temp1         = "HP增加%s,MP增加%s,攻击增加%s"
  279.   LevelUp_temp2         = "防御增加%s,精神增加%s,敏捷增加%s"
  280. end
  281. #Vocab
  282. #以上定义升级时属性增加值的显示格式
复制代码

作者: 天使无双    时间: 2011-9-21 21:55

升级时的属性显示
作者: 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