Project1

标题: 我跟你讲,VA的计算公式,赞!通过公式实现一些功能 [打印本页]

作者: 救世小树    时间: 2013-4-24 18:54
标题: 我跟你讲,VA的计算公式,赞!通过公式实现一些功能
本帖最后由 救世小树 于 2013-5-14 12:58 编辑

大家都知道,VA的技能和物品界面上,在伤害设置一栏中,有着计算公式这一项。

来一张帮助图

使用这一项,可以实现各种各样的功能,比如恢复一定比例损失的hp,mp。

防御换算成伤害减少系数来减免伤害



但是,还不够!我想要更多、更奇怪的功能。。。


所谓按公式计算,就是讲公式作为脚本来执行一遍,算出它的值并返回,
那么,只要稍微懂一点点脚本,就可以直接对公式“下手”,做出特殊的效果来。

在公式中,使用者为a,目标为b,这里的a和b实际上就是 Game_Battle 类的对象,可以是玩家,也可以是敌人。
那么在脚本编辑器里把 Game_Battle 和 Game_BattlerBase 翻上一遍就可以找到各种可以调用的方法。



下面我来抛砖引玉:
例1:
做一个技能,如果对方的HP低于一定比例,则直接秒杀,对BOSS无效。


首先新建一个技能,把其他乱七八糟设定好,

然后开始写公式,这里用的是很常用的条件表达式。   a?b:c   如果a为真则执行b不然则执行c
RUBY 代码复制
  1. ((b.hp_rate <= 0.15)&&(b.state_rate(1)!=0))?b.add_state(1):(a.mat-b.mdf)

(我也只是略懂一点,所以)为了保险起见加了很多括号。
上面的公式大致的意思就是
如果b(目标)的hp_rate(hp比率)小于等于0.15并且b(目标)对1号状态的抗性不为零
这两个条件同时满足,就执行b.add_state(1) 给目标附加1号状态;
如果不都满足,就执行(a.mat-b.mdf)来计算伤害,当然这里也可以替换成别的公式。
这里的1号状态就是大家都知道的无法战斗状态了,如果要把一个怪物设置成boss,只要这样设置:

注意,状态抗性0%并不是免疫该状态,你想杀还是可以通过攻击减少hp到0杀死的,
只是不能通过诸如“攻击时附带状态、使用技能时附加状态”之类的手段来秒杀,真正杀不死的是免疫无法战斗状态。
然后测试,通过战斗事件第零回合控血到10%,
如果是boss,(把1号状态抗性设置*0%),没问题

不是boss,被秒杀。

测试结果还不错,就是没有受到伤害然后被打倒了非常违和。
想办法补救一下,个人采用了非常蛋疼的补救方法,就是给add_state函数加上了一些奇怪的东西

然后在Game_ActionResult 里面加了一条奇怪的判断

测试效果拔群!时髦值刷的厉害“xxx就要死了!”

这里例1就算是完成啦,仿照这个例1,可以做出诸如“如果目标处于某状态,那么就秒杀”等等的技能效果


例2例3例4……

手动删除线【(a.mat-b.mdf)*(b.gurading? ? 1 : 2)】
gurad拼错了。。。还有就是va是没有 guarding? 函数的,这里应该是
(a.mat-b.mdf)*(b.gurad? ? 1 : 2)

(a.mat-b.mdf)就是拿a的魔攻减b的魔防,后面再乘一个数,
如果b是在防御的状态下,那么这个数是1,反之则是2,
这个技能对不处于防御状态的敌人有着双倍杀伤力
(防御状态下应该也有默认一半的伤害减免修正,伤害结果应该相差4倍)
换一种思维,也可以作成(a.mat-b.mdf)*(b.guard? ? 2 : 1)这种伪的“防御无效”的效果,
甚至对防御状态敌人打出更高伤害的特殊技能

(b.mhp-b.hp)*(b.hp_rate <= 0.3 ? 0.15 : 0.10)
(b.mhp-b.hp)即目标缺失的HP,后面条件表达式意思是如果b的hp_rate(就是hp与上限之比)小于等于30,那么乘以0.15,反之乘以0.1
这个技能可以作为恢复技能,如果目标血量小于30%,则回复15%缺失的hp,反之则回复10%缺失的hp

a.state?(44) ? a.mat : (a.mat-b.mdf)
如果发动者a处于44号状态,那么伤害公式为a.mat,反之则a.mat-b.mdf
这个比较奇葩,如果发动者处于某状态,那么这个技能将无视目标的魔防造成伤害,
(想想其实可以改为b.state?(44)这样目标处于某状态,某技能将无视魔防造成伤害之类的)

($game_switches[1] ? 1 : 1.5) * (a.mat-b.mdf)
如果一号开关关闭,则技能造成开关打开状态下1.5倍的伤害,这个是我瞎写的 ,没想到有什么用

($game_actors[4].skill_learn?($data_skills[44]) ? 1.5:1)*(a.mat-b.mdf)
如果4号角色学会了44号技能,那么技能伤害增加到原来的1.5倍。
这样可以做一个“火系魔法精通”的被动技能然后在所有你定义的火系魔法里加上这个判断,
这样做的缺点就是4号角色一旦学会了这个技能,其它角色甚至敌人施放此技能也有了1.5倍伤害。。。

解决方法是用 a.skill_learn?($data_skills[44]) 直接判断使用者是否学会44号技能,
不过由于Game_Enemy类是没有skill_learn?这个方法的,敌人使用此技能就要报错,设置敌人行动时要特别注意。
也可以人为在脚本Game_Enemy里添加一个永远return false 的这个方法进去,那就有点怪怪的)

各种效果,
我也想不出别的什么玩法了),大家发挥想象力吧,VA的公式功能比想象的要强大啊!


↓↓其实我也想过直接b.hp的,但是考虑到有属性修正啦,物理魔法伤害加成修正啦等等等等
↓↓于是就干脆地直接加上死亡状态了,然后又用奇葩的方法刷时髦值(笑)


公式写得太长写不下的解决方法见6楼
作者: 晴兰    时间: 2013-4-24 22:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: zhang58604616    时间: 2013-5-4 16:41
大大 能不能把下面几个例子 说明下?
作者: 救世小树    时间: 2013-5-4 21:51
zhang58604616 发表于 2013-5-4 16:41
大大 能不能把下面几个例子 说明下?

(a.mat-b.mdf)*(b.gurading? ? 1 : 2)
(a.mat-b.mdf)就是拿a的魔攻减b的魔防,后面再乘一个数,
如果b是在防御的状态下,那么这个数是1,反之则是2,
这个技能对不处于防御状态的敌人有着双倍杀伤力
(防御状态下应该也有默认一半的伤害减免修正,伤害结果应该相差4倍)
换一种思维,也可以作成(a.mat-b.mdf)*(b.gurading? ? 2 : 1)这种伪的“防御无效”的效果,
甚至对防御状态敌人打出更高伤害的特殊技能

(b.mhp-b.hp)*(b.hp_rate <= 0.3 ? 0.15 : 0.10)
(b.mhp-b.hp)即目标缺失的HP,后面条件表达式意思是如果b的hp_rate(就是hp与上限之比)小于等于30,那么乘以0.15,反之乘以0.1
这个技能可以作为恢复技能,如果目标血量小于30%,则回复15%缺失的hp,反之则回复10%缺失的hp

a.state?(44) ? a.mat : (a.mat-b.mdf)
如果发动者a处于44号状态,那么伤害公式为a.mat,反之则a.mat-b.mdf
这个比较奇葩,如果发动者处于某状态,那么这个技能将无视目标的魔防造成伤害,
(想想其实可以改为b.state?(44)这样目标处于某状态,某技能将无视魔防造成伤害之类的)

