热血足球吧 关注:3,141贴子:34,862

自己动手改玩家控制的球员位置

取消只看楼主收藏回复

热血系列的代码框架都很好。足球联盟里,是由统一的接口决定一个球员是受玩家控制还是受AI控制,从整体上说球员的“决策”和“动作”是分离的,所以玩家想控制其他角色很方便。
有两种不同的方式可以达到这个目的,一是运行时改内存(所谓的动态修改),二是改rom(所谓的静态修改)。


IP属地:北京1楼2013-04-21 10:38回复
    先说一下内存中与这个有关的两块地方
    第一块:
    0568--056B 4个字节 依次为1P~4P控制的角色编号
    这个全局的编号与位置的对应关系如图:
    不参与比赛的玩家对应的值为FF
    比如原版中,联赛模式2P的话,这4个字节依次为00 0A FF FF
    对战模式3P是00 01 0A FF,4P是00 01 0A 0B。
    另外换了阵型的话,221的单前锋对应02/03,122的单后卫对应08/09


    IP属地:北京通过百度相册上传4楼2013-04-21 12:18
    收起回复
      第二块相关的内存:
      0650--065B 12个字节 分别为场上12名队员的状态(这里的状态不是实时体力,体力在04F1起的12字节)
      顺序就是按照前面图中的编号的顺序,0650对应的是左队中场,0651是右队中场,065A是左队门将,065B是右队门将。
      每个球员占一个字节,一个字节是8个二进制位,形如0000 0000或1000 0101。
      这8位中的最高位是个标志位,用来表示该球员是否受AI控制,为1则受AI控制,为0则不受AI控制(注意是“不受AI控制”,不等同于“受玩家控制”)。
      8位中,低4位是球员的实时心情,情绪就不在这个帖子里讨论了。还有3位尚未研究,不知道是啥信息。


      IP属地:北京6楼2013-04-21 13:44
      回复
        所以要在游戏运行时更改玩家控制的角色,就要改写上面所说的两块内存。
        例如联赛模式游戏进行中,想改成4P对战那样(1P左队中场、2P右队中场、3P左队门将、4P右队门将),那么0568起的4个字节就要改为:00 01 0A 0B。
        然后,0650起的12个字节中,把0650、0651、065A、065B的最高位都设为0,其余8个字节的最高位都设为1即可。


        IP属地:北京7楼2013-04-21 13:53
        回复
          模拟器带内存编辑功能的话直接改写内存就行了。
          而如果要写成virtuanes那种金手指的话,就是这样:
          1.
          0568-01-00
          0569-01-01
          056A-01-0A
          056B-01-0B
          (这4条可以合并成一条:0568-04-0B0A0100,数据反过来是因为little endian)
          2.
          0650-01-08
          0651-01-08
          065A-01-08
          065B-01-08
          3.
          0652-01-88
          0653-01-88
          0654-01-88
          0655-01-88
          0656-01-88
          0657-01-88
          0658-01-88
          0659-01-88


          IP属地:北京8楼2013-04-21 14:07
          回复
            但是这样用金手指锁定的话有个问题
            球出界时如果被判定为要玩家控制的球员开球,而玩家控制的球员无法去捡球开球,游戏就卡住了。解决办法是把开球人的状态改为AI控制。开球人的编号在04D6。
            例如1P现在控制左队门将(即0A),左队要开门球
            看下内存中04D6的值,会是0A(意思就是应当左队门将去捡球)
            此时就要把
            065A-01-08
            这条金手指改为
            065A-01-88
            这样该门将就会受AI控制了,就会去捡球、开球,等球开出来再把金手指改回去即可。


            IP属地:北京10楼2013-04-21 14:24
            回复
              上面说的是通过控制内存来达到目的
              下面说说改rom来实现这个东西


              IP属地:北京11楼2013-04-21 14:30
              回复
                先了解一下rom中与之相关的两块数据
                第一块: 玩家位置信息
                <00>BDB9--BDC8 (03dc9--03dd8): -->00号bank的BDB9对应nes文件中的03dc9
                00 0A FF FF
                00 01 0A 0B
                00 01 0A 0B
                00 01 0A 0B
                (16个字节分成4组来看)
                第一组:联赛模式中要写到[0568,player_id]的值,写几个要看玩家数(005D)。原理下同。
                第二组:对战模式的(不含点球)。
                第三组:点球模式要用的,不过可能没意义,这部分读写是进赛场前的通用代码,所以没避开,实际上点球模式的[0568,pid]会在后面另做处理。
                第四组:好像没用到。


                IP属地:北京12楼2013-04-21 14:40
                回复
                  第二块数据:发球者
                  <01>BF7E--BF8D (07f8e--07f9d): -->同上,小括号里写的是nes文件中的偏移
                  06 02 08 04
                  02 06 04 08
                  0A 02 0A 04
                  02 0A 04 0A
                  对应的出界位置及开球方:
                  左上边线左队 左上边线右队 左下边线左队 左下边线右队
                  右上边线左队 右上边线右队 右下边线左队 右下边线右队
                  左上底线左队 左上底线右队 左下底线左队 左下底线右队
                  右上底线左队 右上底线右队 右下底线左队 右下底线右队


                  IP属地:北京13楼2013-04-21 14:44
                  回复
                    注意这一块数据中,右队队员的编号被略去了最低位,也就是说比前面图中写的01 03 05 07 09 0B要小1。
                    比如看这段数据中有两个06,代表的并不是同一个角色。
                    第一个06对应的是“左上边线左队”(这里说的“左上”是指玩家看到的画面中的左上),如果左队是212阵型,那么离这段边线最近的球员一般就是06了,就是说如果左队要在这段边线掷界外球,发球人就是06。
                    第二个06对应的是“右上边线右队”,这段数据中右队对应的编号都要加上1才是全局的角色编号,06加1是07,就是说如果右队要在画面右上方那段边线掷界外球,发球人就是07。


                    IP属地:北京14楼2013-04-21 15:11
                    回复
                      shinwa有个改玩家位置的修改器,用起来很方便,不过有些许不足:
                      占用了HomeBank中的空白。如果是已经占用了这段空白的改版rom,就不能用这个修改器了。惊风和空气的汉化版就是这样。这个不是因为扩容,这个汉化版扩的是VROM,不影响HomeBank在文件中的偏移。如果是扩容了PROM的就不行了,地址变了;
                      玩家换到某些位置上时有时做不了动作,只能说话(给AI下命令);
                      开球处理得过于僵硬了,没考虑到门球和角球会开给本队中场球员的设定。
                      我想把这个东西做得更通用,最好是不占用空白,直接在原代码段/数据段上改,这样只要不是动过相关代码的改版就OK,至少得让汉化版的能这么干。


                      IP属地:北京15楼2013-04-21 15:26
                      回复
                        这也还没有定型,有些东西还不明确,先这样公布出来,有兴趣的玩家可以去试试
                        下面一步步说


                        IP属地:北京16楼2013-04-21 15:31
                        回复
                          1.03dc9--03dd0 (8字节: 00 0A FF FF, 00 01 0A 0B)
                          在这里修改联赛和对战模式下的玩家位置信息。
                          这里的信息会在进入赛场前被写到[0568,pid]。


                          IP属地:北京17楼2013-04-21 15:32
                          回复
                            2.
                            17d18--17d1b (4字节: 00 01 0A 0B)
                            也是玩家位置信息,不过用途和上面的不同,该信息用于清掉玩家对应角色的AI控制标志位([0650,rid]最高位)。


                            IP属地:北京18楼2013-04-21 15:33
                            回复
                              3.
                              07f8e--07f9d (16字节: 06 02 08 04, 02 06 04 08, 0A 02 0A 04, 02 0A 04 0A)
                              在这里修改界外球的发球人编号。
                              一定要注意,这里右队的角色编号要减1之后写入


                              IP属地:北京19楼2013-04-21 15:34
                              收起回复