Project1

标题: YEP的技能核心插件,能帮我实现以下技能效果吗? [打印本页]

作者: 绯色之夜    时间: 2024-4-12 08:47
标题: YEP的技能核心插件,能帮我实现以下技能效果吗?
效果是这样的。在技能被使用时(以下称为A技能),会消耗使用者(这个人可以是角色也可以是敌人)最大MP的50%,并将其存储进一个容器里(可以理解为存在一个变量里),变量存储的值为上一次MP值最大值的50%。
同时会为其赋予一个状态。第一次使用A技能,会赋予一个名为50%的状态,第二次会赋予100%的状态。用过两次后就不能使用,并会在游戏中用弹窗提示。

紧接上个技能,在用第一次A技能后,会为自身增加一个B技能,专门用于释放之前储存的MP。在使用B技能时,会检测使用者身上拥有的BUFF。
如拥有50%的话,就释放上次储存的50%的值,反之全部释放,然后删除B技能。

RM讨论技能的帖子比较少,如果是需要插件实现的话,能分享一点代码实现的思路吗?可以的话非常感谢。
作者: shiroin    时间: 2024-4-12 08:47
用YEP插件可以实现你的需求,不过有点绕,我尽量解释清楚……
首先你的技能A,技能效果就是为使用者赋予A状态,然后在注释栏填入以下代码,这段代码效果就是:
使用A技能时如果使用者MP满足条件就决定技能释放成功,并记录变量值,如果MP不足一半,则技能释放失败不赋予状态:
JAVASCRIPT 代码复制
  1. <Before Eval>
  2. if (user.mpRate() >= 0.5){
  3. this.item().successRate = 100;
  4. user._skillAmask = user.mp * 0.5 || 0;
  5. }else{
  6. this.item().successRate = 0;
  7. }
  8. </Before Eval>


其次是技能B,需要针对释放条件和伤害判定都进行代码处理,需要填入以下代码(假设你的状态A是ID为10的状态),
如果角色身上没有状态A,就释放技能失败,反之就会根据此前赋值的变量值来指定技能伤害,同时使用技能后将变量值重置为0:

JAVASCRIPT 代码复制
  1. <Before Eval>
  2. if (user.isStateAffected(10)){
  3. this.item().successRate = 100;
  4. }else{
  5. this.item().successRate = 0;
  6. }
  7. </Before Eval>
  8.  
  9. <damage formula>
  10. var damage = user._skillAmask || 0;
  11. value = Math.floor(damage);
  12. </damage formula>
  13.  
  14. <After Eval>
  15. user._skillAmask = 0;
  16. </After Eval>


如果你还想给这个状态进行堆叠层数判定,或者加入状态有回合数限制亦或状态被提前净化消除会导致变量值重置的设计,就需要更复杂的判定机制,建议你先试下上面写的效果
作者: 绯色之夜    时间: 2024-4-12 12:27
shiroin 发表于 2024-4-12 12:25
用YEP插件可以实现你的需求,不过有点绕,我尽量解释清楚……
首先你的技能A,技能效果就是为使用者赋予A状 ...

非常感谢,主要是技能核心和状态核心才刚下载,教程也是P1到处搜刮而来。
很多地方还不懂,搞了一上午才发现技能和状态的时点后缀是不同的......
作者: 绯色之夜    时间: 2024-4-12 14:09
shiroin 发表于 2024-4-12 08:47
用YEP插件可以实现你的需求,不过有点绕,我尽量解释清楚……
首先你的技能A,技能效果就是为使用者赋予A状 ...

this.item().successRate = 100;  这段代码是什么意思?我丢给GPT看了一下,它老人家说的,我完全看不懂。。。。
作者: 505681468    时间: 2024-4-12 14:13
本帖最后由 505681468 于 2024-4-12 14:14 编辑
绯色之夜 发表于 2024-4-12 14:09
this.item().successRate = 100;  这段代码是什么意思?我丢给GPT看了一下,它老人家说的,我完全看不懂 ...


