Project1

标题: 对技能的描述的改进(显示伤害量,治疗量) [打印本页]

作者: 希望化身    时间: 2008-11-20 14:26
标题: 对技能的描述的改进(显示伤害量,治疗量)
本帖最后由 希望化身 于 2010-8-9 14:23 编辑

话说,在很久很久以前,接触rm开始,对数据库编写一直头疼。最郁闷的就是技能描述中的那几句话。
“造成大量伤害”,“大量治疗”……试问,这大量……到底是多少?
大家都了解“魔兽世界”这款游戏吧,他的技能描述就很实际。跟你写出个具体数值,供你参考。这个数值就有了个量的概念,比“大量”“少量”来的实际的多。

还请大家测试下,谢谢。
这个是给一般的默认战斗系统使用的:
  1. #==============================================================================
  2. #                      ★超级懒人之技能物品描述自生成系统★
  3. #说明:这个脚本几乎兼容任何脚本,可以生成技能的伤害写在描述中,也可以生成武器
  4. #      防具的表述,再也不用自己编写描述想半天写不出半个字了。
  5. #By:希望化身
  6. #
  7. #设置:角色属性存储变量(用于计算技能伤害,默认为30-34)
  8. FOR_SKILL_STATES = 30
  9. #
  10. #==============================================================================
  11. class Scene_Skill
  12.   #--------------------------------------------------------------------------
  13.   # ● 主处理(追加读取角色属性)
  14.   #--------------------------------------------------------------------------
  15.   def main
  16.     # 获取角色
  17.     @actor = $game_party.actors[@actor_index]
  18.    
  19.     $game_variables[FOR_SKILL_STATES] = @actor.atk
  20.     $game_variables[FOR_SKILL_STATES + 1] = @actor.str
  21.     $game_variables[FOR_SKILL_STATES + 2] = @actor.dex
  22.     $game_variables[FOR_SKILL_STATES + 3] = @actor.agi
  23.     $game_variables[FOR_SKILL_STATES + 4] = @actor.int

  24.     # 生成帮助窗口、状态窗口、特技窗口
  25.     @help_window = Window_Help.new
  26.     @status_window = Window_SkillStatus.new(@actor)
  27.     @skill_window = Window_Skill.new(@actor)
  28.     # 关联帮助窗口
  29.     @skill_window.help_window = @help_window
  30.     # 生成目标窗口 (设置为不可见・不活动)
  31.     @target_window = Window_Target.new
  32.     @target_window.visible = false
  33.     @target_window.active = false
  34.     # 执行过渡
  35.     Graphics.transition
  36.     # 主循环
  37.     loop do
  38.       # 刷新游戏画面
  39.       Graphics.update
  40.       # 刷新输入信息
  41.       Input.update
  42.       # 刷新画面
  43.       update
  44.       # 如果画面切换的话就中断循环
  45.       if $scene != self
  46.         break
  47.       end
  48.     end
  49.     # 准备过渡
  50.     Graphics.freeze
  51.     # 释放窗口
  52.     @help_window.dispose
  53.     @status_window.dispose
  54.     @skill_window.dispose
  55.     @target_window.dispose
  56.   end
  57. end
  58. class Window_Skill < Window_Selectable
  59.   #--------------------------------------------------------------------------
  60.   # ● 初始化对像
  61.   #     actor : 角色
  62.   #--------------------------------------------------------------------------
  63.   def initialize(actor)
  64.     super(0, 128, 640, 352)
  65.     @actor = actor
  66.     @column_max = 2
  67.     refresh
  68.     self.index = 0
  69.     # 战斗中的情况下将窗口移至中央并将其半透明化
  70.     if $game_temp.in_battle
  71.       self.y = 64
  72.       self.height = 256
  73.       self.back_opacity = 160
  74.     $game_variables[FOR_SKILL_STATES] = @actor.atk
  75.     $game_variables[FOR_SKILL_STATES + 1] = @actor.str
  76.     $game_variables[FOR_SKILL_STATES + 2] = @actor.dex
  77.     $game_variables[FOR_SKILL_STATES + 3] = @actor.agi
  78.     $game_variables[FOR_SKILL_STATES + 4] = @actor.int
  79.     end
  80.   end
  81. end
  82. module RPG
  83. class Skill
  84.       attr_accessor :sdag
  85.       attr_accessor :sdag_max
  86.       attr_accessor :sdag_min  
  87. #==============================================================================
  88. # 定义技能描述后缀
  89. #==============================================================================
  90.    
  91. def description
  92.       if @power != 0
  93.    
  94.   # 计算威力
  95.       sdag = power + $game_variables[FOR_SKILL_STATES + 0] * atk_f / 100
  96.       # 计算倍率
  97.       rate = 20
  98.       rate += ($game_variables[FOR_SKILL_STATES + 1] * str_f / 100)
  99.       rate += ($game_variables[FOR_SKILL_STATES + 2] * dex_f / 100)
  100.       rate += ($game_variables[FOR_SKILL_STATES + 3] * agi_f / 100)
  101.       rate += ($game_variables[FOR_SKILL_STATES + 4] * int_f / 100)
  102.       # 计算基本伤害
  103.       sdag_max = sdag * rate / 20
  104.       sdag_min = sdag * rate / 20
  105. # 分散
  106.       if variance > 0 and sdag_max.abs > 0
  107.         amp = [sdag_max.abs * variance / 100, 1].max
  108.         sdag_max += amp
  109.         sdag_min -= amp
  110.       end
  111.       if sdag != 0 or sdag != 1
  112.       if sdag<0
  113.         sdag_max=sdag_min*-1
  114.         sdag_min=(sdag*rate/20+amp)*-1
  115.       end
  116.       @sdag_max=sdag_max.to_s(10)
  117.       @sdag_min=sdag_min.to_s(10)
  118. #附加后缀     
  119. if @power<0
  120. [email protected](/@/)[0]+"治疗"+@sdag_min+"至"+@sdag_max+"生命"
  121. else
  122. [email protected](/@/)[0]+"造成"+@sdag_min+"至"+@sdag_max+"伤害"
  123. end
  124. else
  125. return description = @description.split(/@/)[0]
  126.   end
  127. else
  128.   return description = @description.split(/@/)[0]
  129.   end
  130. end


  131. end


  132. end
  133. #==============================================================================
  134. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  135. #==============================================================================
