pkhex吧 关注:36,891贴子:108,356

开帖科普下Gen3相关的游戏机制

取消只看楼主收藏回复

缓更,谢米镇楼


IP属地:四川来自iPhone客户端1楼2022-09-01 18:47回复
    由于国内游戏机制这块愿意分享的人几乎没有(其实懂得人应该不少,但是不知道为什么愿意分享的人基本没有),我玩宝可梦时间也不短了,但是也是最近几周才接触到pkhex。
    绝大部分人刚开始接触这些东西肯定是啥都不懂的,我也一样,所以我开始在国内互联网上找相关资料,从最基础的怎么合法,到深层的这些数值是如何生成的。
    我就是在找这些教程的时候发现的这个吧,但是无论是这个吧还是其他网站,都没有详细的教学,好多谜语人,都是那种我都懂,但是我就不告诉你。
    于是在国内找寻无果,我便去外网找相关教学,不得不说外网除了语言问题,教学是特别全的,于是我便苦学了2周,把我了解到的,分享给各位。


    IP属地:四川来自iPhone客户端2楼2022-09-01 18:47
    收起回复
      2026-04-24 08:20:15
      广告
      不感兴趣
      开通SVIP免广告
      算是作为一个抛砖引玉吧,希望各位能分享出自己的经验


      IP属地:四川来自iPhone客户端3楼2022-09-01 18:49
      回复
        首先免责申明,我也是几周前才开始学习的,所以有错误请大家指正出来,大家一起交流,那么下面开始。


        IP属地:四川来自iPhone客户端4楼2022-09-01 18:49
        回复
          开始的开始我先说一点较为重要的就是,很多法师都是通过RNGreporter这个软件来计算gen3的野生宝可梦的pid的,但是这样算出来的pid理论上是合法的(注意是理论),但是你在实际游戏过程中是不可能遇到的,因为gen3的遇敌是和帧绑定在一起的。
          什么意思?很简单。
          举个例子。比如你想要个闪光的大嘴娃,好,你上RNGreporter输入了你的tid和sid,然后输入了seed,勾上了shiny only,你一点搜索,发现,哇好多闪帧啊,然后你看上了第20000帧,觉得这个个体不错,然后写进了pkhex,pkhex也闪了,也提示合法。
          事实上这个宝可梦是不合法的,因为在第20000帧,你在游戏里绝对不可能遇得到大嘴娃,你在第20000帧只能遇到蛇纹熊。所以这个宝可梦在实际上是不存在的,但是仅从pid和你训练家的tid和sid这但一方面来考虑,确实是合法闪光的。
          所以gen3能遇到的宝可梦其实在你创建好角色的那一瞬间就决定好了的。ok,下面正式开始。


          IP属地:四川来自iPhone客户端5楼2022-09-01 18:51
          收起回复
            真单机贴吧了


            IP属地:四川来自iPhone客户端6楼2022-09-01 18:58
            收起回复
              回家接着码


              IP属地:四川来自iPhone客户端8楼2022-09-01 19:13
              回复
                众所周知在宝可梦游戏里有个叫做pid的数据,他是一串32位2进制数(8位16进制数),在Gen3里宝可梦的性别、特性、性格都可以仅从pid中获取。所以了解pid在游戏里如何生成是至关重要的。


                IP属地:四川10楼2022-09-01 19:43
                回复
                  2026-04-24 08:14:15
                  广告
                  不感兴趣
                  开通SVIP免广告
                  在了解pid如何生成之前,我必须给一些不了解相关计算机知识的人简单科普下。
                  下面数字以b结尾表示是个2进制数,以h结尾表示是个16进制数,结尾什么都不加则为10进制。
                  在2进制中表示0-2:0b、1b、10b
                  在10进制中表示0-10:0、1、2、3、4、5、6、7、8、9、10
                  在16进制中表示0-16:0h、1h、2h、3h、4h、5h、6h、7h、8h、9h、Ah、Bh、Ch、Dh、Eh、Fh、10h
                  在内存中,数据是以二进制存放的,比如:1001011100001111b,但是二进制可读性很差,所以为了提高可读性在绝大部分软件里我们都用16进制表示内存的数据。
                  比如上面的1111 0111 0000 1111b转换成16进制为F70Fh,这两个数是完全相等的。(从第一位开始,每4位2进制数可以转换成1位16进制数,具体如何换算百度一搜一大堆,或者直接百度在线进制转换)


                  IP属地:四川11楼2022-09-01 19:46
                  收起回复
                    了解了数制,我们回到正题。所以什么是pid捏?
                    每当在游戏中遇到宝可梦时,系统做的第一件事就是生成一个我们称之为PID(宝可梦识别码)的32位2进制数也就是8位16进制数(4位2进制可以构成1位16进制,32/4=8),这串数字也叫宝可梦的个性值。
                    如上面所说,有关宝可梦的许多信息都可以仅从PID找到,如:性格、特性、性别。


                    IP属地:四川12楼2022-09-01 19:49
                    收起回复
                      那么pid这么重要,那它是怎么生成的呢?
                      简单来说pid是随机生成的,但是众所周知在电子计算机上是不可能生成真正意义上的随机数,都是由特定算法生成的伪随机。事实上有许多随机数生成的方法,宝可梦采用的是较为简单的线性同余随机数生成器。
                      下面我们把随机数生成器简称为RNG。
                      虽然该方法实现起来非常简单,但如果把rng生成的随机数彼此相邻列出,除非我们应用公式,否则我们不可能知道下一个伪随机数是什么。
                      从红蓝宝石开始的所有正作宝可梦游戏中使用的随机数生成器(RNG)的工作原理如下:
                      当游戏加载时,程序会为一个32位的2进制(8位16进制)的变量分配一个数字,这个变量就是我们常说的seed。而生成seed的这个算法会根据游戏的不同而不同,但是在红蓝绿宝石里,这个seed的初始值固定为0(所以3代乱数很简单)。
                      然后,每当调用rng时,都会执行下面的步骤:
                      1)新的seed等于(老seed × 41C64E6Dh + 6073h)的2进制形式的后32位。(第一次调用时老seed固定为0)
                      2)获取新seed的前16位2进制数作为本次调用rng的随机数。(这个新seed会作为下一次调用rng的老seed)


                      IP属地:四川13楼2022-09-01 19:56
                      收起回复
                        那么程序是如何通过RNG获得宝可梦的PID的捏?
                        很简单,游戏调用2次rng即可创建一个PID。由于每次调用rng都会产生一个16位2进制数字(4位16进制数字),所以只要把这两个16位2进制数字(4位16进制数字)合在一起就会变成一个32位2进制数字(8位16进制数字),这个数字就是宝可梦的PID。
                        第二个随机数是PID的前16位,第一个随机数是PID的后16位。
                        例如,生成的两个随机数分别为1A1Ah和A1A1h,那么宝可梦的PID则是A1A11A1Ah。(当然这里第一个随机数是1A1A,第二个随机数是不正确的,我只是举个列子)


                        IP属地:四川16楼2022-09-01 20:19
                        回复
                          上面提到的宝可梦的性别、特性、性格都可以仅从PID中获取,那么既然我们了解了PID是如何通过RNG创建的,下面我们就深入了解一下PID是如何决定宝可梦的性别、特性、性格的。


                          IP属地:四川17楼2022-09-01 20:19
                          收起回复
                            通过PID找到宝可梦的性格:
                            1)把生成的PID转换成10进制,记住最后两位数我们称为j。
                            2)如果j>24,把j减去25。
                            3)重复第二步直到j<=24。
                            4)此时j的值为宝可梦的性格。
                            0 = 勤奋
                            1 = 怕寂寞
                            2 = 勇敢
                            3 = 固执
                            4 = 顽皮
                            5 = 大胆
                            6 = 坦率
                            7 = 悠闲
                            8 = 淘气
                            9 = 乐天
                            10 = 胆小
                            11 = 急躁
                            12 = 认真
                            13 = 爽朗
                            14 = 天真
                            15 = 内敛
                            16 = 慢吞吞
                            17 = 冷静
                            18 = 害羞
                            19 = 马虎
                            20 = 温和
                            21 = 温顺
                            22 = 自大
                            23 = 慎重
                            24 = 浮躁


                            IP属地:四川19楼2022-09-01 22:57
                            收起回复
                              2026-04-24 08:08:15
                              广告
                              不感兴趣
                              开通SVIP免广告
                              通过PID找到宝可梦的性别:
                              首先这条仅适用于有雄性和雌性的宝可梦。如果宝可梦是无性别的或只有雌性或雄性的,那么宝可梦当然为该性别。
                              1)把生成的PID转换成16进制,记住最后两位数我们称为j。
                              2)把j转换成10进制。(此时j的范围应该在0至255)
                              3)根据性别类别与j的关系判断性别。
                              众所周知宝可梦里有4种性别类别:
                              ①雄性 87.5%|雌性 12.5%
                              如果0<=j<=30,则为雌性,反之为雄性
                              ②雄性 75%|雌性 25%
                              如果0<=j<=63,则为雌性,反之为雄性
                              ③雄性 50%|雌性 50%
                              如果0<=j<=126,则为雌性,反之为雄性
                              ④雄性 25%|雌性 75%
                              如果0<=j<=190,则为雌性,反之为雄性


                              IP属地:四川20楼2022-09-01 23:16
                              回复