Files
banjo-kazooie/src/RBB/code_2E90.c
2022-08-30 17:39:06 -05:00

201 lines
5.4 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
/* typedefs and declarations */
typedef struct {
s16 uid;
f32 unk4[3];
f32 unk10[3];
f32 unk1C[3];
f32 unk28[3];
f32 unk34[3];
f32 unk40;
}Struct_RBB_2E90_0;
typedef struct {
f32 unk0[3];
Struct_RBB_2E90_0 *unkC;
f32 unk10[3];
f32 unk1C[3];
f32 unk28;
}ActorLocal_RBB_2E90;
void func_8038944C(Actor *this);
/* .data */
Struct_RBB_2E90_0 D_80390530[] = {
{
0x1BB,
{0.0f, 641.45f, -1400.0f},
{0.0f, 0.0f, 90.0f},
{0.0f, 0.0f, 360.0f},
{0.0f, 0.0f, 270.0f},
{0.0f, 0.0f, 90.0f},
4.0f
},
{
0x1BC,
{-800.0f, 641.45f, -2400.0f},
{ 95.0f, 0.0f, 0.0f},
{380.0f, 0.0f, 0.0f},
{285.0f, 0.0f, 0.0f},
{ 90.0f, 0.0f, 0.0f},
4.25f
},
{
0x1BD,
{800.0f, 641.45f, -2400.0f},
{100.0f, 0.0f, 0.0f},
{400.0f, 0.0f, 0.0f},
{300.0f, 0.0f, 0.0f},
{90.0f, 0.0f, 0.0f},
4.5f
},
{0}
};
ActorInfo D_80390640 = {
MARKER_191_ENGINE_ROOM_PROPELLOR_1, ACTOR_1BB_ENGINE_ROOM_PROPELLOR_1, ASSET_40F_MODEL_ENGINE_ROOM_PROPELLER_1, 0x0, NULL,
func_8038944C, NULL, func_80325888,
0, 0, 0.0f, 0
};
ActorInfo D_80390664 = {
MARKER_192_ENGINE_ROOM_PROPELLOR_2, ACTOR_1BC_ENGINE_ROOM_PROPELLOR_2, ASSET_410_MODEL_ENGINE_ROOM_PROPELLER_2, 0x0, NULL,
func_8038944C, NULL, func_80325888,
0, 0, 0.0f, 0
};
ActorInfo D_80390688 = {
MARKER_193_ENGINE_ROOM_PROPELLOR_3, ACTOR_1BD_ENGINE_ROOM_PROPELLOR_3, ASSET_411_MODEL_ENGINE_ROOM_PROPELLER_3, 0x0, NULL,
func_8038944C, NULL, func_80325888,
0, 0, 0.0f, 0
};
/* .code */
Struct_RBB_2E90_0 * func_80389280(Actor *this){
Struct_RBB_2E90_0 * iPtr;
for(iPtr = D_80390530; iPtr->uid != 0; iPtr++){
if(iPtr->uid == this->modelCacheIndex)
return iPtr;
}
return NULL;
}
void func_803892D8(Actor *this, s32 arg1){
f32 pad;
ActorLocal_RBB_2E90 *local = (ActorLocal_RBB_2E90 *)&this->local;
this->state = arg1;
local->unk28 = 0.0f;
if(this->state == 1){
local->unk0[2] = 0.0f;
local->unk0[1] = 0.0f;
local->unk0[0] = 0.0f;
ml_vec3f_copy(&local->unk10, &local->unkC->unk1C);
ml_vec3f_copy(&local->unk1C, &local->unkC->unk1C);
}//L8038935C
if(this->state == 2){
ml_vec3f_copy(&local->unk0, &local->unkC->unk28);
ml_vec3f_copy(&local->unk1C, &local->unkC->unk10);
local->unk28 = local->unkC->unk40;
}//L803893A8
if(this->state == 3){
ml_vec3f_copy(&local->unk0, &local->unkC->unk28);
ml_vec3f_copy(&local->unk1C, &local->unkC->unk1C);
local->unk28 = local->unkC->unk40;
}//L803893F4
if(this->state == 4){
ml_vec3f_copy(&local->unk0, &local->unkC->unk34);
ml_vec3f_copy(&local->unk10, &local->unkC->unk1C);
local->unk1C[2] = 0.0f;
local->unk1C[1] = 0.0f;
local->unk1C[0] = 0.0f;
}
}
void func_8038944C(Actor *this){
ActorLocal_RBB_2E90 *local = (ActorLocal_RBB_2E90 *)&this->local;
f32 tick;
int i;
f32 sp50[3];
f32 sp44[3];
tick = time_getDelta();
if(!this->unk16C_4){
this->marker->propPtr->unk8_3 = 1;
this->unk16C_4 = TRUE;
local->unkC = func_80389280(this);
if(this->state == 0){
ml_vec3f_copy(&this->position, &local->unkC->unk4);
local->unk0[0] = local->unk0[1] = local->unk0[2] = 0.0f;
local->unk10[0] = local->unk10[1] = local->unk10[2] = 0.0f;
local->unk1C[0] = local->unk1C[1] = local->unk1C[2] = 0.0f;
local->unk28 = 0.0f;
func_803892D8(this, 1);
}
}//L80389508
if(func_8025773C(&local->unk28, tick)){
if(this->state == 2)
func_803892D8(this, 3);
else if(this->state == 3)
func_803892D8(this, 2);
}//L80389568
switch (this->state)
{
case 1:
case 2:
case 3:
case 4:
sp50[0] = this->pitch;
sp50[1] = this->yaw;
sp50[2] = this->roll;
this->pitch += local->unk10[0]*tick ;
this->yaw += local->unk10[1]*tick ;
this->roll += local->unk10[2]*tick ;
sp44[0] = this->pitch;
sp44[1] = this->yaw;
sp44[2] = this->roll;
for(i = 0; i < 3; i++){
if( (sp50[i] < 90.0f && 90.0f <= sp44[i])
|| (sp50[i] < 270.0f && 270.0f <= sp44[i])
|| (sp50[i] < 180.0f && 180.0f <= sp44[i])
|| (sp50[i] < 360.0f && 360.0f <= sp44[i])
){
FUNC_8030E8B4(SFX_2_CLAW_SWIPE, 0.4f, 23000, this->position, 50, 1000);
}
}
this->pitch += (360.0f <= this->pitch)? -360 : 0;
this->yaw += (360.0f <= this->yaw)? -360 : 0;
this->roll += (360.0f <= this->roll)? -360 : 0;
for(i = 0; i < 3; i++){//L803897B8
if( local->unk10[i] < local->unk1C[i] ){
local->unk10[i] += local->unk0[i]*tick;
local->unk10[i] = MIN(local->unk1C[i] , local->unk10[i]);
}
else if( local->unk1C[i] < local->unk10[i]){
local->unk10[i] -= local->unk0[i]*tick;
local->unk10[i] = MAX(local->unk1C[i] , local->unk10[i]);
}
}
break;
}//L80389860
if(this->state == 1 && mapSpecificFlags_get(0)){
func_803892D8(this, 2);
}
if(tick);
}