Files
banjo-kazooie/src/lair/code_A810.c
2024-10-08 23:55:59 +02:00

149 lines
3.9 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern func_80391EA8(ActorMarker *, ActorMarker *, f32 [3], f32, f32, s32);
typedef struct {
f32 unk0[4][3];
}ActorLocal_lair_A810;
void func_80390E28(Actor *this);
/* .data */
ActorInfo D_80394A80 = { 0x1EC, 0x377, 0x0, 0x0, NULL, func_80390E28, actor_update_func_80326224, func_80325340, 3000, 0, 0.0f, 0};
/* .bss */
f32 D_80395370[0x14][3];
s32 D_80395460;
/* .code */
void func_80390C00(ActorMarker *marker)
{
Actor *actor;
Actor *newActor;
s32 pad;
actor = marker_getActor(reinterpret_cast(ActorMarker *, marker));
newActor = spawn_child_actor(0x3BB, &actor);
func_80391EA8(
newActor->marker, actor->marker, actor->unk1C,
randf2(1400, 1800),
randf2(0.2f, 0.6f),
randf() < 0.5 ? 1 : 0
);
}
void func_80390CB4(ActorMarker *marker)
{
Actor *actor;
Actor *newActor;
s32 pad;
actor = marker_getActor(reinterpret_cast(ActorMarker *, marker));
newActor = spawn_child_actor(0x3BB, &actor);
func_80391EA8(
newActor->marker, actor->marker, actor->unk1C,
randf2(1200, 1400),
randf2(0.8f, 1),
-1
);
}
void func_80390D3C(Actor *this, s32 val)
{
ActorLocal_lair_A810 *local;
local = (ActorLocal_lair_A810 *)&this->local;
subaddie_set_state(this, val);
switch (val)
{
case 2:
{
if (this->unk10_12 != 0)
{
s32 rand = randi2(0, this->unk10_12);
this->unk1C[0] = local->unk0[rand][0];
this->unk1C[1] = local->unk0[rand][1];
this->unk1C[2] = local->unk0[rand][2];
}
else
{
this->unk1C[0] = this->position_x;
this->unk1C[1] = this->position_y;
this->unk1C[2] = this->position_z;
}
__spawnQueue_add_1((GenFunction_1)func_80390C00, reinterpret_cast(s32, this->marker));
break;
}
case 1:
{
this->unk1C[0] = this->position_x;
this->unk1C[1] = this->position_y;
this->unk1C[2] = this->position_z;
__spawnQueue_add_1((GenFunction_1)func_80390CB4, reinterpret_cast(s32, this->marker));
break;
}
default:
break;
}
}
void func_80390E28(Actor *this) {
ActorLocal_lair_A810 *local;
bool sp38;
s32 i;
f32 temp_f0;
local = (ActorLocal_lair_A810 *)&this->local;
sp38 = mapSpecificFlags_getN(0, 2);
if (!this->initialized) {
if (D_80395460 == 0) {
D_80395460 = func_8030508C(0x377, D_80395370[0], 0x14);
}
this->unk10_12 = 0;
for(i = 0; (i < D_80395460) && (this->unk10_12 < 4); i++){
temp_f0 = ml_distance_vec3f(this->position, D_80395370[i]);
if ((temp_f0 > 400.0f) && (temp_f0 < 1200.0f)) {
local->unk0[this->unk10_12][0] = D_80395370[i][0];
local->unk0[this->unk10_12][1] = D_80395370[i][1];
local->unk0[this->unk10_12][2] = D_80395370[i][2];
this->unk10_12++;
}
}
this->initialized = TRUE;
}
if (!this->volatile_initialized) {
if (sp38 != 0) {
mapSpecificFlags_setN(0, 0, 2);
}
this->volatile_initialized = TRUE;
return;
}
switch (this->state) {
case 0:
if( gcquiz_isNotInInitialState() == FALSE && (sp38 < 2) && (randf() < 0.1) && !mapSpecificFlags_get(0xA) && !volatileFlag_get(VOLATILE_FLAG_1F_IN_CHARACTER_PARADE)) {
sp38++;
mapSpecificFlags_setN(0, sp38, 2);
func_80390D3C(this, (randf() < 0.5) ? 2 :1);
}
break;
case 1:
case 2:
if (this->unk38_0) {
func_80390D3C(this, 0);
this->unk38_0 = FALSE;
}
break;
}
}