diff --git a/home.asm b/home.asm index 4cad2b2f6..0fe6bd706 100644 --- a/home.asm +++ b/home.asm @@ -39,8 +39,6 @@ INCLUDE "home/map_objects.asm" 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/names.asm" 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" diff --git a/home/battle.asm b/home/battle.asm index fff6b7d42..77ec0b026 100644 --- 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] diff --git a/home/cry.asm b/home/cry.asm deleted file mode 100644 index 856134b3e..000000000 --- a/home/cry.asm +++ /dev/null @@ -1,101 +0,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 diff --git a/home/menu.asm b/home/menu.asm index 412955b28..ae9696815 100644 --- a/home/menu.asm +++ b/home/menu.asm @@ -60,3 +60,784 @@ HideCursor:: 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 diff --git a/home/menu2.asm b/home/menu2.asm deleted file mode 100644 index 4debb11ad..000000000 --- a/home/menu2.asm +++ /dev/null @@ -1,539 +0,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 diff --git a/home/menu_window.asm b/home/menu_window.asm deleted file mode 100644 index d66485041..000000000 --- a/home/menu_window.asm +++ /dev/null @@ -1,242 +0,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 diff --git a/home/mon_data.asm b/home/mon_data.asm deleted file mode 100644 index f365f019c..000000000 --- a/home/mon_data.asm +++ /dev/null @@ -1,87 +0,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 diff --git a/home/mon_party.asm b/home/mon_party.asm deleted file mode 100644 index 99169eaa8..000000000 --- a/home/mon_party.asm +++ /dev/null @@ -1,34 +0,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 diff --git a/home/mon_stats.asm b/home/mon_stats.asm deleted file mode 100644 index d064d4798..000000000 --- a/home/mon_stats.asm +++ /dev/null @@ -1,104 +0,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 diff --git a/home/pokemon.asm b/home/pokemon.asm new file mode 100644 index 000000000..e1d39bb9d --- /dev/null +++ b/home/pokemon.asm @@ -0,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], "" + 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], "" + 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 diff --git a/home/print_level.asm b/home/print_level.asm deleted file mode 100644 index bdd11aabb..000000000 --- a/home/print_level.asm +++ /dev/null @@ -1,28 +0,0 @@ -PrintLevel:: -; Print wTempMonLevel at hl - - ld a, [wTempMonLevel] - ld [hl], "" - 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], "" - inc hl - ld c, 3 - -Print8BitNumLeftAlign:: - ld [wDeciramBuffer], a - ld de, wDeciramBuffer - ld b, PRINTNUM_LEFTALIGN | 1 - jp PrintNum