先说结论
个体值6v
82024536 BFFF
82024534 FFFF
(以上两条需要都开启)
六维努力值252
hp:82024524 00FC
物攻:82024524 FC00
(这两个只能开一个)
速度:82024526 FC00
物防:82024526 00FC
(这两个只能开一个)
特攻:82024528 00FC
特防:82024528 FC00
(这两个只能开一个)
——————————————————————
下面说明推导过程,看完并理解之后就能自己修改以上代码得到自己想要的个体值和努力值
先说个体值:
个体值的转换过程比较复杂,我们从最常见的raw码入手
已知6v个体raw码为
02024534 3FFFFFFF
前8位为地址,后八位为数值,转换为CB码变成xxxxxxxx yyyy的形式,同样的,前8位是地址,后8位是数值
先把首位改成8,然后后半拆成两个码,3FFF和FFFF,3FFF会把普特2改成普特1所以可以用BFFF替换,第一个码修改需要将前半段地址+2,最终是:
82024534 FFFF
82024536 BFFF
遵循低位匹配低位,高位匹配高位的规律
FFFF是低四位,匹配较低的82024534
BFFF是高四位,匹配较高的82024536
地址+2是因为FFFF转换成二进制后占了4*4=16位,而一字节是8位,所以地址要+2
问题注意:另外,因为部分精灵是有两种普特的,使用3FFF进行修改会导致普特2变为普特1,而梦特、普特1不会改变。如果需要修改个体且保留普特2的话只需要将代码后缀里的“3”改为“B”即可
那么6v也就是6个31是如何转换到raw码后8位的3FFFFFFF呢?这要从二进制入手
易知2^5=32,所以二进制的11111就是2^5-1=31,那么将6个31顺序排列转换为二进制就是
11111 11111 11111 11111 11111 11111
再转换为16进制,二进制转换为16进制的方法是从后往前四个四个一组求加权和,即n*2^位置,四个二进制数对应一位16进制数
划分完之后序列变成如下(为了容易辩识,这里采用大写V表示划分标志,不够4个一组的补0处理)
0011V111 1V1111V 1111V1 111V11 11V111 1V1111
已1111为例,转换为16进制为
1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = F(15)
易得原序列对应的16进制序列为
3FFFFFFF
这就解释了后八位数值的来源,并不是瞎填的或是随机生成一串数字
练习:如果我想要我的个体值为31,30,31,31,30,31,即物攻和特攻位置是30,其他都是31,该如何修改代码?
还是和上面的过程一样,先把31,30,31,31,30,31的二进制序列写出来
11111 11110 11111 11111 11110 11111
再四个四个一组划分
0011V111 1V1110V 1111V1 111V11 11V110 1V1111
得出16进制序列
3FEFFFFDF
同样3可以用B替换用于保留普特2
得出CB码为:
82024534 FFDF
82024536 BFEF
再说努力值:
努力值比起个体值来说转换比较简单,依旧是从raw码入手:
已知首位宝可梦全满努力值修改:
02024527 FFFFFFFF
02024528 FFFFFFFF
【不要这么干,努力值总和最高510】
第一行的“FFFFFFFF”每两个F代表一项基础能力, FF FF FF FF 从高位到低位分别是
速度 物防 物攻 HP
第二行的“FFFFFFFF”仅后两对FF是有效的
FF FF FF FF 从高位到低位分别是
空 空 特防 特攻
易得:
首位宝可梦的单项努力值变更raw伪码为
020245?? xx
其中,??位置填的是对应的六维代号,由一位16进制数占4位可知02024527向前推3位就是hp的位置 ,以此类推得到六维位置码:
体力24
物攻25
物防26
速度27
特攻28
特防29
要转换成CB码xxxxxxxx yyyy的形式,和上面个体值转换类似,前8位首位的0变成8
即820245??
六维被两两分成3组,体力和物攻,物防和速度,特攻和特防
如果让后四位的低二位控制这一组的前一个属性,高二位控制这一组的后一个属性,那么一行代码就可以控制两个属性,这样设计的好处在于两位16进制数由8位2进制数表示,表示十进制范围为0到2^8-1=255,正好是努力值的范围
个体值6v
82024536 BFFF
82024534 FFFF
(以上两条需要都开启)
六维努力值252
hp:82024524 00FC
物攻:82024524 FC00
(这两个只能开一个)
速度:82024526 FC00
物防:82024526 00FC
(这两个只能开一个)
特攻:82024528 00FC
特防:82024528 FC00
(这两个只能开一个)
——————————————————————
下面说明推导过程,看完并理解之后就能自己修改以上代码得到自己想要的个体值和努力值
先说个体值:
个体值的转换过程比较复杂,我们从最常见的raw码入手
已知6v个体raw码为
02024534 3FFFFFFF
前8位为地址,后八位为数值,转换为CB码变成xxxxxxxx yyyy的形式,同样的,前8位是地址,后8位是数值
先把首位改成8,然后后半拆成两个码,3FFF和FFFF,3FFF会把普特2改成普特1所以可以用BFFF替换,第一个码修改需要将前半段地址+2,最终是:
82024534 FFFF
82024536 BFFF
遵循低位匹配低位,高位匹配高位的规律
FFFF是低四位,匹配较低的82024534
BFFF是高四位,匹配较高的82024536
地址+2是因为FFFF转换成二进制后占了4*4=16位,而一字节是8位,所以地址要+2
问题注意:另外,因为部分精灵是有两种普特的,使用3FFF进行修改会导致普特2变为普特1,而梦特、普特1不会改变。如果需要修改个体且保留普特2的话只需要将代码后缀里的“3”改为“B”即可
那么6v也就是6个31是如何转换到raw码后8位的3FFFFFFF呢?这要从二进制入手
易知2^5=32,所以二进制的11111就是2^5-1=31,那么将6个31顺序排列转换为二进制就是
11111 11111 11111 11111 11111 11111
再转换为16进制,二进制转换为16进制的方法是从后往前四个四个一组求加权和,即n*2^位置,四个二进制数对应一位16进制数
划分完之后序列变成如下(为了容易辩识,这里采用大写V表示划分标志,不够4个一组的补0处理)
0011V111 1V1111V 1111V1 111V11 11V111 1V1111
已1111为例,转换为16进制为
1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = F(15)
易得原序列对应的16进制序列为
3FFFFFFF
这就解释了后八位数值的来源,并不是瞎填的或是随机生成一串数字
练习:如果我想要我的个体值为31,30,31,31,30,31,即物攻和特攻位置是30,其他都是31,该如何修改代码?
还是和上面的过程一样,先把31,30,31,31,30,31的二进制序列写出来
11111 11110 11111 11111 11110 11111
再四个四个一组划分
0011V111 1V1110V 1111V1 111V11 11V110 1V1111
得出16进制序列
3FEFFFFDF
同样3可以用B替换用于保留普特2
得出CB码为:
82024534 FFDF
82024536 BFEF
再说努力值:
努力值比起个体值来说转换比较简单,依旧是从raw码入手:
已知首位宝可梦全满努力值修改:
02024527 FFFFFFFF
02024528 FFFFFFFF
【不要这么干,努力值总和最高510】
第一行的“FFFFFFFF”每两个F代表一项基础能力, FF FF FF FF 从高位到低位分别是
速度 物防 物攻 HP
第二行的“FFFFFFFF”仅后两对FF是有效的
FF FF FF FF 从高位到低位分别是
空 空 特防 特攻
易得:
首位宝可梦的单项努力值变更raw伪码为
020245?? xx
其中,??位置填的是对应的六维代号,由一位16进制数占4位可知02024527向前推3位就是hp的位置 ,以此类推得到六维位置码:
体力24
物攻25
物防26
速度27
特攻28
特防29
要转换成CB码xxxxxxxx yyyy的形式,和上面个体值转换类似,前8位首位的0变成8
即820245??
六维被两两分成3组,体力和物攻,物防和速度,特攻和特防
如果让后四位的低二位控制这一组的前一个属性,高二位控制这一组的后一个属性,那么一行代码就可以控制两个属性,这样设计的好处在于两位16进制数由8位2进制数表示,表示十进制范围为0到2^8-1=255,正好是努力值的范围