凯恩酒馆吧 关注:945贴子:5,571

RR伪随机数的相关代码研究

只看楼主收藏回复

作者:GF-5
来源:IMPK


IP属地:辽宁1楼2020-09-10 18:54回复
    #################8月28日更新##########################
    最近上班太累了,游戏时间一点都没的,都是回来带娃的时候打开ida阅读d2 的源码。
    我发现个问题,marsgod当年对伪随机的研究仅停留在了LGC上就戛然而止了,对整体的流程而言没有再进一步。
    在此我以D2程序设计的角度把整个过程解读一遍:
    首先是6FC21040这段代码,实际上起了以下几个作用:
    1. 函数的输入为a1、a2
    2. 对a1乘seed+a2,赋值给tmp
    3. 更细a2
    4. 对temp除留取余,res = tmp % a1
    5. 返回res,并更新a2。
    既然是除留取余,并且是敲石头的代码,那么我自然想到了将a1 取11,然后展开搜索。
    最后被我猜中,整个d2 的代码里面虽然 1040这个函数被执行了很多次(这是一个经典的用两个int变量更新出随机值的方法),但是只有一个a1=11的函数
    并且在这个函数中,连续调用了3次另一个函数并对结果 %7,应该分别对应宝石/无暇宝石/完美宝石
    最终很有意思,虽然1040执行完的结果是一个%11的数字,但是并未按照其他人的说法是直接+15处理的,而是在内存中给了另一个地址a1[46]赋值给了这个数字,注意还有很重要的一点,在roll完宝石的3次函数中,与这次结果,都将最终随机出来的数字保存到了a1[46]中。
    在赋值完a[46]后,程序又调用了一个公共方法,将a1[46]与其他几个变量传入进去,从写程序的角度来讲,暴雪的程序员将物品的掉落封装成了一个通用的方法,向其中传入物品类型、物品的id、甚至物品属性等等,物品id应该就是在a1[46]中存放。
    目前代码没有阅读完,理解也相对片面,但是就我目前看到的情况来讲,D2的伪随机算法基本上所有seed都用到了1791398085,因为这个seed对于基本2-100的所有余数都很难出现高度重复的片段,就能保证在一段时间周期内,肯定不会遇见完全相同的几个连续的片段,举个例子,如果这段时间你砸出的石头 是 16 16 19 18 20 22, 那么你在很长的时间内都不会再遇见这6个数连续了,并且连续的数越长,你遇见的概率就越小,这就跟股票打新一样,4位数中签概率大,越往下概率越小。
    相关的源码我在近期阅读完整后会贴上。相关的源码我在近期阅读完整后会贴上。


    IP属地:辽宁4楼2020-09-10 18:57
    收起回复
      风大nb 另外问下风大黄装的变量显示补丁显示的条件是什么,是不是第一个是要有有用属性,第二个是有用属性超过一定阈值?满足这两个条件才会在未辨识的时候显露出来吗?
      还有个就是蓝装是不是也是一样的,只要打了补丁,只要有价值就会在未辨识的时候显示出来?


      IP属地:浙江来自iPhone客户端5楼2020-09-10 19:19
      收起回复
        源码在哪能看到?


        IP属地:辽宁来自Android客户端6楼2020-09-10 23:48
        收起回复
          你们程序猿是真的🐮


          IP属地:广东来自Android客户端7楼2020-09-11 08:19
          回复
            程序员真牛逼


            IP属地:四川来自iPhone客户端8楼2020-09-11 22:21
            回复
              官方都说源码丢了,原来在你们手里


              IP属地:四川来自iPhone客户端9楼2020-09-11 22:22
              收起回复
                暗黑还能这么玩


                IP属地:上海来自Android客户端10楼2020-09-12 10:48
                回复
                  求1.14双开,大神在那里!


                  IP属地:湖北来自Android客户端11楼2020-09-17 04:59
                  回复
                    看了源代码,RR有啥技巧吗,能尽量出大号的


                    IP属地:北京12楼2020-09-19 07:19
                    回复
                      大神您好,请问5开以上就会crash卡角色的问题!请问有什么解决方法?是在服务器端还是游戏客户端上??


                      IP属地:上海来自iPhone客户端13楼2020-10-28 12:43
                      回复
                        想修改分辨率 怎么编辑dll 求分享[face17]


                        IP属地:北京14楼2020-12-13 00:25
                        回复
                          你好大佬,用了你那个地图后发现是这十几年用过功能最全的,之前用了一个也挺好的功能自动捡物,能不能把这个功能融合进你那个地图里,1.13的,
                          // 自动捡物
                          // 1表示捡到身上,2表示捡到方块里,3表示跳过该物品(不优先进魔法口袋)
                          Auto Pick Item Toggle: 1,VK_Y// 开启捡取方式开关(1背包|2赫拉迪克方块)
                          // 捡物物品设置
                          Import Item[2217-2259,2402,2742,2743]: 1// 结晶、棱镜、魔方、法珠、符石
                          Import Item[2280-2284]: 1// 碎片、暗黑破坏神的灵魂石
                          Import Item[2365-2392,2398-2400]: 1// 宝箱
                          Import Item[2143-2145]: 1// 6BOSS任务掉落的器官
                          Import Item[HGem]: 1// 无暇、完美宝石+骷髅
                          Import Item[2122-2135]: 1// 20+符文
                          这是cfg里的代码,非常好用,可以自定义捡什么东西,我自己寻思加入dll代码可惜太小白了,好久没搞好,能不能劳烦大佬下了🤓🤓🤓


                          IP属地:山东来自Android客户端15楼2021-01-13 08:58
                          回复
                            你好楼主,我想请问1.13版本中,DTD+DTU对龙爪踢腿刺客有效果吗?


                            来自iPhone客户端16楼2021-01-26 09:31
                            回复
                              请教一下风版主animdata.d2里面怎么找fhr和fcr档位啊


                              IP属地:四川来自Android客户端17楼2021-02-04 06:38
                              收起回复