banjo-kazooie/src/FP/racectrl.c

619 lines
16 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "core2/statetimer.h"
extern void player_stateTimer_set(s32, f32);
typedef struct {
ActorMarker *marker;
f32 position[3];
f32 unk10;
}Struct_FP_4770;
/* .data */
f32 D_80391ED0[3] = {-880.0f, 3.0f, 1769.0f};
f32 D_80391EDC = 180.0f;
f32 D_80391EE0[3] = {5187.0f, 428.0f, 854.0f};
f32 D_80391EEC = 194.0f;
f32 D_80391EF0[3] = {-904.0f, -10.0f, -1662.0f};
f32 FP_D_80391EFC = 180.0f;
f32 D_80391F00[3] = {2192.0f, 7.0f, 2901.0f};
f32 D_80391F0C = 85.0f;
f32 D_80391F10[3] = {712.0f, 7.0f, 3036.0f};
f32 D_80391F1C = 284.0f;
f32 D_80391F20[3] = {1605.0f, 658.0f, 5402.0f};
f32 D_80391F2C[3] = {-4454.0f, 1920.0f, -6898.0f};
f32 D_80391F38[3] = {-4451.0f, 1920.0f, -6685.0f};
/* .bss */
Struct_FP_4770 D_80392F70[0x27];
Struct_FP_4770 D_80393280[0x27];
ActorMarker *D_80393590[5];
struct {
u8 unk0;
// u8 pad1[0x3];
s32 unk4;
s32 unk8;
s32 unkC;
s32 unk10;
ActorMarker *unk14;
u8 unk18;
u8 unk19;
u8 unk1A;
}FP_D_803935A8;
/* .code */
void FP_func_8038AB60(s32 arg0){
int i;
func_8028F8F8(0xe, arg0 ^ 1);
for (i = 0x14; i < 0x23; i++){
func_8028F8F8(i, arg0);
}
for (i = 0x32; i < 0x38; i++){
func_8028F8F8(i, arg0);
}
}
void func_8038ABDC(void){
comusic_8025AB44(COMUSIC_3A_FP_BOGGY_RACE, 0, 4000);
func_8025AABC(COMUSIC_3A_FP_BOGGY_RACE);
func_8025A58C(-1, 4000);
func_8024BD08(1);
}
void func_8038AC20(s32 gate_indx, s32 arg1){
Actor *a1;
Actor *a2;
a1 = marker_getActor(D_80392F70[gate_indx].marker);
a2 = marker_getActor(D_80393280[gate_indx].marker);
a1->velocity[0] = (f32)arg1;
a2->velocity[0] = (f32)arg1;
}
//spawn race flag pair
void func_8038AC90(s32 indx, s32 arg1){
ActorMarker *m1;
ActorMarker *m2;
Actor *a1;
Actor *a2;
m1 = func_8032813C(0x161, D_80392F70[indx].position, 0)->marker;
m2 = func_8032813C(0x162, D_80393280[indx].position, 0)->marker;
a1 = marker_getActor(m1);
a2 = marker_getActor(m2);
a1->unk38_31 = 1;
a2->unk38_31 = 1;
a1->unkF4_8 = indx + 1;
a2->unkF4_8 = indx + 1;
D_80392F70[indx].marker = a1->marker;
D_80393280[indx].marker = a2->marker;
func_8038AC20(indx, arg1);
a1->unk1C[0] = a2->position_x;
a1->unk1C[1] = a2->position_y;
a1->unk1C[2] = a2->position_z;
if(indx + 1 == 0x27){
a1->velocity[1] = 1.0f;
a2->velocity[1] = 1.0f;
}
}
void func_8038ADE4(s32 indx, s32 arg1){
__spawnQueue_add_2((GenFunction_2)func_8038AC90, indx, arg1);
}
void func_8038AE14(s32 indx){
if(D_80392F70[indx].marker){
func_80326310(marker_getActor(D_80392F70[indx].marker));
D_80392F70[indx].marker = NULL;
}
if(D_80393280[indx].marker){
func_80326310(marker_getActor(D_80393280[indx].marker));
D_80393280[indx].marker = NULL;
}
}
void func_8038AEA0(void){
int i;
for(i = 0; i < 0x27; i++){
func_8038AE14(i);
}
}
void func_8038AEE0(s32 indx){
Actor *sp1C;
switch(indx){
case 0:// L8038AF0C
sp1C = func_8032813C(0x22d, D_80391ED0, D_80391EDC);
break;
case 1:// L8038AF38
sp1C = func_8032813C(0x22e, D_80391EE0, D_80391EEC);
break;
case 2:// L8038AF64
sp1C = func_8032813C(0x22d, D_80391EF0, FP_D_80391EFC);
break;
case 3:// L8038AF90
sp1C = func_8032813C(0x22d, D_80391F00, D_80391F0C);
break;
case 4:// L8038AFBC
sp1C = func_8032813C(0x22d, D_80391F10, D_80391F1C);
break;
}
D_80393590[indx] = sp1C->marker;
}
void func_8038B00C(s32 indx){
__spawnQueue_add_1((GenFunction_1)func_8038AEE0, indx);
}
void func_8038B034(void){
int i;
for(i = 0; i < 5; i++){
func_8038B00C(i);
}
}
void func_8038B074(s32 indx){
if(D_80393590[indx]){
marker_despawn(D_80393590[indx]);
D_80393590[indx] = NULL;
}
}
void FP_func_8038B0B8(void){
int i;
for(i = 0; i < 5; i++){
func_8038B074(i);
}
}
void func_8038B0F8(void){
Actor *trainers = func_8032813C(ACTOR_2C_TURBO_TALON_TRAINERS, D_80391F20, 100);
trainers->unk10_1 = FALSE;
}
void func_8038B130(enum jiggy_e jiggy_id){
if(jiggy_id == JIGGY_2C_FP_BOGGY_3 && !jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2)){
jiggy_spawn(jiggy_id, D_80391F38);
}
else{
jiggy_spawn(jiggy_id, D_80391F2C);
}
}
void func_8038B190(void){
func_8028F66C(BS_INTR_2B);
mapSpecificFlags_set(4, FALSE);
func_8028F918(0);
}
void func_8038B1C4(void){
FP_D_803935A8.unk0 = 0;
}
void func_8038B1D0(enum jiggy_e jiggy_id){
timed_setStaticCameraToNode(0.0f, 3);
timedFunc_set_0(0.0f, func_8038AEA0);
timedFunc_set_0(0.0f, FP_func_8038B0B8);
timedFunc_set_1(0.1f, (GenFunction_1) func_8038B130, jiggy_id);
timedFunc_set_0(5.0f, func_8038B190);
timedFunc_set_0(5.0f, func_8038B1C4);
timed_exitStaticCamera(5.0f);
}
void func_8038B268(void){
timed_exitStaticCamera(0.0f);
timedFunc_set_0(0.0f, func_8038AEA0);
timedFunc_set_0(0.0f, FP_func_8038B0B8);
func_8028FA14(map_get(), 0x11);
func_8028F66C(BS_INTR_2A);
}
void func_8038B2C8(ActorMarker *caller, enum asset_e text_id, s32 arg2){
Actor *actor;
if(FP_D_803935A8.unk14){
actor = marker_getActor(FP_D_803935A8.unk14);
}
switch(text_id){
case 0xc04: //8038B318
func_8038B268();
break;
case 0xc07: //8038B328
func_8038B1D0(JIGGY_30_FP_BOGGY_2);
break;
case 0xc0b: //8038B338
func_8038B268();
break;
case 0xc0d: //8038B348
func_8038B1D0(JIGGY_2C_FP_BOGGY_3);
break;
case 0xc10: //8038B358
func_8038ABDC();
func_8028FA14(map_get(), 0x11);
func_8028F66C(BS_INTR_2A);
timedFunc_set_0(0.0f, func_8038B1C4);
break;
}//L8038B38C
}
void func_8038B39C(void){
if(jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2) && func_8028ECAC() == BSGROUP_6_TURBO_TALON_TRAINERS){
player_stateTimer_set(STATE_TIMER_3_TURBO_TALON, 2.0f);
}
func_8028F918(1);
func_8025A6EC(COMUSIC_3B_MINIGAME_VICTORY, 28000);
FP_func_8038AB60(0);
func_8038ABDC();
timed_setStaticCameraToNode(0.0f, 1);
}
void func_8038B410(void){
Actor *sp2C;
func_8028F918(2);
if(FP_D_803935A8.unk14)
sp2C = marker_getActor(FP_D_803935A8.unk14);
sp2C->unk38_31 = 1;
func_8025A6EC(COMUSIC_3C_MINIGAME_LOSS, 28000);
FP_func_8038AB60(0);
func_8038ABDC();
if(!jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2)){
timed_setStaticCameraToNode(0.0f, 1);
timed_playSfx(1.0f, SFX_8C_BOGGY_WAHEY, 1.0f, 32000);
func_80324DBC(2.0f, 0xC04, 0x2b, sp2C->position, NULL, func_8038B2C8, NULL);
}//L8038B4E0
else{
timed_setStaticCameraToNode(0.0f, 1);
timed_playSfx(1.0f, SFX_8C_BOGGY_WAHEY, 1.0f, 32000);
func_80324DBC(2.0f, 0xC0b, 0x2b, sp2C->position, NULL, func_8038B2C8, NULL);
}
}
void func_8038B544(void){
Actor *sp2C;
int i;
f32 f2;
f32 f0;
switch(FP_D_803935A8.unk0){
case 1: //L8038B57C
if(FP_D_803935A8.unk4 < 0x4e) break;
for(i = 0; i < 0x27; i++){
if(i < 0x26){
f0 = D_80392F70[i+1].position[2] - D_80392F70[i].position[2];
f2 = D_80392F70[i+1].position[0] - D_80392F70[i].position[0];
D_80392F70[i].unk10 = f0*f0 + f2*f2;
}
if(D_80392F70[0x26].unk10 < D_80392F70[i].unk10)
D_80392F70[0x26].unk10 = D_80392F70[i].unk10;
}
func_8038AEA0();
FP_D_803935A8.unk0 = NULL;
break;
case 2: //L8038B61C
if(jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2) && func_8028ECAC() == BSGROUP_6_TURBO_TALON_TRAINERS){
player_stateTimer_set(STATE_TIMER_3_TURBO_TALON, 20.0f);
}
if(D_80392F70[0x26].marker == NULL) break;
if(3.0f == marker_getActor(D_80392F70[0x26].marker)->velocity[0]){
func_8038B39C();
FP_D_803935A8.unk0 = 3;
break;
}
if(FP_D_803935A8.unk10){
func_8038B410();
FP_D_803935A8.unk0 = 4;
}
break;
case 3: //L8038B6C4
if(FP_D_803935A8.unk14){
sp2C = marker_getActor(FP_D_803935A8.unk14);
}
sp2C->unk38_31 = 2;
timed_playSfx(1.0f, SFX_8D_BOGGY_OHWW, 1.0f, 32000);
if(jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2) || jiggyscore_isSpawned(JIGGY_30_FP_BOGGY_2)){
func_80324DBC(2.0f, 0xc0d, 0x2a, sp2C->position, NULL, func_8038B2C8, NULL);
}
else{
func_80324DBC(2.0f, 0xc07, 0x22, sp2C->position, NULL, func_8038B2C8, NULL);
}
FP_D_803935A8.unk0 = 4;
break;
}//L8038B794
}
void func_8038B7A4(void){
int i;
FP_func_8038AB60(0);
if(map_get() != MAP_27_FP_FREEZEEZY_PEAK || jiggyscore_isCollected(JIGGY_2C_FP_BOGGY_3)){
FP_D_803935A8.unk0 = 0;
return;
}
FP_D_803935A8.unk0 = 1;
FP_D_803935A8.unk14 = NULL;
FP_D_803935A8.unk4 = 0;
FP_D_803935A8.unk8 = -1;
FP_D_803935A8.unkC = -1;
FP_D_803935A8.unk10 = 0;
FP_D_803935A8.unk18 = 0;
FP_D_803935A8.unk19 = 0;
FP_D_803935A8.unk1A = 0;
for(i = 0; i < 0x27; i++){
D_80392F70[i].marker = NULL;
D_80393280[i].marker = NULL;
D_80392F70[i].position[0] = D_80392F70[i].position[1] = D_80392F70[i].position[2] = 0.0f;
D_80393280[i].position[0] = D_80393280[i].position[1] = D_80393280[i].position[2] = 0.0f;
D_80392F70[i].unk10 = 0.0f;
D_80393280[i].unk10 = 0.0f;
}
for(i = 0; i < 5; i++){
D_80393590[i] = NULL;
}
}
void func_8038B8A8(){}
void func_8038B8B0(ActorMarker *marker){
Actor *actor = marker_getActor(marker);
s32 tmp_a0;
tmp_a0 = actor->unkF4_8 - 1;
if(tmp_a0 < 0x27){
D_80392F70[tmp_a0].marker = actor->marker;
D_80392F70[tmp_a0].position[0] = actor->position[0];
D_80392F70[tmp_a0].position[1] = actor->position[1];
D_80392F70[tmp_a0].position[2] = actor->position[2];
FP_D_803935A8.unk4++;
}//L8038B920
}
void func_8038B930(ActorMarker *marker){
Actor *actor = marker_getActor(marker);
s32 tmp_a0;
tmp_a0 = actor->unkF4_8 - 1;
if(tmp_a0 < 0x27){
D_80393280[tmp_a0].marker = actor->marker;
D_80393280[tmp_a0].position[0] = actor->position[0];
D_80393280[tmp_a0].position[1] = actor->position[1];
D_80393280[tmp_a0].position[2] = actor->position[2];
FP_D_803935A8.unk4++;
}//L8038B9A0
}
void func_8038B9B0(ActorMarker *marker){
FP_D_803935A8.unk14 = marker;
}
void func_8038B9BC(void){
FP_D_803935A8.unk14 = NULL;
}
void func_8038B9C8(void){
int i;
func_8038ADE4(0, 1);
for(i = 1; i < 4; i++){
func_8038ADE4(i, 2);
}
func_8038ADE4(0x26, 2);
func_8038B034();
if(jiggyscore_isSpawned(JIGGY_30_FP_BOGGY_2) || jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2)){
__spawnQueue_add_0(func_8038B0F8);
}
FP_D_803935A8.unk8 = -1;
FP_D_803935A8.unkC = -1;
FP_D_803935A8.unk10 = 0;
FP_D_803935A8.unk18 = 0;
FP_D_803935A8.unk19 = 0;
FP_D_803935A8.unk1A = 0;
FP_func_8038AB60(1);
FP_D_803935A8.unk0 = 2;
}
void FP_func_8038BA88(s32 arg0){
FP_D_803935A8.unk8 = --arg0;
func_8038AC20(arg0, 3);
if(arg0 + 1 < 39){
func_8038AC20(arg0 + 1, 1);
}
if(arg0 + 4 < 38){
func_8038ADE4(arg0 + 4, 2);
}
if(arg0 >= 2){
func_8038AE14(arg0 - 2);
}
if(arg0 + 4 < 11){
func_8028F8F8(20, 1);
func_8028F8F8(20, 1);
func_8028F8F8(21, 1);
func_8028F8F8(22, 1);
func_8028F8F8(30, 0);
}
else{
func_8028F8F8(20, 0);
func_8028F8F8(21, 0);
func_8028F8F8(22, 0);
func_8028F8F8(30, 1);
}
switch(FP_D_803935A8.unkC - FP_D_803935A8.unk8){
case 3:
func_8025AEA0(0x3a, 266666);
break;
case 2:
func_8025AEA0(0x3a, 300000);
break;
case 4:
break;
default:
func_8025AEA0(0x3a, 333333);
break;
}
}
void func_8038BC0C(s32 arg0){
if(FP_D_803935A8.unkC - FP_D_803935A8.unk8 < 4 || 0x23 < FP_D_803935A8.unkC){
if(FP_D_803935A8.unk14)
marker_getActor(FP_D_803935A8.unk14);
if(func_8038A1A0(FP_D_803935A8.unk14))
return;
FP_D_803935A8.unkC = arg0-1;
if(FP_D_803935A8.unkC >= 0x26){
FP_D_803935A8.unk10 = 1;
return;
}
if(FP_D_803935A8.unk0 == 3) return;
if(FP_D_803935A8.unk0 == 4) return;
if(FP_D_803935A8.unkC >= 0x25) return;
switch(FP_D_803935A8.unkC - FP_D_803935A8.unk8){
case 4:
if(FP_D_803935A8.unk1A)
break;
FP_D_803935A8.unk1A = TRUE;
FP_func_8038AB60(0);
if(!func_8028F22C()){
func_8028F918(2);
func_80311480(0xc10, 0x20, NULL, NULL, func_8038B2C8, NULL);
}//L8038BD40
FP_D_803935A8.unk0 = 4;
break;
case 3:
if(!FP_D_803935A8.unk19 && !func_8028F22C()){
FP_D_803935A8.unk19 = 1;
func_80311480(0xc0f, 0x20, NULL, NULL, NULL, NULL);
}//L8038BD94
func_8025AEA0(0x3a, 0x411aa);
break;
case 2:
if(!FP_D_803935A8.unk18 && !func_8028F22C()){
FP_D_803935A8.unk18 = 1;
func_80311480(0xc0e, 0x20, NULL, NULL, NULL, NULL);
}//L8038BDF0
func_8025AEA0(0x3a, 0x493e0);
break;
default:
func_8025AEA0(0x3a, 0x51615);
break;
}
}
}
f32 func_8038BE20(f32 arg0[3]){
f32 sp38[4];
f32 f18;
f32 sp30;
f32 sp2C;
f32 tmp_f12;
tmp_f12 = (f32)(FP_D_803935A8.unkC - FP_D_803935A8.unk8);
if(FP_D_803935A8.unk0 != 2 || FP_D_803935A8.unkC < 0 || FP_D_803935A8.unk8 < 0)
return 0.0f;
if(tmp_f12 == 0.0f){
player_getPosition(sp38);
f18 = D_80392F70[FP_D_803935A8.unkC].unk10;
if( 0.0 == f18 )
return 0.5f;
sp30 = ((arg0[0] - D_80392F70[FP_D_803935A8.unkC].position[0])*(D_80392F70[FP_D_803935A8.unkC+1].position[0] - D_80392F70[FP_D_803935A8.unkC].position[0]) + (arg0[2] - D_80392F70[FP_D_803935A8.unkC].position[2])*(D_80392F70[FP_D_803935A8.unkC+1].position[2] - D_80392F70[FP_D_803935A8.unkC].position[2]))/f18;
sp2C = ((sp38[0] - D_80392F70[FP_D_803935A8.unkC].position[0])*(D_80392F70[FP_D_803935A8.unkC+1].position[0] - D_80392F70[FP_D_803935A8.unkC].position[0]) + (sp38[2] - D_80392F70[FP_D_803935A8.unkC].position[2])*(D_80392F70[FP_D_803935A8.unkC+1].position[2] - D_80392F70[FP_D_803935A8.unkC].position[2]))/f18;
return -(sp30 - sp2C);
}//L8038BF58
tmp_f12 += (tmp_f12 < 0.0f) ? -0.5 : 0.5;
return -tmp_f12;
}
bool func_8038BFA0(void){
if ( FP_D_803935A8.unk0 == 2
|| FP_D_803935A8.unk0 == 3
|| FP_D_803935A8.unk0 == 4
|| FP_D_803935A8.unk1A
){
return TRUE;
}
return FALSE;
}
bool func_8038BFE8(f32 arg0[3], s32 arg1){
Actor *actor;
if(FP_D_803935A8.unk14){
actor = marker_getActor(FP_D_803935A8.unk14);
}
else{
return FALSE;
}
if( (actor->position[0] - arg0[0])*(actor->position[0] - arg0[0])
+ (actor->position[1] - arg0[1])*(actor->position[1] - arg0[1])
+ (actor->position[2] - arg0[2])*(actor->position[2] - arg0[2])
< arg1*arg1
){
return TRUE;
}
return FALSE;
}
s32 func_8038C098(void){
return FP_D_803935A8.unk10;
}