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; +}