Files
banjo-kazooie/src/core2/code_41460.c
2022-07-15 17:09:41 -05:00

295 lines
9.1 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern void func_802EE6CC(f32[3], f32[3], s32[4], s32, f32, f32, s32, s32, s32);
typedef struct struct_24_s{
s32 unk0;
BKModelBin *model_bin;
f32 unk8[3];
f32 unk14[3];
f32 unk20[3];
f32 unk2C;
f32 unk30[3];
ParticleEmitter *unk3C;
s32 unk40[4];
f32 unk50;
} Struct24s;
typedef struct struct_25_s{
Struct24s *begin;
Struct24s *current;
Struct24s *end;
Struct24s data[];
} Struct25s;
Actor *func_802C8484(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
void func_802C8C5C(Actor *this);
/* .data */
f32 D_80366330 = 0.5f;
f32 D_80366334 = 30.0f;
f32 D_80366338 = 150.0f;
f32 D_8036633C = 25.0f;
ActorInfo D_80366340 = { 0x56, 0x4A, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
ActorInfo D_80366364 = { 0x56, 0x4B, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
ActorInfo D_80366388 = { 0x56, 0xD, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
ActorInfo D_803663AC = { 0x56, 0x11F, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
ActorInfo D_803663D0 = { 0x56, 0x14F, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
ActorInfo D_803663F4 = { 0x56, 0x3AD, 0x0, 0x2, 0x0, func_802C8C5C, func_80326224, func_802C8484, 0, 0, 0.0f, 0};
s32 D_80366418[3] = {0,0,0};
/* .bss */
s32 D_8037DD90;
s32 D_8037DD94;
u32 D_8037DD98;
u32 D_8037DD9C;
u32 D_8037DDA0;
u32 D_8037DDA4;
/* .code */
void func_802C83F0(Actor *actor) {
Struct25s *phi_a1;
Struct24s *phi_s0;
phi_a1 = actor->unk40;
for( phi_s0 = phi_a1->begin; phi_s0 < phi_a1->current; phi_s0++){
if (phi_s0->model_bin != NULL) {
assetcache_release(phi_s0->model_bin);
}
if (phi_s0->unk3C != 0) {
func_802EE5E8(phi_s0->unk3C);
}
phi_s0->unk3C = NULL;
}
free(actor->unk40);
}
Actor *func_802C8484(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
Struct25s *temp_s1;
Struct24s *phi_s0;
f32 sp5C;
Actor *sp58;
u32 phi_v1;
s32 phi_s4;
sp58 = func_80325300(marker, &sp5C);
temp_s1 = sp58->unk40;
phi_s4 = FALSE;
for(phi_s0 = temp_s1->begin; phi_s0 < temp_s1->current; phi_s0++){
if ((phi_s0->unk0 != 0) && (phi_s0->model_bin != NULL)) {
set_model_render_mode(1);
func_803391A4(gfx, mtx, phi_s0->unk8, phi_s0->unk14, phi_s0->unk2C / 10.0f, NULL, phi_s0->model_bin);
phi_s4 = TRUE;
}
}
if (phi_s4 == FALSE) {
marker_despawn(marker);
}
return sp58;
}
Actor *func_802C8580(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
Struct25s *s1 = malloc(sizeof(Struct25s) + D_8037DD90 * sizeof(Struct24s));
Actor *actor = actor_new(position, yaw, actorInfo, flags);
f32 f24;
f32 sp68[3];
Struct24s * s0;
actor->marker->collidable = FALSE;
s1->begin = &s1->data[0];
s1->current = &s1->data[0];
s1->end = s1->begin + D_8037DD90;
for(s1->current = s1->begin; s1->current < s1->end; s1->current++){//L802C8670
f24 = randf2(0.0f, 360.0f);
s0 = s1->current;
s0->unk0 = 2;
s0->unk40[0] = D_8037DD98;
s0->unk40[1] = D_8037DD9C;
s0->unk40[2] = D_8037DDA0;
s0->unk40[3] = D_8037DDA4;
TUPLE_ASSIGN(s0->unk30,
randf2(100.0f, 250.0f),
randf2(500.0f, 750.0f),
randf2(100.0f, 250.0f)
);
s0->unk8[0] = randf2(50.0f, 150.0f);
s0->unk8[1] = 0.0f;
s0->unk8[2] = 0.0f;
switch(D_8037DD94){
case 1: // 802C8740
s0->unk30[0] = randf2(125.0f, 175.0f);
s0->unk30[1] = randf2(400.0f, 600.0f);
s0->unk30[2] = randf2(125.0f, 175.0f);
s0->model_bin = (BKModelBin *) assetcache_get(0x2e7);
s0->unk2C = 18.0f;
break;
case 2: // 802C87A8
s0->model_bin = (BKModelBin *) assetcache_get(0x344);
s0->unk2C = 2.0f;
break;
case 4: // 802C87C4
s0->model_bin = (BKModelBin *) assetcache_get(0x345);
s0->unk2C = 1.0f;
s0->unk30[0] = randf2(20.0f, 100.0f);
s0->unk30[1] = randf2(400.0f, 740.0f);
s0->unk30[2] = randf2(20.0f, 100.0f);
s0->unk8[0] = randf2(0.0f, 30.0f);
s0->unk8[1] = 0.0f;
s0->unk8[2] = 0.0f;
break;
case 0: // 802C883C
if(0.5 < randf())
s0->model_bin = (BKModelBin *) assetcache_get(0x2d1);
else
s0->model_bin = (BKModelBin *) assetcache_get(0x2e5);
s0->unk2C = randf2(5.0f, 12.0f);
break;
case 3: // 802C88A0
s0->model_bin = (BKModelBin *) assetcache_get(0x30e);
s0->unk2C = randf2(9.0f, 15.0f);
break;
case 5: // 802C88C8
s0->model_bin = (BKModelBin *) assetcache_get(0x8a2);
s0->unk2C = 2.0f;
break;
}//L802C88E0
s0->unk3C = 0;
sp68[0] = (f32)position[0];
sp68[1] = (f32)position[1];
sp68[2] = (f32)position[2];
sp68[0] += s0->unk30[0]*3.0f;
s0->unk50 = func_80309724(&sp68);
s0->unk14[2] = 0.0f;
s0->unk14[1] = 0.0f;
s0->unk14[0] = 0.0f;
s0->unk20[0] = randf2(0.05f, 0.4f);
s0->unk20[1] = randf2(0.05f, 0.4f);
s0->unk20[2] = randf2(0.05f, 0.4f);
ml_vec3f_yaw_rotate_copy(&s0->unk8, &s0->unk8, f24);
s0->unk8[0] += actor->position_x;
s0->unk8[1] += actor->position_y;
s0->unk8[2] += actor->position_z;
ml_vec3f_yaw_rotate_copy(&s0->unk30, &s0->unk30, randf2(15.0f, 90.0f) + f24);
}//L802C8A08
actor->unk40 = s1;
func_803300D8(actor->marker, func_802C83F0);
return actor;
}
Actor *func_802C8A54(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0xF;
D_8037DD94 = 1;
D_8037DD98 = 0xFA;
*(&D_8037DD98 + 1) = 0xFA;
*(&D_8037DD98 + 2) = 0xFA;
*(&D_8037DD98 + 3) = 0x78;
return func_802C8580(position, yaw, actorInfo, flags);
}
Actor *func_802C8AA8(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0x19;
D_8037DD94 = 0;
D_8037DD98 = 0xFA;
*(&D_8037DD98 + 1) = 0xFA;
*(&D_8037DD98 + 2) = 0xFA;
*(&D_8037DD98 + 3) = 0x78;
return func_802C8580(position, yaw, actorInfo, flags);
}
Actor *func_802C8AF8(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0x19;
D_8037DD94 = 3;
D_8037DD98 = 0xFA;
*(&D_8037DD98 + 1) = 0xFA;
*(&D_8037DD98 + 2) = 0xFA;
*(&D_8037DD98 + 3) = 0x78;
return func_802C8580(position, yaw, actorInfo, flags);
}
Actor *func_802C8B4C(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0xF;
D_8037DD94 = 2;
D_8037DD98 = 0x95;
*(&D_8037DD98 + 1) = 0x55;
*(&D_8037DD98 + 2) = 0x2B;
*(&D_8037DD98 + 3) = 0x9B;
return func_802C8580(position, yaw, actorInfo, flags);
}
Actor *func_802C8BA8(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0x19;
D_8037DD94 = 4;
D_8037DD98 = 0x95;
*(&D_8037DD98 + 1) = 0x55;
*(&D_8037DD98 + 2) = 0x2B;
*(&D_8037DD98 + 3) = 0x9B;
return func_802C8580(position, yaw, actorInfo, flags);
}
Actor *func_802C8C04(s32 position[3], s32 yaw, ActorInfo* actorInfo, u32 flags){
D_8037DD90 = 0xf;
D_8037DD94 = 5;
D_8037DD98 = 0xC8;
*(&D_8037DD98 + 1) = 0xC8;
*(&D_8037DD98 + 2) = 0xA0;
*(&D_8037DD98 + 3) = 0x9B;
return func_802C8580(position, yaw, actorInfo, flags);
}
void func_802C8C5C(Actor *actor) {
f32 sp94[3];
f32 temp_f0 = time_getDelta();
f32 sp84[3];
Struct25s *temp_s2 = actor->unk40;
Struct24s *phi_s0;
s32 sp70[3] = D_80366418;
for(phi_s0 = temp_s2->begin; phi_s0 < temp_s2->current; phi_s0++){
if (phi_s0->unk0 == 2) {
phi_s0->unk30[1] -= 1000.0f * temp_f0;
phi_s0->unk14[0] += phi_s0->unk20[0] / temp_f0;
phi_s0->unk14[1] += phi_s0->unk20[1] / temp_f0;
phi_s0->unk14[2] += phi_s0->unk20[2] / temp_f0;
sp94[0] = phi_s0->unk8[0];
sp94[1] = phi_s0->unk8[1];
sp94[2] = phi_s0->unk8[2];
sp84[0] = phi_s0->unk30[0] * temp_f0;
sp84[1] = phi_s0->unk30[1] * temp_f0;
sp84[2] = phi_s0->unk30[2] * temp_f0;
phi_s0->unk8[0] = phi_s0->unk8[0] + sp84[0];
phi_s0->unk8[1] = phi_s0->unk8[1] + sp84[1];
phi_s0->unk8[2] = phi_s0->unk8[2] + sp84[2];
if (phi_s0->unk8[1] <= phi_s0->unk50) {
phi_s0->unk0 = 1;
phi_s0->unk3C = func_802EE5E0(1);
if (phi_s0->unk3C != 0) {
func_802EE6CC(phi_s0->unk8, sp70, phi_s0->unk40, 1, D_80366330, D_80366334, (s32)D_80366338, (s32)D_8036633C, 1);
}
}
}
if (phi_s0->unk0 == 1) {
if (!func_802EE5F0(phi_s0->unk3C)) {
phi_s0->unk0 = 0;
}
phi_s0->unk8[1] -= 2.0f;
}
}
}