设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1164|回复: 3

[推荐问答] 想做一个可以持续掉SP的毒状态,但是遇到了问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
59
在线时间
50 小时
注册时间
2013-12-5
帖子
15
发表于 2015-9-23 08:17:52 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
之前对游戏里的连续伤害状态做了优化,给每个连续伤害的BUFF附加了自己的固定数值,这样就可以人为改变毒的伤害,控制每个状态的强度。

后来想新添加一个功能,就是使某个毒BUFF扣除的不是HP,而是SP。然后改写成下面这样。

RUBY 代码复制打印
  1. def slip_damage_effect
  2.     # ダメージを設定
  3.     n = 0
  4.     for i in @states
  5.       #在先前的脚本已经做了定义,每个连续伤害BUFF有自己固定的伤害值,这个值就是$data_states[i].poi。
  6.       n += $data_states[i].poi
  7.     end
  8.     #判定是否为连续伤害SP,若状态包含4号状态防御,就判定为连续伤害SP的状态。
  9.     #HP、SP都损伤的场合
  10.     if $data_states[i].guard_element_set.include?(4)
  11.       self.damage["slip"] = n
  12.       self.damage_sp["slip"] = n
  13.       # 分散
  14.       if self.damage["slip"].abs > 0
  15.         amp = [self.damage["slip"].abs * 15 / 100, 1].max
  16.         self.damage["slip"] += rand(amp+1) + rand(amp+1) - amp
  17.       end
  18.       self.hp -= self.damage["slip"]
  19.       self.sp -=  self.damage_sp["slip"]
  20.     #SP损伤的场合
  21.     elsif $data_states[i].guard_element_set.include?(3)
  22.       self.damage_sp["slip"] = n
  23.       self.sp -=  self.damage_sp["slip"]
  24.     #HP损伤的场合
  25.     else
  26.       self.damage["slip"] = n
  27.       # 分散
  28.       if self.damage["slip"].abs > 0
  29.         amp = [self.damage["slip"].abs * 15 / 100, 1].max
  30.         self.damage["slip"] += rand(amp+1) + rand(amp+1) - amp
  31.       end
  32.       # HP からダメージを減算
  33.       self.hp -= self.damage["slip"]
  34.     end
  35.     # メソッド終了
  36.     return true
  37.   end


预期的效果是这样的,就是比如说1号毒BUFF包含有3号状态防御,那么中了1号毒的人就会每回合掉固定的SP。2号毒BUFF包含有4号状态防御,那么中了2号毒的人就会每回合掉固定的HP和SP。

在角色身上只有一个毒BUFF的情况下,是可以达到这个预期效果的。但是当角色身上存在另外一个非连续伤害BUFF的时候,游戏就会将角色身上存在的另一个毒BUFF判定为只扣HP,无论这个毒BUFF是否带有3号、4号状态防御,都会被判定为默认的普通毒BUFF。请问这个BUG要怎么修复?

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 分类为推荐问答

查看全部评分

Lv2.观梦者

梦石
0
星屑
453
在线时间
191 小时
注册时间
2014-8-25
帖子
30
发表于 2015-9-26 11:27:22 | 显示全部楼层
  1.   #--------------------------------------------------------------------------
  2.   # ● 应用连续伤害效果
  3.   #--------------------------------------------------------------------------
  4.   def slip_damage_effect
  5.     # 设置伤害
  6.           a = 0
  7.           b = 0
  8.         if self.state?(42)#司幽
  9.           a += 100
  10.         end
  11.         if self.state?(16)#剑侍
  12.           a += -500
  13.           b += 200
  14.         end
  15.         if self.state?(22)#裂魂
  16.           a += self.maxhp / 50  
  17.         end
  18.         if self.state?(35)#龙息
  19.           a += self.maxhp / 50  
  20.         end
  21.         if self.state?(21)#鬼炎
  22.           a += self.maxhp / 50  
  23.         end
  24.         if self.state?(39)#玄凝诀1
  25.           b += 300
  26.         end
  27.         if self.state?(40)#玄凝诀2
  28.           b += 600
  29.         end
  30.         if self.state?(41)#玄凝诀3
  31.           b += 1000
  32.         end
  33.         if self.state?(3)#中毒
  34.           a += self.maxhp / 100         
  35.         end
  36.         if self.state?(33)#灼烧
  37.           a += self.maxhp / 100         
  38.         end
  39.         if self.state?(44)#灭魂
  40.           a += self.maxhp / 50         
  41.         end
  42.     # 计算持续性状态总得失
  43.       self.damage = a
  44.     # 分散
  45.     if self.damage.abs > 0
  46.       amp = [self.damage.abs * 15 / 100, 1].max
  47.       self.damage += rand(amp+1) + rand(amp+1) - amp
  48.     end
  49.     # HP 的伤害减法运算
  50.     self.hp -= self.damage
  51.     self.sp += b
  52.     # 过程结束
  53.     return true   
  54.   end
复制代码
将Game_Battler 3中关于连续伤害的算法改为这样的方式就可以达到你想要的效果。同理,在Game_Party中可以以同样的方式对地图损血进行修改

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