复制代码
然后是对应柳柳的技能分类显示版本:
  1. #==============================================================================
  2. #                      ★超级懒人之技能物品描述自生成系统★
  3. #说明:这个脚本几乎兼容任何脚本,可以生成技能的伤害写在描述中,也可以生成武器
  4. #      防具的表述,再也不用自己编写描述想半天写不出半个字了。
  5. #By:希望化身
  6. #
  7. #设置:角色属性存储变量(用于计算技能伤害,默认为3000-3004)
  8. FOR_SKILL_STATES = 3000
  9. #(技能分类兼容版)
  10. #==============================================================================
  11. class Scene_Skill
  12.   #--------------------------------------------------------------------------
  13.   # ● 主处理(追加读取角色属性)
  14.   #--------------------------------------------------------------------------
  15.   def main
  16.     # 获取角色
  17.     $game_variables[FOR_SKILL_STATES] = @actor.atk
  18.     $game_variables[FOR_SKILL_STATES + 1] = @actor.str
  19.     $game_variables[FOR_SKILL_STATES + 2] = @actor.dex
  20.     $game_variables[FOR_SKILL_STATES + 3] = @actor.agi
  21.     $game_variables[FOR_SKILL_STATES + 4] = @actor.int
  22.    @status_window = Window_SkillStatus.new(@actor)
  23.    @itemcommand_window = Liuliu_Window_SkillCommand.new($game_party.actors[@actor_index])
  24.    @command_index = @itemcommand_window.index
  25.    @skill_window = Liuliu_Window_SkillList.new($game_party.actors[@actor_index])
  26.    @skill_window.active = false
  27.    @help_window = Window_Help.new
  28.    @help_window.x = 0
  29.    @help_window.y = 416
  30.    @itemcommand_window.help_window = @help_window
  31.    @skill_window.help_window = @help_window
  32.    @target_window = Window_Target.new
  33.    @target_window.visible = false
  34.    @target_window.active = false
  35.    @skill_window.set_item(@itemcommand_window.commands[@command_index])
  36.    Graphics.transition
  37.    loop do
  38.      Graphics.update
  39.      Input.update
  40.      update
  41.      if $scene != self
  42.        break
  43.      end
  44.    end
  45.    Graphics.freeze
  46.    @itemcommand_window.dispose
  47.    @skill_window.dispose
  48.    @status_window.dispose
  49.    @help_window.dispose
  50.    @target_window.dispose
  51.    

  52.   end
  53. end
  54. class Liuliu_Window_SkillList < Window_Selectable
  55.   #--------------------------------------------------------------------------
  56.   # ● 初始化对像
  57.   #     actor : 角色
  58.   #--------------------------------------------------------------------------
  59.   def initialize(actor)
  60.    super(160, 0, 480, 416)
  61.    @actor = actor
  62.    refresh
  63.    self.index = 0
  64.    # 战斗中的情况下将窗口移至中央并将其半透明化
  65.    if $game_temp.in_battle
  66.      self.y = 64
  67.      self.height = 256
  68.      self.back_opacity = 160
  69.     $game_variables[FOR_SKILL_STATES] = @actor.atk
  70.     $game_variables[FOR_SKILL_STATES + 1] = @actor.str
  71.     $game_variables[FOR_SKILL_STATES + 2] = @actor.dex
  72.     $game_variables[FOR_SKILL_STATES + 3] = @actor.agi
  73.     $game_variables[FOR_SKILL_STATES + 4] = @actor.int
  74.     end
  75.   end
  76. end
  77. module RPG
  78. class Skill
  79.       attr_accessor :sdag
  80.       attr_accessor :sdag_max
  81.       attr_accessor :sdag_min  
  82. #==============================================================================
  83. # 定义技能描述后缀(兼容技能分类ver1.1)
  84. #==============================================================================
  85.    
  86. def description
  87.       if @power != 0
  88.    
  89.   # 计算威力
  90.       sdag = power + $game_variables[FOR_SKILL_STATES + 0] * atk_f / 100
  91.       # 计算倍率
  92.       rate = 20
  93.       rate += ($game_variables[FOR_SKILL_STATES + 1] * str_f / 100)
  94.       rate += ($game_variables[FOR_SKILL_STATES + 2] * dex_f / 100)
  95.       rate += ($game_variables[FOR_SKILL_STATES + 3] * agi_f / 100)
  96.       rate += ($game_variables[FOR_SKILL_STATES + 4] * int_f / 100)
  97.       # 计算基本伤害
  98.       sdag_max = sdag * rate / 20
  99.       sdag_min = sdag * rate / 20
  100. # 分散
  101.       if variance > 0 and sdag_max.abs > 0
  102.         amp = [sdag_max.abs * variance / 100, 1].max
  103.         sdag_max += amp
  104.         sdag_min -= amp
  105.       end
  106.       if sdag != 0 or sdag != 1
  107.       if sdag<0
  108.         sdag_max=sdag_min*-1
  109.         sdag_min=(sdag*rate/20+amp)*-1
  110.       end
  111.       @sdag_max=sdag_max.to_s(10)
  112.       @sdag_min=sdag_min.to_s(10)
  113. #附加后缀     
  114. if @power<0
  115. [email protected](/@/)[0]+"治疗"+@sdag_min+"至"+@sdag_max+"生命"
  116. else
  117. [email protected](/@/)[0]+"造成"+@sdag_min+"至"+@sdag_max+"伤害"
  118. end
  119. else
  120. return description = @description.split(/@/)[0]
  121.   end
  122. else
  123.   return description = @description.split(/@/)[0]
  124.   end
  125. end


  126. end
  127. end
  128. #==============================================================================
  129. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  130. #==============================================================================
