传奇自定义铸造合成脚本随机系统完整命令解析与概率控制实战写法

来源: 作者: 点击:
自定义铸造合成系统的核心由三组命令构成:CheckFoundryItem负责检测背包中的合成材料是否足够,GiveFoundryItem负责回收材料并将合成后的物品放入背包,@FoundryOK和@FoundryFail两个自动触发段分别处理合成成功和失败后的逻辑。整个系统的随机性通过成功率参数控制,脚本层面不需要手动编写随机数判定,引擎会根据设定的成功率自动决定成败。

## 合成成功率参数的两种解读方式

合成系统中的成功率设置存在两种不同的解读方式,取决于数值范围。当成功率设置为100时,合成必定成功。当成功率在1到99之间时,数值直接对应百分比,99表示99%成功,90表示90%成功,1表示1%成功。

当成功率设置大于100时,语义发生改变。此时数值表示分数中的分母,设置1000表示成功率为1/1000,设置500表示成功率为1/500。这种设计允许制作极低概率的稀有装备合成,比如设置10000则代表万分之一的成功率。

失败消失参数控制合成失败后的材料处理方式。失败消失设置为1时,合成失败后材料全部消失。设置为0时,合成失败后材料保留,玩家可以重新尝试。该参数在M2的合成物品配置界面中设置,与脚本中的命令无关。

## CheckFoundryItem与GiveFoundryItem命令详解

CheckFoundryItem命令用于在合成前检测玩家背包中是否拥有合成所需的全部材料。该命令的用法为在#IF段落中写入CheckFoundryItem 物品名称,其中物品名称是合成目标物品的名称,引擎会根据M2中配置的材料清单自动逐项检测背包中的材料数量是否达标。

GiveFoundryItem命令在#ACT段落中执行,作用是回收玩家背包中的合成材料,并将合成后的目标物品发放到背包中。该命令同样以物品名称为参数,例如GiveFoundryItem 烽火手镯表示回收合成烽火手镯所需的材料,并给予玩家一个烽火手镯。

合成成功和失败后的额外逻辑通过两个自动触发标签处理。@FoundryOK段在合成成功后自动执行,适合放置全服公告、经验奖励等追加逻辑。@FoundryFail段在合成失败后自动执行,适合放置材料部分返还、失败提示等补偿逻辑。

## 基础合成脚本完整示例

以合成烽火手镯为例,在NPC脚本文件中编写以下内容。首先在M2的合成物品配置界面中设置烽火手镯的合成配方,指定所需的材料清单和成功率数值。假设配方为精品圣战手镯一个、精品天尊手镯一个、元宝200个,成功率设置为70。

NPC脚本内容如下:

[@main]
我这里可以合成烽火手镯,需要精品圣战手镯、精品天尊手镯和200元宝。
<合成烽火手镯/@合成烽火手镯>
<离开/@exit>

[@合成烽火手镯]
#IF
CheckFoundryItem 烽火手镯
#ACT
GiveFoundryItem 烽火手镯
SendMsg 6 合成成功,你获得了烽火手镯
#ELSEACT
MESSAGEBOX 合成烽火手镯需要精品圣战手镯、精品天尊手镯和200元宝,请检查你的材料。
break

[@FoundryFail]
#ACT
SendMsg 6 合成失败,材料已消耗,请继续努力。
break

[@FoundryOK]
#ACT
SendCenterMsg 251 0 恭喜玩家『<$USERNAME>』成功合成了烽火手镯 1 10
break

脚本执行流程为:玩家点击合成选项后,CheckFoundryItem检测背包材料,材料不足时弹出MESSAGEBOX提示并终止。材料充足时GiveFoundryItem执行材料回收和物品发放,引擎根据M2中设置的成功率自动判定。合成失败时跳转到@FoundryFail段执行提示,成功时跳转到@FoundryOK段执行公告。

## 手动随机数控制的高级合成脚本

引擎自带的成功率机制适用于简单的百分比合成,如果需要更复杂的概率控制,比如根据玩家持有特定道具动态调整成功率,或需要在合成前进行多层随机判定,可以使用RANDOM和MOVR命令手动实现。

RANDOM命令的语法为RANDOM 数值,该命令生成一个随机判定,数值表示分母,概率为1/数值。例如RANDOM 2表示50%的概率,RANDOM 3表示约33.3%的概率,RANDOM 10表示10%的概率。RANDOM命令通常直接用在#IF条件中,判定成功则执行#ACT,失败则执行#ELSEACT。

MOVR命令的语法为MOVR 变量 数值,该命令将0到指定数值之间的随机整数赋值给变量。MOVR P8 100表示将0到99之间的随机数赋值给变量P8。与RANDOM只能做二值判定不同,MOVR可以获取随机数的具体数值,适合需要根据随机数区间执行不同操作的多分支场景。

