一、错误原因:脚本引擎解析顺序冲突
你遇到的“以前下错误”和“只读取第一行”,核心问题在于脚本引擎执行顺序与变量解析时机的冲突。脚本执行到 #IF CHECK [102] 1 时,会立即计算后面的 MOV 命令参数,但引擎在解析 <$STR(N主线段数)> 时,该变量尚未被赋值,导致读取失败。
二、GetListString正确用法与变量声明
1. 强制变量声明与预赋值
在使用 GetListString 等文件读取命令前,必须确保其索引参数(行数)的变量已被明确定义和赋值。最佳实践是提前一行对 N主线段数 进行定义。
修改后脚本示例:
#IF
CHECK [102] 1
#ACT
MOV N主线段数 1
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt <$STR(N主线段数)> S$主线名称
SENDMSG 6 读取成功:<$STR(S$主线名称)>
关键改动:
• 第3行:MOV N主线段数 1 移除了 <$STR()> 包裹。MOV 命令直接操作变量名,无需 STR() 转换。
• 第4行:GetListString 的参数 <S$主线名称> 同样移除了 <$STR()> 包裹,直接使用变量名。
2. GetListString参数详解
GetListString 命令的正确格式为:
GetListString 文件路径 行数变量 结果字符串变量
• 文件路径:相对于 MirServer\Mir200 目录的路径。你的路径正确。
• 行数变量:必须是一个数字型变量(如 N主线段数),其值代表读取第几行(从1开始计数)。
• 结果字符串变量:必须是一个字符串型变量(如 S$主线名称),用于接收读取到的文本。
三、脚本引擎执行逻辑与变量类型
1. 变量类型与命名规范
• 数字变量:以 N 或 M 开头,如 N主线段数、M10。用于存储整数。
• 字符串变量:以 S 或 A 开头,如 S$主线名称、A100。用于存储文本。
2. 错误脚本逐行分析
你的原脚本:
MOV <$STR(N主线段数)> 1
引擎执行时,会先解析参数 <STR(N主线段数)>。但由于 N主线段数 此时未定义,其值为空或0,导致解析为 MOV 0 1,这相当于尝试将常量 0 赋值为 1,逻辑错误,因此报“以前下错误”。
四、实战应用:循环读取文本文件所有行
若要读取“主线名称.txt”的每一行,应使用 While 循环配合 GetListString。
示例脚本:
#IF
CHECK [102] 1
#ACT
MOV N主线段数 1
MOV N文件总行数 3
While N主线段数 <= N文件总行数
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt N主线段数 S$主线名称
SENDMSG 6 第<$STR(N主线段数)>行:<$STR(S$主线名称)>
Inc N主线段数 1
EndWhile
注意:你需要提前知道文件总行数(此例中为3),或通过其他方式(如 GetRandomText 或遍历)获取。部分引擎支持 GetListStringCount 命令获取总行数,可查阅引擎说明书确认。
五、常见报错与排查
报错信息 可能原因 解决方案
“以前下错误” 变量未声明或 <$STR()> 包裹错误 移除 MOV 命令中的 <$STR()>,直接使用变量名
只读取第一行 行数变量未在循环中递增 在循环内使用 Inc N主线段数 1 递增行号
读取为空 文件路径错误或编码不匹配 检查路径,确保文件为ANSI编码(记事本另存为可选)
最终建议:在调用 GetListString 这类依赖外部文件的命令前,务必先用 SENDMSG 输出行数变量的值,确认其不为0,这是调试脚本的基础方法。

