Project1

标题: 基于YEP插件的一些技能设计与实现方法 [打印本页]

作者: zhufeng233    时间: 2023-4-11 23:50
标题: 基于YEP插件的一些技能设计与实现方法
本帖最后由 zhufeng233 于 2023-4-25 22:43 编辑

最近在学习YEP与战斗相关的几个核心插件,网络上对此的教程非常稀缺,学习没有门路,几乎只能靠自己摸索。
目前找到的比较有用的资源除了YEP自己的一百多个范例外,就只有P1上另一位老哥分享的一些状态范例,观看学习后受益匪浅。
尽管自己刚开始学习,但也尝试着记录并分享一些自己设计或基于已有范例修改的技能,也会有一些YEP的范例工程,我会尽可能把注释翻译成中文,供有需要的人参考学习并一起交流。
由于自己也是初学,或许有诸多错误,请各位斧正。
作者: zhufeng233    时间: 2023-4-11 23:56
首先是说一下目前主要用到的几个插件分别是:YEP的状态核心,技能核心,伤害核心,装备核心。还有一些用的不多的别的插件,具体用到哪些在具体案例里都会提及。如果你觉得后面的范例对你有用,请确保有YEP的全套插件。
其次是,因为要用到“疯狂模式”,所以可能要对js的一些基本指令有了解,我虽然对js一窍不通,但有一些别的语言的基础,结合范例不难理解语句的作用,但如果完全是编程小白,可能会有些看不懂,最好先具备一点编程基础,如果完全不懂又没有精力去学编程的话,也可以试着结合注释来分析语句的作用。
最后是自己做出来一个,有时间就会发出来,而且尽可能会写详细的注释,如果没什么进展就会先搁置。
作者: zhufeng233    时间: 2023-4-12 00:20
仿制 LOL安妮的被动
在累计进行三次行动后,下一次行动会使目标眩晕。
一共要用到5个状态,以及状态核心
五个状态听着吓人,但其实其中三个是用来代替计数功能的。由于MOG插件与YEP的状态计数显示有冲突故而选择了这种替代方式。
以下是代码,可以直接复制到状态的注释处:
状态1:安妮被动(累计进行三次行动后,下一次行动会使目标眩晕)
<Custom Apply Effect>
target._yun = target._yun || 0;   \\初始化变量,target._yun 可以自定义变量名称,yun代表晕的意思
</Custom Apply Effect>

<Custom Action Start Effect>
if (target._yun <= 0) {    \\如果变量为0,角色行动一次变量计数+1,并给使用者添加ID为177的状态 177号状态为计数状态,无任何实际作用。
  target._yun += 1;
  user.addState(177);
}
else{
  if (target._yun <= 1) {    \\如果变量为1,角色行动一次变量计数+1,并给使用者添加ID为178并移除177状态 178号状态为计数状态,无任何实际作用。
    target._yun += 1;
    user.addState(178);
    user.removeState(177);
  }
  else{
    if (target._yun <= 2) {    \\如果变量为2,角色行动一次变量计数+1,并给使用者添加ID为179并移除178状态 179号状态为计数状态,无任何实际作用。
      target._yun += 1;
      user.addState(179);
      user.removeState(178);
    }
    else{
      if (target._yun <= 3) {   \\如果变量为3,角色行动一次变量计数归零(此时角色行动了三次),并给使用者添加ID为180并移除179状态 180号状态的设置看后文
        target._yun = 0;
        user.addState(180);
        user.removeState(179);
      }
  }
}
}
</Custom Action Start Effect>

177 178 179号状态均为计数状态,如不需要可以忽略相关指令。180号为给予目标眩晕的状态:

<Custom Action Start Effect>  
user.removeState(180);    \\行动后移除本状态
</Custom Action Start Effect>
并在该状态的设置中设置:攻击时附带状态:眩晕

大致如上,目前该状态存在两个问题:一个是现在我还不知道怎么具体判断角色进行了何种行动,导致不论角色采取什么行动都会累计计数(如角色喝药也会让计数+1)。还有一个问题也是因为我无法判断角色具体的行动,导致给敌人附加眩晕只能用“普攻”的方式,而不能让角色的任意技能都享受到眩晕的效果。
或许要等深入学习后才能解决,如果有大神肯指点一下就更好了。

作者: zhufeng233    时间: 2023-4-12 00:27
发完之后意识到安妮的被动如果用技能核心去做可能会更好的实现,明天试试,如果效果上有优化再发一个新的
作者: woliebe    时间: 2023-4-12 08:04
zhufeng233 发表于 2023-4-12 00:27
发完之后意识到安妮的被动如果用技能核心去做可能会更好的实现,明天试试,如果效果上有优化再发 ...

感觉分享,对我们这些刚学习制作技能的很有帮助。

作者: jie119168    时间: 2023-4-12 10:22
zhufeng233 发表于 2023-4-12 00:20
仿制 LOL安妮的被动
在累计进行三次行动后,下一次行动会使目标眩晕。
一共要用到5个状态,以及状态核心

计数相关的话还是利用好状态核心中的state counter吧,做多个状态来标记次数还是太精神污染了。
与本次行动关联的判断在confirm阶段写,可以用上this.isHpEffect(),this.isMagic(),this.isSkill()这类
作者: zhufeng233    时间: 2023-4-12 11:13
jie119168 发表于 2023-4-12 10:22
计数相关的话还是利用好状态核心中的state counter吧,做多个状态来标记次数还是太精神污染了。
与本次行 ...

statecounter在显示上会与mog的战斗UI冲突导致不显示,才出此下策。
判断行动关联的部分还不熟悉,感谢你的提醒,晚些琢磨优化一下
作者: zhufeng233    时间: 2023-4-12 12:54
中午时间有限,先更新一个简单的技能:
属性伤害增强
用过RM的人应该知道RM里很蠢的一个点,就是不能让角色提升某种属性的伤害。
例如我希望一个角色学会一个被动技能:所有雷属性伤害提升10%,这在RM原版的环境下无法实现或者实现起来非常麻烦。
因此借助YEP的元素核心来实现这一功能,使用方法非常简单,只需要在某个状态的备注里如下编写:

