diff options
Diffstat (limited to 'engine/save.asm')
-rwxr-xr-x | engine/save.asm | 698 |
1 files changed, 698 insertions, 0 deletions
diff --git a/engine/save.asm b/engine/save.asm new file mode 100755 index 00000000..bf2ec037 --- /dev/null +++ b/engine/save.asm @@ -0,0 +1,698 @@ +LoadSAV: ; 735e8 (1c:75e8) +;(if carry -> write +;"the file data is destroyed") + call ClearScreen + call LoadFontTilePatterns + call LoadTextBoxTilePatterns + call LoadSAVCheckSum + jr c, .badsum + call LoadSAVCheckSum1 + jr c, .badsum + call LoadSAVCheckSum2 + jr c, .badsum + ld a, $2 ; good checksum + jr .goodsum +.badsum + ld hl, $d730 + push hl + set 6, [hl] + ld hl, FileDataDestroyedText + call PrintText + ld c, $64 + call DelayFrames + pop hl + res 6, [hl] + ld a, $1 ; bad checksum +.goodsum + ld [$d088], a ; checksum flag + ret + +FileDataDestroyedText: ; 7361e (1c:761e) + TX_FAR _FileDataDestroyedText + db "@" + +LoadSAVCheckSum: ; 73623 (1c:7623) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, $a598 ; hero name located in SRAM + ld bc, $f8b ; but here checks the full SAV + call SAVCheckSum + ld c, a + ld a, [$b523] ; SAV's checksum + cp c + jp z, .Func_73652 + ld hl, $a598 + ld bc, $f8b + call SAVCheckSum + ld c, a + ld a, [$b523] ; SAV's checksum + cp c + jp nz, SAVBadCheckSum + +.Func_73652 ; 73652 (1c:7652) + ld hl, $a598 + ld de, W_PLAYERNAME ; $d158 + ld bc, $b + call CopyData + ld hl, $a5a3 + ld de, wPokedexOwned ; $d2f7 + ld bc, $789 + call CopyData + ld hl, W_CURMAPTILESET ; $d367 + set 7, [hl] + ld hl, $ad2c + ld de, wSpriteStateData1 + ld bc, $200 + call CopyData + ld a, [$b522] + ld [$ffd7], a + ld hl, $b0c0 + ld de, W_NUMINBOX ; $da80 + ld bc, $462 + call CopyData + and a + jp SAVGoodChecksum + +LoadSAVCheckSum1: ; 73690 (1c:7690) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, $a598 ; hero name located in SRAM + ld bc, $f8b ; but here checks the full SAV + call SAVCheckSum + ld c, a + ld a, [$b523] ; SAV's checksum + cp c + jr nz, SAVBadCheckSum + ld hl, $b0c0 + ld de, W_NUMINBOX ; $da80 + ld bc, $462 + call CopyData + and a + jp SAVGoodChecksum + +LoadSAVCheckSum2: ; 736bd (1c:76bd) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, $a598 ; hero name located in SRAM + ld bc, $f8b ; but here checks the full SAV + call SAVCheckSum + ld c, a + ld a, [$b523] ; SAV's checksum + cp c + jp nz, SAVBadCheckSum + ld hl, $af2c + ld de, W_NUMINPARTY ; $d163 + ld bc, $194 + call CopyData + ld hl, $a5a3 + ld de, wPokedexOwned ; $d2f7 + ld bc, wPokedexSeenEnd - wPokedexOwned + call CopyData + and a + jp SAVGoodChecksum + +SAVBadCheckSum: ; 736f7 (1c:76f7) + scf + +SAVGoodChecksum: ; 736f8 (1c:76f8) + ld a, $0 + ld [$6000], a + ld [$0], a + ret + +Func_73701: ; 0x73701 + call LoadSAVCheckSum + call LoadSAVCheckSum1 + jp LoadSAVCheckSum2 + +SaveSAV: ;$770a + callba PrintSaveScreenText + ld hl,WouldYouLikeToSaveText + call SaveSAVConfirm + and a ;|0 = Yes|1 = No| + ret nz + ld a,[$d088] + dec a + jr z,.save + call SAVCheckRandomID + jr z,.save + ld hl,OlderFileWillBeErasedText + call SaveSAVConfirm + and a + ret nz +.save ;$772d + call SaveSAVtoSRAM ;$7848 + FuncCoord 1,13 + ld hl,Coord + ld bc,$0412 + call ClearScreenArea ; clear area 4x12 starting at 13,1 + FuncCoord 1,14 + ld hl,Coord + ld de,NowSavingString + call PlaceString + ld c,$78 + call DelayFrames + ld hl,GameSavedText + call PrintText + ld a, (SFX_02_5d - SFX_Headers_02) / 3 ;sound for saved game + call PlaySoundWaitForCurrent + call WaitForSoundToFinish + ld c,$1e + jp DelayFrames + +NowSavingString: + db "Now saving...@" + +SaveSAVConfirm: ; 73768 (1c:7768) + call PrintText + FuncCoord 0, 7 + ld hl,Coord + ld bc,$0801 ;arrow's coordinates |b = Y|c = X| + ld a,$14 ;one line shifting ($28 = 2 lines) + ld [$d125],a + call DisplayTextBoxID ;handle Yes/No KeyPress + ld a,[$cc26] + ret + +WouldYouLikeToSaveText: ; 0x7377d + TX_FAR _WouldYouLikeToSaveText + db "@" + +GameSavedText: ; 73782 (1c:7782) + TX_FAR _GameSavedText + db "@" + +OlderFileWillBeErasedText: ; 73787 (1c:7787) + TX_FAR _OlderFileWillBeErasedText + db "@" + +SaveSAVtoSRAM0: ; 7378c (1c:778c) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, W_PLAYERNAME ; $d158 + ld de, $a598 + ld bc, $b + call CopyData + ld hl, wPokedexOwned ; $d2f7 + ld de, $a5a3 + ld bc, $789 + call CopyData + ld hl, wSpriteStateData1 ; OAM? + ld de, $ad2c + ld bc, $200 + call CopyData + ld hl, W_NUMINBOX ; $da80 + ld de, $b0c0 + ld bc, $462 + call CopyData + ld a, [$ffd7] + ld [$b522], a + ld hl, $a598 + ld bc, $f8b + call SAVCheckSum + ld [$b523], a + xor a + ld [$6000], a + ld [$0], a + ret + +SaveSAVtoSRAM1: ; 737e2 (1c:77e2) +; stored pokémon + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, W_NUMINBOX ; $da80 + ld de, $b0c0 + ld bc, $462 + call CopyData + ld hl, $a598 + ld bc, $f8b + call SAVCheckSum + ld [$b523], a + xor a + ld [$6000], a + ld [$0], a + ret + +SaveSAVtoSRAM2: ; 7380f (1c:780f) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld [$4000], a + ld hl, W_NUMINPARTY ; $d163 + ld de, $af2c + ld bc, $194 + call CopyData + ld hl, wPokedexOwned ; pokédex only + ld de, $a5a3 + ld bc, wPokedexSeenEnd - wPokedexOwned + call CopyData + ld hl, $a598 + ld bc, $f8b + call SAVCheckSum + ld [$b523], a + xor a + ld [$6000], a + ld [$0], a + ret + +SaveSAVtoSRAM: ; 73848 (1c:7848) + ld a, $2 + ld [$d088], a + call SaveSAVtoSRAM0 + call SaveSAVtoSRAM1 + jp SaveSAVtoSRAM2 + +SAVCheckSum: ; 73856 (1c:7856) +;Check Sum (result[1 byte] is complemented) + ld d, $0 +.loop + ld a, [hli] + add d + ld d, a + dec bc + ld a, b + or c + jr nz, .loop + ld a, d + cpl + ret + +Func_73863: ; 73863 (1c:7863) + ld hl, $a000 + ld de, $ba4d + ld b, $6 +.asm_7386b + push bc + push de + ld bc, $462 + call SAVCheckSum + pop de + ld [de], a + inc de + pop bc + dec b + jr nz, .asm_7386b + ret + +Func_7387b: ; 7387b (1c:787b) + ld hl, PointerTable_73895 ; $7895 + ld a, [$d5a0] + and $7f + cp $6 + ld b, $2 + jr c, .asm_7388c + inc b + sub $6 +.asm_7388c + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +PointerTable_73895: ; 73895 (1c:7895) + dw $A000 + dw $A462 + dw $A8C4 + dw $AD26 + dw $B188 + dw $B5EA + +Func_738a1:: ; 738a1 (1c:78a1) + ld hl, WhenYouChangeBoxText + call PrintText + call YesNoChoice + ld a, [wCurrentMenuItem] ; $cc26 + and a + ret nz + ld hl, $d5a0 + bit 7, [hl] + call z, Func_73a29 + call Func_7393f + call UpdateSprites + ld hl, $fff6 + set 1, [hl] + call HandleMenuInput + ld hl, $fff6 + res 1, [hl] + bit 1, a + ret nz + call Func_7387b + ld e, l + ld d, h + ld hl, W_NUMINBOX ; $da80 + call Func_7390e + ld a, [wCurrentMenuItem] ; $cc26 + set 7, a + ld [$d5a0], a + call Func_7387b + ld de, W_NUMINBOX ; $da80 + call Func_7390e + ld hl, W_MAPTEXTPTR ; $d36c + ld de, wWhichTrade ; $cd3d + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + call Func_3f05 + call SaveSAVtoSRAM + ld hl, wWhichTrade ; $cd3d + call Func_3f0f + ld a, (SFX_02_5d - SFX_Headers_02) / 3 + call PlaySoundWaitForCurrent + call WaitForSoundToFinish + ret + +WhenYouChangeBoxText: ; 73909 (1c:7909) + TX_FAR _WhenYouChangeBoxText + db "@" + +Func_7390e: ; 7390e (1c:790e) + push hl + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld a, b + ld [$4000], a + ld bc, $462 + call CopyData + pop hl + xor a + ld [hli], a + dec a + ld [hl], a + ld hl, $a000 + ld bc, $1a4c + call SAVCheckSum + ld [$ba4c], a + call Func_73863 + xor a + ld [$6000], a + ld [$0], a + ret + +Func_7393f: ; 7393f (1c:793f) + xor a + ld [H_AUTOBGTRANSFERENABLED], a ; $ffba + ld a, $3 + ld [wMenuWatchedKeys], a ; $cc29 + ld a, $b + ld [wMaxMenuItem], a ; $cc28 + ld a, $1 + ld [wTopMenuItemY], a ; $cc24 + ld a, $c + ld [wTopMenuItemX], a ; $cc25 + xor a + ld [$cc37], a + ld a, [$d5a0] + and $7f + ld [wCurrentMenuItem], a ; $cc26 + ld [wLastMenuItem], a ; $cc2a + ld hl, wTileMap + ld b, $2 + ld c, $9 + call TextBoxBorder + ld hl, ChooseABoxText + call PrintText + FuncCoord 11, 0 ; $c3ab + ld hl, Coord + ld b, $c + ld c, $7 + call TextBoxBorder + ld hl, $fff6 + set 2, [hl] + ld de, BoxNames ; $79d9 + FuncCoord 13, 1 ; $c3c1 + ld hl, Coord + call PlaceString + ld hl, $fff6 + res 2, [hl] + ld a, [$d5a0] + and $7f + cp $9 + jr c, .asm_739a6 + sub $9 + FuncCoord 8, 2 ; $c3d0 + ld hl, Coord + ld [hl], $f7 + add $f6 + jr .asm_739a8 +.asm_739a6 + add $f7 +.asm_739a8 + FuncCoord 9, 2 ; $c3d1 + ld [Coord], a + FuncCoord 1, 2 ; $c3c9 + ld hl, Coord + ld de, BoxNoText + call PlaceString + call Func_73a84 + FuncCoord 18, 1 ; $c3c6 + ld hl, Coord + ld de, wWhichTrade ; $cd3d + ld bc, $14 + ld a, $c +.asm_739c2 + push af + ld a, [de] + and a + jr z, .asm_739c9 + ld [hl], $78 +.asm_739c9 + add hl, bc + inc de + pop af + dec a + jr nz, .asm_739c2 + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a ; $ffba + ret + +ChooseABoxText: ; 739d4 (1c:79d4) + TX_FAR _ChooseABoxText + db "@" + +BoxNames: ; 739d9 (1c:79d9) + db "BOX 1" + next "BOX 2" + next "BOX 3" + next "BOX 4" + next "BOX 5" + next "BOX 6" + next "BOX 7" + next "BOX 8" + next "BOX 9" + next "BOX10" + next "BOX11" + next "BOX12@" + +BoxNoText: ; 73a21 (1c:7a21) + db "BOX No.@" + +Func_73a29: ; 73a29 (1c:7a29) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld a, $2 + ld [$4000], a + call Func_73a4b + ld a, $3 + ld [$4000], a + call Func_73a4b + xor a + ld [$6000], a + ld [$0], a + ret + +Func_73a4b: ; 73a4b (1c:7a4b) + ld hl, $a000 + call Func_73a7f + ld hl, $a462 + call Func_73a7f + ld hl, $a8c4 + call Func_73a7f + ld hl, $ad26 + call Func_73a7f + ld hl, $b188 + call Func_73a7f + ld hl, $b5ea + call Func_73a7f + ld hl, $a000 + ld bc, $1a4c + call SAVCheckSum + ld [$ba4c], a + call Func_73863 + ret + +Func_73a7f: ; 73a7f (1c:7a7f) + xor a + ld [hli], a + dec a + ld [hl], a + ret + +Func_73a84: ; 73a84 (1c:7a84) + ld hl, wWhichTrade ; $cd3d + push hl + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + ld a, $2 + ld [$4000], a + call Func_73ab8 + ld a, $3 + ld [$4000], a + call Func_73ab8 + xor a + ld [$6000], a + ld [$0], a + pop hl + ld a, [$d5a0] + and $7f + ld c, a + ld b, $0 + add hl, bc + ld a, [W_NUMINBOX] ; $da80 + ld [hl], a + ret + +Func_73ab8: ; 73ab8 (1c:7ab8) + ld a, [$a000] + ld [hli], a + ld a, [$a462] + ld [hli], a + ld a, [$a8c4] + ld [hli], a + ld a, [$ad26] + ld [hli], a + ld a, [$b188] + ld [hli], a + ld a, [$b5ea] + ld [hli], a + ret + +SAVCheckRandomID: ;$7ad1 +;checks if Sav file is the same by checking player's name 1st letter ($a598) +; and the two random numbers generated at game beginning +;(which are stored at $d359-d35a) + ld a,$0a + ld [$0000],a + ld a,$01 + ld [$6000],a + ld [$4000],a + ld a,[$a598] + and a + jr z,.next + ld hl,$a598 + ld bc,$0f8b + call SAVCheckSum + ld c,a + ld a,[$b523] + cp c + jr nz,.next + ld hl,$a605 + ld a,[hli] + ld h,[hl] + ld l,a + ld a,[$d359] + cp l + jr nz,.next + ld a,[$d35a] + cp h +.next + ld a,$00 + ld [$6000],a + ld [$0000],a + ret + +Func_73b0d: ; 73b0d (1c:7b0d) + ld a, [$d5a2] + dec a + cp $32 + jr nc, .asm_73b28 + ld hl, $a598 + ld bc, $60 + call AddNTimes + ld e, l + ld d, h + ld hl, $cc5b + ld bc, $60 + jr CopyToSRAM0 +.asm_73b28 + ld hl, $a5f8 + ld de, $a598 + ld bc, $1260 + call CopyToSRAM0 + ld hl, $cc5b + ld de, $b7f8 + ld bc, $60 + jr CopyToSRAM0 + +Func_73b3f: ; 73b3f (1c:7b3f) + ld hl, $a598 + ld bc, $60 + ld a, [wWhichTrade] ; $cd3d + call AddNTimes + ld de, $cc5b + ld bc, $60 + ; fallthrough +CopyToSRAM0: ; 73b51 (1c:7b51) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + xor a + ld [$4000], a + call CopyData + xor a + ld [$6000], a + ld [$0], a + ret + +Func_73b6a: ; 73b6a (1c:7b6a) + ld a, $a + ld [$0], a + ld a, $1 + ld [$6000], a + xor a + call PadSRAM_FF + ld a, $1 + call PadSRAM_FF + ld a, $2 + call PadSRAM_FF + ld a, $3 + call PadSRAM_FF + xor a + ld [$6000], a + ld [$0], a + ret + +PadSRAM_FF: ; 73b8f (1c:7b8f) + ld [$4000], a + ld hl, $a000 + ld bc, $2000 + ld a, $ff + jp FillMemory |