tmc/src/object/carlovObject.c

180 lines
5.2 KiB
C

/**
* @file carlovObject.c
* @ingroup Objects
*
* @brief Carlov Object object
*/
#define NENT_DEPRECATED
#include "functions.h"
#include "global.h"
#include "object.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;
} CarlovObjectEntity;
extern void sub_080836DC(Entity*, u32, u32); // lockedDoor
extern void sub_08083814(Entity*, u32); // lockedDoor
void CarlovObject_Type0(CarlovObjectEntity*);
void CarlovObject_Type1(CarlovObjectEntity*);
void CarlovObject_Type2(CarlovObjectEntity*);
void CarlovObject_Type0Init(CarlovObjectEntity*);
void CarlovObject_Type0Action1(CarlovObjectEntity*);
void CarlovObject_Type0Action2(CarlovObjectEntity*);
void CarlovObject_Type1Init(CarlovObjectEntity*);
void CarlovObject_Type1Action1(CarlovObjectEntity*);
void CarlovObject_Type1Action2(CarlovObjectEntity*);
void CarlovObject_Type1Action3(CarlovObjectEntity*);
void CarlovObject_Type1Action4(CarlovObjectEntity*);
void CarlovObject_Type1Action5(CarlovObjectEntity*);
void CarlovObject_Type2Init(CarlovObjectEntity*);
void CarlovObject_Type2Action1(CarlovObjectEntity*);
void CarlovObject(CarlovObjectEntity* this) {
static void (*const CarlovObject_Types[])(CarlovObjectEntity*) = {
CarlovObject_Type0,
CarlovObject_Type1,
CarlovObject_Type2,
};
CarlovObject_Types[super->type](this);
}
void CarlovObject_Type0(CarlovObjectEntity* this) {
static void (*const CarlovObject_Type0Actions[])(CarlovObjectEntity*) = {
CarlovObject_Type0Init,
CarlovObject_Type0Action1,
CarlovObject_Type0Action2,
};
CarlovObject_Type0Actions[super->action](this);
}
void CarlovObject_Type0Init(CarlovObjectEntity* this) {
super->action = 2;
super->type2 = 2;
super->collisionLayer = 2;
UpdateSpriteForCollisionLayer(super);
super->spritePriority.b0 = 1;
super->timer = -76;
InitializeAnimation(super, super->type2);
}
void CarlovObject_Type0Action1(CarlovObjectEntity* this) {
s8 tmp;
GetNextFrame(super);
if (--super->timer == 0) {
super->timer = -76;
super->type2++;
tmp = 3;
super->type2 %= tmp;
InitializeAnimation(super, super->type2);
}
}
void CarlovObject_Type0Action2(CarlovObjectEntity* this) {
GetNextFrame(super);
}
void CarlovObject_Type1(CarlovObjectEntity* this) {
static void (*const CarlovObject_Type1Actions[])(CarlovObjectEntity*) = {
CarlovObject_Type1Init, CarlovObject_Type1Action1, CarlovObject_Type1Action2,
CarlovObject_Type1Action3, CarlovObject_Type1Action4, CarlovObject_Type1Action5,
};
CarlovObject_Type1Actions[super->action](this);
gPlayerState.mobility |= 0x80;
}
void CarlovObject_Type1Init(CarlovObjectEntity* this) {
super->speed = 0x300;
super->frameIndex = 0;
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);
if (super->timer == 0) {
super->action = 1;
super->subtimer = 120;
SetTile(0x4022, this->unk_76, super->collisionLayer);
} else {
super->action = 3;
super->spriteSettings.draw = 0;
super->spriteSettings.flipY = 1;
super->timer = 0;
}
}
void CarlovObject_Type1Action1(CarlovObjectEntity* this) {
if (CheckRoomFlag(0)) {
super->action = 2;
super->timer = 7;
super->direction = 0;
SetTile(this->unk_74, this->unk_76, super->collisionLayer);
EnqueueSFX(SFX_10B);
}
}
void CarlovObject_Type1Action2(CarlovObjectEntity* this) {
LinearMoveUpdate(super);
if (--super->timer == 0) {
super->action = 5;
super->timer = 8;
super->spriteSettings.draw = 0;
super->x.HALF.HI = this->unk_70;
super->y.HALF.HI = this->unk_72;
}
}
void CarlovObject_Type1Action3(CarlovObjectEntity* this) {
if (sub_08083734(super, 2)) {
super->action = 4;
sub_080836DC(super, 2, this->unk_76);
}
}
void CarlovObject_Type1Action4(CarlovObjectEntity* this) {
LinearMoveUpdate(super);
if (--super->timer == 0) {
super->action = 5;
sub_08083814(super, 2);
EnqueueSFX(SFX_10B);
SetTile(0x4022, this->unk_76, super->collisionLayer);
}
}
void CarlovObject_Type1Action5(CarlovObjectEntity* this) {
}
void CarlovObject_Type2(CarlovObjectEntity* this) {
static void (*const CarlovObject_Type2Actions[])(CarlovObjectEntity*) = {
CarlovObject_Type2Init,
CarlovObject_Type2Action1,
};
CarlovObject_Type2Actions[super->action](this);
}
void CarlovObject_Type2Init(CarlovObjectEntity* this) {
super->action = 1;
super->timer = 16;
super->z.HALF.HI -= 0x10;
if (super->type2 == 0) {
super->frameIndex = 2;
} else {
super->frameIndex = 0;
if (((super->parent)->x.HALF.HI & 0x10) != 0) {
super->frameIndex = 1;
}
}
CreateDust(super);
}
void CarlovObject_Type2Action1(CarlovObjectEntity* this) {
if (--super->timer == 0) {
DeleteThisEntity();
}
}