diff options
| author | theo3 <arisstephenson2@gmail.com> | 2021-05-01 13:07:54 -0700 |
|---|---|---|
| committer | theo3 <arisstephenson2@gmail.com> | 2021-05-01 13:07:54 -0700 |
| commit | 08fbc7c328adf1e4a7a81439b70731b00f0bcbc6 (patch) | |
| tree | acf1119b446daf798cc0aa9d7d90142c4a9e86f6 /src | |
| parent | 85adb7e0f729141717e8c18939de11dcde7fc58d (diff) | |
| parent | 0cfa5a9a066b33f8b4896edfcd29bc13986f0c27 (diff) | |
Merge remote-tracking branch 'upstream/master' into moreply
Diffstat (limited to 'src')
| -rw-r--r-- | src/object/lockedDoor.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c new file mode 100644 index 00000000..f7918284 --- /dev/null +++ b/src/object/lockedDoor.c @@ -0,0 +1,328 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "game.h" +#include "audio.h" +#include "functions.h" + +void sub_08083338(Entity*); +void sub_080834B4(Entity*); +void sub_080834EC(Entity*); +void sub_08083518(Entity*); +void sub_08083540(Entity*); +void nullsub_513(Entity*); +void sub_08083598(Entity*); +void sub_080835C8(Entity*); +void sub_080835F8(Entity*); + +void sub_08083638(Entity*); +void sub_08083658(Entity*); +void sub_080836A0(Entity*); +void sub_080836DC(Entity*, u32, u32); +u32 sub_08083734(Entity*, u32); +u32 sub_080837B0(Entity*); +void sub_08083814(Entity*, u32); + +void (*const gUnk_0811F65C[])(Entity*) = { + sub_08083338, sub_080834B4, sub_080834EC, sub_08083518, sub_08083540, + nullsub_513, sub_08083598, sub_080835C8, sub_080835F8, +}; + +void LockedDoor(Entity* this) { + gUnk_0811F65C[this->action](this); +} + +extern Hitbox gUnk_080FD170; + +extern u32 sub_080001DA(u32, u32); +extern void sub_08078850(Entity*, u32, u32, u32); +extern void sub_0805E4E0(Entity*, u32); + +typedef struct PACKED { + s8 x; + s8 y; +} struct_0811F680; + +const struct_0811F680 gUnk_0811F680[] = { + { 0, -2 }, + { 2, 0 }, + { 0, 2 }, + { -2, 0 }, +}; + +const struct_0811F680 gUnk_0811F688[] = { + { 0, -21 }, + { 21, 0 }, + { 0, 21 }, + { -21, 0 }, +}; + +const u16 gUnk_0811F690[] = { + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, +}; + +typedef struct { + struct_0811F680 unk_00; + struct_0811F680 unk_02; +} struct_0811F730; + +const struct_0811F730 gUnk_0811F730[] = { + { { 8, 8 }, { -8, 8 } }, + { { -8, 8 }, { -8, -8 } }, + { { 8, -8 }, { -8, -8 } }, + { { 8, 8 }, { 8, -8 } }, +}; + +const u8 gUnk_0811F740[] = { + 0xBE, + 0x7D, + 0xEB, + 0xD7, +}; + +void sub_08083338(Entity* this) { + if (this->cutsceneBeh.HWORD != 0xFFFF && CheckFlags(this->cutsceneBeh.HWORD)) { + DeleteThisEntity(); + } + if (!sub_080837B0(this)) + return; + this->type2 = (this->type >> 2) & 3; + this->frameIndex = this->type & 3; + this->speed = 0x300; + this->field_0x70.HALF.LO = this->x.HALF.HI; + this->field_0x70.HALF.HI = this->y.HALF.HI; + this->field_0x7c.BYTES.byte2 = this->type & 3; + this->hitbox = &gUnk_080FD170; + this->spritePriority.b0 = 5; + this->frames.all = this->type & 0xF; + this->field_0x76.HWORD = TILE(this->x.HALF.HI, this->y.HALF.HI); + this->field_0x74.HWORD = sub_080001DA(this->field_0x76.HWORD, this->collisionLayer); + switch (this->type2) { + case 0: + if (!CheckFlags(this->field_0x86.HWORD)) { + if (this->type & 0x10) { + this->action = 3; + } else { + sub_080836A0(this); + } + } else { + this->type &= ~0x10; + sub_08083638(this); + } + break; + case 1: + if (!CheckFlags(this->field_0x86.HWORD)) { + sub_08083638(this); + } else { + sub_080836A0(this); + } + break; + case 2: + if (!CheckFlags(this->field_0x86.HWORD)) { + this->frameIndex |= 4; + sub_080836DC(this, this->field_0x7c.BYTES.byte2, this->field_0x76.HWORD); + if (!CheckIsDungeon()) { + this->action = 5; + } else { + this->action = 8; + sub_080787CC(this); + sub_08078850(this, 0, gUnk_0811F740[this->field_0x7c.BYTES.byte2], 0); + } + } else { + DeleteThisEntity(); + } + break; + default: + DeleteThisEntity(); + break; + } +} + +void sub_080834B4(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 2; + this->actionDelay = 7; + SetTile(this->field_0x74.HWORD, this->field_0x76.HWORD, this->collisionLayer); + EnqueueSFX(0x10b); + } +} + +void sub_080834EC(Entity* this) { + sub_0806F69C(this); + if (--this->actionDelay == 0) { + if (this->type & 0x80) { + sub_08083638(this); + } else { + DeleteThisEntity(); + } + } +} + +void sub_08083518(Entity* this) { + if (sub_08083734(this, this->field_0x7c.BYTES.byte2)) { + this->action = 4; + sub_080836DC(this, this->field_0x7c.BYTES.byte2, this->field_0x76.HWORD); + } +} + +void sub_08083540(Entity* this) { + sub_0806F69C(this); + if (!--this->actionDelay) { + if (this->type & 0x10) { + this->type &= ~0x10; + sub_080836A0(this); + } else { + if (this->type & 0x80) { + sub_080836A0(this); + } else { + this->action = 5; + } + } + sub_08083814(this, this->field_0x7c.BYTES.byte2); + EnqueueSFX(0x10b); + } +} + +void nullsub_513(Entity* this) { +} + +void sub_08083598(Entity* this) { + if (this->type2 == 0) { + if (!CheckFlags(this->field_0x86.HWORD)) + return; + } else { + if (CheckFlags(this->field_0x86.HWORD)) + return; + } + sub_08083658(this); +} + +void sub_080835C8(Entity* this) { + if (this->type2 == 0) { + if (CheckFlags(this->field_0x86.HWORD)) + return; + } else { + if (!CheckFlags(this->field_0x86.HWORD)) + return; + } + this->action = 3; +} + +void sub_080835F8(Entity* this) { + if (this->interactType == 0 && !CheckFlags(this->field_0x86.HWORD)) + return; + this->action = 1; + this->actionDelay = 0x14; + sub_08083658(this); + SetFlag(this->field_0x86.HWORD); + sub_080526F8(-1); +} + +void sub_08083638(Entity* this) { + this->action = 7; + this->spriteSettings.b.draw = 0; + this->x.HALF.HI = this->field_0x70.HALF.LO; + this->y.HALF.HI = this->field_0x70.HALF.HI; +} + +void sub_08083658(Entity* this) { + const struct_0811F680* tmp; + this->action = 1; + this->actionDelay = 0x14; + this->direction = this->field_0x7c.BYTES.byte2 << 3; + tmp = &gUnk_0811F680[this->field_0x7c.BYTES.byte2]; + this->x.HALF.HI += tmp->x; + this->y.HALF.HI += tmp->y; + sub_0805E4E0(this, 0x3c); + SoundReq(0x10b); +} + +void sub_080836A0(Entity* this) { + this->action = 6; + this->spriteSettings.b.draw = 1; + this->x.HALF.HI = this->field_0x70.HALF.LO; + this->y.HALF.HI = this->field_0x70.HALF.HI; + SetTile(0x4022, this->field_0x76.HWORD, this->collisionLayer); +} + +void sub_080836DC(Entity* this, u32 unk_0, u32 unk_1) { + const struct_0811F680* tmp; + SetTile(0x4022, unk_1, this->collisionLayer); + this->actionDelay = 7; + this->spriteSettings.b.draw = 1; + this->direction = (unk_0 << 3) ^ 0x10; + tmp = &gUnk_0811F688[unk_0]; + if (this->type2 != 2) { + this->x.HALF.HI += tmp->x; + this->y.HALF.HI += tmp->y; + } +} + +u32 sub_08083734(Entity* this, u32 unk0) { + switch (unk0) { + case 0: + if (this->field_0x70.HALF_U.HI + 0xd - gPlayerEntity.y.HALF.HI < 0) + return 1; + break; + case 1: + if (gPlayerEntity.x.HALF.HI - (this->field_0x70.HALF_U.LO - 0xb) < 0) + return 1; + break; + case 2: + if (gPlayerEntity.y.HALF.HI - (this->field_0x70.HALF_U.HI - 0x8) < 0) + return 1; + break; + case 3: + if (this->field_0x70.HALF_U.LO + 0xa - gPlayerEntity.x.HALF.HI < 0) + return 1; + break; + } + return 0; +} + +u32 sub_080837B0(Entity* this) { + u32 tmp; + u32 tmp2 = gRoomControls.areaID; + if (tmp2 < 0x40) { + switch (tmp2) { + default: + tmp = 0xA; + break; + case 0x25: + tmp = 0x1e7; + break; + case 0x35: + tmp = 0x1c3; + break; + } + } else { + tmp = gUnk_0811F690[tmp2 - 0x40]; + } + if (tmp2 == 0x68) { + sub_0801D2B4(this, 0); + } else { + if (tmp2 == 0x88) { + sub_0801D2B4(this, 1); + } + } + LoadFixedGFX(this, tmp); +} + +void sub_08083814(Entity* this, u32 unk0) { + Entity* fx; + const struct_0811F730* tmp = &gUnk_0811F730[unk0]; + fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->x.HALF.HI += tmp->unk_00.x; + fx->y.HALF.HI += tmp->unk_00.y; + } + fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->x.HALF.HI += tmp->unk_02.x; + fx->y.HALF.HI += tmp->unk_02.y; + } +} |
