From 4f1f2f280e6df4a469e1b066d73ea827be33dc05 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 6 Nov 2022 10:19:26 +0000 Subject: [PATCH] Match sub_0803086C --- asm/non_matching/armos/sub_0803086C.inc | 154 ------------------------ src/enemy/armos.c | 38 +++++- 2 files changed, 37 insertions(+), 155 deletions(-) delete mode 100644 asm/non_matching/armos/sub_0803086C.inc diff --git a/asm/non_matching/armos/sub_0803086C.inc b/asm/non_matching/armos/sub_0803086C.inc deleted file mode 100644 index 311d5097..00000000 --- a/asm/non_matching/armos/sub_0803086C.inc +++ /dev/null @@ -1,154 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r5, r0, #0 - ldr r0, [r5, #0x7c] - cmp r0, #0 - bne _08030880 - b _0803099C -_08030880: - ldr r0, _08030928 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0803088E - b _0803098A -_0803088E: - ldr r0, _0803092C @ =gRoomControls - mov sb, r0 - ldrh r0, [r5, #0x2e] - mov r2, sb - ldrh r1, [r2, #6] - subs r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r7, r0, #0x10 - ldrh r0, [r5, #0x32] - ldrh r1, [r2, #8] - subs r0, r0, r1 - lsls r0, r0, #0x10 - lsrs r6, r0, #0x10 - movs r3, #0x2e - ldrsh r0, [r5, r3] - ldrh r1, [r2, #6] - subs r0, r0, r1 - asrs r4, r0, #4 - movs r2, #0x3f - ands r4, r2 - movs r1, #0x32 - ldrsh r0, [r5, r1] - mov r3, sb - ldrh r1, [r3, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - movs r0, #0x38 - adds r0, r0, r5 - mov r8, r0 - ldrb r1, [r0] - adds r0, r4, #0 - bl GetTileType - ldr r1, _08030930 @ =0x00004049 - mov sl, r1 - cmp r0, sl - bne _08030950 - adds r0, r7, #0 - adds r1, r6, #0 - movs r2, #2 - movs r3, #0xc - bl CheckPlayerInRegion - cmp r0, #0 - beq _0803093C - subs r1, r6, #4 - adds r0, r7, #0 - movs r2, #2 - movs r3, #4 - bl CheckPlayerInRegion - cmp r0, #0 - beq _0803098A - ldr r2, _08030934 @ =gPlayerEntity - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2] - ldr r0, [r5, #0x7c] - bl DoExitTransition - ldr r0, _08030938 @ =gRoomTransition - adds r1, r5, #0 - adds r1, #0x80 - ldrb r1, [r1] - adds r0, #0xae - strh r1, [r0] - movs r0, #1 - b _0803099E - .align 2, 0 -_08030928: .4byte gPlayerState -_0803092C: .4byte gRoomControls -_08030930: .4byte 0x00004049 -_08030934: .4byte gPlayerEntity -_08030938: .4byte gRoomTransition -_0803093C: - ldr r0, _0803094C @ =0x00004022 - mov r3, r8 - ldrb r2, [r3] - adds r1, r4, #0 - bl SetTile - b _0803098A - .align 2, 0 -_0803094C: .4byte 0x00004022 -_08030950: - adds r1, r6, #6 - adds r0, r7, #0 - movs r2, #2 - movs r3, #5 - bl CheckPlayerInRegion - cmp r0, #0 - beq _0803098A - movs r4, #0x2e - ldrsh r1, [r5, r4] - mov r2, sb - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r4, #0x32 - ldrsh r0, [r5, r4] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - mov r0, r8 - ldrb r2, [r0] - mov r0, sl - bl SetTile -_0803098A: - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2] -_0803099C: - movs r0, #0 -_0803099E: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/src/enemy/armos.c b/src/enemy/armos.c index 7e0c3b7a..38a30371 100644 --- a/src/enemy/armos.c +++ b/src/enemy/armos.c @@ -413,7 +413,43 @@ void sub_08030834(ArmosEntity* this) { SetTile(this->unk_78, COORD_TO_TILE(super), super->collisionLayer); } -ASM_FUNC("asm/non_matching/armos/sub_0803086C.inc", bool32 sub_0803086C(ArmosEntity* this)) +bool32 sub_0803086C(ArmosEntity* this) { + u32 uVar2; + u32 pos; + u32 pos2; + u16 centerY; + u16 centerX; + FORCE_REGISTER(u32 r2, r2); + + if (this->unk_7c != NULL) { + if ((gPlayerState.flags & 0x80) != 0) { + centerX = super->x.HALF_U.HI - gRoomControls.origin_x; + centerY = super->y.HALF_U.HI - gRoomControls.origin_y; + // TODO for some reason the 0x3f of COORD_TO_TILE(super) needs to be forced to r2 here. + pos = ((((((super)->x.HALF.HI) - gRoomControls.origin_x) >> 4) & (r2 = 0x3f)) | + (((((super)->y.HALF.HI) - gRoomControls.origin_y) >> 4) & r2) << 6); + + if (GetTileType(pos, super->collisionLayer) == 0x4049) { + if (CheckPlayerInRegion(centerX, centerY, 2, 0xc) != 0) { + if (CheckPlayerInRegion(centerX, centerY - 4, 2, 4) != 0) { + gPlayerEntity.spritePriority.b0 = 3; + DoExitTransition(this->unk_7c); + gRoomTransition.armos_data.field_0xae = this->unk_80; + return TRUE; + } + } else { + SetTile(0x4022, pos, super->collisionLayer); + } + } else { + if (CheckPlayerInRegion(centerX, centerY + 6, 2, 5) != 0) { + SetTile(0x4049, COORD_TO_TILE(super), super->collisionLayer); + } + } + } + super->spritePriority.b0 = 4; + } + return FALSE; +} void sub_080309A8(ArmosEntity* this) { GetNextFrame(super);