以拆包和体验来推导一下怪物猎人的AI出招逻辑,感受可能是市面上PVE动作游戏TTK最长、规则最丰富的单局战斗体验!
怪物猎人中的AI出招设计
前言
如果要参考学习动作游戏PVE的BOSS设计的话,我想怪猎系列的怪物可能是绕不开的一个课题,它有着相对简单的关卡设计,衬托出纯度更高的战斗、丰富的机制与动作,带来反复游玩的乐趣。在MHW这一作,它经受住了大环境下ACT品类没落的考验,一跃成为了ACT游戏中最耀眼的明星之一。
本文将从拆包、体验反推两个视角来窥视怪物猎人的AI,聚焦在怪物AI出招的设计、和这些设计是如何影响玩家的体验的。也可以通过本文对比这两种方式,了解它俩各自的特点,以及在游戏反拆时适用的场合。
拆包
基本上,只要有MOD的游戏,就代表玩家群体已经掌握了游戏文件组织的大体结构——毕竟MOD,就是把玩家的内容,替换、修改厂商的内容。得先弄明白文件放到哪里,才能放过去让文件生效。对于大多数对MOD没有积极持支持态度的游戏开发商,这往往意味着已经有一个工具可以针对玩家的二进制分发文件进行解密解压缩处理。
感谢卡普空从MHW以来对PC的友好态度,MHW/MHWIB、MHR/MHRSB,都有着相当多的外观、易用性MOD,繁荣的MOD当然也就意味着,玩家对游戏文件有着相当的了解,从Github、NEXUSMODS上顺藤摸瓜成功找到了MHRSB的MOD教程,里面自然有拆包过程的说明,事不宜迟,拆了看看AI配置吧!
繁多的状态机
从re_chunk_000\natives\STM\enemy\em001\
就可以定位到具体怪物,查一下怪物ID表,001是Rathian,也就是我们的老朋友——雌火龙。
对于一只具体的怪物,解包后的文件目录如下,我们关注的也就是ai_fsm_user_data
下的文件,fsm,看起来底层驱动的技术是有限状态机。
.
├── 00
│ ├── ai_fsm_user_data
│ ├── collision
│ ├── mod
│ ├── mot
│ ├── prefab
│ ├── shell
│ ├── user_data
│ └── user_variables
├── 02
├── 07
└── common
├── act_tbl_user_data
├── mod
├── mot
├── motion_fsm
└── user_data
ai_fsm_user_data
下的文件就多起来了,以雌火龙00的em001\00\ai_fsm_user_data
的为例,有多达125个文件:
.
├── flow
│ └── em001_00_predator_relevant_action.user.2
├── hub
│ ├── damage
│ │ ├── fly
│ │ │ ├── em001_00_fly_element_weak_damage.user.2
│ │ │ ├── em001_00_fly_em2em_damage.user.2
│ │ │ └── ...
│ │ └── stand
│ │ ├── em001_00_stand_element_weak_damage.user.2
│ │ ├── em001_00_stand_em2em_damage.user.2
│ │ └── ...
│ ├── die
│ │ ├── fly
│ │ │ ├── em001_00_fly_capture.user.2
│ │ │ └── em001_00_fly_normal_die.user.2
│ │ └── stand
│ │ ├── em001_00_stand_capture.user.2
│ │ └── em001_00_stand_normal_die.user.2
│ ├── em001_00_arrange.user.2
│ ├── em001_00_arrange_hyakuryu.user.2
│ └── ...
└── think
├── em001_00_damage.user.2
├── em001_00_die.user.2
└── ...
9 directories, 125 files
果然“软件开发没有银弹”,怪猎的怪物单局行为丰富,连AI配置文件都有120多个……太强了。
很可惜,目前用于拆包后的.user.2
类型文件的MHR Editor,尚且不支持打开编辑这些AI文件,姑且用HexEditor
试着看了下一些文件的内容,看到了一些类似USR开头、RSZ用作分割之类的信息,但是也没有啥有价值的内容。
看不到具体的文件,就只能看看能不能从文件名中间得到些信息了。
盲人摸象
试着对文件名进行了一些标注(拿不准胡猜的东西标了黄色):
- 硬直
在标注的过程中发现了一些硬直机制相关的文件,这些文件相较于AI,更像是动作跳转的逻辑。
比如死亡、捕获,又比如经典麻痹、眩晕、睡眠。
合理推测,可能有一部分硬直的动作逻辑是靠这些AI来控制的?
- 避障/场地移动
可以把动作游戏的AI划分为攻击/移动,而移动中免不了的一部分就是类似避障、返回场地中央之类的逻辑,这么一看大家还是都会面临这些问题的。
- 横向比较
除了001我们也看一下093爵银龙,对比一下各自的ai_fsm_user_data
的文件列表
比较对象 | 比较结论 |
---|---|
em001-00/em001-02/em001-07 | 02和07都是00的子集,02和07略有不同 |
em093-00/em093-01 | 01是00的子集 |
em001-00/em093-00 | 略有不同 |
- 简要总结
MHRSB的AI通过划分不同场景,将复杂的逻辑成功细分到多种场合的单个逻辑,这种做法可以降低单个文件的复杂度,同时,单个逻辑文件可以作为特性组件动态的给某只怪物添加或者删除(比如觅食逻辑)。
我们最关心的出招逻辑AI,目测是在某个单个细分逻辑中。尝试继续寻找出招逻辑AI,从文件大小里面筛了一下,还是没有结论。
体验反推
这部分开始就进入相对比较“虚”的部分了,没有那么多确定的知识,只能通过游戏的体验去反向思考。
参考上图,考虑到怪物猎人是一个规则设计非常繁多的游戏,我们先把怪物的AI行为分为战斗和其他两部分,本文主要讨论战斗相关的AI逻辑。
进一步的分析,我们以一些UP主的视频为参考展开:
整理如下:
- 特殊状态:劫血状态
- 连招中猎人位置变化:
- 判断猎人位置不合适:小后跳or短车,再继续
- 判断猎人位置不合适且无法修正:强制结束
- 多数连招判断猎人在背后:尾刺连招
状态 | 连招 | 备注 |
---|---|---|
非怒 | ||
伯爵三血球»站立尾刺(尾刺)»翼爪穿刺(下砸) | ||
侧飞»鲜血吐息 | ||
螺旋冲锋(螺旋冲)»翻沙舞石(空气炮) | ||
捞手»翼爪穿刺(下砸) | ||
前咬»翼爪穿刺(下砸) | ||
空翻»站立尾刺(尾刺)»翼爪穿刺(下砸) | ||
普通怒 | ||
螺旋冲锋(螺旋冲)»中远距离»三血球»站立尾刺(尾刺) | ||
螺旋冲锋(螺旋冲)»头前距离»溅石飞扑(前扑) | ||
侧飞»翼爪穿刺(下砸) | ||
普通状态选择性连招 | ||
侧咬»前砸/捕食/翼爪挥击(扫地)/(背后)尾刺 | ||
翼爪挥击(扫地)»大部分体术/(背后)尾刺 | ||
蛇形车»大部分体术/(背后)尾刺 | ||
原地狠砸(大下砸) | ||
鲜血之球(吐痰挥球) | ||
迅捷扇风(风压) | ||
…… | …… | …… |
后续有机会会在这里继续补充其他怪物的连招派生
结论1:出招跟状态相关
根据体验,怪物一般会有正常状态、愤怒状态(、疲劳状态)几种,同时怪物可能还有自身的强化状态的逻辑:
怪物处于不同状态时,其出招派生是不一样的,用行为树来描述的话大概如下图:
结论2:出招满足反应性与随机性
用人话来说就是,,怪物会对不同条件做出反应,出招不同;相同条件时,怪物有若干技能可以选择。
条件除了上面提到的怪物自身处于不同的状态,大概率还和玩家位置相关。一个很典型的例子是红莲爆鳞龙头大尾大肉质好,本来应该是弹属性远程武器的活靶子,但是因为对远程武器AI导致远程武器狩猎难度也不简单。
总结起来大致可参考下图:
结论3:出招存在固定派生
固定派生让玩家可以背版,提前预判怪物的行动,为持续游玩的玩家带来经验积累的优势。
做一个反例思考,如果怪物的出招是纯随机的,一些没有特别好处理方式的招式将使得玩家的狩猎难度大增,甚至只要招式后摇大于任何一个怪物的出招前摇都可能被揍。另一个例子是早期雌火龙无前兆身前龙车,导致玩家甚至都会避免站在身前。
另一方面,固定派生的中途也会根据玩家位置释放不同的招式;甚至当玩家位置偏移怪物下一招式的打击范围,怪物会调整自己的位置来减少空挥;当进行调整也无法命中的时候,甚至会取消攻击,可以参考下图:
总结
就结论上而言,怪物猎人中的AI出招是十分“规矩”且“丰富”的,就特征层面上讲,符合广泛动作游戏的AI框架,但是牛就牛在量大且细节好。
量大不仅体现在不同AI的状态多,也体现在一个状态下的派生多,还体现在一个派生下的规则多。三多,直接提供了长TTK下的丰富度。
遗憾的是本文受限于时间,没有结合招式和AI去分析不同怪物的战斗体验,这部分如果细说对设计应该也是颇有益处的,后续有时间再补足吧。