diff --git a/asm/melari.s b/asm/melari.s deleted file mode 100644 index c1ee3d20..00000000 --- a/asm/melari.s +++ /dev/null @@ -1,386 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Melari -Melari: @ 0x080686D4 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - bne _08068700 - ldr r0, _080686FC @ =gUnk_08111530 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_0806ED78 - b _08068706 - .align 2, 0 -_080686FC: .4byte gUnk_08111530 -_08068700: - adds r0, r4, #0 - bl sub_08068780 -_08068706: - pop {r4, pc} - - thumb_func_start sub_08068708 -sub_08068708: @ 0x08068708 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0806872C @ =gUnk_08111520 - bl LoadExtraSpriteData - cmp r0, #0 - beq _08068728 - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08078778 -_08068728: - pop {r4, pc} - .align 2, 0 -_0806872C: .4byte gUnk_08111520 - - thumb_func_start sub_08068730 -sub_08068730: @ 0x08068730 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x20 - movs r2, #0x20 - bl sub_0806ED9C - adds r1, r0, #0 - cmp r1, #0 - blt _08068762 - ldrb r0, [r4, #0xf] - cmp r0, #0 - bne _0806875E - movs r0, #0x10 - strb r0, [r4, #0xf] - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, r1 - beq _08068762 - adds r0, r4, #0 - bl InitializeAnimation - b _08068762 -_0806875E: - subs r0, #1 - strb r0, [r4, #0xf] -_08068762: - adds r1, r4, #0 - adds r1, #0x39 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _0806877E - movs r0, #0 - strb r0, [r1] - ldrb r0, [r4, #0xe] - movs r1, #0x90 - lsls r1, r1, #5 - adds r0, r0, r1 - bl TextboxNoOverlapFollow -_0806877E: - pop {r4, pc} - - thumb_func_start sub_08068780 -sub_08068780: @ 0x08068780 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xc] - cmp r0, #1 - beq _080687D0 - cmp r0, #1 - bgt _08068794 - cmp r0, #0 - beq _0806879A - b _0806880E -_08068794: - cmp r0, #2 - beq _08068800 - b _0806880E -_0806879A: - ldr r1, _080687CC @ =gUnk_08111520 - adds r0, r5, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _0806887A - movs r2, #1 - movs r0, #1 - strb r0, [r5, #0xc] - ldrb r1, [r5, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r5, #0x18] - ldrb r0, [r5, #0xa] - strb r0, [r5, #0x14] - adds r0, r5, #0 - movs r1, #2 - bl sub_0805E3A0 - adds r0, r5, #0 - bl sub_0807DD50 - b _0806880E - .align 2, 0 -_080687CC: .4byte gUnk_08111520 -_080687D0: - adds r2, r5, #0 - adds r2, #0x39 - movs r1, #0 - ldrsb r1, [r2, r1] - cmp r1, #2 - bne _080687EA - movs r0, #0 - strb r1, [r5, #0xc] - strb r0, [r2] - adds r0, r5, #0 - bl sub_0806F118 - b _0806880E -_080687EA: - adds r0, r5, #0 - movs r1, #0 - bl sub_0807DDAC - adds r0, r5, #0 - bl sub_0807DDE4 - adds r0, r5, #0 - bl GetNextFrame - b _0806880E -_08068800: - adds r0, r5, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _0806880E - movs r0, #1 - strb r0, [r5, #0xc] -_0806880E: - adds r2, r5, #0 - adds r2, #0x5a - ldrb r1, [r2] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _0806887A - movs r0, #0xbf - ands r0, r1 - strb r0, [r2] - adds r0, r5, #0 - bl sub_080040A8 - cmp r0, #0 - bne _08068848 - ldr r4, _08068844 @ =gUnk_0811153E - bl Random - movs r1, #3 - bl __modsi3 - lsls r0, r0, #1 - adds r0, r0, r4 - ldrh r0, [r0] - bl PlaySFX - b _0806885E - .align 2, 0 -_08068844: .4byte gUnk_0811153E -_08068848: - ldr r4, _0806887C @ =gUnk_08111538 - bl Random - movs r1, #3 - bl __modsi3 - lsls r0, r0, #1 - adds r0, r0, r4 - ldrh r0, [r0] - bl sub_08004488 -_0806885E: - adds r0, r5, #0 - movs r1, #0x3d - movs r2, #0x20 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0806887A - movs r2, #0xc0 - lsls r2, r2, #0xd - ldr r3, _08068880 @ =0xFFF60000 - adds r0, r5, #0 - bl PositionRelative -_0806887A: - pop {r4, r5, pc} - .align 2, 0 -_0806887C: .4byte gUnk_08111538 -_08068880: .4byte 0xFFF60000 - - thumb_func_start sub_08068884 -sub_08068884: @ 0x08068884 - push {r4, lr} - adds r4, r0, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x68 - strb r0, [r1] - ldrb r1, [r1] - adds r0, r4, #0 - bl sub_08078784 - pop {r4, pc} - - thumb_func_start Melari_Head -Melari_Head: @ 0x0806889C - push {r4, r5, lr} - adds r5, r0, #0 - adds r0, #0x5a - ldrb r4, [r0] - movs r0, #0xc1 - rsbs r0, r0, #0 - ands r4, r0 - ldrb r2, [r5, #0x1e] - adds r0, r5, #0 - movs r1, #1 - bl SetExtraSpriteFrame - movs r0, #0x20 - ands r0, r4 - cmp r0, #0 - beq _080688E2 - movs r0, #0xe1 - rsbs r0, r0, #0 - ands r4, r0 - adds r0, r5, #0 - movs r1, #0 - adds r2, r4, #0 - bl SetExtraSpriteFrame - adds r0, r5, #0 - movs r1, #2 - movs r2, #0xff - bl SetExtraSpriteFrame - adds r0, r5, #0 - movs r1, #1 - movs r2, #0 - bl SetSpriteSubEntryOffsetData1 - b _08068906 -_080688E2: - adds r0, r5, #0 - movs r1, #0 - movs r2, #0xff - bl SetExtraSpriteFrame - movs r0, #0xe1 - rsbs r0, r0, #0 - ands r4, r0 - adds r0, r5, #0 - movs r1, #2 - adds r2, r4, #0 - bl SetExtraSpriteFrame - adds r0, r5, #0 - movs r1, #1 - movs r2, #2 - bl SetSpriteSubEntryOffsetData2 -_08068906: - adds r0, r5, #0 - bl sub_0807000C - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08068910 -sub_08068910: @ 0x08068910 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08068920 - subs r0, #1 - strb r0, [r4, #0xe] - b _08068960 -_08068920: - movs r0, #0x10 - strb r0, [r4, #0xe] - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - beq _08068960 - adds r0, r4, #0 - movs r1, #0x30 - movs r2, #0x30 - bl sub_0806EDD8 - adds r2, r0, #0 - cmp r2, #0 - bge _08068944 - movs r2, #0x10 -_08068944: - adds r0, r2, #0 - bl sub_0806F5A4 - adds r2, r0, #0 - adds r0, r4, #0 - adds r0, #0x58 - ldrb r1, [r0] - movs r0, #4 - rsbs r0, r0, #0 - ands r1, r0 - adds r1, r1, r2 - adds r0, r4, #0 - bl InitializeAnimation -_08068960: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08068964 -sub_08068964: @ 0x08068964 - push {lr} - movs r0, #0x35 - movs r1, #0 - movs r2, #3 - bl sub_080A7C18 - movs r0, #0x35 - movs r1, #2 - bl sub_0807CAA0 - pop {pc} - .align 2, 0 - - thumb_func_start Melari_Fusion -Melari_Fusion: @ 0x0806897C - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080689B4 - ldr r1, _080689B0 @ =gUnk_08111520 - adds r0, r4, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _080689BA - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - 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 - movs r1, #6 - bl InitializeAnimation - b _080689BA - .align 2, 0 -_080689B0: .4byte gUnk_08111520 -_080689B4: - adds r0, r4, #0 - bl GetNextFrame -_080689BA: - pop {r4, pc} - - thumb_func_start nullsub_502 -nullsub_502: @ 0x080689BC - bx lr - .align 2, 0 diff --git a/linker.ld b/linker.ld index 248f0b65..5f5afbc5 100644 --- a/linker.ld +++ b/linker.ld @@ -582,7 +582,7 @@ SECTIONS { asm/cat.o(.text); asm/mountainMinish.o(.text); asm/zeldaFollower.o(.text); - asm/melari.o(.text); + src/npc/melari.o(.text); src/npc/bladeBrothers.o(.text); src/npc/cow.o(.text); src/npc/goron.o(.text); diff --git a/src/npc/melari.c b/src/npc/melari.c new file mode 100644 index 00000000..ae906fd5 --- /dev/null +++ b/src/npc/melari.c @@ -0,0 +1,173 @@ +#include "global.h" +#include "entity.h" +#include "npc.h" +#include "textbox.h" +#include "functions.h" + +extern void sub_0806ED78(Entity*); +extern void sub_08068780(Entity*); +extern void sub_08078778(Entity*); +extern u32 Random(void); +extern void sub_0805E3A0(Entity*, u32); +extern void sub_0807DD50(Entity*); +extern void sub_0806F118(Entity*); +extern void sub_0807DDAC(Entity*, u32); +extern void sub_0807DDE4(Entity*); +extern u32 sub_080040A8(Entity*); +extern void sub_08004488(u32); +extern u32 sub_0801E99C(Entity*); +extern void sub_08078784(Entity*, u32); +extern void sub_0807000C(Entity*); +extern s32 sub_0806EDD8(Entity*, u32, u32); +extern void sub_080A7C18(u32, u32, u32); +extern void sub_0807CAA0(u32, u32); + +extern void (*const gUnk_08111530[])(Entity*); + +extern SpriteLoadData gUnk_08111520; +extern u16 gUnk_0811153E[]; +extern u16 gUnk_08111538[]; + +void Melari(Entity* this) { + if ((this->flags & 2) == 0) { + gUnk_08111530[this->action](this); + sub_0806ED78(this); + } else { + sub_08068780(this); + } +} + +void sub_08068708(Entity* this) { + if (LoadExtraSpriteData(this, &gUnk_08111520) != 0) { + this->action = 1; + InitializeAnimation(this, 0); + sub_08078778(this); + } +} + +void sub_08068730(Entity* this) { + s32 animIndex; + + animIndex = sub_0806ED9C(this, 0x20, 0x20); + if (-1 < animIndex) { + if (this->field_0xf == 0) { + this->field_0xf = 0x10; + if (this->animIndex != animIndex) { + InitializeAnimation(this, animIndex); + } + } else { + this->field_0xf--; + } + } + if (this->interactType != 0) { + this->interactType = 0; + TextboxNoOverlapFollow(this->actionDelay + 0x1200); + } +} + +void sub_08068780(Entity* this) { + Entity* ent; + + switch (this->action) { + case 0: + if (LoadExtraSpriteData(this, &gUnk_08111520) == 0) { + return; + } + this->action = 1; + this->spriteSettings.b.draw = TRUE; + this->animationState = this->entityType.form; + sub_0805E3A0(this, 2); + sub_0807DD50(this); + break; + case 1: + if (this->interactType == 2) { + this->action = 2; + this->interactType = 0; + sub_0806F118(this); + } else { + sub_0807DDAC(this, 0); + sub_0807DDE4(this); + GetNextFrame(this); + } + break; + case 2: + if (UpdateFuseInteraction(this)) { + this->action = 1; + } + } + + if ((this->frames.b.f2) != 0) { + this->frames.all &= 0xbf; + if (sub_080040A8(this) == 0) { + PlaySFX(gUnk_0811153E[(s32)Random() % 3]); + } else { + sub_08004488(gUnk_08111538[(s32)Random() % 3]); + } + ent = CreateFx(this, 0x3d, 0x20); + if (ent != NULL) { + PositionRelative(this, ent, 0x180000, -0xa0000); + } + } +} + +void sub_08068884(Entity* this) { + this->field_0x68 = sub_0801E99C(this); + sub_08078784(this, this->field_0x68); +} + +void Melari_Head(Entity* this) { + u32 bVar1; + + bVar1 = this->frames.all; + bVar1 &= -0xc1; + SetExtraSpriteFrame(this, 1, this->frameIndex); + if ((bVar1 & 0x20) != 0) { + SetExtraSpriteFrame(this, 0, bVar1 & -0xe1); + SetExtraSpriteFrame(this, 2, 0xff); + SetSpriteSubEntryOffsetData1(this, 1, 0); + } else { + SetExtraSpriteFrame(this, 0, 0xff); + SetExtraSpriteFrame(this, 2, bVar1 & -0xe1); + SetSpriteSubEntryOffsetData2(this, 1, 2); + } + sub_0807000C(this); +} + +void sub_08068910(Entity* this) { + s32 iVar1; + + if (this->actionDelay != 0) { + this->actionDelay--; + } else { + this->actionDelay = 0x10; + if ((this->frames.all & 0x20) != 0) { + iVar1 = sub_0806EDD8(this, 0x30, 0x30); + if (iVar1 < 0) { + iVar1 = 0x10; + } else { + } + iVar1 = sub_0806F5A4(iVar1); + InitializeAnimation(this, (this->animIndex & -0x4) + iVar1); + } + } +} + +void sub_08068964(Entity* this) { + sub_080A7C18(53, 0, 3); + sub_0807CAA0(53, 2); +} + +void Melari_Fusion(Entity* this) { + if (this->action == 0) { + if (LoadExtraSpriteData(this, &gUnk_08111520)) { + this->action++; + this->spriteSettings.b.draw = TRUE; + InitializeAnimation(this, 6); + } + } else { + GetNextFrame(this); + } +} + +void nullsub_502(Entity* this) { +} \ No newline at end of file