溢出关卡吧 关注:246贴子:3,564
  • 27回复贴,共1

对某“负一关”揭秘帖的“吐槽”(手动滑稽)

只看楼主收藏回复

一楼惯例百度
(惯例个毛线知道我发帖风格的人都清楚,我从来不把一楼留给百度,不过现在的度娘越来越难以捉摸了,我也是有点认怂


IP属地:浙江1楼2019-08-15 17:18回复
    本次的吐槽对象是隔壁废吧超玛一代吧的新帖,链接我就不贴了,现在度娘基本上看到链接就吞,实在是感觉无解


    IP属地:浙江2楼2019-08-15 17:20
    回复
      关于三处跳关区的设置,要我说的话,制作人员的脑洞应该是这样开的:
      先在同样是地下的1-2和4-2结尾处各放一个跳关区,然后1-2可以跳到2、3、4,4-2可以跳到5、6、7……那8怎么办?(思考)嗯,如果玩家能发现1-2的跳关区“秘密”,那么在4-2同样搞法,轻松跳到5、6、7的话,岂不是给玩家捡大便宜了么?不行!4-2结尾的跳关区只能跳到5,然后另外设置一处“秘密地带”,把6、7、8的跳关区放在那里,让玩家再去找好了
      事实上,如果没有接触过这个游戏,正常来说,这三个跳关区的被发现顺序也应该是:通往2、3、4的跳关区,通往5的跳关区,通往6、7、8的跳关区;至于楼主说的“很多人知道通往2、3、4和6、7、8的跳关区,却不知道通往5的跳关区”,这可能也是事实,不过那只是因为大家看了跳关速通攻略之后,知道了2、3、4和6、7、8这两处跳关区的存在,但攻略里没提到的通往5世界的跳关区,自然就不为人知了


      IP属地:浙江3楼2019-08-15 17:21
      收起回复
        关于1-2为什么会出现4-2结尾跳关区的解释:
        其实这根本不是什么“乱码”,而是因为1-2的结尾有一个敌人,它就叫做“跳关区”它的实际作用是:解除1-2通往地上的水管处的“停止滚屏”的效果——是的,你在游戏中可能会注意到,在1-2通往地上的水管处,如果人物处于跳起状态,屏幕可能会停止滚动一小段时间,直到人物落地之后才会继续滚屏,这说明,这里有一个“停止滚屏”,还有一个解除“停止滚屏”状态的东西;当然,4-2这里也是同样的设计。
        那有人会问了:这不是多此一举么?既然这里不需要停止滚屏,那干吗还要放上一个“停止滚屏”,然后还要放一个东西来解除它的效果?其实,制作人员的初衷并不是这样的,放这两个东西肯定是有用意的,什么用意呢?根据推测,这里本来的设计应该是:如果走到这里没有走天花板,那就停止滚屏,并且不解除它;如果走了天花板,才解除这个停止滚屏。然而,游戏程序员把程序给写错了“跳关区”敌人“解除停止滚屏”的条件变成了:“如果人物的脚底与地面格子线重合,就解除停止滚屏”(实际条件还要复杂一些,我也不保证这个意思就是准确的,不过这个描述还是比较接近游戏的实际表现的),于是,最终结果就变成了不论人物处在哪个高度,只要落地,就把停止滚屏给解除了;换句话说,现在的“跳关区”敌人的表现,就是个bug……
        现在你知道“跳关区”敌人是个bug的存在了,但它bug的地方不仅这一点,“跳关区”敌人同时也造就了“负关”bug!这是因为“跳关区”敌人还有一个作用:加载“通往5世界的跳关区”信息跟前一个作用类似,这里制作人员同样也不是这样的初衷;实际上,后面的跳关区位置还有一个“停止滚屏(跳关区)”,它同时起到了停止滚屏和加载跳关区信息的作用,这么一看,前面的“跳关区”敌人和这里的“跳关区”地形作用是重复的,完全可以去掉其中一个;然而,程序员不知怎么想的,没有把“跳关区”敌人的“跳关信息”功能删干净,而是让它“始终加载5世界跳关区的信息”,于是,在屏幕滚动不到位的情况下,钻跳关水管就会前往36世界,也就是“负关”!


        IP属地:浙江4楼2019-08-15 17:35
        回复


          IP属地:新疆来自iPhone客户端5楼2019-08-15 19:07
          回复
            关于36-1为什么是“循环版7-2”的解释:
            原帖楼主提到了原版SMB中“关卡复用”的事实,但是直接把这个事实当结论了,没有进一步深究;其实,关于这个问题的具体解释,本吧本来是有详细资料的,然而那是2017年以前的老帖子,如今被百度隐藏了……
            这里就简单解释一下吧,SMB中的关卡实质其实就是“空间”,每个关卡都有一个对应的空间编号,比如1-1是25(注意这个数字是十六进制,以下的空间编号都是十六进制数),1-2是40,等,而2-2和7-2的空间编号都是01,36-1的空间编号也是01,所以36-1和7-2自然是一样的了。
            那么36-1的空间编号又为什么是01呢?这就涉及到关卡和空间的对应规则了,简单地说,就是先根据大关号从内存读一个数,然后把这个数加上小关号,得到一个新数,再根据这个数从内存再次读取一个数,最后读取的这个数就是空间编号了。所以,根据36-1读出来的就是01,仅此而已。
            顺便说句,磁碟机版(FDS)的“负关”跟普通NES版的不同,那是因为对应的内存值不同,一个是01,一个是09(对应水下1-3)。
            至于36-1为什么会循环,则是“空间传送”机制的问题,有传送的地图一定要有对应的“空间传送”敌人,而这个敌人控制的传送只会在对应的世界生效,这是因为同一个水管在不同的世界可能需要传送到不同的位置(比如1-1和2-1的地下部分是同一个区域,但是从水管出来要到不同的地方);这个“对应世界”是“空间传送”敌人数据中的一部分,但只有3个二进制位,即只能表示0~7(加1表示对应的世界,即1~8世界),因此超过8世界的“溢出世界”中的空间传送就必定不会生效了,钻水管只能地形循环。


            IP属地:浙江6楼2019-08-15 20:02
            收起回复


              这是“关卡和空间对应关系”的数据图(当然还包括一些别的数据),其中第一张是当年老帖子里出现过的,话说我居然一直把它保留到了现在
              看第二张图,解释一下36-1的空间编号的具体读取过程:首先从内存9CB4开始(第1行第5个数),偏移十六进制值23(36减去1再换算成十六进制),简单说就是向下2行、向右3个数,读取到33;再从内存9CBC开始(第1行的25),偏移十六进制值33,读取到第4行最后的01,这就是36-1的空间编号了。另外,在第2行和第3行也分别可以找到一个01,那是2-2和7-2对应的空间编号,因此,这3个关卡虽然空间编号相同,但却来自不同的内存位置。


              IP属地:浙江7楼2019-08-15 20:18
              回复
                看到红框我为什么突然就冒出一个英文字母 Y 这是应激反应吗


                IP属地:上海来自Android客户端8楼2019-08-17 19:05
                收起回复
                  一点小更新:
                  根据上面对“跳关区”敌人的分析,我尝试着做了一个修复,并且成功了
                  但在做这个的过程中,我发现,原来的程序判断条件并不是什么“人物的脚底与地面格子线重合”,而是一个理解起来很复杂(但实际上代码很简单)的条件……直接上程序吧(话说这段程序一共只有20个字节,比我预想的简单多了):
                  LDA $0723 ;读取“滚屏锁定”标记
                  BEQ #$FA ;如果此标记为0(即还没有停止滚屏),则退出程序
                  ;(FA这个值是向回跳转的,这段程序前面刚好有一个RTS因为这段程序本身是以JMP而非RTS结尾,
                  ;所以就用了别人的RTS,这种代码复用的现象也是很常见的,毕竟每个字节都要省着用)
                  LDA $CE ;读取“Mario纵坐标低字节”(从这句开始的三句代码就是条件判断了,后面详细解释)
                  AND $B5 ;与“Mario纵坐标高字节”进行按位与运算
                  BNE #$F4 ;如果结果(在寄存器A中)不为0,则退出程序(还是跳到前面那个RTS
                  STA $0723 ;将A的值存入“滚屏锁定”标记,由上句可知,如果执行到这里,则A一定是0,即解除停止滚屏状态
                  INC $06D6 ;将“跳关控制”内存值加1
                  JMP $C998 ;跳转到C998,执行“删除敌人”程序,把自己删掉(完成任务了自然就没必要再存在了)
                  这段程序“解除停止滚屏”的判断条件到底是什么呢?这里涉及到了Mario的纵坐标,可以看到用来表示纵坐标的内存共有2个,具体含义分别为:低字节就是Mario在屏幕中的实际纵坐标(以像素为单位),高字节则表示Mario在“哪块屏幕”中,比如玩家可见的区域为“1号屏幕”,即00B5这个内存值为1;如果Mario站在天花板上,则内存00CE的值刚好为0,即这就是“1号屏幕”的最高点,此时再跳起来(哪怕刚跳离地面仍然看得见),那么Mario就进入“0号屏幕”了。所以,我们可以先得出一个结论:表示“Mario在天花板上方”的条件应该是“内存00CE的值为0,或内存00B5的值为0”。
                  现在,再回到上面这段程序,它的条件又是什么呢?是“内存00CE与00B5的值进行按位与运算后的结果为0”……这句话怎么看怎么别扭;事实上,从程序的运行结果我们也可以知道,这个条件跟“两个数有一个是0”肯定不是一回事。这个条件到底如何解释呢?如果纵坐标高字节(00B5)是0,那么没什么问题(0与任何数AND运算的结果都是0),但如果它是1(只要Mario保持在屏幕内,这个数不是0就肯定是1),即换算成二进制只有最末位是1,其余位都是0,那么低字节只要末位不是1(即它是偶数),两个数AND的结果就是0了……这相当于有一半的机会可以使“跳关区”敌人生效,把停止滚屏效果解除,而且这个检测只看位置,不看状态的(即不管是在空中还是落地),我之前说的“落地解除停止滚屏”,还是有点想当然了。


                  IP属地:浙江9楼2019-08-19 19:56
                  收起回复
                    我去隔壁吧摸鱼,1L喂熊直接被删


                    IP属地:黑龙江来自Android客户端10楼2019-09-03 16:03
                    收起回复
                      回复 @愿卿勿忧
                      什么“表256关”“里256关”的?
                      你可以去看看百度百科“溢出关卡”词条(其实就是我在这个吧里发过的帖子,有人好心复制过去了,结果现在贴吧里的原帖没了,那边倒是还有,我是不是该感谢那个编辑百科的),有全部的“里256关”信息(实际上是128关重复两次),都是用“表256关”对应信息表示的
                      可以看到,按地图统计,新地图一共有26个,其中固定地图12个,随机地图5个(4个E-1类+1个1-136),不可运行的黑屏地图9个(4个E-1类+5个非E-1类);在12个固定地图中,有2个是“表256关”没有的(其实随机和黑屏E-1类地图也有不在“表256关”中的,但是提这个事似乎没什么意义)
                      由此,你的“八张原创地图”的结论是哪来的……


                      IP属地:浙江11楼2019-09-30 11:01
                      收起回复
                        关于“跳关区”敌人对跳关信息的设置方式以及跳关机制的一些补充说明:
                        前面一开始,我提到了“跳关区”敌人设置的跳关信息始终是通往36、5、36这一组世界的;后面给出的程序代码中,则可以看到,“跳关区”敌人实际上是将“跳关控制”内存06D6的值增加了1,这样,本来06D6的值是0,代表进纵向水管不跳关,现在变成1,进纵向水管就会跳关至36、5、36世界当中的一个了。
                        ……且慢!“加1”?不是“变成1”?那如果有多个“跳关区”敌人,又会怎样?
                        各位不妨自行一试,我就不试了,而是根据跳关控制的代码脑补出结论():
                        如果有2个“跳关区”,可以跳到第8、7、6世界;
                        如果有3个“跳关区”,可以跳到第0、0、39世界;(这什么鬼
                        如果有4个“跳关区”,可以跳到第4、3、2世界;(……这好像才是第一组跳关信息吧?怎么回事?)
                        如果有5个“跳关区”,可以跳到第36、5、36世界;
                        ……嗯,好像开始循环了?没错,后面的确会这样循环下去,就不继续列出了。另外,以上还只是讨论了只有“跳关区”敌人的情形,如果把“跳关区”地形也加进来,情况会更复杂,这里暂不详述,后面解释了跳关机制之后各位可以自行推断可能发生的状况。
                        总之,先上个结论:“跳关区”敌人的作用并非是“始终加载36、5、36世界的跳关信息”,而是“将跳关信息设置为当前跳关信息的下一组跳关信息”;跳关信息一共有4组,其中3组正常信息,1组溢出信息,顺序上面已经给出。
                        那么,为什么内存06D6的值等于1对应的是第二组跳关信息?“跳关区”地形又是如何设置跳关信息的?下面就来解释跳关机制,以上问题就都可以得到解答了。
                        正常来说,一个完整的跳关流程是这样的:首先由“停止滚屏(跳关区)”地形设置跳关信息,然后进水管时根据设置的跳关信息决定跳到哪一组世界,水管位置则决定了跳到这一组世界的第几个。至于“跳关区”敌人?前面已经说过了,它就是个bug,并不是游戏设计者预期的表现,根本就是个来捣乱的奇葩
                        首先,“跳关区”地形根据一定规则,将内存06D6的值设置为4~6之中的一个数,分别依次对应三组跳关信息,同时在屏幕上将跳关信息显示出来——没错,06D6不仅要在后面用来提供进水管时的跳关信息,而且还要用来确定跳关区屏幕上显示的世界编号;而这个用来显示信息的程序,则是个公用程序,基本上什么文字信息都是由它来显示的(Memory Map原文:handles all except victory messages;顺便扯一句,包括关卡开始界面的生命值信息也是由它的其中一段控制显示的,这段程序我自己也作过修改,使它能正常显示两位生命值),所以,这个程序需要根据调用时A的值来确定显示什么文字,如果A>=4,则显示跳关信息;因此,06D6的值才需要从4开始。
                        由于06D6的正常取值为4~6,因此在实际使用时,不管是屏幕显示跳关信息,还是进水管时用它读取跳关信息,都是先AND #$03,即取出最末两位,然后再使用的,即真正用到的它的取值为0~2;所以,06D6=1就对应了第二组跳关信息。具体来说,06D6的正常取值是0、4、5、6,0表示“不开启跳关”,其余表示“开启跳关”并对应跳关信息;而进水管时,对06D6的判断方式则是“0不跳关,非0则跳关”,这样,当06D6=1时,也就开启了跳关,并且1 AND 3=1,因此它对应了第二组跳关信息。


                        IP属地:浙江12楼2019-10-01 12:29
                        收起回复


                          IP属地:新疆来自iPhone客户端13楼2019-11-02 10:18
                          收起回复


                            IP属地:上海来自Android客户端14楼2019-11-15 17:54
                            收起回复
                              可以加一个Q吗1104216916 我想咨询问题


                              IP属地:四川来自iPhone客户端15楼2019-11-25 09:59
                              回复