diff options
author | Marijn van der Werf <marijn.vanderwerf@gmail.com> | 2017-01-03 02:35:26 +0100 |
---|---|---|
committer | Marijn van der Werf <marijn.vanderwerf@gmail.com> | 2017-01-03 02:39:58 +0100 |
commit | 2f362cf67ab65f62ec3a2a2a6497615cb8bc502c (patch) | |
tree | f2bf01877826cdc92b4a14a64da588f6dda8db0b | |
parent | 6c4a8ac10ef7af3c05e32c9ca293556f2d9b6509 (diff) |
Partly decompile tv show
-rw-r--r-- | asm/tv.s | 676 | ||||
-rw-r--r-- | constants/misc_constants.inc | 2 | ||||
-rw-r--r-- | data/data_83760F0.s | 25 | ||||
-rw-r--r-- | include/asm.inc.h | 13 | ||||
-rw-r--r-- | include/global.h | 88 | ||||
-rw-r--r-- | ld_script.txt | 7 | ||||
-rw-r--r-- | src/tv.c | 293 |
7 files changed, 435 insertions, 669 deletions
@@ -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; +} |