diff --git a/asm/keese.s b/asm/keese.s index 0fd55b50..f1035924 100644 --- a/asm/keese.s +++ b/asm/keese.s @@ -6,252 +6,6 @@ .text - - thumb_func_start Keese -Keese: @ 0x08021D64 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r4, _08021D7C @ =gUnk_080CB69C - bl GetNextFunction - lsls r0, r0, #2 - adds r0, r0, r4 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - pop {r4, r5, pc} - .align 2, 0 -_08021D7C: .4byte gUnk_080CB69C - - thumb_func_start sub_08021D80 -sub_08021D80: @ 0x08021D80 - push {lr} - ldr r2, _08021D94 @ =gUnk_080CB6B4 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08021D94: .4byte gUnk_080CB6B4 - - thumb_func_start sub_08021D98 -sub_08021D98: @ 0x08021D98 - push {lr} - ldr r1, _08021DA4 @ =gUnk_080CB69C - bl sub_0804AA30 - pop {pc} - .align 2, 0 -_08021DA4: .4byte gUnk_080CB69C - - thumb_func_start sub_08021DA8 -sub_08021DA8: @ 0x08021DA8 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F520 - cmp r0, #0 - beq _08021DC4 - ldr r0, _08021DC8 @ =gUnk_080CB6C4 - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 -_08021DC4: - pop {r4, pc} - .align 2, 0 -_08021DC8: .4byte gUnk_080CB6C4 - - thumb_func_start sub_08021DCC -sub_08021DCC: @ 0x08021DCC - movs r1, #2 - strb r1, [r0, #0xd] - bx lr - .align 2, 0 - - thumb_func_start sub_08021DD4 -sub_08021DD4: @ 0x08021DD4 - push {lr} - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_08021DDC -sub_08021DDC: @ 0x08021DDC - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _08021DEE - adds r0, r4, #0 - bl sub_0804A7D4 -_08021DEE: - pop {r4, pc} - - thumb_func_start sub_08021DF0 -sub_08021DF0: @ 0x08021DF0 - push {r4, lr} - adds r4, r0, #0 - bl sub_0804A720 - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _08021E14 - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #8 - orrs r0, r1 - strb r0, [r2] - ldr r0, _08021E48 @ =0x0000FFF0 - strh r0, [r4, #0x36] -_08021E14: - bl Random - movs r1, #0x1f - ands r0, r1 - strb r0, [r4, #0x15] - movs r0, #1 - strb r0, [r4, #0x1c] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #9 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #3 - strb r0, [r1] - adds r0, r4, #0 - bl UpdateSpriteOrderAndFlip - adds r0, r4, #0 - bl sub_08021EF0 - pop {r4, pc} - .align 2, 0 -_08021E48: .4byte 0x0000FFF0 - - thumb_func_start sub_08021E4C -sub_08021E4C: @ 0x08021E4C - push {r4, r5, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x78 - ldrh r0, [r1] - cmp r0, #0 - beq _08021E5E - subs r0, #1 - strh r0, [r1] -_08021E5E: - adds r1, r4, #0 - adds r1, #0x7a - ldrh r0, [r1] - cmp r0, #0 - beq _08021E6C - subs r0, #1 - strh r0, [r1] -_08021E6C: - adds r0, r4, #0 - bl sub_08004274 - adds r2, r4, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #0x80 - ands r0, r1 - adds r5, r2, #0 - cmp r0, #0 - beq _08021E8A - adds r0, r4, #0 - bl sub_08021F24 - b _08021E90 -_08021E8A: - adds r0, r4, #0 - bl sub_080AEFB4 -_08021E90: - ldr r1, _08021EA0 @ =gUnk_080CB6D0 - ldrb r0, [r5] - adds r0, r0, r1 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x63 - strb r1, [r0] - pop {r4, r5, pc} - .align 2, 0 -_08021EA0: .4byte gUnk_080CB6D0 - - thumb_func_start sub_08021EA4 -sub_08021EA4: @ 0x08021EA4 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08021EBA - adds r0, r1, #0 - bl sub_08021EF0 -_08021EBA: - pop {pc} - - thumb_func_start sub_08021EBC -sub_08021EBC: @ 0x08021EBC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08021ECC - subs r0, #1 - strb r0, [r4, #0xe] - b _08021EE8 -_08021ECC: - ldr r0, _08021EEC @ =gLinkEntity - movs r2, #0x2e - ldrsh r1, [r0, r2] - movs r3, #0x32 - ldrsh r2, [r0, r3] - adds r0, r4, #0 - movs r3, #0x70 - bl sub_0806FCB8 - cmp r0, #0 - beq _08021EE8 - adds r0, r4, #0 - bl sub_08021EF0 -_08021EE8: - pop {r4, pc} - .align 2, 0 -_08021EEC: .4byte gLinkEntity - - thumb_func_start sub_08021EF0 -sub_08021EF0: @ 0x08021EF0 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - bl Random - ldr r2, _08021F20 @ =gUnk_080CB6D6 - movs r1, #0xf - ands r1, r0 - lsls r1, r1, #1 - adds r1, r1, r2 - ldrh r1, [r1] - adds r0, r4, #0 - adds r0, #0x78 - strh r1, [r0] - adds r1, r4, #0 - adds r1, #0x7a - movs r0, #0x3c - strh r0, [r1] - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation - pop {r4, pc} - .align 2, 0 -_08021F20: .4byte gUnk_080CB6D6 - thumb_func_start sub_08021F24 sub_08021F24: @ 0x08021F24 push {r4, lr} diff --git a/include/enemy.h b/include/enemy.h index 25cc5529..95ed484a 100644 --- a/include/enemy.h +++ b/include/enemy.h @@ -4,6 +4,8 @@ #include "global.h" #include "entity.h" +extern u32 GetNextFunction(Entity*); + extern void Octorok(Entity*); extern void Chuchu(Entity*); extern void Leever(Entity*); diff --git a/include/entity.h b/include/entity.h index 69107ed6..a22c4176 100644 --- a/include/entity.h +++ b/include/entity.h @@ -80,7 +80,8 @@ typedef struct Entity { u8 spriteAnimation[3]; struct { u8 b0 : 3; - u8 b1 : 5; + u8 b1 : 3; + u8 b2 : 2; } PACKED ticks; u16 collisions; union SplitWord x; @@ -135,7 +136,7 @@ typedef struct Entity { u8 field_0x6d; u8 filler4[6]; u32* heldObjectPtr; - u8 filler3[2]; + u16 field_0x78; u16 itemCooldown; u32 field_0x7c; u16 field_0x80; diff --git a/linker.ld b/linker.ld index f6780d1e..79be23a4 100644 --- a/linker.ld +++ b/linker.ld @@ -327,6 +327,7 @@ SECTIONS { asm/darkNut.o(.text); asm/hangingSeed.o(.text); asm/beetle.o(.text); + src/keese.o(.text); asm/keese.o(.text); asm/doorMimic.o(.text); asm/rockChuchu.o(.text); diff --git a/src/keese.c b/src/keese.c new file mode 100644 index 00000000..d91ee6f9 --- /dev/null +++ b/src/keese.c @@ -0,0 +1,134 @@ +#include "global.h" +#include "entity.h" +#include "enemy.h" +#include "link.h" + +extern void sub_0804AA30(Entity*, void *); +extern u32 sub_0806F520(void); +extern void sub_0806F4E8(Entity*); +extern u32 sub_0806F3E4(void); +extern void sub_0804A7D4(Entity*); +extern void sub_0804A720(Entity*); +extern u32 Random(); +extern void UpdateSpriteOrderAndFlip(Entity*); +extern void sub_08021EF0(Entity*); +extern void sub_08004274(Entity*); +extern void sub_080AEFB4(Entity*); +extern void sub_08021F24(Entity*); +extern u32 sub_0806FCB8(Entity*, s32, s32, u32); +extern void InitializeAnimation(Entity*, u32); + +extern void (*gUnk_080CB69C[])(Entity*); +extern void (*gUnk_080CB6B4[])(Entity*); +extern void (*gUnk_080CB6C4[])(Entity*); + +extern u8 gUnk_080CB6D0[]; +extern u16 gUnk_080CB6D6[]; + + +extern u8 gUnk_080CB6D0[]; + +void Keese(Entity *this) +{ + gUnk_080CB69C[GetNextFunction(this)](this); +} + +void sub_08021D80(Entity *this) +{ + gUnk_080CB6B4[this->action](this); +} + +void sub_08021d98(Entity *this) +{ + sub_0804AA30(this, &gUnk_080CB69C); +} + +void sub_08021DA8(Entity *this) +{ + if (sub_0806F520()) { + gUnk_080CB6C4[this->previousActionFlag](this); + } +} + +void sub_08021DCC(Entity *this) +{ + this->previousActionFlag = 2; +} + +void sub_08021DD4(Entity *this) +{ + sub_0806F4E8(this); +} + +void sub_08021DDC(Entity *this) +{ + if (sub_0806F3E4()) { + sub_0804A7D4(this); + } +} + +void sub_08021DF0(Entity *this) +{ + + sub_0804A720(this); + if ((this->entityType).parameter1 != 0) { + this->ticks.b1 = 1; + this->height.HALF.HI = -0x10; + } + this->direction = Random() & 0x1f; + this->filler[0] = 1; + this->ticks.b0 = 3; + this->collisionLayer = 3; + UpdateSpriteOrderAndFlip(this); + sub_08021EF0(this); +} + +void sub_08021E4C(Entity *this) +{ + if (this->field_0x78 != 0) { + this->field_0x78--; + } + if (this->itemCooldown != 0) { + (this->itemCooldown)--; + } + sub_08004274(this); + if ((this->frames.b.f3) != 0) { + sub_08021F24(this); + } + else { + sub_080AEFB4(this); + } + this->spriteOffsetY = gUnk_080CB6D0[this->frames.all]; +} + +void sub_08021EA4(Entity *this) +{ + if (--this->parameter3 == 0) { + sub_08021EF0(this); + } +} + +void sub_08021EBC(Entity *this) +{ + s32 iVar1; + + if (this->parameter3 != 0) { + this->parameter3--; + } + else { + iVar1 = sub_0806FCB8(this, gLinkEntity.x.HALF.HI, gLinkEntity.y.HALF.HI, 0x70); + if (iVar1 != 0) { + sub_08021EF0(this); + } + } +} + +void sub_08021EF0(Entity *this) +{ + u32 uVar1; + + this->action = 1; + this->field_0x78 = gUnk_080CB6D6[Random() & 0xf]; + this->itemCooldown = 0x3c; + InitializeAnimation(this, 0); +} \ No newline at end of file