比如一把刀有3个属性,"可出售","可破盾"和"单手武器\",在item_kinds.txt中并不是列出3个数据来分别表示这3个属性的,会综合在一起,
用1个数据表明这3种属性!
正因为有这个误区的存在,所以往往大家会出现认为不同的武器有不同的破盾属性,这是不对的.破盾属性只有一个,只不过与其他数据综合
在一起就不同了.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
举个例子:
py代码为
["salt","Salt", [("salt_sack",0)], itp_merchandise|itp_type_goods, 0, 16,weight(40)|abundance(120),imodbits_none],
转换后的txt为
itm_salt Salt Salt 1 salt_sack 0 65547 0 16 0 40.000000 120 0 0 0 0 0 0 0 0 0 0 0
0
txt中其他的数据都好理解,但65547是怎么来的?
这涉及到python的运算符"|",也就是中间"|"线表示的含义.
查header_items.py文件,得到
itp_merchandise = 0x00010000 实质的含义是itp_merchandise就是十六进制数据0x00010000,转为二进制为:10000000000000000
itp_type_goods = 0x0000000b 实质的含义是itp_type_goods就是十六进制数据0x0000000b,转为二进制为:1011
另外
"|"是python的一个运算符,含义是"按位或","或"的意思大家都明白,比如二进制的"1或0"得到的结果就是1,"按位"的意思是把数据都写成二进制,从右往左排好位置,那么"|"的功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1
运算:
itp_merchandise|itp_type_goods
10000000000000000|1011
即:
10000000000000000
1011
_______________________
10000000000001011
10000000000001011转换为10进制就是65547.
简单方法:因为位数通常是错开的,你也可以直接用16进制的数相加计算,即:10000+b=1000b,转换为10进制就是65547
下面我们反向理解一下txt中的数据,比如:
itm_iron_staff Iron_Staff Iron_Staff 1 iron_staff 0 1078034436 4222129415393024 222 10 2.000000 100 0 0 0 0 17408 89 0 140 0 528 529
0
把1078034436转换成16进制,得40418004,这代表什么呢?
按不同数据位 把数据分解为40000000+400000+10000+8000+4
查header_items.py得到:
itp_type_polearm = 0x00000004
itp_merchandise = 0x00010000
itp_spear = 0x00008000
itp_primary = 0x00400000
itp_penalty_with_shield = 0x40000000
也就是说这个staff有这些属性.
4222129415393024这个数据是多项合成的,比较复杂,但原理还是相同的,就不赘述了.
[ 本帖最后由 kanesunny 于 2007-3-29 00:41 编辑 ]