dohnadohna来一起...吧 关注:126,689贴子:325,829

物品修改与插入排序算法

只看楼主收藏回复

插入排序算法动图镇楼。


IP属地:北京1楼2021-04-13 23:56回复
    CT在度娘盘,翻精华就能看到。
    这里只说物品修改部分。
    本来我写CT表格不想做物品修改,因为很麻烦,后来玩着玩着发现自己也需要,就硬啃了,直接汇编手写算法。
    但思路确实很好玩。


    IP属地:北京2楼2021-04-14 00:00
    回复
      数值搜索、寻找指针、汇编知识是阅读下文内容的需求。网上教程很多这里不谈,下文的内容是建立在对这些有了解的基础上的。
      先说基础知识。
      具体细节比如“你是怎么找到的”这类东西就略过了,无非积累和耐心而已,没法说。
      此游戏中的指针,通常是以【dohnadohna.exe+47F8D0】为起始。
      各级偏移量分别是【+8】->【+x*4】->【+y*4】->【+10】->【+z】
      其中z是数据结构的偏移量,死的。例如物品数量的偏移就是+4。
      关于x和y,其实有一个总值i。
      x=(i shr 2) and 1FFF
      y=1 and 3
      对于这个总值i,我称呼它为“内存索引”。
      得到内存索引,就等于得到了一个对象的地址。但这个索引有些会变,有些不会变。
      物品的话就是会变的,处理起来稍微复杂一些,但也没那么麻烦(相对于滚轮切换角色/人才时的记录指针而言)。


      IP属地:北京3楼2021-04-14 00:21
      回复
        作为说明,下文不记录多余的内容,只用【内存索引】来表示一个对象的指针。
        持有的物品有一个总表,它的内存索引是【2FE0】。
        这里再额外说一下吧,所以由此可知这个总表的地址是【dohnadohna.exe+47F8D0】->【+8】->【+BF8*4】->【+0*4】->【+10】。下文也不说了。。。
        看这段内存,显而易见是个索引表:
        (为了防止有人问再说明一下,这个结构浏览器是在内存浏览的页面摁Ctrl+D出现的)

        值得关注的是从0x70开始,这个值变成了一个不知意义的大数,所以可知目前的物品只到6C,而数量是6C/4=1B(27)个。
        这个索引表的每一个值,同样是【内存索引】,它对应着每个物品的地址。


        IP属地:北京4楼2021-04-14 00:31
        回复
          以【42C1】为例,照例获得它的地址,然后看它的数据结构:
          (图1)

          数量就不说了,看偏移量【0】的文本ID,这个也是内存索引。
          通过它获取一个地址:
          (图2)

          这个【EXP+5】就是它的文字ID了,对应的道具名称是【季刊revuEx】。
          如果想要修改物品,就是把一个物品改成另外一个,只要修改【图1】中的文字ID索引,就可以了。


          IP属地:北京5楼2021-04-14 00:39
          回复
            先说个题外话。
            其实不改上文【图1】的【文字ID索引】(截图里我打错了,懒得改领会精神),而是直接改【文字ID】也是可以的。
            具体的做法是直接把【文字ID】改成目标ID。
            然后上文【图2】中的二级偏移量不是10吗,换成14,1级偏移量去掉,这里存的是这个ID的长度(包括结尾的00)

            这里也要改。


            IP属地:北京6楼2021-04-14 00:48
            回复
              我没用这种改法(即改【文字索引】),因为100多个物品得找到什么时候,我最开始是想着弄一个大全表,后来放弃了,觉得没必要。
              不过底子都打好了,所以我依然使用了一开始提到的方法,改【文字索引的内存索引】,即5楼【图1】的部分。
              首先要改这个内存索引,需要找到一个真正的所有内存的总表。
              这个总表的【内存索引】是【1E97】,在有效范围内,它的每一个地址对应的实际地址都是物品的文字ID。

              有了这个全表,写程序可以很简单地把所有物品ID列举出来。
              把5楼【图1】中偏移为0的那个【42C2】换成这里的其他值,就实现了替换物品的目的。


              IP属地:北京7楼2021-04-14 00:57
              回复
                无论用哪种方法都可以修改成功。
                但会遇到显示BUG,就是打开物品浏览就发现,替换后的物品数量显示为0(但不影响正常使用)。
                这时候精髓的部分就出现了,我就是因为这部分才想水这一贴的。
                游戏会对物品的顺序按照文字ID进行排序。
                具体的规则详见巨硬的文档:https://docs.microsoft.com/en-us/windows/win32/intl/handling-sorting-in-your-applications
                可以用Win自带的lstrcmpA函数解决。
                想要避免这种显示BUG,我们需要手动排序。


                IP属地:北京8楼2021-04-14 01:03
                回复
                  这篇文章有对各种排序算法的详细介绍:
                  https://www.cnblogs.com/onepixel/articles/7674659.html
                  因为我是汇编手写的,所以最好有O(1)的空间复杂度,不要有复杂的数据结构,代码也要相对简单和好理解,效率不求快但一定要稳定。不要递归,因为要防止爆栈。
                  经过比较,我最终选择了插入排序。


                  IP属地:北京9楼2021-04-14 01:14
                  回复
                    插入排序的详细介绍见上文。
                    它的核心思想是,把前面的部分视作排序好的。
                    这太适合这个场景了。
                    当更改某物品B的文字ID内存索引后,这个物品地址无论是前面的物品,和后面的物品,都是排序好的。
                    做个小小的魔改,无需遍历所有的物品,只要对比这个物品前面的物品A的ID和后面物品C的ID就可以了。
                    如果B的ID比C的大,直接逆向做插入排序过程。
                    如果B的ID比A小,则正向做插入排序过程。
                    两种都不符合说明不用排序。
                    插入排序适用于插入游戏,不知是否是天意。
                    全文完


                    IP属地:北京10楼2021-04-14 01:24
                    回复
                      我还以为你是在搞科研呢,结果费这么大劲是修改游戏作弊啊
                      这游戏战斗简单得一批我真不知道有啥好作弊的


                      11楼2021-04-14 01:25
                      收起回复
                        强啊


                        IP属地:四川12楼2021-04-14 01:40
                        回复
                          睡前分享篇以前读过的文章。
                          《比喻即介入》 by 吴亮
                            我愈来愈喜欢用比喻的方式去写作,它既可以避免直接的冒犯,又能够使那些足够聪明的人明白我真正想说的是什么。
                            “胃口”也是个比喻。近来我比喻惯了,干脆在这儿过把比喻瘾。
                            就从胃口开始。
                            假如我某一天胃口好,正津津有味地进餐时,请不要在此时向我卖弄营养学的真理;假如我某一天在拍卖行欣赏珠宝,请不要用不屑的表情对我大谈贵族的不劳而获;假如我某一天中了彩票,请不要代我向下岗职工表示歉意;假如我某一天喝了不少威士忌兴高采烈,你不要自作聪明地以为我从此不喝绍兴加饭;假如我某一天批评说现在读不到美文,你不要把原因推到电视肥皂剧过度泛滥上去。
                            比喻还可以换一下人称,让我试一试。
                            假如你喜欢滑稽戏,你没有必要愧对交响乐;假如你崇敬的人突然远走他乡,你没有必要自作多情地断言他一定洒脱地离去;假如你的朋友死了,你没有必要抱怨为什么那么多的人还活着;假如你认为玛丽莲·梦露是世纪美人,你没有必要因此不讨老婆;假如你惊呼咖啡入口是西方文明的入侵,你没有必要一边喝茶一边沾沾自喜地说,中国的茶叶几百年前也曾入侵到英国与荷兰;假如你觉得精神空虚需要信仰,那就去教堂,你没有必要仇视世俗的喧哗;假如你需要物质的满足名利的获取,你没有必要再唱高调减轻你的负疚感……
                            聪明人都知道我在说些什么,所以,比喻就是介入。


                          IP属地:北京13楼2021-04-14 01:56
                          收起回复
                            差点以为这是排序算法教学


                            IP属地:广东来自Android客户端14楼2021-04-14 09:11
                            回复
                              大佬来了,围观


                              IP属地:福建来自Android客户端15楼2021-04-14 12:24
                              收起回复