Project1

标题: 脚本开发者向|战斗流程与伤害计算规则的初步研究与更改 [打印本页]

作者: 怠惰な騎士    时间: 2017-6-9 12:21
标题: 脚本开发者向|战斗流程与伤害计算规则的初步研究与更改
本帖最后由 怠惰な騎士 于 2017-6-9 12:27 编辑

结论

修改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 代码复制
  1. var makeDamageValue = Game_Action.prototype.makeDamageValue;
  2. Game_Action.prototype.makeDamageValue = function(target, critical) {
  3.     var value = makeDamageValue.call(this, target, critical);
  4.     value *= this.applyElementType(target);
  5.     return Math.round(value); // 放置Math.round的位置会影响伤害的精度。
  6. };
  7. Game_Action.prototype.applyElementType = function(target) {
  8.   var subject = this.subject();
  9.   var element_a = subject.elementType(); // elementType是不存在的方法,这里假设elementType可以获取战斗角色的光暗属性
  10.   var element_b = target.elementType();
  11.   return {
  12.     "light": { "light": 1, "dark": 2 },
  13.     "dark": { "light": 0.5, "dark": 1 },
  14.   }[element_a][element_b];
  15. };

作者: 铅笔描绘的思念    时间: 2017-6-9 21:13
说起来MV的全部按照分类合并了其实辛苦了直接接触MV的人。。。
所以推荐down一份拆分版的内建类做参考https://rpg.blue/thread-384626-1-1.html?_dsign=ddbc981e
因为整体结构和前三作没有很大改进所以对三个版本摸过来的人写插件该从哪里下手基本是一清二楚的除了前三作封装在DLL里的内置类基本没见过源码无从下手
不过mv用js实现的这那几个个类现在看起来异常简单的说
作者: aasll    时间: 2017-6-9 22:59
久违的干货,支持




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