黄海有狂人,欲与日月争,还我三万六千晨
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
59
在线时间
50 小时
注册时间
2013-12-5
帖子
15
 楼主| 发表于 2015-9-29 15:38:50 | 显示全部楼层
孤云黑月 发表于 2015-9-26 11:27
将Game_Battler 3中关于连续伤害的算法改为这样的方式就可以达到你想要的效果。同理,在Game_Party中可以以 ...

谢谢你的回答!后来我用了其他的方法解决啦!先提前判定,根据BUFF是否带有某种属性防御来分别对四个变量赋值:HP伤害量,SP伤害量,HP回复量,SP回复量。
  1.   def slip_damage
  2.     n = 0
  3.     for i in @states
  4.       if $data_states[i].guard_element_set.include?($slip_all_damage_element)
  5.         if $data_states[i].poi > 0
  6.           n += $data_states[i].poi
  7.         end
  8.       elsif $data_states[i].guard_element_set.include?($slip_sp_damage_element)
  9.       else
  10.         if $data_states[i].poi > 0
  11.           n += $data_states[i].poi
  12.         end
  13.       end
  14.     end
  15.     if n != 0
  16.       n = (n / 2 + maxhp / 15) * (100 - prepoi) / 100
  17.     end
  18.     return n
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 持续SP伤害
  22.   #--------------------------------------------------------------------------
  23.   def slip_sp_damage
  24.     n = 0
  25.     for i in @states
  26.       if $data_states[i].guard_element_set.include?($slip_sp_damage_element) or $data_states[i].guard_element_set.include?($slip_all_damage_element)
  27.         if $data_states[i].poi > 0
  28.           n += $data_states[i].poi
  29.         end
  30.       end
  31.     end
  32.     if n != 0
  33.       n = (3 * n / 10 + maxsp / 15) * (100 - prepoi) / 100
  34.     end
  35.     return n
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 持续回复
  39.   #--------------------------------------------------------------------------
  40.   def slip_recover
  41.     n = 0
  42.     for i in @states
  43.       if $data_states[i].guard_element_set.include?($slip_all_damage_element)
  44.         if $data_states[i].poi < 0
  45.           n += $data_states[i].poi
  46.         end
  47.       elsif $data_states[i].guard_element_set.include?($slip_sp_damage_element)
  48.       else
  49.         if $data_states[i].poi < 0
  50.           n += $data_states[i].poi
  51.         end
  52.       end
  53.     end
  54.     if n != 0
  55.       n = n / 2 - maxhp / 15
  56.     end
  57.     return n
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● SP持续回复
  61.   #--------------------------------------------------------------------------
  62.   def slip_sp_recover
  63.     n = 0
  64.     for i in @states
  65.       if $data_states[i].guard_element_set.include?($slip_sp_damage_element) or $data_states[i].guard_element_set.include?($slip_all_damage_element)
  66.         if $data_states[i].poi < 0
  67.           n += $data_states[i].poi
  68.         end
  69.       end
  70.     end
  71.     if n != 0
  72.      n = 3 * n / 10 - maxsp / 15
  73.     end
  74.     return n
  75.   end
复制代码
然后最后再减去相应数值就可以。这样就可以做到多个毒伤害叠加,或者多个持续恢复叠加,甚至同时中了持续伤害和持续回复,还能抵消掉伤害!
  1. def slip_damage_effect
  2.     # 获取HP损伤
  3.     n = slip_damage + slip_recover
  4.     # 分散
  5.     if n != 0
  6.       self.damage["slip"] = n
  7.       if self.damage["slip"].abs > 0
  8.         amp = [self.damage["slip"].abs * 15 / 100, 1].max
  9.         self.damage["slip"] += rand(amp+1) + rand(amp+1) - amp
  10.       end
  11.       self.hp -= self.damage["slip"]
  12.     end
  13.     # 获取SP损伤
  14.     n = slip_sp_damage + slip_sp_recover
  15.     if n != 0
  16.       self.damage_sp["slip"] = n
  17.       if self.damage_sp["slip"].abs > 0
  18.         amp = [self.damage_sp["slip"].abs * 15 / 100, 1].max
  19.         self.damage_sp["slip"] += rand(amp+1) + rand(amp+1) - amp
  20.       end
  21.       self.sp -= self.damage_sp["slip"]
  22.     end
  23.     # メソッド終了
  24.     return true
  25.   end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
59
在线时间
50 小时
注册时间
2013-12-5
帖子
15
 楼主| 发表于 2015-9-29 15:42:51 | 显示全部楼层
孤云黑月 发表于 2015-9-26 11:27
将Game_Battler 3中关于连续伤害的算法改为这样的方式就可以达到你想要的效果。同理,在Game_Party中可以以 ...

后来仔细看了一下,其实层主写的适用范围更广,可以做出更加丰富的技能种类……我那样写的好处就是,在地图行进中扣血会比较好些,因为数值已经事先算好了。然后做技能的时候也会比较方便,只要勾选对应的状态防御就可以定义状态是扣血还是扣魔。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2021-10-18 10:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表