<Element Amplify 4: +300%>

其中“4”是技能类型的ID,在我的数据库中ID为4的技能类型是:雷。后面是伤害加成倍率,我填写的是300%也就是该角色在这个状态下所有雷属性伤害翻三倍。
具体的技能类型与倍率可自行修改,如果需要做成被动技能还需要结合一些被动技能的插件,这里就不赘述
作者: zhufeng233    时间: 2023-4-12 13:43
下午的课吹了,爽到,再更新一个新技能:狂龙症
取自Monster Hunter系列中的一个技能,是我非常喜欢的一个技能,具体效果表现为:
战斗开始时角色身上会附加一个名为“狂龙症”的buff,角色处于该状态时会持续掉血。如果在战斗中角色造成了一定量的伤害(或进行了一定次数的攻击)则视为克服狂龙症,角色将获得一个高额的加成buff。
但如果角色在造成足够的伤害前反而受到了更多的伤害(或受到了一定次数的攻击)则会视为狂龙病发作,角色将获得一个严重的debuff。
这个状态在YEP的一百多个范例中有演示,我对其进行了一点简单的修改,让其更贴近怪猎中原本的狂龙症,当角色克服狂龙症后将回血,狂龙症发作则扣血。并且添加和翻译了注释,让编程或英语不太好的小伙伴也能读懂每一段的作用。
需要用到三个状态状态核心
三个状态中,其中一个是开局附加给角色的狂龙病,另外两个分别是角色克服与发作给的buff和debuff。
具体实现如下:

<Reapply Ignore Turns>

<Custom Apply Effect>
// 设置两种情况的变量,A情况为角色狂龙病发作,B情况为角色克服狂龙病。后面的数字是角色要造成(受到)几次伤害,才能触发克服(发作)狂龙病的效果。我这里设置了5,即角色要造成(受到)5次伤害后才会触发后续效果。
user._frenzyA = 5;
user._frenzyB = 5;
</Custom Apply Effect>

<Custom Remove Effect>
// 当狂龙病状态移除后,清除两个变量。
user._frenzyA = undefined;
user._frenzyB = undefined;
</Custom Remove Effect>

<Custom Respond Effect>
// 定义两个变量并赋值
target._frenzyA = target._frenzyA || 5;
target._frenzyB = target._frenzyB || 5;
// 如果角色受到了伤害,判断这次伤害是否大于0,只有大于0的有效伤害才会让计数-1
if (target.result().hpDamage > 0) {
  // 计数-1
  target._frenzyA -= 1;
}
// 如果计数变为了0
if (target._frenzyA <= 0) {
  // 移除狂龙病状态(在我的数据库中狂龙病编号为181)
  target.removeState(181);
  // 定义角色要受到的伤害,我这里给的数值是角色最大生命值的20%,也就是说角色如果狂龙病发作,就会受到20%最大生命值的伤害。
  var frenzy_damage = Math.floor(-target.mhp / 5);
  target.gainHp(frenzy_damage);
  // 弹出伤害数字
  target.startDamagePopup();
  target.clearResult();
  // 给角色附加上狂龙病发作的debuff,我这里debuff的ID编号为183
  target.addState(183);
}
</Custom Respond Effect>

<Custom Establish Effect>
// B情况为克服狂龙病的情况,与狂龙病发作的情况几乎一样,只是更改了对象和具体的状态ID,就不多赘述了。
user._frenzyA = user._frenzyA || 1;
user._frenzyB = user._frenzyB || 1;

if (target.result().hpDamage > 0) {
  user._frenzyB -= 1;
}
if (user._frenzyB <= 0) {
  user.removeState(181);
  var frenzy_recover = Math.floor(user.mhp / 5);
  user.gainHp(frenzy_recover);
  user.startDamagePopup();
  user.clearResult();
  user.addState(182);
}
</Custom Establish Effect>

在狂龙病buff中,我还添加了角色每回合-5%HP的效果,这个相信大家都会,就不专门写了,至于狂龙病发作和克服的具体buff效果如何也就交给大家自己编辑了。
和怪猎中的狂龙病很相似,是一种鼓励玩家进攻,收益与风险都很高的被动技能,大家可以根据自己的需要进行具体的修改。
作者: zhufeng233    时间: 2023-4-12 13:44
woliebe 发表于 2023-4-12 08:04
感觉分享,对我们这些刚学习制作技能的很有帮助。

我也是刚开始学习,有很多错误和不足的地方
作者: sundeshuo    时间: 2023-4-12 15:08
zhufeng233 发表于 2023-4-12 00:20
仿制 LOL安妮的被动
在累计进行三次行动后,下一次行动会使目标眩晕。
一共要用到5个状态,以及状态核心

举几个判断行为的方法
是否是技能:this.isSkill()
是否是道具:this.isItem()
是否是防御:this.isGuard()
是否是普攻:this.isAttack()
更多的可以去游戏目录下rpg_objects.js(mv);rmmz_objects.js(mz)文件里搜索Game_Action查找;
任意技能都能享受的话;
只要再状态里用一个在伤害之后对于user的tag,判断一下行为跟你的状态层数,如果满足条件添加眩晕就可以了
作者: woliebe    时间: 2023-4-12 17:10
zhufeng233 发表于 2023-4-12 13:44
我也是刚开始学习,有很多错误和不足的地方

我最近想做一个技能,就是攻击敌人的时候,判断敌人是否死亡,如果没有死亡就有30%再自动普通攻击敌人一次,如果敌人已经死亡,那么就100%再普通攻击另外一个敌人一次。一直没有没想清楚该怎么弄,能请教下你吗?

作者: jie119168    时间: 2023-4-12 20:59
zhufeng233 发表于 2023-4-12 11:13
statecounter在显示上会与mog的战斗UI冲突导致不显示,才出此下策。
判断行动关联的部分还不熟悉,感谢你 ...

