diff options
author | Rémi Calixte <remicalixte.rmc@gmail.com> | 2021-06-19 23:18:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-19 23:18:58 +0200 |
commit | 7c6421dca564226cba6639f140b174ae966f58ac (patch) | |
tree | 889c3a3d91bbd376e431a0085c9ee62de10d7e8a /arm9/src | |
parent | 3e8c37cf1fee349756ff7f0fe9b0b693622bfa73 (diff) | |
parent | f87cb8749a8a41f7e207b151c7d5e7d3668a58cf (diff) |
Merge branch 'master' into unk_020023C0
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/unk_020851B8.c | 2 | ||||
-rw-r--r-- | arm9/src/unk_02088AAC.c | 185 |
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; +} |