From aa939e0955ec683efb5dd963430eace695a26af9 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 6 Mar 2022 14:41:40 -0600 Subject: All saving functions decomped - poke_sub_4 was determined to be Dungeon Index/Floor - Clean up code that references these functions --- asm/code_8097670.s | 471 ---------------------------------------- asm/code_8097DD0.s | 213 ++++++++++++++++++ include/pokemon.h | 4 +- ld_script.txt | 2 + src/adventure_log.c | 4 +- src/code_80972F4.c | 4 +- src/code_8097670.c | 59 +++-- src/code_8097DD0.c | 90 ++++++++ src/friend_area_action_menu_1.c | 6 +- src/friend_list_menu.c | 6 +- src/save.c | 4 +- 11 files changed, 363 insertions(+), 500 deletions(-) create mode 100644 asm/code_8097DD0.s create mode 100644 src/code_8097DD0.c diff --git a/asm/code_8097670.s b/asm/code_8097670.s index c4d68ec..d6d224f 100644 --- a/asm/code_8097670.s +++ b/asm/code_8097670.s @@ -5,76 +5,6 @@ .text - thumb_func_start sub_80978C8 -sub_80978C8: - push {lr} - lsls r0, 16 - asrs r0, 16 - bl GetBaseSpeciesNoUnown - lsls r0, 16 - asrs r3, r0, 16 - ldr r0, _080978FC - ldr r2, [r0] - adds r0, r3, 0 - cmp r3, 0 - bge _080978E2 - adds r0, 0x1F -_080978E2: - asrs r0, 5 - lsls r1, r0, 2 - adds r2, 0x54 - adds r2, r1 - lsls r0, 5 - subs r0, r3, r0 - movs r1, 0x1 - lsls r1, r0 - ldr r0, [r2] - orrs r0, r1 - str r0, [r2] - pop {r0} - bx r0 - .align 2, 0 -_080978FC: .4byte gUnknown_203B494 - thumb_func_end sub_80978C8 - - thumb_func_start sub_8097900 -sub_8097900: - push {lr} - lsls r0, 16 - asrs r0, 16 - bl GetBaseSpeciesNoUnown - lsls r0, 16 - asrs r3, r0, 16 - ldr r0, _08097938 - ldr r2, [r0] - adds r0, r3, 0 - cmp r3, 0 - bge _0809791A - adds r0, 0x1F -_0809791A: - asrs r0, 5 - lsls r1, r0, 2 - adds r2, 0x1C - adds r2, r1 - lsls r0, 5 - subs r0, r3, r0 - movs r1, 0x1 - lsls r1, r0 - ldr r0, [r2] - ands r0, r1 - cmp r0, 0 - bne _0809793C - movs r0, 0 - b _0809793E - .align 2, 0 -_08097938: .4byte gUnknown_203B494 -_0809793C: - movs r0, 0x1 -_0809793E: - pop {r1} - bx r1 - thumb_func_end sub_8097900 - thumb_func_start sub_8097944 sub_8097944: push {r4-r7,lr} @@ -453,405 +383,4 @@ _08097C10: .4byte 0x00000163 _08097C14: .4byte gUnknown_203B494 thumb_func_end sub_8097944 - thumb_func_start sub_8097C18 -sub_8097C18: - push {r4-r6,lr} - adds r5, r0, 0 - bl sub_8097944 - ldr r4, _08097CBC - ldr r1, [r4] - adds r1, 0x4 - adds r0, r5, 0 - movs r2, 0x11 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x8 - adds r0, r5, 0 - movs r2, 0x11 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0xC - adds r0, r5, 0 - movs r2, 0x11 - bl SaveIntegerBits - ldr r1, [r4] - adds r0, r5, 0 - movs r2, 0x20 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x14 - adds r0, r5, 0 - movs r2, 0xE - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x16 - adds r0, r5, 0 - movs r2, 0xE - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x18 - adds r0, r5, 0 - movs r2, 0x9 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0xC0 - adds r0, r5, 0 - movs r2, 0x11 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x1C - movs r6, 0xE0 - lsls r6, 1 - adds r0, r5, 0 - adds r2, r6, 0 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x54 - adds r0, r5, 0 - adds r2, r6, 0 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x8C - movs r2, 0xD0 - lsls r2, 1 - adds r0, r5, 0 - bl SaveIntegerBits - ldr r1, [r4] - adds r1, 0x10 - adds r0, r5, 0 - bl xxx_save_poke_sub_4_80902F4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08097CBC: .4byte gUnknown_203B494 - thumb_func_end sub_8097C18 - - thumb_func_start sub_8097CC0 -sub_8097CC0: - push {r4-r6,lr} - adds r5, r0, 0 - ldr r4, _08097D5C - ldr r1, [r4] - adds r1, 0x4 - movs r2, 0x11 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x8 - adds r0, r5, 0 - movs r2, 0x11 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0xC - adds r0, r5, 0 - movs r2, 0x11 - bl RestoreIntegerBits - ldr r1, [r4] - adds r0, r5, 0 - movs r2, 0x20 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x14 - adds r0, r5, 0 - movs r2, 0xE - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x16 - adds r0, r5, 0 - movs r2, 0xE - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x18 - adds r0, r5, 0 - movs r2, 0x9 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0xC0 - adds r0, r5, 0 - movs r2, 0x11 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x1C - movs r6, 0xE0 - lsls r6, 1 - adds r0, r5, 0 - adds r2, r6, 0 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x54 - adds r0, r5, 0 - adds r2, r6, 0 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x8C - movs r2, 0xD0 - lsls r2, 1 - adds r0, r5, 0 - bl RestoreIntegerBits - ldr r1, [r4] - adds r1, 0x10 - adds r0, r5, 0 - bl xxx_restore_poke_sub_4_8090314 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08097D5C: .4byte gUnknown_203B494 - thumb_func_end sub_8097CC0 - - thumb_func_start sub_8097D60 -sub_8097D60: - push {lr} - sub sp, 0x10 - adds r3, r0, 0 - adds r2, r1, 0 - mov r0, sp - adds r1, r3, 0 - bl xxx_init_struct_8094924_save_809486C - mov r0, sp - bl WriteGameOptions - mov r0, sp - bl WritePlayTime - mov r0, sp - bl sub_8097C18 - mov r0, sp - bl WriteExclusivePokemon - mov r0, sp - bl nullsub_102 - ldr r0, [sp, 0x8] - add sp, 0x10 - pop {r1} - bx r1 - thumb_func_end sub_8097D60 - - thumb_func_start sub_8097D98 -sub_8097D98: - push {lr} - sub sp, 0x10 - adds r3, r0, 0 - adds r2, r1, 0 - mov r0, sp - adds r1, r3, 0 - bl xxx_init_struct_8094924_restore_809485C - mov r0, sp - bl ReadGameOptions - mov r0, sp - bl ReadPlayTime - mov r0, sp - bl sub_8097CC0 - mov r0, sp - bl ReadExclusivePokemon - mov r0, sp - bl nullsub_102 - ldr r0, [sp, 0x8] - add sp, 0x10 - pop {r1} - bx r1 - thumb_func_end sub_8097D98 - - thumb_func_start sub_8097DD0 -sub_8097DD0: - push {lr} - adds r2, r0, 0 - adds r3, r1, 0 - ldr r1, [r2] - ldr r0, [r3] - cmp r1, r0 - bne _08097DEA - ldr r1, [r2, 0x4] - ldr r0, [r3, 0x4] - cmp r1, r0 - bne _08097DEA - movs r0, 0x1 - b _08097DEC -_08097DEA: - movs r0, 0 -_08097DEC: - pop {r1} - bx r1 - thumb_func_end sub_8097DD0 - - thumb_func_start sub_8097DF0 -sub_8097DF0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1F8 - mov r8, r0 - str r1, [sp, 0x1F0] - movs r0, 0 - mov r9, r0 - movs r7, 0 - ldr r1, _08097E3C - ldr r0, [r1] - cmp r0, 0 - beq _08097E6E -_08097E0E: - movs r4, 0 - lsls r5, r7, 3 - lsls r1, r7, 2 - mov r10, r1 - adds r6, r7, 0x1 - ldr r2, _08097E3C - adds r3, r5, r2 - add r1, sp, 0x18C -_08097E1E: - ldr r0, [r3] - adds r0, r4 - ldrb r2, [r0] - cmp r2, 0x23 - bne _08097E40 - ldrb r0, [r0, 0x1] - cmp r0, 0x72 - bne _08097E40 - strb r2, [r1] - adds r1, 0x1 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0 - strb r0, [r1] - b _08097E50 - .align 2, 0 -_08097E3C: .4byte gStatusDescriptions -_08097E40: - ldr r0, [r3] - adds r0, r4 - ldrb r0, [r0] - strb r0, [r1] - adds r1, 0x1 - adds r4, 0x1 - cmp r4, 0x63 - ble _08097E1E -_08097E50: - add r0, sp, 0x18C - bl strlen - mov r1, sp - add r1, r10 - str r0, [r1] - adds r7, r6, 0 - cmp r6, 0x62 - bgt _08097E6E - lsls r0, r6, 3 - ldr r1, _08097EB4 - adds r0, r1 - ldr r0, [r0] - cmp r0, 0 - bne _08097E0E -_08097E6E: - mov r2, r8 - ldrb r0, [r2] - cmp r0, 0 - beq _08097F2C - ldr r3, _08097EB4 -_08097E78: - cmp r0, 0x23 - bne _08097F08 - movs r7, 0 - adds r1, r3, 0 - ldr r0, [r1] - cmp r0, 0 - beq _08097F20 - mov r2, r9 - lsls r0, r2, 2 - ldr r2, [sp, 0x1F0] - adds r0, r2 - mov r10, r0 -_08097E90: - lsls r4, r7, 3 - adds r0, r4, r1 - ldr r0, [r0] - lsls r1, r7, 2 - add r1, sp - ldr r2, [r1] - mov r1, r8 - str r3, [sp, 0x1F4] - bl sub_800B2D4 - lsls r0, 24 - adds r5, r4, 0 - adds r6, r7, 0x1 - ldr r3, [sp, 0x1F4] - cmp r0, 0 - bne _08097EF0 - movs r4, 0 - b _08097EBA - .align 2, 0 -_08097EB4: .4byte gStatusDescriptions -_08097EB8: - adds r4, 0x1 -_08097EBA: - cmp r4, r9 - bge _08097ED6 - adds r0, r5, r3 - lsls r1, r4, 2 - ldr r2, [sp, 0x1F0] - adds r1, r2 - ldr r1, [r1] - str r3, [sp, 0x1F4] - bl sub_8097DD0 - lsls r0, 24 - ldr r3, [sp, 0x1F4] - cmp r0, 0 - beq _08097EB8 -_08097ED6: - cmp r4, r9 - bne _08097EF0 - mov r0, r9 - cmp r0, 0x3 - bgt _08097EF0 - adds r0, r5, r3 - mov r1, r10 - adds r1, 0x4 - mov r10, r1 - subs r1, 0x4 - stm r1!, {r0} - movs r2, 0x1 - add r9, r2 -_08097EF0: - adds r7, r6, 0 - cmp r6, 0x62 - bgt _08097F20 - ldr r1, _08097F04 - lsls r0, r6, 3 - adds r0, r1 - ldr r0, [r0] - cmp r0, 0 - bne _08097E90 - b _08097F20 - .align 2, 0 -_08097F04: .4byte gStatusDescriptions -_08097F08: - mov r0, r8 - ldrb r1, [r0] - adds r0, r1, 0 - adds r0, 0x7F - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _08097F1C - cmp r1, 0x87 - bne _08097F20 -_08097F1C: - movs r1, 0x1 - add r8, r1 -_08097F20: - movs r2, 0x1 - add r8, r2 - mov r1, r8 - ldrb r0, [r1] - cmp r0, 0 - bne _08097E78 -_08097F2C: - mov r0, r9 - add sp, 0x1F8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8097DF0 - .align 2,0 diff --git a/asm/code_8097DD0.s b/asm/code_8097DD0.s new file mode 100644 index 0000000..36f15d9 --- /dev/null +++ b/asm/code_8097DD0.s @@ -0,0 +1,213 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start sub_8097DD0 +sub_8097DD0: + push {lr} + adds r2, r0, 0 + adds r3, r1, 0 + ldr r1, [r2] + ldr r0, [r3] + cmp r1, r0 + bne _08097DEA + ldr r1, [r2, 0x4] + ldr r0, [r3, 0x4] + cmp r1, r0 + bne _08097DEA + movs r0, 0x1 + b _08097DEC +_08097DEA: + movs r0, 0 +_08097DEC: + pop {r1} + bx r1 + thumb_func_end sub_8097DD0 + + thumb_func_start sub_8097DF0 +sub_8097DF0: + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x1F8 + mov r8, r0 + str r1, [sp, 0x1F0] + movs r0, 0 + mov r9, r0 + movs r7, 0 + ldr r1, _08097E3C + ldr r0, [r1] + cmp r0, 0 + beq _08097E6E +_08097E0E: + movs r4, 0 + lsls r5, r7, 3 + lsls r1, r7, 2 + mov r10, r1 + adds r6, r7, 0x1 + ldr r2, _08097E3C + adds r3, r5, r2 + add r1, sp, 0x18C +_08097E1E: + ldr r0, [r3] + adds r0, r4 + ldrb r2, [r0] + cmp r2, 0x23 + bne _08097E40 + ldrb r0, [r0, 0x1] + cmp r0, 0x72 + bne _08097E40 + strb r2, [r1] + adds r1, 0x1 + strb r0, [r1] + adds r1, 0x1 + movs r0, 0 + strb r0, [r1] + b _08097E50 + .align 2, 0 +_08097E3C: .4byte gStatusDescriptions +_08097E40: + ldr r0, [r3] + adds r0, r4 + ldrb r0, [r0] + strb r0, [r1] + adds r1, 0x1 + adds r4, 0x1 + cmp r4, 0x63 + ble _08097E1E +_08097E50: + add r0, sp, 0x18C + bl strlen + mov r1, sp + add r1, r10 + str r0, [r1] + adds r7, r6, 0 + cmp r6, 0x62 + bgt _08097E6E + lsls r0, r6, 3 + ldr r1, _08097EB4 + adds r0, r1 + ldr r0, [r0] + cmp r0, 0 + bne _08097E0E +_08097E6E: + mov r2, r8 + ldrb r0, [r2] + cmp r0, 0 + beq _08097F2C + ldr r3, _08097EB4 +_08097E78: + cmp r0, 0x23 + bne _08097F08 + movs r7, 0 + adds r1, r3, 0 + ldr r0, [r1] + cmp r0, 0 + beq _08097F20 + mov r2, r9 + lsls r0, r2, 2 + ldr r2, [sp, 0x1F0] + adds r0, r2 + mov r10, r0 +_08097E90: + lsls r4, r7, 3 + adds r0, r4, r1 + ldr r0, [r0] + lsls r1, r7, 2 + add r1, sp + ldr r2, [r1] + mov r1, r8 + str r3, [sp, 0x1F4] + bl sub_800B2D4 + lsls r0, 24 + adds r5, r4, 0 + adds r6, r7, 0x1 + ldr r3, [sp, 0x1F4] + cmp r0, 0 + bne _08097EF0 + movs r4, 0 + b _08097EBA + .align 2, 0 +_08097EB4: .4byte gStatusDescriptions +_08097EB8: + adds r4, 0x1 +_08097EBA: + cmp r4, r9 + bge _08097ED6 + adds r0, r5, r3 + lsls r1, r4, 2 + ldr r2, [sp, 0x1F0] + adds r1, r2 + ldr r1, [r1] + str r3, [sp, 0x1F4] + bl sub_8097DD0 + lsls r0, 24 + ldr r3, [sp, 0x1F4] + cmp r0, 0 + beq _08097EB8 +_08097ED6: + cmp r4, r9 + bne _08097EF0 + mov r0, r9 + cmp r0, 0x3 + bgt _08097EF0 + adds r0, r5, r3 + mov r1, r10 + adds r1, 0x4 + mov r10, r1 + subs r1, 0x4 + stm r1!, {r0} + movs r2, 0x1 + add r9, r2 +_08097EF0: + adds r7, r6, 0 + cmp r6, 0x62 + bgt _08097F20 + ldr r1, _08097F04 + lsls r0, r6, 3 + adds r0, r1 + ldr r0, [r0] + cmp r0, 0 + bne _08097E90 + b _08097F20 + .align 2, 0 +_08097F04: .4byte gStatusDescriptions +_08097F08: + mov r0, r8 + ldrb r1, [r0] + adds r0, r1, 0 + adds r0, 0x7F + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x3 + bls _08097F1C + cmp r1, 0x87 + bne _08097F20 +_08097F1C: + movs r1, 0x1 + add r8, r1 +_08097F20: + movs r2, 0x1 + add r8, r2 + mov r1, r8 + ldrb r0, [r1] + cmp r0, 0 + bne _08097E78 +_08097F2C: + mov r0, r9 + add sp, 0x1F8 + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end sub_8097DF0 + + .align 2,0 diff --git a/include/pokemon.h b/include/pokemon.h index d72f88e..af6c103 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -20,8 +20,8 @@ struct Offense { }; struct unkPokeSubStruct_4 { - u8 unk4; - u8 unk5; + u8 dungeonIndex; + u8 dungeonFloor; u16 fill6; }; diff --git a/ld_script.txt b/ld_script.txt index 335f5f0..b9db591 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -309,6 +309,8 @@ SECTIONS { src/code_809747C_1.o(.text); src/code_8097670.o(.text); asm/code_8097670.o(.text); + src/code_8097DD0.o(.text); + asm/code_8097DD0.o(.text); src/code_8097F40.o(.text); src/exclusive_pokemon.o(.text); asm/exclusive_pokemon.o(.text); diff --git a/src/adventure_log.c b/src/adventure_log.c index cb20682..9480361 100644 --- a/src/adventure_log.c +++ b/src/adventure_log.c @@ -54,7 +54,7 @@ extern bool8 sub_8013938(void *); extern void sub_8013660(void *); extern void PlayMenuSoundEffect(u32); extern u32 GetKeyPress(void *); -extern u8 sub_8097710(u8); +extern bool8 sub_8097710(u8); extern s16 sub_80978B8(); extern s16 sub_8097880(); @@ -225,7 +225,7 @@ void DisplayAdventureLog(void) do { uVar6 = gAdventureLog->currPage * gAdventureLog->unk1C + counter; temp = uVar6; // Having another var in middle gets close (does a u8 cast) - if(sub_8097710(temp) != 0){ + if(sub_8097710(temp)){ switch(temp) { case 0xc: gUnknown_202DE30 = sub_80978B8(); diff --git a/src/code_80972F4.c b/src/code_80972F4.c index 7e87832..c0fa1a3 100644 --- a/src/code_80972F4.c +++ b/src/code_80972F4.c @@ -61,8 +61,8 @@ bool8 sub_8096F50(struct WonderMail *r0) for(index = 0; index < 0x10; index++) { temp = &gUnknown_203B490->unk230[index]; - if(temp->unk0.unk4 == r0->dungeon) - if(temp->unk0.unk5 == r0->floor) + if(temp->unk0.dungeonIndex == r0->dungeon) + if(temp->unk0.dungeonFloor == r0->floor) if(temp->unk4 == r0->unk8) if(temp->unk8 == temp2) return TRUE; diff --git a/src/code_8097670.c b/src/code_8097670.c index 75a788a..a918ac9 100644 --- a/src/code_8097670.c +++ b/src/code_8097670.c @@ -1,10 +1,5 @@ #include "global.h" - -struct unkDungeonStruct -{ - u8 index; - u8 floor; -}; +#include "pokemon.h" struct unkStruct_203B494 { @@ -13,12 +8,12 @@ struct unkStruct_203B494 s32 numAdventures; s32 unk8; s32 unkC; - struct unkDungeonStruct dungeonLocation; + struct unkPokeSubStruct_4 dungeonLocation; s16 unk14; s16 unk16; s16 unk18; u32 unk1C[0xE]; - u8 fill54[0x8C - 0x54]; + u32 unk54[0xE]; u32 unk8C[0xD]; s32 unkC0; }; @@ -26,6 +21,7 @@ struct unkStruct_203B494 extern struct unkStruct_203B494 *gUnknown_203B494; extern struct unkStruct_203B494 gUnknown_2039778; extern const u8 *gAdventureLogText[]; +s16 GetBaseSpeciesNoUnown(s16 index); void sub_8097670(void) { @@ -37,13 +33,13 @@ struct unkStruct_203B494 *sub_8097680(void) return &gUnknown_2039778; } -void SetDungeonLocationInfo(struct unkDungeonStruct *r0) +void SetDungeonLocationInfo(struct unkPokeSubStruct_4 *r0) { - gUnknown_203B494->dungeonLocation.index = r0->index; - gUnknown_203B494->dungeonLocation.floor = r0->floor; + gUnknown_203B494->dungeonLocation.dungeonIndex = r0->dungeonIndex; + gUnknown_203B494->dungeonLocation.dungeonFloor = r0->dungeonFloor; } -struct unkDungeonStruct *GetDungeonLocationInfo(void) +struct unkPokeSubStruct_4 *GetDungeonLocationInfo(void) { return &gUnknown_203B494->dungeonLocation; } @@ -76,12 +72,12 @@ void sub_80976F8(u8 r0) gUnknown_203B494->unk0 |= (1 << r0); } -u8 sub_8097710(u8 r0) +bool8 sub_8097710(u8 r0) { if(gUnknown_203B494->unk0 & (1 << r0)) - return 1; + return TRUE; else - return 0; + return FALSE; } const u8 *GetAdventureLogLine(u8 index) @@ -187,3 +183,36 @@ s16 sub_80978B8(void) { return gUnknown_203B494->unkC0; } + +void sub_80978C8(s16 pokeIndex) +{ + s32 iVar2; + struct unkStruct_203B494 *preload; + s32 baseSpecies; + + baseSpecies = GetBaseSpeciesNoUnown(pokeIndex); + preload = gUnknown_203B494; + iVar2 = baseSpecies; + if (baseSpecies < 0) { + iVar2 = baseSpecies + 0x1f; + } + preload->unk54[iVar2 >> 5] |= 1 << (baseSpecies + (iVar2 >> 5) * -0x20); +} + +bool8 sub_8097900(s16 pokeIndex) +{ + s32 iVar2; + struct unkStruct_203B494 *preload; + s32 baseSpecies; + + baseSpecies = GetBaseSpeciesNoUnown(pokeIndex); + preload = gUnknown_203B494; + iVar2 = baseSpecies; + if (baseSpecies < 0) { + iVar2 = baseSpecies + 0x1f; + } + if(preload->unk1C[iVar2 >> 5] & (1 << (baseSpecies + (iVar2 >> 5) * -0x20))) + return TRUE; + else + return FALSE; +} diff --git a/src/code_8097DD0.c b/src/code_8097DD0.c new file mode 100644 index 0000000..e5d4966 --- /dev/null +++ b/src/code_8097DD0.c @@ -0,0 +1,90 @@ +#include "global.h" +#include "code_8092334.h" +#include "pokemon.h" + +struct unkStruct_203B494 +{ + // size: 0xC8? + u32 unk0; // 32 bit bitfield, I think + s32 numAdventures; + s32 unk8; + s32 unkC; + struct unkPokeSubStruct_4 dungeonLocation; + s16 unk14; + s16 unk16; + s16 unk18; + u32 unk1C[0xE]; + u32 unk54[0xE]; + u32 unk8C[0xD]; + s32 unkC0; +}; + +extern struct unkStruct_203B494 *gUnknown_203B494; + +extern void xxx_save_poke_sub_4_80902F4(struct unkStruct_8094924*, struct unkPokeSubStruct_4*); +extern void xxx_restore_poke_sub_4_8090314(struct unkStruct_8094924*, struct unkPokeSubStruct_4*); +void ReadExclusivePokemon(struct unkStruct_8094924 *r0); +void ReadGameOptions(struct unkStruct_8094924 *param_1); +void ReadPlayTime(struct unkStruct_8094924 *r0); +void WriteExclusivePokemon(struct unkStruct_8094924 *r0); +void WriteGameOptions(struct unkStruct_8094924 *param_1); +void WritePlayTime(struct unkStruct_8094924 *r0); + +extern void sub_8097944(void); + +void sub_8097C18(struct unkStruct_8094924 *r0) +{ + sub_8097944(); + SaveIntegerBits(r0, &gUnknown_203B494->numAdventures, 0x11); + SaveIntegerBits(r0, &gUnknown_203B494->unk8, 0x11); + SaveIntegerBits(r0, &gUnknown_203B494->unkC, 0x11); + SaveIntegerBits(r0, &gUnknown_203B494->unk0, 0x20); + SaveIntegerBits(r0, &gUnknown_203B494->unk14, 0xE); + SaveIntegerBits(r0, &gUnknown_203B494->unk16, 0xE); + SaveIntegerBits(r0, &gUnknown_203B494->unk18, 0x9); + SaveIntegerBits(r0, &gUnknown_203B494->unkC0, 0x11); + SaveIntegerBits(r0, gUnknown_203B494->unk1C, 0xE0 << 1); + SaveIntegerBits(r0, gUnknown_203B494->unk54, 0xE0 << 1); + SaveIntegerBits(r0, gUnknown_203B494->unk8C, 0xD0 << 1); + xxx_save_poke_sub_4_80902F4(r0, &gUnknown_203B494->dungeonLocation); +} + +void sub_8097CC0(struct unkStruct_8094924 *r0) +{ + RestoreIntegerBits(r0, &gUnknown_203B494->numAdventures, 0x11); + RestoreIntegerBits(r0, &gUnknown_203B494->unk8, 0x11); + RestoreIntegerBits(r0, &gUnknown_203B494->unkC, 0x11); + RestoreIntegerBits(r0, &gUnknown_203B494->unk0, 0x20); + RestoreIntegerBits(r0, &gUnknown_203B494->unk14, 0xE); + RestoreIntegerBits(r0, &gUnknown_203B494->unk16, 0xE); + RestoreIntegerBits(r0, &gUnknown_203B494->unk18, 0x9); + RestoreIntegerBits(r0, &gUnknown_203B494->unkC0, 0x11); + RestoreIntegerBits(r0, gUnknown_203B494->unk1C, 0xE0 << 1); + RestoreIntegerBits(r0, gUnknown_203B494->unk54, 0xE0 << 1); + RestoreIntegerBits(r0, gUnknown_203B494->unk8C, 0xD0 << 1); + xxx_restore_poke_sub_4_8090314(r0, &gUnknown_203B494->dungeonLocation); +} + +u32 sub_8097D60(u8 *r0, u32 size) +{ + struct unkStruct_8094924 backup; + xxx_init_struct_8094924_save_809486C(&backup, r0, size); + WriteGameOptions(&backup); + WritePlayTime(&backup); + sub_8097C18(&backup); + WriteExclusivePokemon(&backup); + nullsub_102(&backup); + return backup.unk8; +} + +u32 sub_8097D98(u8 *r0, u32 size) +{ + struct unkStruct_8094924 backup; + xxx_init_struct_8094924_restore_809485C(&backup, r0, size); + ReadGameOptions(&backup); + ReadPlayTime(&backup); + sub_8097CC0(&backup); + ReadExclusivePokemon(&backup); + nullsub_102(&backup); + return backup.unk8; +} diff --git a/src/friend_area_action_menu_1.c b/src/friend_area_action_menu_1.c index 1abd973..3f1bb5f 100644 --- a/src/friend_area_action_menu_1.c +++ b/src/friend_area_action_menu_1.c @@ -79,7 +79,7 @@ void sub_8027A5C(void) } static inline bool8 sub_8027A78_sub(void) { - if (gUnknown_203B2BC->unk18->unk4.unk4 == 0x44 || gUnknown_203B2BC->unk18->unk4.unk4 == 0x45) + if (gUnknown_203B2BC->unk18->unk4.dungeonIndex == 0x44 || gUnknown_203B2BC->unk18->unk4.dungeonIndex == 0x45) return TRUE; else return FALSE; @@ -270,7 +270,7 @@ u32 sub_8027D9C(struct PokemonStruct *r0) if(r0->unk2 == 0) { var1 = 0; - if(r0->unk4.unk4 == 0x41) + if(r0->unk4.dungeonIndex == 0x41) var1 = 1; if(var1 != 0) { @@ -291,7 +291,7 @@ u32 sub_8027DCC(struct PokemonStruct *r0) if(r0->unk2 == 0) { var1 = 0; - if(r0->unk4.unk4 == 0x41) + if(r0->unk4.dungeonIndex == 0x41) var1 = 1; if(var1 != 0) { diff --git a/src/friend_list_menu.c b/src/friend_list_menu.c index 9310665..142aeca 100644 --- a/src/friend_list_menu.c +++ b/src/friend_list_menu.c @@ -113,7 +113,7 @@ void sub_8026A94(void) static inline bool8 sub_8026AB0_sub(void) { - if (gUnknown_203B2B8->unk18->unk4.unk4 == 0x44 || gUnknown_203B2B8->unk18->unk4.unk4 == 0x45) + if (gUnknown_203B2B8->unk18->unk4.dungeonIndex == 0x44 || gUnknown_203B2B8->unk18->unk4.dungeonIndex == 0x45) return TRUE; else return FALSE; @@ -344,7 +344,7 @@ u32 sub_8026E88(struct PokemonStruct *r0) u8 iVar3; if(r0->unk2 == 0) { - iVar3 = (r0->unk4.unk4 == 0x41); + iVar3 = (r0->unk4.dungeonIndex == 0x41); if(iVar3 != 0) if(sub_80023E4(0x8) == 0) return 0; @@ -361,7 +361,7 @@ u32 sub_8026EB8(struct PokemonStruct *r0) if(sub_808D3F8() != r0) if(r0->unk2 == 0) { - iVar3 = (r0->unk4.unk4 == 0x41); + iVar3 = (r0->unk4.dungeonIndex == 0x41); if(iVar3 != 0) { if(sub_80023E4(0x8) != 0) diff --git a/src/save.c b/src/save.c index 835c111..72a6496 100644 --- a/src/save.c +++ b/src/save.c @@ -171,7 +171,7 @@ extern void sub_800135C(void); extern u32 GetGameOptions(void); extern void InitializeGameOptions(u8 r0); extern u8 *sub_80950F8(void); -extern void sub_80958E4(u8 *a, u32 b); +extern void sub_80958E4(u32 *a, u32 b); extern u32 sub_80958F8(void); extern void sub_8095900(void); extern void sub_80972F4(void); @@ -529,7 +529,7 @@ u32 sub_80121E0(u32 r0) string = sub_8011C4C(); strncpy(r4->unk4, string, ARRAY_COUNT(r4->unk4)); - sub_80958E4((u8 *)r4 + 32, 0); + sub_80958E4(&r4->unk20, 0); temp3 = WriteSaveSector(&temp, (u8 *)r4, sizeof(struct unk_struct)); MemoryFree(r4); return temp3; -- cgit v1.2.3