($game_switches[1] ? 1 : 1.5) * (a.mat-b.mdf)
如果一号开关关闭,则技能造成开关打开状态下1.5倍的伤害,这个是我瞎写的{:2_270:} ,没想到有什么用

($game_actors[4].skill_learn? ? 1:1.5)*(a.mat-b.mdf)
这里skill_learn?后面少了参数。。。而且后面的倍速好像也写错了实际上的应用应该是这样
($game_actors[4].skill_learn?($data_skills[44]) ? 1.5:1)*(a.mat-b.mdf)
如果4号角色学会了44号技能,那么技能伤害增加到原来的1.5倍。
这样可以做一个“火系魔法精通”的被动技能然后在所有你定义的火系魔法里加上这个判断,
这样做的缺点就是4号角色一旦学会了这个技能,其它角色甚至敌人施放此技能也有了1.5倍伤害。。。

解决方法是用 a.skill_learn?($data_skills[44]) 直接判断使用者是否学会44号技能,
不过由于Game_Enemy类是没有skill_learn?这个方法的,敌人使用此技能就要报错,设置敌人行动时要特别注意。
也可以人为在脚本Game_Enemy里添加一个永远return false 的这个方法进去,那就有点怪怪的)
作者: lirn    时间: 2013-5-8 12:01
首先,很感谢你提供的方法,这让我的思路拓宽了不少,但我毕竟是脚本盲,有一些问题还是存在。
我也有几个问题,
这些公式直接写在公示栏上?但是公式栏的长度有限(因为我使用的公式比较特殊,已经要有一些公式过长写不下了),有没有可以写在其他地方的方法?
另外,如果说((b.hp_rate <= 0.15)&&(b.state_rate(1)!=0))?b.add_state(1):(a.mat-b.mdf),如果说固定伤害,是不是可以写成这样?((b.hp_rate <= 0.15)&&(b.state_rate(1)!=0))?999999:(a.mat-b.mdf),
作者: 救世小树    时间: 2013-5-8 14:18
本帖最后由 救世小树 于 2013-5-8 14:25 编辑
lirn 发表于 2013-5-8 12:01
首先,很感谢你提供的方法,这让我的思路拓宽了不少,但我毕竟是脚本盲,有一些问题还是存在。
我也有几个 ...


首先感谢支持。
固定伤害的确可以直接那么写,但要注意由于属性修正,分散度和物理魔法伤害加成修正等因素的存在,伤害不一定就是你写的数值。


关于装备的判断:
#判断50号武器
a.weapons.include?($data_weapons[50]) ? 11111 : 2222
#判断50号防具
a.armors.include?($data_armors[50]) ? 11111 : 2222
同样注意由于怪物是没有武器防具的,我不敢肯定是不是会报错,总之别让怪物使用这种技能。。


然后就是关于公式太长,2L大大说的备注栏没有东西时可以在备注栏写多行是一个解决办法,
但是备注栏经常由于使用脚本而加入一些奇怪的东西(技能cd,物品颜色之类的),
我也不清楚怎样判断来去除,而且备注栏这样写,虽然可以写多行,但是每行写不了多少东西,
而且就像事件里的脚本功能一样,不能像脚本编辑器里那样随便换行(不知道我说的对不对)


所以这个时候就直接进脚本里改吧。
首先设置好伤害类型,伤害值直接0(写啥数其实无所谓)

然后就打开脚本编辑器吧,找到 Game_Battler 类大约是350行左右
  1.   def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     value *= item_element_rate(user, item)
  4.     value *= pdr if item.physical?
  5.     value *= mdr if item.magical?
  6.     value *= rec if item.damage.recover?
  7.     value = apply_critical(value) if @result.critical
  8.     value = apply_variance(value, item.damage.variance)
  9.     value = apply_guard(value)
  10.     @result.make_damage(value.to_i, item)
  11.   end
复制代码
我们对这一段脚本进行修改,加上判断之类的东西。
首先找到def下的第一行 “value = item.damage.eval(user, self, $game_variables)
其实这一行脚本就是按照公式进行计算。我们在它下面,加上自己的条件语句。
首先判断是否是技能(物品使用也有公式),然后再判断 id,再写公式
这时只要注意将原来公式中的 a、b、v 换成 userself$game_variables 就行了。
然后就随便你写了,想写多长就写多长,还可以换行。
例子:

可以用 if ,特殊技能比较多时建议用 case 语句
  1. case i
  2.   when 1    # 当 i 为1时执行a
  3.     a
  4.   when 2    # 当 i 为2时执行b
  5.     b
  6.   else         #都不符合,执行c(可省略这两句)
  7.     c
  8. end          #end别漏
复制代码
详见注意事项①


注意事项:
①.如果使用add_state,请勿必加上“.to_i”进行数据类型转换处理(基本上是转成0),不然弹窗报错。(在公式栏里面编辑就不会有这个问题)

②.关于换行的姿势:(我在测试时偶然发现的)

换行时要留下一些运算符之类的,要让这个式子没有下面就不完整。(应该是这样吧。。至少我的测试结果两张图是不一样的)




作者: lirn    时间: 2013-5-8 16:10
如此详细的说明,十分感谢,又有几个补充问题。

1:((b.hp_rate <= 0.15)&&(b.state?(44)!=0))?(a.mat-b.mdf):(a.mat-b.mdf)&&add_state(45)

这个公式是根据你那公式修改的,这种复数的条件附加状态是不是这样写,如果是,他们之间是不是有执行的先后顺序(顺序其实这个问题是跟我另外一个脚本有关)?

2:如果是复数判断条件呢(虽然会因为潜在可能的麻烦不一定会用到)?,比如说,装备了火之心,火系技能伤害为1.5,装备了冰之心之后伤害系数为0.5,不装备则为正常的1


3:关于其他的伤害呢?比如说我有一个技能是造成MP伤害,当MP低于一定数值时则额外造成HP伤害。
作者: 救世小树    时间: 2013-5-8 20:20
本帖最后由 救世小树 于 2013-5-8 20:21 编辑
lirn 发表于 2013-5-8 16:10
如此详细的说明,十分感谢,又有几个补充问题。

