Admin 发表于 2022-12-7 14:55:46

伤害公式


编号 伤害类型 公式 注解
1基本公式a.atk * 4 - b.def * 2被指定为默认的通常攻击。
a:执行技能、道具的一方(自己)b:技能、道具受影响的一方(对方)
参考:小学基础数学四则运算
+:加法 -:减法 *:乘法 /:除法

2无视防御a.atk * 4基本公式中,不使用防御公式
3其他属性的利用a.atk * 4 - b.def * 2 + a.luk把自己的运气属性加到伤害当中
其他属性:
mhp:最大HP
mmp:最大MP
atk:攻撃力 def:防御力 mat:魔法力 mdf:魔法防御
agi:敏捷性 luk:运气 hit:命中率 eva:回避率 cri:会心率
cev:会心回避 mev:魔法回避 mrf:魔法反射 cnt:反撃率
hrg:HP再生率 mrg:MP再生率 trg:TP再生率
tgr:成为目标率 grd:防御効果率 rec:回復効果率 mcr:MP消費率
tcr:TP获得率 pdr:物理伤害率 mdr:魔法伤害率
fdr:地面伤害率 exr:经验获得率
4变量的使用v * 2 (n:变量ID)変量的2倍
5比例伤害1Math.floor(b.hp / 2)目标现在的HP变为二分之一
参考:Math.floor
结果可能变为小数的东西必须是Math.floor求整


6比例伤害2b.hp - 1目标剩余的HP减少1(注意不要因为分散度或属性而发生变动)
7比例伤害3Math.floor(b.mhp / 2)目标最大HP的一半,分散率影响同上
8根据特定ID的有无产生变化10 + (b.isStateAffected(n) ? 30 : 0)对手变为状态n的场合,伤害增加30。(如果判断自己目前状态,把b换成a就OK)
参考:条件运算符(三元运算符)
(条件?满足时的值:不满足时的值)

9状态异常数10 + b.states().length * 30将对手的状态数*30的伤害加在一起。
持有状态数组的长度,就是状态数量

10最低伤害设定Math.max(100, a.atk * 4 - b.def * 2)结果在100以下时固定为100
参考:Math.max
从指定的参数中返回最大值

11最大伤害设定Math.min(100, a.atk * 4 - b.def * 2)结果在100以上时固定为100
参考:Math.min
从指定的参数中返回最小值


技能公式还可以变得更复杂⼀些吗,例如,当某些变量的值超过100时,会对敌⼈造成
额外的伤害?
可以,这种情况下我们可以使⽤if else句式 (分歧)。 ⽐如:
if (statement)
{
formula1;
}
else
{
formula2;
}
咋才能把它写进伤害公式⾥呢?
⼀⾏就够了!全塞⼀块?
if (条件) { 公式1 } else { 公式2 }
例子:
if (v > 100) { a.atk*4 - b.def*2 } else { a.atk*2 - b.def*2 }
也可以简化成这样:
if (statement)
formula1;
else
formula2;
例⼦:
if (v > 100) a.atk*4 - b.def*2; else a.atk*2 - b.def*2;
使⽤三元选择符进⾏简化是不错的选择 (我最爱的):
statement ? formula1 : formula2;
例子:
v > 100 ? a.atk*4 - b.def*2 : a.atk*2 - b.def*2;
符号说明:
> - ⼤于
< - ⼩于
>= ⼤于或等于
<= ⼩于或等于
=== 等于
&& 和
|| 或
!== 不等于
! 否
例子:
v > 100 ? 1000 : 100;
如果变量10⼤于100,将造成1000伤害,否则只会造成100伤害
v < 100 ? 1000 : 100;
如果变量10⼩于100,将造成1000伤害,否则只会造成100伤害
v >== 100 ? 1000 : 100;
如果变量10⼤于或等于100,将造成1000伤害,否则只会造成100伤害
v <== 100 ? 1000 : 100;
如果变量10⼩于或等于100,将造成1000伤害,否则只会造成100伤害
v === 100 ? 1000: 100;
如果变量10等于100,将造成1000伤害,否则只会造成100伤害
v > 50 && v >== 25 ? 1000 : 100;
如果变量10⼤于50,同时变量11⼤于或等于25,则造成1000伤害,否则只会造成100伤害
v > 50 || v > 50 ? 1000 : 100;
如果变量10⼤于50,或者变量11⼤于50,则造成1000伤害,否则只会造成100伤害
v !== 100 ? 1000 : 100;
如果变量10不等于100,将造成1000伤害,否则只会造成100伤害

