Project1

标题: 一个技能 对的人造成两次不同类型的伤害 [打印本页]

作者: 捕食者    时间: 2022-9-16 08:15
标题: 一个技能 对的人造成两次不同类型的伤害
如题,希望这个技能对敌人造成生命伤害的同事也造成法力伤害 ,而且这两个伤害都和双方属性相关,分别使用不同的计算公式 而不是百分比或固定数值
有yep的一套核心插件
尝试过公共事件,但暂时没有找到技能发动者确认的方法
请大神解答,谢谢
作者: apple5740    时间: 2022-9-16 12:05
本帖最后由 apple5740 于 2022-9-16 12:11 编辑

https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

这两个帖子是否能提供帮助呢?
作者: 捕食者    时间: 2022-9-16 13:03
apple5740 发表于 2022-9-16 12:05
https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

非常感谢哈
很有帮助,我几乎是小白,对于第二个链接中的,技能发动者  如何确认为 技能发动者,因为角色索引号好像只能对应唯一的角色,怎么能做到是同一个角色发动,不知道我表达清楚了没有,谢谢!
作者: 捕食者    时间: 2022-9-16 13:08
apple5740 发表于 2022-9-16 12:05
https://rpg.blue/thread-490971-1-1.html

https://rpg.blue/thread-490780-1-2.html

对于上一个使用的技能  以及 上一个技能释放者;我在公共事件中尝试过后者,但好像效果全部到了角色1那里
作者: apple5740    时间: 2022-9-16 13:31
本帖最后由 apple5740 于 2022-9-16 14:30 编辑
捕食者 发表于 2022-9-16 13:08
对于上一个使用的技能  以及 上一个技能释放者;我在公共事件中尝试过后者,但好像效果全部到了角色1那里 ...


因为我还没有学习到这个部分,也是小白了!
不过我参考第一个帖子的回答。
可以通过修改一个方法可能达到你需要的效果,具体思路是这样的,一起来学习把。
因为使用技能,相当于角色一个动作也就是action,那么我们可能需要修改action,当角色触发这个action时,同时做其他的事情。