嘿嘿,刚刚我试着改了一下战斗UI插件,已经成功把statecounter显示出来了。
你看一下https://rpg.blue/thread-491922-1-1.html,如果觉得适合的话可以试试我这改版的显示方式
作者: zhufeng233    时间: 2023-4-12 21:08
jie119168 发表于 2023-4-12 20:59
嘿嘿,刚刚我试着改了一下战斗UI插件,已经成功把statecounter显示出来了。
你看一下https://rpg.blue/th ...

这个真是帮了大忙了!等稍晚些我试试!
作者: zhufeng233    时间: 2023-4-12 22:03
woliebe 发表于 2023-4-12 17:10
我最近想做一个技能,就是攻击敌人的时候,判断敌人是否死亡,如果没有死亡就有30%再自动普通攻击敌人一 ...

抱歉,尝试了好几个小时,还是没能做出你说的效果,主要卡在不知道该怎么判断击杀敌人后随机选择另一个敌人造成伤害上。目前我对插件的各个功能还了解不多,等日后更加熟悉了能帮你解答的时候会马上考虑解决这个问题
作者: zhufeng233    时间: 2023-4-12 22:19
woliebe 发表于 2023-4-12 17:10
我最近想做一个技能,就是攻击敌人的时候,判断敌人是否死亡,如果没有死亡就有30%再自动普通攻击敌人一 ...

目前只做出了前半部分的效果

<Damage Formula>
value = user.mat + 1000;
var successRate = 0.3;
if(!target.isDead() && target.hp > 0){
  if(Math.random() < successRate){
    target.gainHp(-value);
    target.startDamagePopup();
  }
}
</Damage Formula>

后半部分我参考YEP范例中的:Roaming Mend,Chain Lightning,Beast Boost和Stormflurry想要做出相应效果,但尝试了很久都没成功。我觉得应该能根据这几个范例学习到你想要的结果,你也可以试试看能不能研究出来。
作者: xiamumomo    时间: 2023-4-12 22:33
zhufeng233 发表于 2023-4-12 00:20
仿制 LOL安妮的被动
在累计进行三次行动后,下一次行动会使目标眩晕。
一共要用到5个状态,以及状态核心

=。=可以简化你这一下要弄多个状态
  1. <Custom Battle Effect>
  2. /////战斗开始应用用于显示倒计时次数
  3. user._siphonbonus = 0;
  4. ///如果初始CD为3那么把上面那个0改成3
  5. bonus = $gameVariables.value(1);
  6. user.setStateCounter(22, bonus);
  7. </Custom Battle Effect>

  8.   <Custom Regenerate Effect>
  9. /////行动后刷新层数
  10. bonus = $gameVariables.value(1);
  11. user.setStateCounter(22, bonus);
  12.   </Custom Regenerate Effect>

  13. <Custom Confirm Effect>
  14. ////判断是否普通攻击,我设置的是仅限普通攻击才能触发的
  15. /////如果想所有都能触发删掉下面的第一个判断
  16. if(user._siphonbonus == 0){
  17. if (this.isAttack()) {
  18. if(target.isStateAffected(23)){user._siphonbonus += 3}else{
  19. value += (user.atk * 0.06 + 500);
  20.   user.gainHp(value)
  21. user._siphonbonus += 3
  22. target.addState(23)
  23. $gameVariables.setValue(1, $gameVariables.value(1)+value);
  24. }
  25. }
  26. }else{user._siphonbonus -= 1}
  27. </Custom Confirm Effect>
复制代码

这是以前别人叫我写的心之钢 Buffs & States Core  可能可以再次改良一下那时候临时写的
作者: xiamumomo    时间: 2023-4-12 22:34
zhufeng233 发表于 2023-4-12 13:44
我也是刚开始学习,有很多错误和不足的地方

http://www.yanfly.moe/wiki/Categ ... gin_Tips_%26_Tricks 可以参考学习Yep180多个高级状态 == 我基本就只单用那个插件写状态
作者: zhufeng233    时间: 2023-4-12 23:19
xiamumomo 发表于 2023-4-12 22:33
=。=可以简化你这一下要弄多个状态
这是以前别人叫我写的心之钢 Buffs & States Core  可能可以再次改良 ...

没有选用计数是因为mog的战斗UI和YEP的计数显示会冲突,但上面有大佬给出了解决方案,之后计数类会用setStateCounter来写
作者: woliebe    时间: 2023-4-13 13:42
zhufeng233 发表于 2023-4-12 22:19
目前只做出了前半部分的效果

非常感谢,能有个开头,已经很不错了,我顺着你的思路,看能不能尝试出来!!!

作者: zhufeng233    时间: 2023-4-13 22:03
今天考了一天的试,没怎么做技能。但翻译了一下Damage Core,Skill Core 和 BuffStatesCore 的一些时点。因为都是用自己刚过六级的英语水平和一些自己的理解翻译的结果,可能会有一些错误,如有发现请及时指出。

Damage Core
<Bypass Damage Cap>伤害破限
<Damage Cap: x>伤害限制
<Heal Cap: x>治疗限制
<damage formula> 伤害公式
</damage formula>

Buffstatescore
<Show Turns>显示回合
<Hide Turns>隐藏回合
<Turn Font Size: x> 回合字体大小

<Turn Alignment: Left>
<Turn Alignment: Center> 回合计数对齐方式
<Turn Alignment: Right>


<Turn Buffer X: +x>
<Turn Buffer X: -x>
<Turn Buffer Y: +x>  回合计数位置
<Turn Buffer Y: -x>

<Turn Color: x> 回合计数颜色

<Reapply Ignore Turns>
<Reapply Reset Turns> 改变回合数
<Reapply Add Turns>

<State x Turns: +y>
<State x Turns: -y>
<State named Turns: +y>  修改回合数
<State named Turns: -y>

<Show State Turns>
<Hide State Turns> 显示回合


<Custom stat Buff Turn>
turn = 10;
turn += user.agi;
</Custom stat Buff Turn>
设置默认的buff


<Custom Apply Effect>
code
code
</Custom Apply Effect>
获得状态时触发

<Custom Remove Effect>
code
code
</Custom Remove Effect>
移除状态时触发

<Custom Leave Effect>
code
code
</Custom Leave Effect>
状态自然消失时触发


<Custom Turn Start Effect>
code
code
</Custom Turn Start Effect>
回合开始时触发

<Custom Action Start Effect>
code
code
</Custom Action Start Effect>
动作开始时触发

<Custom Action End Effect>
code
code
</Custom Action End Effect>
动作结束时触发


<Custom Regenerate Effect>
code
code
</Custom Regenerate Effect>
使用者HP,MP,TP有变化时触发

<Custom Turn End Effect>
code
code
</Custom Turn End Effect>
回合结束时触发

<Custom Battle Effect>
code
code
</Custom Battle Effect>
战斗开始时触发

<Custom Victory Effect>
code
code
</Custom Victory Effect>
战斗胜利时触发


<Custom Escape Effect>
code
code
</Custom Escape Effect>
逃跑时触发

<Custom Defeat Effect>
code
code
</Custom Defeat Effect>
失败时触发

<Custom Initiate Effect>
code
code
</Custom Initiate Effect>
选中目标时触发


<Custom Select Effect>
code
code
</Custom Select Effect>
被选中时触发


<Custom Confirm Effect>
code
code
</Custom Confirm Effect>
确认命中但未造成伤害时触发


<Custom React Effect>
value -= 100;
value -= user.def;
</Custom React Effect>
被确认命中但未造成伤害时触发

<Custom Respond Effect>
code
code
</Custom Respond Effect>
被确认命中并造成伤害时触发

<Custom Establish Effect>
code
code
</Custom Establish Effect>
确认命中且造成伤害时触发


<Custom Deselect Effect>
code
code
</Custom Deselect Effect>
被选中并一切结算之后时触发

<Custom Conclude Effect>
code
code
</Custom Conclude Effect>
选中并一切结算之后时触发





Skill core

<Pre-Damage Eval>
code
code
</Pre-Damage Eval>  造成伤害前生效

<Post-Damage Eval>
code
code
</Post-Damage Eval> 造成伤害后生效
作者: zhufeng233    时间: 2023-4-14 00:58
半夜更新一个新技能,琢磨了很久总算做出来了。
我将其命名为:电力爆发  相应的状态命名为:电气引擎  是给游戏里使用雷魔法战斗的角色使用的技能
该技能效果为:当角色处于该状态时,初始会获得20层充能。每进行一次普攻获得30层充能,每释放一次技能获得20层充能。充能层数越高,电力爆发的威力越大,在使用电力爆发后所有层数清零。
灵感取自于LOL的电刀,具体效果如下:
需要用到的插件为:战斗核心,状态核心,技能核心。一个技能,一个状态。
首先是状态:电气引擎
<Custom Apply Effect>
target._motordrive = target._motordrive || 0;   //定义电气引擎层数变量并赋值
target._motordrive += 20;   //初始层数为20
user.setStateCounter(185, 20);  //层数计数,185为本状态ID
user.clampStateCounter(185, 0, 100);  //限制层数在0~100内
</Custom Apply Effect>


<Custom Confirm Effect>
var skills = [];  //定义数组skills
skills.push(313); //将电力爆发的技能ID(此处为313)放入skills数组
if (this.isAttack() && target.isActor() !== user.isActor()) {  //判断角色是否进行普攻且对象为敌人
  user.addStateCounter(185, 30);  //计数+30
  user.clampStateCounter(185, 0, 100);
  target._motordrive += 30; //电气引擎变量+30
}else if (this.isSkill() && (skills.contains(this.item().id)) && target.isActor() !== user.isActor()){  //如果角色不是普攻,那么判断角色是否使用了技能,且该技能是313号电力爆发,且目标为敌人
user.setStateCounter(185, 0);  //计数清零
user.clampStateCounter(185, 0, 100);
target._motordrive = 0; //变量清零
}else if (this.isSkill() && target.isActor() !== user.isActor()) {  //如果角色不是普攻,且没有使用电力爆发,但使用了技能且对象为敌人
  user.addStateCounter(185, 20);  //计数+20
  user.clampStateCounter(185, 0, 100);  
  target._motordrive += 20; //变量+20
}
</Custom Confirm Effect>

技能电力爆发的设置如下:
<Damage Formula>
target._motordrive = target._motordrive || 0;  //获取电气引擎中电气引擎的变量
value = Math.floor(user.mat * (target._motordrive * 0.2 + 1));  //定义伤害公式,此处的伤害为角色魔力*(1+电气引擎层数*0.2)并向下取整。
</Damage Formula>

此技能可以设置的更加灵活,例如让角色进行防御,受到伤害,受到治疗等等情况都叠加电气引擎层数,应该可以做的更加有深度。
作者: zhufeng233    时间: 2023-4-14 09:44
本帖最后由 zhufeng233 于 2023-4-14 09:52 编辑

翻译一下YEP范例中的电刀,昨天设计的技能是根据YEP电刀的范例修改而来的。
LOL中电刀的效果为:角色的移动会增加6点充能,每次攻击也会增加充能(应该会吧,很久没玩LOL了),当充能达到100时下一次平A会附带一个雷电魔法伤害,并且该伤害会有类似闪电链的链接伤害效果。
因为RM的回合制中并不存在“移动”这一概念,所以YEP将移动获取的充能改成了角色HP,MP,TP发生变化时充能+6,以下是YEP的范例,我对注释进行了翻译并添加了一些额外的注释,如有错误请指出。
该技能需要:状态核心,战斗核心

<Custom Regenerate Effect>
// 提升6点充能.
user.addStateCounter(stateId, 6);
// 将充能范围限制在0~100,stateID是用作记录充能的状态
user.clampStateCounter(stateId, 0, 100);
</Custom Regenerate Effect>

<Custom Confirm Effect>
// 如果是一次普通攻击且目标为敌人
if (this.isAttack() && target.isActor() !== user.isActor()) {
  // 提升12点充能
  user.addStateCounter(stateId, 12);
  // 限制充能范围为0~100
  user.clampStateCounter(stateId, 0, 100);
  // 如果充能达到或超过了100(即充能完毕)
  if (user.getStateCounter(stateId) >= 100) {
    // 清除所有充能
    user.removeStateCounter(stateId);
    // 定义电刀伤害的元素类型,你可以根据自己数据库里的属性类型自由定义,可以做成火刀水刀土刀都行。
    var elementId = 5;
    // 定义额外伤害的数值
    var damage = user.mat * 2;
    // 如果造成了暴击
    if (target.result().critical) {
      // 则这个额外伤害也造成暴击
      damage = this.applyCritical(damage);
    }
    // 获取所有还活着的敌人
    var members = this.opponentsUnit().aliveMembers();
    // 移除掉被选中的那个目标
    members.splice(members.indexOf(target), 1);
    // 播放电刀效果动画
    target.startAnimation(77);
    // 提升电刀伤害
    value += Math.ceil(damage * target.elementRate(elementId));
    // 额外命中四个目标(也就是电刀链接伤害会链接到另外四个敌人身上)
    var extraTargets = 4;
    // 对这四个目标进行循环
    while (extraTargets--) {
      // 随机从四个目标中选一个
      var member = members[Math.floor(Math.random() * members.length)];
      // 确定该目标存在
      if (member) {
        // 播放动画
        member.startAnimation(77);
        // 让这个目标受到链接伤害
        member.gainHp(-Math.ceil(damage * member.elementRate(elementId)));
        // 跳出伤害数字
        member.startDamagePopup();
        // 清除结果
        member.clearResult();
        // 将这个目标从候选目标中排除
        members.splice(members.indexOf(member), 1);
        // 如果这个目标死了
        if (member.isDead()) {
          // If the member is dead, have it collapse.(这一段没有理解,这段指令是让角色倒下显示消失动画,但角色已经死亡为何还要再写一段这个指令呢?)
          member.performCollapse();
        }
      }
    }
  }
}
</Custom Confirm Effect>
作者: zhufeng233    时间: 2023-4-14 23:51
彻底晕厥,想要用YEP范例中的Dualcast,也就是双重吟唱。但别说自己改了,哪怕直接套用YEP的范例也没用,一开始怀疑是插件版本落后了,换上了最新的版本,然后怀疑是工程环境的问题重新新建了一个原版环境依然不行,真不知道是哪里出了毛病
作者: zhufeng233    时间: 2023-4-14 23:54
<Custom Action Start Effect>
// If a chained action is stored...
if ($gameTemp._chainAction === undefined) {
  // ...then set the action to the user's current action.
  $gameTemp._chainAction = user.currentAction();
} else {
  // ...then clear the stored action.
  $gameTemp._chainAction = undefined;
}
</Custom Action Start Effect>

<Custom Action End Effect>
// If a chained action is stored...
if ($gameTemp._chainAction) {
  // Set the 'action' variable to the chained action.
  var action = $gameTemp._chainAction;
  // Check if the action exists, is a skill, and is a magical attack.
  if (action && action.isSkill() && action.isMagical()) {
    // Get the skill used for that action.
    var skill = action.item();
    // Check if the user can pay the skill cost.
    if (user.canPaySkillCost(skill)) {
      // Check if the battle system is DTB.
      if (BattleManager.isDTB()) {
        // If it is, add the action to queue.
        user.setAction(0, action);
      // If the battle system isn't DTB...
      } else {
        // ...make it a forced forced.
        BattleManager.queueForceAction(user, skill.id, -2);
      }
    }
  }
}
</Custom Action End Effect>

<Custom Remove Effect>
// Clear the chained action effect.
$gameTemp._chainAction = undefined;
</Custom Remove Effect>

YEP的范例,我盯着看了好久也没看出哪里有问题,但实际用起来就是不行,跪求有大佬指点迷津
作者: 2669483303    时间: 2023-4-15 04:51
zhufeng233 发表于 2023-4-12 22:19
目前只做出了前半部分的效果

敌人是否死亡会有个死亡状态,编辑器里默认是1号,可以在动作序列里用if target.isStateAffected(X)判断目标是否处于设定的死亡状态,如果有就是死亡了随机攻击其他目标一次,没有就再攻击一次
作者: zhufeng233    时间: 2023-4-15 15:49
之前更新的一些技能和状态虽然逻辑上不复杂难度也不高,但对于一些完全没有接触过编程的小伙伴来说可能还是有些抽象,其实自己有做一些功能很简单的技能和状态,原本觉得没什么发出来的价值,但可能对完全没有基础的小伙伴来说能起一些帮助。
有考虑过逐句解析一下各个语句的具体作用,但其实我对js完全没有了解,对其它语言的编程水平也不高,如果讲起来肯定会有相当多的错误,就不误人子弟,仅单纯的分享一些范例好了。
这种非常简单的范例我就说的更详细一些,还会附上一些插件的使用方法,针对完全一点都不懂YEP插件和编程的小伙伴。但因为我也是初学者,可能会有错误,请大家指出

先分享两个:
第一个是YEP范例里有的,仿制了LOL中安妮的Q技能。
当该技能击杀目标后,会返还该技能消耗的蓝量。
需要用到的插件有:技能核心,立即释放(可选)

初学者可能会疑惑,在这些代码中类似于<Post-Damage Eval>或者其他的类似这种的标识到底起何作用。
按照我个人的理解,这些通常是起一个“时点”的作用,玩过游戏王的朋友应该清楚这个概念,说白了就是控制效果具体在哪个阶段生效的。
以<Post-Damage Eval>为例,在<Post-Damage Eval>和</Post-Damage Eval>之间的所有代码,只会在技能对敌人造成伤害后才生效。
也就是说,如果这个技能没有造成伤害(例如miss了,被敌人防反了),那么这段代码就不会生效。具体这些东西对应哪些时点,我上面都有翻译,其实YEP的插件说明里也写的非常详细,是很好理解的一个东西。

