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

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

只看楼主收藏回复

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


IP属地:北京1楼2013-04-21 10:38回复
    向楼主学习


    2楼2013-04-21 11:58
    收起回复
      恩。不知道足球的改法是否使用于篮球的修改。


      IP属地:德国3楼2013-04-21 12:04
      回复
        先说一下内存中与这个有关的两块地方
        第一块:
        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
        收起回复
          前排支持!


          IP属地:广东来自手机贴吧5楼2013-04-21 12:24
          回复
            第二块相关的内存:
            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
                              回复