Files
tmc/src/object/object30.c
T
2023-12-31 17:34:02 -08:00

111 lines
2.9 KiB
C

/**
* @file object30.c
* @ingroup Objects
*
* @brief Object30 object
*/
#include "collision.h"
#include "functions.h"
#include "item.h"
#include "object.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u16 unk_68;
/*0x6a*/ u16 unk_6a;
/*0x6c*/ u16* unk_6c;
/*0x70*/ u32 gravity;
} Object30Entity;
extern u32 sub_0806F798(Entity*);
extern const Hitbox3D gUnk_08121C58;
void Object30_Init(Object30Entity*);
void Object30_Action1(Object30Entity*);
void Object30_Action2(Object30Entity*);
void sub_0808A968(Object30Entity*);
void Object30(Object30Entity* this) {
static void (*const Object30_Actions[])(Object30Entity*) = {
Object30_Init,
Object30_Action1,
Object30_Action2,
};
Object30_Actions[super->action](this);
sub_08080CB4(super);
}
void Object30_Init(Object30Entity* this) {
MapLayer* mapLayer;
const u16* ptr;
switch (super->type) {
case 0:
mapLayer = GetLayerByIndex(super->collisionLayer);
ptr = &mapLayer->mapData[sub_0806F798(super)];
this->unk_6c = (u16*)ptr;
this->unk_68 = ptr[0];
super->action = 1;
break;
case 1:
sub_0808A968(this);
break;
case 2:
case 3:
sub_0808A968(this);
Object30_Action2(this);
break;
}
}
void Object30_Action1(Object30Entity* this) {
if (this->unk_68 != this->unk_6c[0]) {
sub_0808A968(this);
}
}
void Object30_Action2(Object30Entity* this) {
static const s8 gUnk_08121194[] = {
-7, -8, -9, -10, -11, -10, -9, -8,
};
switch (super->type) {
case 0:
if (this->gravity != 0) {
if (super->zVelocity < 0) {
if (super->z.HALF.HI > -8) {
this->gravity = 0;
} else {
if (super->zVelocity < Q_16_16(-0.25)) {
this->gravity = Q_8_8(-4.0);
} else {
this->gravity = Q_8_8(4.0);
}
}
}
GravityUpdate(super, this->gravity);
return;
}
// fallthrough
case 1:
super->z.HALF.HI = gUnk_08121194[(super->subtimer++ >> 3) & 7];
if (!IsCollidingPlayer(super)) {
return;
}
break;
}
CreateItemEntity(ITEM_KINSTONE, (u32)super->type2, 0);
DeleteThisEntity();
}
void sub_0808A968(Object30Entity* this) {
super->action = 2;
super->timer = 30;
super->spriteSettings.draw = 1;
super->zVelocity = Q_16_16(2.5);
super->spritePriority.b1 = 3;
super->spriteSettings.shadow = 0;
super->collisionFlags |= 0x10;
super->hitbox = (Hitbox*)&gUnk_08121C58;
SetEntityPriority(super, 2);
this->gravity = Q_8_8(40.0);
}