mirror of https://github.com/zeldaret/tmc.git
commit
64c2f2476d
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue