脚本示例

装备属性转移脚本

GetEquipProps 读取装备普通属性、鉴定属性与神秘神技的完整示例脚本。

用途

用 GetEquipProps 把身上装备的属性读进变量表,再用 STRTOK 分解字符串,实现装备属性转移/改写:普通属性、鉴定属性、鉴定神技分别处理。

参考脚本

[@MAIN]
<获取并修改武器属性示例/@GETEQUIPPROPS> \ \
<关闭/@EXIT>
[@GETEQUIPPROPS]
; 检测并修改武器的属性
#IF
CHECKUSEITEM 1
#ACT
MOV S_EVAL_BASE_PROP ""
MOV S_EVAL_MYST_PROP ""
MOV M_EVAL_SPEC_PROP 0
MOV M_EVAL_SKILL_PROP 0
MOV M_EVAL_TIMES_PROP 0
GETEQUIPPROPS 1

[@ONGETEQUIPPROPS]
; STRTOK 可以分解这样的字符:
#ACT
SENDMSG 5 分解字符串例子...
MOV  S_EVAL_PROPS 1=11,2=12,3=13,9=15|6=11,10=12,11=13,12=15|67|127|2
STRTOK S_EVAL_PROPS S_LEFTSTR1 |
STRTOK S_EVAL_PROPS S_LEFTSTR2 |
STRTOK S_EVAL_PROPS S_LEFTSTR3 |
STRTOK S_EVAL_PROPS S_LEFTSTR4 |
STRTOK S_EVAL_PROPS S_LEFTSTR5 |
SENDMSG 5 "先按“|”分解出:<$STR(S_LEFTSTR1)>,  <$STR(S_LEFTSTR2)>,  <$STR(S_LEFTSTR3)>,  <$STR(S_LEFTSTR4)>,  <$STR(S_LEFTSTR5)>"

; 分解S_LEFTSTR1,其他S_LEFTSTRXX方法一致
STRTOK S_LEFTSTR1 S_PROPVAL1 ,
STRTOK S_LEFTSTR1 S_PROPVAL2 ,
STRTOK S_LEFTSTR1 S_PROPVAL3 ,
STRTOK S_LEFTSTR1 S_PROPVAL4 ,
SENDMSG 5 "再按“,”分解出:<$STR(S_PROPVAL1)>,  <$STR(S_PROPVAL2)>,  <$STR(S_PROPVAL3)>,  <$STR(S_PROPVAL4)>"

STRTOK S_PROPVAL1 S_PROP1 =
STRTOK S_PROPVAL2 S_PROP2 =
STRTOK S_PROPVAL3 S_PROP3 =
STRTOK S_PROPVAL4 S_PROP4 =

SENDMSG 5 "得到属性<$STR(S_PROP1)>=<$STR(S_PROPVAL1)>,<$STR(S_PROP2)>=<$STR(S_PROPVAL2)>,<$STR(S_PROP3)>=<$STR(S_PROPVAL3)>,<$STR(S_PROP4)>=<$STR(S_PROPVAL4)>"

#IF
TRUE
#ACT
; 获取鉴定特殊属性到M_EVAL_SPEC_PROP
FORMATSTR <$STR(M_EQUIP[%S]_EVAL_SPEC_PROPS{0})%S <$PARAM(3)> >
MOV M_EVAL_SPEC_PROP <$CALCRESULT>

; 更改鉴定特殊属性,可以使用#CALL简化脚本
#IF
ISBITSET M_EVAL_SPEC_PROP 0
#ACT
SENDMSG 5 "拥有特殊属性:八卦护身神技"
; 删除掉该技能
UNSETBIT M_EVAL_SPEC_PROP 0

#IF
ISBITSET M_EVAL_SPEC_PROP 1
#ACT
SENDMSG 5 "拥有特殊属性:战意麻痹神技"
; 删除掉该技能
UNSETBIT M_EVAL_SPEC_PROP 1

#IF
ISBITSET M_EVAL_SPEC_PROP 2
#ACT
SENDMSG 5 "拥有特殊属性:重生神技"
; 删除掉该技能
UNSETBIT M_EVAL_SPEC_PROP 2

#IF
ISBITSET M_EVAL_SPEC_PROP 3
#ACT
SENDMSG 5 "拥有特殊属性:探测神技"
; 删除掉该技能
UNSETBIT M_EVAL_SPEC_PROP 3

#IF
ISBITSET M_EVAL_SPEC_PROP 4
#ACT
SENDMSG 5 "拥有特殊属性:传送神技"
; 删除掉该技能
UNSETBIT M_EVAL_SPEC_PROP 4

