From aa6cafcb982a0d77b0982fe94667ba902deee849 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sat, 18 Sep 2021 13:28:17 +0200 Subject: [PATCH] Decompile manager31 --- asm/non_matching/manager31/Manager31_Main.inc | 174 ------------------ include/flags.h | 2 +- src/manager/manager31.c | 96 +++++++++- 3 files changed, 96 insertions(+), 176 deletions(-) delete mode 100644 asm/non_matching/manager31/Manager31_Main.inc diff --git a/asm/non_matching/manager31/Manager31_Main.inc b/asm/non_matching/manager31/Manager31_Main.inc deleted file mode 100644 index 07a9d156..00000000 --- a/asm/non_matching/manager31/Manager31_Main.inc +++ /dev/null @@ -1,174 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r6, r0, #0 - ldrb r0, [r6, #0xc] - cmp r0, #0 - beq _0805D642 - b _0805D768 -_0805D642: - adds r0, #1 - strb r0, [r6, #0xc] - movs r0, #0x42 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x43 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x44 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x3e - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D680 - movs r0, #2 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x3e - bl SetGlobalFlag - b _0805D6D2 -_0805D680: - movs r0, #0x3f - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D69C - movs r0, #3 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x3f - bl SetGlobalFlag - b _0805D6D2 -_0805D69C: - movs r0, #0x40 - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D6B8 - movs r0, #4 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x40 - bl SetGlobalFlag - b _0805D6D2 -_0805D6B8: - movs r0, #0x41 - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D6E4 - movs r0, #5 - bl CheckGlobalFlag - cmp r0, #0 - beq _0805D6E4 - movs r0, #0x41 - bl SetGlobalFlag -_0805D6D2: - movs r0, #0x42 - bl ClearGlobalFlag - movs r0, #0x43 - bl ClearGlobalFlag - movs r0, #0x44 - bl ClearGlobalFlag -_0805D6E4: - adds r1, r6, #0 - adds r1, #0x22 - movs r0, #0 - strb r0, [r1] - subs r1, #1 - strb r0, [r1] - subs r1, #1 - strb r0, [r1] - ldr r4, _0805D79C @ =gUnk_08108D5C - movs r5, #0 - mov sb, r1 - movs r7, #1 - ldr r0, _0805D7A0 @ =gRoomControls - mov r8, r0 -_0805D700: - adds r0, r5, #0 - adds r0, #0x42 - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D760 - bl Random - ldrh r1, [r4, #2] - bl __modsi3 - adds r2, r0, #0 - ldrh r0, [r4] - adds r2, r2, r0 - movs r0, #2 - movs r1, #0x5c - bl CreateObject - adds r2, r0, #0 - cmp r2, #0 - beq _0805D760 - strb r7, [r2, #0xe] - strb r5, [r2, #0xf] - mov r1, r8 - ldrh r0, [r1, #6] - ldrh r1, [r4, #4] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - mov r1, r8 - ldrh r0, [r1, #8] - ldrh r1, [r4, #6] - adds r0, r0, r1 - strh r0, [r2, #0x32] - ldrh r1, [r4, #4] - adds r0, r2, #0 - adds r0, #0x80 - strh r1, [r0] - ldrh r0, [r4, #6] - adds r1, r2, #0 - adds r1, #0x82 - strh r0, [r1] - adds r0, r2, #0 - adds r0, #0x38 - strb r7, [r0] - str r6, [r2, #0x50] - mov r1, sb - adds r0, r1, r5 - strb r7, [r0] -_0805D760: - adds r5, #1 - adds r4, #8 - cmp r5, #2 - ble _0805D700 -_0805D768: - movs r5, #0 -_0805D76A: - adds r4, r5, #0 - adds r4, #0x42 - adds r0, r4, #0 - bl CheckGlobalFlag - cmp r0, #0 - bne _0805D78E - adds r0, r6, #0 - adds r0, #0x20 - adds r0, r0, r5 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bge _0805D78E - adds r0, r4, #0 - bl SetGlobalFlag -_0805D78E: - adds r5, #1 - cmp r5, #2 - ble _0805D76A - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0805D79C: .4byte gUnk_08108D5C -_0805D7A0: .4byte gRoomControls - .syntax divided diff --git a/include/flags.h b/include/flags.h index e6261771..81dbf5f2 100644 --- a/include/flags.h +++ b/include/flags.h @@ -130,6 +130,6 @@ typedef enum { /*0x62*/ MAZE_CLEAR, /* Cleared Castle maze */ /*0x63*/ TINY_ENTRANCE, /* Ezlo described entrances */ /*0x64*/ CASTLE_BGM, /* Castle intro BGM */ -} Flags; +} Flag; #endif diff --git a/src/manager/manager31.c b/src/manager/manager31.c index 1dfa0b75..e1017242 100644 --- a/src/manager/manager31.c +++ b/src/manager/manager31.c @@ -1,4 +1,98 @@ #include "manager.h" +#include "flags.h" +#include "random.h" +#include "object.h" +#include "room.h" -ASM_FUNC("asm/non_matching/manager31/Manager31_Main.inc", void Manager31_Main()) +typedef struct { + Manager manager; + u8 itemActive[3]; +} Manager31; + +typedef struct { + u16 minType; + u16 maxType; + u16 x; + u16 y; +} GoronShopSpawnData; + +extern GoronShopSpawnData gUnk_08108D5C[3]; + +/* +Spawns the shop items for the kinstones for the goron merchant. +*/ +void Manager31_Main(Manager31* this) { + s32 uVar2; + GoronShopSpawnData* spawnData; + s32 count; + + if (this->manager.action == 0) { + this->manager.action += 1; + if (CheckGlobalFlag(GORON_KAKERA_L) != 0 + && CheckGlobalFlag(GORON_KAKERA_M) != 0 + && CheckGlobalFlag(GORON_KAKERA_R) != 0) { + if (CheckGlobalFlag(GORON_KAKERA_LV2) == 0) { + if (CheckGlobalFlag(LV1_CLEAR) != 0) { + SetGlobalFlag(GORON_KAKERA_LV2); + goto clearGlobalFlags; + } + } else { + if (CheckGlobalFlag(GORON_KAKERA_LV3) == 0) { + if (CheckGlobalFlag(LV2_CLEAR) != 0) { + SetGlobalFlag(GORON_KAKERA_LV3); + goto clearGlobalFlags; + } + } else { + if (CheckGlobalFlag(GORON_KAKERA_LV4) == 0) { + if (CheckGlobalFlag(LV3_CLEAR) != 0) { + SetGlobalFlag(GORON_KAKERA_LV4); + goto clearGlobalFlags; + + } + } else { + if (CheckGlobalFlag(GORON_KAKERA_LV5) == 0 + && CheckGlobalFlag(LV4_CLEAR) != 0) { + SetGlobalFlag(GORON_KAKERA_LV5); +clearGlobalFlags: + ClearGlobalFlag(GORON_KAKERA_L); + ClearGlobalFlag(GORON_KAKERA_M); + ClearGlobalFlag(GORON_KAKERA_R); + } + } + } + } + } + this->itemActive[2] = 0; + this->itemActive[1] = 0; + this->itemActive[0] = 0; + spawnData = gUnk_08108D5C; + count = 0; + for (count = 0; count < 3;) { + if (CheckGlobalFlag(GORON_KAKERA_L + count) == 0) { + Entity* object = CreateObject(SHOP_ITEM, 0x5c, ((s32)Random() % spawnData->maxType) + spawnData->minType); + if (object != NULL) { + object->actionDelay = 1; + object->field_0xf = count; + object->x.HALF.HI = spawnData->x + gRoomControls.roomOriginX; + object->y.HALF.HI = spawnData->y + gRoomControls.roomOriginY; + object->field_0x80.HWORD = spawnData->x; + object->field_0x82.HWORD = spawnData->y; + object->collisionLayer = 1; + object->parent = (Entity*)this; + this->itemActive[count] = 1; + } + } + count += 1; + spawnData += 1; + } + } + for (count = 0; count < 3; ++count) { + if (CheckGlobalFlag(GORON_KAKERA_L + count) == 0) { + if ((s8)this->itemActive[count] >= FALSE) { + } else { + SetGlobalFlag(GORON_KAKERA_L + count); + } + } + } +}