diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2020-12-31 18:30:16 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-31 18:30:16 -0600 |
commit | 87cd9885a9f8b38a76ab6add4a634e2a8a4837ee (patch) | |
tree | 9e7e3352cc63bf5665d192c8ebbdfd6032641f74 /src | |
parent | 01ec8edb40c0662863e2fd14395a057be852e060 (diff) |
Friend Area Decomp Work (#15)
split out and work on friend area stuff
Diffstat (limited to 'src')
-rw-r--r-- | src/code_2.c | 4 | ||||
-rw-r--r-- | src/code_8041AD0.c | 300 | ||||
-rw-r--r-- | src/code_80428A0.c | 70 | ||||
-rw-r--r-- | src/code_808DAB4.c | 17 | ||||
-rw-r--r-- | src/code_809017C.c | 42 | ||||
-rw-r--r-- | src/code_8092334.c | 84 | ||||
-rw-r--r-- | src/friend_area.c | 722 | ||||
-rw-r--r-- | src/friend_area_1.c | 90 | ||||
-rw-r--r-- | src/save_mid.c | 11 |
9 files changed, 1105 insertions, 235 deletions
diff --git a/src/code_2.c b/src/code_2.c index ba358bd..4e778e7 100644 --- a/src/code_2.c +++ b/src/code_2.c @@ -1,5 +1,6 @@ #include "global.h" #include "file_system.h" +#include "friend_area.h" #include "input.h" extern void InitHeap(void); @@ -13,7 +14,6 @@ extern void sub_8094F88(void); extern void sub_8094980(void); extern void sub_8094C14(void); extern void sub_8097F5C(void); -extern void sub_80923A0(void); extern void sub_8090998(void); extern void sub_809207C(void); extern void LoadWazaParameters(void); @@ -102,7 +102,7 @@ void GameLoop(void) sub_8094980(); sub_8094C14(); sub_8097F5C(); - sub_80923A0(); + LoadFriendAreas(); sub_8090998(); sub_809207C(); LoadWazaParameters(); diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index be254ef..29b1710 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -1,6 +1,6 @@ #include "global.h" -struct unkStruct_8041D5C +struct unkDungeon_8041D5C { u8 padding[0x70]; u8 *unk70[100]; @@ -12,28 +12,42 @@ struct unk_struct_8041F08 u32 unk4; }; +struct unkStruct_80420E8 +{ + u32 unk0; + u32 unk4; + u32 unk8; +}; + +extern u8 *gUnknown_203B418; + + +extern void sub_803ED30(u8, struct unkDungeon_8041D5C *r0, u8, u8); +extern void sub_804151C(struct unkDungeon_8041D5C *r0, u32 r1, u8 r2); +extern void sub_80416E0(struct unkDungeon_8041D5C *r0, u32, u32); +extern u8 sub_8042768(struct unkDungeon_8041D5C *r0); +extern void sub_806CDD4(struct unkDungeon_8041D5C *r0, u8, u32); +extern u8 sub_8071858(struct unkDungeon_8041D5C *r0, u8); +extern u32 sub_806F62C(u32); +extern void sub_8083E38(u32); +extern u8 sub_803F428(struct unkDungeon_8041D5C *r0); +extern void sub_8041550(struct unkDungeon_8041D5C *r0, u32, u32, u32); -extern void sub_803ED30(u8, struct unkStruct_8041D5C *r0, u8, u8); -extern void sub_804151C(u32 r0, u32 r1, u8 r2); -extern void sub_80421C0(u32 r0, u32 r1); -extern u8 sub_8042768(void); -extern void sub_806CDD4(u32 r0, u8, u32); -extern u8 sub_8071858(u32, u8); -extern void sub_8041550(u32 r0, u32, u32, u32); +void sub_80421C0(struct unkDungeon_8041D5C *r0, u16 r1); -void sub_8041AD0(u32 r0) +void sub_8041AD0(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xA2 << 1, 1); } -void sub_8041AE0(u32 r0) +void sub_8041AE0(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x143, 1); } -void sub_8041AF4(u32 r0) +void sub_8041AF4(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x25, 1); sub_80421C0(r0, 0x197); @@ -43,7 +57,7 @@ void nullsub_57(void) { } -void sub_8041B18(u32 r0) +void sub_8041B18(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x141, 1); } @@ -56,7 +70,7 @@ void nullsub_59(void) { } -void sub_8041B34(u32 r0) +void sub_8041B34(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 7, 1); } @@ -65,7 +79,7 @@ void nullsub_60(void) { } -void sub_8041B48(u32 r0) +void sub_8041B48(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 4, 0); } @@ -74,16 +88,16 @@ void nullsub_61(void) { } -void sub_8041B5C(u32 r0) +void sub_8041B5C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x171, 1); } -void nullsub_62(void) +void nullsub_62(struct unkDungeon_8041D5C *r0) { } -void sub_8041B74(u32 r0) +void sub_8041B74(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x171, 0); } @@ -96,7 +110,7 @@ void nullsub_64(void) { } -void sub_8041B90(u32 r0) +void sub_8041B90(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD6 << 1, 0); } @@ -109,7 +123,7 @@ void nullsub_66(void) { } -void sub_8041BA8(u32 r0) +void sub_8041BA8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 4, 1); } @@ -118,7 +132,7 @@ void nullsub_67(void) { } -void sub_8041BBC(u32 r0) +void sub_8041BBC(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD4 << 1, 1); } @@ -127,7 +141,7 @@ void nullsub_68(void) { } -void sub_8041BD0(u32 r0, u8 r1) +void sub_8041BD0(struct unkDungeon_8041D5C *r0, u8 r1) { if(r1 == 0) { @@ -136,22 +150,22 @@ void sub_8041BD0(u32 r0, u8 r1) sub_80421C0(r0, 0x1a5); } -void sub_8041BE8(u32 r0) +void sub_8041BE8(struct unkDungeon_8041D5C *r0) { sub_80421C0(r0, 0xCB << 1); } -void sub_8041BF8(u32 r0) +void sub_8041BF8(struct unkDungeon_8041D5C *r0) { sub_806CDD4(r0, 0xA, 8); } -void sub_8041C08(u32 r0) +void sub_8041C08(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a7, 1); } -void sub_8041C1C(u32 r0) +void sub_8041C1C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a7, 1); } @@ -160,7 +174,7 @@ void nullsub_69(void) { } -void sub_8041C34(u32 r0) +void sub_8041C34(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x4C, 1); } @@ -173,22 +187,22 @@ void nullsub_71(void) { } -void sub_8041C4C(u32 r0, u32 r1) +void sub_8041C4C(struct unkDungeon_8041D5C *r0, u32 r1) { sub_804151C(r0, r1, 1); } -void sub_8041C58(u32 r0) +void sub_8041C58(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 1); } -void sub_8041C6C(u32 r0) +void sub_8041C6C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x9D << 1, 1); } -void sub_8041C7C(u32 r0) +void sub_8041C7C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x9D << 1, 1); } @@ -201,32 +215,32 @@ void nullsub_73(void) { } -void sub_8041C94(u32 r0) +void sub_8041C94(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x171, 1); } -void sub_8041CA8(u32 r0) +void sub_8041CA8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 7, 1); } -void sub_8041CB8(u32 r0) +void sub_8041CB8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x18b, 1); } -void sub_8041CCC(u32 r0) +void sub_8041CCC(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xC5 << 1, 1); } -void sub_8041CDC(u32 r0) +void sub_8041CDC(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 5, 1); } -void sub_8041CEC(u32 r0) +void sub_8041CEC(struct unkDungeon_8041D5C *r0) { sub_80421C0(r0, 0x19d); } @@ -235,7 +249,7 @@ void nullsub_74(void) { } -void sub_8041D00(u32 r0, u32 r1) +void sub_8041D00(struct unkDungeon_8041D5C *r0, struct unkDungeon_8041D5C *r1) { sub_804151C(r1, 0x2F, 1); sub_804151C(r0, 0x30, 1); @@ -265,12 +279,12 @@ void nullsub_80(void) { } -void sub_8041D38(u32 r0) +void sub_8041D38(struct unkDungeon_8041D5C * r0) { sub_804151C(r0, 0x21, 1); } -void sub_8041D48(u32 r0) +void sub_8041D48(struct unkDungeon_8041D5C * r0) { sub_80421C0(r0, 0x191); } @@ -279,10 +293,10 @@ void nullsub_81(void) { } -void sub_8041D5C(struct unkStruct_8041D5C *r0) +void sub_8041D5C(struct unkDungeon_8041D5C *r0) { u8 *temp; - if(sub_8042768() == 0) + if(sub_8042768(r0) == 0) { return; } @@ -290,7 +304,7 @@ void sub_8041D5C(struct unkStruct_8041D5C *r0) sub_803ED30(temp[0x89 << 1] , r0, 1, 0xB); } -void sub_8041D84(u32 r0) +void sub_8041D84(struct unkDungeon_8041D5C * r0) { sub_80421C0(r0, 0x19f); } @@ -303,12 +317,12 @@ void nullsub_83(void) { } -void sub_8041D9C(u32 r0) +void sub_8041D9C(struct unkDungeon_8041D5C * r0) { sub_804151C(r0, 0x131, 1); } -void sub_8041DB0(u32 r0) +void sub_8041DB0(struct unkDungeon_8041D5C * r0) { sub_804151C(r0, 0x30, 1); } @@ -337,122 +351,93 @@ void nullsub_88(void) { } -#ifndef NONMATCHING -NAKED -#endif -// TODO r1 is doing an lsr instead of an asr... maybe a signed arg? -void sub_8041DD8(u32 r0, u16 r1) +void sub_8041DD8(struct unkDungeon_8041D5C *r0, s16 r1) { -#ifdef NONMATCHING + u32 temp; + temp = r1; + if(sub_8071858(r0, 0xE) != 0) - { - sub_804151C(r0, r1, 1); - return; - } - sub_804151C(r0, 0xE, 1); -#else - asm_unified("\tpush {r4,r5,lr}\n" - "\tadds r4, r0, 0\n" - "\tlsls r1, 16\n" - "\tasrs r5, r1, 16\n" - "\tmovs r1, 0xE\n" - "\tbl sub_8071858\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _08041DF8\n" - "\tadds r0, r4, 0\n" - "\tadds r1, r5, 0\n" - "\tmovs r2, 0x1\n" - "\tbl sub_804151C\n" - "\tb _08041E02\n" -"_08041DF8:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0xE\n" - "\tmovs r2, 0x1\n" - "\tbl sub_804151C\n" -"_08041E02:\n" - "\tpop {r4,r5}\n" - "\tpop {r0}\n" - "\tbx r0"); -#endif + sub_804151C(r0, temp, 1); + else + sub_804151C(r0, 0xE, 1); } void nullsub_89(void) { } -void sub_8041E0C(u32 r0) +void sub_8041E0C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x41, 1); } -void sub_8041E1C(u32 r0) +void sub_8041E1C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x8F << 1, 1); sub_80421C0(r0, 0xCE << 1); } -void sub_8041E3C(u32 r0) +void sub_8041E3C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD7 << 1, 1); } -void sub_8041E4C(u32 r0) +void sub_8041E4C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1b1, 1); } -void sub_8041E60(u32 r0) +void sub_8041E60(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 1); } -void sub_8041E74(u32 r0) +void sub_8041E74(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xC9 << 1, 1); } -void sub_8041E84(u32 r0) +void sub_8041E84(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xC7 << 1, 1); } -void sub_8041E94(u32 r0) +void sub_8041E94(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xC8 << 1, 1); } -void sub_8041EA4(u32 r0) +void sub_8041EA4(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x15, 1); } -void sub_8041EB4(u32 r0) +void sub_8041EB4(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x171, 1); } -void sub_8041EC8(u32 r0) +void sub_8041EC8(struct unkDungeon_8041D5C *r0) { sub_80421C0(r0, 0x197); } -void sub_8041ED8(u32 r0) +void sub_8041ED8(struct unkDungeon_8041D5C *r0) { sub_80421C0(r0, 0x197); } -void sub_8041EE8(u32 r0) +void sub_8041EE8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x15, 1); } -void sub_8041EF8(u32 r0) +void sub_8041EF8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xF, 1); } -void sub_8041F08(u32 r0) +void sub_8041F08(struct unkDungeon_8041D5C *r0) { volatile struct unk_struct_8041F08 temp; temp.unk0 = 2; @@ -464,7 +449,7 @@ void nullsub_90(void) { } -void sub_8041F28(u32 r0, u32 r1) +void sub_8041F28(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -476,7 +461,7 @@ void sub_8041F28(u32 r0, u32 r1) } } -void sub_8041F4C(u32 r0, u32 r1) +void sub_8041F4C(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -488,7 +473,7 @@ void sub_8041F4C(u32 r0, u32 r1) } } -void sub_8041F70(u32 r0, u32 r1) +void sub_8041F70(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -500,7 +485,7 @@ void sub_8041F70(u32 r0, u32 r1) } } -void sub_8041F94(u32 r0, u32 r1) +void sub_8041F94(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -512,7 +497,7 @@ void sub_8041F94(u32 r0, u32 r1) } } -void sub_8041FB4(u32 r0, u32 r1) +void sub_8041FB4(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -524,7 +509,7 @@ void sub_8041FB4(u32 r0, u32 r1) } } -void sub_8041FD8(u32 r0, u32 r1) +void sub_8041FD8(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -536,7 +521,7 @@ void sub_8041FD8(u32 r0, u32 r1) } } -void sub_8041FFC(u32 r0, u32 r1) +void sub_8041FFC(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -548,7 +533,7 @@ void sub_8041FFC(u32 r0, u32 r1) } } -void sub_804201C(u32 r0, u32 r1) +void sub_804201C(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -560,7 +545,7 @@ void sub_804201C(u32 r0, u32 r1) } } -void sub_8042040(u32 r0, u32 r1) +void sub_8042040(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -572,7 +557,7 @@ void sub_8042040(u32 r0, u32 r1) } } -void sub_8042060(u32 r0, u32 r1) +void sub_8042060(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -584,7 +569,7 @@ void sub_8042060(u32 r0, u32 r1) } } -void sub_8042080(u32 r0, u32 r1) +void sub_8042080(struct unkDungeon_8041D5C *r0, u32 r1) { if(r1 == 0) { @@ -596,7 +581,7 @@ void sub_8042080(u32 r0, u32 r1) } } -void sub_80420A0(u32 r0, u32 r1) +void sub_80420A0(struct unkDungeon_8041D5C *r0, u32 r1) { sub_804151C(r0, 0x143, 1); } @@ -605,12 +590,12 @@ void nullsub_91(void) { } -void sub_80420B8(u32 r0, u32 r1) +void sub_80420B8(struct unkDungeon_8041D5C *r0, u32 r1) { sub_804151C(r0, 0x19, 1); } -void sub_80420C8(u32 r0) +void sub_80420C8(struct unkDungeon_8041D5C *r0) { volatile struct unk_struct_8041F08 temp; temp.unk0 = 2; @@ -621,3 +606,100 @@ void sub_80420C8(u32 r0) void nullsub_92(void) { } + +void sub_80420E8(struct unkDungeon_8041D5C *r0, struct unkStruct_80420E8 *r1) +{ + u32 temp; + u32 arg; + volatile struct unk_struct_8041F08 temp_1; + temp = r1->unk8; + if(gUnknown_203B418[0x16d] != 0) + temp = sub_806F62C(r1->unk8); + switch(temp) + { + default: + case 0: + arg = 8; + break; + case 1: + arg = 9; + break; + case 2: + arg = 10; + break; + case 3: + arg = 11; + break; + } + temp_1.unk0 = 0; + temp_1.unk4 = 1; + sub_8041550(r0, arg, 1, 3); +} + +void sub_8042148(struct unkDungeon_8041D5C *r0) +{ + sub_80421C0(r0, 0x1a7); + sub_804151C(r0, 0x9F << 1, 1); +} + +void nullsub_93() +{ +} + +void sub_804216C(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2) +{ + if(r2 == 1) + sub_804151C(r1, 0xF8, 1); + else + sub_804151C(r1, 0xF9, 1); +} + +void sub_804218C(u32 r0, struct unkDungeon_8041D5C *r1) +{ + sub_804151C(r1, 0x2A, 1); +} + +void sub_804219C(struct unkDungeon_8041D5C *r0) +{ + sub_80416E0(r0, 0x90, 1); +} + +void sub_80421AC(u32 r0, struct unkDungeon_8041D5C * r1) +{ + sub_804151C(r1, 0x167, 1); +} + +void sub_80421C0(struct unkDungeon_8041D5C *r0, u16 r1) +{ + if(r0 == NULL) + sub_8083E38(r1); + else + if(sub_8042768(r0) != 0) + sub_8083E38(r1); +} + +void sub_80421EC(struct unkDungeon_8041D5C *r0, u16 r1) +{ + if(sub_803F428(r0) != 0) + sub_8083E38(r1); +} + +void sub_8042208(struct unkDungeon_8041D5C *r0, u8 r1) +{ + if(r1 == 0) + sub_8083E38(0xA9 << 1); + else if(r1 == 1) + sub_8083E38(0x151); + else + sub_8083E38(0xA8 << 1); +} + +void sub_8042238(u32 r0, struct unkDungeon_8041D5C *r1) +{ + u8 *temp; + temp = *r1->unk70; + if(temp[6] != 0) + sub_8083E38(0x157); + else + sub_8083E38(0xAB << 1); +} diff --git a/src/code_80428A0.c b/src/code_80428A0.c index 08599b7..6c7d48d 100644 --- a/src/code_80428A0.c +++ b/src/code_80428A0.c @@ -1,145 +1,153 @@ #include "global.h" -extern void sub_804151C(u32 r0, u32 r1, u8 r2); +struct unkDungeon_8041D5C +{ + u8 padding[0x70]; + u8 *unk70[100]; +}; + + +extern void sub_804151C(struct unkDungeon_8041D5C *r0, u32 r1, u8 r2); extern void sub_803E708(u32 r0, u32 r1); -extern void sub_80416A4(u32 r0, u32 r1, u32 r2); -extern void sub_80421C0(u32 r0, u32 r1); +extern void sub_80416A4(struct unkDungeon_8041D5C *r0, u32 r1, u32 r2); +extern void sub_80421C0(struct unkDungeon_8041D5C *r0, u16 r1); + -void sub_80428A0(u32 r0) +void sub_80428A0(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x29, 1); } -void sub_80428B0(u32 r0) +void sub_80428B0(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_80428C4(u32 r0) +void sub_80428C4(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_80428D8(u32 r0) +void sub_80428D8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_80428EC(u32 r0) +void sub_80428EC(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_8042900(u32 r0) +void sub_8042900(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD4 << 1, 0); } -void sub_8042910(u32 r0) +void sub_8042910(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x29, 0); } -void sub_8042920(u32 r0) +void sub_8042920(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x48, 0); } -void sub_8042930(u32 r0) +void sub_8042930(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD3 << 1, 1); } -void sub_8042940(u32 r0) +void sub_8042940(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xC7 << 1, 0); } -void sub_8042950(u32 r0) +void sub_8042950(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD8 << 1, 1); sub_803E708(0xA, 0x42); } -void sub_8042968(u32 r0) +void sub_8042968(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xD4 << 1, 0); } -void sub_8042978(u32 r0) +void sub_8042978(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_804298C(u32 r0) +void sub_804298C(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1a9, 0); } -void sub_80429A0(u32 r0) +void sub_80429A0(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x199, 0); } -void sub_80429B4(u32 r0) +void sub_80429B4(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x1ab, 0); } -void sub_80429C8(u32 r0) +void sub_80429C8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x4, 1); } -void sub_80429D8(u32 r0) +void sub_80429D8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x8F << 1, 1); } -void sub_80429E8(u32 r0) +void sub_80429E8(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x11d, 1); } -void sub_80429FC(u32 r0) +void sub_80429FC(struct unkDungeon_8041D5C *r0) { sub_80416A4(r0, 0xCF << 1, 1); - sub_80421C0(0, 0xD4); + sub_80421C0(NULL, 0xD4); } -void sub_8042A14(u32 r0) +void sub_8042A14(struct unkDungeon_8041D5C *r0) { sub_80416A4(r0, 0x36, 1); } -void sub_8042A24(u32 r0) +void sub_8042A24(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x15, 1); } -void sub_8042A34(u32 r0) +void sub_8042A34(struct unkDungeon_8041D5C *r0) { sub_80416A4(r0, 0x9F << 1, 0); } -void sub_8042A44(u32 r0) +void sub_8042A44(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0xDA << 1, 1); } -void sub_8042A54(u32 r0) +void sub_8042A54(struct unkDungeon_8041D5C *r0) { sub_80416A4(r0, 0x37, 1); } -void sub_8042A64(u32 r0) +void sub_8042A64(struct unkDungeon_8041D5C *r0) { sub_80416A4(r0, 0x29, 1); } -void sub_8042A74(u32 r0) +void sub_8042A74(struct unkDungeon_8041D5C *r0) { sub_804151C(r0, 0x18, 1); } diff --git a/src/code_808DAB4.c b/src/code_808DAB4.c index e7e7110..1762397 100644 --- a/src/code_808DAB4.c +++ b/src/code_808DAB4.c @@ -1,10 +1,21 @@ #include "global.h" -extern void sub_808DE50(void* r0, void * r1, u32 r2, u32 r3); +struct unkStruct_203B45C +{ + u8 unk0; + u8 padding1; + u8 unk2; + u8 padding2; + u8 unk4; + u8 array[0x53]; +}; + +extern struct unkStruct_203B45C *gUnknown_203B45C; + +extern void sub_808DE50(void* r0, struct unkStruct_203B45C *r1, u32 r2, u32 r3); -extern void * gUnknown_203B45C; void sub_808DE30(void* r0, u32 r1) { - sub_808DE50(r0, gUnknown_203B45C + (r1 * 0x58), r1, r1 * 0x58); + sub_808DE50(r0, &gUnknown_203B45C[r1], r1, r1 * sizeof(struct unkStruct_203B45C)); } diff --git a/src/code_809017C.c b/src/code_809017C.c new file mode 100644 index 0000000..2d3abcf --- /dev/null +++ b/src/code_809017C.c @@ -0,0 +1,42 @@ +#include "global.h" + +extern u32 gUnformattedTypeStrings[]; // unformatted type names +extern u32 gFormattedTypeStrings[]; // formatted type names + +extern u8 gUnknown_810AC7C[]; +extern u8 gUnknown_810AC6A[]; + +extern u8 *gAbilityNames[]; +extern u8 *AbilityDescriptions[]; + + +u32 GetUnformattedTypeString(u8 type) +{ + return gUnformattedTypeStrings[type]; +} + +u32 GetFormattedTypeString(u8 type) +{ + return gFormattedTypeStrings[type]; +} + +u8 sub_8092354(u8 index) +{ + return gUnknown_810AC7C[index]; +} + +u8 sub_8092364(u8 index) +{ + return gUnknown_810AC6A[index]; +} + +void sub_8092374(char *r0, u8 index) +{ + strncpy(r0, gAbilityNames[index], 0x50); +} + +u8 *GetAbilityDescription(u8 index) +{ + return AbilityDescriptions[index]; +} + diff --git a/src/code_8092334.c b/src/code_8092334.c deleted file mode 100644 index 1fba58e..0000000 --- a/src/code_8092334.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "global.h" - -#define NUM_FRIEND_AREAS 58 - -extern u32 gUnformattedTypeStrings[]; // unformatted type names -extern u32 gFormattedTypeStrings[]; // formatted type names - -extern u8 gUnknown_810AC7C[]; -extern u8 gUnknown_810AC6A[]; - -extern u8 *gAbilityNames[]; -extern u8 *AbilityDescriptions[]; - -extern u8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; -extern u8 *gUnknown_203B468; - -extern s16 gUnknown_810AA90[]; - -u32 GetUnformattedTypeString(u8 type) -{ - return gUnformattedTypeStrings[type]; -} - -u32 GetFormattedTypeString(u8 type) -{ - return gFormattedTypeStrings[type]; -} - -u8 sub_8092354(u8 r0) -{ - return gUnknown_810AC7C[r0]; -} - -u8 sub_8092364(u8 r0) -{ - return gUnknown_810AC6A[r0]; -} - -void sub_8092374(char *r0, u8 r1) -{ - strncpy(r0, gAbilityNames[r1], 0x50); -} - -u8 *sub_8092390(u8 r0) -{ - return AbilityDescriptions[r0]; -} - -void sub_80923A0(void) -{ - gUnknown_203B468 = gBoughtFriendAreas; -} - -u8 *sub_80923B0(void) -{ - return gBoughtFriendAreas; -} - -void sub_80923B8(void) -{ - s32 counter; - for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) - { - gUnknown_203B468[counter] = 0; - } -} - -u8 sub_80923D4(s32 target) -{ - s32 counter; - s32 index; - s32 sum = 0; - index = 0; - for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) - { - sum += gUnknown_810AA90[index]; - if(sum > target) - { - return counter; - } - index += 4; - } - return 0; -} diff --git a/src/friend_area.c b/src/friend_area.c new file mode 100644 index 0000000..a737302 --- /dev/null +++ b/src/friend_area.c @@ -0,0 +1,722 @@ +#include "global.h" +#include "constants/friend_area.h" +#include "friend_area.h" + +extern bool8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; +extern bool8 *gFriendAreas; + + +extern struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS]; + +struct unkStruct_203B45C +{ + // size: 0x58? + u16 unk0; + s16 unk2; + u8 unk4[0x24]; + u8 unk28; + u8 unk29[0x2f]; +}; + +struct unkFriendAreaStruct +{ + // size: 0x18 + u32 unk0; + u32 unk4; + u32 padding[4]; +}; + +extern struct unkStruct_203B45C gUnknown_203B45C[]; + +extern struct FriendAreaSettings gFriendAreaSettings[58]; +extern bool8 *gFriendAreas; + +extern u32 gFriendAreaDescriptions[]; +extern const char *gFriendAreaNames[]; +extern u32 gUnknown_81098A4; + +extern void sub_800D158(u8 *buffer, u32 *r1, const char *r2, ...); +extern void sub_8090FEC(u32, u32 *r1, u32); + + +// TODO uncomment when all references have been moved +//static struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] = +//{ +// [NONE] = { +// .num_pokemon = 0, +// .unlock_condition = 0, +// .price = 0, +// }, +// [BOUNTIFUL_SEA] = { +// .num_pokemon = 9, +// .unlock_condition = 1, +// .price = 5500, +// }, +// [TREASURE_SEA] = { +// .num_pokemon = 10, +// .unlock_condition = 1, +// .price = 4500, +// }, +// [SERENE_SEA] = { +// .num_pokemon = 4, +// .unlock_condition = 1, +// .price = 8000, +// }, +// [DEEP_SEA_FLOOR] = { +// .num_pokemon = 12, +// .unlock_condition = 1, +// .price = 5500, +// }, +// [DEEP_SEA_CURRENT] = { +// .num_pokemon = 1, +// .unlock_condition = 3, +// .price = 0, +// }, +// [SEAFLOOR_CAVE] = { +// .num_pokemon = 0, +// .unlock_condition = 0, +// .price = 0, +// }, +// [SHALLOW_CAVE] = { +// .num_pokemon = 5, +// .unlock_condition = 1, +// .price = 5000, +// }, +// [MT_DEEPGREEN] = { +// .num_pokemon = 12, +// .unlock_condition = 0, +// .price = 130, +// }, +// [MT_CLEFT] = { +// .num_pokemon = 9, +// .unlock_condition = 1, +// .price = 5000, +// }, +// [MT_MOONVIEW] = { +// .num_pokemon = 6, +// .unlock_condition = 2, +// .price = 0, +// }, +// [RAINBOW_PEAK] = { +// .num_pokemon = 1, +// .unlock_condition = 1, +// .price = 6500, +// }, +// [WILD_PLAINS] = { +// .num_pokemon = 13, +// .unlock_condition = 0, +// .price = 100, +// }, +// [BEAU_PLAINS] = { +// .num_pokemon = 12, +// .unlock_condition = 0, +// .price = 600, +// }, +// [SKY_BLUE_PLAINS] = { +// .num_pokemon = 13, +// .unlock_condition = 2, +// .price = 0, +// }, +// [SAFARI] = { +// .num_pokemon = 15, +// .unlock_condition = 0, +// .price = 700, +// }, +// [SCORCHED_PLAINS] = { +// .num_pokemon = 10, +// .unlock_condition = 1, +// .price = 5000, +// }, +// [SACRED_FIELD] = { +// .num_pokemon = 3, +// .unlock_condition = 1, +// .price = 6500 +// }, +// [MIST_RISE_FOREST] = { +// .num_pokemon = 14, +// .unlock_condition = 0, +// .price = 150 +// }, +// [FLYAWAY_FOREST] = { +// .num_pokemon = 12, +// .unlock_condition = 0, +// .price = 550 +// }, +// [OVERGROWN_FOREST] = { +// .num_pokemon = 9, +// .unlock_condition = 0, +// .price = 600 +// }, +// [ENERGETIC_FOREST] = { +// .num_pokemon = 15, +// .unlock_condition = 1, +// .price = 5000 +// }, +// [MUSHROOM_FOREST] = { +// .num_pokemon = 7, +// .unlock_condition = 0, +// .price = 500 +// }, +// [HEALING_FOREST] = { +// .num_pokemon = 1, +// .unlock_condition = 3, +// .price = 0 +// }, +// [TRANSFORM_FOREST] = { +// .num_pokemon = 6, +// .unlock_condition = 0, +// .price = 500 +// }, +// [SECRETIVE_FOREST] = { +// .num_pokemon = 9, +// .unlock_condition = 1, +// .price = 6500 +// }, +// [RUB_A_DUB_RIVER] = { +// .num_pokemon = 7, +// .unlock_condition = 0, +// .price = 500 +// }, +// [TADPOLE_POND] = { +// .num_pokemon = 9, +// .unlock_condition = 0, +// .price = 500 +// }, +// [TURTLESHELL_POND] = { +// .num_pokemon = 10, +// .unlock_condition = 1, +// .price = 5500 +// }, +// [MYSTIC_LAKE] = { +// .num_pokemon = 4, +// .unlock_condition = 1, +// .price = 2500 +// }, +// [WATERFALL_LAKE] = { +// .num_pokemon = 4, +// .unlock_condition = 1, +// .price = 3500 +// }, +// [PEANUT_SWAMP] = { +// .num_pokemon = 7, +// .unlock_condition = 0, +// .price = 2500 +// }, +// [POISON_SWAMP] = { +// .num_pokemon = 6, +// .unlock_condition = 1, +// .price = 8500 +// }, +// [ECHO_CAVE] = { +// .num_pokemon = 11, +// .unlock_condition = 1, +// .price = 7500 +// }, +// [CRYPTIC_CAVE] = { +// .num_pokemon = 1, +// .unlock_condition = 1, +// .price = 6500 +// }, +// [DRAGON_CAVE] = { +// .num_pokemon = 3, +// .unlock_condition = 2, +// .price = 0 +// }, +// [BOULDER_CAVE] = { +// .num_pokemon = 4, +// .unlock_condition = 2, +// .price = 0 +// }, +// [JUNGLE] = { +// .num_pokemon = 13, +// .unlock_condition = 0, +// .price = 800 +// }, +// [DECRPEPIT_LAB] = { +// .num_pokemon = 7, +// .unlock_condition = 0, +// .price = 1000 +// }, +// [MT_DISCIPLINE] = { +// .num_pokemon = 11, +// .unlock_condition = 0, +// .price = 1200 +// }, +// [THUNDER_MEADOW] = { +// .num_pokemon = 11, +// .unlock_condition = 0, +// .price = 1000 +// }, +// [POWER_PLANT] = { +// .num_pokemon = 6, +// .unlock_condition = 0, +// .price = 600 +// }, +// [CRATER] = { +// .num_pokemon = 7, +// .unlock_condition = 1, +// .price = 7500 +// }, +// [FURNACE_DESERT] = { +// .num_pokemon = 7, +// .unlock_condition = 1, +// .price = 8500 +// }, +// [AGED_CHAMBER_AN] = { +// .num_pokemon = 14, +// .unlock_condition = 1, +// .price = 5500 +// }, +// [AGED_CHAMBER_O_EXCLAIM] = { +// .num_pokemon = 14, +// .unlock_condition = 1, +// .price = 5500 +// }, +// [ANCIENT_RELIC] = { +// .num_pokemon = 6, +// .unlock_condition = 1, +// .price = 8000 +// }, +// [DARKNESS_RIDGE] = { +// .num_pokemon = 13, +// .unlock_condition = 3, +// .price = 0 +// }, +// [FRIGID_CAVERN] = { +// .num_pokemon = 7, +// .unlock_condition = 1, +// .price = 9000 +// }, +// [ICE_FLOE_BEACH] = { +// .num_pokemon = 5, +// .unlock_condition = 1, +// .price = 9500 +// }, +// [VOLCANIC_PIT] = { +// .num_pokemon = 1, +// .unlock_condition = 3, +// .price = 0 +// }, +// [STRATOS_LOOKOUT] = { +// .num_pokemon = 1, +// .unlock_condition = 3, +// .price = 0 +// }, +// [RAVAGED_FIELD] = { +// .num_pokemon = 5, +// .unlock_condition = 0, +// .price = 1000 +// }, +// [MAGNETIC_QUARRY] = { +// .num_pokemon = 3, +// .unlock_condition = 0, +// .price = 1000 +// }, +// [LEGENDARY_ISLAND] = { +// .num_pokemon = 3, +// .unlock_condition = 3, +// .price = 7500 +// }, +// [SOUTHERN_ISLAND] = { +// .num_pokemon = 2, +// .unlock_condition = 1, +// .price = 9500 +// }, +// [ENCLOSED_ISLAND] = { +// .num_pokemon = 1, +// .unlock_condition = 3, +// .price = 0 +// }, +// [FINAL_ISLAND] = { +// .num_pokemon = 1, +// .unlock_condition = 1, +// .price = 8500 +// }, +//}; + +void LoadFriendAreas(void) +{ + gFriendAreas = gBoughtFriendAreas; +} + +bool8 *GetBoughtFriendAreas(void) +{ + return gBoughtFriendAreas; +} + +void InitializeFriendAreas(void) +{ + s32 counter; + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) + { + gFriendAreas[counter] = FALSE; + } +} + +u8 sub_80923D4(s32 target) +{ + s32 counter; + s32 sum = 0; + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) + { + sum += gFriendAreaSettings[counter].num_pokemon; + if(sum > target) + { + return counter; + } + } + return 0; +} + +#ifdef NONMATCHING +void sub_8092404(u8 r0, u16 *r1, bool8 r2, bool8 r3) +{ + s32 counter; + bool32 flag; + s32 r6; + r6 = 0; + for(counter = 0; counter <= 412; counter++) + { + if((u8)(gUnknown_203B45C[counter].unk0) & 1) + { + if(((u8)gUnknown_203B45C[counter].unk2 == 0) || r2) + { + flag = (u8)gUnknown_203B45C[counter].unk4[0] == 65; + if(!flag || r3) + { + if(sub_80923D4(counter) == r0) + { + if(r6 <= 15) + { + r1[r6] = counter; + r6++; + } + } + } + } + } + } + r1[r6] = 0xffff; +} +#else +NAKED void sub_8092404(u8 r0, u16 *r1, bool8 r2, bool8 r3) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tmov r10, r1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r9, r0\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tmov r8, r2\n" + "\tlsls r3, 24\n" + "\tlsrs r7, r3, 24\n" + "\tmovs r6, 0\n" + "\tmovs r4, 0\n" + "\tmov r5, r10\n" +"_08092426:\n" + "\tmovs r0, 0x58\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _08092494\n" + "\tldr r0, [r0]\n" + "\tadds r2, r1, r0\n" + "\tldrb r1, [r2]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _08092472\n" + "\tldrb r0, [r2, 0x2]\n" + "\tcmp r0, 0\n" + "\tbeq _08092448\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _08092472\n" +"_08092448:\n" + "\tmovs r1, 0\n" + "\tldrb r0, [r2, 0x4]\n" + "\tcmp r0, 0x41\n" + "\tbne _08092452\n" + "\tmovs r1, 0x1\n" +"_08092452:\n" + "\tcmp r1, 0\n" + "\tbeq _0809245A\n" + "\tcmp r7, 0\n" + "\tbeq _08092472\n" +"_0809245A:\n" + "\tadds r0, r4, 0\n" + "\tbl sub_80923D4\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, r9\n" + "\tbne _08092472\n" + "\tcmp r6, 0xF\n" + "\tbgt _08092472\n" + "\tstrh r4, [r5]\n" + "\tadds r5, 0x2\n" + "\tadds r6, 0x1\n" +"_08092472:\n" + "\tadds r4, 0x1\n" + "\tmovs r0, 0xCE\n" + "\tlsls r0, 1\n" + "\tcmp r4, r0\n" + "\tble _08092426\n" + "\tlsls r0, r6, 1\n" + "\tadd r0, r10\n" + "\tldr r2, _08092498\n" + "\tadds r1, r2, 0\n" + "\tstrh r1, [r0]\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08092494: .4byte gUnknown_203B45C\n" +"_08092498: .4byte 0x0000ffff"); +} +#endif + +#ifdef NONMATCHING +void sub_809249C(u8 index, u8 clear) +{ + s32 counter; + bool32 flag; + u8 temp8; + u8 neg8; + + if(!gFriendAreas[index]) + return; + for(counter = 0; counter <= 412; counter++) + { + if((u8)(gUnknown_203B45C[counter].unk0) & 1) + { + if(sub_80923D4(counter) == index) + { + flag = (u8)gUnknown_203B45C[counter].unk4[0] == 65; + if(!flag) + { + temp8 = (u8)gUnknown_203B45C[counter].unk2; + neg8 = -temp8; + neg8 |= temp8; + // still tries to left shift before the right shift.. + neg8 >>= 7; + if(neg8 != 0) + { + clear = 0; + } + else + { + gUnknown_203B45C[counter].unk0 = neg8; + } + } + } + } + } + if(clear) + { + gFriendAreas[index] = FALSE; + } +} +#else +NAKED void sub_809249C(u8 index, u8 clear) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tlsls r1, 24\n" + "\tlsrs r7, r1, 24\n" + "\tldr r0, _080924F8\n" + "\tldr r0, [r0]\n" + "\tadds r0, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0809251A\n" + "\tmovs r5, 0\n" +"_080924B4:\n" + "\tldr r2, _080924FC\n" + "\tmovs r0, 0x58\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, [r2]\n" + "\tadds r4, r0, r1\n" + "\tldrb r1, [r4]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _08092502\n" + "\tadds r0, r5, 0\n" + "\tbl sub_80923D4\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, r6\n" + "\tbne _08092502\n" + "\tmovs r1, 0\n" + "\tldrb r0, [r4, 0x4]\n" + "\tcmp r0, 0x41\n" + "\tbne _080924E2\n" + "\tmovs r1, 0x1\n" +"_080924E2:\n" + "\tcmp r1, 0\n" + "\tbne _080924F2\n" + "\tldrb r1, [r4, 0x2]\n" + "\tnegs r0, r1\n" + "\torrs r0, r1\n" + "\tlsrs r0, 31\n" + "\tcmp r0, 0\n" + "\tbeq _08092500\n" +"_080924F2:\n" + "\tmovs r7, 0\n" + "\tb _08092502\n" + "\t.align 2, 0\n" +"_080924F8: .4byte gFriendAreas\n" +"_080924FC: .4byte gUnknown_203B45C\n" +"_08092500:\n" + "\tstrh r0, [r4]\n" +"_08092502:\n" + "\tadds r5, 0x1\n" + "\tmovs r0, 0xCE\n" + "\tlsls r0, 1\n" + "\tcmp r5, r0\n" + "\tble _080924B4\n" + "\tcmp r7, 0\n" + "\tbeq _0809251A\n" + "\tldr r0, _08092520\n" + "\tldr r0, [r0]\n" + "\tadds r0, r6\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" +"_0809251A:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08092520: .4byte gFriendAreas"); +} +#endif + +const char *GetFriendAreaName(u8 index) +{ + return gFriendAreaNames[index]; +} + +u8 GetFriendAreaUnlockCondition(u8 index) +{ + return gFriendAreaSettings[index].unlock_condition; +} + +u32 GetFriendAreaPrice(u8 index) +{ + return gFriendAreaSettings[index].price; +} + +void sub_8092558(u8 *buffer, u8 index) +{ + // colors the friend area name green and prints to buffer? + sub_800D158(buffer, &gUnknown_81098A4, gFriendAreaNames[index]); +} + +#ifdef NONMATCHING +void sub_8092578(u8 *buffer, u8 index, u8 r2) +{ + // I think this is when we buy the friend area from wigglytuff + struct unkFriendAreaStruct temp; + if(r2) + { + sub_8090FEC(gFriendAreaSettings[index].price, &(temp.unk4), 1); + // TODO: There's some stack storage here in the middle calling this func + // add r0, sp, 0x4 + // str r0, [sp] + //temp.unk0 = temp.unk4; + sub_800D158(buffer, &gUnknown_81098AC, gFriendAreaNames[index], 96); + } + else + { + strcpy(buffer, gFriendAreaNames[index]); + } +} +#else +NAKED void sub_8092578(u8 *buffer, u8 index, u8 r2) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x18\n" + "\tadds r5, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r4, r1, 24\n" + "\tlsls r2, 24\n" + "\tcmp r2, 0\n" + "\tbeq _080925C0\n" + "\tldr r0, _080925B4\n" + "\tlsls r1, r4, 3\n" + "\tadds r0, 0x4\n" + "\tadds r1, r0\n" + "\tldr r0, [r1]\n" + "\tadd r1, sp, 0x4\n" + "\tmovs r2, 0x1\n" + "\tbl sub_8090FEC\n" + "\tldr r1, _080925B8\n" + "\tldr r2, _080925BC\n" + "\tlsls r0, r4, 2\n" + "\tadds r0, r2\n" + "\tldr r2, [r0]\n" + "\tadd r0, sp, 0x4\n" + "\tstr r0, [sp]\n" + "\tadds r0, r5, 0\n" + "\tmovs r3, 0x60\n" + "\tbl sub_800D158\n" + "\tb _080925CE\n" + "\t.align 2, 0\n" +"\t_080925B4: .4byte gFriendAreaSettings\n" +"\t_080925B8: .4byte gUnknown_81098AC\n" +"\t_080925BC: .4byte gFriendAreaNames\n" +"\t_080925C0:\n" + "\tldr r0, _080925D8\n" + "\tlsls r1, r4, 2\n" + "\tadds r1, r0\n" + "\tldr r1, [r1]\n" + "\tadds r0, r5, 0\n" + "\tbl strcpy\n" +"\t_080925CE:\n" + "\tadd sp, 0x18\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"\t_080925D8: .4byte gFriendAreaNames"); +} +#endif + +u32 GetFriendAreaDescription(u8 index) +{ + return gFriendAreaDescriptions[index]; +} + +void UnlockFriendArea(u8 index) +{ + gFriendAreas[index] = TRUE; +} + +bool8 GetFriendAreaStatus(u8 index) +{ + return gFriendAreas[index]; +} + +bool8 HasAllFriendAreas(void) +{ + s32 counter; + for(counter = 1; counter < NUM_FRIEND_AREAS; counter++) + { + if(!gFriendAreas[counter]) + { + return FALSE; + } + } + return TRUE; +} + diff --git a/src/friend_area_1.c b/src/friend_area_1.c new file mode 100644 index 0000000..ae04cdf --- /dev/null +++ b/src/friend_area_1.c @@ -0,0 +1,90 @@ +#include "global.h" +#include "constants/friend_area.h" + +extern bool8 *gFriendAreas; +extern void sub_809485C(u32 *r0, u32 r1, u32 r2); +extern void sub_8094924(u32 *r0, u32 *r1, u32); +extern void nullsub_102(u32 *r0); +extern void sub_809488C(u32 *r0, u32 *r1, u32 r2); +extern void sub_809486C(u32 *r0, u32 r1, u32 r2); + +#ifdef NONMATCHING +u32 sub_80927A8(u32 r0, u32 r1) +{ + u32 temp[5]; + s32 counter; + + sub_809486C(temp, r0, r1); + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) + { + // TODO moves into R1 for the load else it matches + if(!gFriendAreas[counter]) + temp[4] = gFriendAreas[counter]; + else + temp[4] = -1; + sub_809488C(temp, &(temp[4]), 1); + } + nullsub_102(temp); + return temp[2]; +} +#else +NAKED u32 sub_80927A8(u32 r0, u32 r1) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x14\n" + "\tadds r3, r0, 0\n" + "\tadds r2, r1, 0\n" + "\tmov r0, sp\n" + "\tadds r1, r3, 0\n" + "\tbl sub_809486C\n" + "\tmovs r4, 0\n" + "\tadd r5, sp, 0x10\n" +"_080927BC:\n" + "\tldr r0, _080927F0\n" + "\tldr r0, [r0]\n" + "\tadds r0, r4\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _080927CC\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" +"_080927CC:\n" + "\tstr r0, [sp, 0x10]\n" + "\tmov r0, sp\n" + "\tadds r1, r5, 0\n" + "\tmovs r2, 0x1\n" + "\tbl sub_809488C\n" + "\tadds r4, 0x1\n" + "\tcmp r4, 0x39\n" + "\tble _080927BC\n" + "\tmov r0, sp\n" + "\tbl nullsub_102\n" + "\tldr r0, [sp, 0x8]\n" + "\tadd sp, 0x14\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" +"_080927F0: .4byte gFriendAreas"); +} +#endif + +u32 sub_80927F4(u32 r0, u32 r1) +{ + u32 temp[5]; + s32 counter; + + sub_809485C(temp, r0, r1); + for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) + { + sub_8094924(temp, &(temp[4]), 1); + // It's setting whether we have the friend area or not + if((temp[4] & 1)) + gFriendAreas[counter] = TRUE; + else + gFriendAreas[counter] = FALSE; + } + nullsub_102(temp); + return temp[2]; +} + diff --git a/src/save_mid.c b/src/save_mid.c index ddf6d4d..604c98d 100644 --- a/src/save_mid.c +++ b/src/save_mid.c @@ -1,5 +1,6 @@ #include "global.h" #include "save.h" +#include "friend_area.h" extern struct UnkStruct_203B184 *gUnknown_203B184; extern struct unkTimeStruct *gUnknown_203B47C; @@ -28,7 +29,7 @@ extern struct unk_203B188 *gUnknown_203B188; extern u32 *gUnknown_203B45C; extern u32 *gUnknown_203B460; extern u32 gUnknown_203B464; -extern u8 *gUnknown_203B468; +extern u8 *gFriendAreas; extern u32 gUnknown_203B46C; extern u8 *gUnknown_203B480; extern u8 *gUnknown_203B484; @@ -46,8 +47,6 @@ extern u32 *sub_80909D0(void); extern void sub_80909D8(void); extern u32 sub_809208C(void); extern void sub_8092094(void); -extern u8 *sub_80923B0(void); -extern void sub_80923B8(void); extern u32 sub_8094990(void); extern void sub_8094998(u8 r0); extern u8 *sub_80950F8(void); @@ -184,7 +183,7 @@ void sub_80122F4(void) void sub_8012300(void) { - sub_80923B8(); + InitializeFriendAreas(); sub_808CE08(); sub_80909D8(); sub_8092094(); @@ -218,7 +217,7 @@ void sub_8012334(struct UnkStruct_203B184 *r0) gUnknown_203B464 = r0->unk1C; gUnknown_203B494 = r0->unk20; gUnknown_203B498 = r0->unk24; - gUnknown_203B468 = r0->unk28; + gFriendAreas = r0->BoughtFriendAreas; gUnknown_203B46C = r0->unk2C; gUnknown_203B47C = r0->unk30; return; @@ -233,7 +232,7 @@ void sub_8012334(struct UnkStruct_203B184 *r0) gUnknown_203B464 = sub_809208C(); gUnknown_203B494 = sub_8097680(); gUnknown_203B498 = sub_8097F6C(); - gUnknown_203B468 = sub_80923B0(); + gFriendAreas = GetBoughtFriendAreas(); gUnknown_203B46C = sub_8094990(); gUnknown_203B47C = sub_8094FA0(); |