0425睡到0916睡到1119,熬夜轻而易举。
夜里睡前听小说的时候突然顿悟,根本没有必要去patch战斗AI在TSKBattleAI.LotterySkill中使用技能的逻辑,只需要去设定手动选择技能的变量selectedSkillIndex等于我想让他使用的技能就行了。
醒来意识到这样还是有点危险,可能会让手动点技能失效。
直接只改TSKBattleAI.LotterySkill返回值似乎没问题,我手动选择技能0,它仍然return: 0x1。
又觉得没必要了,简单关卡随便auto过,有难度的关卡又可能更适合手操。
又发现敌我AI都走的TSKBattleAttack.NextAttack -> TSKBattleAI.LotterySkillAction -> TSKBattleAI.LotterySkill,那很深邃了。
auto的时候就算手动选择技能还是会走TSKBattleAI.LotterySkill,很合理,提前走AI判断要出的技能不是坏事,真要时间结束不得不出手的时候才判断技能不卡顿才怪。但不auto的时候试了一下,发现同一回合多角色行动时只有第一个以外的角色会走TSKBattleAI.LotterySkill,但如果没auto下不手操的话肯定不会给你放技能的,难道是怕我在行动后又点了auto?但试了行动后点auto,第一个角色又能够自己放技能,这太奇怪了。
突然想起TSKBattleAI.LotterySkillAction的唯二引用是TSKBattleAI$$Lottery,那可能说明后者是auto开关的回调函数,那还挺有逻辑的,点了auto需要计算当下角色的ai决策。traceMethod试一下,发现又对又不对
| |
点了auto后确实是这个调用,但平常auto时同一回合第一个角色也是走这个顺序,后续的角色却只有后两个函数。
角色charge而不选择攻击时好像没进入TSKBattleAI.LotterySkill,那可能真的最适合hook这个函数。要考虑ai不直接打敌人的pattern也太烧脑了。
| |
涉及到各种有关随机数、cd、CanSkill的判断函数还是太复杂了,图方便直接onEnter中把入参的BattleStartAiActionEntitypatch了,可以让ai放出自己想让它放的技能,但有种开挂的恐惧感。