Files
banjo-kazooie/src/core2/code_70F20.c
2024-07-01 00:28:11 -05:00

206 lines
5.7 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern s32 func_8024DD34(f32,f32, f32);
/* .code */
void func_802F7EB0(struct3s *this){
f32 plyrPos[3]; //sp74
f32 camNorm[3]; //sp68
f32 camRot[3]; //sp5C
s32 i;
f32 tmpf;
struct4s * sp50;
f32 sp4C[3];
if(vector_size(this->unk20) >= this->unk24)
return;
player_getPosition(plyrPos);
func_8024C5A8(camNorm);
viewport_get_rotation_vec3f(camRot);
sp50 = vector_pushBackNew(&this->unk20);
tmpf = randf2(50.0f, 1100.0f);
sp4C[0] = 0.0f;
sp4C[1] = randf2(200.0f, 300.0f);
sp4C[2] = -tmpf;
if(gu_sqrtf(this->unk10[0]*this->unk10[0] + this->unk10[1]*this->unk10[1] + this->unk10[2]*this->unk10[2]) < 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));
}
sp4C[0] = plyrPos[0] + sp4C[0];
sp4C[1] = plyrPos[1] + sp4C[1];
sp4C[2] = plyrPos[2] + sp4C[2];
if(tmpf < 550.0)
for(i = 0; (i < 0xa) && func_8024DD34(sp4C[0],sp4C[1]- 10.0f, sp4C[2]); i++){
sp4C[1] += 100.0f;
}
sp50->unk0[0] = sp4C[0];
sp50->unk0[1] = sp4C[1];
sp50->unk0[2] = sp4C[2];
sp50->unkC[0] = 0.0f;
sp50->unkC[1] = randf2(-1600.0f, -1500.0f);
sp50->unkC[2] = 0.0f;
}
void func_802F80E8(struct3s *this, u32 arg1){
this->unk28 = arg1;
}
void func_802F80F0(struct3s *this){
vector_clear(this->unk20);
}
void func_802F8110(struct3s *this, Gfx **gdl, Mtx **mptr, u32 arg3){
struct4s * startPtr; //sp4c
struct4s * endPtr;
struct4s * iPtr;
startPtr = vector_getBegin(this->unk20);
endPtr = vector_getEnd(this->unk20);
for(iPtr = startPtr; iPtr < endPtr; iPtr++){
modelRender_setDepthMode(MODEL_RENDER_DEPTH_COMPARE);
modelRender_draw(gdl, mptr, iPtr, 0, 1.0f, 0, this->unk2C);
iPtr->unk18 = func_8033A170();
}
}
bool func_802F81D8(struct3s *this){
return (this->unk28 != 1) && (vector_size(this->unk20) == 0);
}
void func_802F8214(struct3s * this){
if(this->unk0)
func_802F9D38(this->unk0);
vector_free(this->unk20);
func_8033BD20(&this->unk2C);
free(this);
}
struct3s *func_802F8264(s32 arg0){
struct3s * ptr = (struct3s *) malloc(sizeof(struct3s));
ptr->unk0 = 0;
ptr->unk1C = 0;
ptr->unk34 = 0;
ptr->unk4[0] = ptr->unk4[1] = ptr->unk4[2] =0.0f;
ptr->unk10[0] = ptr->unk10[1] = ptr->unk10[2] =0.0f;
ptr->unk20 = vector_new(sizeof(struct4s), arg0);
ptr->unk24 = arg0;
ptr->unk28 = 0;
ptr->unk2C = assetcache_get(0x898); //rain
ptr->unk30 = 0.1f;
return ptr;
}
void func_802F82F4(struct3s *this, f32 arg1, f32 arg2, f32 arg3, f32 arg4){
this->unk34 = 1;
this->unk38 = 0.0f;
this->unk3C = 0.1f;
this->unk40[0] = arg1;
this->unk40[1] = arg2;
this->unk40[2] = arg3;
this->unk40[3] = arg4;
}
void func_802F8338(struct3s *this){
func_802F80E8(this, 1);
}
void func_802F8358(struct3s *this){
void *tmp;
func_802F80E8(this, 2);
if(!(tmp = this->unk0))
return;
func_802F9FD0(tmp, 0.0f, 0.0f, 3.0f);
this->unk0 = NULL;
}
void func_802F83AC(struct3s *arg0) {
f32 sp3C[3];
f32 temp_f20;
struct4s *temp_v0;
s32 phi_s0;
temp_f20 = time_getDelta();
player_getPosition(sp3C);
arg0->unk10[0] = sp3C[0] - arg0->unk4[0];
arg0->unk10[1] = sp3C[1] - arg0->unk4[1];
arg0->unk10[2] = sp3C[2] - arg0->unk4[2];
arg0->unk4[0] = sp3C[0];
arg0->unk4[1] = sp3C[1];
arg0->unk4[2] = sp3C[2];
if (func_802BEF64()) {
vector_clear(arg0->unk20);
}
if (vector_size(arg0->unk20) > 0) {
if (arg0->unk0 == 0) {
arg0->unk0 = func_802F9AA8(SFX_BE_WATERFALL);
func_802F9DB8(arg0->unk0, 0.95f, 1.05f, 0.01f);
func_802F9F80(arg0->unk0, 3.0f, 1.296e7f, 0.0f);
func_802FA0B0(arg0->unk0, 2);
func_802FA060(arg0->unk0, 5000, 6000, 5.0f);
}
} else {
if (arg0->unk0 != 0) {
func_802F9D38(arg0->unk0);
arg0->unk0 = 0;
}
}
for(phi_s0 = 0; phi_s0 < vector_size(arg0->unk20); phi_s0++){
temp_v0 = (struct4s *)vector_at(arg0->unk20, phi_s0);
temp_v0->unk0[0] += temp_v0->unkC[0] * temp_f20;
temp_v0->unk0[1] += temp_v0->unkC[1] * temp_f20;
temp_v0->unk0[2] += temp_v0->unkC[2] * temp_f20;
if ((temp_v0->unk0[1] < (sp3C[1] - 500.0f)) && (temp_v0->unk18 == 0)) {
vector_remove(arg0->unk20, phi_s0);
phi_s0--;
}
}
arg0->unk1C++;
if (arg0->unk1C < vector_size(arg0->unk20)) {
temp_v0 = (struct4s *)vector_at(arg0->unk20, arg0->unk1C);
if (1210.0 < ml_distance_vec3f(temp_v0->unk0, sp3C)) {
vector_remove(arg0->unk20, arg0->unk1C);
}
} else {
arg0->unk1C = 0;
}
if (arg0->unk34 != 0) {
arg0->unk38 += temp_f20;
if (arg0->unk40[arg0->unk34 - 1] <= arg0->unk38) {
arg0->unk34++;
arg0->unk38 = 0.0f;
if (arg0->unk34 > 4) {
arg0->unk34 = 1;
}
}
if (arg0->unk34 == 1) {
arg0->unk3C = (1.0f - arg0->unk38/arg0->unk40[0]) * 0.1;
} else if (arg0->unk34 == 2) {
arg0->unk3C = 0.01f;
} else if (arg0->unk34 == 3) {
arg0->unk3C = (arg0->unk38 / arg0->unk40[2]) * 0.1;
} else {
arg0->unk3C = 0.01f;
}
if (arg0->unk3C <= 0.01) {
arg0->unk3C = 0.01f;
}
}
if (ml_timer_update(&arg0->unk30, temp_f20)) {
if ((arg0->unk28 == 1) && !func_802BEF64() && (arg0->unk34 != 4)) {
func_802F7EB0(arg0);
}
arg0->unk30 = (arg0->unk34 != 0) ? arg0->unk3C : 0.01;
}
}