shithub: pokecrystal

Download patch

ref: 7bd8d56ff93e14839d304cc3a3a2a182e992f909
parent: 43eff93861b5b00473e567e6449c64f039f8f4ba
author: mid-kid <esteve.varela@gmail.com>
date: Sat Feb 22 07:52:13 EST 2020

Implement suggestions in PR #687

Merge mon_stats.asm, cry.asm, print_level.asm, and mon_data.asm into pokemon.asm
Merge mon_party.asm into battle.asm
Merge menu.asm, menu_window.asm, and menu2.asm into menu.asm

--- a/home.asm
+++ b/home.asm
@@ -39,8 +39,6 @@
 INCLUDE "home/sine.asm"
 INCLUDE "home/movement.asm"
 INCLUDE "home/menu.asm"
-INCLUDE "home/menu_window.asm"
-INCLUDE "home/menu2.asm"
 INCLUDE "home/printer.asm"
 INCLUDE "home/game_time.asm"
 INCLUDE "home/map.asm"
@@ -71,12 +69,8 @@
 INCLUDE "home/scrolling_menu.asm"
 INCLUDE "home/stone_queue.asm"
 INCLUDE "home/trainers.asm"
-INCLUDE "home/mon_stats.asm"
-INCLUDE "home/cry.asm"
-INCLUDE "home/print_level.asm"
-INCLUDE "home/mon_data.asm"
+INCLUDE "home/pokemon.asm"
 INCLUDE "home/print_bcd.asm"
-INCLUDE "home/mon_party.asm"
 INCLUDE "home/battle.asm"
 INCLUDE "home/sprite_anims.asm"
 INCLUDE "home/audio.asm"
--- a/home/battle.asm
+++ b/home/battle.asm
@@ -1,3 +1,38 @@
+GetPartyParamLocation::
+; Get the location of parameter a from wCurPartyMon in hl
+	push bc
+	ld hl, wPartyMons
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [wCurPartyMon]
+	call GetPartyLocation
+	pop bc
+	ret
+
+GetPartyLocation::
+; Add the length of a PartyMon struct to hl a times.
+	ld bc, PARTYMON_STRUCT_LENGTH
+	jp AddNTimes
+
+Unreferenced_GetDexNumber::
+; Probably used in gen 1 to convert index number to dex number
+; Not required in gen 2 because index number == dex number
+	push hl
+	ld a, b
+	dec a
+	ld b, 0
+	add hl, bc
+	ld hl, BaseData + BASE_DEX_NO
+	ld bc, BASE_DATA_SIZE
+	call AddNTimes
+	ld a, BANK(BaseData)
+	call GetFarHalfword
+	ld b, l
+	ld c, h
+	pop hl
+	ret
+
 UserPartyAttr::
 	push af
 	ldh a, [hBattleTurn]
--- a/home/cry.asm
+++ /dev/null
@@ -1,101 +1,0 @@
-PlayStereoCry::
-	push af
-	ld a, 1
-	ld [wStereoPanningMask], a
-	pop af
-	call _PlayMonCry
-	call WaitSFX
-	ret
-
-PlayStereoCry2::
-; Don't wait for the cry to end.
-; Used during pic animations.
-	push af
-	ld a, 1
-	ld [wStereoPanningMask], a
-	pop af
-	jp _PlayMonCry
-
-PlayMonCry::
-	call PlayMonCry2
-	call WaitSFX
-	ret
-
-PlayMonCry2::
-; Don't wait for the cry to end.
-	push af
-	xor a
-	ld [wStereoPanningMask], a
-	ld [wCryTracks], a
-	pop af
-	call _PlayMonCry
-	ret
-
-_PlayMonCry::
-	push hl
-	push de
-	push bc
-
-	call GetCryIndex
-	jr c, .done
-
-	ld e, c
-	ld d, b
-	call PlayCry
-
-.done
-	pop bc
-	pop de
-	pop hl
-	ret
-
-LoadCry::
-; Load cry bc.
-
-	call GetCryIndex
-	ret c
-
-	ldh a, [hROMBank]
-	push af
-	ld a, BANK(PokemonCries)
-	rst Bankswitch
-
-	ld hl, PokemonCries
-rept 6 ; sizeof(mon_cry)
-	add hl, bc
-endr
-
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc hl
-
-	ld a, [hli]
-	ld [wCryPitch], a
-	ld a, [hli]
-	ld [wCryPitch + 1], a
-	ld a, [hli]
-	ld [wCryLength], a
-	ld a, [hl]
-	ld [wCryLength + 1], a
-
-	pop af
-	rst Bankswitch
-	and a
-	ret
-
-GetCryIndex::
-	and a
-	jr z, .no
-	cp NUM_POKEMON + 1
-	jr nc, .no
-
-	dec a
-	ld c, a
-	ld b, 0
-	and a
-	ret
-
-.no
-	scf
-	ret
--- a/home/menu.asm
+++ b/home/menu.asm
@@ -60,3 +60,784 @@
 	ld l, a
 	ld [hl], " "
 	ret
