summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2023-04-24 22:48:42 -0700
committerGitHub <noreply@github.com>2023-04-24 22:48:42 -0700
commitb83cb034e16a1d2a9b033aa17ef339480ae996ed (patch)
tree0b391c0383dba3af5430b1ae414d23e0519da98e
parentbc550a87931f4899dfaedf4ecf81c3cb7e4157dc (diff)
parent2d20f33494927e59dca1eeb662622be28fbb7e9d (diff)
Merge pull request #604 from Elmyr-de-Hory/sub_08068318
-rw-r--r--asm/non_matching/zeldaFollower/sub_08068318.inc287
-rw-r--r--src/npc/zeldaFollower.c141
2 files changed, 125 insertions, 303 deletions
diff --git a/asm/non_matching/zeldaFollower/sub_08068318.inc b/asm/non_matching/zeldaFollower/sub_08068318.inc
deleted file mode 100644
index 620448a5..00000000
--- a/asm/non_matching/zeldaFollower/sub_08068318.inc
+++ /dev/null
@@ -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
diff --git a/src/npc/zeldaFollower.c b/src/npc/zeldaFollower.c
index ae67fcba..24d9c30c 100644
--- a/src/npc/zeldaFollower.c
+++ b/src/npc/zeldaFollower.c
@@ -3,16 +3,36 @@
#include "functions.h"
#include "common.h"
-typedef struct {
- u16 x;
- u16 y;
- u16 z;
- u8 framestate;
- u8 animationState : 6;
- u8 collisionLayer : 2;
+extern s32 sub_080041E8(s32 x1, s32 y1, s32 x2, s32 y2);
+
+typedef union {
+ struct {
+ u16 x;
+ u16 y;
+ u16 z;
+ u8 framestate;
+ u8 animationState : 6;
+ u8 collisionLayer : 2;
+ } FIELDS;
+ u64 DWORD;
} 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_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) {
- this->myHeap = zMalloc(sizeof(ZeldaFollowerHeap));
+ this->myHeap = zMalloc(sizeof(ZeldaFollowerItem[ZELDA_FOLLOWER_HEAP_LEN]));
if (this->myHeap != NULL) {
this->field_0x68.HALF.LO = 1;
sub_080788E0(this);
@@ -157,12 +266,12 @@ void sub_08068578(Entity* this) {
// Down here the u32 are suddendly accessed correctly as u16 and bitfields?
// How are the results of above u32 calculations used?
for (index = 0x13; index >= 0; index--) {
- item->x = r5 - (x >> 8);
- item->y = (r5 >> 0x10) - (y >> 8);
- item->z = r6;
- item->framestate = r6 >> 0x10;
- item->animationState = this->animationState & 0x3f;
- item->collisionLayer = this->collisionLayer;
+ item->FIELDS.x = r5 - (x >> 8);
+ item->FIELDS.y = (r5 >> 0x10) - (y >> 8);
+ item->FIELDS.z = r6;
+ item->FIELDS.framestate = r6 >> 0x10;
+ item->FIELDS.animationState = this->animationState & 0x3f;
+ item->FIELDS.collisionLayer = this->collisionLayer;
item++;
y = y + r8;
x = x + r10;