diff options
Diffstat (limited to 'engine')
-rw-r--r-- | engine/menus/empty_sram.asm | 19 | ||||
-rw-r--r-- | engine/menus/intro_menu.asm | 10 | ||||
-rw-r--r-- | engine/menus/naming_screen.asm | 6 | ||||
-rw-r--r-- | engine/menus/save.asm | 1094 | ||||
-rw-r--r-- | engine/movie/gamefreak_presents.asm | 2 | ||||
-rw-r--r-- | engine/overworld/load_map_part.asm | 36 | ||||
-rwxr-xr-x | engine/overworld/map_objects.asm | 2 | ||||
-rwxr-xr-x | engine/overworld/player_step.asm | 8 | ||||
-rw-r--r-- | engine/overworld/tile_events.asm | 101 | ||||
-rw-r--r-- | engine/pokemon/bills_pc_top.asm | 4 | ||||
-rw-r--r-- | engine/rtc/rtc.asm | 6 |
11 files changed, 1269 insertions, 19 deletions
diff --git a/engine/menus/empty_sram.asm b/engine/menus/empty_sram.asm new file mode 100644 index 00000000..264f0813 --- /dev/null +++ b/engine/menus/empty_sram.asm @@ -0,0 +1,19 @@ +EmptyAllSRAMBanks: + ld a, 0 + call .EmptyBank + ld a, 1 + call .EmptyBank + ld a, 2 + call .EmptyBank + ld a, 3 + call .EmptyBank + ret + +.EmptyBank: + call OpenSRAM + ld hl, SRAM_Begin + ld bc, SRAM_End - SRAM_Begin + xor a + call ByteFill + call CloseSRAM + ret diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm index 763b4fbb..83456b80 100644 --- a/engine/menus/intro_menu.asm +++ b/engine/menus/intro_menu.asm @@ -1177,7 +1177,7 @@ InitTitleScreen: ; 6291 (1:6291) call Function636e call Function63b6 - ld hl, wAnimatedObjectDynamicVTileOffsets + ld hl, wSpriteAnimDict xor a ld [hli], a ld [hl], a @@ -1193,11 +1193,11 @@ InitTitleScreen: ; 6291 (1:6291) ld de, $6058 ld a, $2c ; HO-OH call InitSpriteAnimStruct - ld hl, wAnimatedObjectStruct1 - ld de, wAnimatedObjectStruct10 + ld hl, wSpriteAnim1 + ld de, wSpriteAnim10 ld bc, $a call CopyBytes - ld hl, wAnimatedObjectStruct1 + ld hl, wSpriteAnim1 ld [hl], $0 ld hl, wc700 ld bc, $90 @@ -1475,7 +1475,7 @@ Function64b1: ; 64b1 (1:64b1) and $3 ret nz IF DEF(_GOLD) - ld bc, wAnimatedObjectStruct10Index + ld bc, wSpriteAnim10Index ld hl, $a add hl, bc ld l, [hl] diff --git a/engine/menus/naming_screen.asm b/engine/menus/naming_screen.asm index 55c6ca82..570a649b 100644 --- a/engine/menus/naming_screen.asm +++ b/engine/menus/naming_screen.asm @@ -153,7 +153,7 @@ Function11bda: lb bc, $31, 4 call Request2bpp xor a - ld hl, wMisc + ld hl, wSpriteAnimDict ld [hli], a ld [hl], a lb de, $24, $20 @@ -185,7 +185,7 @@ Function11c11: ; 11c11 (4:5c11) lb bc, BANK(ChrisSpriteGFX), 4 call Request2bpp xor a - ld hl, wMisc + ld hl, wSpriteAnimDict ld [hli], a ld [hl], a lb de, $24, $20 @@ -839,7 +839,7 @@ Function1201e: ; 1201e (4:601e) ld a, BANK(NamingScreenGFX_Cursor) call FarCopyBytes ld a, $5 - ld hl, wAnimatedObjectDynamicVTileOffsets + 9 * 2 + ld hl, wSpriteAnimDict + 9 * 2 ld [hli], a ld [hl], $7e xor a diff --git a/engine/menus/save.asm b/engine/menus/save.asm new file mode 100644 index 00000000..e3b99905 --- /dev/null +++ b/engine/menus/save.asm @@ -0,0 +1,1094 @@ +SaveMenu: + call LoadStandardMenuHeader + lb de, 4, 0 + farcall DisplayNormalContinueData + call SpeechTextbox + call UpdateSprites + farcall SaveMenu_CopyTilemapAtOnce + ld hl, WouldYouLikeToSaveTheGameText + call SaveTheGame_yesorno + jr nz, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SavingDontTurnOffThePower + call ResumeGameLogic + call ExitMenu + and a + ret + +.refused + call ExitMenu + call Functiond2a + farcall SaveMenu_CopyTilemapAtOnce + scf + ret + +SaveAfterLinkTrade: + call PauseGameLogic + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call SavePokemonData + call SaveChecksum + call SaveBackupPokemonData + call SaveBackupChecksum + farcall BackupPartyMonMail + farcall SaveRTC + call ResumeGameLogic + ret + +ChangeBoxSaveGame: + push de + ld hl, ChangeBoxSaveText + call MenuTextbox + call YesNoBox + call ExitMenu + jr c, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call SavingDontTurnOffThePower + call ResumeGameLogic + and a + ret +.refused + pop de + ret + +Link_SaveGame: + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SavingDontTurnOffThePower + call ResumeGameLogic + and a + +.refused + ret + +MoveMonWOMail_SaveGame: + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call ResumeGameLogic + ret + +MoveMonWOMail_InsertMon_SaveGame: + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + ld a, TRUE + ld [wSaveFileExists], a + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveChecksum + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + farcall BackupPartyMonMail + farcall SaveRTC + call LoadBox + call ResumeGameLogic + ld de, SFX_SAVE + call PlaySFX + ld c, 24 + call DelayFrames + ret + +StartMoveMonWOMail_SaveGame: + ld hl, MoveMonWOMailSaveText + call MenuTextbox + call YesNoBox + call ExitMenu + jr c, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SavingDontTurnOffThePower + call ResumeGameLogic + and a + ret + +.refused + scf + ret + +PauseGameLogic: + ld a, TRUE + ld [wGameLogicPaused], a + ret + +ResumeGameLogic: + xor a ; FALSE + ld [wGameLogicPaused], a + ret + +AddHallOfFameEntry: + ld a, BANK(sHallOfFame) + call OpenSRAM + ld hl, sHallOfFame + HOF_LENGTH * (NUM_HOF_TEAMS - 1) - 1 + ld de, sHallOfFame + HOF_LENGTH * NUM_HOF_TEAMS - 1 + ld bc, HOF_LENGTH * (NUM_HOF_TEAMS - 1) +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, c + or b + jr nz, .loop + ld hl, wHallOfFamePokemonList + ld de, sHallOfFame + ld bc, wHallOfFamePokemonListEnd - wHallOfFamePokemonList + 1 + call CopyBytes + call CloseSRAM + ret + +SaveGameData: + call _SaveGameData + ret + +AskOverwriteSaveFile: + ld a, [wSaveFileExists] + and a + jr z, .erase + call CompareLoadedAndSavedPlayerID + jr z, .yoursavefile + ld hl, AnotherSaveFileText + call SaveTheGame_yesorno + jr nz, .refused + jr .erase + +.yoursavefile + ld hl, AlreadyASaveFileText + call SaveTheGame_yesorno + jr nz, .refused + jr .ok + +.erase + call ErasePreviousSave + +.ok + and a + ret + +.refused + scf + ret + +SaveTheGame_yesorno: + ld b, BANK(WouldYouLikeToSaveTheGameText) + call MapTextbox + call LoadMenuTextbox + lb bc, 0, 7 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call CloseWindow + push af + call Functiond2a + pop af + and a + ret + +CompareLoadedAndSavedPlayerID: + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld a, [hli] + ld c, [hl] + ld b, a + call CloseSRAM + ld a, [wPlayerID] + cp b + ret nz + ld a, [wPlayerID + 1] + cp c + ret + +SavingDontTurnOffThePower: + ; Prevent joypad interrupts + xor a + ldh [hJoypadReleased], a + ldh [hJoypadPressed], a + ldh [hJoypadSum], a + ldh [hJoypadDown], a + ; Save the text speed setting to the stack + ld a, [wOptions] + push af + ; Set the text speed to medium + ld a, TEXT_DELAY_MED + ld [wOptions], a + ; SAVING... DON'T TURN OFF THE POWER. + ld hl, SavingDontTurnOffThePowerText + call PrintText + ; Restore the text speed setting + pop af + ld [wOptions], a + ; Wait for 16 frames + ld c, 16 + call DelayFrames + call _SaveGameData + ; wait 32 frames + ld c, 32 + call DelayFrames + ; copy the original text speed setting to the stack + ld a, [wOptions] + push af + ; set text speed to medium + ld a, TEXT_DELAY_MED + ld [wOptions], a + ; <PLAYER> saved the game! + ld hl, SavedTheGameText + call PrintText + ; restore the original text speed setting + pop af + ld [wOptions], a + ld de, SFX_SAVE + call WaitPlaySFX + call WaitSFX + ; wait 30 frames + ld c, 30 + call DelayFrames + ret + +_SaveGameData: + ld a, TRUE + ld [wSaveFileExists], a + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveBox + call SaveChecksum + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + call UpdateStackTop + farcall BackupPartyMonMail + farcall SaveRTC + ret + +UpdateStackTop: +; sStackTop appears to be unused. +; It could have been used to debug stack overflow during saving. + call FindStackTop + ld a, BANK(sStackTop) + call OpenSRAM + ld a, [sStackTop + 0] + ld e, a + ld a, [sStackTop + 1] + ld d, a + or e + jr z, .update + ld a, e + sub l + ld a, d + sbc h + jr c, .done + +.update + ld a, l + ld [sStackTop + 0], a + ld a, h + ld [sStackTop + 1], a + +.done + call CloseSRAM + ret + +FindStackTop: +; Find the furthest point that sp has traversed to. +; This is distinct from the current value of sp. + ld hl, wStackTop - $fc +.loop + ld a, [hl] + or a + ret nz + inc hl + jr .loop + +ErasePreviousSave: + call EraseBoxes + call EraseHallOfFame + call EraseLinkBattleStats + call EraseMysteryGift + ld a, BANK(sStackTop) + call OpenSRAM + xor a + ld [sStackTop + 0], a + ld [sStackTop + 1], a + call CloseSRAM + ld a, $1 + ld [wSavedAtLeastOnce], a + ret + +EraseLinkBattleStats: + ld a, BANK(sLinkBattleStats) + call OpenSRAM + ld hl, sLinkBattleStats + ld bc, sLinkBattleStatsEnd - sLinkBattleStats + xor a + call ByteFill + jp CloseSRAM + +EraseMysteryGift: + ld a, BANK(sBackupMysteryGiftItem) + call OpenSRAM + ld hl, sBackupMysteryGiftItem + ld bc, sBackupMysteryGiftItemEnd - sBackupMysteryGiftItem + xor a + call ByteFill + jp CloseSRAM + +EraseHallOfFame: + ld a, BANK(sHallOfFame) + call OpenSRAM + ld hl, sHallOfFame + ld bc, sHallOfFameEnd - sHallOfFame + xor a + call ByteFill + jp CloseSRAM + +ValidateSave: + ld a, BANK(sCheckValue1) ; aka BANK(sCheckValue2) + call OpenSRAM + ld a, SAVE_CHECK_VALUE_1 + ld [sCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sCheckValue2], a + jp CloseSRAM + +SaveOptions: + ld a, BANK(sOptions) + call OpenSRAM + ld hl, wOptions + ld de, sOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + ld a, [wOptions] + and $ff ^ (1 << NO_TEXT_SCROLL) + ld [sOptions], a + jp CloseSRAM + +SavePlayerData: + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, wPlayerData + ld de, sPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, wCurMapData + ld de, sCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call CopyBytes + jp CloseSRAM + +SavePokemonData: + ld a, BANK(sPokemonData) + call OpenSRAM + ld hl, wPokemonData + ld de, sPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +SaveBox: + call GetBoxAddress + call SaveBoxAddress + ret + +SaveChecksum: + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call OpenSRAM + call Checksum + ld a, e + ld [sChecksum + 0], a + ld a, d + ld [sChecksum + 1], a + call CloseSRAM + ret + +ValidateBackupSave: + ld a, BANK(sBackupCheckValue1) ; aka BANK(sBackupCheckValue2) + call OpenSRAM + ld a, SAVE_CHECK_VALUE_1 + ld [sBackupCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sBackupCheckValue2], a + call CloseSRAM + ret + +SaveBackupOptions: + ld a, BANK(sBackupOptions) + call OpenSRAM + ld hl, wOptions + ld de, sBackupOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call CloseSRAM + ret + +SaveBackupPlayerData: + ld a, BANK(sBackupPlayerData3) + call OpenSRAM + ld hl, wPlayerData3 + ld de, sBackupPlayerData3 + ld bc, wPlayerData3End - wPlayerData3 + call CopyBytes + ld a, BANK(sBackupPlayerData1) + call OpenSRAM + ld hl, wPlayerData1 + ld de, sBackupPlayerData1 + ld bc, wPlayerData1End - wPlayerData1 + call CopyBytes + ld a, BANK(sBackupPlayerData2) + call OpenSRAM + ld hl, wPlayerData2 + ld de, sBackupPlayerData2 + ld bc, wPlayerData2End - wPlayerData2 + call CopyBytes + ld a, BANK(sBackupCurMapData) + call OpenSRAM + ld hl, wCurMapData + ld de, sBackupCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call CopyBytes + call CloseSRAM + ret + +SaveBackupPokemonData: + ld a, BANK(sBackupPokemonData) + call OpenSRAM + ld hl, wPokemonData + ld de, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +SaveBackupChecksum: + ld a, BANK(sBackupPlayerData3) + call OpenSRAM + ld hl, sBackupPlayerData3 + ld bc, wPlayerData3End - wPlayerData3 + call Checksum + push de + ld hl, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call Checksum + pop hl + add hl, de + ld a, BANK(sBackupPlayerData1) + call OpenSRAM + push hl + ld hl, sBackupPlayerData1 + ld bc, wPlayerData1End - wPlayerData1 + call Checksum + pop hl + add hl, de + ld a, BANK(sBackupPlayerData2) + call OpenSRAM + push hl + ld hl, sBackupPlayerData2 + ld bc, wPlayerData2End - wPlayerData2 + call Checksum + pop hl + add hl, de + ld a, BANK(sBackupCurMapData) + call OpenSRAM + push hl + ld hl, sBackupCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call Checksum + pop hl + add hl, de + ld a, l + ld [sBackupChecksum + 0], a + ld a, h + ld [sBackupChecksum + 1], a + call CloseSRAM + ret + +TryLoadSaveFile: + call VerifyChecksum + jr nz, .backup + call LoadPlayerData + call LoadPokemonData + call LoadBox + farcall RestorePartyMonMail + farcall RestoreMysteryGift + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + and a + ret + +.backup + call VerifyBackupChecksum + jr nz, .corrupt + call LoadBackupPlayerData + call LoadBackupPokemonData + call LoadBox + farcall RestorePartyMonMail + farcall RestoreMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveChecksum + and a + ret + +.corrupt + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + ld hl, SaveFileCorruptedText + call PrintText + pop af + ld [wOptions], a + scf + ret + +TryLoadSaveData: + xor a ; FALSE + ld [wSaveFileExists], a + call CheckPrimarySaveFile + ld a, [wSaveFileExists] + and a + jr z, .backup + + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + wStartDay - wPlayerData + ld de, wStartDay + ld bc, $e + call CopyBytes + call CloseSRAM + ret + +.backup + call CheckBackupSaveFile + ld a, [wSaveFileExists] + and a + jr z, .corrupt + + ld a, BANK(sBackupPlayerData1) + call OpenSRAM + ld hl, sBackupPlayerData1 + wStartDay - wPlayerData + ld de, wStartDay + ld bc, $e + call CopyBytes + call CloseSRAM + ret + +.corrupt + ld hl, DefaultOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call ClearClock + ret + +INCLUDE "data/default_options.asm" + +CheckPrimarySaveFile: + ld a, BANK(sCheckValue1) ; aka BANK(sCheckValue2) + call OpenSRAM + ld a, [sCheckValue1] + cp SAVE_CHECK_VALUE_1 + jr nz, .nope + ld a, [sCheckValue2] + cp SAVE_CHECK_VALUE_2 + jr nz, .nope + ld hl, sOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call CloseSRAM + call Function15011 + ld a, TRUE + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret + +CheckBackupSaveFile: + ld a, BANK(sBackupCheckValue1) ; aka BANK(sBackupCheckValue2) + call OpenSRAM + ld a, [sBackupCheckValue1] + cp SAVE_CHECK_VALUE_1 + jr nz, .nope + ld a, [sBackupCheckValue2] + cp SAVE_CHECK_VALUE_2 + jr nz, .nope + ld hl, sBackupOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call Function15011 + ld a, $2 + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret + +Function15011: + ld hl, wTextboxFlags + res 1, [hl] + ld a, [wOptions] + and 7 + cp 1 + ret z + + cp 3 + ret z + + cp 5 + ret z + + ld a, [wOptions] + and $f8 + or 3 + ld [wOptions], a + ret + +LoadPlayerData: + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, sCurMapData + ld de, wCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call CopyBytes + call CloseSRAM + ret + +LoadPokemonData: + ld a, BANK(sPokemonData) + call OpenSRAM + ld hl, sPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +LoadBox: + call GetBoxAddress + call LoadBoxAddress + ret + +VerifyChecksum: + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call OpenSRAM + call Checksum + ld a, [sChecksum + 0] + cp e + jr nz, .fail + ld a, [sChecksum + 1] + cp d +.fail + push af + call CloseSRAM + pop af + ret + +LoadBackupPlayerData: + ld a, BANK(sBackupPlayerData3) + call OpenSRAM + ld hl, sBackupPlayerData3 + ld de, wPlayerData3 + ld bc, wPlayerData3End - wPlayerData3 + call CopyBytes + + ld a, BANK(sBackupPlayerData1) + call OpenSRAM + ld hl, sBackupPlayerData1 + ld de, wPlayerData1 + ld bc, wPlayerData1End - wPlayerData1 + call CopyBytes + + ld a, BANK(sBackupPlayerData2) + call OpenSRAM + ld hl, sBackupPlayerData2 + ld de, wPlayerData2 + ld bc, wPlayerData2End - wPlayerData2 + call CopyBytes + + ld a, BANK(sBackupCurMapData) + call OpenSRAM + ld hl, sBackupCurMapData + ld de, wCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call CopyBytes + call CloseSRAM + ret + +LoadBackupPokemonData: + ld a, BANK(sBackupPokemonData) + call OpenSRAM + ld hl, sBackupPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +VerifyBackupChecksum: + ld a, BANK(sBackupPokemonData) + call OpenSRAM + ld hl, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call Checksum + push de + + ld hl, sBackupPlayerData3 + ld bc, wPlayerData3End - wPlayerData3 + call Checksum + pop hl + add hl, de + + ld a, BANK(sBackupPlayerData1) + call OpenSRAM + push hl + ld hl, sBackupPlayerData1 + ld bc, wPlayerData1End - wPlayerData1 + call Checksum + pop hl + add hl, de + + ld a, BANK(sBackupPlayerData2) + call OpenSRAM + push hl + ld hl, sBackupPlayerData2 + ld bc, wPlayerData2End - wPlayerData2 + call Checksum + pop hl + add hl, de + + ld a, BANK(sBackupCurMapData) + call OpenSRAM + push hl + ld hl, sBackupCurMapData + ld bc, wCurMapDataEnd - wCurMapData + call Checksum + pop hl + add hl, de + ld d, h + ld e, l + ld a, [sBackupChecksum + 0] + cp e + jr nz, .fail + ld a, [sBackupChecksum + 1] + cp d +.fail + push af + call CloseSRAM + pop af + ret + +GetBoxAddress: + ld a, [wCurBox] + cp NUM_BOXES + jr c, .ok + xor a + ld [wCurBox], a + +.ok + ld e, a + ld d, 0 + ld hl, BoxAddresses +rept 5 + add hl, de +endr + ld a, [hli] + push af + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + pop af + ret + +SaveBoxAddress: +; Save box via wBoxPartialData. +; We do this in three steps because the size of wBoxPartialData is less than +; the size of sBox. + push hl +; Load the first part of the active box. + push af + push de + ld a, BANK(sBox) + call OpenSRAM + ld hl, sBox + ld de, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + pop de + pop af +; Save it to the target box. + push af + push de + call OpenSRAM + ld hl, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + +; Load the second part of the active box. + ld a, BANK(sBox) + call OpenSRAM + ld hl, sBox + (wBoxPartialDataEnd - wBoxPartialData) + ld de, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wBoxPartialDataEnd - wBoxPartialData) + add hl, de + ld e, l + ld d, h +; Save it to the next part of the target box. + push af + push de + call OpenSRAM + ld hl, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + +; Load the third and final part of the active box. + ld a, BANK(sBox) + call OpenSRAM + ld hl, sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2 + ld de, wBoxPartialData + ld bc, sBoxEnd - (sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2) ; $8e + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wBoxPartialDataEnd - wBoxPartialData) + add hl, de + ld e, l + ld d, h +; Save it to the final part of the target box. + call OpenSRAM + ld hl, wBoxPartialData + ld bc, sBoxEnd - (sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret + +LoadBoxAddress: +; Load box via wBoxPartialData. +; We do this in three steps because the size of wBoxPartialData is less than +; the size of sBox. + push hl + ld l, e + ld h, d +; Load part 1 + push af + push hl + call OpenSRAM + ld de, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call OpenSRAM + ld hl, wBoxPartialData + ld de, sBox + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + pop hl + pop af + + ld de, (wBoxPartialDataEnd - wBoxPartialData) + add hl, de +; Load part 2 + push af + push hl + call OpenSRAM + ld de, wBoxPartialData + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call OpenSRAM + ld hl, wBoxPartialData + ld de, sBox + (wBoxPartialDataEnd - wBoxPartialData) + ld bc, (wBoxPartialDataEnd - wBoxPartialData) + call CopyBytes + call CloseSRAM + pop hl + pop af +; Load part 3 + ld de, (wBoxPartialDataEnd - wBoxPartialData) + add hl, de + call OpenSRAM + ld de, wBoxPartialData + ld bc, sBoxEnd - (sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2) ; $8e + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call OpenSRAM + ld hl, wBoxPartialData + ld de, sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2 + ld bc, sBoxEnd - (sBox + (wBoxPartialDataEnd - wBoxPartialData) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret + +EraseBoxes: + ld hl, BoxAddresses + ld c, NUM_BOXES +.next + push bc + ld a, [hli] + call OpenSRAM + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + xor a + ld [de], a + inc de + ld a, -1 + ld [de], a + inc de + ld bc, sBoxEnd - (sBox + 2) +.clear + xor a + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .clear + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, -1 + ld [de], a + inc de + xor a + ld [de], a + call CloseSRAM + pop bc + dec c + jr nz, .next + ret + +BoxAddresses: +; dbww bank, address, address + dbww BANK(sBox1), sBox1, sBox1End + dbww BANK(sBox2), sBox2, sBox2End + dbww BANK(sBox3), sBox3, sBox3End + dbww BANK(sBox4), sBox4, sBox4End + dbww BANK(sBox5), sBox5, sBox5End + dbww BANK(sBox6), sBox6, sBox6End + dbww BANK(sBox7), sBox7, sBox7End + dbww BANK(sBox8), sBox8, sBox8End + dbww BANK(sBox9), sBox9, sBox9End + dbww BANK(sBox10), sBox10, sBox10End + dbww BANK(sBox11), sBox11, sBox11End + dbww BANK(sBox12), sBox12, sBox12End + dbww BANK(sBox13), sBox13, sBox13End + dbww BANK(sBox14), sBox14, sBox14End + +Checksum: + ld de, 0 +.loop + ld a, [hli] + add e + ld e, a + ld a, 0 + adc d + ld d, a + dec bc + ld a, b + or c + jr nz, .loop + ret + +WouldYouLikeToSaveTheGameText: + text_far _WouldYouLikeToSaveTheGameText + text_end + +SavingDontTurnOffThePowerText: + text_far _SavingDontTurnOffThePowerText + text_end + +SavedTheGameText: + text_far _SavedTheGameText + text_end + +AlreadyASaveFileText: + text_far _AlreadyASaveFileText + text_end + +AnotherSaveFileText: + text_far _AnotherSaveFileText + text_end + +SaveFileCorruptedText: + text_far _SaveFileCorruptedText + text_end + +ChangeBoxSaveText: + text_far _ChangeBoxSaveText + text_end + +MoveMonWOMailSaveText: + text_far _MoveMonWOMailSaveText + text_end diff --git a/engine/movie/gamefreak_presents.asm b/engine/movie/gamefreak_presents.asm index 51c7d2ac..e71f26bf 100644 --- a/engine/movie/gamefreak_presents.asm +++ b/engine/movie/gamefreak_presents.asm @@ -70,7 +70,7 @@ GFPresents_Init: ; e49f3 (39:49f3) farcall ClearAnimatedObjectBuffer - ld hl, wAnimatedObjectDynamicVTileOffsets + ld hl, wSpriteAnimDict ld a, 6 ld [hli], a ld a, $8d diff --git a/engine/overworld/load_map_part.asm b/engine/overworld/load_map_part.asm new file mode 100644 index 00000000..da143640 --- /dev/null +++ b/engine/overworld/load_map_part.asm @@ -0,0 +1,36 @@ +_LoadMapPart:: + ld hl, wSurroundingTiles + ld a, [wMetatileStandingY] + and a + jr z, .top_row + ld bc, SURROUNDING_WIDTH * 2 + add hl, bc + +.top_row + ld a, [wMetatileStandingX] + and a + jr z, .left_column + inc hl + inc hl + +.left_column + decoord 0, 0 + ld b, SCREEN_HEIGHT +.loop + ld c, SCREEN_WIDTH +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + ld a, l + add METATILE_WIDTH + ld l, a + jr nc, .carry + inc h + +.carry + dec b + jr nz, .loop + ret diff --git a/engine/overworld/map_objects.asm b/engine/overworld/map_objects.asm index 87f422d5..8aab8d53 100755 --- a/engine/overworld/map_objects.asm +++ b/engine/overworld/map_objects.asm @@ -932,7 +932,7 @@ Function5730:: ; 5730 (1:5730) ld [wPlayerTurningDirection], a ld [wPlayerObjectStepFrame], a call Function574f - farcall Function14a44 + farcall CheckWarpFacingDown call c, Function5770 call Function5761 ret diff --git a/engine/overworld/player_step.asm b/engine/overworld/player_step.asm index 36698ed8..a946fca6 100755 --- a/engine/overworld/player_step.asm +++ b/engine/overworld/player_step.asm @@ -153,7 +153,7 @@ Functiond577: ; d577 (3:5577) or $98 ld [wd05c], a .asm_d58c - ld hl, wd07f + ld hl, wMetatileStandingY inc [hl] ld a, [hl] cp $2 @@ -184,7 +184,7 @@ Functiond5a8: ; d5a8 (3:55a8) or $98 ld [wd05c], a .asm_d5bd - ld hl, wd07f + ld hl, wMetatileStandingY dec [hl] ld a, [hl] cp $ff @@ -216,7 +216,7 @@ Functiond5db: ; d5db (3:55db) and $1f or d ld [wd05b], a - ld hl, wd080 + ld hl, wMetatileStandingX dec [hl] ld a, [hl] cp $ff @@ -245,7 +245,7 @@ Functiond604: ; d604 (3:5604) and $1f or d ld [wd05b], a - ld hl, wd080 + ld hl, wMetatileStandingX inc [hl] ld a, [hl] cp $2 diff --git a/engine/overworld/tile_events.asm b/engine/overworld/tile_events.asm new file mode 100644 index 00000000..bb566c99 --- /dev/null +++ b/engine/overworld/tile_events.asm @@ -0,0 +1,101 @@ +CheckWarpCollision:: +; Is this tile a warp? + ld a, [wPlayerStandingTile] + cp COLL_PIT + jr z, .warp + cp COLL_PIT_68 + jr z, .warp + and $f0 + cp HI_NYBBLE_WARPS + jr z, .warp + and a + ret + +.warp + scf + ret + +CheckDirectionalWarp:: +; If this is a directional warp, clear carry (press the designated button to warp). +; Else, set carry (immediate warp). + ld a, [wPlayerStandingTile] + cp COLL_WARP_CARPET_DOWN + jr z, .directional + cp COLL_WARP_CARPET_LEFT + jr z, .directional + cp COLL_WARP_CARPET_UP + jr z, .directional + cp COLL_WARP_CARPET_RIGHT + jr z, .directional + scf + ret + +.directional + xor a + ret + +CheckWarpFacingDown: + ld de, 1 + ld hl, .blocks + ld a, [wPlayerStandingTile] + call IsInArray + ret + +.blocks + db COLL_DOOR + db COLL_DOOR_79 + db COLL_STAIRCASE + db COLL_STAIRCASE_73 + db COLL_CAVE + db COLL_CAVE_74 + db COLL_WARP_PANEL + db COLL_DOOR_75 + db COLL_DOOR_7D + db -1 + +CheckGrassCollision:: + ld a, [wPlayerStandingTile] + ld hl, .blocks + ld de, 1 + call IsInArray + ret + +.blocks + db COLL_CUT_08 + db COLL_TALL_GRASS + db COLL_LONG_GRASS + db COLL_CUT_28 + db COLL_WATER + db COLL_GRASS_48 + db COLL_GRASS_49 + db COLL_GRASS_4A + db COLL_GRASS_4B + db COLL_GRASS_4C + db -1 + +CheckCutCollision: + ld a, c + ld hl, .blocks + ld de, 1 + call IsInArray + ret + +.blocks + db COLL_CUT_TREE + db COLL_CUT_TREE_1A + db COLL_TALL_GRASS_10 + db COLL_TALL_GRASS + db COLL_LONG_GRASS + db COLL_LONG_GRASS_1C + db -1 + +GetWarpSFX:: + ld a, [wPlayerStandingTile] + ld de, SFX_ENTER_DOOR + cp COLL_DOOR + ret z + ld de, SFX_WARP_TO + cp COLL_WARP_PANEL + ret z + ld de, SFX_EXIT_BUILDING + ret diff --git a/engine/pokemon/bills_pc_top.asm b/engine/pokemon/bills_pc_top.asm index 0ad87023..1dad31a6 100644 --- a/engine/pokemon/bills_pc_top.asm +++ b/engine/pokemon/bills_pc_top.asm @@ -112,7 +112,7 @@ BillsPC_MovePKMNMenu: jr .asm_e4cf .asm_e4bb - farcall StartMovePkmnWOMail_SaveGame ; 5:4bd2 + farcall StartMoveMonWOMail_SaveGame jr c, .asm_e4cf farcall MovePKMNWithoutMail_ ; 38:6f47 call ReturnToMapFromSubmenu @@ -282,7 +282,7 @@ Function65b4: add hl, bc ld b, a ld c, $0 - ld de, wMisc + ld de, wBoxPartialData ld a, b and a jr z, .asm_e645 diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm index 4f9bdcbb..bee827ba 100644 --- a/engine/rtc/rtc.asm +++ b/engine/rtc/rtc.asm @@ -73,7 +73,7 @@ StageRTCTimeForSave: ld [hli], a ret -UnreferencedSaveRTC: +SaveRTC: ld a, $a ld [MBC3SRamEnable], a call LatchClock @@ -89,7 +89,7 @@ UnreferencedSaveRTC: ret StartClock:: - call SaveRTC + call Function140b1 call GetClock call Function1409e call FixDays @@ -117,7 +117,7 @@ Function1409e: call RecordRTCStatus ; set bit 7 on sRTCStatusFlags ret -SaveRTC: +Function140b1: ld a, $a ld [MBC3SRamEnable], a call LatchClock |