diff --git a/FAQ.md b/FAQ.md index 7ed5e006f..991ac5a72 100644 --- a/FAQ.md +++ b/FAQ.md @@ -4,7 +4,7 @@ ## Questions - [What is pokecrystal11.gbc?](#what-is-pokecrystal11gbc) -- [What is pokecrystal-au.gbc?](#what-is-pokecrystal-augbc) +- [What is pokecrystal_au.gbc?](#what-is-pokecrystal_augbc) - [I can't build the ROM, `make` just prints an error!](#i-cant-build-the-rom-make-just-prints-an-error) - [`gcc`: command not found](#gcc-command-not-found) - ["ERROR: `UNION` already defined"](#error-union-already-defined) @@ -25,9 +25,10 @@ Version 1.1 of Pokémon Crystal, which fixed some issues with the initial international release. `make crystal11` defines `_CRYSTAL11` so the assembly builds the changed version. -## What is pokecrystal-au.gbc? -The Australian release of Pokémon Crystal, which is based on the international 1.1 release but censors gambling references from the Game Corners. `make crystal-au` defines `_CRYSTAL11` and `_CRYSTAL_AU` so the assembly builds the changed version. +## What is pokecrystal_au.gbc? + +The Australian release of Pokémon Crystal, which is based on the international 1.1 release but censors gambling references from the Game Corners. `make crystal_au` defines `_CRYSTAL11` and `_CRYSTAL_AU` so the assembly builds the changed version. ## I can't build the ROM, `make` just prints an error! diff --git a/Makefile b/Makefile index bc9299f73..e791012a0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -roms := pokecrystal.gbc pokecrystal11.gbc pokecrystal-au.gbc +roms := pokecrystal.gbc pokecrystal11.gbc pokecrystal_au.gbc pokecrystal_debug.gbc pokecrystal11_debug.gbc -crystal_obj := \ +rom_obj := \ audio.o \ home.o \ main.o \ @@ -17,8 +17,11 @@ gfx/sprites.o \ gfx/tilesets.o \ lib/mobile/main.o -crystal11_obj := $(crystal_obj:.o=11.o) -crystal_au_obj := $(crystal_obj:.o=_au.o) +pokecrystal_obj := $(rom_obj:.o=.o) +pokecrystal11_obj := $(rom_obj:.o=11.o) +pokecrystal_au_obj := $(rom_obj:.o=_au.o) +pokecrystal_debug_obj := $(rom_obj:.o=_debug.o) +pokecrystal11_debug_obj := $(rom_obj:.o=11_debug.o) ### Build tools @@ -39,24 +42,26 @@ RGBLINK ?= $(RGBDS)rgblink ### Build targets .SUFFIXES: -.PHONY: all crystal crystal11 crystal_au clean tidy compare tools +.PHONY: all crystal crystal11 crystal_au crystal_debug crystal11_debug clean tidy compare tools .SECONDEXPANSION: .PRECIOUS: .SECONDARY: all: crystal -crystal: pokecrystal.gbc -crystal11: pokecrystal11.gbc -crystal-au: pokecrystal-au.gbc +crystal: pokecrystal.gbc +crystal11: pokecrystal11.gbc +crystal_au: pokecrystal_au.gbc +crystal_debug: pokecrystal_debug.gbc +crystal11_debug: pokecrystal11_debug.gbc clean: - rm -f $(roms) $(crystal_obj) $(crystal11_obj) $(crystal_au_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o + rm -f $(roms) $(pokecrystal_obj) $(pokecrystal11_obj) $(pokecrystal_au_obj) $(pokecrystal_debug_obj) $(pokecrystal11_debug_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o find gfx \( -name "*.[12]bpp" -o -name "*.lz" -o -name "*.gbcpal" -o -name "*.sgb.tilemap" \) -delete find gfx/pokemon -mindepth 1 ! -path "gfx/pokemon/unown/*" \( -name "bitmask.asm" -o -name "frames.asm" -o -name "front.animated.tilemap" -o -name "front.dimensions" \) -delete $(MAKE) clean -C tools/ tidy: - rm -f $(roms) $(crystal_obj) $(crystal11_obj) $(crystal_au_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o + rm -f $(roms) $(pokecrystal_obj) $(pokecrystal11_obj) $(pokecrystal_au_obj) $(pokecrystal_debug_obj) $(pokecrystal11_debug_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o $(MAKE) clean -C tools/ compare: $(roms) @@ -72,9 +77,11 @@ ifeq ($(DEBUG),1) RGBASMFLAGS += -E endif -$(crystal_obj): RGBASMFLAGS += -$(crystal11_obj): RGBASMFLAGS += -D _CRYSTAL11 -$(crystal_au_obj): RGBASMFLAGS += -D _CRYSTAL11 -D _CRYSTAL_AU +$(pokecrystal_obj): RGBASMFLAGS += +$(pokecrystal11_obj): RGBASMFLAGS += -D _CRYSTAL11 +$(pokecrystal_au_obj): RGBASMFLAGS += -D _CRYSTAL11 -D _CRYSTAL_AU +$(pokecrystal_debug_obj): RGBASMFLAGS += -D _DEBUG +$(pokecrystal11_debug_obj): RGBASMFLAGS += -D _CRYSTAL11 -D _DEBUG rgbdscheck.o: rgbdscheck.asm $(RGBASM) -o $@ $< @@ -93,24 +100,25 @@ ifeq (,$(filter clean tools,$(MAKECMDGOALS))) $(info $(shell $(MAKE) -C tools)) -$(foreach obj, $(crystal_au_obj), $(eval $(call DEP,$(obj),$(obj:_au.o=.asm)))) -$(foreach obj, $(crystal11_obj), $(eval $(call DEP,$(obj),$(obj:11.o=.asm)))) -$(foreach obj, $(crystal_obj), $(eval $(call DEP,$(obj),$(obj:.o=.asm)))) +# Dependencies for shared objects objects +$(foreach obj, $(pokecrystal_obj), $(eval $(call DEP,$(obj),$(obj:.o=.asm)))) +$(foreach obj, $(pokecrystal11_obj), $(eval $(call DEP,$(obj),$(obj:11.o=.asm)))) +$(foreach obj, $(pokecrystal_au_obj), $(eval $(call DEP,$(obj),$(obj:_au.o=.asm)))) +$(foreach obj, $(pokecrystal_debug_obj), $(eval $(call DEP,$(obj),$(obj:_debug.o=.asm)))) +$(foreach obj, $(pokecrystal11_debug_obj), $(eval $(call DEP,$(obj),$(obj:11_debug.o=.asm)))) endif -pokecrystal.gbc: $(crystal_obj) layout.link - $(RGBLINK) -n pokecrystal.sym -m pokecrystal.map -l layout.link -p 0 -o $@ $(crystal_obj) - $(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTE -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@ +pokecrystal_opt = -Cjv -t PM_CRYSTAL -i BYTE -n 0 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 +pokecrystal11_opt = -Cjv -t PM_CRYSTAL -i BYTE -n 1 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 +pokecrystal_au_opt = -Cjv -t PM_CRYSTAL -i BYTU -n 0 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 +pokecrystal_debug_opt = -Cjv -t PM_CRYSTAL -i BYTE -n 0 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 +pokecrystal11_debug_opt = -Cjv -t PM_CRYSTAL -i BYTE -n 1 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 -pokecrystal11.gbc: $(crystal11_obj) layout.link - $(RGBLINK) -n pokecrystal11.sym -m pokecrystal11.map -l layout.link -p 0 -o $@ $(crystal11_obj) - $(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTE -n 1 -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@ - -pokecrystal-au.gbc: $(crystal_au_obj) layout.link - $(RGBLINK) -n pokecrystal-au.sym -m pokecrystal-au.map -l layout.link -p 0 -o $@ $(crystal_au_obj) - $(RGBFIX) -Cjv -t PM_CRYSTAL -i BYTU -k 01 -l 0x33 -m 0x10 -r 3 -p 0 $@ +%.gbc: $$(%_obj) layout.link + $(RGBLINK) -n $*.sym -m $*.map -l layout.link -o $@ $(filter %.o,$^) + $(RGBFIX) $($*_opt) $@ ### LZ compression rules diff --git a/README.md b/README.md index 46962cb47..60fab7240 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ It builds the following ROMs: - Pokemon - Crystal Version (UE) (V1.0) [C][!].gbc `sha1: f4cd194bdee0d04ca4eac29e09b8e4e9d818c133` - Pokemon - Crystal Version (UE) (V1.1) [C][!].gbc `sha1: f2f52230b536214ef7c9924f483392993e226cfb` - Pokemon - Crystal Version (A) [C][!].gbc `sha1: a0fc810f1d4e124434f7be2c989ab5b5892ddf36` +- CRYSTAL_ps3_010328d.bin `sha1: c60d57a24bbe8ecf7cba54ab3f90669f97bd330d` +- CRYSTAL_ps3_us_revise_010710d.bin `sha1: 391ae86b1d5a26db712ffe6c28bbf2a1f804c3c4` To set up the repository, see [INSTALL.md](INSTALL.md). diff --git a/constants/item_data_constants.asm b/constants/item_data_constants.asm index 4c295d5b3..f6d6384ce 100644 --- a/constants/item_data_constants.asm +++ b/constants/item_data_constants.asm @@ -47,6 +47,8 @@ MAX_BALLS EQU 12 MAX_KEY_ITEMS EQU 25 MAX_PC_ITEMS EQU 50 +MAX_ITEM_STACK EQU 99 + ; mail MAIL_LINE_LENGTH EQU $10 MAIL_MSG_LENGTH EQU $20 diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm index b492e958e..a3c31141c 100644 --- a/constants/misc_constants.asm +++ b/constants/misc_constants.asm @@ -19,6 +19,9 @@ GS_VERSION EQU 0 SAVE_CHECK_VALUE_1 EQU 99 SAVE_CHECK_VALUE_2 EQU 127 +; RTC halted check value +RTC_HALT_VALUE EQU $1234 + ; time of day boundaries MORN_HOUR EQU 4 ; 4 AM DAY_HOUR EQU 10 ; 10 AM diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index d6f90d587..336d66e62 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -3432,7 +3432,24 @@ DoEnemyDamage: ld [wBuffer4], a sbc b ld [wEnemyMonHP], a +if DEF(_DEBUG) + push af + ld a, BANK(sSkipBattle) + call OpenSRAM + ld a, [sSkipBattle] + call CloseSRAM + or a + ; If [sSkipBattle] is nonzero, skip the "jr nc, .no_underflow" check, + ; so any attack deals maximum damage to the enemy. + jr nz, .debug_skip + pop af jr nc, .no_underflow + push af +.debug_skip + pop af +else + jr nc, .no_underflow +endc ld a, [wBuffer4] ld [hli], a diff --git a/engine/menus/debug.asm b/engine/debug/color_picker.asm similarity index 100% rename from engine/menus/debug.asm rename to engine/debug/color_picker.asm diff --git a/engine/debug/debug_room.asm b/engine/debug/debug_room.asm new file mode 100644 index 000000000..95692c8d3 --- /dev/null +++ b/engine/debug/debug_room.asm @@ -0,0 +1,1762 @@ + ; _DebugRoom.MenuItems indexes + const_def + const DEBUGROOMMENU_PAGE_1 ; 0 + const DEBUGROOMMENU_PAGE_2 ; 1 + const DEBUGROOMMENU_PAGE_3 ; 2 +DEBUGROOMMENU_NUM_PAGES EQU const_value + + ; _DebugRoom.Strings and _DebugRoom.Jumptable indexes + const_def + const DEBUGROOMMENUITEM_SP_CLEAR ; 00 + const DEBUGROOMMENUITEM_WIN_WORK_CLR ; 01 + const DEBUGROOMMENUITEM_POKEMON_GET ; 02 + const DEBUGROOMMENUITEM_POKEDEX_COMP ; 03 + const DEBUGROOMMENUITEM_TIMER_RESET ; 04 + const DEBUGROOMMENUITEM_DECORATE_ALL ; 05 + const DEBUGROOMMENUITEM_ITEM_GET ; 06 + const DEBUGROOMMENUITEM_RTC_EDIT ; 07 + const DEBUGROOMMENUITEM_NEXT ; 08 + const DEBUGROOMMENUITEM_GB_ID_SET ; 09 + const DEBUGROOMMENUITEM_BTL_REC_CLR ; 0a + const DEBUGROOMMENUITEM_POKEDEX_CLR ; 0b + const DEBUGROOMMENUITEM_HALT_CHK_CLR ; 0c + const DEBUGROOMMENUITEM_BATTLE_SKIP ; 0d + const DEBUGROOMMENUITEM_HOF_CLEAR ; 0e + const DEBUGROOMMENUITEM_ROM_CHECKSUM ; 0f + const DEBUGROOMMENUITEM_TEL_DEBUG ; 10 + const DEBUGROOMMENUITEM_SUM_RECALC ; 11 + const DEBUGROOMMENUITEM_RAM_FLAG_CLR ; 12 + const DEBUGROOMMENUITEM_CHANGE_SEX ; 13 + const DEBUGROOMMENUITEM_BT_BUG_POKE ; 14 + +_DebugRoom: + ldh a, [hJoyDown] + and SELECT | START + cp SELECT | START + ret nz + ldh a, [hDebugRoomMenuPage] + push af + xor a + ldh [hDebugRoomMenuPage], a +.loop + ld hl, wTilemap + ld bc, wTilemapEnd - wTilemap + ld a, " " + call ByteFill + call DebugRoom_PrintStackBottomTop + call DebugRoom_PrintWindowStackBottomTop + call DebugRoom_PrintRTCHaltChk + call DebugRoom_PrintBattleSkip + call DebugRoom_PrintTelDebug + call DebugRoom_PrintRAMFlag + call DebugRoom_PrintGender + ldh a, [hDebugRoomMenuPage] + ld [wWhichIndexSet], a + ld hl, .MenuHeader + call LoadMenuHeader + call SetUpMenu +.wait + call GetScrollingMenuJoypad + ld a, [wMenuJoypad] + and A_BUTTON | B_BUTTON + jr z, .wait + call CloseWindow + cp B_BUTTON + jr z, .done + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + jr .loop +.done + pop af + ldh [hDebugRoomMenuPage], a + ret + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 15, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option + +.MenuData: + db STATICMENU_CURSOR ; flags + db 0 ; items + dw .MenuItems + dw PlaceMenuStrings + dw .Strings + +.Strings: +; entries correspond to DEBUGROOMMENUITEM_* constants + db "SP CLEAR@" + db "WIN WORK CLR@" + db "#MON GET!@" + db "#DEX COMP@" + db "TIMER RESET@" + db "DECORATE ALL@" + db "ITEM GET!@" + db "RTC EDIT@" + db "NEXT@" + db "GB ID SET@" + db "BTL REC CLR@" + db "#DEX CLR@" + db "HALT CHK CLR@" + db "BATTLE SKIP@" + db "HOF CLEAR@" + db "ROM CHECKSUM@" + db "TEL DEBUG@" + db "SUM RECALC@" + db "RAM FLAG CLR@" + db "CHANGE SEX@" + db "BT BUG POKE@" + +.Jumptable: +; entries correspond to DEBUGROOMMENUITEM_* constants + dw DebugRoomMenu_SpClear + dw DebugRoomMenu_WinWorkClr + dw DebugRoomMenu_PokemonGet + dw DebugRoomMenu_PokedexComp + dw DebugRoomMenu_TimerReset + dw DebugRoomMenu_DecorateAll + dw DebugRoomMenu_ItemGet + dw DebugRoomMenu_RTCEdit + dw DebugRoomMenu_Next + dw DebugRoomMenu_GBIDSet + dw DebugRoomMenu_BtlRecClr + dw DebugRoomMenu_PokedexClr + dw DebugRoomMenu_HaltChkClr + dw DebugRoomMenu_BattleSkip + dw DebugRoomMenu_HOFClear + dw DebugRoomMenu_ROMChecksum + dw DebugRoomMenu_TelDebug + dw DebugRoomMenu_SumRecalc + dw DebugRoomMenu_RAMFlagClr + dw DebugRoomMenu_ChangeSex + dw DebugRoomMenu_BTBugPoke + +.MenuItems: +; entries correspond to DEBUGROOMMENU_* constants + + ; DEBUGROOMMENU_PAGE_1 + db 8 + db DEBUGROOMMENUITEM_SP_CLEAR + db DEBUGROOMMENUITEM_BATTLE_SKIP + db DEBUGROOMMENUITEM_RTC_EDIT + db DEBUGROOMMENUITEM_TIMER_RESET + db DEBUGROOMMENUITEM_HALT_CHK_CLR + db DEBUGROOMMENUITEM_GB_ID_SET + db DEBUGROOMMENUITEM_BTL_REC_CLR + db DEBUGROOMMENUITEM_NEXT + db -1 + + ; DEBUGROOMMENU_PAGE_2 + db 8 + db DEBUGROOMMENUITEM_POKEMON_GET + db DEBUGROOMMENUITEM_ITEM_GET + db DEBUGROOMMENUITEM_POKEDEX_COMP + db DEBUGROOMMENUITEM_POKEDEX_CLR + db DEBUGROOMMENUITEM_DECORATE_ALL + db DEBUGROOMMENUITEM_HOF_CLEAR + db DEBUGROOMMENUITEM_ROM_CHECKSUM + db DEBUGROOMMENUITEM_NEXT + db -1 + + ; DEBUGROOMMENU_PAGE_3 + db 6 + db DEBUGROOMMENUITEM_TEL_DEBUG + db DEBUGROOMMENUITEM_SUM_RECALC + db DEBUGROOMMENUITEM_RAM_FLAG_CLR + db DEBUGROOMMENUITEM_CHANGE_SEX + db DEBUGROOMMENUITEM_BT_BUG_POKE + db DEBUGROOMMENUITEM_NEXT + db -1 + +DebugRoomMenu_Next: + ldh a, [hDebugRoomMenuPage] + inc a + cp DEBUGROOMMENU_NUM_PAGES + jr c, .got_page + xor a ; DEBUGROOMMENU_PAGE_1 +.got_page + ldh [hDebugRoomMenuPage], a + ret + +DebugRoom_SaveChecksum: + ld a, BANK(sGameData) + call OpenSRAM + ld bc, sGameDataEnd - sGameData + ld de, 0 + ld hl, sGameData +.loop + ld a, [hli] + add e + ld e, a + ld a, d + adc 0 + ld d, a + dec bc + ld a, b + or c + jr nz, .loop + ld a, e + ld [sChecksum + 0], a + ld a, d + ld [sChecksum + 1], a + call CloseSRAM + ret + +DebugRoomMenu_SpClear: + call YesNoBox + ret c + ld a, BANK(sStackTop) + call OpenSRAM + xor a + ld hl, sStackTop + ld [hli], a + ld [hl], a + call CloseSRAM + call DebugRoom_PrintStackBottomTop + ret + +DebugRoom_PrintStackBottomTop: + ld a, BANK(sStackTop) + call OpenSRAM + hlcoord 16, 14 + ld de, sStackTop + 1 + ld c, 1 + call PrintHexNumber + ld de, sStackTop + 0 + ld c, 1 + call PrintHexNumber + call CloseSRAM + hlcoord 16, 12 + ld de, .SPString + call PlaceString + ld d, LOW(wStackBottom) + ld e, HIGH(wStackBottom) + push de + ld hl, sp+0 + ld d, h + ld e, l + hlcoord 16, 13 + ld c, 2 + call PrintHexNumber + pop de + ret + +.SPString: + db "SP:@" + +DebugRoomMenu_WinWorkClr: + call YesNoBox + ret c + ld a, [wWindowStackPointer] + ld l, a + ld a, [wWindowStackPointer + 1] + ld h, a + inc hl + ld a, l + sub LOW(wWindowStack) + ld a, h + sbc HIGH(wWindowStack) + ret c + ld a, $00 + call OpenSRAM + ld bc, -wWindowStack + $10000 + add hl, bc + ld b, h + ld c, l + ld hl, wWindowStack + xor a + call ByteFill + call CloseSRAM + ret + +DebugRoom_PrintWindowStackBottomTop: + ret ; stubbed out + + ld a, $00 + call OpenSRAM + ld hl, wWindowStack +.loop + ld a, h + cp $c0 + jr z, .ok + ld a, [hl] + or a + jr nz, .ok + inc hl + jr .loop +.ok + call CloseSRAM + ld a, h + ld h, l + ld l, a + push hl + ld hl, sp+0 + ld d, h + ld e, l + hlcoord 16, 17 + ld c, 2 + call PrintHexNumber + pop hl + ld d, LOW(wWindowStack) + ld e, HIGH(wWindowStack) + push de + ld hl, sp+0 + ld d, h + ld e, l + hlcoord 16, 16 + ld c, 2 + call PrintHexNumber + pop de + hlcoord 16, 15 + ld de, .WSPString + call PlaceString + ret + +.WSPString: + db "WSP:@" + +DebugRoomMenu_PokedexComp: + call YesNoBox + ret c + ld a, BANK(sGameData) ; aka BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wPokedexCaught - wPlayerData) + ld b, wEndPokedexSeen - wPokedexCaught + ld a, %11111111 +.loop1 + ld [hli], a + dec b + jr nz, .loop1 + ld a, (1 << (NUM_POKEMON % 8)) - 1 ; %00000111 + ld [sPlayerData + (wEndPokedexCaught - 1 - wPlayerData)], a + ld [sPlayerData + (wEndPokedexSeen - 1 - wPlayerData)], a + ld hl, sPlayerData + (wStatusFlags - wPlayerData) + set STATUSFLAGS_UNOWN_DEX_F, [hl] + ld a, UNOWN_A + ld [sGameData + (wFirstUnownSeen - wGameData)], a + ld hl, sGameData + (wUnownDex - wGameData) + ld b, NUM_UNOWN +.loop2 + ld [hli], a + inc a + dec b + jr nz, .loop2 + call CloseSRAM + call DebugRoom_SaveChecksum + ret + +DebugRoomMenu_PokedexClr: + call YesNoBox + ret c + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wStatusFlags - wPlayerData) + res STATUSFLAGS_UNOWN_DEX_F, [hl] + ld hl, sPlayerData + (wPokedexCaught - wPlayerData) + ld bc, wEndPokedexSeen - wPokedexCaught + xor a + call ByteFill + ld hl, sGameData + (wUnownDex - wGameData) + ld bc, NUM_UNOWN + xor a + call ByteFill + call CloseSRAM + call DebugRoom_SaveChecksum + ret + +DebugRoomMenu_TimerReset: + call YesNoBox + ret c + ld a, BANK(sRTCStatusFlags) + call OpenSRAM + ld hl, sRTCStatusFlags + set 7, [hl] + call CloseSRAM + ret + +DebugRoomMenu_BattleSkip: + ld a, BANK(sSkipBattle) + call OpenSRAM + ld a, [sSkipBattle] + inc a + and 1 + ld [sSkipBattle], a + call CloseSRAM + ret + +DebugRoom_PrintBattleSkip: + hlcoord 16, 6 + ld de, .BTLString + call PlaceString + ld a, BANK(sSkipBattle) + call OpenSRAM + ld a, [sSkipBattle] + call CloseSRAM + hlcoord 16, 7 + ld de, .DoString + or a + jr z, .ok + ld de, .SkipString +.ok + call PlaceString + ret + +.BTLString: + db "BTL:@" +.DoString: + db " DO@" +.SkipString: + db "SKIP@" + +DebugRoomMenu_ChangeSex: + ld a, BANK(sCrystalData) + call OpenSRAM + ld a, [sCrystalData + (wPlayerGender - wCrystalData)] + inc a + and 1 + ld [sCrystalData + (wPlayerGender - wCrystalData)], a + call CloseSRAM + ret + +DebugRoom_PrintGender: + hlcoord 16, 0 + ld de, .SexString + call PlaceString + ld a, BANK(sCrystalData) + call OpenSRAM + ld a, [sCrystalData + (wPlayerGender - wCrystalData)] + call CloseSRAM + or a + ld a, "♂" + jr z, .ok + ld a, "♀" +.ok + hlcoord 19, 1 + ld [hl], a + ret + +.SexString: + db "SEX:@" + +DebugRoomMenu_TelDebug: + ld a, BANK(sDebugTimeCyclesSinceLastCall) + call OpenSRAM + ld a, [sDebugTimeCyclesSinceLastCall] + inc a + cp 3 + jr c, .ok + xor a +.ok + ld [sDebugTimeCyclesSinceLastCall], a + call CloseSRAM + ret + +DebugRoom_PrintTelDebug: + hlcoord 16, 16 + ld de, .TelString + call PlaceString + ld a, BANK(sDebugTimeCyclesSinceLastCall) + call OpenSRAM + ld a, [sDebugTimeCyclesSinceLastCall] + call CloseSRAM + hlcoord 16, 17 + ld de, .BusyString + dec a + jr z, .ok + ld de, .HardString + dec a + jr z, .ok + ld de, .OffString +.ok + call PlaceString + ret + +.TelString: + db "TEL:@" +.OffString: + db " OFF@" +.BusyString: + db "BUSY@" +.HardString: + db "HARD@" + +DebugRoomMenu_RAMFlagClr: + call YesNoBox + ret c + ld a, BANK(sOpenedInvalidSRAM) + call OpenSRAM + xor a + ld [sOpenedInvalidSRAM], a + call CloseSRAM + ret + +DebugRoom_PrintRAMFlag: + ld a, BANK(sOpenedInvalidSRAM) + call OpenSRAM + ld de, sOpenedInvalidSRAM + hlcoord 18, 4 + ld c, 1 + call PrintHexNumber + call CloseSRAM + hlcoord 16, 3 + ld de, .RamString + call PlaceString + ret + +.RamString: + db "RAM:@" + +DebugRoomMenu_SumRecalc: + call YesNoBox + ret c + call DebugRoom_SaveChecksum + ret + +DebugRoomMenu_DecorateAll: + call YesNoBox + ret c + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wEventFlags - wPlayerData) + ld de, EVENT_DECO_BED_1 ; the first EVENT_DECO_* constant + ld b, SET_FLAG + ld c, EVENT_DECO_BIG_LAPRAS_DOLL - EVENT_DECO_BED_1 + 1 +.loop + push bc + push de + push hl + call FlagAction + pop hl + pop de + pop bc + inc de + dec c + jr nz, .loop + call CloseSRAM + call DebugRoom_SaveChecksum + ret + +paged_value: MACRO + dw \1 ; value address + db \2 ; min value + db \3 ; max value + db \4 ; initial value + dw \5 ; label string + dw \6 ; value name function + db \7 ; is hex value? +ENDM + +PAGED_VALUE_SIZE EQU 10 + +DebugRoom_EditPagedValues: + xor a + ld [wDebugRoomCurPage], a + ld [wDebugRoomCurValue], a + ld a, [hli] + ld [wDebugRoomAFunction], a + ld a, [hli] + ld [wDebugRoomAFunction+1], a + ld a, [hli] + ld [wDebugRoomSelectFunction], a + ld a, [hli] + ld [wDebugRoomSelectFunction+1], a + ld a, [hli] + ld [wDebugRoomStartFunction], a + ld a, [hli] + ld [wDebugRoomStartFunction+1], a + ld a, [hli] + ld [wDebugRoomAutoFunction], a + ld a, [hli] + ld [wDebugRoomAutoFunction+1], a + ld a, [hli] + ld [wDebugRoomPageCount], a + ld a, l + ld [wDebugRoomPagedValuesPtr], a + ld a, h + ld [wDebugRoomPagedValuesPtr+1], a + ld hl, hInMenu + ld a, [hl] + push af + ld [hl], TRUE + call ClearBGPalettes + hlcoord 0, 0 + ld b, SCREEN_HEIGHT - 2 + ld c, SCREEN_WIDTH - 2 + call Textbox + hlcoord 8, 17 + ld de, DebugRoom_PageString + call PlaceString + call DebugRoom_InitializePagedValues + xor a + call DebugRoom_PrintPage + ld a, "▶" + call DebugRoom_ShowHideCursor + xor a + ldh [hJoyLast], a + xor a + ld [wDebugRoomCurPage], a + inc a + ldh [hBGMapMode], a + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes +.resume + call DelayFrame + call JoyTextDelay + ldh a, [hJoyLast] + bit 1, a + jr nz, .done + ld hl, .continue + push hl + rra ; A_BUTTON_F? + jr c, DebugRoom_PagedValuePressedA + rra ; skip B_BUTTON_F + rra ; SELECT_F? + jr c, DebugRoom_PagedValuePressedSelect + rra ; START_F? + jr c, DebugRoom_PagedValuePressedStart + rra ; D_RIGHT_F? + jp c, DebugRoom_IncrementPagedValue + rra ; D_LEFT_F? + jp c, DebugRoom_DecrementPagedValue + rra ; D_UP_F? + jp c, DebugRoom_PrevPagedValue + rra ; D_DOWN_F? + jp c, DebugRoom_NextPagedValue + pop hl +.continue +; call wDebugRoomAutoFunction if it's not null, then jump to .resume + ld hl, .resume + push hl + ld a, [wDebugRoomAutoFunction] + ld l, a + ld a, [wDebugRoomAutoFunction+1] + ld h, a + or l + ret z + jp hl + +.done + pop af + ldh [hInMenu], a + scf + ret + +DebugRoom_PagedValuePressedA: + ld hl, wDebugRoomAFunction + jr _CallNonNullPointer + +DebugRoom_PagedValuePressedSelect: + ld hl, wDebugRoomSelectFunction + jr _CallNonNullPointer + +DebugRoom_PagedValuePressedStart: + ld hl, wDebugRoomStartFunction + ; fallthrough + +_CallNonNullPointer: + ld a, [hli] + ld h, [hl] + ld l, a + or h + ret z + jp hl + +DebugRoom_PageString: + db " P @" + +DebugRoom_IncrementPagedValue: + call DebugRoom_GetCurPagedValuePtr + ld e, [hl] ; de = value address + inc hl + ld d, [hl] + inc hl + inc hl + ld a, [de] ; a = max value + cp [hl] + ret z + inc a + ld [de], a + call DebugRoom_PrintPageBValueC + ret + +DebugRoom_DecrementPagedValue: + call DebugRoom_GetCurPagedValuePtr + ld e, [hl] ; de = value address + inc hl + ld d, [hl] + inc hl + ld a, [de] ; a = min value + cp [hl] + ret z + dec a + ld [de], a + call DebugRoom_PrintPageBValueC + ret + +DebugRoom_NextPage: + ld a, [wDebugRoomPageCount] + ld c, a + ld a, [wDebugRoomCurPage] + inc a + cp c + jr c, .ok + xor a +.ok + ld [wDebugRoomCurPage], a + call DebugRoom_PrintPage + ld a, [wDebugRoomCurPage] + call DebugRoom_GetNthPagePtr + ld a, [wDebugRoomCurValue] + cp [hl] + jr c, .skip + ld a, [hl] + dec a + ld [wDebugRoomCurValue], a +.skip + ld a, "▶" + call DebugRoom_ShowHideCursor + ret + +DebugRoom_PrevPage: + ld a, [wDebugRoomCurPage] + or a + jr nz, .ok + ld a, [wDebugRoomPageCount] +.ok + dec a + ld [wDebugRoomCurPage], a + call DebugRoom_PrintPage + ld a, [wDebugRoomCurPage] + call DebugRoom_GetNthPagePtr + ld a, [wDebugRoomCurValue] + cp [hl] + jr c, .skip + ld a, [hl] + dec a + ld [wDebugRoomCurValue], a +.skip + ld a, "▶" + call DebugRoom_ShowHideCursor + ret + +DebugRoom_NextPagedValue: + ld a, " " + call DebugRoom_ShowHideCursor + ld a, [wDebugRoomCurPage] + call DebugRoom_GetNthPagePtr + ld a, [wDebugRoomCurValue] + inc a + cp [hl] ; incremented value < paged_value count? + jr c, DebugRoom_UpdateValueCursor + xor a + ld [wDebugRoomCurValue], a + jr DebugRoom_NextPage + +DebugRoom_UpdateValueCursor: + ld [wDebugRoomCurValue], a + ld a, "▶" + call DebugRoom_ShowHideCursor + ret + +DebugRoom_PrevPagedValue: + ld a, " " + call DebugRoom_ShowHideCursor + ld a, [wDebugRoomCurValue] + or a ; pre-decremented value > 0? + jr nz, .decrement + ld a, -1 + ld [wDebugRoomCurValue], a + jr DebugRoom_PrevPage + +.decrement: + dec a + jr DebugRoom_UpdateValueCursor + +DebugRoom_GetNthPagePtr: +; Input: a = page index +; Output: hl = pointer to paged_data list + ld h, 0 + ld l, a + add hl, hl + ld a, [wDebugRoomPagedValuesPtr] + ld e, a + ld a, [wDebugRoomPagedValuesPtr+1] + ld d, a + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +_DebugRoom_GetPageBValueCPtr: + push bc + ld a, b + call DebugRoom_GetNthPagePtr + pop bc + inc hl + ld a, c + ld bc, PAGED_VALUE_SIZE + call AddNTimes + ret + +DebugRoom_GetCurPagedValuePtr: + ld a, [wDebugRoomCurPage] + ld b, a + ld a, [wDebugRoomCurValue] + ld c, a + jr _DebugRoom_GetPageBValueCPtr + +DebugRoom_ShowHideCursor: + push af + hlcoord 1, 1 + ld bc, SCREEN_WIDTH * 2 + ld a, [wDebugRoomCurValue] + call AddNTimes + pop af + ld [hl], a + ret + +DebugRoom_InitializePagedValues: +; Load the initial values for all pages of the current paged value header + ld a, [wDebugRoomPageCount] +.page_loop + dec a + push af + call .InitializePage + pop af + jr nz, .page_loop + ret + +.InitializePage: +; Load the initial values for page a + ld b, a + ld h, 0 + ld l, a + add hl, hl + ld a, [wDebugRoomPagedValuesPtr] + ld e, a + ld a, [wDebugRoomPagedValuesPtr+1] + ld d, a + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld c, [hl] ; c = paged_value count +.value_loop + push bc + dec c + call .InitializeValue + pop bc + dec c + jr nz, .value_loop + ret + +.InitializeValue: +; Load the initial value for page b, value c + ld h, 0 + ld l, b + add hl, hl + ld a, [wDebugRoomPagedValuesPtr] + ld e, a + ld a, [wDebugRoomPagedValuesPtr+1] + ld d, a + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + inc hl ; skip the paged_value count + ld a, c + push bc + ld bc, PAGED_VALUE_SIZE + call AddNTimes + pop bc + ld e, [hl] ; de = value address + inc hl + ld d, [hl] + inc hl + inc hl + inc hl + ld a, [hl] ; a = initial value + ld [de], a + ret + +DebugRoom_PrintPage: + push af + hlcoord 10, 17 + add "1" + ld [hl], a + hlcoord 1, 1 + lb bc, SCREEN_HEIGHT - 2, SCREEN_WIDTH - 2 + call ClearBox + pop af + ld b, a + ld h, 0 + ld l, a + add hl, hl + ld a, [wDebugRoomPagedValuesPtr] + ld e, a + ld a, [wDebugRoomPagedValuesPtr+1] + ld d, a + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld c, [hl] ; c = paged_value count +.loop + push bc + dec c + call DebugRoom_PrintPagedValue + pop bc + dec c + jr nz, .loop + ret + +DebugRoom_PrintPageBValueC: + ld a, [wDebugRoomCurPage] + ld b, a + ld a, [wDebugRoomCurValue] + ld c, a + jr DebugRoom_PrintPagedValue + +DebugRoom_PrintPagedValue: +; Print the value for page b, value c + ld h, 0 + ld l, b + add hl, hl + ld a, [wDebugRoomPagedValuesPtr] + ld e, a + ld a, [wDebugRoomPagedValuesPtr+1] + ld d, a + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + inc hl ; skip the paged_value count + ld a, c + push bc + ld bc, PAGED_VALUE_SIZE + call AddNTimes + pop bc + ld e, [hl] ; de = value address + inc hl + ld d, [hl] + inc hl + push de + inc hl + inc hl + inc hl + ld e, [hl] ; de = label string + inc hl + ld d, [hl] + inc hl + push hl + hlcoord 2, 1 + ld a, c + ld bc, SCREEN_WIDTH * 2 + call AddNTimes + push hl + call PlaceString + pop hl + ld bc, SCREEN_WIDTH - 7 + add hl, bc + pop bc ; pushed hl + pop de + push de + push bc + inc bc + inc bc + ld a, [bc] ; a = is hex value? + or a + jr nz, .hex + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + jr .printed +.hex + ld c, 1 + call PrintHexNumber + ld [hl], "H" + inc hl +.printed + ld bc, 6 + add hl, bc + ld b, h + ld c, l + pop hl + pop de + ld a, [hli] ; hl = value name function + ld h, [hl] + ld l, a + or h + ret z + ld a, [de] + jp hl + +DebugRoom_JoyWaitABSelect: +.loop + call GetJoypad + ldh a, [hJoyPressed] + and A_BUTTON | B_BUTTON | SELECT + jr z, .loop + ret + +DebugRoomMenu_ItemGet: + ld hl, .PagedValuesHeader + call DebugRoom_EditPagedValues + ret + +.PagedValuesHeader: + dw NULL ; A function + dw NULL ; Select function + dw DebugRoom_SaveItem ; Start function + dw NULL ; Auto function + db 1 ; # pages + dw DebugRoomMenu_ItemGet_Page1Values + +DebugRoom_SaveItem: + call YesNoBox + ret c + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wPCItems - wPlayerData) + ld a, [wDebugRoomItemID] + ld c, a +.loop1 + ld a, [hl] + cp c + jr z, .found + cp -1 + jr z, .not_found + inc hl + inc hl + jr .loop1 + +.found + inc hl + ld a, [wDebugRoomItemQuantity] + add [hl] + cp MAX_ITEM_STACK + 1 + jr c, .max + ld a, MAX_ITEM_STACK +.max + ld [hl], a + ld hl, .ItemNumberAddedText + jr .done + +.not_found + ld a, [sPlayerData + (wNumPCItems - wPlayerData)] + cp MAX_PC_ITEMS + jr nc, .full + inc a + ld [sPlayerData + (wNumPCItems - wPlayerData)], a + ld a, [wDebugRoomItemID] + ld [hli], a + ld a, [wDebugRoomItemQuantity] + ld [hli], a + ld [hl], -1 ; terminator + ld hl, .CreatedNewItemText + jr .done + +.full + ld hl, .StockFullText +.done + call CloseSRAM + call MenuTextbox + call DebugRoom_JoyWaitABSelect + call CloseWindow + call DebugRoom_SaveChecksum + ret + +.ItemNumberAddedText: + text "Item number added!" + done + +.CreatedNewItemText: + text "Created new item!" + done + +.StockFullText: + text "Stock full!!" + done + +DebugRoom_PrintItemName: + ld [wNamedObjectIndexBuffer], a + push bc + call GetItemName + pop hl + push hl + lb bc, 1, 12 + call ClearBox + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +DebugRoomMenu_ItemGet_Page1Values: + db 2 + paged_value wDebugRoomItemID, 1, NUM_POKEMON, MASTER_BALL, .ItemNameString, DebugRoom_PrintItemName, FALSE + paged_value wDebugRoomItemQuantity, 1, 99, 1, .NumberString, NULL, FALSE + +.ItemNameString: db "ITEM NAME@" +.NumberString: db "NUMBER@" + +DebugRoomMenu_PokemonGet: + ld hl, .PagedValuesHeader + call DebugRoom_EditPagedValues + ret + +.PagedValuesHeader: + dw NULL ; A function + dw NULL ; Select function + dw DebugRoom_SavePokemon ; Start function + dw NULL ; Auto function + db 4 ; # pages + dw DebugRoomMenu_PokemonGet_Page1Values + dw DebugRoomMenu_PokemonGet_Page2Values + dw DebugRoomMenu_PokemonGet_Page3Values + dw DebugRoomMenu_PokemonGet_Page4Values + +DebugRoom_SavePokemon: + call YesNoBox + ret c + call DebugRoom_UpdateExpForLevel + ld a, [wDebugRoomMonBox] + dec a + ld b, a + add a + add b + ld h, 0 + ld l, a + ld de, DebugRoom_BoxAddresses + add hl, de + ld a, [hli] + call OpenSRAM + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + cp MONS_PER_BOX + jr nc, .full + ; update count and species list + push hl + inc [hl] + inc hl + ld d, 0 + ld e, a + add hl, de + ld a, [wDebugRoomMonSpecies] + ld [hli], a + ld [hl], -1 + pop hl + ; skip count and species list + ld bc, 2 + MONS_PER_BOX + add hl, bc + ; update Nth box mon + push de + push hl + ld a, e + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wDebugRoomMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + pop hl + pop de + ; skip box mons + ld bc, BOXMON_STRUCT_LENGTH * MONS_PER_BOX + add hl, bc + ; update Nth OT name + push de + push hl + ld a, e + ld bc, NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, .OTString + ld bc, NAME_LENGTH + call CopyBytes + pop hl + pop de + ; skip OT names + ld bc, NAME_LENGTH * MONS_PER_BOX + add hl, bc + ; update Nth nickname + push de + push hl + ld a, e + ld bc, MON_NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, .NicknameString + ld bc, MON_NAME_LENGTH + call CopyBytes + pop hl + pop de + call CloseSRAM + ld hl, .CompletedText + call MenuTextbox + call DebugRoom_JoyWaitABSelect + call CloseWindow + ret + +.full + call CloseSRAM + ld hl, .BoxIsFullText + call MenuTextbox + call DebugRoom_JoyWaitABSelect + call CloseWindow + ret + +.OTString: + db "DEBUG▶OT@" + +.NicknameString: + db "DEBUG▶@" + +.CompletedText: + text "COMPLETED!" + done + +.BoxIsFullText: + text "BOX IS FULL!" + done + +DebugRoom_PrintPokemonName: + ld [wNamedObjectIndexBuffer], a + push bc + call GetPokemonName + jr _DebugRoom_FinishGetName + +DebugRoom_PrintItemName2: + ld [wNamedObjectIndexBuffer], a + push bc + call GetItemName + jr _DebugRoom_FinishGetName + +DebugRoom_PrintMoveName: + ld [wNamedObjectIndexBuffer], a + push bc + call GetMoveName + jr _DebugRoom_FinishGetName + +_DebugRoom_FinishGetName: + pop hl + push hl + lb bc, 1, 12 + call ClearBox + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +DebugRoom_UpdateExpForLevel: + ld hl, BaseData + BASE_GROWTH_RATE + ld bc, BASE_DATA_SIZE + ld a, [wDebugRoomMonSpecies] + dec a + call AddNTimes + ld a, BANK(BaseData) + call GetFarByte + ld [wBaseGrowthRate], a + ld a, [wDebugRoomMonLevel] + ld d, a + farcall CalcExpAtLevel + ld hl, wDebugRoomMonExp + ldh a, [hProduct + 1] + ld [hli], a + ldh a, [hProduct + 2] + ld [hli], a + ldh a, [hProduct + 3] + ld [hl], a + ret + +DebugRoomMenu_PokemonGet_Page1Values: + db 8 + paged_value wDebugRoomMonSpecies, 1, NUM_POKEMON, BULBASAUR, DebugRoom_BoxStructStrings.Pokemon, DebugRoom_PrintPokemonName, FALSE + paged_value wDebugRoomMonItem, 1, $ff, MASTER_BALL, DebugRoom_BoxStructStrings.Item, DebugRoom_PrintItemName2, FALSE + paged_value wDebugRoomMonMoves+0, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move1, DebugRoom_PrintMoveName, FALSE + paged_value wDebugRoomMonMoves+1, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move2, DebugRoom_PrintMoveName, FALSE + paged_value wDebugRoomMonMoves+2, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move3, DebugRoom_PrintMoveName, FALSE + paged_value wDebugRoomMonMoves+3, 1, NUM_ATTACKS, POUND, DebugRoom_BoxStructStrings.Move4, DebugRoom_PrintMoveName, FALSE + paged_value wDebugRoomMonID+0, $00, $ff, HIGH(1234), DebugRoom_BoxStructStrings.ID0, NULL, FALSE + paged_value wDebugRoomMonID+1, $00, $ff, LOW(1234), DebugRoom_BoxStructStrings.ID1, NULL, FALSE + +DebugRoomMenu_PokemonGet_Page2Values: + db 8 + paged_value wDebugRoomMonHPExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.HPExp0, NULL, FALSE + paged_value wDebugRoomMonHPExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.HPExp1, NULL, FALSE + paged_value wDebugRoomMonAtkExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.AttkExp0, NULL, FALSE + paged_value wDebugRoomMonAtkExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.AttkExp1, NULL, FALSE + paged_value wDebugRoomMonDefExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.DfnsExp0, NULL, FALSE + paged_value wDebugRoomMonDefExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.DfnsExp1, NULL, FALSE + paged_value wDebugRoomMonSpdExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.SpeedExp0, NULL, FALSE + paged_value wDebugRoomMonSpdExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.SpeedExp1, NULL, FALSE + +DebugRoomMenu_PokemonGet_Page3Values: + db 8 + paged_value wDebugRoomMonSpcExp+0, $00, $ff, $00, DebugRoom_BoxStructStrings.SpclExp0, NULL, FALSE + paged_value wDebugRoomMonSpcExp+1, $00, $ff, $00, DebugRoom_BoxStructStrings.SpclExp1, NULL, FALSE + paged_value wDebugRoomMonDVs+0, $00, $ff, $00, DebugRoom_BoxStructStrings.PowerRnd0, NULL, TRUE + paged_value wDebugRoomMonDVs+1, $00, $ff, $00, DebugRoom_BoxStructStrings.PowerRnd1, NULL, TRUE + paged_value wDebugRoomMonPP+0, $00, $ff, $00, DebugRoom_BoxStructStrings.PP1, NULL, FALSE + paged_value wDebugRoomMonPP+1, $00, $ff, $00, DebugRoom_BoxStructStrings.PP2, NULL, FALSE + paged_value wDebugRoomMonPP+2, $00, $ff, $00, DebugRoom_BoxStructStrings.PP3, NULL, FALSE + paged_value wDebugRoomMonPP+3, $00, $ff, $00, DebugRoom_BoxStructStrings.PP4, NULL, FALSE + +DebugRoomMenu_PokemonGet_Page4Values: + db 6 + paged_value wDebugRoomMonHappiness, $00, $ff, BASE_HAPPINESS, DebugRoom_BoxStructStrings.Friend, NULL, FALSE + paged_value wDebugRoomMonPokerusStatus, $00, $ff, $00, DebugRoom_BoxStructStrings.Pokerus, NULL, TRUE + paged_value wDebugRoomMonCaughtData+0, $00, $ff, $00, DebugRoom_BoxStructStrings.NoUse0, NULL, FALSE + paged_value wDebugRoomMonCaughtData+1, $00, $ff, $00, DebugRoom_BoxStructStrings.NoUse1, NULL, FALSE + paged_value wDebugRoomMonLevel, 1, MAX_LEVEL, $05, DebugRoom_BoxStructStrings.Level, NULL, FALSE + paged_value wDebugRoomMonBox, 1, NUM_BOXES, $0e, DebugRoom_BoxStructStrings.SendBox, NULL, FALSE + +DebugRoom_BoxStructStrings: +.Pokemon: db "#MON@" +.Item: db "ITEM@" +.Move1: db "MOVE 1@" +.Move2: db "MOVE 2@" +.Move3: db "MOVE 3@" +.Move4: db "MOVE 4@" +.ID0: db "ID[0]@" +.ID1: db "ID[1]@" +.BaseExp0: db "BASE EXP[0]@" +.BaseExp1: db "BASE EXP[1]@" +.BaseExp2: db "BASE EXP[2]@" +.HPExp0: db "HP EXP[0]@" +.HPExp1: db "HP EXP[1]@" +.AttkExp0: db "ATTK EXP[0]@" +.AttkExp1: db "ATTK EXP[1]@" +.DfnsExp0: db "DFNS EXP[0]@" +.DfnsExp1: db "DFNS EXP[1]@" +.SpeedExp0: db "SPEED EXP[0]@" +.SpeedExp1: db "SPEED EXP[1]@" +.SpclExp0: db "SPCL EXP[0]@" +.SpclExp1: db "SPCL EXP[1]@" +.PowerRnd0: db "POWER RND[0] RARE:--1-1010@" +.PowerRnd1: db "POWER RND[1] RARE:10101010@" +.PP1: db "PP 1@" +.PP2: db "PP 2@" +.PP3: db "PP 3@" +.PP4: db "PP 4@" +.Friend: db "FRIEND@" +.Pokerus: db "#RUS@" +.NoUse0: db "NO USE[0]@" +.NoUse1: db "NO USE[1]@" +.Level: db "LEVEL@" +.SendBox: db "SEND BOX@" + +DebugRoom_BoxAddresses: + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 + +DebugRoomMenu_RTCEdit: + ld hl, .PagedValuesHeader + call DebugRoom_EditPagedValues + ret + +.PagedValuesHeader: + dw NULL ; A function + dw NULL ; Select function + dw DebugRoom_SaveRTC ; Start function + dw DebugRoomMenu_RTCEdit_UpdateClock ; Auto function + db 1 ; # pages + dw DebugRoomMenu_RTCEdit_Page1Values + +DebugRoom_SaveRTC: + call YesNoBox + ret c + ld hl, wDebugRoomRTCSec + call DebugRoom_SetClock + ret + +DebugRoomMenu_RTCEdit_UpdateClock: + ld hl, wDebugRoomRTCCurSec + call DebugRoom_GetClock + ld de, DebugRoom_DayHTimeString + hlcoord 3, 14 + call PlaceString + ld a, [wDebugRoomRTCCurDay + 0] + ld h, a + ld a, [wDebugRoomRTCCurDay + 1] + ld l, a + push hl + ld hl, sp+0 + ld d, h + ld e, l + hlcoord 7, 14 + ld c, 2 + call PrintHexNumber + pop hl + hlcoord 8, 15 + ld de, wDebugRoomRTCCurHour + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld [hl], ":" + inc hl + ld de, wDebugRoomRTCCurMin + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld [hl], ":" + inc hl + ld de, wDebugRoomRTCCurSec + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret + +DebugRoom_DayHTimeString: + db "DAY HTIME@" + +DebugRoom_GetClock: + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + xor a + ld [MBC3LatchClock], a + inc a + ld [MBC3LatchClock], a + ld b, RTC_DH - RTC_S + 1 + ld c, RTC_S +.loop + ld a, c + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + ld [hli], a + inc c + dec b + jr nz, .loop + call CloseSRAM + ret + +DebugRoom_SetClock: + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + ld b, RTC_DH - RTC_S + 1 + ld c, RTC_S +.loop + ld a, c + ld [MBC3SRamBank], a + ld a, [hli] + ld [MBC3RTC], a + inc c + dec b + jr nz, .loop + call CloseSRAM + ret + +DebugRoomMenu_RTCEdit_Page1Values: + db 5 + paged_value wDebugRoomRTCSec, 0, 60 - 1, 0, .SecondString, NULL, FALSE + paged_value wDebugRoomRTCMin, 0, 60 - 1, 0, .MinuteString, NULL, FALSE + paged_value wDebugRoomRTCHour, 0, 24 - 1, 0, .HourString, NULL, FALSE + paged_value wDebugRoomRTCDay+0, $00, $ff, 0, .DayLString, NULL, TRUE + paged_value wDebugRoomRTCDay+1, $00, $ff, 0, .DayHString, NULL, TRUE + +.SecondString: db "SECOND@" +.MinuteString: db "MINUTE@" +.HourString: db "HOUR@" +.DayLString: db "DAY L@" +.DayHString: db "DAY H BIT0:DAY MSB BIT6:HALT BIT7:DAY CARRY@" + +DebugRoomMenu_HaltChkClr: + call YesNoBox + ret c + ld a, BANK(sRTCHaltCheckValue) + call OpenSRAM + xor a + ld hl, sRTCHaltCheckValue + ld [hli], a + ld [hl], a + call CloseSRAM + call DebugRoom_PrintRTCHaltChk + ret + +DebugRoom_PrintRTCHaltChk: + hlcoord 16, 9 + ld de, .RTCString + call PlaceString + ld a, BANK(sRTCHaltCheckValue) + ld hl, sRTCHaltCheckValue + call OpenSRAM + ld a, [hli] + ld h, [hl] + ld l, a + call CloseSRAM + ld de, .HaltString + ld a, h + cp HIGH(RTC_HALT_VALUE) + jr nz, .ok + ld a, l + cp LOW(RTC_HALT_VALUE) + jr z, .done +.ok + ld de, .OKString +.done + hlcoord 16, 10 + call PlaceString + ret + +.RTCString: + db "RTC:@" + +.OKString: + db " OK@" + +.HaltString: + db "HALT@" + +DebugRoomMenu_GBIDSet: + ld hl, .PagedValuesHeader + call DebugRoom_EditPagedValues + ret + +.PagedValuesHeader: + dw NULL ; A function + dw NULL ; Select function + dw DebugRoom_SaveGBID ; Start function + dw NULL ; Auto function + db 1 ; # pages + dw DebugRoomMenu_GBIDSet_Page1Values + +DebugRoom_SaveGBID: + call YesNoBox + ret c + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld a, [wDebugRoomGBID + 0] + ld [hli], a + ld a, [wDebugRoomGBID + 1] + ld [hli], a + call CloseSRAM + call DebugRoom_SaveChecksum + ret + +DebugRoomMenu_GBIDSet_Page1Values: + db 2 + paged_value wDebugRoomGBID+0, $00, $ff, $00, .GBID0String, NULL, TRUE + paged_value wDebugRoomGBID+1, $00, $ff, $00, .GBID1String, NULL, TRUE + +.GBID0String: db "GB ID [0]@" +.GBID1String: db "GB ID [1]@" + +DebugRoomMenu_BtlRecClr: + call YesNoBox + ret c + ld a, BANK(sLinkBattleStats) + call OpenSRAM + xor a + ld hl, sLinkBattleStats + ld bc, sLinkBattleStatsEnd - sLinkBattleStats + call ByteFill + call CloseSRAM + ret + +DebugRoomMenu_HOFClear: + call YesNoBox + ret c + ld a, BANK(sPlayerData) + call OpenSRAM + ld hl, sPlayerData + (wHallOfFameCount - wPlayerData) + ld [hl], 0 + xor a + ld hl, sHallOfFame + ld bc, sHallOfFameEnd - sHallOfFame + call ByteFill + call CloseSRAM + call DebugRoom_SaveChecksum + ret + +ComputeROMChecksum: + ld de, 0 + call .ComputeROM0Checksum + ld c, $01 ; first bank +.loop: + push bc + push de + ld a, c + cpl + inc a + add $80 + ld de, wDebugRoomCurChecksumBank + ld [de], a + hlcoord 16, 16 + ld c, 1 + call PrintHexNumber + ld [hl], "h" + pop de + pop bc + call ComputeROMXChecksum + inc c + ld a, c + cp $80 ; number of banks + jr c, .loop + ld a, d + ld [wDebugRoomROMChecksum + 0], a + ld a, e + ld [wDebugRoomROMChecksum + 1], a + ret + +.AddAtoDE: + add e + ld e, a + ld a, d + adc 0 + ld d, a + ret + +.ComputeROM0Checksum: + ld hl, $0000 ; ROM0 start +.rom0_loop + ld a, [hli] + call .AddAtoDE + ld a, h + cp $40 ; HIGH(ROM0 end) + jr c, .rom0_loop + ret + +.ComputeROMXChecksum: ; unreferenced + ld hl, $4000 ; ROMX start +.romx_loop + ld a, c + call GetFarByte + inc hl + call .AddAtoDE + ld a, h + cp $80 ; HIGH(ROMX end) + jr c, .romx_loop + ret + +DebugRoom_PrintROMChecksum: ; unreferenced + hlcoord 16, 0 + ld de, .SumString + call PlaceString + hlcoord 16, 1 + ld de, wDebugRoomROMChecksum + ld c, 2 + call PrintHexNumber + ret + +.SumString: + db "SUM:@" + +DebugRoomMenu_ROMChecksum: + ld hl, .WaitText + call MenuTextbox + call ComputeROMChecksum + call CloseWindow + ld hl, .ROMChecksumText + call MenuTextbox + hlcoord 14, 14 + ld de, wDebugRoomROMChecksum + ld c, 2 + call PrintHexNumber + ld [hl], "h" + call DebugRoom_JoyWaitABSelect + call CloseWindow + ret + +.WaitText: + text "Wait..." + done + +.ROMChecksumText: + text "ROM CHECKSUM:" + next "" + done + +DebugRoomMenu_BTBugPoke: + ld a, BANK(sIsBugMon) + call OpenSRAM + ld a, [sIsBugMon] + call CloseSRAM + or a + jr nz, .bug_mon + ld hl, .NoBugMonText + call MenuTextbox + call DebugRoom_JoyWaitABSelect + call CloseWindow + ret + +.NoBugMonText: + text "No bug #MON." + done + +.bug_mon: + ld hl, .ItsBugMonText + call MenuTextbox + ld a, BANK(sIsBugMon) + call OpenSRAM + hlcoord 4, 16 + ld de, sIsBugMon + ld c, 1 + call PrintHexNumber + ld [hl], "h" + call YesNoBox + jr c, .done + xor a + ld [sIsBugMon], a +.done + call CloseSRAM + call CloseWindow + ret + +.ItsBugMonText: + text "It'", "s bug #MON!" + next "No. Clear flag?" + done + +PrintHexNumber: +; Print the c-byte value from de to hl as hexadecimal digits. +.loop + push bc + call .HandleByte + pop bc + dec c + jr nz, .loop + ret + +.HandleByte: + ld a, [de] + swap a + and $f + call .PrintDigit + ld [hli], a + ld a, [de] + and $f + call .PrintDigit + ld [hli], a + inc de + ret + +.PrintDigit: + ld bc, .HexDigits + add c + ld c, a + ld a, 0 + adc b + ld b, a + ld a, [bc] + ret + +.HexDigits: + db "0123456789ABCDEF" diff --git a/engine/items/items.asm b/engine/items/items.asm index a08f76d31..78b0e2cd9 100644 --- a/engine/items/items.asm +++ b/engine/items/items.asm @@ -168,7 +168,7 @@ PutItemInPocket: jr z, .terminator cp c jr nz, .next - ld a, 99 + ld a, MAX_ITEM_STACK sub [hl] add b ld b, a @@ -205,14 +205,14 @@ PutItemInPocket: jr nz, .loop2 ld a, [wItemQuantityBuffer] add [hl] - cp 100 + cp MAX_ITEM_STACK + 1 jr nc, .newstack ld [hl], a jr .done .newstack - ld [hl], 99 - sub 99 + ld [hl], MAX_ITEM_STACK + sub MAX_ITEM_STACK ld [wItemQuantityBuffer], a jr .loop2 @@ -408,7 +408,7 @@ ReceiveTMHM: add hl, bc ld a, [wItemQuantityChangeBuffer] add [hl] - cp 100 + cp MAX_ITEM_STACK + 1 jr nc, .toomany ld [hl], a scf diff --git a/engine/items/mart.asm b/engine/items/mart.asm index a0773df4a..b8c32c203 100644 --- a/engine/items/mart.asm +++ b/engine/items/mart.asm @@ -498,7 +498,7 @@ BuyMenuLoop: ret StandardMartAskPurchaseQuantity: - ld a, 99 + ld a, MAX_ITEM_STACK ld [wItemQuantityBuffer], a ld a, MARTTEXT_HOW_MANY call LoadBuyMenuText @@ -557,7 +557,7 @@ RooftopSaleAskPurchaseQuantity: ld a, MARTTEXT_HOW_MANY call LoadBuyMenuText call .GetSalePrice - ld a, 99 + ld a, MAX_ITEM_STACK ld [wItemQuantityBuffer], a farcall RooftopSale_SelectQuantityToBuy call ExitMenu diff --git a/engine/items/switch_items.asm b/engine/items/switch_items.asm index 680e548c1..fc6fce6a4 100644 --- a/engine/items/switch_items.asm +++ b/engine/items/switch_items.asm @@ -96,11 +96,11 @@ Function249a7: jr nz, .asm_249cd ld a, [wScrollingMenuCursorPosition] call Function24a97 - cp 99 + cp MAX_ITEM_STACK jr z, .asm_249cd ld a, [wSwitchItem] call Function24a97 - cp 99 + cp MAX_ITEM_STACK jr nz, .asm_249cf .asm_249cd and a @@ -121,14 +121,14 @@ Function249d1: ld a, [hl] pop hl add [hl] - cp 100 + cp MAX_ITEM_STACK + 1 jr c, .asm_24a01 - sub 99 + sub MAX_ITEM_STACK push af ld a, [wScrollingMenuCursorPosition] call ItemSwitch_GetNthItem inc hl - ld [hl], 99 + ld [hl], MAX_ITEM_STACK ld a, [wSwitchItem] call ItemSwitch_GetNthItem inc hl diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm index 0c8d38375..31809be46 100644 --- a/engine/menus/intro_menu.asm +++ b/engine/menus/intro_menu.asm @@ -88,6 +88,12 @@ AreYouABoyOrAreYouAGirl: farcall InitMobileProfile ; mobile ret +if DEF(_DEBUG) +DebugRoom: ; unreferenced + farcall _DebugRoom + ret +endc + ResetWRAM: xor a ldh [hBGMapMode], a diff --git a/engine/menus/main_menu.asm b/engine/menus/main_menu.asm index 775573a60..fcbd7d430 100644 --- a/engine/menus/main_menu.asm +++ b/engine/menus/main_menu.asm @@ -18,6 +18,7 @@ const MAINMENUITEM_MYSTERY_GIFT ; 3 const MAINMENUITEM_MOBILE ; 4 const MAINMENUITEM_MOBILE_STUDIUM ; 5 + const MAINMENUITEM_DEBUG_ROOM ; 6 MobileMenuGFX: INCBIN "gfx/mobile/mobile_menu.2bpp" @@ -70,6 +71,9 @@ MainMenu: db "MYSTERY GIFT@" db "MOBILE@" db "MOBILE STUDIUM@" +if DEF(_DEBUG) + db "DEBUG ROOM@" +endc .Jumptable: ; entries correspond to MAINMENUITEM_* constants @@ -79,6 +83,9 @@ MainMenu: dw MainMenu_MysteryGift dw MainMenu_Mobile dw MainMenu_MobileStudium +if DEF(_DEBUG) + dw MainMenu_DebugRoom +endc MainMenuItems: ; entries correspond to MAINMENU_* constants @@ -90,71 +97,95 @@ MainMenuItems: db -1 ; MAINMENU_CONTINUE - db 3 + db 3 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MOBILE_MYSTERY - db 5 + db 5 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MYSTERY_GIFT db MAINMENUITEM_MOBILE +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MOBILE - db 4 + db 4 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MOBILE +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MOBILE_STUDIUM - db 5 + db 5 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MOBILE db MAINMENUITEM_MOBILE_STUDIUM +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MYSTERY_MOBILE_STUDIUM - db 6 + db 6 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MYSTERY_GIFT db MAINMENUITEM_MOBILE db MAINMENUITEM_MOBILE_STUDIUM +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MYSTERY - db 4 + db 4 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MYSTERY_GIFT +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_MYSTERY_STUDIUM - db 5 + db 5 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MYSTERY_GIFT db MAINMENUITEM_MOBILE_STUDIUM +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 ; MAINMENU_STUDIUM - db 4 + db 4 + DEF(_DEBUG) db MAINMENUITEM_CONTINUE db MAINMENUITEM_NEW_GAME db MAINMENUITEM_OPTION db MAINMENUITEM_MOBILE_STUDIUM +if DEF(_DEBUG) + db MAINMENUITEM_DEBUG_ROOM +endc db -1 MainMenu_GetWhichMenu: diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm index da6d6745a..86807119d 100644 --- a/engine/overworld/time.asm +++ b/engine/overworld/time.asm @@ -25,6 +25,20 @@ NextCallReceiveDelay: ld hl, .ReceiveCallDelays add hl, de ld a, [hl] +if DEF(_DEBUG) + ld h, a + ld a, BANK(sDebugTimeCyclesSinceLastCall) + call OpenSRAM + ld a, [sDebugTimeCyclesSinceLastCall] + call CloseSRAM + dec a + cp 2 + jr nc, .debug_ok + xor 1 + ld h, a +.debug_ok + ld a, h +endc jp RestartReceiveCallDelay .ReceiveCallDelays: diff --git a/engine/pokemon/stats_screen.asm b/engine/pokemon/stats_screen.asm index e7fc4f8b2..97121aa3d 100644 --- a/engine/pokemon/stats_screen.asm +++ b/engine/pokemon/stats_screen.asm @@ -185,6 +185,10 @@ EggStatsJoypad: .check bit A_BUTTON_F, a jr nz, .quit +if DEF(_DEBUG) + cp START + jr z, .hatch +endc and D_DOWN | D_UP | A_BUTTON | B_BUTTON jp StatsScreen_JoypadAction @@ -193,6 +197,39 @@ EggStatsJoypad: call StatsScreen_SetJumptableIndex ret +if DEF(_DEBUG) +.hatch + ld a, [wMonType] + or a + jr nz, .skip + push bc + push de + push hl + ld a, [wCurPartyMon] + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Happiness + call AddNTimes + ld [hl], 1 + ld a, 1 + ld [wTempMonHappiness], a + ld a, 127 + ld [wStepCount], a + ld de, .HatchSoonString + hlcoord 8, 17 + call PlaceString + ld hl, wcf64 + set 5, [hl] + pop hl + pop de + pop bc +.skip + xor a + jp StatsScreen_JoypadAction + +.HatchSoonString: + db "▶HATCH SOON!@" +endc + StatsScreen_LoadPage: call StatsScreen_LoadGFX ld hl, wcf64 @@ -970,6 +1007,17 @@ EggStatsScreen: ld de, FiveQMarkString hlcoord 11, 5 call PlaceString +if DEF(_DEBUG) + ld de, .PushStartString + hlcoord 8, 17 + call PlaceString + jr .placed_push_start + +.PushStartString: + db "▶PUSH START.@" + +.placed_push_start +endc ld a, [wTempMonHappiness] ; egg status ld de, EggSoonString cp $6 diff --git a/home/map.asm b/home/map.asm index dfebff9b7..261e044d6 100644 --- a/home/map.asm +++ b/home/map.asm @@ -1138,7 +1138,7 @@ MaskObject:: ld d, $0 ld hl, wObjectMasks add hl, de - ld [hl], -1 ; , masked + ld [hl], -1 ; masked ret UnmaskObject:: @@ -1150,6 +1150,28 @@ UnmaskObject:: ld [hl], 0 ; unmasked ret +if DEF(_DEBUG) +ComputeROMXChecksum:: + ldh a, [hROMBank] + push af + ld a, c + rst Bankswitch + ld hl, $4000 ; ROMX start +.loop + ld a, [hli] + add e + ld e, a + ld a, d + adc 0 + ld d, a + ld a, h + cp $80 ; HIGH(ROMX end) + jr c, .loop + pop af + rst Bankswitch + ret +endc + ScrollMapUp:: hlcoord 0, 0 ld de, wBGMapBuffer diff --git a/home/sram.asm b/home/sram.asm index baf21bb32..6999f7ed8 100644 --- a/home/sram.asm +++ b/home/sram.asm @@ -2,6 +2,22 @@ OpenSRAM:: ; if invalid bank, sram is disabled cp NUM_SRAM_BANKS jr c, .valid +if DEF(_DEBUG) + push af + push bc + ld b, 1 +.loop + sla b + dec a + jr nz, .loop + ld a, BANK(sOpenedInvalidSRAM) + call OpenSRAM + ld a, [sOpenedInvalidSRAM] + or b + ld [sOpenedInvalidSRAM], a + pop bc + pop af +endc jr CloseSRAM .valid: diff --git a/hram.asm b/hram.asm index f3cbd3435..8c04adc0b 100644 --- a/hram.asm +++ b/hram.asm @@ -165,6 +165,10 @@ hSGB:: db hDMATransfer:: db hMobile:: db hSystemBooted:: db + +if DEF(_DEBUG) +hDebugRoomMenuPage:: +endc hClockResetTrigger:: db ds 19 diff --git a/layout.link b/layout.link index eac395eae..a911b67d6 100644 --- a/layout.link +++ b/layout.link @@ -294,6 +294,7 @@ ROMX $77 "Tileset Data 7" "bank77_2" ROMX $78 + "Debug Room" "Tileset Data 8" ROMX $7b "Battle Tower Text" diff --git a/main.asm b/main.asm index f90fad682..e535651d7 100644 --- a/main.asm +++ b/main.asm @@ -290,7 +290,7 @@ INCLUDE "engine/overworld/player_movement.asm" INCLUDE "engine/events/engine_flags.asm" INCLUDE "engine/overworld/variables.asm" INCLUDE "data/text/battle.asm" -INCLUDE "engine/menus/debug.asm" +INCLUDE "engine/debug/color_picker.asm" SECTION "bank21", ROMX @@ -696,6 +696,13 @@ INCBIN "gfx/pokegear/pokegear.2bpp.lz" INCLUDE "engine/pokemon/european_mail.asm" +SECTION "Debug Room", ROMX + +if DEF(_DEBUG) +INCLUDE "engine/debug/debug_room.asm" +endc + + SECTION "Battle Tower Text", ROMX INCLUDE "data/battle_tower/trainer_text.asm" @@ -722,7 +729,15 @@ SECTION "Mobile Stadium 2", ROMX if DEF(_CRYSTAL_AU) INCBIN "mobile/stadium/stadium2_au.bin" elif DEF(_CRYSTAL11) +if DEF(_DEBUG) +INCBIN "mobile/stadium/stadium2_11_debug.bin" +else INCBIN "mobile/stadium/stadium2_11.bin" +endc +else +if DEF(_DEBUG) +INCBIN "mobile/stadium/stadium2_debug.bin" else INCBIN "mobile/stadium/stadium2.bin" endc +endc diff --git a/mobile/mobile_menu.asm b/mobile/mobile_menu.asm index bab29dcb4..f1d84f519 100644 --- a/mobile/mobile_menu.asm +++ b/mobile/mobile_menu.asm @@ -844,3 +844,9 @@ Function4a6d8: dec b jr nz, Function4a6d8 ret + +if DEF(_DEBUG) +MainMenu_DebugRoom: + farcall _DebugRoom + ret +endc diff --git a/mobile/stadium/stadium2_11_debug.bin b/mobile/stadium/stadium2_11_debug.bin new file mode 100644 index 000000000..6d838e845 Binary files /dev/null and b/mobile/stadium/stadium2_11_debug.bin differ diff --git a/mobile/stadium/stadium2_debug.bin b/mobile/stadium/stadium2_debug.bin new file mode 100644 index 000000000..9a63e4623 Binary files /dev/null and b/mobile/stadium/stadium2_debug.bin differ diff --git a/roms.sha1 b/roms.sha1 index d63d39632..bdb13b80a 100644 --- a/roms.sha1 +++ b/roms.sha1 @@ -1,3 +1,5 @@ f4cd194bdee0d04ca4eac29e09b8e4e9d818c133 *pokecrystal.gbc f2f52230b536214ef7c9924f483392993e226cfb *pokecrystal11.gbc -a0fc810f1d4e124434f7be2c989ab5b5892ddf36 *pokecrystal-au.gbc +a0fc810f1d4e124434f7be2c989ab5b5892ddf36 *pokecrystal_au.gbc +c60d57a24bbe8ecf7cba54ab3f90669f97bd330d *pokecrystal_debug.gbc +391ae86b1d5a26db712ffe6c28bbf2a1f804c3c4 *pokecrystal11_debug.gbc diff --git a/sram.asm b/sram.asm index d6ad4ff1c..36b0a61e8 100644 --- a/sram.asm +++ b/sram.asm @@ -90,6 +90,14 @@ sBackupCheckValue2:: db ; loaded with SAVE_CHECK_VALUE_2, used to check save cor sStackTop:: dw +if DEF(_DEBUG) +sRTCHaltCheckValue:: dw +sSkipBattle:: db +sDebugTimeCyclesSinceLastCall:: db +sOpenedInvalidSRAM:: db +sIsBugMon:: db +endc + SECTION "Save", SRAM diff --git a/wram.asm b/wram.asm index cc278956c..5d6c41688 100644 --- a/wram.asm +++ b/wram.asm @@ -1177,6 +1177,49 @@ wccb5:: ds 3 wccb8:: ds 1 wccb9:: ds 1 wccba:: ds 102 + +if DEF(_DEBUG) +NEXTU +; debug room + +; debug room RTC values +wDebugRoomRTCSec:: db +wDebugRoomRTCMin:: db +wDebugRoomRTCHour:: db +wDebugRoomRTCDay:: dw +wDebugRoomRTCCurSec:: db +wDebugRoomRTCCurMin:: db +wDebugRoomRTCCurHour:: db +wDebugRoomRTCCurDay:: dw + +; debug room paged values +wDebugRoomCurPage:: db +wDebugRoomCurValue:: db +wDebugRoomAFunction:: dw +wDebugRoomStartFunction:: dw +wDebugRoomSelectFunction:: dw +wDebugRoomAutoFunction:: dw +wDebugRoomPageCount:: db +wDebugRoomPagedValuesPtr:: dw + +wDebugRoomROMChecksum:: dw +wDebugRoomCurChecksumBank:: db + +UNION +; debug room new item values +wDebugRoomItemID:: db +wDebugRoomItemQuantity:: db +NEXTU +; debug room new pokemon values +wDebugRoomMon:: box_struct wDebugRoomMon +wDebugRoomMonBox:: db +NEXTU +; debug room GB ID values +wDebugRoomGBID:: dw +ENDU + +endc + ENDU