mirror of https://github.com/zeldaret/tmc.git
180 lines
5.2 KiB
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();
|
|
}
|
|
}
|