消除对items数据理解的一个误区

字体:        | 上一篇 下一篇 | 打印

误区:认为一件物品有N个属性,那么就有分列的N个数据表示,其实不是的!
       比如一把刀有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 编辑 ]

查看全部评论(0)我来说两句

-5 -3 -1 - +1 +3 +5