tmc/src/object/lightableSwitch.c

176 lines
4.8 KiB
C

/**
* @file lightableSwitch.c
* @ingroup Objects
*
* @brief Lightable Switch object
*/
#include "asm.h"
#include "entity.h"
#include "flags.h"
#include "functions.h"
#include "hitbox.h"
#include "object.h"
#include "room.h"
#include "sound.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unused1[12];
/*0x74*/ u16 unk_74;
/*0x76*/ u8 unused2[14];
/*0x84*/ u16 unk_84;
/*0x86*/ u16 unk_86;
} LightableSwitchEntity;
static void sub_0809EB30(LightableSwitchEntity* this);
static void sub_0809EAD8(LightableSwitchEntity* this);
static void sub_0809EABC(LightableSwitchEntity* this);
static void LightableSwitch_Type0(LightableSwitchEntity* this);
static void LightableSwitch_Type1(LightableSwitchEntity* this);
static void LightableSwitch_Type0_Init(LightableSwitchEntity* this);
static void LightableSwitch_Type0_Action1(LightableSwitchEntity* this);
static void LightableSwitch_Type1_Action3(LightableSwitchEntity* this);
static void LightableSwitch_Type1_Action2(LightableSwitchEntity* this);
static void LightableSwitch_Type1_Action1(LightableSwitchEntity* this);
static void LightableSwitch_Type1_Init(LightableSwitchEntity* this);
void LightableSwitch(LightableSwitchEntity* this) {
static void (*const LightableSwitch_Types[])(LightableSwitchEntity*) = {
LightableSwitch_Type0,
LightableSwitch_Type1,
};
LightableSwitch_Types[super->type](this);
sub_0809EB30(this);
}
void LightableSwitch_Type0(LightableSwitchEntity* this) {
static void (*const LightableSwitch_Type0_Actions[])(LightableSwitchEntity*) = {
LightableSwitch_Type0_Init,
LightableSwitch_Type0_Action1,
};
LightableSwitch_Type0_Actions[super->action](this);
}
void LightableSwitch_Type0_Init(LightableSwitchEntity* this) {
super->action = 1;
COLLISION_ON(super);
super->frameIndex = 0;
super->collisionFlags = 7;
super->hurtType = 0x48;
super->hitType = 0x28;
super->collisionMask = 10;
super->hitbox = (Hitbox*)&gHitbox_0;
sub_0809EAD8(this);
UpdateSpriteForCollisionLayer(super);
sub_0809EABC(this);
}
void LightableSwitch_Type0_Action1(LightableSwitchEntity* this) {
if ((super->contactFlags & CONTACT_NOW) != 0) {
if (CheckFlags(this->unk_86) != 0) {
ClearFlag(this->unk_86);
} else {
SetFlag(this->unk_86);
}
EnqueueSFX(SFX_110);
}
sub_0809EABC(this);
}
static void sub_0809EABC(LightableSwitchEntity* this) {
bool32 anySet = 0;
if (CheckFlags(this->unk_86)) {
anySet = 1;
}
if (super->frameIndex != anySet) {
super->frameIndex = anySet;
}
}
static void sub_0809EAD8(LightableSwitchEntity* this) {
u8 bVar1;
Entity* pEVar2;
if (super->type2 != 0) {
super->child = GetCurrentRoomProperty(super->type2);
UpdateRailMovement(super, (u16**)&super->child, &this->unk_74);
} else {
SetBottomTile(0x4050, COORD_TO_TILE(super), super->collisionLayer);
}
}
static void sub_0809EB30(LightableSwitchEntity* this) {
u16 uVar1;
u16* puVar2;
if (super->type2 != 0) {
if ((super->direction & 0x80) == 0) {
LinearMoveUpdate(super);
}
puVar2 = &this->unk_74;
if (!--*puVar2) {
UpdateRailMovement(super, (u16**)&super->child, puVar2);
}
}
}
void LightableSwitch_Type1(LightableSwitchEntity* this) {
static void (*const LightableSwitch_Type1_Actions[])(LightableSwitchEntity*) = {
LightableSwitch_Type1_Init,
LightableSwitch_Type1_Action1,
LightableSwitch_Type1_Action2,
LightableSwitch_Type1_Action3,
};
LightableSwitch_Type1_Actions[super->action](this);
}
void LightableSwitch_Type1_Init(LightableSwitchEntity* this) {
super->action = 1;
COLLISION_ON(super);
super->frameIndex = 3;
super->collisionFlags = 7;
super->hurtType = 0x48;
super->hitType = 0x28;
super->collisionMask = 10;
super->hitbox = (Hitbox*)&gHitbox_0;
sub_0809EAD8(this);
UpdateSpriteForCollisionLayer(super);
if (CheckFlags(this->unk_84)) {
super->action = 3;
super->frameIndex = 2;
}
}
void LightableSwitch_Type1_Action1(LightableSwitchEntity* this) {
if ((super->contactFlags & CONTACT_NOW) != 0) {
super->action = 2;
super->timer = 16;
super->frameIndex = 2;
SetFlag(this->unk_86);
EnqueueSFX(SFX_110);
}
}
void LightableSwitch_Type1_Action2(LightableSwitchEntity* this) {
if (CheckFlags(this->unk_84)) {
super->action = 3;
} else {
if (--super->timer == 0) {
super->action = 1;
super->frameIndex = 3;
ClearFlag(this->unk_86);
EnqueueSFX(SFX_110);
}
}
}
void LightableSwitch_Type1_Action3(LightableSwitchEntity* this) {
}