以下脚本实现了根据玩家是否持有幸运符来动态调整成功率的高级合成逻辑。基础成功率为50%,持有幸运符时成功率提升至70%。

[@高级合成]
#IF
CHECKITEM 幸运符 1
#ACT
MOVR P8 100
#IF
SMALL P8 70
#ACT
take 幸运符 1
Give 屠龙 1
SendMsg 6 幸运符合成成功,你获得了屠龙
Goto @合成结束
break
#ELSEACT
take 幸运符 1
SendMsg 6 幸运符合成失败,幸运符已消耗
Goto @合成结束
break
#ELSEACT
MOVR P8 100
#IF
SMALL P8 50
#ACT
Give 屠龙 1
SendMsg 6 合成成功,你获得了屠龙
#ELSEACT
SendMsg 6 合成失败,请继续努力
break
[@合成结束]
#ACT
break

该脚本的核心逻辑是:先用CHECKITEM检测幸运符是否存在,存在时MOVR P8 100生成0到99的随机数,SMALL P8 70判断是否小于70。小于70则判定为成功,概率70%,同时消耗幸运符。大于等于70则判定为失败,同样消耗幸运符。不存在幸运符时走另一条分支,MOVR P8 100生成随机数后用SMALL P8 50判定,成功概率降至50%。

## 多目标随机合成与合成品文件配置

某些合成系统需要从多个可能的产物中随机抽取一个作为合成结果。这种需求通过GetRandomName命令配合文本文件来实现。在服务端Envir目录下新建一个文本文件,每行写一件可能的产出装备名称。脚本中通过GetRandomName命令读取该文件并随机返回一行内容。

[@随机合成]
#IF
CheckFoundryItem 神秘宝箱
#ACT
GetRandomName ..\Envir\合成品.txt S1
Give <$STR(S1)> 1
SendMsg 6 恭喜你获得了<$STR(S1)>
#ELSEACT
MESSAGEBOX 合成需要神秘宝箱一个。
break

合成品.txt的文件内容示例如下,每行一件装备,条目的数量比例决定了各装备的出现概率。如果文件中写了50行“金币”、10行“裁决之杖”、1行“屠龙”,则合成结果中金币的出现概率约为50/61,裁决之杖约为10/61,屠龙约为1/61。

金币
金币
裁决之杖
屠龙

文件的编码必须为ANSI,用UTF-8保存会导致读取到的物品名称为乱码,Give命令无法正确识别装备名称。

## M2合成物品配置与脚本的配合

脚本中的CheckFoundryItem和GiveFoundryItem命令依赖M2中的合成物品配置。在M2服务器管理程序中,进入物品合成或铸造配置面板,添加合成物品条目。需要填写的内容包括合成物品名称、所需材料的名称和数量、合成成功率、失败后是否消失。

材料配置支持金币、元宝和普通物品三种类型。如果需要合成消耗金币,在材料列表中添加金币并填写数量。如果需要消耗元宝,添加元宝条目。普通物品直接填写StdItems.DB中的物品名称。

合成多个物品时,M2支持以@FoundryItem_开头的标签格式批量配置。%FoundryItem是M2自动转换后的合成物品名称变量,在脚本中直接使用%FoundryItem代替具体的物品名称,可以复用同一段脚本处理多种合成配方。

[@FoundryItem_烽火手镯]
#IF
CheckFoundryItem %FoundryItem
#ACT
GiveFoundryItem %FoundryItem
#ELSEACT
MESSAGEBOX 合成<$STR(%FoundryItem)>的材料不足,请检查背包。
break

该写法将合成物品名称参数化,M2会根据当前触发的合成配方自动替换%FoundryItem的值。

## 引擎差异与常见报错排查

CheckFoundryItem和GiveFoundryItem命令在GOM、GEE、HERO三大引擎中均可用,命令语法一致。但成功率参数的解读方式在部分引擎中存在细微差异,移植脚本前需在实际引擎中测试成功率是否符合预期。

手动随机数方案中,RANDOM命令在BLUE引擎中需要改用MOVR实现,HERO引擎建议使用MOVR方案。GOM引擎的RandomNum命令语法与RANDOM类似,参数为随机数上限,生成0到参数值减一的随机数。

合成脚本执行后没有任何反应,排查顺序为:确认M2的合成物品配置中是否已添加对应的配方条目,检查材料名称与StdItems.DB中的物品名称是否完全一致(包含空格和标点),确认CheckFoundryItem命令后的物品名称与M2配置中的合成物品名称匹配。合成成功但玩家没有收到物品,检查GiveFoundryItem命令是否在#ACT段落中正确执行,以及背包是否有足够的空格存放合成产物。

@FoundryFail段中的补偿逻辑需要使用give命令手动发放返还物品。需要注意的是,该段执行时GiveFoundryItem已经回收了全部材料,如果希望合成失败时返还部分材料,必须在@FoundryFail段中通过give命令重新发放。