Project1

标题: 关于回避的几个小问题…… [打印本页]

作者: ex悠米桑    时间: 2023-1-16 18:50
标题: 关于回避的几个小问题……
我把问题汇总了一下,大概是这么几个:
1、我想要设置一个角色,他的特性是不会miss。于是我在他的词条里写了命中率+1000%,本以为这样他就绝对命中了,结果经过测试发现, 依旧会受到敌人回避率的影响……只要敌人回避率提高了,你该打不中还是打不中(有一些敌人HP特别低,但是回避率特别的高,他就是应对这种怪诞生的角色)。我又不想把每个技能都设置成【必定命中】,因为这些技能还有其他角色在用,技能绝对命中就无法区分角色特性了……请问大家有没有什么好的想法能解决?
2、我发现,反击是回避的上级状态,如果触发了反击,那么既不会受伤,还能反击对手。那么能不能想办法设置成,反击之前也会收到伤害呢?顺便问一句,除了技能的【必定命中】之外,有没有办法做一个无视反击、无视回避的技能或者状态?还有,有没有办法设置反击技能呢?不用普通攻击回击,而是用某某技能回击之类的。
3、有没有办法做一个技能,他是二段触发的,如果对方中招,那么就受伤,如果miss,就触发二段效果。我试着用公共事件写过类似连续触发的效果,但是套用在回避上不成功,但是如果技能打空,它就不会执行公共事件了……
希望能得到各路大佬的指点,分享经验也好,分享脚本也好,哪怕只是一起交流交流也好,提前谢谢大家了。
作者: dabaxhei    时间: 2023-1-16 20:51
用yanfly的插件吧
作者: 我是大仙    时间: 2023-1-16 22:53
本帖最后由 我是大仙 于 2023-1-17 12:31 编辑

你好,我写了一个小插件用以解决这些问题。

请把这些插件内容放到一个 某某某.js文件里,插到RMMZ里。

它的使用方法是:在角色的备注里写上<bimi>,那么他的所有行为全部被视为命中,不会被闪避。

第二个问题,脚本里的反击前增加了受伤判定,这样反击者也会受到技能伤害等效果,无需额外操作。

至于第三个问题的解决方法,是在你需要的技能的备注里填上<skid:另一个技能的ID>,这样就达到“如果这个技能被闪避了,则使用另一个技能”的效果,这里直接启用另一个技能的伤害计算以及它的技能效果。至于另一个技能要产生什么效果,你可以在它的效果里弄一个公共事件,当然,如果不填<skid>,这个技能就是普通技能,被闪避了也不会怎么样。

刚刚在电脑上运行了一下应该没问题了。

还有就是我才发现miss在这个RMMZ里实际上是"技能未命中"的意思(missed),是技能不成功,只与技能成功率有关,而敌人的闪避指的是evaded,这与敌人的闪避率直接挂钩,虽然最后在游戏中也会显示miss,这里要注意区分一下。

我想你要设计的“人物不会miss”的效果应该指的是“敌人无法闪避该人物的攻击和技能”这个意思吧?

JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // RPG Maker MZ - TriQuestion
  3. //=============================================================================
  4.  
  5. /*:
  6.  * @target MZ
  7.  * @plugindesc TriQuestion
  8.  * @author Errke
  9.  *
  10.  * @help TriQuestion.js
  11.  * For Three Question.
  12.  *
  13.  *
  14.  */
  15.  
  16. (() => {
  17. //第一个问题的解决方法 和 第三个技能解决方法
  18. Game_Action.prototype.apply = function(target) {
  19.     const result = target.result();
  20.     this.subject().clearResult();
  21.     result.clear();
  22.     result.used = this.testApply(target);
  23.     result.missed = result.used && Math.random() >= this.itemHit(target);
  24.     result.evaded = !result.missed && Math.random() < this.itemEva(target);
  25.     result.physical = this.isPhysical();
  26.     result.drain = this.isDrain();
  27. //修改命中条件,只要是备注里有<bimi>,必定命中。
  28.     if (result.isHit() || (this.subject().isActor() && $dataActors[this.subject()._actorId].meta.bimi) ){
  29.         result.evaded = false;
  30.         if (this.item().damage.type > 0) {
  31.             result.critical = Math.random() < this.itemCri(target);
  32.             const value = this.makeDamageValue(target, result.critical);
  33.             this.executeDamage(target, value);
  34.         }
  35.         for (const effect of this.item().effects) {
  36.             this.applyItemEffect(target, effect);
  37.         }
  38.         this.applyItemUserEffect(target);
  39. //如果没命中的情况下,使用这个技能备注里<skid>后的技能。
  40.     }else if (!result.isHit() && $dataSkills[this.item().id].meta.skid){
  41.      var jineng = Number($dataSkills[this.item().id].meta.skid);
  42.         this.subject().forceAction(jineng,this.subject()._lastTargetIndex);
  43.      }
  44.     this.updateLastTarget(target);
  45. };
  46.  
  47. //第二个问题解决方法
  48. BattleManager.invokeAction = function(subject, target) {
  49.     this._logWindow.push("pushBaseLine");
  50.     if (Math.random() < this._action.itemCnt(target)) {
  51.         this.invokeNormalAction(subject, target);
  52.         this.invokeCounterAttack(subject, target);
  53.     } else if (Math.random() < this._action.itemMrf(target)) {
  54.         this.invokeMagicReflection(subject, target);
  55.     } else {
  56.         this.invokeNormalAction(subject, target);
  57.     }
  58.     subject.setLastTarget(target);
  59.     this._logWindow.push("popBaseLine");
  60. };
  61. })();

