设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2838|回复: 3
打印 上一主题 下一主题

[原创发布] 脚本开发者向|战斗流程与伤害计算规则的初步研究与更改

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1279
在线时间
127 小时
注册时间
2017-1-14
帖子
93

开拓者

跳转到指定楼层
1
发表于 2017-6-9 12:21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 怠惰な騎士 于 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. };

Lv3.寻梦者

梦石
0
星屑
1369
在线时间
962 小时
注册时间
2012-4-30
帖子
1475

开拓者

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

点评

Get!这个的确方便不少  发表于 2017-6-9 22:21
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
220
在线时间
161 小时
注册时间
2015-11-23
帖子
92
3
发表于 2017-6-9 22:59:06 | 只看该作者
久违的干货,支持
自天地未辟混沌未开时就已经开始装逼的神奇人物
MV的魔塔模板::托管在github上的游戏,可以直接运行
基于RPGMakerMV的JavaScript基础
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-1 11:41

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表