ref: 35a3a19fda87d95e829aa99bf1b6cf18a839c1a6
dir: /mobile/mobile_41.asm/
; These functions deal with miscellaneous statistics ; which were used for Trainer Rankings in Pokémon News. ; Copies certain values at the time the player enters the Hall of Fame. TrainerRankings_HallOfFame2:: mobile ; 0x105ef6 ld a, BANK(sTrainerRankingGameTimeHOF) call GetSRAMBank ld hl, GameTimeHours ld de, sTrainerRankingGameTimeHOF ld bc, 4 call CopyBytes ld hl, sTrainerRankingStepCount ld de, sTrainerRankingStepCountHOF ld bc, 4 call CopyBytes ; sTrainerRankingHealings is only a 3-byte value. ; One extraneous byte is copied from sTrainerRankingMysteryGift. ld hl, sTrainerRankingHealings ld de, sTrainerRankingHealingsHOF ld bc, 4 call CopyBytes ld hl, sTrainerRankingBattles ld de, sTrainerRankingBattlesHOF ld bc, 3 call CopyBytes call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 105f33 TrainerRankings_MagikarpLength: mobile ; 105f33 ld a, BANK(sTrainerRankingLongestMagikarp) call GetSRAMBank ld de, Buffer1 ld hl, sTrainerRankingLongestMagikarp ; Is this Magikarp the longest measured? ld a, [de] cp [hl] jr z, .isLowByteHigher jr nc, .newRecordLongest jr .checkShortest .isLowByteHigher inc hl inc de ld a, [de] cp [hl] dec hl dec de jr c, .checkShortest .newRecordLongest ld a, [de] inc de ld [hli], a ld a, [de] dec de ld [hl], a .checkShortest ; First, check if the record for shortest Magikarp is 0. ; This seems unnecessary, because the value is initialized to 100.0 cm. ld hl, sTrainerRankingShortestMagikarp ld a, [hli] or [hl] dec hl jr z, .newRecordShortest ; Now check if this Magikarp is the shortest ld a, [de] cp [hl] jr z, .isLowByteLower jr c, .newRecordShortest jr .done .isLowByteLower inc hl inc de ld a, [de] cp [hl] jr nc, .done dec hl dec de .newRecordShortest ld a, [de] inc de ld [hli], a ld a, [de] ld [hl], a .done call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 105f79 TrainerRankings_BugContestScore: mobile ; 105f79 ld a, BANK(sTrainerRankingBugContestScore) call GetSRAMBank ld a, [hProduct] ld hl, sTrainerRankingBugContestScore cp [hl] jr z, .isLowByteHigher jr nc, .newHighScore jr .done .isLowByteHigher inc hl ld a, [hMultiplicand] cp [hl] jr c, .done dec hl .newHighScore ld a, [hProduct] ld [hli], a ld a, [hMultiplicand] ld [hl], a .done call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 105f9f TrainerRankings_AddToSlotsWinStreak: mobile ; 105f9f ld a, BANK(sTrainerRankingCurrentSlotsStreak) call GetSRAMBank ; Increment the current streak ld hl, sTrainerRankingCurrentSlotsStreak + 1 inc [hl] jr nz, .noCarry dec hl inc [hl] inc hl .noCarry dec hl ; Now check if this is a new record for longest streak ld a, [sTrainerRankingLongestSlotsStreak] cp [hl] jr z, .isLowByteHigher jr c, .newRecordStreak jr .done .isLowByteHigher inc hl ld a, [sTrainerRankingLongestSlotsStreak + 1] cp [hl] jr nc, .done dec hl .newRecordStreak ld a, [hli] ld [sTrainerRankingLongestSlotsStreak], a ld a, [hl] ld [sTrainerRankingLongestSlotsStreak + 1], a .done call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 105fd0 TrainerRankings_EndSlotsWinStreak: mobile ; 105fd0 ld a, BANK(sTrainerRankingCurrentSlotsStreak) call GetSRAMBank ld hl, sTrainerRankingCurrentSlotsStreak xor a ld [hli], a ld [hl], a call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 105fe3 TrainerRankings_AddToSlotsPayouts: mobile ; 105fe3 ld a, BANK(sTrainerRankingTotalSlotsPayouts) call GetSRAMBank ld hl, sTrainerRankingTotalSlotsPayouts + 3 ld a, e add [hl] ld [hld], a ld a, d adc [hl] ld [hld], a jr nc, .done inc [hl] jr nz, .done dec hl inc [hl] jr nz, .done ld a, $ff ld [hli], a ld [hli], a ld [hli], a ld [hl], a .done call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 106008 TrainerRankings_AddToBattlePayouts: mobile ; 106008 ld a, BANK(sTrainerRankingTotalBattlePayouts) call GetSRAMBank ld hl, sTrainerRankingTotalBattlePayouts + 3 ld a, [bc] dec bc add [hl] ld [hld], a ld a, [bc] dec bc adc [hl] ld [hld], a ld a, [bc] adc [hl] ld [hld], a jr nc, .done inc [hl] jr nz, .done ld a, $ff ld [hli], a ld [hli], a ld [hli], a ld [hl], a .done call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 10602e TrainerRankings_StepCount: mobile ; 10602e (41:602e) ld hl, sTrainerRankingStepCount jp TrainerRankings_Increment4Byte ; Unreferenced in English version. TrainerRankings_BattleTowerWins: mobile ; 106035 ld a, $5 call GetSRAMBank ld a, [$aa8d] and a call CloseSRAM ret nz ld hl, sTrainerRankingBattleTowerWins jp TrainerRankings_Increment2Byte TrainerRankings_TMsHMsTaught: mobile ; 106049 ld hl, sTrainerRankingTMsHMsTaught jp TrainerRankings_Increment3Byte TrainerRankings_Battles: mobile ; 106050 ld a, [BattleType] cp BATTLETYPE_TUTORIAL ; Exclude the Dude’s tutorial battle ret z ld hl, sTrainerRankingBattles jp TrainerRankings_Increment3Byte TrainerRankings_WildBattles: mobile ; 10605d ld a, [BattleType] cp BATTLETYPE_TUTORIAL ; Exclude the Dude’s tutorial battle ret z ld hl, sTrainerRankingWildBattles jp TrainerRankings_Increment3Byte TrainerRankings_TrainerBattles: mobile ; 10606a ld hl, sTrainerRankingTrainerBattles jp TrainerRankings_Increment3Byte TrainerRankings_Unused1: mobile ; 106071 ld hl, sTrainerRankingUnused1 jp TrainerRankings_Increment3Byte TrainerRankings_HallOfFame:: mobile ; 0x106078 ld hl, sTrainerRankingHOFEntries jp TrainerRankings_Increment3Byte TrainerRankings_WildMonsCaught: mobile ; 10607f (41:607f) ld hl, sTrainerRankingWildMonsCaught jp TrainerRankings_Increment3Byte TrainerRankings_HookedEncounters: mobile ; 106086 ld hl, sTrainerRankingHookedEncounters jp TrainerRankings_Increment3Byte TrainerRankings_EggsHatched: mobile ; 10608d (41:608d) ld hl, sTrainerRankingEggsHatched jp TrainerRankings_Increment3Byte TrainerRankings_MonsEvolved: mobile ; 106094 ld hl, sTrainerRankingMonsEvolved jp TrainerRankings_Increment3Byte TrainerRankings_FruitPicked: mobile ; 10609b ld hl, sTrainerRankingFruitPicked jp TrainerRankings_Increment3Byte TrainerRankings_Healings: mobile ; 1060a2 ld hl, sTrainerRankingHealings jp TrainerRankings_Increment3Byte TrainerRankings_MysteryGift: mobile ; 1060a9 (41:60a9) ld hl, sTrainerRankingMysteryGift jr TrainerRankings_Increment3Byte TrainerRankings_Trades: mobile ; 1060af ld hl, sTrainerRankingTrades jr TrainerRankings_Increment3Byte TrainerRankings_Fly: mobile ; 1060b5 ld hl, sTrainerRankingFly jr TrainerRankings_Increment3Byte TrainerRankings_Surf: mobile ; 1060bb ld hl, sTrainerRankingSurf jr TrainerRankings_Increment3Byte TrainerRankings_Waterfall: mobile ; 1060c1 ld hl, sTrainerRankingWaterfall jr TrainerRankings_Increment3Byte TrainerRankings_WhiteOuts: mobile ; 1060c7 ld hl, sTrainerRankingWhiteOuts jr TrainerRankings_Increment3Byte TrainerRankings_LuckyNumberShow: mobile ; 1060cd ld hl, sTrainerRankingLuckyNumberShow jr TrainerRankings_Increment2Byte TrainerRankings_PhoneCalls: mobile ; 1060d3 ld hl, sTrainerRankingPhoneCalls jr TrainerRankings_Increment3Byte TrainerRankings_Unused2: mobile ; 1060df ld hl, sTrainerRankingUnused2 jr TrainerRankings_Increment3Byte TrainerRankings_LinkBattles: mobile ; 1060df ld hl, sTrainerRankingLinkBattles jr TrainerRankings_Increment3Byte TrainerRankings_Splash: mobile ; 1060e5 ; Only counts if it’s the player’s turn ld a, [hBattleTurn] and a ret nz ld hl, sTrainerRankingSplash jr TrainerRankings_Increment3Byte TrainerRankings_TreeEncounters: mobile ; 1060ef ld hl, sTrainerRankingTreeEncounters jr TrainerRankings_Increment3Byte TrainerRankings_Unused3: mobile ; 1060f5 ld hl, sTrainerRankingUnused3 jr TrainerRankings_Increment3Byte TrainerRankings_ColosseumWins: mobile ; win ld hl, sTrainerRankingColosseumWins jr TrainerRankings_Increment3Byte TrainerRankings_ColosseumLosses: mobile ; lose ld hl, sTrainerRankingColosseumLosses jr TrainerRankings_Increment3Byte ; 106107 TrainerRankings_ColosseumDraws: mobile ; draw ld hl, sTrainerRankingColosseumDraws jr TrainerRankings_Increment3Byte ; 10610d ; Counts uses of both Selfdestruct and Explosion. TrainerRankings_Selfdestruct: mobile ; 10610d ; Only counts if it’s the player’s turn ld a, [hBattleTurn] and a ret nz ld hl, sTrainerRankingSelfdestruct jr TrainerRankings_Increment3Byte ; 106117 TrainerRankings_Increment4Byte: ; 106117 push bc ld bc, 3 jr TrainerRankings_Increment ; 10611d TrainerRankings_Increment3Byte: ; 10611d push bc ld bc, 2 jr TrainerRankings_Increment ; 106123 TrainerRankings_Increment2Byte: ; 106123 push bc ld bc, 1 jr TrainerRankings_Increment ; 106129 ; unused TrainerRankings_Increment1Byte: ; 106129 push bc ld bc, 0 ; Increments a big-endian value of bc + 1 bytes at hl TrainerRankings_Increment: ; 10612d ld a, BANK(sTrainerRankings) call GetSRAMBank push hl push de ld e, c inc e .asm_106136 ld a, [hli] inc a jr nz, .asm_10613d dec e jr nz, .asm_106136 .asm_10613d pop de pop hl jr z, .asm_10614d add hl, bc .asm_106142 inc [hl] jr nz, .asm_10614d ld a, c and a jr z, .asm_10614d dec hl dec c jr .asm_106142 .asm_10614d call UpdateTrainerRankingsChecksum call CloseSRAM pop bc ret ; 106155 ; Used when SRAM bank 5 isn’t already loaded — what’s the point of this? UpdateTrainerRankingsChecksum2: mobile ; 106155 ld a, BANK(sTrainerRankings) call GetSRAMBank call UpdateTrainerRankingsChecksum call CloseSRAM ret ; 106162 UpdateTrainerRankingsChecksum: ; 106162 push de call CalculateTrainerRankingsChecksum ld hl, sTrainerRankingsChecksum ld [hl], d inc hl ld [hl], e pop de ret ; 10616e CalculateTrainerRankingsChecksum: ; 10616e push bc ld hl, sTrainerRankings ld bc, sTrainerRankingsChecksum - sTrainerRankings xor a ld de, 0 .asm_106179 ld a, e add [hl] ld e, a jr nc, .asm_10617f inc d .asm_10617f inc hl dec bc ld a, b or c jr nz, .asm_106179 pop bc ret ; 106187 BackupMobileEventIndex: ; 106187 ld a, BANK(sMobileEventIndex) call GetSRAMBank ld a, [sMobileEventIndex] push af ld a, BANK(sMobileEventIndexBackup) call GetSRAMBank pop af ld [sMobileEventIndexBackup], a call CloseSRAM ret ; 10619d RestoreMobileEventIndex: ; 10619d (41:619d) ld a, BANK(sMobileEventIndexBackup) call GetSRAMBank ld a, [sMobileEventIndexBackup] push af ld a, BANK(sMobileEventIndex) call GetSRAMBank pop af ld [sMobileEventIndex], a call CloseSRAM ret ; 1061b3 (41:61b3) ; Unreferenced in English version. VerifyTrainerRankingsChecksum: ; 1061b3 call CalculateTrainerRankingsChecksum ld hl, sTrainerRankingsChecksum ld a, d cp [hl] ret nz inc hl ld a, e cp [hl] ret ; 1061c0 DeleteMobileEventIndex: ; 1061c0 (41:61c0) ld a, BANK(sMobileEventIndex) call GetSRAMBank xor a ld [sMobileEventIndex], a call CloseSRAM ret ; 1061cd (41:61cd) ; Used in the Japanese version to initialize Trainer Rankings data ; for a new save file. Unreferenced in the English version. InitializeTrainerRankings: ld hl, sTrainerRankings ld bc, sTrainerRankingsEnd - sTrainerRankings xor a call ByteFill ; Initialize the shortest Magikarp to 100.0 cm ld hl, sTrainerRankingShortestMagikarp ld a, $3 ld [hli], a ld [hl], $e8 call UpdateTrainerRankingsChecksum ld hl, sTrainerRankings ld de, sTrainerRankingsBackup ld bc, sTrainerRankingsEnd - sTrainerRankings call CopyBytes ret ; 1061ef _MobilePrintNum:: ; 1061ef ; Supports signed 31-bit integers (up to 10 digits) ; b: Bits 0-4 = # bytes ; Bit 7 = set if negative ; c: Number of digits ; de: highest byte of number to convert ; hl: where to print the converted string push bc xor a ld [hPrintNum1], a ld [hPrintNum2], a ld [hPrintNum3], a ld a, b and $f cp $1 jr z, .one_byte cp $2 jr z, .two_bytes cp $3 jr z, .three_bytes ; four bytes ld a, [de] ld [hPrintNum1], a inc de .three_bytes ld a, [de] ld [hPrintNum2], a inc de .two_bytes ld a, [de] ld [hPrintNum3], a inc de .one_byte ld a, [de] ld [hPrintNum4], a inc de push de xor a ld [hPrintNum9], a ld a, b ld [hPrintNum10], a ld a, c cp 2 jr z, .two_digits ld de, ._2 cp 3 jr z, .three_to_nine_digits ld de, ._3 cp 4 jr z, .three_to_nine_digits ld de, ._4 cp 5 jr z, .three_to_nine_digits ld de, ._5 cp 6 jr z, .three_to_nine_digits ld de, ._6 cp 7 jr z, .three_to_nine_digits ld de, ._7 cp 8 jr z, .three_to_nine_digits ld de, ._8 cp 9 jr z, .three_to_nine_digits ld de, ._9 .three_to_nine_digits inc de inc de inc de dec a dec a .digit_loop push af call .Function1062b2 call .Function1062ff rept 4 inc de endr pop af dec a jr nz, .digit_loop .two_digits ld c, 0 ld a, [hPrintNum4] .mod_ten_loop cp 10 jr c, .simple_divide_done sub 10 inc c jr .mod_ten_loop .simple_divide_done ld b, a ld a, [hPrintNum9] or c ld [hPrintNum9], a jr nz, .create_digit call .LoadMinusTenIfNegative jr .done .create_digit ld a, "0" add c ld [hl], a .done call .Function1062ff ld a, "0" add b ld [hli], a pop de pop bc ret ; 106292 ._9 dd 1000000000 ._8 dd 100000000 ._7 dd 10000000 ._6 dd 1000000 ._5 dd 100000 ._4 dd 10000 ._3 dd 1000 ._2 dd 100 ; 1062b2 .Function1062b2: ; 1062b2 ld c, $0 .asm_1062b4 ld a, [de] dec de ld b, a ld a, [hPrintNum4] sub b ld [hPrintNum8], a ld a, [de] dec de ld b, a ld a, [hPrintNum3] sbc b ld [hPrintNum7], a ld a, [de] dec de ld b, a ld a, [hPrintNum2] sbc b ld [hPrintNum6], a ld a, [de] inc de inc de inc de ld b, a ld a, [hPrintNum1] sbc b ld [hPrintNum5], a jr c, .asm_1062eb ld a, [hPrintNum5] ld [hPrintNum1], a ld a, [hPrintNum6] ld [hPrintNum2], a ld a, [hPrintNum7] ld [hPrintNum3], a ld a, [hPrintNum8] ld [hPrintNum4], a inc c jr .asm_1062b4 .asm_1062eb ld a, [hPrintNum9] or c jr z, .LoadMinusTenIfNegative ld a, -10 add c ld [hl], a ld [hPrintNum9], a ret .LoadMinusTenIfNegative: ld a, [hPrintNum10] bit 7, a ret z ld [hl], -10 ret ; 1062ff .Function1062ff: ; 1062ff ld a, [hPrintNum10] bit 7, a jr nz, .asm_10630d bit 6, a jr z, .asm_10630d ld a, [hPrintNum9] and a ret z .asm_10630d inc hl ret ; 10630f ; functions related to the cable club and various NPC scripts referencing mobile communications Mobile_DummyReturnFalse: ; 10630f xor a ld [ScriptVar], a ret ; 106314 MobileFn_106314: mobile ; 106314 ld a, $4 call GetSRAMBank ld a, c cpl ld [$b000], a call CloseSRAM ld a, $7 call GetSRAMBank ld a, c ld [$a800], a call CloseSRAM ret ; 10632f Mobile_AlwaysReturnNotCarry: ; 10632f or a ret Function106331: ; 106331 - called by Mobile_DummyReturnFalse in Crystal-J ; check ~[4:b000] == [7:a800] ld a, $4 call GetSRAMBank ld a, [$b000] cpl ld b, a call CloseSRAM ld a, $7 call GetSRAMBank ld a, [$a800] ld c, a call CloseSRAM ld a, c cp b jr nz, .nope ; check [7:a800] != 0 and a jr z, .nope ; check !([7:a800] & %01110000) and %10001111 cp c jr nz, .nope ld c, a scf ret .nope xor a ld c, a ret ; 10635c Function10635c: ; 10635c ld a, [wMobileCommsJumptableIndex] bit 7, a ret nz ld a, [wMobileCommsJumptableIndex] ld hl, .Jumptable rst JumpTable ret ; 10636a .Jumptable: ; 10636a dw .init dw Function106392 dw Function1063cc dw Function1063d8 dw Function1063e5 dw Function1063f3 dw Function106403 dw Function106442 dw Function106453 ; 10637c .init: ; 10637c ld de, wcd30 ld hl, $41 ld bc, $41 ld a, $40 call Function3e32 ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 106392 Function106392: ; 106392 xor a ld [wcf64], a ld a, [wc821] bit 1, a jr nz, .asm_1063a2 bit 0, a jr z, .asm_1063bf ret .asm_1063a2 call Mobile_AlwaysReturnNotCarry ld a, c and a jr nz, .asm_1063b4 ld a, $b ld [wcf64], a ld a, $7 ld [wMobileCommsJumptableIndex], a ret .asm_1063b4 ld a, $7 ld [wcf64], a ld a, $7 ld [wMobileCommsJumptableIndex], a ret .asm_1063bf ld a, $1 ld [wcf64], a ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 1063cc Function1063cc: ; 1063cc ld a, $78 ld [wcd42], a ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a Function1063d8: ; 1063d8 ld hl, wcd42 dec [hl] ret nz ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 1063e5 Function1063e5: ; 1063e5 ld a, [wcf64] cp $3 ret nz ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 1063f3 Function1063f3: ; 1063f3 ld de, wcd31 ld a, $32 call Function3e32 ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 106403 Function106403: ; 106403 ld a, [wc821] bit 1, a jr nz, .asm_106426 bit 0, a jr z, .asm_10640f ret .asm_10640f ld a, [wcd31] and $80 ld c, a ld a, [wcd30] or c inc a ld c, a call MobileFn_106314 ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret .asm_106426 call Mobile_AlwaysReturnNotCarry ld a, c and a jr z, .asm_106435 ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret .asm_106435 ld c, $0 call MobileFn_106314 ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a ret ; 106442 Function106442: ; 106442 ld a, $36 call Function3e32 xor a ld [hMobile], a ld [hMobileReceive], a ld a, [wMobileCommsJumptableIndex] inc a ld [wMobileCommsJumptableIndex], a Function106453: ; 106453 ld a, [wMobileCommsJumptableIndex] set 7, a ld [wMobileCommsJumptableIndex], a nop ld a, $4 ld [wcf64], a ret ; 106462 MobileFunc_106462: mobile ret ; 106464 Function106464:: ; 106464 ld de, MobilePhoneTilesGFX ld hl, VTiles2 tile $60 lb bc, BANK(MobilePhoneTilesGFX), 1 call Get2bpp ld de, FontsExtra2_UpArrowGFX ld hl, VTiles2 tile $61 lb bc, BANK(FontsExtra2_UpArrowGFX), 1 call Get2bpp ld de, GFX_106514 ld hl, VTiles2 tile $62 ld c, 9 ld b, BANK(GFX_106514) call Get2bpp ld de, $40b0 ld hl, VTiles2 tile $6b ld b, $f ; XXX no graphics at 0f:40b0 call Get2bpp farcall LoadFrame ret ; 10649b Function10649b: ; 10649b ld a, [TextBoxFrame] and $7 ld bc, 3 tiles ld hl, Frames call AddNTimes ld d, h ld e, l ld hl, VTiles2 tile $79 ld c, 6 ld b, BANK(Frames) call Function1064c3 ld hl, VTiles2 tile $7f ld de, TextBoxSpaceGFX ld c, 1 ld b, BANK(TextBoxSpaceGFX) call Function1064c3 ret ; 1064c3 Function1064c3: ; 1064c3 ld a, [rSVBK] push af ld a, $6 ld [rSVBK], a push bc push hl ld hl, Function3f88 ld a, b rst FarCall pop hl pop bc pop af ld [rSVBK], a jr asm_1064ed Function1064d8: ; 1064d8 ld a, [rSVBK] push af ld a, $6 ld [rSVBK], a push bc push hl ld hl, Function3f9f ld a, b rst FarCall pop hl pop bc pop af ld [rSVBK], a jr asm_1064ed asm_1064ed ld de, wDecompressScratch ld b, $0 ld a, [rSVBK] push af ld a, $6 ld [rSVBK], a ld a, [rVBK] push af ld a, $1 ld [rVBK], a call Get2bpp pop af ld [rVBK], a pop af ld [rSVBK], a ret ; 10650a Function10650a: ; 10650a ld de, MobilePhoneTilesGFX + $20 lb bc, BANK(MobilePhoneTilesGFX), $11 call Get2bpp ret ; 106514 GFX_106514: INCBIN "gfx/unknown/106514.2bpp"