diff --git a/asm/librari.s b/asm/librari.s deleted file mode 100644 index ae1576bd..00000000 --- a/asm/librari.s +++ /dev/null @@ -1,246 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Librari -Librari: @ 0x0806B1CC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #1 - beq _0806B21E - cmp r0, #1 - bgt _0806B1E0 - cmp r0, #0 - beq _0806B1E6 - b _0806B25C -_0806B1E0: - cmp r0, #2 - beq _0806B24E - b _0806B25C -_0806B1E6: - 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] - ldrb r0, [r4, #0xe] - strb r0, [r4, #0x14] - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x68 - strb r0, [r1] - ldrb r1, [r1] - adds r0, r4, #0 - bl sub_08078784 - adds r0, r4, #0 - movs r1, #2 - bl sub_0805E3A0 - adds r0, r4, #0 - bl sub_0807DD50 - b _0806B25C -_0806B21E: - adds r2, r4, #0 - adds r2, #0x39 - movs r1, #0 - ldrsb r1, [r2, r1] - cmp r1, #2 - bne _0806B238 - movs r0, #0 - strb r1, [r4, #0xc] - strb r0, [r2] - adds r0, r4, #0 - bl sub_0806F118 - b _0806B25C -_0806B238: - adds r0, r4, #0 - movs r1, #0 - bl sub_0807DDAC - adds r0, r4, #0 - bl sub_0807DDE4 - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - b _0806B25C -_0806B24E: - adds r0, r4, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _0806B25C - movs r0, #1 - strb r0, [r4, #0xc] -_0806B25C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0806B260 -sub_0806B260: @ 0x0806B260 - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r5, r1, #0 - movs r0, #0 - str r0, [r5, #0x14] - movs r0, #0x46 - bl GetInventoryValue - cmp r0, #0 - bne _0806B29E - movs r0, #0x29 - bl CheckGlobalFlag - cmp r0, #0 - beq _0806B286 - movs r4, #2 - movs r0, #1 - str r0, [r5, #0x14] - b _0806B2A0 -_0806B286: - movs r0, #0x7a - bl CheckLocalFlag - cmp r0, #0 - bne _0806B29A - movs r4, #0 - movs r0, #0x7a - bl SetLocalFlag - b _0806B2A0 -_0806B29A: - movs r4, #1 - b _0806B2A0 -_0806B29E: - movs r4, #3 -_0806B2A0: - ldr r0, _0806B2B0 @ =gUnk_08112D48 - lsls r1, r4, #1 - adds r1, r1, r0 - ldrh r0, [r1] - adds r1, r6, #0 - bl TextboxNoOverlap - pop {r4, r5, r6, pc} - .align 2, 0 -_0806B2B0: .4byte gUnk_08112D48 - - thumb_func_start sub_0806B2B4 -sub_0806B2B4: @ 0x0806B2B4 - push {r4, r5, lr} - adds r5, r0, #0 - movs r0, #0xb3 - bl CheckLocalFlag - cmp r0, #0 - beq _0806B314 - movs r0, #0 - bl CheckRoomFlag - cmp r0, #0 - bne _0806B2D6 - movs r4, #1 - movs r0, #0 - bl SetRoomFlag - b _0806B316 -_0806B2D6: - movs r0, #1 - bl CheckRoomFlag - cmp r0, #0 - bne _0806B2EA - movs r4, #2 - movs r0, #1 - bl SetRoomFlag - b _0806B316 -_0806B2EA: - movs r0, #2 - bl CheckRoomFlag - cmp r0, #0 - bne _0806B2FE - movs r4, #3 - movs r0, #2 - bl SetRoomFlag - b _0806B316 -_0806B2FE: - movs r4, #4 - movs r0, #0 - bl ClearRoomFlag - movs r0, #1 - bl ClearRoomFlag - movs r0, #2 - bl ClearRoomFlag - b _0806B316 -_0806B314: - movs r4, #0 -_0806B316: - ldr r0, _0806B328 @ =gUnk_08112D50 - lsls r1, r4, #1 - adds r1, r1, r0 - ldrh r0, [r1] - adds r1, r5, #0 - bl TextboxNoOverlap - pop {r4, r5, pc} - .align 2, 0 -_0806B328: .4byte gUnk_08112D50 - - thumb_func_start Librari_Fusion -Librari_Fusion: @ 0x0806B32C - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xc] - cmp r0, #0 - bne _0806B352 - adds r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] - adds r0, r2, #0 - movs r1, #9 - bl InitAnimationForceUpdate - b _0806B358 -_0806B352: - adds r0, r2, #0 - bl UpdateAnimationSingleFrame -_0806B358: - pop {pc} - .align 2, 0 - - thumb_func_start Percy_Head -Percy_Head: @ 0x0806B35C - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x5b - ldrb r0, [r0] - movs r2, #0x3f - ands r2, r0 - adds r2, #0x13 - adds r0, r4, #0 - movs r1, #0 - bl SetExtraSpriteFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r0, [r0] - movs r2, #0x7f - ands r2, r0 - adds r2, #0xb - adds r0, r4, #0 - movs r1, #1 - bl SetExtraSpriteFrame - ldrb r2, [r4, #0x1e] - adds r0, r4, #0 - movs r1, #2 - bl SetExtraSpriteFrame - adds r0, r4, #0 - movs r1, #2 - movs r2, #1 - bl SetSpriteSubEntryOffsetData1 - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl SetSpriteSubEntryOffsetData2 - adds r0, r4, #0 - bl sub_0807000C - pop {r4, pc} diff --git a/linker.ld b/linker.ld index 7714d9f2..02534b85 100644 --- a/linker.ld +++ b/linker.ld @@ -595,7 +595,7 @@ SECTIONS { asm/rem.o(.text); src/npc/townMinish.o(.text); asm/townMinish.o(.text); - asm/librari.o(.text); + src/npc/librari.o(.text); asm/percy.o(.text); asm/vaatiReborn.o(.text); src/npc/moblinLady.o(.text); diff --git a/src/npc/librari.c b/src/npc/librari.c new file mode 100644 index 00000000..77b48bb6 --- /dev/null +++ b/src/npc/librari.c @@ -0,0 +1,107 @@ +#include "global.h" +#include "entity.h" +#include "npc.h" +#include "flags.h" +#include "textbox.h" +#include "functions.h" + +extern u16 gUnk_08112D48[]; + +void Librari(Entity* this) { + switch (this->action) { + case 0: + this->action = 1; + this->spriteSettings.b.draw = TRUE; + this->animationState = this->actionDelay; + this->field_0x68 = sub_0801E99C(this); + sub_08078784(this, this->field_0x68); + 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); + UpdateAnimationSingleFrame(this); + } + break; + case 2: + if (UpdateFuseInteraction(this)) { + this->action = 1; + } + } +} + +void sub_0806B260(Entity* this, u32 arg1) { + u32 index; + + *(u32*)(arg1 + 0x14) = 0; + // flippers + if (!GetInventoryValue(0x46)) { + if (CheckGlobalFlag(0x29)) { + index = 2; + *(u32*)(arg1 + 0x14) = 1; + } else if (!CheckLocalFlag(0x7a)) { + index = 0; + SetLocalFlag(0x7a); + } else { + index = 1; + } + } else { + index = 3; + } + TextboxNoOverlap(gUnk_08112D48[index], this); +} + +extern u16 gUnk_08112D50[]; + +void sub_0806b2b4(Entity* this) { + u32 index; + + if (CheckLocalFlag(0xb3)) { + if (!CheckRoomFlag(0)) { + index = 1; + SetRoomFlag(0); + } else if (!CheckRoomFlag(1)) { + index = 2; + SetRoomFlag(1); + } else if (!CheckRoomFlag(2)) { + index = 3; + SetRoomFlag(2); + } else { + index = 4; + ClearRoomFlag(0); + ClearRoomFlag(1); + ClearRoomFlag(2); + } + } else { + index = 0; + } + TextboxNoOverlap(gUnk_08112D50[index], this); +} + +void Librari_Fusion(Entity *this) +{ + if (this->action == 0) { + this->action++; + this->spriteSettings.b.draw = TRUE; + InitAnimationForceUpdate(this, 9); + } + else { + UpdateAnimationSingleFrame(this); + } +} + +void Percy_Head(Entity *this) // ??? +{ + SetExtraSpriteFrame(this, 0, (this->frameSpriteSettings & 0x3f) + 0x13); + SetExtraSpriteFrame(this, 1, (this->frames.all & 0x7f) + 0xb); + SetExtraSpriteFrame(this, 2, this->frameIndex); + SetSpriteSubEntryOffsetData1(this, 2, 1); + SetSpriteSubEntryOffsetData2(this, 2, 0); + sub_0807000C(this); +} \ No newline at end of file