关于条件表达式
条件的公式一般为 A ? B:C
意思就是A为一个条件,?则是作为对A提问
在问句中仅有是与否,B和C分别代表着A的答案的正确和否定,中间用:分隔
这里我们用 a.hp_rate <= 0.1 ? a.atk * 4 : a.atk * 2 - b.def* 1
来进行举例,前面的a.hp_rate >= 0.1代表着条件:
自身当前HP是否不大于10%
后面的a.atk * 4则是在条件是认可的状态下触发
而:后面的a.atk * 2 -b.def * 1则是在条件为否定的情况下触发
同理,我们可以用这个办法进行很多类型的对比和开关
一个技能有多种伤害不再是梦
比如a.atk < b.atk ?进行攻击力的对比啊
a.luk > b.luk ?进行幸运的对比啊,比比皆是不再更多举例
另外一个能够判断的则是[状态]
b.isStateAffected(xx) ?
一般使用上方的公式来判断目标是否处于xx号状态
假如说我要制作一个目标处于ID为009的状态时伤害翻倍的技能,
就可以这么写:
(a.atk * 3 - b.def * 1) * b.isStateAffected(9)?2:1
当然你也可以把条件写在前方,在两个答案中使用完全不同的公式
公式与变量的运用
使用$gameVariables.value(xx)来引用游戏变量,也可使用v来引用变量。
使用该语句在公式中即可引用xx变量的值,而变量需要提前带入,可以用公共事件进行。
在技能公式中
a.atk – b.def + v
v代表着ID为x的变量,n就是变量号
或者可以用条件判断if语句进行判断
代码(文本):
if(语句){公式1;{公式2;}
例如:
代码(文本):
if(v > 100) {a.atk*4 - b.def*2} else {a.atk*2 – b.def*2}
假如变量10的值大于100 公式1执行{a.atk*4 - b.def*2} 否则 公式2执行{a.atk*2 - b.def*2}
提示:在测试战斗而非正式运行游戏的时刻,全变量默认为0,请提前赋值以防止测试出错(比如在战斗事件中设置第一回合触发赋值)
在部分情况下,公式中代表分隔的空格可以省略,如a.atk*2-b.def*2。
但实际情况可能会根据使用的公示的不同而有不同的分隔号需求,保险起见请养成使用空格的习惯。






古树旋律 发表于 2022-12-15 09:34:43

触类旁通,写了几个有伤害公式。



对单体敌人造成物理伤害,如果目标已带有【4号状态】,则调用199号事件,伤害结算方式为 a的攻击力和b的减伤率之间的关系。
b.isStateAffected(4)?$gameTemp.reserveCommonEvent(199):1;a.atk *(1 - (b.def/100));
解读:
b.isStateAffected(4)? {语句1}:{语句2};   是js的判断句式
整段公式中出现了2次数值【1】和【a.atk *(1 - (b.def/100))】,RM Maker 将最后一次有效的数字作为伤害数值。

调用公共事件后,拓展功能就多了,比如强制角色行动,强制扣血等等,于是就可以开发成这样:
对单体敌人造成物理伤害,并附带1层腐化。如果目标已带有腐化,则消耗50点体力额外对随机目标追击1次,直至体力降为1点。

if(b.isStateAffected(4)){a.atk *2* (1 - (b.def/100))}else{a.atk * (1 - (b.def/100))}
对单体敌人造成物理伤害。如果目标带有【腐化】,则造成2倍的物理伤害。

var x= 0;if(b.isStateAffected(4)){x++};if(b.isStateAffected(5)){x++};if(b.isStateAffected(6)){x++};if(b.isStateAffected(8)){x++};if(b.isStateAffected(9)){x++};if(b.isStateAffected(10)){x++};if(b.isStateAffected(13)){x++};b.mhp *0.1*x;
对敌方全体释放,目标有腐化、失明、沉默、睡眠、混乱、失衡时,每个种类获得1层终幕印记,每层印记将造成最大体力值10%的伤害。

核心思路就是灵活使用if判定,并最后得到一个输出值。代码使用变量是不要使用a、b这两个字母,因为以及被整体代码定义过了。var a或var b会导致错误。


三姐 发表于 2022-12-15 11:39:45

古树旋律 发表于 2022-12-15 09:34
触类旁通,写了几个有伤害公式。




是大佬~{:4_152:}

古树旋律 发表于 2022-12-30 12:50:15

续几个新公式。注意 点后面有下划线,以及Id的大小写
if(b_enemyId==1){100}else{50};
//如果敌人的ID是1,则造成100伤害,否则只有50伤害
if(b_actorId==1){100}else{50};
//如果目标的角色ID是1,同理

弈缘如梦 发表于 2023-7-9 00:39:39

天天来学习嘿嘿
页: [1]
查看完整版本: 伤害公式