From 95ee1e7188948931d49fdcff23ecb29cafc527e5 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sat, 3 Dec 2016 12:46:03 +0100 Subject: [PATCH] Decompile sub_8093110 and sub_8093130 --- asm/battle_records.s | 12 +- asm/cable_club.s | 4 +- asm/trainer_card.s | 575 ----------------------------------------- include/asm.inc.h | 7 +- include/global.h | 14 +- include/pokedex.h | 2 +- include/rom4.h | 9 +- include/trainer_card.h | 105 ++++++++ ld_script.txt | 1 + src/new_game.c | 2 +- src/rom4.c | 8 - src/start_menu.c | 1 + src/trainer_card.c | 335 ++++++++++++++++++++++++ sym_ewram.txt | 13 +- 14 files changed, 476 insertions(+), 612 deletions(-) create mode 100644 include/trainer_card.h create mode 100644 src/trainer_card.c diff --git a/asm/battle_records.s b/asm/battle_records.s index 4960803ca..6de48aea2 100644 --- a/asm/battle_records.s +++ b/asm/battle_records.s @@ -367,7 +367,7 @@ sub_81101FC: @ 81101FC lsls r1, r0, 3 subs r1, r0 lsls r1, 3 - ldr r0, _08110220 @ =gUnknown_0202FFD4 + ldr r0, _08110220 @ =gTrainerCards + 0x14 adds r1, r0 ldrh r0, [r1] adds r0, 0x1 @@ -382,7 +382,7 @@ _0811021A: pop {r0} bx r0 .align 2, 0 -_08110220: .4byte gUnknown_0202FFD4 +_08110220: .4byte gTrainerCards + 0x14 _08110224: .4byte 0x0000270f thumb_func_end sub_81101FC @@ -392,7 +392,7 @@ sub_8110228: @ 8110228 lsls r1, r0, 3 subs r1, r0 lsls r1, 3 - ldr r0, _0811024C @ =gUnknown_0202FFD6 + ldr r0, _0811024C @ =gTrainerCards + 0x16 adds r1, r0 ldrh r0, [r1] adds r0, 0x1 @@ -407,7 +407,7 @@ _08110246: pop {r0} bx r0 .align 2, 0 -_0811024C: .4byte gUnknown_0202FFD6 +_0811024C: .4byte gTrainerCards + 0x16 _08110250: .4byte 0x0000270f thumb_func_end sub_8110228 @@ -452,7 +452,7 @@ sub_8110290: @ 8110290 lsls r2, r4, 3 subs r2, r4 lsls r2, 3 - ldr r3, _081102D8 @ =gUnknown_0202FFF0 + ldr r3, _081102D8 @ =gUnknown_0202FFF0 + 0x30 adds r1, r2, r3 subs r3, 0x30 adds r2, r3 @@ -477,7 +477,7 @@ sub_8110290: @ 8110290 bx r0 .align 2, 0 _081102D4: .4byte gSaveBlock1 + 0x30B8 -_081102D8: .4byte gUnknown_0202FFF0 +_081102D8: .4byte gTrainerCards + 0x30 _081102DC: .4byte gUnknown_02024D26 _081102E0: .4byte gLinkPlayers _081102E4: .4byte gLinkPlayerMapObjects diff --git a/asm/cable_club.s b/asm/cable_club.s index c1275ee1d..8d11915cb 100644 --- a/asm/cable_club.s +++ b/asm/cable_club.s @@ -810,10 +810,10 @@ sub_8083314: @ 8083314 cmp r4, r0 bne _080833B6 movs r4, 0 - ldr r6, _0808333C @ =gUnknown_0202FFC0 + ldr r6, _0808333C @ =gTrainerCards b _0808335A .align 2, 0 -_0808333C: .4byte gUnknown_0202FFC0 +_0808333C: .4byte gTrainerCards _08083340: lsls r1, r4, 8 ldr r0, _08083394 @ =gBlockRecvBuffer diff --git a/asm/trainer_card.s b/asm/trainer_card.s index e46113132..beddfde18 100644 --- a/asm/trainer_card.s +++ b/asm/trainer_card.s @@ -6,581 +6,6 @@ .text - thumb_func_start sub_8093110 -sub_8093110: @ 8093110 - push {lr} - bl sub_80932AC - ldr r0, _08093128 @ =sub_8093174 - bl SetMainCallback2 - ldr r0, _0809312C @ =0x02000000 - adds r0, 0x9C - movs r1, 0x2 - strb r1, [r0] - pop {r0} - bx r0 - .align 2, 0 -_08093128: .4byte sub_8093174 -_0809312C: .4byte 0x02000000 - thumb_func_end sub_8093110 - - thumb_func_start sub_8093130 -sub_8093130: @ 8093130 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - adds r0, r4, 0 - bl sub_80932E4 - ldr r0, _08093164 @ =sub_8093174 - bl SetMainCallback2 - ldr r2, _08093168 @ =0x02000000 - ldr r3, _0809316C @ =gLinkPlayers - ldr r0, _08093170 @ =gLinkPlayerMapObjects - lsls r4, 2 - adds r4, r0 - ldrb r1, [r4, 0x1] - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - adds r0, r3 - ldrh r0, [r0, 0x1A] - adds r2, 0x9C - strb r0, [r2] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08093164: .4byte sub_8093174 -_08093168: .4byte 0x02000000 -_0809316C: .4byte gLinkPlayers -_08093170: .4byte gLinkPlayerMapObjects - thumb_func_end sub_8093130 - - thumb_func_start sub_8093174 -sub_8093174: @ 8093174 - push {lr} - ldr r0, _0809318C @ =gMain - ldr r1, _08093190 @ =0x0000043c - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x8 - bhi _08093232 - lsls r0, 2 - ldr r1, _08093194 @ =_08093198 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809318C: .4byte gMain -_08093190: .4byte 0x0000043c -_08093194: .4byte _08093198 - .align 2, 0 -_08093198: - .4byte _080931BC - .4byte _080931C6 - .4byte _080931CC - .4byte _080931D2 - .4byte _080931DC - .4byte _080931EC - .4byte _08093200 - .4byte _08093206 - .4byte _08093220 -_080931BC: - bl sub_8093534 - bl sub_8093688 - b _0809320A -_080931C6: - bl sub_8093598 - b _0809320A -_080931CC: - bl sub_80935EC - b _0809320A -_080931D2: - bl sub_8093610 - bl sub_80937A4 - b _0809320A -_080931DC: - bl sub_80937BC - ldr r1, _080931F8 @ =gMain - ldr r0, _080931FC @ =0x0000043c - adds r1, r0 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_080931EC: - bl MultistepInitMenuWindowContinue - cmp r0, 0 - beq _08093232 - b _0809320A - .align 2, 0 -_080931F8: .4byte gMain -_080931FC: .4byte 0x0000043c -_08093200: - bl sub_80937F0 - b _0809320A -_08093206: - bl sub_80937D8 -_0809320A: - ldr r1, _08093218 @ =gMain - ldr r0, _0809321C @ =0x0000043c - adds r1, r0 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - b _08093232 - .align 2, 0 -_08093218: .4byte gMain -_0809321C: .4byte 0x0000043c -_08093220: - bl nullsub_15 - bl sub_8093800 - bl sub_8093550 - ldr r0, _08093238 @ =sub_809323C - bl SetMainCallback2 -_08093232: - pop {r0} - bx r0 - .align 2, 0 -_08093238: .4byte sub_809323C - thumb_func_end sub_8093174 - - thumb_func_start sub_809323C -sub_809323C: @ 809323C - push {lr} - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r0} - bx r0 - thumb_func_end sub_809323C - - thumb_func_start sub_8093254 -sub_8093254: @ 8093254 - push {lr} - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - ldr r2, _0809329C @ =0x02000000 - ldrb r0, [r2, 0x6] - adds r0, 0x1 - strb r0, [r2, 0x6] - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3B - bls _0809327E - movs r0, 0 - strb r0, [r2, 0x6] - ldrb r0, [r2, 0x5] - movs r1, 0x1 - eors r0, r1 - strb r0, [r2, 0x5] -_0809327E: - ldrb r0, [r2, 0x4] - cmp r0, 0 - beq _08093298 - ldr r1, _080932A0 @ =0x040000d4 - ldr r0, _080932A4 @ =gUnknown_03004DE0 - str r0, [r1] - movs r2, 0xF0 - lsls r2, 3 - adds r0, r2 - str r0, [r1, 0x4] - ldr r0, _080932A8 @ =0x800000a0 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] -_08093298: - pop {r0} - bx r0 - .align 2, 0 -_0809329C: .4byte 0x02000000 -_080932A0: .4byte 0x040000d4 -_080932A4: .4byte gUnknown_03004DE0 -_080932A8: .4byte 0x800000a0 - thumb_func_end sub_8093254 - - thumb_func_start sub_80932AC -sub_80932AC: @ 80932AC - push {r4,lr} - adds r4, r0, 0 - ldr r0, _080932DC @ =nullsub_60 - movs r1, 0xFF - bl CreateTask - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - ldr r1, _080932E0 @ =gTasks - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0x8] - adds r0, 0xC - adds r1, r4, 0 - bl StoreWordInTwoHalfwords - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080932DC: .4byte nullsub_60 -_080932E0: .4byte gTasks - thumb_func_end sub_80932AC - - thumb_func_start sub_80932E4 -sub_80932E4: @ 80932E4 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r0, _0809331C @ =nullsub_60 - movs r1, 0xFF - bl CreateTask - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - ldr r1, _08093320 @ =gTasks - adds r0, r1 - movs r1, 0x1 - strh r1, [r0, 0x8] - strh r4, [r0, 0xA] - adds r0, 0xC - adds r1, r5, 0 - bl StoreWordInTwoHalfwords - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0809331C: .4byte nullsub_60 -_08093320: .4byte gTasks - thumb_func_end sub_80932E4 - - thumb_func_start sub_8093324 -sub_8093324: @ 8093324 - push {r4,r5,lr} - ldr r0, _0809336C @ =nullsub_60 - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - ldr r0, _08093370 @ =gTasks - adds r4, r1, r0 - ldr r5, _08093374 @ =0x02000000 - ldrh r0, [r4, 0x8] - strb r0, [r5, 0x1] - adds r0, r4, 0 - adds r0, 0xC - adds r1, r5, 0 - adds r1, 0x60 - bl LoadWordFromTwoHalfwords - ldrb r0, [r5, 0x1] - cmp r0, 0 - beq _0809337C - ldr r2, _08093378 @ =gUnknown_0202FFC0 - movs r1, 0xA - ldrsh r0, [r4, r1] - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 3 - adds r1, r2 - adds r0, r5, 0 - adds r0, 0x64 - movs r2, 0x38 - bl memcpy - b _08093384 - .align 2, 0 -_0809336C: .4byte nullsub_60 -_08093370: .4byte gTasks -_08093374: .4byte 0x02000000 -_08093378: .4byte gUnknown_0202FFC0 -_0809337C: - adds r0, r5, 0 - adds r0, 0x64 - bl sub_8093390 -_08093384: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8093324 - - thumb_func_start nullsub_60 -nullsub_60: @ 809338C - bx lr - thumb_func_end nullsub_60 - - thumb_func_start sub_8093390 -sub_8093390: @ 8093390 - push {r4-r7,lr} - adds r5, r0, 0 - ldr r6, _080934A4 @ =gSaveBlock2 - ldrb r0, [r6, 0x8] - strb r0, [r5] - ldrh r0, [r6, 0xE] - strh r0, [r5, 0x10] - ldrb r0, [r6, 0x10] - strh r0, [r5, 0x12] - movs r0, 0x1 - bl sub_8053108 - adds r4, r0, 0 - movs r0, 0xA - bl sub_8053108 - cmp r0, 0 - bne _080933B6 - movs r4, 0 -_080933B6: - lsrs r0, r4, 16 - strh r0, [r5, 0x6] - lsrs r0, r4, 8 - movs r1, 0xFF - ands r0, r1 - strh r0, [r5, 0x8] - ands r4, r1 - strh r4, [r5, 0xA] - ldr r0, _080934A8 @ =0x00000801 - bl FlagGet - strb r0, [r5, 0x2] - bl sub_8090FC0 - strb r0, [r5, 0x3] - bl GetPokedexSeenCount - strh r0, [r5, 0xC] - ldrb r1, [r6, 0xB] - lsls r1, 8 - ldrb r0, [r6, 0xA] - orrs r0, r1 - strh r0, [r5, 0xE] - ldr r7, _080934AC @ =0x0000270f - movs r0, 0x17 - adds r1, r7, 0 - bl sav12_xor_get_clamped_above - strh r0, [r5, 0x14] - movs r0, 0x18 - adds r1, r7, 0 - bl sav12_xor_get_clamped_above - strh r0, [r5, 0x16] - ldr r1, _080934B0 @ =0x000003e7 - movs r0, 0x23 - bl sav12_xor_get_clamped_above - strh r0, [r5, 0x1C] - ldr r4, _080934B4 @ =0x0000ffff - movs r0, 0x22 - adds r1, r4, 0 - bl sav12_xor_get_clamped_above - strh r0, [r5, 0x1E] - movs r0, 0x15 - adds r1, r4, 0 - bl sav12_xor_get_clamped_above - strh r0, [r5, 0x20] - movs r1, 0xAE - lsls r1, 3 - adds r0, r6, r1 - ldrh r0, [r0] - strh r0, [r5, 0x18] - ldr r2, _080934B8 @ =0x00000572 - adds r1, r6, r2 - ldrh r1, [r1] - strh r1, [r5, 0x1A] - lsls r0, 16 - lsrs r0, 16 - cmp r0, r7 - bls _08093436 - strh r7, [r5, 0x18] -_08093436: - ldrh r0, [r5, 0x1A] - cmp r0, r7 - bls _0809343E - strh r7, [r5, 0x1A] -_0809343E: - movs r4, 0 - bl sub_80C4D50 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _0809344E - movs r4, 0x1 -_0809344E: - strb r4, [r5, 0x4] - ldr r0, _080934BC @ =gSaveBlock1 - movs r2, 0x92 - lsls r2, 3 - adds r1, r0, r2 - ldr r1, [r1] - str r1, [r5, 0x24] - movs r2, 0 - adds r6, r5, 0 - adds r6, 0x30 - adds r3, r5, 0 - adds r3, 0x28 - ldr r1, _080934C0 @ =0x00002b1c - adds r4, r0, r1 -_0809346A: - lsls r0, r2, 1 - adds r1, r3, r0 - adds r0, r4 - ldrh r0, [r0] - strh r0, [r1] - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x3 - bls _0809346A - movs r2, 0 - adds r3, r6, 0 - ldr r4, _080934A4 @ =gSaveBlock2 -_08093484: - adds r1, r3, r2 - adds r0, r2, r4 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0x7 - bls _08093484 - adds r0, r5, 0 - bl sub_80934F4 - strb r0, [r5, 0x1] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080934A4: .4byte gSaveBlock2 -_080934A8: .4byte 0x00000801 -_080934AC: .4byte 0x0000270f -_080934B0: .4byte 0x000003e7 -_080934B4: .4byte 0x0000ffff -_080934B8: .4byte 0x00000572 -_080934BC: .4byte gSaveBlock1 -_080934C0: .4byte 0x00002b1c - thumb_func_end sub_8093390 - - thumb_func_start sub_80934C4 -sub_80934C4: @ 80934C4 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080934D8 @ =gUnknown_0202FFC0 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 3 - adds r1, r2 - ldrb r0, [r1, 0x1] - bx lr - .align 2, 0 -_080934D8: .4byte gUnknown_0202FFC0 - thumb_func_end sub_80934C4 - - thumb_func_start sav12_xor_get_clamped_above -sav12_xor_get_clamped_above: @ 80934DC - push {r4,lr} - adds r4, r1, 0 - lsls r0, 24 - lsrs r0, 24 - bl sub_8053108 - cmp r0, r4 - bls _080934EE - adds r0, r4, 0 -_080934EE: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sav12_xor_get_clamped_above - - thumb_func_start sub_80934F4 -sub_80934F4: @ 80934F4 - push {lr} - adds r1, r0, 0 - movs r2, 0 - ldrh r0, [r1, 0x6] - cmp r0, 0 - bne _08093506 - ldr r0, [r1, 0x8] - cmp r0, 0 - beq _08093508 -_08093506: - movs r2, 0x1 -_08093508: - ldrb r0, [r1, 0x3] - cmp r0, 0 - beq _08093514 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 -_08093514: - ldrh r0, [r1, 0x1A] - cmp r0, 0x31 - bls _08093520 - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 -_08093520: - ldrb r0, [r1, 0x4] - cmp r0, 0 - beq _0809352C - adds r0, r2, 0x1 - lsls r0, 24 - lsrs r2, r0, 24 -_0809352C: - adds r0, r2, 0 - pop {r1} - bx r1 - thumb_func_end sub_80934F4 - - thumb_func_start sub_8093534 -sub_8093534: @ 8093534 - push {lr} - movs r0, 0 - bl SetVBlankCallback - movs r0, 0 - bl SetHBlankCallback - movs r1, 0x80 - lsls r1, 19 - movs r0, 0 - strh r0, [r1] - pop {r0} - bx r0 - thumb_func_end sub_8093534 - - thumb_func_start sub_8093550 -sub_8093550: @ 8093550 - push {r4,lr} - ldr r0, _08093588 @ =sub_8093254 - bl SetVBlankCallback - ldr r3, _0809358C @ =0x04000208 - ldrh r2, [r3] - movs r0, 0 - strh r0, [r3] - ldr r4, _08093590 @ =0x04000200 - ldrh r0, [r4] - movs r1, 0x3 - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - ldr r2, _08093594 @ =REG_DISPSTAT - ldrh r0, [r2] - movs r1, 0x18 - orrs r0, r1 - strh r0, [r2] - movs r1, 0x80 - lsls r1, 19 - movs r2, 0xFA - lsls r2, 5 - adds r0, r2, 0 - strh r0, [r1] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08093588: .4byte sub_8093254 -_0809358C: .4byte 0x04000208 -_08093590: .4byte 0x04000200 -_08093594: .4byte REG_DISPSTAT - thumb_func_end sub_8093550 - thumb_func_start sub_8093598 sub_8093598: @ 8093598 push {r4-r7,lr} diff --git a/include/asm.inc.h b/include/asm.inc.h index 567c8708e..d15a8bc9b 100644 --- a/include/asm.inc.h +++ b/include/asm.inc.h @@ -20,7 +20,7 @@ void current_map_music_set__default_for_battle(u16); // asm/rom_8040EB4.o void StoreWordInTwoHalfwords(u16 *, u32); -void LoadWordFromTwoHalfwords(u16 *, u32); +void LoadWordFromTwoHalfwords(u16 *, u32 *); // asm/daycare.o u8 daycare_count_pokemon(u8 *); @@ -244,10 +244,6 @@ void sub_8089668(void); void sub_8089944(int i, int i1, int i2, int i3, int i4, int i5, int i6); void sub_8089A70(void); -// asm/trainer_card.o -void sub_8093110(void (*)(void)); -void sub_8093130(u8, void (*)(void)); - // asm/rom_8094928.o void sub_80961D8(void); u8 pokemon_ailments_get_primary(u32); @@ -317,6 +313,7 @@ void sub_80C4940(void); void sub_80C4980(u8); // asm/script_pokemon_util_80C4BF0.o +u8 sub_80C4D50(void); void ShowContestWinner(void); void HealPlayerParty(); u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8); diff --git a/include/global.h b/include/global.h index 79204e082..3ee1610e6 100644 --- a/include/global.h +++ b/include/global.h @@ -228,7 +228,9 @@ struct SaveBlock1 /*0x2B04*/ u16 outbreakPokemonMoves[4]; /*0x2B0C*/ u8 unk2B0C; /*0x2B0D*/ u8 outbreakPokemonProbability; - /*0x2B0E*/ u8 filler_2B0E[0x2C6]; + /*0x2B0E*/ u8 filler_2B0E[0xE]; + /*0x2B1C*/ u16 unk2B1C[4]; + /*0x2B24*/ u8 filler_2B24[0x2B0]; /*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff /*0x2DFC*/ u8 filler_2DFC[0x100]; /*0x2EFC*/ struct SB1_2EFC_Struct sb1_2EFC_struct[5]; @@ -270,6 +272,14 @@ struct Pokedex /*0x44*/ u8 seen[52]; }; +struct SaveBlock2_Sub +{ + /*0x0000, 0x00A8*/ u8 filler_000[0x4C8]; + /*0x04C8, 0x0570*/ u16 var_4C8; + /*0x04CA, 0x0572*/ u16 var_4CA; + /*0x04CC, 0x0574*/ u8 filler_4CC[0x31C]; +}; + struct SaveBlock2 { /*0x00*/ u8 playerName[8]; @@ -291,7 +301,7 @@ struct SaveBlock2 /*0x90*/ u8 filler_90[0x8]; /*0x98*/ struct Time localTimeOffset; /*0xA0*/ struct Time lastBerryTreeUpdate; - /*0xA8*/ u8 filler_A8[0x7E8]; + /*0xA8*/ struct SaveBlock2_Sub filler_A8; }; struct UnkStruct_8054FF8_Substruct diff --git a/include/pokedex.h b/include/pokedex.h index af0ed7102..1ac4e8c33 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -138,7 +138,7 @@ u8 *GetPokemonCategory(u16); bool8 sub_8090D90(u16, u8); u16 GetNationalPokedexCount(u8); u16 GetHoennPokedexCount(u8); - +bool8 sub_8090FC0(void); u16 sub_8090FF4(void); void sub_8091060(u16); void sub_8091154(u16 order, int i, int i1); diff --git a/include/rom4.h b/include/rom4.h index 98ec02b5f..afa489770 100644 --- a/include/rom4.h +++ b/include/rom4.h @@ -9,6 +9,13 @@ struct UnkPlayerStruct u8 player_field_1; }; +struct LinkPlayerMapObject { + u8 active; + u8 linkPlayerId; + u8 mapObjId; + u8 mode; +}; + // sub_8052F5C // flag_var_implications_of_teleport_ // new_game @@ -17,7 +24,7 @@ void sub_8053050(void); // sub_805308C void sub_80530AC(void); void sav12_xor_increment(u8 index); -u32 sub_8053108(u8); +u32 sub_8053108(u8 index); // sav12_xor_set // sub_8053154 // sub_8053198 diff --git a/include/trainer_card.h b/include/trainer_card.h new file mode 100644 index 000000000..aca964151 --- /dev/null +++ b/include/trainer_card.h @@ -0,0 +1,105 @@ +#ifndef GUARD_TRAINER_CARD_H +#define GUARD_TRAINER_CARD_H + +struct TrainerCard { + /*0x00*/ u8 gender; + /*0x01*/ u8 var_1; + /*0x02*/ bool8 hasPokedex; + /*0x03*/ bool8 var_3; + /*0x04*/ bool8 var_4; + /*0x05*/ u8 var_5; + /*0x06*/ u16 firstHallOfFameA; + /*0x08*/ u16 firstHallOfFameB; + /*0x0A*/ u16 firstHallOfFameC; + /*0x0C*/ u16 pokedexSeen; + /*0x0E*/ u16 trainerId; + /*0x10*/ u16 playTimeHours; + /*0x12*/ u16 playTimeMinutes; + /*0x14*/ u16 linkBattleWins; + /*0x16*/ u16 linkBattleLosses; + /*0x18*/ u16 var_18; + /*0x1A*/ u16 var_1A; + /*0x1C*/ u16 contestsWithFriends; + /*0x1E*/ u16 pokeblocksWithFriends; + /*0x20*/ u16 pokemonTrades; + /*0x22*/ u16 var_22; + /*0x24*/ u32 money; + /*0x28*/ u16 var_28[4]; + /*0x30*/ u8 playerName[8]; +}; + +void sub_8093110(void (*)(void)); +void sub_8093130(u8, void (*)(void)); +void sub_8093324(void); +void sub_8093390(struct TrainerCard *); +u8 sub_80934C4(u8 id); +void sub_8093598(void); +void sub_80935EC(void); +void sub_8093610(void); +void sub_8093688(void); +// sub_80936D4 +void sub_80937A4(void); +void sub_80937BC(void); +void sub_80937D8(void); +void sub_80937F0(void); +void nullsub_15(void); +void sub_8093800(void); +// sub_809380C +// sub_809382C +// sub_8093864 +// sub_80938A8 +// sub_80938CC +// sub_8093918 +// sub_8093938 +// sub_8093954 +// sub_8093980 +// sub_80939A4 +// sub_80939C0 +// sub_80939DC +// sub_8093A28 +// sub_8093A48 +// sub_8093A68 +// sub_8093AA0 +// sub_8093AF0 +// sub_8093C0C +// sub_8093C38 +// sub_8093D50 +// sub_8093D7C +// sub_8093DAC +// sub_8093DC8 +// sub_8093DEC +// sub_8093E04 +// sub_8093E28 +// sub_8093EA0 +// sub_8093EF8 +// sub_8093F14 +// sub_8093F48 +// sub_8093F64 +// sub_8093F80 +// sub_8093FD0 +// sub_8094038 +// sub_80940E4 +// sub_8094110 +// sub_8094140 +// sub_8094188 +// sub_80941D8 +// sub_8094200 +// sub_8094218 +// sub_8094250 +// sub_809429C +// sub_80942F8 +// sub_8094334 +// sub_8094354 +// sub_80943C4 +// sub_80943E4 +// sub_8094428 +// sub_8094448 +// sub_8094498 +// sub_80944B8 +// sub_80944E8 +// sub_8094508 +// sub_8094538 +// sub_8094558 +// unref_sub_8094588 + +#endif // GUARD_TRAINER_CARD_H diff --git a/ld_script.txt b/ld_script.txt index ea9ecce67..3d24f98f3 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -109,6 +109,7 @@ SECTIONS { src/option_menu.o(.text); src/pokedex.o(.text); asm/pokedex.o(.text); + src/trainer_card.o(.text); asm/trainer_card.o(.text); src/save_menu_util.o(.text); asm/rom_8094928.o(.text); diff --git a/src/new_game.c b/src/new_game.c index c8221fa5d..c36337409 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -67,7 +67,7 @@ void sub_8052DA8(void) void sub_8052DE4(void) { - CpuFill32(0, gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); + CpuFill32(0, &gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); } void sub_8052E04(void) diff --git a/src/rom4.c b/src/rom4.c index 8b1aa1b4d..ce6bc2e0b 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -42,14 +42,6 @@ struct UnkTVStruct u32 tv_field_4; }; -struct LinkPlayerMapObject -{ - u8 active; - u8 linkPlayerId; - u8 mapObjId; - u8 mode; -}; - struct UCoords32 { u32 x, y; diff --git a/src/start_menu.c b/src/start_menu.c index 3cffae111..06eb28909 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -11,6 +11,7 @@ #include "sprite.h" #include "string_util.h" #include "task.h" +#include "trainer_card.h" #include "flag.h" #include "rom4.h" #include "safari_zone.h" diff --git a/src/trainer_card.c b/src/trainer_card.c new file mode 100644 index 000000000..84f2d561f --- /dev/null +++ b/src/trainer_card.c @@ -0,0 +1,335 @@ +#include "global.h" +#include "trainer_card.h" +#include "asm.h" +#include "flag.h" +#include "flags.h" +#include "link.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "pokedex.h" +#include "rom4.h" +#include "save_menu_util.h" +#include "sprite.h" +#include "task.h" + +typedef void (*Callback)(void); + +struct Struct2000000 +{ + /*0x00*/ u8 filer0[1]; + /*0x01*/ bool8 var_1; + /*0x02*/ u8 filer1[2]; + /*0x04*/ u8 var_4; + /*0x05*/ u8 var_5; + /*0x06*/ u8 var_6; + /*0x07*/ u8 filler2[0x59]; + /*0x60*/ Callback * var_60; + /*0x64*/ struct TrainerCard var_64; + /*0x9C*/ u8 language; // 0x9C +}; + +extern struct Struct2000000 unk_2000000; +extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; +extern struct TrainerCard gTrainerCards[4]; + +enum { + TD_0, + TD_1, + TD_CALLBACK, +}; + +static void sub_8093174(void); +static void sub_809323C(void); +static void sub_8093254(void); +static void sub_80932AC(Callback callBack); +static void sub_80932E4(u8 arg1, Callback callBack); +static void nullsub_60(u8); +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal); +static u8 sub_80934F4(struct TrainerCard *); +static void sub_8093534(void); +static void sub_8093550(void); + +void sub_8093110(Callback arg1) { + sub_80932AC(arg1); + SetMainCallback2(sub_8093174); + unk_2000000.language = 2; +} + +void sub_8093130(u8 playerIndex, Callback arg2) { + struct Struct2000000* r2; + struct LinkPlayer* r3; + struct LinkPlayerMapObject* r4; + u8 linkPlayerId; + + sub_80932E4(playerIndex, arg2); + SetMainCallback2(sub_8093174); + + r2 = &unk_2000000; + r3 = gLinkPlayers; + r4 = gLinkPlayerMapObjects; + + linkPlayerId = r4[playerIndex].linkPlayerId; + + r2->language = r3[linkPlayerId].language; +} + + +static void sub_8093174(void) { + switch (gMain.state) { + case 0: + sub_8093534(); + sub_8093688(); + gMain.state += 1; + break; + case 1: + sub_8093598(); + gMain.state += 1; + break; + case 2: + sub_80935EC(); + gMain.state += 1; + break; + case 3: + sub_8093610(); + sub_80937A4(); + gMain.state += 1; + break; + case 4: + sub_80937BC(); + gMain.state += 1; + case 5: + if (MultistepInitMenuWindowContinue() == FALSE) { + return; + } + gMain.state += 1; + break; + case 6: + sub_80937F0(); + gMain.state += 1; + break; + case 7: + sub_80937D8(); + gMain.state += 1; + break; + case 8: + nullsub_15(); + sub_8093800(); + sub_8093550(); + SetMainCallback2(sub_809323C); + break; + } +} + +static void sub_809323C(void) { + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +__attribute__((naked)) +static void sub_8093254(void) +{ + asm(".syntax unified\n\ + push {lr}\n\ + bl LoadOam\n\ + bl ProcessSpriteCopyRequests\n\ + bl TransferPlttBuffer\n\ + ldr r2, _0809329C @ =0x02000000\n\ + ldrb r0, [r2, 0x6]\n\ + adds r0, 0x1\n\ + strb r0, [r2, 0x6]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x3B\n\ + bls _0809327E\n\ + movs r0, 0\n\ + strb r0, [r2, 0x6]\n\ + ldrb r0, [r2, 0x5]\n\ + movs r1, 0x1\n\ + eors r0, r1\n\ + strb r0, [r2, 0x5]\n\ +_0809327E:\n\ + ldrb r0, [r2, 0x4]\n\ + cmp r0, 0\n\ + beq _08093298\n\ + ldr r1, _080932A0 @ =0x040000d4\n\ + ldr r0, _080932A4 @ =gUnknown_03004DE0\n\ + str r0, [r1]\n\ + movs r2, 0xF0\n\ + lsls r2, 3\n\ + adds r0, r2\n\ + str r0, [r1, 0x4]\n\ + ldr r0, _080932A8 @ =0x800000a0\n\ + str r0, [r1, 0x8]\n\ + ldr r0, [r1, 0x8]\n\ +_08093298:\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809329C: .4byte 0x02000000\n\ +_080932A0: .4byte 0x040000d4\n\ +_080932A4: .4byte gUnknown_03004DE0\n\ +_080932A8: .4byte 0x800000a0\n\ + .syntax divided\n"); +} + +static void sub_80932AC(Callback callBack) { + u8 taskId = CreateTask(nullsub_60, 0xFF); + struct Task *task = &gTasks[taskId]; + task->data[TD_0] = FALSE; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32) callBack); +} + +static void sub_80932E4(u8 arg1, Callback callBack) { + u8 taskId = CreateTask(nullsub_60, 0xFF); + + struct Task *task = &gTasks[taskId]; + task->data[TD_0] = TRUE; + task->data[TD_1] = arg1; + StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32) callBack); +} + +void sub_8093324(void) { + u8 taskId = FindTaskIdByFunc(nullsub_60); + struct Task *task = &gTasks[taskId]; + unk_2000000.var_1 = task->data[TD_0]; + + LoadWordFromTwoHalfwords((u16 *) &task->data[TD_CALLBACK], (u32 *) &unk_2000000.var_60); + + if (unk_2000000.var_1) { + struct TrainerCard (*trainerCards)[4] = &gTrainerCards; + s16 var = task->data[TD_1]; + struct TrainerCard *dest = &(*trainerCards)[var]; + memcpy(&unk_2000000.var_64, dest, sizeof(struct TrainerCard)); + } else { + sub_8093390(&unk_2000000.var_64); + } +} + +static void nullsub_60(u8 taskid) { +} + +void sub_8093390(struct TrainerCard *arg1) { + u32 playTime; + bool32 enteredHallOfFame; + bool8 r4; + u8 i; + + arg1->gender = gSaveBlock2.playerGender; + arg1->playTimeHours = gSaveBlock2.playTimeHours; + arg1->playTimeMinutes = gSaveBlock2.playTimeMinutes; + + playTime = sub_8053108(GAME_STAT_FIRST_HOF_PLAY_TIME); + enteredHallOfFame = sub_8053108(GAME_STAT_ENTERED_HOF); + if (!enteredHallOfFame) { + playTime = 0; + } + arg1->firstHallOfFameA = playTime >> 16; + arg1->firstHallOfFameB = (playTime >> 8) & 0xFF; + arg1->firstHallOfFameC = playTime & 0xFF; + + arg1->hasPokedex = FlagGet(SYS_POKEDEX_GET); + arg1->var_3 = sub_8090FC0(); + arg1->pokedexSeen = GetPokedexSeenCount(); + + arg1->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; + + // Link Cable Battles + arg1->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); + arg1->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); + + // Contests w/ Friends + arg1->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); + + // Pokéblocks w/ Friends + arg1->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); + + // Pokémon Trades + arg1->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); + + // Battle tower? + arg1->var_18 = gSaveBlock2.filler_A8.var_4C8; + arg1->var_1A = gSaveBlock2.filler_A8.var_4CA; + if (arg1->var_18 > 9999) { + arg1->var_18 = 9999; + } + if (arg1->var_1A > 9999) { + arg1->var_1A = 9999; + } + + r4 = FALSE; + if (sub_80C4D50() > 4) { + r4 = TRUE; + } + arg1->var_4 = r4; + + arg1->money = gSaveBlock1.money; + + for (i = 0; i < 4; i++) { + arg1->var_28[i] = gSaveBlock1.unk2B1C[i]; + } + + for (i = 0; i < 8; i++) { + arg1->playerName[i] = gSaveBlock2.playerName[i]; + } + + arg1->var_1 = sub_80934F4(arg1); +} + +u8 sub_80934C4(u8 id) { + return gTrainerCards[id].var_1; +} + +static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) { + u32 value = sub_8053108(index); + + if (value > maxVal) { + value = maxVal; + } + + return value; +} + +static u8 sub_80934F4(struct TrainerCard *trainerCard) { + u8 value = 0; + + if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) { + value += 1; + } + + if (trainerCard->var_3) { + value += 1; + } + + if (trainerCard->var_1A > 49) { + value += 1; + } + + if (trainerCard->var_4) { + value += 1; + } + + return value; +} + +static void sub_8093534(void) { + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void sub_8093550(void) { + u16 backup; + + SetVBlankCallback(sub_8093254); + + backup = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK| INTR_FLAG_HBLANK; + REG_IME = backup; + + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR; + REG_DISPCNT = 0x1f40; +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 44804c5bb..ae42fe7ad 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -610,17 +610,8 @@ gUnknown_0202FFBA: @ 202FFBA gUnknown_0202FFBC: @ 202FFBC .space 0x4 -gUnknown_0202FFC0: @ 202FFC0 - .space 0x14 - -gUnknown_0202FFD4: @ 202FFD4 - .space 0x2 - -gUnknown_0202FFD6: @ 202FFD6 - .space 0x1A - -gUnknown_0202FFF0: @ 202FFF0 - .space 0xB0 +gTrainerCards: @ 202FFC0 + .space 0xE0 gPokemonStorage: @ 20300A0 .space 0x4