#IF
ISBITSET M_EVAL_SPEC_PROP 5
#ACT
SENDMSG 5 "拥有特殊属性:麻痹神技"
#ELSEACT
; 没有“麻痹神技”?那就设置一个“麻痹神技”,然后可以将M_EVAL_SPEC_PROP的值回设给装备,即拥有“麻痹神技”
SETBIT M_EVAL_SPEC_PROP 5

#IF
!ISBITSET M_EVAL_SPEC_PROP 6
#ACT
SENDMSG 5 "赋予特殊属性:魔道麻痹神技"
SETBIT M_EVAL_SPEC_PROP 6

; 获取鉴定神技属性到M_EVAL_SKILL_PROP
FORMATSTR <$STR(M_EQUIP[%S]_EVAL_SKILL_PROPS{0})%S <$PARAM(3)> >
MOV M_EVAL_SKILL_PROP <$CALCRESULT>

; 如果是武器,是拥有技能,其他非武器类装备是技能等级+1
#IF
ISBITSET M_EVAL_SKILL_PROP 0
#ACT
SENDMSG 5 "拥有神技:五岳独尊特技"
; 删除掉该技能
UNSETBIT M_EVAL_SKILL_PROP 0

#IF
ISBITSET M_EVAL_SKILL_PROP 1
#ACT
SENDMSG 5 "拥有神技:召唤巨魔特技"
; 删除掉该技能
UNSETBIT M_EVAL_SKILL_PROP 1

#IF
ISBITSET M_EVAL_SKILL_PROP 2
#ACT
SENDMSG 5 "拥有神技:神龙附体特技"
; 删除掉该技能
UNSETBIT M_EVAL_SKILL_PROP 2

#IF
ISBITSET M_EVAL_SKILL_PROP 3
#ACT
SENDMSG 5 "拥有神技:倚天辟地特技"

FORMATSTR <$STR(M_EQUIP[%S]_EVAL_TIMES_PROPS{0})%S <$PARAM(3)> >
MOV M_EVAL_TIMES_PROP <$CALCRESULT>

#IF
; 升级身上装备,只是特殊技能
!COMPVAL <$PARAM(3)> = 10000
#ACT
; 故意留了空格,防止分解字符串是出现问题
FORMATSTR "%S |%S |%S |%S | %S" $STR(S_EVAL_BASE_PROP) $STR(S_EVAL_MYST_PROP) $STR(M_EVAL_SPEC_PROP) $STR(M_EVAL_SKILL_PROP) $STR(M_EVAL_TIMES_PROP)
SENDMSG 5 "即将设置的鉴定属性:<$CALCRESULT>"
; 第5参数本来处理失败的结果,现在扩展为可以设置99,即忽略普通属性的升级,这里只升级神秘属性
UpgradeItemEX <$PARAM(3)> 11 1 1 99 "" 1 <$CALCRESULT>
; 升级自定义装备框的装备,略...
;
#ELSEACT
;UPGRADEDLGITEM

下载装备转移【配置脚本】

关键点

  • 画面入口是 [@MAIN] 的两个按钮,[@GetEquipProps] 负责 CheckUseItem <装备位> 判断并调用 GetEquipProps <装备位>,结果在回调 [@OnGetEquipProps] 里取。
  • 属性表变量:S_EVAL_BASE_PROP(普通属性,对应 M_EQUIP[位置]_NORM_PROPS{序号})、S_EVAL_MYST_PROP(神秘属性)、M_EVAL_SPEC_PROP(特殊属性位)、M_EVAL_SKILL_PROP(神技位)、M_EVAL_TIMES_PROP(鉴定次数)。
  • 分解字符串用 STRTOK,源注释给了“分解 S_LEFTSTR1,其它 S_LEFTSTRXX 方法一致”的写法。
  • 神技属性处理段的思路:先用 M_EVAL_SPEC_PROP / M_EVAL_SKILL_PROP 取出,删除旧技能后再回设给装备,即可获得/替换“麻痹神技”一类鉴定技能;源注释明确“没有‘麻痹神技’?那就设置一个……”。
  • 升级装备用 UPGRADEITEMEX,第 5 参数写 99 表示忽略普通属性升级、只升级神秘属性。
  • 同一主题的另一份写法见 装备鉴定属性转移获取脚本:它用中文变量名 S普通属性表/S普通鉴定表/S神秘鉴定表/M特殊属性表/M神技属性表/M鉴定次数,并多出 5 个属性展示段([@Norm_Prop_Show]、[@EVAL_Base_Show]、[@Eval_Myst_Show]、[@EVAL_SPEC_Show]、[@EVAL_SKILL_Show])。

相关阅读