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

187 lines
5.0 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern int func_8024DD34(f32, f32, f32);
#define _SQ3(x, y, z) (((x) * (x)) + ((y) * (y)) + ((z) * (z)))
#define _SQ3v1(v) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2])
/*.code*/
void func_802F87B0(struct6s *this){
f32 plyrPos[3]; //sp7C
f32 camNorm[3]; //sp70
f32 camRot[3]; //sp64
struct5s * ptr;
f32 f20;
int i;
f32 sp4C[3];
if(vector_size(this->unk1C) >= this->unk20)
return;
player_getPosition(plyrPos);
func_8024C5A8(camNorm);
func_8024C764(camRot);
ptr = vector_pushBackNew(&this->unk1C);
f20 = randf2(50.0f, 1200.0f);
sp4C[0] = 0.0f;
sp4C[1] = randf2(200.0f, 500.0f);
sp4C[2] = -f20;
if(gu_sqrtf(_SQ3v1((&this->unkC))) < 5.0f)
{
ml_vec3f_yaw_rotate_copy(sp4C, sp4C, randf2(0.0f, 360.0f));
}
else{
ml_vec3f_yaw_rotate_copy(sp4C, sp4C, camRot[1] + randf2(-70.0f, 70.0f));
}//L802F88F0
sp4C[0] += plyrPos[0];
sp4C[1] += plyrPos[1];
sp4C[2] += plyrPos[2];
if(f20 < 600.0){
for(i = 0; i <10 && func_8024DD34(sp4C[0], sp4C[1] - 10.0f, sp4C[2]); i++){
sp4C[1] += 100.0f;
}
}
ptr->unk4[0] = sp4C[0];
ptr->unk4[1] = sp4C[1];
ptr->unk4[2] = sp4C[2];
ptr->unk10[0] = 0.0f;
ptr->unk10[1] = randf2(-100.0f, -100.0f);
ptr->unk10[2] = 0.0f;
ptr->unk1C[0] = ptr->unk1C[1] = ptr->unk1C[2] = 0.0f;
ptr->unk28[0] = randf2(-300.0f, 300.0f);
ptr->unk28[1] = randf2(-300.0f, 300.0f);
ptr->unk28[2] = randf2(-300.0f, 300.0f);
this->unk34++;
if(!(this->unk34 < 4))
this->unk34 = 0;
ptr->unk0 = this->unk24[this->unk34];
}
void func_802F8A68(struct6s *this, s32 arg1){
this->unk22 = arg1;
}
void func_802F8A70(struct6s *this){
vector_clear(this->unk1C);
}
void func_802F8A90(struct6s *this, Gfx **gdl, Mtx **mptr, Vtx **vptr){
struct5s * startPtr = vector_getBegin(this->unk1C);
struct5s * iPtr;
struct5s * endPtr = vector_getEnd(this->unk1C);
for(iPtr = startPtr; iPtr < endPtr; iPtr++){
set_model_render_mode(2);
func_803391A4(gdl, mptr, iPtr->unk4, iPtr->unk1C, 1.0f, NULL, iPtr->unk0);
iPtr->unk34 = func_8033A170();
}
}
int func_802F8B50(struct6s *this){
return this->unk22 != 1 && (u32)vector_size(this->unk1C) < 1;
}
void func_802F8B8C(struct6s *this){
vector_free(this->unk1C);
func_8033BD20(&this->unk24[0]);
func_8033BD20(&this->unk24[1]);
func_8033BD20(&this->unk24[2]);
func_8033BD20(&this->unk24[3]);
free(this);
}
struct6s * func_802F8BE0(s32 arg0){
struct6s *this = (struct6s *) malloc(sizeof(struct6s));
vector(struct5s) *vecPtr;
this->unk18 = 0;
this->unk8 = 0.0f;
this->unk4 = 0.0f;
this->unk0 = 0.0f;
this->unk14 = 0.0f;
this->unk10 = 0.0f;
this->unkC = 0.0f;
vecPtr = vector_new(sizeof(struct5s), arg0);
this->unk1C = vecPtr;
this->unk20 = arg0;
this->unk22 = 0;
this->unk24[0] = assetcache_get(0x899); //rain
this->unk24[1] = assetcache_get(0x89A); //red_leaf
this->unk24[2] = assetcache_get(0x89B); //brown_leaf
this->unk24[3] = assetcache_get(0x89C); //green_leaf
this->unk34 = 0;
this->unk38 = 0.1f;
return this;
}
void func_802F8C90(struct6s *this){
func_802F8A68(this, 1);
}
void func_802F8CB0(struct6s *this){
func_802F8A68(this, 2);
}
void func_802F8CD0(struct6s * this){
f32 plyr_pos[3];//sp64
f32 f20 = time_getDelta();
int i;
struct5s *iPtr;
player_getPosition(plyr_pos);
this->unkC = plyr_pos[0] - this->unk0;
this->unk10 = plyr_pos[1] - this->unk4;
this->unk14 = plyr_pos[2] - this->unk8;
this->unk0 = plyr_pos[0];
this->unk4 = plyr_pos[1];
this->unk8 = plyr_pos[2];
if(func_802BEF64()){
vector_clear(this->unk1C);
}
for(i = 0; i < vector_size(this->unk1C); i++){
iPtr;
iPtr = vector_at(this->unk1C, i);
iPtr->unk4[0] += iPtr->unk10[0]*f20;
iPtr->unk4[1] += iPtr->unk10[1]*f20;
iPtr->unk4[2] += iPtr->unk10[2]*f20;
iPtr->unk10[0] += randf2(-400.0f, 400.0f)*f20;
iPtr->unk10[2] += randf2(-400.0f, 400.0f)*f20;
iPtr->unk1C[0] += iPtr->unk28[0]*f20;
iPtr->unk1C[1] += iPtr->unk28[1]*f20;
iPtr->unk1C[2] += iPtr->unk28[2]*f20;
iPtr->unk28[0] += randf2(-300.0f, 300.0f)*f20;
iPtr->unk28[1] += randf2(-300.0f, 300.0f)*f20;
iPtr->unk28[2] += randf2(-300.0f, 300.0f)*f20;
if(iPtr->unk4[1] < plyr_pos[1] - 500.0f && !iPtr->unk34){
vector_remove(this->unk1C, i);
i--;
}
}
this->unk18++;
if((s32)this->unk18 < vector_size(this->unk1C)){
iPtr = vector_at(this->unk1C, this->unk18);
if(1320.0 < ml_vec3f_distance(iPtr->unk4, plyr_pos)){
vector_remove(this->unk1C, this->unk18);
}
}
else{
this->unk18 = 0;
}
if(func_8025773C(&this->unk38, f20)){
if(this->unk22 == 1 && !func_802BEF64())
func_802F87B0(this);
this->unk38 = 0.1f;
}
}