diff options
Diffstat (limited to 'engine/phone/phone.asm')
-rw-r--r-- | engine/phone/phone.asm | 800 |
1 files changed, 800 insertions, 0 deletions
diff --git a/engine/phone/phone.asm b/engine/phone/phone.asm new file mode 100644 index 000000000..53bb519b3 --- /dev/null +++ b/engine/phone/phone.asm @@ -0,0 +1,800 @@ +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 |