mirror of https://github.com/zeldaret/tmc.git
118 lines
3.0 KiB
C
118 lines
3.0 KiB
C
/**
|
|
* @file thunderbolt.c
|
|
* @ingroup Objects
|
|
*
|
|
* @brief Thunderbolt object
|
|
*/
|
|
#include "functions.h"
|
|
#include "object.h"
|
|
|
|
typedef struct {
|
|
/*0x00*/ Entity base;
|
|
} ThunderboltEntity;
|
|
|
|
void Thunderbolt_Init(ThunderboltEntity*);
|
|
void Thunderbolt_Action1(ThunderboltEntity*);
|
|
void sub_08093ED0(ThunderboltEntity*);
|
|
void sub_08093EF0(ThunderboltEntity*);
|
|
|
|
typedef struct {
|
|
u16 sfx;
|
|
u8 unk_2;
|
|
u8 unk_3;
|
|
} struct_08122950;
|
|
|
|
const struct_08122950 gUnk_08122950[] = {
|
|
{ 244, 31, 0 },
|
|
{ 0, 31, 0 },
|
|
{ 0, 31, 0 },
|
|
};
|
|
|
|
void Thunderbolt(ThunderboltEntity* this) {
|
|
static void (*const Thunderbolt_Actions[])(ThunderboltEntity*) = {
|
|
Thunderbolt_Init,
|
|
Thunderbolt_Action1,
|
|
};
|
|
Thunderbolt_Actions[super->action](this);
|
|
}
|
|
|
|
void Thunderbolt_Init(ThunderboltEntity* this) {
|
|
const struct_08122950* ptr;
|
|
super->action = 1;
|
|
super->flags &= ~0x80;
|
|
super->spriteSettings.draw = 1;
|
|
if (super->collisionLayer == 0) {
|
|
ResolveCollisionLayer(super);
|
|
}
|
|
InitializeAnimation(super, super->type);
|
|
ptr = &gUnk_08122950[super->type];
|
|
if ((ptr->sfx != SFX_NONE) && ((super->type2 & 0x40) == 0)) {
|
|
EnqueueSFX(ptr->sfx);
|
|
}
|
|
if ((super->type2 & 0x20) != 0) {
|
|
super->spriteRendering.b3 = 1;
|
|
}
|
|
}
|
|
|
|
void Thunderbolt_Action1(ThunderboltEntity* this) {
|
|
static void (*const gUnk_08122964[])(ThunderboltEntity*) = {
|
|
sub_08093ED0,
|
|
sub_08093EF0,
|
|
};
|
|
gUnk_08122964[gUnk_08122950[super->type].unk_2 >> 4](this);
|
|
}
|
|
|
|
void sub_08093ED0(ThunderboltEntity* this) {
|
|
GetNextFrame(super);
|
|
if ((super->frame & ANIM_DONE) != 0) {
|
|
DeleteEntity(super);
|
|
}
|
|
}
|
|
|
|
void sub_08093EF0(ThunderboltEntity* this) {
|
|
Entity* object;
|
|
switch (super->type) {
|
|
case 0:
|
|
if (super->subAction != 0) {
|
|
return;
|
|
}
|
|
GetNextFrame(super);
|
|
if ((super->frame & ANIM_DONE) == 0) {
|
|
return;
|
|
}
|
|
object = CreateObject(THUNDERBOLT, 1, 0);
|
|
if (object != NULL) {
|
|
object->parent = super->parent;
|
|
CopyPosition(super, object);
|
|
}
|
|
DeleteThisEntity();
|
|
break;
|
|
case 1:
|
|
GetNextFrame(super);
|
|
if ((super->frame & 1) != 0) {
|
|
super->frame = 0;
|
|
object = CreateObject(THUNDERBOLT, 2, 0);
|
|
if (object != NULL) {
|
|
object->parent = super->parent;
|
|
CopyPosition(super, object);
|
|
}
|
|
}
|
|
if ((super->frame & ANIM_DONE) == 0) {
|
|
return;
|
|
}
|
|
if (super->parent == &gPlayerEntity.base) {
|
|
SoundReq(SFX_PLY_VO6);
|
|
sub_08079D84();
|
|
}
|
|
DeleteThisEntity();
|
|
break;
|
|
case 2:
|
|
GetNextFrame(super);
|
|
if ((super->frame & ANIM_DONE) == 0) {
|
|
return;
|
|
}
|
|
DeleteThisEntity();
|
|
break;
|
|
}
|
|
}
|