summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
authorRémi Calixte <remicalixte.rmc@gmail.com>2021-06-19 23:18:58 +0200
committerGitHub <noreply@github.com>2021-06-19 23:18:58 +0200
commit7c6421dca564226cba6639f140b174ae966f58ac (patch)
tree889c3a3d91bbd376e431a0085c9ee62de10d7e8a /arm9/src
parent3e8c37cf1fee349756ff7f0fe9b0b693622bfa73 (diff)
parentf87cb8749a8a41f7e207b151c7d5e7d3668a58cf (diff)
Merge branch 'master' into unk_020023C0
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/unk_020851B8.c2
-rw-r--r--arm9/src/unk_02088AAC.c185
2 files changed, 186 insertions, 1 deletions
diff --git a/arm9/src/unk_020851B8.c b/arm9/src/unk_020851B8.c
index 592d16d6..922ca2e4 100644
--- a/arm9/src/unk_020851B8.c
+++ b/arm9/src/unk_020851B8.c
@@ -10,7 +10,7 @@ THUMB_FUNC struct UnkStruct_020851B8 *FUN_020851B8(u32 heap_id)
return ptr;
}
-THUMB_FUNC void FUN_020851DC(struct UnkStruct_020851B8 *param0, u32 item_id, BOOL param2)
+THUMB_FUNC void FUN_020851DC(struct UnkStruct_020851B8 *param0, u16 item_id, BOOL param2)
{
u16 berry_id = item_id - FIRST_BERRY_IDX;
FUN_02085200(param0, berry_id);
diff --git a/arm9/src/unk_02088AAC.c b/arm9/src/unk_02088AAC.c
new file mode 100644
index 00000000..c0419e09
--- /dev/null
+++ b/arm9/src/unk_02088AAC.c
@@ -0,0 +1,185 @@
+#include "global.h"
+#include "unk_02088AAC.h"
+#include "heap.h"
+#include "overlay_manager.h"
+#include "unk_020851B8.h"
+
+extern BOOL MOD68_021D74E0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD68_021D75D8(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD68_021D762C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D74F0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D758C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D7640(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6BA0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6D6C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6F00(struct UnkStruct_02006234 *, u32 *);
+
+extern BOOL FUN_0208898C(struct UnkStruct_02006234 **r0);
+
+THUMB_FUNC u32 FUN_02088AAC(struct UnkStruct_02088AAC *r0, u32 *r1)
+{
+ switch (*r1)
+ {
+ case 0:
+ *r1 = FUN_02088B4C(r0);
+ break;
+ case 1:
+ *r1 = FUN_02088BA8(r0);
+ break;
+ case 2:
+ *r1 = FUN_02088C3C(r0);
+ break;
+ case 3:
+ *r1 = FUN_02088CDC(r0);
+ break;
+ case 4:
+ return 1;
+ case 5:
+ return 4;
+ }
+
+ return 0;
+}
+
+THUMB_FUNC u32 FUN_02088AFC(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_73);
+
+ const struct Unk21DBE18 OVERLAY_73_MANAGER = { .unk0 = MOD73_021D74F0,
+ .unk4 = MOD73_021D758C,
+ .unk8 = MOD73_021D7640,
+ .ovly = FS_OVERLAY_ID(MODULE_73) };
+ r0->ovly_data = OverlayManager_new(&OVERLAY_73_MANAGER, (s32 *)r0, r0->heap_id);
+
+ return 2;
+}
+
+THUMB_FUNC u32 FUN_02088B28(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 2;
+ }
+
+ if (r0->unk20 == TRUE)
+ {
+ return 0;
+ }
+
+ return 3;
+}
+
+THUMB_FUNC u32 FUN_02088B48()
+{
+ return 4;
+}
+
+THUMB_FUNC u32 FUN_02088B4C(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_75);
+
+ static const u8 UNK_020FD6F4[] = { 0x04, 0xFF };
+ const struct Unk21DBE18 OVERLAY_75_MANAGER = { .unk0 = MOD75_021E6BA0,
+ .unk4 = MOD75_021E6D6C,
+ .unk8 = MOD75_021E6F00,
+ .ovly = FS_OVERLAY_ID(MODULE_75) };
+ struct BagView *bag_view = CreateBagView(r0->unk10->bag, UNK_020FD6F4, r0->heap_id);
+
+ FUN_0206E314(bag_view, r0->unk10->sav2, (u8)((u8)r0->unk06 == 1 ? 5 : 4), r0->unk0C);
+
+ r0->ovly_data = OverlayManager_new(&OVERLAY_75_MANAGER, (s32 *)bag_view, r0->heap_id);
+ r0->ovly_param = bag_view;
+
+ return 1;
+}
+
+THUMB_FUNC u32 FUN_02088BA8(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 1;
+ }
+
+ struct BagView *bag_view = BagView_New((u8)r0->heap_id);
+
+ memcpy(bag_view, r0->ovly_param, BagView_sizeof());
+ FreeToHeap(r0->ovly_param);
+
+ r0->ovly_param = NULL;
+ r0->item = FUN_0206E37C(bag_view);
+
+ FreeToHeap(bag_view);
+
+ switch (FUN_0206E384(bag_view))
+ {
+ case 1:
+ return 2;
+ case 5:
+ return 5;
+ default:
+ GF_AssertFail();
+ r0->item = FIRST_BERRY_IDX;
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ GF_ASSERT(Bag_TakeItem(r0->unk10->bag, (u16)r0->item, 1, r0->heap_id));
+ return 4;
+ }
+}
+
+THUMB_FUNC u32 FUN_02088C3C(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_68);
+
+ struct Bag *bag = r0->unk10->bag;
+ const struct Unk21DBE18 OVERLAY_68_MANAGER = { .unk0 = MOD68_021D74E0,
+ .unk4 = MOD68_021D75D8,
+ .unk8 = MOD68_021D762C,
+ .ovly = FS_OVERLAY_ID(MODULE_68) };
+
+ r0->ovly_param = FUN_020851B8((u8)r0->heap_id);
+
+ FUN_020851DC(r0->ovly_param, (u16)r0->item, TRUE);
+
+ u8 berry_count = 0;
+ for (u8 berry_id = 0; berry_id < (u8)NUM_BERRIES; berry_id++)
+ {
+ u8 item_id = (u8)BerryToItemId(berry_id);
+ if (Bag_HasItem(bag, item_id, 1, r0->heap_id) == TRUE)
+ {
+ FUN_020851DC(r0->ovly_param, item_id, 0);
+
+ berry_count++;
+ }
+ }
+
+ u8 sp5;
+ u8 sp6;
+
+ FUN_0206F17C(r0->unk0C, 4, &sp6, &sp5);
+ FUN_020851F8(r0->ovly_param, sp5, sp6, (u8)(berry_count + 2));
+
+ r0->ovly_data = OverlayManager_new(&OVERLAY_68_MANAGER, (s32 *)r0->ovly_param, r0->heap_id);
+
+ return 3;
+}
+
+THUMB_FUNC u32 FUN_02088CDC(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 3;
+ }
+
+ u8 sp0;
+ u8 sp1;
+
+ FUN_0208524C(r0->ovly_param, &sp0, &sp1);
+ FUN_0206F190(r0->unk0C, 4, sp1, sp0);
+ FreeToHeap(r0->ovly_param);
+
+ r0->ovly_param = NULL;
+
+ return 0;
+}