banjo-kazooie/src/core2/code_C4B0.c

526 lines
14 KiB
C

#include <ultra64.h>
#include "core1/core1.h"
#include "functions.h"
#include "variables.h"
#include "core2/ba/physics.h"
extern int func_80258424(f32 vec[3], f32 minX, f32 minY, f32 minZ, f32 maxX, f32 maxY, f32 maxZ);
extern f32 floor_getXPosition(struct0*);
extern void func_8031C5AC(struct0 *, f32 *);
extern f32 func_8031C5E4(struct0*);
extern void func_8031C5FC(struct0 *, f32);
extern void func_80244FC0(f32 arg0[3], f32 arg1[3], f32 arg2, f32 arg3, s32 arg4, u32 arg5);
extern s32 func_80244E54(f32[3], f32[3], f32 [3], u32, f32, f32);
extern BKCollisionTri *func_802457C4(f32[3], f32[3], f32, f32, f32[3], s32, u32);
extern s32 func_8029463C(void);
extern BKCollisionTri *func_80320C94(f32[3], f32[3], f32, f32[3], s32, u32);
void func_80294378(s32 arg0);
void func_80294384(s32 arg0);
void func_80294390(void);
typedef struct {
f32 unk0[3];
f32 unkC[3];
BKCollisionTri *unk18;
f32 unk1C[3];
f32 unk28[3];
f32 unk34[3];
s32 unk40;
f32 unk44[3][3];
f32 unk68[3][3];
s32 unk8C;
}Struct_core2_C4B0_0;
/* .bss */
f32 D_8037C1F0[2];
f32 D_8037C1F8[2];
struct0 * D_8037C200;
BKCollisionTri * D_8037C204;
BKCollisionTri D_8037C208;
f32 D_8037C218[3];
f32 D_8037C228[3];
f32 D_8037C238[3];
f32 D_8037C248[3];
f32 D_8037C258[3];
f32 D_8037C268[3];
s32 D_8037C274;
u8 D_8037C278;
u8 D_8037C279;
u8 D_8037C27A;
u8 D_8037C27B;
u8 D_8037C27C;
u8 D_8037C27D;
u8 D_8037C27E;
u8 D_8037C27F;
u8 D_8037C280;
s32 D_8037C284;
/* .code */
void func_80293440(void){
f32 sp34[3];
f32 bottomY = climbGetBottomY();
f32 topY = climbGetTopY();
f32 sp28;
f32 diff;
if(topY < D_8037C218[1]){
D_8037C218[1] = topY;
}
if(D_8037C218[1] < bottomY)
D_8037C218[1] = bottomY;
climbGetBottom(sp34);
func_80257F18(D_8037C218, sp34, &sp28);
diff = mlDiffDegF(sp28, yaw_get());
diff = mlAbsF(diff);
if(1.0f < diff){
yaw_setIdeal(sp28);
yaw_applyIdeal();
}
}
void func_8029350C(f32 *arg0) {
f32 sp3C[3];
f32 sp38;
u8 temp_v0;
func_8031C618(D_8037C200, arg0);
func_8031C638(D_8037C200, baMarker_8028D694());
func_8031C44C(D_8037C200);
sp38 = floor_getXPosition(D_8037C200);
func_8031C5AC(D_8037C200, sp3C);
temp_v0 = D_8037C279;
D_8037C279 = FALSE;
if (!(sp3C[1] < 0.432)) {
if (arg0[1] <= sp38) {
arg0[1] = sp38;
D_8037C279 = TRUE;
}
else if ((temp_v0 != 0) && (D_8037C238[1] < 0.0f)) {
if (sp3C[1] < 0.9) {
if (arg0[1] < (sp38 + 30.0f)) {
arg0[1] = sp38;
D_8037C279 = TRUE;
}
} else if (arg0[1] < (sp38 + 5.0f)) {
arg0[1] = sp38;
D_8037C279 = TRUE;
}
}
}
}
void func_80293668(void) {
f32 sp3AC[3];
f32 sp3A0[3];
f32 temp_f0;
f32 sp390[3];
f32 sp38C;
f32 sp380[3];
f32 sp374[3];
s32 i;
f32 sp364[3];
Struct_core2_C4B0_0 *var_s1;
Struct_core2_C4B0_0 sp90[5];
s32 temp_v0;
Struct_core2_C4B0_0 *sp88;
temp_v0 = baMarker_8028D694();
func_80244FC0(D_8037C228, sp390, D_8037C1F8[1], D_8037C1F8[0], 1, temp_v0 | 0x1E0000);
for(i = 0; i < 5; i++){
sp88 = &sp90[i];
var_s1 = (i != 0) ? &sp90[i - 1] : NULL;
if (i != 0) {
ml_vec3f_copy(sp88->unk0, var_s1->unk0);
ml_vec3f_copy(sp88->unkC, var_s1->unkC);
} else {
ml_vec3f_copy(sp88->unk0, D_8037C218);
ml_vec3f_copy(sp88->unkC, D_8037C228);
}
ml_vec3f_copy(sp364, sp88->unk0);
ml_vec3f_diff_copy(sp380, sp88->unk0, sp88->unkC);
temp_f0 = ((D_8037C1F8[1] * 2) - 4.0f);
if ((sp380[0]*sp380[0] + sp380[1]*sp380[1] + sp380[2]*sp380[2]) > (temp_f0 * temp_f0)) {
sp38C = sp88->unk0[1];
sp88->unk40 = func_80244E54(sp88->unkC, sp88->unk0, sp88->unk44, temp_v0 | 0x1E0000, D_8037C1F8[1] - 1.0f, D_8037C1F8[0]);
if (sp88->unk40 != 0) {
ml_vec3f_normalize(sp380);
temp_f0 = sp380[0]*sp88->unk44[0][0] + sp380[1]*sp88->unk44[0][1] + sp380[2]*sp88->unk44[0][2];
if (temp_f0 > 0.0f) {
sp88->unk40 = 0;
ml_vec3f_copy(sp88->unk0, sp364);
}
}
if (sp88->unk40 != 0) {
if ((sp88->unk44[0][1] >= 0.0) && (sp88->unk44[0][1] < 0.02)) {
sp88->unk0[1] = sp38C;
}
}
} else {
sp88->unk40 = 0;
}
func_8029350C(sp88->unk0);
sp88->unk8C = D_8037C279;
sp88->unk34[0] = sp88->unkC[0];
sp88->unk34[1] = D_8037C1F8[0] + sp88->unkC[1];
sp88->unk34[2] = sp88->unkC[2];
sp88->unk28[0] = sp88->unk0[0];
sp88->unk28[1] = D_8037C1F8[0] + sp88->unk0[1];
sp88->unk28[2] = sp88->unk0[2];
sp88->unk18 = func_80320C94(sp88->unk34, sp88->unk28, D_8037C1F8[1], sp88->unk1C, 3, temp_v0 | 0x1E0000);
if (sp88->unk18 != NULL) {
D_8037C27D++;
D_8037C204 = sp88->unk18;
ml_vec3f_copy(D_8037C258, sp88->unk1C);
if (i == 2) {
if ((sp88->unk18 == sp90[0].unk18) && (sp88->unk18 != var_s1->unk18)) {
ml_vec3f_add(sp380, sp88->unk1C, var_s1->unk1C);
ml_vec3f_normalize(sp380);
ml_vec3f_copy(sp88->unk1C, sp380);
}
}
if (i == 2) {
if (sp88->unk18 == sp90[0].unk18) {
if ((sp88->unk18 == var_s1->unk18) && func_802946FC(sp88->unk68, sp88->unk18)) {
func_802578A4(sp380, sp88->unk0, sp88->unk68[0]);
ml_vec3f_diff_copy(sp3A0, sp88->unk0, sp380);
ml_vec3f_set_length_copy(sp3A0, sp3A0, D_8037C1F8[1] + 1.0f);
sp380[0] += sp3A0[0];
sp380[1] += sp3A0[1];
sp380[2] += sp3A0[2];
if (!(sp88->unk18->flags & 0x00010000)) {
sp88->unk18 = func_802457C4(sp380, sp88->unk0, D_8037C1F8[0], D_8037C1F8[1], sp88->unk1C, 3, temp_v0 | 0x1E0000);
} else {
ml_vec3f_copy(sp88->unk0, sp380);
}
}
}
}
if ((sp88->unk8C == 0) && (sp88->unk18 != NULL) && (D_8037C238[1] < 0.0f)) {
if( (mlAbsF(sp88->unk1C[1]) < 0.01) && func_802946FC(sp88->unk68, sp88->unk18)) {
func_802578A4(sp380, sp88->unk0, sp88->unk68[0]);
ml_vec3f_scale_copy(sp3A0, sp88->unk1C, D_8037C1F8[1] + 1.0f);
ml_vec3f_add(sp374, sp380, sp3A0);
sp88->unk18 = func_802457C4(sp374, sp380, D_8037C1F8[0], D_8037C1F8[1], sp88->unk1C, 3, temp_v0 | 0x1E0000);
sp88->unk0[0] = sp380[0];
sp88->unk0[2] = sp380[2];
}
}
if ((0.999 < sp88->unk1C[1]) && func_802946FC(sp88->unk68, sp88->unk18)) {
func_8025778C(sp3AC, sp88->unk0, sp88->unk68);
sp380[0] = sp88->unk0[0] - sp3AC[0];
sp380[1] = 0.0f;
sp380[2] = sp88->unk0[2] - sp3AC[2];
ml_vec3f_set_length_copy(sp380, sp380, 1.0f + D_8037C1F8[1]);
sp380[0] += sp3AC[0];
sp380[1] += sp3AC[1];
sp380[2] += sp3AC[2];
sp88->unk0[0] = sp380[0];
sp88->unk0[2] = sp380[2];
} else if (ml_isNonzero_vec3f(sp88->unk1C)) {
func_802450DC(sp88->unkC, sp88->unk0, sp88->unk34, sp88->unk28, sp88->unk1C);
}
} else {
break;
}
}
if ((i == 5) && (D_8037C279 == 0) && (D_8037C204 != 0) && (D_8037C218[1] < D_8037C228[1])) {
D_8037C27C = 1;
}
if (i == 5) {
ml_vec3f_copy(D_8037C218, sp390);
} else{
ml_vec3f_copy(D_8037C218, sp88->unk0);
}
}
void func_80293D2C(f32 *arg0, f32 * arg1){
*arg0 = D_8037C1F8[0];
*arg1 = D_8037C1F8[1];
}
void func_80293D48(f32 arg0, f32 arg1){
D_8037C1F0[0] = arg0;
D_8037C1F0[1] = arg1;
D_8037C1F8[0] = D_8037C1F0[0];
D_8037C1F8[1] = D_8037C1F0[1];
}
void func_80293D74(void){ func_80293D48(80.0f, 35.0f);}
void func_80293DA4(void){
D_8037C278 = D_8037C279 = D_8037C27B = D_8037C27E = D_8037C27C = D_8037C280 = 0;
D_8037C200 = func_8031B9D8();
ml_vec3f_clear(D_8037C268);
ml_vec3f_clear(D_8037C218);
ml_vec3f_clear(D_8037C228);
ml_vec3f_clear(D_8037C258);
D_8037C204 = 0;
D_8037C27F = 0;
func_80293D74();
D_8037C1F8[0] = D_8037C1F0[0];
D_8037C1F8[1] = D_8037C1F0[1];
func_80294384(1);
D_8037C274 = 0;
func_80294378(1);
}
void func_80293E88(void){
func_8031BA9C(D_8037C200);
}
//__clamp to_range_within_point
f32 func_80293EAC(f32 arg0, f32 arg1, f32 arg2){
if(arg1 < arg0){
arg1 = ml_min_f(arg0, arg1+arg2);
}
else if(arg0 < arg1){
arg1 = ml_max_f(arg0, arg1-arg2);
}
return arg1;
}
void func_80293F0C(void){
f32 sp44[3];
f32 sp38[3];
f32 sp2C[3];
_player_getPosition(sp44);
if(map_get() == MAP_34_RBB_ENGINE_ROOM && ml_vec3f_inside_box_f(sp44, -900.0f, -940.0f, 200.0f, 900.0f, 940.0f, 800.0f)){
func_8031C5FC(D_8037C200, 150.0f);
} else{
func_8031C608(D_8037C200);
}
D_8037C27C = 0;
D_8037C27A = 1;
D_8037C27D = 0;
D_8037C204 = NULL;
D_8037C27B = D_8037C279;
D_8037C27E = 0;
D_8037C1F8[0] = func_80293EAC(D_8037C1F0[0], D_8037C1F8[0], 1.0f);
D_8037C1F8[1] = func_80293EAC(D_8037C1F0[1], D_8037C1F8[1], 1.0f);
switch(D_8037C274){//D_80374788
case 1:
case 3:
case 4:
_player_getPosition(D_8037C218);
func_80298504(D_8037C228);
ml_vec3f_diff_copy(D_8037C238, D_8037C218, D_8037C228);
if ((D_8037C274 == 3) && func_8031C594(D_8037C200) && (D_8037C218[1] > (func_8031C5E4(D_8037C200) - 70.0f))) {
D_8037C218[1] = func_8031C5E4(D_8037C200) - 70.0f;
D_8037C27E = 1;
baphysics_set_vertical_velocity(1.0f);
}
func_80293668();
player_setPosition(D_8037C218);
break;
case 5:
_player_getPosition(D_8037C218);
func_80298504(D_8037C228);
func_80293668();
func_80293440();
player_setPosition(D_8037C218);
break;
case 2:
break;
}//L80294148
if (func_8031C594(D_8037C200)) {
D_8037C278 = (D_8037C218[1] < func_8031C5E4(D_8037C200));
}
ml_vec3f_diff_copy(D_8037C248, D_8037C218, D_8037C228);
ml_vec3f_diff(D_8037C248, D_8037C238);
if (func_80294560()) {
D_8037C279 = 1;
}
if(D_8037C278 && D_8037C218[1] < (func_8031C5E4(D_8037C200) - 70.0f)){
func_80294384(3);
if(D_8037C279 && baphysics_get_vertical_velocity() < 0.0f) {
baphysics_set_vertical_velocity(-1.0f);
}
}
else if(D_8037C279){
func_80294390();
if (baphysics_get_vertical_velocity() < 0.0f) {
baphysics_set_vertical_velocity(-1.0f);
}
} else {
func_80294384(1);
}
if (D_8037C27F) {
player_setPosition(sp44);
}
D_8037C27A = 0;
if (D_8037C27C) {
D_8037C280 = ml_min_w(D_8037C280 + 1, 3);
} else {
D_8037C280 = 0;
}
func_80298504(sp2C);
_player_getPosition(sp38);
ml_vec3f_diff_copy(D_8037C268, sp38, sp2C);
if (D_8037C204) {
collisionTri_copy(&D_8037C208, D_8037C204);
D_8037C204 = &D_8037C208;
}
}
void func_8029436C(s32 arg0){
D_8037C27F = arg0;
}
void func_80294378(s32 arg0){
D_8037C274 = arg0;
}
void func_80294384(s32 arg0){
D_8037C284 = arg0;
}
void func_80294390(void) {
void *sp1C;
sp1C = func_8029463C();
if (sp1C != 0) {
if (func_803246B4(map_get(), ((s32*)sp1C)[2]) == 3) {
func_80294384(4);
}
else{
func_80294384(2);
}
}else{
func_80294384(2);
}
}
f32 func_80294404(void){
return player_getYPosition() - floor_getXPosition(D_8037C200);
}
f32 func_80294438(void){
return floor_getXPosition(D_8037C200);
}
void func_8029445C(f32 arg0[3]){
ml_vec3f_copy(arg0, D_8037C268);
}
void func_80294480(f32 arg0[3]){
func_8031C5AC(D_8037C200, arg0);
}
f32 func_802944A8(void){
f32 sp1C[3];
func_80294480(sp1C);
return ml_acosf_deg(sp1C[1]);
}
void func_802944D0(f32 dst[3]){
ml_vec3f_copy(dst, D_8037C258);
}
s32 func_802944F4(void){
return D_8037C284;
}
f32 func_80294500(void){
return func_8031C5E4(D_8037C200);
}
s32 func_80294524(void){
return D_8037C27E;
}
s32 func_80294530(void){
return D_8037C27D;
}
s32 func_8029453C(void){
return D_8037C27A;
}
s32 func_80294548(void){
return D_8037C279;
}
s32 func_80294554(void){
return D_8037C278;
}
int func_80294560(void){
return D_8037C280 == 3;
}
bool func_80294574(void){
return func_8031C594(D_8037C200);
}
bool func_80294598(void) {
return (D_8037C248[0] != 0.0f) || (D_8037C248[1] != 0.0f) || (D_8037C248[2] != 0.0f);
}
u32 func_80294610(u32 mask){
return func_8031C59C(D_8037C200) & mask;
}
s32 func_8029463C(void){
return func_8031C5F4(D_8037C200);
}
u32 func_80294660(void){
return func_8031C59C(D_8037C200);
}
void func_80294684(void){
func_8031C5A4(D_8037C200);
}
void func_802946A8(void){
func_8031C5DC(D_8037C200);
}
void func_802946CC(void){
func_8031C5EC(D_8037C200);
}
BKCollisionTri *func_802946F0(void){
return D_8037C204;
}
bool func_802946FC(f32 arg0[3][3], s32 arg1){
if(arg1 == 0){
return 0;
}
else{
func_802E73C8(arg0);
return 1;
}
}
void func_8029472C(void){
func_8031BA7C(D_8037C200);
}
void func_80294750(void){
if(D_8037C200){
D_8037C200 = (struct0 *)defrag(D_8037C200);
}
}