在游戏商店里是可以偷东西的,一旦成功偷到东西出商店,一些NPC会叫你小偷。网络上说你的游戏名会变成Thief,但实际上并不会变,只是NPC称呼你为小偷。
我只是好奇试了一下,然后回到商店被老板电死后不小心保存了,然后玛林就一直叫我小偷了,难受。

找方法修复,在中文圈找不到,在外文圈只找到一堆讥讽的贴子并说直至删档重开都无法摆脱。我就纳闷了,这应该是在存档里有状态位标记,为什么就没人给出方案。搜索存档修改器,找到的也没有此项修改。既然没有,那就只能自己动手丰衣足食了。
以下内容有点技术性与枯燥。
首先,梦见岛DX (Links Awakening DX) 是有开源反汇编项目的,项目在此。其次梦见岛DX有个开源的 save editor, 项目在此。
在项目里搜索Thief,很容易找到一个变量 wIsThief 在 wram.asm
; Higher digits of the player rupees count
wRupeeCountHigh::
ds 1 ; DB5D
; Lower digits of the player rupees count
wRupeeCountLow::
ds 1 ; DB5E
wIsThief::
ds 1 ; DB6E
wIsThief 地址是 DB6E,但这不是在 sav 文件里的 offset。
查看 save editor 里发现修改卢比在 sav 文件里的 offset 是 0x462 与 0x463,而从上面wram.asm 找到对应该
wRupeeCountHigh DB5D 0x462
wRupeeCountLow DB5E 0x463
而 wIsThief (DB6E) = wRupeeCountLow (DB5E) + 0x10,猜测在 sav 文件里 offset 距离应该是一样的,所以 wIsThief 在 sav 文件中的 offset 应该 0x463 + 0x10 = 0x473。
用十六进制编辑器打开 sav 文件,go to 0x473,发现值是 02, 确实我偷了两次东西。试着将值改为 00,再读档,玛林不再叫我小偷了,成功。

有三个存档slot,从 save editor 得知每份长度 0x3ad,所以计算得到
第一个小偷状态位置: 0x473
第二个小偷状态位置: 0x473 + 0x3ad = 0x820
第三个小偷状态位置: 0x820 + 0x3ad = 0xbcd
我给 save editor 提交了 PR。如果作者 merge 我的 PR 后,大家就可以直接用 save editor 修改了

