From b4557f8778ec39e0e52ad5735dfdfab97f6e14b9 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Fri, 7 Jan 2022 17:34:18 +0200 Subject: [PATCH] Decompile ghostbrothers functions --- .../ghostBrothers/GhostBrothers.inc | 41 ------ .../ghostBrothers/sub_08065C0C.inc | 98 -------------- .../ghostBrothers/sub_08065D74.inc | 35 ----- .../ghostBrothers/sub_08065DB8.inc | 126 ------------------ .../ghostBrothers/sub_08065EDC.inc | 36 ----- src/npc/ghostBrothers.c | 121 +++++++++++++++-- 6 files changed, 109 insertions(+), 348 deletions(-) delete mode 100644 asm/non_matching/ghostBrothers/GhostBrothers.inc delete mode 100644 asm/non_matching/ghostBrothers/sub_08065C0C.inc delete mode 100644 asm/non_matching/ghostBrothers/sub_08065D74.inc delete mode 100644 asm/non_matching/ghostBrothers/sub_08065DB8.inc delete mode 100644 asm/non_matching/ghostBrothers/sub_08065EDC.inc diff --git a/asm/non_matching/ghostBrothers/GhostBrothers.inc b/asm/non_matching/ghostBrothers/GhostBrothers.inc deleted file mode 100644 index 6f4d6ce3..00000000 --- a/asm/non_matching/ghostBrothers/GhostBrothers.inc +++ /dev/null @@ -1,41 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x10] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08065BBA - adds r0, r4, #0 - bl sub_08065C0C - b _08065BEA -_08065BBA: - ldr r1, _08065BEC @ =gUnk_08110164 - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - ldrb r0, [r4, #0xa] - cmp r0, #2 - bhi _08065BEA - ldr r2, _08065BF0 @ =gUnk_0811015C - ldrb r0, [r4, #0xf] - adds r1, r0, #1 - strb r1, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x1b - movs r1, #7 - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - strh r0, [r4, #0x36] -_08065BEA: - pop {r4, pc} - .align 2, 0 -_08065BEC: .4byte gUnk_08110164 -_08065BF0: .4byte gUnk_0811015C - .syntax divided diff --git a/asm/non_matching/ghostBrothers/sub_08065C0C.inc b/asm/non_matching/ghostBrothers/sub_08065C0C.inc deleted file mode 100644 index c308e49a..00000000 --- a/asm/non_matching/ghostBrothers/sub_08065C0C.inc +++ /dev/null @@ -1,98 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #1 - beq _08065C42 - cmp r0, #1 - bgt _08065C20 - cmp r0, #0 - beq _08065C2A - b _08065CCA -_08065C20: - cmp r0, #2 - beq _08065C7E - cmp r0, #3 - beq _08065C8A - b _08065CCA -_08065C2A: - 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 - bl sub_0807DD50 - b _08065CCA -_08065C42: - adds r2, r4, #0 - adds r2, #0x39 - movs r1, #0 - ldrsb r1, [r2, r1] - cmp r1, #2 - bne _08065C74 - movs r0, #0 - strb r1, [r4, #0xc] - strb r0, [r2] - ldr r1, _08065C70 @ =gPlayerEntity - adds r0, r4, #0 - bl GetFacingDirection - bl sub_0806F5A4 - adds r1, r0, #0 - adds r0, r4, #0 - bl InitAnimationForceUpdate - adds r0, r4, #0 - bl sub_0806F118 - b _08065CCA - .align 2, 0 -_08065C70: .4byte gPlayerEntity -_08065C74: - adds r0, r4, #0 - movs r1, #0 - bl sub_0807DD94 - b _08065CCA -_08065C7E: - adds r0, r4, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _08065CCA - b _08065CC6 -_08065C8A: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065CCA - ldr r1, [r4, #0x6c] - ldrh r2, [r1] - ldr r0, _08065CB4 @ =0x0000FFFF - cmp r2, r0 - beq _08065CBC - ldr r0, _08065CB8 @ =gScreen - adds r0, #0x68 - strh r2, [r0] - adds r1, #2 - ldrh r0, [r1] - strb r0, [r4, #0xe] - adds r1, #2 - str r1, [r4, #0x6c] - b _08065CCA - .align 2, 0 -_08065CB4: .4byte 0x0000FFFF -_08065CB8: .4byte gScreen -_08065CBC: - ldrb r0, [r4, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r0 - strb r1, [r4, #0x18] -_08065CC6: - movs r0, #1 - strb r0, [r4, #0xc] -_08065CCA: - pop {r4, pc} - .syntax divided diff --git a/asm/non_matching/ghostBrothers/sub_08065D74.inc b/asm/non_matching/ghostBrothers/sub_08065D74.inc deleted file mode 100644 index 7437a539..00000000 --- a/asm/non_matching/ghostBrothers/sub_08065D74.inc +++ /dev/null @@ -1,35 +0,0 @@ - .syntax unified - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065DB4 - ldr r2, [r1, #0x6c] - ldrh r3, [r2] - ldr r0, _08065DA0 @ =0x0000FFFF - cmp r3, r0 - beq _08065DA8 - ldr r0, _08065DA4 @ =gScreen - adds r0, #0x68 - strh r3, [r0] - ldrh r0, [r2, #2] - strb r0, [r1, #0xe] - adds r0, r2, #4 - str r0, [r1, #0x6c] - b _08065DB4 - .align 2, 0 -_08065DA0: .4byte 0x0000FFFF -_08065DA4: .4byte gScreen -_08065DA8: - ldrb r0, [r1, #0xc] - adds r0, #1 - strb r0, [r1, #0xc] - movs r0, #0 - bl MessageFromTarget -_08065DB4: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/ghostBrothers/sub_08065DB8.inc b/asm/non_matching/ghostBrothers/sub_08065DB8.inc deleted file mode 100644 index 1ec10789..00000000 --- a/asm/non_matching/ghostBrothers/sub_08065DB8.inc +++ /dev/null @@ -1,126 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xd] - cmp r0, #4 - bhi _08065E74 - lsls r0, r0, #2 - ldr r1, _08065DCC @ =_08065DD0 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08065DCC: .4byte _08065DD0 -_08065DD0: @ jump table - .4byte _08065DE4 @ case 0 - .4byte _08065E08 @ case 1 - .4byte _08065EB0 @ case 2 - .4byte _08065E34 @ case 3 - .4byte _08065E4E @ case 4 -_08065DE4: - ldr r0, _08065E04 @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08065EB0 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x3c - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #4 - bl InitAnimationForceUpdate - b _08065EB0 - .align 2, 0 -_08065E04: .4byte gMessage -_08065E08: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065EB0 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0xb4 - strb r0, [r4, #0xe] - ldr r1, _08065E30 @ =gUnk_02018EB0 - ldrb r0, [r1, #1] - adds r0, #1 - strb r0, [r1, #1] - adds r0, r4, #0 - movs r1, #2 - bl InitAnimationForceUpdate - b _08065EB0 - .align 2, 0 -_08065E30: .4byte gUnk_02018EB0 -_08065E34: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065EB0 - movs r0, #0 - bl MessageFromTarget - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - b _08065EB0 -_08065E4E: - ldr r0, _08065E6C @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08065EB0 - ldrb r0, [r4, #0xd] - adds r0, #1 - strb r0, [r4, #0xd] - movs r0, #0x1e - strb r0, [r4, #0xe] - ldr r0, _08065E70 @ =gUnk_0811022E - str r0, [r4, #0x6c] - b _08065EB0 - .align 2, 0 -_08065E6C: .4byte gMessage -_08065E70: .4byte gUnk_0811022E -_08065E74: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065EB0 - ldr r1, [r4, #0x6c] - ldrh r2, [r1] - ldr r0, _08065E9C @ =0x0000FFFF - cmp r2, r0 - beq _08065EA4 - ldr r0, _08065EA0 @ =gScreen - adds r0, #0x68 - strh r2, [r0] - ldrh r0, [r1, #2] - strb r0, [r4, #0xe] - adds r0, r1, #4 - str r0, [r4, #0x6c] - b _08065EB0 - .align 2, 0 -_08065E9C: .4byte 0x0000FFFF -_08065EA0: .4byte gScreen -_08065EA4: - ldr r1, _08065EB8 @ =gUnk_02018EB0 - ldrb r0, [r1] - adds r0, #1 - strb r0, [r1] - bl DeleteThisEntity -_08065EB0: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - pop {r4, pc} - .align 2, 0 -_08065EB8: .4byte gUnk_02018EB0 - .syntax divided diff --git a/asm/non_matching/ghostBrothers/sub_08065EDC.inc b/asm/non_matching/ghostBrothers/sub_08065EDC.inc deleted file mode 100644 index 429f2abe..00000000 --- a/asm/non_matching/ghostBrothers/sub_08065EDC.inc +++ /dev/null @@ -1,36 +0,0 @@ - .syntax unified - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08065F1C - ldr r1, [r2, #0x6c] - ldrh r3, [r1] - ldr r0, _08065F08 @ =0x0000FFFF - cmp r3, r0 - beq _08065F10 - ldr r0, _08065F0C @ =gScreen - adds r0, #0x68 - strh r3, [r0] - adds r1, #2 - ldrh r0, [r1] - strb r0, [r2, #0xe] - adds r1, #2 - str r1, [r2, #0x6c] - b _08065F1C - .align 2, 0 -_08065F08: .4byte 0x0000FFFF -_08065F0C: .4byte gScreen -_08065F10: - ldrb r0, [r2, #0xc] - adds r0, #1 - strb r0, [r2, #0xc] - adds r0, r2, #0 - bl sub_08078778 -_08065F1C: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/src/npc/ghostBrothers.c b/src/npc/ghostBrothers.c index 192509ff..6124ceca 100644 --- a/src/npc/ghostBrothers.c +++ b/src/npc/ghostBrothers.c @@ -11,19 +11,37 @@ extern void (*const gUnk_08110274[])(Entity*); extern Dialog gUnk_08110280[]; -extern u32 gUnk_0811022E; - extern u32 gSpriteAnimations_GhostBrothers[]; extern u32 gUnk_08110188; +extern s8 gUnk_0811015C[8]; -ASM_FUNC("asm/non_matching/ghostBrothers/GhostBrothers.inc", void GhostBrothers(Entity* this)) +extern u8 gUnk_02018EB0[]; +extern u8 gUnk_0811022E[]; + +void sub_08065C0C(Entity* this); +static EntityAction* const gUnk_08110164[]; +extern u32 _call_via_r1(u32, u32*); + +void GhostBrothers(Entity* this) { + if (this->flags & 0x2) { + sub_08065C0C(this); + } else { + _call_via_r1((u32)this, (u32*)gUnk_08110164[this->type]); + + if (this->type < 3) { + s8* ptr = gUnk_0811015C; + u32 field_0xf = this->field_0xf++; + this->z.HALF_U.HI = *(ptr + (((field_0xf << 0x18) >> 0x1b) & 0x7)); + } + } +} void sub_08065BF4(Entity* this) { gUnk_0811017C[this->action](this); } -NONMATCH("asm/non_matching/ghostBrothers/sub_08065C0C.inc", void sub_08065C0C(Entity* this)) { +void sub_08065C0C(Entity* this) { u16* puVar3; switch (this->action) { @@ -53,12 +71,12 @@ NONMATCH("asm/non_matching/ghostBrothers/sub_08065C0C.inc", void sub_08065C0C(En if (--this->actionDelay != 0) { return; } - // TODO this is still wrong! + puVar3 = *(u16**)&this->field_0x6c.HWORD; if (*puVar3 != 0xffff) { gScreen.controls.alphaBlend = *puVar3; - this->actionDelay = (u8)puVar3[1]; - *(u16**)&this->field_0x6c = puVar3 + 2; + this->actionDelay = (u8) * (++puVar3); + *(u16**)&this->field_0x6c = ++puVar3; return; } @@ -68,13 +86,12 @@ NONMATCH("asm/non_matching/ghostBrothers/sub_08065C0C.inc", void sub_08065C0C(En break; } } -END_NONMATCH void sub_08065CCC(Entity* this) { this->action = 3; this->actionDelay = 0x1e; this->spriteRendering.alphaBlend = 1; - *(u32**)&this->field_0x6c = &gUnk_0811022E; + *(u32**)&this->field_0x6c = (u32*)gUnk_0811022E; gScreen.controls.layerFXControl = 0x3f40; gScreen.controls.alphaBlend = 0x10; } @@ -97,16 +114,96 @@ void sub_08065D18(Entity* this) { gScreen.controls.alphaBlend = 0x1000; } -ASM_FUNC("asm/non_matching/ghostBrothers/sub_08065D74.inc", void sub_08065D74(Entity* this)) +void sub_08065D74(Entity* this) { + u16* ptr; + if (--this->actionDelay) { + return; + } -ASM_FUNC("asm/non_matching/ghostBrothers/sub_08065DB8.inc", void sub_08065DB8(Entity* this)) + ptr = *(u16**)&this->field_0x6c; + if (*ptr != 0xffff) { + gScreen.controls.alphaBlend = *ptr; + this->actionDelay = *(ptr + 1); + *(u32*)&this->field_0x6c = (u32)(ptr + 2); + } else { + this->action++; + MessageFromTarget(0); + } +} + +void sub_08065DB8(Entity* this) { + switch (this->subAction) { + case 0: { + if ((gMessage.doTextBox & 0x7f) == 0) { + this->subAction++; + this->actionDelay = 0x3c; + InitAnimationForceUpdate(this, 4); + } + break; + } + case 1: { + if (--this->actionDelay == 0) { + this->subAction++; + this->actionDelay = 0xb4; + gUnk_02018EB0[1]++; + InitAnimationForceUpdate(this, 2); + } + break; + } + case 2: + break; + case 3: { + if (--this->actionDelay == 0) { + MessageFromTarget(0); + this->subAction++; + } + break; + } + case 4: { + if ((gMessage.doTextBox & 0x7f) == 0) { + this->subAction++; + this->actionDelay = 0x1e; + *(u8**)&this->field_0x6c = gUnk_0811022E; + } + break; + } + default: { + if (--this->actionDelay == 0) { + u16* puVar3 = *(u16**)&this->field_0x6c.HWORD; + if (*puVar3 != 0xffff) { + gScreen.controls.alphaBlend = *puVar3; + this->actionDelay = (u8) * (puVar3 + 1); + *(u16**)&this->field_0x6c = (puVar3 + 2); + } else { + gUnk_02018EB0[0]++; + DeleteThisEntity(); + } + } + break; + } + } + + UpdateAnimationSingleFrame(this); +} void sub_08065EBC(Entity* this) { gUnk_08110274[this->action](this); sub_0806ED78(this); } -ASM_FUNC("asm/non_matching/ghostBrothers/sub_08065EDC.inc", void sub_08065EDC(Entity* this)) +void sub_08065EDC(Entity* this) { + if (--this->actionDelay == 0) { + u16* puVar3 = *(u16**)&this->field_0x6c.HWORD; + if (*puVar3 != 0xffff) { + gScreen.controls.alphaBlend = *puVar3; + this->actionDelay = (u8) * (++puVar3); + *(u16**)&this->field_0x6c = (++puVar3); + } else { + this->action++; + sub_08078778(this); + } + } +} void sub_08065F20(Entity* this) { UpdateAnimationSingleFrame(this);