Project1

标题: RGSS1的bug真是捉不完啊 [打印本页]

作者: SailCat    时间: 2020-4-26 05:02
标题: RGSS1的bug真是捉不完啊
这个bug藏得非常隐蔽,默认数据库中没有狂暴,而混乱是2回合25%解除……不是战斗测试根本发现不了

混乱/狂暴状态最后一回合角色强制不行动bug……

默认的战斗系统中,能不能输入的判定是看身上的状态,而在输入前会把全队的动作清除为“不行动”,如果这个队员是狂暴或者混乱,那么它就无法输入指令,也就是默认将要执行“不行动”动作。
然后在phase4 step1中,会按照回合来解除状态,如果是最后一个判定回合,那么这个状态就给解除掉了
到了phase4 step2对动作进行修正的时候,因为角色身上没有这个状态了,就不会再去进行普通攻击敌人/同伴的动作,然后这个回合就强制不行动了……
但敌人侧的情况却不是这样,因为敌人的动作生成是在start_phase4里面做的(也就是角色全部输入完指令之后),并且make_action方法中只有对不行动限制的处理,也就是如果敌人行动时,部分限制行动的状态消失了,将正常执行原来会生成的动作。这样一来,你因为在输入指令的时候发现敌人比如中着沉默,没去管,然后等敌人行动时沉默刚好解除,一个大魔法全灭你……

这个bug非常不好修
首先是逻辑正确化,也就是在phase4 step2进行动作修正时,角色身上的任何限制状态都是不能解除的
然后是规则公平化,考虑到不能使用魔法这种状态,当敌人中了沉默的时候,那么最多一直到make_skill_action_result之前,这个沉默都是不能解除的,不然敌人会通过skill_can_use?的判定,大招全灭你。但你中了沉默在当回合是输入不了魔法指令的。

首先想到改remove_states_auto的执行时机:
这个remove_states_auto到底在什么情况下执行呢
我们注意到凡是@phase4_step在以下几种情况下会被设定为1:
1. start_phase4 主回合开始时
2. update_p4s2中,当因为无法行动的限制清除了行动时
3. make_basic_action_result中,p4s2执行基本的结果是“不行动”时
4. make_skill_action_result中,p4s2执行特技的结果是“无法通过判定(沉默、SP耗尽)”时
5. make_item_action_result中,p4s2执行物品的结果是物品不够了时
6. update_p4s6中,当执行完毕主效果,预约调用技能公共事件或物品公共事件时
当@phase4_step被设定为1时,战斗引擎回主控,执行update_p4s1,主要功能就是切到下一个要行动的战斗者。
所以从@active_battler的视角来看,一个完整流程中的@phase4_step变化其实是2-3-4-5-6-1,而不是1-2-3-4-5-6的。
根据上面的讨论,我们需要在@phase4_step被设定为1后,但还没有执行update_p4s1时(此时为前一个战斗者行动完毕),去更改前一个战斗者的状态
但是这样一改,就会有另一个问题,假如这种状态(其实也包括任何状态)是在行动中自己给自己加上的……那就会多减了一个回合……

其次想到的是改make_actions的规则,模拟人输入的过程(也就是增加对inputable?和沉默等的判定,不合法的不让选)。角色侧也是添加一个make_actions在不能输入的情况下生成攻击动作
但是又有新bug来:假如敌人的设定是没有普通攻击的,你让它混乱了,它在make_actions里面普攻敌人同伴。但是等到行动的时候混乱解除了,restriction变成了0,它会变成普攻你,相当于执行了一个非法动作了……

还没想好有什么好的改法……
作者: guoxiaomi    时间: 2020-4-26 05:54
反向操作,改成即使是沉默或者不能行动,也可以输入指令怎么样?
作者: Im剑侠客    时间: 2020-4-26 11:12
全程在想象楼主的表情“大招全灭你”!哈哈哈。
作者: shitake    时间: 2020-4-26 12:02
大部分的bug都是偷懒造成的(比如之前rb提过的战斗事件刷新状态窗口导致卡顿的bug) 甚至rm一贯的一些糟糕的代码写法也是偷懒造成的(比如至今不愿意提供基础的ui组件而是window那套套来套去的一把梭)
作者: 灯笼菜刀王    时间: 2020-4-26 21:38
本帖最后由 灯笼菜刀王 于 2020-4-26 21:41 编辑

应该有人发现了, 我方角色战斗不能后, 下回合复活起来还要傻站一回合.....  理由和这个BUG一样~~

曾经看过一个作品, 作者简单粗暴的改为"被控制了也一样可以进行指令输入",这到不失为一个好方法, 就是躺地上也可以输入....被吐槽不少就是了, 感觉一些守旧派难以接受吧

如果把状态判断放到 start_phase2 呢, 先全员一起蹦毒伤害,然后状态结算后,再开始玩家输入回合, 就可以规避这个BUG了吧, 不过这样一来速度低的人的持续回合0的控制技能就完全废了就是了... 偏偏"击晕"这种又是低敏高力角色的常用招式


作者: 冷俊逸    时间: 2020-4-27 11:35
从狂暴中苏醒会楞一会,因此不是bug是feature,此贴完结
作者: enghao_lim    时间: 2020-4-28 15:52
给每个角色都安上了各自的phase与step表示没有问题飘过,解除后再输入行动即可……
你说默认战斗?已经不存在了……
作者: SailCat    时间: 2021-3-2 01:40
(部分)解决了,实现了敌我公平化。因为可以设置为机率消散,所以认为最后一回合强制不行动不是bug。但现在敌人方的最后一回合也会强制不行动或者不进行不合法的行动。
(更新在核心插件1.6版中)




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