From 0dab5bbc99ea7cb82e443a9d9d7b639c44616bad Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Mon, 18 Jan 2021 16:05:52 +0100 Subject: [PATCH] manager28.c: ok --- asm/manager28.s | 342 -------------------- asm/non_matching/manager28/sub_0805C94C.inc | 56 ++++ include/entity.h | 12 +- include/functions.h | 1 + include/room.h | 2 + linker.ld | 2 +- src/enemy/bladeTrap.c | 1 - src/entity.c | 6 - src/loadRoom.c | 1 - src/manager/manager28.c | 130 ++++++++ src/manager/managerB.c | 1 - src/manager/managerE.c | 1 - src/object/houseDoorExterior.c | 1 - src/object/lightableSwitch.c | 1 - src/object/lilypadSmall.c | 1 - src/object/object48.c | 2 +- 16 files changed, 201 insertions(+), 359 deletions(-) delete mode 100644 asm/manager28.s create mode 100644 asm/non_matching/manager28/sub_0805C94C.inc create mode 100644 src/manager/manager28.c diff --git a/asm/manager28.s b/asm/manager28.s deleted file mode 100644 index acbf9d14..00000000 --- a/asm/manager28.s +++ /dev/null @@ -1,342 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0805C934 -sub_0805C934: @ 0x0805C934 - push {lr} - ldr r2, _0805C948 @ =gUnk_08108D28 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0805C948: .4byte gUnk_08108D28 - - thumb_func_start sub_0805C94C -sub_0805C94C: @ 0x0805C94C - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _0805C9B0 - adds r6, r4, #0 - adds r6, #0x20 - adds r1, r6, #0 - movs r2, #0 - adds r0, r4, #0 - adds r0, #0x3c -_0805C962: - str r2, [r0] - subs r0, #4 - cmp r0, r1 - bge _0805C962 - adds r0, r4, #0 - bl sub_0805CA6C - adds r5, r0, #0 - cmp r5, #1 - ble _0805C9A8 - bl GetEmptyManager - adds r2, r0, #0 - cmp r2, #0 - beq _0805C9A8 - movs r0, #9 - strb r0, [r2, #8] - movs r0, #0x28 - strb r0, [r2, #9] - movs r0, #1 - strb r0, [r2, #0xa] - strb r5, [r2, #0xe] - adds r1, r2, #0 - adds r1, #0x20 - adds r0, r6, #0 - ldm r0!, {r3, r5, r6} - stm r1!, {r3, r5, r6} - ldm r0!, {r3, r5, r6} - stm r1!, {r3, r5, r6} - ldm r0!, {r3, r5} - stm r1!, {r3, r5} - adds r0, r2, #0 - movs r1, #6 - bl AppendEntityToList -_0805C9A8: - adds r0, r4, #0 - bl DeleteManager - b _0805C9B8 -_0805C9B0: - movs r1, #0 - movs r0, #1 - strb r0, [r4, #0xc] - strb r1, [r4, #0xf] -_0805C9B8: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0805C9BC -sub_0805C9BC: @ 0x0805C9BC - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - sub sp, #4 - adds r6, r0, #0 - bl sub_0805CB48 - ldrb r0, [r6, #0xe] - subs r0, #1 - mov sb, r0 - ldrb r1, [r6, #0xf] - adds r0, r1, #1 - strb r0, [r6, #0xf] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0805CA22 - movs r2, #0 - cmp r2, sb - bge _0805CA62 - movs r0, #0x20 - adds r0, r0, r6 - mov r8, r0 -_0805C9EC: - lsls r1, r2, #2 - adds r0, r6, #0 - adds r0, #0x20 - adds r0, r0, r1 - ldr r3, [r0] - adds r4, r2, #1 - adds r5, r4, #0 - ldrb r1, [r6, #0xe] - cmp r5, r1 - bge _0805CA1A - lsls r0, r5, #2 - mov r1, r8 - adds r7, r0, r1 -_0805CA06: - ldm r7!, {r1} - adds r0, r3, #0 - str r3, [sp] - bl sub_08004484 - adds r4, #1 - ldr r3, [sp] - ldrb r0, [r6, #0xe] - cmp r4, r0 - blt _0805CA06 -_0805CA1A: - adds r2, r5, #0 - cmp r2, sb - blt _0805C9EC - b _0805CA62 -_0805CA22: - movs r2, #0 - cmp r2, sb - bge _0805CA62 - movs r1, #0x20 - adds r1, r1, r6 - mov r8, r1 -_0805CA2E: - lsls r1, r2, #2 - adds r0, r6, #0 - adds r0, #0x20 - adds r0, r0, r1 - ldr r3, [r0] - adds r4, r2, #1 - adds r5, r4, #0 - ldrb r0, [r6, #0xe] - cmp r5, r0 - bge _0805CA5C - lsls r0, r5, #2 - mov r1, r8 - adds r7, r0, r1 -_0805CA48: - ldm r7!, {r0} - adds r1, r3, #0 - str r3, [sp] - bl sub_08004484 - adds r4, #1 - ldr r3, [sp] - ldrb r0, [r6, #0xe] - cmp r4, r0 - blt _0805CA48 -_0805CA5C: - adds r2, r5, #0 - cmp r2, sb - blt _0805CA2E -_0805CA62: - add sp, #4 - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_0805CA6C -sub_0805CA6C: @ 0x0805CA6C - push {r4, r5, r6, lr} - adds r6, r0, #0 - movs r5, #0 - ldrb r0, [r6, #0xb] - bl GetCurrentRoomProperty - adds r4, r0, #0 - cmp r4, #0 - bne _0805CACE - movs r0, #0 - b _0805CAE4 -_0805CA82: - movs r0, #8 - b _0805CAE4 -_0805CA86: - movs r0, #0xf - ands r0, r2 - cmp r0, #3 - bne _0805CACC - adds r0, r4, #0 - bl sub_0805CAF0 - adds r2, r0, #0 - cmp r2, #0 - beq _0805CACC - movs r3, #0 - cmp r3, r5 - bhs _0805CAB8 - ldr r0, [r6, #0x20] - cmp r0, r2 - beq _0805CAB8 - adds r1, r6, #0 - adds r1, #0x20 -_0805CAAA: - adds r1, #4 - adds r3, #1 - cmp r3, r5 - bhs _0805CAB8 - ldr r0, [r1] - cmp r0, r2 - bne _0805CAAA -_0805CAB8: - cmp r3, r5 - bne _0805CACC - lsls r1, r5, #2 - adds r0, r6, #0 - adds r0, #0x20 - adds r0, r0, r1 - str r2, [r0] - adds r5, #1 - cmp r5, #8 - beq _0805CA82 -_0805CACC: - adds r4, #0x10 -_0805CACE: - ldrb r2, [r4] - adds r0, r2, #0 - cmp r0, #0xff - beq _0805CAE2 - ldr r0, [r4] - ldr r1, _0805CAE8 @ =0x00FF000F - ands r0, r1 - ldr r1, _0805CAEC @ =0x00280009 - cmp r0, r1 - bne _0805CA86 -_0805CAE2: - adds r0, r5, #0 -_0805CAE4: - pop {r4, r5, r6, pc} - .align 2, 0 -_0805CAE8: .4byte 0x00FF000F -_0805CAEC: .4byte 0x00280009 - - thumb_func_start sub_0805CAF0 -sub_0805CAF0: @ 0x0805CAF0 - push {r4, r5, r6, lr} - adds r3, r0, #0 - ldrh r1, [r3, #8] - ldr r2, _0805CB34 @ =gRoomControls - ldrh r0, [r2, #6] - adds r5, r1, r0 - ldrh r1, [r3, #0xa] - ldrh r0, [r2, #8] - adds r4, r1, r0 - ldr r1, _0805CB38 @ =gUnk_03003D90 - ldr r2, [r1, #4] - cmp r2, r1 - beq _0805CB42 -_0805CB0A: - movs r6, #0x2e - ldrsh r0, [r2, r6] - cmp r5, r0 - bne _0805CB3C - movs r6, #0x32 - ldrsh r0, [r2, r6] - cmp r4, r0 - bne _0805CB3C - ldrb r0, [r3, #2] - ldrb r6, [r2, #9] - cmp r0, r6 - bne _0805CB3C - ldrb r0, [r2, #8] - cmp r0, #3 - bne _0805CB3C - ldrb r0, [r3, #3] - ldrb r6, [r2, #0xa] - cmp r0, r6 - bne _0805CB3C - adds r0, r2, #0 - b _0805CB44 - .align 2, 0 -_0805CB34: .4byte gRoomControls -_0805CB38: .4byte gUnk_03003D90 -_0805CB3C: - ldr r2, [r2, #4] - cmp r2, r1 - bne _0805CB0A -_0805CB42: - movs r0, #0 -_0805CB44: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0805CB48 -sub_0805CB48: @ 0x0805CB48 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r5, #0 - ldrb r1, [r4, #0xe] - cmp r5, r1 - bge _0805CB84 - adds r3, r4, #0 - adds r3, #0x20 - adds r6, r3, #0 -_0805CB5A: - ldr r0, [r3] - ldr r2, [r0, #4] - cmp r2, #0 - bne _0805CB7A - subs r0, r1, #1 - cmp r0, r5 - bne _0805CB6C - str r2, [r3] - b _0805CB74 -_0805CB6C: - lsls r0, r0, #2 - adds r0, r6, r0 - ldr r0, [r0] - str r0, [r3] -_0805CB74: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] -_0805CB7A: - adds r3, #4 - adds r5, #1 - ldrb r1, [r4, #0xe] - cmp r5, r1 - blt _0805CB5A -_0805CB84: - ldrb r0, [r4, #0xe] - cmp r0, #1 - bhi _0805CB8E - bl DeleteThisEntity -_0805CB8E: - pop {r4, r5, r6, pc} diff --git a/asm/non_matching/manager28/sub_0805C94C.inc b/asm/non_matching/manager28/sub_0805C94C.inc new file mode 100644 index 00000000..2a34a5dd --- /dev/null +++ b/asm/non_matching/manager28/sub_0805C94C.inc @@ -0,0 +1,56 @@ +sub_0805C94C: @ 0x0805C94C + push {r4, r5, r6, lr} + add r4, r0, #0 + ldrb r0, [r4, #0xa] + cmp r0, #0 + bne _0805C9B0 + add r6, r4, #0 + add r6, r6, #0x20 + add r1, r6, #0 + mov r2, #0 + add r0, r4, #0 + add r0, r0, #0x3c +_0805C962: + str r2, [r0] + sub r0, r0, #0x4 + cmp r0, r1 + bge _0805C962 + add r0, r4, #0 + bl sub_0805CA6C + add r5, r0, #0 + cmp r5, #0x1 + ble _0805C9A8 + bl GetEmptyManager + add r2, r0, #0 + cmp r2, #0 + beq _0805C9A8 + mov r0, #0x9 + strb r0, [r2, #0x8] + mov r0, #0x28 + strb r0, [r2, #0x9] + mov r0, #0x1 + strb r0, [r2, #0xa] + strb r5, [r2, #0xe] + add r1, r2, #0 + add r1, r1, #0x20 + add r0, r6, #0 + ldm r0!, {r3, r5, r6} + stm r1!, {r3, r5, r6} + ldm r0!, {r3, r5, r6} + stm r1!, {r3, r5, r6} + ldm r0!, {r3, r5} + stm r1!, {r3, r5} + add r0, r2, #0 + mov r1, #0x6 + bl AppendEntityToList +_0805C9A8: + add r0, r4, #0 + bl DeleteManager + b _0805C9B8 +_0805C9B0: + mov r1, #0 + mov r0, #0x1 + strb r0, [r4, #0xc] + strb r1, [r4, #0xf] +_0805C9B8: + pop {r4, r5, r6, pc} diff --git a/include/entity.h b/include/entity.h index 7972bd96..ad4df8fb 100644 --- a/include/entity.h +++ b/include/entity.h @@ -135,6 +135,16 @@ typedef struct Entity { /*0x86*/ union SplitHWord field_0x86; } Entity; +typedef struct LinkedList { + Entity* last; + Entity* first; +} LinkedList; + +extern LinkedList gEntityLists[9]; +extern LinkedList gUnk_03003D90; + +extern LinkedList gUnk_03003DA0; + #define TILE(x, y) \ ((((x - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \ (((y - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6) @@ -189,6 +199,4 @@ enum { #define Direction8ToAnimationState(expr) (Direction8RoundUp(expr) >> 2) #define Direction8FromAnimationState(expr) (expr << 2) -extern Entity gUnk_03003DA0; - #endif diff --git a/include/functions.h b/include/functions.h index b2f73c87..afef56c4 100644 --- a/include/functions.h +++ b/include/functions.h @@ -321,4 +321,5 @@ extern void sub_08008790(Entity*, u32); extern u32 CheckIsDungeon(); extern void sub_0804ACF8(); extern void sub_08073904(Entity*); +extern void sub_08004484(Entity*, Entity*); #endif diff --git a/include/room.h b/include/room.h index 8b869d69..35ed3137 100644 --- a/include/room.h +++ b/include/room.h @@ -81,4 +81,6 @@ extern RoomVars gRoomVars; extern void SetTileType(u32, u32, u32); extern void sub_08080964(u32 time, u32 magnitude); // shake screen +extern void* GetCurrentRoomProperty(u32); + #endif diff --git a/linker.ld b/linker.ld index 2c9e5126..d3c9a02a 100644 --- a/linker.ld +++ b/linker.ld @@ -510,7 +510,7 @@ SECTIONS { asm/manager25.o(.text); asm/manager26.o(.text); src/manager/manager27.o(.text); - asm/manager28.o(.text); + src/manager/manager28.o(.text); asm/manager29.o(.text); asm/manager2A.o(.text); asm/manager2B.o(.text); diff --git a/src/enemy/bladeTrap.c b/src/enemy/bladeTrap.c index 54dcfcb7..397afc93 100644 --- a/src/enemy/bladeTrap.c +++ b/src/enemy/bladeTrap.c @@ -4,7 +4,6 @@ extern void sub_080A2CC0(); extern void sub_0806F69C(); extern void EnqueueSFX(); -extern Entity* GetCurrentRoomProperty(); void BladeTrap(Entity* ent) { u16 uVar1; diff --git a/src/entity.c b/src/entity.c index 4327bd42..0f0835c6 100644 --- a/src/entity.c +++ b/src/entity.c @@ -132,12 +132,6 @@ void ClearDeletedEntity(Entity* ent) { gEntCount--; } -typedef struct LinkedList { - Entity* last; - Entity* first; -} LinkedList; - -extern LinkedList gEntityLists[9]; extern EntityType gUnk_03003DB8; void DeleteAllEntities(void) { diff --git a/src/loadRoom.c b/src/loadRoom.c index 3e756c15..f0106fc2 100644 --- a/src/loadRoom.c +++ b/src/loadRoom.c @@ -3,7 +3,6 @@ #include "flags.h" void LoadRoomEntityList(EntityData* dat); -extern EntityData* GetCurrentRoomProperty(u32 unk); extern void sub_0804B058(EntityData* dat); extern void LoadRoomTileEntities(EntityData* dat); extern void sub_0801AC98(); diff --git a/src/manager/manager28.c b/src/manager/manager28.c new file mode 100644 index 00000000..44b33b08 --- /dev/null +++ b/src/manager/manager28.c @@ -0,0 +1,130 @@ +#include "global.h" +#include "manager.h" +#include "entity.h" +#include "room.h" +#include "functions.h" + +typedef struct { + Manager manager; + Entity* unk_20[8]; +} Manager28; + +extern void (* const gUnk_08108D28[])(Manager28*); + +void sub_0805C934(Manager28*); +void sub_0805C94C(Manager28*); +void sub_0805C9BC(Manager28*); +u32 sub_0805CA6C(Manager28*); +Entity* sub_0805CAF0(EntityData*); +void sub_0805CB48(Manager28*); + +void sub_0805C934(Manager28* this) { + gUnk_08108D28[this->manager.action](this); +} + +NONMATCH("asm/non_matching/manager28/sub_0805C94C.inc", void sub_0805C94C(Manager28* this)) { + if (!this->manager.unk_0a) { + s32 tmp2; + int tmp4; + for (tmp4 = 0; tmp4 < 8; tmp4++) { + this->unk_20[tmp4] = 0; + } + tmp2 = sub_0805CA6C(this);//maybe 2 params? + if (tmp2 > 1) { + Manager28* tmp3 = (Manager28*) GetEmptyManager(); + if (tmp3) { + tmp3->manager.type = 9; + tmp3->manager.subtype = 0x28; + tmp3->manager.unk_0a = 1; + tmp3->manager.unk_0e = tmp2; + for (tmp4 = 0; tmp4 < 8; tmp4++) { + tmp3->unk_20[tmp4] = this->unk_20[tmp4]; + } + AppendEntityToList(tmp3, 6); + } + } + DeleteManager(&this->manager); + } else { + this->manager.action = 1; + this->manager.unk_0f = 0; + } +} +END_NONMATCH + +void sub_0805C9BC(Manager28* this) { + s32 n; + s32 i; + s32 j; + Entity* tmp; + sub_0805CB48(this); + n = this->manager.unk_0e - 1; + if ((this->manager.unk_0f++) & 1) { + for (i = 0; i < n; i++) { + tmp = this->unk_20[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(tmp, this->unk_20[j]); + } + } + } else { + for (i = 0; i < n; i++) { + tmp = this->unk_20[i]; + for (j = i + 1; j < this->manager.unk_0e; j++) { + sub_08004484(this->unk_20[j], tmp); + } + } + } +} + +u32 sub_0805CA6C(Manager28* this) { + u32 re = 0; + EntityData * tmp = GetCurrentRoomProperty(this->manager.unk_0b); + if (!tmp) return 0; + for (; *((u8*) tmp) != 0xFF && !(tmp->type == 9 && tmp->subtype == 0x28); tmp++) { + Entity* tmp2; + u32 i; + if (tmp->type != 3) continue; + tmp2 = sub_0805CAF0(tmp); + if (!tmp2) continue; + for (i = 0; i < re; i++) { + if (this->unk_20[i] == tmp2) break; + } + if (i != re) continue; + this->unk_20[re++] = tmp2; + if (re == 8) return 8; + } + return re; +} + +Entity* sub_0805CAF0(EntityData* unk1) { + u32 x, y; + Entity* i; + LinkedList* tmp; + x = unk1->xPos + gRoomControls.roomOriginX; + y = unk1->yPos + gRoomControls.roomOriginY; + tmp = &gUnk_03003D90; + for (i = tmp->first; (u32) i != (u32) tmp; i = i->next) { + if (x == i->x.HALF.HI + && y == i->y.HALF.HI + && unk1->subtype == i->entityType.subtype + && 3 == i->entityType.type + && unk1->form == i->entityType.form) { + return i; + } + } + return 0; +} + +void sub_0805CB48(Manager28* this) { + s32 i; + for (i = 0; i < this->manager.unk_0e; i++) { + if (this->unk_20[i]->next == 0) { + if (this->manager.unk_0e-1 == i) { + this->unk_20[i] = this->unk_20[i]->next; + } else { + this->unk_20[i] = this->unk_20[this->manager.unk_0e-1]; + } + this->manager.unk_0e--; + } + } + if (this->manager.unk_0e <= 1) DeleteThisEntity(); +} diff --git a/src/manager/managerB.c b/src/manager/managerB.c index a63fb8a0..d7bbcee1 100644 --- a/src/manager/managerB.c +++ b/src/manager/managerB.c @@ -83,7 +83,6 @@ void ManagerB_WaitForDone(ManagerB* this) { ManagerBHelper* CreateHelper(Manager*); void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32); -extern EntityData* GetCurrentRoomProperty(u8); extern Entity* LoadRoomEntity(EntityData*); void ManagerB_LoadFight(Manager* this) { diff --git a/src/manager/managerE.c b/src/manager/managerE.c index b48c1cc5..e096874f 100644 --- a/src/manager/managerE.c +++ b/src/manager/managerE.c @@ -4,7 +4,6 @@ #include "flags.h" #include "room.h" -extern Entity* GetCurrentRoomProperty(u8); extern void LoadRoomEntityList(Entity*); extern void DeleteThisEntity(void); extern void DeleteManager(Manager*); diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c index c15f94f0..cdee3afe 100644 --- a/src/object/houseDoorExterior.c +++ b/src/object/houseDoorExterior.c @@ -26,7 +26,6 @@ static u8 sub_08086954(Entity*); extern u32 sub_080562CC(u32, u32, u32, u32); extern void sub_08078AC0(u32, u32, u32); -extern void* GetCurrentRoomProperty(u8); extern void (*const gUnk_081206B4[])(Entity*); extern BoundingBox gUnk_081206AC; // TODO: should be const diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c index ecc6449e..472f9fd4 100644 --- a/src/object/lightableSwitch.c +++ b/src/object/lightableSwitch.c @@ -9,7 +9,6 @@ extern void sub_0809EAD8(Entity*); extern void sub_0809EABC(Entity*); extern void EnqueueSFX(u32); extern void sub_080A2CC0(Entity*, Entity**, u16*); -extern Entity* GetCurrentRoomProperty(u32); extern void SetTile(u32, u32, u32); extern void sub_0806F69C(Entity*); diff --git a/src/object/lilypadSmall.c b/src/object/lilypadSmall.c index 32991f65..7dc35ae2 100644 --- a/src/object/lilypadSmall.c +++ b/src/object/lilypadSmall.c @@ -3,7 +3,6 @@ #include "functions.h" #include "player.h" -extern Entity* GetCurrentRoomProperty(u32); extern void sub_080A2CC0(Entity*, Entity**, u16*); extern u16 gUnk_08123318[]; diff --git a/src/object/object48.c b/src/object/object48.c index f340da1c..e62b174a 100644 --- a/src/object/object48.c +++ b/src/object/object48.c @@ -323,7 +323,7 @@ void sub_0808EBB8(Entity* this) { } static Entity* sub_0808EC80(int form) { - Entity* entityA = &gUnk_03003DA0; + Entity* entityA = (Entity*) &gUnk_03003DA0; Entity* entityB = entityA->next; while (entityB != entityA) { if ((entityB->entityType.type == 0x6 && entityB->entityType.subtype == 0x48) &&