切割脚本在传奇里通常指两种功能:一是把大数值或长字符串按指定规则拆分成小段,二是通过脚本命令实现对怪物或玩家的百分比扣血(也就是切割伤害)。下面把这两种切割的写法全部分解,附带可以直接套用的脚本案例。
**第一步:字符串切割——把长内容拆成小段**
当你要处理的字符串太长,或者需要按固定长度分段显示时,就要用到字符串切割。比如把玩家输入的公告按每行12个字换行,或者把一段文本拆成几段分别存到不同变量里。
**核心命令:`StrTok` 或 `GetStringPos` 配合 `ExtractString`**
不同引擎命令有差异,以GOM/GEE引擎为例,切割字符串常用 `StrTok` 和 `ExtractString`。
```
; 示例:把长文本按逗号切割,取出每一段
[@Main]
#IF
#ACT
MOV S1 装备,武器,衣服,头盔,项链
StrTok S1 S2 , 1
; S2 = "装备"
StrTok S1 S3 , 2
; S3 = "武器"
; 以此类推
```
如果引擎不支持 `StrTok`,可以用循环配合 `ExtractString` 手动切:
```
[@切割测试]
#IF
#ACT
MOV S$原始文本 裁决,骨玉,龙纹,无极棍,井中月
MOV N$当前位置 1
MOV N$总段数 5
[@循环切割]
#IF
SMALL N$当前位置 <$STR(N$总段数)>
#ACT
ExtractString S$原始文本 , <$STR(N$当前位置)> S$分段内容
SENDMSG 6 第<$STR(N$当前位置)>段内容:<$STR(S$分段内容)>
INC N$当前位置 1
GOTO @循环切割
#ELSEACT
SENDMSG 6 切割完成
```
**第二步:数字切割——把大数值拆成单位**
比如把元宝数量拆成“万”、“亿”单位显示,或者把经验值按比例分配。
```
[@数字单位转换]
#IF
#ACT
MOV N$元宝数量 123456789
#IF
LARGE N$元宝数量 100000000
#ACT
MOV N$亿 <$STR(N$元宝数量)>
DIV N$亿 100000000
MOV N$剩余 <$STR(N$元宝数量)>
DEC N$剩余 <$STR(N$亿)>
MUL N$剩余 100000000
DIV N$剩余 10000
SENDMSG 6 你拥有<$STR(N$亿)>亿<$STR(N$剩余)>万元宝
#ELSESAY
你拥有<$STR(N$元宝数量)>元宝
```
**第三步:切割伤害——按百分比扣血的脚本写法**
切割伤害是版本里常见的玩法,比如“攻击时有概率触发,直接扣除怪物当前血量10%”。这种脚本需要写在QF的伤害触发段里。
**文件位置:`QFunction-0.txt`**
```
[@Attack]
#IF
RANDOM 10
#ACT
M.HUMANHP - <$STR(M.MAXHP)> / 10
SENDMSG 6 触发切割效果,扣除怪物10%当前血量
```
**解释一下**:
- `[@Attack]` 是攻击触发段,每次玩家攻击怪物时执行。
- `RANDOM 10` 代表10%概率触发。
- `M.HUMANHP` 是扣减怪物血量,`<$STR(M.MAXHP)>` 是怪物的最大血量,除以10就是扣10%。
- 注意这里是按**当前血量**计算还是按**最大血量**计算,公式不一样。上面是按最大血量的10%扣,如果要按当前血量的10%扣,公式是 `M.HUMANHP - <$STR(M.HP)> / 10`。
**第四步:多段切割——逐层递减的高级写法**
有些版本需要做“切割伤害逐层递减”的机制,比如第一次切割扣20%,第二次扣15%,第三次扣10%。这需要配合变量记录切割次数。
```
[@Attack]
#IF
RANDOM 10
CHECKCURRTARGETRACE = 0
#ACT
MOV N$切割次数 <$HUMAN(切割计数)>
INC N$切割次数 1
CALCVAR HUMAN 切割计数 = <$STR(N$切割次数)>
SAVEVAR HUMAN 切割计数 ..\QuestDiary\个人数据.txt
#IF
EQUAL N$切割次数 1
#ACT
M.HUMANHP - <$STR(M.MAXHP)> / 5
SENDMSG 6 首次切割,扣除20%血量
#IF
EQUAL N$切割次数 2
#ACT
M.HUMANHP - <$STR(M.MAXHP)> * 15 / 100
SENDMSG 6 二次切割,扣除15%血量
#IF
EQUAL N$切割次数 3
#ACT
M.HUMANHP - <$STR(M.MAXHP)> / 10
SENDMSG 6 三次切割,扣除10%血量
MOV HUMAN 切割计数 0
SAVEVAR HUMAN 切割计数 ..\QuestDiary\个人数据.txt
```
**第五步:装备触发切割——佩戴特定武器才有切割**
把切割效果绑定到某把武器上,只有佩戴该武器才能触发。
```
[@Attack]
#IF
CHECKITEMW 屠龙刀
RANDOM 5
#ACT
M.HUMANHP - <$STR(M.MAXHP)> / 8
SENDMSG 6 屠龙刀切割效果触发,扣除怪物12.5%血量
```
**第六步:多目标切割——群攻时同时切割多个怪物**
当技能同时打到多个怪物时,每个怪物独立判断切割。
```
[@MagicAttack]
#IF
EQUAL <$CURRRUSEMAGICID> 36
#ACT
; 这里是释放冰咆哮后的群攻处理
MOV N$当前目标数量 <$CURRTARGETCOUNT>
#IF
LARGE N$当前目标数量 1
#ACT
MOV D0 0
[@循环目标]
#IF
SMALL D0 <$STR(N$当前目标数量)>
#ACT
INC D0 1
GetListVar HUMAN 目标血量 D0 D$目标血量
Div D$目标血量 20
; 扣血逻辑,具体写法看引擎支持的命令
GOTO @循环目标
```
**第七步:常见错误与调试方法**
1. **变量类型不对**:扣血时要用 `M.HUMANHP`,不能用 `HUMANHP`。`M.` 代表当前选中的怪物。
2. **除以零错误**:如果怪物血量为0,除以10会报错。所以切割前要判断 `M.MAXHP` 大于0。
3. **概率太高**:`RANDOM` 后面的数字越大,概率越低。`RANDOM 10` 是10%概率,`RANDOM 2` 是50%概率。
4. **测试方法**:在QF里加 `SENDMSG` 输出调试信息,看切割触发时有没有提示,数值计算对不对。
**第八步:完整切割脚本整合案例**
把上面知识点串起来,写一个“嗜血神剑”武器切割效果:佩戴时攻击有20%概率扣除怪物当前血量15%,每次触发消耗1点持久。
```
[@Attack]
#IF
CHECKITEMW 嗜血神剑
RANDOM 5
#ACT
M.HUMANHP - <$STR(M.HP)> * 15 / 100
SENDMSG 7 嗜血神剑触发切割,怪物剩余血量:<$STR(M.HP)>
; 扣武器持久
CHANGEITEMDURABILITY 1 - 1
#ELSESAY
; 没触发则什么都不做
break
```

