- 好友
- 2
- 在线时间
- 7 小时
- 最后登录
- 2024-2-14
扈从
- UID
- 2733102
- 第纳尔
- 748
- 精华
- 0
- 互助
- 8
- 荣誉
- 1
- 贡献
- 0
- 魅力
- 0
- 注册时间
- 2016-3-31
鲜花( 47) 鸡蛋( 0)
|
本帖最后由 zhl199565 于 2016-5-15 12:32 编辑
#damage types:
cut = 0
pierce = 1
blunt = 2
首先物品头文件里面物品伤害类型有三种...,根据其数据储存的规律...感觉到至少有一种没被使用的...
之后向下面编译规则
ibf_armor_mask = 0x00000000000000000000000ff
ibf_damage_mask = 0x00000000000000000000003ff
iwf_swing_damage_bits = 50
iwf_swing_damage_type_bits = 58
iwf_thrust_damage_bits = 60
iwf_thrust_damage_type_bits = 68
iwf_weapon_length_bits = 70
def swing_damage(damage,damage_type):
x = ((damage_type << iwf_damage_type_bits) | (damage & ibf_armor_mask))
return (((bignum | x) & ibf_damage_mask) << iwf_swing_damage_bits)
def get_swing_damage(y):
return (y >> iwf_swing_damage_bits) & ibf_damage_mask
def thrust_damage(damage,damage_type):
x = ((damage_type << iwf_damage_type_bits) | (damage & ibf_armor_mask))
return (((bignum | x) & ibf_damage_mask) << iwf_thrust_damage_bits)
def get_thrust_damage(y):
return (y >> iwf_thrust_damage_bits) & ibf_damage_mask
对编程毫无基础的我都是刚刚百度才得知这些位运算符号的含义,(还好有一点小学数学的基础= =!)...函数就直接英文字面意思了,只是理解....
伤害范围是根据(damage & ibf_armor_mask)) 能知道是0~255= =....因为ibf_armor_mask是ff也就是十进制255....是2的8次方-1 所以二进制就是全位为1的数....所以根据运算定义其范围自然就不会大于它本身,不过为了方便理解就相当于结果取余数(2n次方-1的特性)这里懒得证明了...其除数则是256....被除数是damage
而 x = ((damage_type << iwf_damage_type_bits) | (damage & ibf_armor_mask)),
前面是左移值,因为只有0,1,2三种...0很简单...而iwf_damage_type_bits明显大于8,也就是说 ((damage_type << iwf_damage_type_bits)能整除2的8次方(之所以不说倍数是因为还有0),......其结果方便理解就是相加(同样懒得证明了)...
而罪关键的是 return (((bignum | x) & ibf_damage_mask) << iwf_swing_damage_bits)
其中ibf_damage_mask=3ff也就是2的10次方-1 这个就是伤害的范围0~1023,而反过来看
iwf_swing_damage_bits = 50
和
iwf_swing_damage_type_bits = 58=iwf_swing_damage_bits+8=iwf_thrust_damage_bits-2
和
iwf_thrust_damage_bits = 60
和
iwf_thrust_damage_type_bits = 68=iwf_thrust_damage_bits+8=iwf_weapon_length_bits-2
和
iwf_weapon_length_bits = 70
分别为2的8次方和2的2次方
而iwf_swing_damage_bits与iwf_thrust_damage_bits与iwf_weapon_length_bits差了10个左移位...也就是2的10次方
所谓存数据的规律...再之上写的那些就是想表达意思来着...不过个人语言表达倾向于个人逻辑的跳跃习惯,反正直接说意思,2进制一个位的含义就是是和否,也就是说每一位都是一个是和否(即0和1),.....
而当分别有a,b两种不互相影响的情况时,那么a和b就分别有一个是和否...
也就是根据集合的乘法也就是....{0,1}×{a,b}={(0,a),(0,b),(1,a),(1,b)}.....而a和b又怎么表示呢?二进制同样只有是和否 那么当只有a,和b两种的情况下 也就用0,1来表示了...结果直接,而这不是只有a和b...a和b同时各有是和否,所以可以用二进制的个位表示a的是和否 二位(?也就相当于十进制的十位= =!,个人语言勿喷)表示b的, 四位表示c的以此类推............
ps...补充一下,二进制的个位就是0和1 二进制的二位就是x0 那么二进制的四位就是x00这样....
所以集合{0,1}×{a,b}的相乘把a和b都带入位的表示就相当于{0,1}×{0,10}....而这里之所以用集合不用数组就是因为防止用数组而忽略了其最后数据是一串来表示,如果不额外在分类判断数据同样会混淆....
这就是数据储存规律之一(主要类别的判断)
返回上部iwf_swing_damage_bits与iwf_thrust_damage_bits差了二进制的10个位,说过了a和b若是差一个位,那么a有两种结果(0,1)...如果a和b差了两个位...那么a就有四中结果(0,1,10,11),也就是二进制两个位的数量(2的2次方)
所以挥砍动作的伤害和穿刺动作的伤害(两种伤害动作类型),其值可以存二进制10个位的值,也就是十进制的0~1023
而对于每一个动作其值还储存伤害类型...挥砍动作伤害到iwf_swing_damage_type_bits(挥砍动作伤害类型),这个是8个位,也就是十进制的0~255表示伤害值...伤害类型到下一个bit是2位,存4种伤害类型也就是0~3......(你不会才发现多一种可储存类型把)。
而以上之所以把如此简单的说的如此复杂混乱,而且逻辑有多次跳跃,其原因是因为从各个方面分析(先是外行人眼中的py函数理解,然后是数学中的值积和计算机二进制语言的关系,其实人对于二进制的理解也是数学,或者说人理解世界的一切都是数学...- -!,而数学的本质则是建立的模型概念,也就是说认知世界是离不开通过模型的)方便不同人的理解...(好吧,也许每个方面都难以理解= =),
所以可以说以上对于很多人基本都是废话..........................*************************************
那么重点如下,理论伤害范围0~1023(包括了其类型4种,而每种分别瓜分0~1023的四分之一),和众多数据类型一样,依然有很多中间空余的数据没有利用储存...所以只是推测有第四种伤害类型,这只是初步证明了第四种伤害是可能存在的(毕竟打不开硬核文件)...然后就是测试了...首先我把一把剑的伤害头设定成了800....................然后module.ini文件伤害与防御的减免系数全部设为10
armor_soak_factor_against_cut = 10
armor_soak_factor_against_pierce = 10
armor_soak_factor_against_blunt = 10
armor_reduction_factor_against_cut = 10
armor_reduction_factor_against_pierce = 10
armor_reduction_factor_against_blunt = 10
....进入游戏后马上开新档测试(因为以前也没有档= =)...........然而在柏拉汶商人的第一个场景中,遇见强盗那里...半天谁也没砍死谁....还好新角色没有帽子,最后被劈砍击晕...然后测试找到我那把修改后的剑,居然显示的是32钝伤!(即800-768)....由此打开能判断这里的硬核语言是类似tryelse那种,最后一个tryelse就省去其类的范围条件了,即剩下的都是钝伤害.....
(ps:顺便补充一下,虽然显示是钝伤,但是和砍刺一样是杀人,不是击晕= =)
然而这只是显示(即硬核ui位置)....他始终没有module.ini里的定义位置,那么他输出呢?测试结果是无视一切防御值,也就是减免系数没有的都为0!.....而且能正常输出伤害....换句话说就是其”真实伤害值“...然而悲剧的是硬核文件打不开,想直接设定新的一种伤害也不行,所以要么就绝对真实伤害(不包括技能速度熟练度等加成)...要么就通过场景触发器修改....
|
评分
-
查看全部评分
鲜花鸡蛋iLoveFG 在2016-5-15 12:02 送朵鲜花 并说:送朵鲜花鼓励一下 ,虽然我看不懂
|