diff --git a/asm/vaatiRebornEnemy.s b/asm/vaatiRebornEnemy.s index c7df101b..d2092068 100644 --- a/asm/vaatiRebornEnemy.s +++ b/asm/vaatiRebornEnemy.s @@ -7,180 +7,6 @@ .text - thumb_func_start sub_0803D408 -sub_0803D408: @ 0x0803D408 - push {r4, r5, lr} - adds r4, r0, #0 - adds r2, r4, #0 - adds r2, #0x74 - ldrb r0, [r2] - cmp r0, #1 - beq _0803D458 - cmp r0, #1 - bgt _0803D420 - cmp r0, #0 - beq _0803D42A - b _0803D558 -_0803D420: - cmp r0, #2 - beq _0803D478 - cmp r0, #3 - beq _0803D4FC - b _0803D558 -_0803D42A: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _0803D438 - b _0803D558 -_0803D438: - ldrb r0, [r2] - adds r0, #1 - strb r0, [r2] - movs r0, #0x20 - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #3 - bl InitAnimationForceUpdate - ldr r0, _0803D454 @ =0x0000019B - bl SoundReq - b _0803D558 - .align 2, 0 -_0803D454: .4byte 0x0000019B -_0803D458: - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803D558 - movs r0, #2 - strb r0, [r2] - ldrb r1, [r4, #0x18] - subs r0, #6 - ands r0, r1 - strb r0, [r4, #0x18] - movs r0, #0x10 - strb r0, [r4, #0xe] - b _0803D558 -_0803D478: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803D558 - ldrb r0, [r2] - adds r0, #1 - strb r0, [r2] - adds r0, r4, #0 - bl sub_0803E028 - cmp r0, #0 - bne _0803D4D0 - bl Random - adds r5, r4, #0 - adds r5, #0x81 - ldrb r1, [r5] - adds r1, #1 - movs r2, #3 - ands r0, r2 - adds r1, r1, r0 - strb r1, [r5] - ldrb r0, [r5] - movs r1, #5 - bl __modsi3 - strb r0, [r5] - ldrb r1, [r5] - lsls r1, r1, #2 - ldr r0, _0803D4F4 @ =gUnk_080D04AC - adds r1, r1, r0 - ldr r2, _0803D4F8 @ =gRoomControls - ldrh r0, [r1] - ldrh r3, [r2, #6] - adds r0, r0, r3 - adds r0, #0x10 - strh r0, [r4, #0x2e] - ldrh r0, [r1, #2] - ldrh r2, [r2, #8] - adds r0, r0, r2 - adds r0, #0x10 - strh r0, [r4, #0x32] -_0803D4D0: - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #0x20 - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #4 - bl InitAnimationForceUpdate - movs r0, #0xf5 - bl SoundReq - b _0803D558 - .align 2, 0 -_0803D4F4: .4byte gUnk_080D04AC -_0803D4F8: .4byte gRoomControls -_0803D4FC: - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803D558 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x81 - ldrb r0, [r0] - cmp r0, #4 - bls _0803D52E - ldr r1, _0803D544 @ =gPlayerEntity - ldrh r0, [r1, #0x2e] - strh r0, [r4, #0x2e] - ldrh r0, [r1, #0x32] - subs r0, #0x18 - strh r0, [r4, #0x32] -_0803D52E: - adds r1, r4, #0 - adds r1, #0x77 - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803D548 - movs r0, #1 - strb r0, [r4, #0xc] - b _0803D54E - .align 2, 0 -_0803D544: .4byte gPlayerEntity -_0803D548: - movs r0, #0 - strb r0, [r2] - movs r0, #0x10 -_0803D54E: - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #0 - bl InitAnimationForceUpdate -_0803D558: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - pop {r4, r5, pc} - thumb_func_start sub_0803D560 sub_0803D560: @ 0x0803D560 push {r4, lr} diff --git a/src/enemy/vaatiRebornEnemy.c b/src/enemy/vaatiRebornEnemy.c index 272fbb00..7ab2d240 100644 --- a/src/enemy/vaatiRebornEnemy.c +++ b/src/enemy/vaatiRebornEnemy.c @@ -6,6 +6,7 @@ #include "audio.h" #include "functions.h" +extern u32 __modsi3(u32, u32); extern void sub_080AEFB4(Entity*); extern u8 gEntCount; @@ -51,7 +52,7 @@ void (*const gUnk_080D04A0[])(Entity*) = { }; extern const xy gUnk_080D04A8[]; -extern const u16 gUnk_080D04AC[]; +extern const Coords gUnk_080D04AC[]; void VaatiRebornEnemy(Entity* this) { switch (this->type) { @@ -206,3 +207,59 @@ void sub_0803D264(Entity* this) { } UpdateAnimationSingleFrame(this); } + +void sub_0803D408(Entity* this) { + const Coords* ptr; + + switch (this->field_0x74.HALF.LO) { + case 0: + if (--this->actionDelay == 0) { + this->field_0x74.HALF.LO++; + this->actionDelay = 0x20; + InitAnimationForceUpdate(this, 3); + SoundReq(SFX_19B); + } + break; + case 1: + if ((this->frames.all & 0x80) != 0) { + this->field_0x74.HALF.LO = 2; + this->spriteSettings.b.draw = 0; + this->actionDelay = 0x10; + } + break; + case 2: + if (--this->actionDelay == 0) { + this->field_0x74.HALF.LO++; + if (sub_0803E028(this) == 0) { + this->field_0x80.HALF.HI += 1 + (Random() & 3); + this->field_0x80.HALF.HI = __modsi3(this->field_0x80.HALF.HI, 5); + ptr = &gUnk_080D04AC[this->field_0x80.HALF.HI]; + this->x.HALF.HI = gRoomControls.roomOriginX + ptr->HALF.x + 0x10; + this->y.HALF.HI = gRoomControls.roomOriginY + ptr->HALF.y + 0x10; + } + this->spriteSettings.b.draw = 1; + this->actionDelay = 0x20; + InitAnimationForceUpdate(this, 4); + SoundReq(SFX_F5); + } + break; + case 3: + if ((this->frames.all & 0x80) != 0) { + this->spriteSettings.b.draw = 1; + if (4 < this->field_0x80.HALF.HI) { + this->x.HALF.HI = gPlayerEntity.x.HALF.HI; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI - 0x18; + } + if (--this->field_0x76.HALF.HI == 0) { + this->action = 1; + this->actionDelay = 1; + } else { + this->field_0x74.HALF.LO = 0; + this->actionDelay = 0x10; + } + InitAnimationForceUpdate(this, 0); + } + break; + } + UpdateAnimationSingleFrame(this); +}