代码复制
  1. var new_Game_Action_prototype_apply = Game_Action.prototype.apply;
  2. Game_Action.prototype.apply = function(target){
  3.     new_Game_Action_prototype_apply.call(this,target);
  4.     //如果是魔法技能,且技能id是2  则再造成一次伤害,这个条件可以按照你的需求更改
  5.     if(this.isMagicSkill() && this.item().id == 2){
  6.         //对目标再造成一次伤害 value 为伤害数值, 这个伤害数值,也可以按照你的需求进行导入公式,或者再强制执行一次技能
  7.         //看到楼下的提醒才知道, executeDamage 这个方法里面还有一个判断,。。抱歉如果要直接执行hp伤害的话就用下面的方法把。或者直接target.gainHp(-value);?
  8.         this.executeHpDamage(target, value);
  9.     }


//强制执行一次技能,参考第二个帖子,将  this.executeDamage(target, value);  这句改为下面的。
Game_Interpreter.prototype.command339([1,1,12,target]);

大概思路是制作一个插件,并重写 执行动作的方法,并将你的需求,加入到这个方法中。这是一个思路,可能会有很多问题,我并没有测试。。

最后
我在这个 Game_Action.prototype.apply 方法中 发现this.subject() 可能就是指技能发动者。
因为在  rmmz_object.js这个文件 中看到了下面的语句。。
/* 主体 */
Game_Action.prototype.subject = function() {
    if (this._subjectActorId > 0) {
        return $gameActors.actor(this._subjectActorId);
    } else {
        return $gameTroop.members()[this._subjectEnemyIndex];
    }
};

你的思路是寻找到技能发动者,让技能发动者再发动一次技能,我感觉也是可行的,总之有很多种解决问题的方式。但是这个思路,我之前也是这样想的,但我并没有参考资料。。所以不能做更多的回答了
作者: 橙光    时间: 2022-9-16 14:07
本帖最后由 橙光 于 2022-9-16 14:24 编辑

技能发动实际上一个技能行动的模拟。
Game_Action的内容其实就是在对一次行动的模拟,在实例化的时候会指定一个行动主体,意为行动者,也就是技能的发动者,这个技能行动的.subject()就可以获取技能的行动者。如果玩家是技能行动的发起者,那么就是玩家,同理敌人。
然后是行动的setTarget(targetIndex)指定了在目标队列(Game_Troop/Game_Party)的序列编号。他是在makeTargets()的时候 作为作用单体目标的一个指引。你可以理解为单体目标行动的敌人编号。
最后是对这个行动设置是什么行动,就有四种行动setAttack(攻击行动) setSkills(skillId)技能行动 setGuard()防御行动 setItem(itemId)道具行动 实际上在MZ这些除了道具都整合为了技能行动。
也就是说当设置了一个Game_Action 并指定了上述的参数,通过对action的apply方法即可发动应用效果。
executeDamage() 是执行伤害效果的方法 主要内容包括对物理攻击还是魔法攻击判定补正的一系列内容,如果对数值的计算 也可以找makeDamageValue()方法。

最后由于对画面的视觉显示以及伤害文字的显示由sprite控制并非action直接控制,所以可能你还需要对Sprite_Damage和调用他的Sprite_Battler有所了解。
作者: 橙光    时间: 2022-9-16 14:28
本帖最后由 橙光 于 2022-9-16 14:50 编辑
橙光 发表于 2022-9-16 14:07
技能发动实际上一个技能行动的模拟。
Game_Action的内容其实就是在对一次行动的模拟,在实例化的时候会指定 ...


楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。

你可以在同一个行动内直接扣除两次伤害,也可以做两次行动分别触发不同的技能。思路有很多,但每个思路都需要对Game_Action有一定基础了解。
想要获取到上个行动者 只需要在这次行动执行的时候 把行动者的索引(就是编辑器里面那个序号) 返回出去到游戏变量$gameVariables里或者某个可重复访问的变量也行。
比如在生成也好还是apply里加也好,$gameVariables.setValue(10,$gameParty.index(action.subject())) //action代表Game_Action实例对象 然后去指定这个变量存储的索引的角色就差不多了吧。
其实嫌麻烦 会点代码 也可以直接简略一点,直接代码控制。
作者: apple5740    时间: 2022-9-16 14:31
橙光 发表于 2022-9-16 14:28
楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。 ...

感谢,我也一起学习了!
作者: apple5740    时间: 2022-9-16 14:55
橙光 发表于 2022-9-16 14:28
楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。

你 ...

$gameVariables.setValue(10,$gameParty.index(action.subject()));
//action代表Game_Action实例对象
这个实例对象是存在于角色中的_actions[]那个数组里面的吗?
作者: 橙光    时间: 2022-9-16 15:08
apple5740 发表于 2022-9-16 14:55
$gameVariables.setValue(10,$gameParty.index(action.subject()));
//action代表Game_Action实例对象
这 ...


可以那么理解,他会遍历这个数组直到没有行动可以执行了,就进行下一阶段。原来rgss也是这流程。
作者: apple5740    时间: 2022-9-16 15:13
橙光 发表于 2022-9-16 15:08
可以那么理解,他会遍历这个数组直到没有行动可以执行了,就进行下一阶段。原来rgss也是这流程。 ...

感谢您的解答!这个过程越来越清晰真是太棒了!
作者: 捕食者    时间: 2022-9-17 18:21
橙光 发表于 2022-9-16 14:28
楼主的问题对于法力等一个词没有描述清楚,所以无法给出详细方案,你可以参考一下以上思路进行修改。

你 ...

非常感谢详细的回复哈,我会尝试去学习,对于法力伤害,要表达的是MP的损失;
也就是这个技能  对目标 造成 HP的伤害  同时 也造成 MP的伤害   两个伤害都需要使用公式计算
这两个伤害  可以在一个技能完成  或者  也可以一个技能发生后 启动后续的技能发生   
不知道这样是否表达清楚了哈
作者: apple5740    时间: 2022-9-17 23:08
本帖最后由 apple5740 于 2022-9-17 23:11 编辑
捕食者 发表于 2022-9-17 18:21
非常感谢详细的回复哈,我会尝试去学习,对于法力伤害,要表达的是MP的损失;
也就是这个技能  对目标 造 ...


也有对角色MP造成伤害的方法,Game_Action.prototype.executeMpDamage,将那个hp伤害改成这个方法就可以拉。或者直接这样 target.gainMp(-value);
至于都用公式的话,可以改成再次使用一个MP伤害的技能
作者: 橙光    时间: 2022-9-19 13:42
针对良好结构而言,建议在Game_Action额外添加一个额外效果的方法,然后在这个方法里面组合之前的方法自己写逻辑会比较好。触发时机可以在apply的末端,然后记得updateLastTarget()接上就OK。
作者: 捕食者    时间: 2022-9-19 19:53
橙光 发表于 2022-9-19 13:42
针对良好结构而言,建议在Game_Action额外添加一个额外效果的方法,然后在这个方法里面组合之前的方法自己 ...

可以给个 范例脚本学习一下吗
逻辑上是懂了,具体怎么写,还是不太清楚,这方面基础太差
例如在公共事件中实现,当前角色对当前目标造成 当前角色与当前目标 MP差值(公式) 的 MP伤害 不需要什么动作和动画
作者: 捕食者    时间: 2022-9-19 19:56
apple5740 发表于 2022-9-17 23:08
也有对角色MP造成伤害的方法,Game_Action.prototype.executeMpDamage,将那个hp伤害改成这个方法就可以拉 ...

研究了一整天  意思是懂了
但还是不太会写,尝试了几次都没有效果
暂时用自带变量条件那些实现了,只是将来角色至少会有100多个,始终不是最终方案




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