M2引擎报出“FQ脚本错误”的时候,很多开服的新手第一反应是重装引擎或者换版本。实际上这类错误基本不需要大动干戈,绝大多数都出在脚本本身。FQ本质上是引擎脚本里的一类控制指令,负责特定触发逻辑的执行,比如NPC对话、任务触发、怪物刷新或者道具使用。脚本里某个地方写错了、格式不对、或者路径没指对,引擎在执行到那一步的时候认不出来,就把报错甩到控制台上了。
**第一步:别猜,先看日志定位具体位置**
处理FQ错误最忌讳的是漫无目的地翻脚本文件。正确操作是先去Mir200\Log目录下面翻ErrorLog.txt,或者直接盯着M2控制台窗口里刷出来的红色报错信息。日志会写清楚报错的文件名和行号,比如“QuestDiary\活动脚本.txt第88行”或者“QFunction-0.txt第1256行”。把这行信息记下来,后面改起来才有方向。
如果日志里只报了时间戳和错误代码,没有具体行号,那就自己动手加调试输出。在可疑脚本的关键位置插上SENDMSG6命令,内容写“执行到第N步”,然后进游戏触发报错,看最后一条消息停在哪一步,那里就是问题点。
**第二步:检查语法拼写和格式,这是最粗的错**
把日志里指向的那个脚本文件用Notepad++打开,定位到对应行。先看FQ指令有没有拼写错误,比如把“FQOpen”写成“fqopen”或者“FQopen”,引擎根本不认大小写变体。再看参数有没有缺,比如FQ指令原本要求三个参数,你只写了两个,或者参数顺序颠倒了,都会触发语法报错。
还要检查整段脚本的格式规范。看看IF后面有没有跟ACT,ACT后面的命令是不是单独换行了,是不是用了全角符号比如“”代替了半角引号"",或者变量名里掺了数字开头或者特殊符号。M2引擎只认ANSI编码的脚本文件,用记事本保存成UTF-8带BOM的话,引擎读出来全是乱码,整段脚本解析失败,报FQ错误一点都不冤枉。在Notepad++里把编码转为ANSI,确认行尾是Windows的CRLF,然后再保存。
**第三步:排查路径问题,看引擎找没找到文件**
日志里如果提示“找不到指定FQ脚本文件”或者“脚本路径不存在”,那就是路径出了问题。检查两个地方:第一,脚本文件是不是放在引擎指定的目录里了,通常应该是Mir200\Envir\QuestDiary下面,如果搁在别的文件夹或者直接搁在Envir根目录,引擎读不到。第二,脚本代码里调用其他文件的时候,填的路径跟实际放置的路径是不是完全一致,多一层少一层文件夹都会报错。另外如果是下载的版本,有些发布者会删掉核心文件或者压缩包解压不完整,也会导致引擎找不到文件。
**第四步:对付GOTO循环超限和死循环**
这类FQ报错最常见,尤其是在GOTO用得很猛的脚本里。引擎默认的循环跳转次数限制是ScriptGotoCountLimit=10,意思是同一个GOTO跳转连续执行超过10次就会被拦截,报成FQ错误。
临时解法是打开Mir200\!setup.txt,把ScriptGotoCountLimit=10改成更大的数,比如10000或者50000,保存后重启引擎。但这是治标不治本。根治的办法是把脚本里的GOTO结构优化掉,用DELAYGOTO延迟跳转代替直接GOTO,避免瞬间高频循环。同时检查有没有一个ACT下面挂了多个GOTO指向不同标签的情况,如果有,拆开或者合并。另外循环判定脚本里要注意变量清空的问题,比如用GetRandomText取值之后没有用MOV清空变量,导致上次的值一直继承下去,循环永远停不下来,触发了引擎的保护机制。
**第五步:检查变量类型和初始化**
报错行附近的变量如果没赋值就直接拿来运算,引擎也会报FQ。比如DEC命令要把变量减一,但这个变量本身是空的,或者拿字符串变量跟数值做比较,引擎计算异常就会中断。检查脚本里用到的所有自定义变量,确保在前面的代码里已经用MOV给了初始值。同时分清数值变量和字符串变量的用法,GOM引擎里P0、D0是数值,S$开头的是字符串,比较方式不一样。
**第六步:验证引擎版本和命令兼容性**
从网上下载的脚本版本不一定跟你手头的M2引擎匹配。GEE引擎特有的变量写法搁到GOM引擎上根本不认识,同样GOM新版支持的命令在旧版本引擎里也没定义。去查一下当前引擎版本对应的脚本指令手册,把报错行里用的命令跟手册核对一遍,如果是引擎不支持的扩展命令,要么替换成当前引擎能认的等效命令,要么把引擎升级到兼容这个脚本的版本。
**第七步:清理插件冲突和缓存**
有些FQ错误跟脚本本身没关系,是第三方插件干扰了引擎解析脚本命令。把PlugIn目录下的.dll文件先全部移走,重启引擎测试,如果报错消失就挨个放回去定位是哪个插件在捣乱。另外修改完脚本之后引擎缓存可能没刷新,改完的东西没生效,这时候关闭M2,删除引擎目录下的Cache文件夹,再重启即可。