1:((b.hp_rate


关于①:
你将 ((b.hp_rate <= 0.15)&&(b.state?(44)!=0)) 作为判断条件,
这里的 b.state?(44) 含义是判断目标是否处于44号状态, 只需要((b.hp_rate <= 0.15)&&(b.state?(44))即可,
若是按照我的例1获取对该状态的抗性,是用 b.state_rate(44),也就是 ((b.hp_rate <= 0.15)&&(b.state_rate(44)!=0))
然后是问号之后的两个式子,冒号之前的式子表示前面的两个条件都满足,
就是目标HP低于15%,且(处于44号状态)(对44号状态抗性不为零),是(a.mat-b.mdf),没问题
冒号之后的式子表示两个条件有一个不满足或都不满足:
(a.mat-b.mdf)&&add_state(45)  
这么写是会出问题的:“&&”这个东西表示“”,用它将两个式子连起来,那么最后它的返回值就一定是“真”或“假”
而我们这里写的是伤害公式,必须让它的结果是一个数字。
我猜你这里是想既造成(a.mat-b.mdf)的伤害,又附加上45号状态,但是公式里写的最后必须能算出数来。
add_state(state_id) 这个方法,是给一个战斗者加上状态用的,在脚本 Game_Battler 第80行定义,没有返回值。
也就是说,如果在公式中加入 add_state(state_id) ,是没有办法算出它的值的。
解决方法有两个:
1.修改脚本,在 Game_Battler 中,给add_state()方法(80行左右)加上返回值“0”(零)就是在 if...end 之后加一行 return 0
  1. def add_state(state_id)
  2.     if state_addable?(state_id)
  3.       add_new_state(state_id) unless state?(state_id)
  4.       reset_state_counts(state_id)
  5.       @result.added_states.push(state_id).uniq!
  6.     end
  7.     return 0
  8.   end
复制代码
然后公式可以写成
((b.hp_rate <= 0.15)&&(b.state_rate(44)!=0))?(a.mat-b.mdf):((a.mat-b.mdf)+add_state(45))
((b.hp_rate <= 0.15)&&b.state?(44))?(a.mat-b.mdf):((a.mat-b.mdf)+add_state(45))
2.进行类型转换add_state(45).to_i ,结果应该也是零,和上面一样加上去就行
((b.hp_rate <= 0.15)&&(b.state_rate(44)!=0))?(a.mat-b.mdf):((a.mat-b.mdf)+add_state(45).to_i)
((b.hp_rate <= 0.15)&&b.state?(44))?(a.mat-b.mdf):((a.mat-b.mdf)+add_state(45).to_i)
最后还有一个注意事项,公式计算是在属性修正,伤害修正,物理魔法修正等等之前的,
如果你的45号状态包含了属性弱化,物理魔法弱化等限制,最终的伤害就会将它们计算在内(减防的限制不算,因为公式里用过了。)


关于②:
复数条件不能很好地写在一行内,你需要打开脚本编辑器,找到6L所说的地方,使用 if或者case 语句进行判断吧,这里提供一个范例:
按照下脚本,只需要在公式栏写上正常的公式即可,当然特殊的公式也能写。
  1.   def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3. #---------------------------------------------------------------------------------
  4. #这里写一些比较长的公式
  5. #---------------------------------------------------------------------------------
  6.     if item.is_a?(RPG::Skill)
  7.       case item.id
  8.       when 142
  9.         value = (user.mat - self.mdf) +
  10.                 10086 + (self.hp_rate < 0.3 ? 10086 : 0)
  11.       when 144
  12.         value = ((self.hp_rate <= 0.15) && (self.state_rate(1)!=0)) ?
  13.         self.add_state(1).to_i :
  14.         (user.mat-self.mdf)
  15.       end
  16.     end
  17. #-----------------------------------------------------------------------------------
  18. #这里写大类技能装备修正
  19. #---------------------------------------------------------------------------------
  20.     if item.is_a?(RPG::Skill)
  21.       case item.id
  22.       when 122,123,124,125,126,127,128#假设这些是所谓“火系魔法”
  23.         if user.armors.include?($data_armors[50])#火之心50号
  24.           value *= 1.5
  25.         end
  26.         if user.armors.include?($data_armors[51])#冰之心51号
  27.           value *= 0.5
  28.         end
  29.       when 233,234,235,236,237            #假设这些是对应的冰系技能
  30.         if user.armors.include?($data_armors[50])#火之心50号
  31.           value *= 0.5
  32.         end
  33.         if user.armors.include?($data_armors[51])#冰之心51号
  34.           value *= 1.5
  35.         end
  36.       when 333,334,335
  37.         if user.armors.include?($data_armors[55])
  38.            value *= 1.5
  39.         end
  40.       when 999

  41.       end
  42.     end
  43. #----------------------------------------------------------------------------------------
  44.     value *= item_element_rate(user, item)
  45.     value *= pdr if item.physical?
  46.     value *= mdr if item.magical?
  47.     value *= rec if item.damage.recover?
  48.     value = apply_critical(value) if @result.critical
  49.     value = apply_variance(value, item.damage.variance)
  50.     value = apply_guard(value)
  51.     @result.make_damage(value.to_i, item)
  52.   end
复制代码


③.这个就不仅仅是修一下公式就能见效的了。
其实这个东西我也一直在想。我是想做一个魔法盾的状态,有这个状态,伤害就按比例转到mp上,
mp不足就计算剩余的mp能承受多少伤害并从总伤害里扣除,然后一直不懂战斗提示信息该怎么搞。。
比起大神来我还是差得远的,至于你这里的,我可以耍耍小聪明修改一些地方来实现这个效果。。
(很坑的方法)以140号技能为例
脚本Game_ActionResult里如图所示70行左右,加些东西($开头的表示全局变量,随意命名,但注意$必须是英文输入法状态下输入的半角字符。)
  1.     if item.is_a?(RPG::Skill) && item.id == 140
  2.       $法力燃烧hp = [@mp_damage - @battler.mp,0].max
  3.     else
  4.       $法力燃烧hp = 0
  5.     end
复制代码


再往下,找到140行左右,加些东西
  1.     if $法力燃烧hp != 0
  2.       fmt = @battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
  3.       fmt = sprintf(fmt,  @battler.name, Vocab::mp, @mp_damage)
  4.       fmt += "\n" + (@battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage)
  5.       re=sprintf(fmt, @battler.name, $法力燃烧hp)
  6.       $法力燃烧hp = 0
  7.       return re
  8.     end
复制代码

再找到 Game_Battler 图示位置,添加黄色高亮
  1. self.hp -= $法力燃烧hp
复制代码

再找到 Window_BattleLog 图示位置,添加黄色高亮
  1. return if item.is_a?(RPG::Skill) && item.id == 140
复制代码
  1.     if item.is_a?(RPG::Skill) && item.id == 140
  2.       add_text(target.result.mp_damage_text)
  3.       wait
  4.       return
  5.     end
复制代码

具体行数可能会有部分差异。


作者: lirn    时间: 2013-5-11 21:57
本帖最后由 lirn 于 2013-5-12 09:41 编辑

对了,你这个能做到几率发动或者几率附加状态吗?

1:技能一定几率会附带的冰冻,如果是非BOSS,会是行动限制,如果是BOSS,几率附带另一状态。

2:比如说像梦幻西游天庭的五雷轰顶,成功则对扣减目标25%的当前血量,不成功则造成相当低的伤害。也就是成功的公式与不成功的公式不一致。

3:属性抗性是element_rate吧,那么可以不可以写成,(element_rate(10) >=100)?(a.mat-b.mdf):add_state(45).to_i + variables (6) +=1
作者: crow2006    时间: 2013-5-11 23:53
楼主的例子用纯事件就可以实现,好比我在我的游戏中设置的“感电状态”,搭配横版“0回合解除”,可以实现很多奇思妙想。
【例】具体步骤如下:
1、设置100号状态名称为:伤害判别。该状态战斗后解除、无法抵抗、能被1号状态解除、对行动无任何限制。
2、在横版设定中将上述100号状态设定:"0回合解除",就是附加该状态后轮到下一个角色行动时即解除该状态。
3、设定100号技能附加100号状态。
4、将100号状态的名称改为空白,"无POP”
5、设定必杀几率,假设是10%,那么
    100号技能执行公共事件:
    如果敌人1附加伤害判别状态
        变量500号在1--100之间取随机值
        当变量500号的值≤10时
        敌人1附加1号状态
    如果敌人2附加伤害判别状态
        变量500号在1--100之间取随机值
        当变量500号的值≤10时
        敌人2附加1号状态
    如果敌人3附加伤害判别状态
        变量500号在1--100之间取随机值
        当变量500号的值≤10时
        敌人3附加1号状态
    。。。。。。

如果要设定BOSS免疫秒杀技能,就再加一个状态设定。
接上面的例子:
1、设定200号状态名称为“秒杀”。该状态受怪物抗性影响,可以被抵抗。BOSS对此状态的抗性为F。即免疫。
2、设定100号技能再附加200号状态。
3、100号技能执行公共事件:
    如果敌人1附加伤害判别状态
        如果敌人1附加秒杀状态
        敌人1附加1号状态
    如果敌人2附加伤害判别状态
        如果敌人1附加秒杀状态
        敌人2附加1号状态
    如果敌人3附加伤害判别状态
        如果敌人3附加秒杀状态
        敌人3附加1号状态
    。。。。。。

        


作者: lirn    时间: 2013-5-12 16:56
本帖最后由 lirn 于 2013-5-12 17:08 编辑

还可以a.atk>b.atk?100:50这种

     
另外
  1. when 233,234,235,236,237            #假设这些是对应的冰系技能

  2.      if user.armors.include?($data_armors[50])#火之心50号

  3.           value *= 0.5

  4.       end

  5.              if user.armors.include?($data_armors[51])#冰之心51号

  6.           value *= 1.5
复制代码
假如同时装备了这两个装备,也就是原伤害*1.5*0.5吧。
作者: 救世小树    时间: 2013-5-13 18:59
lirn 发表于 2013-5-11 21:57
对了,你这个能做到几率发动或者几率附加状态吗?

1:技能一定几率会附带的冰冻,如果是非BOSS,会是行动限 ...

几率这个就要用随机数多写几行了(单行应该也行,但是肯定超长)
rand(100)表示取一个 0~99 的随机数
开脚本编辑器吧。
1.Game_Battler 351行左右

  1.   def make_damage_value(user, item)
  2.     if item.is_a?(RPG::Skill)
  3.       case item.id
  4.       when 44                   #44号技能
  5.         if self.state_rate(1)!=0    #非boss
  6.           self.add_state(66) if rand(100) < 40
  7.           #40%概率附加66号状态
  8.           value = 233              #这里可以写公式
  9.         else                            #boss
  10.           self.add_state(67) if rand(100) < 30
  11.           #30%概率附加67号状态
  12.           value = user.mat - self.mdf    #这里可以写公式
  13.         end
  14.       else
  15.         value = item.damage.eval(user, self, $game_variables)   
  16.     end
  17. #=======================================
  18.     value *= item_element_rate(user, item)
  19.     value *= pdr if item.physical?
  20.     value *= mdr if item.magical?
  21.     value *= rec if item.damage.recover?
  22.     value = apply_critical(value) if @result.critical
  23.     value = apply_variance(value, item.damage.variance)
  24.     value = apply_guard(value)
  25.     value += 1
  26.     @result.make_damage(value.to_i, item)
  27.   end
复制代码
2.这个一样用随机数来实现,单行公式:
  1. (rand(100)<30)?(b.hp*0.25):(a.mat-b.mdf)
复制代码
30%几率成功,不过具体伤害还是会受暴击,分散度,属性等影响,设置的时候要注意。

3.属性抗性是element_rate;但你的写法有些问题:
首先应该是 a.element_rate(10) 或 b.element_rate(10)表示是释放者或是目标对10号属性的抗性;
然后 add_state(45).to_i + variables (6) +=1 这一段:
我猜你的意思是给目标附加45号状态并且6号变量的值加1
认真查看帮助你就应该发现变量应该是用 v[] ,6号变量就是 v[6] 然后这里运算的顺序我也不是很清楚,保险起见加上括号:
(b.add_state(45).to_i +(v[6] += 1))
注意事项: v[6]+=1 的计算结果是6号变量会加1,然后返回6号变量的值,也就是说
如果6号变量的值 233,那么 (b.add_state(45).to_i +(v[6] += 1)) = 234  ;这时6号变量也变成234
  1. (b.element_rate(10) >=100)?(a.mat-b.mdf):(b.add_state(45).to_i + (v[6] +=1))
复制代码
反正就这么个意思吧,我也瞎改了一通,如果不想让6号变量的值影响伤害,可以再减一下。。。(好像写得很累赘)
  1. ((b.element_rate(10) >=100)?0:b.add_state(45).to_i) + (a.mat-b.mdf) + (v[6] +=1)-v[6])
复制代码
大概就是这么个意思,一些方法是要有执行者的,比如 add_state , element_rate ,
一定要写成 a.element_rate【user.element_rate】或是 b.add_state【self.b.add_state】这样
rand(100)求随机数是直接写的。

其实你也可以用公共事件随机数条件分歧做出这种效果。虽然有些东西事件做起来有点麻烦,但好在不容易出错。
作者: lirn    时间: 2013-5-14 00:42
本帖最后由 lirn 于 2013-5-14 01:15 编辑
  1. when 143,144,146,147,148,151
  2.          if self.gurading? && user.atk > self.atk && user.atk <= (self.atk+50)
  3.       value *= 2
复制代码
似乎这个是错的,gurading? 处发生错误
  1. when 143,144,146,147,148,151
  2.          if self.states[9].to_i && user.atk > self.atk && user.atk <= (self.atk+50)
  3.       value *= 2
复制代码
可能是因为我使用了后知后觉的横版脚本,需要改成这样才行

  1. when 673,674,675,682,683,999
  2.     if self.states[40].to_i or self.states[41].to_i
  3.           value *= 1.5
复制代码
这个的话,就算对方没有状态,也会直接造成1.5倍伤害,加了状态也是1.5
作者: 救世小树    时间: 2013-5-14 13:09
lirn 发表于 2013-5-14 00:42
似乎这个是错的,gurading? 处发生错误可能是因为我使用了后知后觉的横版脚本,需要改成这样才行这个的话, ...

突然发现我gurad是拼错了。。。
还有就是va是没有 guarding? ,vx才是这货(那时的我不知道产生了什么幻觉),
va这里应该是 guard? 恩;
if self.guard? && .....
注意别拼错(我当回反面教材了)
判断 9 号状态也可以的,就是注意要写 state?(9) 后面也不需要 .to_i 转化

  1. when 143,144,146,147,148,151
  2.          if self.state?(9) && user.atk > self.atk && user.atk <= (self.atk+50)
  3.       value *= 2
复制代码
下一个也是一样的问题,要注意是 self.state? 。

  1. when 673,674,675,682,683,999
  2.     if self.state?(40) or self.state?(41)
  3.           value *= 1.5
复制代码

作者: lirn    时间: 2013-5-14 17:10
本帖最后由 lirn 于 2013-5-14 17:11 编辑
救世小树 发表于 2013-5-14 13:09
突然发现我gurad是拼错了。。。
还有就是va是没有 guarding? ,vx才是这货(那时的我不知道产生了什么幻 ...


都进行测试过了,证实可行。

不过这当中倒有一个现象倒是值得感兴趣。
  1. elsif self.guard? && user.atk > (self.atk + 50)
  2.           value *= 2
  3.        self.add_state(58).to_i
  4.         end
复制代码
这个58号状态是禁止与解除目标防御状态的防御,我原本的乘积是3,愿意是防御*05,那么0.5*3=150(测试基础攻击为固定100),但实际伤害是300,也就是说,在最终伤害计算前,这个防御状态就被解除了。我查了一下脚本,判断防御的是在这些公式之下。

那我可不可以这些理解,这些计算公式是有着先后顺序的,那么是不是这样。

假如58状态是减少防御的,那么

value *= self.add_state(58).to_i + atk-def  的话就防御就受该BUFF影响
value *= atk-def + self.add_state(58).to_i  的话防御是不受该BUFF影响

由于命中跟回避、暴击判断都在这下面,那同样可以附加一个状态,只让该技能增加命中,暴击一类的(我修改过命中公式,实际命中为命中-回避),然后通过公共事件解除状态或者设置维持该状态到回合结束。
作者: lirn    时间: 2013-5-14 22:04
放在公式栏测试过了,确实是状态放在前面就会计算状态,放在后面就不会。
作者: lirn    时间: 2013-5-15 14:15
我在公示栏设置加命中的状态公式,发觉有时候会无法增加状态,而有时候可以,期间没动过啥,不知道原因是什么?

在脚本里写就没有问题。

这种技巧型的文章怎么不发去VA区?我觉得这个值得上推荐问题的文章了。
作者: lirn    时间: 2013-5-15 17:11
本帖最后由 lirn 于 2013-5-15 17:22 编辑

不知道原因为什么,有时候就算加了脚本,也不会有事发生。

稍微修改了一下,似乎同一技能不接受相同条件判断。

比如说,

when 22
user.agi > self.agi + 20
……


when 12 22 23 25
user.agi > (self.agi *1.2)
……

这样一来,似乎下面的那个除了12号技能之外,其余的都有效,而22号只是上面那个有效。
作者: 救世小树    时间: 2013-5-15 19:30
lirn 发表于 2013-5-15 17:11
不知道原因为什么,有时候就算加了脚本,也不会有事发生。

稍微修改了一下,似乎同一技能不接受相同条件判 ...
在公示栏设置加命中的状态公式,发觉有时候会无法增加状态,而有时候可以

造成这个的原因就比较多了。。有可能是判断的缘故导致没有执行,或者是本身写得出了些小问题什么的,过于复杂的技能计算判断最好还是写到脚本编辑器里吧。
。。恩,实际上这小技巧是我偶然所想,你能支持我真是很高兴,本来我还想发技术讨论区的,后来感觉那里没什么人气的样子。。然后就发这里了。


when 22
user.agi > self.agi + 20
……

◇ when 之后的东西要用 , (英文逗号)隔开
不过你的脚本能顺利运行不报错应该是有逗号的,好吧啰嗦几句{:2_251:} )
case语句的确是这样,有点像 if...elsif...else 的感觉。
先看到什么符合条件的,就执行,后面的条件都不管了,执行过后就跳到结尾
比如
  1. case a
  2. when 1
  3.   print "a=1"
  4. when 1,2       #注意用逗号隔开
  5.   print "a=1,2"
  6. when 2
  7.   print "a=2"
  8. end
  9. print "end"
复制代码
当 a=1 时,输出  a=1end
当 a=2 时,输出  a=1,2end
作者: lirn    时间: 2013-5-20 18:04
本帖最后由 lirn 于 2013-5-20 18:32 编辑

总结一下使用心得。

如果设置了两个以上的判断公式(value *= ),那么只会有一个起效果,所以如果你想多弄,判断方式,那都只能设置在一个,比如我设置了一个技能要判断敏捷和对方防御,就只能这些写,必须写在一个地方。

if agi >100 && !self.guard?
elsif agi >100 && self.guard?
elsif agi <100 && self.guard?





我设置了技能暴击+50%,同时一个公共事件,等技能使用完毕之后就马上解除临时。但发现并没有额外增加暴击几率。后来把这个公共事件删除之后,暴击率就明显出现了。难道公共事件解除状态是判断在命中与暴击判断之前?

关于法力燃烧那里,我倒想设置成两个公式可不可以?
比如说HP伤害=公式1,;MP伤害=公式2.
作者: 救世小树    时间: 2013-5-20 19:52
本帖最后由 救世小树 于 2013-5-20 19:54 编辑
lirn 发表于 2013-5-20 18:04
总结一下使用心得。

如果设置了两个以上的判断公式(value *= ),那么只会有一个起效果,所以如果你想多 ...


关于暴击:
这里是我先前搞错了,额,不好意思了,仔细看了下 Game_Battler 中的 item_apply ,发现计算是否暴击是在计算伤害之前,
而计算暴击修正只是将伤害根据是否暴击乘了个倍数。。

也就是说是否是暴击在计算伤害前就已经确定了。。。
这样的话想做出你所需要的效果,纯事件就简单得多了。。。
我记得以前看过一个帖子。。本体好像是使用技能前显示图片,
他说事件当中有一个强制战斗指令的,然后我就默默记下了,还有状态法巧解“对xxx无效”的做法也是从那里学的:
首先,角色使用的技能(马甲技能)

还有真正使用的本体技能

然后,相关的状态(加暴击的状态就不上了)

和最重要的公共事件

黄色高亮是重点
测试效果拔群,不算太复杂,值得一试。

P.S.默认脚本公共事件的判定一定是在最后的。

关于法力燃烧;
这个是先算技能能烧的mp,然后再算现有的mp够不够,缺多少mp,不够的mp用hp扣,不是特别方便设双公式,
要设定也可以,那肯定是首先要算烧多少mp,主要就是算来算去的问题了。


  1. if item.is_a?(RPG::Skill) && item.id == 140
  2.   tem = [@mp_damage - @battler.mp ,0].max
  3.   $法力燃烧hp = (tem*(1+self.mhp/200.0)).to_i      #以目标的hp上限修正法力燃烧的去血量200点变为原来的2倍,400点3倍等等
  4.   $法力燃烧hp = (tem*100.0/(100+self.mdf)).to_i   #以目标魔防修正去血量,100点魔防变为原来一半,200点变1/3、、、
  5.   #等等等等,最简单的就是 $法力燃烧hp=(1.5*tem).to_i
  6. else
  7.   $法力燃烧hp = 0
  8. end
复制代码

作者: lirn    时间: 2013-5-20 23:04
crow2006 发表于 2013-5-11 23:53
楼主的例子用纯事件就可以实现,好比我在我的游戏中设置的“感电状态”,搭配横版“0回合解除”,可以实现 ...

我这个是当附加必杀,既然是先判断必杀,那么我就在判断必杀前先加上状态,于是我尝试在这里增加判断条件,
  1. #--------------------------------------------------------------------------
  2.   # ● 应用技能/物品的效果
  3.   #--------------------------------------------------------------------------

  4.   def item_apply(user, item)             
  5.     if item.is_a?(RPG::Skill) && item.id ==87
  6.           if user.agi >= (self.agi * 1.2)
  7.             user.add_state(457).to_i
  8.           end
  9.         end
  10.     @result.clear
复制代码
这样就能做到可以条件附加必杀,至少在我通过更改敏捷的更改发现必杀的变化,但是如果是这种的话,那就必须要通过公共事件解除临时状态,如果是回合结束时候自动解除,那么下一回合就会出现无法附加临时状态的情况。


另外,关于法力燃烧,我想我们之间的理解不一样吧。我的意思是这样的。

技能A=======》造成MP伤害

如果对象B附带某状态C时。

技能A======》造成MP伤害+HP伤害。

我是希望,这两个伤害都可以通过各自公式确定。
作者: 姬文翔    时间: 2013-5-22 02:18
能不能利用这个做出技能使用方在某种状态下,技能的威力有加成的效果呢?
作者: 救世小树    时间: 2013-5-24 10:51
本帖最后由 救世小树 于 2013-5-24 10:53 编辑
lirn 发表于 2013-5-20 23:04
我这个是当附加必杀,既然是先判断必杀,那么我就在判断必杀前先加上状态,于是我尝试在这里增加判断条件 ...

另外,关于法力燃烧,我想我们之间的理解不一样吧。我的意思是这样的。

技能A=======》造成MP伤害

如果对象B附带某状态C时。

技能A======》造成MP伤害+HP伤害。

我是希望,这两个伤害都可以通过各自公式确定。


这样就好做了,首先新建一个技能

然后脚本Game_Battler

最后测试

成功,28号状态和145号技能自己设定吧;
相关脚本:

  1.   def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     if item.is_a?(RPG::Skill)
  4.       case item.id
  5.       when 145
  6.         if self.state?(28)
  7.            make_damage_extra(user,item)
  8.         end
  9.       end
  10.     end
  11.     value *= item_element_rate(user, item)
  12.     value *= pdr if item.physical?
  13.     value *= mdr if item.magical?
  14.     value *= rec if item.damage.recover?
  15.     value = apply_critical(value) if @result.critical
  16.     value = apply_variance(value, item.damage.variance)
  17.     value = apply_guard(value)
  18.     @result.make_damage(value.to_i, item)
  19.   end
  20.   def make_damage_extra(user,item)
  21.     if item.is_a?(RPG::Skill)
  22.       case item.id
  23.       when 145
  24.         value = user.mat - self.mdf
  25.         #↑↑↑↑↑↑↑↑写hp伤害的公式,底下的各种修正很据情况可删可留
  26.         #user→a  self→b
  27.         value *= item_element_rate(user, item)
  28.         value *= pdr if item.physical?
  29.         value *= mdr if item.magical?
  30.         value *= rec if item.damage.recover?
  31.         value = apply_critical(value) if @result.critical
  32.         value = apply_variance(value, item.damage.variance)
  33.         value = apply_guard(value)
  34.       end
  35.       @result.hp_damage = value.to_i
  36.     end
  37.   end
复制代码

作者: 姬文翔    时间: 2013-5-26 03:57
谢谢大家的指教~俺已经利用这里的资料成功做出了之前想破头都想不到实现方法的东西
作者: 紫苍焰    时间: 2013-6-4 07:06
……
那个,问一下,附加状态里有个物理攻击100%,记得默认的1号技能攻击就有这个……
这东西实现的是什么效果啊?
作者: 紫苍焰    时间: 2013-7-2 08:23
……
好的,继续在这里提问……
如何做到用目标为敌人的技能同时给自己附加某种状态……
作者: ninesound    时间: 2013-7-5 09:46
本帖最后由 ninesound 于 2013-7-5 09:47 编辑
救世小树 发表于 2013-5-24 10:51
这样就好做了,首先新建一个技能

然后脚本Game_Battler


成功,28号状态和145号技能自己设定吧;
相关脚本:

  def make_damage_value(user, item)
    value = item.damage.eval(user, self, $game_variables)
    if item.is_a?(RPG::Skill)
      case item.id
      when 145
        if self.state?(28)
           make_damage_extra(user,item)
        end
      end
    end
    value *= item_element_rate(user, item)
    value *= pdr if item.physical?
    value *= mdr if item.magical?
    value *= rec if item.damage.recover?
    value = apply_critical(value) if @result.critical
    value = apply_variance(value, item.damage.variance)
    value = apply_guard(value)
    @result.make_damage(value.to_i, item)
  end
  def make_damage_extra(user,item)
    if item.is_a?(RPG::Skill)
      case item.id
      when 145
        value = user.mat - self.mdf
        #↑↑↑↑↑↑↑↑写hp伤害的公式,底下的各种修正很据情况可删可留
        #user→a  self→b
        value *= item_element_rate(user, item)
        value *= pdr if item.physical?
        value *= mdr if item.magical?
        value *= rec if item.damage.recover?
        value = apply_critical(value) if @result.critical
        value = apply_variance(value, item.damage.variance)
        value = apply_guard(value)
      end
      @result.hp_damage = value.to_i
    end
  end


请问如果是多个技能都要这样子写该怎么办呢?

我照你的方法添加第二个技能
第一个就失效了
作者: 救世小树    时间: 2013-7-5 11:16
ninesound 发表于 2013-7-5 09:46
请问如果是多个技能都要这样子写该怎么办呢?

我照你的方法添加第二个技能

那就再来一组状态/技能

  1.   def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     if item.is_a?(RPG::Skill)
  4.       case item.id
  5.       when 145
  6.         if self.state?(28)
  7.            make_damage_extra(user,item)
  8.         end
  9.       ####################
  10.       when 146
  11.         if self.state?(29)
  12.            make_damage_extra(user,item)
  13.         end
  14.       ####################
  15.       end
  16.     end
  17.     value *= item_element_rate(user, item)
  18.     value *= pdr if item.physical?
  19.     value *= mdr if item.magical?
  20.     value *= rec if item.damage.recover?
  21.     value = apply_critical(value) if @result.critical
  22.     value = apply_variance(value, item.damage.variance)
  23.     value = apply_guard(value)
  24.     @result.make_damage(value.to_i, item)
  25.   end
  26.   def make_damage_extra(user,item)
  27.     if item.is_a?(RPG::Skill)
  28.       case item.id
  29.       when 145,146 #加上另一个技能id
  30.         value = user.mat - self.mdf if self.state?(28)    #写出28号状态对应145技能的hp伤害公式【mp公式在技能面板写】
  31.         value = 2*user.mat - self.mdf if self.state?(29)#写出29号状态对应146技能的hp伤害公式【mp公式在技能面板写】
  32.         #↑↑↑↑↑↑↑↑写hp伤害的公式,底下的各种修正很据情况可删可留
  33.         #user→a  self→b
  34.         value *= item_element_rate(user, item)
  35.         value *= pdr if item.physical?
  36.         value *= mdr if item.magical?
  37.         value *= rec if item.damage.recover?
  38.         value = apply_critical(value) if @result.critical
  39.         value = apply_variance(value, item.damage.variance)
  40.         value = apply_guard(value)
  41.       end
  42.       @result.hp_damage = value.to_i
  43.     end
  44.   end
复制代码

作者: ninesound    时间: 2013-7-5 12:56
救世小树 发表于 2013-7-5 11:16
那就再来一组状态/技能

谢谢回答
可是还有一些问题

when 235,236
        value = 公式1 if self.state?(29)   
        value = 公式2 if self.state?(29)

我是235,236两个技能
而我的目标状态都要同一个 29

不同技能打下去会不同公式

可是我235和236两个技能都只会用公式2去运算而已
作者: 救世小树    时间: 2013-7-6 09:46
ninesound 发表于 2013-7-5 12:56
谢谢回答
可是还有一些问题

可以变通一下,用技能编号来分歧~注意各种细节上的变化~

  1.   def make_damage_extra(user,item)
  2.     if item.is_a?(RPG::Skill)
  3.       case item.id
  4.       when 235
  5.         value = user.mat - self.mdf if self.state?(29)   
  6.       when 236
  7.         value = 2*user.mat - self.mdf if self.state?(29)
  8.       end
  9.       value *= item_element_rate(user, item)
  10.       value *= pdr if item.physical?
  11.       value *= mdr if item.magical?
  12.       value *= rec if item.damage.recover?
  13.       value = apply_critical(value) if @result.critical
  14.       value = apply_variance(value, item.damage.variance)
  15.       value = apply_guard(value)
  16.       @result.hp_damage = value.to_i
  17.     end
复制代码

作者: ninesound    时间: 2013-7-6 14:18
本帖最后由 ninesound 于 2013-7-6 14:32 编辑
救世小树 发表于 2013-7-6 09:46
可以变通一下,用技能编号来分歧~注意各种细节上的变化~


非常感谢哦
如果要再加入判断武器
是不是我这样子写就可以了?


RUBY 代码复制
  1. def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     if item.is_a?(RPG::Skill)
  4.       case item.id
  5.       when 101,102
  6.         if user.armors.include?($data_armors[50])
  7.            value 101= 1.5
  8.            end
  9.        if user.weapons.include?($data_weapons[51])
  10.           value 102 = 2.5
  11.         end
  12.       when 999
  13.       end
  14.     end #判断武器防具
  15. ####################
  16.       when 235
  17.         if self.state?(57)
  18.            make_damage_extra(user,item)
  19.          end
  20.          ####################
  21.       when 232
  22.         if self.state?(57)
  23.            make_damage_extra(user,item)
  24.         end
  25.       ####################
  26.       end
  27.     end
  28.     value *= item_element_rate(user, item)
  29.     value *= pdr if item.physical?
  30.     value *= mdr if item.magical?
  31.     value *= rec if item.damage.recover?
  32.     value = apply_critical(value) if @result.critical
  33.     value = apply_variance(value, item.damage.variance)
  34.     value = apply_guard(value)
  35.     @result.make_damage(value.to_i, item)
  36.   end
  37.   def make_damage_extra(user,item)
  38.         if item.is_a?(RPG::Skill)
  39.       case item.id
  40.       when 235
  41.         value = user.mat * 10
  42.       when 232
  43.         value =  ( a.atk* 5 + a.mat * 9 ) * 1.5
  44.         #↑↑↑↑↑↑↑↑写hp伤害的公式,底下的各种修正很据情况可删可留
  45.         #user→a  self→b
  46.     end
  47.       value *= item_element_rate(user, item)
  48.       value *= pdr if item.physical?
  49.       value *= mdr if item.magical?
  50.       value *= rec if item.damage.recover?
  51.       value = apply_critical(value) if @result.critical
  52.       value = apply_variance(value, item.damage.variance)
  53.       value = apply_guard(value)
  54.       @result.hp_damage = value.to_i
  55.     end   
  56.     end

作者: 救世小树    时间: 2013-7-6 17:44
ninesound 发表于 2013-7-6 14:18
非常感谢哦
如果要再加入判断武器
是不是我这样子写就可以了?

额,其实问题还是不少,
第7行和第10行:value 101= 公式1
                           value 102= 公式2
这样的写法是不对的, value 就是计算结果,后面再加个101,102 什么的电脑就不认了,也没有必要加这玩意儿。
我们再来从头理一遍。
首先这个脚本修改是未来做一个法力燃烧的技能,这个技能造成mp伤害,当目标处在某状态时,额外在造成hp伤害。
然后我们想要把两个公式(hp伤害和mp伤害)写出来,这一段脚本中有两个方法,make_damage_value 和 make_damage_extra
其中 make_damage_value 是原本的计算伤害的公式,我们所编辑的技能的设定就是造成mp伤害,因此这里的value是mp伤害的计算,
这个公式是直接在技能编辑面板的公式框里写的,如果你是想写hp伤害的公式,就务必看下面那个
def make_damage_extra - end 。

运行原理是在计算伤害时施加判定,如果自身处于某种状态,那么就利用 make_damage_extra 来附加额外的hp伤害

然后是语句结构, if-end、case-end 是成对出现的,其中 when 只能出现在某对 case-end 之间,你脚本中的第一个 when 235 when 232 都是错误语句,运行会报错



我重新写了一下,注意注释

  1. def make_damage_value(user, item)
  2.     value = item.damage.eval(user, self, $game_variables)
  3.     if item.is_a?(RPG::Skill)

  4. #================================
  5.       case item.id
  6.       when 101,102
  7.         if user.armors.include?($data_armors[50])
  8.           value =公式1
  9.        end
  10.        if user.weapons.include?($data_weapons[51])
  11.          value = 公式2
  12.        end
  13.       #这里的公式是101,102号技能的对mp伤害(如果你的技能面板就是那样设定的话)
  14.       #并且覆盖了你在技能数据库里设定的101,102号技能的原公式,
  15.       #如果不需要,请从case item.id 到 when 999 end都删除吧
  16.       when 999
  17.       end
  18. #================================

  19.       if self.state?(57) or self.state?(58)  #这里写下你需要的特殊状态
  20.         make_damage_extra(user,item)
  21.       end

  22.     end

  23.     value *= item_element_rate(user, item)
  24.     value *= pdr if item.physical?
  25.     value *= mdr if item.magical?
  26.     value *= rec if item.damage.recover?
  27.     value = apply_critical(value) if @result.critical
  28.     value = apply_variance(value, item.damage.variance)
  29.     value = apply_guard(value)
  30.     @result.make_damage(value.to_i, item)
  31.   end
  32.   def make_damage_extra(user,item)
  33.     if item.is_a?(RPG::Skill)
  34.       case item.id
  35.       when 235
  36.         value = user.mat * 10
  37.       when 232
  38.         value =  ( a.atk* 5 + a.mat * 9 ) * 1.5
  39.         #↑↑↑↑↑↑↑↑写hp伤害的公式,底下的各种修正很据情况可删可留
  40.         #user→a  self→b
  41.       when 101,102  #写在这里就算是hp伤害了
  42.         if user.armors.include?($data_armors[50])
  43.           value =公式1
  44.        end
  45.        if user.weapons.include?($data_weapons[51])
  46.          value = 公式2
  47.       else
  48.         return#添加了这个,如果以上的情况都不符合,那么直接结束这个方法
  49.       end
  50.       value *= item_element_rate(user, item)
  51.       value *= pdr if item.physical?
  52.       value *= mdr if item.magical?
  53.       value *= rec if item.damage.recover?
  54.       value = apply_critical(value) if @result.critical
  55.       value = apply_variance(value, item.damage.variance)
  56.       value = apply_guard(value)
  57.       @result.hp_damage = value.to_i
  58.     end   
  59.   end
复制代码
emmm没啥可说的了,个人觉得你可以先去学一下脚本,至少把变量控制语句什么的搞清楚,再来修改脚本就事倍功半了,磨刀不误砍柴工嘛~
作者: david_ng223    时间: 2013-7-8 10:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: lirn    时间: 2013-7-8 13:11
最近看到别人对于回避之后发生的事情,那么理论上,应该也能够做得出,当必杀发生时,会额外附加效果的吧。
作者: 我爱吴悦淇    时间: 2013-7-8 18:00
给个范例不
作者: lirn    时间: 2013-7-10 00:17
david_ng223 发表于 2013-7-8 10:08
我的遊戲中有數百個技能,
剛設置了個叫飛翔的狀態(各回避率+100%,即所有技能都不能擊中),
請問怎樣使敵 ...

那样直接写公式里可以?
作者: 火烧兔子    时间: 2013-7-10 21:56
狮驼岭的技能也行吗?
就是一个技能要在某号状态下才能使用,没有这个状态就不能用。
作者: wai781300    时间: 2013-9-5 11:11
既然可以透過
判定 是否能力強化、狀態 改變計算公式
可否做到判定 是否能力強化、狀態 等改變該技能命中率?

例: 對方敏捷上升時 命中率增加 else 命中率不變?
作者: lirn    时间: 2013-9-9 16:06
wai781300 发表于 2013-9-5 11:11
既然可以透過
判定 是否能力強化、狀態 改變計算公式
可否做到判定 是否能力強化、狀態 等改變該技能命中率 ...

关于增加暴击,增加命中率的方法不能在公式里直接实现,但可以实现,你可以爬爬楼,应该在3-4楼里我说过的。
作者: 精灵使者    时间: 2013-9-9 22:12
本帖最后由 精灵使者 于 2013-9-9 22:13 编辑

精灵温馨提示:RMXP等其他里面,战斗不能也可以做成一种状态(参考我做的即死魔法)
作者: xujintao    时间: 2013-9-13 09:01
有用.好帖子
作者: lirn    时间: 2013-9-15 21:00
对了,回复该怎么做?

我想做一个消耗道具回复的技能。虽然有技能消耗物品的脚本,但是我怕脚本太多会冲突。
作者: 极地羽翼    时间: 2013-9-22 00:03
虽然没有全部看懂……但是至少知道了原来等级也可以用来写公式
作者: salvareless    时间: 2013-10-30 22:38
请问~~~~~~~

伤害计算公式是否允许使用对数运算。如果是,该怎么写呢= =

希望把护甲对伤害的见面做成魔兽那种,只有几点的时候就已经具备较好的减免值,但是随着护甲值的提高,减免效果的提升逐渐下降。(例如5点护甲可以减免25%,10点的时候却只能减免35%,30点的时候才能40%,100点才能50%这样。)

查过魔兽的内核公式,其中涉及到对数的运算方式,就是不知道VA能不能用对数运算,以及怎么写公式。

特地过来求教。
作者: lc19801203    时间: 2013-11-1 20:30
确实。看到大家的讨论,非常拓宽思路
作者: lc19801203    时间: 2013-11-1 21:23
lirn 发表于 2013-9-15 21:00
对了,回复该怎么做?

我想做一个消耗道具回复的技能。虽然有技能消耗物品的脚本,但是我怕脚本太多会冲突 ...

技能触发公共事件。
作者: z2z4    时间: 2013-11-20 08:59
比如 体力值伤害  在进攻的时候 恢复自己一定的伤害  不知道这样可以不可以  应该只有体力值吸收才可以
生如朝露 = (a.hhp - a.hp) * (20 + a.luk / 200.0) #恢复一定的损失比例

      when 1..999
        if a.skill_learn? $data_skills[183]
          生如朝露
        end  
      end
作者: 火烧兔子    时间: 2013-11-20 10:27
嗯……这个帖子对于喜爱战斗的作者来说就像宝藏一样

虽然是VA的,但是通过修改脚步的方法也可以在VXxp中使用
作者: a000b1745    时间: 2013-11-26 15:35
請問敵人的人數要用什麼參數寫法判斷???
作者: greelmr1981    时间: 2014-1-5 16:09
那么如果我想在使用技能后同时使某个变量改变(加减)该如何写呢?

我试了在技能的伤害计算公式空格处写了a.atk*4-b.def*2+v[100]+=1

虽然100号变量实现+1了,但是伤害本身却变了。

PS:后来改成了(a.atk*4-b.def*2+v[100]+=1)-v[100],这样虽然实现我想要的功能了,但我想会有比这个蠢办法更简单的表达方式吧?
作者: lirn    时间: 2014-3-14 20:48
可不可可以选择对象?比如说,己方全体对自己无效,或者技能对特定角色无效。

虽然,设置一些特殊的抗性作为标记也可以,不过还是想问问,如果是对角色,那该怎么去写?
作者: lirn    时间: 2014-3-15 14:06
另外,如果是道具的,那么就是
if item.is_a?(RPG::item)
      case item.id

其余的都一样吧。
作者: llkrm    时间: 2014-4-11 22:07
...自己做了很多技能,还是有些效果做不出来

1 每次普通攻击会损耗5%目标最大法力值,并且造成该数值的额外伤害
2 每次普通攻击造成伤害后会对其他敌人造成25%的溅射伤害
3 每次普通攻击恢复4%已损失的生命
4 每次普通攻击消耗自己6%最大法力值,并且对目标造成该数值的额外伤害
。。。。{:2_276:}这咋整?

作者: yihe74    时间: 2014-4-13 23:57
本帖最后由 yihe74 于 2014-4-14 00:06 编辑
llkrm 发表于 2014-4-11 22:07
...自己做了很多技能,还是有些效果做不出来

1 每次普通攻击会损耗5%目标最大法力值,并且造成该数值的额 ...


主要要修改一号技能的伤害公示,把每种效果写成公式,加到脚本编辑器里,应该会比较复杂,
把你的每个发球效果做成状态,技能附加状态,伤害公示里面判断状态用不同的公示
我的工程里有这样一个效果,装备了70号武器,普通攻击附加40点神圣伤害
那么我是这样写的
if item.is_a?(RPG::Skill)
      case item.id
      when 1
        q=user.atk - user.atk*self.def/(100+self.def) #基础攻击伤害
        o=user.weapons.include?($data_weapons[70])? 40 : 0#是否装备70号武器?是的话附加伤害
      value = o+q  #最终伤害值为基础伤害加法球伤害
     end
    end
作者: 清远    时间: 2014-5-23 11:04
楼主在不在呀,看了这个帖子,解决了我很多的疑问
我想问一个问题,
就是状态有效度的判断应该怎么写
之前看完了 只看到属性有效度
但是我现在要状态的怎么写呢 谢谢楼主
比如对火焰的有效度是150% 脚本怎么写呢
作者: taroxd    时间: 2014-5-23 14:35
本帖最后由 taroxd 于 2014-5-23 16:01 编辑
清远 发表于 2014-5-23 11:04
楼主在不在呀,看了这个帖子,解决了我很多的疑问
我想问一个问题,
就是状态有效度的判断应该怎么写


element_rate(火属性的id)

作者: 清远    时间: 2014-5-27 08:39
taroxd 发表于 2014-5-23 14:35
element_rate(火属性的id)

哟西,感谢大神,已经解决了,谢谢
作者: vince3725    时间: 2014-11-14 15:00
马克~
作者: greelmr1981    时间: 2014-12-23 20:41
本帖最后由 greelmr1981 于 2014-12-24 10:45 编辑

抱歉这么久还挖这个上来,我试着按顶楼的方式弄了一个技能:当A学习了161号技能后这个技能的伤害提高35%。

于是公式就写成这样了:(a.skill_learn?($data_skills[161])?1.35:1)*(a.atk+0.5*a.agi-b.def)

但是实际测试却无法实现这35%的增幅,请问我这个公式到底哪里写错了呢?


#编辑#

终于弄明白了,skill_learn只能判定角色职业界面那些可学习的技能,如果在里面没有,便没法判定了,我好蠢……
作者: 纸人    时间: 2015-2-9 23:05
楼楼,我想问一个问题
怎么实现回合的计算呢?
比如治疗术:目标每回合恢复20%的血值,持续3回合
       祝福术:目标物理攻击上升10%,持续3回合
作者: brackwind    时间: 2015-2-24 13:37
請問若是要做出類似神奇寶貝的捨身攻擊,攻擊敵人時自己也會受一點傷害
是否也修改公式就行了?
作者: 紫苍焰    时间: 2015-4-26 15:13
突然想到……虽然也可能有其他人想到过了……
判断是否存在某状态,是则解除该状态,否则附加该状态是不是也可以实现?
通过状态可以做出开关类型的技能了嗯。只要不选战斗结束时解除……
作者: 乌烟瘴气12138    时间: 2015-8-19 11:59
greelmr1981 发表于 2014-1-5 16:09
那么如果我想在使用技能后同时使某个变量改变(加减)该如何写呢?

我试了在技能的伤害计算公式空格处写了 ...

如果我的变量赋值为1,我书写为10 * a.luk * v[1],为什么没有伤害
作者: 1119062604    时间: 2015-10-18 12:35
本帖最后由 1119062604 于 2015-10-18 12:41 编辑

对不起挖坟了,我做了一个技能,效果是让自身所有剑系技能获得伤害加成,但每使用一次会获得debuff。
可是我一但使用这个技能就会报错。
技能公式是:a.state?(56) ? 250 + a.atk * 1.85 a.add_state(47) : (250 + a.atk * 1.45)

制作成功了,对不起,如果我再仔细研究就不会挖坟了……(;´Д`)
作者: vixv    时间: 2018-10-14 05:17
赞啊啊啊啊啊
作者: cm128696    时间: 2018-10-27 00:45
本帖最后由 cm128696 于 2018-10-27 23:55 编辑

想請教一下,假設自己在用完技能後給予敵人傷害並同時提高自己的強化狀態要怎麼寫??
自己用 t = 100 + a.atk * 4 - b.def * 2; a.add_buff(1 ); t
打出來被隔檔沒傷害
[line]

自己研究了解決方法才發現少打了東西
x.add_buff(能力提升ID,回合數)
這樣才是對的
[/line]


作者: 造小梦    时间: 2019-7-17 15:40
我想做一个技能,当敌人处于0号状态时技能必定暴击,这种技能该怎么做?
作者: 真の玛娜君    时间: 2019-7-17 15:58
本帖最后由 真の玛娜君 于 2019-7-17 15:59 编辑
造小梦 发表于 2019-7-17 15:40
我想做一个技能,当敌人处于0号状态时技能必定暴击,这种技能该怎么做?


状态:X属性伤害*200%
技能:属性:X属性
公式大概只能这么做,事件虽然可能能做,但是限制很大,只能你自己写脚本了。
作者: 真の玛娜君    时间: 2019-10-3 11:40
分享个自己研究的公式:
a.atk*4/(b.hp/b.mhp+0.2)-b.def*2    #随着目标生命值降低提高伤害,上限是5倍,在80%及以上(无增幅还会减伤)50%(1.4倍左右)25%(2倍+)10%(3倍+)
因为单纯的按已损失血量打BOSS太BUG才研究的




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