From a9479d5cf23694095f2e7ab8fdebe5be7fdd9228 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sat, 5 Mar 2022 01:00:53 +0200 Subject: [PATCH] Decompile the rest of rem --- asm/non_matching/rem/sub_0806A674.inc | 235 -------------------------- asm/non_matching/rem/sub_0806AA50.inc | 153 ----------------- assets/assets.json | 30 ---- data/const/npc/rem.s | 40 ----- linker.ld | 2 +- src/npc/rem.c | 205 +++++++++++++++++++--- 6 files changed, 180 insertions(+), 485 deletions(-) delete mode 100644 asm/non_matching/rem/sub_0806A674.inc delete mode 100644 asm/non_matching/rem/sub_0806AA50.inc delete mode 100644 data/const/npc/rem.s diff --git a/asm/non_matching/rem/sub_0806A674.inc b/asm/non_matching/rem/sub_0806A674.inc deleted file mode 100644 index 21b97e01..00000000 --- a/asm/non_matching/rem/sub_0806A674.inc +++ /dev/null @@ -1,235 +0,0 @@ - .syntax unified - push {r4, lr} - sub sp, #8 - adds r4, r0, #0 - ldr r1, _0806A694 @ =gUnk_08112294 - mov r0, sp - movs r2, #8 - bl memcpy - ldrb r3, [r4, #0xc] - cmp r3, #1 - beq _0806A6BE - cmp r3, #1 - bgt _0806A698 - cmp r3, #0 - beq _0806A6A0 - b _0806A82A - .align 2, 0 -_0806A694: .4byte gUnk_08112294 -_0806A698: - cmp r3, #2 - bne _0806A69E - b _0806A824 -_0806A69E: - b _0806A82A -_0806A6A0: - movs r0, #1 - strb r0, [r4, #0xc] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #9 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - movs r1, #0x13 - bl InitializeAnimation - b _0806A82A -_0806A6BE: - ldr r0, _0806A6E0 @ =gActiveScriptInfo - ldr r0, [r0] - movs r1, #0x80 - lsls r1, r1, #1 - ands r0, r1 - cmp r0, #0 - beq _0806A6E4 - movs r0, #0 - movs r1, #2 - strb r1, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x63 - strb r0, [r1] - subs r1, #1 - strb r0, [r1] - b _0806A82A - .align 2, 0 -_0806A6E0: .4byte gActiveScriptInfo -_0806A6E4: - ldr r0, [r4, #0x50] - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #9 - bne _0806A7C8 - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #3 - orrs r1, r0 - strb r1, [r2] - ldrb r2, [r4, #0xe] - cmp r2, #0 - bne _0806A724 - bl Random - adds r2, r0, #0 - movs r1, #7 - ands r0, r1 - strb r0, [r4, #0xe] - lsrs r0, r2, #8 - movs r1, #7 - ands r0, r1 - add r0, sp - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x68 - strb r1, [r0] - b _0806A75A -_0806A724: - ldr r0, _0806A780 @ =gRoomTransition - ldr r0, [r0] - movs r1, #3 - ands r0, r1 - cmp r0, #0 - bne _0806A75A - subs r0, r2, #1 - strb r0, [r4, #0xe] - adds r2, r4, #0 - adds r2, #0x62 - movs r0, #0 - ldrsb r0, [r2, r0] - adds r1, r4, #0 - adds r1, #0x68 - cmp r0, #0 - bgt _0806A746 - strb r3, [r1] -_0806A746: - movs r0, #0 - ldrsb r0, [r2, r0] - cmp r0, #0xf - ble _0806A752 - movs r0, #0xff - strb r0, [r1] -_0806A752: - ldrb r0, [r1] - ldrb r1, [r2] - adds r0, r0, r1 - strb r0, [r2] -_0806A75A: - ldrb r2, [r4, #0xf] - cmp r2, #0 - bne _0806A784 - bl Random - adds r2, r0, #0 - movs r1, #7 - ands r0, r1 - strb r0, [r4, #0xf] - lsrs r0, r2, #8 - movs r1, #7 - ands r0, r1 - add r0, sp - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x69 - strb r1, [r0] - b _0806A82A - .align 2, 0 -_0806A780: .4byte gRoomTransition -_0806A784: - ldr r0, _0806A7C4 @ =gRoomTransition - ldr r0, [r0] - lsrs r0, r0, #4 - movs r1, #3 - ands r0, r1 - cmp r0, #0 - bne _0806A82A - subs r0, r2, #1 - strb r0, [r4, #0xf] - adds r3, r4, #0 - adds r3, #0x63 - movs r0, #0 - ldrsb r0, [r3, r0] - adds r2, r4, #0 - adds r2, #0x69 - cmp r0, #0 - blt _0806A7AA - movs r0, #0xff - strb r0, [r2] -_0806A7AA: - movs r1, #0 - ldrsb r1, [r3, r1] - movs r0, #8 - rsbs r0, r0, #0 - cmp r1, r0 - bgt _0806A7BA - movs r0, #1 - strb r0, [r2] -_0806A7BA: - ldrb r0, [r2] - ldrb r1, [r3] - adds r0, r0, r1 - strb r0, [r3] - b _0806A82A - .align 2, 0 -_0806A7C4: .4byte gRoomTransition -_0806A7C8: - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #6 - orrs r1, r0 - strb r1, [r2] - adds r1, r4, #0 - adds r1, #0x62 - ldrb r0, [r1] - movs r2, #0 - ldrsb r2, [r1, r2] - cmp r2, #0 - beq _0806A7FE - cmp r2, #0 - ble _0806A7F0 - subs r0, #1 - strb r0, [r1] -_0806A7F0: - ldrb r2, [r1] - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - bge _0806A7FE - adds r0, r2, #1 - strb r0, [r1] -_0806A7FE: - adds r1, r4, #0 - adds r1, #0x63 - ldrb r0, [r1] - movs r2, #0 - ldrsb r2, [r1, r2] - cmp r2, #0 - beq _0806A82A - cmp r2, #0 - ble _0806A814 - subs r0, #1 - strb r0, [r1] -_0806A814: - ldrb r2, [r1] - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - bge _0806A82A - adds r0, r2, #1 - strb r0, [r1] - b _0806A82A -_0806A824: - adds r0, r4, #0 - bl GetNextFrame -_0806A82A: - add sp, #8 - pop {r4, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/rem/sub_0806AA50.inc b/asm/non_matching/rem/sub_0806AA50.inc deleted file mode 100644 index d1618f63..00000000 --- a/asm/non_matching/rem/sub_0806AA50.inc +++ /dev/null @@ -1,153 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - adds r5, r1, #0 - ldrb r0, [r5, #0x18] - cmp r0, #1 - beq _0806AB38 - cmp r0, #1 - bgt _0806AA6A - cmp r0, #0 - beq _0806AA70 - b _0806AB64 -_0806AA6A: - cmp r0, #2 - beq _0806AB5C - b _0806AB64 -_0806AA70: - str r0, [r5, #0x14] - movs r0, #0x8f - bl CheckLocalFlag - cmp r0, #0 - bne _0806AA84 - ldr r2, _0806AA80 @ =gUnk_081122A8 - b _0806AA9A - .align 2, 0 -_0806AA80: .4byte gUnk_081122A8 -_0806AA84: - movs r0, #0x15 - bl GetInventoryValue - cmp r0, #0 - bne _0806AA98 - ldr r2, _0806AA94 @ =gUnk_081122B0 - b _0806AA9A - .align 2, 0 -_0806AA94: .4byte gUnk_081122B0 -_0806AA98: - ldr r2, _0806AAD0 @ =gUnk_081122B8 -_0806AA9A: - ldr r1, _0806AAD4 @ =gRoomVars - ldr r0, [r1, #0x68] - lsls r0, r0, #1 - adds r0, r0, r2 - ldrh r7, [r0] - mov r8, r1 - mov r4, r8 - ldr r0, [r4, #0x68] - adds r0, #1 - str r0, [r4, #0x68] - cmp r0, #2 - bls _0806AAB6 - movs r0, #0 - str r0, [r4, #0x68] -_0806AAB6: - adds r0, r7, #0 - adds r1, r6, #0 - bl MessageNoOverlap - ldr r0, [r5, #4] - cmp r0, #1 - beq _0806AAEE - cmp r0, #1 - blo _0806AAD8 - cmp r0, #2 - beq _0806AB02 - b _0806AB1C - .align 2, 0 -_0806AAD0: .4byte gUnk_081122B8 -_0806AAD4: .4byte gRoomVars -_0806AAD8: - adds r0, r4, #0 - adds r0, #0xac - str r6, [r0] - adds r0, r6, #0 - movs r1, #7 - bl PrependEntityToList - movs r0, #0xc0 - lsls r0, r0, #9 - str r0, [r6, #0x20] - b _0806AB1C -_0806AAEE: - adds r0, r4, #0 - adds r0, #0xac - ldr r0, [r0] - movs r1, #7 - bl FindNextDuplicateID - adds r1, r0, #0 - adds r0, r4, #0 - adds r0, #0xb0 - b _0806AB14 -_0806AB02: - mov r0, r8 - adds r0, #0xb0 - ldr r0, [r0] - movs r1, #7 - bl FindNextDuplicateID - adds r1, r0, #0 - mov r0, r8 - adds r0, #0xb4 -_0806AB14: - str r1, [r0] - movs r0, #0xc0 - lsls r0, r0, #9 - str r0, [r1, #0x20] -_0806AB1C: - ldr r0, _0806AB34 @ =0x0000441E - cmp r7, r0 - bne _0806AB2C - movs r0, #0x8f - bl SetLocalFlag - movs r0, #1 - str r0, [r5, #0x14] -_0806AB2C: - movs r0, #1 - strb r0, [r5, #0x18] - b _0806AB64 - .align 2, 0 -_0806AB34: .4byte 0x0000441E -_0806AB38: - ldr r0, _0806AB58 @ =gRoomVars - ldr r1, [r5, #4] - lsls r1, r1, #2 - adds r0, #0xac - adds r1, r1, r0 - ldr r1, [r1] - movs r2, #0x36 - ldrsh r0, [r1, r2] - cmp r0, #0 - blt _0806AB64 - movs r0, #0xc0 - lsls r0, r0, #9 - str r0, [r1, #0x20] - movs r0, #2 - strb r0, [r5, #0x18] - b _0806AB64 - .align 2, 0 -_0806AB58: .4byte gRoomVars -_0806AB5C: - movs r1, #0x36 - ldrsh r0, [r6, r1] - cmp r0, #0 - bge _0806AB6A -_0806AB64: - ldr r1, _0806AB70 @ =gActiveScriptInfo - movs r0, #0 - strb r0, [r1, #6] -_0806AB6A: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0806AB70: .4byte gActiveScriptInfo - .syntax divided diff --git a/assets/assets.json b/assets/assets.json index 1ceb7ce0..ca5265b4 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -39028,36 +39028,6 @@ "size": 22, "type": "animation" }, - { - "path": "rem/gUnk_08112294.bin", - "start": 1122964, - "size": 8 - }, - { - "path": "rem/gUnk_0811229C.bin", - "start": 1122972, - "size": 4 - }, - { - "path": "rem/gUnk_081122A0.bin", - "start": 1122976, - "size": 8 - }, - { - "path": "rem/gUnk_081122A8.bin", - "start": 1122984, - "size": 8 - }, - { - "path": "rem/gUnk_081122B0.bin", - "start": 1122992, - "size": 8 - }, - { - "path": "rem/gUnk_081122B8.bin", - "start": 1123000, - "size": 8 - }, { "path": "animations/gSpriteAnimations_TownMinish_0.bin", "start": 1125480, diff --git a/data/const/npc/rem.s b/data/const/npc/rem.s deleted file mode 100644 index 10ec0d18..00000000 --- a/data/const/npc/rem.s +++ /dev/null @@ -1,40 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08112260:: @ 08112260 - .4byte sub_0806a370 - .4byte sub_0806A5E8 - .4byte sub_0806A630 - .4byte sub_0806A674 - .4byte sub_0806A830 - .4byte sub_0806A890 - -gUnk_08112278:: @ 08112278 - .4byte sub_0806A3D8 - .4byte sub_0806A410 - .4byte sub_0806A458 - .4byte sub_0806A4CC - .4byte sub_0806A550 - .4byte nullsub_503 - .4byte sub_0806A5C0 - -gUnk_08112294:: @ 08112294 - .incbin "rem/gUnk_08112294.bin" - -gUnk_0811229C:: @ 0811229C - .incbin "rem/gUnk_0811229C.bin" - -gUnk_081122A0:: @ 081122A0 - .incbin "rem/gUnk_081122A0.bin" - -gUnk_081122A8:: @ 081122A8 - .incbin "rem/gUnk_081122A8.bin" - -gUnk_081122B0:: @ 081122B0 - .incbin "rem/gUnk_081122B0.bin" - -gUnk_081122B8:: @ 081122B8 - .incbin "rem/gUnk_081122B8.bin" diff --git a/linker.ld b/linker.ld index 9ede4d17..ae3f6b65 100644 --- a/linker.ld +++ b/linker.ld @@ -1256,7 +1256,7 @@ SECTIONS { data/animations/npc/dog.o(.rodata); data/const/npc/syrup.o(.rodata); data/animations/npc/syrup.o(.rodata); - data/const/npc/rem.o(.rodata); + src/npc/rem.o(.rodata); data/animations/npc/rem.o(.rodata); data/const/npc/townMinish.o(.rodata); data/animations/npc/townMinish.o(.rodata); diff --git a/src/npc/rem.c b/src/npc/rem.c index 00e5c425..4e551d35 100644 --- a/src/npc/rem.c +++ b/src/npc/rem.c @@ -1,57 +1,66 @@ #include "functions.h" #include "npc.h" +#include "item.h" extern void sub_0806A8C8(Entity*); -extern void (*gUnk_08112260[])(Entity*); -extern void (*gUnk_08112278[])(Entity*); - extern void script_Rem; -extern u32 gUnk_0811229C; - extern void sub_0807F950(Entity* this, ScriptExecutionContext* context); -extern u8 gUnk_081122A0[]; - void sub_0806A9B0(Entity*, ScriptExecutionContext*); - void sub_0806A914(Entity* this); +void sub_0806a370(Entity* this); +void sub_0806A5E8(Entity* this); +void sub_0806A630(Entity* this); +void sub_0806A674(Entity* this); +void sub_0806A830(Entity* this); +void sub_0806A890(Entity* this); + +void sub_0806A3D8(Entity* this); +void sub_0806A410(Entity* this); +void sub_0806A458(Entity* this); +void sub_0806A4CC(Entity* this); +void sub_0806A550(Entity* this); +void nullsub_503(Entity* this); +void sub_0806A5C0(Entity* this); + void Rem(Entity* this) { - gUnk_08112260[this->type](this); + static void (*const typeFuncs[])(Entity*) = { + sub_0806a370, sub_0806A5E8, sub_0806A630, sub_0806A674, sub_0806A830, sub_0806A890, + }; + typeFuncs[this->type](this); } void sub_0806a370(Entity* this) { - u8* pbVar1; + static void (*const actionFuncs[])(Entity*) = { + sub_0806A3D8, sub_0806A410, sub_0806A458, sub_0806A4CC, sub_0806A550, nullsub_503, sub_0806A5C0, + }; - gUnk_08112278[this->action](this); + actionFuncs[this->action](this); ExecuteScriptForEntity(this, NULL); HandleEntity0x82Actions(this); UpdateAnimationSingleFrame(this); sub_0806ED78(this); if (this->animIndex == 0xf) { - pbVar1 = &this->frame; - if (*pbVar1 == 1) { - *pbVar1 = 0; + if (this->frame == 1) { + this->frame = 0; SoundReq(SFX_218); } - if (*pbVar1 == 2) { - *pbVar1 = 0; + if (this->frame == 2) { + this->frame = 0; SoundReq(SFX_219); } } } void sub_0806A3D8(Entity* this) { - ScriptExecutionContext* uVar1; - this->action = 1; this->actionDelay = 0xb4; SetDefaultPriority(this, PRIO_MESSAGE); sub_0806A8C8(this); - uVar1 = StartCutscene(this, &script_Rem); - *(ScriptExecutionContext**)&this->cutsceneBeh = uVar1; + *(ScriptExecutionContext**)&this->cutsceneBeh = StartCutscene(this, &script_Rem); sub_0807DD94(this, NULL); } @@ -59,7 +68,7 @@ void sub_0806A410(Entity* this) { switch (this->subAction) { case 0: if (--this->actionDelay == 0) { - this->subAction = this->subAction + 1; + this->subAction++; InitializeAnimation(this, 8); } break; @@ -143,7 +152,7 @@ void sub_0806A550(Entity* this) { } } -void nullsub_503(void) { +void nullsub_503(Entity* this) { } void sub_0806A5C0(Entity* this) { @@ -181,7 +190,88 @@ void sub_0806A630(Entity* this) { } } -ASM_FUNC("asm/non_matching/rem/sub_0806A674.inc", void sub_0806A674(Entity* this)) +void sub_0806A674(Entity* this) { + static const u8 gUnk_08112294[] = { 0, -1, 0, 1, 0, -1, 0, 1 }; + u32 rand; + u8 auStack16[8]; + + memcpy(auStack16, &gUnk_08112294, 8); + switch (this->action) { + case 0: + this->action = 1; + this->spritePriority.b0 = 6; + InitializeAnimation(this, 0x13); + break; + case 1: + if ((gActiveScriptInfo.syncFlags & 0x100) != 0) { + this->action = 2; + this->spriteOffsetY = 0; + this->spriteOffsetX = 0; + } else { + if (this->parent->animIndex == 9) { + this->spritePriority.b0 = 3; + + if (this->actionDelay == 0) { + rand = Random(); + this->actionDelay = rand & 7; + this->field_0x68.HALF.LO = auStack16[rand >> 8 & 7]; + } else if ((gRoomTransition.frameCount & 3U) == 0) { + this->actionDelay--; + if ((s8)this->spriteOffsetX < 1) { + this->field_0x68.HALF.LO = 1; + } + + if (0xf < (s8)this->spriteOffsetX) { + this->field_0x68.HALF.LO = -1; + } + this->spriteOffsetX += this->field_0x68.HALF.LO; + } + + if (this->field_0xf == 0) { + rand = Random(); + this->field_0xf = rand & 7; + this->field_0x68.HALF.HI = auStack16[rand >> 8 & 7]; + } else if (((u32)gRoomTransition.frameCount >> 4 & 3) == 0) { + this->field_0xf--; + if (-1 < this->spriteOffsetY) { + this->field_0x68.HALF.HI = -1; + } + + if (this->spriteOffsetY <= -8) { + this->field_0x68.HALF.HI = 1; + } + this->spriteOffsetY += this->field_0x68.HALF.HI; + } + } else { + this->spritePriority.b0 = 6; + if ((s8)this->spriteOffsetX != 0) { + if (0 < (s8)this->spriteOffsetX) { + this->spriteOffsetX--; + } + + if ((s8)this->spriteOffsetX < 0) { + this->spriteOffsetX++; + } + } + + if (this->spriteOffsetY != 0) { + if (0 < this->spriteOffsetY) { + this->spriteOffsetY--; + } + + if (this->spriteOffsetY < 0) { + this->spriteOffsetY++; + } + } + } + } + + break; + case 2: + GetNextFrame(this); + break; + } +} void sub_0806A830(Entity* this) { Entity* npc; @@ -239,6 +329,7 @@ void sub_0806A914(Entity* this) { } void sub_0806A93C(Entity* this) { + static const u8 gUnk_0811229C[] = { 0, 6, 10, 16 }; sub_08078778(this); sub_08078850(this, 0, 0, &gUnk_0811229C); } @@ -266,6 +357,7 @@ void sub_0806A96C(Entity* this, ScriptExecutionContext* context) { } void sub_0806A9B0(Entity* this, ScriptExecutionContext* context) { + static const u8 gUnk_081122A0[] = { 60, 100, 200, 60, 100, 200, 80, 80 }; this->action = 2; this->subAction = 0; this->actionDelay = gUnk_081122A0[Random() & 7]; @@ -290,7 +382,7 @@ void sub_0806AA18(Entity* this) { u32 index; if (this->field_0x6a.HWORD != 0) { index = 0x4408; - } else if ((gRoomTransition.frameCount & 1U) == 0) { + } else if ((gRoomTransition.frameCount & 1) == 0) { index = 0x4407; } else { index = 0x440d; @@ -298,7 +390,68 @@ void sub_0806AA18(Entity* this) { MessageNoOverlap(index, this); } -ASM_FUNC("asm/non_matching/rem/sub_0806AA50.inc", void sub_0806AA50(Entity* this, ScriptExecutionContext* context)) +void sub_0806AA50(Entity* this, ScriptExecutionContext* context) { + static const u16 gUnk_081122A8[] = { 0x441c, 0x441d, 0x441e, 0 }; + static const u16 gUnk_081122B0[] = { 0x441f, 0x4420, 0x4421, 0 }; + static const u16 gUnk_081122B8[] = { 0x4410, 0x4411, 0x4412, 0 }; + s32 messageIndex; + Entity* pEnt; + + switch (context->unk_18) { + case 0: + context->condition = 0; + if (CheckLocalFlag(0x8f) == 0) { + messageIndex = gUnk_081122A8[gRoomVars.animFlags]; + } else if (GetInventoryValue(ITEM_PEGASUS_BOOTS) == 0) { + messageIndex = gUnk_081122B0[gRoomVars.animFlags]; + } else { + messageIndex = gUnk_081122B8[gRoomVars.animFlags]; + } + + if (++gRoomVars.animFlags > 2) { + gRoomVars.animFlags = 0; + } + MessageNoOverlap(messageIndex, this); + switch (context->intVariable) { + case 0: + gRoomVars.field_0xac[0] = this; + PrependEntityToList(this, NPC); + this->zVelocity = 0x18000; + break; + case 1: + pEnt = FindNextDuplicateID(gRoomVars.field_0xac[0], NPC); + gRoomVars.field_0xac[1] = pEnt; + pEnt->zVelocity = 0x18000; + break; + case 2: + pEnt = FindNextDuplicateID(gRoomVars.field_0xac[1], NPC); + gRoomVars.field_0xac[2] = pEnt; + pEnt->zVelocity = 0x18000; + break; + } + if (messageIndex == 0x441e) { + SetLocalFlag(0x8f); + context->condition = 1; + } + context->unk_18 = 1; + break; + case 1: + pEnt = ((Entity*)gRoomVars.field_0xac[context->intVariable]); + if (pEnt->z.HALF.HI < 0) { + break; + } + pEnt->zVelocity = 0x18000; + context->unk_18 = 2; + break; + case 2: + if (this->z.HALF.HI >= 0) { + return; + } + break; + } + + gActiveScriptInfo.commandSize = 0; +} void sub_0806AB74(Entity* this) { gRoomVars.field_0x3 = 1; @@ -308,7 +461,7 @@ void sub_0806AB74(Entity* this) { } void sub_0806AB9C(Entity* this, ScriptExecutionContext* context) { - Entity* entity = FindEntity(NPC, REM, 7, 1, 0); + Entity* entity = FindEntity(NPC, REM, NPC, 1, 0); if (entity != NULL) { DeleteEntity(entity); }