mirror of
https://github.com/zeldaret/tmc
synced 2026-06-01 01:39:50 -04:00
267 lines
7.1 KiB
C
267 lines
7.1 KiB
C
/**
|
|
* @file deathFx.c
|
|
* @ingroup Objects
|
|
*
|
|
* @brief Death Fx object
|
|
*/
|
|
#define NENT_DEPRECATED
|
|
#include "enemy.h"
|
|
#include "entity.h"
|
|
#include "functions.h"
|
|
#include "global.h"
|
|
#include "object/deathFx.h"
|
|
#include "sound.h"
|
|
|
|
void sub_08081790(DeathFxObject* this);
|
|
void DeathFx_Delete(DeathFxObject* this);
|
|
|
|
void DeathFx_Action0(DeathFxObject* this);
|
|
void DeathFx_Action1(DeathFxObject* this);
|
|
void DeathFx_Action2(DeathFxObject* this);
|
|
void DeathFx(Entity* this) {
|
|
static void (*const DeathFx_Actions[])(DeathFxObject*) = {
|
|
DeathFx_Action0,
|
|
DeathFx_Action1,
|
|
DeathFx_Action2,
|
|
};
|
|
DeathFx_Actions[this->action]((DeathFxObject*)this);
|
|
}
|
|
|
|
void DeathFx_Action0(DeathFxObject* this) {
|
|
static const u8 gUnk_0811EC08[] = {
|
|
0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
};
|
|
static const u8 gUnk_0811EC20[] = {
|
|
26,
|
|
14,
|
|
26,
|
|
26,
|
|
};
|
|
Entity* parent;
|
|
int uVar4;
|
|
u32 tmp;
|
|
|
|
if (this->unk6c & 1) {
|
|
super->spriteIndex = 0x65;
|
|
super->action = 2;
|
|
super->direction = 0;
|
|
super->speed = 0x40;
|
|
super->collisionLayer = 2;
|
|
UpdateSpriteForCollisionLayer(&this->base);
|
|
super->spriteRendering.b0 = 3;
|
|
if (super->timer == 0) {
|
|
tmp = 0x80;
|
|
} else {
|
|
tmp = super->timer;
|
|
super->timer = 0;
|
|
}
|
|
SetAffineInfo(super, tmp, tmp, 0);
|
|
LoadSwapGFX(super, 4, 0);
|
|
InitAnimationForceUpdate(super, 0);
|
|
SoundReq(SFX_BOSS_EXPLODE);
|
|
} else {
|
|
if (this->unk6c & 0xc) {
|
|
sub_08081790(this);
|
|
DeathFx_Delete(this);
|
|
} else {
|
|
if (this->unk6c & 2) {
|
|
InitializeAnimation(&this->base, 2);
|
|
} else {
|
|
super->spritePriority.b0 = 3;
|
|
uVar4 = gUnk_0811EC08[super->type >> 2];
|
|
uVar4 >>= ((super->type % 4) << 1);
|
|
uVar4 &= 3;
|
|
parent = super->parent;
|
|
if (parent != NULL) {
|
|
parent->timer = gUnk_0811EC20[uVar4];
|
|
}
|
|
InitializeAnimation(&this->base, uVar4);
|
|
}
|
|
}
|
|
super->action = 1;
|
|
EnqueueSFX(SFX_FF);
|
|
}
|
|
SetDefaultPriority(super, 3);
|
|
}
|
|
|
|
void DeathFx_Action1(DeathFxObject* this) {
|
|
GetNextFrame(super);
|
|
if (super->frame & ANIM_DONE) {
|
|
sub_08081790(this);
|
|
DeathFx_Delete(this);
|
|
} else {
|
|
if ((super->frame & 1) != 0) {
|
|
super->spritePriority.b0 = 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
void DeathFx_Action2(DeathFxObject* this) {
|
|
UpdateAnimationSingleFrame(super);
|
|
if (super->frame & ANIM_DONE) {
|
|
DeathFx_Delete(this);
|
|
} else {
|
|
if ((super->frame & 1) != 0) {
|
|
LinearMoveUpdate(super);
|
|
}
|
|
}
|
|
}
|
|
|
|
void DeathFx_DropRandom9(DeathFxObject* this);
|
|
void DeathFx_DropRandom13(DeathFxObject* this);
|
|
void DeathFx_DropRandom1(DeathFxObject* this);
|
|
void DeathFx_DropRandom14(DeathFxObject* this);
|
|
void DeathFx_DropFixedItem(DeathFxObject* this);
|
|
void sub_08081790(DeathFxObject* this) {
|
|
static void (*const DeathFx_DropFunctions[])(DeathFxObject*) = {
|
|
DeathFx_DropRandom9, DeathFx_DropRandom13, DeathFx_DropRandom1, DeathFx_DropRandom14,
|
|
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9,
|
|
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9,
|
|
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropFixedItem,
|
|
};
|
|
static const u8 DeathFx_EnemyDroptables[] = {
|
|
[OCTOROK] = 6,
|
|
[CHUCHU] = 6,
|
|
[LEEVER] = 6,
|
|
[PEAHAT] = 6,
|
|
[ROLLOBITE] = 0,
|
|
[DARK_NUT] = 11,
|
|
[HANGING_SEED] = 0,
|
|
[BEETLE] = 6,
|
|
[KEESE] = 6,
|
|
[DOOR_MIMIC] = 0,
|
|
[ROCK_CHUCHU] = 10,
|
|
[SPINY_CHUCHU] = 6,
|
|
[CUCCO_CHICK_AGGR] = 6,
|
|
[MOLDORM] = 7,
|
|
[ENEMY_E] = 6,
|
|
[MOLDWORM] = 6,
|
|
[SLUGGULA] = 6,
|
|
[PESTO] = 0,
|
|
[PUFFSTOOL] = 6,
|
|
[CHUCHU_BOSS] = 6,
|
|
[LIKE_LIKE] = 6,
|
|
[SPEAR_MOBLIN] = 8,
|
|
[BUSINESS_SCRUB] = 0,
|
|
[RUPEE_LIKE] = 8,
|
|
[MADDERPILLAR] = 6,
|
|
[WATER_DROP] = 6,
|
|
[WALL_MASTER] = 8,
|
|
[BOMB_PEAHAT] = 10,
|
|
[SPARK] = 6,
|
|
[CHASER] = 0,
|
|
[SPIKED_BEETLE] = 6,
|
|
[SENSOR_BLADE_TRAP] = 0,
|
|
[HELMASAUR] = 6,
|
|
[FALLING_BOULDER] = 0,
|
|
[BOBOMB] = 10,
|
|
[WALL_MASTER_2] = 8,
|
|
[GLEEROK] = 6,
|
|
[VAATI_EYES_MACRO] = 0,
|
|
[TEKTITE] = 6,
|
|
[WIZZROBE_WIND] = 6,
|
|
[WIZZROBE_FIRE] = 6,
|
|
[WIZZROBE_ICE] = 6,
|
|
[ARMOS] = 11,
|
|
[EYEGORE] = 9,
|
|
[ROPE] = 6,
|
|
[SMALL_PESTO] = 1,
|
|
[ACRO_BANDIT] = 6,
|
|
[BLADE_TRAP] = 0,
|
|
[KEATON] = 7,
|
|
[CROW] = 6,
|
|
[MULLDOZER] = 6,
|
|
[BOMBAROSSA] = 6,
|
|
[WISP] = 0,
|
|
[SPINY_BEETLE] = 6,
|
|
[MAZAAL_HEAD] = 6,
|
|
[MAZAAL_MACRO] = 6,
|
|
[MAZAAL_HAND] = 6,
|
|
[OCTOROK_BOSS] = 6,
|
|
[FLYING_POT] = 6,
|
|
[GOBDO] = 6,
|
|
[OCTOROK_GOLDEN] = 6,
|
|
[TEKTITE_GOLDEN] = 6,
|
|
[ROPE_GOLDEN] = 6,
|
|
[CLOUD_PIRANHA] = 6,
|
|
[SCISSORS_BEETLE] = 7,
|
|
[CUCCO_AGGR] = 6,
|
|
[STALFOS] = 7,
|
|
[FLYING_SKULL] = 6,
|
|
[MAZAAL_BRACELET] = 6,
|
|
[TAKKURI] = 6,
|
|
[BOW_MOBLIN] = 8,
|
|
[LAKITU] = 6,
|
|
[LAKITU_CLOUD] = 6,
|
|
[TORCH_TRAP] = 6,
|
|
[VAATI_REBORN_ENEMY] = 6,
|
|
[VAATI_PROJECTILE] = 6,
|
|
[BALL_CHAIN_SOLIDER] = 8,
|
|
[ENEMY_4D] = 8,
|
|
[GHINI] = 6,
|
|
[VAATI_TRANSFIGURED] = 6,
|
|
[ENEMY_50] = 6,
|
|
[VAATI_WRATH] = 6,
|
|
[VAATI_ARM] = 12,
|
|
[DUST] = 0,
|
|
[VAATI_BALL] = 6,
|
|
[OCTOROK2] = 6,
|
|
[SLIME] = 6,
|
|
[MINI_SLIME] = 6,
|
|
[FIREBALL_GUY] = 6,
|
|
[MINI_FIREBALL_GUY] = 6,
|
|
[VAATI_TRANSFIGURED_EYE] = 6,
|
|
[BUSINESS_SCRUB_PROLOGUE] = 0,
|
|
[GYORG_FEMALE] = 6,
|
|
[GYORG_MALE] = 6,
|
|
[CURTAIN] = 0,
|
|
[VAATI_WRATH_EYE] = 6,
|
|
[GYORG_CHILD] = 12,
|
|
[GYORG_FEMALE_EYE] = 6,
|
|
[GYORG_MALE_EYE] = 6,
|
|
[GYORG_FEMALE_MOUTH] = 6,
|
|
[ENEMY_64] = 6,
|
|
[TREE_ITEM] = 6,
|
|
[ENEMY_66] = 6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
};
|
|
if (this->parentId < 0xf0) {
|
|
CreateRandomItemDrop(super, DeathFx_EnemyDroptables[this->parentId]);
|
|
} else {
|
|
DeathFx_DropFunctions[this->parentId - 0xf0](this);
|
|
}
|
|
}
|
|
|
|
void DeathFx_DropRandom9(DeathFxObject* this) {
|
|
CreateRandomItemDrop(super, 9);
|
|
}
|
|
|
|
void DeathFx_DropRandom13(DeathFxObject* this) {
|
|
CreateRandomItemDrop(super, 13);
|
|
}
|
|
|
|
void DeathFx_DropRandom14(DeathFxObject* this) {
|
|
CreateRandomItemDrop(super, 14);
|
|
}
|
|
|
|
void DeathFx_DropRandom1(DeathFxObject* this) {
|
|
CreateRandomItemDrop(super, 1);
|
|
}
|
|
|
|
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter);
|
|
void DeathFx_DropFixedItem(DeathFxObject* this) {
|
|
CreateItemDrop(super, this->item, 0);
|
|
}
|
|
|
|
void DeathFx_Delete(DeathFxObject* this) {
|
|
DeleteThisEntity();
|
|
}
|