传奇脚本从指定文件内随机读取一行内容到变量的命令格式与全引擎实例

来源: 作者: 点击:
从文件随机读取一行到变量是传奇脚本中最常用的文本操作之一。无论是随机公告、随机奖励、随机装备,还是合成系统的成败判定,底层都依赖这个操作。不同引擎的命令名称和参数格式存在差异,下面按引擎分类逐一说明。

核心变量体系

存储读取结果需要用到字符串变量。传奇脚本中常用的字符串变量分为两类:S0至S99为私人字符变量,下线不保存,小退归零。A0至A499为全局字符变量,所有玩家共享。绝大多数随机读取场景使用S系列变量即可,多个玩家各自独立读取时不会互相干扰。变量的调用格式统一为 `<$STR(S编号)>`,例如读取结果存入S0后,在脚本中用 `<$STR(S0)>` 引用。

GOM引擎命令格式

GOM引擎使用 GETRANDOMLINETEXT 命令,格式为:GETRANDOMLINETEXT 文件路径 字符串变量。

命令的参数含义:文件路径为相对路径或绝对路径,相对路径以 `..\QuestDiary\` 开头,相对于Mir200\Envir目录;字符串变量填入S0至S99中的任意一个。

基础用法示例:

```
[@Main]
#If
#Act
GETRANDOMLINETEXT ..\QuestDiary\装备列表.txt <$STR(S0)>
#Say
取回的文本是:<$STR(S0)>
```

这段脚本从装备列表.txt中随机读取一行,存入S0变量,然后在对话框显示读取结果。文件内容每行一条记录,例如:

```
倚天剑
屠龙刀
开天
镇天
玄天
```

引擎随机命中其中一行,每次执行结果可能不同。

GOM引擎的 GETRANDOMLINETEXT 还支持第三个参数指定行数。参数为0或空时随机读取一行,参数大于0时读取指定行。例如 `GETRANDOMLINETEXT ..\QuestDiary\装备列表.txt <$STR(S0)> 3` 读取第3行内容。

GetRandomLineText 是GOM引擎中另一个等效命令,格式为 GetRandomLineText 文件路径 保存变量,功能与 GETRANDOMLINETEXT 一致。GOM引擎同时兼容 GetRandomText 命令,用法与 GETRANDOMLINETEXT 相同。

GEE引擎命令格式

GEE引擎的命令与GOM基本一致,使用 GETRANDOMLINETEXT 或 GetRandomText。GEE引擎在2.1.0.10以上版本支持该命令,格式为:GETRANDOMLINETEXT 文件 字符串变量。

GEE引擎的典型应用场景是假人系统。假人登录时从配置列表中随机抽取一个配置文件:

```
[@Login]
#IF
ISDUMMY
#ACT
GETRANDOMLINETEXT ..\QuestDiary\智能陪练\假人配置文件列表.txt <$STR(S10)>
SETDUMMYCONFIGFILENAME <$STR(S10)>
LOADDUMMYCONFIGFILE
```

这段脚本检测到假人登录后,从假人配置文件列表.txt中随机抽取一个文件名存入S10,然后通过 SETDUMMYCONFIGFILENAME 设置假人的配置文件名并加载。

GEE引擎的 GETRANDOMLINETEXT 支持绝对路径参数。在命令末尾追加参数1表示使用绝对路径,留空或填0表示相对路径。例如 `GETRANDOMLINETEXT E:\数据文件\装备列表.txt <$STR(S0)> 1`。

GEE引擎的 GetRandomText 命令同样可用,格式为 GetRandomText 文件 变量,示例为 `GetRandomText .\QuestDiary\装备列表.txt S10`,之后用 `<$STR(S10)>` 引用读取结果。

HERO引擎命令格式

HERO引擎使用 GetRandomText 命令,格式为:GetRandomText 文件路径 变量(S0-S99) 指定行(1-10000)。

不指定行数时随机读取一行。指定行数时读取该行内容。变量可使用S0至S99或A0至A499。

随机读取示例:

```
[@Main]
#IF
#ACT
GetRandomText .\QuestDiary\测试.txt S10
SendMsg 5 取出的字符串是:<$STR(S10)>
```

指定行读取示例:

```
[@Main]
#IF
#ACT
GetRandomText .\QuestDiary\测试.txt S10 5
SendMsg 5 取出的字符串是:<$STR(S10)>
```

第二个示例固定读取第5行内容。

HGE引擎命令格式

HGE引擎使用 GetRandomName 命令,格式为:GetRandomName 文本文件路径 字符串变量 指定行 是否绝对路径。

参数说明:指定行参数存在时读取指定行数,为0时使用随机行数模式。是否绝对路径参数中,0表示相对路径,1表示绝对路径。该命令不支持M变量,只支持个人S变量和临时S变量。

基础随机读取示例:

```
[@Main]
#If
#Act
GetRandomName ..\QuestDiary\物品.txt S81
#Say
取回的文本是:<$S81>
```

这段脚本从物品.txt中随机读取一行存入S81变量,然后在对话框中显示。

概率型随机命令:READRANDOMSTR

BLUE引擎、188引擎等支持 READRANDOMSTR 概率型命令,格式为:READRANDOMSTR 文件路径 变量。

与普通随机读取的区别在于,文本文件中的每一行后面可以附加一个数字作为权重,数字越大命中该行的概率越小。文件格式示例:

```
字符1 11
文字2 88
```

上述文件中“字符1”的权重为11,“文字2”的权重为88,前者被命中的概率约为后者的8倍。脚本写法:

```
[@delskill]
#IF
#ACT
READRANDOMSTR .\QuestDiary\变量\颜色.txt S15
#SAY
你所获得的颜色是:$STR(S15)
```

对应的纯随机版本使用 ReadRandomLine 命令,格式相同,但文本文件中不带权重数字,每行被命中的概率完全相等。使用 ReadRandomLine 时,颜色.txt文件内容简化为:

```
字符1
文字2
```

合成系统中随机取行的完整应用

结合随机取行命令与条件判断,可实现随机概率合成系统。在 `Mir200\Envir\QuestDiary\几率控制\` 目录下创建两个文本文件。

合成几率.txt内容如下:

```
成功
失败
失败
失败
失败
失败
失败
失败
失败
失败
```

十条数据中一条“成功”九条“失败”,对应10%的成功概率。调整成功率只需改这个比例。

合成品.txt内容如下:

```
倚天剑
屠龙刀
开天
镇天
玄天
```

合成成功后从这五行中随机抽取一件产出。

脚本代码:

```
[@开始合成]
#IF
checkgamegold > 4999
checkitem 黑铁剑 1
#ACT
GetRandomLineText ..\QuestDiary\几率控制\合成几率.txt <$STR(N1)>
GetRandomLineText ..\QuestDiary\几率控制\合成品.txt <$STR(S0)>
#IF
EQUAL <$STR(N1)> 成功
#ACT
gamegold - 5000
take 黑铁剑 1
give <$STR(S0)> 1
sendmsg 0 恭喜玩家〖%s〗通过合成系统获得〖<$STR(S0)>〗!
#ELSEACT
gamegold - 5000
take 黑铁剑 1
SENDMSG 6 很遗憾,合成失败了!
give 黑铁矿 5
goto @main
```

脚本先随机读取合成几率.txt的结果存入N1,同时随机读取合成品.txt的产出物品存入S0。然后判断N1的值是否为“成功”,是则扣除货币和材料,给予S0中记录的物品;否则扣除材料并给予保底奖励。

路径写法与注意事项

相对路径统一以 `..\QuestDiary\` 开头,相对于Mir200\Envir目录。写入 `..\QuestDiary\装备列表.txt` 时,引擎自动解析为 `Mir200\Envir\QuestDiary\装备列表.txt`。绝对路径直接从盘符开始,例如 `D:\MirServer\Mir200\Envir\QuestDiary\装备列表.txt`,部分引擎在绝对路径后需追加参数1。

文本文件需使用ANSI编码保存,UTF-8编码的中文内容在部分引擎中会显示为乱码。文件内每行只放一条完整记录,不要有空白行或多余空格,空白行被随机命中时变量内容为空。

S0至S99为私人字符变量,关闭对话框或小退后自动重置为默认值。如果在同一次对话中多次使用随机读取命令,每次都覆盖前一次的结果。若需要跨对话保留读取内容,需使用SAVETEXT命令写入文件持久化。

变量类型需与命令匹配。GetRandomText和GETRANDOMLINETEXT要求填入字符串变量(S或A系列),填入数字型变量如N1或M1时部分引擎可自动转换,但建议直接用S系列避免兼容问题。

GOM引擎在2023年后的版本中,GETRANDOMLINETEXT支持老模式参数,参数3等于0为随机抽取,等于1为指定行,参数4支持OLDMODE以兼容老版本的绝对路径写法。使用旧版引擎时需确认命令参数是否完整支持。