banjo-kazooie/src/GV/ch/histup.c

231 lines
7.4 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern void func_8028F738(f32[3], f32[3], f32, s32);
extern int func_8030E3FC(u8);
void func_8038DBDC(Actor *this);
Actor *func_8038DA18(ActorMarker *this_marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
/* .data */
ActorAnimationInfo D_803912E0[] = {
{0x00, 0.0f},
{ASSET_D1_ANIM_HISTUP_HIDE, 800000.0f},
{ASSET_E2_ANIM_HISTUP_PEEK, 2.0f},
{ASSET_D1_ANIM_HISTUP_HIDE, 800000.0f},
{ASSET_D0_ANIM_HISTUP_GROW, 6.0f},
{ASSET_CF_ANIM_HISTUP_RAISED, 2.0f},
{ASSET_D1_ANIM_HISTUP_HIDE, 1.6f},
};
ActorInfo D_80391318 = { MARKER_AA_HISTUP, ACTOR_11C_HISTUP, ASSET_3DE_MODEL_HISTUP,
0x1, D_803912E0,
func_8038DBDC, func_80326224, func_8038DA18,
2500, 0, 1.7f, 0
};
/* .bss */
extern struct {
s32 unk0;
s32 unk4;
s32 unk8;
}GV_D_80391AB0;
/* .code */
int func_8038D920(Actor *this, f32 arg1){
f32 sp2C[3];
f32 sp20[3];
f32 sp1C;
this->unkF4_8 = 20;
sp1C = (f32)(this->unkF4_8 + 25);
player_getPosition(sp20);
ml_vec3f_diff_copy(sp2C, this->position, sp20);
return this->position_y < sp20[1] && sp20[1] <= arg1 && sp2C[0]*sp2C[0] + sp2C[2]*sp2C[2] < sp1C*sp1C;
}
Actor *func_8038DA18(ActorMarker *this_marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
Actor *this;
f32 sp38[3];
f32 sp2C[3];
this = actor_draw(this_marker, gfx, mtx, vtx);
if(!this_marker->unk14_21) return this;
sp2C[0] = this->position_x;
sp2C[1] = this->position_y + 100.0f;
sp2C[2] = this->position_z;
func_8034A174(func_80329934(), 5, sp38);
if(this->state == 1 || this->state == 2){
sp38[1] = this->position_y;
}
if(func_8038D920(this, sp38[1])){
func_8028F738(sp2C, sp38, (f32)this->unkF4_8, 2);
}
return this;
}
void GV_func_8038DB0C(Actor *this){
subaddie_set_state_with_direction(this, 1, 0.99f, 0);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_STOPPED);
}
void func_8038DB4C(s32 arg0){
GV_D_80391AB0.unk0 = arg0;
}
void func_8038DB58(s32 arg0){
GV_D_80391AB0.unk4 = arg0;
}
s32 func_8038DB64(void){
return GV_D_80391AB0.unk4;
}
void func_8038DB70(void){
GV_D_80391AB0.unk4++;
}
void func_8038DB88(Actor *this){
u8 tmp;
tmp = this->unk44_31;
if(tmp){
if(func_8030E3FC(tmp)){
func_8030E394(this->unk44_31);
}
func_8030DA44(this->unk44_31);
this->unk44_31 = 0;
}
}
void func_8038DBDC(Actor *this){
u8 tmp;
switch(this->state){
case 1: //8038DC18
if(!this->initialized){
this->initialized = TRUE;
this->marker->propPtr->unk8_3 = TRUE;
actor_collisionOff(this);
subaddie_set_state_with_direction(this, 1, 0.99f, 0);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_STOPPED);
GV_D_80391AB0.unk8 = 0;
func_8038DB4C(0);
this->unk1C[0] = 0.0f;
}//L8038DC90
if(func_8038E178() != (s32)this->unk1C[0] || func_803203FC(UNKFLAGS1_C1_IN_FINAL_CHARACTER_PARADE)){
if(15.0f <= this->unk60){
subaddie_set_state_with_direction(this, 2, 0.01f, 1);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_ONCE);
animctrl_setDuration(this->animctrl, 2.0f);
this->unk1C[0] = (f32)func_8038E178();
this->unk60 = 0.0f;
}
else{//L8038DD2C
this->unk60 += 1.0f;
}
}
break;
case 2: //8038DD3C
if(!(func_8038E178() < 5)){
func_8038DB88(this);
if(GV_D_80391AB0.unk8){
subaddie_set_state_with_direction(this, 3, 0.99f, 0);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_STOPPED);
this->unk1C[0] = 0.0f;
}
}
else if(actor_animationIsAt(this, 0.99f)){//L8038DD94
GV_func_8038DB0C(this);
func_8038DB88(this);
}
else{ //L8038DDC0
if(actor_animationIsAt(this, 0.2f) && this->unk44_31 == 0){
this->unk44_31 = func_8030ED2C(0x3F7, 3);
this->unk1C[1] = 1.0f;
func_8030E2C4(this->unk44_31);
}//L8038DE08
if(actor_animationIsAt(this, 0.7f)){
func_8038DB88(this);
FUNC_8030E8B4(SFX_3F8_UNKNOWN, 1.0f, 32000, this->position, 1250, 2500);
}
}
break;
case 3: //8038DE44
if(!(this->unk38_31 < 0x21)){
subaddie_set_state_with_direction(this, 4, 0.01f, 1);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_ONCE);
animctrl_setDuration(this->animctrl, 3.0f);
func_803865F8();
this->unk38_31 = 0;
}
else{//L8038DEA0
this->unk38_31++;
}
break;
case 4: //8038DEBC
if(actor_animationIsAt(this, 0.99f)){
subaddie_set_state_with_direction(this, 5, 0.01f, 1);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_LOOP);
animctrl_setDuration(this->animctrl, 2.0f);
func_8038DB58(0);
}
else{
if(actor_animationIsAt(this, 0.04f))
FUNC_8030E8B4(SFX_7C_CHEBOOF, 1.0f, 32000, this->position, 1250, 2500);
if(actor_animationIsAt(this, 0.04f))
FUNC_8030E8B4(SFX_2C_PULLING_NOISE, 1.0f, 32000, this->position, 1250, 2500);
if(actor_animationIsAt(this, 0.33f))
FUNC_8030E8B4(SFX_2C_PULLING_NOISE, 1.2f, 32000, this->position, 1250, 2500);
if(actor_animationIsAt(this, 0.66f))
FUNC_8030E8B4(SFX_2C_PULLING_NOISE, 1.4f, 32000, this->position, 1250, 2500);
}
break;
case 5: //8038DFC8
if(func_8038DB64() == 0x127){
subaddie_set_state_with_direction(this, 6, 0.01f, 1);
animctrl_setPlaybackType(this->animctrl, ANIMCTRL_LOOP);
animctrl_setDuration(this->animctrl, 1.6f);
func_80386608();
func_8038DB4C(0);
GV_D_80391AB0.unk8 = FALSE;
func_8025A58C(-1, 0x190);
func_8025A7DC(COMUSIC_27_GV_RUBEES_SONG);
if(!this->unk44_31){
this->unk44_31 = func_8030ED2C(SFX_2C_PULLING_NOISE, 3);
this->unk1C[1] = 1.9f;
func_8030E2C4(this->unk44_31);
}
}
else{//L8038E070
func_8038DB70();
}
break;
case 6: //8038E080
if(actor_animationIsAt(this, 0.89f)){
GV_func_8038DB0C(this);
func_8038DB88(this);
}
else{
if(actor_animationIsAt(this, 0.42f))
func_8030E510(SFX_7C_CHEBOOF, 32000);
tmp = this->unk44_31;
if(tmp && func_8030E3FC(tmp)){
if(1.0 < this->unk1C[1]){
this->unk1C[1] -= 0.1;
}
func_8030DBB4(this->unk44_31, this->unk1C[1]);
}
}
break;
}//L8038E12C
}