summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Harding <33dannye@gmail.com>2020-11-07 21:28:20 -0600
committerGitHub <noreply@github.com>2020-11-07 21:28:20 -0600
commitedf375aff14e54bd54e7a25780fe8b714691ccc7 (patch)
tree015c63e79e4a245c28f72b18954f2a845d30271c
parent338f1276b48ce1394cb9de52b7646e9f8618b1b9 (diff)
parentead36b7ba24413fe0f4423ee1efa6fe88bab0a3c (diff)
Merge pull request #63 from dannye/debug
Debug Yellow
-rw-r--r--Makefile31
-rw-r--r--audio.asm4
-rwxr-xr-xdata/maps/objects/RedsHouse2F.asm6
-rw-r--r--data/text/text_2.asm2
-rwxr-xr-xengine/battle/core.asm27
-rw-r--r--engine/debug/debug_menu.asm1636
-rw-r--r--engine/debug/debug_party.asm135
-rw-r--r--engine/events/hidden_objects/safari_game.asm4
-rw-r--r--engine/gfx/bg_map_attributes.asm2
-rwxr-xr-xengine/movie/title.asm12
-rwxr-xr-xengine/pikachu/pikachu_emotions.asm55
-rwxr-xr-xengine/pikachu/pikachu_pic_animation.asm3
-rw-r--r--home/npc_movement.asm8
-rw-r--r--home/overworld.asm4
-rw-r--r--home/text.asm4
-rw-r--r--home/trainers.asm4
-rw-r--r--layout.link1
-rwxr-xr-xmain.asm17
-rw-r--r--roms.sha11
-rwxr-xr-xscripts/CeruleanCity.asm4
-rwxr-xr-xscripts/MtMoonB2F.asm4
-rwxr-xr-xscripts/PalletTown.asm29
-rwxr-xr-xscripts/PewterCity.asm4
-rwxr-xr-xscripts/PokemonTower2F.asm4
-rwxr-xr-xscripts/PokemonTower7F.asm4
-rwxr-xr-xscripts/RocketHideoutB4F.asm4
-rwxr-xr-xscripts/SilphCo11F.asm4
-rwxr-xr-xwram.asm4
28 files changed, 1967 insertions, 50 deletions
diff --git a/Makefile b/Makefile
index 52b6e875..e6ca41ce 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-rom := pokeyellow.gbc
+roms := pokeyellow.gbc pokeyellow_debug.gbc
rom_obj := \
audio.o \
@@ -12,6 +12,9 @@ gfx/pikachu.o \
gfx/sprites.o \
gfx/tilesets.o
+pokeyellow_obj := $(rom_obj)
+pokeyellow_debug_obj := $(rom_obj:.o=_debug.o)
+
### Build tools
@@ -34,20 +37,21 @@ RGBLINK ?= $(RGBDS)rgblink
.SECONDEXPANSION:
.PRECIOUS:
.SECONDARY:
-.PHONY: all yellow clean tidy compare tools
+.PHONY: all yellow yellow_debug clean tidy compare tools
-all: $(rom)
-yellow: $(rom)
+all: $(roms)
+yellow: pokeyellow.gbc
+yellow_debug: pokeyellow_debug.gbc
clean: tidy
find gfx \( -iname '*.1bpp' -o -iname '*.2bpp' -o -iname '*.pic' \) -delete
find audio/pikachu_cries \( -iname '*.pcm' \) -delete
tidy:
- rm -f $(rom) $(rom_obj) $(rom:.gbc=.map) $(rom:.gbc=.sym) rgbdscheck.o
+ rm -f $(roms) $(pokeyellow_obj) $(pokeyellow_debug_obj) $(roms:.gbc=.map) $(roms:.gbc=.sym) rgbdscheck.o
$(MAKE) clean -C tools/
-compare: $(rom)
+compare: $(roms)
@$(SHA1) -c roms.sha1
tools:
@@ -60,6 +64,8 @@ ifeq ($(DEBUG),1)
RGBASMFLAGS += -E
endif
+$(pokeyellow_debug_obj): RGBASMFLAGS += -D _DEBUG
+
rgbdscheck.o: rgbdscheck.asm
$(RGBASM) -o $@ $<
@@ -78,18 +84,23 @@ ifeq (,$(filter clean tidy tools,$(MAKECMDGOALS)))
$(info $(shell $(MAKE) -C tools))
# Dependencies for objects
-$(foreach obj, $(rom_obj), $(eval $(call DEP,$(obj),$(obj:.o=.asm))))
+$(foreach obj, $(pokeyellow_obj), $(eval $(call DEP,$(obj),$(obj:.o=.asm))))
+$(foreach obj, $(pokeyellow_debug_obj), $(eval $(call DEP,$(obj),$(obj:_debug.o=.asm))))
endif
%.asm: ;
+
+pokeyellow_pad = 0x00
+pokeyellow_debug_pad = 0xff
+
opts = -cjsv -k 01 -l 0x33 -m 0x1b -p 0 -r 03 -t "POKEMON YELLOW"
-$(rom): $(rom_obj) layout.link
- $(RGBLINK) -m $(rom:.gbc=.map) -n $(rom:.gbc=.sym) -l layout.link -o $@ $(filter %.o,$^)
- $(RGBFIX) $(opts) $@
+%.gbc: $$(%_obj) layout.link
+ $(RGBLINK) -p $($*_pad) -m $*.map -n $*.sym -l layout.link -o $@ $(filter %.o,$^)
+ $(RGBFIX) -p $($*_pad) $(opts) $@
### Misc file-specific graphics rules
diff --git a/audio.asm b/audio.asm
index 2434bf07..15d50c26 100644
--- a/audio.asm
+++ b/audio.asm
@@ -539,7 +539,9 @@ INCLUDE "audio/music/surfingpikachu.asm"
INCLUDE "audio/music/yellowunusedsong.asm"
INCLUDE "audio/music/meetjessiejames.asm"
-INCBIN "garbage/bank20.bin"
+IF !DEF(_DEBUG)
+ INCBIN "garbage/bank20.bin"
+ENDC
; Pikachu cries are in different banks
diff --git a/data/maps/objects/RedsHouse2F.asm b/data/maps/objects/RedsHouse2F.asm
index 826e68fd..2a254ec1 100755
--- a/data/maps/objects/RedsHouse2F.asm
+++ b/data/maps/objects/RedsHouse2F.asm
@@ -3,6 +3,12 @@ RedsHouse2F_Object:
def_warps
warp 7, 1, 2, REDS_HOUSE_1F
+IF DEF(_DEBUG)
+ warp 7, 2, 3, MT_MOON_B2F
+ warp 7, 3, 0, ROCKET_HIDEOUT_ELEVATOR
+ warp 7, 4, 0, POKEMON_TOWER_7F
+ warp 7, 5, 3, SILPH_CO_11F
+ENDC
def_signs
diff --git a/data/text/text_2.asm b/data/text/text_2.asm
index 1616a34e..dd74bd79 100644
--- a/data/text/text_2.asm
+++ b/data/text/text_2.asm
@@ -17,7 +17,7 @@ _AIBattleUseItemText::
text "!"
prompt
-_BoxFullTest::
+_BoxFullDebugText::
text "The BOX is full!"
done
diff --git a/engine/battle/core.asm b/engine/battle/core.asm
index 01074b74..415b287c 100755
--- a/engine/battle/core.asm
+++ b/engine/battle/core.asm
@@ -2704,13 +2704,21 @@ SelectMenuItem:
call HandleMenuInput
ld hl, hFlagsFFFA
res 1, [hl]
- bit 6, a
- jp nz, SelectMenuItem_CursorUp ; up
- bit 7, a
- jp nz, SelectMenuItem_CursorDown ; down
- bit 2, a
- jp nz, SwapMovesInMenu ; select
- bit 1, a ; B, but was it reset above?
+ bit BIT_D_UP, a
+ jp nz, SelectMenuItem_CursorUp
+ bit BIT_D_DOWN, a
+ jp nz, SelectMenuItem_CursorDown
+ bit BIT_SELECT, a
+ jp nz, SwapMovesInMenu
+IF DEF(_DEBUG)
+ bit BIT_START, a
+ jp nz, Func_3d4f5
+ bit BIT_D_RIGHT, a
+ jp nz, Func_3d529
+ bit BIT_D_LEFT, a
+ jp nz, Func_3d523
+ENDC
+ bit BIT_B_BUTTON, a
push af
xor a
ld [wMenuItemToSwap], a
@@ -2904,6 +2912,11 @@ NoMovesLeftText:
text_end
SwapMovesInMenu:
+IF DEF(_DEBUG)
+ ld a, [wFlags_D733]
+ bit BIT_TEST_BATTLE, a
+ jp nz, Func_3d4f5
+ENDC
ld a, [wPlayerBattleStatus3]
bit TRANSFORMED, a
jp nz, MoveSelectionMenu
diff --git a/engine/debug/debug_menu.asm b/engine/debug/debug_menu.asm
index a85c9c64..18223cf1 100644
--- a/engine/debug/debug_menu.asm
+++ b/engine/debug/debug_menu.asm
@@ -1,9 +1,76 @@
DebugMenu:
+IF DEF(_DEBUG)
+ call ClearScreen
+
+ ld hl, DebugPlayerName
+ ld de, wPlayerName
+ ld bc, NAME_LENGTH
+ call CopyData
+
+ ld hl, DebugRivalName
+ ld de, wRivalName
+ ld bc, NAME_LENGTH
+ call CopyData
+
+ call LoadFontTilePatterns
+ call LoadHpBarAndStatusTilePatterns
+ call ClearSprites
+ call RunDefaultPaletteCommand
+
+ hlcoord 5, 6
+ lb bc, 3, 9
+ call TextBoxBorder
+
+ hlcoord 7, 7
+ ld de, DebugMenuOptions
+ call PlaceString
+
+ ld a, 3 ; medium speed
+ ld [wOptions], a
+
+ ld a, A_BUTTON | B_BUTTON | START
+ ld [wMenuWatchedKeys], a
+ xor a
+ ld [wMenuJoypadPollCount], a
+ inc a
+ ld [wMaxMenuItem], a
+ ld a, 7
+ ld [wTopMenuItemY], a
+ dec a
+ ld [wTopMenuItemX], a
+ xor a
+ ld [wCurrentMenuItem], a
+ ld [wLastMenuItem], a
+ ld [wMenuWatchMovingOutOfBounds], a
+
+ call HandleMenuInput
+ bit BIT_B_BUTTON, a
+ ld hl, DisplayTitleScreen
+ ret nz
+
+ ld a, [wCurrentMenuItem]
+ and a ; FIGHT?
+ jp z, TestBattle
+
+ ; DEBUG
+ ld hl, wd732
+ set 1, [hl]
+ ld hl, StartNewGameDebug
ret
+DebugPlayerName:
+ db "Tom@"
+
+DebugRivalName:
+ db "Juerry@"
+
+DebugMenuOptions:
+ db "FIGHT"
+ next "DEBUG@"
+
TestBattle:
-.loop
- call GBPalNormal
+ ld a, 1
+ ldh [hJoy7], a
; Don't mess around
; with obedience.
@@ -13,34 +80,1569 @@ TestBattle:
ld hl, wFlags_D733
set BIT_TEST_BATTLE, [hl]
- ; Reset the party.
+ ld hl, wNumBagItems
+ ld de, Data_feded
+.loop
+ ld a, [de]
+ cp -1
+ jr z, .done
+ inc de
+ ld [wcf91], a
+ ld a, [de]
+ inc de
+ ld [wItemQuantity], a
+ push de
+ call AddItemToInventory
+ pop de
+ jr .loop
+.done
+ call LoadHpBarAndStatusTilePatterns
+ call ClearScreen
+ call ClearSprites
+ hlcoord 0, 0
+ lb bc, 1, 18
+ call TextBoxBorder
+ hlcoord 6, 1
+ ld de, Text_fed18
+ call PlaceString
+ hlcoord 4, 4
+ ld de, Text_fed21
+ call PlaceString
+ hlcoord 1, 6
+ ld de, Text_fed30
+ call PlaceString
+ xor a
+ ld [wWhichPokemon], a
+ ld [wEnemyMon], a
+ ld [wEnemyMonLevel], a
+ ld [wTrainerClass], a
+ ld [wGrassMons + 1], a
+ ld b, a
+ ld c, a
+ ld hl, wEnemyPartyMons
+ call Func_fe809
ld hl, wPartyCount
+ call Func_fe809
+ ld de, wPartySpecies
+ hlcoord 4, 6
+ ; fallthrough
+Func_fe7ca:
+ push hl
+ push bc
+ dec hl
+ ld a, "▶"
+ ld [hl], a
+ ld bc, 11
+ add hl, bc
+ ld a, " "
+ ld [hl], a
+ push de
+ pop de
+ pop bc
+ pop hl
+ ; fallthrough
+Func_fe7db:
+ push bc
+ push de
+ call JoypadLowSensitivity
+ pop de
+ pop bc
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_fe812
+ bit BIT_B_BUTTON, a
+ jp nz, Func_fe850
+ bit BIT_SELECT, a
+ jp nz, DebugMenu
+ bit BIT_START, a
+ jp nz, Func_fe97f
+ bit BIT_D_RIGHT, a
+ jp nz, Func_fe8a1
+ bit BIT_D_UP, a
+ jp nz, Func_fe85d
+ bit BIT_D_DOWN, a
+ jp nz, Func_fe880
+ jr Func_fe7db
+
+Func_fe809:
xor a
ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+Func_fe812:
+ inc b
+ ld a, b
+ cp NUM_POKEMON_INDEXES + 1
+ jr c, Func_fe81a
+ xor a
+ ld b, a
+ ; fallthrough
+Func_fe81a:
+ ld [de], a
+ ld [wd11e], a
+ push bc
+ push hl
+ push de
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ inc hl
+ push hl
+ ld de, Text_fed9c
+ call PlaceString
+ ld bc, hSavedMapTextPtr
+ add hl, bc
+ ld de, Text_fed9c
+ call PlaceString
+ pop hl
+ ld a, [wd11e]
+ and a
+ jr nz, .asm_fe845
+ ld de, Text_feda2
+ jr .asm_fe848
+.asm_fe845
+ call GetMonName
+.asm_fe848
+ call PlaceString
+ pop de
+ pop hl
+ pop bc
+ jr Func_fe7db
+
+Func_fe850:
+ dec b
+ ld a, b
+ cp OPP_ID_OFFSET + 1
+ jp c, Func_fe81a
+ ld a, NUM_POKEMON_INDEXES
+ ld b, a
+ jp Func_fe81a
+
+Func_fe85d:
+ ld a, [wWhichPokemon]
+ dec a
+ cp -1
+ jp z, Func_fe7db
+ ld [wWhichPokemon], a
+ dec de
+ dec hl
+ ld a, " "
+ ld [hl], a
+ push bc
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ pop bc
+ ld a, "▶"
+ ld [hl], a
+ inc hl
+ push hl
+ call Func_fe964
+ pop hl
+ jp Func_fe7db
+
+Func_fe880:
+ ld a, [wWhichPokemon]
+ inc a
+ cp 6
+ jp nc, Func_fe7db
+ ld [wWhichPokemon], a
+ inc de
+ dec hl
+ ld a, " "
+ ld [hl], a
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ ld a, "▶"
+ ld [hl], a
+ inc hl
+ push hl
+ call Func_fe964
+ pop hl
+ jp Func_fe7db
+
+Func_fe8a1:
+ push hl
+ push bc
+ dec hl
+ ld a, " "
+ ld [hl], a
+ ld bc, 11
+ add hl, bc
+ ld a, "▶"
+ ld [hl], a
+ pop bc
+ pop hl
+ ; fallthrough
+Func_fe8b0:
+ push bc
+ push de
+ call JoypadLowSensitivity
+ pop de
+ pop bc
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_fe8d9
+ bit BIT_B_BUTTON, a
+ jp nz, Func_fe902
+ bit BIT_START, a
+ jp nz, Func_fe97f
+ bit BIT_D_LEFT, a
+ jp nz, Func_fe7ca
+ bit BIT_D_UP, a
+ jp nz, Func_fe912
+ bit BIT_D_DOWN, a
+ jp nz, Func_fe93b
+ jr Func_fe8b0
+
+Func_fe8d9:
+ inc c
+ ld a, c
+ cp MAX_LEVEL + 1
+ jr c, Func_fe8e2
+ ld a, 1
+ ld c, a
+ ; fallthrough
+Func_fe8e2:
+ ld a, [wWhichPokemon]
+ push de
+ ld de, wEnemyPartyMons
+ add e
+ ld e, a
+ jr nc, .asm_fe8ee
+ inc d
+.asm_fe8ee
+ ld a, c
+ ld [de], a
+ push bc
+ push hl
+ ld bc, 11
+ add hl, bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ pop hl
+ pop bc
+ pop de
+ jp Func_fe8b0
+
+Func_fe902:
+ dec c
+ ld a, c
+ cp MAX_LEVEL + 1
+ jr nc, .asm_fe90c
+ and a
+ jp nz, Func_fe8e2
+.asm_fe90c
+ ld a, MAX_LEVEL
+ ld c, a
+ jp Func_fe8e2
+
+Func_fe912:
+ ld a, [wWhichPokemon]
dec a
+ cp -1
+ jp z, Func_fe8b0
+ ld [wWhichPokemon], a
+ dec de
+ push hl
+ ld bc, 10
+ add hl, bc
+ ld a, " "
ld [hl], a
+ pop hl
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ push hl
+ ld bc, 10
+ add hl, bc
+ ld a, "▶"
+ ld [hl], a
+ call Func_fe964
+ pop hl
+ jp Func_fe8b0
- ; Give the player a
- ; level 20 Rhydon.
- ld a, RHYDON
+Func_fe93b:
+ ld a, [wWhichPokemon]
+ inc a
+ cp 6
+ jp nc, Func_fe8b0
+ ld [wWhichPokemon], a
+ inc de
+ push hl
+ ld bc, 10
+ add hl, bc
+ ld a, " "
+ ld [hl], a
+ pop hl
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ push hl
+ ld bc, 10
+ add hl, bc
+ ld a, "▶"
+ ld [hl], a
+ call Func_fe964
+ pop hl
+ jp Func_fe8b0
+
+Func_fe964:
+ ld hl, wPartySpecies
+ ld a, [wWhichPokemon]
+ add l
+ ld l, a
+ jr nc, .asm_fe96f
+ inc h
+.asm_fe96f
+ ld a, [hl]
+ ld b, a
+ ld hl, wEnemyPartyMons
+ ld a, [wWhichPokemon]
+ add l
+ ld l, a
+ jr nc, .asm_fe97c
+ inc h
+.asm_fe97c
+ ld a, [hl]
+ ld c, a
+ ret
+
+Func_fe97f:
+ ld hl, wPartyCount
+ ld de, wEnemyPartyCount
+ xor a
+ ld [hl], a
+ inc hl
+ ld a, [hli]
+ ld b, a
+ ld c, 6
+ xor a
+ ld [wIsInBattle], a
+.asm_fe990
+ ld a, b
ld [wcf91], a
- ld a, 20
+ ld a, [hl]
+ ld b, a
+ inc de
+ ld a, [de]
+ and a
+ jr z, .asm_fe9ab
ld [wCurEnemyLVL], a
xor a
ld [wMonDataLocation], a
- ld [wCurMap], a
+ ld a, [wcf91]
+ and a
+ jr z, .asm_fe9ab
call AddPartyMon
+.asm_fe9ab
+ inc hl
+ dec c
+ jr nz, .asm_fe990
+ ld b, 7
+ ld hl, wPartySpecies
+ ld de, wEnemyPartyCount
+.asm_fe9b7
+ inc de
+ dec b
+ jp z, TestBattle
+ ld a, [hli]
+ and a
+ jr z, .asm_fe9b7
+ ld a, [de]
+ and a
+ jr z, .asm_fe9b7
+ hlcoord 0, 3
+ lb bc, 15, 20
+ call ClearScreenArea
+ hlcoord 0, 3
+ lb bc, 15, 20
+ call ClearScreenArea
+ hlcoord 0, 3
+ lb bc, 15, 20
+ call ClearScreenArea
+ ld c, 20
+ call DelayFrames
+ ld a, 1
+ ld [wIsInBattle], a
+ ld de, Text_feda8
+ ld a, [wGrassMons + 1]
+ cp MAX_LEVEL + 1
+ jr c, .asm_fe9fb
+ ld a, 2
+ ld [wIsInBattle], a
+ ld de, Text_fedb2
+.asm_fe9fb
+ hlcoord 1, 4
+ call PlaceString
+ hlcoord 1, 6
+ ld de, Text_fedbc
+ call PlaceString
+ ld a, [wEnemyMon]
+ ld b, a
+ ld a, [wIsInBattle]
+ dec a
+ jr z, .asm_fea40
+ ld a, [wTrainerClass]
+ ld [wd11e], a
+ ld b, a
+ ld de, wd11e
+ hlcoord 1, 8
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ hlcoord 5, 8
+ ld de, Text_fede2
+ call PlaceString
+ call GetTrainerName
+ hlcoord 5, 8
+ ld de, wTrainerName
+ call PlaceString
+ pop bc
+ jr .asm_fea65
+.asm_fea40
+ ld a, b
+ and a
+ jr z, .asm_fea65
+ ld de, wd11e
+ ld [de], a
+ hlcoord 1, 8
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ hlcoord 5, 8
+ ld de, Text_fede2
+ call PlaceString
+ call GetMonName
+ hlcoord 5, 8
+ call PlaceString
+ pop bc
+.asm_fea65
+ ld a, [wEnemyMonLevel]
+ ld c, a
+ ld de, wd11e
+ ld [de], a
+ hlcoord 16, 8
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ pop bc
+ ; fallthrough
+Func_fea78:
+ ld a, " "
+ ldcoord_a 0, 8
+ ldcoord_a 15, 8
+ ld a, "▶"
+ ldcoord_a 0, 4
+ ; fallthrough
+Func_fea85:
+ push bc
+ call JoypadLowSensitivity
+ pop bc
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_fea9d
+ bit BIT_START, a
+ jp nz, Func_fec10
+ bit BIT_D_DOWN, a
+ jp nz, Func_feae4
+ jr Func_fea85
- ; Fight against a
- ; level 20 Rhydon.
- ld a, RHYDON
- ld [wCurOpponent], a
+Func_fea9d:
+ hlcoord 1, 8
+ ld de, Text_fedcf
+ call PlaceString
+ hlcoord 5, 7
+ ld de, Text_fede2
+ call PlaceString
+ xor a
+ ld b, a
+ ld c, a
+ ld a, [wIsInBattle]
+ dec a
+ jr nz, .asm_feace
+ ld a, 2
+ ld [wIsInBattle], a
+ ld a, " "
+ ldcoord_a 4, 3
+ hlcoord 1, 4
+ ld de, Text_fedb2
+ call PlaceString
+ jp Func_fea85
+.asm_feace
+ ld a, 1
+ ld [wIsInBattle], a
+ ld a, " "
+ ldcoord_a 1, 3
+ hlcoord 1, 4
+ ld de, Text_feda8
+ call PlaceString
+ jp Func_fea85
+Func_feae4:
+ ld a, "▶"
+ ldcoord_a 0, 8
+ ld a, " "
+ ldcoord_a 15, 8
+ ldcoord_a 0, 4
+ ; fallthrough
+Func_feaf1:
+ push bc
+ call JoypadLowSensitivity
+ pop bc
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_feb13
+ bit BIT_B_BUTTON, a
+ jp nz, Func_feb82
+ bit BIT_START, a
+ jp nz, Func_fec10
+ bit BIT_D_RIGHT, a
+ jp nz, Func_febba
+ bit BIT_D_UP, a
+ jp nz, Func_fea78
+ jr Func_feaf1
+
+Func_feb13:
+ push bc
+ hlcoord 5, 7
+ ld de, Text_fede2
+ call PlaceString
+ hlcoord 5, 8
+ ld de, Text_fede2
+ call PlaceString
+ pop bc
+ ld a, [wIsInBattle]
+ dec a
+ jr z, Func_feb35.asm_feb5c
+ inc b
+ ld a, b
+ cp 48
+ jr c, Func_feb35
+ ld b, 1
+ ; fallthrough
+Func_feb35:
+ ld a, b
+ ld [wd11e], a
+ ld de, wd11e
+ hlcoord 1, 8
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ ld a, [wd11e]
+ ld [wTrainerClass], a
+ call GetTrainerName
+ hlcoord 5, 8
+ ld de, wTrainerName
+ call PlaceString
+ pop bc
+ jp Func_feaf1
+.asm_feb5c
+ inc b
+ ld a, b
+ cp NUM_POKEMON_INDEXES + 1
+ jr c, Func_feb64
+ ld b, 1
+ ; fallthrough
+Func_feb64:
+ ld a, b
+ ld [wd11e], a
+ ld de, wd11e
+ hlcoord 1, 8
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ call GetMonName
+ hlcoord 5, 8
+ call PlaceString
+ pop bc
+ jp Func_feaf1
+
+Func_feb82:
+ push bc
+ hlcoord 5, 7
+ ld de, Text_fede2
+ call PlaceString
+ hlcoord 5, 8
+ ld de, Text_fede2
+ call PlaceString
+ pop bc
+ ld a, [wIsInBattle]
+ dec a
+ jr z, .asm_febab
+ dec b
+ ld a, b
+ cp 48
+ jr nc, .asm_feba6
+ and a
+ jp nz, Func_feb35
+.asm_feba6
+ ld b, 47
+ jp Func_feb35
+.asm_febab
+ dec b
+ ld a, b
+ cp NUM_POKEMON_INDEXES + 1
+ jr nc, .asm_febb5
+ and a
+ jp nz, Func_feb64
+.asm_febb5
+ ld b, NUM_POKEMON_INDEXES
+ jp Func_feb64
+
+Func_febba:
+ ld a, " "
+ ldcoord_a 0, 8
+ ld a, "▶"
+ ldcoord_a 15, 8
+ ; fallthrough
+Func_febc4:
+ push bc
+ call JoypadLowSensitivity
+ pop bc
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_febe6
+ bit BIT_B_BUTTON, a
+ jp nz, Func_fec01
+ bit BIT_START, a
+ jp nz, Func_fec10
+ bit BIT_D_LEFT, a
+ jp nz, Func_feae4
+ bit BIT_D_UP, a
+ jp nz, Func_fea78
+ jr Func_febc4
+
+Func_febe6:
+ inc c
+ ld a, c
+ cp MAX_LEVEL + 1
+ jr c, Func_febee
+ ld c, 1
+Func_febee:
+ hlcoord 16, 8
+ ld a, c
+ ld de, wCurEnemyLVL
+ ld [de], a
+ push bc
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ pop bc
+ jp Func_febc4
+
+Func_fec01:
+ dec c
+ ld a, c
+ cp MAX_LEVEL + 1
+ jr nc, .asm_fec0b
+ and a
+ jp nz, Func_febee
+.asm_fec0b
+ ld c, MAX_LEVEL
+ jp Func_febee
+
+Func_fec10:
+ ld a, b
+ and a
+ jp z, Func_fea78
+ ld a, c
+ and a
+ jp z, Func_fea78
+ ld a, [wIsInBattle]
+ dec a
+ jr z, .asm_fec28
+ ld a, b
+ add OPP_ID_OFFSET
+ ld b, a
+ ld a, c
+ ld [wTrainerNo], a
+.asm_fec28
+ ld a, c
+ ld [wCurEnemyLVL], a
+ ld a, b
+ ld [wCurOpponent], a
+ xor a
+ ld [wd72d], a
predef InitOpponent
+ xor a
+ ld [wNumRunAttempts], a
+ ld hl, wPlayerStatsToDouble
+ ld bc, wEnemyStatsToDouble - wPlayerStatsToDouble
+ call FillMemory
+ ld hl, wEnemyStatsToDouble
+ ld bc, wPlayerNumAttacksLeft - wEnemyStatsToDouble
+ call FillMemory
+ call LoadFontTilePatterns
+ call ClearScreen
+ call ClearSprites
+ ld a, %11100100
+ ldh [rBGP], a
+ ldh [rOBP0], a
+ ldh [rOBP1], a
+ call UpdateGBCPal_BGP
+ call UpdateGBCPal_OBP0
+ call UpdateGBCPal_OBP1
+ hlcoord 0, 0
+ lb bc, 1, 18
+ call TextBoxBorder
+ hlcoord 6, 1
+ ld de, Text_fed18
+ call PlaceString
+ hlcoord 4, 4
+ ld de, Text_fed21
+ call PlaceString
+ hlcoord 1, 6
+ ld de, Text_fed30
+ call PlaceString
+ ld de, wPartyCount
+ xor a
+ ld [de], a
+ ld [wWhichPokemon], a
+ inc de
+ hlcoord 4, 6
+ push de
+ push hl
+ ; fallthrough
+Func_fec9b:
+ ld a, [wWhichPokemon]
+ ld de, wPartySpecies
+ add e
+ ld e, a
+ jr nc, .asm_feca6
+ inc d
+.asm_feca6
+ ld a, [de]
+ cp -1
+ jp z, Func_fed01
+ ld [wd11e], a
+ push hl
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ inc hl
+ ld de, Text_fed9c
+ call PlaceString
+ call GetMonName
+ call PlaceString
+ pop hl
+ push hl
+ ld bc, 11
+ add hl, bc
+ push hl
+ ld a, [wWhichPokemon]
+ ld hl, wPartyMon1Level
+ ld bc, wPartyMon2 - wPartyMon1
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ld a, [de]
+ ld [wCurEnemyLVL], a
+ pop hl
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ ld a, [wWhichPokemon]
+ ld de, wEnemyPartyMons
+ add e
+ ld e, a
+ jr nc, .asm_fecee
+ inc d
+.asm_fecee
+ ld a, [wCurEnemyLVL]
+ ld [de], a
+ pop hl
+ ld a, [wWhichPokemon]
+ inc a
+ ld [wWhichPokemon], a
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ jp Func_fec9b
+
+Func_fed01:
+ pop hl
+ pop de
+ ld a, [wPartyMon1]
+ ld b, a
+ ld a, [wPartyMon1Level]
+ ld c, a
+ xor a
+ ld [wWhichPokemon], a
+ jp Func_fe7ca
+
+Text_fed12:
+ db "けんしろう@"
+
+Text_fed18:
+ db "テスト ファイト@"
+
+Text_fed21:
+ db "№. なまえ レべル@"
+
+Text_fed30:
+ db "1.▶000 ーーーーー 000"
+ next "2. 000 ーーーーー 000"
+ next "3. 000 ーーーーー 000"
+ next "4. 000 ーーーーー 000"
+ next "5. 000 ーーーーー 000"
+ next "6. 000 ーーーーー 000@"
+
+Text_fed9c:
+ db " @"
+
+Text_feda2:
+ db "ーーーーー@"
+
+Text_feda8:
+ db "ワイルドモンスター@"
+
+Text_fedb2:
+ db "ディーラー @"
+
+Text_fedbc:
+ db "№. なまえ レべル"
+ next ""
+Text_fedcf:
+ db "000 ーーーーーーーーーー 000@"
- ; When the battle ends,
- ; do it all again.
+Text_fede2:
+ db " @"
+
+Data_feded:
+ db GREAT_BALL, 99
+ db POKE_BALL, 99
+ db ANTIDOTE, 99
+ db FULL_RESTORE, 99
+ db MAX_POTION, 99
+ db HYPER_POTION, 99
+ db SUPER_POTION, 99
+ db POTION, 99
+ db -1 ; end
+
+Func_fedfe:
+ ld a, [wNumInBox]
+ cp 30
+ jp nc, Func_ff1ad
+ call ClearScreen
+ call UpdateSprites
+ ld a, [wLetterPrintingDelayFlags]
+ push af
+ xor a
+ ld [wLetterPrintingDelayFlags], a
+ ld hl, wEnemyMonOT
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ inc a
+ ldh [hJoy7], a
+ ld [wcf91], a
+ ld [wCurEnemyLVL], a
+ ; fallthrough
+Func_fee23:
+ hlcoord 0, 3
+ ld [hl], " "
+ hlcoord 0, 1
+ ld [hl], "▶"
+ call Func_fee60
+.asm_fee30
+ call DelayFrame
+ call JoypadLowSensitivity
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_fee49
+ bit BIT_B_BUTTON, a
+ jp nz, Func_fee56
+ bit BIT_D_DOWN, a
+ jp nz, Func_fee96
+ jr .asm_fee30
+
+Func_fee49:
+ ld hl, wcf91
+ inc [hl]
+ ld a, [hl]
+ cp NUM_POKEMON + 1
+ jr c, Func_fee23
+ ld [hl], DEX_BULBASAUR
+ jr Func_fee23
+
+Func_fee56:
+ ld hl, wcf91
+ dec [hl]
+ jr nz, Func_fee23
+ ld [hl], DEX_MEW
+ jr Func_fee23
+
+Func_fee60:
+ hlcoord 1, 0
+ lb bc, 2, 9
+ call ClearScreenArea
+ hlcoord 1, 1
+ ld de, wcf91
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ inc hl
+ push hl
+ ld a, [wcf91]
+ ld [wd11e], a
+ callfar PokedexToIndex
+ call GetMonName
+ pop hl
+ call PlaceString
+ ld a, [wd11e]
+ ld [wd0b5], a
+ call GetMonHeader
+ ret
+
+Func_fee96:
+ hlcoord 0, 1
+ ld [hl], " "
+ hlcoord 0, 3
+ ld [hl], "▶"
+ hlcoord 0, 5
+ ld [hl], " "
+ call Func_feee2
+ call Func_feeef
+.asm_feeab
+ call DelayFrame
+ call JoypadLowSensitivity
+ ld hl, wCurEnemyLVL
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_feed1
+ bit BIT_B_BUTTON, a
+ jp nz, Func_feedb
+ bit BIT_START, a
+ jp nz, Func_ff12c
+ bit BIT_D_UP, a
+ jp nz, Func_fee23
+ bit BIT_D_DOWN, a
+ jp nz, Func_fef60
+ jr .asm_feeab
+
+Func_feed1:
+ inc [hl]
+ ld a, [hl]
+ cp MAX_LEVEL + 1
+ jr c, Func_fee96
+ ld [hl], 1
+ jr Func_fee96
+
+Func_feedb:
+ dec [hl]
+ jr nz, Func_fee96
+ ld [hl], MAX_LEVEL
+ jr Func_fee96
+
+Func_feee2:
+ hlcoord 1, 3
+ ld de, wCurEnemyLVL
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ ret
+
+Func_feeef:
+ hlcoord 1, 4
+ lb bc, 8, 11
+ call ClearScreenArea
+ ld a, [wcf91]
+ push af
+ ld [wd11e], a
+ ld hl, BaseStats + 15
+ dec a
+ ld bc, MonBaseStatsEnd - MonBaseStats
+ call AddNTimes
+ ld de, wMoves
+ ld bc, NUM_MOVES
+ ld a, BANK(BaseStats)
+ call FarCopyData
+ callfar PokedexToIndex
+ ld a, [wd11e]
+ ld [wcf91], a
+ xor a
+ ld [wChangeMonPicEnemyTurnSpecies], a
+ ld de, wMoves
+ predef WriteMonMoves
+ hlcoord 1, 5
+ ld de, wMoves
+ ld b, NUM_MOVES
+.asm_fef36
+ ld a, [de]
+ inc de
+ and a
+ jr z, .asm_fef5b
+ push de
+ push bc
+ push hl
+ ld [wd11e], a
+ ld de, wd11e
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ inc hl
+ call GetMoveName
+ call PlaceString
+ pop hl
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ pop bc
+ pop de
+ dec b
+ jr nz, .asm_fef36
+.asm_fef5b
+ pop af
+ ld [wcf91], a
+ ret
+
+Func_fef60:
+ ld de, wMoves
+ hlcoord 0, 5
+ ld b, 1
+ ; fallthrough
+Func_fef68:
+ call Func_fefc5
+.asm_fef6b
+ call DelayFrame
+ push de
+ push bc
+ call JoypadLowSensitivity
+ pop bc
+ pop de
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_fef92
+ bit BIT_B_BUTTON, a
+ jp nz, Func_fef9e
+ bit BIT_START, a
+ jp nz, Func_ff12c
+ bit BIT_D_UP, a
+ jp nz, Func_fefa8
+ bit BIT_D_DOWN, a
+ jp nz, Func_fefb5
+ jr .asm_fef6b
+
+Func_fef92:
+ ld a, [de]
+ inc a
+ ld [de], a
+ cp NUM_ATTACKS + 1
+ jr c, Func_fef68
ld a, 1
- ld [wUpdateSpritesEnabled], a
- ldh [hAutoBGTransferEnabled], a
- jr .loop
+ ld [de], a
+ jr Func_fef68
+
+Func_fef9e:
+ ld a, [de]
+ dec a
+ ld [de], a
+ jr nz, Func_fef68
+ ld a, NUM_ATTACKS
+ ld [de], a
+ jr Func_fef68
+
+Func_fefa8:
+ dec de
+ dec b
+ jp z, Func_fee96
+ push bc
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ pop bc
+ jr Func_fef68
+
+Func_fefb5:
+ inc de
+ inc b
+ ld a, b
+ cp 5
+ jp z, Func_ff03b
+ push bc
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ pop bc
+ jr Func_fef68
+
+Func_fefc5:
+ push hl
+ push de
+ push bc
+ push hl
+ push de
+ ld bc, hSpriteMapYCoord
+ add hl, bc
+ lb bc, 2, 11
+ call ClearScreenArea
+ pop de
+ pop hl
+ push hl
+ ld [hl], "▶"
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ ld [hl], " "
+ ld bc, SCREEN_WIDTH * 4
+ add hl, bc
+ ld [hl], " "
+ pop hl
+ inc hl
+ ld a, [de]
+ ld de, wd11e
+ ld [de], a
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ ld a, [wd11e]
+ and a
+ jr z, .asm_ff002
+ call Func_ff006
+ inc hl
+ call GetMoveName
+ call PlaceString
+.asm_ff002
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Func_ff006:
+ ld a, [wcf91]
+ push af
+ ld a, [wd11e]
+ push af
+ push hl
+ ld a, [wcf91]
+ ld [wd11e], a
+ callfar PokedexToIndex
+ ld a, [wd11e]
+ ld [wcf91], a
+ pop hl
+ pop af
+ ld [wd11e], a
+ push hl
+ callfar Func_3b079
+ pop hl
+ jr c, .asm_ff036
+ ld [hl], "×"
+.asm_ff036
+ pop af
+ ld [wcf91], a
+ ret
+
+Func_ff03b:
+ ld de, wEnemyMonOT
+ hlcoord 0, 13
+ ld b, 1
+ ; fallthrough
+Func_ff043:
+ call Func_ff09e
+.asm_ff046
+ call DelayFrame
+ push de
+ push bc
+ call JoypadLowSensitivity
+ pop bc
+ pop de
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_ff06d
+ bit BIT_B_BUTTON, a
+ jp nz, Func_ff072
+ bit BIT_START, a
+ jp nz, Func_ff12c
+ bit BIT_D_UP, a
+ jp nz, Func_ff077
+ bit BIT_D_DOWN, a
+ jp nz, Func_ff08f
+ jr .asm_ff046
+
+Func_ff06d:
+ ld a, [de]
+ inc a
+ ld [de], a
+ jr Func_ff043
+
+Func_ff072:
+ ld a, [de]
+ dec a
+ ld [de], a
+ jr Func_ff043
+
+Func_ff077:
+ dec de
+ dec b
+ jp z, Func_ff084
+ push bc
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ pop bc
+ jr Func_ff043
+
+Func_ff084:
+ ld de, wMoves + 3
+ hlcoord 0, 11
+ ld b, NUM_MOVES
+ jp Func_fef68
+
+Func_ff08f:
+ ld a, b
+ cp 3
+ jr z, Func_ff043
+ inc b
+ inc de
+ push bc
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ pop bc
+ jr Func_ff043
+
+Func_ff09e:
+ push hl
+ push de
+ push bc
+ push hl
+ ld [hl], "▶"
+ ld bc, hMovingBGTilesCounter1
+ add hl, bc
+ ld [hl], " "
+ ld bc, SCREEN_WIDTH * 4
+ add hl, bc
+ ld [hl], " "
+ pop hl
+ inc hl
+ ld a, [de]
+ ld de, wd11e
+ ld [de], a
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ call Func_ff0c4
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Func_ff0c4:
+ hlcoord 12, 0
+ lb bc, 18, 8
+ call ClearScreenArea
+ hlcoord 13, 1
+ ld de, Text_ff113
+ call PlaceString
+ ld b, 10
+ ld hl, wLoadedMonHPExp
+ ld a, [wEnemyMonOT + 2]
+.asm_ff0de
+ ld [hli], a
+ dec b
+ jr nz, .asm_ff0de
+ ld a, [wEnemyMonOT]
+ ld [hli], a
+ ld a, [wEnemyMonOT + 1]
+ ld [hl], a
+ ld hl, wLoadedMonExp + 2
+ ld de, wLoadedMonStats
+ ld b, 1
+ call CalcStats
+ hlcoord 17, 1
+ ld de, wLoadedMonStats
+ ld b, 5
+.asm_ff0fd
+ push bc
+ push de
+ push hl
+ lb bc, LEADING_ZEROES | 2, 3
+ call PrintNumber
+ pop hl
+ ld bc, SCREEN_WIDTH * 2
+ add hl, bc
+ pop de
+ inc de
+ inc de
+ pop bc
+ dec b
+ jr nz, .asm_ff0fd
+ ret
+
+Text_ff113:
+ db "たいりき" ; hp
+ next "こうげき" ; attack
+ next "ぼうぎょ" ; defense
+ next "すばやさ" ; speed
+ next "とくしゅ@" ; special
+
+Func_ff12c:
+ ld a, [wCurEnemyLVL]
+ ld [wEnemyMonLevel], a
+ ld a, [wcf91]
+ ld [wd11e], a
+ callfar PokedexToIndex
+ ld a, [wd11e]
+ ld [wcf91], a
+ ld [wd0b5], a
+ call GetMonHeader
+ ld hl, wEnemyMon
+ ld a, [wcf91]
+ ld [hli], a
+ ld a, [wLoadedMonStats]
+ ld [hli], a
+ ld a, [wLoadedMonStats + 1]
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld a, [wMonHTypes]
+ ld [hli], a
+ ld a, [wMonHType2]
+ ld [hli], a
+ ld a, [wMonHCatchRate]
+ ld [hli], a
+ ld a, [wMoves]
+ ld [hli], a
+ ld a, [wMoves + 1]
+ ld [hli], a
+ ld a, [wMoves + 2]
+ ld [hli], a
+ ld a, [wMoves + 3]
+ ld [hl], a
+ ld hl, wEnemyMonPP
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld a, [wEnemyMonOT]
+ ld [wEnemyMonDVs], a
+ ld a, [wEnemyMonOT + 1]
+ ld [wEnemyMonDVs + 1], a
+ callfar SendNewMonToBox
+ ld b, 10
+ ld hl, wBoxMon1HPExp
+ ld a, [wEnemyMonOT + 2]
+.asm_ff19e
+ ld [hli], a
+ dec b
+ jr nz, .asm_ff19e
+ ld a, 1
+ ld [wDoNotWaitForButtonPressAfterDisplayingText], a
+ pop af
+ ld [wLetterPrintingDelayFlags], a
+ jr Func_ff1b3
+Func_ff1ad:
+ ld hl, Text_ff1b4
+ call PrintText
+Func_ff1b3:
+ ret
+
+Text_ff1b4:
+ text_far _BoxFullDebugText
+ text_end
+
+Func_ff1b9:
+ ld a, 1
+ ldh [hJoy7], a
+ ld a, 2
+ ld [wCurEnemyLVL], a
+ ld hl, Text_ff290
+ call PrintText
+ call YesNoChoice
+ ld a, [wCurrentMenuItem]
+ and a
+ jp nz, Func_ff286
+ ld hl, Text_ff28f
+ call PrintText
+ callfar EmptyAllSRAMBoxes
+ ld hl, wNumInBox
+ xor a
+ ld [hli], a
+ dec a
+ ld [hl], a
+ ; fallthrough
+Func_ff1e7:
+ hlcoord 2, 13
+ ld [hl], "゙"
+ hlcoord 1, 14
+ ld [hl], "レ"
+ inc hl
+ ld [hl], "へ"
+ inc hl
+ ld [hl], "ル"
+ inc hl
+ inc hl
+ ld de, wCurEnemyLVL
+ lb bc, LEADING_ZEROES | 1, 3
+ call PrintNumber
+ call DelayFrame
+ call JoypadLowSensitivity
+ ldh a, [hJoy5]
+ bit BIT_A_BUTTON, a
+ jp nz, Func_ff21b
+ bit BIT_B_BUTTON, a
+ jp nz, Func_ff227
+ bit BIT_START, a
+ jp nz, Func_ff236
+ jr Func_ff1e7
+
+Func_ff21b:
+ ld a, [wCurEnemyLVL]
+ inc a
+ cp MAX_LEVEL + 1
+ jr c, Func_ff231
+ ld a, 2
+ jr Func_ff231
+Func_ff227:
+ ld a, [wCurEnemyLVL]
+ dec a
+ cp 2
+ jr nc, Func_ff231
+ ld a, MAX_LEVEL
+Func_ff231:
+ ld [wCurEnemyLVL], a
+ jr Func_ff1e7
+
+Func_ff236:
+ ld c, 0
+ ld d, 0
+.asm_ff23a
+ push bc
+ push de
+ call Func_ff295
+ ld hl, wChangeMonPicEnemyTurnSpecies
+ inc [hl]
+ pop de
+ pop bc
+ ld b, 30
+.asm_ff247
+ inc c
+ push bc
+ push de
+ ld a, c
+ ld [wd11e], a
+ callfar PokedexToIndex
+ ld a, [wd11e]
+ ld [wEnemyMonSpecies2], a
+ ld [wcf91], a
+ xor a
+ ld [wEnemyBattleStatus3], a
+ callfar LoadEnemyMonData
+ ld a, [wEnemyMonSpecies2]
+ ld [wcf91], a
+ callfar SendNewMonToBox
+ pop de
+ pop bc
+ ld a, c
+ cp NUM_POKEMON
+ jr z, Func_ff286
+ dec b
+ jr nz, .asm_ff247
+ inc d
+ jr .asm_ff23a
+ ; fallthrough
+Func_ff286:
+ ld a, 1
+ ld [wDoNotWaitForButtonPressAfterDisplayingText], a
+ xor a
+ ldh [hJoy7], a
+ ret
+
+Text_ff28f:
+ text_end
+
+Text_ff290:
+ text_far _BoxWillBeClearedText
+ text_end
+
+Func_ff295:
+ push de
+ ld a, SFX_SAVE
+ call PlaySoundWaitForCurrent
+ call WaitForSoundToFinish
+ call Func_ff2d1
+ ld e, l
+ ld d, h
+ ld hl, wNumInBox
+ call Func_ff2f3
+ pop de
+ ld a, d
+ set 7, a
+ ld [wCurrentBoxNum], a
+ push de
+ call Func_ff2d1
+ ld de, wNumInBox
+ call Func_ff2f3
+ ld a, [wLetterPrintingDelayFlags]
+ push af
+ ld a, 1
+ ld [wLetterPrintingDelayFlags], a
+ callfar SaveSAVtoSRAM
+ pop af
+ ld [wLetterPrintingDelayFlags], a
+ pop de
+ ret
+
+Func_ff2d1:
+ ld hl, Data_ff2eb
+ ld a, [wCurrentBoxNum]
+ and %01111111
+ cp 4
+ ld b, 2
+ jr c, .asm_ff2e2
+ inc b
+ and 3
+.asm_ff2e2
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Data_ff2eb:
+ dw sBox1
+ dw sBox2
+ dw sBox3
+ dw sBox4
+
+Func_ff2f3:
+ push hl
+ call Func_ff316
+ ld a, b
+ ld [MBC1SRamBank], a
+ ld bc, sBox2 - sBox1
+ call CopyData
+ pop hl
+ xor a
+ ld [hli], a
+ dec a
+ ld [hl], a
+ ld hl, sBox1
+ ld bc, sBox5 - sBox1 + 1
+ call Func_ff32a
+ ld [sBox5], a
+ call Func_ff321
+ ret
+
+Func_ff316:
+ ld a, 1
+ ld [MBC1SRamBankingMode], a
+ ld a, SRAM_ENABLE
+ ld [MBC1SRamEnable], a
+ ret
+
+Func_ff321:
+ ld a, 0
+ ld [MBC1SRamBankingMode], a
+ ld [MBC1SRamEnable], a
+ ret
+
+Func_ff32a:
+ ld d, 0
+.asm_ff32c
+ ld a, [hli]
+ add d
+ ld d, a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_ff32c
+ ld a, d
+ cpl
+ ret
+ELSE
+ ret
+ENDC
diff --git a/engine/debug/debug_party.asm b/engine/debug/debug_party.asm
index 8545b848..637482eb 100644
--- a/engine/debug/debug_party.asm
+++ b/engine/debug/debug_party.asm
@@ -21,4 +21,139 @@ DebugTeam:
db -1 ; end
DebugStart:
+IF DEF(_DEBUG)
+ xor a ; PLAYER_PARTY_DATA
+ ld [wMonDataLocation], a
+
+ ; Fly anywhere.
+ dec a ; $ff
+ ld [wTownVisitedFlag], a
+ ld [wTownVisitedFlag + 1], a
+
+ ; Get all badges except Earth Badge.
+ ld a, $ff ^ (1 << BIT_EARTHBADGE)
+ ld [wObtainedBadges], a
+
+ call SetDebugTeam
+
+ ; Pikachu gets Surf.
+ ld a, SURF
+ ld hl, wPartyMon4Moves + 2
+ ld [hl], a
+
+ ; Snorlax gets four HM moves.
+ ld hl, wPartyMon1Moves
+ ld a, FLY
+ ld [hli], a
+ ld a, CUT
+ ld [hli], a
+ ld a, SURF
+ ld [hli], a
+ ld a, STRENGTH
+ ld [hl], a
+
+ ; Get some debug items.
+ ld hl, wNumBagItems
+ ld de, DebugItemsList
+.items_loop
+ ld a, [de]
+ cp -1
+ jr z, .items_end
+ ld [wcf91], a
+ inc de
+ ld a, [de]
+ inc de
+ ld [wItemQuantity], a
+ call AddItemToInventory
+ jr .items_loop
+.items_end
+
+ ; Complete the Pokédex.
+ ld hl, wPokedexOwned
+ call DebugSetPokedexEntries
+ ld hl, wPokedexSeen
+ call DebugSetPokedexEntries
+ SetEvent EVENT_GOT_POKEDEX
+
+ ; Player chose Pikachu.
+ ld hl, wRivalStarter
+ ld a, 1
+ ld [hli], a
+ ld a, NUM_POKEMON
+ ld [hli], a ; hl = wUnknownDebugByte
+ ld a, PIKACHU
+ ld [hl], a ; hl = wPlayerStarter
+
+ ; Give max money.
+ ld hl, wPlayerMoney
+ ld a, $99
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+
+ ret
+
+DebugSetPokedexEntries:
+ ld b, wPokedexOwnedEnd - wPokedexOwned - 1
+ ld a, %11111111
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ld [hl], %01111111
+ ret
+
+DebugItemsList:
+ db MASTER_BALL, 99
+ db TOWN_MAP, 1
+ db BICYCLE, 1
+ db FULL_RESTORE, 99
+ db ESCAPE_ROPE, 99
+ db RARE_CANDY, 99
+ db SECRET_KEY, 1
+ db CARD_KEY, 1
+ db FULL_HEAL, 99
+ db REVIVE, 99
+ db FRESH_WATER, 99
+ db S_S_TICKET, 1
+ db LIFT_KEY, 1
+ db PP_UP, 99
+ db -1 ; end
+
+DebugUnusedList:
+ db OLD_AMBER, 1
+ db DOME_FOSSIL, 1
+ db HELIX_FOSSIL, 1
+ db X_ACCURACY, 99
+ db DIRE_HIT, 99
+ db FRESH_WATER, 1
+ db S_S_TICKET, 1
+ db GOLD_TEETH, 1
+ db COIN_CASE, 1
+ db SILPH_SCOPE, 1
+ db POKE_FLUTE, 1
+ db LIFT_KEY, 1
+ db ETHER, 99
+ db MAX_ETHER, 99
+ db ELIXER, 99
+ db MAX_ELIXER, 99
+ db TM_RAZOR_WIND, 10
+ db TM_HORN_DRILL, 10
+ db TM_TAKE_DOWN, 10
+ db TM_BLIZZARD, 10
+ db TM_HYPER_BEAM, 10
+ db TM_SOLARBEAM, 10
+ db TM_DRAGON_RAGE, 10
+ db TM_MIMIC, 10
+ db TM_BIDE, 10
+ db TM_METRONOME, 10
+ db TM_SELFDESTRUCT, 10
+ db TM_SWIFT, 10
+ db TM_SOFTBOILED, 10
+ db TM_DREAM_EATER, 10
+ db TM_REST, 10
+ db TM_SUBSTITUTE, 10
+ db -1 ; end
+ELSE
ret
+ENDC
diff --git a/engine/events/hidden_objects/safari_game.asm b/engine/events/hidden_objects/safari_game.asm
index 5001a5d4..5a267346 100644
--- a/engine/events/hidden_objects/safari_game.asm
+++ b/engine/events/hidden_objects/safari_game.asm
@@ -7,6 +7,10 @@ SafariZoneCheck::
jr SafariZoneGameStillGoing
SafariZoneCheckSteps::
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
ld a, [wSafariSteps]
ld b, a
ld a, [wSafariSteps + 1]
diff --git a/engine/gfx/bg_map_attributes.asm b/engine/gfx/bg_map_attributes.asm
index 6f81af63..55313846 100644
--- a/engine/gfx/bg_map_attributes.asm
+++ b/engine/gfx/bg_map_attributes.asm
@@ -1,5 +1,3 @@
-INCLUDE "data/cgb/bg_map_attributes.asm"
-
LoadBGMapAttributes::
ld hl, BGMapAttributesPointers
ld a, c ; c = which packet
diff --git a/engine/movie/title.asm b/engine/movie/title.asm
index 11852ae4..cf1eecdb 100755
--- a/engine/movie/title.asm
+++ b/engine/movie/title.asm
@@ -164,7 +164,11 @@ DisplayTitleScreen:
ldh a, [hJoyHeld]
cp D_UP | SELECT | B_BUTTON
jr z, .go_to_main_menu
+IF DEF(_DEBUG)
+ and A_BUTTON | SELECT | START
+ELSE
and A_BUTTON | START
+ENDC
jr nz, .go_to_main_menu
call DoTitleScreenFunction
jr .titleScreenLoop
@@ -190,7 +194,15 @@ DisplayTitleScreen:
and D_UP | SELECT | B_BUTTON
cp D_UP | SELECT | B_BUTTON
jp z, .doClearSaveDialogue
+IF DEF(_DEBUG)
+ ld a, b
+ bit BIT_SELECT, a
+ jp z, MainMenu
+ callfar DebugMenu
+ jp hl
+ELSE
jp MainMenu
+ENDC
.asm_42f0
; unreferenced
diff --git a/engine/pikachu/pikachu_emotions.asm b/engine/pikachu/pikachu_emotions.asm
index 1378d383..61db6e80 100755
--- a/engine/pikachu/pikachu_emotions.asm
+++ b/engine/pikachu/pikachu_emotions.asm
@@ -164,7 +164,34 @@ StarterPikachuEmotionCommand_subcmd:
dw PikachuBillsHouseCheck
StarterPikachuEmotionCommand_nop2:
+IF DEF(_DEBUG)
+ push hl
+ ld hl, wd732
+ bit 1, [hl]
+ pop hl
+ ret z
+ push de
+ ld d, a
+ ld a, [wCurMap]
+ cp REDS_HOUSE_2F
+ ld a, d
+ pop de
+ ret nz
+ push de
+ call Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
+ call LoadFontTilePatterns
+ ld hl, ExpressionText
+ call PrintText
+ call Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
+ pop de
+ ret
+
+ExpressionText:
+ text_far _ExpressionText
+ text_end
+ELSE
ret
+ENDC
StarterPikachuEmotionCommand_9:
push de
@@ -184,7 +211,35 @@ DeletedFunction_fcffb:
REPT 5
nop
ENDR
+IF DEF(_DEBUG)
+ push hl
+ ld hl, wd732
+ bit 1, [hl]
+ pop hl
+ ret z
+ push de
+ ld d, a
+ ld a, [wCurMap]
+ cp REDS_HOUSE_2F
+ ld a, d
+ pop de
+ ret nz
+ ld a, [wExpressionNumber]
+ inc a
+ cp (PikachuEmotion33_id - PikachuEmotionTable) / 2
+ jr c, .valid
+ ldpikaemotion a, PikachuEmotion1
+.valid
+ ld [wExpressionNumber], a
+ ret
+
+HallOfFamePCForever:
+ callfar HallOfFamePC
+ call WaitForTextScrollButtonPress
+ jr HallOfFamePCForever
+ELSE
ret
+ENDC
PlaySpecificPikachuEmotion:
ld a, e
diff --git a/engine/pikachu/pikachu_pic_animation.asm b/engine/pikachu/pikachu_pic_animation.asm
index 755395ba..4f56d542 100755
--- a/engine/pikachu/pikachu_pic_animation.asm
+++ b/engine/pikachu/pikachu_pic_animation.asm
@@ -850,6 +850,3 @@ PikaPicAnimCommand_thunderbolt:
ret
INCLUDE "data/pikachu/pikachu_pic_animation.asm"
-
-Func_fe66e:
- ret
diff --git a/home/npc_movement.asm b/home/npc_movement.asm
index 200d3983..40942bf3 100644
--- a/home/npc_movement.asm
+++ b/home/npc_movement.asm
@@ -49,4 +49,12 @@ EndNPCMovementScript::
farjp _EndNPCMovementScript
DebugPressedOrHeldB::
+IF DEF(_DEBUG)
+ ldh a, [hJoyHeld]
+ bit BIT_B_BUTTON, a
+ ret nz
+ ldh a, [hJoyPressed]
+ bit BIT_B_BUTTON, a
+ ret
+ENDC
ret
diff --git a/home/overworld.asm b/home/overworld.asm
index 68d50695..26451bf1 100644
--- a/home/overworld.asm
+++ b/home/overworld.asm
@@ -2292,7 +2292,11 @@ CheckForUserInterruption::
jr z, .input
ldh a, [hJoy5]
+IF DEF(_DEBUG)
+ and START | SELECT | A_BUTTON
+ELSE
and START | A_BUTTON
+ENDC
jr nz, .input
dec c
diff --git a/home/text.asm b/home/text.asm
index adb81425..70fade56 100644
--- a/home/text.asm
+++ b/home/text.asm
@@ -629,7 +629,11 @@ TextCommandJumpTable::
dw TextCommand_BOX ; TX_BOX
dw TextCommand_LOW ; TX_LOW
dw TextCommand_PROMPT_BUTTON ; TX_PROMPT_BUTTON
+IF DEF(_DEBUG)
+ dw _ContTextNoPause ; TX_SCROLL
+ELSE
dw TextCommand_SCROLL ; TX_SCROLL
+ENDC
dw TextCommand_START_ASM ; TX_START_ASM
dw TextCommand_NUM ; TX_NUM
dw TextCommand_PAUSE ; TX_PAUSE
diff --git a/home/trainers.asm b/home/trainers.asm
index f407652a..468b63f8 100644
--- a/home/trainers.asm
+++ b/home/trainers.asm
@@ -127,6 +127,10 @@ TalkToTrainer::
; checks if any trainers are seeing the player and wanting to fight
CheckFightingMapTrainers::
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ jr nz, .trainerNotEngaging
+ENDC
call CheckForEngagingTrainers
ld a, [wSpriteIndex]
cp $ff
diff --git a/layout.link b/layout.link
index ef6da300..40b00dee 100644
--- a/layout.link
+++ b/layout.link
@@ -183,6 +183,7 @@ ROMX $2E
"Pokédex Text"
ROMX $2f
"Move Names"
+ "BG Map Attributes (Debug)"
org $5000
"BG Map Attributes"
ROMX $30
diff --git a/main.asm b/main.asm
index 795204dd..30ce5825 100755
--- a/main.asm
+++ b/main.asm
@@ -311,15 +311,27 @@ INCLUDE "data/battle_anims/subanimations.asm"
INCLUDE "data/battle_anims/frame_blocks.asm"
+SECTION "BG Map Attributes (Debug)", ROMX
+
+IF DEF(_DEBUG)
+ INCLUDE "engine/gfx/bg_map_attributes.asm"
+ENDC
+
+
SECTION "BG Map Attributes", ROMX
-INCLUDE "engine/gfx/bg_map_attributes.asm"
+INCLUDE "data/cgb/bg_map_attributes.asm"
+IF !DEF(_DEBUG)
+ INCLUDE "engine/gfx/bg_map_attributes.asm"
+ENDC
SECTION "bank30", ROMX
; This whole bank is garbage data.
-INCBIN "garbage/bank30.bin"
+IF !DEF(_DEBUG)
+ INCBIN "garbage/bank30.bin"
+ENDC
SECTION "bank3A", ROMX
@@ -414,3 +426,4 @@ INCLUDE "engine/pikachu/pikachu_status.asm"
INCLUDE "engine/pikachu/pikachu_emotions.asm"
INCLUDE "engine/pikachu/pikachu_movement.asm"
INCLUDE "engine/pikachu/pikachu_pic_animation.asm"
+INCLUDE "engine/debug/debug_menu.asm"
diff --git a/roms.sha1 b/roms.sha1
index e61e2279..624d47f3 100644
--- a/roms.sha1
+++ b/roms.sha1
@@ -1 +1,2 @@
cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1 *pokeyellow.gbc
+d44e96eddfbdad633cbe4e6e64915e9e198974b0 *pokeyellow_debug.gbc
diff --git a/scripts/CeruleanCity.asm b/scripts/CeruleanCity.asm
index 5a8ce978..7a8dc63c 100755
--- a/scripts/CeruleanCity.asm
+++ b/scripts/CeruleanCity.asm
@@ -35,6 +35,10 @@ CeruleanCityScript4:
ret
CeruleanCityScript0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEvent EVENT_BEAT_CERULEAN_ROCKET_THIEF
jr nz, .asm_194f7
ld hl, CeruleanCityCoords1
diff --git a/scripts/MtMoonB2F.asm b/scripts/MtMoonB2F.asm
index 069fc1b3..d121f883 100755
--- a/scripts/MtMoonB2F.asm
+++ b/scripts/MtMoonB2F.asm
@@ -73,6 +73,10 @@ MtMoonB2F_ScriptPointers:
dw MtMoon3Script15
MtMoon3Script0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEitherEventSet EVENT_GOT_DOME_FOSSIL, EVENT_GOT_HELIX_FOSSIL
call z, MtMoon3Script_49d28
CheckEvent EVENT_BEAT_MT_MOON_3_TRAINER_0
diff --git a/scripts/PalletTown.asm b/scripts/PalletTown.asm
index 33d00c07..45a675e7 100755
--- a/scripts/PalletTown.asm
+++ b/scripts/PalletTown.asm
@@ -271,30 +271,45 @@ PalletTownText_19002:
text_far _OakWhewText
text_end
-PalletTownText8: ; girl
+PalletTownText8:
text_far _OakGrassText
text_end
-PalletTownText2: ; fat man
+PalletTownText2: ; girl
text_far _PalletTownText2
text_end
-PalletTownText3: ; sign by lab
+PalletTownText3: ; fat man
text_far _PalletTownText3
text_end
-PalletTownText4: ; sign by fence
+PalletTownText4: ; sign by lab
text_far _PalletTownText4
text_end
-PalletTownText5: ; sign by Red's house
+PalletTownText5: ; sign by fence
+IF DEF(_DEBUG)
+ text_asm
+ ld a, 239
+ inc a
+ ld [wWhichPewterGuy], a
+ ld hl, PalletTownText_502b
+ call PrintText
+ jp TextScriptEnd
+
+PalletTownText_502b:
+ text_decimal wWhichPewterGuy, 1, 3
+ text "bit"
+ done
+ELSE
text_far _PalletTownText5
text_end
+ENDC
-PalletTownText6: ; sign by Blue's house
+PalletTownText6: ; sign by Red's house
text_far _PalletTownText6
text_end
-PalletTownText7:
+PalletTownText7: ; sign by Blue's house
text_far _PalletTownText7
text_end
diff --git a/scripts/PewterCity.asm b/scripts/PewterCity.asm
index 26827bef..c1c2d190 100755
--- a/scripts/PewterCity.asm
+++ b/scripts/PewterCity.asm
@@ -26,6 +26,10 @@ PewterCityScript0:
PewterCityScript_1925e:
CheckEvent EVENT_BEAT_BROCK
ret nz
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
ld hl, CoordsData_19277
call ArePlayerCoordsInArray
ret nc
diff --git a/scripts/PokemonTower2F.asm b/scripts/PokemonTower2F.asm
index 5065e559..b9a46f85 100755
--- a/scripts/PokemonTower2F.asm
+++ b/scripts/PokemonTower2F.asm
@@ -17,6 +17,10 @@ PokemonTower2F_ScriptPointers:
dw PokemonTower2Script2
PokemonTower2Script0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEvent EVENT_BEAT_POKEMON_TOWER_RIVAL
ret nz
ld hl, CoordsData_6055e
diff --git a/scripts/PokemonTower7F.asm b/scripts/PokemonTower7F.asm
index ed128b3d..984322b6 100755
--- a/scripts/PokemonTower7F.asm
+++ b/scripts/PokemonTower7F.asm
@@ -27,6 +27,10 @@ PokemonTower7F_ScriptPointers:
dw PokemonTower7Script11
PokemonTower7Script0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEvent EVENT_BEAT_POKEMONTOWER_7_TRAINER_0
call z, PokemonTower7Script_60d2a
ret
diff --git a/scripts/RocketHideoutB4F.asm b/scripts/RocketHideoutB4F.asm
index 663d9345..f0b31d7f 100755
--- a/scripts/RocketHideoutB4F.asm
+++ b/scripts/RocketHideoutB4F.asm
@@ -69,6 +69,10 @@ RocketHideout4Script3:
ret
RocketHideout4Script0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEvent EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0
call z, RocketHideout4Script_455a5
CheckEvent EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2
diff --git a/scripts/SilphCo11F.asm b/scripts/SilphCo11F.asm
index 725a5ab3..ff8bb85f 100755
--- a/scripts/SilphCo11F.asm
+++ b/scripts/SilphCo11F.asm
@@ -97,6 +97,10 @@ SilphCo11F_ScriptPointers:
dw SilphCo11Script14
SilphCo11Script0:
+IF DEF(_DEBUG)
+ call DebugPressedOrHeldB
+ ret nz
+ENDC
CheckEvent EVENT_BEAT_SILPH_CO_11F_TRAINER_0
call z, SilphCo11Script_6229c
CheckEvent EVENT_782
diff --git a/wram.asm b/wram.asm
index c4038cd5..474b9c30 100755
--- a/wram.asm
+++ b/wram.asm
@@ -3249,6 +3249,10 @@ wPlayerJumpingYScreenCoordsIndex::
wRivalStarter::
ds 1
+IF DEF(_DEBUG)
+; This byte gets set to NUM_POKEMON by DebugStart.
+wUnknownDebugByte::
+ENDC
ds 1
wPlayerStarter::