口袋妖怪火红与叶绿吧 关注:583贴子:2,992
  • 7回复贴,共1

初级-替换精灵图片,额外增加25个精灵!

只看楼主收藏回复

早期自己研究写过一篇关于411精灵的教程,这里算是再次收录吧。
绿宝石正统精灵总数是386只,而用修改器“PokemonMemHack”,修改精灵种类时,修改器中精灵列表“雪拉比”和“木守宫”之间存在着25个“?”未知精灵。

  修改成某个“未知”,游戏中发现精灵真的成了完全“?”号的精灵。查看它的状态,图鉴编号也是很整齐的387~411其中一个。

  其实这25个问号也是独立的精灵数据。所以所谓的“增加新精灵”其实只不过是把本来没用到的精灵用上而已!
  题外话,比较合理的猜测是原先这25个精灵和图鉴中的未知图腾精灵作为26个字母形态的26种未知图腾,可能是后来增加了“?”,“!”两种形态,制作组采用了新的方法。于是其余25组就被遗弃了。
  这里用“unLZ.GBA”在“雪拉比”之后分别能找到“未知精灵”正反面图,和其他找精灵一样,但并非25组,而是仅仅只有一组。
  而当我们更改了这些图后,在游戏中发现25个也同时改变。也就是说,25个“未知”共用一组正反面图。之前教程中理解了指针的概念,这里就比较明朗点。
  我们要做的就是把本来指向同一个位置的指针,改成分别指向指定位置的指针!新的图片数据必须找寻新的空位来分别写入ROM。
点击展开,查看完整图片
  如图:
611号位置找到正面2帧图地址:0xB60544;
1542号位置找到普通色调色板地址:0xCDD498;
1543号位置找到战斗背面图地址:0xCDD4AC;
1543号位置找到闪光色调色板地址:0xCDD630。
  以上4项数据都是25个精灵共用的,换句话说就是每项数据都有25个指针。找到这些指针并不难,之前指针相关教程中也讲过。


IP属地:上海1楼2015-08-08 17:51回复
    打开“WinHex”,分别搜索4段数据的指针
    指针的模式是将被指向数据的地址加上OxO8OOOOOO再反写,以下是搜索到的指针位置。
      正面2帧图地址:0xB60544,
      其指针:4405B608。


    IP属地:上海2楼2015-08-08 17:53
    回复

        战斗背面图地址:0xCDD4AC,
        其指针:ACD4CD08。

        闪光铯调铯板地址:0xCDD630,
        其指针:30D6CD08。

        如果是绿宝石英文版ROM,这些空位精灵各项数据的指针位置可以直接参照,不必每次都去搜索。从以上图片中也能看到这些指针所在的地址:
       第一个“未知精灵”正面2帧图的指针地址:0x30A96C;
       第一个“未知精灵”普通铯调铯板的指针地址:0x303E58;
       第一个“未知精灵”战斗背面图的指针地址:0x303098;
       第一个“未知精灵”闪光铯调铯板的指针地址:0x304C18。


      IP属地:上海3楼2015-08-08 17:53
      回复


        IP属地:上海4楼2015-08-08 17:54
        回复
          接下来就是准备好素材并写入ROM,因为写入的空位地址,暂时不确定,所以顺序是先写入,再改对应的指针。我以导入NO.387和NO.388未知精灵为例,分别替换佐罗亚和佐罗亚克的图片。
            按照我的惯例,新的数据使用扩容的部分。用“FSF”搜索空位。
            打开“FSF”,载入ROM,“空白位置大小”填00,“所需大小”稍大一点,我这里填5000,“隐藏间隔”填写16,并选择“从给定地址开始搜索”,填上1000000,如图,搜索到的空位为“106EB28”。扩容后的地址是从0x1000000,并填充为“00”。

            首先导入佐罗亚的正面图,打开“unLZ.GBA”。因为重定向指针我们之后手动操作,所以在“unLZ.GBA”中任意位置写入指定空位地址就好。
            载入正面图片,写入ROM,对话框选项
          勾选“Export Image”和“Auto abort if new data is bigger”;
          不勾选“Export Palette”和“Automatically fix pointers”。
          “Image Offset:”这里不要直接填上搜索到的空位可能会有BUG,保险点就是填上一个比搜索到的地址稍大一点的地址,并且以0结尾,我这边就用“106EB30”

            题外话:试验了几次发现几次直接写地址会出现BUG,游戏中读取不了。如果你够细心会发现原版中那些图片和调色板写入的数据地址,都是以“0,4,8,C”结尾的。虽不知道其缘由,但最好自己用的空位地址也遵循这个规则。
            写入的地址转成指针形式 0x08000000 + 0x106EB30 = 0x0906EB30,
          指针就是【30EB0609】
            接下来导入第2只精灵佐罗亚克的正面图,还是先搜索空位,因为上面写入了新数据,所以新的空位往后推了,我这边搜索到的是“106F01B”。
            回到“unLZ.GBA”,在任意位置载入佐罗亚克的正面图片,对话框的选项依旧
          勾选“Export Image”和“Auto abort if new data is bigger”;
          不勾选“Export Palette”和“Automatically fix pointers”。
          “Image Offset:”填上比之前搜索的空位稍大一点且以0结尾的地址,我这边就用“106F020”。

            写入的地址转成指针形式 0x08000000 + 0x106F020 = 0x0906F020,
          指针就是【20F00609】
            至此也先别急着写调色板,正面图写好了就赶紧把指针手动改掉,也算是分离出来。


          IP属地:上海5楼2015-08-08 17:55
          回复
            打开“WinHex”,转到之前找到的第一个“未知精灵”正面2帧图的指针地址:0x30A96C;或者直接搜索指针也能跳转到。


            IP属地:上海6楼2015-08-08 17:55
            回复
              将原来的第1个和第2个指针手动改成以上写入的新图片的指针,【30EB0609】和【20F00609】,然后保存,如图。


              IP属地:上海7楼2015-08-08 17:56
              回复
                普通色调色板的导入也是一样,不过我还是简单演示一下,搜索空位我这边是“106F660”
                  载入佐罗亚带普通色图,写入ROM,对话框选项
                勾选“Export Palette”和“Auto abort if new data is bigger”;
                不勾选“Export Image”和“Automatically fix pointers”。
                “Export Palette”:填上比之前搜索的空位稍大一点且以0结尾的地址,我这边就用“106F670”。

                  写入的地址转成指针形式 0x08000000 + 0x106F670 = 0x0906F670,指针就是【70F60609】
                  然后佐罗亚克的普通色调色板导入,搜索空位,我这边是“106F698”。
                  回到“unLZ.GBA”,在任意位置载入佐罗亚克普通色图,对话框的选项依旧
                勾选“Export Palette”和“Auto abort if new data is bigger”;
                不勾选“Export Image”和“Automatically fix pointers”。
                “Export Palette”:填上比之前搜索的空位稍大一点且以0结尾的地址,我这边就用“106F6A0”。

                  写入的地址转成指针形式 0x08000000 + 0x106F6A0 = 0x0906F6A0,指针就是【A0F60609】
                  现在就是手动更改普通色调色板的指针。
                  打开“WinHex”,转到之前找到的第一个“未知精灵”普通色调色板的指针地址:0x303E58;或者直接搜索指针也能跳转到。
                将原来的第1个和第2个指针手动改成以上写入的新图片的指针,【70F60609】和【A0F60609】,然后保存,如图。


                IP属地:上海8楼2015-08-08 17:56
                回复