mirror of https://github.com/zeldaret/tmc.git
Merge pull request #604 from Elmyr-de-Hory/sub_08068318
This commit is contained in:
commit
b83cb034e1
|
@ -1,287 +0,0 @@
|
||||||
.syntax unified
|
|
||||||
push {r4, r5, r6, r7, lr}
|
|
||||||
mov r7, sb
|
|
||||||
mov r6, r8
|
|
||||||
push {r6, r7}
|
|
||||||
mov r8, r0
|
|
||||||
ldr r4, _08068414 @ =gPlayerEntity
|
|
||||||
ldrh r1, [r4, #0x2e]
|
|
||||||
ldr r3, _08068418 @ =0xFFFF0000
|
|
||||||
adds r0, r3, #0
|
|
||||||
ands r0, r6
|
|
||||||
orrs r0, r1
|
|
||||||
ldrh r1, [r4, #0x32]
|
|
||||||
lsls r1, r1, #0x10
|
|
||||||
ldr r2, _0806841C @ =0x0000FFFF
|
|
||||||
ands r0, r2
|
|
||||||
adds r6, r0, #0
|
|
||||||
orrs r6, r1
|
|
||||||
ldrh r0, [r4, #0x36]
|
|
||||||
ands r3, r7
|
|
||||||
orrs r3, r0
|
|
||||||
adds r7, r3, #0
|
|
||||||
ldr r0, _08068420 @ =gPlayerState
|
|
||||||
adds r0, #0xa8
|
|
||||||
ldrb r0, [r0]
|
|
||||||
lsls r0, r0, #0x10
|
|
||||||
ldr r2, _08068424 @ =0xFF00FFFF
|
|
||||||
ands r2, r3
|
|
||||||
orrs r2, r0
|
|
||||||
adds r7, r2, #0
|
|
||||||
ldrb r1, [r4, #0x14]
|
|
||||||
movs r0, #0x3f
|
|
||||||
ands r1, r0
|
|
||||||
lsls r1, r1, #0x18
|
|
||||||
ldr r0, _08068428 @ =0xC0FFFFFF
|
|
||||||
ands r0, r2
|
|
||||||
orrs r0, r1
|
|
||||||
adds r7, r0, #0
|
|
||||||
adds r1, r4, #0
|
|
||||||
adds r1, #0x38
|
|
||||||
ldrb r1, [r1]
|
|
||||||
lsls r1, r1, #0x1e
|
|
||||||
ldr r2, _0806842C @ =0x3FFFFFFF
|
|
||||||
ands r0, r2
|
|
||||||
adds r7, r0, #0
|
|
||||||
orrs r7, r1
|
|
||||||
mov r0, r8
|
|
||||||
ldr r5, [r0, #0x64]
|
|
||||||
ldrb r1, [r5, #6]
|
|
||||||
cmp r1, #0xa
|
|
||||||
bne _08068386
|
|
||||||
lsrs r0, r7, #0x10
|
|
||||||
lsls r0, r0, #0x18
|
|
||||||
lsrs r0, r0, #0x18
|
|
||||||
cmp r0, #0xa
|
|
||||||
bne _08068394
|
|
||||||
_08068386:
|
|
||||||
cmp r1, #0x16
|
|
||||||
bne _080683B4
|
|
||||||
lsrs r0, r7, #0x10
|
|
||||||
lsls r0, r0, #0x18
|
|
||||||
lsrs r0, r0, #0x18
|
|
||||||
cmp r0, #0x16
|
|
||||||
beq _080683B4
|
|
||||||
_08068394:
|
|
||||||
ldrh r0, [r4, #0x2e]
|
|
||||||
mov r1, r8
|
|
||||||
strh r0, [r1, #0x2e]
|
|
||||||
ldrh r0, [r4, #0x32]
|
|
||||||
strh r0, [r1, #0x32]
|
|
||||||
ldrb r1, [r1, #0x18]
|
|
||||||
movs r0, #4
|
|
||||||
rsbs r0, r0, #0
|
|
||||||
ands r0, r1
|
|
||||||
movs r1, #1
|
|
||||||
orrs r0, r1
|
|
||||||
mov r2, r8
|
|
||||||
strb r0, [r2, #0x18]
|
|
||||||
mov r0, r8
|
|
||||||
bl sub_08068578
|
|
||||||
_080683B4:
|
|
||||||
movs r3, #0
|
|
||||||
mov sb, r3
|
|
||||||
ldr r0, [r5]
|
|
||||||
cmp r6, r0
|
|
||||||
bne _080683D0
|
|
||||||
ldr r0, [r5, #4]
|
|
||||||
cmp r7, r0
|
|
||||||
bne _080683D0
|
|
||||||
lsls r1, r7, #8
|
|
||||||
lsrs r0, r1, #0x18
|
|
||||||
cmp r0, #0x16
|
|
||||||
beq _080683D0
|
|
||||||
cmp r0, #0xa
|
|
||||||
bne _08068430
|
|
||||||
_080683D0:
|
|
||||||
mov r0, r8
|
|
||||||
ldr r5, [r0, #0x64]
|
|
||||||
adds r5, #0x90
|
|
||||||
mov r4, r8
|
|
||||||
adds r4, #0x69
|
|
||||||
mov r3, r8
|
|
||||||
adds r3, #0x38
|
|
||||||
movs r1, #0x58
|
|
||||||
add r1, r8
|
|
||||||
mov ip, r1
|
|
||||||
movs r2, #0x12
|
|
||||||
_080683E6:
|
|
||||||
ldr r0, [r5]
|
|
||||||
ldr r1, [r5, #4]
|
|
||||||
str r0, [r5, #8]
|
|
||||||
str r1, [r5, #0xc]
|
|
||||||
subs r5, #8
|
|
||||||
subs r2, #1
|
|
||||||
cmp r2, #0
|
|
||||||
bge _080683E6
|
|
||||||
mov r2, r8
|
|
||||||
ldr r5, [r2, #0x64]
|
|
||||||
str r6, [r5]
|
|
||||||
str r7, [r5, #4]
|
|
||||||
movs r0, #4
|
|
||||||
mov sb, r0
|
|
||||||
ldrb r1, [r4]
|
|
||||||
movs r0, #0
|
|
||||||
ldrsb r0, [r4, r0]
|
|
||||||
cmp r0, #0
|
|
||||||
ble _080684A8
|
|
||||||
subs r0, r1, #1
|
|
||||||
strb r0, [r4]
|
|
||||||
b _080684A8
|
|
||||||
.align 2, 0
|
|
||||||
_08068414: .4byte gPlayerEntity
|
|
||||||
_08068418: .4byte 0xFFFF0000
|
|
||||||
_0806841C: .4byte 0x0000FFFF
|
|
||||||
_08068420: .4byte gPlayerState
|
|
||||||
_08068424: .4byte 0xFF00FFFF
|
|
||||||
_08068428: .4byte 0xC0FFFFFF
|
|
||||||
_0806842C: .4byte 0x3FFFFFFF
|
|
||||||
_08068430:
|
|
||||||
adds r5, #0x98
|
|
||||||
movs r1, #4
|
|
||||||
ldrsh r0, [r5, r1]
|
|
||||||
cmp r0, #0
|
|
||||||
bge _08068466
|
|
||||||
mov r2, r8
|
|
||||||
ldr r5, [r2, #0x64]
|
|
||||||
adds r5, #0x90
|
|
||||||
mov r4, r8
|
|
||||||
adds r4, #0x69
|
|
||||||
mov r3, r8
|
|
||||||
adds r3, #0x38
|
|
||||||
movs r0, #0x58
|
|
||||||
add r0, r8
|
|
||||||
mov ip, r0
|
|
||||||
movs r2, #0x12
|
|
||||||
_08068450:
|
|
||||||
ldr r0, [r5]
|
|
||||||
ldr r1, [r5, #4]
|
|
||||||
str r0, [r5, #8]
|
|
||||||
str r1, [r5, #0xc]
|
|
||||||
subs r5, #8
|
|
||||||
subs r2, #1
|
|
||||||
cmp r2, #0
|
|
||||||
bge _08068450
|
|
||||||
movs r1, #4
|
|
||||||
mov sb, r1
|
|
||||||
b _080684A8
|
|
||||||
_08068466:
|
|
||||||
ldr r1, _0806851C @ =gPlayerEntity
|
|
||||||
movs r2, #0x2e
|
|
||||||
ldrsh r0, [r1, r2]
|
|
||||||
movs r3, #0x32
|
|
||||||
ldrsh r1, [r1, r3]
|
|
||||||
ldrh r2, [r5]
|
|
||||||
ldrh r3, [r5, #2]
|
|
||||||
bl sub_080041E8
|
|
||||||
lsrs r0, r0, #4
|
|
||||||
mov r4, r8
|
|
||||||
adds r4, #0x69
|
|
||||||
mov r3, r8
|
|
||||||
adds r3, #0x38
|
|
||||||
movs r1, #0x58
|
|
||||||
add r1, r8
|
|
||||||
mov ip, r1
|
|
||||||
cmp r0, #0x18
|
|
||||||
ble _080684A8
|
|
||||||
mov r2, r8
|
|
||||||
ldr r5, [r2, #0x64]
|
|
||||||
adds r5, #0x90
|
|
||||||
movs r2, #0x12
|
|
||||||
_08068494:
|
|
||||||
ldr r0, [r5]
|
|
||||||
ldr r1, [r5, #4]
|
|
||||||
str r0, [r5, #8]
|
|
||||||
str r1, [r5, #0xc]
|
|
||||||
subs r5, #8
|
|
||||||
subs r2, #1
|
|
||||||
cmp r2, #0
|
|
||||||
bge _08068494
|
|
||||||
movs r0, #4
|
|
||||||
mov sb, r0
|
|
||||||
_080684A8:
|
|
||||||
mov r1, r8
|
|
||||||
ldr r5, [r1, #0x64]
|
|
||||||
adds r5, #0x98
|
|
||||||
ldrh r0, [r5]
|
|
||||||
strh r0, [r1, #0x2e]
|
|
||||||
ldrh r0, [r5, #2]
|
|
||||||
strh r0, [r1, #0x32]
|
|
||||||
ldrh r0, [r5, #4]
|
|
||||||
strh r0, [r1, #0x36]
|
|
||||||
ldrb r0, [r5, #7]
|
|
||||||
lsls r0, r0, #0x1a
|
|
||||||
lsrs r0, r0, #0x1a
|
|
||||||
strb r0, [r1, #0x14]
|
|
||||||
ldrb r0, [r5, #7]
|
|
||||||
lsrs r0, r0, #6
|
|
||||||
strb r0, [r3]
|
|
||||||
ldrb r0, [r5, #6]
|
|
||||||
cmp r0, #0x16
|
|
||||||
beq _080684D2
|
|
||||||
cmp r0, #0xa
|
|
||||||
bne _080684DE
|
|
||||||
_080684D2:
|
|
||||||
mov r2, r8
|
|
||||||
ldrb r1, [r2, #0x18]
|
|
||||||
movs r0, #4
|
|
||||||
rsbs r0, r0, #0
|
|
||||||
ands r0, r1
|
|
||||||
strb r0, [r2, #0x18]
|
|
||||||
_080684DE:
|
|
||||||
adds r1, r4, #0
|
|
||||||
ldrb r2, [r1]
|
|
||||||
movs r0, #0
|
|
||||||
ldrsb r0, [r1, r0]
|
|
||||||
cmp r0, #0
|
|
||||||
ble _080684EE
|
|
||||||
subs r0, r2, #1
|
|
||||||
strb r0, [r1]
|
|
||||||
_080684EE:
|
|
||||||
mov r2, sb
|
|
||||||
mov r3, r8
|
|
||||||
ldrb r0, [r3, #0x14]
|
|
||||||
lsrs r0, r0, #1
|
|
||||||
add sb, r0
|
|
||||||
mov r0, ip
|
|
||||||
ldrb r0, [r0]
|
|
||||||
cmp sb, r0
|
|
||||||
beq _08068520
|
|
||||||
cmp r2, #0
|
|
||||||
bne _0806850C
|
|
||||||
movs r0, #0
|
|
||||||
ldrsb r0, [r1, r0]
|
|
||||||
cmp r0, #0
|
|
||||||
bgt _08068520
|
|
||||||
_0806850C:
|
|
||||||
mov r0, r8
|
|
||||||
mov r1, sb
|
|
||||||
bl InitAnimationForceUpdate
|
|
||||||
movs r0, #0x1e
|
|
||||||
strb r0, [r4]
|
|
||||||
b _08068526
|
|
||||||
.align 2, 0
|
|
||||||
_0806851C: .4byte gPlayerEntity
|
|
||||||
_08068520:
|
|
||||||
mov r0, r8
|
|
||||||
bl UpdateAnimationSingleFrame
|
|
||||||
_08068526:
|
|
||||||
mov r0, r8
|
|
||||||
bl sub_0800451C
|
|
||||||
mov r1, r8
|
|
||||||
movs r2, #0x36
|
|
||||||
ldrsh r0, [r1, r2]
|
|
||||||
cmp r0, #0
|
|
||||||
bge _08068542
|
|
||||||
movs r2, #0xc
|
|
||||||
rsbs r2, r2, #0
|
|
||||||
mov r0, r8
|
|
||||||
movs r1, #0
|
|
||||||
bl sub_0806F854
|
|
||||||
_08068542:
|
|
||||||
pop {r3, r4}
|
|
||||||
mov r8, r3
|
|
||||||
mov sb, r4
|
|
||||||
pop {r4, r5, r6, r7, pc}
|
|
||||||
.align 2, 0
|
|
||||||
.syntax divided
|
|
|
@ -3,16 +3,36 @@
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
typedef struct {
|
extern s32 sub_080041E8(s32 x1, s32 y1, s32 x2, s32 y2);
|
||||||
u16 x;
|
|
||||||
u16 y;
|
typedef union {
|
||||||
u16 z;
|
struct {
|
||||||
u8 framestate;
|
u16 x;
|
||||||
u8 animationState : 6;
|
u16 y;
|
||||||
u8 collisionLayer : 2;
|
u16 z;
|
||||||
|
u8 framestate;
|
||||||
|
u8 animationState : 6;
|
||||||
|
u8 collisionLayer : 2;
|
||||||
|
} FIELDS;
|
||||||
|
u64 DWORD;
|
||||||
} ZeldaFollowerItem;
|
} ZeldaFollowerItem;
|
||||||
|
|
||||||
typedef ZeldaFollowerItem ZeldaFollowerHeap[20];
|
#define ZELDA_FOLLOWER_HEAP_LEN 20
|
||||||
|
|
||||||
|
#define ZELDA_FOLLOWER_HEAP ((ZeldaFollowerItem *)this->myHeap)
|
||||||
|
#define ZELDA_FOLLOWER_HEAP_END ((ZeldaFollowerItem *)this->myHeap + (ZELDA_FOLLOWER_HEAP_LEN - 1))
|
||||||
|
|
||||||
|
#define ZELDA_FOLLOWER_HEAP_SHIFT_RIGHT(this, heapPtr) \
|
||||||
|
do { \
|
||||||
|
int i; \
|
||||||
|
heapPtr = ((ZeldaFollowerItem*)this->myHeap); \
|
||||||
|
heapPtr += (ZELDA_FOLLOWER_HEAP_LEN - 2); \
|
||||||
|
for ( i = 0; i < (ZELDA_FOLLOWER_HEAP_LEN - 1); i++) { \
|
||||||
|
heapPtr[1] = heapPtr[0]; \
|
||||||
|
heapPtr--; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
void sub_08068318(Entity*);
|
void sub_08068318(Entity*);
|
||||||
void sub_0806854C(Entity*, u32*);
|
void sub_0806854C(Entity*, u32*);
|
||||||
|
@ -36,10 +56,99 @@ void ZeldaFollower(Entity* this) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASM_FUNC("asm/non_matching/zeldaFollower/sub_08068318.inc", void sub_08068318(Entity* this))
|
void sub_08068318(Entity* this) {
|
||||||
|
s32 dist;
|
||||||
|
s16 z;
|
||||||
|
|
||||||
|
u32 animIndex;
|
||||||
|
u32 animIndexTmp;
|
||||||
|
|
||||||
|
ZeldaFollowerItem* heapPtr;
|
||||||
|
ZeldaFollowerItem item;
|
||||||
|
|
||||||
|
item.FIELDS.x = gPlayerEntity.x.HALF_U.HI;
|
||||||
|
item.FIELDS.y = gPlayerEntity.y.HALF_U.HI;
|
||||||
|
item.FIELDS.z = gPlayerEntity.z.HALF_U.HI;
|
||||||
|
item.FIELDS.framestate = gPlayerState.framestate;
|
||||||
|
item.FIELDS.animationState = gPlayerEntity.animationState;
|
||||||
|
item.FIELDS.collisionLayer = gPlayerEntity.collisionLayer;
|
||||||
|
|
||||||
|
heapPtr = this->myHeap;
|
||||||
|
|
||||||
|
if ( (heapPtr->FIELDS.framestate == 0xa && item.FIELDS.framestate != 0xa) ||
|
||||||
|
(heapPtr->FIELDS.framestate == 0x16 && item.FIELDS.framestate != 0x16)) {
|
||||||
|
this->x.HALF.HI = gPlayerEntity.x.HALF.HI;
|
||||||
|
this->y.HALF.HI = gPlayerEntity.y.HALF.HI;
|
||||||
|
this->spriteSettings.draw = 1;
|
||||||
|
sub_08068578(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
animIndex = 0;
|
||||||
|
if (item.DWORD != heapPtr->DWORD || item.FIELDS.framestate == 0x16 || item.FIELDS.framestate == 0xa ) {
|
||||||
|
ZELDA_FOLLOWER_HEAP_SHIFT_RIGHT(this, heapPtr);
|
||||||
|
heapPtr = ZELDA_FOLLOWER_HEAP;
|
||||||
|
heapPtr[0] = item;
|
||||||
|
animIndex = 0x4;
|
||||||
|
|
||||||
|
if ((s8)this->field_0x68.HALF.HI > 0) {
|
||||||
|
this->field_0x68.HALF.HI = this->field_0x68.HALF.HI - 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
heapPtr += ZELDA_FOLLOWER_HEAP_LEN - 1;
|
||||||
|
z = heapPtr->FIELDS.z;
|
||||||
|
|
||||||
|
if (z < 0) {
|
||||||
|
ZELDA_FOLLOWER_HEAP_SHIFT_RIGHT(this, heapPtr);
|
||||||
|
animIndex = 0x4;
|
||||||
|
} else {
|
||||||
|
dist = sub_080041E8(
|
||||||
|
gPlayerEntity.x.HALF.HI,
|
||||||
|
gPlayerEntity.y.HALF.HI,
|
||||||
|
(u16) heapPtr->FIELDS.x,
|
||||||
|
(u16) heapPtr->FIELDS.y
|
||||||
|
);
|
||||||
|
dist = ((u32)dist) >> 0x4;
|
||||||
|
if (dist > 0x18) {
|
||||||
|
ZELDA_FOLLOWER_HEAP_SHIFT_RIGHT(this, heapPtr);
|
||||||
|
animIndex = 0x4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
heapPtr = ZELDA_FOLLOWER_HEAP;
|
||||||
|
heapPtr += ZELDA_FOLLOWER_HEAP_LEN - 1;
|
||||||
|
this->x.HALF.HI = heapPtr->FIELDS.x;
|
||||||
|
this->y.HALF.HI = heapPtr->FIELDS.y;
|
||||||
|
this->z.HALF.HI = heapPtr->FIELDS.z;
|
||||||
|
this->animationState = heapPtr->FIELDS.animationState;
|
||||||
|
this->collisionLayer = heapPtr->FIELDS.collisionLayer;
|
||||||
|
|
||||||
|
if (heapPtr->FIELDS.framestate == 0x16 || heapPtr->FIELDS.framestate == 0xa) {
|
||||||
|
this->spriteSettings.draw = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((s8)this->field_0x68.HALF.HI) > 0) {
|
||||||
|
this->field_0x68.HALF.HI = this->field_0x68.HALF.HI - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
animIndexTmp = animIndex;
|
||||||
|
animIndex += this->animationState >> 1;
|
||||||
|
|
||||||
|
if (!(animIndex == this->animIndex || (animIndexTmp == 0 && ((s8)this->field_0x68.HALF.HI) > 0))) {
|
||||||
|
InitAnimationForceUpdate(this, animIndex);
|
||||||
|
this->field_0x68.HALF.HI = 0x1e;
|
||||||
|
} else {
|
||||||
|
UpdateAnimationSingleFrame(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub_0800451C(this);
|
||||||
|
if (this->z.HALF.HI < 0) {
|
||||||
|
sub_0806F854(this, 0x0, -0xc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sub_0806854C(Entity* this, u32* none) {
|
void sub_0806854C(Entity* this, u32* none) {
|
||||||
this->myHeap = zMalloc(sizeof(ZeldaFollowerHeap));
|
this->myHeap = zMalloc(sizeof(ZeldaFollowerItem[ZELDA_FOLLOWER_HEAP_LEN]));
|
||||||
if (this->myHeap != NULL) {
|
if (this->myHeap != NULL) {
|
||||||
this->field_0x68.HALF.LO = 1;
|
this->field_0x68.HALF.LO = 1;
|
||||||
sub_080788E0(this);
|
sub_080788E0(this);
|
||||||
|
@ -157,12 +266,12 @@ void sub_08068578(Entity* this) {
|
||||||
// Down here the u32 are suddendly accessed correctly as u16 and bitfields?
|
// Down here the u32 are suddendly accessed correctly as u16 and bitfields?
|
||||||
// How are the results of above u32 calculations used?
|
// How are the results of above u32 calculations used?
|
||||||
for (index = 0x13; index >= 0; index--) {
|
for (index = 0x13; index >= 0; index--) {
|
||||||
item->x = r5 - (x >> 8);
|
item->FIELDS.x = r5 - (x >> 8);
|
||||||
item->y = (r5 >> 0x10) - (y >> 8);
|
item->FIELDS.y = (r5 >> 0x10) - (y >> 8);
|
||||||
item->z = r6;
|
item->FIELDS.z = r6;
|
||||||
item->framestate = r6 >> 0x10;
|
item->FIELDS.framestate = r6 >> 0x10;
|
||||||
item->animationState = this->animationState & 0x3f;
|
item->FIELDS.animationState = this->animationState & 0x3f;
|
||||||
item->collisionLayer = this->collisionLayer;
|
item->FIELDS.collisionLayer = this->collisionLayer;
|
||||||
item++;
|
item++;
|
||||||
y = y + r8;
|
y = y + r8;
|
||||||
x = x + r10;
|
x = x + r10;
|
||||||
|
|
Loading…
Reference in New Issue