<Post-Damage Eval>  //在造成伤害之后生效。为何用这个时点很好理解,我要确定我这个技能杀死了敌人,那当然是要在造成伤害后。
if (target.hp <= 0) {  //如果敌人生命值小于等于0则执行下面的指令。if else语句是非常基础且常用的编程语句,如果连这个都不清楚的话可以把它想象成RM里的“分支条件”,效果上几乎差不多。要是连分支条件是什么都不知道……那还是别急着用插件了。
  user.gainMp(item.mpCost);  //给予使用者该技能消耗的MP值。 user就是使用者,上面语句中target就是目标,target.hp就是目标生命值的意思,user.gainMp就是使用者获得MP的意思,其实这种语句直接把单词翻译一下都能知道大概起什么作用,不要因为看见                  
                                          // 编程语句就感觉很困难很复杂,只要肯自己花点心思,这些都是小儿科。
}
</Post-Damage Eval>  

<Instant Cast>  // 立即释放标志。有立即释放插件的话,这个技能就会变成不消耗行动数可以直接释放的技能。

第二个:用MP来顶伤害。就是受到攻击时角色可以用MP来顶替掉一部分HP的损失。称为魔力护盾
需要的插件有:状态核心

<Custom React Effect> // 被确定命中,但未造成伤害时生效。选这个时点也很好理解,我要用MP来代替HP的损失,所以要先判断敌人这一招真的命中我了,然后在造成伤害之前判定我的MP去代替HP伤害
if (value > 0 && this.isHpEffect()) {  // 如果这次攻击的伤害值大于0且是对生命值的一次攻击
  var mpDmg = Math.floor(value * 0.85); // 定义变量mpDmg。var就是定义变量的指令,后面的mpDmg是变量名称,名称随便叫什么都好,只要你自己看得懂且不与其他变量冲突想叫什么叫什么。Math.floor()函数的作用是向下取整,以免伤害出现小数
                                                           // 这里定义,让MP去承担本次伤害的85%,如果你改成1,那就是完全用MP去承受伤害。
  mpDmg = Math.min(mpDmg, target.mp);  // Math.min()函数是判断两个函数的大小,取里面最小的那个。也就是考虑到角色MP不足以承担85%的伤害时,那就有多少承担多少。
  target.gainMp(-mpDmg);  // 给予角色MP伤害
  value -= mpDmg;  // 再让原本应该造成的伤害减去角色损失的MP
  if (target.mp === 0) {  // 当角色MP归零时
    target.removeState(71);  // 移除魔力护盾的buff
  }
}
</Custom React Effect>
作者: woliebe    时间: 2023-4-15 17:12
2669483303 发表于 2023-4-15 04:51
敌人是否死亡会有个死亡状态,编辑器里默认是1号,可以在动作序列里用if target.isStateAffected(X)判断 ...

我发现其实我设想的这个技能的之前逻辑有问题。应该是技能攻击结算效果后,然后判定敌人的血量,是 >0还是 <=0 ,然后再判断行动是否再攻击一次。我还没试出来,准备今天再试试

作者: woliebe    时间: 2023-4-15 18:40
zhufeng233 发表于 2023-4-15 15:49
之前更新的一些技能和状态虽然逻辑上不复杂难度也不高,但对于一些完全没有接触过编程的小伙伴来 ...

我看了你这段解释,然后试着写那个技能,就是给敌人造成伤害,杀死它后,再普通攻击一次
<Post-Damage Eval>
if(target.hp <= 0){
            user.startAnimation(1)
            var 1: existing enemies;
            target.startDamagePopup();
            }else{user.removeState(13)}
</Post-Damage Eval>
现在的结果是不通过。。。。。显示bug准备再学习下

作者: zhufeng233    时间: 2023-4-15 23:48
woliebe 发表于 2023-4-15 18:40
我看了你这段解释,然后试着写那个技能,就是给敌人造成伤害,杀死它后,再普通攻击一次

if(target.hp  ...

老哥,我又尝试了几个小时,实在是有点黔驴技穷了,目前做出来的效果是角色攻击后如果目标没有死亡就会追击一次同等伤害的攻击,但不论目标有没有死亡都会再追加一次普通攻击的伤害。
我目前的能力实在是做不到灵活的判断技能的生效范围,其实理论上最简单的方式是用强制攻击:BattleManager.queueForceAction(user, skillid, -2);
但是强制攻击这个东西bug非常非常多,我在多次测试后发现,如果用if判断角色生命值和是否死亡,里面再写强制攻击,那被第一次攻击的目标会强行不死,剩0血就是没死,真的非常之离谱。
走到这一步我也真是想不出别的法子了,可能还要等进一步学习吧,我把目前做出的效果放出来
要用到技能核心,伤害核心和范围核心:

<Damage Formula>
this._commondamage = this._commondamage || 0;
this._skilldamage = user.mat * 2 + 1000;
value = this._commondamage || this._skilldamage;
var successRate = 0.3;
if(!target.isDead() && target.hp > 0 && this._commondamage == 0){
  if(Math.random() < successRate){
    target.gainHp(-value);
    target.startDamagePopup();
  }
}
this._commondamage = user.atk * 2;
</Damage Formula>

<Custom Target Eval>
targets.push(target);
var members = foes.aliveMembers();
members.splice(members.indexOf(target), 1);
var member = members[Math.floor(Math.random() * members.length)];
if (member) {
  targets.push(member);
  members.splice(members.indexOf(member), 1);
}
}
</Custom Target Eval>
作者: woliebe    时间: 2023-4-16 10:13
xiamumomo 发表于 2023-4-12 22:34
http://www.yanfly.moe/wiki/Category:RPG_Maker_MV_Plugin_Tips_%26_Tricks 可以参考学习Yep180多个高级 ...

高手,我看了你发的那个180多个高级状态的网站,中间有个技能是治疗链接,在治疗目标的同时给自己回血,按照他原有的指令,没有实现这个效果。然后我自己尝试改了一下,改成了:
<Custom React Effect>
if(value>0){
  var heal= Math.floor(value*0.5);
  var value= 50+a.mat
  origin.gainHp(heal)
  origin.startDamagePopup();
  origin.clearResult();
}
</Custom React Effect>
但是最后还是没有任何反应,请问是什么问题?

