From b4513a1b4f8d671ce42829cee79a3b01ace1c4e9 Mon Sep 17 00:00:00 2001 From: Behemoth Date: Wed, 5 Aug 2020 17:34:18 +0200 Subject: [PATCH 1/6] add some entity functions --- asm/code_0805E744.s | 154 +------------------------------------------- linker.ld | 3 +- src/entity.c | 130 +++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 154 deletions(-) create mode 100644 src/entity.c diff --git a/asm/code_0805E744.s b/asm/code_0805E744.s index c57c1fd1..ae443c87 100644 --- a/asm/code_0805E744.s +++ b/asm/code_0805E744.s @@ -5,158 +5,6 @@ .text - thumb_func_start sub_0805E744 -sub_0805E744: @ 0x0805E744 - push {lr} - ldr r1, _0805E760 @ =gUnk_030011E8 - movs r0, #0xee - lsls r0, r0, #2 - adds r2, r1, r0 -_0805E74E: - ldr r0, [r1] - cmp r0, #0 - beq _0805E764 - adds r1, #0x88 - cmp r1, r2 - blo _0805E74E - movs r0, #0 - b _0805E766 - .align 2, 0 -_0805E760: .4byte gUnk_030011E8 -_0805E764: - adds r0, r1, #0 -_0805E766: - pop {pc} - - thumb_func_start sub_0805E768 -sub_0805E768: @ 0x0805E768 - push {lr} - ldr r1, _0805E778 @ =GetEmptyEntity - cmp r0, #9 - bne _0805E772 - ldr r1, _0805E77C @ =sub_0805E8D4 -_0805E772: - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0805E778: .4byte GetEmptyEntity -_0805E77C: .4byte sub_0805E8D4 - - thumb_func_start DeleteThisEntity -DeleteThisEntity: @ 0x0805E780 - push {lr} - ldr r0, _0805E794 @ =gUnk_03003DD0 - ldr r0, [r0, #8] - bl sub_0805E79C - ldr r0, _0805E798 @ =gUnk_03005F24 - bl _call_via_r0 - pop {pc} - .align 2, 0 -_0805E794: .4byte gUnk_03003DD0 -_0805E798: .4byte gUnk_03005F24 - - thumb_func_start sub_0805E79C -sub_0805E79C: @ 0x0805E79C - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #8] - ldr r2, _0805E7B4 @ =DeleteEntity - cmp r0, #9 - bne _0805E7AA - ldr r2, _0805E7B8 @ =sub_0805E900 -_0805E7AA: - adds r0, r1, #0 - bl _call_via_r2 - pop {pc} - .align 2, 0 -_0805E7B4: .4byte DeleteEntity -_0805E7B8: .4byte sub_0805E900 - - thumb_func_start DeleteEntity -DeleteEntity: @ 0x0805E7BC - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - cmp r0, #0 - beq _0805E84A - adds r0, r4, #0 - bl sub_080AE068 - adds r0, r4, #0 - bl sub_0801D230 - adds r0, r4, #0 - bl sub_0806FE84 - adds r0, r4, #0 - bl sub_080788E0 - adds r0, r4, #0 - bl sub_08078954 - adds r0, r4, #0 - bl sub_0805EC60 - adds r0, r4, #0 - bl sub_08017744 - adds r0, r4, #0 - bl sub_0805E92C - adds r0, r4, #0 - bl sub_0807DB08 - adds r0, r4, #0 - bl sub_0806FBEC - ldr r0, [r4, #0x64] - bl sub_0801DA0C - movs r5, #0 - str r5, [r4, #0x64] - ldrb r0, [r4, #8] - cmp r0, #3 - bne _0805E818 - adds r0, r4, #0 - bl sub_0804AA1C -_0805E818: - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x3c - strb r5, [r0] - adds r0, #5 - strb r5, [r0] - adds r0, #1 - strb r5, [r0] - adds r0, #3 - strb r5, [r0] - adds r0, r4, #0 - bl sub_0805EA98 - str r5, [r4, #4] - movs r0, #1 - rsbs r0, r0, #0 - str r0, [r4] -_0805E84A: - pop {r4, r5, pc} - - thumb_func_start sub_0805E84C -sub_0805E84C: @ 0x0805E84C - push {r4, r5, lr} - ldr r4, _0805E86C @ =gLinkEntity - movs r0, #0xaa - lsls r0, r0, #6 - adds r5, r4, r0 -_0805E856: - ldr r0, [r4] - cmp r0, #0 - bge _0805E862 - adds r0, r4, #0 - bl sub_0805E870 -_0805E862: - adds r4, #0x88 - cmp r4, r5 - blo _0805E856 - pop {r4, r5, pc} - .align 2, 0 -_0805E86C: .4byte gLinkEntity - thumb_func_start sub_0805E870 sub_0805E870: @ 0x0805E870 sub sp, #4 @@ -2934,4 +2782,4 @@ _0805FD1C: bl DeleteThisEntity _0805FD20: pop {r4, r5, pc} - .align 2, 0 + .align 2, 0 \ No newline at end of file diff --git a/linker.ld b/linker.ld index 8720510b..6758bc9c 100644 --- a/linker.ld +++ b/linker.ld @@ -530,7 +530,8 @@ SECTIONS { src/sub_0805E3A0.o(.text); asm/code_0805E3B0.o(.text); asm/getEmptyEntity.o(.text); - asm/code_0805E744.o(.text); + src/entity.o(.text); + asm/code_0805E84C.o(.text); /* npcs */ src/npc/gentari.o(.text); src/npc/festari.o(.text); diff --git a/src/entity.c b/src/entity.c new file mode 100644 index 00000000..6030b7ac --- /dev/null +++ b/src/entity.c @@ -0,0 +1,130 @@ +#include "global.h" +#include "entity.h" + +extern Entity gUnk_030011E8[7]; + +Entity* sub_0805E744(void) + +{ + Entity* pEVar1 = gUnk_030011E8; + int i = 0; + + do { + if (pEVar1->field_0x0 == NULL) { + return pEVar1; + } + pEVar1 = pEVar1 + 1; + } while (pEVar1 < &gUnk_030011E8[7]); + return NULL; +} + +extern Entity* GetEmptyEntity(); +extern Entity* sub_0805E8D4(); + +Entity* sub_0805E768(int type) + +{ + Entity* (*getter)(void) = NULL; + if (type == 9) { + getter = sub_0805E8D4; + } else { + getter = GetEmptyEntity; + } + return getter(); +} +typedef struct { + int field_0x0; + int field_0x4; + Entity* field_0x8; + int field_0xc; +} struct_03003DD0; + +extern struct_03003DD0 gUnk_03003DD0; +extern u32 _call_via_r0(u32*); +extern void gUnk_03005F24(); +extern void sub_0805E79C(Entity*); + +void DeleteThisEntity(void) + +{ + sub_0805E79C(gUnk_03003DD0.field_0x8); + _call_via_r0((u32*)&gUnk_03005F24); + return; +} + +extern void DeleteEntity(Entity*); +extern void sub_0805E900(Entity*); + +void sub_0805E79C(Entity* ent) + +{ + void (*deleter)(Entity*) = NULL; + if (ent->entityType.type == 9) { + deleter = sub_0805E900; + } else { + deleter = DeleteEntity; + } + deleter(ent); +} + +extern void sub_080AE068(); +extern void sub_0801D230(); +extern void sub_0806FE84(); +extern void sub_080788E0(); +extern void sub_08078954(); +extern void sub_0805EC60(); +extern void sub_08017744(); +extern void sub_0805E92C(); +extern void sub_0807DB08(); +extern void sub_0806FBEC(); +extern void sub_0801DA0C(); +extern void sub_0804AA1C(); +extern void sub_0805EA98(); // Unlink + +void DeleteEntity(Entity* ent) + +{ + if (ent->field_0x4) { + sub_080AE068(ent); + sub_0801D230(ent); + sub_0806FE84(ent); + sub_080788E0(ent); + sub_08078954(ent); + sub_0805EC60(ent); + sub_08017744(ent); + sub_0805E92C(ent); + sub_0807DB08(ent); + sub_0806FBEC(ent); + sub_0801DA0C(ent->otherEntity); + ent->otherEntity = NULL; + if ((ent->entityType).type == '\x03') { + sub_0804AA1C(ent); + } + ent->flags = ent->flags & 0x7f; + ent->spriteSettings = ent->spriteSettings; + ent->spriteSettings.b.draw = 0; + ent->field_0x3c = 0; + ent->bitfield = 0; + ent->field_0x42 = 0; + ent->currentHealth = 0; + sub_0805EA98(ent); + ent->field_0x4 = NULL; + ent->field_0x0 = (u32*)0xffffffff; + } +} + +extern Entity gLinkEntity; +void sub_0805E870(Entity*); + +void sub_0805E84C(void) + +{ + Entity* pEVar1 = &gLinkEntity; + do { + if ((int)pEVar1->field_0x0 < 0) { + sub_0805E870(pEVar1); + } + pEVar1 = pEVar1 + 1; + } while (pEVar1 < (&gLinkEntity + 80)); + return; +} From 6250d7ce7218ed94cad33e52ab9f85ab52fa757e Mon Sep 17 00:00:00 2001 From: Behemoth Date: Thu, 6 Aug 2020 21:00:49 +0200 Subject: [PATCH 2/6] more entity stuff --- asm/code_0805E744.s | 530 -------------------------------------------- include/area.h | 4 + include/entity.h | 2 +- linker.ld | 2 +- src/entity.c | 339 +++++++++++++++++++++++++++- 5 files changed, 333 insertions(+), 544 deletions(-) diff --git a/asm/code_0805E744.s b/asm/code_0805E744.s index a4ec55ca..d1fca8c7 100644 --- a/asm/code_0805E744.s +++ b/asm/code_0805E744.s @@ -5,536 +5,6 @@ .text - thumb_func_start sub_0805E870 -sub_0805E870: @ 0x0805E870 - sub sp, #4 - movs r1, #0 - str r1, [sp] - ldr r1, _0805E890 @ =0x040000D4 - mov r2, sp - str r2, [r1] - str r0, [r1, #4] - ldr r0, _0805E894 @ =0x85000022 - str r0, [r1, #8] - ldr r0, [r1, #8] - ldr r1, _0805E898 @ =gUnk_03003DBC - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - add sp, #4 - bx lr - .align 2, 0 -_0805E890: .4byte 0x040000D4 -_0805E894: .4byte 0x85000022 -_0805E898: .4byte gUnk_03003DBC - - thumb_func_start sub_0805E89C -sub_0805E89C: @ 0x0805E89C - push {r4, r5, r6, lr} - ldr r5, _0805E8CC @ =gUnk_03003D70 - ldr r0, [r5, #4] - cmp r0, #0 - beq _0805E8C8 -_0805E8A6: - ldr r0, [r5, #4] - adds r6, r5, #0 - adds r6, #8 - cmp r0, r5 - beq _0805E8BC -_0805E8B0: - ldr r4, [r0, #4] - bl sub_0805E79C - adds r0, r4, #0 - cmp r0, r5 - bne _0805E8B0 -_0805E8BC: - adds r5, r6, #0 - ldr r0, _0805E8D0 @ =gUnk_03003DB8 - cmp r5, r0 - blo _0805E8A6 - bl sub_0805E84C -_0805E8C8: - pop {r4, r5, r6, pc} - .align 2, 0 -_0805E8CC: .4byte gUnk_03003D70 -_0805E8D0: .4byte gUnk_03003DB8 - - thumb_func_start sub_0805E8D4 -sub_0805E8D4: @ 0x0805E8D4 - push {lr} - ldr r1, _0805E8F0 @ =gUnk_02033290 - movs r2, #0x80 - lsls r2, r2, #4 - adds r0, r1, r2 - cmp r1, r0 - bhs _0805E8FA - adds r2, r0, #0 -_0805E8E4: - ldr r0, [r1] - cmp r0, #0 - bne _0805E8F4 - adds r0, r1, #0 - b _0805E8FC - .align 2, 0 -_0805E8F0: .4byte gUnk_02033290 -_0805E8F4: - adds r1, #0x40 - cmp r1, r2 - blo _0805E8E4 -_0805E8FA: - movs r0, #0 -_0805E8FC: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0805E900 -sub_0805E900: @ 0x0805E900 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #4] - cmp r0, #0 - beq _0805E926 - adds r0, r4, #0 - bl sub_0805E92C - adds r0, r4, #0 - bl sub_0805EA98 - adds r0, r4, #0 - movs r1, #0x40 - bl _DmaZero - ldr r1, _0805E928 @ =gUnk_020354B4 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] -_0805E926: - pop {r4, pc} - .align 2, 0 -_0805E928: .4byte gUnk_020354B4 - - thumb_func_start sub_0805E92C -sub_0805E92C: @ 0x0805E92C - push {lr} - ldr r2, _0805E94C @ =gArea - ldr r1, _0805E950 @ =0x00000888 - adds r3, r2, r1 - ldr r1, [r3] - cmp r0, r1 - bne _0805E94A - movs r0, #0 - str r0, [r3] - ldr r3, _0805E954 @ =0x0000088C - adds r1, r2, r3 - str r0, [r1] - adds r3, #4 - adds r1, r2, r3 - str r0, [r1] -_0805E94A: - pop {pc} - .align 2, 0 -_0805E94C: .4byte gArea -_0805E950: .4byte 0x00000888 -_0805E954: .4byte 0x0000088C - - thumb_func_start sub_0805E958 -sub_0805E958: @ 0x0805E958 - push {lr} - ldr r0, _0805E96C @ =gUnk_03003D70 - ldr r1, _0805E970 @ =gUnk_020369F0 - movs r2, #0x48 - bl sub_0801D66C - bl sub_0805E98C - pop {pc} - .align 2, 0 -_0805E96C: .4byte gUnk_03003D70 -_0805E970: .4byte gUnk_020369F0 - - thumb_func_start sub_0805E974 -sub_0805E974: @ 0x0805E974 - push {lr} - ldr r0, _0805E984 @ =gUnk_020369F0 - ldr r1, _0805E988 @ =gUnk_03003D70 - movs r2, #0x48 - bl sub_0801D66C - pop {pc} - .align 2, 0 -_0805E984: .4byte gUnk_020369F0 -_0805E988: .4byte gUnk_03003D70 - - thumb_func_start sub_0805E98C -sub_0805E98C: @ 0x0805E98C - push {lr} - ldr r0, _0805E9A4 @ =gUnk_03003D70 - adds r1, r0, #0 - adds r1, #0x48 - cmp r0, r1 - bhs _0805E9A2 -_0805E998: - str r0, [r0] - str r0, [r0, #4] - adds r0, #8 - cmp r0, r1 - blo _0805E998 -_0805E9A2: - pop {pc} - .align 2, 0 -_0805E9A4: .4byte gUnk_03003D70 - - thumb_func_start sub_0805E9A8 -sub_0805E9A8: @ 0x0805E9A8 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - ldr r3, _0805E9F0 @ =gUnk_03003D70 - movs r7, #0x10 - movs r0, #0x48 - adds r0, r0, r3 - mov r8, r0 -_0805E9B8: - ldr r2, [r3, #4] - adds r4, r3, #0 - adds r4, #8 - cmp r2, r3 - beq _0805E9E2 - movs r6, #0xfd - movs r5, #0x20 -_0805E9C6: - ldrb r0, [r2, #0x10] - adds r1, r6, #0 - ands r1, r0 - strb r1, [r2, #0x10] - adds r0, r1, #0 - ands r0, r5 - cmp r0, #0 - bne _0805E9DC - adds r0, r1, #0 - orrs r0, r7 - strb r0, [r2, #0x10] -_0805E9DC: - ldr r2, [r2, #4] - cmp r2, r3 - bne _0805E9C6 -_0805E9E2: - adds r3, r4, #0 - cmp r3, r8 - blo _0805E9B8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0805E9F0: .4byte gUnk_03003D70 - - thumb_func_start sub_0805E9F4 -sub_0805E9F4: @ 0x0805E9F4 - push {r4, r5, r6, lr} - ldr r5, _0805EA24 @ =gUnk_03003D70 -_0805E9F8: - ldr r2, [r5, #4] - adds r6, r5, #0 - adds r6, #8 - cmp r2, r5 - beq _0805EA1A -_0805EA02: - ldr r4, [r2, #4] - ldrb r1, [r2, #0x10] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - beq _0805EA14 - adds r0, r2, #0 - bl sub_0805E79C -_0805EA14: - adds r2, r4, #0 - cmp r2, r5 - bne _0805EA02 -_0805EA1A: - adds r5, r6, #0 - ldr r0, _0805EA28 @ =gUnk_03003DB8 - cmp r5, r0 - blo _0805E9F8 - pop {r4, r5, r6, pc} - .align 2, 0 -_0805EA24: .4byte gUnk_03003D70 -_0805EA28: .4byte gUnk_03003DB8 - - thumb_func_start sub_0805EA2C -sub_0805EA2C: @ 0x0805EA2C - push {lr} - adds r2, r0, #0 - lsls r1, r1, #3 - ldr r0, _0805EA5C @ =gUnk_03003D70 - adds r1, r1, r0 - str r1, [r2, #4] - ldr r0, [r1] - str r0, [r2] - str r2, [r0, #4] - str r2, [r1] - ldrb r0, [r2, #8] - cmp r0, #9 - beq _0805EA64 - adds r3, r2, #0 - adds r3, #0x29 - ldrb r1, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r3] - ldr r1, _0805EA60 @ =gUnk_03003DBC - b _0805EA66 - .align 2, 0 -_0805EA5C: .4byte gUnk_03003D70 -_0805EA60: .4byte gUnk_03003DBC -_0805EA64: - ldr r1, _0805EA74 @ =gUnk_020354B4 -_0805EA66: - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - adds r0, r2, #0 - bl sub_0805E374 - pop {pc} - .align 2, 0 -_0805EA74: .4byte gUnk_020354B4 - - thumb_func_start sub_0805EA78 -sub_0805EA78: @ 0x0805EA78 - push {r4, r5, lr} - adds r5, r0, #0 - adds r4, r1, #0 - bl sub_0805EA98 - lsls r4, r4, #3 - ldr r0, _0805EA94 @ =gUnk_03003D70 - adds r4, r4, r0 - str r4, [r5] - ldr r0, [r4, #4] - str r0, [r5, #4] - str r5, [r0] - str r5, [r4, #4] - pop {r4, r5, pc} - .align 2, 0 -_0805EA94: .4byte gUnk_03003D70 - - thumb_func_start sub_0805EA98 -sub_0805EA98: @ 0x0805EA98 - push {lr} - adds r2, r0, #0 - ldr r1, _0805EAB8 @ =gUnk_03003DD0 - ldr r0, [r1, #8] - cmp r2, r0 - bne _0805EAA8 - ldr r0, [r2] - str r0, [r1, #8] -_0805EAA8: - ldr r1, [r2] - ldr r0, [r2, #4] - str r0, [r1, #4] - ldr r1, [r2, #4] - ldr r0, [r2] - str r0, [r1] - pop {pc} - .align 2, 0 -_0805EAB8: .4byte gUnk_03003DD0 - - thumb_func_start sub_0805EABC -sub_0805EABC: @ 0x0805EABC - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - ldr r4, _0805EAE8 @ =gUnk_03003D70 - adds r7, r4, #0 - adds r7, #0x48 -_0805EAC6: - ldr r3, [r4, #4] - cmp r3, r4 - beq _0805EAF6 - ldr r5, _0805EAEC @ =0x0000FFFF -_0805EACE: - cmp r3, r6 - beq _0805EAF0 - ldrh r0, [r3, #8] - ldrh r2, [r6, #8] - adds r1, r5, #0 - ands r1, r0 - adds r0, r5, #0 - ands r0, r2 - cmp r1, r0 - bne _0805EAF0 - movs r0, #1 - b _0805EAFE - .align 2, 0 -_0805EAE8: .4byte gUnk_03003D70 -_0805EAEC: .4byte 0x0000FFFF -_0805EAF0: - ldr r3, [r3, #4] - cmp r3, r4 - bne _0805EACE -_0805EAF6: - adds r4, #8 - cmp r4, r7 - blo _0805EAC6 - movs r0, #0 -_0805EAFE: - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_0805EB00 -sub_0805EB00: @ 0x0805EB00 - push {r4, lr} - adds r3, r0, #0 - lsls r2, r2, #3 - ldr r0, _0805EB28 @ =gUnk_03003D70 - adds r2, r2, r0 - ldr r0, [r2, #4] - cmp r0, r2 - beq _0805EB22 -_0805EB10: - ldrb r4, [r0, #8] - cmp r3, r4 - bne _0805EB1C - ldrb r4, [r0, #9] - cmp r1, r4 - beq _0805EB24 -_0805EB1C: - ldr r0, [r0, #4] - cmp r0, r2 - bne _0805EB10 -_0805EB22: - movs r0, #0 -_0805EB24: - pop {r4, pc} - .align 2, 0 -_0805EB28: .4byte gUnk_03003D70 - - thumb_func_start sub_0805EB2C -sub_0805EB2C: @ 0x0805EB2C - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r5, [sp, #0x10] - lsls r2, r2, #3 - ldr r0, _0805EB60 @ =gUnk_03003D70 - adds r2, r2, r0 - ldr r0, [r2, #4] - cmp r0, r2 - beq _0805EB5C -_0805EB3E: - ldrb r6, [r0, #8] - cmp r4, r6 - bne _0805EB56 - ldrb r6, [r0, #9] - cmp r1, r6 - bne _0805EB56 - ldrb r6, [r0, #0xa] - cmp r3, r6 - bne _0805EB56 - ldrb r6, [r0, #0xb] - cmp r5, r6 - beq _0805EB5E -_0805EB56: - ldr r0, [r0, #4] - cmp r0, r2 - bne _0805EB3E -_0805EB5C: - movs r0, #0 -_0805EB5E: - pop {r4, r5, r6, pc} - .align 2, 0 -_0805EB60: .4byte gUnk_03003D70 - - thumb_func_start sub_0805EB64 -sub_0805EB64: @ 0x0805EB64 - push {r4, r5, lr} - adds r4, r0, #0 - lsls r1, r1, #3 - ldr r0, _0805EB88 @ =gUnk_03003D70 - adds r3, r1, r0 - ldr r2, [r4, #4] - cmp r2, r3 - beq _0805EB96 - ldr r5, _0805EB8C @ =0x0000FFFF - ldrh r4, [r4, #8] -_0805EB78: - ldrh r1, [r2, #8] - adds r0, r5, #0 - ands r0, r1 - cmp r0, r4 - bne _0805EB90 - adds r0, r2, #0 - b _0805EB98 - .align 2, 0 -_0805EB88: .4byte gUnk_03003D70 -_0805EB8C: .4byte 0x0000FFFF -_0805EB90: - ldr r2, [r2, #4] - cmp r2, r3 - bne _0805EB78 -_0805EB96: - movs r0, #0 -_0805EB98: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0805EB9C -sub_0805EB9C: @ 0x0805EB9C - push {r4, r5, lr} - adds r3, r0, #0 - ldr r2, _0805EBC8 @ =gUnk_03003D70 - adds r4, r2, #0 - adds r4, #0x48 -_0805EBA6: - ldr r0, [r2, #4] - cmp r0, r2 - beq _0805EBBE -_0805EBAC: - ldrb r5, [r0, #8] - cmp r3, r5 - bne _0805EBB8 - ldrb r5, [r0, #9] - cmp r1, r5 - beq _0805EBC6 -_0805EBB8: - ldr r0, [r0, #4] - cmp r0, r2 - bne _0805EBAC -_0805EBBE: - adds r2, #8 - cmp r2, r4 - blo _0805EBA6 - movs r0, #0 -_0805EBC6: - pop {r4, r5, pc} - .align 2, 0 -_0805EBC8: .4byte gUnk_03003D70 - - thumb_func_start sub_0805EBCC -sub_0805EBCC: @ 0x0805EBCC - push {r4, r5, r6, lr} - ldr r5, _0805EBFC @ =gUnk_03003D70 -_0805EBD0: - ldr r1, [r5, #4] - adds r6, r5, #0 - adds r6, #8 - cmp r1, r5 - beq _0805EBEE -_0805EBDA: - ldr r4, [r1, #4] - ldrb r0, [r1, #8] - cmp r0, #3 - bne _0805EBE8 - adds r0, r1, #0 - bl DeleteEntity -_0805EBE8: - adds r1, r4, #0 - cmp r1, r5 - bne _0805EBDA -_0805EBEE: - adds r5, r6, #0 - ldr r0, _0805EC00 @ =gUnk_03003DB8 - cmp r5, r0 - blo _0805EBD0 - bl sub_0805E84C - pop {r4, r5, r6, pc} - .align 2, 0 -_0805EBFC: .4byte gUnk_03003D70 -_0805EC00: .4byte gUnk_03003DB8 - thumb_func_start sub_0805EC04 sub_0805EC04: @ 0x0805EC04 push {r4, r5, r6, r7, lr} diff --git a/include/area.h b/include/area.h index ce0b325c..e705944d 100644 --- a/include/area.h +++ b/include/area.h @@ -17,6 +17,10 @@ typedef struct { u8 filler4[0x835]; u32 musicIndex; u32 pMusicIndex; + u8 filler5[0x20]; + u32 unk2; + u32 unk3; + u32 unk4; } Area; extern Area gArea; diff --git a/include/entity.h b/include/entity.h index e717c9e1..0b76eaa5 100644 --- a/include/entity.h +++ b/include/entity.h @@ -26,7 +26,7 @@ typedef struct { } BoundingBox; typedef struct Entity { - /*0x00*/ u32* field_0x0; + /*0x00*/ struct Entity* field_0x0; /*0x04*/ struct Entity* field_0x4; /*0x08*/ EntityType entityType; /*0x0c*/ u8 action; diff --git a/linker.ld b/linker.ld index eb042eea..820bdbf1 100644 --- a/linker.ld +++ b/linker.ld @@ -531,7 +531,7 @@ SECTIONS { asm/code_0805E3B0.o(.text); asm/getEmptyEntity.o(.text); src/entity.o(.text); - asm/code_0805E84C.o(.text); + asm/code_0805E744.o(.text); /* npcs */ src/npc/gentari.o(.text); src/npc/festari.o(.text); diff --git a/src/entity.c b/src/entity.c index 6030b7ac..d1e87ff8 100644 --- a/src/entity.c +++ b/src/entity.c @@ -1,6 +1,13 @@ #include "global.h" #include "entity.h" +typedef struct OtherEntity { + struct OtherEntity* prev; + struct OtherEntity* next; + Entity* field_0x8; + u8 field_0xC[0x34]; +} OtherEntity; + extern Entity gUnk_030011E8[7]; Entity* sub_0805E744(void) @@ -19,16 +26,18 @@ Entity* sub_0805E744(void) } extern Entity* GetEmptyEntity(); -extern Entity* sub_0805E8D4(); +OtherEntity* sub_0805E8D4(); -Entity* sub_0805E768(int type) +typedef void* (*Getter)(void); + +void* sub_0805E768(int type) { - Entity* (*getter)(void) = NULL; + Getter getter = NULL; if (type == 9) { - getter = sub_0805E8D4; + getter = (Getter)sub_0805E8D4; } else { - getter = GetEmptyEntity; + getter = (Getter)GetEmptyEntity; } return getter(); } @@ -41,7 +50,7 @@ typedef struct { extern struct_03003DD0 gUnk_03003DD0; extern u32 _call_via_r0(u32*); -extern void gUnk_03005F24(); +extern u32 gUnk_03005F24; extern void sub_0805E79C(Entity*); void DeleteThisEntity(void) @@ -52,17 +61,19 @@ void DeleteThisEntity(void) return; } -extern void DeleteEntity(Entity*); -extern void sub_0805E900(Entity*); +void DeleteEntity(Entity*); +void sub_0805E900(OtherEntity*); + +typedef void (*Deleter)(void*); void sub_0805E79C(Entity* ent) { - void (*deleter)(Entity*) = NULL; + Deleter deleter = NULL; if (ent->entityType.type == 9) { - deleter = sub_0805E900; + deleter = (Deleter)sub_0805E900; } else { - deleter = DeleteEntity; + deleter = (Deleter)DeleteEntity; } deleter(ent); } @@ -109,7 +120,7 @@ void DeleteEntity(Entity* ent) ent->currentHealth = 0; sub_0805EA98(ent); ent->field_0x4 = NULL; - ent->field_0x0 = (u32*)0xffffffff; + ent->field_0x0 = (Entity*)0xffffffff; } } @@ -128,3 +139,307 @@ void sub_0805E84C(void) } while (pEVar1 < (&gLinkEntity + 80)); return; } + +extern u8 gUnk_03003DBC; + +void sub_0805E870(Entity* ent) + +{ + DmaClear32(3, ent, sizeof(Entity)); + gUnk_03003DBC--; +} + +typedef struct struct_03003D70 { + void* field_0x0; + void* field_0x4; +} struct_03003D70; + +extern struct_03003D70 gUnk_03003D70[9]; +extern EntityType gUnk_03003DB8; + +void sub_0805E89C(void) + +{ + Entity* pEVar1; + Entity* next; + struct_03003D70* it; + + it = gUnk_03003D70; + if (it->field_0x4 != 0) { + do { + next = it->field_0x4; + while (pEVar1 = next, (u32)pEVar1 != (u32)it) { + next = pEVar1->field_0x4; + sub_0805E79C(pEVar1); + } + it++; + } while (it < (gUnk_03003D70 + 9)); + sub_0805E84C(); + } +} + +extern OtherEntity gUnk_02033290; + +OtherEntity* sub_0805E8D4(void) + +{ + OtherEntity* it; + for (it = &gUnk_02033290; it < (&gUnk_02033290 + 32); it++) { + if (it->prev == 0) { + return it; + } + } + return NULL; +} + +extern void _DmaZero(void*, u32); +extern u8 gUnk_020354B4; + +void sub_0805E900(OtherEntity* ent) + +{ + if (!ent->next) + return; + + sub_0805E92C(ent); + sub_0805EA98(ent); + _DmaZero(ent, 0x40); + gUnk_020354B4--; +} + +#include "area.h" + +void sub_0805E92C(u32 param_1) + +{ + if (param_1 == gArea.unk2) { + gArea.unk2 = 0; + gArea.unk3 = 0; + gArea.unk4 = 0; + } +} + +extern Entity gUnk_020369F0; +extern void sub_0801D66C(void* dst, void* src, size_t size); // dma copy +extern void sub_0805E98C(void); + +void sub_0805E958(void) + +{ + sub_0801D66C(&gUnk_03003D70, &gUnk_020369F0, 0x48); + sub_0805E98C(); +} + +void sub_0805E974(void) + +{ + sub_0801D66C(&gUnk_020369F0, &gUnk_03003D70, 0x48); +} + +void sub_0805E98C(void) + +{ + struct_03003D70* it; + + for (it = gUnk_03003D70; it < &gUnk_03003D70[9]; it++) { + it->field_0x0 = it; + it->field_0x4 = (Entity*)it; + } +} + +void sub_0805E9A8(void) + +{ + Entity* entry; + struct_03003D70* it; + + it = gUnk_03003D70; + do { + for (entry = (Entity*)it->field_0x4; (u32)entry != (u32)it; entry = entry->field_0x4) { + entry->flags &= 0xfd; + if ((entry->flags & 0x20) == 0) { + entry->flags |= 0x10; + } + } + it++; + } while (it < (gUnk_03003D70 + 9)); +} + +void sub_0805E9F4(void) + +{ + Entity* pEVar1; + Entity* next; + struct_03003D70* it; + + it = gUnk_03003D70; + do { + next = it->field_0x4; + while (pEVar1 = next, (u32)pEVar1 != (u32)it) { + next = pEVar1->field_0x4; + if ((pEVar1->flags & 0x10) != 0) { + sub_0805E79C(pEVar1); + } + } + it++; + } while (it < (gUnk_03003D70 + 9)); +} + +extern void sub_0805E374(Entity*); + +void sub_0805EA2C(Entity* ent, int kind) + +{ + Entity* pEVar1; + struct_03003D70* pEVar2; + + pEVar2 = (gUnk_03003D70 + kind); + ent->field_0x4 = (Entity*)pEVar2; + pEVar1 = pEVar2->field_0x0; + ent->field_0x0 = pEVar1; + pEVar1->field_0x4 = ent; + pEVar2->field_0x0 = ent; + if ((ent->entityType).type != 9) { + ent->spritePriority.b0 = 4; + gUnk_03003DBC++; + } else { + gUnk_020354B4++; + } + sub_0805E374(ent); +} + +void sub_0805EA78(Entity* ent, int kind) + +{ + struct_03003D70* it; + + sub_0805EA98(ent); + it = &gUnk_03003D70[kind]; + ent->field_0x0 = (Entity*)it; + ent->field_0x4 = it->field_0x4; + ((Entity*)it->field_0x4)->field_0x0 = ent; + it->field_0x4 = ent; +} + +void sub_0805EA98(Entity* ent) + +{ + if (ent == gUnk_03003DD0.field_0x8) { + gUnk_03003DD0.field_0x8 = ent->field_0x0; + } + ent->field_0x0->field_0x4 = ent->field_0x4; + ent->field_0x4->field_0x0 = ent->field_0x0; +} + +int sub_0805EABC(Entity* ent) + +{ + Entity* psVar1; + struct_03003D70 *it, *end; + + it = gUnk_03003D70; + end = (gUnk_03003D70 + 9); + do { + psVar1 = (Entity*)it->field_0x4; + while ((u32)psVar1 != (u32)it) { + if ((u32)psVar1 != (u32)ent && psVar1->entityType.type == ent->entityType.type && + psVar1->entityType.subtype == ent->entityType.subtype) { + return 1; + } + psVar1 = psVar1->field_0x4; + } + it++; + } while (it < end); + + return 0; +} + +Entity* sub_0805EB00(int type, int subtype, int kind) + +{ + Entity* it; + struct_03003D70* node; + + node = &gUnk_03003D70[kind]; + it = (Entity*)node->field_0x4; + while ((u32)it != (u32)node) { + if ((type == (it->entityType).type) && (subtype == (it->entityType).subtype)) + return it; + it = it->field_0x4; + } + return NULL; +} + +Entity* sub_0805EB2C(int type, int subtype, int kind, int form, int parameter) + +{ + Entity* it; + struct_03003D70* node; + + node = &gUnk_03003D70[kind]; + it = (Entity*)node->field_0x4; + while ((u32)it != (u32)node) { + if (type == it->entityType.type && subtype == it->entityType.subtype && form == it->entityType.form && + parameter == it->entityType.parameter) + return it; + it = it->field_0x4; + } + return NULL; +} + +Entity* sub_0805EB64(Entity* ent, int kind) + +{ + Entity* it; + struct_03003D70* end; + + end = &gUnk_03003D70[kind]; + it = ent->field_0x4; + while ((u32)it != (u32)end) { + if (it->entityType.type == ent->entityType.type && it->entityType.subtype == ent->entityType.subtype) + return it; + it = it->field_0x4; + } + return NULL; +} + +Entity* sub_0805EB9C(int type, int subtype) + +{ + Entity* it2; + struct_03003D70 *it, *end; + + it = gUnk_03003D70; + end = (gUnk_03003D70 + 9); + do { + it2 = (Entity*)it->field_0x4; + while ((u32)it2 != (u32)it) { + if ((type == (it2->entityType).type) && (subtype == (it2->entityType).subtype)) + return it2; + it2 = it2->field_0x4; + } + it++; + } while (it < end); + + return 0; +} + +void sub_0805EBCC(void) + +{ + Entity* pEVar1; + Entity* next; + struct_03003D70* it; + + it = gUnk_03003D70; + do { + next = it->field_0x4; + while (pEVar1 = next, (u32)pEVar1 != (u32)it) { + next = pEVar1->field_0x4; + if (pEVar1->entityType.type == 3) + DeleteEntity(pEVar1); + } + it++; + } while (it < (gUnk_03003D70 + 9)); + sub_0805E84C(); +} From a8819bc449d1c401e2cceb8c168aeeaaf2b83505 Mon Sep 17 00:00:00 2001 From: Behemoth Date: Thu, 6 Aug 2020 22:35:07 +0200 Subject: [PATCH 3/6] remove leftover assignment --- src/entity.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/entity.c b/src/entity.c index d1e87ff8..37de67e6 100644 --- a/src/entity.c +++ b/src/entity.c @@ -112,7 +112,6 @@ void DeleteEntity(Entity* ent) sub_0804AA1C(ent); } ent->flags = ent->flags & 0x7f; - ent->spriteSettings = ent->spriteSettings; ent->spriteSettings.b.draw = 0; ent->field_0x3c = 0; ent->bitfield = 0; From 2a36c16cf7ee7bbd8c1ae86d56dbe4d6441231dc Mon Sep 17 00:00:00 2001 From: Behemoth Date: Thu, 6 Aug 2020 23:27:46 +0200 Subject: [PATCH 4/6] cleanup --- src/entity.c | 121 +++++++++++++++++++++------------------------------ 1 file changed, 50 insertions(+), 71 deletions(-) diff --git a/src/entity.c b/src/entity.c index 37de67e6..deedca95 100644 --- a/src/entity.c +++ b/src/entity.c @@ -13,15 +13,14 @@ extern Entity gUnk_030011E8[7]; Entity* sub_0805E744(void) { - Entity* pEVar1 = gUnk_030011E8; - int i = 0; + Entity* ent = gUnk_030011E8; do { - if (pEVar1->field_0x0 == NULL) { - return pEVar1; + if (ent->field_0x0 == NULL) { + return ent; } - pEVar1 = pEVar1 + 1; - } while (pEVar1 < &gUnk_030011E8[7]); + } while (ent++, ent < &gUnk_030011E8[7]); + return NULL; } @@ -129,13 +128,12 @@ void sub_0805E870(Entity*); void sub_0805E84C(void) { - Entity* pEVar1 = &gLinkEntity; + Entity* ent = &gLinkEntity; do { - if ((int)pEVar1->field_0x0 < 0) { - sub_0805E870(pEVar1); + if ((int)ent->field_0x0 < 0) { + sub_0805E870(ent); } - pEVar1 = pEVar1 + 1; - } while (pEVar1 < (&gLinkEntity + 80)); + } while (ent++, ent < (&gLinkEntity + 80)); return; } @@ -159,20 +157,18 @@ extern EntityType gUnk_03003DB8; void sub_0805E89C(void) { - Entity* pEVar1; + Entity* ent; Entity* next; struct_03003D70* it; it = gUnk_03003D70; - if (it->field_0x4 != 0) { + if (it->field_0x4) { do { - next = it->field_0x4; - while (pEVar1 = next, (u32)pEVar1 != (u32)it) { - next = pEVar1->field_0x4; - sub_0805E79C(pEVar1); + for (ent = it->field_0x4; (u32)ent != (u32)it; ent = next) { + next = ent->field_0x4; + sub_0805E79C(ent); } - it++; - } while (it < (gUnk_03003D70 + 9)); + } while (it++, it < (gUnk_03003D70 + 9)); sub_0805E84C(); } } @@ -254,34 +250,30 @@ void sub_0805E9A8(void) it = gUnk_03003D70; do { - for (entry = (Entity*)it->field_0x4; (u32)entry != (u32)it; entry = entry->field_0x4) { + for (entry = it->field_0x4; (u32)entry != (u32)it; entry = entry->field_0x4) { entry->flags &= 0xfd; if ((entry->flags & 0x20) == 0) { entry->flags |= 0x10; } } - it++; - } while (it < (gUnk_03003D70 + 9)); + } while (it++, it < (gUnk_03003D70 + 9)); } void sub_0805E9F4(void) { - Entity* pEVar1; + Entity* ent; Entity* next; struct_03003D70* it; it = gUnk_03003D70; do { - next = it->field_0x4; - while (pEVar1 = next, (u32)pEVar1 != (u32)it) { - next = pEVar1->field_0x4; - if ((pEVar1->flags & 0x10) != 0) { - sub_0805E79C(pEVar1); - } + for (ent = it->field_0x4; (u32)ent != (u32)it; ent = next) { + next = ent->field_0x4; + if (ent->flags & 0x10) + sub_0805E79C(ent); } - it++; - } while (it < (gUnk_03003D70 + 9)); + } while (it++, it < (gUnk_03003D70 + 9)); } extern void sub_0805E374(Entity*); @@ -289,16 +281,16 @@ extern void sub_0805E374(Entity*); void sub_0805EA2C(Entity* ent, int kind) { - Entity* pEVar1; - struct_03003D70* pEVar2; + Entity* prev; + struct_03003D70* next; - pEVar2 = (gUnk_03003D70 + kind); - ent->field_0x4 = (Entity*)pEVar2; - pEVar1 = pEVar2->field_0x0; - ent->field_0x0 = pEVar1; - pEVar1->field_0x4 = ent; - pEVar2->field_0x0 = ent; - if ((ent->entityType).type != 9) { + next = (gUnk_03003D70 + kind); + ent->field_0x4 = (Entity*)next; + prev = next->field_0x0; + ent->field_0x0 = prev; + prev->field_0x4 = ent; + next->field_0x0 = ent; + if (ent->entityType.type != 9) { ent->spritePriority.b0 = 4; gUnk_03003DBC++; } else { @@ -333,22 +325,19 @@ void sub_0805EA98(Entity* ent) int sub_0805EABC(Entity* ent) { - Entity* psVar1; + Entity* ent2; struct_03003D70 *it, *end; it = gUnk_03003D70; end = (gUnk_03003D70 + 9); do { - psVar1 = (Entity*)it->field_0x4; - while ((u32)psVar1 != (u32)it) { - if ((u32)psVar1 != (u32)ent && psVar1->entityType.type == ent->entityType.type && - psVar1->entityType.subtype == ent->entityType.subtype) { + for (ent2 = (Entity*)it->field_0x4; (u32)ent2 != (u32)it; ent2 = ent2->field_0x4) { + if ((u32)ent2 != (u32)ent && ent2->entityType.type == ent->entityType.type && + ent2->entityType.subtype == ent->entityType.subtype) { return 1; } - psVar1 = psVar1->field_0x4; } - it++; - } while (it < end); + } while (it++, it < end); return 0; } @@ -360,11 +349,9 @@ Entity* sub_0805EB00(int type, int subtype, int kind) struct_03003D70* node; node = &gUnk_03003D70[kind]; - it = (Entity*)node->field_0x4; - while ((u32)it != (u32)node) { - if ((type == (it->entityType).type) && (subtype == (it->entityType).subtype)) + for (it = node->field_0x4; (u32)it != (u32)node; it = it->field_0x4) { + if (type == it->entityType.type && subtype == it->entityType.subtype) return it; - it = it->field_0x4; } return NULL; } @@ -376,12 +363,11 @@ Entity* sub_0805EB2C(int type, int subtype, int kind, int form, int parameter) struct_03003D70* node; node = &gUnk_03003D70[kind]; - it = (Entity*)node->field_0x4; - while ((u32)it != (u32)node) { + node = &gUnk_03003D70[kind]; + for (it = node->field_0x4; (u32)it != (u32)node; it = it->field_0x4) { if (type == it->entityType.type && subtype == it->entityType.subtype && form == it->entityType.form && parameter == it->entityType.parameter) return it; - it = it->field_0x4; } return NULL; } @@ -393,11 +379,9 @@ Entity* sub_0805EB64(Entity* ent, int kind) struct_03003D70* end; end = &gUnk_03003D70[kind]; - it = ent->field_0x4; - while ((u32)it != (u32)end) { + for (it = ent->field_0x4; (u32)it != (u32)end; it = it->field_0x4) { if (it->entityType.type == ent->entityType.type && it->entityType.subtype == ent->entityType.subtype) return it; - it = it->field_0x4; } return NULL; } @@ -411,14 +395,11 @@ Entity* sub_0805EB9C(int type, int subtype) it = gUnk_03003D70; end = (gUnk_03003D70 + 9); do { - it2 = (Entity*)it->field_0x4; - while ((u32)it2 != (u32)it) { + for (it2 = (Entity*)it->field_0x4; (u32)it2 != (u32)it; it2 = it2->field_0x4) { if ((type == (it2->entityType).type) && (subtype == (it2->entityType).subtype)) return it2; - it2 = it2->field_0x4; } - it++; - } while (it < end); + } while (it++, it < end); return 0; } @@ -426,19 +407,17 @@ Entity* sub_0805EB9C(int type, int subtype) void sub_0805EBCC(void) { - Entity* pEVar1; + Entity* ent; Entity* next; struct_03003D70* it; it = gUnk_03003D70; do { - next = it->field_0x4; - while (pEVar1 = next, (u32)pEVar1 != (u32)it) { - next = pEVar1->field_0x4; - if (pEVar1->entityType.type == 3) - DeleteEntity(pEVar1); + for (ent = it->field_0x4; (u32)ent != (u32)it; ent = next) { + next = ent->field_0x4; + if (ent->entityType.type == 3) + DeleteEntity(ent); } - it++; - } while (it < (gUnk_03003D70 + 9)); + } while (it++, it < (gUnk_03003D70 + 9)); sub_0805E84C(); } From ea7ff581cd5a3b0563cb87af8b7e65483e3e4719 Mon Sep 17 00:00:00 2001 From: Behemoth Date: Fri, 7 Aug 2020 19:15:11 +0200 Subject: [PATCH 5/6] rename asm --- asm/{code_0805E744.s => code_0805EC04.s} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename asm/{code_0805E744.s => code_0805EC04.s} (100%) diff --git a/asm/code_0805E744.s b/asm/code_0805EC04.s similarity index 100% rename from asm/code_0805E744.s rename to asm/code_0805EC04.s From b3b7d65c7980c8f65f134b5dec2038f5502bcddc Mon Sep 17 00:00:00 2001 From: Behemoth Date: Fri, 7 Aug 2020 19:16:57 +0200 Subject: [PATCH 6/6] fix linker --- linker.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linker.ld b/linker.ld index b5d32309..ef1ede16 100644 --- a/linker.ld +++ b/linker.ld @@ -530,7 +530,7 @@ SECTIONS { asm/code_0805E3B0.o(.text); asm/getEmptyEntity.o(.text); src/entity.o(.text); - asm/code_0805E744.o(.text); + asm/code_0805EC04.o(.text); /* npcs */ src/npc/gentari.o(.text); src/npc/festari.o(.text);