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

Project1

 找回密码
 注册会员
搜索
楼主: 救世小树
打印 上一主题 下一主题

[原创发布] 我跟你讲,VA的计算公式,赞!通过公式实现一些功能

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
11
发表于 2013-5-12 16:56:38 | 只看该作者
本帖最后由 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 19:03
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
276 小时
注册时间
2011-6-5
帖子
133
12
 楼主| 发表于 2013-5-13 18:59:22 | 只看该作者
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)求随机数是直接写的。

其实你也可以用公共事件随机数条件分歧做出这种效果。虽然有些东西事件做起来有点麻烦,但好在不容易出错。
研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这话句后,才发这现里的字全是都乱的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
13
发表于 2013-5-14 00:42:49 | 只看该作者
本帖最后由 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
276 小时
注册时间
2011-6-5
帖子
133
14
 楼主| 发表于 2013-5-14 13:09:33 | 只看该作者
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
复制代码
研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这话句后,才发这现里的字全是都乱的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
15
发表于 2013-5-14 17:10:05 | 只看该作者
本帖最后由 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影响

由于命中跟回避、暴击判断都在这下面,那同样可以附加一个状态,只让该技能增加命中,暴击一类的(我修改过命中公式,实际命中为命中-回避),然后通过公共事件解除状态或者设置维持该状态到回合结束。

点评

②这个计算顺序写单行我还真不敢妄下定论,你可以单独一行self.add_state(58)然后第二行value = user.atk-self.def  发表于 2013-5-14 21:45
①的确是有顺序的,脚本make_damage_value方法,默认是先算公式,然后属性,物理,魔法,回复比率,暴击,离散,防御,一行对应一个.最后一句计算完毕输出到result中  发表于 2013-5-14 21:43
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
16
发表于 2013-5-14 22:04:46 | 只看该作者
放在公式栏测试过了,确实是状态放在前面就会计算状态,放在后面就不会。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
17
发表于 2013-5-15 14:15:49 | 只看该作者
我在公示栏设置加命中的状态公式,发觉有时候会无法增加状态,而有时候可以,期间没动过啥,不知道原因是什么?

在脚本里写就没有问题。

这种技巧型的文章怎么不发去VA区?我觉得这个值得上推荐问题的文章了。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
18
发表于 2013-5-15 17:11:06 | 只看该作者
本帖最后由 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号只是上面那个有效。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
276 小时
注册时间
2011-6-5
帖子
133
19
 楼主| 发表于 2013-5-15 19:30:16 | 只看该作者
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

点评

实际上我是有用逗号的,不是这个问题。  发表于 2013-5-15 20:49
研表究明,汉字的序顺并不定一能影阅响读,比如当你看完这话句后,才发这现里的字全是都乱的
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1019 小时
注册时间
2012-4-25
帖子
799
20
发表于 2013-5-20 18:04:44 | 只看该作者
本帖最后由 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.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 16:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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