复制代码
第一次发贴,不懂排版。
另外,我是新手,有bug的话,还请多多包涵,指出来,我改。
作者: 地龙    时间: 2008-11-21 02:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 菜鸟飞呀飞    时间: 2008-11-21 05:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: 希望化身    时间: 2008-11-21 12:18
嗯,这是个尖锐的问题。
这里计算出来的是忽视敌人防御力的理论伤害。
包括“爆击,抵抗(rm叫属性防御),回避,魔防,物理防御都是不计在内的”
试想,当你在选择技能,和查看技能时,你还没有一个确定的目标……所以,这些伤害减免类型的计算,就无法考虑在内了。不过我曾经想过套用使用者的这些属性,但是权衡下,还是认为忽视这些数值比较好……
作者: 越前リョーマ    时间: 2008-11-22 01:54
以下引用希望化身于2008-11-21 4:18:12的发言:

嗯,这是个尖锐的问题。
这里计算出来的是忽视敌人防御力的理论伤害。
包括“爆击,抵抗(rm叫属性防御),回避,魔防,物理防御都是不计在内的”
试想,当你在选择技能,和查看技能时,你还没有一个确定的目标……所以,这些伤害减免类型的计算,就无法考虑在内了。不过我曾经想过套用使用者的这些属性,但是权衡下,还是认为忽视这些数值比较好……

那么就显示最大伤害吧(暴击不算)。
作者: 希望化身    时间: 2008-11-22 03:01
以下引用越前リョーマ于2008-11-21 17:54:59的发言:
那么就显示最大伤害吧(暴击不算)。

嗯,我是根据battle3里面那段计算伤害算法,根据技能最大分散度,算出的最低伤害和最高伤害(理论值)
使用脚本后,会在你技能描述的最后直接添加“造成XXX至XXX点伤害”或“治疗XXX至XXX点生命”

作者: yuyinwww    时间: 2010-7-25 09:41
为啥防具回避显示2个?好像还有1个重复防具没注意看
作者: 希望化身    时间: 2010-8-9 14:18
回复 yuyinwww 的帖子

坟贴啊= =b……  这个都被您挖出来了。对于物品部分说明的附加这个脚本写的不太好,不建议继续使用,上面两段代码我都改了,只留下技能部分了。(至少我认为这个部分才是这个脚本的精华= =||)物品部分……我自己套用了“拿来主义”,拿别人的去了……(其实我在纳闷当时怎么会把处于半完成状态的物品部分发上来呢)   




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1