快捷导航
查看: 1076|回复: 4

[公式] 伤害公式

[复制链接]
会员等级

积分信息
金币:132
元宝:0
活跃:74
发电:60

荣誉勋章
荣誉管理首批会员

TA的形象

Rank: 85Rank: 85Rank: 85Rank: 85

懒癌晚期病人

saber

门派:日月神教

擂台:天下第1

与他切磋一把

查看他的属性

UID: 1 发表于 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[n] * 2 (n:变量ID)変量[n]的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:状态ID]对手变为状态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句式 (分歧)。 ⽐如:
[JavaScript] 纯文本查看 复制代码
if (statement)
{
formula1; 
} 
else 
{ 
formula2; 
}

咋才能把它写进伤害公式⾥呢?
⼀⾏就够了!全塞⼀块?
[JavaScript] 纯文本查看 复制代码
if (条件) { 公式1 } else { 公式2 }

例子:
[JavaScript] 纯文本查看 复制代码
if (v[10] > 100) { a.atk*4 - b.def*2 } else { a.atk*2 - b.def*2 } 

也可以简化成这样:
[JavaScript] 纯文本查看 复制代码
if (statement) 
formula1; 
else 
formula2; 

例⼦:
[JavaScript] 纯文本查看 复制代码
if (v[10] > 100) a.atk*4 - b.def*2; else a.atk*2 - b.def*2; 

使⽤三元选择符进⾏简化是不错的选择 (我最爱的):
[JavaScript] 纯文本查看 复制代码
statement ? formula1 : formula2; 

例子:
[JavaScript] 纯文本查看 复制代码
v[10] > 100 ? a.atk*4 - b.def*2 : a.atk*2 - b.def*2; 

符号说明:
[JavaScript] 纯文本查看 复制代码
> - ⼤于
< - ⼩于
>= ⼤于或等于
<= ⼩于或等于
=== 等于
&& 和
|| 或
!== 不等于
! 否

例子:
[JavaScript] 纯文本查看 复制代码
v[10] > 100 ? 1000 : 100;  

如果变量10⼤于100,将造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] < 100 ? 1000 : 100;

如果变量10⼩于100,将造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] >== 100 ? 1000 : 100;

如果变量10⼤于或等于100,将造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] <== 100 ? 1000 : 100;

如果变量10⼩于或等于100,将造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] === 100 ? 1000: 100;

如果变量10等于100,将造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] > 50 && v[11] >== 25 ? 1000 : 100; 

如果变量10⼤于50,同时变量11⼤于或等于25,则造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] > 50 || v[11] > 50 ? 1000 : 100; 

如果变量10⼤于50,或者变量11⼤于50,则造成1000伤害,否则只会造成100伤害
[JavaScript] 纯文本查看 复制代码
v[10] !== 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[x]来引用变量。
使用该语句在公式中即可引用xx变量的值,而变量需要提前带入,可以用公共事件进行。

在技能公式中
a.atk – b.def + v[n]
v[n]代表着ID为x的变量,n就是变量号
或者可以用条件判断if语句进行判断
代码(文本):
if(语句){公式1;{公式2;}

例如:
代码(文本):
if(v[10] > 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。
但实际情况可能会根据使用的公示的不同而有不同的分隔号需求,保险起见请养成使用空格的习惯。







帖子的最近访客

回复 论坛版权

使用道具 举报

会员等级

积分信息
金币:725
元宝:20
活跃:187
发电:0

荣誉勋章
热心会员优秀版主首批会员最佳新人

TA的形象
UID: 6 发表于 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会导致错误。


评分

参与人数 1活跃 +15 收起 理由
Admin + 15 很给力!

查看全部评分

回复

使用道具 举报

会员等级

积分信息
金币:1237
元宝:0
活跃:173
发电:3

荣誉勋章
活跃会员优秀版主首批会员最佳新人

TA的形象
UID: 2 发表于 2022-12-15 11:39:45 | 显示全部楼层
古树旋律 发表于 2022-12-15 09:34
触类旁通,写了几个有伤害公式。

是大佬~
回复

使用道具 举报

会员等级

积分信息
金币:725
元宝:20
活跃:187
发电:0

荣誉勋章
热心会员优秀版主首批会员最佳新人

TA的形象
UID: 6 发表于 2022-12-30 12:50:15 | 显示全部楼层
续几个新公式。注意 点后面有下划线,以及Id的大小写
[JavaScript] 纯文本查看 复制代码
if(b_enemyId==1){100}else{50};
//如果敌人的ID是1,则造成100伤害,否则只有50伤害
if(b_actorId==1){100}else{50};
//如果目标的角色ID是1,同理
回复

使用道具 举报

经验  0%

会员等级

积分信息
金币:37
元宝:0
活跃:80
发电:0

荣誉勋章

TA的形象

Rank: 3Rank: 3Rank: 3

迷你金币狮

UID: 207 发表于 2023-7-9 00:39:39 | 显示全部楼层
天天来学习  嘿嘿
回复

使用道具 举报

ahome_bigavatar:guest
ahome_bigavatar:welcomelogin
您需要登录后才可以回帖 登录 | 加入民族

本版积分规则

论坛用工具

蓝凑云 hello图床 聚合图床 TinyPNG remove 代码测试 颜色代码 颜色代码2

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

实用工具

AI人工智能图片放大 图片无损放大 Deepl翻译器 百宝箱 孟坤工具箱 在线压缩图片 图片切圆角

您一共访问了本站 加载中...

Archiver|小黑屋|RPG民族

GMT+8, 2024-10-23 07:33 , Processed in 0.595680 second(s), 88 queries .

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