Shipwright/soh/src/overlays/actors/ovl_En_Anubice_Tag/z_en_anubice_tag.c

114 lines
3.8 KiB
C

/*
* File: z_en_anubice_tag.c
* Overlay: ovl_En_Anubice_Tag
* Description: Spawns and manages the Anubis enemy
*/
#include "z_en_anubice_tag.h"
#include "vt.h"
#define FLAGS ACTOR_FLAG_4
void EnAnubiceTag_Init(Actor* thisx, GlobalContext* globalCtx);
void EnAnubiceTag_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnAnubiceTag_Update(Actor* thisx, GlobalContext* globalCtx);
void EnAnubiceTag_Draw(Actor* thisx, GlobalContext* globalCtx);
void EnAnubiceTag_SpawnAnubis(EnAnubiceTag* this, GlobalContext* globalCtx);
void EnAnubiceTag_ManageAnubis(EnAnubiceTag* this, GlobalContext* globalCtx);
const ActorInit En_Anubice_Tag_InitVars = {
ACTOR_EN_ANUBICE_TAG,
ACTORCAT_SWITCH,
FLAGS,
OBJECT_GAMEPLAY_KEEP,
sizeof(EnAnubiceTag),
(ActorFunc)EnAnubiceTag_Init,
(ActorFunc)EnAnubiceTag_Destroy,
(ActorFunc)EnAnubiceTag_Update,
(ActorFunc)EnAnubiceTag_Draw,
NULL,
};
void EnAnubiceTag_Init(Actor* thisx, GlobalContext* globalCtx) {
EnAnubiceTag* this = (EnAnubiceTag*)thisx;
osSyncPrintf("\n\n");
// "Anubis control tag generated"
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ アヌビス制御タグ発生 ☆☆☆☆☆ %d\n" VT_RST, this->actor.params);
if (this->actor.params < -1) {
this->actor.params = 0;
}
if (this->actor.params != 0) {
this->triggerRange = this->actor.params * 40.0f;
}
this->actionFunc = EnAnubiceTag_SpawnAnubis;
}
void EnAnubiceTag_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void EnAnubiceTag_SpawnAnubis(EnAnubiceTag* this, GlobalContext* globalCtx) {
this->anubis = (EnAnubice*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_ANUBICE,
this->actor.world.pos.x, this->actor.world.pos.y,
this->actor.world.pos.z, 0, this->actor.yawTowardsPlayer, 0, 0);
if (this->anubis != NULL) {
this->actionFunc = EnAnubiceTag_ManageAnubis;
}
}
void EnAnubiceTag_ManageAnubis(EnAnubiceTag* this, GlobalContext* globalCtx) {
EnAnubice* anubis;
Vec3f offset;
if (this->anubis != NULL) {
anubis = this->anubis;
if (anubis->actor.update == NULL) {
return;
}
} else {
Actor_Kill(&this->actor);
return;
}
if (anubis->deathTimer != 0) {
Actor_Kill(&this->actor);
return;
}
if (this->actor.xzDistToPlayer < (200.0f + this->triggerRange)) {
if (!anubis->isLinkOutOfRange) {
if (!anubis->isKnockedback) {
anubis->isMirroringLink = true;
offset.x = -Math_SinS(this->actor.yawTowardsPlayer) * this->actor.xzDistToPlayer;
offset.z = -Math_CosS(this->actor.yawTowardsPlayer) * this->actor.xzDistToPlayer;
Math_ApproachF(&anubis->actor.world.pos.x, (this->actor.world.pos.x + offset.x), 0.3f, 10.0f);
Math_ApproachF(&anubis->actor.world.pos.z, (this->actor.world.pos.z + offset.z), 0.3f, 10.0f);
return;
}
}
} else {
if (anubis->isMirroringLink) {
anubis->isLinkOutOfRange = true;
}
}
}
void EnAnubiceTag_Update(Actor* thisx, GlobalContext* globalCtx) {
EnAnubiceTag* this = (EnAnubiceTag*)thisx;
this->actionFunc(this, globalCtx);
}
void EnAnubiceTag_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnAnubiceTag* this = (EnAnubiceTag*)thisx;
if (BREG(0) != 0) {
DebugDisplay_AddObject(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z,
this->actor.world.rot.x, this->actor.world.rot.y, this->actor.world.rot.z, 1.0f, 1.0f,
1.0f, 0xFF, 0, 0, 0xFF, 4, globalCtx->state.gfxCtx);
}
}