ref: b2970e75f4d1a7a2bc7ac58a656ffd350a80cf0a
dir: /engine/radio.asm/
PlayRadioShow: ; If we're already in the radio program proper, we don't need to be here. ld a, [wCurrentRadioLine] cp POKE_FLUTE_RADIO jr nc, .ok ; If Team Rocket is not occupying the radio tower, we don't need to be here. ld a, [wStatusFlags2] bit STATUSFLAGS2_ROCKETS_IN_RADIO_TOWER_F, a jr z, .ok ; If we're in Kanto, we don't need to be here. call IsInJohto and a jr nz, .ok ; Team Rocket broadcasts on all stations. ld a, ROCKET_RADIO ld [wCurrentRadioLine], a .ok ; Jump to the currently loaded station. The index to which we need to jump is in wCurrentRadioLine. ld a, [wCurrentRadioLine] ld e, a ld d, 0 ld hl, RadioJumptable add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl RadioJumptable: ; entries correspond to constants/radio_constants.asm dw OaksPkmnTalk1 ; $00 dw PokedexShow1 ; $01 dw BenMonMusic1 ; $02 dw LuckyNumberShow1 ; $03 dw BuenasPassword1 ; $04 dw PeoplePlaces1 ; $05 dw FernMonMusic1 ; $06 dw RocketRadio1 ; $07 dw PokeFluteRadio ; $08 dw UnownRadio ; $09 dw EvolutionRadio ; $0a ; OaksPkmnTalk dw OaksPkmnTalk2 ; $0b dw OaksPkmnTalk3 ; $0c dw OaksPkmnTalk4 ; $0d dw OaksPkmnTalk5 ; $0e dw OaksPkmnTalk6 ; $0f dw OaksPkmnTalk7 ; $10 dw OaksPkmnTalk8 ; $11 dw OaksPkmnTalk9 ; $12 dw PokedexShow2 ; $13 dw PokedexShow3 ; $14 dw PokedexShow4 ; $15 dw PokedexShow5 ; $16 ; Ben Music dw BenMonMusic2 ; $17 dw BenMonMusic3 ; $18 dw BenFernMusic4 ; $19 dw BenFernMusic5 ; $1a dw BenFernMusic6 ; $1b dw BenFernMusic7 ; $1c dw FernMonMusic2 ; $1d ; Lucky Number Show dw LuckyNumberShow2 ; $1e dw LuckyNumberShow3 ; $1f dw LuckyNumberShow4 ; $20 dw LuckyNumberShow5 ; $21 dw LuckyNumberShow6 ; $22 dw LuckyNumberShow7 ; $23 dw LuckyNumberShow8 ; $24 dw LuckyNumberShow9 ; $25 dw LuckyNumberShow10 ; $26 dw LuckyNumberShow11 ; $27 dw LuckyNumberShow12 ; $28 dw LuckyNumberShow13 ; $29 dw LuckyNumberShow14 ; $2a dw LuckyNumberShow15 ; $2b ; People & Places dw PeoplePlaces2 ; $2c dw PeoplePlaces3 ; $2d dw PeoplePlaces4 ; $2e dw PeoplePlaces5 ; $2f dw PeoplePlaces6 ; $30 dw PeoplePlaces7 ; $31 ; Rocket Radio dw RocketRadio2 ; $32 dw RocketRadio3 ; $33 dw RocketRadio4 ; $34 dw RocketRadio5 ; $35 dw RocketRadio6 ; $36 dw RocketRadio7 ; $37 dw RocketRadio8 ; $38 dw RocketRadio9 ; $39 dw RocketRadio10 ; $3a ; More Pokemon Channel stuff dw OaksPkmnTalk10 ; $3b dw OaksPkmnTalk11 ; $3c dw OaksPkmnTalk12 ; $3d dw OaksPkmnTalk13 ; $3e dw OaksPkmnTalk14 ; $3f ; Buenas Password dw BuenasPassword2 ; $40 dw BuenasPassword3 ; $41 dw BuenasPassword4 ; $42 dw BuenasPassword5 ; $43 dw BuenasPassword6 ; $44 dw BuenasPassword7 ; $45 dw BuenasPassword8 ; $46 dw BuenasPassword9 ; $47 dw BuenasPassword10 ; $48 dw BuenasPassword11 ; $49 dw BuenasPassword12 ; $4a dw BuenasPassword13 ; $4b dw BuenasPassword14 ; $4c dw BuenasPassword15 ; $4d dw BuenasPassword16 ; $4e dw BuenasPassword17 ; $4f dw BuenasPassword18 ; $50 dw BuenasPassword19 ; $51 dw BuenasPassword20 ; $52 dw BuenasPassword21 ; $53 dw RadioScroll ; $54 ; More Pokemon Channel stuff dw PokedexShow6 ; $55 dw PokedexShow7 ; $56 dw PokedexShow8 ; $57 PrintRadioLine: ld [wNextRadioLine], a ld hl, wRadioText ld a, [wNumRadioLinesPrinted] cp 2 jr nc, .print inc hl ld [hl], TX_START inc a ld [wNumRadioLinesPrinted], a cp 2 jr nz, .print bccoord 1, 16 call PlaceHLTextAtBC jr .skip .print call PrintTextBoxText .skip ld a, RADIO_SCROLL ld [wCurrentRadioLine], a ld a, 100 ld [wRadioTextDelay], a ret ReplacePeriodsWithSpaces: push hl ld b, SCREEN_WIDTH * 2 .loop ld a, [hl] cp "." jr nz, .next ld [hl], " " .next inc hl dec b jr nz, .loop pop hl ret RadioScroll: ld hl, wRadioTextDelay ld a, [hl] and a jr z, .proceed dec [hl] ret .proceed ld a, [wNextRadioLine] ld [wCurrentRadioLine], a ld a, [wNumRadioLinesPrinted] cp 1 call nz, CopyBottomLineToTopLine jp ClearBottomLine OaksPkmnTalk1: ld a, 5 ld [wOaksPkmnTalkSegmentCounter], a call StartRadioStation ld hl, OPT_IntroText1 ld a, OAKS_POKEMON_TALK_2 jp NextRadioLine OaksPkmnTalk2: ld hl, OPT_IntroText2 ld a, OAKS_POKEMON_TALK_3 jp NextRadioLine OaksPkmnTalk3: ld hl, OPT_IntroText3 ld a, OAKS_POKEMON_TALK_4 jp NextRadioLine OaksPkmnTalk4: ; Choose a random route, and a random Pokemon from that route. .sample call Random and %11111 cp (OaksPkmnTalkRoutes.End - OaksPkmnTalkRoutes) / 2 jr nc, .sample ; We now have a number between 0 and 14. ld hl, OaksPkmnTalkRoutes ld c, a ld b, 0 add hl, bc add hl, bc ld b, [hl] inc hl ld c, [hl] ; bc now contains the chosen map's group and number indices. push bc ; Search the JohtoGrassWildMons array for the chosen map. ld hl, JohtoGrassWildMons .loop ld a, BANK(JohtoGrassWildMons) call GetFarByte cp -1 jr z, .overflow inc hl cp b jr nz, .next ld a, BANK(JohtoGrassWildMons) call GetFarByte cp c jr z, .done .next dec hl ld de, GRASS_WILDDATA_LENGTH add hl, de jr .loop .done ; Point hl to the list of morning Pokémon., skipping percentages rept 4 inc hl endr ; Generate a number, either 0, 1, or 2, to choose a time of day. .loop2 call Random maskbits NUM_DAYTIMES cp DARKNESS_F jr z, .loop2 ld bc, 2 * NUM_GRASSMON call AddNTimes .loop3 ; Choose one of the middle three Pokemon. call Random and NUM_GRASSMON cp 2 jr c, .loop3 cp 5 jr nc, .loop3 ld e, a ld d, 0 add hl, de add hl, de inc hl ; skip level ld a, BANK(JohtoGrassWildMons) call GetFarByte ld [wNamedObjectIndexBuffer], a ld [CurPartySpecies], a call GetPokemonName ld hl, StringBuffer1 ld de, wMonOrItemNameBuffer ld bc, MON_NAME_LENGTH call CopyBytes ; Now that we've chosen our wild Pokemon, ; let's recover the map index info and get its name. pop bc call GetWorldMapLocation ld e, a farcall GetLandmarkName ld hl, OPT_OakText1 call CopyRadioTextToRAM ld a, OAKS_POKEMON_TALK_5 jp PrintRadioLine .overflow pop bc ld a, OAKS_POKEMON_TALK jp PrintRadioLine INCLUDE "data/radio/oaks_pkmn_talk_routes.asm" OaksPkmnTalk5: ld hl, OPT_OakText2 ld a, OAKS_POKEMON_TALK_6 jp NextRadioLine OaksPkmnTalk6: ld hl, OPT_OakText3 ld a, OAKS_POKEMON_TALK_7 jp NextRadioLine OPT_IntroText1: ; MARY: PROF.OAK'S text_jump _OPT_IntroText1 db "@" OPT_IntroText2: ; #MON TALK! text_jump _OPT_IntroText2 db "@" OPT_IntroText3: ; With me, MARY! text_jump _OPT_IntroText3 db "@" OPT_OakText1: ; OAK: @ @ text_jump _OPT_OakText1 db "@" OPT_OakText2: ; may be seen around text_jump _OPT_OakText2 db "@" OPT_OakText3: ; @ . text_jump _OPT_OakText3 db "@" OaksPkmnTalk7: ld a, [CurPartySpecies] ld [wNamedObjectIndexBuffer], a call GetPokemonName ld hl, OPT_MaryText1 ld a, OAKS_POKEMON_TALK_8 jp NextRadioLine OPT_MaryText1: ; MARY: @ 's text_jump _OPT_MaryText1 db "@" OaksPkmnTalk8: ; 0-15 are all valid indexes into .Adverbs, ; so no need for a retry loop call Random maskbits NUM_OAKS_MON_TALK_ADVERBS ld e, a ld d, 0 ld hl, .Adverbs add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a ld a, OAKS_POKEMON_TALK_9 jp NextRadioLine .Adverbs: ; there are NUM_OAKS_MON_TALK_ADVERBS entries dw .sweetadorably dw .wigglyslickly dw .aptlynamed dw .undeniablykindof dw .unbearably dw .wowimpressively dw .almostpoisonously dw .sensually dw .mischievously dw .topically dw .addictively dw .looksinwater dw .evolutionmustbe dw .provocatively dw .flippedout dw .heartmeltingly .sweetadorably ; sweet and adorably text_jump OPT_SweetAdorably db "@" .wigglyslickly ; wiggly and slickly text_jump OPT_WigglySlickly db "@" .aptlynamed ; aptly named and text_jump OPT_AptlyNamed db "@" .undeniablykindof ; undeniably kind of text_jump OPT_UndeniablyKindOf db "@" .unbearably ; so, so unbearably text_jump OPT_Unbearably db "@" .wowimpressively ; wow, impressively text_jump OPT_WowImpressively db "@" .almostpoisonously ; almost poisonously text_jump OPT_AlmostPoisonously db "@" .sensually ; ooh, so sensually text_jump OPT_Sensually db "@" .mischievously ; so mischievously text_jump OPT_Mischievously db "@" .topically ; so very topically text_jump OPT_Topically db "@" .addictively ; sure addictively text_jump OPT_Addictively db "@" .looksinwater ; looks in water is text_jump OPT_LooksInWater db "@" .evolutionmustbe ; evolution must be text_jump OPT_EvolutionMustBe db "@" .provocatively ; provocatively text_jump OPT_Provocatively db "@" .flippedout ; so flipped out and text_jump OPT_FlippedOut db "@" .heartmeltingly ; heart-meltingly text_jump OPT_HeartMeltingly db "@" OaksPkmnTalk9: ; 0-15 are all valid indexes into .Adjectives, ; so no need for a retry loop call Random maskbits NUM_OAKS_MON_TALK_ADJECTIVES ld e, a ld d, 0 ld hl, .Adjectives add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a ld a, [wOaksPkmnTalkSegmentCounter] dec a ld [wOaksPkmnTalkSegmentCounter], a ld a, OAKS_POKEMON_TALK_4 jr nz, .ok ld a, 5 ld [wOaksPkmnTalkSegmentCounter], a ld a, OAKS_POKEMON_TALK_10 .ok jp NextRadioLine .Adjectives: ; there are NUM_OAKS_MON_TALK_ADJECTIVES entries dw .cute dw .weird dw .pleasant dw .boldsortof dw .frightening dw .suavedebonair dw .powerful dw .exciting dw .groovy dw .inspiring dw .friendly dw .hothothot dw .stimulating dw .guarded dw .lovely dw .speedy .cute ; cute. text_jump OPT_Cute db "@" .weird ; weird. text_jump OPT_Weird db "@" .pleasant ; pleasant. text_jump OPT_Pleasant db "@" .boldsortof ; bold, sort of. text_jump OPT_BoldSortOf db "@" .frightening ; frightening. text_jump OPT_Frightening db "@" .suavedebonair ; suave & debonair! text_jump OPT_SuaveDebonair db "@" .powerful ; powerful. text_jump OPT_Powerful db "@" .exciting ; exciting. text_jump OPT_Exciting db "@" .groovy ; groovy! text_jump OPT_Groovy db "@" .inspiring ; inspiring. text_jump OPT_Inspiring db "@" .friendly ; friendly. text_jump OPT_Friendly db "@" .hothothot ; hot, hot, hot! text_jump OPT_HotHotHot db "@" .stimulating ; stimulating. text_jump OPT_Stimulating db "@" .guarded ; guarded. text_jump OPT_Guarded db "@" .lovely ; lovely. text_jump OPT_Lovely db "@" .speedy ; speedy. text_jump OPT_Speedy db "@" OaksPkmnTalk10: farcall RadioMusicRestartPokemonChannel ld hl, OPT_RestartText call PrintText call WaitBGMap ld hl, OPT_PokemonChannelText call PrintText ld a, OAKS_POKEMON_TALK_11 ld [wCurrentRadioLine], a ld a, 100 ld [wRadioTextDelay], a ret OPT_PokemonChannelText: ; #MON text_jump _OPT_PokemonChannelText db "@" OPT_RestartText: db "@" OaksPkmnTalk11: ld hl, wRadioTextDelay dec [hl] ret nz hlcoord 9, 14 ld de, .pokemon_string ld a, OAKS_POKEMON_TALK_12 jp PlaceRadioString .pokemon_string db "#MON@" OaksPkmnTalk12: ld hl, wRadioTextDelay dec [hl] ret nz hlcoord 1, 16 ld de, .pokemon_channel_string ld a, OAKS_POKEMON_TALK_13 jp PlaceRadioString .pokemon_channel_string db "#MON Channel@" OaksPkmnTalk13: ld hl, wRadioTextDelay dec [hl] ret nz hlcoord 12, 16 ld de, .terminator ld a, OAKS_POKEMON_TALK_14 jp PlaceRadioString .terminator db "@" OaksPkmnTalk14: ld hl, wRadioTextDelay dec [hl] ret nz ld de, MUSIC_POKEMON_TALK callfar RadioMusicRestartDE ld hl, .terminator call PrintText ld a, OAKS_POKEMON_TALK_4 ld [wNextRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, RADIO_SCROLL ld [wCurrentRadioLine], a ld a, 10 ld [wRadioTextDelay], a ret .terminator db "@" PlaceRadioString: ld [wCurrentRadioLine], a ld a, 100 ld [wRadioTextDelay], a jp PlaceString CopyBottomLineToTopLine: hlcoord 0, 15 decoord 0, 13 ld bc, SCREEN_WIDTH * 2 jp CopyBytes ClearBottomLine: hlcoord 1, 15 ld bc, SCREEN_WIDTH - 2 ld a, " " call ByteFill hlcoord 1, 16 ld bc, SCREEN_WIDTH - 2 ld a, " " jp ByteFill PokedexShow_GetDexEntryBank: push hl push de ld a, [CurPartySpecies] dec a rlca rlca maskbits NUM_DEX_ENTRY_BANKS ld hl, .PokedexEntryBanks ld d, 0 ld e, a add hl, de ld a, [hl] pop de pop hl ret .PokedexEntryBanks db BANK(PokedexEntries1) db BANK(PokedexEntries2) db BANK(PokedexEntries3) db BANK(PokedexEntries4) PokedexShow1: call StartRadioStation .loop call Random cp NUM_POKEMON jr nc, .loop ld c, a push bc ld a, c call CheckCaughtMon pop bc jr z, .loop inc c ld a, c ld [CurPartySpecies], a ld [wNamedObjectIndexBuffer], a call GetPokemonName ld hl, PokedexShowText ld a, POKEDEX_SHOW_2 jp NextRadioLine PokedexShow2: ld a, [CurPartySpecies] dec a ld hl, PokedexDataPointerTable ld c, a ld b, 0 add hl, bc add hl, bc ld a, BANK(PokedexDataPointerTable) call GetFarHalfword call PokedexShow_GetDexEntryBank push af push hl call CopyDexEntryPart1 dec hl ld [hl], "<DONE>" ld hl, wPokedexShowPointerAddr call CopyRadioTextToRAM pop hl pop af call CopyDexEntryPart2 rept 4 inc hl endr ld a, l ld [wPokedexShowPointerAddr], a ld a, h ld [wPokedexShowPointerAddr + 1], a ld a, POKEDEX_SHOW_3 jp PrintRadioLine PokedexShow3: call CopyDexEntry ld a, POKEDEX_SHOW_4 jp PrintRadioLine PokedexShow4: call CopyDexEntry ld a, POKEDEX_SHOW_5 jp PrintRadioLine PokedexShow5: call CopyDexEntry ld a, POKEDEX_SHOW_6 jp PrintRadioLine PokedexShow6: call CopyDexEntry ld a, POKEDEX_SHOW_7 jp PrintRadioLine PokedexShow7: call CopyDexEntry ld a, POKEDEX_SHOW_8 jp PrintRadioLine PokedexShow8: call CopyDexEntry ld a, POKEDEX_SHOW jp PrintRadioLine CopyDexEntry: ld a, [wPokedexShowPointerAddr] ld l, a ld a, [wPokedexShowPointerAddr + 1] ld h, a ld a, [wPokedexShowPointerBank] push af push hl call CopyDexEntryPart1 dec hl ld [hl], "<DONE>" ld hl, wPokedexShowPointerAddr call CopyRadioTextToRAM pop hl pop af call CopyDexEntryPart2 ret CopyDexEntryPart1: ld de, wPokedexShowPointerBank ld bc, SCREEN_WIDTH - 1 call FarCopyBytes ld hl, wPokedexShowPointerAddr ld [hl], TX_START inc hl ld [hl], "<LINE>" inc hl .loop ld a, [hli] cp "@" ret z cp "<NEXT>" ret z cp "<DEXEND>" ret z jr .loop CopyDexEntryPart2: ld d, a .loop ld a, d call GetFarByte inc hl cp "@" jr z, .okay cp "<NEXT>" jr z, .okay cp "<DEXEND>" jr nz, .loop .okay ld a, l ld [wPokedexShowPointerAddr], a ld a, h ld [wPokedexShowPointerAddr + 1], a ld a, d ld [wPokedexShowPointerBank], a ret PokedexShowText: ; @ @ text_jump _PokedexShowText db "@" BenMonMusic1: call StartPokemonMusicChannel ld hl, BenIntroText1 ld a, POKEMON_MUSIC_2 jp NextRadioLine BenMonMusic2: ld hl, BenIntroText2 ld a, POKEMON_MUSIC_3 jp NextRadioLine BenMonMusic3: ld hl, BenIntroText3 ld a, POKEMON_MUSIC_4 jp NextRadioLine FernMonMusic1: call StartPokemonMusicChannel ld hl, FernIntroText1 ld a, LETS_ALL_SING_2 jp NextRadioLine FernMonMusic2: ld hl, FernIntroMusic2 ld a, POKEMON_MUSIC_4 jp NextRadioLine BenFernMusic4: ld hl, BenFernText1 ld a, POKEMON_MUSIC_5 jp NextRadioLine BenFernMusic5: call GetWeekday and 1 ld hl, BenFernText2A jr z, .SunTueThurSun ld hl, BenFernText2B .SunTueThurSun: ld a, POKEMON_MUSIC_6 jp NextRadioLine BenFernMusic6: call GetWeekday and 1 ld hl, BenFernText3A jr z, .SunTueThurSun ld hl, BenFernText3B .SunTueThurSun: ld a, POKEMON_MUSIC_7 jp NextRadioLine BenFernMusic7: ret StartPokemonMusicChannel: call RadioTerminator call PrintText ld de, MUSIC_POKEMON_MARCH call GetWeekday and 1 jr z, .SunTueThurSun ld de, MUSIC_POKEMON_LULLABY .SunTueThurSun: callfar RadioMusicRestartDE ret BenIntroText1: ; BEN: #MON MUSIC text_jump _BenIntroText1 db "@" BenIntroText2: ; CHANNEL! text_jump _BenIntroText2 db "@" BenIntroText3: ; It's me, DJ BEN! text_jump _BenIntroText3 db "@" FernIntroText1: ; FERN: #MUSIC! text_jump _FernIntroText1 db "@" FernIntroMusic2: ; With DJ FERN! text_jump _FernIntroText2 db "@" BenFernText1: ; Today's @ , text_jump _BenFernText1 db "@" BenFernText2A: ; so let us jam to text_jump _BenFernText2A db "@" BenFernText2B: ; so chill out to text_jump _BenFernText2B db "@" BenFernText3A: ; #MON March! text_jump _BenFernText3A db "@" BenFernText3B: ; #MON Lullaby! text_jump _BenFernText3B db "@" LuckyNumberShow1: call StartRadioStation callfar CheckLuckyNumberShowFlag jr nc, .dontreset callfar ResetLuckyNumberShowFlag .dontreset ld hl, LC_Text1 ld a, LUCKY_NUMBER_SHOW_2 jp NextRadioLine LuckyNumberShow2: ld hl, LC_Text2 ld a, LUCKY_NUMBER_SHOW_3 jp NextRadioLine LuckyNumberShow3: ld hl, LC_Text3 ld a, LUCKY_NUMBER_SHOW_4 jp NextRadioLine LuckyNumberShow4: ld hl, LC_Text4 ld a, LUCKY_NUMBER_SHOW_5 jp NextRadioLine LuckyNumberShow5: ld hl, LC_Text5 ld a, LUCKY_NUMBER_SHOW_6 jp NextRadioLine LuckyNumberShow6: ld hl, LC_Text6 ld a, LUCKY_NUMBER_SHOW_7 jp NextRadioLine LuckyNumberShow7: ld hl, LC_Text7 ld a, LUCKY_NUMBER_SHOW_8 jp NextRadioLine LuckyNumberShow8: ld hl, StringBuffer1 ld de, wLuckyIDNumber lb bc, PRINTNUM_LEADINGZEROS | 2, 5 call PrintNum ld a, "@" ld [StringBuffer1 + 5], a ld hl, LC_Text8 ld a, LUCKY_NUMBER_SHOW_9 jp NextRadioLine LuckyNumberShow9: ld hl, LC_Text9 ld a, LUCKY_NUMBER_SHOW_10 jp NextRadioLine LuckyNumberShow10: ld hl, LC_Text7 ld a, LUCKY_NUMBER_SHOW_11 jp NextRadioLine LuckyNumberShow11: ld hl, LC_Text8 ld a, LUCKY_NUMBER_SHOW_12 jp NextRadioLine LuckyNumberShow12: ld hl, LC_Text10 ld a, LUCKY_NUMBER_SHOW_13 jp NextRadioLine LuckyNumberShow13: ld hl, LC_Text11 call Random and a ld a, LUCKY_CHANNEL jr nz, .okay ld a, LUCKY_NUMBER_SHOW_14 .okay jp NextRadioLine LuckyNumberShow14: ld hl, LC_DragText1 ld a, LUCKY_NUMBER_SHOW_15 jp NextRadioLine LuckyNumberShow15: ld hl, LC_DragText2 ld a, LUCKY_CHANNEL jp NextRadioLine LC_Text1: ; REED: Yeehaw! How text_jump _LC_Text1 db "@" LC_Text2: ; y'all doin' now? text_jump _LC_Text2 db "@" LC_Text3: ; Whether you're up text_jump _LC_Text3 db "@" LC_Text4: ; or way down low, text_jump _LC_Text4 db "@" LC_Text5: ; don't you miss the text_jump _LC_Text5 db "@" LC_Text6: ; LUCKY NUMBER SHOW! text_jump _LC_Text6 db "@" LC_Text7: ; This week's Lucky text_jump _LC_Text7 db "@" LC_Text8: ; Number is @ ! text_jump _LC_Text8 db "@" LC_Text9: ; I'll repeat that! text_jump _LC_Text9 db "@" LC_Text10: ; Match it and go to text_jump _LC_Text10 db "@" LC_Text11: ; the RADIO TOWER! text_jump _LC_Text11 db "@" LC_DragText1: ; …Repeating myself text_jump _LC_DragText1 db "@" LC_DragText2: ; gets to be a drag… text_jump _LC_DragText2 db "@" PeoplePlaces1: call StartRadioStation ld hl, PnP_Text1 ld a, PLACES_AND_PEOPLE_2 jp NextRadioLine PeoplePlaces2: ld hl, PnP_Text2 ld a, PLACES_AND_PEOPLE_3 jp NextRadioLine PeoplePlaces3: ld hl, PnP_Text3 call Random cp 49 percent - 1 ld a, PLACES_AND_PEOPLE_4 ; People jr c, .ok ld a, PLACES_AND_PEOPLE_6 ; Places .ok jp NextRadioLine PnP_Text1: ; PLACES AND PEOPLE! text_jump _PnP_Text1 db "@" PnP_Text2: ; Brought to you by text_jump _PnP_Text2 db "@" PnP_Text3: ; me, DJ LILY! text_jump _PnP_Text3 db "@" PeoplePlaces4: ; People call Random maskbits NUM_TRAINER_CLASSES inc a cp NUM_TRAINER_CLASSES - 1 jr nc, PeoplePlaces4 push af ld hl, PnP_HiddenPeople ld a, [wStatusFlags] bit STATUSFLAGS_HALL_OF_FAME_F, a jr z, .ok ld hl, PnP_HiddenPeople_BeatE4 ld a, [wKantoBadges] cp %11111111 ; all badges jr nz, .ok ld hl, PnP_HiddenPeople_BeatKanto .ok pop af ld c, a ld de, 1 push bc call IsInArray pop bc jr c, PeoplePlaces4 push bc callfar GetTrainerClassName ld de, StringBuffer1 call CopyName1 pop bc ld b, 1 callfar GetTrainerName ld hl, PnP_Text4 ld a, PLACES_AND_PEOPLE_5 jp NextRadioLine INCLUDE "data/radio/pnp_hidden_people.asm" PnP_Text4: ; @ @ @ text_jump _PnP_Text4 db "@" PeoplePlaces5: ; 0-15 are all valid indexes into .Adjectives, ; so no need for a retry loop call Random maskbits NUM_PNP_PEOPLE_ADJECTIVES ld e, a ld d, 0 ld hl, .Adjectives add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a call Random cp 4 percent ld a, PLACES_AND_PEOPLE jr c, .ok call Random cp 49 percent - 1 ld a, PLACES_AND_PEOPLE_4 ; People jr c, .ok ld a, PLACES_AND_PEOPLE_6 ; Places .ok jp NextRadioLine .Adjectives: ; there are NUM_PNP_PEOPLE_ADJECTIVES entries dw PnP_cute dw PnP_lazy dw PnP_happy dw PnP_noisy dw PnP_precocious dw PnP_bold dw PnP_picky dw PnP_sortofok dw PnP_soso dw PnP_great dw PnP_mytype dw PnP_cool dw PnP_inspiring dw PnP_weird dw PnP_rightforme dw PnP_odd PnP_cute: ; is cute. text_jump _PnP_cute db "@" PnP_lazy: ; is sort of lazy. text_jump _PnP_lazy db "@" PnP_happy: ; is always happy. text_jump _PnP_happy db "@" PnP_noisy: ; is quite noisy. text_jump _PnP_noisy db "@" PnP_precocious: ; is precocious. text_jump _PnP_precocious db "@" PnP_bold: ; is somewhat bold. text_jump _PnP_bold db "@" PnP_picky: ; is too picky! text_jump _PnP_picky db "@" PnP_sortofok: ; is sort of OK. text_jump _PnP_sortofok db "@" PnP_soso: ; is just so-so. text_jump _PnP_soso db "@" PnP_great: ; is actually great. text_jump _PnP_great db "@" PnP_mytype: ; is just my type. text_jump _PnP_mytype db "@" PnP_cool: ; is so cool, no? text_jump _PnP_cool db "@" PnP_inspiring: ; is inspiring! text_jump _PnP_inspiring db "@" PnP_weird: ; is kind of weird. text_jump _PnP_weird db "@" PnP_rightforme: ; is right for me? text_jump _PnP_rightforme db "@" PnP_odd: ; is definitely odd! text_jump _PnP_odd db "@" PeoplePlaces6: ; Places call Random cp (PnP_HiddenPlaces.End - PnP_HiddenPlaces) / 2 jr nc, PeoplePlaces6 ld hl, PnP_HiddenPlaces ld c, a ld b, 0 add hl, bc add hl, bc ld b, [hl] inc hl ld c, [hl] call GetWorldMapLocation ld e, a farcall GetLandmarkName ld hl, PnP_Text5 ld a, PLACES_AND_PEOPLE_7 jp NextRadioLine INCLUDE "data/radio/pnp_hidden_places.asm" PnP_Text5: ; @ @ text_jump _PnP_Text5 db "@" PeoplePlaces7: ; 0-15 are all valid indexes into .Adjectives, ; so no need for a retry loop call Random maskbits NUM_PNP_PLACES_ADJECTIVES ld e, a ld d, 0 ld hl, .Adjectives add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a call CopyRadioTextToRAM call Random cp 4 percent ld a, PLACES_AND_PEOPLE jr c, .ok call Random cp 49 percent - 1 ld a, PLACES_AND_PEOPLE_4 ; People jr c, .ok ld a, PLACES_AND_PEOPLE_6 ; Places .ok jp PrintRadioLine .Adjectives: ; there are NUM_PNP_PLACES_ADJECTIVES entries dw PnP_cute dw PnP_lazy dw PnP_happy dw PnP_noisy dw PnP_precocious dw PnP_bold dw PnP_picky dw PnP_sortofok dw PnP_soso dw PnP_great dw PnP_mytype dw PnP_cool dw PnP_inspiring dw PnP_weird dw PnP_rightforme dw PnP_odd RocketRadio1: call StartRadioStation ld hl, RocketRadioText1 ld a, ROCKET_RADIO_2 jp NextRadioLine RocketRadio2: ld hl, RocketRadioText2 ld a, ROCKET_RADIO_3 jp NextRadioLine RocketRadio3: ld hl, RocketRadioText3 ld a, ROCKET_RADIO_4 jp NextRadioLine RocketRadio4: ld hl, RocketRadioText4 ld a, ROCKET_RADIO_5 jp NextRadioLine RocketRadio5: ld hl, RocketRadioText5 ld a, ROCKET_RADIO_6 jp NextRadioLine RocketRadio6: ld hl, RocketRadioText6 ld a, ROCKET_RADIO_7 jp NextRadioLine RocketRadio7: ld hl, RocketRadioText7 ld a, ROCKET_RADIO_8 jp NextRadioLine RocketRadio8: ld hl, RocketRadioText8 ld a, ROCKET_RADIO_9 jp NextRadioLine RocketRadio9: ld hl, RocketRadioText9 ld a, ROCKET_RADIO_10 jp NextRadioLine RocketRadio10: ld hl, RocketRadioText10 ld a, ROCKET_RADIO jp NextRadioLine RocketRadioText1: ; … …Ahem, we are text_jump _RocketRadioText1 db "@" RocketRadioText2: ; TEAM ROCKET! text_jump _RocketRadioText2 db "@" RocketRadioText3: ; After three years text_jump _RocketRadioText3 db "@" RocketRadioText4: ; of preparation, we text_jump _RocketRadioText4 db "@" RocketRadioText5: ; have risen again text_jump _RocketRadioText5 db "@" RocketRadioText6: ; from the ashes! text_jump _RocketRadioText6 db "@" RocketRadioText7: ; GIOVANNI! @ Can you text_jump _RocketRadioText7 db "@" RocketRadioText8: ; hear?@ We did it! text_jump _RocketRadioText8 db "@" RocketRadioText9: ; @ Where is our boss? text_jump _RocketRadioText9 db "@" RocketRadioText10: ; @ Is he listening? text_jump _RocketRadioText10 db "@" PokeFluteRadio: call StartRadioStation ld a, 1 ld [wNumRadioLinesPrinted], a ret UnownRadio: call StartRadioStation ld a, 1 ld [wNumRadioLinesPrinted], a ret EvolutionRadio: call StartRadioStation ld a, 1 ld [wNumRadioLinesPrinted], a ret BuenasPassword1: ; Determine if we need to be here call BuenasPasswordCheckTime jp nc, .PlayPassword ld a, [wNumRadioLinesPrinted] and a jp z, BuenasPassword20 jp BuenasPassword8 .PlayPassword: call StartRadioStation ld a, [hBGMapMode] push af xor a ld [hBGMapMode], a ld de, BuenasPasswordChannelName hlcoord 2, 9 call PlaceString pop af ld [hBGMapMode], a ld hl, BuenaRadioText1 ld a, BUENAS_PASSWORD_2 jp NextRadioLine BuenasPassword2: ld hl, BuenaRadioText2 ld a, BUENAS_PASSWORD_3 jp NextRadioLine BuenasPassword3: call BuenasPasswordCheckTime ld hl, BuenaRadioText3 jp c, BuenasPasswordAfterMidnight ld a, BUENAS_PASSWORD_4 jp NextRadioLine BuenasPassword4: call BuenasPasswordCheckTime jp c, BuenasPassword8 ld a, [wBuenasPassword] ; If we already generated the password today, we don't need to generate a new one. ld hl, wWeeklyFlags bit WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] jr nz, .AlreadyGotIt ; There are only 11 groups to choose from. .greater_than_11 call Random maskbits NUM_PASSWORD_CATEGORIES cp NUM_PASSWORD_CATEGORIES jr nc, .greater_than_11 ; Store it in the high nybble of e. swap a ld e, a ; For each group, choose one of the three passwords. .greater_than_three call Random maskbits NUM_PASSWORDS_PER_CATEGORY cp NUM_PASSWORDS_PER_CATEGORY jr nc, .greater_than_three ; The high nybble of wBuenasPassword will now contain the password group index, and the low nybble contains the actual password. add e ld [wBuenasPassword], a ; Set the flag so that we don't generate a new password this week. ld hl, wWeeklyFlags set WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] .AlreadyGotIt: ld c, a call GetBuenasPassword ld hl, BuenaRadioText4 ld a, BUENAS_PASSWORD_5 jp NextRadioLine GetBuenasPassword: ; The password indices are held in c. High nybble contains the group index, low nybble contains the word index. ; Load the password group pointer in hl. ld a, c swap a and $f ld hl, BuenasPasswordTable ld d, 0 ld e, a add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a ; Get the password type and store it in b. ld a, [hli] ld b, a push hl inc hl ; Get the password index. ld a, c and $f ld c, a push hl ld hl, .StringFunctionJumpTable ld e, b add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a pop de ; de now contains the pointer to the value of this week's password, in Blue Card Points. call _hl_ pop hl ld c, [hl] ret .StringFunctionJumpTable: ; entries correspond to BUENA_* constants dw .Mon ; BUENA_MON dw .Item ; BUENA_ITEM dw .Move ; BUENA_MOVE dw .RawString ; BUENA_STRING .Mon: call .GetTheIndex call GetPokemonName ret .Item: call .GetTheIndex call GetItemName ret .Move: call .GetTheIndex call GetMoveName ret .GetTheIndex: ld h, 0 ld l, c add hl, de ld a, [hl] ld [wNamedObjectIndexBuffer], a ret .RawString: ; Get the string from the table... ld a, c and a jr z, .skip .read_loop ld a, [de] inc de cp "@" jr nz, .read_loop dec c jr nz, .read_loop ; ... and copy it into StringBuffer1. .skip ld hl, StringBuffer1 .copy_loop ld a, [de] inc de ld [hli], a cp "@" jr nz, .copy_loop ld de, StringBuffer1 ret INCLUDE "data/radio/buenas_passwords.asm" BuenasPassword5: ld hl, BuenaRadioText5 ld a, BUENAS_PASSWORD_6 jp NextRadioLine BuenasPassword6: ld hl, BuenaRadioText6 ld a, BUENAS_PASSWORD_7 jp NextRadioLine BuenasPassword7: call BuenasPasswordCheckTime ld hl, BuenaRadioText7 jr c, BuenasPasswordAfterMidnight ld a, BUENAS_PASSWORD jp NextRadioLine BuenasPasswordAfterMidnight: push hl ld hl, wWeeklyFlags res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] pop hl ld a, BUENAS_PASSWORD_8 jp NextRadioLine BuenasPassword8: ld hl, wWeeklyFlags res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] ld hl, BuenaRadioMidnightText10 ld a, BUENAS_PASSWORD_9 jp NextRadioLine BuenasPassword9: ld hl, BuenaRadioMidnightText1 ld a, BUENAS_PASSWORD_10 jp NextRadioLine BuenasPassword10: ld hl, BuenaRadioMidnightText2 ld a, BUENAS_PASSWORD_11 jp NextRadioLine BuenasPassword11: ld hl, BuenaRadioMidnightText3 ld a, BUENAS_PASSWORD_12 jp NextRadioLine BuenasPassword12: ld hl, BuenaRadioMidnightText4 ld a, BUENAS_PASSWORD_13 jp NextRadioLine BuenasPassword13: ld hl, BuenaRadioMidnightText5 ld a, BUENAS_PASSWORD_14 jp NextRadioLine BuenasPassword14: ld hl, BuenaRadioMidnightText6 ld a, BUENAS_PASSWORD_15 jp NextRadioLine BuenasPassword15: ld hl, BuenaRadioMidnightText7 ld a, BUENAS_PASSWORD_16 jp NextRadioLine BuenasPassword16: ld hl, BuenaRadioMidnightText8 ld a, BUENAS_PASSWORD_17 jp NextRadioLine BuenasPassword17: ld hl, BuenaRadioMidnightText9 ld a, BUENAS_PASSWORD_18 jp NextRadioLine BuenasPassword18: ld hl, BuenaRadioMidnightText10 ld a, BUENAS_PASSWORD_19 jp NextRadioLine BuenasPassword19: ld hl, BuenaRadioMidnightText10 ld a, BUENAS_PASSWORD_20 jp NextRadioLine BuenasPassword20: ld a, [hBGMapMode] push af farcall NoRadioMusic farcall NoRadioName pop af ld [hBGMapMode], a ld hl, wWeeklyFlags res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] ld a, BUENAS_PASSWORD ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld hl, BuenaOffTheAirText ld a, BUENAS_PASSWORD_21 jp NextRadioLine BuenasPassword21: ld a, BUENAS_PASSWORD ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a call BuenasPasswordCheckTime jp nc, BuenasPassword1 ld hl, BuenaOffTheAirText ld a, BUENAS_PASSWORD_21 jp NextRadioLine BuenasPasswordCheckTime: call UpdateTime ld a, [hHours] cp NITE_HOUR ret BuenasPasswordChannelName: db "BUENA'S PASSWORD@" BuenaRadioText1: ; BUENA: BUENA here! text_jump _BuenaRadioText1 db "@" BuenaRadioText2: ; Today's password! text_jump _BuenaRadioText2 db "@" BuenaRadioText3: ; Let me think… It's text_jump _BuenaRadioText3 db "@" BuenaRadioText4: ; @ ! text_jump _BuenaRadioText4 db "@" BuenaRadioText5: ; Don't forget it! text_jump _BuenaRadioText5 db "@" BuenaRadioText6: ; I'm in GOLDENROD's text_jump _BuenaRadioText6 db "@" BuenaRadioText7: ; RADIO TOWER! text_jump _BuenaRadioText7 db "@" BuenaRadioMidnightText1: ; BUENA: Oh my… text_jump _BuenaRadioMidnightText1 db "@" BuenaRadioMidnightText2: ; It's midnight! I text_jump _BuenaRadioMidnightText2 db "@" BuenaRadioMidnightText3: ; have to shut down! text_jump _BuenaRadioMidnightText3 db "@" BuenaRadioMidnightText4: ; Thanks for tuning text_jump _BuenaRadioMidnightText4 db "@" BuenaRadioMidnightText5: ; in to the end! But text_jump _BuenaRadioMidnightText5 db "@" BuenaRadioMidnightText6: ; don't stay up too text_jump _BuenaRadioMidnightText6 db "@" BuenaRadioMidnightText7: ; late! Presented to text_jump _BuenaRadioMidnightText7 db "@" BuenaRadioMidnightText8: ; you by DJ BUENA! text_jump _BuenaRadioMidnightText8 db "@" BuenaRadioMidnightText9: ; I'm outta here! text_jump _BuenaRadioMidnightText9 db "@" BuenaRadioMidnightText10: ; … text_jump _BuenaRadioMidnightText10 db "@" BuenaOffTheAirText: ; text_jump _BuenaOffTheAirText db "@" CopyRadioTextToRAM: ld a, [hl] cp TX_FAR jp z, FarCopyRadioText ld de, wRadioText ld bc, SCREEN_WIDTH * 2 jp CopyBytes StartRadioStation: ld a, [wNumRadioLinesPrinted] and a ret nz call RadioTerminator call PrintText ld hl, RadioChannelSongs ld a, [wCurrentRadioLine] ld c, a ld b, 0 add hl, bc add hl, bc ld e, [hl] inc hl ld d, [hl] callfar RadioMusicRestartDE ret INCLUDE "data/radio/channel_music.asm" NextRadioLine: push af call CopyRadioTextToRAM pop af jp PrintRadioLine