当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇切割脚本编写方法与实战应用案例

热度:
切割脚本在传奇里通常指两种功能:一是把大数值或长字符串按指定规则拆分成形,二是通过脚本命令实现对怪物或玩家的百分比扣血(也就是切割伤害)。下面把这两种切割的写法全部分解,附带可以直接套用的脚本案例。

**第一步:字符串切割——把长内容拆成形**

当你要处理的字符串太长,或者需要按固定长度分段显示时,就要用到字符串切割。比如把玩家输入的公告按每行12个字换行,或者把一段文本拆成几段分别存到不同变量里。

**核心命令:`StrTok`或`GetStringPos`配合`ExtractString`**

不同引擎命令有差异,以GOM/GEE引擎为例,切割字符串常用`StrTok`和`ExtractString`。

```
;示例:把长文本按逗号切割,取出每一段
[@Main]
#IF
#ACT
MOVS1装备武器衣服头盔项链
StrTokS1S21
;S2="装备"
StrTokS1S32
;S3="武器"
;以此类推
```

如果引擎不支持`StrTok`,可以用循环配合`ExtractString`手动切:

```
[@切割测试]
#IF
#ACT
MOVS$原始文本裁决骨玉龙纹无极棍井中月
MOVN$当前位置1
MOVN$总段数5

[@循环切割]
#IF
SMALLN$当前位置<$STR(N$总段数)>
#ACT
ExtractStringS$原始文本<$STR(N$当前位置)>S$分段内容
SENDMSG6第<$STR(N$当前位置)>段内容:<$STR(S$分段内容)>
INCN$当前位置1
GOTO@循环切割
#ELSEACT
SENDMSG6切割完成
```

**第二步:数字切割——把大数值拆成单位**

比如把元宝数量拆成“万”、“亿”单位显示,或者把经验值按比例分配。

```
[@数字单位转换]
#IF
#ACT
MOVN$元宝数量123456789

#IF
LARGEN$元宝数量100000000
#ACT
MOVN$亿<$STR(N$元宝数量)>
DIVN$亿100000000
MOVN$剩余<$STR(N$元宝数量)>
DECN$剩余<$STR(N$亿)>
MULN$剩余100000000
DIVN$剩余10000
SENDMSG6你拥有<$STR(N$亿)>亿<$STR(N$剩余)>万元宝
#ELSESAY
你拥有<$STR(N$元宝数量)>元宝
```

**第三步:切割伤害——按百分比扣血的脚本写法**

切割伤害是版本里常见的玩法,比如“攻击时有概率触发,直接扣除怪物当前血量10%”。这种脚本需要写在QF的伤害触发段里。

**文件位置:`QFunction-0.txt`**

```
[@Attack]
#IF
RANDOM10
#ACT
M.HUMANHP-<$STR(M.MAXHP)>/10
SENDMSG6触发切割效果,扣除怪物10%当前血量
```

**解释一下**:
-`[@Attack]`是攻击触发段,每次玩家攻击怪物时执行。
-`RANDOM10`代表10%概率触发。
-`M.HUMANHP`是扣减怪物血量,`<$STR(M.MAXHP)>`是怪物的最大血量,除以10就是扣10%。
-注意这里是按**当前血量**计算还是按**最大血量**计算,公式不一样。上面是按最大血量的10%扣,如果要按当前血量的10%扣,公式是`M.HUMANHP-<$STR(M.HP)>/10`。

**第四步:多段切割——逐层递减的高级写法**

有些版本需要做“切割伤害逐层递减”的机制,比如第一次切割扣20%,第二次扣15%,第三次扣10%。这需要配合变量记录切割次数。

```
[@Attack]
#IF
RANDOM10
CHECKCURRTARGETRACE=0
#ACT
MOVN$切割次数<$HUMAN(切割计数)>
INCN$切割次数1
CALCVARHUMAN切割计数=<$STR(N$切割次数)>
SAVEVARHUMAN切割计数..\QuestDiary\个人数据.txt

#IF
EQUALN$切割次数1
#ACT
M.HUMANHP-<$STR(M.MAXHP)>/5
SENDMSG6首次切割,扣除20%血量

#IF
EQUALN$切割次数2
#ACT
M.HUMANHP-<$STR(M.MAXHP)>*15/100
SENDMSG6二次切割,扣除15%血量

#IF
EQUALN$切割次数3
#ACT
M.HUMANHP-<$STR(M.MAXHP)>/10
SENDMSG6三次切割,扣除10%血量
MOVHUMAN切割计数0
SAVEVARHUMAN切割计数..\QuestDiary\个人数据.txt
```

**第五步:装备触发切割——佩戴特定武器才有切割**

把切割效果绑定到某把武器上,只有佩戴该武器才能触发。

```
[@Attack]
#IF
CHECKITEMW屠龙刀
RANDOM5
#ACT
M.HUMANHP-<$STR(M.MAXHP)>/8
SENDMSG6屠龙刀切割效果触发,扣除怪物12.5%血量
```

**第六步:多目标切割——群攻时同时切割多个怪物**

当技能同时打到多个怪物时,每个怪物独立判断切割。

```
[@MagicAttack]
#IF
EQUAL<$CURRRUSEMAGICID>36
#ACT
;这里是释放冰咆哮后的群攻处理
MOVN$当前目标数量<$CURRTARGETCOUNT>
#IF
LARGEN$当前目标数量1
#ACT
MOVD00
[@循环目标]
#IF
SMALLD0<$STR(N$当前目标数量)>
#ACT
INCD01
GetListVarHUMAN目标血量D0D$目标血量
DivD$目标血量20
;扣血逻辑,具体写法看引擎支持的命令
GOTO@循环目标
```

**第七步:常见错误与调试方法**

1.**变量类型不对**:扣血时要用`M.HUMANHP`,不能用`HUMANHP`。`M.`代表当前选中的怪物。
2.**除以零错误**:如果怪物血量为0,除以10会报错。所以切割前要判断`M.MAXHP`大于0。
3.**概率太高**:`RANDOM`后面的数字越大,概率越低。`RANDOM10`是10%概率,`RANDOM2`是50%概率。
4.**测试方法**:在QF里加`SENDMSG`输出调试信息,看切割触发时有没有提示,数值计算对不对。

**第八步:完整切割脚本整合案例**

把上面知识点串起来,写一个“嗜血神剑”武器切割效果:佩戴时攻击有20%概率扣除怪物当前血量15%,每次触发消耗1点持久。

```
[@Attack]
#IF
CHECKITEMW嗜血神剑
RANDOM5
#ACT
M.HUMANHP-<$STR(M.HP)>*15/100
SENDMSG7嗜血神剑触发切割,怪物剩余血量:<$STR(M.HP)>
;扣武器持久
CHANGEITEMDURABILITY1-1
#ELSESAY
;没触发则什么都不做
break
```
[顶部]