diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-22 17:53:06 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-27 13:44:06 +0100 |
| commit | f2520835391b8199cdeae627e2c7fda43e0df1ff (patch) | |
| tree | d100eb93e22d071b160c8a4c8f359cabe953ff20 /src/object | |
| parent | ab853d9f4437bb51ab85bc61d903cc8cf2546687 (diff) | |
Decompile MinecartDoor
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/minecartDoor.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/object/minecartDoor.c b/src/object/minecartDoor.c new file mode 100644 index 00000000..32f427bc --- /dev/null +++ b/src/object/minecartDoor.c @@ -0,0 +1,194 @@ +/** + * @file minecartDoor.c + * @ingroup Objects + * + * @brief Minecart Door object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 unk_70; + /*0x72*/ u16 unk_72; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u8 unk_78[0x6]; + /*0x7e*/ u8 unk_7e; + /*0x7f*/ u8 unk_7f[0x7]; + /*0x86*/ u16 unk_86; +} MinecartDoorEntity; + +extern bool32 sub_080837B0(Entity*); // lockedDoor +extern void sub_080836DC(Entity*, u32, u32); // lockedDoor +extern void sub_08083814(Entity*, u32); // lockedDoor + +bool32 sub_08096CEC(MinecartDoorEntity*); +void sub_08096E04(MinecartDoorEntity*); +bool32 sub_08096D84(MinecartDoorEntity*); +bool32 sub_08096D68(s32, s32, s32, s32); +void MinecartDoor_Init(MinecartDoorEntity*); +void MinecartDoor_Action1(MinecartDoorEntity*); +void MinecartDoor_Action2(MinecartDoorEntity*); +void MinecartDoor_Action3(MinecartDoorEntity*); +void MinecartDoor_Action4(MinecartDoorEntity*); + +void MinecartDoor(MinecartDoorEntity* this) { + static void (*const MinecartDoor_Actions[])(MinecartDoorEntity*) = { MinecartDoor_Init, MinecartDoor_Action1, + MinecartDoor_Action2, MinecartDoor_Action3, + MinecartDoor_Action4 }; + MinecartDoor_Actions[super->action](this); +} + +void MinecartDoor_Init(MinecartDoorEntity* this) { + if (sub_080837B0(super)) { + if ((super->type & 4) != 0) { + this->unk_7e = 1; + super->type &= 3; + } + super->speed = 0x300; + this->unk_70 = super->x.HALF.HI; + this->unk_72 = super->y.HALF.HI; + super->spritePriority.b0 = 5; + this->unk_76 = COORD_TO_TILE(super); + this->unk_74 = GetTileIndex(this->unk_76, super->collisionLayer); + super->frameIndex = super->type; + if (sub_08096CEC(this)) { + if (this->unk_7e != 0) { + DeleteThisEntity(); + } else { + sub_08096E04(this); + } + } else { + super->action = 1; + super->spriteSettings.draw = 1; + SetTile(0x4022, this->unk_76, super->collisionLayer); + } + } +} + +void MinecartDoor_Action1(MinecartDoorEntity* this) { + if (sub_08096CEC(this)) { + super->action = 2; + super->actionDelay = 7; + super->direction = super->type << 3; + SetTile(this->unk_74, this->unk_76, super->collisionLayer); + EnqueueSFX(SFX_10B); + } +} + +void MinecartDoor_Action2(MinecartDoorEntity* this) { + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + sub_08096E04(this); + super->spriteSettings.draw = 0; + super->x.HALF.HI = this->unk_70; + super->y.HALF.HI = this->unk_72; + if (this->unk_7e != 0) { + DeleteThisEntity(); + } + } +} + +void MinecartDoor_Action3(MinecartDoorEntity* this) { + bool32 bVar3; + + if ((this->unk_7e != 0) && (CheckFlags(this->unk_86))) { + return; + } + if ((gPlayerState.flags & PL_IN_MINECART) != 0) { + if (super->type * 2 - (u32)gPlayerEntity.animationState == 0) { + if (sub_08083734(super, super->type) == 0) { + return; + } + goto label; + } else { + bVar3 = --super->actionDelay * 0x1000000; + } + } else { + bVar3 = sub_08096D84(this); + } + if (bVar3 == FALSE) { + label: + super->action = 4; + sub_080836DC(super, super->type, this->unk_76); + } +} + +void MinecartDoor_Action4(MinecartDoorEntity* this) { + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + super->action = 1; + super->x.HALF.HI = this->unk_70; + super->y.HALF.HI = this->unk_72; + sub_08083814(super, super->type); + EnqueueSFX(SFX_10B); + } +} + +bool32 sub_08096CEC(MinecartDoorEntity* this) { + if (this->unk_7e != 0 && CheckFlags(this->unk_86)) { + return TRUE; + } else { + if ((gPlayerState.flags & PL_IN_MINECART) != 0) { + Entity* player = &gPlayerEntity; + if ((((super->type << 1) ^ player->animationState) & 2) == 0) { + if ((super->type & 1) != 0) { + if (sub_08096D68(gPlayerEntity.y.HALF.HI, super->y.HALF.HI, gPlayerEntity.x.HALF.HI, + super->x.HALF.HI)) { + return TRUE; + } + } else { + if (sub_08096D68(gPlayerEntity.x.HALF.HI, super->x.HALF.HI, gPlayerEntity.y.HALF.HI, + super->y.HALF.HI)) { + return TRUE; + } + } + } + } + } + return FALSE; +} + +bool32 sub_08096D68(s32 param_1, s32 param_2, s32 param_3, s32 param_4) { + if (((param_1 - param_2) + 8U < 0x11) && ((param_3 - param_4) + 0x30U < 0x61)) { + return TRUE; + } else { + return FALSE; + } +} + +bool32 sub_08096D84(MinecartDoorEntity* this) { + switch (super->type) { + case 0: + if (((super->y.HALF.HI + 10) - (gPlayerEntity.y.HALF.HI)) < 0x65U) { + return TRUE; + } + break; + case 1: + if (((gPlayerEntity.x.HALF.HI) - (super->x.HALF.HI - 10)) < 0x65U) { + return TRUE; + } + break; + case 2: + if (((gPlayerEntity.y.HALF.HI) - (super->y.HALF.HI - 10)) < 0x65U) { + return TRUE; + } + break; + case 3: + if (((super->x.HALF.HI + 10) - (gPlayerEntity.x.HALF.HI)) < 0x65U) { + return TRUE; + } + break; + } + return FALSE; +} + +void sub_08096E04(MinecartDoorEntity* this) { + super->action = 3; + super->actionDelay = 8; +} |
