合成系统
利用物品名字做的,目前最简单最有效率的做法了,光看里面的循环次数就知道了
而得到无关的物品也不会触发动作
替别人做的演示,这么好的DD扔那可惜了,就提出来了
在名字中加颜色代码|cxxxxxxxx|r十位字符,x取值0~9,a~f,A~F,是不会对显示有影响的,而名字有96个字符的空间,可以利用来做很多时。
具体方法:
在物品名字前加自定义值,取4位
物品自定义值格式:|cXYYZ0000|r
X表示合成组件的数量,取值2-6
X+YY表示合成物品的编号
Z表示组件编号,比如一个3in1的物品,其组件分别为123
并设一个数组保存成品,X+YY为其编号
更新的演示是支持同一物品在多个合成公式的,不过当然步骤要比原来的麻烦
对于在对多个配方中用到的物品,自定义值以7xx0格式保存,并建立一个字符串数组以7xx编号来保存其实际自定义值
字符串格式为XYYZxyyzXYYZxyyz,与上面的自定义意义是一样的
判断到物品自定义段首位为7就从数组里读取信息
暂不支持A+A+B=C类同一物品出现多次的合成 ,毕竟功能越强,消耗资源也越多
等要用到再整理了
升级系统
自定义物品时让同类物品按序排列(按Ctrl+D可以看到)
设置等级1物品等级为99以便区分,得到物品时判断其等级,等级为99则触发动作
判断1~6格物品ID,利用其差即可判定是否同类物品,其允许差即为可升级段数
满足条件则在其ID基础上+1,即实现了升级,够效率吧~~
该演示是用得到Lv1物品来升级的,可升级3次 (b >= a and b - a <3,即对Lv1~3都可升级)
如果要改成用其它物品来升级,只需将Lv1改为该物品,b >= a改为b>a(不允许Lv1物品的升级)即可
注意:
物品ID是按ASCII码转为256进制的,而自定义物品中只使用0~9,A~Z 36个字符,相对应ASCII码为48~57,65~90
所以物品9-A,Z-0会有一个跨度,比如'I009'=1227894841 'I00A'=1227894849,中间的跨度为8而不是1
这样,如果同一类物品中有此类情况就会出现问题
对此有2种解决方法:
1 将BT效率进行到底,遇到此类情况就跳过,如本来I008~I00B的,那就先创建两个无用DD填掉08和09,然后使用0A~0D的位置,再把08 09的物品删掉
2 使用以下自定义函数将256进制转为36进制,然后比较转化过的数值
具体方法: 将function IdTo36那段Copy到自定义代码区
J版则将 local integer a=GetItemTypeId(GetManipulatedItem()) => local integer a=IdTo36(GetItemTypeId(GetManipulatedItem()))
set b = GetItemTypeId(UnitItemInSlot(GetTriggerUnit(), i)) => set b = IdTo36(GetItemTypeId(UnitItemInSlot(GetTriggerUnit(), i)))
T版同样是将2句Custom script加上 IdTo36()
function IdTo36 takes integer i returns integer
local integer m = i
local integer n
local integer j = 1
local integer k
loop
set n = m/256
set m = m - 256*n
if m<57 then
set m=m-48
else
set m=m-55
endif
set k = k+m*j
exitwhen j>=46656
set j = 36*j
set m = n
endloop
return k
endfunction
[ 本帖最后由 Red_Wolf 于 2006-8-22 23:26 编辑 ]
附件:
简单的物品合成演示.w3x (2006-6-7 22:29, 18.56 K)该附件被下载次数 364
附件:
简单的物品合成演示改.w3x (2006-6-10 19:31, 21.19 K)该附件被下载次数 276
附件:
最BT的物品升级演示.w3x (2006-8-22 23:26, 20.37 K)该附件被下载次数 23
责任编辑:瞳瞳
进入论坛参与针对本文章的讨论