作者: apple5740    时间: 2023-1-18 06:49
第一点用真实伤害的技能可以达到效果吗
作者: ex悠米桑    时间: 2023-1-22 19:34
我是大仙 发表于 2023-1-16 22:53
你好,我写了一个小插件用以解决这些问题。

请把这些插件内容放到一个 某某某.js文件里,插到RMMZ里。

谢谢大佬的脚本!帮了大忙了!再能弱弱的问一句,有办法做出【用某某技能当做反击技能】的效果吗?比如,正常情况下,我挨打就是用攻击来反击敌人。但是如果我学到了某个反击用的技能,当敌人攻击我的时候,我就会用这个技能反击。
作者: 我是大仙    时间: 2023-1-23 14:38
本帖最后由 我是大仙 于 2023-1-23 14:43 编辑
ex悠米桑 发表于 2023-1-22 19:34
谢谢大佬的脚本!帮了大忙了!再能弱弱的问一句,有办法做出【用某某技能当做反击技能】的效果吗?比如, ...


我把脚本改进了一下。

使用方法:
在需要的技能备注里写上<forActor:某个角色的ID>,这样一来,只要这个角色已经学习了此技能就可以在其反击的时候施放这个技能。

考虑到可能不同阶段会有不同的技能设计,譬如角色在10级的时候的反击是“小反击”,而到了20级就换成技能“大反击”,我在这个项目里加了一个“优先度”的指标。

就是有两个技能都是某个角色的反击技能,你可以分别在每个技能的备注里写上<lev:数字>,数字越大,优先度越高,反击只会采用优先度高的施放。如果不写<lev:数字>,默认优先度是-1.

另外就是,功能是实现了,但是RMMZ的脚本原来的反击逻辑就是只打伤害,不显示动画(你可以测试一下),所以这个脚本采用原来的逻辑,只打伤害,不显示动画

伤害标字也有些问题,我还得研究一下这个标字的精灵是怎么运作的。

总之,暂时功能是实现了,就是显示方面还有点问题,闲了的话我调整一下。

海外应该早有这种脚本了,或许去外国的RMMZ插件网站搜一下反击相关内容就可以找到优质脚本。

JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // RPG Maker MZ - TriQuestion
  3. //=============================================================================
  4.  
  5. /*:
  6.  * @target MZ
  7.  * @plugindesc TriQuestion
  8.  * @author Errke
  9.  *
  10.  * @help TriQuestion.js
  11.  * For Three Question.
  12.  *
  13.  *
  14.  */
  15.  
  16. (() => {
  17. //第一个问题的解决方法 和 第三个技能解决方法
  18. Game_Action.prototype.apply = function(target) {
  19.     const result = target.result();
  20.     this.subject().clearResult();
  21.     result.clear();
  22.     result.used = this.testApply(target);
  23.     result.missed = result.used && Math.random() >= this.itemHit(target);
  24.     result.evaded = !result.missed && Math.random() < this.itemEva(target);
  25.     result.physical = this.isPhysical();
  26.     result.drain = this.isDrain();
  27. //修改命中条件,只要是备注里有<bimi>,必定命中。
  28.     if (result.isHit() || (this.subject().isActor() && $dataActors[this.subject()._actorId].meta.bimi) ){
  29.         result.evaded = false;
  30.         if (this.item().damage.type > 0) {
  31.             result.critical = Math.random() < this.itemCri(target);
  32.             const value = this.makeDamageValue(target, result.critical);
  33.             this.executeDamage(target, value);
  34.         }
  35.         for (const effect of this.item().effects) {
  36.             this.applyItemEffect(target, effect);
  37.         }
  38.         this.applyItemUserEffect(target);
  39. //如果没命中的情况下,使用这个技能备注里<skid>后的技能。
  40.     }else if (!result.isHit() && $dataSkills[this.item().id].meta.skid){
  41.      var jineng = Number($dataSkills[this.item().id].meta.skid);
  42.         this.subject().forceAction(jineng,this.subject()._lastTargetIndex);
  43.     }
  44.     this.updateLastTarget(target);
  45. };
  46.  
  47. //第二个问题解决方法
  48. BattleManager.invokeAction = function(subject, target) {
  49.     this._logWindow.push("pushBaseLine");
  50.     if (Math.random() < this._action.itemCnt(target)) {
  51.         this.invokeCounterAttack(subject, target);
  52.         this.invokeNormalAction(subject, target);
  53.     } else if (Math.random() < this._action.itemMrf(target)) {
  54.         this.invokeMagicReflection(subject, target);
  55.     } else {
  56.         this.invokeNormalAction(subject, target);
  57.     }
  58.     subject.setLastTarget(target);
  59.     this._logWindow.push("popBaseLine");
  60. };
  61.  
  62.  
  63. //使得反击可以选择不同的技能
  64.  
  65. BattleManager.invokeCounterAttack = function(subject, target) {
  66.     const action = new Game_Action(target);
  67.     action.setCounterSkill();
  68.     action.apply(subject);
  69.     this._logWindow.displayCounter(target);
  70.     this._logWindow.displayActionResults(target, subject);
  71. };
  72.  
  73. Game_Action.prototype.setCounterSkill = function() {
  74.     if(this.subject().isActor()){
  75.         var skillarrey =  this.subject().skills().filter(r => r.meta.forActor);
  76.         if(skillarrey.length > 0){
  77.         var compare = function (obj1, obj2) {
  78.             var val1 = obj1.meta.lev ? Number(obj1.meta.lev) : -1;
  79.             var val2 = obj2.meta.lev ? Number(obj2.meta.lev) : -1;
  80.             if (val1 < val2) {
  81.                 return 1;
  82.             } else if (val1 > val2) {
  83.                 return -1;
  84.             } else {
  85.                 return 0;
  86.             }            
  87.         }
  88.         skillarrey.sort(compare);
  89.             //if(this.subject().isLearnedSkill(skillarrey[0].id)){
  90.                 this.setSkill(skillarrey[0].id);
  91.             //}
  92.         }else{
  93.             this.setSkill(this.subject().attackSkillId());
  94.         }
  95.  
  96.     }else{
  97.         this.setSkill(this.subject().attackSkillId());
  98.     }
  99. };
  100. })();

作者: 我是大仙    时间: 2023-1-23 15:19
ex悠米桑 发表于 2023-1-22 19:34
谢谢大佬的脚本!帮了大忙了!再能弱弱的问一句,有办法做出【用某某技能当做反击技能】的效果吗?比如, ...

https://plugin-mz.fungamemake.com/archives/2270

我刚找着一个反击扩张的插件,你直接用这个就行了。

トリアコンタン的,看一下他的使用协议。
作者: ex悠米桑    时间: 2023-1-23 17:18
本帖最后由 ex悠米桑 于 2023-1-23 17:50 编辑
我是大仙 发表于 2023-1-23 15:19
https://plugin-mz.fungamemake.com/archives/2270

我刚找着一个反击扩张的插件,你直接用这个就行了。


谢谢大佬!辛苦大佬修改脚本了!还帮我找到了反击插件,真是太感谢了……其实这个作者的脚本,我之前在fungamemaker上找到了……但是他几乎所有的脚本都需要基础插件PluginCommonBase,而唯独这个基础插件在作者主页上找不到233尴尬的不得了,我就是因为这个脚本用不了,才来论坛一起求攻略的。

——————编辑——————
感谢有大佬补充,我已经在steam目录里找到这个脚本了!(为啥要藏的这么隐秘啊233这没人告诉我我大概一辈子也找不到)。这个反击插件已经可以正常使用了!就是没有反击动画,美中不足233




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