From 370c63e21e6f12457f98bf8dbe9085553f2dd6a5 Mon Sep 17 00:00:00 2001 From: theo3 Date: Sun, 12 Jul 2020 16:28:53 -0700 Subject: [PATCH] metalDoor.c OK --- asm/metalDoor.s | 301 ----------------------------------------------- include/entity.h | 2 +- linker.ld | 2 +- src/item11.c | 4 +- src/metalDoor.c | 115 ++++++++++++++++++ src/object49.c | 4 +- src/railtrack.c | 2 +- 7 files changed, 122 insertions(+), 308 deletions(-) delete mode 100644 asm/metalDoor.s create mode 100644 src/metalDoor.c diff --git a/asm/metalDoor.s b/asm/metalDoor.s deleted file mode 100644 index 9a8adb58..00000000 --- a/asm/metalDoor.s +++ /dev/null @@ -1,301 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start MetalDoor -MetalDoor: @ 0x080A066C - push {lr} - ldr r2, _080A0680 @ =gUnk_0812493C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080A0680: .4byte gUnk_0812493C - - thumb_func_start sub_080A0684 -sub_080A0684: @ 0x080A0684 - push {r4, r5, lr} - adds r4, r0, #0 - adds r2, r4, #0 - adds r2, #0x84 - ldrh r1, [r2] - ldr r0, _080A070C @ =0x0000FFFF - cmp r1, r0 - beq _080A06A2 - adds r0, r1, #0 - bl CheckFlags - cmp r0, #0 - beq _080A06A2 - bl DeleteThisEntity -_080A06A2: - movs r0, #1 - strb r0, [r4, #0xc] - movs r2, #0 - movs r0, #0xc0 - lsls r0, r0, #2 - strh r0, [r4, #0x24] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r2, [r4, #0x1e] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x18] - ldr r0, _080A0710 @ =gUnk_080FD180 - str r0, [r4, #0x48] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #5 - orrs r0, r1 - strb r0, [r2] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x70 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _080A0714 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - pop {r4, r5, pc} - .align 2, 0 -_080A070C: .4byte 0x0000FFFF -_080A0710: .4byte gUnk_080FD180 -_080A0714: .4byte gRoomControls - - thumb_func_start sub_080A0718 -sub_080A0718: @ 0x080A0718 - push {r4, lr} - adds r4, r0, #0 - movs r1, #2 - bl sub_08083734 - cmp r0, #0 - beq _080A074A - movs r2, #0 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0xc - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #0x10 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - strb r2, [r4, #0x15] - ldrh r0, [r4, #0x32] - adds r0, #0x24 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_080A080C -_080A074A: - pop {r4, pc} - - thumb_func_start sub_080A074C -sub_080A074C: @ 0x080A074C - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r1, r0, #0x18 - cmp r1, #0 - bne _080A07B6 - movs r0, #3 - strb r0, [r4, #0xc] - strh r1, [r4, #0x36] - adds r0, r4, #0 - adds r0, #0x70 - ldrh r0, [r0] - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x72 - ldrh r0, [r0] - strh r0, [r4, #0x32] - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _080A0794 - ldrh r0, [r1, #0x2e] - adds r0, #0xc - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - subs r0, #0xc - strh r0, [r1, #0x32] -_080A0794: - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _080A07B0 - ldrh r0, [r1, #0x2e] - subs r0, #0xc - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - subs r0, #0xc - strh r0, [r1, #0x32] -_080A07B0: - ldr r0, _080A07B8 @ =0x0000010B - bl sub_08004488 -_080A07B6: - pop {r4, pc} - .align 2, 0 -_080A07B8: .4byte 0x0000010B - - thumb_func_start sub_080A07BC -sub_080A07BC: @ 0x080A07BC - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _080A07EA - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #0xc - strb r0, [r4, #0xe] - movs r0, #0x10 - strb r0, [r4, #0x15] - ldrh r0, [r4, #0x32] - adds r0, #2 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_080A0870 - ldr r0, _080A07EC @ =0x0000010B - bl PlaySFX -_080A07EA: - pop {r4, pc} - .align 2, 0 -_080A07EC: .4byte 0x0000010B - - thumb_func_start sub_080A07F0 -sub_080A07F0: @ 0x080A07F0 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080A0808 - bl DeleteThisEntity -_080A0808: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080A080C -sub_080A080C: @ 0x080A080C - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r4, #0 - adds r6, #0x74 - ldrh r0, [r6] - subs r0, #1 - adds r5, r4, #0 - adds r5, #0x38 - ldrb r1, [r5] - bl sub_080001DA - adds r1, r4, #0 - adds r1, #0x76 - strh r0, [r1] - ldrh r0, [r6] - ldrb r1, [r5] - bl sub_080001DA - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - ldrh r0, [r6] - adds r0, #1 - ldrb r1, [r5] - bl sub_080001DA - adds r1, r4, #0 - adds r1, #0x7a - strh r0, [r1] - ldr r4, _080A086C @ =0x00004022 - ldrh r1, [r6] - subs r1, #1 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - ldrh r1, [r6] - adds r1, #1 - ldrb r2, [r5] - adds r0, r4, #0 - bl SetTile - pop {r4, r5, r6, pc} - .align 2, 0 -_080A086C: .4byte 0x00004022 - - thumb_func_start sub_080A0870 -sub_080A0870: @ 0x080A0870 - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r0, #0x76 - ldrh r0, [r0] - adds r5, r6, #0 - adds r5, #0x74 - ldrh r1, [r5] - subs r1, #1 - adds r4, r6, #0 - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x78 - ldrh r0, [r0] - ldrh r1, [r5] - ldrb r2, [r4] - bl SetTile - adds r0, r6, #0 - adds r0, #0x7a - ldrh r0, [r0] - ldrh r1, [r5] - adds r1, #1 - ldrb r2, [r4] - bl SetTile - pop {r4, r5, r6, pc} - .align 2, 0 diff --git a/include/entity.h b/include/entity.h index fb7f68a3..661e8343 100644 --- a/include/entity.h +++ b/include/entity.h @@ -140,7 +140,7 @@ typedef struct Entity { /*0x6c*/ u8 field_0x6c; /*0x6d*/ u8 field_0x6d; /*0x6e*/ u8 filler4[2]; - /*0x70*/ u32 field_0x70; + /*0x70*/ union SplitWord field_0x70; /*0x74*/ u16 field_0x74; /*0x76*/ u16 field_0x76; /*0x78*/ union SplitHWord field_0x78; diff --git a/linker.ld b/linker.ld index 479604b6..b48e5643 100644 --- a/linker.ld +++ b/linker.ld @@ -842,7 +842,7 @@ SECTIONS { asm/objectAD.o(.text); asm/floatingBlock.o(.text); asm/objectAF.o(.text); - asm/metalDoor.o(.text); + src/metalDoor.o(.text); asm/jailBars.o(.text); asm/objectB2.o(.text); asm/objectB3.o(.text); diff --git a/src/item11.c b/src/item11.c index 362ba771..0af53106 100644 --- a/src/item11.c +++ b/src/item11.c @@ -64,9 +64,9 @@ void sub_08018CBC(Entity *this) this->field_0x44 = gUnk_080B3DE0[(this->entityType).form * 2 + 1]; this->field_0x40 = 0x1b; this->boundingBox = gUnk_080B3DE8[(this->entityType).form]; - (u32 *)gLinkEntity.field_0x70 = this; + (u32 *)gLinkEntity.field_0x70.WORD = this; sub_08078CD0(&gLinkEntity); - (u32 *)gLinkEntity.field_0x70 = pEVar3; + (u32 *)gLinkEntity.field_0x70.WORD = pEVar3; InitializeAnimation(this, (this->entityType).form + 10); sub_08018FA0(this); } diff --git a/src/metalDoor.c b/src/metalDoor.c new file mode 100644 index 00000000..1f18a272 --- /dev/null +++ b/src/metalDoor.c @@ -0,0 +1,115 @@ +#include "global.h" +#include "entity.h" +#include "room.h" +#include "flags.h" + +extern u32 sub_08083734(Entity*, u32); +extern void sub_080A080C(Entity*); +extern void sub_0806F69C(Entity*); +extern void sub_08004488(u32); +extern void sub_080A0870(Entity*); +extern void PlaySFX(u32); +extern u32 sub_080001DA(u32, u32); +extern void SetTile(u32, u32, u32); + +extern void (*const gUnk_0812493C[])(Entity*); + +extern BoundingBox gUnk_080FD180; + +void MetalDoor(Entity* this) { + gUnk_0812493C[this->action](this); +} + +void sub_080A0684(Entity *this) +{ + if ((this->cutsceneBeh.HWORD != 0xffff) && CheckFlags(this->cutsceneBeh.HWORD)) { + DeleteThisEntity(); + } + this->action = 1; + this->nonPlanarMovement = 0x300; + this->spriteSettings.b.draw = 0; + this->frameIndex = 0; + this->spriteSettings.b.flipY = 1; + this->boundingBox = &gUnk_080FD180; + this->spritePriority.b0 = 5; + this->field_0x70.HALF.LO = this->x.HALF.HI; + this->field_0x70.HALF.HI = this->y.HALF.HI; + this->field_0x74 = COORD_TO_TILE(this); +} + +void sub_080A0718(Entity *this) +{ + if (sub_08083734(this, 2) != 0) { + this->action = 2; + this->actionDelay = 0xc; + this->spriteSettings.b.draw = TRUE; + this->direction = 0; + this->y.HALF.HI += 0x24; + sub_080A080C(this); + } +} + +void sub_080A074C(Entity *this) +{ + u8 bVar1; + Entity *ent; + + sub_0806F69C(this); + + if (--this->actionDelay == 0) { + this->action = 3; + this->height.HALF.HI = 0; + this->x.HALF.HI = this->field_0x70.HALF.LO; + this->y.HALF.HI = this->field_0x70.HALF.HI; + ent = CreateFx(this, 0x11, 0x40); + if (ent != NULL) { + ent->x.HALF.HI += 0xc; + ent->y.HALF.HI -= 0xc; + } + ent = CreateFx(this, 0x11, 0x40); + if (ent != NULL) { + ent->x.HALF.HI -= 0xc; + ent->y.HALF.HI -= 0xc; + } + sub_08004488(0x10b); + } +} + +void sub_080A07BC(Entity *this) +{ + if (CheckFlags(this->field_0x86)) { + this->action = 4; + this->actionDelay = 0xc; + this->direction = 0x10; + this->y.HALF.HI += 2; + sub_080A0870(this); + PlaySFX(0x10b); + } +} + +void sub_080A07F0(Entity *this) +{ + + sub_0806F69C(this); + + if (--this->actionDelay == 0) { + DeleteThisEntity(); + } +} + +void sub_080A080C(Entity *this) +{ + this->field_0x76 = sub_080001DA(this->field_0x74 - 1, this->collisionLayer); + this->field_0x78.HWORD = sub_080001DA(this->field_0x74, this->collisionLayer); + this->field_0x7a = sub_080001DA(this->field_0x74 + 1, this->collisionLayer); + SetTile(0x4022, this->field_0x74 - 1, this->collisionLayer); + SetTile(0x4022, this->field_0x74, this->collisionLayer); + SetTile(0x4022, this->field_0x74 + 1, this->collisionLayer); +} + +void sub_080A0870(Entity *this) +{ + SetTile(this->field_0x76, this->field_0x74 - 1, this->collisionLayer); + SetTile(this->field_0x78.HWORD, this->field_0x74, this->collisionLayer); + SetTile(this->field_0x7a, this->field_0x74 + 1, this->collisionLayer); +} \ No newline at end of file diff --git a/src/object49.c b/src/object49.c index 68527a76..d9551953 100644 --- a/src/object49.c +++ b/src/object49.c @@ -112,7 +112,7 @@ void sub_0808F244(Entity *this) this->height.WORD = 0; *(u32 *)&this->field_0x74 = 0x80 - this->parent->height.HALF.HI; *(u32 *)&this->field_0x78 = 0x100 - this->parent->height.HALF.HI; - *(u32 *)&this->field_0x70 = *((u8 *)&this->parent->field_0x7c + 3); + *(u32 *)&this->field_0x70.WORD = *((u8 *)&this->parent->field_0x7c + 3); sub_0808F2B0(this); if ((this->parent->field_0x6d & 2) != 0) { DeleteThisEntity(); @@ -121,7 +121,7 @@ void sub_0808F244(Entity *this) void sub_0808F2B0(Entity *this) { - sub_0805EC9C(this, *(u32 *)&this->field_0x74, *(u32 *)&this->field_0x78, this->field_0x70); + sub_0805EC9C(this, *(u32 *)&this->field_0x74, *(u32 *)&this->field_0x78, this->field_0x70.WORD); } void sub_0808F2C0(Entity *this) diff --git a/src/railtrack.c b/src/railtrack.c index 3d18f068..95c418f4 100644 --- a/src/railtrack.c +++ b/src/railtrack.c @@ -40,7 +40,7 @@ void sub_080851AC(Entity* this) { } } InitializeAnimation(this, this->animationState); - this->field_0x70 = (u32)GetLayerByIndex(this->collisionLayer) + 4 + (COORD_TO_TILE(this) * 2); + this->field_0x70.WORD = (u32)GetLayerByIndex(this->collisionLayer) + 4 + (COORD_TO_TILE(this) * 2); sub_08085394(this); }