From dcb610e88d64237cf2ccfa26119d2daadd8a57a3 Mon Sep 17 00:00:00 2001 From: aaaaaa123456789 Date: Sat, 9 Nov 2019 09:30:11 -0300 Subject: [PATCH] Save the conversion table to SRAM, load it when loading the game, and clear it on new game Co-Authored-By: aaaaaa123456789 --- engine/menus/intro_menu.asm | 10 ++++ engine/menus/save.asm | 96 ++++++++++++++++++++++++++++++++----- ram/sram.asm | 16 ++++++- 3 files changed, 108 insertions(+), 14 deletions(-) diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm index 826eb806b..4ae523f63 100644 --- a/engine/menus/intro_menu.asm +++ b/engine/menus/intro_menu.asm @@ -100,6 +100,16 @@ ResetWRAM: ret _ResetWRAM: + ld a, BANK(wPokemonIndexTable) + ldh [rSVBK], a + ld hl, wPokemonIndexTable + ld bc, wPokemonIndexTableEnd - wPokemonIndexTable + xor a + call ByteFill + + ld a, 1 + ldh [rSVBK], a + ld hl, wShadowOAM ld bc, wOptions - wShadowOAM xor a diff --git a/engine/menus/save.asm b/engine/menus/save.asm index fd55e4b49..baec7b915 100644 --- a/engine/menus/save.asm +++ b/engine/menus/save.asm @@ -27,8 +27,10 @@ SaveAfterLinkTrade: farcall StageRTCTimeForSave farcall BackupMysteryGift call SavePokemonData + call SaveIndexTables call SaveChecksum call SaveBackupPokemonData + call SaveBackupIndexTables call SaveBackupChecksum farcall BackupPartyMonMail farcall SaveRTC @@ -95,11 +97,13 @@ MoveMonWOMail_InsertMon_SaveGame: call SaveOptions call SavePlayerData call SavePokemonData + call SaveIndexTables call SaveChecksum call ValidateBackupSave call SaveBackupOptions call SaveBackupPlayerData call SaveBackupPokemonData + call SaveBackupIndexTables call SaveBackupChecksum farcall BackupPartyMonMail farcall BackupGSBallFlag @@ -244,12 +248,14 @@ SaveGameData: call SaveOptions call SavePlayerData call SavePokemonData + call SaveIndexTables call SaveBox call SaveChecksum call ValidateBackupSave call SaveBackupOptions call SaveBackupPlayerData call SaveBackupPokemonData + call SaveBackupIndexTables call SaveBackupChecksum call UpdateStackTop farcall BackupPartyMonMail @@ -466,15 +472,32 @@ SavePokemonData: call CloseSRAM ret +SaveIndexTables: + ldh a, [rSVBK] + push af + ld a, BANK(wPokemonIndexTable) + ldh [rSVBK], a + ; saving is already a long operation, so take the chance to GC the table + farcall PokemonTableGarbageCollection + ld a, BANK(sPokemonIndexTable) + call OpenSRAM + ld hl, wPokemonIndexTable + ld de, sPokemonIndexTable + ld bc, wPokemonIndexTableEnd - wPokemonIndexTable + call CopyBytes + pop af + ldh [rSVBK], a + jp CloseSRAM + SaveBox: call GetBoxAddress call SaveBoxAddress ret SaveChecksum: - ld hl, sGameData - ld bc, sGameDataEnd - sGameData - ld a, BANK(sGameData) + ld hl, sSaveData + ld bc, sSaveDataEnd - sSaveData + ld a, BANK(sSaveData) call OpenSRAM call Checksum ld a, e @@ -528,10 +551,25 @@ SaveBackupPokemonData: call CloseSRAM ret +SaveBackupIndexTables: + ld a, BANK(sBackupPokemonIndexTable) + call OpenSRAM + ldh a, [rSVBK] + push af + ld a, BANK(wPokemonIndexTable) + ldh [rSVBK], a + ld hl, wPokemonIndexTable + ld de, sBackupPokemonIndexTable + ld bc, wPokemonIndexTableEnd - wPokemonIndexTable + call CopyBytes + pop af + ldh [rSVBK], a + jp CloseSRAM + SaveBackupChecksum: - ld hl, sBackupGameData - ld bc, sBackupGameDataEnd - sBackupGameData - ld a, BANK(sBackupGameData) + ld hl, sBackupSaveData + ld bc, sBackupSaveDataEnd - sBackupSaveData + ld a, BANK(sBackupSaveData) call OpenSRAM call Checksum ld a, e @@ -546,6 +584,7 @@ TryLoadSaveFile: jr nz, .backup call LoadPlayerData call LoadPokemonData + call LoadIndexTables call LoadBox farcall RestorePartyMonMail farcall RestoreGSBallFlag @@ -554,6 +593,7 @@ TryLoadSaveFile: call SaveBackupOptions call SaveBackupPlayerData call SaveBackupPokemonData + call SaveBackupIndexTables call SaveBackupChecksum and a ret @@ -563,6 +603,7 @@ TryLoadSaveFile: jr nz, .corrupt call LoadBackupPlayerData call LoadBackupPokemonData + call LoadBackupIndexTables call LoadBox farcall RestorePartyMonMail farcall RestoreGSBallFlag @@ -571,6 +612,7 @@ TryLoadSaveFile: call SaveOptions call SavePlayerData call SavePokemonData + call SaveIndexTables call SaveChecksum and a ret @@ -711,15 +753,30 @@ LoadPokemonData: call CloseSRAM ret +LoadIndexTables: + ld a, BANK(sPokemonIndexTable) + call OpenSRAM + ldh a, [rSVBK] + push af + ld a, BANK(wPokemonIndexTable) + ldh [rSVBK], a + ld hl, sPokemonIndexTable + ld de, wPokemonIndexTable + ld bc, wPokemonIndexTableEnd - wPokemonIndexTable + call CopyBytes + pop af + ldh [rSVBK], a + jp CloseSRAM + LoadBox: call GetBoxAddress call LoadBoxAddress ret VerifyChecksum: - ld hl, sGameData - ld bc, sGameDataEnd - sGameData - ld a, BANK(sGameData) + ld hl, sSaveData + ld bc, sSaveDataEnd - sSaveData + ld a, BANK(sSaveData) call OpenSRAM call Checksum ld a, [sChecksum + 0] @@ -757,10 +814,25 @@ LoadBackupPokemonData: call CloseSRAM ret +LoadBackupIndexTables: + ld a, BANK(sBackupPokemonIndexTable) + call OpenSRAM + ldh a, [rSVBK] + push af + ld a, BANK(wPokemonIndexTable) + ldh [rSVBK], a + ld hl, sBackupPokemonIndexTable + ld de, wPokemonIndexTable + ld bc, wPokemonIndexTableEnd - wPokemonIndexTable + call CopyBytes + pop af + ldh [rSVBK], a + jp CloseSRAM + VerifyBackupChecksum: - ld hl, sBackupGameData - ld bc, sBackupGameDataEnd - sBackupGameData - ld a, BANK(sBackupGameData) + ld hl, sBackupSaveData + ld bc, sBackupSaveDataEnd - sBackupSaveData + ld a, BANK(sBackupSaveData) call OpenSRAM call Checksum ld a, [sBackupChecksum + 0] diff --git a/ram/sram.asm b/ram/sram.asm index 602f65f40..bd08392db 100644 --- a/ram/sram.asm +++ b/ram/sram.asm @@ -67,13 +67,19 @@ sBackupOptions:: ds wOptionsEnd - wOptions sBackupCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption +sBackupSaveData:: + sBackupGameData:: sBackupPlayerData:: ds wPlayerDataEnd - wPlayerData sBackupCurMapData:: ds wCurMapDataEnd - wCurMapData sBackupPokemonData:: ds wPokemonDataEnd - wPokemonData sBackupGameDataEnd:: - ds $18a +sBackupPokemonIndexTable:: ds wPokemonIndexTableEnd - wPokemonIndexTable + +sBackupSaveDataEnd:: + + ds $8a sBackupChecksum:: dw @@ -96,13 +102,19 @@ sOptions:: ds wOptionsEnd - wOptions sCheckValue1:: db ; loaded with SAVE_CHECK_VALUE_1, used to check save corruption +sSaveData:: + sGameData:: sPlayerData:: ds wPlayerDataEnd - wPlayerData sCurMapData:: ds wCurMapDataEnd - wCurMapData sPokemonData:: ds wPokemonDataEnd - wPokemonData sGameDataEnd:: - ds $18a +sPokemonIndexTable:: ds wPokemonIndexTableEnd - wPokemonIndexTable + +sSaveDataEnd:: + + ds $8a sChecksum:: dw