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

[公式] 伤害公式

[复制链接]
会员等级

积分信息
金币:49
金钱:251
元宝:81
活跃:152
发电:52

荣誉勋章
热心会员优秀版主突出贡献论坛元老荣誉管理首批会员活跃会员最佳新人

TA的角色

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

懒癌晚期病人

门派:无

擂台:无名次

与他切磋一把

查看他的属性

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。
但实际情况可能会根据使用的公示的不同而有不同的分隔号需求,保险起见请养成使用空格的习惯。







最近访客

  • 小银花
    2024-11-19
回复 论坛版权

使用道具 举报

会员等级

积分信息
金币:733
金钱:0
元宝: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 很给力!

查看全部评分

回复

使用道具 举报

会员等级

积分信息
金币:1422
金钱:329
元宝:1
活跃:225
发电:10

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

TA的角色

Rank: 32Rank: 32

民族的搬运工

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

是大佬~
回复

使用道具 举报

会员等级

积分信息
金币:733
金钱:0
元宝: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,同理
回复

使用道具 举报

经验  44%

会员等级

积分信息
金币:15
金钱:0
元宝:0
活跃:90
发电:0

荣誉勋章

TA的角色

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

文明发言,和谐互动
文明发言,和谐互动
您需要登录后才可以回帖 登录 | 加入民族

本版积分规则

论坛用工具

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

Powered by Discuz!

© 2001-2013 Comsenz Inc.

实用工具

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

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

Archiver|小黑屋|RPG民族

GMT+8, 2024-11-21 17:19 , Processed in 0.237063 second(s), 62 queries .

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