diff --git a/asm/epona.s b/asm/epona.s deleted file mode 100644 index 606a0752..00000000 --- a/asm/epona.s +++ /dev/null @@ -1,241 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_08065990 -sub_08065990: @ 0x08065990 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _080659B4 @ =gUnk_0811006C - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_08065A64 - adds r0, r4, #0 - bl sub_0806ED78 - pop {r4, pc} - .align 2, 0 -_080659B4: .4byte gUnk_0811006C - - thumb_func_start sub_080659B8 -sub_080659B8: @ 0x080659B8 - push {r4, lr} - adds r4, r0, #0 - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - movs r0, #6 - strb r0, [r4, #0x14] - adds r1, r4, #0 - adds r1, #0x69 - movs r0, #0xff - strb r0, [r1] - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x68 - strb r0, [r1] - ldrb r1, [r4, #0x14] - lsrs r1, r1, #1 - adds r0, r4, #0 - bl LoadAnimation - pop {r4, pc} - - thumb_func_start sub_080659F0 -sub_080659F0: @ 0x080659F0 - push {r4, lr} - adds r4, r0, #0 - bl sub_080042B8 - adds r0, r4, #0 - bl sub_08065AA4 - pop {r4, pc} - - thumb_func_start sub_08065A00 -sub_08065A00: @ 0x08065A00 - push {r4, lr} - adds r4, r0, #0 - bl sub_080042B8 - adds r0, r4, #0 - bl sub_08065AA4 - pop {r4, pc} - - thumb_func_start sub_08065A10 -sub_08065A10: @ 0x08065A10 - push {lr} - adds r2, r0, #0 - ldr r0, _08065A30 @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08065A2E - movs r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x14] - lsrs r1, r1, #1 - adds r0, r2, #0 - bl LoadAnimation -_08065A2E: - pop {pc} - .align 2, 0 -_08065A30: .4byte gTextBox - - thumb_func_start sub_08065A34 -sub_08065A34: @ 0x08065A34 - push {r4, lr} - adds r4, r0, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _08065A4E - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x14] - lsrs r1, r1, #1 - adds r0, r4, #0 - bl LoadAnimation -_08065A4E: - pop {r4, pc} - - thumb_func_start sub_08065A50 -sub_08065A50: @ 0x08065A50 - push {lr} - ldrb r1, [r0, #0xa] - lsls r1, r1, #3 - ldr r2, _08065A60 @ =gUnk_08110080 - adds r1, r1, r2 - bl sub_0806F1AC - pop {pc} - .align 2, 0 -_08065A60: .4byte gUnk_08110080 - - thumb_func_start sub_08065A64 -sub_08065A64: @ 0x08065A64 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _08065A8C @ =gLinkState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - rsbs r0, r0, #0 - lsrs r5, r0, #0x1f - adds r0, r4, #0 - adds r0, #0x69 - ldrb r0, [r0] - cmp r5, r0 - beq _08065A9C - cmp r5, #0 - bne _08065A90 - adds r0, r4, #0 - bl sub_08078778 - b _08065A9C - .align 2, 0 -_08065A8C: .4byte gLinkState -_08065A90: - adds r0, r4, #0 - adds r0, #0x68 - ldrb r1, [r0] - adds r0, r4, #0 - bl sub_080787A8 -_08065A9C: - adds r0, r4, #0 - adds r0, #0x69 - strb r5, [r0] - pop {r4, r5, pc} - - thumb_func_start sub_08065AA4 -sub_08065AA4: @ 0x08065AA4 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x39 - movs r2, #0 - ldrsb r2, [r0, r2] - cmp r2, #0 - beq _08065B18 - ldr r0, _08065AD0 @ =gLinkState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08065B00 - cmp r2, #2 - bne _08065AD4 - movs r0, #4 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_0806F118 - b _08065AE6 - .align 2, 0 -_08065AD0: .4byte gLinkState -_08065AD4: - movs r0, #3 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #2 - bl sub_0805E3A0 - adds r0, r4, #0 - bl sub_08065A50 -_08065AE6: - ldr r1, _08065AFC @ =gLinkEntity - adds r0, r4, #0 - bl sub_080045C4 - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - bl LoadAnimation - b _08065B0A - .align 2, 0 -_08065AFC: .4byte gLinkEntity -_08065B00: - adds r0, r4, #0 - bl sub_08065A50 - bl sub_080791D0 -_08065B0A: - movs r0, #0xd3 - bl PlaySFX - adds r1, r4, #0 - adds r1, #0x39 - movs r0, #0 - strb r0, [r1] -_08065B18: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08065B1C -sub_08065B1C: @ 0x08065B1C - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xc] - cmp r0, #0 - bne _08065B42 - adds r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] - adds r0, r2, #0 - movs r1, #7 - bl LoadAnimation - b _08065B48 -_08065B42: - adds r0, r2, #0 - bl sub_080042B8 -_08065B48: - pop {pc} - .align 2, 0 \ No newline at end of file diff --git a/include/entity.h b/include/entity.h index 06423001..30dd6d97 100644 --- a/include/entity.h +++ b/include/entity.h @@ -127,7 +127,8 @@ typedef struct Entity u8 spriteOffsetX; u8 spriteOffsetY; u32 * otherEntity; - u16 field_0x68; + u8 field_0x68; + u8 field_0x69; u16 field_0x6a; u8 filler4[8]; u32 * heldObjectPtr; diff --git a/include/link.h b/include/link.h index 45d27c7f..dac6500c 100644 --- a/include/link.h +++ b/include/link.h @@ -25,14 +25,16 @@ typedef struct { u8 *unk4; union { u32 all; - u32 filler9:3; - u32 noMinishCap:1; - u32 pullingState:1; - u32 windyState:1; - u32 filler10:4; - u32 slipperyState:1; - u32 filler11:5; - u32 filler11b:16; + struct { + u32 filler9:3; + u32 noMinishCap:1; + u32 pullingState:1; + u32 windyState:1; + u32 filler10:4; + u32 slipperyState:1; + u32 filler11:5; + u32 filler11b:16; + } PACKED b; } flags; u8 filler12[6]; u16 unk5; diff --git a/linker.ld b/linker.ld index 959de5d6..ff6f35f2 100644 --- a/linker.ld +++ b/linker.ld @@ -490,7 +490,7 @@ SECTIONS { asm/stockwell.o(.text); asm/talon.o(.text); asm/malon.o(.text); - asm/epona.o(.text); + src/epona.o(.text); src/milkCart.o(.text); asm/ghostBrothers.o(.text); asm/smith.o(.text); diff --git a/src/epona.c b/src/epona.c new file mode 100644 index 00000000..33d9d1d1 --- /dev/null +++ b/src/epona.c @@ -0,0 +1,144 @@ +#include "global.h" +#include "entity.h" +#include "textbox.h" +#include "link.h" + +extern void sub_0806ED78(Entity*); +extern u32 sub_0801E99C(Entity*); +extern void LoadAnimation(Entity*, u32); +extern void sub_080042B8(Entity*); +extern void sub_08065AA4(Entity*); +extern u32 UpdateFuseInteraction(void); +extern void sub_0806F1AC(Entity*, u64*); +extern void sub_08078778(Entity*); +extern void sub_080787A8(Entity*, u32); +extern void sub_0806F118(Entity*); +extern void sub_0805E3A0(Entity*, u8); +extern u32 sub_080045C4(Entity*, Entity*); +extern u32 sub_0806F5A4(void); +extern void sub_080791D0(void); +extern void PlaySFX(u32); + +extern TextBox gTextBox; +extern LinkState gLinkState; +extern Entity gLinkEntity; + +void sub_08065A64(Entity* ent); + +extern void (*gUnk_0811006C[])(Entity*); +extern u64 gUnk_08110080[]; + +void sub_08065990(Entity* ent) +{ + gUnk_0811006C[ent->action](ent); + sub_08065A64(ent); + sub_0806ED78(ent); +} + +void sub_080659B8(Entity* ent) +{ + ent->action = 1; + ent->spriteSettings.b.ss0 = 1; + ent->animationState = 6; + ent->field_0x69 = -1; + ent->field_0x68 = sub_0801E99C(ent); + LoadAnimation(ent, ent->animationState / 2); +} + +void sub_080659F0(Entity* ent) +{ + sub_080042B8(ent); + sub_08065AA4(ent); +} + +void sub_08065A00(Entity* ent) +{ + sub_080042B8(ent); + sub_08065AA4(ent); +} + +void sub_08065A10(Entity* ent) +{ + if ((gTextBox.doTextBox & 0x7F) == 0) + { + ent->action = 1; + LoadAnimation(ent, ent->animationState / 2); + } +} + +void sub_08065A34(Entity* ent) +{ + if (UpdateFuseInteraction() != 0) + { + ent->action = 1; + LoadAnimation(ent, ent->animationState / 2); + } +} + +void sub_08065A50(Entity* ent) +{ + sub_0806F1AC(ent, &gUnk_08110080[ent->entityType.parameter1]); +} + +void sub_08065A64(Entity* ent) +{ + u32 uVar2; + + uVar2 = -(gLinkState.flags.all & 0x80) >> 0x1f; + if (uVar2 != ent->field_0x69) + { + if (uVar2 == 0) + { + sub_08078778(ent); + } + else + { + sub_080787A8(ent, ent->field_0x68); + } + } + ent->field_0x69 = uVar2; +} + +void sub_08065AA4(Entity* ent) +{ + if (ent->interactType != 0) + { + if (gLinkState.flags.all & 0x80) + { + if (ent->interactType == 2) + { + ent->action = 4; + sub_0806F118(ent); + } + else + { + ent->action = 3; + sub_0805E3A0(ent, 2); + sub_08065A50(ent); + } + sub_080045C4(ent, &gLinkEntity); + LoadAnimation(ent, sub_0806F5A4()); + } + else + { + sub_08065A50(ent); + sub_080791D0(); + } + PlaySFX(0xD3); + ent->interactType = 0; + } +} + +void sub_08065B1C(Entity* ent) +{ + if (ent->action == 0) + { + ent->action += 1; + ent->spriteSettings.b.ss0 = 1; + LoadAnimation(ent, 7); + } + else + { + sub_080042B8(ent); + } +}