diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/object/windTribeTeleporter.c | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/src/object/windTribeTeleporter.c b/src/object/windTribeTeleporter.c new file mode 100644 index 00000000..052d4d2e --- /dev/null +++ b/src/object/windTribeTeleporter.c @@ -0,0 +1,195 @@ +/** + * @file windTribeTeleporter.c + * @ingroup Objects + * + * @brief WindTribeTeleporter object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "hitbox.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68; +} WindTribeTeleporterEntity; + +extern ScreenTransitionData gUnk_0813ADEC[]; + +void WindTribeTeleporter_Init(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action1(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action2(WindTribeTeleporterEntity*); +void WindTribeTeleporter_Action3(WindTribeTeleporterEntity*); +void sub_080A11E0(WindTribeTeleporterEntity*); +bool32 sub_080A11C0(WindTribeTeleporterEntity*); + +void WindTribeTeleporter(WindTribeTeleporterEntity* this) { + static void (*const WindTribeTeleporter_Actions[])(WindTribeTeleporterEntity*) = { + WindTribeTeleporter_Init, + WindTribeTeleporter_Action1, + WindTribeTeleporter_Action2, + WindTribeTeleporter_Action3, + }; + WindTribeTeleporter_Actions[super->action](this); + sub_080A11E0(this); +} + +void WindTribeTeleporter_Init(WindTribeTeleporterEntity* this) { + super->action = 1; + super->frameDuration = 8; + super->spritePriority.b0 = 7; + super->hitbox = (Hitbox*)&gHitbox_22; + SetDefaultPriority(super, 6); + if (sub_080A11C0(this)) { + gPlayerEntity.x.HALF.HI = super->x.HALF.HI; + gPlayerEntity.y.HALF.HI = super->y.HALF.HI; + SetPlayerControl(CONTROL_DISABLED); + sub_08078B48(); + SetPlayerEventPriority(); + SoundReq(SFX_112); + super->action = 3; + super->subAction = 0; + this->unk_68 = 1; + } +} + +void WindTribeTeleporter_Action1(WindTribeTeleporterEntity* this) { + if (sub_080A11C0(this)) { + if (this->unk_68 == 0) { + gPlayerEntity.x.HALF.HI = super->x.HALF.HI; + gPlayerEntity.y.HALF.HI = super->y.HALF.HI; + SetPlayerControl(CONTROL_DISABLED); + sub_08078B48(); + SetPlayerEventPriority(); + SoundReq(SFX_112); + super->action = 2; + super->subAction = 0; + } + } else { + this->unk_68 = 0; + } +} + +void WindTribeTeleporter_Action2(WindTribeTeleporterEntity* this) { + switch (super->subAction) { + case 0: + super->actionDelay = 0x1e; + super->subAction++; + break; + case 1: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } + break; + case 2: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + SoundReq(SFX_113); + } else { + if ((gRoomTransition.frameCount & 7) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + case 3: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } else { + if ((gRoomTransition.frameCount & 3) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + default: + if (--super->actionDelay == 0) { + #if defined(DEMO_JP) || defined(JP) || defined(EU) + #ifdef DEMO_JP + SetLocalFlag(0xfc); + #endif + DoExitTransition(&gUnk_0813ADEC[super->type2]); + #else + if (gRoomControls.area == 3) { + SetLocalFlag(0xf9); + } + DoExitTransition(&gUnk_0813ADEC[super->type2]); + #endif + } else { + if ((gRoomTransition.frameCount & 1) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + } +} + +void WindTribeTeleporter_Action3(WindTribeTeleporterEntity* this) { + switch (super->subAction) { + case 0: + super->subAction = 1; + super->actionDelay = 0x1e; + SoundReq(SFX_114); + break; + case 1: + if (--super->actionDelay != 0) { + if ((gRoomTransition.frameCount & 1) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } else { + super->subAction++; + super->actionDelay = 0x1e; + } + break; + case 2: + if (--super->actionDelay == 0) { + super->subAction++; + super->actionDelay = 0x1e; + } else { + if ((gRoomTransition.frameCount & 3) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + case 3: + if (--super->actionDelay == 0) { + super->subAction++; + } else { + if ((gRoomTransition.frameCount & 7) == 0) { + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } + } + break; + default: + if (gPlayerEntity.animationState != 4) { + if ((gRoomTransition.frameCount & 7U) != 0) { + return; + } + gPlayerEntity.animationState = (gPlayerEntity.animationState + 2) & 6; + } else { + super->action = 1; + super->subAction = 0; + gPlayerState.controlMode = 1; + ResetPlayerEventPriority(); + } + break; + } +} + +bool32 sub_080A11C0(WindTribeTeleporterEntity* this) { + if (gPlayerEntity.z.HALF.HI != 0) { + return FALSE; + } else { + return IsCollidingPlayer(super); + } +} + +void sub_080A11E0(WindTribeTeleporterEntity* this) { + if (--super->frameDuration == 0) { + super->frameDuration = 8; + super->frameIndex = (super->frameIndex + 1) & 3; + } +} |
