ref: fd2b4b6c74e324f423cd3a5aac0428eae12b7620
dir: /engine/save.asm/
LoadSAV: ; 735e8 (1c:75e8) ;(if carry -> write ;"the file data is destroyed") call ClearScreen call LoadFontTilePatterns call LoadTextBoxTilePatterns call LoadSAV0 jr c, .badsum call LoadSAV1 jr c, .badsum call LoadSAV2 jr c, .badsum ld a, $2 ; good checksum jr .goodsum .badsum ld hl, wd730 push hl set 6, [hl] ld hl, FileDataDestroyedText call PrintText ld c, 100 call DelayFrames pop hl res 6, [hl] ld a, $1 ; bad checksum .goodsum ld [wSaveFileStatus], a ret FileDataDestroyedText: ; 7361e (1c:761e) TX_FAR _FileDataDestroyedText db "@" LoadSAV0: ; 73623 (1c:7623) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, sPlayerName ; hero name located in SRAM ld bc, sMainDataCheckSum - sPlayerName ; but here checks the full SAV call SAVCheckSum ld c, a ld a, [sMainDataCheckSum] ; SAV's checksum cp c jp z, .checkSumsMatched ; If the computed checksum didn't match the saved on, try again. ld hl, sPlayerName ld bc, sMainDataCheckSum - sPlayerName call SAVCheckSum ld c, a ld a, [sMainDataCheckSum] ; SAV's checksum cp c jp nz, SAVBadCheckSum .checkSumsMatched ld hl, sPlayerName ld de, wPlayerName ld bc, 11 call CopyData ld hl, sMainData ld de, wPokedexOwned ld bc, sSpriteData - sMainData call CopyData ld hl, W_CURMAPTILESET set 7, [hl] ld hl, sSpriteData ld de, wSpriteStateData1 ld bc, sPartyData - sSpriteData call CopyData ld a, [sTilesetType] ld [hTilesetType], a ld hl, sCurBoxData ld de, W_NUMINBOX ld bc, wBoxMonNicksEnd - W_NUMINBOX call CopyData and a jp SAVGoodChecksum LoadSAV1: ; 73690 (1c:7690) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, sPlayerName ; hero name located in SRAM ld bc, sMainDataCheckSum - sPlayerName ; but here checks the full SAV call SAVCheckSum ld c, a ld a, [sMainDataCheckSum] ; SAV's checksum cp c jr nz, SAVBadCheckSum ld hl, sCurBoxData ld de, W_NUMINBOX ld bc, wBoxMonNicksEnd - W_NUMINBOX call CopyData and a jp SAVGoodChecksum LoadSAV2: ; 736bd (1c:76bd) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, sPlayerName ; hero name located in SRAM ld bc, sMainDataCheckSum - sPlayerName ; but here checks the full SAV call SAVCheckSum ld c, a ld a, [sMainDataCheckSum] ; SAV's checksum cp c jp nz, SAVBadCheckSum ld hl, sPartyData ld de, wPartyCount ld bc, wPokedexOwned - wPartyCount call CopyData ld hl, sMainData ld de, wPokedexOwned ld bc, wPokedexSeenEnd - wPokedexOwned call CopyData and a jp SAVGoodChecksum SAVBadCheckSum: ; 736f7 (1c:76f7) scf SAVGoodChecksum: ; 736f8 (1c:76f8) ld a, $0 ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret LoadSAVIgnoreBadCheckSum: ; 73701 (1c:7701) ; unused function that loads save data and ignores bad checksums call LoadSAV0 call LoadSAV1 jp LoadSAV2 SaveSAV: ; 7370a (1c:770a) callba PrintSaveScreenText ld hl,WouldYouLikeToSaveText call SaveSAVConfirm and a ;|0 = Yes|1 = No| ret nz ld a,[wSaveFileStatus] dec a jr z,.save call SAVCheckRandomID jr z,.save ld hl,OlderFileWillBeErasedText call SaveSAVConfirm and a ret nz .save call SaveSAVtoSRAM coord hl, 1, 13 ld bc,$0412 call ClearScreenArea ; clear area 4x12 starting at 13,1 coord hl, 1, 14 ld de,NowSavingString call PlaceString ld c,120 call DelayFrames ld hl,GameSavedText call PrintText ld a, SFX_SAVE call PlaySoundWaitForCurrent call WaitForSoundToFinish ld c,30 jp DelayFrames NowSavingString: db "Now saving...@" SaveSAVConfirm: ; 73768 (1c:7768) call PrintText coord hl, 0, 7 ld bc,$0801 ld a,TWO_OPTION_MENU ld [wTextBoxID],a call DisplayTextBoxID ; yes/no menu ld a,[wCurrentMenuItem] 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, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, wPlayerName ld de, sPlayerName ld bc, 11 call CopyData ld hl, wPokedexOwned ld de, sMainData ld bc, W_NUMINBOX - wPokedexOwned call CopyData ld hl, wSpriteStateData1 ld de, sSpriteData ld bc, sPartyData - sSpriteData call CopyData ld hl, W_NUMINBOX ld de, sCurBoxData ld bc, wBoxMonNicksEnd - W_NUMINBOX call CopyData ld a, [hTilesetType] ld [sTilesetType], a ld hl, sPlayerName ld bc, sMainDataCheckSum - sPlayerName call SAVCheckSum ld [sMainDataCheckSum], a xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret SaveSAVtoSRAM1: ; 737e2 (1c:77e2) ; stored pokémon ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, W_NUMINBOX ld de, sCurBoxData ld bc, wBoxMonNicksEnd - W_NUMINBOX call CopyData ld hl, sPlayerName ld bc, sMainDataCheckSum - sPlayerName call SAVCheckSum ld [sMainDataCheckSum], a xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret SaveSAVtoSRAM2: ; 7380f (1c:780f) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld [MBC1SRamBank], a ld hl, wPartyCount ld de, sPartyData ld bc, wPokedexOwned - wPartyCount call CopyData ld hl, wPokedexOwned ; pokédex only ld de, sMainData ld bc, wPokedexSeenEnd - wPokedexOwned call CopyData ld hl, sPlayerName ld bc, sMainDataCheckSum - sPlayerName call SAVCheckSum ld [sMainDataCheckSum], a xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret SaveSAVtoSRAM: ; 73848 (1c:7848) ld a, $2 ld [wSaveFileStatus], 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 CalcIndividualBoxCheckSums: ; 73863 (1c:7863) ld hl, sBox1 ; sBox7 ld de, sBank2IndividualBoxChecksums ; sBank3IndividualBoxChecksums ld b, NUM_BOXES / 2 .loop push bc push de ld bc, wBoxMonNicksEnd - W_NUMINBOX call SAVCheckSum pop de ld [de], a inc de pop bc dec b jr nz, .loop ret GetBoxSRAMLocation: ; 7387b (1c:787b) ; in: a = box num ; out: b = box SRAM bank, hl = pointer to start of box ld hl, BoxSRAMPointerTable ld a, [wCurrentBoxNum] and $7f cp NUM_BOXES / 2 ld b, 2 jr c, .next inc b sub NUM_BOXES / 2 .next ld e, a ld d, 0 add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a ret BoxSRAMPointerTable: ; 73895 (1c:7895) dw sBox1 ; sBox7 dw sBox2 ; sBox8 dw sBox3 ; sBox9 dw sBox4 ; sBox10 dw sBox5 ; sBox11 dw sBox6 ; sBox12 ChangeBox:: ; 738a1 (1c:78a1) ld hl, WhenYouChangeBoxText call PrintText call YesNoChoice ld a, [wCurrentMenuItem] and a ret nz ; return if No was chosen ld hl, wCurrentBoxNum bit 7, [hl] ; is it the first time player is changing the box? call z, EmptyAllSRAMBoxes ; if so, empty all boxes in SRAM call DisplayChangeBoxMenu call UpdateSprites ld hl, hFlags_0xFFF6 set 1, [hl] call HandleMenuInput ld hl, hFlags_0xFFF6 res 1, [hl] bit 1, a ret nz call GetBoxSRAMLocation ld e, l ld d, h ld hl, W_NUMINBOX call CopyBoxToOrFromSRAM ; copy old box from WRAM to SRAM ld a, [wCurrentMenuItem] set 7, a ld [wCurrentBoxNum], a call GetBoxSRAMLocation ld de, W_NUMINBOX call CopyBoxToOrFromSRAM ; copy new box from SRAM to WRAM ld hl, W_MAPTEXTPTR ld de, wChangeBoxSavedMapTextPointer ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a call RestoreMapTextPointer call SaveSAVtoSRAM ld hl, wChangeBoxSavedMapTextPointer call SetMapTextPointer ld a, SFX_SAVE call PlaySoundWaitForCurrent call WaitForSoundToFinish ret WhenYouChangeBoxText: ; 73909 (1c:7909) TX_FAR _WhenYouChangeBoxText db "@" CopyBoxToOrFromSRAM: ; 7390e (1c:790e) ; copy an entire box from hl to de with b as the SRAM bank push hl ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld a, b ld [MBC1SRamBank], a ld bc, wBoxMonNicksEnd - W_NUMINBOX call CopyData pop hl ; mark the memory that the box was copied from as am empty box xor a ld [hli], a dec a ld [hl], a ld hl, sBox1 ; sBox7 ld bc, sBank2AllBoxesChecksum - sBox1 call SAVCheckSum ld [sBank2AllBoxesChecksum], a ; sBank3AllBoxesChecksum call CalcIndividualBoxCheckSums xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret DisplayChangeBoxMenu: ; 7393f (1c:793f) xor a ld [H_AUTOBGTRANSFERENABLED], a ld a, A_BUTTON | B_BUTTON ld [wMenuWatchedKeys], a ld a, 11 ld [wMaxMenuItem], a ld a, 1 ld [wTopMenuItemY], a ld a, 12 ld [wTopMenuItemX], a xor a ld [wMenuWatchMovingOutOfBounds], a ld a, [wCurrentBoxNum] and $7f ld [wCurrentMenuItem], a ld [wLastMenuItem], a coord hl, 0, 0 ld b, 2 ld c, 9 call TextBoxBorder ld hl, ChooseABoxText call PrintText coord hl, 11, 0 ld b, 12 ld c, 7 call TextBoxBorder ld hl, hFlags_0xFFF6 set 2, [hl] ld de, BoxNames coord hl, 13, 1 call PlaceString ld hl, hFlags_0xFFF6 res 2, [hl] ld a, [wCurrentBoxNum] and $7f cp 9 jr c, .singleDigitBoxNum sub 9 coord hl, 8, 2 ld [hl], "1" add "0" jr .next .singleDigitBoxNum add "1" .next Coorda 9, 2 coord hl, 1, 2 ld de, BoxNoText call PlaceString call GetMonCountsForAllBoxes coord hl, 18, 1 ld de, wBoxMonCounts ld bc, SCREEN_WIDTH ld a, $c .loop push af ld a, [de] and a ; is the box empty? jr z, .skipPlacingPokeball ld [hl], $78 ; place pokeball tile next to box name if box not empty .skipPlacingPokeball add hl, bc inc de pop af dec a jr nz, .loop ld a, 1 ld [H_AUTOBGTRANSFERENABLED], a 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.@" EmptyAllSRAMBoxes: ; 73a29 (1c:7a29) ; marks all boxes in SRAM as empty (initialisation for the first time the ; player changes the box) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld a, 2 ld [MBC1SRamBank], a call EmptySRAMBoxesInBank ld a, 3 ld [MBC1SRamBank], a call EmptySRAMBoxesInBank xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret EmptySRAMBoxesInBank: ; 73a4b (1c:7a4b) ; marks every box in the current SRAM bank as empty ld hl, sBox1 ; sBox7 call EmptySRAMBox ld hl, sBox2 ; sBox8 call EmptySRAMBox ld hl, sBox3 ; sBox9 call EmptySRAMBox ld hl, sBox4 ; sBox10 call EmptySRAMBox ld hl, sBox5 ; sBox11 call EmptySRAMBox ld hl, sBox6 ; sBox12 call EmptySRAMBox ld hl, sBox1 ; sBox7 ld bc, sBank2AllBoxesChecksum - sBox1 call SAVCheckSum ld [sBank2AllBoxesChecksum], a ; sBank3AllBoxesChecksum call CalcIndividualBoxCheckSums ret EmptySRAMBox: ; 73a7f (1c:7a7f) xor a ld [hli], a dec a ld [hl], a ret GetMonCountsForAllBoxes: ; 73a84 (1c:7a84) ld hl, wBoxMonCounts push hl ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a ld a, $2 ld [MBC1SRamBank], a call GetMonCountsForBoxesInBank ld a, $3 ld [MBC1SRamBank], a call GetMonCountsForBoxesInBank xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a pop hl ; copy the count for the current box from WRAM ld a, [wCurrentBoxNum] and $7f ld c, a ld b, 0 add hl, bc ld a, [W_NUMINBOX] ld [hl], a ret GetMonCountsForBoxesInBank: ; 73ab8 (1c:7ab8) ld a, [sBox1] ; sBox7 ld [hli], a ld a, [sBox2] ; sBox8 ld [hli], a ld a, [sBox3] ; sBox9 ld [hli], a ld a, [sBox4] ; sBox10 ld [hli], a ld a, [sBox5] ; sBox11 ld [hli], a ld a, [sBox6] ; sBox12 ld [hli], a ret SAVCheckRandomID: ; 73ad1 (1c: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 wPlayerID)s ld a,$0a ld [MBC1SRamEnable],a ld a,$01 ld [MBC1SRamBankingMode],a ld [MBC1SRamBank],a ld a,[sPlayerName] and a jr z,.next ld hl,sPlayerName ld bc, sMainDataCheckSum - sPlayerName call SAVCheckSum ld c,a ld a,[sMainDataCheckSum] cp c jr nz,.next ld hl,sMainData + 98 ; player ID ld a,[hli] ld h,[hl] ld l,a ld a,[wPlayerID] cp l jr nz,.next ld a,[wPlayerID + 1] cp h .next ld a,$00 ld [MBC1SRamBankingMode],a ld [MBC1SRamEnable],a ret SaveHallOfFameTeams: ; 73b0d (1c:7b0d) ld a, [wNumHoFTeams] dec a cp HOF_TEAM_CAPACITY jr nc, .asm_73b28 ld hl, sHallOfFame ld bc, HOF_TEAM call AddNTimes ld e, l ld d, h ld hl, wcc5b ld bc, HOF_TEAM jr HallOfFame_Copy .asm_73b28 ld hl, sHallOfFame + HOF_TEAM ld de, sHallOfFame ld bc, HOF_TEAM * (HOF_TEAM_CAPACITY - 1) call HallOfFame_Copy ld hl, wcc5b ld de, sHallOfFame + HOF_TEAM * (HOF_TEAM_CAPACITY - 1) ld bc, HOF_TEAM jr HallOfFame_Copy LoadHallOfFameTeams: ; 73b3f (1c:7b3f) ld hl, sHallOfFame ld bc, HOF_TEAM ld a, [wHoFTeamIndex] call AddNTimes ld de, wcc5b ld bc, HOF_TEAM ; fallthrough HallOfFame_Copy: ; 73b51 (1c:7b51) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], a xor a ld [MBC1SRamBank], a call CopyData xor a ld [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret ClearSAV: ; 73b6a (1c:7b6a) ld a, SRAM_ENABLE ld [MBC1SRamEnable], a ld a, $1 ld [MBC1SRamBankingMode], 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 [MBC1SRamBankingMode], a ld [MBC1SRamEnable], a ret PadSRAM_FF: ; 73b8f (1c:7b8f) ld [MBC1SRamBank], a ld hl, $a000 ld bc, $2000 ld a, $ff jp FillMemory