summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZumi <13794376+ZoomTen@users.noreply.github.com>2021-07-05 05:08:45 +0700
committerGitHub <noreply@github.com>2021-07-04 18:08:45 -0400
commitaf65010e2ca58f275b14046d60708b83398dddfd (patch)
tree624ef4cd0c305cd7bb98fd7ecc91d1dbb2739cd1
parent71050d61347bfe1e196a385d84bfb6a3c6d7e22d (diff)
Disassemble field debug (bank $3f) (#97)
* Disassemble SFX and cries * Disassemble clock dialog * Disassemble slot machine minigame * Disassemble AnimateTilesetImpl * Disassemble start menu frame type dialog * Disassemble field menu * Split debug menus into debug folder * Remove redundant shims
-rw-r--r--constants/movement_constants.asm9
-rw-r--r--constants/sfx_constants.asm5
-rw-r--r--constants/wram_constants.asm10
-rw-r--r--data/field_debug_entries.inc130
-rw-r--r--data/field_debug_pokemart_items.inc10
-rw-r--r--data/field_debug_usable_items_1.inc38
-rw-r--r--data/field_debug_usable_items_2.inc9
-rw-r--r--engine/debug/debug_menu.asm (renamed from engine/menu/debug_menu.asm)0
-rw-r--r--engine/debug/field/change_tileset.inc39
-rw-r--r--engine/debug/field/change_transportation.inc168
-rw-r--r--engine/debug/field/check_tile.inc64
-rw-r--r--engine/debug/field/field_cut.inc93
-rw-r--r--engine/debug/field/follow_npc_test.inc102
-rw-r--r--engine/debug/field/item_test.inc277
-rw-r--r--engine/debug/field/map_viewer.inc432
-rw-r--r--engine/debug/field/minigames.inc86
-rw-r--r--engine/debug/field/mon_following.inc60
-rw-r--r--engine/debug/field/move_to_entrance.inc46
-rw-r--r--engine/debug/field/npc_movement_test.inc55
-rw-r--r--engine/debug/field/pokemart_menu.inc343
-rw-r--r--engine/debug/field/sprite_viewer.inc500
-rw-r--r--engine/debug/field/teleport.inc33
-rw-r--r--engine/debug/field/toggle_npc_movement.inc39
-rw-r--r--engine/debug/field/toolgear.inc97
-rw-r--r--engine/debug/field/unused_flag_menu.inc90
-rw-r--r--engine/debug/field/unused_priority_menu.inc30
-rw-r--r--engine/debug/field/vram_viewer.inc272
-rw-r--r--engine/debug/field/warp.inc73
-rw-r--r--engine/debug/field_debug_menu.asm295
-rw-r--r--home/map.asm2
-rw-r--r--home/overworld.asm2
-rw-r--r--home/tileset.asm1
-rw-r--r--home/toolgear.asm28
-rw-r--r--layout.link8
-rw-r--r--ram/hram.asm5
-rw-r--r--ram/wram.asm48
-rwxr-xr-xshim.sym4
37 files changed, 3479 insertions, 24 deletions
diff --git a/constants/movement_constants.asm b/constants/movement_constants.asm
index 6347318..ff920a0 100644
--- a/constants/movement_constants.asm
+++ b/constants/movement_constants.asm
@@ -42,3 +42,12 @@
const MOVEMENT_28 ; $28
const MOVEMENT_29 ; $29
const NO_MOVEMENT ; $2a
+ const MOVEMENT_2B ; $2b
+ const MOVEMENT_2C ; $2c
+ const MOVEMENT_2D ; $2d
+ const MOVEMENT_2E ; $2e
+ const MOVEMENT_2F ; $2f
+ const MOVEMENT_30 ; $30
+ const MOVEMENT_31 ; $31
+ const MOVEMENT_32 ; $32
+ const MOVEMENT_33 ; $33
diff --git a/constants/sfx_constants.asm b/constants/sfx_constants.asm
index a0a3418..b5d7fd0 100644
--- a/constants/sfx_constants.asm
+++ b/constants/sfx_constants.asm
@@ -9,12 +9,17 @@ SFX_BOOT_PC EQU $0A
SFX_ESCAPE_ROPE EQU $0B ; player shrink
SFX_WRONG EQU $14
SFX_SWITCH_POKEMON EQU $1B
+SFX_1E EQU $1E
SFX_POKEFLUTE EQU $21
+SFX_22 EQU $22
+SFX_24 EQU $24
+SFX_25 EQU $25
SFX_POKEDEX_REGISTRATION EQU $27
SFX_TITLE_ENTRANCE EQU $2D
SFX_PAY_DAY EQU $30
SFX_GAME_FREAK_LOGO_RG EQU $31
+SFX_SHINE EQU $62
; R/G/B/Y fanfares
SFX_GET_ITEM_RG EQU $63
diff --git a/constants/wram_constants.asm b/constants/wram_constants.asm
index ff00944..f2298ae 100644
--- a/constants/wram_constants.asm
+++ b/constants/wram_constants.asm
@@ -27,3 +27,13 @@ PLAYER_SURF_PIKA EQU 8
const DEBUG_BATTLE_F
const DEBUG_FIELD_F
const CONTINUED_F
+
+
+; wToolgearFlags::
+SHOW_TOOLGEAR_F EQU 0
+TOOLGEAR_TO_WINDOW_F EQU 2
+HIDE_TOOLGEAR_F EQU 7
+
+; wd153::
+TOOLGEAR_COORDS_F EQU 0
+OVERWORLD_MINUTE_TIME_F EQU 7
diff --git a/data/field_debug_entries.inc b/data/field_debug_entries.inc
new file mode 100644
index 0000000..c304e80
--- /dev/null
+++ b/data/field_debug_entries.inc
@@ -0,0 +1,130 @@
+; FieldDebug_Jumptable constants
+ const_def
+ const FIELDDEBUG_RESET ; 0
+ const FIELDDEBUG_CLOSE_MENU ; 1
+ const FIELDDEBUG_FRAME_TYPE ; 2
+ const FIELDDEBUG_MINIGAMES ; 3
+ const FIELDDEBUG_CHANGE_TRANSPORTATION ; 4
+ const FIELDDEBUG_CHANGE_TILESET ; 5
+ const FIELDDEBUG_TOWN_MAP ; 6
+ const FIELDDEBUG_SPRITE_VIEWER ; 7
+ const FIELDDEBUG_NAME_PLAYER ; 8
+ const FIELDDEBUG_TOOLGEAR ; 9
+ const FIELDDEBUG_CLEAR_EVENT_FLAGS ; $a
+ const FIELDDEBUG_HEAL_POKEMON ; $b
+ const FIELDDEBUG_CABLE_CLUB ; $c
+ const FIELDDEBUG_GO_TO_NEXT_PAGE ; $d
+ const FIELDDEBUG_NPC_MOVEMENT_TEST ; $e
+ const FIELDDEBUG_POKEMON_FOLLOWING ; $f
+ const FIELDDEBUG_FOLLOW_NPC_TEST ; $10
+ const FIELDDEBUG_WARP ; $11
+ const FIELDDEBUG_FIELD_CUT ; $12
+ const FIELDDEBUG_CHECK_TILE ; $13
+ const FIELDDEBUG_MOVE_TO_ROUTE1_ENTRANCE ; $14
+ const FIELDDEBUG_TOGGLE_NPC_MOVEMENT ; $15
+ const FIELDDEBUG_MAP_VIEWER ; $16
+ const FIELDDEBUG_ITEM_TEST ; $17
+ const FIELDDEBUG_PC_MENU ; $18
+ const FIELDDEBUG_POKEMART_MENU ; $19
+ const FIELDDEBUG_TELEPORT ; $1a
+ const FIELDDEBUG_VRAM_VIEWER ; $1b
+ const FIELDDEBUG_TRAINER_GEAR ; $1c
+
+FieldDebug_MenuStrings:
+ db "りセット@"
+ db "とじる@"
+ db "わくせん@"
+ db "ゲーム@"
+ db "のりもの@"
+ db "セル@"
+ db "ちず@"
+ db "キャラ@"
+ db "なまえ@"
+ db "ツールギア@"
+ db "イべント@"
+ db "かいふく@"
+ db "つうしん@"
+ db "つぎ▶@"
+ db "アニメ@"
+ db "つれてく@"
+ db "つれてけ@"
+ db "ワープ@"
+ db "くさかり@"
+ db "あしもと@"
+ db "じどう@"
+ db "うごき@"
+ db "マッパー@"
+ db "アイテム@"
+ db "パソコン@"
+ db "ショップ@"
+ db "テレポ!@"
+ db "テスト@"
+ db "じっけん@"
+
+FieldDebug_Jumptable:
+ dw FieldDebug_Reset
+ dw FieldDebug_CloseMenu
+ dw FieldDebug_FrameType
+ dw FieldDebug_Minigames
+ dw FieldDebug_ChangeTransportation
+ dw FieldDebug_ChangeTileset
+ dw FieldDebug_TownMap
+ dw FieldDebug_SpriteViewer
+ dw FieldDebug_NamePlayer
+ dw FieldDebug_Toolgear
+ dw FieldDebug_ClearEventFlags
+ dw FieldDebug_HealPokemon
+ dw FieldDebug_CableClub
+ dw FieldDebug_GoToNextPage
+ dw FieldDebug_NPCMovementTest
+ dw FieldDebug_PokemonFollowing
+ dw FieldDebug_FollowNPCTest
+ dw FieldDebug_Warp
+ dw FieldDebug_FieldCut
+ dw FieldDebug_CheckTile
+ dw FieldDebug_MoveToRoute1Entrance
+ dw FieldDebug_ToggleNPCMovement
+ dw FieldDebug_OpenMapViewer
+ dw FieldDebug_ItemTest
+ dw FieldDebug_PCMenu
+ dw FieldDebug_PokemartMenu
+ dw FieldDebug_Teleport
+ dw FieldDebug_VRAMViewer
+ dw FieldDebug_TrainerGear
+
+FIELDDEBUG_NUM_PAGES EQU 3
+
+FieldDebug_Pages:
+; page 1
+ db 7 ; number of items
+ db FIELDDEBUG_GO_TO_NEXT_PAGE
+ db FIELDDEBUG_WARP
+ db FIELDDEBUG_SPRITE_VIEWER
+ db FIELDDEBUG_CHANGE_TRANSPORTATION
+ db FIELDDEBUG_TOOLGEAR
+ db FIELDDEBUG_PC_MENU
+ db FIELDDEBUG_CLOSE_MENU
+ db -1
+
+; page 2
+ db 7 ; number of items
+ db FIELDDEBUG_GO_TO_NEXT_PAGE
+ db FIELDDEBUG_POKEMART_MENU
+ db FIELDDEBUG_HEAL_POKEMON
+ db FIELDDEBUG_TRAINER_GEAR
+ db FIELDDEBUG_MINIGAMES
+ db FIELDDEBUG_MAP_VIEWER
+ db FIELDDEBUG_CLOSE_MENU
+ db -1
+
+; page 3
+ db 7 ; number of items
+ db FIELDDEBUG_GO_TO_NEXT_PAGE
+ db FIELDDEBUG_CLEAR_EVENT_FLAGS
+ db FIELDDEBUG_VRAM_VIEWER
+ db FIELDDEBUG_TELEPORT
+ db FIELDDEBUG_FOLLOW_NPC_TEST
+ db FIELDDEBUG_TOWN_MAP
+ db FIELDDEBUG_CLOSE_MENU
+ db -1
+
diff --git a/data/field_debug_pokemart_items.inc b/data/field_debug_pokemart_items.inc
new file mode 100644
index 0000000..c9be9c0
--- /dev/null
+++ b/data/field_debug_pokemart_items.inc
@@ -0,0 +1,10 @@
+DebugMart_ItemList:
+ db ITEM_BICYCLE
+ db ITEM_MOON_STONE
+ db ITEM_ANTIDOTE
+ db ITEM_BURN_HEAL
+ db ITEM_MAX_POTION
+ db ITEM_HYPER_POTION
+ db ITEM_SUPER_POTION
+ db ITEM_POTION
+ db -1
diff --git a/data/field_debug_usable_items_1.inc b/data/field_debug_usable_items_1.inc
new file mode 100644
index 0000000..5115df4
--- /dev/null
+++ b/data/field_debug_usable_items_1.inc
@@ -0,0 +1,38 @@
+ItemTest_UsableItems:
+ db ITEM_BURN_HEAL
+ db ITEM_ICE_HEAL
+ db ITEM_AWAKENING
+ db ITEM_PARLYZ_HEAL
+ db ITEM_FULL_RESTORE
+ db ITEM_MAX_POTION
+ db ITEM_HYPER_POTION
+ db ITEM_SUPER_POTION
+ db ITEM_POTION
+ db ITEM_ESCAPE_ROPE
+ db ITEM_REPEL
+ db ITEM_RARE_CANDY
+ db ITEM_X_ACCURACY
+ db ITEM_LEAF_STONE
+ db ITEM_23
+ db ITEM_NUGGET
+ db ITEM_POKE_DOLL
+ db ITEM_FULL_HEAL
+ db ITEM_REVIVE
+ db ITEM_MAX_REVIVE
+ db ITEM_SODA_POP
+ db ITEM_X_SPEED
+ db ITEM_X_SPECIAL
+ db ITEM_COIN_CASE
+ db ITEM_3C
+ db ITEM_SUPER_ROD
+ db ITEM_PP_UP
+ db ITEM_ELIXER
+ db ITEM_MYSTIC_PETAL
+ db ITEM_WHITE_FEATHER
+ db ITEM_CONFUSE_CLAW
+ db ITEM_SNAKESKIN
+ db ITEM_ELECTRIC_POUCH
+ db ITEM_TOXIC_NEEDLE
+ db ITEM_KINGS_ROCK
+ db ITEM_STRANGE_POWER
+ db -1
diff --git a/data/field_debug_usable_items_2.inc b/data/field_debug_usable_items_2.inc
new file mode 100644
index 0000000..46e66f2
--- /dev/null
+++ b/data/field_debug_usable_items_2.inc
@@ -0,0 +1,9 @@
+ItemTest_UsableItems2:
+ db ITEM_BICYCLE
+ db ITEM_CARBOS
+ db ITEM_UP_GRADE
+ db ITEM_BIG_LEAF
+ db ITEM_SHARP_STONE
+ db ITEM_BLACK_FEATHER
+ db ITEM_SHARP_FANG
+ db -1
diff --git a/engine/menu/debug_menu.asm b/engine/debug/debug_menu.asm
index 020e227..020e227 100644
--- a/engine/menu/debug_menu.asm
+++ b/engine/debug/debug_menu.asm
diff --git a/engine/debug/field/change_tileset.inc b/engine/debug/field/change_tileset.inc
new file mode 100644
index 0000000..bc7f3bc
--- /dev/null
+++ b/engine/debug/field/change_tileset.inc
@@ -0,0 +1,39 @@
+SECTION "engine/debug/field/change_tileset.inc@FieldDebug_ChangeTileset", ROMX
+
+FieldDebug_ChangeTileset:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ ld a, [wMapTileset]
+ inc a
+ ld [wMenuCursorBuffer], a
+ call VerticalMenu
+ call CloseWindow
+ jr c, .reopen
+ ld a, [wMapTileset]
+ ld b, a
+ ld a, [wMenuCursorY]
+ dec a
+ cp b
+ jr z, .reopen
+ ld [wMapTileset], a
+ call LoadTileset
+ call LoadTilesetGFX
+ jr FieldDebug_ChangeTileset
+
+.reopen:
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 8, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 3
+ db "セル1@"
+ db "セル2@"
+ db "セル3@"
+
diff --git a/engine/debug/field/change_transportation.inc b/engine/debug/field/change_transportation.inc
new file mode 100644
index 0000000..00c3693
--- /dev/null
+++ b/engine/debug/field/change_transportation.inc
@@ -0,0 +1,168 @@
+FieldDebug_ChangeTransportation:
+ ld hl, .ChangeTransportationMenuHeader
+ call LoadMenuHeader
+ ld a, [wPlayerState]
+ call GetActiveTransportation
+ ld [wMenuCursorBuffer], a
+ dec a
+ call CopyNameFromMenu
+ call VerticalMenu
+ jp c, .exit
+ ld a, [wMenuCursorY]
+ call SetTransportation
+ ld hl, wPlayerState
+ cp [hl]
+ jr z, .exit
+ cp PLAYER_SURF
+ jr z, .check_surf
+ ld [wPlayerState], a
+ and a
+ jr z, .walking
+ ld a, [wMenuCursorY]
+ dec a
+ call CopyNameFromMenu
+ call CloseWindow
+ call CloseWindow
+ ld hl, .PlayerTransportationString2
+ call MenuTextBox
+ jr .update_sprite
+
+.walking
+ ld a, -1
+ ld [wSkatingDirection], a
+ call CloseWindow
+ call CloseWindow
+ call PlayMapMusic
+ ld hl, .PlayerTransportationString1
+ call MenuTextBox
+
+.update_sprite
+ callab GetPlayerSprite
+ ld a, BUTTONS
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+ ld a, FIELDDEBUG_RETURN_CLEANUP
+ ret
+
+.check_surf
+ call FieldDebug_CheckFacingSurfable
+ jr c, .cannot_surf
+ ld [wPlayerState], a
+ call FieldDebug_SetSurfDirection
+ ld a, [wMenuCursorY]
+ dec a
+ call CopyNameFromMenu
+ call CloseWindow
+ call CloseWindow
+ ld hl, .PlayerTransportationString2
+ call MenuTextBox
+ jr .update_sprite
+
+.cannot_surf
+ ld hl, .CannotSurfString
+ call MenuTextBox
+ ld a, BUTTONS
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+
+.exit
+ call CloseWindow
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.ChangeTransportationMenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 3, 3, 12, 13
+ dw .ChangeTransportationMenuData
+ db 1
+
+.ChangeTransportationMenuData:
+ db STATICMENU_WRAP | STATICMENU_CURSOR
+ db 4
+ db "あるき@"
+ db "じてんしゃ@"
+ db "スケボー@"
+ db "ラプラス@"
+
+.PlayerTransportationString1:
+ text "<PLAYER>は@"
+ text_low
+ text_from_ram wStringBuffer2
+ text "から おりた"
+ prompt
+
+.PlayerTransportationString2:
+ text "<PLAYER>は@"
+ text_low
+ text_from_ram wStringBuffer2
+ text "に のった"
+ prompt
+
+.CannotSurfString:
+ text "ここでは のることが"
+ next "できません"
+ prompt
+
+SetTransportation:
+ ld hl, TransportationList
+ dec a
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, [hl]
+ ret
+
+GetActiveTransportation:
+ ld hl, TransportationList
+ ld b, 1
+.loop
+ cp [hl]
+ jr z, .got_transportation
+ inc hl
+ inc b
+ jr .loop
+.got_transportation
+ ld a, b
+ ret
+
+TransportationList:
+ db PLAYER_NORMAL
+ db PLAYER_BIKE
+ db PLAYER_SKATE
+ db PLAYER_SURF
+
+FieldDebug_CheckFacingSurfable:
+ push af
+ call GetFacingTileCoord
+ and COLLISION_TYPE_MASK
+ cp OLD_COLLISION_TYPE_WATER ; happens to match COLLISION_TYPE_WATER
+ jr z, .surfable
+ cp OLD_COLLISION_TYPE_WATER2
+ jr z, .surfable
+; not surfable
+ pop af
+ scf
+ ret
+.surfable
+ pop af
+ and a
+ ret
+
+FieldDebug_SetSurfDirection:
+ ld a, [wPlayerWalking]
+ srl a
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .Directions
+ add hl, de
+ ld a, [hl]
+ ld [wPlayerMovement], a
+ ret
+
+.Directions:
+ db SLOW_STEP_DOWN
+ db SLOW_STEP_UP
+ db SLOW_STEP_LEFT
+ db SLOW_STEP_RIGHT
+
diff --git a/engine/debug/field/check_tile.inc b/engine/debug/field/check_tile.inc
new file mode 100644
index 0000000..5094807
--- /dev/null
+++ b/engine/debug/field/check_tile.inc
@@ -0,0 +1,64 @@
+FieldDebug_CheckTile:
+ call .CheckTile
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.CheckTile:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call MenuBox
+ ld a, [wPlayerNextMapX]
+ ld d, a
+ ld a, [wPlayerNextMapY]
+ ld e, a
+ call GetBlockLocation
+ ld a, [hl]
+ push af
+ call MenuBoxCoord2Tile
+ ld bc, $2a
+ add hl, bc
+ pop af
+ call .ShowTileNumber
+ ld a, 10
+ call DelayFrames
+ ld a, BUTTONS
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+ ret
+
+.MenuHeader:
+ db $40
+ menu_coords 0, 0, 5, 4
+ dw .MenuData
+ db 0
+
+.MenuData: ; empty
+ db 0
+
+.ShowTileNumber:
+ push af
+ swap a
+ and $f
+ call .ShowHexDigit
+ ld [hli], a
+ pop af
+ and $f
+ call .ShowHexDigit
+ ld [hli], a
+ ret
+
+.ShowHexDigit:
+ push de
+ push hl
+ ld hl, .HexadecimalNumbers
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ pop hl
+ pop de
+ ret
+
+.HexadecimalNumbers:
+ db "0123456789ABCDEF"
+
diff --git a/engine/debug/field/field_cut.inc b/engine/debug/field/field_cut.inc
new file mode 100644
index 0000000..b56a0b2
--- /dev/null
+++ b/engine/debug/field/field_cut.inc
@@ -0,0 +1,93 @@
+FieldDebug_FieldCut:
+ call .DetermineEnvironment
+ jr c, .close_menu
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.close_menu
+ ld a, FIELDDEBUG_RETURN_CLEANUP
+ ret
+
+.DetermineEnvironment:
+ call GetMapEnvironment
+ cp ROUTE
+ jr z, .outdoors
+; Exit if indoors
+ cp TOWN
+ jr nz, .exit
+
+.outdoors
+ call .CheckGrassMetatile
+ jr z, .in_grass
+ call .IsCollision
+ jr nz, .exit
+ call .IsCuttableTile
+ jr nc, .exit
+ ld [hl], a
+ jr .do_cut
+.in_grass
+ ld [hl], METATILE_LAWN
+.do_cut
+ call CloseWindow
+ ld de, SFX_SHINE
+ call PlaySFX
+ call LoadMapPart
+ call UpdateSprites
+ call WaitBGMap
+ scf
+ ret
+
+.exit
+ and a
+ ret
+
+.CheckGrassMetatile:
+ ld a, [wPlayerNextMapX]
+ ld d, a
+ ld a, [wPlayerNextMapY]
+ ld e, a
+ call GetBlockLocation
+ ld a, [hl]
+ cp METATILE_GRASS
+ ret
+
+.IsCollision: ; broken
+ call GetFacingTileCoord
+ cp OLD_COLLISION_CUT_TREE
+ ret
+
+.IsCuttableTile:
+ call GetBlockLocation
+ ld a, [hl]
+ ld b, a
+ ld de, .CuttableMetatiles
+.find_cuttables
+ ld a, [de]
+ inc de
+ cp b
+ jr z, .got_cuttable
+ cp -1
+ jr z, .not_cuttable
+ inc de
+ jr .find_cuttables
+
+.got_cuttable
+ ld a, [de]
+ scf
+ ret
+
+.not_cuttable
+ and a
+ ret
+
+.CuttableMetatiles:
+ db METATILE_CUT_SE_TREES_N
+ db METATILE_SMALL_TREES_N
+ db METATILE_CUT_NW_TREES_E
+ db METATILE_SMALL_TREES_E
+ db METATILE_CUT_NE_TREE_NW
+ db METATILE_SMALL_TREE_NW
+ db METATILE_CUT_NE_TREE_SE
+ db METATILE_SMALL_TREE_SE
+ db -1
+
diff --git a/engine/debug/field/follow_npc_test.inc b/engine/debug/field/follow_npc_test.inc
new file mode 100644
index 0000000..4fee46b
--- /dev/null
+++ b/engine/debug/field/follow_npc_test.inc
@@ -0,0 +1,102 @@
+FieldDebug_FollowNPCTest:
+ call .DoFollowNPC
+ jr c, .exit
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+.exit
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.DoFollowNPC:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ jr c, .close
+ ld a, [wMenuCursorY]
+ cp 1
+ jr nz, .end
+ ld a, [wObjectFollow_Follower]
+ and a
+ jr nz, .cannot_use
+ call .asm_fc9a5
+ call CloseWindow
+ scf
+ ret
+
+.end
+ call .asm_fc9c2
+ jr .close
+.cannot_use
+ ld hl, .CannotUseWithPokemonText
+ call MenuTextBox
+ call CloseWindow
+.close
+ call CloseWindow
+ and a
+ ret
+
+.asm_fc9a5:
+ callab Function8047
+ ld a, 1
+ call Function15ed
+ ld a, 1
+ ld hl, .MovementData
+ call LoadMovementDataPointer
+ ld b, 1
+ ld c, 0
+ call StartFollow
+ ret
+
+.asm_fc9c2:
+ call Function18cc
+ ld a, 1
+ call Function169f
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 3, 3, 9, 9
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 2
+ db "はじめる@"
+ db "おわる@"
+
+.CannotUseWithPokemonText:
+ text "ポケモンを つれているときは"
+ next "だめです"
+ prompt
+
+.MovementData:
+ db FACE_UP
+ db SLOW_STEP_UP
+ db STEP_UP
+ db STEP_RIGHT
+ db FAST_STEP_RIGHT
+ db JUMP_DOWN
+ db FAST_STEP_DOWN
+ db FAST_STEP_DOWN
+ db STEP_DOWN
+ db STEP_LEFT
+ db STEP_LEFT
+ db JUMP_UP
+ db SLOW_STEP_UP
+ db MOVEMENT_33
+
+MenuHeaderfca01: ; unreferenced?
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 11, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_WRAP | STATICMENU_CURSOR
+ db 4
+ db "ポケモンつれあるき@"
+ db "つれあるかれデモ@"
+ db "ライバルおねえさん@"
+ db "さくせいちゅう@"
+
diff --git a/engine/debug/field/item_test.inc b/engine/debug/field/item_test.inc
new file mode 100644
index 0000000..6f928ac
--- /dev/null
+++ b/engine/debug/field/item_test.inc
@@ -0,0 +1,277 @@
+ItemTest_BagMenu:
+ dw .MenuHeader
+ dw wRegularItemsCursor
+ dw wRegularItemsScrollPosition
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 4, 1, 19, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db SCROLLINGMENU_ENABLE_LEFT | SCROLLINGMENU_ENABLE_RIGHT | SCROLLINGMENU_ENABLE_FUNCTION3
+ db 4, 8 ; rows, columns
+ db SCROLLINGMENU_ITEMS_QUANTITY
+ dbw 0, wItems
+; Incorrectly configured, will cause the game to crash
+ db BANK(PlaceMenuItemName), $cd
+ dw PlaceMenuItemName
+ db BANK(PlaceMenuItemQuantity), $cd
+ dw PlaceMenuItemQuantity
+ db BANK(UpdateItemDescription)
+ dw UpdateItemDescription
+
+ItemTest_KeyItemMenu:
+ dw .MenuHeader
+ dw wBackpackAndKeyItemsCursor
+ dw wBackpackAndKeyItemsScrollPosition
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 4, 1, 19, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db SCROLLINGMENU_ENABLE_LEFT | SCROLLINGMENU_ENABLE_RIGHT | SCROLLINGMENU_ENABLE_FUNCTION3
+ db 4, 8 ; rows, columns
+ db SCROLLINGMENU_ITEMS_QUANTITY
+ dbw 0, wNumKeyItems
+; Incorrectly configured, will cause the game to crash
+ db BANK(PlaceMenuItemName), $cd
+ dw PlaceMenuItemName
+ db BANK(PlaceMenuItemQuantity), $cd
+ dw PlaceMenuItemQuantity
+ db BANK(UpdateItemDescription)
+ dw UpdateItemDescription
+
+FieldDebug_ItemTest:
+ call ClearSprites
+ ld hl, wVramState
+ res 0, [hl]
+ call LoadStandardMenuHeader
+ call ClearTileMap
+ call UpdateSprites
+ call .DoItemTest
+ ld hl, wVramState
+ set 0, [hl]
+ call CloseWindow
+ ret
+; unused
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.ClearTilemap:
+ ld hl, wTileMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, $f1
+ call ByteFill
+ ret
+
+.DoItemTest:
+ call .ClearTilemap
+.bag_menu
+ ld hl, ItemTest_BagMenu
+ call Function3810
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .exit_menu
+ cp D_LEFT
+ jr z, .key_item_menu
+ cp D_RIGHT
+ jr z, .key_item_menu
+ jr .DecideAction
+
+.key_item_menu
+ ld hl, ItemTest_KeyItemMenu
+ call Function3810
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .exit_menu
+ cp D_LEFT
+ jr z, .bag_menu
+ cp D_RIGHT
+ jr z, .bag_menu
+ ld hl, .CannotUsePCToolsText
+ call MenuTextBox
+ call CloseWindow
+ jr .key_item_menu
+
+.CannotUsePCToolsText:
+ text "パソコンの どうぐ は"
+ next "つかえません"
+ prompt
+
+.restart
+ jp .DoItemTest
+
+.exit_menu
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+; unused
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DecideAction:
+ ld a, [wScrollingMenuCursorPosition]
+ ld [wItemIndex], a
+ call .ClearMenu
+ call PlaceHollowCursor
+ ld hl, .UseOrTossMenuHeader
+ call GetMenu2
+ jp c, .restart
+ ld a, [wMenuCursorY]
+ cp 2
+ jr z, .toss_item
+ jp .continue
+; unused
+ ld hl, .ItemPickedText
+ call FieldDebug_ShowTextboxAndExit
+ jp .restart
+
+.ItemPickedText:
+ text "アイテムを えらんだ!"
+ done
+
+.ClearMenu:
+ call MenuBoxCoord2Tile
+ ld de, $14
+ add hl, de
+ ld de, $28
+ ld a, [wMenuDataItems]
+.clear_menu_loop
+ ld [hl], " "
+ add hl, de
+ dec a
+ jr nz, .clear_menu_loop
+ ret
+
+.UseOrTossMenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 14, 10, 19, 14
+ dw .UseOrTossMenuData
+ db 1
+
+.UseOrTossMenuData:
+ db $c0
+ db 2
+ db "つかう@"
+ db "すてる@"
+
+.toss_item
+ ld hl, wItems
+ call .DetermineItemTossable
+ jp .DoItemTest
+
+.DetermineItemTossable:
+ push hl
+ callab _CheckTossableItem
+ pop hl
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .not_tossable
+ call .tossable
+ jr .done
+
+.not_tossable
+ ld hl, .CannotTossText
+ call MenuTextBox
+ call CloseWindow
+.done
+ ret
+
+.tossable
+ push hl
+ callab SelectQuantityToToss
+ jr c, .cancel_toss
+ call .load_item
+ ld hl, .TossConfirmText
+ call MenuTextBox
+ call YesNoBox
+ call CloseWindow
+ jr c, .cancel_toss
+ ld a, [wItemIndex]
+ pop hl
+ call TossItem
+ call .load_item
+
+; Crashes here; .ItemTossedText should be loaded to hl instead
+ call .ItemTossedText
+ call MenuTextBox
+
+ call ExitMenu
+ call CloseWindow
+ and a
+ ret
+
+.cancel_toss
+; Missing pop after push
+ call CloseWindow
+ scf
+ ret
+
+.load_item
+ predef LoadItemData
+ ret
+
+.TossConfirmText:
+ text_from_ram wStringBuffer2
+ text "を すてます"
+ line "ほんとに よろしいですか?"
+ prompt
+
+.ItemTossedText:
+ text_from_ram wStringBuffer1
+ text "を"
+ line "すてました!"
+ prompt
+
+.CannotTossText:
+ text "それは とても たいせつなモノです"
+ line "すてることは できません!"
+ prompt
+
+.continue
+ predef LoadItemData
+ ld a, [wCurItem]
+ cp ITEM_TM01
+ jr nc, .use_item2
+ ld a, [wCurItem]
+ call ItemTest_FindUsableItem2
+ jr c, .use_item
+ ld a, [wCurItem]
+ call ItemTest_FindUsableItem
+ jr c, .use_item2
+ call UseItem
+ jp .restart
+
+.use_item
+ call UseItem
+ ld a, [wFieldMoveSucceeded]
+ and a
+ jp z, .restart
+ ld a, FIELDDEBUG_RETURN_WAIT_INPUT
+ ret
+
+.use_item2
+ call UseItem
+ call ClearBGPalettes
+ call Function360b
+ jp .restart
+
+ItemTest_FindUsableItem:
+ ld hl, ItemTest_UsableItems
+ ld de, 1
+ call FindItemInTable
+ ret
+
+INCLUDE "data/field_debug_usable_items_1.inc"
+
+ItemTest_FindUsableItem2:
+ ld hl, ItemTest_UsableItems2
+ ld de, 1
+ call FindItemInTable
+ ret
+
+INCLUDE "data/field_debug_usable_items_2.inc"
diff --git a/engine/debug/field/map_viewer.inc b/engine/debug/field/map_viewer.inc
new file mode 100644
index 0000000..99496d0
--- /dev/null
+++ b/engine/debug/field/map_viewer.inc
@@ -0,0 +1,432 @@
+; DebugMapViewer.Jumptable constants
+ const_def
+ const DEBUGMAPVIEWER_EMPTY ; 0
+ const DEBUGMAPVIEWER_INIT ; 1
+ const DEBUGMAPVIEWER_CONTROL_CURSOR ; 2
+ const DEBUGMAPVIEWER_MOVE_CURSOR_TO_PLAYER ; 3
+ const DEBUGMAPVIEWER_WAIT_FINISHED_MOVING ; 4
+ const DEBUGMAPVIEWER_CLEANUP ; 5
+
+FieldDebug_OpenMapViewer:
+ call .DoOpen
+ jr c, .done
+ ld a, FIELDDEBUG_RETURN_EXIT
+ ret
+
+.done
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoOpen:
+ ld hl, .MapViewPrompt
+ call MenuTextBox
+ call YesNoBox
+ call CloseWindow
+ ret c
+
+ ldh a, [hROMBank]
+ ld hl, .MapViewScript
+ call QueueScript
+ ret
+
+.MapViewPrompt:
+ text "マップビューワーを"
+ line "しようしますか?"
+ done
+
+.MapViewScript:
+ ld a, 9
+ call WriteIntod637
+ xor a
+ ldh [hJoypadSum], a
+ ld a, DEBUGMAPVIEWER_INIT
+ ldh [hDebugMapViewerJumptable], a
+ ret
+
+DebugMapViewer::
+ ld a, [wd153]
+ ld b, a
+ ld a, [wToolgearFlags]
+ ld c, a
+ push bc
+ call EnableToolgearCoords
+ call InitToolgearBuffer
+.loop
+ call GetJoypad
+ call .do_jumptable
+ jr c, .continue
+ call Function2c4a
+ jr nc, .loop
+ callab Function824c
+ jr .loop
+
+.continue
+ ld a, 4
+ call WriteIntod637
+ pop bc
+ ld a, b
+ ld [wd153], a
+ ld a, c
+ ld [wToolgearFlags], a
+ ret
+
+.do_jumptable
+ ld a, [wDebugFlags]
+ bit 1, a
+ ret z
+ ldh a, [hDebugMapViewerJumptable]
+ and a
+ ret z
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw .Empty
+ dw .Init
+ dw .ControlCursor
+ dw .MoveCursorToPlayer
+ dw .WaitFinishedMoving
+ dw .Cleanup
+
+.Empty:
+ ret
+
+.Init:
+ call Function18b4
+ call DebugMapViewer_LoadCursorSprite
+ call DebugMapViewer_ReplacePlayerObject
+ ld a, $2a
+ ld [wMovementObject], a
+ ld a, DEBUGMAPVIEWER_CONTROL_CURSOR
+ ldh [hDebugMapViewerJumptable], a
+ and a
+ ret
+
+.ControlCursor:
+ ldh a, [hJoypadSum]
+ ld b, a
+ xor a
+ ldh [hJoypadSum], a
+ ld a, b
+ and START
+ jr nz, .start_pressed
+ ldh a, [hJoyState]
+ and A_BUTTON
+ jr nz, .a_pressed
+ call DebugMapViewer_DoMovement
+ jr .apply_movement
+.start_pressed
+ call DebugMapViewer_ShowViewerPrompt
+ ld a, $2a
+ jr .apply_movement
+.a_pressed
+ call DebugMapViewer_ShowSelectedDetails
+ ld a, $2a
+.apply_movement
+ ld [wMovementObject], a
+ and a
+ ret
+
+.MoveCursorToPlayer:
+ ld a, 1
+ ld hl, wMovementBuffer
+ call LoadMovementDataPointer
+ ld d, 2
+ ld b, 1
+ ld c, 0
+ callab Function83a2
+ ld a, DEBUGMAPVIEWER_WAIT_FINISHED_MOVING
+ ldh [hDebugMapViewerJumptable], a
+ and a
+ ret
+
+.WaitFinishedMoving:
+ ld hl, wVramState
+ bit 7, [hl]
+ jr nz, .skip
+ ld a, DEBUGMAPVIEWER_CLEANUP
+ ldh [hDebugMapViewerJumptable], a
+.skip
+ and a
+ ret
+
+.Cleanup:
+ ld a, 1
+ call Function169f
+ call Function18cc
+ ld a, 0
+ call Function1908
+ xor a
+ ldh [hDebugMapViewerJumptable], a
+ scf
+ ret
+
+DebugMapViewer_ShowViewerPrompt:
+ call RefreshScreen
+ ld hl, .ChangeViewerPrompt
+ call MenuTextBox
+ call YesNoBox
+ call CloseWindow
+ jr c, .no
+ ld a, DEBUGMAPVIEWER_MOVE_CURSOR_TO_PLAYER
+ ldh [hDebugMapViewerJumptable], a
+.no
+ call Function1fea
+ ret
+
+.ChangeViewerPrompt:
+ text "ビューワーモードを"
+ line "かいじょ しますか?"
+ done
+
+DebugMapViewer_ShowSelectedDetails:
+ ld a, 0
+ ldh [hTextBoxCursorBlinkInterval], a
+ ld bc, wObjectStructs
+ callab Function77a1
+ jr nc, .skip
+ call RefreshScreen
+ call .DisplayActorCastID
+ call Function1fea
+ ret
+.skip
+ call DisplayBGEventDetails
+ ret
+
+.DisplayActorCastID:
+ ld hl, .ActorCastText
+ call MenuTextBox
+
+; Display index of selected object from map objects
+; (referred to as "actor number")
+ ld de, hEventID
+ hlcoord 10, 14
+ ld bc, $0102
+ call PrintNumber
+
+; Display index of selected object from visible objects
+; (referred to as "cast number")
+ ldh a, [hEventID]
+ call GetObjectStruct
+ ld hl, OBJECT_MAP_OBJECT_INDEX
+ add hl, bc
+ ld a, [hl]
+ cp $10
+ jr nc, .invalid_index
+ ld d, h
+ ld e, l
+ hlcoord 10, 16
+ ld bc, $0102
+ call PrintNumber
+ jr .wait
+
+.invalid_index
+ hlcoord 10, 16
+ ld de, .NoneText
+ call PlaceString
+
+.wait
+ ld a, BUTTONS
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+ ret
+
+.ActorCastText:
+ text "アクターナンバー    "
+ line "キャストナンバー    "
+ done
+
+.NoneText:
+ db "なし@"
+
+DebugMapViewer_DoMovement:
+ ld bc, wObjectStructs
+ ldh a, [hJoyState]
+ ld d, a
+ bit D_DOWN_F, a
+ jr nz, .down
+ bit D_UP_F, a
+ jr nz, .up
+ bit D_LEFT_F, a
+ jr nz, .left
+ bit D_RIGHT_F, a
+ jr nz, .right
+.done
+ ld a, $2a
+ ret
+
+.down
+ ld a, [wMapHeight]
+ add a
+ add 4
+ ld e, a
+ ld hl, $11
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp e
+ jr nc, .done
+ bit 1, d
+ ld a, $c
+ ret nz
+ ld a, 8
+ ret
+
+.up
+ ld hl, $11
+ add hl, bc
+ ld a, [hl]
+ dec a
+ cp 4
+ jr c, .done
+ bit 1, d
+ ld a, $d
+ ret nz
+ ld a, 9
+ ret
+
+.left
+ ld hl, $10
+ add hl, bc
+ ld a, [hl]
+ dec a
+ cp 4
+ jr c, .done
+ bit 1, d
+ ld a, $e
+ ret nz
+ ld a, $a
+ ret
+
+.right
+ ld a, [wMapWidth]
+ add a
+ add 4
+ ld e, a
+ ld hl, $10
+ add hl, bc
+ ld a, [hl]
+ inc a
+ cp e
+ jr nc, .done
+ bit 1, d
+ ld a, $f
+ ret nz
+ ld a, $b
+ ret
+
+DebugMapViewer_ReplacePlayerObject:
+ callab Function807b
+ ld a, 1
+ call Function15ed
+ ld a, 1
+ call Function1908
+ ld bc, wObjectStructs
+ ld hl, OBJECT_FLAGS
+ add hl, bc
+ set 3, [hl]
+ set 2, [hl]
+ set 1, [hl]
+ ret
+
+Datafd044:
+_NUM_OBJECT_EVENTS = 0
+ object_event -4, -4, SPRITE_GOLD, $17, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0
+ ds 2
+
+DebugMapViewer_LoadCursorSprite:
+ ldh a, [hBGMapMode]
+ push af
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+ ld de, TownMapCursorGFX
+ ld hl, $80c0
+ ld bc, $3f04
+ call Get2bpp
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+SECTION "engine/debug/field/map_viewer.inc@DisplayBGEventDetails", ROMX
+
+DisplayBGEventDetails:
+ call GetSignpost
+ ret nc
+ call .Functionfd0cc
+ call RefreshScreen
+ ld hl, .TableText
+ call MenuTextBox
+ call .PrintTableDetails
+ call .WaitInput
+ call CloseWindow
+ call Function1fea
+ ret
+
+.Functionfd0cc:
+ ld a, [hld]
+ ld [wFieldMoveScriptID], a
+ ld a, [hl]
+ ld [wcdc8], a
+ ld a, d
+ ld [wMapBlocksAddress], a
+ ld a, e
+ ld [wHPBarOldHP], a
+ ld a, b
+ ld [wReplacementBlock], a
+ ld a, [wCurrMapSignCount]
+ sub c
+ inc a
+ ld [wHPBarNewHP], a
+ ret
+
+.TableText:
+ text "テーブル"
+ done
+
+.PrintTableDetails:
+ hlcoord 8, 14
+ ld de, wMapBlocksAddress
+ call PrintHexByte
+
+ hlcoord 11, 14
+ ld de, wHPBarOldHP
+ call PrintHexByte
+
+ hlcoord 14, 14
+ ld de, wcdc8
+ call PrintHexByte
+
+ hlcoord 17, 14
+ ld de, wFieldMoveScriptID
+ ld bc, $8102
+ call PrintNumber
+
+ hlcoord 14, 16
+ ld de, wReplacementBlock
+ call PrintHexByte
+
+ hlcoord 17, 16
+ ld de, wHPBarNewHP
+ ld bc, $8102
+ call PrintNumber
+
+ ret
+
+.WaitInput:
+ call GetJoypad
+ ldh a, [hJoyDown]
+ and A_BUTTON | B_BUTTON | SELECT
+ jr z, .WaitInput
+ ret
+
diff --git a/engine/debug/field/minigames.inc b/engine/debug/field/minigames.inc
new file mode 100644
index 0000000..95c6b9d
--- /dev/null
+++ b/engine/debug/field/minigames.inc
@@ -0,0 +1,86 @@
+FieldDebug_Minigames:
+ call .DoMinigameSelection
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoMinigameSelection:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ push af
+ ld a, [wMenuCursorY]
+ dec a
+ call CopyNameFromMenu
+ ld a, [wMenuCursorY]
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, .MinigamePointers
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wQueuedScriptBank], a
+ ld a, [hli]
+ ld [wQueuedScriptAddr], a
+ ld a, [hl]
+ ld [wQueuedScriptAddr + 1], a
+ pop af
+ call CloseWindow
+ ret c
+
+ ld hl, .MinigameConfirmationText
+ call MenuTextBox
+ call YesNoBox
+ call CloseWindow
+ ret c
+
+ call LoadStandardMenuHeader
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+ ld hl, wVramState
+ res 0, [hl]
+ call ClearSprites
+ call ClearTileMap
+ call WaitBGMap
+ ld hl, wQueuedScriptBank
+ call CallFar_atHL
+ call ClearPalettes
+ call Function3657
+ call LoadTilesetGFX
+ ld hl, wVramState
+ set 0, [hl]
+ call CloseWindow
+ pop af
+ ldh [hMapAnims], a
+ call GetMemSGBLayout
+ call WaitBGMap
+ call UpdateTimePals
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 10, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 3
+ db "スロットマシン@"
+ db "ポーカーゲーム@"
+ db "ぺアゲーム@"
+
+.MinigamePointers:
+ dba SlotMachineGame
+ dba PokerMinigame
+ dba MemoryMinigame
+
+.MinigameConfirmationText:
+ text_from_ram wStringBuffer2
+ text "で "
+ line "あそびますか?"
+ done
+
diff --git a/engine/debug/field/mon_following.inc b/engine/debug/field/mon_following.inc
new file mode 100644
index 0000000..1512bb6
--- /dev/null
+++ b/engine/debug/field/mon_following.inc
@@ -0,0 +1,60 @@
+FieldDebug_PokemonFollowing:
+ call .DoPokemonFollowing
+ jr c, .exit
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+.exit
+ ld a, FIELDDEBUG_RETURN_CLEANUP
+ ret
+
+.DoPokemonFollowing:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ jr c, .done
+ ld a, [wMenuCursorY]
+ cp 1
+ jr nz, .remove
+ ld a, [wPlayerStructEnd]
+ and a
+ jr nz, .ShowUnableText
+ callab Function8031
+ ld de, SFX_24
+ call PlaySFX
+ call CloseWindow
+ call UpdateSprites
+ scf
+ ret
+
+.remove
+ callab Function806c
+ ld de, SFX_25
+ call PlaySFX
+ jr .done
+
+.ShowUnableText:
+ ld hl, .UnableText
+ call FieldDebug_ShowTextboxAndExit
+
+.done
+ call CloseWindow
+ call UpdateSprites
+ xor a
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 3, 3, 9, 9
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 2
+ db "つける@"
+ db "はずす@"
+
+.UnableText:
+ text "だめです!!"
+ done
+
diff --git a/engine/debug/field/move_to_entrance.inc b/engine/debug/field/move_to_entrance.inc
new file mode 100644
index 0000000..c99f36f
--- /dev/null
+++ b/engine/debug/field/move_to_entrance.inc
@@ -0,0 +1,46 @@
+FieldDebug_MoveToRoute1Entrance:
+; Check if the player is currently on Route 1
+ ld a, [wMapGroup]
+ cp GROUP_ROUTE_1_P1
+ jr nz, .cannot_use
+ ld a, [wMapId]
+ cp MAP_ROUTE_1_P1
+ jr nz, .cannot_use
+
+ ldh a, [hROMBank]
+ ld hl, .DoMove
+ call QueueScript
+ ld a, FIELDDEBUG_RETURN_EXIT
+ ret
+
+.cannot_use
+ ld hl, .CantUseText
+ call FieldDebug_ShowTextboxAndExit
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.CantUseText:
+ text "ここでは できません"
+ para "ロード1でじっこうできます"
+ done
+
+.DoMove:
+ call RefreshScreen
+ ld hl, .MoveText
+ call FieldDebug_ShowTextboxAndExit
+ ld d, $d
+ ld e, $d
+ ld b, 0
+ ld c, 1
+ callab Function833a
+ ld a, 0
+ ld hl, wMovementBuffer
+ call LoadMovementDataPointer
+ call Function1fea
+ ret
+
+.MoveText:
+ text "とくていちてん まで"
+ next "うごかします"
+ done
+
diff --git a/engine/debug/field/npc_movement_test.inc b/engine/debug/field/npc_movement_test.inc
new file mode 100644
index 0000000..aeb77b0
--- /dev/null
+++ b/engine/debug/field/npc_movement_test.inc
@@ -0,0 +1,55 @@
+FieldDebug_NPCMovementTest:
+ call .NPCMovementTest
+ jr c, .exit
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+.exit
+ ld a, FIELDDEBUG_RETURN_WAIT_INPUT
+ ret
+
+.NPCMovementTest:
+ ld a, [wMapGroup]
+ cp GROUP_SILENT_HILL_HOUSE
+ jr nz, .not_here
+ ld a, [wMapId]
+ cp MAP_SILENT_HILL_HOUSE
+ jr nz, .not_here
+ ld a, 2
+ ld hl, .MovementData
+ call LoadMovementDataPointer
+ ld de, SFX_22
+ call PlaySFX
+ scf
+ ret
+
+.MovementData:
+ db FACE_UP
+ db MOVEMENT_2F
+ db SLOW_STEP_UP
+ db SLOW_STEP_RIGHT
+ db SLOW_JUMP_RIGHT
+ db SLOW_STEP_RIGHT
+ db STEP_DOWN
+ db STEP_DOWN
+ db STEP_DOWN
+ db STEP_DOWN
+ db STEP_LEFT
+ db SLOW_JUMP_LEFT
+ db STEP_LEFT
+ db SLOW_STEP_UP
+ db SLOW_STEP_UP
+ db SLOW_STEP_UP
+ db MOVEMENT_32
+
+.not_here
+ ld de, SFX_1E
+ call PlaySFX
+ ld hl, .NotHereText
+ call FieldDebug_ShowTextboxAndExit
+ xor a
+ ret
+
+.NotHereText:
+ text "ここではだめです!"
+ done
+
diff --git a/engine/debug/field/pokemart_menu.inc b/engine/debug/field/pokemart_menu.inc
new file mode 100644
index 0000000..6985703
--- /dev/null
+++ b/engine/debug/field/pokemart_menu.inc
@@ -0,0 +1,343 @@
+FieldDebug_PokemartMenu:
+ ld hl, DebugMart_WelcomeText
+ call MenuTextBox
+ call ExitMenu
+ call .DoPokemartMenu
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoPokemartMenu:
+ call LoadStandardMenuHeader
+ callab asm_24860
+ ld hl, DebugMart_PokemartMenuText
+ call PrintText
+ ld hl, .MenuHeader
+ call CopyMenuHeader
+ call VerticalMenu
+ push af
+ call ExitMenu
+ pop af
+ jr c, .exit_menu
+ ld a, [wMenuCursorY]
+ dec a
+ ld hl, .MenuJumptable
+ call CallJumptable
+ jr nc, .DoPokemartMenu
+ ret
+
+.exit_menu
+ ld hl, DebugMart_GoodbyeText
+ call MenuTextBoxBackup
+ scf
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 10, 8
+ dw .MenuData
+ db 1 ; default
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 3 ; items
+ db "どうぐを かう@"
+ db "どうぐを うる@"
+ db "さようなら@"
+
+.MenuJumptable:
+ dw DebugMart_Buy
+ dw DebugMart_Sell
+ dw .exit_menu
+
+DebugMart_BuyMenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 1, 3, 19, 11
+ dw .BuyMenuParams
+ db 1 ; default
+
+.BuyMenuParams:
+ db STATICMENU_WRAP
+ db 4, 8 ; rows, columns
+ db SCROLLINGMENU_ITEMS_NORMAL
+ dbw 0, wcd60
+ dba PlaceMenuItemName
+ dba .PrintAmount
+ dba UpdateItemDescription
+
+.PrintAmount:
+ ld a, [wScrollingMenuCursorPosition]
+ ld c, a
+ ld b, 0
+ ld hl, wcc40
+ add hl, bc
+ add hl, bc
+ add hl, bc
+ push de
+ ld d, h
+ ld e, l
+ pop hl
+ ld c, $83
+ call PrintBCDNumber
+ ld [hl], "円"
+ ret
+
+DebugMart_WelcomeText:
+ text "フレンドりーショップへ "
+ line "ようこそ!"
+ prompt
+
+DebugMart_PokemartMenuText:
+ text "なんになさいますか?"
+ done
+
+DebugMart_GoodbyeText:
+ text "またのごりようを"
+ line "おまちしています"
+ prompt
+
+DebugMart_Buy:
+ ld de, DebugMart_ItemList
+ call DebugMart_LoadItems
+ call LoadStandardMenuHeader
+ call ClearTileMap
+.buy_loop
+ call .BuyMenu
+ jr nc, .buy_loop
+ call ExitMenu
+ and a
+ ret
+
+.BuyMenu:
+ call UpdateSprites
+ ld hl, DebugMart_BuyMenuHeader
+ call CopyMenuHeader
+ call ScrollingMenu
+ ld a, [wMenuJoypad]
+ cp B_BUTTON
+ jr z, .cancel_buy
+ cp A_BUTTON
+ jr z, .buy_item
+.buy_item
+ ld a, 99
+ ld [wItemQuantityBuffer], a
+ ld hl, .HowManyText
+ call PrintText
+ callab asm_24c64
+ call ExitMenu
+ jr c, .done
+ predef LoadItemData
+ ld hl, .ConfirmPurchaseText
+ call PrintText
+ call YesNoBox
+ jr c, .done
+ ld hl, .UnderDevelopmentText
+ call MenuTextBoxBackup
+.done
+ and a
+ ret
+
+.cancel_buy
+ scf
+ ret
+
+.BuyPromptText: ; unreferenced?
+ text "なにを おかいあげに"
+ line "なりますか"
+ done
+
+.HowManyText:
+ text "いくつ おかいあげになりますか"
+ done
+
+.ConfirmPurchaseText:
+ text_from_ram wStringBuffer2
+ text "を @"
+ deciram wItemQuantity, 1, $2
+ text "こで"
+ line "@"
+ deciram hFFCD, 3, $6
+ text "円 おかいあげですか?"
+ done
+
+.UnderDevelopmentText:
+ text "ごめんね"
+ line "かいはつちゅうなんだ"
+ prompt
+
+INCLUDE "data/field_debug_pokemart_items.inc"
+
+DebugMart_Sell:
+ call DebugMart_ShowPlaceholderText
+ and a
+ ret
+
+; unused
+ callab CheckItemsQuantity
+ jp c, .no_items
+ call LoadStandardMenuHeader
+ xor a
+ ld [wActiveBackpackPocket], a
+.bag_loop
+ callab DrawBackpack
+ callab DebugBackpackLoop
+ jr c, .close_bag
+ call .DoBagFunctions
+ jr nc, .bag_loop
+.close_bag
+ call ClearBGPalettes
+ call CloseWindow
+ call UpdateTimePals
+ and a
+ ret
+
+.DoBagFunctions:
+ callab CheckItemMenu
+ ld a, [wItemAttributeParamBuffer]
+ ld hl, .BagJumptable
+ call CallJumptable
+ ret
+
+.BagJumptable:
+ dw .CheckSellableItem
+ dw .CannotSellItem
+ dw .BallPocket
+ dw .FlipPocket
+ dw .CheckSellableItem
+ dw .CheckSellableItem
+ dw .CheckSellableItem
+
+.FlipPocket:
+ callab FlipPocket2Status
+ xor a
+ ld [wSelectedSwapPosition], a
+ ret
+
+.CannotSellItem:
+ ld hl, .CannotSellText
+ call MenuTextBoxBackup
+ and a
+ ret
+
+.CannotSellText:
+ text "つかえないのだ!"
+ prompt
+
+.BallPocket:
+ callab BallPocket
+ jr nc, .CheckSellableItem
+ and a
+ ret
+
+.CheckSellableItem:
+ callab _CheckTossableItem
+ ld a, [wItemAttributeParamBuffer]
+ and a
+ jr nz, .not_sellable
+ jp .ItemQuantityPrompt
+
+.not_sellable
+ ld hl, .ImportantItemText
+ call MenuTextBoxBackup
+ and a
+ ret
+
+.ImportantItemText:
+ text "それは だいじなものです"
+ line "うることは できません!"
+ prompt
+
+.no_items
+ ld hl, .NoItemsText
+ call MenuTextBoxBackup
+ and a
+ ret
+
+.NoItemsText:
+ text "どうぐを ひとつも"
+ next "もっていません!"
+ prompt
+
+.ItemQuantityPrompt:
+ ld hl, .HowManyItemsText
+ call PrintText
+ callab asm_24c64
+ jr c, .got_quantity
+ jr .CannotSellItem
+
+.got_quantity
+ and a
+ ret
+
+.HowManyItemsText:
+ text "いくつ うりますか?"
+ done
+
+DebugMart_LoadItems:
+ ld hl, wcd60
+.load_loop
+ ld a, [de]
+ inc de
+ ld [hli], a
+ cp -1
+ jr nz, .load_loop
+ ld hl, wcc40
+ ld de, wcd60 + 1
+.load_loop2
+ ld a, [de]
+ inc de
+ cp -1
+ jr z, .done_load
+ push de
+ call .GetPrice
+ pop de
+ jr .load_loop2
+
+.done_load
+ ret
+
+.GetPrice:
+ push hl
+ ld [wCurItem], a
+ callab GetItemPrice
+ ld a, d
+ ld [wcdc3], a
+ ld a, e
+ ld [wcdc3 + 1], a
+ ld hl, wStringBuffer1
+ ld de, wcdc3
+ ld bc, $8206
+ call PrintNumber
+ pop hl
+ ld de, wStringBuffer1
+ ld c, 3
+.print_price
+ call .PrintPaddedDigits
+ swap a
+ ld b, a
+ call .PrintPaddedDigits
+ or b
+ ld [hli], a
+ dec c
+ jr nz, .print_price
+ ret
+
+.PrintPaddedDigits:
+ ld a, [de]
+ inc de
+ cp " "
+ jr nz, .to_digit
+ ld a, "0"
+.to_digit
+ sub "0"
+ ret
+
+DebugMart_ShowPlaceholderText:
+ ld hl, .PlaceholderText
+ call MenuTextBox
+ call ExitMenu
+ ret
+
+.PlaceholderText:
+ text "かいはつちゅうです"
+ next "<PROMPT>"
+
diff --git a/engine/debug/field/sprite_viewer.inc b/engine/debug/field/sprite_viewer.inc
new file mode 100644
index 0000000..57268af
--- /dev/null
+++ b/engine/debug/field/sprite_viewer.inc
@@ -0,0 +1,500 @@
+; FieldDebug_SpriteViewer.DoSpriteViewer.Jumptable constants
+ const_def
+ const SPRITEVIEWER_INIT_MENU ; 0
+ const SPRITEVIEWER_UPDATE_MENU ; 1
+ const SPRITEVIEWER_SHOW_SPRITES ; 2
+ const SPRITEVIEWER_SETUP_STATIC_SPRITE ; 3
+ const SPRITEVIEWER_SETUP_ANIMATED_SPRITE ; 4
+ const SPRITEVIEWER_FOLLOW_PROMPT ; 5
+ const SPRITEVIEWER_EXIT ; 6
+ const SPRITEVIEWER_SET_FOLLOWING ; 7
+
+FieldDebug_SpriteViewer:
+ call LoadStandardMenuHeader
+ call ClearTileMap
+ call HideSprites
+ ld hl, wVramState
+ res 0, [hl]
+ call .Init
+ call .DoSpriteViewer
+ push af
+ ld hl, wVramState
+ set 0, [hl]
+ call ClearPalettes
+ call Function360b
+ call CloseWindow
+ call UpdateTimePals
+ pop af
+ ret
+
+.Init:
+ ld a, $5b
+ ld [wMovementBufferObject], a
+ ld a, 1
+ ld [wSpriteViewerSavedMenuPointerY], a
+ ld a, 0
+ ld [wSpriteViewerMenuStartingItem], a
+ ld a, 1
+ ldh [hTextBoxCursorBlinkInterval], a
+ callab Function77ad
+ ret nc
+ ldh a, [hEventID]
+ call GetObjectStruct
+ ld hl, 0
+ add hl, bc
+ ld a, [wMovementBufferObject]
+ ld d, a
+ ld a, 5
+ add [hl]
+ cp d
+ jr c, .skip
+ sub d
+ ld [wSpriteViewerSavedMenuPointerY], a
+ ld a, [wMovementBufferObject]
+ sub 5
+ ld [wSpriteViewerMenuStartingItem], a
+ ret
+
+.skip
+ ld a, 1
+ ld [wSpriteViewerSavedMenuPointerY], a
+ ld a, [hl]
+ ld [wSpriteViewerMenuStartingItem], a
+ ret
+
+.SetMenuAttributes:
+ ld de, .MenuAttributes
+ call SetMenuAttributes
+ ld a, [wMovementBufferObject]
+ cp 5
+ jr c, .apply
+ ld a, 5
+.apply
+ ld [w2DMenuNumRows], a
+ ld a, [wSpriteViewerSavedMenuPointerY]
+ ld [wMenuCursorY], a
+ ret
+
+.MenuAttributes:
+ db 3, 1
+ db 0, 1
+ db $F, 0
+ db $30, 3
+
+.DoSpriteViewer:
+ ld a, 0
+ ld [wSpriteViewerJumptableIndex], a
+
+.loop
+ ld a, [wSpriteViewerJumptableIndex]
+ ld hl, .Jumptable
+ call CallJumptable
+ jr nc, .loop
+ ret
+
+.Jumptable:
+ dw .InitMenu
+ dw .UpdateMenu
+ dw .ShowSprites
+ dw .SetupStaticSprite
+ dw .SetupAnimatedSprite
+ dw .FollowPrompt
+ dw .Exit
+ dw .SetFollowing
+
+.Exit:
+ ld a, -1
+ ld [wSpriteViewerJumptableIndex], a
+ scf
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.SetFollowing:
+ ld hl, Function8031
+ ld a, BANK(Function8031)
+ call QueueScript
+
+; Exits immediately after setting sprite to follow the player
+ ld a, -1
+ ld [wSpriteViewerJumptableIndex], a
+ scf
+ ld a, FIELDDEBUG_RETURN_EXIT
+ ret
+
+.InitMenu:
+ xor a
+ ldh [hBGMapMode], a
+ call HideSprites
+ call ClearPalettes
+ call ClearTileMap
+ call .SetMenuAttributes
+ call .DisplayMenu
+ call SetPalettes
+ call WaitBGMap
+ ld a, SPRITEVIEWER_UPDATE_MENU
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.DisplayMenu:
+ ld c, 5
+ ld a, [wMovementBufferObject]
+ cp c
+ jr nc, .setup
+ ld c, a
+.setup
+ hlcoord 5, 4
+ ld a, [wSpriteViewerMenuStartingItem]
+ inc a
+ ld [wStringBuffer1], a
+.display_loop
+ push bc
+ push hl
+ ld bc, $8103
+ ld de, wStringBuffer1
+ call PrintNumber
+ ld a, [wStringBuffer1]
+ call LoadUnderDevelopmentString
+ call PlaceString
+ ld hl, wStringBuffer1
+ inc [hl]
+ pop hl
+ ld de, SCREEN_WIDTH * 3
+ add hl, de
+ pop bc
+ dec c
+ jr nz, .display_loop
+ ret
+
+.UpdateMenu:
+ call .SetMenuAttributes
+.loop2
+ call Get2DMenuJoypad
+ ld a, [wMenuCursorY]
+ ld [wSpriteViewerSavedMenuPointerY], a
+ ldh a, [hJoySum]
+ bit A_BUTTON_F, a
+ jp nz, .a_button
+ bit B_BUTTON_F, a
+ jp nz, .b_button
+ bit D_DOWN_F, a
+ jr nz, .down
+ bit D_UP_F, a
+ jr nz, .up
+ bit D_LEFT_F, a
+ jr nz, .left
+ bit D_RIGHT_F, a
+ jr nz, .right
+ jr .loop2
+
+.a_button
+ ld a, SPRITEVIEWER_SHOW_SPRITES
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.b_button
+ ld a, SPRITEVIEWER_EXIT
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.up
+ ld a, [wSpriteViewerMenuStartingItem]
+ and a
+ jr z, .reload_menu
+ dec a
+ ld [wSpriteViewerMenuStartingItem], a
+ jr .reload_menu
+
+.down
+ ld a, [wMovementBufferObject]
+ cp 5
+ jr c, .reload_menu
+ sub 5
+ ld b, a
+ ld a, [wSpriteViewerMenuStartingItem]
+ cp b
+ jr z, .reload_menu
+ inc a
+ ld [wSpriteViewerMenuStartingItem], a
+ jr .reload_menu
+
+.right
+ ld a, [wMovementBufferObject]
+ cp 5
+ jr c, .reload_menu
+ sub 4
+ ld b, a
+ ld a, [wSpriteViewerMenuStartingItem]
+ add 5
+ ld [wSpriteViewerMenuStartingItem], a
+ cp b
+ jr c, .reload_menu
+ dec b
+ ld a, b
+ ld [wSpriteViewerMenuStartingItem], a
+ jr .reload_menu
+
+.left
+ ld a, [wSpriteViewerMenuStartingItem]
+ sub 5
+ ld [wSpriteViewerMenuStartingItem], a
+ jr nc, .reload_menu
+ xor a
+ ld [wSpriteViewerMenuStartingItem], a
+ jr .reload_menu
+
+.reload_menu
+ ld a, SPRITEVIEWER_INIT_MENU
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.ShowSprites:
+ call ClearTileMap
+ call .SetStartingPoint
+ call LoadUnderDevelopmentString
+ hlcoord 1, 2
+ call PlaceString
+ call .SetStartingPoint
+ ld c, a
+ callab Function14144
+ ld hl, vSprites + $c0
+ ld de, vFont
+ ld bc, 12
+ call Get2bpp
+ call LoadFont
+ call .SetStartingPoint
+ call IsAnimatedSprite
+ jr c, .animated_sprite
+; static sprite
+ ld a, SPRITEVIEWER_SETUP_STATIC_SPRITE
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.animated_sprite
+ ld a, SPRITEVIEWER_SETUP_ANIMATED_SPRITE
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.SetupAnimatedSprite:
+ ld a, $10
+ ld [wMovementBuffer], a
+ ld a, $20
+ ld [wMovementBuffer + 1], a
+ ld hl, Datafc6de
+ ld de, wVirtualOAM
+ call Functionfc6bb
+ ld a, A_BUTTON | B_BUTTON
+ call FieldDebug_WaitJoypadInput
+ ld a, SPRITEVIEWER_INIT_MENU
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+
+.SetupStaticSprite:
+ xor a
+ ld [wMovementBuffer + 2], a
+
+.SpriteLoop:
+ ld a, $10
+ ld [wMovementBuffer], a
+ ld a, $20
+ ld [wMovementBuffer + 1], a
+ call Functionfc689
+ call .animate_walking
+ bit B_BUTTON_F, a
+ jr nz, .return_to_menu
+ bit A_BUTTON_F, a
+ jr nz, .show_follow_prompt
+ ld a, [wMovementBuffer + 2]
+ inc a
+ and 3
+ ld [wMovementBuffer + 2], a
+ ldh a, [hJoyState]
+ and D_UP | D_DOWN | D_LEFT | D_RIGHT
+ jr nz, .SpriteLoop
+ xor a
+ ld [wMovementBuffer + 2], a
+ jr .SpriteLoop
+.return_to_menu
+ ld a, SPRITEVIEWER_INIT_MENU
+ ld [wSpriteViewerJumptableIndex], a
+ xor a ; FIELDDEBUG_RETURN_REOPEN
+ ret
+.show_follow_prompt
+ ld a, SPRITEVIEWER_FOLLOW_PROMPT
+ ld [wSpriteViewerJumptableIndex], a
+ xor a ; FIELDDEBUG_RETURN_REOPEN
+ ret
+.animate_walking
+ ld c, 10
+.animate_loop
+ call DelayFrame
+ call GetJoypad
+ ldh a, [hJoyDown]
+ and 3
+ ret nz
+ dec c
+ jr nz, .animate_loop
+ ret
+
+.FollowPrompt:
+ ld hl, .FollowPromptString
+ call MenuTextBox
+ call YesNoBox
+ call CloseWindow
+ jr nc, .set_following
+; return to menu
+ ld a, SPRITEVIEWER_INIT_MENU
+ ld [wSpriteViewerJumptableIndex], a
+ xor a
+ ret
+.set_following
+ call .SetStartingPoint
+ ld [wd646], a
+ ld a, SPRITEVIEWER_SET_FOLLOWING
+ ld [wSpriteViewerJumptableIndex], a
+ ret
+
+.FollowPromptString:
+ text "これを せんたくしますか?"
+ done
+
+.SetStartingPoint:
+ push bc
+ ld a, [wSpriteViewerMenuStartingItem]
+ ld b, a
+ ld a, [wSpriteViewerSavedMenuPointerY]
+ add b
+ pop bc
+ ret
+
+LoadUnderDevelopmentString:
+ ld de, .String
+ ret
+
+.String:
+ db "かいはつちゅう@"
+
+Functionfc689:
+ ld de, wVirtualOAM
+ ld hl, Datafc6de
+ ld a, [wMovementBuffer + 2]
+ and 3
+ ld bc, 2
+ call AddNTimes
+ ld c, 4
+
+Functionfc69c:
+ push bc
+ push hl
+ push de
+ call Functionfc6bb
+ ld a, [wMovementBuffer]
+ add $20
+ ld [wMovementBuffer], a
+ pop hl
+ ld bc, $10
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop hl
+ ld bc, 8
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, Functionfc69c
+ ret
+
+Functionfc6bb:
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+Functionfc6be:
+ ld a, [wMovementBuffer + 1]
+ add $10
+ add [hl]
+ inc hl
+ ld [de], a
+ inc de
+ ld a, [wMovementBuffer]
+ add 8
+ add [hl]
+ inc hl
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ and $f0
+ ld [de], a
+ inc de
+ ld a, [hli]
+ bit 0, a
+ jr z, Functionfc6be
+ ret
+
+Datafc6de:
+ dw Datafc6fe
+ dw Datafc70e
+ dw Datafc6fe
+ dw Datafc71e
+ dw Datafc72e
+ dw Datafc73e
+ dw Datafc72e
+ dw Datafc74e
+ dw Datafc75e
+ dw Datafc77e
+ dw Datafc75e
+ dw Datafc77e
+ dw Datafc76e
+ dw Datafc78e
+ dw Datafc76e
+ dw Datafc78e
+
+Datafc6fe:
+ db 0, 0, 0, 0, 0, 8, 1, 0
+ db 8, 0, 2, 2, 8, 8, 3, 3
+
+Datafc70e:
+ db 0, 0, $c, 0, 0, 8, $d, 0
+ db 8, 0, $e, 2, 8, 8, $f, 3
+
+Datafc71e:
+ db 0, 8, $c, $20, 0, 0, $d, $20
+ db 8, 8, $e, $22, 8, 0, $f, $23
+
+Datafc72e:
+ db 0, 0, 4, 0, 0, 8, 5, 0
+ db 8, 0, 6, 2, 8, 8, 7, 3
+
+Datafc73e:
+ db 0, 0, $10, 0, 0, 8, $11, 0
+ db 8, 0, $12, 2, 8, 8, $13, 3
+
+Datafc74e:
+ db 0, 8, $10, $20, 0, 0, $11, $20
+ db 8, 8, $12, $22, 8, 0, $13, $23
+
+Datafc75e:
+ db 0, 0, 8, 0, 0, 8, 9, 0
+ db 8, 0, $a, 2, 8, 8, $b, 3
+
+Datafc76e:
+ db 0, 8, 8, $20, 0, 0, 9, $20
+ db 8, 8, $a, $22, 8, 0, $b, $23
+
+Datafc77e:
+ db 0, 0, $14, 0, 0, 8, $15, 0
+ db 8, 0, $16, 2, 8, 8, $17, 3
+
+Datafc78e:
+ db 0, 8, $14, $20, 0, 0, $15, $20
+ db 8, 8, $16, $22, 8, 0, $17, $23
+
diff --git a/engine/debug/field/teleport.inc b/engine/debug/field/teleport.inc
new file mode 100644
index 0000000..5edbf97
--- /dev/null
+++ b/engine/debug/field/teleport.inc
@@ -0,0 +1,33 @@
+FieldDebug_Teleport:
+ call .DoTeleport
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoTeleport:
+ ld a, [wMapGroup]
+ ld d, a
+ ld a, [wMapId]
+ ld e, a
+ callab IsSpawnPoint
+ jr nc, .not_spawn_point
+ ld a, [wMapGroup]
+ ld [wLastSpawnMapGroup], a
+ ld a, [wMapId]
+ ld [wLastSpawnMapNumber], a
+ ld hl, .MapRegisteredText
+ call MenuTextBoxBackup
+ ret
+
+.not_spawn_point
+ ld hl, .CannotRegisterMapText
+ call MenuTextBoxBackup
+ ret
+
+.MapRegisteredText:
+ text "このばしょを とうろくしました"
+ para "<DONE>"
+
+.CannotRegisterMapText:
+ text "ここは とうろくできません!"
+ para "<DONE>"
+
diff --git a/engine/debug/field/toggle_npc_movement.inc b/engine/debug/field/toggle_npc_movement.inc
new file mode 100644
index 0000000..1dba049
--- /dev/null
+++ b/engine/debug/field/toggle_npc_movement.inc
@@ -0,0 +1,39 @@
+FieldDebug_ToggleNPCMovement:
+ call .ToggleNPCMovement
+ jr nc, .close
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+.close
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.ToggleNPCMovement:
+ ld hl, .MenuHeader
+ call GetMenu2
+ ret c
+ ld a, [wMenuCursorY]
+ cp 1
+ jr nz, .move
+; stop NPCs
+ ld a, 0
+ call Function17f9
+ jr .done
+
+.move
+ call Function1848
+.done
+ and a
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 7, 6
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 2
+ db "とめる@"
+ db "うごかす@"
+
diff --git a/engine/debug/field/toolgear.inc b/engine/debug/field/toolgear.inc
new file mode 100644
index 0000000..eac3650
--- /dev/null
+++ b/engine/debug/field/toolgear.inc
@@ -0,0 +1,97 @@
+FieldDebug_Toolgear:
+ call OpenToolgearMenu
+ jr c, .cancelled
+ ld a, [wMenuCursorY]
+ dec a
+ ld hl, .Jumptable
+ jp CallJumptable
+
+.Jumptable:
+ dw .EnableToolgearClock
+ dw .DisplayCoords
+ dw .ChangeRTC
+ dw .DayNight60SecondCycle
+ dw .ResetDayNightCycle
+ dw .DisableToolgearClock
+
+.cancelled
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DayNight60SecondCycle:
+ ld hl, wd153
+ set OVERWORLD_MINUTE_TIME_F, [hl]
+ jr .UpdateDayNightCycle
+
+.ResetDayNightCycle:
+ ld hl, wd153
+ res OVERWORLD_MINUTE_TIME_F, [hl]
+ jr .UpdateDayNightCycle
+
+.ChangeRTC:
+ callab SetTime
+
+.UpdateDayNightCycle:
+ callab Function8c325
+ call UpdateTimePals
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.EnableToolgearClock:
+ call EnableToolgear
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.DisableToolgearClock:
+ call DisableToolgear
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.DisplayCoords:
+ call EnableToolgearCoords
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+EnableToolgearCoords:
+ call EnableToolgear
+ ld hl, wd153
+ set TOOLGEAR_COORDS_F, [hl]
+ ret
+
+OpenToolgearMenu:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call .AfterToolgearOpen
+ ld [wMenuCursorBuffer], a
+ call VerticalMenu
+ call CloseWindow
+ ret
+
+.AfterToolgearOpen:
+ ld a, [wToolgearFlags]
+ bit TOOLGEAR_COORDS_F, a
+ ld a, FIELDDEBUG_RETURN_CLEANUP
+ ret nz
+ ld hl, wd153
+ bit TOOLGEAR_COORDS_F, [hl]
+ ld a, FIELDDEBUG_RETURN_WAIT_INPUT
+ ret nz
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 7, 14
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 6
+ db "とけい@"
+ db "ざひょう@"
+ db "アジャスト@"
+ db "60びょう@"
+ db "24じかん@"
+ db "けす@"
+
diff --git a/engine/debug/field/unused_flag_menu.inc b/engine/debug/field/unused_flag_menu.inc
new file mode 100644
index 0000000..72aae14
--- /dev/null
+++ b/engine/debug/field/unused_flag_menu.inc
@@ -0,0 +1,90 @@
+FieldDebug_UnusedFlagMenu: ; unused?
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ call CloseWindow
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 7, 10
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 4
+ db "フラグ1@"
+ db "フラグ2@"
+ db "フラグ3@"
+ db "フラグ4@"
+
+ call LoadStandardMenuHeader
+ bccoord 0, 14
+ call .DoCheckFlags
+ call WaitBGMap
+ ld a, A_BUTTON | B_BUTTON
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoCheckFlags:
+unused_check_bit: macro
+ ld hl, \1
+ bit 0, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 1, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 2, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 3, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 4, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 5, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 6, [hl]
+ call .CheckBit
+ ld hl, \1
+ bit 7, [hl]
+ call .CheckBit
+endm
+
+ unused_check_bit wcdc3
+ unused_check_bit wcdc4
+ unused_check_bit wcdc5
+ unused_check_bit wcdc6
+ unused_check_bit wcdc7
+ ret
+
+.CheckBit:
+ ld a, "0"
+ jr z, .not_set
+ ld a, "1"
+.not_set
+ ld [bc], a
+ inc bc
+ ret
+
+Functionfd91e: ; unused?
+ call .asm_fd930
+ ld a, [wCountSetBitsResult]
+ ld [wMonDexIndex], a
+ callab Pokepic
+ ret
+
+.asm_fd930
+ call Random
+ cp 251
+ jr nc, .asm_fd930
+ inc a
+ ld [wCountSetBitsResult], a
+ ret
+
diff --git a/engine/debug/field/unused_priority_menu.inc b/engine/debug/field/unused_priority_menu.inc
new file mode 100644
index 0000000..8e20a12
--- /dev/null
+++ b/engine/debug/field/unused_priority_menu.inc
@@ -0,0 +1,30 @@
+FieldDebug_UnusedSetPriority:
+ ld hl, .MenuHeader
+ call GetMenu2
+ jr c, .done
+ ld a, [wMenuCursorY]
+ cp 1
+ jr nz, .skip
+ ld a, 0
+ call Function19aa
+ jr .done
+
+.skip
+ ld a, 0
+ call Function19b5
+.done
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 8, 6
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 2
+ db "ゆうせん@"
+ db "ひゆうせん@"
+
diff --git a/engine/debug/field/vram_viewer.inc b/engine/debug/field/vram_viewer.inc
new file mode 100644
index 0000000..668d1df
--- /dev/null
+++ b/engine/debug/field/vram_viewer.inc
@@ -0,0 +1,272 @@
+FieldDebug_DoVRAMViewer:
+ call LoadStandardMenuHeader
+ call ClearTileMap
+ call ClearSprites
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+ ld a, 1
+ ld [wcdc3], a
+ call .GenerateTilemap
+ call WaitBGMap
+ call .DoViewer
+ pop af
+ ldh [hMapAnims], a
+ ld a, $e3
+ ldh [rLCDC], a
+ call .ReloadDefaultGFX
+ call CloseWindow
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.DoViewer:
+ ld a, [wcdc3]
+ dec a
+ ld hl, .Jumptable
+ call CallJumptable
+ call .GenerateTilemap
+ call .ScreenControl
+ jr nc, .DoViewer
+ ret
+
+.ScreenControl:
+ call WaitBGMap
+.wait_input
+ call GetJoypad
+ ldh a, [hJoyDown]
+ and A_BUTTON | B_BUTTON | START | D_RIGHT | D_LEFT
+ jr z, .wait_input
+ bit D_LEFT_F, a
+ jr nz, .next_page
+ bit D_RIGHT_F, a
+ jr nz, .previous_page
+ bit START_F, a
+ jr nz, .switch_tileset
+ bit A_BUTTON_F, a
+ ret nz
+ scf
+ ret
+
+.switch_tileset
+ ldh a, [rLCDC]
+ xor (1 << rLCDC_TILE_DATA)
+ ldh [rLCDC], a
+ and a
+ ret
+
+.next_page
+ ld hl, wcdc3
+ inc [hl]
+ ld a, [hl]
+ cp 8
+ jr c, .not_at_end
+ ld [hl], 1
+
+.not_at_end
+ and a
+ ret
+
+.previous_page
+ ld hl, wcdc3
+ dec [hl]
+ jr z, .not_at_start
+ and a
+ ret
+
+.not_at_start
+ ld [hl], 7
+ and a
+ ret
+
+.Jumptable:
+ dw .LoadTilesets1
+ dw .LoadBagGFX
+ dw .LoadTilesetsCommon
+ dw .LoadToolgearGFX
+ dw .ReloadDefaultGFX
+ dw .LoadStatsGFX
+ dw .LoadTilesets6
+
+.GenerateTilemap:
+ hlcoord 1, 1
+ ld de, 4
+ ld b, $10
+ xor a
+.generate_loop1
+ ld c, $10
+.generate_loop2
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .generate_loop2
+ add hl, de
+ dec b
+ jr nz, .generate_loop1
+ ret
+
+.ReloadDefaultGFX:
+ call .LoadTilesetsCommon
+ call LoadFont
+ ret
+
+.LoadBagGFX:
+ call .LoadTilesetsCommon
+ call DisableLCD
+ call LoadFont
+ callab LoadBackpackGraphics
+ call EnableLCD
+ ret
+
+.LoadToolgearGFX:
+ call .LoadTilesetsCommon
+ call LoadToolgearGraphics
+ ret
+
+.LoadTilesets1:
+ call .LoadTilesetsCommon
+ call DisableLCD
+ call LoadFontsBattleExtra
+ call LoadFont
+ call EnableLCD
+ ret
+
+.LoadStatsGFX:
+ call .LoadTilesetsCommon
+ call DisableLCD
+ call LoadFontsBattleExtra
+ call LoadFont
+ callab LoadPokemonStatsGraphics
+ xor a
+ ldh [hMapAnims], a
+ call EnableLCD
+ ld de, vTileset
+ call .LoadPokemon
+ ret
+
+.LoadTilesets6:
+ call DisableLCD
+ xor a
+ ld hl, vSprites
+ ld bc, $180 tiles
+ call ByteFill
+ call LoadFont
+ callab Function3e39f
+ xor a
+ ldh [hMapAnims], a
+ call EnableLCD
+ ld de, vTileset
+ call .LoadPokemon
+ ld de, $9310
+ ld a, 3
+ ld [wcdd8], a
+ predef Function3f04a
+ ret
+
+.LoadPokemon:
+ ld a, 3
+ ld [wce37], a
+ ld [wMonDexIndex], a
+ call GetMonHeader
+ call LoadMonFrontSprite
+ ret
+
+.LoadTilesetsCommon:
+ call DisableLCD
+ xor a
+ ld hl, vSprites
+ ld bc, $180 tiles
+ call ByteFill
+ call LoadTilesetGFX
+ ld a, 1
+ ldh [hMapAnims], a
+ callab LoadUsedSpritesGfx
+ call LoadFontExtra
+ call EnableLCD
+ ret
+
+FieldDebug_DoClearEventFlags:
+ ld hl, .MenuHeader
+ call LoadMenuHeader
+ call VerticalMenu
+ call CloseWindow
+ ret c
+ call .CheckMapFlags
+ jr nc, .no_flags
+ ld a, [wMenuCursorY]
+ cp 1
+ ld a, 0
+ jr z, .done
+ ld a, $ff
+.done
+ ld [de], a
+ ret
+
+.no_flags
+ ld hl, .NoMapFlagsText
+ call MenuTextBoxBackup
+ ret
+
+.NoMapFlagsText:
+ text "このマップは シーケンスの"
+ line "とうろくが ありません"
+ prompt
+
+.MenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 12, 6
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_CURSOR
+ db 2
+ db "フラグを クりア@"
+ db "フラグを うめる@"
+
+.CheckMapFlags:
+ ld a, [wMapGroup]
+ ld b, a
+ ld a, [wMapId]
+ ld c, a
+ ld hl, UnknownMapBufferPointers
+.determine_loop
+ push hl
+ ld a, BANK(UnknownMapBufferPointers)
+ call GetFarByte
+ cp -1
+ jr z, .none_found
+ cp b
+ jr nz, .determine_loop2
+ inc hl
+ ld a, BANK(UnknownMapBufferPointers)
+ call GetFarByte
+ cp c
+ jr nz, .determine_loop2
+ jr .has_flags
+
+.determine_loop2
+ pop hl
+ ld de, 8
+ add hl, de
+ jr .determine_loop
+
+.has_flags
+ pop hl
+ ld de, 6
+ add hl, de
+ ld a, BANK(UnknownMapBufferPointers)
+ call GetFarByte
+ ld e, a
+ inc hl
+ ld a, BANK(UnknownMapBufferPointers)
+ call GetFarByte
+ ld d, a
+ scf
+ ret
+
+.none_found
+ pop hl
+ and a
+ ret
+
diff --git a/engine/debug/field/warp.inc b/engine/debug/field/warp.inc
new file mode 100644
index 0000000..9b2e9b6
--- /dev/null
+++ b/engine/debug/field/warp.inc
@@ -0,0 +1,73 @@
+FieldDebug_Warp:
+ call DebugMenu_DisplayWarpSubmenu
+ jr nc, .do_warp
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.do_warp
+ ld a, [wMenuSelection]
+ ld [wDefaultSpawnPoint], a
+ ld hl, wVramState
+ set 6, [hl]
+ ldh a, [hROMBank]
+ ld hl, FieldDebug_ShowWarpToText
+ call QueueScript
+ ld de, SFX_22
+ call PlaySFX
+ call DelayFrame
+ ld a, FIELDDEBUG_RETURN_EXIT
+ ret
+
+SECTION "engine/debug/field/warp.inc@FieldDebug_ShowWarpToText", ROMX
+
+FieldDebug_ShowWarpToText:
+ call .ShowText
+ call Functionfcc24
+ ld a, MAPSETUP_TELEPORT
+ ldh [hMapEntryMethod], a
+ scf
+ ret
+
+.ShowText:
+ call RefreshScreen
+ ld a, [wDefaultSpawnPoint]
+ call GetLandmarkName
+ call CopyStringToStringBuffer2
+ ld hl, .WarpToText
+ call FieldDebug_ShowTextboxAndExit
+ call Function1fea
+ ret
+
+.WarpToText:
+ text_from_ram wStringBuffer2
+ text "に"
+ line "ワープします!"
+ done
+
+Functionfcc24:
+ ld a, 0
+ call Function17f9
+ ld a, 0
+ ld hl, .MovementDatafcc49
+ call LoadMovementDataPointer
+ ld hl, wVramState
+ set 7, [hl]
+
+.asm_fcc36
+ call Function2c4a
+ ld a, [wVramState]
+ bit 7, a
+ jr nz, .asm_fcc36
+ ld a, 0
+ ld hl, .MovementDatafcc4b
+ call Function16fb
+ ret
+
+.MovementDatafcc49:
+ db $36
+ db $32
+
+.MovementDatafcc4b:
+ db $37
+ db $32
+
diff --git a/engine/debug/field_debug_menu.asm b/engine/debug/field_debug_menu.asm
new file mode 100644
index 0000000..1fc161e
--- /dev/null
+++ b/engine/debug/field_debug_menu.asm
@@ -0,0 +1,295 @@
+INCLUDE "constants.asm"
+
+; FieldDebugMenu.ReturnJumptable constants
+ const_def
+ const FIELDDEBUG_RETURN_REOPEN ; 0
+ const FIELDDEBUG_RETURN_WAIT_INPUT ; 1
+ const FIELDDEBUG_RETURN_CLOSE ; 2
+ const FIELDDEBUG_RETURN_CLEANUP ; 3
+ const FIELDDEBUG_RETURN_EXIT ; 4
+
+
+SECTION "engine/menu/field_debug_menu.asm@FieldDebugMenuHeader", ROMX
+
+FieldDebugMenuHeader:
+ db MENU_BACKUP_TILES
+ menu_coords 0, 0, 7, 17
+ dw .MenuData
+ db 1
+
+.MenuData:
+ db STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR
+ db 0
+ dw FieldDebug_Pages
+ dw PlaceMenuStrings
+ dw FieldDebug_MenuStrings
+
+INCLUDE "data/field_debug_entries.inc"
+
+FieldDebugMenu::
+ call RefreshScreen
+ ld de, SFX_MENU
+ call PlaySFX
+ ld hl, FieldDebugMenuHeader
+ call LoadMenuHeader
+
+; load first page
+ ld a, 0
+ ld [wFieldDebugPage], a
+
+.Reopen:
+ call UpdateTimePals
+ call UpdateSprites
+ ld a, [wFieldDebugMenuCursorBuffer]
+ ld [wMenuCursorBuffer], a
+ call OpenMenu
+ jr c, .WaitInput
+ ld a, [wMenuCursorBuffer]
+ ld [wFieldDebugMenuCursorBuffer], a
+ call PlaceHollowCursor
+
+ ld a, [wMenuJoypad]
+ cp A_BUTTON
+ jr z, .DoJumptable
+
+ call FieldDebug_ChangePage
+ jr .DoReturn
+
+.DoJumptable:
+ ld a, [wMenuSelection]
+ ld hl, FieldDebug_Jumptable
+ call CallJumptable
+
+.DoReturn:
+ ld hl, .ReturnJumptable
+ jp CallJumptable
+
+.ReturnJumptable:
+ dw .Reopen
+ dw .WaitInput
+ dw .Close
+ dw .Cleanup
+ dw .Exit
+
+.WaitInput:
+ call GetJoypad
+ ldh a, [hJoyDown]
+ bit A_BUTTON_F, a
+ jr nz, .WaitInput
+ call LoadFontExtra
+
+.Close:
+ call CloseWindow
+
+.Cleanup:
+ push af
+ call Function1fea
+ pop af
+ ret
+
+.Exit:
+ call ExitMenu
+ ld a, -1
+ ldh [hStartmenuCloseAndSelectHookEnable], a
+ jr .Cleanup
+
+FieldDebug_CloseMenu:
+ ld a, FIELDDEBUG_RETURN_CLOSE
+ ret
+
+FieldDebug_ChangePage:
+ ld a, [wMenuJoypad]
+ cp D_LEFT
+ jr z, .previous
+ ld a, [wFieldDebugPage]
+ inc a
+ cp FIELDDEBUG_NUM_PAGES
+ jr nz, .next
+ xor a
+.next
+ ld [wFieldDebugPage], a
+ jr FieldDebug_PlayMenuSound
+
+.previous
+ ld a, [wFieldDebugPage]
+ dec a
+ cp -1
+ jr nz, .load_previous
+ ld a, FIELDDEBUG_NUM_PAGES - 1
+.load_previous
+ ld [wFieldDebugPage], a
+ jr FieldDebug_PlayMenuSound
+
+FieldDebug_GoToNextPage:
+; This will only scroll between the first two pages
+; instead of the available three.
+
+ ld a, [wFieldDebugPage]
+ and a
+ jr z, .page_1
+ xor a
+ jr .load_page
+.page_1
+ ld a, 1
+.load_page
+ ld [wFieldDebugPage], a
+
+FieldDebug_PlayMenuSound:
+ ld de, SFX_MENU
+ call PlaySFX
+.loop
+ call GetJoypad
+ ldh a, [hJoyDown]
+ bit A_BUTTON_F, a
+ jr nz, .loop
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+FieldDebug_WaitJoypadInput:
+ push bc
+ ld b, a
+.loop
+ call GetJoypad
+ ldh a, [hJoyDown]
+ and b
+ jr z, .loop
+ pop bc
+ ret
+
+FieldDebug_ShowTextboxAndExit:
+ call MenuTextBox
+ ld a, A_BUTTON | B_BUTTON
+ call FieldDebug_WaitJoypadInput
+ call CloseWindow
+ ret
+
+FieldDebug_FrameType:
+ call FrameTypeDialog
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+FieldDebug_Reset:
+ call DisplayResetDialog
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+FieldDebug_ShowTrainerCard: ; unreferenced?
+ callab _TrainerCard
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/change_transportation.inc"
+
+INCLUDE "engine/debug/field/change_tileset.inc"
+
+FieldDebug_TownMap:
+ call LoadStandardMenuHeader
+ call ClearSprites
+ callab FlyMap
+ call ClearPalettes
+ call Function3657
+ call LoadFontExtra
+ call CloseWindow
+ call GetMemSGBLayout
+ call SetPalettes
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/sprite_viewer.inc"
+
+FieldDebug_NamePlayer:
+ call LoadStandardMenuHeader
+ ld de, wPlayerName
+ ld b, 1
+ callab NamingScreen
+ call ClearBGPalettes
+ call ClearTileMap
+ call CloseWindow
+ call ClearSprites
+ call GetMemSGBLayout
+ call SetPalettes
+ ld hl, wce5f
+ res 4, [hl]
+ call LoadFontExtra
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/toolgear.inc"
+
+FieldDebug_HealPokemon:
+ predef HealParty
+ ld hl, .HealedText
+ call MenuTextBoxBackup
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.HealedText:
+ text "#の たいりょくを"
+ line "かいふくしました"
+ prompt
+
+FieldDebug_CableClub:
+ callab Function29abf
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/npc_movement_test.inc"
+
+INCLUDE "engine/debug/field/mon_following.inc"
+
+INCLUDE "engine/debug/field/follow_npc_test.inc"
+
+INCLUDE "engine/debug/field/warp.inc"
+
+INCLUDE "engine/debug/field/toggle_npc_movement.inc"
+
+INCLUDE "engine/debug/field/field_cut.inc"
+
+INCLUDE "engine/debug/field/check_tile.inc"
+
+INCLUDE "engine/debug/field/move_to_entrance.inc"
+
+FieldDebug_TrainerGear:
+ call .OpenTrainerGear
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+.OpenTrainerGear:
+ call LoadStandardMenuHeader
+ callab OpenTrainerGear
+ call ClearPalettes
+ callab StartMenuLoadSprites
+ call CloseWindow
+ ret
+
+INCLUDE "engine/debug/field/map_viewer.inc"
+
+INCLUDE "engine/debug/field/item_test.inc"
+
+FieldDebug_PCMenu:
+ callab PokemonCenterPC
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/pokemart_menu.inc"
+
+INCLUDE "engine/debug/field/teleport.inc"
+
+INCLUDE "engine/debug/field/minigames.inc"
+
+FieldDebug_VRAMViewer:
+ call FieldDebug_DoVRAMViewer
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+FieldDebug_ClearEventFlags:
+ call FieldDebug_DoClearEventFlags
+ ld a, FIELDDEBUG_RETURN_REOPEN
+ ret
+
+INCLUDE "engine/debug/field/unused_flag_menu.inc"
+
+INCLUDE "engine/debug/field/unused_priority_menu.inc"
+
+INCLUDE "engine/debug/field/vram_viewer.inc"
+
diff --git a/home/map.asm b/home/map.asm
index 76aa499..86793db 100644
--- a/home/map.asm
+++ b/home/map.asm
@@ -1665,7 +1665,7 @@ Function2b78::
ret
Function2b79::
- callab Functionfce3e
+ callab DebugMapViewer
ld a, $4
call WriteIntod637
ret
diff --git a/home/overworld.asm b/home/overworld.asm
index d8bf242..ee111a8 100644
--- a/home/overworld.asm
+++ b/home/overworld.asm
@@ -13,7 +13,7 @@ OverworldStartButtonCheck::
ld a, [wDebugFlags]
bit DEBUG_FIELD_F, a
ret z ; debug disabled
- callba InGameDebugMenu
+ callba FieldDebugMenu
jr CheckStartmenuSelectHook
.regularMenu
callba DisplayStartMenu
diff --git a/home/tileset.asm b/home/tileset.asm
index 16df729..6646fbb 100644
--- a/home/tileset.asm
+++ b/home/tileset.asm
@@ -357,6 +357,7 @@ GetBlockLocation::
GetFacingSignpost::
call GetFacingTileCoord
ld b, a
+GetSignpost::
ld a, d
sub $4
ld d, a
diff --git a/home/toolgear.asm b/home/toolgear.asm
index 6ae720e..38a4c1c 100644
--- a/home/toolgear.asm
+++ b/home/toolgear.asm
@@ -47,14 +47,14 @@ newcharmap local
EnableToolgear::
ld hl, wd153
- res 0, [hl]
+ res TOOLGEAR_COORDS_F, [hl]
ld hl, wToolgearFlags
- set 0, [hl]
+ set TOOLGEAR_COORDS_F, [hl]
ret
DisableToolgear::
ld hl, wToolgearFlags
- res 0, [hl]
+ res SHOW_TOOLGEAR_F, [hl]
xor a
ldh [hLCDCPointer], a
ret
@@ -63,10 +63,10 @@ InitToolgearBuffer::
xor a
ldh [hBGMapMode], a
ld hl, wToolgearFlags
- bit 0, [hl]
+ bit SHOW_TOOLGEAR_F, [hl]
jr z, .hide_window
- res 7, [hl]
+ res HIDE_TOOLGEAR_F, [hl]
call LoadToolgearGraphics
bgcoord hl, 0, 0, wToolgearBuffer
@@ -82,7 +82,7 @@ InitToolgearBuffer::
call UpdateToolgear
ld hl, vBGMap1
- ld bc, $0004 ; 4 tiles = 2 rows
+ ld bc, $4 ; 4 tiles = 2 rows
bgcoord de, 0, 0, wToolgearBuffer
call Get2bpp
@@ -93,7 +93,7 @@ InitToolgearBuffer::
ldh [hWY], a
ret
-.hide_window:
+.hide_window
xor a
ldh [hLCDCPointer], a
ld a, $90
@@ -110,19 +110,20 @@ UpdateToolgear::
call ByteFill
ld hl, wd153
- bit 0, [hl]
+ bit TOOLGEAR_COORDS_F, [hl]
jr z, .debug_show_time
+
ld hl, wXCoord
bgcoord de, 4, 1, wToolgearBuffer
- ld c, $01
+ ld c, 1
call .printHex
ld hl, wYCoord
bgcoord de, 8, 1, wToolgearBuffer
- ld c, $01
+ ld c, 1
call .printHex
ret
-.debug_show_time
+.debug_show_time
ld hl, hRTCHours
bgcoord de, 0, 1, wToolgearBuffer
call .printDec
@@ -140,7 +141,8 @@ UpdateToolgear::
ldh a, [hRTCSeconds]
and 1
ret z
- ld a, $70 ; :
+
+ ld a, ":"
ldbgcoord_a 2, 1, wToolgearBuffer
ret
@@ -180,7 +182,7 @@ UpdateToolgear::
.printDigit::
; .printDigit
; print a hexadecimal digit for value in a to de
- and $0f
+ and $f
add "0"
ld [de], a
inc de
diff --git a/layout.link b/layout.link
index 17ae518..382ccd8 100644
--- a/layout.link
+++ b/layout.link
@@ -946,16 +946,16 @@ ROMX $3e
ROMX $3f
org $4000
- org $4305
+ "engine/menu/field_debug_menu.asm@FieldDebugMenuHeader"
"engine/menu/frame_type_dialog.asm"
- org $4362
"engine/menu/reset_dialog.asm"
- org $4a57
+ "engine/debug/field/change_tileset.inc@FieldDebug_ChangeTileset"
"engine/landmarks.asm@1"
"data/maps/landmarks.asm"
"engine/landmarks.asm@2"
- org $506f
+ "engine/debug/field/warp.inc@FieldDebug_ShowWarpToText"
"gfx.asm@Town Map Cursor"
+ "engine/debug/field/map_viewer.inc@DisplayBGEventDetails"
org $6255
"engine/menu/debug_menu.asm@Sound Test"
org $67a1
diff --git a/ram/hram.asm b/ram/hram.asm
index 2b28792..8269616 100644
--- a/ram/hram.asm
+++ b/ram/hram.asm
@@ -11,7 +11,10 @@ hRTCSeconds:: db
hRTCDays:: db
ds 2 ; TODO
hRTCStatusFlags:: db
- ds 3 ; TODO
+
+ ds 2 ; TODO
+
+hDebugMapViewerJumptable:: db
hVBlankCounter::
db
diff --git a/ram/wram.asm b/ram/wram.asm
index 1ba561b..11b0c16 100644
--- a/ram/wram.asm
+++ b/ram/wram.asm
@@ -614,6 +614,7 @@ wWindowStackPointer:: dw
wMenuJoypad:: db
wMenuSelection:: db
wMenuSelectionQuantity:: db
+wFieldDebugPage::
wWhichIndexSet::
wActiveBackpackPocket:: db
wScrollingMenuCursorPosition:: db
@@ -676,12 +677,33 @@ wTitleSequenceOpeningType::
wDefaultSpawnPoint::
db
+
+UNION
+
+wcc40:: ; XXX fix this to cc3a
wMovementBufferCount:: db
+
+wcc41:: ; XXX fix this to cc3b
wMovementBufferObject:: db
+
ptrba wMovementBufferPointer
+
wMovementBuffer::
ds 55
+NEXTU
+
+wSpriteViewerMenuStartingItem:: db
+
+ ds 2
+
+wSpriteViewerSavedMenuPointerY:: db
+wSpriteViewerJumptableIndex:: db
+
+ ds 56
+
+ENDU
+
SECTION "CC9A", WRAM0[$CC9A]
wSkatingDirection:: db
@@ -797,6 +819,7 @@ wStartmenuCursor:: db
wcd40:: db
wcd41:: db
wcd42:: db
+wFieldDebugMenuCursorBuffer::
wcd43:: db
wRegularItemsScrollPosition:: db
wBackpackAndKeyItemsScrollPosition:: db
@@ -831,6 +854,7 @@ wVramState:: db
wcd5d:: db
db
wChosenStarter:: db
+wcd60:: db
SECTION "CD70", WRAM0[$CD70]
wcd70:: ds 1
@@ -905,9 +929,21 @@ NEXTU
wHPBarMaxHP:: dw
wHPBarOldHP:: dw
+NEXTU
+
+wcdc3:: db
+wcdc4:: db
+wcdc5:: db
+wcdc6:: db
+
ENDU
+UNION
wHPBarNewHP:: dw
+NEXTU
+wcdc7:: db
+wcdc8:: db
+ENDU
wHPBarDelta:: db
wcdca:: db
wHPBarHPDifference:: dw
@@ -1146,7 +1182,7 @@ wTimeOfDayPal:: db
wd153:: db
; 76543210
; | \- show player coords in toolgear instead of time
-; \-------- switch overworld palettes according to seconds not hours
+; \-------- switch overworld palettes according to minutes not hours
ds 3 ; TODO
wTimeOfDayPalFlags:: db
@@ -1317,9 +1353,19 @@ wd642:: db
wBGMapAnchor::
dw
+UNION
+
wUsedSprites::
ds 2
+NEXTU
+
+ ds 1
+
+wd646:: db
+
+ENDU
+
wUsedNPCSprites::
ds 8
diff --git a/shim.sym b/shim.sym
index 659eda3..53d8d13 100755
--- a/shim.sym
+++ b/shim.sym
@@ -92,6 +92,7 @@
14:4CD1 Function50cd1
14:4ED9 Function50ed9
+23:4325 Function8c325
23:42DC UpdateTimeOfDayPal
23:42E3 _TimeOfDayPals
23:4335 _UpdateTimePals
@@ -128,11 +129,8 @@
38:4E5F Cursor_AnimateCursor
38:4EA8 Cursor_InterpretJoypad
-3F:40E9 InGameDebugMenu
-3F:4C24 Functionfcc24
3F:4E3E Functionfce3e
3F:5B66 Functionfdb66
-3F:6255 Functionfe255
3F:64CE MonsterTest
3F:654E PicTest
3F:6750 PicTestMenu