结论
修改Game_Action.prototype.makeDamageValue来实现对伤害系统的改写。
废话
对RMMV的伤害判定机制进行了初步摸索,基本确定了RMMV的伤害判定流程。
于是在这里将研究成果记录下来,梳理梳理脑子,顺带做个备份避免以后忘了(〃´-ω-) 。
如果发现这里对伤害机制的说明有问题,欢迎指正_(:з」∠)_ 。
启动流程
RMMV需要进入战斗场景并在执行操作时进行伤害计算,其中战斗场景可以通过多种方式进入:
* 地图随机遇敌
* 编辑器测试战斗
* 事件触发战斗
* 通过F8窗口输入脚本手动进入(略)
但无论通过什么方式进入战斗场景,在进入之前都会调用BattleManager.setup完成对战斗数据的配置。
地图随机遇敌
脚本调用顺序:
* Scene_Map.prototype.update
* Scene_Map.prototype.updateScene
* Scene_Map.prototype.updateEncounter
* 进入战斗场景:Scene_Battle
编辑器测试战斗
脚本调用顺序:
* Scene_Boot.prototype.start
* 进入战斗场景:Scene_Battle
事件触发战斗
脚本调用顺序:
* Game_Interpreter.prototype.command301
* 进入战斗场景:Scene_Battle
战斗数据流程
进入战斗场景后,游戏的主逻辑将会开始在Scene_Battle中循环。
Scene_Battle会处理战斗场景的UI表现逻辑。
战斗数据的相关逻辑会被Scene_Battle通过updateBattleProcess转交给BattleManager来推进。
脚本调用顺序(从Scene_Battle到实际演算伤害的代码块):
* Scene_Battle.prototype.update
* Scene_Battle.prototype.updateBattleProcess
* BattleManager.update
* BattleManager.updateAction
* BattleManager.invokeAction
* BattleManager.invokeNormalAction
* Game_Action.prototype.apply
* Game_Action.prototype.makeDamageValue
其中决定回合战斗中,某次战斗所造成的实际伤害的方法是:“Game_Action.prototype.makeDamageValue”。
通过修改Game_Action.prototype.makeDamageValue,就可以实现对伤害系统的改写。
示例
假设现在游戏中需要有一个光和暗的系统,其中光属性的角色可以对暗属性的角色造成双倍伤害,反之伤害减半,则可以通过如下代码来改写:
JAVASCRIPT 代码
- var makeDamageValue = Game_Action.prototype.makeDamageValue;
- Game_Action.prototype.makeDamageValue = function(target, critical){
- var value = makeDamageValue.call(this, target, critical);
- value *= this.applyElementType(target);
- return Math.round(value); // 放置Math.round的位置会影响伤害的精度。
- };
- Game_Action.prototype.applyElementType = function(target){
- var subject = this.subject();
- var element_a = subject.elementType(); // elementType是不存在的方法,这里假设elementType可以获取战斗角色的光暗属性
- var element_b = target.elementType();
- return{
- "light": {"light": 1, "dark": 2},
- "dark": {"light": 0.5, "dark": 1},
- }[element_a][element_b];
- };
复制代码
本帖来自P1论坛作者怠惰な騎士,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=400950 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。