From 6304bbc3f2ee116a54ce59dde6f822166e74ba4d Mon Sep 17 00:00:00 2001 From: 21aslade <21aslade@go.dsdmail.net> Date: Sun, 28 Jun 2020 22:05:36 -0600 Subject: [PATCH] lakituCloud.s OK Also edited a few names in the entity struct to match usage more. --- CONTRIBUTING.md | 4 +- asm/lakituCloud.s | 254 ---------------------------------------------- include/entity.h | 8 +- linker.ld | 2 +- src/bladeTrap.c | 11 +- src/keese.c | 6 +- src/lakituCloud.c | 155 ++++++++++++++++++++++++++++ src/mask.c | 4 +- src/ocarina.c | 4 +- src/zelda.c | 2 +- 10 files changed, 178 insertions(+), 272 deletions(-) delete mode 100644 asm/lakituCloud.s create mode 100644 src/lakituCloud.c diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9137e3aa..0a438e7d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -220,7 +220,7 @@ void sub_08086284(Entity *r4) { gUnk_08120668[r4->action](r4); r4->bitfield = 0; - sub_0805EC9C(r4, *((u16 *)&r4->heldObjectPtr + 1), r4->itemCooldown, 0); + sub_0805EC9C(r4, *((u16 *)&r4->heldObjectPtr + 1), r4->field_0x7a, 0); return; } ``` @@ -268,7 +268,7 @@ extern void (*gUnk_08120668[])(Entity *); void sub_08086284(Entity *r4) { gUnk_08120668[r4->action](r4); r4->bitfield = 0; - sub_0805EC9C(r4, *((u16 *)&r4->heldObjectPtr + 1), r4->itemCooldown, 0); + sub_0805EC9C(r4, *((u16 *)&r4->heldObjectPtr + 1), r4->field_0x7a, 0); return; } ``` diff --git a/asm/lakituCloud.s b/asm/lakituCloud.s deleted file mode 100644 index 69a60a52..00000000 --- a/asm/lakituCloud.s +++ /dev/null @@ -1,254 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start LakituCloud -LakituCloud: @ 0x0803CCB8 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r4, _0803CCD0 @ =gUnk_080D0418 - 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 -_0803CCD0: .4byte gUnk_080D0418 - - thumb_func_start sub_0803CCD4 -sub_0803CCD4: @ 0x0803CCD4 - push {lr} - ldr r2, _0803CCE8 @ =gUnk_080D0430 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0803CCE8: .4byte gUnk_080D0430 - - thumb_func_start sub_0803CCEC -sub_0803CCEC: @ 0x0803CCEC - push {lr} - adds r2, r0, #0 - adds r2, #0x42 - movs r1, #0 - strb r1, [r2] - bl sub_0803CCD4 - pop {pc} - - thumb_func_start sub_0803CCFC -sub_0803CCFC: @ 0x0803CCFC - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F520 - cmp r0, #0 - bne _0803CD16 - ldrb r0, [r4, #0xd] - cmp r0, #2 - bne _0803CD26 - adds r0, r4, #0 - bl sub_0803CE3C - b _0803CD26 -_0803CD16: - ldr r0, _0803CD28 @ =gUnk_080D043C - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 -_0803CD26: - pop {r4, pc} - .align 2, 0 -_0803CD28: .4byte gUnk_080D043C - - thumb_func_start sub_0803CD2C -sub_0803CD2C: @ 0x0803CD2C - movs r1, #1 - strb r1, [r0, #0xd] - movs r1, #0x3c - strb r1, [r0, #0x1d] - bx lr - .align 2, 0 - - thumb_func_start sub_0803CD38 -sub_0803CD38: @ 0x0803CD38 - push {lr} - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_0803CD40 -sub_0803CD40: @ 0x0803CD40 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0803CD66 - movs r0, #2 - rsbs r0, r0, #0 - bl ModHealth - ldr r0, _0803CD68 @ =gLinkEntity - movs r1, #0x7a - bl sub_0800449C - bl sub_08079D84 - adds r0, r4, #0 - bl sub_0803CE3C -_0803CD66: - pop {r4, pc} - .align 2, 0 -_0803CD68: .4byte gLinkEntity - - thumb_func_start sub_0803CD6C -sub_0803CD6C: @ 0x0803CD6C - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldr r0, _0803CDA4 @ =0x0000FFFE - strh r0, [r4, #0x36] - ldrb r0, [r4, #0xa] - bl sub_0804B128 - str r0, [r4, #0x54] - str r0, [r4, #0x50] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x78 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x7a - strh r0, [r1] - adds r0, r4, #0 - movs r1, #4 - bl InitAnimationForceUpdate - adds r0, r4, #0 - bl sub_0803CE14 - pop {r4, pc} - .align 2, 0 -_0803CDA4: .4byte 0x0000FFFE - - thumb_func_start sub_0803CDA8 -sub_0803CDA8: @ 0x0803CDA8 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - ldrb r1, [r4, #0x15] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0803CDC0 - adds r0, r4, #0 - bl sub_0806F69C -_0803CDC0: - adds r1, r4, #0 - adds r1, #0x74 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0803CDD6 - adds r0, r4, #0 - bl sub_0803CE14 -_0803CDD6: - pop {r4, pc} - - thumb_func_start sub_0803CDD8 -sub_0803CDD8: @ 0x0803CDD8 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x18] - lsls r0, r1, #0x1e - lsrs r0, r0, #0x1e - movs r2, #1 - eors r0, r2 - movs r5, #4 - rsbs r5, r5, #0 - adds r3, r5, #0 - ands r3, r1 - orrs r3, r0 - strb r3, [r4, #0x18] - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803CE10 - movs r0, #1 - strb r2, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r2, #0x80 - orrs r1, r2 - strb r1, [r4, #0x10] - ands r3, r5 - orrs r3, r0 - strb r3, [r4, #0x18] -_0803CE10: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0803CE14 -sub_0803CE14: @ 0x0803CE14 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x54 - adds r2, r4, #0 - adds r2, #0x74 - bl sub_080A2CC0 - ldrb r1, [r4, #0x15] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0803CE38 - lsrs r1, r1, #3 - adds r1, #4 - adds r0, r4, #0 - bl InitAnimationForceUpdate -_0803CE38: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803CE3C -sub_0803CE3C: @ 0x0803CE3C - push {r4, lr} - adds r4, r0, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0x3c - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - adds r2, r4, #0 - adds r2, #0x3a - ldrb r1, [r2] - movs r0, #0xfb - ands r0, r1 - strb r0, [r2] - adds r0, r4, #0 - adds r0, #0x78 - ldrh r0, [r0] - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x7a - ldrh r0, [r0] - strh r0, [r4, #0x32] - ldr r0, [r4, #0x50] - str r0, [r4, #0x54] - adds r0, r4, #0 - bl sub_0803CE14 - pop {r4, pc} diff --git a/include/entity.h b/include/entity.h index d9a60d30..ceab7355 100644 --- a/include/entity.h +++ b/include/entity.h @@ -80,7 +80,8 @@ typedef struct Entity { u8 b1 : 2; u8 b2 : 2; } PACKED spriteOrientation; - u8 filler[2]; + u8 filler[1]; + u8 field_0x1d; u8 frameIndex; u8 lastFrameIndex; s32 field_0x20; @@ -140,9 +141,10 @@ typedef struct Entity { u8 field_0x6c; u8 field_0x6d; u8 filler4[6]; - u32* heldObjectPtr; + u16 field_0x74; + u8 filler5[2]; u16 field_0x78; - u16 itemCooldown; + u16 field_0x7a; union SplitWord field_0x7c; u16 field_0x80; u16 field_0x82; diff --git a/linker.ld b/linker.ld index ea8515c4..bc802f75 100644 --- a/linker.ld +++ b/linker.ld @@ -395,7 +395,7 @@ SECTIONS { src/bowMoblin.o(.text); asm/bowMoblin.o(.text); asm/lakitu.o(.text); - asm/lakituCloud.o(.text); + src/lakituCloud.o(.text); asm/enemy49.o(.text); asm/vaatiRebornEnemy.o(.text); asm/vaatiProjectile.o(.text); diff --git a/src/bladeTrap.c b/src/bladeTrap.c index 58cff0c1..89d1663a 100644 --- a/src/bladeTrap.c +++ b/src/bladeTrap.c @@ -14,16 +14,19 @@ void BladeTrap(Entity* ent) { ent->action = 1; pEVar2 = sub_0804B128((u8)(ent->entityType).form); ent->attachedEntity = pEVar2; - sub_080A2CC0((EntityData*)ent, &ent->attachedEntity, &ent->heldObjectPtr); + sub_080A2CC0((EntityData*)ent, &ent->attachedEntity, &ent->field_0x74); } if ((ent->direction & 0x80) == 0) { sub_0806F69C(ent); } - puVar3 = (u16*)&(ent->heldObjectPtr); + + + + puVar3 = &(ent->field_0x74); uVar1 = *puVar3; *puVar3 = uVar1 - 1; - if ((u16)(*puVar3) == 0) { - if ((ent->direction & 0x80) == 0) { + if ((*puVar3) == 0) { + if ((u16)(ent->direction & 0x80) == 0) { sub_08004488(0x74); } sub_080A2CC0((EntityData*)ent, &ent->attachedEntity, puVar3); diff --git a/src/keese.c b/src/keese.c index b9914c2f..0c846a79 100644 --- a/src/keese.c +++ b/src/keese.c @@ -88,8 +88,8 @@ void sub_08021E4C(Entity *this) if (this->field_0x78 != 0) { this->field_0x78--; } - if (this->itemCooldown != 0) { - (this->itemCooldown)--; + if (this->field_0x7a != 0) { + (this->field_0x7a)--; } GetNextFrame(this); if ((this->frames.b.f3) != 0) { @@ -129,6 +129,6 @@ void sub_08021EF0(Entity *this) this->action = 1; this->field_0x78 = gUnk_080CB6D6[Random() & 0xf]; - this->itemCooldown = 0x3c; + this->field_0x7a = 0x3c; InitializeAnimation(this, 0); } diff --git a/src/lakituCloud.c b/src/lakituCloud.c new file mode 100644 index 00000000..36489ad5 --- /dev/null +++ b/src/lakituCloud.c @@ -0,0 +1,155 @@ +#include "global.h" +#include "entity.h" + +extern Entity gLinkEntity; + +extern void UpdateAnimationSingleFrame(Entity *); +extern void InitAnimationForceUpdate(Entity *, s32); +extern u32 GetNextFunction(Entity *); +extern void ModHealth(s32); +extern void CreateFx(Entity *, u16, u16); + +extern void (* const gUnk_080D0418[])(Entity *); +extern void (* const gUnk_080D0430[])(Entity *); +extern void (* const gUnk_080D043C[])(Entity *); + +extern bool32 sub_0806F3E4(Entity *); +extern bool32 sub_0806F520(Entity *); + +extern void sub_0800449C(Entity *, u32); +extern void sub_0803CE14(Entity *); +extern void sub_0803CE3C(Entity *); +extern Entity *sub_0804B128(u8); +extern void sub_0806F4E8(Entity *); +extern void sub_0806F69C(Entity *); +extern void sub_08079D84(void); +extern void sub_080A2CC0(Entity *, Entity **, u16 *); + +void LakituCloud(Entity *this) { + gUnk_080D0418[GetNextFunction(this)](this); +} + +void sub_0803CCD4(Entity *this) { + gUnk_080D0430[this->action](this); +} + +void sub_0803CCEC(Entity *this) { + this->field_0x42 = 0; + sub_0803CCD4(this); +} + +void sub_0803CCFC(Entity *this) { + if (sub_0806F520(this) == 0) { + if (this->previousActionFlag == 2) { + sub_0803CE3C(this); + } + } + else { + gUnk_080D043C[this->previousActionFlag](this); + } +} + +void sub_0803CD2C(Entity *this) { + this->previousActionFlag = 1; + this->field_0x1d = 0x3c; +} + +void sub_0803CD38(Entity *this) { + sub_0806F4E8(this); +} + +void sub_0803CD40(Entity *this) { + if (!sub_0806F3E4(this)) { + return; + } + + ModHealth(-2); + + sub_0800449C(&gLinkEntity, 122); + sub_08079D84(); + + sub_0803CE3C(this); +} + +void sub_0803CD6C(Entity *this) { + Entity *lakitu; + + this->action = 1; + this->height.HALF.HI = -2; + + // Set parent to lakitu + lakitu = sub_0804B128(this->entityType.form); + this->attachedEntity = lakitu; + this->parent = lakitu; + + this->field_0x78 = this->x.HALF.HI; + this->field_0x7a = this->y.HALF.HI; + + InitAnimationForceUpdate(this, 4); + + sub_0803CE14(this); +} + +void sub_0803CDA8(Entity *this) { + UpdateAnimationSingleFrame(this); + + if ((this->direction & 0x80) == 0) { + sub_0806F69C(this); + } + + if (--this->field_0x74 << 0x10 == 0) { + sub_0803CE14(this); + } +} + +void sub_0803CDD8(Entity *this) { + u8 one; + u8 ss0; + + ss0 = this->spriteSettings.b.ss0; + one = 1; + this->spriteSettings.b.ss0 = ss0 ^ one; + + this->actionDelay--; + + if (this->actionDelay == 0) { + this->action = 1; + + this->flags |= 0x80; + + this->spriteSettings.b.ss0 = one; + } +} + +void sub_0803CE14(Entity *this) { + u8 direction; + + sub_080A2CC0(this, &this->attachedEntity, &this->field_0x74); + + direction = this->direction; + if (direction & 0x80) { + return; + } + + direction = direction / 8 + 4; + + InitAnimationForceUpdate(this, direction); +} + +void sub_0803CE3C(Entity *this) { + CreateFx(this, 2, 0); + + this->action = 2; + this->actionDelay = 60; + + this->flags &= 0x7f; + + this->field_0x3a &= 0xfb; + + this->x.HALF.HI = this->field_0x78; + this->y.HALF.HI = this->field_0x7a; + + this->attachedEntity = this->parent; + + sub_0803CE14(this); +} diff --git a/src/mask.c b/src/mask.c index d33f3481..80b952ee 100644 --- a/src/mask.c +++ b/src/mask.c @@ -70,7 +70,7 @@ void sub_080929A4(Entity *this) { this->field_0x7c.HALF.HI = COORD_TO_TILE(this); this->field_0x7c.HALF.LO = sub_080001DA(this->field_0x7c.HALF.HI, 1); - this->itemCooldown = sub_080002E0(this->field_0x7c.HALF.HI, 1); + this->field_0x7a = sub_080002E0(this->field_0x7c.HALF.HI, 1); SetTile(0x4022, this->field_0x7c.HALF.HI, 1); } @@ -98,7 +98,7 @@ void sub_08092A94(Entity *this) { // Presumably, make the mask fall SetTile((u16)this->field_0x7c.HALF.LO, this->field_0x7c.HALF.HI, 1); - sub_08000148(this->itemCooldown, this->field_0x7c.HALF.HI, 1); + sub_08000148(this->field_0x7a, this->field_0x7c.HALF.HI, 1); this->action = 2; diff --git a/src/ocarina.c b/src/ocarina.c index 88fab47b..b4eddddc 100644 --- a/src/ocarina.c +++ b/src/ocarina.c @@ -24,7 +24,7 @@ void Ocarina(ItemBehavior* pItemBeh, u32 inputFlags) // u32 *ocarinaStates = &gOcarinaStates; //_call_via_r2(pItemBeh, inputFlags,(ocarinaStates)[pItemBeh->stateID]); gOcarinaStates[pItemBeh->stateID](pItemBeh, inputFlags); - gLinkEntity.itemCooldown = gLinkEntity.itemCooldown + 1; + gLinkEntity.field_0x7a = gLinkEntity.field_0x7a + 1; } void OcarinaUse(ItemBehavior* itemBeh, s32 inputFlags) { @@ -40,7 +40,7 @@ void OcarinaUse(ItemBehavior* itemBeh, s32 inputFlags) { gLinkEntity.spriteSettings.raw &= var; gLinkEntity.flags &= 127; - gLinkEntity.itemCooldown = 2; + gLinkEntity.field_0x7a = 2; gLinkState.flags.all |= 0x10000000; gLinkState.filler8[0] = 255; gUnk_02034490 = 1; diff --git a/src/zelda.c b/src/zelda.c index 830bbf3e..10cc79cc 100644 --- a/src/zelda.c +++ b/src/zelda.c @@ -94,7 +94,7 @@ void sub_08066D94(Entity* ent) { npc->flags |= 0x20; npc->animationState = sub_0806EDC4(ent); roomID = gRoomControls.roomID; - *(u16*)&npc->heldObjectPtr = roomID; + npc->field_0x74 = roomID; CopyPosition(ent, npc); } DeleteThisEntity();