diff --git a/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc b/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc deleted file mode 100644 index 4eb27cb8..00000000 --- a/asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc +++ /dev/null @@ -1,267 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #7 - bls _0809C5D0 - b _0809C7DE -_0809C5D0: - lsls r0, r0, #2 - ldr r1, _0809C5DC @ =_0809C5E0 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C5DC: .4byte _0809C5E0 -_0809C5E0: @ jump table - .4byte _0809C738 @ case 0 - .4byte _0809C600 @ case 1 - .4byte _0809C600 @ case 2 - .4byte _0809C600 @ case 3 - .4byte _0809C600 @ case 4 - .4byte _0809C6B8 @ case 5 - .4byte _0809C7B4 @ case 6 - .4byte _0809C7D2 @ case 7 -_0809C600: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl SortEntityBelow - ldr r0, [r5, #0x50] - ldrb r0, [r0, #0xd] - adds r6, r5, #0 - adds r6, #0x84 - cmp r0, #6 - bne _0809C630 - movs r0, #0xf - ldrsb r0, [r5, r0] - cmp r0, #0 - bge _0809C624 - ldr r0, [r6] - ldrb r0, [r0] - rsbs r0, r0, #0 - b _0809C628 -_0809C624: - ldr r0, [r6] - ldrb r0, [r0] -_0809C628: - strb r0, [r5, #0xf] - adds r0, r5, #0 - bl sub_0809CBE4 -_0809C630: - ldr r4, [r5, #0x50] - adds r0, r4, #0 - adds r0, #0x76 - ldrh r1, [r0] - movs r0, #0x80 - lsls r0, r0, #9 - bl __divsi3 - adds r3, r0, #0 - lsls r0, r3, #0xd - lsrs r3, r0, #8 - ldr r0, _0809C660 @ =0xFFFFE000 - adds r3, r3, r0 - ldr r0, [r6] - ldr r0, [r0, #8] - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #1 - bne _0809C664 - movs r1, #0x88 - lsls r1, r1, #6 - adds r3, r3, r1 - b _0809C66C - .align 2, 0 -_0809C660: .4byte 0xFFFFE000 -_0809C664: - lsrs r0, r3, #1 - movs r1, #0x88 - lsls r1, r1, #6 - adds r3, r0, r1 -_0809C66C: - adds r2, r4, #0 - adds r2, #0x7b - ldr r1, _0809C6B0 @ =gUnk_08123E18 - ldrb r0, [r5, #0xa] - subs r0, #1 - adds r0, r0, r1 - ldrb r0, [r0] - ldrb r2, [r2] - adds r0, r0, r2 - rsbs r0, r0, #0 - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - adds r0, r5, #0 - adds r2, r3, #0 - bl sub_0809CB70 - ldr r2, [r5, #0x50] - adds r2, #0x7b - ldr r1, _0809C6B4 @ =gUnk_08123E1C - ldrb r0, [r5, #0xa] - subs r0, #1 - adds r0, r0, r1 - ldrb r1, [r0] - ldrb r2, [r2] - adds r1, r1, r2 - adds r0, r5, #0 - adds r0, #0x79 - ldrb r0, [r0] - adds r0, r0, r1 - adds r1, r5, #0 - adds r1, #0x7b - strb r0, [r1] - b _0809C7BC - .align 2, 0 -_0809C6B0: .4byte gUnk_08123E18 -_0809C6B4: .4byte gUnk_08123E1C -_0809C6B8: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl SortEntityBelow - ldr r0, [r5, #0x50] - ldrb r0, [r0, #0xd] - adds r6, r5, #0 - adds r6, #0x79 - adds r7, r5, #0 - adds r7, #0x76 - cmp r0, #4 - beq _0809C6F6 - adds r0, r5, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #1 - beq _0809C6F6 - ldrb r0, [r6] - cmp r0, #0x1c - bls _0809C6E4 - subs r0, #1 - strb r0, [r6] -_0809C6E4: - ldrh r0, [r7] - movs r1, #0x80 - lsls r1, r1, #1 - cmp r0, r1 - bls _0809C6F4 - subs r0, #1 - strh r0, [r7] - b _0809C6F6 -_0809C6F4: - strh r1, [r7] -_0809C6F6: - ldr r4, [r5, #0x50] - adds r0, r4, #0 - adds r0, #0x74 - ldrh r1, [r0] - movs r0, #0x80 - lsls r0, r0, #9 - bl __divsi3 - adds r3, r0, #0 - ldrb r0, [r6] - lsls r0, r0, #8 - muls r0, r3, r0 - lsrs r3, r0, #8 - adds r4, #0x7b - ldrb r0, [r4] - adds r0, #0x80 - rsbs r0, r0, #0 - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - adds r0, r5, #0 - adds r2, r3, #0 - bl sub_0809CB70 - ldr r0, [r5, #0x50] - adds r0, #0x7b - ldrb r0, [r0] - adds r1, r5, #0 - adds r1, #0x7b - strb r0, [r1] - ldrh r1, [r7] - adds r0, r5, #0 - adds r0, #0x74 - b _0809C7C4 -_0809C738: - movs r0, #0x37 - bl CheckFlags - cmp r0, #0 - beq _0809C74A - adds r0, r5, #0 - movs r1, #0x1e - bl RequestPriorityDuration -_0809C74A: - ldr r1, _0809C7A8 @ =FrozenOctorok_Action1SubActions - ldrb r0, [r5, #0xd] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - ldrb r0, [r5, #0xf] - cmp r0, #0 - beq _0809C7BC - ldr r0, _0809C7AC @ =gRoomTransition - ldr r0, [r0] - movs r1, #7 - ands r0, r1 - cmp r0, #0 - bne _0809C772 - ldr r0, [r5, #0x54] - bl CreateSparkle -_0809C772: - adds r3, r5, #0 - adds r3, #0x7e - ldrh r0, [r3] - cmp r0, #0 - beq _0809C7BC - ldr r2, [r5, #0x54] - movs r1, #0 - ldrsh r0, [r3, r1] - ldr r1, [r2, #0x20] - subs r1, r1, r0 - str r1, [r2, #0x20] - ldr r0, [r2, #0x34] - adds r0, r0, r1 - str r0, [r2, #0x34] - ldr r0, [r5, #0x54] - ldr r1, [r0, #0x20] - movs r0, #0xc0 - lsls r0, r0, #6 - cmp r1, r0 - beq _0809C7A0 - ldr r0, _0809C7B0 @ =0xFFFFD000 - cmp r1, r0 - bne _0809C7BC -_0809C7A0: - ldrh r0, [r3] - rsbs r0, r0, #0 - strh r0, [r3] - b _0809C7BC - .align 2, 0 -_0809C7A8: .4byte FrozenOctorok_Action1SubActions -_0809C7AC: .4byte gRoomTransition -_0809C7B0: .4byte 0xFFFFD000 -_0809C7B4: - ldr r0, [r5, #0x50] - adds r1, r5, #0 - bl CopyPosition -_0809C7BC: - adds r0, r5, #0 - adds r0, #0x76 - ldrh r1, [r0] - subs r0, #2 -_0809C7C4: - ldrh r2, [r0] - adds r0, #6 - ldrh r3, [r0] - adds r0, r5, #0 - bl SetAffineInfo - b _0809C7DE -_0809C7D2: - ldr r0, _0809C7E0 @ =gRoomControls - ldr r0, [r0, #0x30] - cmp r0, r5 - beq _0809C7DE - bl DeleteThisEntity -_0809C7DE: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0809C7E0: .4byte gRoomControls - .syntax divided diff --git a/src/object/frozenOctorok.c b/src/object/frozenOctorok.c index fe537c4b..7805839c 100644 --- a/src/object/frozenOctorok.c +++ b/src/object/frozenOctorok.c @@ -40,6 +40,8 @@ void FrozenOctorok_ChangeObjPaletteOfChildren(FrozenOctorokEntity*, u32); void sub_0809CBE4(FrozenOctorokEntity*); void sub_0809CB70(FrozenOctorokEntity*, s32, s32); +extern const u8 gUnk_08123E1C[]; + void FrozenOctorok(FrozenOctorokEntity* this) { static void (*const FrozenOctorok_Actions[])(FrozenOctorokEntity*) = { FrozenOctorok_Init, @@ -162,8 +164,87 @@ const u8 gUnk_08123E1C[] = { 128, }; -ASM_FUNC("asm/non_matching/frozenOctorok/FrozenOctorok_Action1.inc", - void FrozenOctorok_Action1(FrozenOctorokEntity* this)) +void FrozenOctorok_Action1(FrozenOctorokEntity* this) { + u32 tmp1; + u32 tmp2; + + switch (super->type) { + case 1: + case 2: + case 3: + case 4: + SortEntityBelow(super->parent, super); + if (super->parent->subAction == 6) { + if ((s8)super->subtimer < 0) { + super->subtimer = -this->heap->unk_0; + } else { + super->subtimer = this->heap->unk_0; + } + sub_0809CBE4(this); + } + tmp1 = 0x10000 / (((FrozenOctorokEntity*)super->parent)->unk_76); + tmp1 = ((tmp1 << 0xd) >> 8); + tmp1 -= 0x2000; + if (this->heap->mouthObject->base.health == 1) { + tmp1 = 0x2200 + tmp1; + } else { + tmp1 = (tmp1 >> 1) + 0x2200; + } + tmp2 = (u8) - (((FrozenOctorokEntity*)super->parent)->unk_7b + gUnk_08123E18[super->type - 1]); + sub_0809CB70(this, tmp2, tmp1); + this->unk_7b = + ((FrozenOctorokEntity*)super->parent)->unk_7b + gUnk_08123E1C[super->type - 1] + this->unk_79; + SetAffineInfo(super, this->unk_76, this->unk_74, *(u16*)&this->unk_7a); + break; + case 5: + SortEntityBelow(super->parent, super); + if ((super->parent->subAction != 4) && (super->health != 1)) { + if (0x1c < this->unk_79) { + this->unk_79--; + } + if (this->unk_76 > 0x100) { + this->unk_76--; + } else { + this->unk_76 = 0x100; + } + } + tmp1 = (0x10000 / ((FrozenOctorokEntity*)super->parent)->unk_74); + tmp1 = ((this->unk_79 << 8) * tmp1 >> 8); + tmp2 = (u8) - (((FrozenOctorokEntity*)super->parent)->unk_7b + 0x80); + sub_0809CB70(this, tmp2, tmp1); + this->unk_7b = ((FrozenOctorokEntity*)super->parent)->unk_7b; + SetAffineInfo(super, this->unk_76, this->unk_74, *(u16*)&this->unk_7a); + return; + case 0: + if (CheckFlags(OUGONTEKI_G)) { + RequestPriorityDuration(super, 0x1e); + } + FrozenOctorok_Action1SubActions[super->subAction](this); + if (super->subtimer != 0) { + if ((gRoomTransition.frameCount & 7) == 0) { + CreateSparkle(super->child); + } + if (this->unk_7e != 0) { + super->child->zVelocity = super->child->zVelocity - (s16)this->unk_7e; + super->child->z.WORD += super->child->zVelocity; + if (((super->child)->zVelocity == 0x3000) || ((super->child)->zVelocity == -0x3000)) { + this->unk_7e = -this->unk_7e; + } + } + } + SetAffineInfo(super, this->unk_76, this->unk_74, *(u16*)&this->unk_7a); + break; + case 6: + CopyPosition(super->parent, super); + SetAffineInfo(super, this->unk_76, this->unk_74, *(u16*)&this->unk_7a); + break; + case 7: + if (gRoomControls.camera_target != super) { + DeleteThisEntity(); + } + break; + } +} void FrozenOctorok_Action1SubAction0(FrozenOctorokEntity* this) { Entity* child;