314 lines
10 KiB
C
314 lines
10 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
extern void func_8032F64C(f32[3], s32);
|
|
extern void func_80323240(struct56s *, f32, f32[3]);
|
|
extern f32 func_80323F74(struct56s *, f32, f32);
|
|
extern f32 func_80256AB4(f32, f32, f32, f32);
|
|
|
|
typedef struct {
|
|
s32 unk0;
|
|
s32 unk4; //bool
|
|
s32 unk8;
|
|
f32 unkC[3];
|
|
f32 unk18;
|
|
s32 unk1C;
|
|
f32 unk20;
|
|
f32 unk24;
|
|
f32 unk28;
|
|
f32 unk2C;
|
|
}Struct_core2_C89C0_1;
|
|
|
|
typedef struct {
|
|
ActorMarker *unk0;
|
|
Struct_core2_C89C0_1 *unk4;
|
|
f32 unk8[3];
|
|
f32 unk14;
|
|
f32 unk18;
|
|
f32 unk1C;
|
|
f32 unk20;
|
|
f32 unk24[3];
|
|
f32 unk30;
|
|
f32 unk34;
|
|
f32 unk38;
|
|
}Struct_core2_C89C0_0;
|
|
|
|
/* .rodata */
|
|
extern f32 D_80379300;
|
|
extern f32 D_80379304;
|
|
extern f32 D_80379308;
|
|
extern f64 D_80379310;
|
|
extern f32 D_80379318;
|
|
extern f64 D_80379320;
|
|
extern f32 D_80379328;
|
|
extern f32 D_8037932C;
|
|
extern f32 D_80379330;
|
|
|
|
/* .bss */
|
|
extern struct {
|
|
void *unk0; //2D_fish_bin
|
|
void *unk4; //green_ball_bin
|
|
Struct_core2_C89C0_1 *unk8;
|
|
Struct_core2_C89C0_1 *unkC;
|
|
Struct_core2_C89C0_1 *unk10;
|
|
Struct_core2_C89C0_0 *unk14;
|
|
Struct_core2_C89C0_0 *unk18;
|
|
Struct_core2_C89C0_0 *unk1C;
|
|
}D_80386150;
|
|
|
|
/* .code */
|
|
void func_8034F950(Struct_core2_C89C0_0 *arg0) {
|
|
f32 sp7C[3];
|
|
f32 sp70[3];
|
|
f32 temp_f0;
|
|
s32 i;
|
|
|
|
sp7C[0] = arg0->unk4->unkC[0] + arg0->unk24[0];
|
|
sp7C[1] = arg0->unk4->unkC[1] + arg0->unk24[1];
|
|
sp7C[2] = arg0->unk4->unkC[2] + arg0->unk24[2];
|
|
sp7C[0] -= arg0->unk8[0];
|
|
sp7C[1] -= arg0->unk8[1];
|
|
sp7C[2] -= arg0->unk8[2];
|
|
|
|
for(i = 0; i < 3; i++){
|
|
sp7C[i] += randf2(-40.0f, 40.0f);
|
|
if (i != 1) {
|
|
arg0->unk24[i] += randf2(-40.0f, 40.0f);
|
|
arg0->unk24[i] = (arg0->unk24[i] > 100.0f) ? 100.0f : arg0->unk24[i];
|
|
arg0->unk24[i] = (arg0->unk24[i] < -100.0f) ? -100.0f : arg0->unk24[i];
|
|
}
|
|
}
|
|
temp_f0 = gu_sqrtf(sp7C[0]*sp7C[0] + sp7C[1]*sp7C[1] + sp7C[2]*sp7C[2]);
|
|
arg0->unk34 = (temp_f0 > 200.0f) ? 1.0f : (f32)(temp_f0 / 200.0);
|
|
sp70[0] = -1.0f;
|
|
sp70[1] = 0.0f;
|
|
sp70[2] = 0.0f;
|
|
ml_vec3f_yaw_rotate_copy(sp70, sp70, arg0->unk14);
|
|
ml_vec3f_normalize(sp7C);
|
|
if ((sp70[0]*sp7C[0] + sp70[1]*sp7C[1] + sp70[2]*sp7C[2]) < 0.0f) {
|
|
arg0->unk34 = randf2(D_80379300, D_80379304);
|
|
arg0->unk30 = randf2(0.5f, 1.0f);
|
|
} else {
|
|
arg0->unk30 = (randf2(D_80379308, 1.0f) * func_80256AB4(sp70[0], sp70[2], sp7C[0], sp7C[2]));
|
|
}
|
|
arg0->unk30 = (arg0->unk30 > 1.0f) ? 1.0f : arg0->unk30;
|
|
arg0->unk30 = (arg0->unk30 < -1.0f) ? -1.0f : arg0->unk30;
|
|
|
|
if (sp7C[1] > 0.0f) {
|
|
arg0->unk38 = (f32) (sp7C[1] / 10.0f);
|
|
if (arg0->unk38 > 1.0f) {
|
|
arg0->unk38 = 1.0f;
|
|
}
|
|
} else if (sp7C[1] < 0.0f) {
|
|
arg0->unk38 = (f32) (sp7C[1] / 10.0f);
|
|
if (arg0->unk38 < -1.0f) {
|
|
arg0->unk38 = -1.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
Actor* func_8034FCDC(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx) {
|
|
f32 sp2C[3];
|
|
Struct_core2_C89C0_0 *sp28;
|
|
|
|
sp28 = D_80386150.unk14 + marker->actrArrayIdx;
|
|
if (sp28->unk4->unk4 == 0) {
|
|
return NULL;
|
|
}
|
|
|
|
sp2C[0] = 0.0f;
|
|
sp2C[1] = sp28->unk14;
|
|
sp2C[2] = 0.0f;
|
|
set_model_render_mode(2);
|
|
func_803391A4(gfx, mtx, sp28->unk8, sp2C, sp28->unk18 * D_80379310, NULL, D_80386150.unk0);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void func_8034FDA0(s32 arg0) {
|
|
s32 sp34;
|
|
s32 sp24;
|
|
|
|
if (D_80386150.unkC == D_80386150.unk10) {
|
|
sp34 = ((s32)D_80386150.unkC - (s32)D_80386150.unk8)/0x30;
|
|
sp24 = sp34 * 2;
|
|
D_80386150.unk8 = (Struct_core2_C89C0_1*) realloc(D_80386150.unk8, sp24 * sizeof(Struct_core2_C89C0_0)); //this size is wrong type(?)
|
|
D_80386150.unkC = D_80386150.unk8 + sp34;
|
|
D_80386150.unk10 = D_80386150.unk8 + sp24;
|
|
}
|
|
D_80386150.unkC->unk0 = 1;
|
|
D_80386150.unkC->unk4 = 0;
|
|
D_80386150.unkC->unk8 = 0x14;
|
|
D_80386150.unkC->unk18 = 1000.0f;
|
|
D_80386150.unkC->unk1C = arg0;
|
|
D_80386150.unkC->unk20 = 10.0f;
|
|
D_80386150.unkC->unk24 = 20.0f;
|
|
D_80386150.unkC->unk28 = D_80379318;
|
|
D_80386150.unkC->unk2C = 0.0f;
|
|
func_80323240(func_80342038(D_80386150.unkC->unk1C), D_80386150.unkC->unk2C, D_80386150.unkC->unkC);
|
|
D_80386150.unkC++;
|
|
}
|
|
|
|
void func_8034FEE0(Struct_core2_C89C0_1 *arg0) {
|
|
s32 sp2C;
|
|
s32 sp20;
|
|
|
|
if (D_80386150.unk18 == D_80386150.unk1C) {
|
|
sp2C = D_80386150.unk18 - D_80386150.unk14;
|
|
sp20 = sp2C * 2;
|
|
D_80386150.unk14 = (Struct_core2_C89C0_0 *) realloc(D_80386150.unk14, sp20 * sizeof(Struct_core2_C89C0_0));
|
|
D_80386150.unk18 = D_80386150.unk14 + sp2C;
|
|
D_80386150.unk1C = D_80386150.unk14 + sp20;
|
|
}
|
|
D_80386150.unk18->unk4 = arg0;
|
|
D_80386150.unk18->unk8[0] = arg0->unkC[0];
|
|
D_80386150.unk18->unk8[1] = arg0->unkC[1];
|
|
D_80386150.unk18->unk8[2] = arg0->unkC[2];
|
|
D_80386150.unk18->unk14 = 0.0f;
|
|
D_80386150.unk18->unk18 = randf2(1.0f, 2.0f);
|
|
D_80386150.unk18->unk1C = 0.0f;
|
|
D_80386150.unk18->unk20 = 0.0f;
|
|
D_80386150.unk18->unk24[0] = randf2(-100.0f, 100.0f);
|
|
D_80386150.unk18->unk24[1] = randf2(-100.0f, 100.0f);
|
|
D_80386150.unk18->unk24[2] = randf2(-100.0f, 100.0f);
|
|
D_80386150.unk18->unk0 = func_8032FBE4(D_80386150.unk18->unk8, &func_8034FCDC, 1, 0x46);
|
|
D_80386150.unk18->unk0->collidable = FALSE;
|
|
D_80386150.unk18->unk0->actrArrayIdx = D_80386150.unk18 - D_80386150.unk14;
|
|
D_80386150.unk18++;
|
|
}
|
|
|
|
void func_803500D8(Gfx **gfx, Mtx **mtx, Vtx **vtx){}
|
|
|
|
void func_803500E8(void) {
|
|
s32 i;
|
|
Struct_core2_C89C0_0 *var_s0;
|
|
|
|
if (D_80386150.unk0 != NULL) {
|
|
for(var_s0 = D_80386150.unk14; var_s0 < D_80386150.unk18; var_s0++) {
|
|
marker_free(var_s0->unk0);
|
|
}
|
|
assetcache_release(D_80386150.unk0);
|
|
assetcache_release(D_80386150.unk4);
|
|
free(D_80386150.unk8);
|
|
free(D_80386150.unk14);
|
|
}
|
|
}
|
|
|
|
void func_80350174(void) {
|
|
s32 temp_v0_3;
|
|
s32 i;
|
|
|
|
|
|
for(i = 0x31; i < 0x36; i++){
|
|
if (func_80341F64(i))
|
|
break;
|
|
}
|
|
if(i >= 0x36){
|
|
D_80386150.unk0 = NULL;
|
|
return;
|
|
}
|
|
|
|
D_80386150.unk0 = assetcache_get(0x87C); //ASSET_87C_2D_FISH
|
|
D_80386150.unk4 = assetcache_get(0x7BC); //ASSET_7BC_GREEN_BALL
|
|
D_80386150.unk8 = malloc(0x60);
|
|
D_80386150.unkC = D_80386150.unk8;
|
|
D_80386150.unk10 = (s32)D_80386150.unk8 + 0x60;
|
|
D_80386150.unk14 = malloc(2*sizeof(Struct_core2_C89C0_0));
|
|
D_80386150.unk18 = D_80386150.unk14;
|
|
D_80386150.unk1C = (s32)D_80386150.unk14 + 2*sizeof(Struct_core2_C89C0_0);
|
|
for(i = 0x31; i < 0x36; i++){
|
|
temp_v0_3 = func_80341F2C(i);
|
|
if (temp_v0_3 >= 0)
|
|
func_8034FDA0(temp_v0_3);
|
|
}
|
|
}
|
|
|
|
#ifndef NONMATCHING
|
|
#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_C89C0/func_80350250.s")
|
|
#else
|
|
void func_80350250(void) {
|
|
f32 sp7C[3];
|
|
f32 sp70[3];
|
|
f32 temp_f22;
|
|
Struct_core2_C89C0_1 *var_s0;
|
|
Struct_core2_C89C0_0 *var_s0_2;
|
|
|
|
temp_f22 = time_getDelta();
|
|
if ((D_80386150.unk0 != NULL) && (func_80334904() == 2)) {
|
|
player_getPosition(sp7C);
|
|
for(var_s0 = D_80386150.unk8; var_s0 < D_80386150.unkC; var_s0++) {
|
|
var_s0->unk4 = (ml_vec3f_distance(var_s0->unkC, sp7C) < 2000.0f);
|
|
if (var_s0->unk4) {
|
|
if (var_s0->unk8 > 0) {
|
|
var_s0->unk28 -= temp_f22;
|
|
if (var_s0->unk28 <= 0.0f) {
|
|
var_s0->unk28 = randf2(0.01f, 0.2f);
|
|
func_8034FEE0((void *) var_s0);
|
|
var_s0->unk8--;
|
|
}
|
|
}
|
|
var_s0->unk18 = randf2(0.0f, 10000.0f);
|
|
var_s0->unk24 -= temp_f22;
|
|
if (var_s0->unk24 <= 0.0f) {
|
|
var_s0->unk24 = randf2(10.0f, 20.0f);
|
|
if (0.05 < var_s0->unk2C) {
|
|
var_s0->unk2C -= 0.05;
|
|
}
|
|
}
|
|
var_s0->unk20 = (f32) (var_s0->unk20 - temp_f22);
|
|
if (var_s0->unk20 <= 0.0f) {
|
|
if (var_s0->unk0 == 0) {
|
|
var_s0->unk0 = (randf() >= 0.5) ? 1 : -1;
|
|
var_s0->unk20 = randf2(20.0f, 40.0f);
|
|
} else {
|
|
var_s0->unk0 = 0;
|
|
var_s0->unk20 = randf2(5.0f, 10.0f);
|
|
}
|
|
}
|
|
var_s0->unk2C = func_80323F74(func_80342038(var_s0->unk1C), var_s0->unk2C, (f32) var_s0->unk0 * var_s0->unk18 * temp_f22);
|
|
var_s0->unk2C = (var_s0->unk2C < 0.0f) ? 1.0f - var_s0->unk2C : var_s0->unk2C;
|
|
var_s0->unk2C = (var_s0->unk2C >= 1.0f) ? var_s0->unk2C - 1.0f : var_s0->unk2C;
|
|
func_80323240(func_80342038(var_s0->unk1C), var_s0->unk2C, var_s0->unkC);
|
|
}
|
|
}
|
|
|
|
for(var_s0_2 = D_80386150.unk14; var_s0_2 < D_80386150.unk18; var_s0_2++) {
|
|
if (var_s0_2->unk4->unk4 != 0) {
|
|
func_8034F950(var_s0_2);
|
|
var_s0_2->unk1C += var_s0_2->unk34 * (3.0f - var_s0_2->unk18) * 100.0f * temp_f22;
|
|
var_s0_2->unk20 += var_s0_2->unk38 * (3.0f - var_s0_2->unk18) * 20.0f * temp_f22;
|
|
var_s0_2->unk14 += var_s0_2->unk30 * (3.0f - var_s0_2->unk18) * 180.0f * temp_f22;
|
|
if (var_s0_2->unk1C > 0.0f) {
|
|
var_s0_2->unk1C -= var_s0_2->unk1C * temp_f22;
|
|
if (var_s0_2->unk1C < 0.0f) {
|
|
var_s0_2->unk1C = 0.0f;
|
|
}
|
|
}
|
|
var_s0_2->unk20 -= var_s0_2->unk20 * temp_f22;
|
|
sp70[0] = -var_s0_2->unk1C * temp_f22;
|
|
sp70[1] = 0.0f;
|
|
sp70[2] = 0.0f;
|
|
ml_vec3f_yaw_rotate_copy(&sp70, &sp70, var_s0_2->unk14);
|
|
var_s0_2->unk8[0] = var_s0_2->unk8[0] + sp70[0];
|
|
var_s0_2->unk8[1] = var_s0_2->unk8[1] + sp70[1];
|
|
var_s0_2->unk8[2] = var_s0_2->unk8[2] + sp70[2];
|
|
var_s0_2->unk8[1] = var_s0_2->unk8[1] + var_s0_2->unk20 * temp_f22;
|
|
func_8032F64C(var_s0_2->unk8, var_s0_2->unk0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void func_803506DC(void){
|
|
s32 sp1C = D_80386150.unk8;
|
|
s32 sp18 = D_80386150.unk14;
|
|
D_80386150.unk8 = (Struct_core2_C89C0_1 *)defrag(sp1C);
|
|
D_80386150.unkC = ((s32)D_80386150.unkC - (s32)sp1C) + (s32)D_80386150.unk8;
|
|
D_80386150.unk10 = ((s32)D_80386150.unk10 - (s32)sp1C) + (s32)D_80386150.unk8;
|
|
D_80386150.unk14 = (Struct_core2_C89C0_0 *)defrag(D_80386150.unk14);
|
|
D_80386150.unk18 = ((s32)D_80386150.unk18 - (s32)sp18) + (s32)D_80386150.unk14;
|
|
D_80386150.unk1C = ((s32)D_80386150.unk1C - (s32)sp18) + (s32)D_80386150.unk14;
|
|
}
|