ref: def3b6049387a6d2afab66780f7f09dbb61d6166
dir: /engine/phone/phone.asm/
AddPhoneNumber:: ; 90000 call _CheckCellNum jr c, .cant_add call Phone_FindOpenSlot jr nc, .cant_add ld [hl], c xor a ret .cant_add scf ret ; 9000f DelCellNum:: ; 9000f call _CheckCellNum jr nc, .not_in_list xor a ld [hl], a ret .not_in_list scf ret ; 90019 CheckCellNum:: ; 90019 jp _CheckCellNum ; wtf ; 9001c _CheckCellNum: ; 9001c ld hl, wPhoneList ld b, CONTACT_LIST_SIZE .loop ld a, [hli] cp c jr z, .got_it dec b jr nz, .loop xor a ret .got_it dec hl scf ret ; 9002d Phone_FindOpenSlot: ; 9002d call GetRemainingSpaceInPhoneList ld b, a ld hl, wPhoneList .loop ld a, [hli] and a jr z, .FoundOpenSpace dec b jr nz, .loop xor a ret .FoundOpenSpace: dec hl scf ret ; 90040 GetRemainingSpaceInPhoneList: ; 90040 xor a ld [Buffer1], a ld hl, PermanentNumbers .loop ld a, [hli] cp -1 jr z, .done cp c jr z, .elm_or_mom push bc push hl ld c, a call _CheckCellNum jr c, .elm_or_mom_in_list ld hl, Buffer1 inc [hl] .elm_or_mom_in_list pop hl pop bc .elm_or_mom jr .loop .done ld a, CONTACT_LIST_SIZE ld hl, Buffer1 sub [hl] ret ; 90066 PermanentNumbers: ; 90066 db PHONECONTACT_MOM, PHONECONTACT_ELM, -1 ; 90069 FarPlaceString: ; 90069 ld a, [hROMBank] push af ld a, b rst Bankswitch call PlaceString pop af rst Bankswitch ret ; 90074 CheckPhoneCall:: ; 90074 (24:4074) ; Check if the phone is ringing in the overworld. call CheckStandingOnEntrance jr z, .no_call call .timecheck nop jr nc, .no_call call Random ld b, a and 50 percent cp b jr nz, .no_call call GetMapHeaderPhoneServiceNybble and a jr nz, .no_call call GetAvailableCallers call ChooseRandomCaller jr nc, .no_call ld e, a call LoadCallerScript ld a, BANK(Script_ReceivePhoneCall) ld hl, Script_ReceivePhoneCall call CallScript scf ret .no_call xor a ret .timecheck ; 900a6 (24:40a6) farcall CheckReceiveCallTimer ret CheckPhoneContactTimeOfDay: ; 900ad (24:40ad) push hl push bc push de push af farcall CheckTime pop af and MORN | DAY | NITE and c pop de pop bc pop hl ret ChooseRandomCaller: ; 900bf (24:40bf) ; If no one is available to call, don't return anything. ld a, [EngineBuffer3] and a jr z, .NothingToSample ; Sample a random number between 0 and 31. ld c, a call Random ld a, [hRandomAdd] swap a and $1f ; Compute that number modulo the number of available callers. call SimpleDivide ; Return the caller ID you just sampled. ld c, a ld b, 0 ld hl, EngineBuffer4 add hl, bc ld a, [hl] scf ret .NothingToSample: xor a ret GetAvailableCallers: ; 900de (24:40de) farcall CheckTime ld a, c ld [EngineBuffer1], a ld hl, EngineBuffer3 ld bc, 11 xor a call ByteFill ld de, wPhoneList ld a, CONTACT_LIST_SIZE .loop ld [EngineBuffer2], a ld a, [de] and a jr z, .not_good_for_call ld hl, PhoneContacts + PHONE_CONTACT_SCRIPT2_TIME ld bc, PHONE_TABLE_WIDTH call AddNTimes ld a, [EngineBuffer1] and [hl] jr z, .not_good_for_call ld bc, PHONE_CONTACT_MAP_GROUP - PHONE_CONTACT_SCRIPT2_TIME add hl, bc ld a, [MapGroup] cp [hl] jr nz, .different_map inc hl ld a, [MapNumber] cp [hl] jr z, .not_good_for_call .different_map ld a, [EngineBuffer3] ld c, a ld b, $0 inc a ld [EngineBuffer3], a ld hl, EngineBuffer4 add hl, bc ld a, [de] ld [hl], a .not_good_for_call inc de ld a, [EngineBuffer2] dec a jr nz, .loop ret CheckSpecialPhoneCall:: ; 90136 (24:4136) ld a, [wSpecialPhoneCallID] and a jr z, .NoPhoneCall dec a ld c, a ld b, 0 ld hl, SpecialPhoneCallList ld a, 6 call AddNTimes ld a, [hli] ld h, [hl] ld l, a call _hl_ jr nc, .NoPhoneCall call .DoSpecialPhoneCall inc hl inc hl ld a, [hli] ld e, a push hl call LoadCallerScript pop hl ld de, wPhoneScriptPointer ld a, [hli] ld [de], a inc de ld a, [hli] ld [de], a inc de ld a, [hli] ld [de], a ld a, BANK(.script) ld hl, .script call CallScript scf ret .NoPhoneCall: xor a ret ; 90173 (24:4173) .script ; 0x90173 pause 30 jump Script_ReceivePhoneCall ; 0x90178 .DoSpecialPhoneCall: ; 90178 (24:4178) ld a, [wSpecialPhoneCallID] dec a ld c, a ld b, 0 ld hl, SpecialPhoneCallList ld a, 6 call AddNTimes ret SpecialCallOnlyWhenOutside: ; 90188 ld a, [wEnvironment] cp TOWN jr z, .outside cp ROUTE jr z, .outside xor a ret .outside scf ret SpecialCallWhereverYouAre: ; 90197 scf ret Function90199: ; 90199 (24:4199) ; Don't do the call if you're in a link communication ld a, [wLinkMode] and a jr nz, .OutOfArea ; If you're in an area without phone service, don't do the call call GetMapHeaderPhoneServiceNybble and a jr nz, .OutOfArea ; If the person can't take a call at that time, don't do the call ld a, b ld [wCurrentCaller], a ld hl, PhoneContacts ld bc, PHONE_TABLE_WIDTH call AddNTimes ld d, h ld e, l ld hl, PHONE_CONTACT_SCRIPT1_TIME add hl, de ld a, [hl] call CheckPhoneContactTimeOfDay jr z, .OutOfArea ; If we're in the same map as the person we're calling, ; use the "Just talk to that person" script. ld hl, PHONE_CONTACT_MAP_GROUP add hl, de ld a, [MapGroup] cp [hl] jr nz, .GetPhoneScript ld hl, PHONE_CONTACT_MAP_NUMBER add hl, de ld a, [MapNumber] cp [hl] jr nz, .GetPhoneScript ld b, BANK(PhoneScript_JustTalkToThem) ld hl, PhoneScript_JustTalkToThem jr .DoPhoneCall .GetPhoneScript: ld hl, PHONE_CONTACT_SCRIPT1_BANK add hl, de ld b, [hl] ld hl, PHONE_CONTACT_SCRIPT1_ADDR_LO add hl, de ld a, [hli] ld h, [hl] ld l, a jr .DoPhoneCall .OutOfArea: ld b, BANK(UnknownScript_0x90209) ld de, UnknownScript_0x90209 call ExecuteCallbackScript ret .DoPhoneCall: ld a, b ld [PhoneScriptBank], a ld a, l ld [PhoneCaller], a ld a, h ld [PhoneCaller + 1], a ld b, BANK(UnknownScript_0x90205) ld de, UnknownScript_0x90205 call ExecuteCallbackScript ret ; 90205 (24:4205) UnknownScript_0x90205: ; 0x90205 ptcall wd002 return ; 0x90209 UnknownScript_0x90209: ; 0x90209 scall UnknownScript_0x90657 return ; 0x9020d LoadCallerScript: ; 9020d (24:420d) nop nop ld a, e ld [wCurrentCaller], a and a jr nz, .actualcaller ld a, BANK(WrongNumber) ld hl, WrongNumber jr .proceed .actualcaller ld hl, PhoneContacts ld bc, 12 ld a, e call AddNTimes ld a, BANK(PhoneContacts) .proceed ld de, EngineBuffer2 ld bc, 12 call FarCopyBytes ret ; 90233 (24:4233) WrongNumber: ; 90233 db TRAINER_NONE, PHONE_00 dba .script .script writetext .text end .text ; Huh? Sorry, wrong number! text_jump UnknownText_0x1c5565 db "@" ; 90241 Script_ReceivePhoneCall: ; 0x90241 refreshscreen $0 callasm RingTwice_StartCall ptcall wPhoneScriptPointer waitbutton callasm HangUp closetext callasm InitCallReceiveDelay end ; 0x90255 Script_SpecialBillCall:: ; 0x90255 callasm .LoadBillScript jump Script_ReceivePhoneCall .LoadBillScript: ld e, PHONE_BILL jp LoadCallerScript ; 90261 UnknownScript_0x90261: ; 0x90261 callasm .LoadElmScript pause 30 jump Script_ReceivePhoneCall .LoadElmScript: ld e, PHONE_ELM jp LoadCallerScript ; 9026f RingTwice_StartCall: ; 9026f call .Ring call .Ring farcall TrainerRankings_PhoneCalls ret ; 9027c .Ring: ; 9027c (24:427c) call Phone_StartRinging call Phone_Wait20Frames call Phone_CallerTextboxWithName call Phone_Wait20Frames call Phone_CallerTextbox call Phone_Wait20Frames call Phone_CallerTextboxWithName ret Phone_CallerTextboxWithName: ; 90292 (24:4292) ld a, [wCurrentCaller] ld b, a call Function90363 ret PhoneCall:: ; 9029a ld a, b ld [PhoneScriptBank], a ld a, e ld [PhoneCaller], a ld a, d ld [PhoneCaller + 1], a call Phone_FirstOfTwoRings call Phone_FirstOfTwoRings farcall TrainerRankings_PhoneCalls ret ; 902b3 Phone_FirstOfTwoRings: ; 902b3 call Phone_StartRinging call Phone_Wait20Frames call Phone_CallerTextboxWithName2 call Phone_Wait20Frames call Phone_CallerTextbox call Phone_Wait20Frames call Phone_CallerTextboxWithName2 ret ; 902c9 Phone_CallerTextboxWithName2: ; 902c9 call Phone_CallerTextbox hlcoord 1, 2 ld [hl], "<PHONE>" inc hl inc hl ld a, [PhoneScriptBank] ld b, a ld a, [PhoneCaller] ld e, a ld a, [PhoneCaller + 1] ld d, a call FarPlaceString ret ; 902e3 Phone_NoSignal: ; 902e3 (24:42e3) ld de, SFX_NO_SIGNAL call PlaySFX jr Phone_CallEnd HangUp:: ; 902eb call HangUp_Beep call HangUp_Wait20Frames Phone_CallEnd: call HangUp_BoopOn call HangUp_Wait20Frames call HangUp_BoopOff call HangUp_Wait20Frames call HangUp_BoopOn call HangUp_Wait20Frames call HangUp_BoopOff call HangUp_Wait20Frames call HangUp_BoopOn call HangUp_Wait20Frames call HangUp_BoopOff call HangUp_Wait20Frames ret ; 90316 Function90316: ; 90316 ld de, SFX_SHUT_DOWN_PC call PlaySFX ret ; 9031d HangUp_Beep: ; 9031d ld hl, UnknownText_0x9032a call PrintText ld de, SFX_HANG_UP call PlaySFX ret ; 9032a UnknownText_0x9032a: ; 9032a text_jump UnknownText_0x1c5580 db "@" ; 9032f HangUp_BoopOn: ; 9032f ld hl, UnknownText_0x90336 call PrintText ret ; 90336 UnknownText_0x90336: ; 0x90336 text_jump UnknownText_0x1c5588 db "@" ; 0x9033b HangUp_BoopOff: ; 9033b call SpeechTextBox ret ; 9033f Phone_StartRinging: ; 9033f call WaitSFX ld de, SFX_CALL call PlaySFX call Phone_CallerTextbox call UpdateSprites farcall PhoneRing_CopyTilemapAtOnce ret ; 90355 HangUp_Wait20Frames: ; 90355 jr Phone_Wait20Frames Phone_Wait20Frames ld c, 20 call DelayFrames farcall PhoneRing_CopyTilemapAtOnce ret ; 90363 Function90363: ; 90363 (24:4363) push bc call Phone_CallerTextbox hlcoord 1, 1 ld [hl], "<PHONE>" inc hl inc hl ld d, h ld e, l pop bc call Function90380 ret Phone_CallerTextbox: ; 90375 hlcoord 0, 0 ld b, 2 ld c, SCREEN_WIDTH - 2 call TextBox ret ; 90380 Function90380: ; 90380 (24:4380) ld h, d ld l, e ld a, b call GetCallerTrainerClass call GetCallerName ret CheckCanDeletePhoneNumber: ; 9038a (24:438a) ld a, c call GetCallerTrainerClass ld a, c ; and a ret nz ld a, b cp PHONECONTACT_MOM ret z cp PHONECONTACT_ELM ret z ld c, $1 ret GetCallerTrainerClass: ; 9039a push hl ld hl, PhoneContacts + PHONE_CONTACT_TRAINER_CLASS ld bc, PHONE_TABLE_WIDTH call AddNTimes ld a, [hli] ld b, [hl] ld c, a pop hl ret ; 903a9 GetCallerName: ; 903a9 (24:43a9) ld a, c and a jr z, .NotTrainer call Phone_GetTrainerName push hl push bc call PlaceString ld a, ":" ld [bc], a pop bc pop hl ld de, SCREEN_WIDTH + 3 add hl, de call Phone_GetTrainerClassName call PlaceString ret .NotTrainer: push hl ld c, b ld b, 0 ld hl, NonTrainerCallerNames add hl, bc add hl, bc ld a, [hli] ld e, a ld d, [hl] pop hl call PlaceString ret ; 903d6 (24:43d6) NonTrainerCallerNames: ; 903d6 dw .none dw .mom dw .bikeshop dw .bill dw .elm dw .buena .none db "----------@" .mom db "MOM:@" .bill db "BILL:@" .elm db "PROF.ELM:@" .bikeshop db "BIKE SHOP:@" .buena db "BUENA:", $22, " DISC JOCKEY@" ; 90423 Phone_GetTrainerName: ; 90423 (24:4423) push hl push bc farcall GetTrainerName pop bc pop hl ret Phone_GetTrainerClassName: ; 9042e (24:442e) push hl push bc farcall GetTrainerClassName pop bc pop hl ret GetCallerLocation: ; 90439 ld a, [wCurrentCaller] call GetCallerTrainerClass ld d, c ld e, b push de ld a, [wCurrentCaller] ld hl, PhoneContacts + PHONE_CONTACT_MAP_GROUP ld bc, PHONE_TABLE_WIDTH call AddNTimes ld b, [hl] inc hl ld c, [hl] push bc call GetWorldMapLocation ld e, a farcall GetLandmarkName pop bc pop de ret ; 9045f INCLUDE "data/phone_contacts.asm" INCLUDE "data/phone_special.asm" UnknownScript_0x90657: ; 0x90657 writetext UnknownText_0x9065b end ; 0x9065b UnknownText_0x9065b: ; 0x9065b ; That number is out of the area. text_jump UnknownText_0x1c558b db "@" ; 0x90660 PhoneScript_JustTalkToThem: ; 0x90660 writetext UnknownText_0x90664 end ; 0x90664 UnknownText_0x90664: ; 0x90664 ; Just go talk to that person! text_jump UnknownText_0x1c55ac db "@" ; 0x90669 UnknownScript_0x90669: ; 0x90669 writetext UnknownText_0x9066d end ; 0x9066d UnknownText_0x9066d: ; 0x9066d ; Thank you! text_jump UnknownText_0x1c55ca db "@" ; 0x90672