作者: woliebe    时间: 2023-4-16 10:23
zhufeng233 发表于 2023-4-15 23:48
老哥,我又尝试了几个小时,实在是有点黔驴技穷了,目前做出来的效果是角色攻击后如果目标没有死亡就会追 ...

已经很厉害了,非常感谢。光看你写的这个公式我都是晕的。我感觉你的思路是在判定以后,通过目标减少血量来做的。在MV中有个状态时攻击追加一次。所以我现在的想法就是在技能伤害计算完成后,通过判定来马上实现这个再追加一次攻击的状态。这次你写的那个cunston target Eval是很有帮助的,怎么去让它自动攻击下一个敌人。我记得这个技能其实在大千世界里面已经实现了。可能还是需要更多的学习。我还远远做不到像你这样自如的写。
再次感谢!!!! 继续学习

作者: woliebe    时间: 2023-4-16 17:14
本帖最后由 woliebe 于 2023-4-16 17:16 编辑
zhufeng233 发表于 2023-4-15 23:48
老哥,我又尝试了几个小时,实在是有点黔驴技穷了,目前做出来的效果是角色攻击后如果目标没有死亡就会追 ...


刚才想问的自己明白了

作者: zhufeng233    时间: 2023-4-16 21:26
woliebe 发表于 2023-4-16 17:14
刚才想问的自己明白了

哥们,问题终于解决了,多亏了有大佬相助。
代码放出来:

<After Eval>
if(target.isDead() || target.hp <= 0){
  target.removeImmortal();
  target._immortal = false;
  BattleManager.queueForceAction(user, 1, -1);
}
</After Eval>

根据那位大佬的解释,是在一些时点下,连续攻击的动作在结束前如果杀死目标,会给目标附带一个不朽的状态,直到连续攻击完全结束后才会杀死目标。所以才导致昨天碰到的目标会剩0hp强行不死的情况,用  target._immortal = false;取消目标的不朽状态就行了
作者: xiamumomo    时间: 2023-4-16 22:39
woliebe 发表于 2023-4-16 10:13
高手,我看了你发的那个180多个高级状态的网站,中间有个技能是治疗链接,在治疗目标的同时给自己回血, ...

他每个都有视频教程但是是YOUTUBE需要翻墙才能看  你可以用手机挂VPN看  
作者: zhufeng233    时间: 2023-4-17 11:14
更新个简单的技能咯,效果上大概是,攻击拥有处于该状态的人时,可以恢复造成伤害值20%的HP。
其实就是让对方变成血包,大家打它就能抽血。
需要用到状态核心

<Custom Respond Effect>  // 被命中且造成伤害时触发
if (value > 0 && this.isHpEffect()) {  // 如果受到大于0的伤害
  Hprecover = Math.floor(value * 0.2);  // 定义变量 值为伤害值的0.2倍
  user.gainHp(Hprecover);  // 攻击方回血
  user.startDamagePopup();   // 显示回血数字
}
</Custom Respond Effect>

作者: 是阿浪啊啊    时间: 2023-4-17 11:53
感谢大佬666
作者: 是阿浪啊    时间: 2023-4-17 11:54
感谢大佬666
作者: jie119168    时间: 2023-4-17 12:45
zhufeng233 发表于 2023-4-17 11:14
更新个简单的技能咯,效果上大概是,攻击拥有处于该状态的人时,可以恢复造成伤害值20%的HP。
其 ...

是不是漏了 var?我看js的变量第一次初始化都要写的。
作者: zhufeng233    时间: 2023-4-17 12:58
jie119168 发表于 2023-4-17 12:45
是不是漏了 var?我看js的变量第一次初始化都要写的。

我原本也是这么想的,但没有var也生效了,我不太懂js基本都是能跑就行
作者: zhufeng233    时间: 2023-4-17 13:08
又做了个状态,也比较简单:大概效果是拥有此状态的人,每受到一次攻击就会累加1层计数,当计数到5层时,下一次受到攻击后还会附加攻击者atk*2+mat*10的伤害。
原本应该是很简单的一个状态,但因为一个小问题卡了我一个小时真是头大。
需要用到状态核心

<Custom Apply Effect> //获得状态时生效
target._lei = target._lei || 0; //初始化计数变量并赋值
</Custom Apply Effect>

<Custom Respond Effect> //受到伤害时生效
if (value > 0 && this.isHpEffect() && target._lei >= 0 && target._lei <= 5) { //判断本次伤害是否大于0,且计数范围在0~5内
  target._lei += 1;  //计数+1
  target.addStateCounter(188, 1);  //计数+1
  target.clampStateCounter(188, 0, 5);  //限制计数范围在0~5之间
}
</Custom Respond Effect>  

<Custom Deselect Effect>  //这里就是我卡了一个小时的主要原因,原本这个时点下的指令我是放在了上面的时点里,按照我的理解,在造成伤害后判断计数值然后再造成额外伤害,逻辑上好像没问题,但实际上会出现奇妙的bug,具体我就不说了,总之实现不                 
                                          了功能。必须要放在这个时点下(一切结算完毕后)才能正常生效,如果是初学者想做类似功能请务必注意这一点。
if(target._lei >= 6){   //如果计数达到或超过6
  Hpdamage = Math.floor(a.atk * 2 + a.mat * 10);  //定义额外伤害变量,取角色atk*2+mat*10,向下取整
  target.gainHp(-Hpdamage);  //给予伤害
  target.startDamagePopup();  //弹出伤害数字
  target._lei = 0;  //将计数清零
  target.setStateCounter(188, 0);  //将计数清0
}
</Custom Deselect Effect>

