| 
 | 
 
大约半年前出于一些莫名的理由写了个帖子把主角房间饰品的获得方式都列举了出来:《精灵宝可梦 金/银/水晶》主角房间饰品大全 
文中提到我有在刷VC版的金/银/水晶的神秘礼物,然而大半年过去了,还是每个记录各有一点点欠缺,所以我就打算走一下“黑魔法”手段,干脆把所有饰品都搞全了得了(另一方面是收集强迫症使得我想把VC版搞不到的都获得),于是把研究结果贴出来。(不过本文可能需要一点计算机知识才能看懂- -|||) 
 
金银水晶的饰品一共有45个,在内存中用1个位(bit)来表示是否获得,通常我们猜想这些位是连续的,也就是用45个连续的1或0来表示。 
通过上文链接中的列表(已按游戏里的顺序排列,事实上也是数据的顺序),我们发现先是4个床,然后4个地毯,3个植物,4个海报,4个游戏机,21个布偶,2个奖杯,3个大型布偶。 
结论稍微有点偏差,布偶和奖杯中间插了一个其他作用的位,所以实际用了跨度46位来存储这些饰品的获得。 
 
我们可能搜到过全饰品的金手指,但用了会有bug,一些剧情的做完状态会发生改变,原因很简单,46除以8,余数不是0,那么那串金手指的头尾两个字节你笼统的赋值为FF或00,肯定影响到了饰品以外的其他内容,但是金手指是按字节赋值,又不是按位,所以我们是必须精确明白到所需要的是该字节中的哪几个位才能正确使用那些金手指的。而且46位中混入了一位是其他含义的,并不连续,那么除开头尾字节,中间的也不可盲目赋值。 
 
我在以前写过的文章里也说过类似的知识点,再次引用一下: 
英文水晶版 
无限抓卡比兽:010060DB 
 
比如这个无限抓卡比兽,卡比兽是否抓掉了,结果就2种,是或者不是,所以只要用0或1一个位的存储空间就行了,但是这个00,是一个字节,等于说你赋值了00000000,足有8个0,另外7个位也被覆盖了0,这就会引起bug 
 
重现地鼠洞前的卡比兽:01XX60DB 
XX值怎么确定?打开VBA模拟器,工具—内存查看器,地址栏输入DB60,点击转到 
比如查到的数值是0x33,二进制是 
00110011 
最右边一位就是控制的地方,得置0,于是变成了 
00110010 
这就是0x32,于是XX为32 
 
所以说,在金手指笼统的赋值为00的情况下可千万不要保存,以此为例,正确使用方法是开抓前看一下该地址的数值,观察捕捉完成后的变化,赋值开抓前的数值而不是00,这样才不会影响到该字节中其他位的意义。  
 
继续上结论,金银和水晶的饰品获得状态存储用的位构造一样,只是起始地址不同,以金银日文版为例,0xD7FE的后4位开始,直到0xD804的头两位 
即: 
|    0xD7FE    |    4位其他作用 | 床1~4    |  |    0xD7FF    |    地毯1~4 | 植物1~3 | 海报1    |  |    0xD800    |    海报2~4 | 游戏机1~4 | 布偶1    |  |    0xD801    |    布偶2~ 9    |  |    0xD802    |    布偶10~17    |  |    0xD803    |    布偶18~21 | 1位其他作用 | 奖杯1、2 | 大型布偶1    |  |    0xD804    |    大型布偶2、3 | 6位其他作用    |  
  
 
但是你拿实际情况去对比下内存里的值会发现并不相同,细心点展开二进制会发现是反的,那是因为高低位与先进后出的缘故,比如0xD7FF,我用图来表示下“地毯1~4 | 植物1~3 | 海报1”: 
                
 
如果我现在获得了黄色的地毯和城镇地图,内存里的值是0010 0001 = 0x21吗? 
并不是啊,你得反着来,事实上内存里各个位是这么排的: 
                
 
所以啊,在获得了黄色的地毯和城镇地图的情况下,内存里的值是1000 0100 = 0x84 
 
这么讲我想我应该是把结构讲清楚了,顺手挖掘了下床1~4之前的4个位的含义,是记录阿露福遗迹中的四个拼图是否完成的。 
接下来上本帖重点,日文版最终的数据表: 
 
 
最后我们再来学习一下金手指的写法吧~ 
 
比如水晶日文版中,我想获得未知图腾布偶,查得内存地址是0xDABE, 
将值转换成二进制,发现中间的“ 1位其他作用”是1,其他几位的东西我已经有了大的卡比兽和腕力布偶, 
那么我要修改的值为1001 0101 = 0x95 
金手指的写法为: 
0195BEDA 
其中01没有意义的,后面几位应该懂了吧,内存地址记得是反写。 
当然这格式是模拟器用的,如果你还有20年前的硬件金手指和GB的话,写法是: 
0DABE95 
第一个0没有意义,接下来不要反写了。 
 
再以水晶日文版为例,内存地址0xDAB9中,我想要获得皮卡丘的床并且完成凤王拼图, 
原本已有温馨的床、粉红色的床,四张拼图中我已完成了菊石兽拼图, 
那么我要修改的值为1011 0101 = 0xB5 
金手指的写法为: 
01B5B9DA 
 
如果搞明白的话我再送些数据给大家: 
|    事件名称    |    内存地址示例(金银日文版)    |    内存地址示例(水晶日文版)    |  |    地鼠洞前的卡比兽重现    |    D898:33 → 32    |    DB53:33 → 32    |  |    愤怒之湖的异色暴鲤龙重现    |    D894:DB → D9    |    DB4F:EF → ED    |  |    36号道路的树才怪重现    |    D889:5D → 5C    |    DB44:5D → 5C    |  
  
(异色暴鲤龙和树才怪重现会出现有趣现象233333 
 
======================================================== 
最后我单独讲一下英文水晶版,因为有PkHex的支持,所以不用控制内存那么麻烦啦,改记录文件就是,以下是Flag编号,想拥有就打钩: 
 
676 = Feathery Bed 
677 = Pink Bed 
678 = Polka Dot Bed 
679 = Pikachu Bed 
680 = Red Carpet 
681 = Blue Carpet 
682 = Yellow Carpet 
683 = Green Carpet 
684 = MagnaPlant 
685 = TropicPlant 
686 = JumboPlant 
687 = Town Map 
688 = Pikachu Poster 
689 = Clefairy Poster 
690 = Jigglypuff Poster 
691 = NES 
692 = Super NES 
693 = Nintendo64 
694 = Virtual Boy 
695 = Pikachu Doll 
696 = Surf Pikachu Doll 
697 = Clefairy Doll 
698 = Jigglypuff Doll 
699 = Bulbasaur Doll 
700 = Charmander Doll 
701 = Squirtle Doll 
702 = Poliwag Doll 
703 = Diglett Doll 
704 = Staryu Doll 
705 = Magikarp Doll 
706 = Oddish Doll 
707 = Gengar Doll 
708 = Shellder Doll 
709 = Grimer Doll 
710 = Voltorb Doll 
711 = Weedle Doll 
712 = Unown Doll 
713 = Geodue Doll 
714 = Machop Doll 
715 = Tentacool Doll 
(注意,和内存中当然是一样的,716号并不是哦) 
717 = Gold Trophy 
718 = Silver Trophy 
719 = Big Snorlax Doll 
720 = Big Onix Doll 
721 = Big Lapras Doll 
 
再附赠下重现卡比兽: 
UnSet:1904, |   
 
 
 
 |