pokecrystal-board/engine/phone.asm
Remy Oukaour 31cce83e9b Move lots of data tables into individual data/ files
(This is not expected to be their final location, but it makes them easier to relocate when necessary, and easier for users to edit until the whole project's file structure is finalized.)
2017-12-11 14:23:18 -05:00

803 lines
12 KiB
NASM

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)
callba CheckReceiveCallTimer
ret
CheckPhoneContactTimeOfDay: ; 900ad (24:40ad)
push hl
push bc
push de
push af
callba 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)
callba 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, [wPermission]
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
callba 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
callba 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
callba PhoneRing_LoadEDTile
ret
; 90355
HangUp_Wait20Frames: ; 90355
jr Phone_Wait20Frames
Phone_Wait20Frames
ld c, 20
call DelayFrames
callba PhoneRing_LoadEDTile
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
callba GetTrainerName
pop bc
pop hl
ret
Phone_GetTrainerClassName: ; 9042e (24:442e)
push hl
push bc
callba 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
callba GetLandmarkName
pop bc
pop de
ret
; 9045f
PhoneContacts: ; 9045f
INCLUDE "data/phone_contacts.asm"
; 90627
SpecialPhoneCallList: ; 90627
INCLUDE "data/phone_special.asm"
; 90657
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