<Custom Leave Effect>  //当移除状态时
target._lei = 0;  //计数清零
user.setStateCounter(188, 0);  //计数清零
</Custom Leave Effect>
作者: luoyi1002    时间: 2023-4-17 18:27
感谢大佬            
作者: 2669483303    时间: 2023-4-17 23:26
woliebe 发表于 2023-4-15 17:12
我发现其实我设想的这个技能的之前逻辑有问题。应该是技能攻击结算效果后,然后判定敌人的血量,是 >0还 ...

<0就可以了,<=0可能会出现小数点后面没取整0.00000001这类情况导致没进判定
作者: zhufeng233    时间: 2023-4-18 00:08
开始做一套完整体系的技能组,等做好了一并放出来,所以这段时间就不怎么更新新技能了
作者: 是阿浪啊    时间: 2023-4-18 09:11
水水更健康。
作者: woliebe    时间: 2023-4-19 09:30
xiamumomo 发表于 2023-4-16 22:39
他每个都有视频教程但是是YOUTUBE需要翻墙才能看  你可以用手机挂VPN看

我是看了视频教程的,但是同样的公式他好像生效了,我复制到自己这边就没反应。。不晓得是因为Yep 版本的问题不

作者: woliebe    时间: 2023-4-19 09:43
zhufeng233 发表于 2023-4-16 21:26
哥们,问题终于解决了,多亏了有大佬相助。
代码放出来:

多谢了。这几天有别的事忙一直没上线。
刚才把你最新写的代码放到之前的后面了
但是还是显示Bug,我也搞不清哪里出问题了。我把标点符号用英文重新复写了一次,还是不行。
没事了,你忙你的,我先搞别的技能先。

作者: zhufeng233    时间: 2023-4-19 09:43
woliebe 发表于 2023-4-19 09:43
多谢了。这几天有别的事忙一直没上线。
刚才把你最新写的代码放到之前的后面了
但是还是显示Bug,我也搞 ...

不用放在之前的后面,单独拿那段代码做一个技能就好
作者: xiamumomo    时间: 2023-4-19 22:24
woliebe 发表于 2023-4-19 09:30
我是看了视频教程的,但是同样的公式他好像生效了,我复制到自己这边就没反应。。不晓得是因为Yep 版本的 ...

那你更新一下咯  论坛有人发一整套Yep的如果还是不行再说
作者: zhufeng233    时间: 2023-4-21 19:23
芜~经过几天的鏖战,终于把自己目前角色的技能做的差不多了,之后就挑一些有价值的技能来分享一下
作者: woliebe    时间: 2023-4-22 09:59
zhufeng233 发表于 2023-4-21 19:23
芜~经过几天的鏖战,终于把自己目前角色的技能做的差不多了,之后就挑一些有价值的技能来分享一下 ...

厉害我做的进度很慢,才做了几个。你这个效率真是杠杠的,向你学习
作者: woliebe    时间: 2023-4-22 10:00
xiamumomo 发表于 2023-4-19 22:24
那你更新一下咯  论坛有人发一整套Yep的如果还是不行再说

嗯,我去找那个整套的,更新下再看看
作者: woliebe    时间: 2023-4-22 16:09
本帖最后由 woliebe 于 2023-4-22 16:36 编辑
zhufeng233 发表于 2023-4-19 09:43
不用放在之前的后面,单独拿那段代码做一个技能就好


好的,知道了,谢谢
我用后面那一段实现了再次追击敌人一次的效果。
还想请问一个具体的参数
BattleManager.queueForceAction(user, 1, -1);
这个强制行为中, -1 代表的是什么? 减少行动计数1次是吗?




作者: zhufeng233    时间: 2023-4-22 18:21
woliebe 发表于 2023-4-22 16:09
好的,知道了,谢谢
我用后面那一段实现了再次追击敌人一次的效果。
还想请问一个具体的参数

-1是目标,-1指的是随机一个目标,-2是上一个目标。前面的1是技能ID
作者: woliebe    时间: 2023-4-22 21:33
zhufeng233 发表于 2023-4-14 23:51
彻底晕厥,想要用YEP范例中的Dualcast,也就是双重吟唱。但别说自己改了,哪怕直接套用YEP的范例 ...

我重新思考了一下那个30%几率再释放技能一次的方式
<After Eval>
  if(Math.random()<=0.3){
  BattleManager.queueForceAction(user, 39, -1)
  }else{BattleManager.queueForceAction(user, 36, -1);
}
</After Eval>
我把70%设置为完成后释放36技能,技能栏为空白,30%几率可以再释放39技能一次。
可惜不知道有啥办法能强制什么技能都不放回到原地,还是会有一个多余一点的动作;
作者: woliebe    时间: 2023-4-22 21:34
zhufeng233 发表于 2023-4-15 23:48
老哥,我又尝试了几个小时,实在是有点黔驴技穷了,目前做出来的效果是角色攻击后如果目标没有死亡就会追 ...

别纠结了,我准备把之前的想法拆成2个技能,一个技能是30%几率再释放一次,一个是杀死敌人后再攻击下一个敌人
现在基本都实现了。

作者: luoyi1002    时间: 2023-4-26 11:22
感谢楼主,辛苦了
作者: zhufeng233    时间: 2023-5-19 23:08
自己游戏目前几个主要角色的技能都设计完毕,初步测试也没有发现什么大的问题。
经过这段时间的学习,自己对YEP的这几个插件逐渐了解,能够独立设计一些不是很复杂的技能。
现在正在写一篇比较系统的,有关YEP设计技能相关的教程,会在里面尽可能的详细写下如何学习这些插件,如何独立设计技能。
可能要写一段时间,届时会重新发一贴,希望能够帮到有需要的人
作者: 2669483303    时间: 2023-5-20 03:19
zhufeng233 发表于 2023-4-17 13:08
又做了个状态,也比较简单:大概效果是拥有此状态的人,每受到一次攻击就会累加1层计数,当计数到5层时,下 ...

这应该是布隆的被动那种效果吧
作者: zhufeng233    时间: 2023-5-20 23:39
有关YEP设计技能的教程已发到P1论坛,大家有兴趣可以去看看,我有关用YEP设计技能的心得都写在那里面了,本贴也就不更新了




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