295 lines
9.1 KiB
C
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;
|
|
}
|
|
}
|
|
}
|