summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/tv.s676
-rw-r--r--constants/misc_constants.inc2
-rw-r--r--data/data_83760F0.s25
-rw-r--r--include/asm.inc.h13
-rw-r--r--include/global.h88
-rw-r--r--ld_script.txt7
-rw-r--r--src/tv.c293
7 files changed, 435 insertions, 669 deletions
diff --git a/asm/tv.s b/asm/tv.s
index f30663f93..018b5a65c 100644
--- a/asm/tv.s
+++ b/asm/tv.s
@@ -1,4 +1,5 @@
.include "constants/gba_constants.inc"
+ .include "constants/misc_constants.inc"
.include "constants/species_constants.inc"
.include "asm/macros.inc"
@@ -940,7 +941,7 @@ _080BDEA6:
sub_80BDEAC: @ 80BDEAC
push {lr}
adds r1, r0, 0
- movs r2, 0x2
+ movs r2, GAME_LANGUAGE
ldrb r0, [r1]
cmp r0, 0xFC
bne _080BDEC0
@@ -1104,7 +1105,7 @@ _080BDFDE:
strh r0, [r5, 0x10]
adds r0, r5, 0
bl sub_80BE138
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r5, 0x2]
adds r0, r6, 0
bl sub_80BDEAC
@@ -1237,7 +1238,7 @@ _080BE0A2:
bl StringCopy
adds r0, r4, 0
bl sub_80BE138
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r4, 0x2]
_080BE112:
pop {r4-r7}
@@ -1367,7 +1368,7 @@ sub_80BE188: @ 80BE188
strb r0, [r4, 0x13]
adds r0, r4, 0
bl sub_80BE160
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r4, 0x1E]
adds r0, r5, 0
bl sub_80BDEAC
@@ -1558,7 +1559,7 @@ _080BE39E:
strb r0, [r6, 0x1B]
adds r0, r6, 0
bl sub_80BE160
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r6, 0x1D]
pop {r4-r6}
pop {r0}
@@ -1639,7 +1640,7 @@ _080BE420:
bl StringCopy
adds r0, r5, 0
bl sub_80BE138
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r5, 0x3]
_080BE458:
pop {r4-r7}
@@ -1654,544 +1655,8 @@ _080BE470: .4byte gMapHeader
_080BE474: .4byte gSaveBlock2
thumb_func_end sub_80BE3BC
- thumb_func_start sub_80BE478
-sub_80BE478: @ 80BE478
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- bl sub_80BF478
- ldr r0, _080BE554 @ =gScriptResult
- ldrh r0, [r0]
- cmp r0, 0x1
- beq _080BE548
- ldr r0, _080BE558 @ =gSpecialVar_0x8004
- mov r8, r0
- ldrh r0, [r0]
- movs r7, 0x64
- muls r0, r7
- ldr r6, _080BE55C @ =gPlayerParty
- adds r0, r6
- ldr r4, _080BE560 @ =gStringVar1
- movs r1, 0x2
- adds r2, r4, 0
- bl GetMonData
- ldr r1, _080BE564 @ =gSaveBlock2
- mov r9, r1
- mov r0, r9
- bl StringLength
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bls _080BE548
- adds r0, r4, 0
- bl StringLength
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bls _080BE548
- ldr r0, _080BE568 @ =gUnknown_03005D38
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _080BE56C @ =gSaveBlock1 + 0x2738
- adds r4, r0
- movs r0, 0x5
- strb r0, [r4]
- movs r5, 0x1
- strb r5, [r4, 0x1]
- mov r1, r8
- ldrh r0, [r1]
- muls r0, r7
- adds r0, r6
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- strh r0, [r4, 0x2]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x3
- bl __umodsi3
- strb r0, [r4, 0x1A]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- ands r0, r5
- strb r0, [r4, 0x1B]
- ldrh r0, [r4, 0x2]
- bl sub_80BF674
- strh r0, [r4, 0x1C]
- adds r0, r4, 0
- adds r0, 0xF
- mov r1, r9
- bl StringCopy
- mov r1, r8
- ldrh r0, [r1]
- muls r0, r7
- adds r0, r6
- adds r5, r4, 0x4
- movs r1, 0x2
- adds r2, r5, 0
- bl GetMonData
- adds r0, r4, 0
- bl sub_80BE160
- movs r0, 0x2
- strb r0, [r4, 0x1E]
- adds r0, r5, 0
- bl sub_80BDEAC
- strb r0, [r4, 0x1F]
- adds r0, r5, 0
- bl StripExtCtrlCodes
-_080BE548:
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE554: .4byte gScriptResult
-_080BE558: .4byte gSpecialVar_0x8004
-_080BE55C: .4byte gPlayerParty
-_080BE560: .4byte gStringVar1
-_080BE564: .4byte gSaveBlock2
-_080BE568: .4byte gUnknown_03005D38
-_080BE56C: .4byte gSaveBlock1 + 0x2738
- thumb_func_end sub_80BE478
-
- thumb_func_start StartMassOutbreak
-StartMassOutbreak: @ 80BE570
- push {r4,lr}
- ldr r0, _080BE5F0 @ =gSpecialVar_0x8004
- ldrh r1, [r0]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r2, _080BE5F4 @ =gSaveBlock1 + 0x2738
- adds r0, r2
- ldrh r3, [r0, 0xC]
- movs r4, 0xF1
- lsls r4, 2
- adds r1, r2, r4
- strh r3, [r1]
- ldrb r3, [r0, 0x10]
- adds r4, 0x2
- adds r1, r2, r4
- strb r3, [r1]
- ldrb r3, [r0, 0x11]
- adds r4, 0x1
- adds r1, r2, r4
- strb r3, [r1]
- ldrb r3, [r0, 0x14]
- adds r4, 0x1
- adds r1, r2, r4
- strb r3, [r1]
- ldrb r3, [r0, 0x2]
- adds r4, 0x1
- adds r1, r2, r4
- strb r3, [r1]
- ldrh r3, [r0, 0xE]
- adds r4, 0x1
- adds r1, r2, r4
- strh r3, [r1]
- ldrh r3, [r0, 0x4]
- adds r4, 0x2
- adds r1, r2, r4
- strh r3, [r1]
- ldrh r3, [r0, 0x6]
- adds r4, 0x2
- adds r1, r2, r4
- strh r3, [r1]
- ldrh r3, [r0, 0x8]
- adds r4, 0x2
- adds r1, r2, r4
- strh r3, [r1]
- ldrh r3, [r0, 0xA]
- adds r4, 0x2
- adds r1, r2, r4
- strh r3, [r1]
- ldrb r3, [r0, 0x3]
- adds r4, 0x2
- adds r1, r2, r4
- strb r3, [r1]
- ldrb r1, [r0, 0x13]
- ldr r3, _080BE5F8 @ =0x000003d5
- adds r0, r2, r3
- strb r1, [r0]
- adds r4, 0x2
- adds r2, r4
- movs r0, 0x2
- strh r0, [r2]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE5F0: .4byte gSpecialVar_0x8004
-_080BE5F4: .4byte gSaveBlock1 + 0x2738
-_080BE5F8: .4byte 0x000003d5
- thumb_func_end StartMassOutbreak
-
- thumb_func_start sub_80BE5FC
-sub_80BE5FC: @ 80BE5FC
- push {r4,lr}
- ldr r0, _080BE64C @ =gUnknown_03005D38
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _080BE650 @ =gSaveBlock1 + 0x2738
- adds r4, r0
- movs r0, 0x1
- strb r0, [r4]
- strb r0, [r4, 0x1]
- adds r0, r4, 0
- adds r0, 0x10
- ldr r1, _080BE654 @ =gSaveBlock2
- bl StringCopy
- bl GetLeadMonIndex
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x64
- muls r0, r1
- ldr r1, _080BE658 @ =gPlayerParty
- adds r0, r1
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- strh r0, [r4, 0x2]
- adds r0, r4, 0
- bl sub_80BE160
- movs r0, 0x2
- strb r0, [r4, 0x18]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE64C: .4byte gUnknown_03005D38
-_080BE650: .4byte gSaveBlock1 + 0x2738
-_080BE654: .4byte gSaveBlock2
-_080BE658: .4byte gPlayerParty
- thumb_func_end sub_80BE5FC
-
- thumb_func_start sub_80BE65C
-sub_80BE65C: @ 80BE65C
- push {r4-r6,lr}
- ldr r0, _080BE694 @ =gUnknown_03005D38
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _080BE698 @ =gSaveBlock1 + 0x2738
- adds r4, r0
- movs r6, 0
- movs r5, 0x2
- strb r5, [r4]
- movs r0, 0x1
- strb r0, [r4, 0x1]
- adds r0, r4, 0
- adds r0, 0x10
- ldr r1, _080BE69C @ =gSaveBlock2
- bl StringCopy
- strh r6, [r4, 0x2]
- adds r0, r4, 0
- bl sub_80BE160
- strb r5, [r4, 0x18]
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE694: .4byte gUnknown_03005D38
-_080BE698: .4byte gSaveBlock1 + 0x2738
-_080BE69C: .4byte gSaveBlock2
- thumb_func_end sub_80BE65C
-
- thumb_func_start sub_80BE6A0
-sub_80BE6A0: @ 80BE6A0
- push {r4-r6,lr}
- mov r6, r8
- push {r6}
- ldr r0, _080BE760 @ =gUnknown_03005D38
- ldrb r0, [r0]
- lsls r0, 24
- asrs r0, 24
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _080BE764 @ =gSaveBlock1 + 0x2738
- adds r4, r0
- movs r0, 0x3
- strb r0, [r4]
- movs r0, 0x1
- strb r0, [r4, 0x1]
- bl GetLeadMonIndex
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x64
- mov r8, r1
- mov r1, r8
- muls r1, r0
- adds r0, r1, 0
- ldr r6, _080BE768 @ =gPlayerParty
- adds r0, r6
- movs r1, 0x20
- movs r2, 0
- bl GetMonData
- lsrs r0, 4
- movs r1, 0xF
- ands r0, r1
- ldrb r2, [r4, 0x4]
- movs r1, 0x10
- negs r1, r1
- ands r1, r2
- orrs r1, r0
- strb r1, [r4, 0x4]
- ldr r0, _080BE76C @ =gSpecialVar_0x8007
- ldrb r0, [r0]
- lsls r0, 4
- movs r2, 0xF
- ands r1, r2
- orrs r1, r0
- strb r1, [r4, 0x4]
- adds r0, r4, 0x5
- ldr r1, _080BE770 @ =gSaveBlock2
- bl StringCopy
- bl GetLeadMonIndex
- lsls r0, 24
- lsrs r0, 24
- mov r1, r8
- muls r1, r0
- adds r0, r1, 0
- adds r0, r6
- adds r5, r4, 0
- adds r5, 0x10
- movs r1, 0x2
- adds r2, r5, 0
- bl GetMonData
- bl GetLeadMonIndex
- lsls r0, 24
- lsrs r0, 24
- mov r1, r8
- muls r1, r0
- adds r0, r1, 0
- adds r0, r6
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- strh r0, [r4, 0x2]
- adds r0, r4, 0
- bl sub_80BE160
- movs r0, 0x2
- strb r0, [r4, 0xD]
- adds r0, r5, 0
- bl sub_80BDEAC
- strb r0, [r4, 0xE]
- adds r0, r5, 0
- bl StripExtCtrlCodes
- pop {r3}
- mov r8, r3
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE760: .4byte gUnknown_03005D38
-_080BE764: .4byte gSaveBlock1 + 0x2738
-_080BE768: .4byte gPlayerParty
-_080BE76C: .4byte gSpecialVar_0x8007
-_080BE770: .4byte gSaveBlock2
- thumb_func_end sub_80BE6A0
-
- thumb_func_start nullsub_21
-nullsub_21: @ 80BE774
- bx lr
- thumb_func_end nullsub_21
- thumb_func_start sub_80BE778
-sub_80BE778: @ 80BE778
- push {r4-r6,lr}
- ldr r0, _080BE83C @ =0x00000804
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _080BE836
- movs r1, 0
- ldr r3, _080BE840 @ =gSaveBlock1
- ldr r2, _080BE844 @ =0x00002738
-_080BE78C:
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r0, r3
- adds r0, r2
- ldrb r0, [r0]
- cmp r0, 0x29
- beq _080BE836
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x17
- bls _080BE78C
- ldr r0, _080BE848 @ =0x00000147
- bl sub_80BF77C
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0
- bne _080BE836
- ldr r6, _080BE84C @ =gSaveBlock1 + 0x2738
- adds r0, r6, 0
- bl sub_80BF720
- ldr r4, _080BE850 @ =gUnknown_03005D38
- strb r0, [r4]
- lsls r0, 24
- asrs r0, 24
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- beq _080BE836
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x5
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0
- ldrsb r1, [r4, r1]
- lsls r4, r1, 3
- adds r4, r1
- lsls r4, 2
- adds r4, r6
- movs r1, 0x29
- strb r1, [r4]
- movs r3, 0x1
- strb r3, [r4, 0x1]
- ldr r2, _080BE854 @ =gUnknown_083D13F8
- lsls r1, r0, 1
- adds r1, r0
- lsls r1, 2
- adds r1, r2
- ldrb r0, [r1, 0xA]
- strb r0, [r4, 0x14]
- strb r5, [r4, 0x2]
- strb r5, [r4, 0x3]
- ldrh r0, [r1]
- movs r2, 0
- strh r0, [r4, 0xC]
- strh r5, [r4, 0xE]
- ldrh r0, [r1, 0x2]
- strh r0, [r4, 0x4]
- ldrh r0, [r1, 0x4]
- strh r0, [r4, 0x6]
- ldrh r0, [r1, 0x6]
- strh r0, [r4, 0x8]
- ldrh r0, [r1, 0x8]
- strh r0, [r4, 0xA]
- ldrb r0, [r1, 0xB]
- strb r0, [r4, 0x10]
- strb r2, [r4, 0x11]
- strb r2, [r4, 0x12]
- movs r0, 0x32
- strb r0, [r4, 0x13]
- strb r2, [r4, 0x15]
- strh r3, [r4, 0x16]
- adds r0, r4, 0
- bl sub_80BE160
- movs r0, 0x2
- strb r0, [r4, 0x18]
-_080BE836:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE83C: .4byte 0x00000804
-_080BE840: .4byte gSaveBlock1
-_080BE844: .4byte 0x00002738
-_080BE848: .4byte 0x00000147
-_080BE84C: .4byte gSaveBlock1 + 0x2738
-_080BE850: .4byte gUnknown_03005D38
-_080BE854: .4byte gUnknown_083D13F8
- thumb_func_end sub_80BE778
-
- thumb_func_start EndMassOutbreak
-EndMassOutbreak: @ 80BE858
- push {r4,lr}
- ldr r0, _080BE8B4 @ =gSaveBlock1
- ldr r2, _080BE8B8 @ =0x00002afc
- adds r1, r0, r2
- movs r3, 0
- movs r2, 0
- strh r2, [r1]
- ldr r4, _080BE8BC @ =0x00002afe
- adds r1, r0, r4
- strb r3, [r1]
- adds r4, 0x1
- adds r1, r0, r4
- strb r3, [r1]
- adds r4, 0x1
- adds r1, r0, r4
- strb r3, [r1]
- adds r4, 0x1
- adds r1, r0, r4
- strb r3, [r1]
- adds r4, 0x1
- adds r1, r0, r4
- strh r2, [r1]
- adds r4, 0x2
- adds r1, r0, r4
- strh r2, [r1]
- adds r4, 0x2
- adds r1, r0, r4
- strh r2, [r1]
- adds r4, 0x2
- adds r1, r0, r4
- strh r2, [r1]
- adds r4, 0x2
- adds r1, r0, r4
- strh r2, [r1]
- adds r4, 0x2
- adds r1, r0, r4
- strb r3, [r1]
- adds r4, 0x1
- adds r1, r0, r4
- strb r3, [r1]
- ldr r1, _080BE8C0 @ =0x00002b0e
- adds r0, r1
- strh r2, [r0]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080BE8B4: .4byte gSaveBlock1
-_080BE8B8: .4byte 0x00002afc
-_080BE8BC: .4byte 0x00002afe
-_080BE8C0: .4byte 0x00002b0e
- thumb_func_end EndMassOutbreak
-
- thumb_func_start sub_80BE8C4
-sub_80BE8C4: @ 80BE8C4
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- adds r0, r4, 0
- bl sub_80BE8EC
- adds r0, r4, 0
- bl UpdateMassOutbreakTimeLeft
- adds r0, r4, 0
- bl sub_80BEE84
- adds r0, r4, 0
- bl sub_80BEA5C
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_80BE8C4
+ .section .text_80BE8EC
thumb_func_start sub_80BE8EC
sub_80BE8EC: @ 80BE8EC
@@ -2368,7 +1833,7 @@ sub_80BE9D4: @ 80BE9D4
bl StringCopy
adds r0, r4, 0
bl sub_80BE138
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r4, 0x6]
_080BEA36:
pop {r4,r5}
@@ -2472,7 +1937,7 @@ sub_80BEA88: @ 80BEA88
bl StringCopy
adds r0, r4, 0
bl sub_80BE138
- movs r0, 0x2
+ movs r0, GAME_LANGUAGE
strb r0, [r4, 0xB]
_080BEB04:
pop {r4-r7}
@@ -3780,46 +3245,7 @@ _080BF4EC: .4byte gUnknown_03005D38
_080BF4F0: .4byte gSaveBlock1 + 0x2738
thumb_func_end sub_80BF4BC
- thumb_func_start sub_80BF4F4
-sub_80BF4F4: @ 80BF4F4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x64
- adds r4, r0, 0
- muls r4, r1
- ldr r0, _080BF530 @ =gPlayerParty
- adds r4, r0
- ldr r5, _080BF534 @ =gStringVar1
- adds r0, r4, 0
- movs r1, 0x2
- adds r2, r5, 0
- bl GetMonData
- adds r0, r4, 0
- movs r1, 0xB
- movs r2, 0
- bl GetMonData
- movs r1, 0xB
- muls r0, r1
- ldr r1, _080BF538 @ =gSpeciesNames
- adds r0, r1
- adds r1, r5, 0
- bl StringCompareWithoutExtCtrlCodes
- cmp r0, 0
- beq _080BF53C
- movs r0, 0x1
- b _080BF53E
- .align 2, 0
-_080BF530: .4byte gPlayerParty
-_080BF534: .4byte gStringVar1
-_080BF538: .4byte gSpeciesNames
-_080BF53C:
- movs r0, 0
-_080BF53E:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80BF4F4
+.section .text_80BF544
thumb_func_start sub_80BF544
sub_80BF544: @ 80BF544
@@ -8493,48 +7919,7 @@ nullsub_22: @ 80C1BF4
bx lr
thumb_func_end nullsub_22
- thumb_func_start DoTVShowPokemonNewsMassOutbreak
-DoTVShowPokemonNewsMassOutbreak: @ 80C1BF8
- push {r4,lr}
- ldr r0, _080C1C40 @ =gSpecialVar_0x8004
- ldrh r0, [r0]
- lsls r4, r0, 3
- adds r4, r0
- lsls r4, 2
- ldr r0, _080C1C44 @ =gSaveBlock1 + 0x2738
- adds r4, r0
- ldr r0, _080C1C48 @ =gStringVar1
- ldrb r1, [r4, 0x10]
- movs r2, 0
- bl sub_80FBFB4
- ldr r0, _080C1C4C @ =gStringVar2
- ldrh r2, [r4, 0xC]
- movs r1, 0xB
- muls r1, r2
- ldr r2, _080C1C50 @ =gSpeciesNames
- adds r1, r2
- bl StringCopy
- bl TVShowDone
- bl StartMassOutbreak
- ldr r1, _080C1C54 @ =gUnknown_083D14BC
- ldr r0, _080C1C58 @ =gUnknown_020387E8
- ldrb r0, [r0]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl ShowFieldMessage
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080C1C40: .4byte gSpecialVar_0x8004
-_080C1C44: .4byte gSaveBlock1 + 0x2738
-_080C1C48: .4byte gStringVar1
-_080C1C4C: .4byte gStringVar2
-_080C1C50: .4byte gSpeciesNames
-_080C1C54: .4byte gUnknown_083D14BC
-_080C1C58: .4byte gUnknown_020387E8
- thumb_func_end DoTVShowPokemonNewsMassOutbreak
+.section .text_80C1C5C
thumb_func_start DoTVShowInSearchOfTrainers
DoTVShowInSearchOfTrainers: @ 80C1C5C
@@ -8936,42 +8321,5 @@ _080C1FD4: .4byte gSpeciesNames
_080C1FD8: .4byte gUnknown_083D15F4
thumb_func_end DoTVShowTheWorldOfMasters
- thumb_func_start TVShowDone
-TVShowDone: @ 80C1FDC
- ldr r1, _080C2000 @ =gScriptResult
- movs r0, 0x1
- strh r0, [r1]
- ldr r1, _080C2004 @ =gUnknown_020387E8
- movs r0, 0
- strb r0, [r1]
- ldr r2, _080C2008 @ =gSaveBlock1
- ldr r0, _080C200C @ =gSpecialVar_0x8004
- ldrh r1, [r0]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- ldr r1, _080C2010 @ =0x00002739
- adds r0, r1
- movs r1, 0
- strb r1, [r0]
- bx lr
- .align 2, 0
-_080C2000: .4byte gScriptResult
-_080C2004: .4byte gUnknown_020387E8
-_080C2008: .4byte gSaveBlock1
-_080C200C: .4byte gSpecialVar_0x8004
-_080C2010: .4byte 0x00002739
- thumb_func_end TVShowDone
-
- thumb_func_start sub_80C2014
-sub_80C2014: @ 80C2014
- ldr r1, _080C201C @ =gUnknown_020387E8
- movs r0, 0
- strb r0, [r1]
- bx lr
- .align 2, 0
-_080C201C: .4byte gUnknown_020387E8
- thumb_func_end sub_80C2014
.align 2, 0 @ Don't pad with nop.
diff --git a/constants/misc_constants.inc b/constants/misc_constants.inc
index 64f671e8f..dcb3ab287 100644
--- a/constants/misc_constants.inc
+++ b/constants/misc_constants.inc
@@ -31,3 +31,5 @@
.equiv MALE, 0
.equiv FEMALE, 1
+
+ .equiv GAME_LANGUAGE, 2
diff --git a/data/data_83760F0.s b/data/data_83760F0.s
index e21f45b0b..580b063ac 100644
--- a/data/data_83760F0.s
+++ b/data/data_83760F0.s
@@ -7959,7 +7959,30 @@ gUnknown_083D13EC:: @ 83D13EC
.incbin "baserom.gba", 0x003d13ec, 0xc
gUnknown_083D13F8:: @ 83D13F8
- .incbin "baserom.gba", 0x003d13f8, 0x3c
+ .2byte SPECIES_SURSKIT
+ .2byte MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE
+ .byte 3
+ .byte MAPSEC_Route102
+
+ .2byte SPECIES_SURSKIT
+ .2byte MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE
+ .byte 15
+ .byte MAPSEC_Route114
+
+ .2byte SPECIES_SURSKIT
+ .2byte MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE
+ .byte 15
+ .byte MAPSEC_Route117
+
+ .2byte SPECIES_SURSKIT
+ .2byte MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE
+ .byte 28
+ .byte MAPSEC_Route120
+
+ .2byte SPECIES_SKITTY
+ .2byte MOVE_GROWL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE
+ .byte 15
+ .byte MAPSEC_Route116
.align 2
gUnknown_083D1434:: @ 83D1434
diff --git a/include/asm.inc.h b/include/asm.inc.h
index a7c40a08d..4d49ef7b6 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -278,12 +278,24 @@ void sub_80BD674(void *, u32, u8);
void sub_80BD7A8(void);
void UpdateTVScreensOnMap(u32, u32);
void sub_80BDAB4(void);
+u8 sub_80BDEAC(u8 *);
+void sub_80BE160(TVShow *);
+void sub_80BE8EC(u16);
+void UpdateMassOutbreakTimeLeft(u16);
void sub_80BE97C(u8);
void sub_80BEA50(u16);
+void sub_80BEA5C(u16);
bool8 GetPriceReduction(u8);
+void sub_80BEE84(u16);
u8 sub_80BF0B8(u32);
+void sub_80BF478(void);
+u16 sub_80BF674(u16 species);
+s8 sub_80BF720(TVShow *);
+u8 sub_80BF77C(u32);
void sub_80BFD44(void *, u32, u8);
void sub_80C0514(void *, u32, u8);
+void StartMassOutbreak(void);
+void TVShowDone(void);
// asm/contest_link_80C2020.o
void sub_80C2358(void);
@@ -360,6 +372,7 @@ bool8 SB1ContainsWords(u16 *);
bool8 IsEasyChatPairEqual(u16 *, u16 *);
// asm/region_map.o
+void sub_80FBFB4(u8 *str, u8 region, u8);
void CopyMapName();
// asm/slot_machine.o
diff --git a/include/global.h b/include/global.h
index 004d9c50d..b74956aa7 100644
--- a/include/global.h
+++ b/include/global.h
@@ -183,6 +183,84 @@ struct EasyChatPair
u16 words[2];
}; /*size = 0x8*/
+struct TVShowCommon {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+};
+
+struct TVShowFanClubLetter {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+ /*0x02*/ u16 species;
+ u8 pad04[12];
+ /*0x10*/ u8 playerName[8];
+ /*0x18*/ u8 var18;
+};
+
+struct TVShowRecentHappenings {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+ /*0x02*/ u16 var02;
+ u8 pad04[12];
+ /*0x10*/ u8 var10[8];
+ /*0x18*/ u8 var18;
+ u8 pad19[10];
+};
+
+struct TVShowFanclubOpinions {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+ /*0x02*/ u16 var02;
+ /*0x04*/ u8 var04A:4;
+ u8 var04B:4;
+ /*0x04*/ u8 var05[8];
+ /*0x0D*/ u8 var0D;
+ /*0x0E*/ u8 var0E;
+ /*0x0F*/ u8 var0F;
+ /*0x10*/ u8 var10[8];
+};
+
+struct TVShowNameRaterShow {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+ /*0x02*/ u16 species;
+ /*0x04*/ u8 pokemonName[11];
+ /*0x0F*/ u8 trainerName[11];
+ /*0x1A*/ u8 random;
+ /*0x1B*/ u8 random2;
+ /*0x1C*/ u16 var1C;
+ /*0x1E*/ u8 language;
+ /*0x1F*/ u8 var1F;
+};
+
+struct TVShowMassOutbreak {
+ /*0x00*/ u8 var00;
+ /*0x01*/ u8 var01;
+ /*0x02*/ u8 var02;
+ /*0x03*/ u8 var03;
+ /*0x04*/ u16 moves[4];
+ /*0x0C*/ u16 species;
+ /*0x0E*/ u16 var0E;
+ /*0x10*/ u8 locationMapNum;
+ /*0x11*/ u8 locationMapGroup;
+ /*0x12*/ u8 var12;
+ /*0x13*/ u8 probability;
+ /*0x14*/ u8 level;
+ /*0x15*/ u8 var15;
+ /*0x16*/ u16 var16;
+ /*0x18*/ u8 var18;
+ u8 pad19[11];
+};
+
+typedef union TVShow {
+ struct TVShowCommon common;
+ struct TVShowFanClubLetter fanclubLetter;
+ struct TVShowRecentHappenings recentHappenings;
+ struct TVShowFanclubOpinions fanclubOpinions;
+ struct TVShowNameRaterShow nameRaterShow;
+ struct TVShowMassOutbreak massOutbreak;
+} TVShow;
+
struct MailStruct
{
/*0x00*/ u16 words[9];
@@ -241,17 +319,19 @@ struct SaveBlock1
/*0x2704*/ u8 decorDoll[40];
/*0x272C*/ u8 decorCushion[10];
/*0x2736*/ u8 padding_2736[2];
- /*0x2738*/ u8 tvShows[24][36]; // TODO: TV show struct
+ /*0x2738*/ TVShow tvShows[24];
/*0x2A98*/ u8 filler_2A98[0x64];
/*0x2AFC*/ u16 outbreakPokemonSpecies;
/*0x2AFE*/ u8 outbreakLocationMapNum;
/*0x2AFF*/ u8 outbreakLocationMapGroup;
/*0x2B00*/ u8 outbreakPokemonLevel;
- /*0x2B01*/ u8 filler_2B01[3];
+ /*0x2B01*/ u8 outbreakUnk1;
+ /*0x2B02*/ u16 outbreakUnk2;
/*0x2B04*/ u16 outbreakPokemonMoves[4];
- /*0x2B0C*/ u8 unk2B0C;
+ /*0x2B0C*/ u8 outbreakUnk4;
/*0x2B0D*/ u8 outbreakPokemonProbability;
- /*0x2B0E*/ u8 filler_2B0E[0xE];
+ /*0x2B0E*/ u16 outbreakUnk5;
+ /*0x2B10*/ u8 filler_2B0E[0xC];
/*0x2B1C*/ u16 unk2B1C[4];
/*0x2B24*/ u8 filler_2B24[0x28];
/*0x2B4C*/ struct MailStruct mail[16];
diff --git a/ld_script.txt b/ld_script.txt
index ad9cd02a3..9b1f3c02f 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -146,6 +146,13 @@ SECTIONS {
asm/sound_check_menu.o(.text);
asm/secret_base.o(.text);
asm/tv.o(.text);
+ src/tv.o(.text);
+ asm/tv.o(.text_80BE8EC);
+ src/tv.o(.text_b);
+ asm/tv.o(.text_80BF544);
+ src/tv.o(.text_c);
+ asm/tv.o(.text_80C1C5C);
+ src/tv.o(.text_d);
asm/contest_link_80C2020.o(.text);
asm/script_pokemon_util_80C4BF0.o(.text);
src/field_poison.o(.text);
diff --git a/src/tv.c b/src/tv.c
new file mode 100644
index 000000000..21cfc3379
--- /dev/null
+++ b/src/tv.c
@@ -0,0 +1,293 @@
+#include "global.h"
+#include "asm.h"
+#include "event_data.h"
+#include "field_message_box.h"
+#include "flags.h"
+#include "global.h"
+#include "rng.h"
+#include "string_util.h"
+#include "text.h"
+
+enum {
+ TVSHOW_FAN_CLUB_LETTER = 1,
+ TVSHOW_RECENT_HAPPENINGS = 2,
+ TVSHOW_PKMN_FAN_CLUB_OPINIONS = 3,
+ TVSHOW_NAME_RATER_SHOW = 5,
+ TVSHOW_MASS_OUTBREAK = 41,
+};
+
+struct UnkTvStruct {
+ s8 var0;
+};
+
+struct OutbreakPokemon {
+ /* 0x00 */ u16 species;
+ /* 0x02 */ u16 moves[4];
+ /* 0x0A */ u8 level;
+ /* 0x0B */ u8 location;
+};
+
+extern u16 gSpecialVar_0x8004;
+extern u8 gSpecialVar_0x8007;
+extern u16 gScriptResult;
+extern u8 gUnknown_020387E8;
+
+extern struct UnkTvStruct gUnknown_03005D38;
+
+extern u8 gSpeciesNames[][11];
+extern u8 *gUnknown_083D14BC[];
+extern struct OutbreakPokemon gUnknown_083D13F8[5];
+
+void sub_80BE478(void) {
+ u16 playerNameLength;
+ u16 pokemonNicknameLength;
+ TVShow *tvShow;
+
+ sub_80BF478();
+
+ if (gScriptResult == 1) {
+ return;
+ }
+
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
+
+ playerNameLength = StringLength(gSaveBlock2.playerName);
+ if (playerNameLength <= 1) {
+ return;
+ }
+
+ pokemonNicknameLength = StringLength(gStringVar1);
+ if (pokemonNicknameLength <= 1) {
+ return;
+ }
+
+ tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+
+ tvShow->nameRaterShow.var00 = TVSHOW_NAME_RATER_SHOW;
+ tvShow->nameRaterShow.var01 = 1;
+
+ tvShow->nameRaterShow.species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);
+ tvShow->nameRaterShow.random = Random() % 3;
+ tvShow->nameRaterShow.random2 = Random() % 2;
+
+ tvShow->nameRaterShow.var1C = sub_80BF674(tvShow->nameRaterShow.species);
+
+ StringCopy(tvShow->nameRaterShow.trainerName, gSaveBlock2.playerName);
+
+ GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, tvShow->nameRaterShow.pokemonName);
+
+ sub_80BE160(tvShow);
+
+ tvShow->nameRaterShow.language = GAME_LANGUAGE;
+ tvShow->nameRaterShow.var1F = sub_80BDEAC(tvShow->nameRaterShow.pokemonName);
+
+ StripExtCtrlCodes(tvShow->nameRaterShow.pokemonName);
+}
+
+void StartMassOutbreak(void) {
+ TVShow *tvShow;
+
+ tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
+
+ gSaveBlock1.outbreakPokemonSpecies = tvShow->massOutbreak.species;
+ gSaveBlock1.outbreakLocationMapNum = tvShow->massOutbreak.locationMapNum;
+ gSaveBlock1.outbreakLocationMapGroup = tvShow->massOutbreak.locationMapGroup;
+ gSaveBlock1.outbreakPokemonLevel = tvShow->massOutbreak.level;
+ gSaveBlock1.outbreakUnk1 = tvShow->massOutbreak.var02;
+ gSaveBlock1.outbreakUnk2 = tvShow->massOutbreak.var0E;
+ gSaveBlock1.outbreakPokemonMoves[0] = tvShow->massOutbreak.moves[0];
+ gSaveBlock1.outbreakPokemonMoves[1] = tvShow->massOutbreak.moves[1];
+ gSaveBlock1.outbreakPokemonMoves[2] = tvShow->massOutbreak.moves[2];
+ gSaveBlock1.outbreakPokemonMoves[3] = tvShow->massOutbreak.moves[3];
+ gSaveBlock1.outbreakUnk4 = tvShow->massOutbreak.var03;
+ gSaveBlock1.outbreakPokemonProbability = tvShow->massOutbreak.probability;
+ gSaveBlock1.outbreakUnk5 = 2;
+}
+
+void sub_80BE5FC(void) {
+ TVShow *tvShow;
+ u16 species;
+
+ tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+
+ tvShow->fanclubLetter.var00 = TVSHOW_FAN_CLUB_LETTER;
+ tvShow->fanclubLetter.var01 = 1;
+ StringCopy(tvShow->fanclubLetter.playerName, gSaveBlock2.playerName);
+
+ species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
+ tvShow->fanclubLetter.species = species;
+ sub_80BE160(tvShow);
+ tvShow->fanclubLetter.var18 = GAME_LANGUAGE;
+}
+
+void sub_80BE65C(void) {
+ TVShow *tvShow;
+
+ tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+
+ tvShow->recentHappenings.var00 = TVSHOW_RECENT_HAPPENINGS;
+ tvShow->recentHappenings.var01 = 1;
+ StringCopy(&tvShow->recentHappenings.var10[0], &gSaveBlock2.playerName[0]);
+ tvShow->recentHappenings.var02 = 0;
+
+ sub_80BE160(tvShow);
+ tvShow->recentHappenings.var18 = GAME_LANGUAGE;
+}
+
+void sub_80BE6A0(void) {
+ TVShow *tvShow;
+ u8 monIndex;
+
+ tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+
+ tvShow->fanclubOpinions.var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
+ tvShow->fanclubOpinions.var01 = 1;
+
+ monIndex = GetLeadMonIndex();
+
+ tvShow->fanclubOpinions.var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16;
+ tvShow->fanclubOpinions.var04B = gSpecialVar_0x8007;
+
+
+ StringCopy(tvShow->fanclubOpinions.var05, gSaveBlock2.playerName);
+
+ GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, tvShow->fanclubOpinions.var10);
+
+ tvShow->fanclubOpinions.var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
+ sub_80BE160(tvShow);
+ tvShow->fanclubOpinions.var0D = GAME_LANGUAGE;
+ tvShow->fanclubOpinions.var0E = sub_80BDEAC(tvShow->fanclubOpinions.var10);
+ StripExtCtrlCodes(tvShow->fanclubOpinions.var10);
+}
+
+void nullsub_21(void) {
+
+}
+
+void sub_80BE778(void) {
+ u8 i;
+
+ if (!FlagGet(SYS_GAME_CLEAR)) {
+ return;
+ }
+
+
+ for (i = 0; i < 24; i++) {
+ if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) {
+ return;
+ }
+ }
+
+ if (sub_80BF77C(0x147)) {
+ return;
+ }
+
+ gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
+ if (gUnknown_03005D38.var0 == -1) {
+ return;
+ }
+ {
+ u16 rand;
+ u16 val;
+ s32 val2;
+ TVShow *tvShow;
+
+ rand = Random();
+ val = rand % 5;
+
+ val2 = gUnknown_03005D38.var0;
+
+ tvShow = &gSaveBlock1.tvShows[val2];
+
+ tvShow->massOutbreak.var00 = TVSHOW_MASS_OUTBREAK;
+ tvShow->massOutbreak.var01 = 1;
+
+ tvShow->massOutbreak.level = gUnknown_083D13F8[val].level;
+ tvShow->massOutbreak.var02 = 0;
+ tvShow->massOutbreak.var03 = 0;
+ tvShow->massOutbreak.species = gUnknown_083D13F8[val].species;
+ tvShow->massOutbreak.var0E = 0;
+ tvShow->massOutbreak.moves[0] = gUnknown_083D13F8[val].moves[0];
+ tvShow->massOutbreak.moves[1] = gUnknown_083D13F8[val].moves[1];
+ tvShow->massOutbreak.moves[2] = gUnknown_083D13F8[val].moves[2];
+ tvShow->massOutbreak.moves[3] = gUnknown_083D13F8[val].moves[3];
+ tvShow->massOutbreak.locationMapNum = gUnknown_083D13F8[val].location;
+ tvShow->massOutbreak.locationMapGroup = 0;
+ tvShow->massOutbreak.var12 = 0;
+ tvShow->massOutbreak.probability = 0x32;
+ tvShow->massOutbreak.var15 = 0;
+ tvShow->massOutbreak.var16 = 0x01;
+ sub_80BE160(tvShow);
+
+ tvShow->massOutbreak.var18 = GAME_LANGUAGE;
+ }
+}
+
+void EndMassOutbreak(void) {
+ gSaveBlock1.outbreakPokemonSpecies = 0;
+ gSaveBlock1.outbreakLocationMapNum = 0;
+ gSaveBlock1.outbreakLocationMapGroup = 0;
+ gSaveBlock1.outbreakPokemonLevel = 0;
+ gSaveBlock1.outbreakUnk1 = 0;
+ gSaveBlock1.outbreakUnk2 = 0;
+ gSaveBlock1.outbreakPokemonMoves[0] = 0;
+ gSaveBlock1.outbreakPokemonMoves[1] = 0;
+ gSaveBlock1.outbreakPokemonMoves[2] = 0;
+ gSaveBlock1.outbreakPokemonMoves[3] = 0;
+ gSaveBlock1.outbreakUnk4 = 0;
+ gSaveBlock1.outbreakPokemonProbability = 0;
+ gSaveBlock1.outbreakUnk5 = 0;
+}
+
+void sub_80BE8C4(u16 arg0) {
+ sub_80BE8EC(arg0);
+ UpdateMassOutbreakTimeLeft(arg0);
+ sub_80BEE84(arg0);
+ sub_80BEA5C(arg0);
+}
+
+asm(".section .text_b");
+
+u8 sub_80BF4F4(u8 arg0) {
+ u32 species;
+
+ GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1);
+
+ species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL);
+
+ if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+asm(".section .text_c");
+
+void DoTVShowPokemonNewsMassOutbreak(void) {
+ TVShow *tvShow;
+
+ tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
+
+ sub_80FBFB4(gStringVar1, tvShow->massOutbreak.locationMapNum, 0);
+
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->massOutbreak.species]);
+
+ TVShowDone();
+ StartMassOutbreak();
+
+ ShowFieldMessage(gUnknown_083D14BC[gUnknown_020387E8]);
+}
+
+asm(".section .text_d");
+
+void TVShowDone(void) {
+ gScriptResult = 1;
+ gUnknown_020387E8 = 0;
+
+ gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0;
+}
+
+void sub_80C2014(void) {
+ gUnknown_020387E8 = 0;
+}