diff --git a/asm/non_matching/pullableMushroom/sub_0808ACEC.inc b/asm/non_matching/pullableMushroom/sub_0808ACEC.inc deleted file mode 100644 index aed579ab..00000000 --- a/asm/non_matching/pullableMushroom/sub_0808ACEC.inc +++ /dev/null @@ -1,75 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #0 - beq _0808AD00 - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation -_0808AD00: - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - subs r0, #4 - cmp r0, #0x12 - bhi _0808AD92 - lsls r0, r0, #2 - ldr r1, _0808AD1C @ =_0808AD20 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0808AD1C: .4byte _0808AD20 -_0808AD20: @ jump table - .4byte _0808AD6C @ case 0 - .4byte _0808AD6C @ case 1 - .4byte _0808AD6C @ case 2 - .4byte _0808AD92 @ case 3 - .4byte _0808AD6C @ case 4 - .4byte _0808AD6C @ case 5 - .4byte _0808AD6C @ case 6 - .4byte _0808AD6C @ case 7 - .4byte _0808AD6C @ case 8 - .4byte _0808AD6C @ case 9 - .4byte _0808AD92 @ case 10 - .4byte _0808AD92 @ case 11 - .4byte _0808AD6C @ case 12 - .4byte _0808AD6C @ case 13 - .4byte _0808AD6C @ case 14 - .4byte _0808AD88 @ case 15 - .4byte _0808AD6C @ case 16 - .4byte _0808AD92 @ case 17 - .4byte _0808AD6C @ case 18 -_0808AD6C: - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - adds r0, r4, #0 - adds r0, #0x3e - ldrb r0, [r0] - bl sub_0806F5A4 - strb r0, [r4, #0x14] - movs r0, #2 - strb r0, [r4, #0xd] - strb r0, [r4, #0xe] - b _0808AD9E -_0808AD88: - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] - b _0808AD9E -_0808AD92: - movs r0, #0 - strb r0, [r4, #0xf] - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_08078930 -_0808AD9E: - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/pullableMushroom/sub_0808B0BC.inc b/asm/non_matching/pullableMushroom/sub_0808B0BC.inc deleted file mode 100644 index 11b0d898..00000000 --- a/asm/non_matching/pullableMushroom/sub_0808B0BC.inc +++ /dev/null @@ -1,85 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - sub sp, #0x88 - adds r5, r0, #0 - ldr r1, [r5, #0x50] - bl sub_0808B1F0 - adds r7, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #0 - beq _0808B0D6 - cmp r0, #1 - beq _0808B0DE - b _0808B162 -_0808B0D6: - adds r0, r5, #0 - bl GetNextFrame - b _0808B162 -_0808B0DE: - ldr r6, _0808B148 @ =gPlayerEntity - ldrb r0, [r6, #0x14] - movs r1, #0xe - ands r1, r0 - ldr r0, _0808B14C @ =gUnk_08126EE4 - adds r1, r1, r0 - mov r2, sp - movs r0, #0 - ldrsb r0, [r1, r0] - ldrh r3, [r6, #0x2e] - adds r0, r0, r3 - strh r0, [r2, #0x2e] - movs r0, #1 - ldrsb r0, [r1, r0] - ldrh r1, [r6, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] - mov r0, sp - adds r1, r5, #0 - movs r2, #7 - movs r3, #7 - bl sub_0800419C - cmp r0, #0 - beq _0808B154 - ldrb r0, [r6, #0xc] - cmp r0, #1 - bne _0808B162 - ldr r4, _0808B150 @ =gPlayerState - adds r0, r4, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, #0 - bne _0808B162 - movs r0, #0x1b - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x38 - strb r7, [r0] - ldrb r0, [r5, #0x15] - movs r1, #0x10 - eors r0, r1 - adds r1, r4, #0 - adds r1, #0x39 - strb r0, [r1] - ldr r0, [r5, #0x50] - adds r1, r6, #0 - bl sub_0808B1F0 - adds r1, r4, #0 - adds r1, #0x3a - strb r0, [r1] - b _0808B162 - .align 2, 0 -_0808B148: .4byte gPlayerEntity -_0808B14C: .4byte gUnk_08126EE4 -_0808B150: .4byte gPlayerState -_0808B154: - movs r0, #0x40 - strh r0, [r5, #0x24] - cmp r7, #0x3f - bhi _0808B162 - adds r0, r5, #0 - bl LinearMoveUpdate -_0808B162: - add sp, #0x88 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/pullableMushroom/sub_0808B168.inc b/asm/non_matching/pullableMushroom/sub_0808B168.inc deleted file mode 100644 index 81551053..00000000 --- a/asm/non_matching/pullableMushroom/sub_0808B168.inc +++ /dev/null @@ -1,68 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r3, r0, #0 - cmp r1, #0 - beq _0808B188 - ldrb r0, [r3, #0x14] - movs r1, #2 - eors r1, r0 - lsls r1, r1, #1 - ldr r0, _0808B184 @ =gUnk_081211F4 - adds r2, r1, r0 - adds r1, r2, #1 - ldr r4, [r3, #0x50] - adds r5, r4, #0 - b _0808B1CE - .align 2, 0 -_0808B184: .4byte gUnk_081211F4 -_0808B188: - ldrb r1, [r3, #0x14] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0808B1B8 - ldr r5, _0808B1AC @ =gPlayerEntity - ldr r4, [r3, #0x50] - ldrb r1, [r3, #0x14] - lsls r2, r1, #1 - ldr r0, _0808B1B0 @ =gUnk_081211FC - adds r2, r2, r0 - movs r0, #2 - eors r1, r0 - lsls r1, r1, #1 - ldr r0, _0808B1B4 @ =gUnk_081211F5 - adds r1, r1, r0 - b _0808B1CE - .align 2, 0 -_0808B1AC: .4byte gPlayerEntity -_0808B1B0: .4byte gUnk_081211FC -_0808B1B4: .4byte gUnk_081211F4+1 -_0808B1B8: - ldr r5, [r3, #0x50] - ldr r4, _0808B1E4 @ =gPlayerEntity - movs r0, #2 - eors r0, r1 - lsls r0, r0, #1 - ldr r1, _0808B1E8 @ =gUnk_081211F4 - adds r2, r0, r1 - ldrb r0, [r3, #0x14] - lsls r0, r0, #1 - ldr r1, _0808B1EC @ =gUnk_081211FD - adds r1, r0, r1 -_0808B1CE: - movs r0, #0 - ldrsb r0, [r2, r0] - ldrh r5, [r5, #0x2e] - adds r0, r0, r5 - strh r0, [r3, #0x2e] - movs r0, #0 - ldrsb r0, [r1, r0] - ldrh r4, [r4, #0x32] - adds r0, r0, r4 - strh r0, [r3, #0x32] - pop {r4, r5, pc} - .align 2, 0 -_0808B1E4: .4byte gPlayerEntity -_0808B1E8: .4byte gUnk_081211F4 -_0808B1EC: .4byte gUnk_081211FC+1 - .syntax divided diff --git a/src/object/pullableMushroom.c b/src/object/pullableMushroom.c index 9a878236..0a136c3e 100644 --- a/src/object/pullableMushroom.c +++ b/src/object/pullableMushroom.c @@ -23,27 +23,36 @@ typedef struct { extern const Hitbox gUnk_080FD224; extern const u8 gUnk_08126EE4[]; -extern void (*const gUnk_081211A4[])(PullableMushroomEntity*); -extern void (*const gUnk_081211B4[])(PullableMushroomEntity*); -extern void (*const gUnk_081211C0[])(PullableMushroomEntity*); -extern const u16 gUnk_081211CC[]; -extern void (*const gUnk_081211DC[])(PullableMushroomEntity*); -extern const u16 gUnk_081211E4[]; -extern void (*const gUnk_081211EC[])(PullableMushroomEntity*); -extern const u8 gUnk_081211F4[]; -extern const u8 gUnk_081211FC[]; - -void sub_0808AB68(PullableMushroomEntity*); +void PullableMushroom_Init(PullableMushroomEntity*); +void PullableMushroom_Action1(PullableMushroomEntity*); +void PullableMushroom_Action2(PullableMushroomEntity*); +void PullableMushroom_Action3(PullableMushroomEntity*); +void PullableMushroom_Action1_Type0(PullableMushroomEntity*); +void PullableMushroom_Action1_Type1(PullableMushroomEntity*); +void sub_0808ABC4(PullableMushroomEntity*); +void sub_0808ACEC(PullableMushroomEntity*); +void sub_0808ADA0(PullableMushroomEntity*); +void sub_0808ADF0(PullableMushroomEntity*); +void sub_0808AEB0(PullableMushroomEntity*); +void sub_0808AFD4(PullableMushroomEntity*); +void sub_0808B05C(PullableMushroomEntity*); +void sub_0808B0BC(PullableMushroomEntity*); void sub_0808B168(PullableMushroomEntity*, u32); u32 sub_0808B1F0(PullableMushroomEntity*, Entity*); bool32 sub_0808B21C(PullableMushroomEntity*, u32); void PullableMushroom(PullableMushroomEntity* this) { - gUnk_081211A4[super->action](this); + static void (*const PullableMushroom_Actions[])(PullableMushroomEntity*) = { + PullableMushroom_Init, + PullableMushroom_Action1, + PullableMushroom_Action2, + PullableMushroom_Action3, + }; + PullableMushroom_Actions[super->action](this); super->bitfield = 0; } -void sub_0808AA1C(PullableMushroomEntity* this) { +void PullableMushroom_Init(PullableMushroomEntity* this) { super->action = 1; if (AreaIsDungeon() == 0) { ChangeObjPalette(super, 0); @@ -88,18 +97,28 @@ void sub_0808AA1C(PullableMushroomEntity* this) { } break; } - sub_0808AB68(this); + PullableMushroom_Action1(this); } -void sub_0808AB68(PullableMushroomEntity* this) { - gUnk_081211B4[super->type](this); +void PullableMushroom_Action1(PullableMushroomEntity* this) { + static void (*const funcs[])(PullableMushroomEntity*) = { + PullableMushroom_Action1_Type0, + PullableMushroom_Action1_Type1, + sub_0808ABC4, + }; + funcs[super->type](this); } -void sub_0808AB80(PullableMushroomEntity* this) { - gUnk_081211C0[super->subAction](this); +void PullableMushroom_Action1_Type0(PullableMushroomEntity* this) { + static void (*const funcs[])(PullableMushroomEntity*) = { + sub_0808ACEC, + sub_0808ADA0, + sub_0808ADF0, + }; + funcs[super->subAction](this); } -void sub_0808AB98(PullableMushroomEntity* this) { +void PullableMushroom_Action1_Type1(PullableMushroomEntity* this) { if (*(u16*)&super->parent->action == 0x201) { super->parent->child = NULL; DeleteThisEntity(); @@ -108,9 +127,45 @@ void sub_0808AB98(PullableMushroomEntity* this) { } } +const u16 gUnk_081211CC[] = { 32768, 64000, 0, 64517, 0, 0, 32768, 64763 }; ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808ABC4.inc", void sub_0808ABC4(PullableMushroomEntity* this)) -ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808ACEC.inc", void sub_0808ACEC(PullableMushroomEntity* this)) +void sub_0808ACEC(PullableMushroomEntity* this) { + if (super->animIndex != 0) { + InitializeAnimation(super, 0); + } + + switch (super->bitfield & 0x7f) { + case 0x4: + case 0x5: + case 0x6: + case 0x8: + case 0x9: + case 0xa: + case 0xb: + case 0xc: + case 0xd: + case 0x10: + case 0x11: + case 0x12: + case 0x14: + case 0x16: + COLLISION_OFF(super); + super->animationState = sub_0806F5A4(super->knockbackDirection); + super->subAction = 2; + super->actionDelay = 2; + break; + case 0x13: + super->action = 3; + super->subAction = 0; + break; + default: + super->field_0xf = 0; + super->actionDelay = 0; + sub_08078930(super); + break; + } +} void sub_0808ADA0(PullableMushroomEntity* this) { if ((sub_0808B1F0(this, super->child) < 8) || (super->child == NULL)) { @@ -151,14 +206,19 @@ void sub_0808ADF0(PullableMushroomEntity* this) { } } -void sub_0808AE84(PullableMushroomEntity* this) { +void PullableMushroom_Action2(PullableMushroomEntity* this) { + static void (*const funcs[])(PullableMushroomEntity*) = { + sub_0808AEB0, + sub_0808AFD4, + }; if (gPlayerState.heldObject == 0) { super->subAction = 6; } - gUnk_081211DC[super->subAction - 5](this); + funcs[super->subAction - 5](this); } void sub_0808AEB0(PullableMushroomEntity* this) { + static const u16 gUnk_081211E4[] = { 1024, 256, 2048, 512 }; u32 uVar1; if (super->actionDelay != 0) { uVar1 = sub_0808B1F0(this, super->child); @@ -208,8 +268,13 @@ void sub_0808AFD4(PullableMushroomEntity* this) { SoundReq(SFX_130); } -void sub_0808AFF0(PullableMushroomEntity* this) { - gUnk_081211EC[super->subAction](this); +void PullableMushroom_Action3(PullableMushroomEntity* this) { + static void (*const funcs[])(PullableMushroomEntity*) = { + sub_0808B05C, + sub_0808B0BC, + }; + + funcs[super->subAction](this); if ((((gPlayerState.field_0x1c & 0xf) != 1) || ((super->bitfield & 0x7f) != 0x13)) && (super->type == 1)) { (super->parent)->action = 1; (super->parent)->subAction = 1; @@ -235,10 +300,73 @@ void sub_0808B05C(PullableMushroomEntity* this) { super->subAction++; } -ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808B0BC.inc", void sub_0808B0BC(PullableMushroomEntity* this)) +void sub_0808B0BC(PullableMushroomEntity* this) { + u32 uVar2; + const s8* ptr; + GenericEntity ent; -ASM_FUNC("asm/non_matching/pullableMushroom/sub_0808B168.inc", - void sub_0808B168(PullableMushroomEntity* this, u32 param_2)) + uVar2 = sub_0808B1F0(this, super->parent); + switch (super->type) { + case 0: + GetNextFrame(super); + break; + case 1: + ptr = &gUnk_08126EE4[gPlayerEntity.animationState & 0xe]; + ent.base.x.HALF.HI = ptr[0] + gPlayerEntity.x.HALF.HI; + ent.base.y.HALF.HI = ptr[1] + gPlayerEntity.y.HALF.HI; + if (sub_0800419C(&ent.base, super, 7, 7)) { + if ((gPlayerEntity.action != 1) || (gPlayerState.swim_state != 0)) + return; + gPlayerState.queued_action = 0x1b; + gPlayerState.field_0x38 = uVar2; + gPlayerState.field_0x39 = super->direction ^ 0x10; + gPlayerState.field_0x3a = sub_0808B1F0((PullableMushroomEntity*)super->parent, &gPlayerEntity); + } else { + super->speed = 0x40; + if (uVar2 < 0x40) { + LinearMoveUpdate(super); + } + } + break; + } +} + +void sub_0808B168(PullableMushroomEntity* this, u32 param_2) { + static const s8 gUnk_081211F4[] = { + 0, 8, -8, -4, 0, -8, 8, -4, + }; + static const s8 gUnk_081211FC[] = { + 0, 3, -8, -4, 0, -12, 8, -4, + }; + s32 iVar2; + const s8* pcVar3; + u32 uVar4; + const s8* pcVar5; + Entity* pEVar5; + Entity* pEVar6; + + if (param_2 != 0) { + iVar2 = (super->animationState ^ 2) * 2; + pcVar5 = (gUnk_081211F4 + iVar2); + pcVar3 = pcVar5 + 1; + pEVar5 = super->parent; + pEVar6 = pEVar5; + } else { + if ((super->animationState & 1) != 0) { + pEVar6 = &gPlayerEntity; + pEVar5 = super->parent; + pcVar5 = (gUnk_081211FC + super->animationState * 2); + pcVar3 = (gUnk_081211F4 + 1 + (super->animationState ^ 2) * 2); + } else { + pEVar6 = super->parent; + pEVar5 = &gPlayerEntity; + pcVar5 = (gUnk_081211F4 + (super->animationState ^ 2) * 2); + pcVar3 = (gUnk_081211FC + 1 + super->animationState * 2); + } + } + super->x.HALF.HI = *pcVar5 + pEVar6->x.HALF.HI; + super->y.HALF.HI = *pcVar3 + pEVar5->y.HALF.HI; +} u32 sub_0808B1F0(PullableMushroomEntity* this, Entity* other) { s32 sVar1; @@ -281,36 +409,3 @@ bool32 sub_0808B21C(PullableMushroomEntity* this, u32 param_2) { } return FALSE; } - -void (*const gUnk_081211A4[])(PullableMushroomEntity*) = { - sub_0808AA1C, - sub_0808AB68, - sub_0808AE84, - sub_0808AFF0, -}; -void (*const gUnk_081211B4[])(PullableMushroomEntity*) = { - sub_0808AB80, - sub_0808AB98, - sub_0808ABC4, -}; -void (*const gUnk_081211C0[])(PullableMushroomEntity*) = { - sub_0808ACEC, - sub_0808ADA0, - sub_0808ADF0, -}; -const u16 gUnk_081211CC[] = { 32768, 64000, 0, 64517, 0, 0, 32768, 64763 }; -void (*const gUnk_081211DC[])(PullableMushroomEntity*) = { - sub_0808AEB0, - sub_0808AFD4, -}; -const u16 gUnk_081211E4[] = { 1024, 256, 2048, 512 }; -void (*const gUnk_081211EC[])(PullableMushroomEntity*) = { - sub_0808B05C, - sub_0808B0BC, -}; -const u8 gUnk_081211F4[] = { - 0, 8, 248, 252, 0, 248, 8, 252, -}; -const u8 gUnk_081211FC[] = { - 0, 3, 248, 252, 0, 244, 8, 252, -};