扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 120|回复: 0

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

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-2-4 02:05
  • 签到天数: 110 天

    连续签到: 2 天

    [LV.6]常住居民II

    2327

    主题

    395

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10465
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13215

    灌水之王

    发表于 2024-11-21 22:13:17 | 显示全部楼层 |阅读模式
    结论

    修改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. };
    复制代码

                本帖来自P1论坛作者怠惰な騎士,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=400950  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-10 12:01 , Processed in 0.131193 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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