diff --git a/asm/code_08076C80.s b/asm/code_08076C80.s index c2d420b3..d564bc2d 100644 --- a/asm/code_08076C80.s +++ b/asm/code_08076C80.s @@ -6,145 +6,6 @@ .text - thumb_func_start PacciCane -PacciCane: @ 0x08076C80 - push {lr} - ldr r3, _08076C94 @ =gUnk_0811BDE0 - ldrb r2, [r0, #4] - lsls r2, r2, #2 - adds r2, r2, r3 - ldr r2, [r2] - bl _call_via_r2 - pop {pc} - .align 2, 0 -_08076C94: .4byte gUnk_0811BDE0 - - thumb_func_start sub_08076C98 -sub_08076C98: @ 0x08076C98 - push {r4, lr} - adds r4, r0, #0 - ldrb r2, [r4, #9] - movs r0, #0xf - orrs r0, r2 - strb r0, [r4, #9] - adds r0, r4, #0 - bl sub_08077D38 - ldr r0, _08076CB8 @ =gLinkEntity - bl sub_0806F948 - adds r0, r4, #0 - bl sub_08077BB8 - pop {r4, pc} - .align 2, 0 -_08076CB8: .4byte gLinkEntity - - thumb_func_start sub_08076CBC -sub_08076CBC: @ 0x08076CBC - push {r4, lr} - adds r4, r0, #0 - ldrb r2, [r4, #0xe] - movs r0, #0x80 - ands r0, r2 - cmp r0, #0 - beq _08076CD2 - adds r0, r4, #0 - bl sub_08077E78 - b _08076CE8 -_08076CD2: - movs r0, #0x40 - ands r0, r2 - cmp r0, #0 - beq _08076CE2 - adds r0, r4, #0 - movs r1, #0x12 - bl CreatePlayerBomb -_08076CE2: - adds r0, r4, #0 - bl UpdateItemAnim -_08076CE8: - pop {r4, pc} - .align 2, 0 - - thumb_func_start Shield -Shield: @ 0x08076CEC - push {lr} - ldr r3, _08076D00 @ =gUnk_0811BDE8 - ldrb r2, [r0, #4] - lsls r2, r2, #2 - adds r2, r2, r3 - ldr r2, [r2] - bl _call_via_r2 - pop {pc} - .align 2, 0 -_08076D00: .4byte gUnk_0811BDE8 - - thumb_func_start sub_08076D04 -sub_08076D04: @ 0x08076D04 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldr r1, _08076D2C @ =gLinkState - movs r0, #0x81 - strb r0, [r1, #3] - movs r0, #2 - strb r0, [r4, #9] - ldr r0, _08076D30 @ =gLinkEntity - bl sub_0806F948 - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_08077D38 - adds r0, r4, #0 - bl sub_08077BB8 - pop {r4, r5, pc} - .align 2, 0 -_08076D2C: .4byte gLinkState -_08076D30: .4byte gLinkEntity - - thumb_func_start sub_08076D34 -sub_08076D34: @ 0x08076D34 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r1, #0 - bl sub_08077EFC - adds r1, r0, #0 - cmp r1, #0 - beq _08076D80 - ldr r5, _08076D78 @ =gLinkState - ldrb r0, [r5, #3] - movs r1, #1 - orrs r1, r0 - strb r1, [r5, #3] - adds r0, r4, #0 - bl UpdateItemAnim - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08076D8C - ldrb r0, [r4, #4] - adds r0, #1 - strb r0, [r4, #4] - movs r0, #0 - strb r0, [r4, #0xf] - movs r1, #8 - asrs r1, r6 - ldrb r0, [r5, #0xa] - bics r0, r1 - strb r0, [r5, #0xa] - ldr r0, _08076D7C @ =0x0000015D - bl PlaySFX - b _08076D8C - .align 2, 0 -_08076D78: .4byte gLinkState -_08076D7C: .4byte 0x0000015D -_08076D80: - ldr r0, _08076D90 @ =gLinkState - strb r1, [r0, #3] - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_08077E78 -_08076D8C: - pop {r4, r5, r6, pc} - .align 2, 0 -_08076D90: .4byte gLinkState - thumb_func_start sub_08076D94 sub_08076D94: @ 0x08076D94 push {r4, r5, lr} diff --git a/include/greatFairy.h b/include/greatFairy.h index 6c2654e3..1a65fd1c 100644 --- a/include/greatFairy.h +++ b/include/greatFairy.h @@ -19,20 +19,6 @@ extern void sub_080045D4(); extern void sub_0806F69C(); extern u32 Random(); - -enum { - BEHAVIORS, - WINGS, - WAKE, - MINI, - MINIAFFINE, - DROPLET, - RIPPLE, - BIGRIPPLE, - FORM8, - FORM9, -}; - extern void (*const GreatFairy_Main[])(Entity*); extern void (*const GreatFairy_Behaviors[])(Entity*); extern void (*const GreatFairy_WingsBehaviors[])(Entity*); diff --git a/include/link.h b/include/link.h index d9e6b0bb..45acee75 100644 --- a/include/link.h +++ b/include/link.h @@ -82,6 +82,7 @@ typedef struct { /*0x2*/ u8 field_0x2[2]; /*0x4*/ u8 stateID; /*0x5*/ u8 field_0x5[10]; + /*0xf*/ u8 field_0xf; } ItemBehavior; extern u8 gBombBagSizes[]; diff --git a/linker.ld b/linker.ld index d0dc2328..bae7d5ec 100644 --- a/linker.ld +++ b/linker.ld @@ -641,6 +641,7 @@ SECTIONS { asm/stairsInteract.o(.text); asm/code_080732D0.o(.text); asm/ocarina.o(.text); + src/item.o(.text); asm/code_08076C80.o(.text); asm/respawnLink.o(.text); src/code_08077B98.o(.text); diff --git a/src/item.c b/src/item.c index b0386445..607a7d83 100644 --- a/src/item.c +++ b/src/item.c @@ -38,3 +38,104 @@ void (*const gItemFunctions[])(ItemBehavior*, u32) = { JarEmpty, JarEmpty, }; + +extern void sub_08077E78(ItemBehavior*, u32); +extern void PlaySFX(u32); +extern void sub_08078F60(void); +extern void sub_08077D38(ItemBehavior*, u32); +extern void sub_0805E544(void); +extern void UpdateItemAnim(ItemBehavior*); +extern void CreateBird(void); +extern void UnfreezeTime(void); +extern void sub_0806F948(Entity*); +extern void sub_08077BB8(ItemBehavior*); +extern void CreatePlayerBomb(ItemBehavior*, u32); +extern u32 sub_08077EFC(); + +extern void (*const gUnk_0811BDE0[])(ItemBehavior* beh, u32); +extern void (*const gUnk_0811BDE8[])(ItemBehavior* beh, u32); +extern void (*const gOcarinaStates[4])(ItemBehavior*, u32); + +extern u8 gUnk_02034490; +#if 0 +void Ocarina(ItemBehavior* beh, u32 inputFlags) { + gOcarinaStates[beh->stateID](beh, inputFlags); + gLinkEntity.field_0x7a++; +} + +void OcarinaUse(ItemBehavior *beh, u32 arg1) +{ + u32 bVar1; + + if (gLinkState.linkAction == 0x18) { + LinkChangeState(beh, arg1); + } + else { + beh->field_0x5[4] = beh->field_0x5[4] | 0xf; + gLinkEntity.animationState = 4; + gLinkEntity.spriteSettings.b.flipX = 0; + gLinkEntity.flags &= 0x7f; + gLinkEntity.field_0x7a = 2; + gLinkState.flags.all |= 0x10000000; + gLinkState.field_0x27[0] = 0xff; + gUnk_02034490 = 1; + bVar1 = (8 >> arg1); + gLinkState.field_0xa |= bVar1; + gLinkState.keepFacing |= bVar1; + sub_08078F60(); + sub_08077D38(beh, arg1); + PlaySFX(0x216); + sub_0805E544(); + } +} +#endif + +void PacciCane(ItemBehavior* beh, u32 arg1) { + gUnk_0811BDE0[beh->stateID](beh, arg1); +} + +void sub_08076C98(ItemBehavior* beh, u32 arg1) { + beh->field_0x5[4] |= 0xf; + sub_08077D38(beh, arg1); + sub_0806F948(&gLinkEntity); + sub_08077BB8(beh); +} + +void sub_08076CBC(ItemBehavior* beh, u32 arg1) { + if ((beh->field_0x5[9] & 0x80) != 0) { + sub_08077E78(beh, arg1); + } else { + if ((beh->field_0x5[9] & 0x40) != 0) { + CreatePlayerBomb(beh, 0x12); + } + UpdateItemAnim(beh); + } +} + +void Shield(ItemBehavior* beh, u32 arg1) { + gUnk_0811BDE8[beh->stateID](beh, arg1); +} + +void sub_08076D04(ItemBehavior* beh, u32 arg1) { + gLinkState.field_0x3[0] = 0x81; + beh->field_0x5[4] = 2; + sub_0806F948(&gLinkEntity); + sub_08077D38(beh, arg1); + sub_08077BB8(beh); +} + +void sub_08076D34(ItemBehavior* beh, u32 arg1) { + if (sub_08077EFC() != 0) { + gLinkState.field_0x3[0] |= 1; + UpdateItemAnim(beh); + if (beh->field_0x5[9] != 0) { + beh->stateID++; + beh->field_0xf = 0; + gLinkState.field_0xa &= ~(u8)(8 >> arg1); + PlaySFX(0x15d); + } + } else { + gLinkState.field_0x3[0] = 0; + sub_08077E78(beh, arg1); + } +} \ No newline at end of file diff --git a/src/npc/cow.c b/src/npc/cow.c index 633334b1..e9df0918 100644 --- a/src/npc/cow.c +++ b/src/npc/cow.c @@ -183,7 +183,7 @@ void sub_080691E0(Entity* ent) { } // Show dialogue -void sub_080691F8(Entity* ent) { +void Cow_ShowDialogue(Entity* ent) { u32 var0 = ent->entityType.form; u32* var1 = gUnk_08111938 + (var0 * 2); ShowNPCDialogue(ent, var1); @@ -215,10 +215,10 @@ void sub_0806924C(Entity* ent) { ent->action = 4; sub_0806F118(ent); } else { - sub_080691F8(ent); + Cow_ShowDialogue(ent); } } else { - sub_080691F8(ent); + Cow_ShowDialogue(ent); sub_080791D0(); } PlaySFX(212); diff --git a/src/object/greatFairy.c b/src/object/greatFairy.c index 2f3276b9..21edd60f 100644 --- a/src/object/greatFairy.c +++ b/src/object/greatFairy.c @@ -4,6 +4,19 @@ #include "screen.h" #include "greatFairy.h" +enum { + BEHAVIORS, + WINGS, + WAKE, + MINI, + MINIAFFINE, + DROPLET, + RIPPLE, + BIGRIPPLE, + FORM8, + FORM9, +}; + // Main void GreatFairy(Entity* this) { u8 bVar1; @@ -36,7 +49,6 @@ void GreatFairy_Init(Entity* this) { this->cutsceneBeh.HWORD = 290; } -// TODO: turn this into a switch statement void GreatFairy_DormantUpdate(Entity* this) { u16* pFrame; // r1@2 s32 frame; // r1@4 @@ -48,47 +60,24 @@ void GreatFairy_DormantUpdate(Entity* this) { if (*pFrame != 0) { --*pFrame; } - frame = *pFrame; - - if (frame == 0x96) { - goto LABEL_16; - } - - if (frame < 0x97) { - if (frame != 0) { - if (frame == 0x82) { - goto LABEL_16; - } else { - return; - } - } - goto LABEL_17; - } else { - if (frame == 0xd2) { - goto LABEL_16; - } - if (frame < 0xd3) { - if (frame == 0xaa) { - goto LABEL_16; - } else - return; - } - if (frame == 289) { - goto LABEL_16; - } else { - return; - } - } - -LABEL_17: - this->action = 2; - return; -LABEL_16: - ripple = GreatFairy_CreateForm(this, RIPPLE, 0); - if (ripple) { - PositionRelative(this, ripple, (s32)GreatFairy_RippleOffsets[this->actionDelay] << 16, + switch (*pFrame) { + case 0x96: + case 0x82: + goto e; + case 0x0: + this->action = 2; + break; +e: + case 0xd2: + case 0xaa: + case 0x121: + ripple = GreatFairy_CreateForm(this, RIPPLE, 0); + if (ripple) { + PositionRelative(this, ripple, (s32)GreatFairy_RippleOffsets[this->actionDelay] << 16, (s32)GreatFairy_RippleOffsets[this->actionDelay + 1] << 16); - this->actionDelay += 2; + this->actionDelay += 2; + break; + } } } diff --git a/src/ocarina.c b/src/ocarina.c deleted file mode 100644 index 326e4c0d..00000000 --- a/src/ocarina.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "global.h" -#include "item.h" -#include "entity.h" -#include "link.h" - -extern void _call_via_r2(); -extern void sub_08077E78(ItemBehavior*, u32); -extern void PlaySFX(u32); -extern void sub_08078F60(void); -extern void sub_08077D38(ItemBehavior*, u32); -extern void sub_0805E544(void); -extern void UpdateItemAnim(ItemBehavior*); -extern void CreateBird(void); -extern void UnfreezeTime(void); - -extern Entity gLinkEntity; -extern LinkState gLinkState; -extern void (*gOcarinaStates[4])(ItemBehavior*, u32); -extern u8 gUnk_02034490; - -void Ocarina(ItemBehavior* pItemBeh, u32 inputFlags) - -{ - // u32 *ocarinaStates = &gOcarinaStates; - //_call_via_r2(pItemBeh, inputFlags,(ocarinaStates)[pItemBeh->stateID]); - gOcarinaStates[pItemBeh->stateID](pItemBeh, inputFlags); - gLinkEntity.field_0x7a = gLinkEntity.field_0x7a + 1; -} - -void OcarinaUse(ItemBehavior* itemBeh, s32 inputFlags) { - u32 bVar1; - u32 var; - - if (gLinkState.linkAction == 24) { - sub_08077E78(itemBeh, inputFlags); - } else { - itemBeh->field_0x5[4] |= 15; - gLinkEntity.animationState = 4; - var = gLinkEntity.spriteSettings.raw & ~0x40; - gLinkEntity.spriteSettings.raw &= var; - - gLinkEntity.flags &= 127; - gLinkEntity.field_0x7a = 2; - gLinkState.flags.all |= 0x10000000; - gLinkState.field_0x27[0] = 255; - gUnk_02034490 = 1; - bVar1 = (8 >> inputFlags); - gLinkState.field_0xa |= bVar1; - gLinkState.keepFacing |= bVar1; - sub_08078F60(); - sub_08077D38(itemBeh, inputFlags); - PlaySFX(534); - sub_0805E544(); - } -}