+
+PushWindow::
+	callfar _PushWindow
+	ret
+
+ExitMenu::
+	push af
+	callfar _ExitMenu
+	pop af
+	ret
+
+InitVerticalMenuCursor::
+	callfar _InitVerticalMenuCursor
+	ret
+
+CloseWindow::
+	push af
+	call ExitMenu
+	call ApplyTilemap
+	call UpdateSprites
+	pop af
+	ret
+
+RestoreTileBackup::
+	call MenuBoxCoord2Tile
+	call .copy
+	call MenuBoxCoord2Attr
+	call .copy
+	ret
+
+.copy
+	call GetMenuBoxDims
+	inc b
+	inc c
+
+.row
+	push bc
+	push hl
+
+.col
+	ld a, [de]
+	ld [hli], a
+	dec de
+	dec c
+	jr nz, .col
+
+	pop hl
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .row
+
+	ret
+
+PopWindow::
+	ld b, $10
+	ld de, wMenuFlags
+.loop
+	ld a, [hld]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .loop
+	ret
+
+GetMenuBoxDims::
+	ld a, [wMenuBorderTopCoord] ; top
+	ld b, a
+	ld a, [wMenuBorderBottomCoord] ; bottom
+	sub b
+	ld b, a
+	ld a, [wMenuBorderLeftCoord] ; left
+	ld c, a
+	ld a, [wMenuBorderRightCoord] ; right
+	sub c
+	ld c, a
+	ret
+
+CopyMenuData::
+	push hl
+	push de
+	push bc
+	push af
+	ld hl, wMenuDataPointer
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, wMenuDataFlags
+	ld bc, wMenuDataEnd - wMenuDataFlags
+	call CopyBytes
+	pop af
+	pop bc
+	pop de
+	pop hl
+	ret
+
+GetWindowStackTop::
+	ld hl, wWindowStackPointer
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	inc hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ret
+
+PlaceVerticalMenuItems::
+	call CopyMenuData
+	ld hl, wMenuDataPointer
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	call GetMenuTextStartCoord
+	call Coord2Tile ; hl now contains the tilemap address where we will start printing text.
+	inc de
+	ld a, [de] ; Number of items
+	inc de
+	ld b, a
+.loop
+	push bc
+	call PlaceString
+	inc de
+	ld bc, 2 * SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .loop
+
+	ld a, [wMenuDataFlags]
+	bit 4, a
+	ret z
+
+	call MenuBoxCoord2Tile
+	ld a, [de]
+	ld c, a
+	inc de
+	ld b, $0
+	add hl, bc
+	jp PlaceString
+
+MenuBox::
+	call MenuBoxCoord2Tile
+	call GetMenuBoxDims
+	dec b
+	dec c
+	jp Textbox
+
+GetMenuTextStartCoord::
+	ld a, [wMenuBorderTopCoord]
+	ld b, a
+	inc b
+	ld a, [wMenuBorderLeftCoord]
+	ld c, a
+	inc c
+; bit 6: if not set, leave extra room on top
+	ld a, [wMenuDataFlags]
+	bit 6, a
+	jr nz, .bit_6_set
+	inc b
+
+.bit_6_set
+; bit 7: if set, leave extra room on the left
+	ld a, [wMenuDataFlags]
+	bit 7, a
+	jr z, .bit_7_clear
+	inc c
+
+.bit_7_clear
+	ret
+
+ClearMenuBoxInterior::
+	call MenuBoxCoord2Tile
+	ld bc, SCREEN_WIDTH + 1
+	add hl, bc
+	call GetMenuBoxDims
+	dec b
+	dec c
+	call ClearBox
+	ret
+
+ClearWholeMenuBox::
+	call MenuBoxCoord2Tile
+	call GetMenuBoxDims
+	inc c
+	inc b
+	call ClearBox
+	ret
+
+MenuBoxCoord2Tile::
+	ld a, [wMenuBorderLeftCoord]
+	ld c, a
+	ld a, [wMenuBorderTopCoord]
+	ld b, a
+
+Coord2Tile::
+; Return the address of wTilemap(c, b) in hl.
+	xor a
+	ld h, a
+	ld l, b
+	ld a, c
+	ld b, h
+	ld c, l
+	add hl, hl
+	add hl, hl
+	add hl, bc
+	add hl, hl
+	add hl, hl
+	ld c, a
+	xor a
+	ld b, a
+	add hl, bc
+	bccoord 0, 0
+	add hl, bc
+	ret
+
+MenuBoxCoord2Attr::
+	ld a, [wMenuBorderLeftCoord]
+	ld c, a
+	ld a, [wMenuBorderTopCoord]
+	ld b, a
+
+Coord2Attr::
+; Return the address of wAttrmap(c, b) in hl.
+	xor a
+	ld h, a
+	ld l, b
+	ld a, c
+	ld b, h
+	ld c, l
+	add hl, hl
+	add hl, hl
+	add hl, bc
+	add hl, hl
+	add hl, hl
+	ld c, a
+	xor a
+	ld b, a
+	add hl, bc
+	bccoord 0, 0, wAttrmap
+	add hl, bc
+	ret
+
+LoadMenuHeader::
+	call CopyMenuHeader
+	call PushWindow
+	ret
+
+CopyMenuHeader::
+	ld de, wMenuHeader
+	ld bc, wMenuHeaderEnd - wMenuHeader
+	call CopyBytes
+	ldh a, [hROMBank]
+	ld [wMenuDataBank], a
+	ret
+
+StoreTo_wMenuCursorBuffer::
+	ld [wMenuCursorBuffer], a
+	ret
+
+MenuTextbox::
+	push hl
+	call LoadMenuTextbox
+	pop hl
+	jp PrintText
+
+; unused
+	ret
+
+LoadMenuTextbox::
+	ld hl, .MenuHeader
+	call LoadMenuHeader
+	ret
+
+.MenuHeader:
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+	dw vTiles0
+	db 0 ; default option
+
+MenuTextboxBackup::
+	call MenuTextbox
+	call CloseWindow
+	ret
+
+LoadStandardMenuHeader::
+	ld hl, .MenuHeader
+	call LoadMenuHeader
+	ret
+
+.MenuHeader:
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
+	dw 0
+	db 1 ; default option
+
+Call_ExitMenu::
+	call ExitMenu
+	ret
+
+VerticalMenu::
+	xor a
+	ldh [hBGMapMode], a
+	call MenuBox
+	call UpdateSprites
+	call PlaceVerticalMenuItems
+	call ApplyTilemap
+	call CopyMenuData
+	ld a, [wMenuDataFlags]
+	bit 7, a
+	jr z, .cancel
+	call InitVerticalMenuCursor
+	call StaticMenuJoypad
+	call MenuClickSound
+	bit 1, a
+	jr z, .okay
+.cancel
+	scf
+	ret
+
+.okay
+	and a
+	ret
+
+GetMenu2::
+	call LoadMenuHeader
+	call VerticalMenu
+	call CloseWindow
+	ld a, [wMenuCursorY]
+	ret
+
+CopyNameFromMenu::
+	push hl
+	push bc
+	push af
+	ld hl, wMenuDataPointer
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	inc hl
+	inc hl
+	pop af
+	call GetNthString
+	ld d, h
+	ld e, l
+	call CopyName1
+	pop bc
+	pop hl
+	ret
+
+YesNoBox::
+	lb bc, SCREEN_WIDTH - 6, 7
+
+PlaceYesNoBox::
+	jr _YesNoBox
+
+PlaceGenericTwoOptionBox::
+	call LoadMenuHeader
+	jr InterpretTwoOptionMenu
+
+_YesNoBox::
+; Return nc (yes) or c (no).
+	push bc
+	ld hl, YesNoMenuHeader
+	call CopyMenuHeader
+	pop bc
+; This seems to be an overflow prevention, but
+; it was coded wrong.
+	ld a, b
+	cp SCREEN_WIDTH - 6
+	jr nz, .okay ; should this be "jr nc"?
+	ld a, SCREEN_WIDTH - 6
+	ld b, a
+
+.okay
+	ld a, b
+	ld [wMenuBorderLeftCoord], a
+	add 5
+	ld [wMenuBorderRightCoord], a
+	ld a, c
+	ld [wMenuBorderTopCoord], a
+	add 4
+	ld [wMenuBorderBottomCoord], a
+	call PushWindow
+
+InterpretTwoOptionMenu::
+	call VerticalMenu
+	push af
+	ld c, $f
+	call DelayFrames
+	call CloseWindow
+	pop af
+	jr c, .no
+	ld a, [wMenuCursorY]
+	cp 2 ; no
+	jr z, .no
+	and a
+	ret
+
+.no
+	ld a, 2
+	ld [wMenuCursorY], a
+	scf
+	ret
+
+YesNoMenuHeader::
+	db MENU_BACKUP_TILES ; flags
+	menu_coords 10, 5, 15, 9
+	dw .MenuData
+	db 1 ; default option
+
+.MenuData:
+	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
+	db 2
+	db "YES@"
+	db "NO@"
+
+OffsetMenuHeader::
+	call _OffsetMenuHeader
+	call PushWindow
+	ret
+
+_OffsetMenuHeader::
+	push de
+	call CopyMenuHeader
+	pop de
+	ld a, [wMenuBorderLeftCoord]
+	ld h, a
+	ld a, [wMenuBorderRightCoord]
+	sub h
+	ld h, a
+	ld a, d
+	ld [wMenuBorderLeftCoord], a
+	add h
+	ld [wMenuBorderRightCoord], a
+	ld a, [wMenuBorderTopCoord]
+	ld l, a
+	ld a, [wMenuBorderBottomCoord]
+	sub l
+	ld l, a
+	ld a, e
+	ld [wMenuBorderTopCoord], a
+	add l
+	ld [wMenuBorderBottomCoord], a
+	ret
+
+DoNthMenu::
+	call DrawVariableLengthMenuBox
+	call MenuWriteText
+	call InitMenuCursorAndButtonPermissions
+	call GetStaticMenuJoypad
+	call GetMenuJoypad
+	call MenuClickSound
+	ret
+
+SetUpMenu::
+	call DrawVariableLengthMenuBox ; ???
+	call MenuWriteText
+	call InitMenuCursorAndButtonPermissions ; set up selection pointer
+	ld hl, w2DMenuFlags1
+	set 7, [hl]
+	ret
+
+DrawVariableLengthMenuBox::
+	call CopyMenuData
+	call GetMenuIndexSet
+	call AutomaticGetMenuBottomCoord
+	call MenuBox
+	ret
+
+MenuWriteText::
+	xor a
+	ldh [hBGMapMode], a
+	call GetMenuIndexSet ; sort out the text
+	call RunMenuItemPrintingFunction ; actually write it
+	call SafeUpdateSprites
+	ldh a, [hOAMUpdate]
+	push af
+	ld a, $1
+	ldh [hOAMUpdate], a
+	call ApplyTilemap
+	pop af
+	ldh [hOAMUpdate], a
+	ret
+
+AutomaticGetMenuBottomCoord::
+	ld a, [wMenuBorderLeftCoord]
+	ld c, a
+	ld a, [wMenuBorderRightCoord]
+	sub c
+	ld c, a
+	ld a, [wMenuDataItems]
+	add a
+	inc a
+	ld b, a
+	ld a, [wMenuBorderTopCoord]
+	add b
+	ld [wMenuBorderBottomCoord], a
+	ret
+
+GetMenuIndexSet::
+	ld hl, wMenuDataIndicesPointer
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [wWhichIndexSet]
+	and a
+	jr z, .skip
+	ld b, a
+	ld c, -1
+.loop
+	ld a, [hli]
+	cp c
+	jr nz, .loop
+	dec b
+	jr nz, .loop
+
+.skip
+	ld d, h
+	ld e, l
+	ld a, [hl]
+	ld [wMenuDataItems], a
+	ret
+
+RunMenuItemPrintingFunction::
+	call MenuBoxCoord2Tile
+	ld bc, 2 * SCREEN_WIDTH + 2
+	add hl, bc
+.loop
+	inc de
+	ld a, [de]
+	cp -1
+	ret z
+	ld [wMenuSelection], a
+	push de
+	push hl
+	ld d, h
+	ld e, l
+	ld hl, wMenuDataDisplayFunctionPointer
+	call ._hl_
+	pop hl
+	ld de, 2 * SCREEN_WIDTH
+	add hl, de
+	pop de
+	jr .loop
+
+._hl_
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+
+InitMenuCursorAndButtonPermissions::
+	call InitVerticalMenuCursor
+	ld hl, wMenuJoypadFilter
+	ld a, [wMenuDataFlags]
+	bit 3, a
+	jr z, .disallow_select
+	set START_F, [hl]
+
+.disallow_select
+	ld a, [wMenuDataFlags]
+	bit 2, a
+	jr z, .disallow_left_right
+	set D_LEFT_F, [hl]
+	set D_RIGHT_F, [hl]
+
+.disallow_left_right
+	ret
+
+GetScrollingMenuJoypad::
+	call ScrollingMenuJoypad
+	ld hl, wMenuJoypadFilter
+	and [hl]
+	jr ContinueGettingMenuJoypad
+
+GetStaticMenuJoypad::
+	xor a
+	ld [wMenuJoypad], a
+	call StaticMenuJoypad
+
+ContinueGettingMenuJoypad:
+	bit A_BUTTON_F, a
+	jr nz, .a_button
+	bit B_BUTTON_F, a
+	jr nz, .b_start
+	bit START_F, a
+	jr nz, .b_start
+	bit D_RIGHT_F, a
+	jr nz, .d_right
+	bit D_LEFT_F, a
+	jr nz, .d_left
+	xor a
+	ld [wMenuJoypad], a
+	jr .done
+
+.d_right
+	ld a, D_RIGHT
+	ld [wMenuJoypad], a
+	jr .done
+
+.d_left
+	ld a, D_LEFT
+	ld [wMenuJoypad], a
+	jr .done
+
+.a_button
+	ld a, A_BUTTON
+	ld [wMenuJoypad], a
+
+.done
+	call GetMenuIndexSet
+	ld a, [wMenuCursorY]
+	ld l, a
+	ld h, $0
+	add hl, de
+	ld a, [hl]
+	ld [wMenuSelection], a
+	ld a, [wMenuCursorY]
+	ld [wMenuCursorBuffer], a
+	and a
+	ret
+
+.b_start
+	ld a, B_BUTTON
+	ld [wMenuJoypad], a
+	ld a, -1
+	ld [wMenuSelection], a
+	scf
+	ret
+
+PlaceMenuStrings::
+	push de
+	ld hl, wMenuDataPointerTableAddr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [wMenuSelection]
+	call GetNthString
+	ld d, h
+	ld e, l
+	pop hl
+	call PlaceString
+	ret
+
+PlaceNthMenuStrings::
+	push de
+	ld a, [wMenuSelection]
+	call GetMenuDataPointerTableEntry
+	inc hl
+	inc hl
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	pop hl
+	call PlaceString
+	ret
+
+Unreferenced_Function1f9e::
+	call GetMenuDataPointerTableEntry
+	inc hl
+	inc hl
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+	ret
+
+MenuJumptable::
+	ld a, [wMenuSelection]
+	call GetMenuDataPointerTableEntry
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+
+GetMenuDataPointerTableEntry::
+	ld e, a
+	ld d, $0
+	ld hl, wMenuDataPointerTableAddr
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	add hl, de
+	add hl, de
+	add hl, de
+	ret
+
+ClearWindowData::
+	ld hl, wWindowStackPointer
+	call .bytefill
+	ld hl, wMenuHeader
+	call .bytefill
+	ld hl, wMenuDataFlags
+	call .bytefill
+	ld hl, w2DMenuCursorInitY
+	call .bytefill
+
+	ldh a, [rSVBK]
+	push af
+	ld a, BANK(wWindowStack)
+	ldh [rSVBK], a
+
+	xor a
+	ld hl, wWindowStackBottom
+	ld [hld], a
+	ld [hld], a
+	ld a, l
+	ld [wWindowStackPointer], a
+	ld a, h
+	ld [wWindowStackPointer + 1], a
+
+	pop af
+	ldh [rSVBK], a
+	ret
+
+.bytefill
+	ld bc, $10
+	xor a
+	call ByteFill
+	ret
+
+MenuClickSound::
+	push af
+	and A_BUTTON | B_BUTTON
+	jr z, .nosound
+	ld hl, wMenuFlags
+	bit 3, [hl]
+	jr nz, .nosound
+	call PlayClickSFX
+.nosound
+	pop af
+	ret
+
+PlayClickSFX::
+	push de
+	ld de, SFX_READ_TEXT_2
+	call PlaySFX
+	pop de
+	ret
+
+MenuTextboxWaitButton::
+	call MenuTextbox
+	call WaitButton
+	call ExitMenu
+	ret
+
+Place2DMenuItemName::
+	ldh [hBuffer], a
+	ldh a, [hROMBank]
+	push af
+	ldh a, [hBuffer]
+	rst Bankswitch
+
+	call PlaceString
+	pop af
+	rst Bankswitch
+
+	ret
+
+_2DMenu::
+	ldh a, [hROMBank]
+	ld [wMenuData_2DMenuItemStringsBank], a
+	farcall _2DMenu_
+	ld a, [wMenuCursorBuffer]
+	ret
+
+InterpretBattleMenu::
+	ldh a, [hROMBank]
+	ld [wMenuData_2DMenuItemStringsBank], a
+	farcall _InterpretBattleMenu
+	ld a, [wMenuCursorBuffer]
+	ret
+
+InterpretMobileMenu::
+	ldh a, [hROMBank]
+	ld [wMenuData_2DMenuItemStringsBank], a
+	farcall _InterpretMobileMenu
+	ld a, [wMenuCursorBuffer]
+	ret
--- a/home/menu2.asm
+++ /dev/null
@@ -1,539 +1,0 @@
-; Functions used in displaying and handling menus.
-
-LoadMenuHeader::
-	call CopyMenuHeader
-	call PushWindow
-	ret
-
-CopyMenuHeader::
-	ld de, wMenuHeader
-	ld bc, wMenuHeaderEnd - wMenuHeader
-	call CopyBytes
-	ldh a, [hROMBank]
-	ld [wMenuDataBank], a
-	ret
-
-StoreTo_wMenuCursorBuffer::
-	ld [wMenuCursorBuffer], a
-	ret
-
-MenuTextbox::
-	push hl
-	call LoadMenuTextbox
-	pop hl
-	jp PrintText
-
-; unused
-	ret
-
-LoadMenuTextbox::
-	ld hl, .MenuHeader
-	call LoadMenuHeader
-	ret
-
-.MenuHeader:
-	db MENU_BACKUP_TILES ; flags
-	menu_coords 0, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
-	dw vTiles0
-	db 0 ; default option
-
-MenuTextboxBackup::
-	call MenuTextbox
-	call CloseWindow
-	ret
-
-LoadStandardMenuHeader::
-	ld hl, .MenuHeader
-	call LoadMenuHeader
-	ret
-
-.MenuHeader:
-	db MENU_BACKUP_TILES ; flags
-	menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
-	dw 0
-	db 1 ; default option
-
-Call_ExitMenu::
-	call ExitMenu
-	ret
-
-VerticalMenu::
-	xor a
-	ldh [hBGMapMode], a
-	call MenuBox
-	call UpdateSprites
-	call PlaceVerticalMenuItems
-	call ApplyTilemap
-	call CopyMenuData
-	ld a, [wMenuDataFlags]
-	bit 7, a
-	jr z, .cancel
-	call InitVerticalMenuCursor
-	call StaticMenuJoypad
-	call MenuClickSound
-	bit 1, a
-	jr z, .okay
-.cancel
-	scf
-	ret
-
-.okay
-	and a
-	ret
-
-GetMenu2::
-	call LoadMenuHeader
-	call VerticalMenu
-	call CloseWindow
-	ld a, [wMenuCursorY]
-	ret
-
-CopyNameFromMenu::
-	push hl
-	push bc
-	push af
-	ld hl, wMenuDataPointer
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	inc hl
-	inc hl
-	pop af
-	call GetNthString
-	ld d, h
-	ld e, l
-	call CopyName1
-	pop bc
-	pop hl
-	ret
-
-YesNoBox::
-	lb bc, SCREEN_WIDTH - 6, 7
-
-PlaceYesNoBox::
-	jr _YesNoBox
-
-PlaceGenericTwoOptionBox::
-	call LoadMenuHeader
-	jr InterpretTwoOptionMenu
-
-_YesNoBox::
-; Return nc (yes) or c (no).
-	push bc
-	ld hl, YesNoMenuHeader
-	call CopyMenuHeader
-	pop bc
-; This seems to be an overflow prevention, but
-; it was coded wrong.
-	ld a, b
-	cp SCREEN_WIDTH - 6
-	jr nz, .okay ; should this be "jr nc"?
-	ld a, SCREEN_WIDTH - 6
-	ld b, a
-
-.okay
-	ld a, b
-	ld [wMenuBorderLeftCoord], a
-	add 5
-	ld [wMenuBorderRightCoord], a
-	ld a, c
-	ld [wMenuBorderTopCoord], a
-	add 4
-	ld [wMenuBorderBottomCoord], a
-	call PushWindow
-
-InterpretTwoOptionMenu::
-	call VerticalMenu
-	push af
-	ld c, $f
-	call DelayFrames
-	call CloseWindow
-	pop af
-	jr c, .no
-	ld a, [wMenuCursorY]
-	cp 2 ; no
-	jr z, .no
-	and a
-	ret
-
-.no
-	ld a, 2
-	ld [wMenuCursorY], a
-	scf
-	ret
-
-YesNoMenuHeader::
-	db MENU_BACKUP_TILES ; flags
-	menu_coords 10, 5, 15, 9
-	dw .MenuData
-	db 1 ; default option
-
-.MenuData:
-	db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
-	db 2
-	db "YES@"
-	db "NO@"
-
-OffsetMenuHeader::
-	call _OffsetMenuHeader
-	call PushWindow
-	ret
-
-_OffsetMenuHeader::
-	push de
-	call CopyMenuHeader
-	pop de
-	ld a, [wMenuBorderLeftCoord]
-	ld h, a
-	ld a, [wMenuBorderRightCoord]
-	sub h
-	ld h, a
-	ld a, d
-	ld [wMenuBorderLeftCoord], a
-	add h
-	ld [wMenuBorderRightCoord], a
-	ld a, [wMenuBorderTopCoord]
-	ld l, a
-	ld a, [wMenuBorderBottomCoord]
-	sub l
-	ld l, a
-	ld a, e
-	ld [wMenuBorderTopCoord], a
-	add l
-	ld [wMenuBorderBottomCoord], a
-	ret
-
-DoNthMenu::
-	call DrawVariableLengthMenuBox
-	call MenuWriteText
-	call InitMenuCursorAndButtonPermissions
-	call GetStaticMenuJoypad
-	call GetMenuJoypad
-	call MenuClickSound
-	ret
-
-SetUpMenu::
-	call DrawVariableLengthMenuBox ; ???
-	call MenuWriteText
-	call InitMenuCursorAndButtonPermissions ; set up selection pointer
-	ld hl, w2DMenuFlags1
-	set 7, [hl]
-	ret
-
-DrawVariableLengthMenuBox::
-	call CopyMenuData
-	call GetMenuIndexSet
-	call AutomaticGetMenuBottomCoord
-	call MenuBox
-	ret
-
-MenuWriteText::
-	xor a
-	ldh [hBGMapMode], a
-	call GetMenuIndexSet ; sort out the text
-	call RunMenuItemPrintingFunction ; actually write it
-	call SafeUpdateSprites
-	ldh a, [hOAMUpdate]
-	push af
-	ld a, $1
-	ldh [hOAMUpdate], a
-	call ApplyTilemap
-	pop af
-	ldh [hOAMUpdate], a
-	ret
-
-AutomaticGetMenuBottomCoord::
-	ld a, [wMenuBorderLeftCoord]
-	ld c, a
-	ld a, [wMenuBorderRightCoord]
-	sub c
-	ld c, a
-	ld a, [wMenuDataItems]
-	add a
-	inc a
-	ld b, a
-	ld a, [wMenuBorderTopCoord]
-	add b
-	ld [wMenuBorderBottomCoord], a
-	ret
-
-GetMenuIndexSet::
-	ld hl, wMenuDataIndicesPointer
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [wWhichIndexSet]
-	and a
-	jr z, .skip
-	ld b, a
-	ld c, -1
-.loop
-	ld a, [hli]
-	cp c
-	jr nz, .loop
-	dec b
-	jr nz, .loop
-
-.skip
-	ld d, h
-	ld e, l
-	ld a, [hl]
-	ld [wMenuDataItems], a
-	ret
-
-RunMenuItemPrintingFunction::
-	call MenuBoxCoord2Tile
-	ld bc, 2 * SCREEN_WIDTH + 2
-	add hl, bc
-.loop
-	inc de
-	ld a, [de]
-	cp -1
-	ret z
-	ld [wMenuSelection], a
-	push de
-	push hl
-	ld d, h
-	ld e, l
-	ld hl, wMenuDataDisplayFunctionPointer
-	call ._hl_
-	pop hl
-	ld de, 2 * SCREEN_WIDTH
-	add hl, de
-	pop de
-	jr .loop
-
-._hl_
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-
-InitMenuCursorAndButtonPermissions::
-	call InitVerticalMenuCursor
-	ld hl, wMenuJoypadFilter
-	ld a, [wMenuDataFlags]
-	bit 3, a
-	jr z, .disallow_select
-	set START_F, [hl]
-
-.disallow_select
-	ld a, [wMenuDataFlags]
-	bit 2, a
-	jr z, .disallow_left_right
-	set D_LEFT_F, [hl]
-	set D_RIGHT_F, [hl]
-
-.disallow_left_right
-	ret
-
-GetScrollingMenuJoypad::
-	call ScrollingMenuJoypad
-	ld hl, wMenuJoypadFilter
-	and [hl]
-	jr ContinueGettingMenuJoypad
-
-GetStaticMenuJoypad::
-	xor a
-	ld [wMenuJoypad], a
-	call StaticMenuJoypad
-
-ContinueGettingMenuJoypad:
-	bit A_BUTTON_F, a
-	jr nz, .a_button
-	bit B_BUTTON_F, a
-	jr nz, .b_start
-	bit START_F, a
-	jr nz, .b_start
-	bit D_RIGHT_F, a
-	jr nz, .d_right
-	bit D_LEFT_F, a
-	jr nz, .d_left
-	xor a
-	ld [wMenuJoypad], a
-	jr .done
-
-.d_right
-	ld a, D_RIGHT
-	ld [wMenuJoypad], a
-	jr .done
-
-.d_left
-	ld a, D_LEFT
-	ld [wMenuJoypad], a
-	jr .done
-
-.a_button
-	ld a, A_BUTTON
-	ld [wMenuJoypad], a
-
-.done
-	call GetMenuIndexSet
-	ld a, [wMenuCursorY]
-	ld l, a
-	ld h, $0
-	add hl, de
-	ld a, [hl]
-	ld [wMenuSelection], a
-	ld a, [wMenuCursorY]
-	ld [wMenuCursorBuffer], a
-	and a
-	ret
-
-.b_start
-	ld a, B_BUTTON
-	ld [wMenuJoypad], a
-	ld a, -1
-	ld [wMenuSelection], a
-	scf
-	ret
-
-PlaceMenuStrings::
-	push de
-	ld hl, wMenuDataPointerTableAddr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [wMenuSelection]
-	call GetNthString
-	ld d, h
-	ld e, l
-	pop hl
-	call PlaceString
-	ret
-
-PlaceNthMenuStrings::
-	push de
-	ld a, [wMenuSelection]
-	call GetMenuDataPointerTableEntry
-	inc hl
-	inc hl
-	ld a, [hli]
-	ld d, [hl]
-	ld e, a
-	pop hl
-	call PlaceString
-	ret
-
-Unreferenced_Function1f9e::
-	call GetMenuDataPointerTableEntry
-	inc hl
-	inc hl
-	ld a, [hli]
-	ld d, [hl]
-	ld e, a
-	ret
-
-MenuJumptable::
-	ld a, [wMenuSelection]
-	call GetMenuDataPointerTableEntry
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-
-GetMenuDataPointerTableEntry::
-	ld e, a
-	ld d, $0
-	ld hl, wMenuDataPointerTableAddr
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	add hl, de
-	add hl, de
-	add hl, de
-	ret
-
-ClearWindowData::
-	ld hl, wWindowStackPointer
-	call .bytefill
-	ld hl, wMenuHeader
-	call .bytefill
-	ld hl, wMenuDataFlags
-	call .bytefill
-	ld hl, w2DMenuCursorInitY
-	call .bytefill
-
-	ldh a, [rSVBK]
-	push af
-	ld a, BANK(wWindowStack)
-	ldh [rSVBK], a
-
-	xor a
-	ld hl, wWindowStackBottom
-	ld [hld], a
-	ld [hld], a
-	ld a, l
-	ld [wWindowStackPointer], a
-	ld a, h
-	ld [wWindowStackPointer + 1], a
-
-	pop af
-	ldh [rSVBK], a
-	ret
-
-.bytefill
-	ld bc, $10
-	xor a
-	call ByteFill
-	ret
-
-MenuClickSound::
-	push af
-	and A_BUTTON | B_BUTTON
-	jr z, .nosound
-	ld hl, wMenuFlags
-	bit 3, [hl]
-	jr nz, .nosound
-	call PlayClickSFX
-.nosound
-	pop af
-	ret
-
-PlayClickSFX::
-	push de
-	ld de, SFX_READ_TEXT_2
-	call PlaySFX
-	pop de
-	ret
-
-MenuTextboxWaitButton::
-	call MenuTextbox
-	call WaitButton
-	call ExitMenu
-	ret
-
-Place2DMenuItemName::
-	ldh [hBuffer], a
-	ldh a, [hROMBank]
-	push af
-	ldh a, [hBuffer]
-	rst Bankswitch
-
-	call PlaceString
-	pop af
-	rst Bankswitch
-
-	ret
-
-_2DMenu::
-	ldh a, [hROMBank]
-	ld [wMenuData_2DMenuItemStringsBank], a
-	farcall _2DMenu_
-	ld a, [wMenuCursorBuffer]
-	ret
-
-InterpretBattleMenu::
-	ldh a, [hROMBank]
-	ld [wMenuData_2DMenuItemStringsBank], a
-	farcall _InterpretBattleMenu
-	ld a, [wMenuCursorBuffer]
-	ret
-
-InterpretMobileMenu::
-	ldh a, [hROMBank]
-	ld [wMenuData_2DMenuItemStringsBank], a
-	farcall _InterpretMobileMenu
-	ld a, [wMenuCursorBuffer]
-	ret
--- a/home/menu_window.asm
+++ /dev/null
@@ -1,242 +1,0 @@
-PushWindow::
-	callfar _PushWindow
-	ret
-
-ExitMenu::
-	push af
-	callfar _ExitMenu
-	pop af
-	ret
-
-InitVerticalMenuCursor::
-	callfar _InitVerticalMenuCursor
-	ret
-
-CloseWindow::
-	push af
-	call ExitMenu
-	call ApplyTilemap
-	call UpdateSprites
-	pop af
-	ret
-
-RestoreTileBackup::
-	call MenuBoxCoord2Tile
-	call .copy
-	call MenuBoxCoord2Attr
-	call .copy
-	ret
-
-.copy
-	call GetMenuBoxDims
-	inc b
-	inc c
-
-.row
-	push bc
-	push hl
-
-.col
-	ld a, [de]
-	ld [hli], a
-	dec de
-	dec c
-	jr nz, .col
-
-	pop hl
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .row
-
-	ret
-
-PopWindow::
-	ld b, $10
-	ld de, wMenuFlags
-.loop
-	ld a, [hld]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .loop
-	ret
-
-GetMenuBoxDims::
-	ld a, [wMenuBorderTopCoord] ; top
-	ld b, a
-	ld a, [wMenuBorderBottomCoord] ; bottom
-	sub b
-	ld b, a
-	ld a, [wMenuBorderLeftCoord] ; left
-	ld c, a
-	ld a, [wMenuBorderRightCoord] ; right
-	sub c
-	ld c, a
-	ret
-
-CopyMenuData::
-	push hl
-	push de
-	push bc
-	push af
-	ld hl, wMenuDataPointer
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld de, wMenuDataFlags
-	ld bc, wMenuDataEnd - wMenuDataFlags
-	call CopyBytes
-	pop af
-	pop bc
-	pop de
-	pop hl
-	ret
-
-GetWindowStackTop::
-	ld hl, wWindowStackPointer
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	inc hl
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ret
-
-PlaceVerticalMenuItems::
-	call CopyMenuData
-	ld hl, wMenuDataPointer
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	call GetMenuTextStartCoord
-	call Coord2Tile ; hl now contains the tilemap address where we will start printing text.
-	inc de
-	ld a, [de] ; Number of items
-	inc de
-	ld b, a
-.loop
-	push bc
-	call PlaceString
-	inc de
-	ld bc, 2 * SCREEN_WIDTH
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .loop
-
-	ld a, [wMenuDataFlags]
-	bit 4, a
-	ret z
-
-	call MenuBoxCoord2Tile
-	ld a, [de]
-	ld c, a
-	inc de
-	ld b, $0
-	add hl, bc
-	jp PlaceString
-
-MenuBox::
-	call MenuBoxCoord2Tile
-	call GetMenuBoxDims
-	dec b
-	dec c
-	jp Textbox
-
-GetMenuTextStartCoord::
-	ld a, [wMenuBorderTopCoord]
-	ld b, a
-	inc b
-	ld a, [wMenuBorderLeftCoord]
-	ld c, a
-	inc c
-; bit 6: if not set, leave extra room on top
-	ld a, [wMenuDataFlags]
-	bit 6, a
-	jr nz, .bit_6_set
-	inc b
-
-.bit_6_set
-; bit 7: if set, leave extra room on the left
-	ld a, [wMenuDataFlags]
-	bit 7, a
-	jr z, .bit_7_clear
-	inc c
-
-.bit_7_clear
-	ret
-
-ClearMenuBoxInterior::
-	call MenuBoxCoord2Tile
-	ld bc, SCREEN_WIDTH + 1
-	add hl, bc
-	call GetMenuBoxDims
-	dec b
-	dec c
-	call ClearBox
-	ret
-
-ClearWholeMenuBox::
-	call MenuBoxCoord2Tile
-	call GetMenuBoxDims
-	inc c
-	inc b
-	call ClearBox
-	ret
-
-MenuBoxCoord2Tile::
-	ld a, [wMenuBorderLeftCoord]
-	ld c, a
-	ld a, [wMenuBorderTopCoord]
-	ld b, a
-
-Coord2Tile::
-; Return the address of wTilemap(c, b) in hl.
-	xor a
-	ld h, a
-	ld l, b
-	ld a, c
-	ld b, h
-	ld c, l
-	add hl, hl
-	add hl, hl
-	add hl, bc
-	add hl, hl
-	add hl, hl
-	ld c, a
-	xor a
-	ld b, a
-	add hl, bc
-	bccoord 0, 0
-	add hl, bc
-	ret
-
-MenuBoxCoord2Attr::
-	ld a, [wMenuBorderLeftCoord]
-	ld c, a
-	ld a, [wMenuBorderTopCoord]
-	ld b, a
-
-Coord2Attr::
-; Return the address of wAttrmap(c, b) in hl.
-	xor a
-	ld h, a
-	ld l, b
-	ld a, c
-	ld b, h
-	ld c, l
-	add hl, hl
-	add hl, hl
-	add hl, bc
-	add hl, hl
-	add hl, hl
-	ld c, a
-	xor a
-	ld b, a
-	add hl, bc
-	bccoord 0, 0, wAttrmap
-	add hl, bc
-	ret
--- a/home/mon_data.asm
+++ /dev/null
@@ -1,87 +1,0 @@
-Unreferenced_GetNthMove::
-	ld hl, wListMoves_MoveIndicesBuffer
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	ret
-
-GetBaseData::
-	push bc
-	push de
-	push hl
-	ldh a, [hROMBank]
-	push af
-	ld a, BANK(BaseData)
-	rst Bankswitch
-
-; Egg doesn't have BaseData
-	ld a, [wCurSpecies]
-	cp EGG
-	jr z, .egg
-
-; Get BaseData
-	dec a
-	ld bc, BASE_DATA_SIZE
-	ld hl, BaseData
-	call AddNTimes
-	ld de, wCurBaseData
-	ld bc, BASE_DATA_SIZE
-	call CopyBytes
-	jr .end
-
-.egg
-	ld de, UnknownEggPic
-
-; Sprite dimensions
-	ld b, $55 ; 5x5
-	ld hl, wBasePicSize
-	ld [hl], b
-
-; Beta front and back sprites
-; (see pokegold-spaceworld's data/pokemon/base_stats/*)
-	ld hl, wBaseUnusedFrontpic
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	inc hl
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	jr .end ; useless
-
-.end
-; Replace Pokedex # with species
-	ld a, [wCurSpecies]
-	ld [wBaseDexNo], a
-
-	pop af
-	rst Bankswitch
-	pop hl
-	pop de
-	pop bc
-	ret
-
-GetCurNick::
-	ld a, [wCurPartyMon]
-	ld hl, wPartyMonNicknames
-
-GetNick::
-; Get nickname a from list hl.
-
-	push hl
-	push bc
-
-	call SkipNames
-	ld de, wStringBuffer1
-
-	push de
-	ld bc, MON_NAME_LENGTH
-	call CopyBytes
-	pop de
-
-	callfar CorrectNickErrors
-
-	pop bc
-	pop hl
-	ret
--- a/home/mon_party.asm
+++ /dev/null
@@ -1,34 +1,0 @@
-GetPartyParamLocation::
-; Get the location of parameter a from wCurPartyMon in hl
-	push bc
-	ld hl, wPartyMons
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [wCurPartyMon]
-	call GetPartyLocation
-	pop bc
-	ret
-
-GetPartyLocation::
-; Add the length of a PartyMon struct to hl a times.
-	ld bc, PARTYMON_STRUCT_LENGTH
-	jp AddNTimes
-
-Unreferenced_GetDexNumber::
-; Probably used in gen 1 to convert index number to dex number
-; Not required in gen 2 because index number == dex number
-	push hl
-	ld a, b
-	dec a
-	ld b, 0
-	add hl, bc
-	ld hl, BaseData + BASE_DEX_NO
-	ld bc, BASE_DATA_SIZE
-	call AddNTimes
-	ld a, BANK(BaseData)
-	call GetFarHalfword
-	ld b, l
-	ld c, h
-	pop hl
-	ret
--- a/home/mon_stats.asm
+++ /dev/null
@@ -1,104 +1,0 @@
-IsAPokemon::
-; Return carry if species a is not a Pokemon.
-	and a
-	jr z, .NotAPokemon
-	cp EGG
-	jr z, .Pokemon
-	cp NUM_POKEMON + 1
-	jr c, .Pokemon
-
-.NotAPokemon:
-	scf
-	ret
-
-.Pokemon:
-	and a
-	ret
-
-DrawBattleHPBar::
-; Draw an HP bar d tiles long at hl
-; Fill it up to e pixels
-
-	push hl
-	push de
-	push bc
-
-; Place 'HP:'
-	ld a, $60
-	ld [hli], a
-	ld a, $61
-	ld [hli], a
-
-; Draw a template
-	push hl
-	ld a, $62 ; empty bar
-.template
-	ld [hli], a
-	dec d
-	jr nz, .template
-	ld a, $6b ; bar end
-	add b
-	ld [hl], a
-	pop hl
-
-; Safety check # pixels
-	ld a, e
-	and a
-	jr nz, .fill
-	ld a, c
-	and a
-	jr z, .done
-	ld e, 1
-
-.fill
-; Keep drawing tiles until pixel length is reached
-	ld a, e
-	sub TILE_WIDTH
-	jr c, .lastbar
-
-	ld e, a
-	ld a, $6a ; full bar
-	ld [hli], a
-	ld a, e
-	and a
-	jr z, .done
-	jr .fill
-
-.lastbar
-	ld a, $62  ; empty bar
-	add e      ; + e
-	ld [hl], a
-
-.done
-	pop bc
-	pop de
-	pop hl
-	ret
-
-PrepMonFrontpic::
-	ld a, $1
-	ld [wBoxAlignment], a
-
-_PrepMonFrontpic::
-	ld a, [wCurPartySpecies]
-	call IsAPokemon
-	jr c, .not_pokemon
-
-	push hl
-	ld de, vTiles2
-	predef GetMonFrontpic
-	pop hl
-	xor a
-	ldh [hGraphicStartTile], a
-	lb bc, 7, 7
-	predef PlaceGraphic
-	xor a
-	ld [wBoxAlignment], a
-	ret
-
-.not_pokemon
-	xor a
-	ld [wBoxAlignment], a
-	inc a
-	ld [wCurPartySpecies], a
-	ret
--- /dev/null
+++ b/home/pokemon.asm
@@ -1,0 +1,323 @@
+IsAPokemon::
+; Return carry if species a is not a Pokemon.
+	and a
+	jr z, .NotAPokemon
+	cp EGG
+	jr z, .Pokemon
+	cp NUM_POKEMON + 1
+	jr c, .Pokemon
+
+.NotAPokemon:
+	scf
+	ret
+
+.Pokemon:
+	and a
+	ret
+
+DrawBattleHPBar::
+; Draw an HP bar d tiles long at hl
+; Fill it up to e pixels
+
+	push hl
+	push de
+	push bc
+
+; Place 'HP:'
+	ld a, $60
+	ld [hli], a
+	ld a, $61
+	ld [hli], a
+
+; Draw a template
+	push hl
+	ld a, $62 ; empty bar
+.template
+	ld [hli], a
+	dec d
+	jr nz, .template
+	ld a, $6b ; bar end
+	add b
+	ld [hl], a
+	pop hl
+
+; Safety check # pixels
+	ld a, e
+	and a
+	jr nz, .fill
+	ld a, c
+	and a
+	jr z, .done
+	ld e, 1
+
+.fill
+; Keep drawing tiles until pixel length is reached
+	ld a, e
+	sub TILE_WIDTH
+	jr c, .lastbar
+
+	ld e, a
+	ld a, $6a ; full bar
+	ld [hli], a
+	ld a, e
+	and a
+	jr z, .done
+	jr .fill
+
+.lastbar
+	ld a, $62  ; empty bar
+	add e      ; + e
+	ld [hl], a
+
+.done
+	pop bc
+	pop de
+	pop hl
+	ret
+
+PrepMonFrontpic::
+	ld a, $1
+	ld [wBoxAlignment], a
+
+_PrepMonFrontpic::
+	ld a, [wCurPartySpecies]
+	call IsAPokemon
+	jr c, .not_pokemon
+
+	push hl
+	ld de, vTiles2
+	predef GetMonFrontpic
+	pop hl
+	xor a
+	ldh [hGraphicStartTile], a
+	lb bc, 7, 7
+	predef PlaceGraphic
+	xor a
+	ld [wBoxAlignment], a
+	ret
+
+.not_pokemon
+	xor a
+	ld [wBoxAlignment], a
+	inc a
+	ld [wCurPartySpecies], a
+	ret
+
+PlayStereoCry::
+	push af
+	ld a, 1
+	ld [wStereoPanningMask], a
+	pop af
+	call _PlayMonCry
+	call WaitSFX
+	ret
+
+PlayStereoCry2::
+; Don't wait for the cry to end.
+; Used during pic animations.
+	push af
+	ld a, 1
+	ld [wStereoPanningMask], a
+	pop af
+	jp _PlayMonCry
+
+PlayMonCry::
+	call PlayMonCry2
+	call WaitSFX
+	ret
+
+PlayMonCry2::
+; Don't wait for the cry to end.
+	push af
+	xor a
+	ld [wStereoPanningMask], a
+	ld [wCryTracks], a
+	pop af
+	call _PlayMonCry
+	ret
+
+_PlayMonCry::
+	push hl
+	push de
+	push bc
+
+	call GetCryIndex
+	jr c, .done
+
+	ld e, c
+	ld d, b
+	call PlayCry
+
+.done
+	pop bc
+	pop de
+	pop hl
+	ret
+
+LoadCry::
+; Load cry bc.
+
+	call GetCryIndex
+	ret c
+
+	ldh a, [hROMBank]
+	push af
+	ld a, BANK(PokemonCries)
+	rst Bankswitch
+
+	ld hl, PokemonCries
+rept 6 ; sizeof(mon_cry)
+	add hl, bc
+endr
+
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc hl
+
+	ld a, [hli]
+	ld [wCryPitch], a
+	ld a, [hli]
+	ld [wCryPitch + 1], a
+	ld a, [hli]
+	ld [wCryLength], a
+	ld a, [hl]
+	ld [wCryLength + 1], a
+
+	pop af
+	rst Bankswitch
+	and a
+	ret
+
+GetCryIndex::
+	and a
+	jr z, .no
+	cp NUM_POKEMON + 1
+	jr nc, .no
+
+	dec a
+	ld c, a
+	ld b, 0
+	and a
+	ret
+
+.no
+	scf
+	ret
+
+PrintLevel::
+; Print wTempMonLevel at hl
+
+	ld a, [wTempMonLevel]
+	ld [hl], "<LV>"
+	inc hl
+
+; How many digits?
+	ld c, 2
+	cp 100 ; This is distinct from MAX_LEVEL.
+	jr c, Print8BitNumLeftAlign
+
+; 3-digit numbers overwrite the :L.
+	dec hl
+	inc c
+	jr Print8BitNumLeftAlign
+
+PrintLevel_Force3Digits::
+; Print :L and all 3 digits
+	ld [hl], "<LV>"
+	inc hl
+	ld c, 3
+
+Print8BitNumLeftAlign::
+	ld [wDeciramBuffer], a
+	ld de, wDeciramBuffer
+	ld b, PRINTNUM_LEFTALIGN | 1
+	jp PrintNum
+
+Unreferenced_GetNthMove::
+	ld hl, wListMoves_MoveIndicesBuffer
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	ret
+
+GetBaseData::
+	push bc
+	push de
+	push hl
+	ldh a, [hROMBank]
+	push af
+	ld a, BANK(BaseData)
+	rst Bankswitch
+
+; Egg doesn't have BaseData
+	ld a, [wCurSpecies]
+	cp EGG
+	jr z, .egg
+
+; Get BaseData
+	dec a
+	ld bc, BASE_DATA_SIZE
+	ld hl, BaseData
+	call AddNTimes
+	ld de, wCurBaseData
+	ld bc, BASE_DATA_SIZE
+	call CopyBytes
+	jr .end
+
+.egg
+	ld de, UnknownEggPic
+
+; Sprite dimensions
+	ld b, $55 ; 5x5
+	ld hl, wBasePicSize
+	ld [hl], b
+
+; Beta front and back sprites
+; (see pokegold-spaceworld's data/pokemon/base_stats/*)
+	ld hl, wBaseUnusedFrontpic
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	inc hl
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	jr .end ; useless
+
+.end
+; Replace Pokedex # with species
+	ld a, [wCurSpecies]
+	ld [wBaseDexNo], a
+
+	pop af
+	rst Bankswitch
+	pop hl
+	pop de
+	pop bc
+	ret
+
+GetCurNick::
+	ld a, [wCurPartyMon]
+	ld hl, wPartyMonNicknames
+
+GetNick::
+; Get nickname a from list hl.
+
+	push hl
+	push bc
+
+	call SkipNames
+	ld de, wStringBuffer1
+
+	push de
+	ld bc, MON_NAME_LENGTH
+	call CopyBytes
+	pop de
+
+	callfar CorrectNickErrors
+
+	pop bc
+	pop hl
+	ret
--- a/home/print_level.asm
+++ /dev/null
@@ -1,28 +1,0 @@
-PrintLevel::
-; Print wTempMonLevel at hl
-
-	ld a, [wTempMonLevel]
-	ld [hl], "<LV>"
-	inc hl
-
-; How many digits?
-	ld c, 2
-	cp 100 ; This is distinct from MAX_LEVEL.
-	jr c, Print8BitNumLeftAlign
-
-; 3-digit numbers overwrite the :L.
-	dec hl
-	inc c
-	jr Print8BitNumLeftAlign
-
-PrintLevel_Force3Digits::
-; Print :L and all 3 digits
-	ld [hl], "<LV>"
-	inc hl
-	ld c, 3
-
-Print8BitNumLeftAlign::
-	ld [wDeciramBuffer], a
-	ld de, wDeciramBuffer
-	ld b, PRINTNUM_LEFTALIGN | 1
-	jp PrintNum