summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code_2.c4
-rw-r--r--src/code_8041AD0.c300
-rw-r--r--src/code_80428A0.c70
-rw-r--r--src/code_808DAB4.c17
-rw-r--r--src/code_809017C.c42
-rw-r--r--src/code_8092334.c84
-rw-r--r--src/friend_area.c722
-rw-r--r--src/friend_area_1.c90
-rw-r--r--src/save_mid.c11
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();