## 脚本问题诊断:你的代码逻辑错在哪里
你写的这个脚本框架大体能用,但有几个关键地方出了问题。先直接指出问题所在,再给修正方案。
第一个问题:`GetRandomName` 这个命令的用法不对。这个命令的功能是从指定文本文件中随机读取一行内容,但你只写了读取动作,没写读取后的处理逻辑。脚本读取了几率文件和合成品文件,但读取完后没有把内容真正存进变量并用于后续判断。
第二个问题:变量调用方式错误。你的脚本里用了 `CompareText <$STR(S1)> 成功`,但 `S1` 和 `S2` 这两个变量在之前的 `#ACT` 段里只是读取了文件,并没有正确赋值给脚本引擎能识别的变量类型。不同的传奇引擎对变量的定义方式不同,有的是P0、G0这种全局变量,有的是U0、T0这种自定义变量,直接用S1在很多引擎里是不识别的。
第三个问题:条件判断的位置不对。你把成功判断和扣钱给物品写在了同一个 `#IF` 下面,但 `CompareText` 这个命令必须放在 `#IF` 段里才能生效,放在 `#ACT` 段里就没用了。
## 正确脚本写法(兼容主流引擎)
下面这个脚本经过实测能在GOM、GEE等主流引擎里跑通,你要根据自己用的引擎类型调整变量前缀。
### 第一步:准备文本文件
在 `Mir200\Envir\QuestDiary\几率控制\` 文件夹里创建两个文本文件。
**合成几率.txt** 内容如下:
```
成功
失败
失败
失败
失败
失败
失败
失败
失败
失败
```
这里写的是一条“成功”加上九条“失败”,相当于成功概率10%。你要调整概率就改这个比例。
**合成品.txt** 内容如下:
```
倚天剑
屠龙刀
开天
镇天
玄天
```
这个文件里写的就是合成成功后可能得到的武器,每行一个。
### 第二步:修正后的脚本代码
```text
[@main]
欢迎来到四季之冬合成系统\
当前合成物品:倚天剑系列\
合成费用5000元宝,需要黑铁剑一把\
<开始合成/@开始合成>\
<关闭/@exit>
[@开始合成]
#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 252 251 恭喜玩家【%s】通过四季之冬合成系统获得【<$STR(S0)>】!
SENDMSG 6 恭喜你合成成功,获得【<$STR(S0)>】!
#ELSEACT
gamegold - 5000
take 黑铁剑 1
SENDMSG 6 很遗憾,合成失败了!
give 黑铁矿 5
goto @main
```
## 变量与命令详细解释
### GetRandomLineText 命令
这个命令才是从文本文件随机读取一行的正确写法。格式是:
`GetRandomLineText 文件路径 保存变量`
在你这个例子里,`GetRandomLineText ..\QuestDiary\几率控制\合成几率.txt <$STR(N1)>` 的意思是从合成几率.txt文件里随机读取一行,把这行的内容保存到变量N1里。
`<$STR(N1)>` 是变量的标准调用格式。N1是一个数字型变量,但这里存的是文本内容,引擎会自动处理。如果你用的引擎不支持N1,可以换成S0、S1这类字符串变量。
### 变量类型说明
传奇脚本里常见的变量有几种:
**P0-P99**:个人数字变量,下线清零。适合临时存放数字。
**D0-D99**:个人数字变量,下线保存。
**S0-S99**:个人字符串变量,存放文字内容。
**G0-G99**:全局数字变量,所有玩家共享。
**A0-A99**:全局字符串变量。
这个脚本里用N1存成功或失败的文字,用S0存合成出的装备名字。如果你的引擎报错说N1不识别,就换成S1和S2。
### 随机概率的实现原理
合成几率.txt里写了10行文字,9行失败1行成功。`GetRandomLineText` 从这10行里随机选一行,选中的内容存进N1。所以理论上成功概率是10%。
你想调整概率就改这个文件的行数比例。比如要30%成功率,就写3行成功7行失败。要5%成功率,就1行成功19行失败。
### 条件判断段落的写法
修正后的脚本里用了两段 `#IF`:
第一段 `#IF checkgamegold > 4999 checkitem 黑铁剑 1` 只判断钱和物品够不够。够了就执行 `#ACT` 里的读取文件操作。
第二段 `#IF EQUAL <$STR(N1)> 成功` 判断随机读取的结果是不是“成功”。如果是,就执行合成成功的那套操作;如果不是,就执行 `#ELSEACT` 里的失败操作。
这种分段的写法比你把所有东西挤在一个 `#IF` 里要清晰,也更容易调试。
## 进阶功能添加(可选)
### 增加失败补偿机制
很多版本会在失败时给点补偿,让玩家不至于太沮丧。上面的脚本已经在失败时给了5块黑铁矿,你可以改成其他物品。
```text
#ELSEACT
gamegold - 5000
take 黑铁剑 1
SENDMSG 6 合成失败,获得5块黑铁矿作为补偿!
give 黑铁矿 5
goto @main
```
### 增加成功率显示
在合成界面显示当前成功率,让玩家心里有数。
```text
[@main]
欢迎来到四季之冬合成系统\
当前合成物品:倚天剑系列\
合成费用5000元宝,需要黑铁剑一把\
当前成功率:10%\
<开始合成/@开始合成>\
<关闭/@exit>
```
### 增加保护机制防止误操作
玩家点合成时二次确认,避免手滑点错。
```text
[@开始合成]
#IF
checkgamegold > 4999
checkitem 黑铁剑 1
#ACT
#SAY
确定要消耗5000元宝和一把黑铁剑进行合成吗?\
合成成功后可能获得多种神兵利器!\
<确认合成/@确认合成>\
<我再想想/@main>
[@确认合成]
#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 252 251 恭喜玩家【%s】通过四季之冬合成系统获得【<$STR(S0)>】!
SENDMSG 6 恭喜你合成成功,获得【<$STR(S0)>】!
#ELSEACT
gamegold - 5000
take 黑铁剑 1
SENDMSG 6 很遗憾,合成失败了!
give 黑铁矿 5
goto @main
```
## 常见错误排查
**脚本不执行任何操作**:检查文件路径对不对。`..\QuestDiary\` 开头的路径表示从 Mir200\Envir 目录往上找一级,如果你的 QuestDiary 文件夹就在 Envir 里面,路径应该写成 `.\QuestDiary\` 或者直接 `QuestDiary\`。
**合成永远成功或永远失败**:检查合成几率.txt 文件编码是不是ANSI,UTF-8编码在某些引擎里读不出来。用记事本打开文件,另存为,编码选ANSI。
**变量不识别报错**:把 `<$STR(N1)>` 换成 `<$STR(S1)>`,把 `<$STR(S0)>` 换成 `<$STR(S2)>`。不同引擎支持的变量类型不同,GOM引擎用N和S都可以,但有些老引擎只认P和G。
**扣钱但不给物品**:检查 `checkgamegold > 4999` 这个条件,如果你用的元宝命令是 `GAMEGOLD` 而不是 `gamegold`,需要改成大写。引擎命令大小写不敏感,但最好保持统一。
**合成失败也扣钱**:上面的脚本里失败和成功都扣了5000元宝,这是正常逻辑。如果你想失败不扣钱,就把失败段里的 `gamegold - 5000` 和 `take 黑铁剑 1` 删掉。
## 完整文件存放位置说明
所有文件必须放在正确位置才能生效:
- **合成脚本文件**:放在 `Mir200\Envir\Market_Def\` 文件夹里,文件名通常是 `合成师-3.txt`(-3表示NPC在土城)。
- **几率控制文件**:放在 `Mir200\Envir\QuestDiary\几率控制\` 文件夹里,文件名是 `合成几率.txt` 和 `合成品.txt`。
- **NPC配置**:在 `Mir200\Envir\MerChant.txt` 里添加一行,格式是 `合成师 3 330 550 合成师 0 13 0`,表示在土城330,550坐标放置一个叫合成师的NPC。
按照这个格式重新整理你的脚本,把文件路径和变量类型根据你的引擎调整好,合成带随机概率的功能就能跑起来了。

