diff --git a/asm/non_matching/itemPegasusBoots/sub_08076964.inc b/asm/non_matching/itemPegasusBoots/sub_08076964.inc deleted file mode 100644 index 979d4f34..00000000 --- a/asm/non_matching/itemPegasusBoots/sub_08076964.inc +++ /dev/null @@ -1,145 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r4, r0, #0 - adds r6, r1, #0 - bl sub_08077EFC - cmp r0, #0 - bne _08076978 - b _08076A70 -_08076978: - ldr r0, _080769C4 @ =gPlayerEntity - ldr r7, [r0, #0x34] - cmp r7, #0 - bne _08076A70 - ldr r5, _080769C8 @ =gPlayerState - ldrb r0, [r5, #0x1e] - cmp r0, #0 - beq _08076A70 - adds r0, r4, #0 - bl UpdateItemAnim - ldr r0, [r5, #0x30] - movs r1, #0x80 - mov r8, r1 - ands r0, r1 - cmp r0, #0 - bne _080769A0 - adds r0, r4, #0 - bl UpdateItemAnim -_080769A0: - ldrb r0, [r5, #0x1e] - adds r0, #1 - strb r0, [r5, #0x1e] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x1e - bne _08076A7E - ldr r0, [r5, #0x30] - movs r1, #2 - ands r0, r1 - cmp r0, #0 - beq _080769CC - strb r7, [r5, #0x1e] - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_08077E78 - b _08076A7E - .align 2, 0 -_080769C4: .4byte gPlayerEntity -_080769C8: .4byte gPlayerState -_080769CC: - movs r0, #0x40 - strb r0, [r5, #0x1e] - movs r1, #8 - asrs r1, r6 - ldrb r0, [r5, #0xa] - bics r0, r1 - strb r0, [r5, #0xa] - ldrb r0, [r4, #4] - adds r0, #1 - strb r0, [r4, #4] - bl sub_0807A158 - cmp r0, #0 - beq _08076A46 - ldr r0, [r5, #0x30] - mov r1, r8 - ands r0, r1 - cmp r0, #0 - bne _08076A60 - adds r0, r5, #0 - adds r0, #0xac - ldrh r1, [r0] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - beq _08076A46 - adds r0, r5, #0 - adds r0, #0xab - movs r1, #3 - strb r1, [r0] - movs r1, #0xa6 - lsls r1, r1, #2 - adds r0, r4, #0 - bl sub_08077DF4 - adds r0, r4, #0 - movs r1, #0xc - bl CreatePlayerBomb - adds r5, r0, #0 - cmp r5, #0 - beq _08076A70 - ldr r6, _08076A34 @ =gSave - adds r4, r6, #0 - adds r4, #0xb4 - ldrb r0, [r4] - bl ItemIsSword - cmp r0, #0 - beq _08076A38 - ldrb r1, [r4] - b _08076A3E - .align 2, 0 -_08076A34: .4byte gSave -_08076A38: - adds r0, r6, #0 - adds r0, #0xb5 - ldrb r1, [r0] -_08076A3E: - adds r0, r5, #0 - adds r0, #0x68 - strb r1, [r0] - b _08076A7E -_08076A46: - ldr r0, _08076A5C @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _08076A60 - adds r1, #0x84 - adds r0, r4, #0 - bl sub_08077DF4 - b _08076A7E - .align 2, 0 -_08076A5C: .4byte gPlayerState -_08076A60: - ldr r1, _08076A6C @ =gPlayerState - movs r0, #0xc1 - lsls r0, r0, #4 - strh r0, [r1, #8] - b _08076A7E - .align 2, 0 -_08076A6C: .4byte gPlayerState -_08076A70: - ldr r1, _08076A84 @ =gPlayerState - movs r0, #0 - strb r0, [r1, #0x1e] - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_08077E78 -_08076A7E: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08076A84: .4byte gPlayerState - .syntax divided diff --git a/asm/non_matching/itemPegasusBoots/sub_08076A88.inc b/asm/non_matching/itemPegasusBoots/sub_08076A88.inc deleted file mode 100644 index 5a56e40d..00000000 --- a/asm/non_matching/itemPegasusBoots/sub_08076A88.inc +++ /dev/null @@ -1,123 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r7, r1, #0 - bl sub_08077EFC - cmp r0, #0 - beq _08076B64 - ldr r1, _08076AB4 @ =gPlayerState - ldrb r0, [r1, #0x1e] - adds r3, r1, #0 - cmp r0, #0 - beq _08076B64 - ldr r0, [r3, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _08076ABC - ldr r1, _08076AB8 @ =gPlayerEntity - movs r0, #0xc0 - lsls r0, r0, #2 - b _08076AC2 - .align 2, 0 -_08076AB4: .4byte gPlayerState -_08076AB8: .4byte gPlayerEntity -_08076ABC: - ldr r1, _08076B00 @ =gPlayerEntity - movs r0, #0xa0 - lsls r0, r0, #2 -_08076AC2: - strh r0, [r1, #0x24] - adds r5, r1, #0 - ldr r1, _08076B04 @ =gUnk_0800275C - ldrb r2, [r5, #0x14] - movs r6, #0xe - adds r0, r6, #0 - ands r0, r2 - lsls r0, r0, #3 - adds r0, r0, r1 - ldrh r1, [r0] - ldrh r0, [r5, #0x2a] - ands r0, r1 - cmp r1, r0 - bne _08076B0E - ldrb r0, [r4, #8] - cmp r0, #0 - beq _08076B08 - movs r2, #0 - movs r0, #6 - strb r0, [r5, #0xc] - strb r2, [r5, #0xd] - ldrb r1, [r5, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r5, #0x10] - adds r0, r3, #0 - adds r0, #0x38 - strb r2, [r0] - movs r0, #0xff - strb r0, [r3, #0xd] - b _08076B72 - .align 2, 0 -_08076B00: .4byte gPlayerEntity -_08076B04: .4byte gUnk_0800275C -_08076B08: - movs r0, #1 - strb r0, [r4, #8] - b _08076B72 -_08076B0E: - ldr r1, _08076B60 @ =gUnk_0811BE38 - movs r0, #0xfe - ands r0, r2 - adds r0, r0, r1 - adds r1, r3, #0 - adds r1, #0x90 - ldrh r2, [r0] - ldrh r0, [r1] - ands r0, r2 - cmp r0, #0 - bne _08076B64 - ldrb r0, [r4, #0xa] - adds r1, r6, #0 - ands r1, r0 - lsls r0, r1, #2 - strb r0, [r4, #0xb] - ldrb r2, [r3, #0xd] - cmp r2, #0xff - beq _08076B52 - cmp r2, r0 - beq _08076B52 - adds r0, r2, #0 - ldrb r1, [r4, #0xb] - subs r0, r0, r1 - movs r2, #0x1f - ands r0, r2 - cmp r0, #0xf - bgt _08076B4A - adds r0, r1, #2 - strb r0, [r4, #0xb] -_08076B4A: - ldrb r0, [r4, #0xb] - subs r0, #1 - ands r0, r2 - strb r0, [r4, #0xb] -_08076B52: - ldrb r0, [r4, #0xb] - strb r0, [r3, #0xd] - adds r0, r4, #0 - bl UpdateItemAnim - b _08076B72 - .align 2, 0 -_08076B60: .4byte gUnk_0811BE38 -_08076B64: - ldr r1, _08076B74 @ =gPlayerState - movs r0, #0 - strb r0, [r1, #0x1e] - adds r0, r4, #0 - adds r1, r7, #0 - bl sub_08077E78 -_08076B72: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08076B74: .4byte gPlayerState - .syntax divided diff --git a/data/const/item/itemPegasusBoots.s b/data/const/item/itemPegasusBoots.s deleted file mode 100644 index 4421f591..00000000 --- a/data/const/item/itemPegasusBoots.s +++ /dev/null @@ -1,10 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811BDCC:: @ 0811BDCC - .4byte sub_080768F8 - .4byte sub_08076964 - .4byte sub_08076A88 diff --git a/linker.ld b/linker.ld index b5903739..49d169f2 100644 --- a/linker.ld +++ b/linker.ld @@ -1344,7 +1344,7 @@ SECTIONS { data/const/item/itemBow.o(.rodata); data/const/item/itemBomb.o(.rodata); data/const/item/itemTryPickupObject.o(.rodata); - data/const/item/itemPegasusBoots.o(.rodata); + src/item/itemPegasusBoots.o(.rodata); data/const/item/itemOcarina.o(.rodata); data/const/item/itemPacciCane.o(.rodata); data/const/item/itemShield.o(.rodata); diff --git a/src/item/itemPegasusBoots.c b/src/item/itemPegasusBoots.c index 755362bf..6a2c3782 100644 --- a/src/item/itemPegasusBoots.c +++ b/src/item/itemPegasusBoots.c @@ -3,12 +3,24 @@ #include "sound.h" #include "functions.h" #include "effects.h" - -extern void (*const gUnk_0811BDCC[])(ItemBehavior* beh, u32); +#include "game.h" +#include "save.h" void sub_08076964(ItemBehavior*, u32); +void sub_080768F8(ItemBehavior*, u32); +void sub_08076A88(ItemBehavior*, u32); +extern bool32 sub_0807A158(); +extern Entity* CreatePlayerBomb(ItemBehavior*, u32); + +extern u16 gUnk_0800275C[]; +extern u8 gUnk_0811BE38[]; void ItemPegasusBoots(ItemBehavior* this, u32 arg1) { + static void (*const ItemPegasusBoots_StateFunctions[])(ItemBehavior * beh, u32) = { + sub_080768F8, + sub_08076964, + sub_08076A88, + }; u32 bVar1; Entity* fx; u32 uVar4; @@ -44,7 +56,7 @@ void ItemPegasusBoots(ItemBehavior* this, u32 arg1) { } } } - gUnk_0811BDCC[this->stateID](this, arg1); + ItemPegasusBoots_StateFunctions[this->stateID](this, arg1); } } @@ -72,6 +84,92 @@ void sub_080768F8(ItemBehavior* this, u32 arg1) { } } -ASM_FUNC("asm/non_matching/itemPegasusBoots/sub_08076964.inc", void sub_08076964(ItemBehavior* this, u32 arg1)) +void sub_08076964(ItemBehavior* this, u32 arg1) { + Entity* bombEntity; + u32 uVar3; + if (sub_08077EFC(this) && gPlayerEntity.z.WORD == 0 && gPlayerState.dash_state) { + UpdateItemAnim(this); -ASM_FUNC("asm/non_matching/itemPegasusBoots/sub_08076A88.inc", void sub_08076A88(ItemBehavior* this, u32 arg1)) + if ((gPlayerState.flags & PL_MINISH) == 0) { + UpdateItemAnim(this); + } + + if ((++gPlayerState.dash_state) == 0x1e) { + if ((gPlayerState.flags & PL_FLAGS2) != 0) { + gPlayerState.dash_state = 0; + sub_08077E78(this, arg1); + return; + } + gPlayerState.dash_state = 0x40; + gPlayerState.field_0xa &= ~(8 >> arg1); + this->stateID++; + if (sub_0807A158() && (gPlayerState.flags & PL_MINISH) == 0 && (gPlayerState.field_0xac & 4) != 0) { + gPlayerState.field_0xab = 3; + sub_08077DF4(this, 0x298); + bombEntity = CreatePlayerBomb(this, 0xc); + if (bombEntity != NULL) { + if (ItemIsSword(gSave.stats.itemButtons[SLOT_A]) != 0) { + uVar3 = gSave.stats.itemButtons[SLOT_A]; + } else { + uVar3 = gSave.stats.itemButtons[SLOT_B]; + } + bombEntity->field_0x68.HALF.LO = uVar3; + return; + } + } else if ((gPlayerState.flags & PL_MINISH) == 0) { + sub_08077DF4(this, 0x104); + return; + } else { + gPlayerState.animation = 0xc10; + return; + } + } else { + return; + } + } + gPlayerState.dash_state = 0; + sub_08077E78(this, arg1); +} + +void sub_08076A88(ItemBehavior* this, u32 arg1) { + u32 uVar1; + u32 uVar2; + u8* ptr; + + if ((sub_08077EFC(this) != 0) && (gPlayerState.dash_state != 0)) { + if ((gPlayerState.flags & PL_MINISH) == 0) { + gPlayerEntity.speed = 0x300; + } else { + gPlayerEntity.speed = 0x280; + } + uVar2 = gUnk_0800275C[(gPlayerEntity.animationState & 0xe) * 4]; + if (uVar2 == (gPlayerEntity.collisions & uVar2)) { + if (this->field_0x5[3] != 0) { + gPlayerEntity.action = 6; + gPlayerEntity.subAction = 0; + COLLISION_OFF(&gPlayerEntity); + gPlayerState.field_0x38 = 0; + gPlayerState.field_0xd = 0xff; + return; + } + this->field_0x5[3] = 1; + return; + } + ptr = gUnk_0811BE38; + if ((*(u16*)&ptr[(gPlayerEntity.animationState & 0xfe)] & gPlayerState.field_0x90) == 0) { + this->field_0x5[6] = (this->field_0x5[5] & 0xe) * 4; + if ((gPlayerState.field_0xd != 0xff) && (gPlayerState.field_0xd != this->field_0x5[6])) { + if (((gPlayerState.field_0xd - this->field_0x5[6]) & 0x1f) < 0x10) { + this->field_0x5[6] = this->field_0x5[6] + 2; + } + this->field_0x5[6]--; + this->field_0x5[6] &= 0x1f; + } + gPlayerState.field_0xd = this->field_0x5[6]; + UpdateItemAnim(this); + return; + } + } + gPlayerState.dash_state = 0; + sub_08077E78(this, arg1); +}