this.item() 应该是 Game_Action.item()
返回 Game_Action._item
_item 一般是 action 引用的 道具 item 或者 技能 skill
skill.successRate 是技能成功率


作者: 绯色之夜    时间: 2024-4-12 14:20
505681468 发表于 2024-4-12 14:13
this.item() 应该是 Game_Action.item()
返回 Game_Action._item
_item 一般是 action 引用的 道具 item  ...

非常敢泄,泄了。
作者: shiroin    时间: 2024-4-12 17:17
绯色之夜 发表于 2024-4-12 14:09
this.item().successRate = 100;  这段代码是什么意思?我丢给GPT看了一下,它老人家说的,我完全看不懂 ...


直接把技能效果写在eval里也能对技能效果做出分歧处理
但用技能成功率做判定会更方便点,这样还可以额外定制技能失败时的效果
怎么选择还是要看你的系统打算堆多高的复杂度了
作者: 绯色之夜    时间: 2024-4-12 18:09
本帖最后由 绯色之夜 于 2024-4-12 18:32 编辑
shiroin 发表于 2024-4-12 17:17
直接把技能效果写在eval里也能对技能效果做出分歧处理
但用技能成功率做判定会更方便点,这样还可以额外 ...

  1. var Umpx = Math.ceil(user.mhp * 0.5);
  2. <Before Eval>
  3. if (user.mpRate() >= 0.5) {
  4.     user.gainMp(-Umpx);
  5.     user.addState(15);
  6.     user.forgetSkill(11);
  7.     user.learnSkill(61);
  8.     user.learnSkill(16);
  9. }
  10. </Before Eval>
复制代码

我的需求大致就是这样。技能效果可以理解为做一个装MP的容器,最多可以存储两次,一次存储当时使用者最大MP值的50%,然后再做一个新技能,将存在变量里的MP释放出来。
但是我有个疑问,这种技能肯定是需要全局变量的,我不清楚YEP的插件是否可以跨技能访问变量......
作者: dunklen.f    时间: 2024-4-12 19:04
绯色之夜 发表于 2024-4-12 18:09
我的需求大致就是这样。技能效果可以理解为做一个装MP的容器,最多可以存储两次,一次存储当时使用者最 ...

应该可以
$gameVariables.value(n)    获取n号变量的值
$gameVariables.setValue(n,value)       设置n号变量的值为value
或者自己定义的变量:aaa、bbb、ccc
作者: shiroin    时间: 2024-4-12 22:09
绯色之夜 发表于 2024-4-12 18:09
我的需求大致就是这样。技能效果可以理解为做一个装MP的容器,最多可以存储两次,一次存储当时使用者最 ...

因为技能是有使用者和目标对象的判定,你完全可以把变量值存储在actor对象里,比如假设是2号角色使用了技能A,这时候user._skillAmask其实就是$gameActors.actor(2)._skillAmask,你也可以通过$gameActors.actor(2)._skillAmask这个形式直接访问对应的值

作者: 绯色之夜    时间: 2024-4-12 22:35
shiroin 发表于 2024-4-12 22:09
因为技能是有使用者和目标对象的判定,你完全可以把变量值存储在actor对象里,比如假设是2号角色使用了技 ...

哦,非常感谢。
其实我解决了,我是用RM的原型变量,然后用全局变量指令$gameVariables.value(n)和$gameVariables.setValue(n,value),配合我在储存阶段不同设计出来的技能,已经成功实现。
作者: 1927802274    时间: 2024-7-3 19:22
shiroin 发表于 2024-4-12 22:09
因为技能是有使用者和目标对象的判定,你完全可以把变量值存储在actor对象里,比如假设是2号角色使用了技 ...

啊,成了,之后我写个自定义消耗显示就行了,谢谢大佬,今天也学到新姿势了




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