在此之前,可以用十六进制编辑器修改上述位置。
有趣的是,这个标志位竟然不是boolean,而一个counter,偷了多少次就是多少值,我就猜想会不会溢出重置为0,试了一下还真会。 我先修改0x473的值为0xFF,然后读档进游戏,先找玛林对话,她叫我小偷我很伤心,然后我再去商店偷一次东西,出来再找玛林,她不叫我小偷了,存档,查看存档文件0xFF的值变成0x00。所以有不修改存档完全走正常流程又像开齐相册又不想NPC叫你小偷的,可以去商店偷够256让counter溢出变回0,但这毅力....而且偷东西也挺难的...
至此,完美撒花~~~~~吗?
为什么 0x473 offset 就是标记偷东西次数?
本人职业病又犯了,不读源码不舒服,以下内容更加学术与枯燥。
能过wIsThief 找到 bank0.asm 代码
.clearEntitiesStatusLoop
ldi [hl], a ;; 00:186C $22
dec e ;; 00:186D $1D
jr nz, .clearEntitiesStatusLoop ;; 00:186E $20 $FC
ld a, [wItemPickedUpInShop] ;; 00:1870 $FA $09 $C5
and a ;; 00:1873 $A7
jr z, .label_1898 ;; 00:1874 $28 $22
push af ;; 00:1876 $F5
ld a, BANK(label_004_7A5F) ;; 00:1877 $3E $04
call SwitchBank ;; 00:1879 $CD $0C $08
pop af ;; 00:187C $F1
call label_004_7A5F ;; 00:187D $CD $5F $7A
ld hl, wIsThief ;; 00:1880 $21 $6E $DB
inc [hl] ;; 00:1883 $34
ld hl, wHasStolenFromShop ;; 00:1884 $21 $46 $DB
inc [hl] ;; 00:1887 $34
ld a, [wPhotos1] ;; 00:1888 $FA $0C $DC
or $40 ;; 00:188B $F6 $40
ld [wPhotos1], a ;; 00:188D $EA $0C $DC
ld a, $01 ;; 00:1890 $3E $01
ld [wDidStealItem], a ;; 00:1892 $EA $7E $D4
xor a ;; 00:1895 $AF
ldh [hLinkAnimationState], a ;; 00:1896 $E0 $9D
这段代码应该是从商店出来后会运行,代码大概是 SwitchBank 到 bank04 的 label_004_7A5F 运行买(偷)到什么东西(如果是心则加命),然后wIsThief + 1,wHasStolenFromShop + 1,把偷东西的照片设成01。所以确认 wIsThief 是在内存中标记偷东西的次数。
内存的东西要保存到存档文件,通过搜索 save 找到 SaveGameToFile,有一段是 loopSaveMain
ld bc, wOverworldRoomStatus ;; 01:5E0C $01 $00 $D8
ld de, SAVE_MAIN_SIZE ;; 01:5E0F $11 $80 $03
.loopSaveMain
call EnableSRAM ;; 01:5E12 $CD $D0 $27
ld a, [bc] ;; 01:5E15 $0A
inc bc ;; 01:5E16 $03
call EnableSRAM ;; 01:5E17 $CD $D0 $27
ldi [hl], a ;; 01:5E1A $22
dec de ;; 01:5E1B $1B
ld a, e ;; 01:5E1C $7B
or d ;; 01:5E1D $B2
jr nz, .loopSaveMain ;; 01:5E1E $20 $F
大意是设bc是 wOverworldRoomStatus 地址,de是SAVE_MAIN_SIZE,循环SAVE_MAIN_SIZE次从wOverworldRoomStatus地址处往后的值写入SRAM
在 sram.asm 中可以看到存档内容的排列
DEF SAVE_PREFIX_SIZE EQU 5
DEF SAVE_MAIN_SIZE EQU $0380
DEF SAVE_DX1_SIZE EQU $0005 ; wColorDungeonItemFlags
DEF SAVE_DX2_SIZE EQU $0020 ; wColorDungeonRoomStatus
DEF SAVE_DX3_SIZE EQU $0003 ; wTunicType, wPhotos1, wPhotos2
assert SAVE_MAIN_SIZE == (wSaveSlotNames - wOverworldRoomStatus)
section "SRAM", sram[$A000], bank[0]
; For some reason the first 256 bytes are skipped in the sram.
ds $100
SaveGame1:
.prefix:
ds SAVE_PREFIX_SIZE
.main:
ds SAVE_MAIN_SIZE
.dx1:
ds SAVE_DX1_SIZE
.dx2:
ds SAVE_DX2_SIZE
.dx3:
ds SAVE_DX3_SIZE
.end:
前0x00 - 0xFF 共256 字节unused,接着存5字节prefix,然后是0x380字节的main,5字节DX1, 0x20字节DX2, 3字节DX3
从 wram.asm 可以找到 wOverworldRoomStatus 是 0xD800 ,前面也找到 wIsThief 是 0xDB6E,而main从 0x100 + 0x5 = 0x105 开始存
main + (wIsThief - wOverworldRoomStatus)= 0x105 + (0xDB6E - 0xD800) = 0x473
这就是为什么wIsThief在WRAM内存是0xDB6E,存到sav文件里的0x473 offset
而且一份save slot大小是0x3ad,与 save editor 里定义的一样
0x5 + 0x380 + 0x5+ 0x20 + 0x3 = 0x3ad
读懂了源码与理清了存档文件结构,可以修改更多在save editor里没有东西,例如 wIsMarinFollowingLink (DB73) 在 0x478,wIsMarinInAnimalVillage (DB74) 在 0x479,只有玛林跟着林克时,才能做很多有趣的事,看到很多有趣的对话以前拍三张照片,但玛林在动物村离队后这些就都错过了。此时将0x478改为01,将0x479改为00,玛林又再跟着你了

真完结撒花!!!!