diff --git a/asm/zelda.s b/asm/zelda.s deleted file mode 100644 index 136b33b7..00000000 --- a/asm/zelda.s +++ /dev/null @@ -1,430 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start sub_08066CB4 -sub_08066CB4: @ 0x08066CB4 - push {lr} - ldr r2, _08066CC8 @ =gUnk_08110BD8 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08066CC8: .4byte gUnk_08110BD8 - - thumb_func_start sub_08066CCC -sub_08066CCC: @ 0x08066CCC - push {r4, lr} - adds r4, r0, #0 - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - adds r0, r4, #0 - movs r1, #7 - bl sub_0805EA78 - adds r0, r4, #0 - movs r1, #2 - bl sub_0805E3A0 - adds r0, r4, #0 - bl sub_0807DD50 - pop {r4, pc} - - thumb_func_start sub_08066CF8 -sub_08066CF8: @ 0x08066CF8 - push {lr} - movs r1, #0 - bl sub_0807DD94 - pop {pc} - .align 2, 0 - - thumb_func_start sub_08066D04 -sub_08066D04: @ 0x08066D04 - push {r4, lr} - adds r4, r0, #0 - movs r0, #7 - movs r1, #0x2e - bl sub_0805EB9C - str r0, [r4, #0x50] - pop {r4, pc} - - thumb_func_start sub_08066D14 -sub_08066D14: @ 0x08066D14 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldr r2, [r4, #0x50] - cmp r2, #0 - beq _08066D48 - ldrb r0, [r2, #0x14] - strb r0, [r4, #0x14] - 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, r2, #0 - adds r1, r4, #0 - bl CopyPosition - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl sub_08068680 - movs r0, #1 - str r0, [r5, #0x14] - b _08066D4A -_08066D48: - str r2, [r5, #0x14] -_08066D4A: - pop {r4, r5, pc} - - thumb_func_start sub_08066D4C -sub_08066D4C: @ 0x08066D4C - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldr r1, [r4, #0x50] - cmp r1, #0 - beq _08066D90 - bl CopyPosition - ldr r3, [r4, #0x50] - ldrb r1, [r3, #0x18] - movs r2, #4 - rsbs r2, r2, #0 - adds r0, r2, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r3, #0x18] - ldr r1, [r4, #0x50] - ldrb r0, [r4, #0x14] - strb r0, [r1, #0x14] - ldrb r0, [r4, #0x18] - ands r2, r0 - strb r2, [r4, #0x18] - ldrb r1, [r4, #0x17] - movs r0, #0xfe - ands r0, r1 - strb r0, [r4, #0x17] - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl sub_08068694 - movs r0, #1 - str r0, [r5, #0x14] - b _08066D92 -_08066D90: - str r1, [r5, #0x14] -_08066D92: - pop {r4, r5, pc} - - thumb_func_start sub_08066D94 -sub_08066D94: @ 0x08066D94 - push {r4, r5, lr} - adds r5, r0, #0 - movs r0, #0x1c - bl SetGlobalFlag - movs r0, #0x2e - movs r1, #0 - movs r2, #0 - bl CreateNPC - adds r4, r0, #0 - cmp r4, #0 - beq _08066DD6 - ldr r0, _08066DDC @ =gLinkEntity - ldrb r0, [r0, #0x14] - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x10] - movs r0, #0x20 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r0, r5, #0 - bl sub_0806EDC4 - strb r0, [r4, #0x14] - ldr r0, _08066DE0 @ =gRoomControls - ldrb r1, [r0, #5] - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - adds r0, r5, #0 - adds r1, r4, #0 - bl CopyPosition -_08066DD6: - bl DeleteThisEntity - pop {r4, r5, pc} - .align 2, 0 -_08066DDC: .4byte gLinkEntity -_08066DE0: .4byte gRoomControls - - thumb_func_start sub_08066DE4 -sub_08066DE4: @ 0x08066DE4 - push {r4, r5, lr} - adds r5, r0, #0 - movs r0, #7 - movs r1, #0x2e - bl sub_0805EB9C - adds r4, r0, #0 - cmp r4, #0 - beq _08066E06 - adds r0, r5, #0 - adds r1, r4, #0 - bl CopyPosition - adds r0, r5, #0 - adds r1, r4, #0 - bl sub_080686C4 -_08066E06: - pop {r4, r5, pc} - - thumb_func_start sub_08066E08 -sub_08066E08: @ 0x08066E08 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x50 - bl LoadAnimation - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - adds r4, #0x80 - strh r0, [r4] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08066E20 -sub_08066E20: @ 0x08066E20 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x44 - bl LoadAnimation - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - adds r4, #0x80 - strh r0, [r4] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08066E38 -sub_08066E38: @ 0x08066E38 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x48 - bl LoadAnimation - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - adds r4, #0x80 - strh r0, [r4] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08066E50 -sub_08066E50: @ 0x08066E50 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x4c - bl LoadAnimation - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - adds r4, #0x80 - strh r0, [r4] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08066E68 -sub_08066E68: @ 0x08066E68 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x54 - bl LoadAnimation - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - adds r4, #0x80 - strh r0, [r4] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08066E80 -sub_08066E80: @ 0x08066E80 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldrb r0, [r5, #0x18] - cmp r0, #4 - bhi _08066F7C - lsls r0, r0, #2 - ldr r1, _08066E98 @ =_08066E9C - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08066E98: .4byte _08066E9C -_08066E9C: @ jump table - .4byte _08066EB0 @ case 0 - .4byte _08066EC0 @ case 1 - .4byte _08066EF0 @ case 2 - .4byte _08066F28 @ case 3 - .4byte _08066F58 @ case 4 -_08066EB0: - ldrb r0, [r5, #0x18] - adds r0, #1 - strb r0, [r5, #0x18] - adds r0, r4, #0 - movs r1, #0x16 - bl LoadAnimation - b _08066F7C -_08066EC0: - adds r0, r4, #0 - bl sub_080042B8 - adds r2, r4, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08066F7C - ldrb r0, [r5, #0x18] - adds r0, #1 - strb r0, [r5, #0x18] - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - ldrb r1, [r2] - movs r0, #0xfe - ands r0, r1 - strb r0, [r2] - movs r0, #0x7c - bl PlaySFX - b _08066F7C -_08066EF0: - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r4, #0 - movs r2, #0x80 - bl sub_0806F62C - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl sub_08003FC4 - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - bne _08066F1A - adds r0, r4, #0 - bl sub_080042B8 -_08066F1A: - ldr r0, [r4, #0x20] - cmp r0, #0 - bge _08066F7C - ldrb r0, [r5, #0x18] - adds r0, #1 - strb r0, [r5, #0x18] - b _08066F7C -_08066F28: - movs r1, #0x80 - lsls r1, r1, #1 - adds r0, r4, #0 - movs r2, #0x80 - bl sub_0806F62C - adds r0, r4, #0 - bl sub_080042B8 - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl sub_08003FC4 - cmp r0, #0 - bne _08066F7C - ldrb r0, [r5, #0x18] - adds r0, #1 - strb r0, [r5, #0x18] - adds r0, r4, #0 - movs r1, #0x1e - bl LoadAnimation - b _08066F7C -_08066F58: - adds r0, r4, #0 - bl sub_080042B8 - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08066F7C - ldr r2, _08066F78 @ =gUnk_02033280 - ldrb r1, [r2, #7] - movs r0, #1 - orrs r0, r1 - strb r0, [r2, #7] - b _08066F8C - .align 2, 0 -_08066F78: .4byte gUnk_02033280 -_08066F7C: - adds r0, r4, #0 - adds r0, #0x58 - ldrb r1, [r0] - adds r0, #0x28 - movs r2, #0 - strh r1, [r0] - ldr r0, _08066F90 @ =gUnk_02033280 - strb r2, [r0, #6] -_08066F8C: - pop {r4, r5, pc} - .align 2, 0 -_08066F90: .4byte gUnk_02033280 - - thumb_func_start sub_08066F94 -sub_08066F94: @ 0x08066F94 - push {r4, lr} - ldr r4, _08066F9C @ =gUnk_08110BE0 - b _08066FAC - .align 2, 0 -_08066F9C: .4byte gUnk_08110BE0 -_08066FA0: - ldrh r1, [r4] - adds r4, #2 - ldr r0, _08066FB4 @ =0x00004072 - movs r2, #1 - bl SetTileType -_08066FAC: - ldrh r0, [r4] - cmp r0, #0 - bne _08066FA0 - pop {r4, pc} - .align 2, 0 -_08066FB4: .4byte 0x00004072 - - thumb_func_start sub_08066FB8 -sub_08066FB8: @ 0x08066FB8 - push {r4, lr} - ldr r4, _08066FC0 @ =gUnk_08110BE0 - b _08066FCE - .align 2, 0 -_08066FC0: .4byte gUnk_08110BE0 -_08066FC4: - ldrh r0, [r4] - adds r4, #2 - movs r1, #1 - bl sub_0807BA8C -_08066FCE: - ldrh r0, [r4] - cmp r0, #0 - bne _08066FC4 - pop {r4, pc} - .align 2, 0 diff --git a/include/entity.h b/include/entity.h index 30dd6d97..a3c17714 100644 --- a/include/entity.h +++ b/include/entity.h @@ -77,7 +77,7 @@ typedef struct Entity u8 filler[2]; u8 animationList; u8 field_1f; - u32 field_0x20; + s32 field_0x20; s16 nonPlanarMovement; u8 spriteAnimation[3]; struct { @@ -114,9 +114,12 @@ typedef struct Entity u8 field_0x59; union { u8 all; - u8 f0:6; - u8 f1:1; - u8 f2:1; + struct { + u8 f0:1; + u8 f1:5; + u8 f2:1; + u8 f3:1; + } PACKED b; } PACKED frames; u8 gfx; u8 field_0x5c; diff --git a/linker.ld b/linker.ld index ff6f35f2..072d998b 100644 --- a/linker.ld +++ b/linker.ld @@ -499,7 +499,7 @@ SECTIONS { asm/ministerPotho.o(.text); asm/npc26.o(.text); asm/vaati.o(.text); - asm/zelda.o(.text); + src/zelda.o(.text); asm/mutoh.o(.text); asm/carpenter.o(.text); asm/castorWildsStatue.o(.text); diff --git a/src/zelda.c b/src/zelda.c new file mode 100644 index 00000000..4400351d --- /dev/null +++ b/src/zelda.c @@ -0,0 +1,237 @@ +#include "global.h" +#include "entity.h" +#include "room.h" + +extern void sub_0805EA78(Entity*, u32); +extern void sub_0805E3A0(Entity*, u32); +extern void sub_0807DD50(Entity*); +extern void sub_0807DD94(Entity*, u32); +extern Entity* sub_0805EB9C(u32, u32); +void CopyPosition(Entity*, Entity*); +void sub_08068680(Entity*, Entity*); +void sub_08068694(Entity*, Entity*); +extern void SetGlobalFlag(u32); +extern Entity* CreateNPC(u32 subtype,u32 parameter1,u32 parameter2); +u32 sub_0806EDC4(Entity* ent); +void DeleteThisEntity(void); +extern Entity* GetEntityByType(u32, u32); +extern void sub_080686C4(Entity*, Entity*); +extern void LoadAnimation(Entity*, u32); +extern void sub_080042B8(Entity*); +extern void sub_0806F62C(Entity*, u32, u32); +extern u32 sub_08003FC4(Entity*, u32); +extern void PlaySFX(u32); +extern void SetTileType(u32, u32, u32); +extern void sub_0807BA8C(u16, u32); + +extern Entity gLinkEntity; +extern RoomControls gRoomControls; + +extern void (*gUnk_08110BD8[])(Entity* ent); +extern u8 gUnk_02033280[]; +extern u16 gUnk_08110BE0[]; + + +void sub_08066CB4(Entity* ent) +{ + gUnk_08110BD8[ent->action](ent); +} + +void sub_08066CCC(Entity *ent) +{ + ent->action = 1; + ent->spriteSettings.b.ss0 = 1; + sub_0805EA78(ent, 7); + sub_0805E3A0(ent, 2); + sub_0807DD50(ent); +} + +void sub_08066CF8(Entity* ent) +{ + sub_0807DD94(ent, 0); +} + +void sub_08066D04(Entity* ent) +{ + ent->parent = sub_0805EB9C(7, 0x2E); +} + +void sub_08066D14(Entity* ent, u32* param_2) +{ + Entity* parent; + + parent = ent->parent; + if (parent != NULL) + { + ent->animationState = parent->animationState; + ent->spriteSettings.b.ss0 = 1; + CopyPosition(parent, ent); + sub_08068680(ent, ent->parent); + param_2[5] = 1; + } + else + { + param_2[5] = 0; + } +} + +void sub_08066D4C(Entity* ent, u32* param_2) +{ + Entity* parent; + + parent = ent->parent; + if (ent->parent != NULL) + { + CopyPosition(ent, parent); + ent->parent->spriteSettings.b.ss0 = 1; + ent->parent->animationState = ent->animationState; + ent->spriteSettings.b.ss0 = 0; + ent->field_0x17 &= 0xFE; + sub_08068694(ent, ent->parent); + param_2[5] = 1; + } + else + { + param_2[5] = 0; + } +} + +void sub_08066D94(Entity* ent) +{ + u32 roomID; + Entity* npc; + + SetGlobalFlag(0x1C); + npc = CreateNPC(0x2E, 0, 0); + if (npc != NULL) + { + npc->animationState = gLinkEntity.animationState; + npc->flags |= 0x20; + npc->animationState = sub_0806EDC4(ent); + roomID = gRoomControls.roomID; + *(u16*)&npc->heldObjectPtr = roomID; + CopyPosition(ent, npc); + } + DeleteThisEntity(); +} + +void sub_08066DE4(Entity* ent) +{ + Entity* pEVar1; + + pEVar1 = sub_0805EB9C(7, 0x2E); + if (pEVar1 != NULL) + { + CopyPosition(ent, pEVar1); + sub_080686C4(ent, pEVar1); + } +} + +void sub_08066E08(Entity* ent) +{ + LoadAnimation(ent, 0x50); + ent->field_0x80 = ent->field_0x58; +} + +void sub_08066E20(Entity* ent) +{ + LoadAnimation(ent, 0x44); + ent->field_0x80 = ent->field_0x58; +} + +void sub_08066E38(Entity* ent) +{ + LoadAnimation(ent, 0x48); + ent->field_0x80 = ent->field_0x58; +} + +void sub_08066E50(Entity* ent) +{ + LoadAnimation(ent, 0x4C); + ent->field_0x80 = ent->field_0x58; +} + +void sub_08066E68(Entity* ent) +{ + LoadAnimation(ent, 0x54); + ent->field_0x80 = ent->field_0x58; +} + +void sub_08066E80(Entity* ent, u8* param_2) +{ + switch(param_2[0x18]) + { + case 0: + param_2[0x18]++; + LoadAnimation(ent, 0x16); + break; + case 1: + sub_080042B8(ent); + if (ent->frames.all & 1) + { + param_2[0x18]++; + ent->field_0x20 = 0x20000; + ent->frames.all &= 0xFE; + PlaySFX(0x7C); + } + break; + case 2: + sub_0806F62C(ent, 0x100, 0x80); + sub_08003FC4(ent, 0x2000); + if (!(ent->frames.all & 1)) + { + sub_080042B8(ent); + } + if (ent->field_0x20 < 0) + { + param_2[0x18]++; + } + break; + case 3: + sub_0806F62C(ent, 0x100, 0x80); + sub_080042B8(ent); + if (sub_08003FC4(ent, 0x2000) == 0) + { + param_2[0x18]++; + LoadAnimation(ent, 0x1E); + } + break; + case 4: + sub_080042B8(ent); + if (ent->frames.b.f3) + { + gUnk_02033280[7] |= 1; + return; + } + } + ent->field_0x80 = ent->field_0x58; + gUnk_02033280[6] = 0; +} + +void sub_08066F94(void) +{ + u16 uVar1; + u16* puVar2; + + puVar2 = gUnk_08110BE0; + while (*puVar2 != 0) + { + uVar1 = *puVar2; + puVar2++; + SetTileType(16498, uVar1, 1); + } +} + +void sub_08066FB8(void) +{ + u16 uVar1; + u16* puVar2; + + puVar2 = gUnk_08110BE0; + while (*puVar2 != 0) + { + uVar1 = *puVar2; + puVar2++; + sub_0807BA8C(uVar1, 1); + } +}