diff options
Diffstat (limited to 'home/text_script.asm')
-rw-r--r-- | home/text_script.asm | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/home/text_script.asm b/home/text_script.asm new file mode 100644 index 00000000..1847e23b --- /dev/null +++ b/home/text_script.asm @@ -0,0 +1,225 @@ +; this function is used to display sign messages, sprite dialog, etc. +; INPUT: [hSpriteIndexOrTextID] = sprite ID or text ID +DisplayTextID:: + ldh a, [hLoadedROMBank] + push af + farcall DisplayTextIDInit ; initialization + ld hl, wTextPredefFlag + bit 0, [hl] + res 0, [hl] + jr nz, .skipSwitchToMapBank + ld a, [wCurMap] + call SwitchToMapRomBank +.skipSwitchToMapBank + ld a, 30 ; half a second + ldh [hFrameCounter], a ; used as joypad poll timer + ld hl, wMapTextPtr + ld a, [hli] + ld h, [hl] + ld l, a ; hl = map text pointer + ld d, $00 + ldh a, [hSpriteIndexOrTextID] ; text ID + ld [wSpriteIndex], a + + dict TEXT_START_MENU, DisplayStartMenu + dict TEXT_PIKACHU_ANIM, DisplayPikachuEmotion + dict TEXT_SAFARI_GAME_OVER, DisplaySafariGameOverText + dict TEXT_MON_FAINTED, DisplayPokemonFaintedText + dict TEXT_BLACKED_OUT, DisplayPlayerBlackedOutText + dict TEXT_REPEL_WORE_OFF, DisplayRepelWoreOffText + + ld a, [wNumSprites] + ld e, a + ldh a, [hSpriteIndexOrTextID] ; sprite ID + cp e + jr z, .spriteHandling + jr nc, .skipSpriteHandling +.spriteHandling +; get the text ID of the sprite + push hl + ;push de + ;push bc + ;farcall UpdateSpriteFacingOffsetAndDelayMovement ; update the graphics of the sprite the player is talking to (to face the right direction) + ;pop bc + ;pop de + ld hl, wMapSpriteData ; NPC text entries + ldh a, [hSpriteIndexOrTextID] + dec a + add a + ld e, a + ld d, $0 + add hl, de + inc hl + ld a, [hl] ; a = text ID of the sprite + pop hl +.skipSpriteHandling +; look up the address of the text in the map's text entries + dec a + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a ; hl = address of the text + ld a, [hl] ; a = first byte of text + +; check first byte of text for special cases + +dict2: MACRO + cp \1 + jr nz, .not\@ + \2 + jr AfterDisplayingTextID +.not\@ +ENDM + + dict TX_SCRIPT_MART, DisplayPokemartDialogue + dict TX_SCRIPT_POKECENTER_NURSE, DisplayPokemonCenterDialogue + dict TX_SCRIPT_PLAYERS_PC, TextScript_ItemStoragePC + dict TX_SCRIPT_BILLS_PC, TextScript_BillsPC + dict TX_SCRIPT_POKECENTER_PC, TextScript_PokemonCenterPC + dict2 TX_SCRIPT_VENDING_MACHINE, farcall VendingMachineMenu + dict TX_SCRIPT_PRIZE_VENDOR, TextScript_GameCornerPrizeMenu + dict2 TX_SCRIPT_CABLE_CLUB_RECEPTIONIST, callfar CableClubNPC + + call PrintText_NoCreatingTextBox ; display the text + ld a, [wDoNotWaitForButtonPressAfterDisplayingText] + and a + jr nz, HoldTextDisplayOpen + +AfterDisplayingTextID:: + ld a, [wEnteringCableClub] + and a + jr nz, HoldTextDisplayOpen + call WaitForTextScrollButtonPress ; wait for a button press after displaying all the text + +; loop to hold the dialogue box open as long as the player keeps holding down the A button +HoldTextDisplayOpen:: + call Joypad + ldh a, [hJoyHeld] + bit 0, a ; is the A button being pressed? + jr nz, HoldTextDisplayOpen + +CloseTextDisplay:: + ld a, [wCurMap] + call SwitchToMapRomBank + ld a, $90 + ldh [hWY], a ; move the window off the screen + call DelayFrame + call LoadGBPal + xor a + ldh [hAutoBGTransferEnabled], a ; disable continuous WRAM to VRAM transfer each V-blank +; loop to make sprites face the directions they originally faced before the dialogue + ld hl, wSprite01StateData2OrigFacingDirection + ld c, $0f + ld de, $10 +.restoreSpriteFacingDirectionLoop + ld a, [hl] ; x#SPRITESTATEDATA2_ORIGFACINGDIRECTION + dec h + ld [hl], a ; [x#SPRITESTATEDATA1_FACINGDIRECTION] + inc h + add hl, de + dec c + jr nz, .restoreSpriteFacingDirectionLoop + call InitMapSprites ; reload sprite tile pattern data (since it was partially overwritten by text tile patterns) + ld hl, wFontLoaded + res 0, [hl] + ld a, [wd732] + bit 3, a ; used fly warp + call z, LoadPlayerSpriteGraphics + call LoadCurrentMapView + pop af + call BankswitchCommon + jp UpdateSprites + +DisplayPokemartDialogue:: + push hl + ld hl, PokemartGreetingText + call PrintText + pop hl + inc hl + call LoadItemList + ld a, PRICEDITEMLISTMENU + ld [wListMenuID], a + homecall DisplayPokemartDialogue_ + jp AfterDisplayingTextID + +PokemartGreetingText:: + text_far _PokemartGreetingText + text_end + +LoadItemList:: + ld a, 1 + ld [wUpdateSpritesEnabled], a + ld a, h + ld [wItemListPointer], a + ld a, l + ld [wItemListPointer + 1], a + ld de, wItemList +.loop + ld a, [hli] + ld [de], a + inc de + cp $ff + jr nz, .loop + ret + +DisplayPokemonCenterDialogue:: +; zeroing these doesn't appear to serve any purpose + xor a + ldh [hItemPrice], a + ldh [hItemPrice + 1], a + ldh [hItemPrice + 2], a + + inc hl + homecall DisplayPokemonCenterDialogue_ + jp AfterDisplayingTextID + +DisplaySafariGameOverText:: + callfar PrintSafariGameOverText + jp AfterDisplayingTextID + +DisplayPokemonFaintedText:: + ld hl, PokemonFaintedText + call PrintText + jp AfterDisplayingTextID + +PokemonFaintedText:: + text_far _PokemonFaintedText + text_end + +DisplayPlayerBlackedOutText:: + ld hl, PlayerBlackedOutText + call PrintText + ld a, [wd732] + res 5, a ; reset forced to use bike bit + ld [wd732], a + CheckEvent EVENT_IN_SAFARI_ZONE + jr z, .didnotblackoutinsafari + xor a + ld [wNumSafariBalls], a + ld [wSafariSteps], a + ld [wSafariSteps + 1], a + EventFlagAddressa EVENT_IN_SAFARI_ZONE + ld [wcf0d], a + ld [wSafariZoneGateCurScript], a +.didnotblackoutinsafari + jp HoldTextDisplayOpen + +PlayerBlackedOutText:: + text_far _PlayerBlackedOutText + text_end + +DisplayRepelWoreOffText:: + ld hl, RepelWoreOffText + call PrintText + jp AfterDisplayingTextID + +RepelWoreOffText:: + text_far _RepelWoreOffText + text_end + +DisplayPikachuEmotion:: + callfar TalkToPikachu + jp CloseTextDisplay |