134 lines
4.4 KiB
C
134 lines
4.4 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
/* typedefs and declarations */
|
|
typedef struct {
|
|
s32 unk0;
|
|
f32 unk4;
|
|
s32 unk8;
|
|
f32 unkC;
|
|
}ActorLocal_RBB_36A0;
|
|
|
|
void chPropellor_update(Actor *this);
|
|
|
|
/* .data */
|
|
ActorInfo D_803906E0 = {
|
|
MARKER_185_MODEL_RUSTY_BUCKET_REAR_PROPELLER, ACTOR_175_MODEL_RUSTY_BUCKET_REAR_PROPELLER, ASSET_403_MODEL_RUSTY_BUCKET_REAR_PROPELLER,
|
|
0x0, NULL,
|
|
chPropellor_update, NULL, actor_draw,
|
|
0, 0, 0.0f, 0
|
|
};
|
|
|
|
s32 D_80390704[4] = {0x258, 0x12C, 0x12C, 0};
|
|
|
|
/*.code */
|
|
f32 __chPropellor_getSpeed(void) {
|
|
return (f32) D_80390704[2 * levelSpecificFlags_get(LEVEL_FLAG_27_RBB_UNKNOWN) + levelSpecificFlags_get(LEVEL_FLAG_28_RBB_UNKNOWN)];
|
|
}
|
|
|
|
void __chPropellor_setState(Actor *this, s32 arg1){
|
|
ActorLocal_RBB_36A0 * local = (ActorLocal_RBB_36A0 *)&this->local;
|
|
if(arg1 == 1){
|
|
local->unkC = __chPropellor_getSpeed();
|
|
local->unk4 = __chPropellor_getSpeed();
|
|
}
|
|
this->state = arg1;
|
|
}
|
|
|
|
int func_80389B44(ActorMarker* marker, s32 arg1){
|
|
Actor *actor = marker_getActor(marker);
|
|
ActorLocal_RBB_36A0 * local = (ActorLocal_RBB_36A0 *)&actor->local;
|
|
|
|
return (0.0f < local->unk4);
|
|
}
|
|
|
|
|
|
void func_80389B80(Actor *this, f32 arg1){
|
|
ActorLocal_RBB_36A0 * local = (ActorLocal_RBB_36A0 *)&this->local;
|
|
local->unk0 = func_802F9AA8(0x400);
|
|
func_802F9DB8(local->unk0, arg1, arg1, 0.0f);
|
|
func_802F9F80(local->unk0, 0.0f, 8999999488.0f, 0.0f);
|
|
func_802FA060(local->unk0, 0x4650, 0x4650, 0.0f);
|
|
|
|
if (!levelSpecificFlags_get(LEVEL_FLAG_3_RBB_UNKNOWN) && !levelSpecificFlags_get(LEVEL_FLAG_4_RBB_UNKNOWN)) {
|
|
func_802F9EC4(local->unk0, &this->position, 0x1f4, 0x7d0);
|
|
func_802FA0B0(local->unk0, 1);
|
|
}
|
|
}
|
|
|
|
void __chPropellor_free(Actor *actor){
|
|
ActorLocal_RBB_36A0 * local = (ActorLocal_RBB_36A0 *)&actor->local;
|
|
if(func_802F9C0C(local->unk0))
|
|
func_802F9D38(local->unk0);
|
|
}
|
|
|
|
|
|
void chPropellor_update(Actor *this){
|
|
ActorLocal_RBB_36A0 * local = (ActorLocal_RBB_36A0 *)&this->local;
|
|
f32 tmp;
|
|
f32 sp34 = time_getDelta();
|
|
|
|
if(!this->volatile_initialized){
|
|
this->volatile_initialized = TRUE;
|
|
this->marker->propPtr->unk8_3 = 1;
|
|
this->pitch = randf2(0.0f, 300.0f);
|
|
func_803300C0(this->marker, func_80389B44);
|
|
marker_setFreeMethod(this->marker, __chPropellor_free);
|
|
func_80389B80(this, 1.0f);
|
|
if(this->unk78_13 == 0x1C){
|
|
local->unk8 = 0;
|
|
this->position_x = 7625.5f;
|
|
this->position_y = -1950.0f;
|
|
this->position_z = 300.0f;
|
|
}
|
|
else{//L80389D4C
|
|
local->unk8 = 1;
|
|
this->position_x = 7625.5f;
|
|
this->position_y = -1950.0f;
|
|
this->position_z = -300.0f;
|
|
}//L80389D7C
|
|
local->unk4 = 0.0f;
|
|
local->unkC = 0.0f;
|
|
__chPropellor_setState(this, 1);
|
|
|
|
if (levelSpecificFlags_get(local->unk8 ? LEVEL_FLAG_4_RBB_UNKNOWN : LEVEL_FLAG_3_RBB_UNKNOWN)) {
|
|
ncStaticCamera_setToNode(9);
|
|
func_80324E38(0.0f, 3);
|
|
timedFunc_set_2(0.1f, (GenFunction_2)levelSpecificFlags_set, local->unk8 ? 0x28 : 0x27, 1);
|
|
timed_exitStaticCamera(4.5f);
|
|
func_80324E38(4.5f, 0);
|
|
timedFunc_set_2(4.5f, (GenFunction_2)levelSpecificFlags_set, local->unk8 ? 0x4 : 0x3, 0);
|
|
timedFunc_set_3(4.5f, (GenFunction_3)func_802E4078, MAP_34_RBB_ENGINE_ROOM, !local->unk8 ? 3 : 2, 0);
|
|
func_803228D8();
|
|
}
|
|
}//L80389EA8
|
|
|
|
tmp = this->pitch;
|
|
this->pitch -= local->unkC*sp34;
|
|
if( (0.0f < tmp && this->pitch <= 0.0f)
|
|
|| (180.0f < tmp && this->pitch <= 180.0f)
|
|
){
|
|
if (levelSpecificFlags_get(LEVEL_FLAG_3_RBB_UNKNOWN) || levelSpecificFlags_get(LEVEL_FLAG_4_RBB_UNKNOWN)) {
|
|
func_8030E760(SFX_2_CLAW_SWIPE, 0.4f, 20000);
|
|
}
|
|
else {
|
|
func_8030E988(SFX_2_CLAW_SWIPE, 0.4f, 20000, &this->position, 500.0f, 1000.0f);
|
|
}
|
|
}//L80389F94
|
|
if(this->pitch < 0.0f)
|
|
this->pitch += 360.0f;
|
|
|
|
if(this->state == 1){
|
|
local->unk4 = __chPropellor_getSpeed();
|
|
if(local->unkC < local->unk4){
|
|
local->unkC += 75*sp34;
|
|
local->unkC = MIN(local->unk4, local->unkC);
|
|
}//L8038A03C
|
|
if(local->unk4 < local->unkC){
|
|
local->unkC -= 75*sp34;
|
|
local->unkC = MAX(local->unk4, local->unkC);
|
|
}
|
|
}//L8038A08C
|
|
}
|