GetListString命令用于逐行读取文本文件,将内容赋值给字符串变量。报错“脚本命令:MOV ... 参数1:<$STR(N主线段数)> 参数2:1”说明错误发生在MOV命令,而非GetListString。但读取始终为第一行,是文件路径与命令用法有误。
一、GetListString命令完整语法
格式:GetListString 文件路径 行数变量 接收变量
• 文件路径:相对Mir200\Envir目录的文本文件路径。必须使用双反斜杠\\或正斜杠/,单反斜杠会被解析为转义符。
• 行数变量:整数型变量(如N、P、D系列),指定从第几行开始读取。行数从0开始计数,即0代表第一行,1代表第二行。
• 接收变量:字符串型变量(如S、A系列),用于接收读取到的行内容。必须为S$开头的变量,N系列变量无法存储字符串。
二、当前脚本错误分析与修正
原脚本与文件结构如下,存在三处关键错误:
#IF
CHECK [102] 1
#ACT
; 错误1:行数变量赋值错误
MOV <$STR(N主线段数)> 1
; 错误2:文件路径分隔符与读取逻辑
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt <$STR(N主线段数)> <$STR(S$主线名称)>
; 文件 主线名称.txt 内容
被废弃的村庄1:皇族埋骨地一层1
被废弃的村庄1:皇族埋骨地一层2
被废弃的村庄1:皇族埋骨地一层3
错误1:MOV命令参数格式错误
• 原句:MOV <$STR(N主线段数)> 1
• 问题:MOV命令的目标变量(参数1)必须是变量名本身,而非<$STR(...)>格式。<$STR(...)>用于输出变量值,不能作为赋值目标。
• 修正:MOV N主线段数 1
• 作用:将数字1赋值给变量N主线段数。此行决定了从文件第几行读取(从0开始,1代表第二行)。
错误2:文件路径分隔符与读取逻辑
• 原句:GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt ...
• 问题:
1. Windows路径中单反斜杠\是转义符,在脚本中必须写为\\或使用/。
2. N主线段数被赋值为1,意味着从第二行(索引1)开始读取。但若要循环读取所有行,此逻辑不完整。
• 修正:GetListString ..\\QuestDiary\\二明专用\\任务系统\\任务变量\\主线名称.txt <$STR(N主线段数)> S$主线名称
• 注意:接收变量参数直接写S$主线名称,不需要<$STR(...)>括起来。
错误3:缺少行数自增与循环,导致只读第一行
即便修正了上述错误,脚本仍只会读取一行。因为每次执行GetListString后,行数变量N主线段数的值没有增加,下次读取还是同一行。需添加循环与自增逻辑。
三、完整修正脚本示例(循环读取文件)
以下脚本会从第一行开始,依次读取文件每一行并存入S$主线名称,然后发送给玩家,直至文件末尾。
#IF
CHECK [102] 1
#ACT
; 初始化行数变量,0代表第一行
MOV N主线段数 0
; 开始循环标签
[@ReadNextLine]
; 读取指定行,存入S$主线名称
GetListString ..\\QuestDiary\\二明专用\\任务系统\\任务变量\\主线名称.txt <$STR(N主线段数)> S$主线名称
; 判断是否读取成功(读取到文件末尾时,S$主线名称会为空)
#IF
EQUAL S$主线名称
#ACT
; 文件读完,跳出循环
SENDMSG 6 文件读取完毕。
GOTO @End
#ELSEACT
; 成功读取一行,进行处理
SENDMSG 6 读取到内容:<$STR(S$主线名称)>
; 行数变量+1,准备读取下一行
INC N主线段数 1
; 跳回循环开始,读取下一行
GOTO @ReadNextLine
[@End]
; 循环结束,执行后续逻辑
注意:GetListString读取文件末尾时,接收变量S$主线名称会被清空。利用EQUAL S$主线名称判断是否读完是标准做法。
四、重要补充与排错
1. 文件编码:确保主线名称.txt文件以ANSI编码保存。若保存为UTF-8,读取内容将是乱码。
2. 文件路径:若脚本仍报“file not found”,请检查路径中每个文件夹是否存在。..\\代表上一级目录(即Mir200\Envir的上级目录Mir200),然后向下寻找。建议使用绝对路径避免歧义,如D:\MirServer\Mir200\Envir\QuestDiary\...。
3. 变量作用域:确保N主线段数是个人私有变量(N系列),在循环过程中不会被其他脚本重置。

