diff options
author | mid-kid <esteve.varela@gmail.com> | 2018-03-25 16:18:33 +0200 |
---|---|---|
committer | mid-kid <esteve.varela@gmail.com> | 2018-03-25 16:18:33 +0200 |
commit | 0d9241889fc8a2f047b9fd6db25e55de1e721877 (patch) | |
tree | 4ae588ae9d97639b456e6d2ba64a94676ddcf703 /engine/menus | |
parent | 60e21a86638cad5fd25133cda1c545461304d902 (diff) |
Organize the engine/ directory, take 3
Renamed `title` to `movies`.
Moved some functions from `engine/routines/` to their fitting
directories, and cleaned up the base `engine/` directory.
Moved `engine/pokemon/tmhm.asm` back to `engine/items/`.
Made a new subdirectory:
* engine/tilesets: Contains all map-related graphics routines.
Diffstat (limited to 'engine/menus')
-rwxr-xr-x | engine/menus/debug.asm | 1447 | ||||
-rw-r--r-- | engine/menus/save.asm | 1210 | ||||
-rw-r--r-- | engine/menus/savemenu_copytilemapatonce.asm | 77 |
3 files changed, 2734 insertions, 0 deletions
diff --git a/engine/menus/debug.asm b/engine/menus/debug.asm new file mode 100755 index 000000000..4c3110fe1 --- /dev/null +++ b/engine/menus/debug.asm @@ -0,0 +1,1447 @@ + const_def $6a + const DEBUGTEST_UP_ARROW ; $6a + const DEBUGTEST_TICKS ; $6b + const DEBUGTEST_WHITE ; $6c + const DEBUGTEST_LIGHT ; $6d + const DEBUGTEST_DARK ; $6e + const DEBUGTEST_BLACK ; $6f + const DEBUGTEST_0 ; $70 + const DEBUGTEST_1 ; $71 + const DEBUGTEST_2 ; $72 + const DEBUGTEST_3 ; $73 + const DEBUGTEST_4 ; $74 + const DEBUGTEST_5 ; $75 + const DEBUGTEST_6 ; $76 + const DEBUGTEST_7 ; $77 + const DEBUGTEST_8 ; $78 + const DEBUGTEST_9 ; $79 + const DEBUGTEST_A ; $7a + const DEBUGTEST_B ; $7b + const DEBUGTEST_C ; $7c + const DEBUGTEST_D ; $7d + const DEBUGTEST_E ; $7e + const DEBUGTEST_F ; $7f + +ColorTest: ; 818ac +; A debug menu to test monster and trainer palettes at runtime. + + ld a, [hCGB] + and a + jr nz, .asm_818b5 + ld a, [hSGB] + and a + ret z + +.asm_818b5 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call DisableLCD + call Function81948 + call Function8197c + call Function819a7 + call Function818f4 + call EnableLCD + ld de, MUSIC_NONE + call PlayMusic + xor a + ld [wJumptableIndex], a + ld [wcf66], a + ld [wd003], a +.asm_818de + ld a, [wJumptableIndex] + bit 7, a + jr nz, .asm_818f0 + call Function81a74 + call Function81f5e + call DelayFrame + jr .asm_818de + +.asm_818f0 + pop af + ld [hInMenu], a + ret +; 818f4 + +Function818f4: ; 818f4 + ld a, [wd002] + and a + jr nz, Function81911 + ld hl, PokemonPalettes + +Function818fd: ; 818fd + ld de, wOverworldMap + ld c, NUM_POKEMON + 1 +.asm_81902 + push bc + push hl + call Function81928 + pop hl + ld bc, 8 + add hl, bc + pop bc + dec c + jr nz, .asm_81902 + ret + +Function81911: ; 81911 + ld hl, TrainerPalettes + ld de, wOverworldMap + ld c, NUM_TRAINER_CLASSES +.asm_81919 + push bc + push hl + call Function81928 + pop hl + ld bc, 4 + add hl, bc + pop bc + dec c + jr nz, .asm_81919 + ret +; 81928 + +Function81928: ; 81928 + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + ret +; 81948 + +Function81948: ; 81948 + ld a, $1 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + ld a, $0 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + call ClearSprites + ret +; 8197c + +Function8197c: ; 8197c + ld hl, DebugColorTestGFX + 1 tiles + ld de, vTiles2 tile DEBUGTEST_UP_ARROW + ld bc, 22 tiles + call CopyBytes + ld hl, DebugColorTestGFX + ld de, vTiles0 + ld bc, 1 tiles + call CopyBytes + call LoadStandardFont + ld hl, vTiles1 + lb bc, 8, 0 +.asm_8199d + ld a, [hl] + xor $ff + ld [hli], a + dec bc + ld a, c + or b + jr nz, .asm_8199d + ret +; 819a7 + +Function819a7: ; 819a7 + ld a, [hCGB] + and a + ret z + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, Palette_DebugBG + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + ld a, 1 << rBGPI_AUTO_INCREMENT + ld [rBGPI], a + ld hl, Palette_DebugBG + ld c, 8 palettes + xor a +.asm_819c8 + ld [rBGPD], a + dec c + jr nz, .asm_819c8 + ld a, 1 << rOBPI_AUTO_INCREMENT + ld [rOBPI], a + ld hl, Palette_DebugOB + ld c, 8 palettes +.asm_819d6 + ld a, [hli] + ld [rOBPD], a + dec c + jr nz, .asm_819d6 + ld a, $94 + ld [wc608], a + ld a, $52 + ld [wc608 + 1], a + ld a, $4a + ld [wc608 + 2], a + ld a, $29 + ld [wc608 + 3], a + pop af + ld [rSVBK], a + ret +; 819f4 + +Palette_DebugBG: ; 819f4 +INCLUDE "gfx/debug/bg.pal" + +Palette_DebugOB: ; 81a34 +INCLUDE "gfx/debug/ob.pal" +; 81a74 + +Function81a74: ; 81a74 + call JoyTextDelay + ld a, [wJumptableIndex] + cp $4 + jr nc, .asm_81a8b + ld hl, hJoyLast + ld a, [hl] + and SELECT + jr nz, .asm_81a9a + ld a, [hl] + and START + jr nz, .asm_81aab + +.asm_81a8b + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, Jumptable_81acf + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.asm_81a9a + call Function81eca + call Function81ac3 + ld e, a + ld a, [wcf66] + inc a + cp e + jr c, .asm_81aba + xor a + jr .asm_81aba + +.asm_81aab + call Function81eca + ld a, [wcf66] + dec a + cp $ff + jr nz, .asm_81aba + call Function81ac3 + dec a + +.asm_81aba + ld [wcf66], a + ld a, $0 + ld [wJumptableIndex], a + ret +; 81ac3 + +Function81ac3: ; 81ac3 +; Looping back around the pic set. + ld a, [wd002] + and a + jr nz, .asm_81acc + ld a, NUM_POKEMON ; CELEBI + ret + +.asm_81acc + ld a, NUM_TRAINER_CLASSES - 1 ; MYSTICALMAN + ret +; 81acf + +Jumptable_81acf: ; 81acf + dw Function81adb + dw Function81c18 + dw Function81c33 + dw Function81cc2 + dw Function81d8e + dw Function81daf +; 81adb + +Function81adb: ; 81adb + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 1, 3 + lb bc, 7, 18 + ld a, DEBUGTEST_WHITE + call Bank20_FillBoxWithByte + hlcoord 11, 0 + lb bc, 2, 3 + ld a, DEBUGTEST_LIGHT + call Bank20_FillBoxWithByte + hlcoord 16, 0 + lb bc, 2, 3 + ld a, DEBUGTEST_DARK + call Bank20_FillBoxWithByte + call Function81bc0 + call Function81bf4 + ld a, [wcf66] + inc a + ld [wCurPartySpecies], a + ld [wd265], a + hlcoord 0, 1 + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + ld a, [wd002] + and a + jr nz, .asm_81b7a + ld a, $1 + ld [wUnownLetter], a + call GetPokemonName + hlcoord 4, 1 + call PlaceString + xor a + ld [wBoxAlignment], a + hlcoord 12, 3 + call _PrepMonFrontpic + ld de, vTiles2 tile $31 + predef GetMonBackpic + ld a, $31 + ld [hGraphicStartTile], a + hlcoord 2, 4 + lb bc, 6, 6 + predef PlaceGraphic + ld a, [wd003] + and a + jr z, .asm_81b66 + ld de, String_81baf + jr .asm_81b69 + +.asm_81b66 + ld de, String_81bb4 + +.asm_81b69 + hlcoord 7, 17 + call PlaceString + hlcoord 0, 17 + ld de, String_81bb9 + call PlaceString + jr .asm_81ba9 + +.asm_81b7a + ld a, [wd265] + ld [wTrainerClass], a + callfar GetTrainerAttributes + ld de, wStringBuffer1 + hlcoord 4, 1 + call PlaceString + ld de, vTiles2 + callfar GetTrainerPic + xor a + ld [wTempEnemyMonSpecies], a + ld [hGraphicStartTile], a + hlcoord 2, 3 + lb bc, 7, 7 + predef PlaceGraphic + +.asm_81ba9 + ld a, $1 + ld [wJumptableIndex], a + ret +; 81baf + +String_81baf: db "レア", DEBUGTEST_BLACK, DEBUGTEST_BLACK, "@" ; rare (shiny) +String_81bb4: db "ノーマル@" ; normal +String_81bb9: db DEBUGTEST_A, "きりかえ▶@" ; (A) switches +; 81bc0 + +Function81bc0: ; 81bc0 + decoord 0, 11, wAttrMap + hlcoord 2, 11 + ld a, $1 + call Function81bde + decoord 0, 13, wAttrMap + hlcoord 2, 13 + ld a, $2 + call Function81bde + decoord 0, 15, wAttrMap + hlcoord 2, 15 + ld a, $3 + +Function81bde: ; 81bde + push af + ld a, DEBUGTEST_UP_ARROW + ld [hli], a + ld bc, $f + ld a, DEBUGTEST_TICKS + call ByteFill + ld l, e + ld h, d + pop af + ld bc, $28 + call ByteFill + ret +; 81bf4 + +Function81bf4: ; 81bf4 + ld a, [wcf66] + inc a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, wOverworldMap + add hl, de + ld de, wc608 + ld bc, 4 + call CopyBytes + xor a + ld [wcf64], a + ld [wcf65], a + ld de, wc608 + call Function81ea5 + ret +; 81c18 + +Function81c18: ; 81c18 + ld a, [hCGB] + and a + jr z, .asm_81c2a + ld a, $2 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + +.asm_81c2a + call WaitBGMap + ld a, $2 + ld [wJumptableIndex], a + ret +; 81c33 + +Function81c33: ; 81c33 + ld a, [hCGB] + and a + jr z, .asm_81c69 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld de, wc608 + ld c, $1 + call Function81ee3 + hlcoord 10, 2 + ld de, wc608 + call Function81ca7 + hlcoord 15, 2 + ld de, wc608 + 2 + call Function81ca7 + ld a, $1 + ld [hCGBPalUpdate], a + ld a, $3 + ld [wJumptableIndex], a + pop af + ld [rSVBK], a + ret + +.asm_81c69 + ld hl, wSGBPals + ld a, 1 + ld [hli], a + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + ld a, [wc608] + ld [hli], a + ld a, [wc608 + 1] + ld [hli], a + ld a, [wc608 + 2] + ld [hli], a + ld a, [wc608 + 3] + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wSGBPals + call Function81f0c + hlcoord 10, 2 + ld de, wc608 + call Function81ca7 + hlcoord 15, 2 + ld de, wc608 + 2 + call Function81ca7 + ld a, $3 + ld [wJumptableIndex], a + ret +; 81ca7 + +Function81ca7: ; 81ca7 + inc hl + inc hl + inc hl + ld a, [de] + call Function81cbc + ld a, [de] + swap a + call Function81cbc + inc de + ld a, [de] + call Function81cbc + ld a, [de] + swap a + +Function81cbc: ; 81cbc + and $f + add DEBUGTEST_0 + ld [hld], a + ret +; 81cc2 + +Function81cc2: ; 81cc2 + ld a, [hJoyLast] + and B_BUTTON + jr nz, .asm_81cdf + ld a, [hJoyLast] + and A_BUTTON + jr nz, .asm_81ce5 + ld a, [wcf64] + and $3 + ld e, a + ld d, 0 + ld hl, Jumptable_81d02 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.asm_81cdf + ld a, $4 + ld [wJumptableIndex], a + ret + +.asm_81ce5 + ld a, [wd002] + and a + ret nz + ld a, [wd003] + xor $4 + ld [wd003], a + ld c, a + ld b, 0 + ld hl, PokemonPalettes + add hl, bc + call Function818fd + ld a, $0 + ld [wJumptableIndex], a + ret +; 81d02 + +Jumptable_81d02: ; 81d02 + dw Function81d0a + dw Function81d34 + dw Function81d46 + dw Function81d58 +; 81d0a + +Function81d0a: ; 81d0a + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_LEFT + jr nz, .asm_81d1d + ld a, [hl] + and D_RIGHT + jr nz, .asm_81d28 + ret + +.asm_81d1d + xor a + ld [wcf65], a + ld de, wc608 + call Function81ea5 + ret + +.asm_81d28 + ld a, $1 + ld [wcf65], a + ld de, wc608 + 2 + call Function81ea5 + ret + +Function81d34: ; 81d34 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 10 + jr Function81d63 + +Function81d46: ; 81d46 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 11 + jr Function81d63 + +Function81d58: ; 81d58 + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 12 + +Function81d63: ; 81d63 + ld a, [hJoyLast] + and D_RIGHT + jr nz, Function81d70 + ld a, [hJoyLast] + and D_LEFT + jr nz, Function81d77 + ret + +Function81d70: ; 81d70 + ld a, [hl] + cp $1f + ret nc + inc [hl] + jr Function81d7b + +Function81d77: ; 81d77 + ld a, [hl] + and a + ret z + dec [hl] + +Function81d7b: ; 81d7b + call Function81e67 + ld a, $2 + ld [wJumptableIndex], a + ret + +Function81d84: ; 81d84 + ld hl, wcf64 + dec [hl] + ret + +Function81d89: ; 81d89 + ld hl, wcf64 + inc [hl] + ret +; 81d8e + +Function81d8e: ; 81d8e + hlcoord 0, 10 + ld bc, $a0 + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 2, 12 + ld de, String_81fcd + call PlaceString + xor a + ld [wd004], a + call Function81df4 + ld a, $5 + ld [wJumptableIndex], a + ret +; 81daf + +Function81daf: ; 81daf + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .asm_81dbb + call Function81dc7 + ret + +.asm_81dbb + ld a, $0 + ld [wJumptableIndex], a + ret +; 81dc1 + +Function81dc1: ; 81dc1 + ld hl, wJumptableIndex + set 7, [hl] + ret +; 81dc7 + +Function81dc7: ; 81dc7 + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .asm_81dd5 + ld a, [hl] + and D_DOWN + jr nz, .asm_81de2 + ret + +.asm_81dd5 + ld a, [wd004] + cp $3b + jr z, .asm_81ddf + inc a + jr .asm_81ded + +.asm_81ddf + xor a + jr .asm_81ded + +.asm_81de2 + ld a, [wd004] + and a + jr z, .asm_81deb + dec a + jr .asm_81ded + +.asm_81deb + ld a, $3b + +.asm_81ded + ld [wd004], a + call Function81df4 + ret +; 81df4 + +Function81df4: ; 81df4 + hlcoord 10, 11 + call Function81e5e + hlcoord 10, 12 + call Function81e5e + hlcoord 10, 13 + call Function81e5e + hlcoord 10, 14 + call Function81e5e + ld a, [wd004] + inc a + ld [wd265], a + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + hlcoord 10, 12 + call PlaceString + ld a, [wd004] + call Function81e55 + ld [wCurItem], a + predef CanLearnTMHMMove + ld a, c + and a + ld de, String_81e46 + jr nz, .asm_81e3f + ld de, String_81e4d + +.asm_81e3f + hlcoord 10, 14 + call PlaceString + ret +; 81e46 + +String_81e46: db "おぼえられる@" ; can be taught +String_81e4d: db "おぼえられない@" ; cannot be taught +; 81e55 + +Function81e55: ; 81e55 + cp $32 + jr c, .asm_81e5b + inc a + inc a + +.asm_81e5b + add $bf + ret +; 81e5e + +Function81e5e: ; 81e5e + ld bc, 10 + ld a, DEBUGTEST_BLACK + call ByteFill + ret +; 81e67 + +Function81e67: ; 81e67 + ld a, [wc608 + 10] + and $1f + ld e, a + ld a, [wc608 + 11] + and $7 + sla a + swap a + or e + ld e, a + ld a, [wc608 + 11] + and $18 + sla a + swap a + ld d, a + ld a, [wc608 + 12] + and $1f + sla a + sla a + or d + ld d, a + ld a, [wcf65] + and a + jr z, .asm_81e9c + ld a, e + ld [wc608 + 2], a + ld a, d + ld [wc608 + 3], a + ret + +.asm_81e9c + ld a, e + ld [wc608], a + ld a, d + ld [wc608 + 1], a + ret +; 81ea5 + +Function81ea5: ; 81ea5 + ld a, [de] + and $1f + ld [wc608 + 10], a + ld a, [de] + and $e0 + swap a + srl a + ld b, a + inc de + ld a, [de] + and $3 + swap a + srl a + or b + ld [wc608 + 11], a + ld a, [de] + and $7c + srl a + srl a + ld [wc608 + 12], a + ret +; 81eca + +Function81eca: ; 81eca + ld a, [wcf66] + inc a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, wOverworldMap + add hl, de + ld e, l + ld d, h + ld hl, wc608 + ld bc, 4 + call CopyBytes + ret +; 81ee3 + +Function81ee3: ; 81ee3 +.asm_81ee3 + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + xor a + ld [hli], a + ld [hli], a + dec c + jr nz, .asm_81ee3 + ret +; 81efc + +Bank20_FillBoxWithByte: ; 81efc +; For some reason, we have another copy of FillBoxWithByte here +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; 81f0c + +Function81f0c: ; 81f0c + ld a, [wcfbe] + push af + set 7, a + ld [wcfbe], a + call Function81f1d + pop af + ld [wcfbe], a + ret +; 81f1d + +Function81f1d: ; 81f1d + ld a, [hl] + and $7 + ret z + ld b, a +.asm_81f22 + push bc + xor a + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + ld b, $10 +.asm_81f2c + ld e, $8 + ld a, [hli] + ld d, a +.asm_81f30 + bit 0, d + ld a, $10 + jr nz, .asm_81f38 + ld a, $20 + +.asm_81f38 + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + rr d + dec e + jr nz, .asm_81f30 + dec b + jr nz, .asm_81f2c + ld a, $20 + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + ld de, 7000 +.asm_81f51 + nop + nop + nop + dec de + ld a, d + or e + jr nz, .asm_81f51 + pop bc + dec b + jr nz, .asm_81f22 + ret +; 81f5e + +Function81f5e: ; 81f5e + ld a, DEBUGTEST_BLACK + hlcoord 10, 0 + ld [hl], a + hlcoord 15, 0 + ld [hl], a + hlcoord 1, 11 + ld [hl], a + hlcoord 1, 13 + ld [hl], a + hlcoord 1, 15 + ld [hl], a + ld a, [wJumptableIndex] + cp $3 + jr nz, .asm_81fc9 + ld a, [wcf64] + and a + jr z, .asm_81f8d + dec a + hlcoord 1, 11 + ld bc, 2 * SCREEN_WIDTH + call AddNTimes + ld [hl], $ed + +.asm_81f8d + ld a, [wcf65] + and a + jr z, .asm_81f98 + hlcoord 15, 0 + jr .asm_81f9b + +.asm_81f98 + hlcoord 10, 0 + +.asm_81f9b + ld [hl], $ed + ld b, $70 + ld c, $5 + ld hl, wVirtualOAM + ld de, wc608 + 10 + call .asm_81fb7 + ld de, wc608 + 11 + call .asm_81fb7 + ld de, wc608 + 12 + call .asm_81fb7 + ret + +.asm_81fb7 + ld a, b + ld [hli], a ; y + ld a, [de] + add a + add a + add 3 * TILE_WIDTH + ld [hli], a ; x + xor a + ld [hli], a ; tile id + ld a, c + ld [hli], a ; attributes + ld a, 2 * TILE_WIDTH + add b + ld b, a + inc c + ret + +.asm_81fc9 + call ClearSprites + ret +; 81fcd + +String_81fcd: ; 81fcd + db "おわりますか?" ; Are you finished? + next "はい<DOT><DOT><DOT>", DEBUGTEST_A ; YES...(A) + next "いいえ<DOT><DOT>", DEBUGTEST_B ; NO..(B) + db "@" +; 81fe3 + +DebugColorTestGFX: +INCBIN "gfx/debug/color_test.2bpp" + + +TilesetColorTest: + ret + xor a + ld [wJumptableIndex], a + ld [wcf64], a + ld [wcf65], a + ld [wcf66], a + ld [hMapAnims], a + call ClearSprites + call OverworldTextModeSwitch + call WaitBGMap2 + xor a + ld [hBGMapMode], a + ld de, DebugColorTestGFX + 1 tiles + ld hl, vTiles2 tile DEBUGTEST_UP_ARROW + lb bc, BANK(DebugColorTestGFX), 22 + call Request2bpp + ld de, DebugColorTestGFX + ld hl, vTiles1 + lb bc, BANK(DebugColorTestGFX), 1 + call Request2bpp + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $7 + call ByteFill + ld de, $15 + ld a, DEBUGTEST_WHITE + call Function821d2 + ld de, $1a + ld a, DEBUGTEST_LIGHT + call Function821d2 + ld de, $1f + ld a, DEBUGTEST_DARK + call Function821d2 + ld de, $24 + ld a, DEBUGTEST_BLACK + call Function821d2 + call Function821f4 + call Function8220f + call WaitBGMap2 + ld [wJumptableIndex], a + ld a, $40 + ld [hWY], a + ret +; 821d2 + +Function821d2: ; 821d2 + hlcoord 0, 0 + call Function821de + +Function821d8: ; 821d8 + ld a, [wcf64] + hlcoord 0, 0, wAttrMap + +Function821de: ; 821de + add hl, de +rept 4 + ld [hli], a +endr + ld bc, $10 + add hl, bc +rept 4 + ld [hli], a +endr + ld bc, $10 + add hl, bc +rept 4 + ld [hli], a +endr + ret +; 821f4 + +Function821f4: ; 821f4 + hlcoord 2, 4 + call Function82203 + hlcoord 2, 6 + call Function82203 + hlcoord 2, 8 + +Function82203: ; 82203 + ld a, DEBUGTEST_UP_ARROW + ld [hli], a + ld bc, $10 - 1 + ld a, DEBUGTEST_TICKS + call ByteFill + ret +; 8220f + +Function8220f: ; 8220f + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld a, [wcf64] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + add hl, hl + ld de, wBGPals1 + add hl, de + ld de, wc608 + ld bc, 8 + call CopyBytes + ld de, wc608 + call Function81ea5 + pop af + ld [rSVBK], a + ret +; 82236 + + +Function82236: ; 82236 + ld hl, hJoyLast + ld a, [hl] + and SELECT + jr nz, .loop7 + ld a, [hl] + and B_BUTTON + jr nz, .asm_82299 + call Function822f0 + ret + +.loop7 + ld hl, wcf64 + ld a, [hl] + inc a + and $7 + cp $7 + jr nz, .asm_82253 + xor a + +.asm_82253 + ld [hl], a + ld de, $15 + call Function821d8 + ld de, $1a + call Function821d8 + ld de, $1f + call Function821d8 + ld de, $24 + call Function821d8 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld a, [wcf64] + ld bc, 1 palettes + call AddNTimes + ld de, wc608 + ld bc, 1 palettes + call CopyBytes + pop af + ld [rSVBK], a + ld a, $2 + ld [hBGMapMode], a + ld c, 3 + call DelayFrames + ld a, $1 + ld [hBGMapMode], a + ret + +.asm_82299 + call ClearSprites + ld a, [hWY] + xor $d0 + ld [hWY], a + ret +; 822a3 + +Function822a3: ; 822a3 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld a, [wcf64] + ld bc, 1 palettes + call AddNTimes + ld e, l + ld d, h + ld hl, wc608 + ld bc, 1 palettes + call CopyBytes + hlcoord 1, 0 + ld de, wc608 + call Function81ca7 + hlcoord 6, 0 + ld de, wc608 + 2 + call Function81ca7 + hlcoord 11, 0 + ld de, wc608 + 4 + call Function81ca7 + hlcoord 16, 0 + ld de, wc608 + 6 + call Function81ca7 + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + call DelayFrame + ret +; 822f0 + +Function822f0: ; 822f0 + ld a, [wcf65] + and 3 + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 82301 + +.dw ; 82301 + dw Function82309 + dw Function82339 + dw Function8234b + dw Function8235d +; 82309 + +Function82309: ; 82309 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_LEFT + jr nz, .asm_8231c + ld a, [hl] + and D_RIGHT + jr nz, .asm_82322 + ret + +.asm_8231c + ld a, [wcf66] + dec a + jr .asm_82326 + +.asm_82322 + ld a, [wcf66] + inc a + +.asm_82326 + and $3 + ld [wcf66], a + ld e, a + ld d, $0 + ld hl, wc608 + add hl, de + add hl, de + ld e, l + ld d, h + call Function81ea5 + ret + +Function82339: ; 82338 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 10 + jr Function82368 + +Function8234b: ; 8234b + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 11 + jr Function82368 + +Function8235d: ; 8235d + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 12 + +Function82368: ; 82368 + ld a, [hJoyLast] + and D_RIGHT + jr nz, .asm_82375 + ld a, [hJoyLast] + and D_LEFT + jr nz, .asm_8237c + ret + +.asm_82375 + ld a, [hl] + cp $1f + ret nc + inc [hl] + jr .asm_82380 + +.asm_8237c + ld a, [hl] + and a + ret z + dec [hl] + +.asm_82380 + call Function82391 + call Function822a3 + ret + +Function82387: ; 82387 + ld hl, wcf65 + dec [hl] + ret + +Function8238c: ; 8238c + ld hl, wcf65 + inc [hl] + ret +; 82391 + +Function82391: ; 82391 + ld a, [wc608 + 10] + and $1f + ld e, a + ld a, [wc608 + 11] + and $7 + sla a + swap a + or e + ld e, a + ld a, [wc608 + 11] + and $18 + sla a + swap a + ld d, a + ld a, [wc608 + 12] + and $1f + sla a + sla a + or d + ld d, a + ld a, [wcf66] + ld c, a + ld b, $0 + ld hl, wc608 + add hl, bc + add hl, bc + ld a, e + ld [hli], a + ld [hl], d + ret +; 823c6 + +Function823c6: ; 823c6 + ret + +Function823c7: ; 823c7 + ret +; 823c8 diff --git a/engine/menus/save.asm b/engine/menus/save.asm new file mode 100644 index 000000000..7984c1612 --- /dev/null +++ b/engine/menus/save.asm @@ -0,0 +1,1210 @@ +SaveMenu: ; 14a1a + call LoadStandardMenuHeader + farcall DisplaySaveInfoOnSave + call SpeechTextBox + call UpdateSprites + farcall SaveMenu_CopyTilemapAtOnce + ld hl, Text_WouldYouLikeToSaveTheGame + 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 ret_d90 + farcall SaveMenu_CopyTilemapAtOnce + scf + ret + +SaveAfterLinkTrade: ; 14a58 + call PauseGameLogic + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call SavePokemonData + call SaveChecksum + call SaveBackupPokemonData + call SaveBackupChecksum + farcall BackupPartyMonMail + farcall SaveRTC + call ResumeGameLogic + ret +; 14a83 + + +ChangeBoxSaveGame: ; 14a83 (5:4a83) + push de + ld hl, Text_SaveOnBoxSwitch + call MenuTextBox + call YesNoBox + call ExitMenu + jr c, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SavingDontTurnOffThePower + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call SavedTheGame + call ResumeGameLogic + and a + ret +.refused + pop de + ret + +Link_SaveGame: ; 14ab2 + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call _SavingDontTurnOffThePower + call ResumeGameLogic + and a + +.refused + ret +; 14ac2 + +MoveMonWOMail_SaveGame: ; 14ac2 + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call ResumeGameLogic + ret +; 14ad5 + +MoveMonWOMail_InsertMon_SaveGame: ; 14ad5 + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + ld a, $1 + 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 BackupMobileEventIndex + farcall SaveRTC + call LoadBox + call ResumeGameLogic + ld de, SFX_SAVE + call PlaySFX + ld c, 24 + call DelayFrames + ret +; 14b34 + +StartMoveMonWOMail_SaveGame: ; 14b34 + ld hl, Text_SaveOnMoveMonWOMail + 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 +; 14b54 + +PauseGameLogic: ; 14b54 + ld a, $1 + ld [wGameLogicPaused], a + ret +; 14b5a + +ResumeGameLogic: ; 14b5a + xor a + ld [wGameLogicPaused], a + ret +; 14b5f + + +AddHallOfFameEntry: ; 14b5f + ld a, BANK(sHallOfFame) + call GetSRAMBank + 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, wOverworldMap + ld de, sHallOfFame + ld bc, HOF_LENGTH + call CopyBytes + call CloseSRAM + ret +; 14b85 + +SaveGameData: ; 14b85 + call SaveGameData_ + ret +; 14b89 + +AskOverwriteSaveFile: ; 14b89 + ld a, [wSaveFileExists] + and a + jr z, .erase + call CompareLoadedAndSavedPlayerID + jr z, .yoursavefile + ld hl, Text_AnotherSaveFile + call SaveTheGame_yesorno + jr nz, .refused + jr .erase + +.yoursavefile + ld hl, Text_AlreadyASaveFile + call SaveTheGame_yesorno + jr nz, .refused + jr .ok + +.erase + call ErasePreviousSave + +.ok + and a + ret + +.refused + scf + ret +; 14baf + +SaveTheGame_yesorno: ; 14baf + ld b, BANK(Text_WouldYouLikeToSaveTheGame) + call MapTextbox + call LoadMenuTextBox + lb bc, 0, 7 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call CloseWindow + push af + call ret_d90 + pop af + and a + ret +; 14bcb + +CompareLoadedAndSavedPlayerID: ; 14bcb + ld a, BANK(sPlayerData) + call GetSRAMBank + 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 +; 14be3 + +_SavingDontTurnOffThePower: ; 14be3 + call SavingDontTurnOffThePower +SavedTheGame: ; 14be6 + call SaveGameData_ + ; wait 32 frames + ld c, $20 + call DelayFrames + ; copy the original text speed setting to the stack + ld a, [wOptions] + push af + ; set text speed super slow + ld a, 3 + ld [wOptions], a + ; <PLAYER> saved the game! + ld hl, Text_PlayerSavedTheGame + 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, $1e + call DelayFrames + ret +; 14c10 + + +SaveGameData_: ; 14c10 + ld a, 1 + 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 BackupMobileEventIndex + farcall SaveRTC + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + ld a, [sBattleTowerChallengeState] + cp BATTLETOWER_RECEIVED_REWARD + jr nz, .ok + xor a + ld [sBattleTowerChallengeState], a +.ok + call CloseSRAM + ret +; 14c6b + +UpdateStackTop: ; 14c6b +; sStackTop appears to be unused. +; It could have been used to debug stack overflow during saving. + call FindStackTop + ld a, BANK(sStackTop) + call GetSRAMBank + 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 +; 14c90 + +FindStackTop: ; 14c90 +; Find the furthest point that sp has traversed to. +; This is distinct from the current value of sp. + ld hl, wStack - $ff +.loop + ld a, [hl] + or a + ret nz + inc hl + jr .loop +; 14c99 + +SavingDontTurnOffThePower: ; 14c99 + ; Prevent joypad interrupts + xor a + ld [hJoypadReleased], a + ld [hJoypadPressed], a + ld [hJoypadSum], a + ld [hJoypadDown], a + ; Save the text speed setting to the stack + ld a, [wOptions] + push af + ; Set the text speed to super slow + ld a, $3 + ld [wOptions], a + ; SAVING... DON'T TURN OFF THE POWER. + ld hl, Text_SavingDontTurnOffThePower + call PrintText + ; Restore the text speed setting + pop af + ld [wOptions], a + ; Wait for 16 frames + ld c, $10 + call DelayFrames + ret +; 14cbb + + +ErasePreviousSave: ; 14cbb + call EraseBoxes + call EraseHallOfFame + call EraseLinkBattleStats + call EraseMysteryGift + call SaveData + call EraseBattleTowerStatus + ld a, BANK(sStackTop) + call GetSRAMBank + xor a + ld [sStackTop + 0], a + ld [sStackTop + 1], a + call CloseSRAM + ld a, $1 + ld [wSavedAtLeastOnce], a + ret +; 14ce2 + +EraseLinkBattleStats: ; 14ce2 + ld a, BANK(sLinkBattleStats) + call GetSRAMBank + ld hl, sLinkBattleStats + ld bc, sLinkBattleStatsEnd - sLinkBattleStats + xor a + call ByteFill + jp CloseSRAM +; 14cf4 + +EraseMysteryGift: ; 14cf4 + ld a, BANK(sBackupMysteryGiftItem) + call GetSRAMBank + ld hl, sBackupMysteryGiftItem + ld bc, sBackupMysteryGiftItemEnd - sBackupMysteryGiftItem + xor a + call ByteFill + jp CloseSRAM +; 14d06 + +EraseHallOfFame: ; 14d06 + ld a, BANK(sHallOfFame) + call GetSRAMBank + ld hl, sHallOfFame + ld bc, sHallOfFameEnd - sHallOfFame + xor a + call ByteFill + jp CloseSRAM +; 14d18 + +Unreferenced_Function14d18: ; 14d18 +; copy .Data to SRA4:a007 + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld hl, .Data + ld de, $a007 ; address of MBC30 bank + ld bc, .DataEnd - .Data + call CopyBytes + jp CloseSRAM +; 14d2c + +.Data: ; 14d2c + db $0d, $02, $00, $05, $00, $00 + db $22, $02, $01, $05, $00, $00 + db $03, $04, $05, $08, $03, $05 + db $0e, $06, $03, $02, $00, $00 + db $39, $07, $07, $04, $00, $05 + db $04, $07, $01, $05, $00, $00 + db $0f, $05, $14, $07, $05, $05 + db $11, $0c, $0c, $06, $06, $04 +; 14d5c +.DataEnd + +EraseBattleTowerStatus: ; 14d5c + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + xor a + ld [sBattleTowerChallengeState], a + jp CloseSRAM +; 14d68 + +SaveData: ; 14d68 + call _SaveData + ret +; 14d6c + +Unreferenced_Function14d6c: ; 14d6c + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld a, [$a60b] ; address of MBC30 bank + ld b, $0 + and a + jr z, .ok + ld b, $2 + +.ok + ld a, b + ld [$a60b], a ; address of MBC30 bank + call CloseSRAM + ret +; 14d83 + +Unreferenced_Function14d83: ; 14d83 + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + xor a + ld [$a60c], a ; address of MBC30 bank + ld [$a60d], a ; address of MBC30 bank + call CloseSRAM + ret +; 14d93 + +Unreferenced_Function14d93: ; 14d93 + ld a, 7 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + xor a + ld [$a000], a ; address of MBC30 bank + call CloseSRAM + ret +; 14da0 + + +HallOfFame_InitSaveIfNeeded: ; 14da0 + ld a, [wSavedAtLeastOnce] + and a + ret nz + call ErasePreviousSave + ret +; 14da9 + +ValidateSave: ; 14da9 + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) + call GetSRAMBank + ld a, SAVE_CHECK_VALUE_1 + ld [sCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sCheckValue2], a + jp CloseSRAM +; 14dbb + +SaveOptions: ; 14dbb + ld a, BANK(sOptions) + call GetSRAMBank + 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 +; 14dd7 + +SavePlayerData: ; 14dd7 + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, wPlayerData + ld de, sPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, wCurrMapData + ld de, sCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + jp CloseSRAM +; 14df7 + +SavePokemonData: ; 14df7 + ld a, BANK(sPokemonData) + call GetSRAMBank + ld hl, wPokemonData + ld de, sPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 14e0c + +SaveBox: ; 14e0c + call GetBoxAddress + call SaveBoxAddress + ret +; 14e13 + +SaveChecksum: ; 14e13 + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call GetSRAMBank + call Checksum + ld a, e + ld [sChecksum + 0], a + ld a, d + ld [sChecksum + 1], a + call CloseSRAM + ret +; 14e2d + +ValidateBackupSave: ; 14e2d + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) + call GetSRAMBank + ld a, SAVE_CHECK_VALUE_1 + ld [sBackupCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sBackupCheckValue2], a + call CloseSRAM + ret +; 14e40 + +SaveBackupOptions: ; 14e40 + ld a, BANK(sBackupOptions) + call GetSRAMBank + ld hl, wOptions + ld de, sBackupOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call CloseSRAM + ret +; 14e55 + +SaveBackupPlayerData: ; 14e55 + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, wPlayerData + ld de, sBackupPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, wCurrMapData + ld de, sBackupCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ret +; 14e76 + +SaveBackupPokemonData: ; 14e76 + ld a, BANK(sBackupPokemonData) + call GetSRAMBank + ld hl, wPokemonData + ld de, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 14e8b + +SaveBackupChecksum: ; 14e8b + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) + call GetSRAMBank + call Checksum + ld a, e + ld [sBackupChecksum + 0], a + ld a, d + ld [sBackupChecksum + 1], a + call CloseSRAM + ret +; 14ea5 + + +TryLoadSaveFile: ; 14ea5 (5:4ea5) + call VerifyChecksum + jr nz, .backup + call LoadPlayerData + call LoadPokemonData + call LoadBox + farcall RestorePartyMonMail + farcall RestoreMobileEventIndex + 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 RestoreMobileEventIndex + 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, Text_SaveFileCorrupted + call PrintText + pop af + ld [wOptions], a + scf + ret + + +TryLoadSaveData: ; 14f1c + xor a + ld [wSaveFileExists], a + call CheckPrimarySaveFile + ld a, [wSaveFileExists] + and a + jr z, .backup + + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + wStartDay - wPlayerData + ld de, wStartDay + ld bc, 8 + call CopyBytes + ld hl, sPlayerData + wStatusFlags - wPlayerData + ld de, wStatusFlags + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.backup + call CheckBackupSaveFile + ld a, [wSaveFileExists] + and a + jr z, .corrupt + + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, sBackupPlayerData + wStartDay - wPlayerData + ld de, wStartDay + ld bc, 8 + call CopyBytes + ld hl, sBackupPlayerData + wStatusFlags - wPlayerData + ld de, wStatusFlags + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.corrupt + ld hl, DefaultOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call PanicResetClock + ret +; 14f7c + + +INCLUDE "data/default_options.asm" + + +CheckPrimarySaveFile: ; 14f84 + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) + call GetSRAMBank + 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 + ld a, $1 + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret +; 14faf + +CheckBackupSaveFile: ; 14faf + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) + call GetSRAMBank + 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 + ld a, $2 + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret +; 14fd7 + + +LoadPlayerData: ; 14fd7 (5:4fd7) + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, sCurrMapData + ld de, wCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + ld a, [sBattleTowerChallengeState] + cp BATTLETOWER_RECEIVED_REWARD + jr nz, .not_4 + ld a, BATTLETOWER_WON_CHALLENGE + ld [sBattleTowerChallengeState], a +.not_4 + call CloseSRAM + ret + +LoadPokemonData: ; 1500c + ld a, BANK(sPokemonData) + call GetSRAMBank + ld hl, sPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 15021 + +LoadBox: ; 15021 (5:5021) + call GetBoxAddress + call LoadBoxAddress + ret + +VerifyChecksum: ; 15028 (5:5028) + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call GetSRAMBank + 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: ; 15046 (5:5046) + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, sBackupPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, sBackupCurrMapData + ld de, wCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ret + +LoadBackupPokemonData: ; 15067 (5:5067) + ld a, BANK(sBackupPokemonData) + call GetSRAMBank + ld hl, sBackupPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +VerifyBackupChecksum: ; 1507c (5:507c) + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) + call GetSRAMBank + call Checksum + ld a, [sBackupChecksum + 0] + cp e + jr nz, .fail + ld a, [sBackupChecksum + 1] + cp d +.fail + push af + call CloseSRAM + pop af + ret + + +_SaveData: ; 1509a + ; This is called within two scenarios: + ; a) ErasePreviousSave (the process of erasing the save from a previous game file) + ; b) unused mobile functionality + ; It is not part of a regular save. + + ld a, BANK(sCrystalData) + call GetSRAMBank + ld hl, wCrystalData + ld de, sCrystalData + ld bc, wCrystalDataEnd - wCrystalData + call CopyBytes + + ; This block originally had some mobile functionality, but since we're still in + ; BANK(sCrystalData), it instead overwrites the sixteen wEventFlags starting at 1:a603 with + ; garbage from wd479. This isn't an issue, since ErasePreviousSave is followed by a regular + ; save that unwrites the garbage. + + ld hl, wd479 + ld a, [hli] + ld [$a60e + 0], a + ld a, [hli] + ld [$a60e + 1], a + + jp CloseSRAM + + +_LoadData: ; 150b9 + ld a, BANK(sCrystalData) + call GetSRAMBank + ld hl, sCrystalData + ld de, wCrystalData + ld bc, wCrystalDataEnd - wCrystalData + call CopyBytes + + ; This block originally had some mobile functionality to mirror _SaveData above, but instead it + ; (harmlessly) writes the aforementioned wEventFlags to the unused wd479. + + ld hl, wd479 + ld a, [$a60e + 0] + ld [hli], a + ld a, [$a60e + 1] + ld [hli], a + + jp CloseSRAM + + +GetBoxAddress: ; 150d8 + 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 +; 150f9 + +SaveBoxAddress: ; 150f9 +; Save box via wMisc. +; We do this in three steps because the size of wMisc 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 GetSRAMBank + ld hl, sBox + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop de + pop af +; Save it to the target box. + push af + push de + call GetSRAMBank + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + +; Load the second part of the active box. + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBox + (wMiscEnd - wMisc) + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wMiscEnd - wMisc) + add hl, de + ld e, l + ld d, h +; Save it to the next part of the target box. + push af + push de + call GetSRAMBank + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + +; Load the third and final part of the active box. + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBox + (wMiscEnd - wMisc) * 2 + ld de, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wMiscEnd - wMisc) + add hl, de + ld e, l + ld d, h +; Save it to the final part of the target box. + call GetSRAMBank + ld hl, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret +; 1517d + + +LoadBoxAddress: ; 1517d (5:517d) +; Load box via wMisc. +; We do this in three steps because the size of wMisc is less than +; the size of sBox. + push hl + ld l, e + ld h, d +; Load part 1 + push af + push hl + call GetSRAMBank + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop hl + pop af + + ld de, (wMiscEnd - wMisc) + add hl, de +; Load part 2 + push af + push hl + call GetSRAMBank + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop hl + pop af +; Load part 3 + ld de, (wMiscEnd - wMisc) + add hl, de + call GetSRAMBank + ld de, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) * 2 + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret + + +EraseBoxes: ; 151fb + ld hl, BoxAddresses + ld c, NUM_BOXES +.next + push bc + ld a, [hli] + call GetSRAMBank + 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 +; 1522d + +BoxAddresses: ; 1522d +; 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 +; 15273 + + +Checksum: ; 15273 + 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 +; 15283 + + +Text_WouldYouLikeToSaveTheGame: ; 0x15283 + ; Would you like to save the game? + text_jump UnknownText_0x1c454b + db "@" +; 0x15288 + +Text_SavingDontTurnOffThePower: ; 0x15288 + ; SAVING… DON'T TURN OFF THE POWER. + text_jump UnknownText_0x1c456d + db "@" +; 0x1528d + +Text_PlayerSavedTheGame: ; 0x1528d + ; saved the game. + text_jump UnknownText_0x1c4590 + db "@" +; 0x15292 + +Text_AlreadyASaveFile: ; 0x15292 + ; There is already a save file. Is it OK to overwrite? + text_jump UnknownText_0x1c45a3 + db "@" +; 0x15297 + +Text_AnotherSaveFile: ; 0x15297 + ; There is another save file. Is it OK to overwrite? + text_jump UnknownText_0x1c45d9 + db "@" +; 0x1529c + +Text_SaveFileCorrupted: ; 0x1529c + ; The save file is corrupted! + text_jump UnknownText_0x1c460d + db "@" +; 0x152a1 + +Text_SaveOnBoxSwitch: ; 0x152a1 + ; When you change a #MON BOX, data will be saved. OK? + text_jump UnknownText_0x1c462a + db "@" +; 0x152a6 + +Text_SaveOnMoveMonWOMail: ; 0x152a6 + ; Each time you move a #MON, data will be saved. OK? + text_jump UnknownText_0x1c465f + db "@" +; 0x152ab diff --git a/engine/menus/savemenu_copytilemapatonce.asm b/engine/menus/savemenu_copytilemapatonce.asm new file mode 100644 index 000000000..9b50494a4 --- /dev/null +++ b/engine/menus/savemenu_copytilemapatonce.asm @@ -0,0 +1,77 @@ +SaveMenu_CopyTilemapAtOnce: ; 4cf45 (13:4f45) + ld a, [hCGB] + and a + jp z, WaitBGMap + +; The following is a modified version of CopyTilemapAtOnce. + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a +.WaitLY: + ld a, [rLY] + cp $60 + jr c, .WaitLY + + di + ld a, BANK(vBGMap2) + ld [rVBK], a + hlcoord 0, 0, wAttrMap + call .CopyTilemapAtOnce + ld a, BANK(vBGMap0) + ld [rVBK], a + hlcoord 0, 0 + call .CopyTilemapAtOnce +.WaitLY2: + ld a, [rLY] + cp $60 + jr c, .WaitLY2 + ei + + pop af + ld [hMapAnims], a + pop af + ld [hBGMapMode], a + ret + +.CopyTilemapAtOnce: ; 4cf80 (13:4f80) + ld [hSPBuffer], sp ; $ffd9 + ld sp, hl + ld a, [hBGMapAddress + 1] + ld h, a + ld l, 0 + ld a, SCREEN_HEIGHT + ld [hTilesPerCycle], a + ld b, 1 << 1 + ld c, LOW(rSTAT) + +.loop +rept SCREEN_WIDTH / 2 + pop de +.loop\@ + ld a, [$ff00+c] + and b + jr nz, .loop\@ + ld [hl], e + inc l + ld [hl], d + inc l +endr + + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, de + ld a, [hTilesPerCycle] + dec a + ld [hTilesPerCycle], a + jr nz, .loop + + ld a, [hSPBuffer] + ld l, a + ld a, [hSPBuffer + 1] + ld h, a + ld sp, hl + ret |