diff --git a/asm/non_matching/enemyUtils/sub_0804A720.inc b/asm/non_matching/enemyUtils/sub_0804A720.inc deleted file mode 100644 index edd90898..00000000 --- a/asm/non_matching/enemyUtils/sub_0804A720.inc +++ /dev/null @@ -1,101 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r2, r0, #0 - adds r0, #0x6d - ldrb r1, [r0] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - bne _0804A7D0 - ldrb r0, [r2, #9] - lsls r0, r0, #1 - ldr r1, _0804A76C @ =gUnk_080D3D94 - adds r3, r0, r1 - adds r4, r2, #0 - adds r4, #0x68 - ldrb r1, [r4, #0x16] - cmp r1, #0 - bne _0804A744 - ldrb r1, [r3] -_0804A744: - adds r0, r2, #0 - adds r0, #0x6e - strb r1, [r0] - adds r5, r0, #0 - ldrb r1, [r4, #0x17] - cmp r1, #0 - bne _0804A754 - ldrb r1, [r3, #1] -_0804A754: - adds r0, r2, #0 - adds r0, #0x6f - strb r1, [r0] - adds r6, r0, #0 - ldrh r1, [r4, #0x1c] - adds r3, r1, #0 - cmp r3, #0 - beq _0804A774 - ldr r0, _0804A770 @ =gRoomControls - ldrh r0, [r0, #6] - adds r0, r1, r0 - b _0804A784 - .align 2, 0 -_0804A76C: .4byte gUnk_080D3D94 -_0804A770: .4byte gRoomControls -_0804A774: - ldrb r0, [r5] - lsls r1, r0, #2 - movs r5, #0x2e - ldrsh r0, [r2, r5] - cmp r0, r1 - blt _0804A78C - ldrh r0, [r2, #0x2e] - subs r0, r0, r1 -_0804A784: - adds r1, r2, #0 - adds r1, #0x70 - strh r0, [r1] - b _0804A792 -_0804A78C: - adds r0, r2, #0 - adds r0, #0x70 - strh r3, [r0] -_0804A792: - ldrh r1, [r4, #0x1e] - adds r3, r1, #0 - cmp r3, #0 - beq _0804A7A8 - ldr r0, _0804A7A4 @ =gRoomControls - ldrh r0, [r0, #8] - adds r0, r1, r0 - b _0804A7B8 - .align 2, 0 -_0804A7A4: .4byte gRoomControls -_0804A7A8: - ldrb r0, [r6] - lsls r1, r0, #2 - movs r4, #0x32 - ldrsh r0, [r2, r4] - cmp r0, r1 - blt _0804A7C0 - ldrh r0, [r2, #0x32] - subs r0, r0, r1 -_0804A7B8: - adds r1, r2, #0 - adds r1, #0x72 - strh r0, [r1] - b _0804A7C6 -_0804A7C0: - adds r0, r2, #0 - adds r0, #0x72 - strh r3, [r0] -_0804A7C6: - adds r2, #0x6d - ldrb r1, [r2] - movs r0, #4 - orrs r0, r1 - strb r0, [r2] -_0804A7D0: - pop {r4, r5, r6, pc} - .align 2, 0 - .syntax divided diff --git a/include/entity.h b/include/entity.h index ddeef86c..c20af84a 100644 --- a/include/entity.h +++ b/include/entity.h @@ -112,6 +112,22 @@ typedef struct { u8 b3 : 1; // 0x80 } PACKED SpritePriority; +#define GENERIC_ENTITY_FIELDS \ + /*0x68*/ union SplitHWord field_0x68; \ + /*0x6a*/ union SplitHWord field_0x6a; \ + /*0x6c*/ union SplitHWord field_0x6c; \ + /*0x6e*/ union SplitHWord field_0x6e; \ + /*0x70*/ union SplitWord field_0x70; \ + /*0x74*/ union SplitHWord field_0x74; \ + /*0x76*/ union SplitHWord field_0x76; \ + /*0x78*/ union SplitHWord field_0x78; \ + /*0x7a*/ union SplitHWord field_0x7a; \ + /*0x7c*/ union SplitWord field_0x7c; \ + /*0x80*/ union SplitHWord field_0x80; \ + /*0x82*/ union SplitHWord field_0x82; \ + /*0x84*/ union SplitHWord cutsceneBeh; \ + /*0x86*/ union SplitHWord field_0x86; + /** * Container for instantiable behavior. */ @@ -201,39 +217,17 @@ typedef struct Entity_ { /*0x63*/ s8 spriteOffsetY; /*0x64*/ void* myHeap; /**< Heap data allocated with #zMalloc. */ #ifndef NENT_DEPRECATED - /*0x68*/ union SplitHWord field_0x68; - /*0x6a*/ union SplitHWord field_0x6a; - /*0x6c*/ union SplitHWord field_0x6c; - /*0x6e*/ union SplitHWord field_0x6e; - /*0x70*/ union SplitWord field_0x70; - /*0x74*/ union SplitHWord field_0x74; - /*0x76*/ union SplitHWord field_0x76; - /*0x78*/ union SplitHWord field_0x78; - /*0x7a*/ union SplitHWord field_0x7a; - /*0x7c*/ union SplitWord field_0x7c; - /*0x80*/ union SplitHWord field_0x80; - /*0x82*/ union SplitHWord field_0x82; - /*0x84*/ union SplitHWord cutsceneBeh; - /*0x86*/ union SplitHWord field_0x86; + GENERIC_ENTITY_FIELDS #endif } Entity; +typedef struct { + GENERIC_ENTITY_FIELDS +} GenericEntityData; + typedef struct { /*0x00*/ Entity base; - /*0x68*/ union SplitHWord field_0x68; - /*0x6a*/ union SplitHWord field_0x6a; - /*0x6c*/ union SplitHWord field_0x6c; - /*0x6e*/ union SplitHWord field_0x6e; - /*0x70*/ union SplitWord field_0x70; - /*0x74*/ union SplitHWord field_0x74; - /*0x76*/ union SplitHWord field_0x76; - /*0x78*/ union SplitHWord field_0x78; - /*0x7a*/ union SplitHWord field_0x7a; - /*0x7c*/ union SplitWord field_0x7c; - /*0x80*/ union SplitHWord field_0x80; - /*0x82*/ union SplitHWord field_0x82; - /*0x84*/ union SplitHWord cutsceneBeh; - /*0x86*/ union SplitHWord field_0x86; + GENERIC_ENTITY_FIELDS } GenericEntity; /** diff --git a/src/enemyUtils.c b/src/enemyUtils.c index cd0747cb..8dd024dc 100644 --- a/src/enemyUtils.c +++ b/src/enemyUtils.c @@ -14,6 +14,7 @@ extern EnemyDefinition gEnemyDefinitions[]; const EnemyDefinition* GetEnemyDefinition(Entity* entity); bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition); extern const u16 gUnk_080D3E74[]; +extern const u8 gUnk_080D3D94[]; const EnemyDefinition* GetEnemyDefinition(Entity* entity) { const EnemyDefinition* definition = &gEnemyDefinitions[entity->id]; @@ -93,7 +94,52 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) { return TRUE; } -ASM_FUNC("asm/non_matching/enemyUtils/sub_0804A720.inc", void sub_0804A720(Entity* this)) +void sub_0804A720(GenericEntity* this) { + int iVar2; + const u8* pbVar3; + GenericEntityData* ptr; + + if ((this->field_0x6c.HALF.HI & 4) != 0) { + return; + } + + pbVar3 = &gUnk_080D3D94[super->id * 2]; + ptr = (GenericEntityData*)&this->field_0x68; + if (ptr->field_0x7c.BYTES.byte2 == 0) { + this->field_0x6e.HALF.LO = pbVar3[0]; + } else { + this->field_0x6e.HALF.LO = ptr->field_0x7c.BYTES.byte2; + } + + if (ptr->field_0x7c.BYTES.byte3 == 0) { + this->field_0x6e.HALF.HI = pbVar3[1]; + } else { + this->field_0x6e.HALF.HI = ptr->field_0x7c.BYTES.byte3; + } + + if (ptr->cutsceneBeh.HWORD != 0) { + this->field_0x70.HALF.LO = ptr->cutsceneBeh.HWORD + gRoomControls.origin_x; + } else { + iVar2 = this->field_0x6e.HALF.LO * 4; + if (super->x.HALF.HI >= iVar2) { + this->field_0x70.HALF.LO = super->x.HALF_U.HI - 4 * this->field_0x6e.HALF.LO; + } else { + this->field_0x70.HALF.LO = 0; + } + } + + if (ptr->field_0x86.HWORD != 0) { + this->field_0x70.HALF.HI = ptr->field_0x86.HWORD + gRoomControls.origin_y; + } else { + iVar2 = this->field_0x6e.HALF.HI * 4; + if (super->y.HALF.HI >= iVar2) { + this->field_0x70.HALF.HI = super->y.HALF.HI - iVar2; + } else { + this->field_0x70.HALF.HI = 0; + } + } + this->field_0x6c.HALF.HI |= 4; +} void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem); void GenericDeath(Entity* this) {