254 lines
7.3 KiB
C
254 lines
7.3 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
extern void func_8028E668(f32[3], f32, f32, f32);
|
|
extern void func_8028FA34(s32, Actor*);
|
|
extern s32 func_802E0970(s32, f32, f32, f32, s32, s32, f32[3]);
|
|
|
|
typedef struct {
|
|
u8 unk0[0xE];
|
|
s16 unkE;
|
|
f32 throw_target_position[3];
|
|
s32 throw_target_radius;
|
|
NodeProp* unk20;
|
|
s32 unk24;
|
|
}ActorLocal_Blubber;
|
|
|
|
void func_803878CC(Actor *this);
|
|
void TTC_func_80387CF4(Actor *this);
|
|
Actor *func_80387D6C(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx);
|
|
|
|
/* .data */
|
|
ActorAnimationInfo D_8038C4E0[] = {
|
|
{0x00, 0.0f},
|
|
{0xB5, 2.0f},
|
|
{0xB6, 2.0f},
|
|
{0xB6, 2.0f},
|
|
{0xB7, 1.4f},
|
|
{0xB8, 0.8f}
|
|
};
|
|
|
|
ActorInfo TTC_D_8038C510 = {
|
|
MARKER_A3_BLUBBER, ACTOR_115_BLUBBER, ASSET_370_MODEL_BLUBBER,
|
|
0x1, D_8038C4E0,
|
|
func_803878CC, TTC_func_80387CF4, func_80387D6C,
|
|
0, 0x399, 1.8f, 0
|
|
};
|
|
|
|
/* .code */
|
|
void func_80387490(Actor *this){
|
|
ActorLocal_Blubber *local = (ActorLocal_Blubber *)&this->local;
|
|
|
|
animctrl_setTransitionDuration(this->animctrl, 0.2f);
|
|
this->initialized = TRUE;
|
|
local->unk20 = func_80304C38(ACTOR_2B_GOLD_BULLION_THROW_TARGET, this);
|
|
if(local->unk20){
|
|
|
|
nodeprop_getPosition(local->unk20, local->throw_target_position);
|
|
local->throw_target_radius = nodeprop_getRadius(local->unk20);
|
|
}
|
|
local->unk24 = 4;
|
|
func_8032A82C(this, 0x14C);
|
|
}
|
|
|
|
void func_80387520(ActorMarker *caller, enum asset_e text_id, s32 arg1){
|
|
Actor *this = marker_getActor(caller);
|
|
ActorLocal_Blubber *local = (ActorLocal_Blubber*)&this->local;
|
|
|
|
if(text_id == 0xa0d || text_id == 0xa2a){
|
|
local->unk24 = 0;
|
|
}
|
|
else{
|
|
func_80328B8C(this, 2, 0, 1);
|
|
}
|
|
}
|
|
|
|
void func_80387574(ActorMarker *caller, enum asset_e text_id, s32 arg1){
|
|
f32 sp24[3];
|
|
|
|
if(nodeProp_findPositionFromActorId(0x14b, sp24)){
|
|
jiggySpawn(JIGGY_14_TTC_BLUBBER, sp24);
|
|
__spawnQueue_add_4((GenMethod_4)func_802C4140, ACTOR_4C_STEAM, reinterpret_cast(s32, sp24[0]), reinterpret_cast(s32, sp24[1]), reinterpret_cast(s32, sp24[2]));
|
|
}
|
|
}
|
|
|
|
void func_803875D4(ActorMarker *marker){
|
|
Actor *this = marker_getActor(reinterpret_cast(ActorMarker *, marker));
|
|
enum asset_e text_id;
|
|
|
|
func_80328A84(this, 4);
|
|
actor_loopAnimation(this);
|
|
this->unk28 = 0.0f;
|
|
|
|
if(!mapSpecificFlags_get(2)) {
|
|
text_id = jiggyscore_isCollected(JIGGY_14_TTC_BLUBBER) ? 0xa2a : 0xa0d;
|
|
func_80311480( text_id, 0xf, this->position, this->marker, func_80387520, func_80387574);
|
|
mapSpecificFlags_set(2, TRUE);
|
|
}
|
|
}
|
|
|
|
void func_80387678(Actor *this){
|
|
if( !mapSpecificFlags_get(1) ) return;
|
|
if( mapSpecificFlags_get(3) ) return;
|
|
|
|
this->yaw_ideal = (f32) func_80329784(this);
|
|
mapSpecificFlags_set(3, TRUE);
|
|
func_8028F918(2);
|
|
timed_setCameraToNode(0.0f, 4);
|
|
timedFunc_set_1(1.0f, (GenMethod_1)func_803875D4, (s32)this->marker);
|
|
func_80328B8C(this, 1, 0.0f, 1);
|
|
}
|
|
|
|
void func_8038771C(Actor *this){
|
|
if( !func_80329030(this, 0)
|
|
&& func_80329480(this)
|
|
){
|
|
func_80328CEC(this, (s32)this->yaw_ideal, 120, 180);
|
|
}
|
|
}
|
|
|
|
void func_80387774(Actor **this_ptr){
|
|
ActorLocal_Blubber *local = (ActorLocal_Blubber *)&(*this_ptr)->local;
|
|
|
|
func_8028F364(local->throw_target_position, local->throw_target_radius, 100.0f, ACTOR_2A_GOLD_BULLION, this_ptr);
|
|
if( func_80329530(*this_ptr, 200)
|
|
&& carriedObj_getMarkerId() == MARKER_37_GOLD_BULLION
|
|
&& func_8028FC34()
|
|
){
|
|
func_8028FA34(!mapSpecificFlags_get(0)? 0x149 : 0x14a, *this_ptr);
|
|
(*this_ptr)->unk138_24 = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
void func_80387830(Actor *this , f32 arg1, f32 arg2){
|
|
if( actor_animationIsAt(this, arg1)
|
|
|| actor_animationIsAt(this, arg2)
|
|
){
|
|
this->unk10_12 = func_802E0970(0x26, 0.75f, 0.85f, 0.05f, 11000, this->unk10_12, this->position);
|
|
}
|
|
}
|
|
|
|
void func_803878CC(Actor * this){
|
|
ActorLocal_Blubber *local;
|
|
|
|
this->marker->propPtr->unk8_3 = TRUE;
|
|
func_8028E668(this->position, 90.0f, -10.0f, 110.0f);
|
|
if(!mapSpecificFlags_get(1) && !func_80329530(this, 2500))
|
|
return;
|
|
|
|
if(!this->unk16C_4){
|
|
if(this->state == 3){
|
|
func_80328B8C(this, 2, 0.0f, 1);
|
|
}
|
|
this->unk16C_4 = TRUE;
|
|
}//L80387970
|
|
|
|
if(func_80329530(this, 250) && !func_80329530(this, 80)
|
|
&& !this->unk138_24
|
|
&& item_getCount(ITEM_18_GOLD_BULLIONS) == 0
|
|
){
|
|
func_80311480(0xa0b, 0xe, this->position, this->marker, func_80387520, NULL);
|
|
this->unk138_24 = TRUE;
|
|
func_80328AC8(this, 3);
|
|
}
|
|
|
|
if( mapSpecificFlags_get(0)
|
|
&& !this->unk138_23
|
|
){
|
|
if(item_getCount(ITEM_18_GOLD_BULLIONS) == 0)
|
|
func_80311480(0xa0c, 4, NULL, NULL, NULL, NULL);
|
|
|
|
this->unk138_23 = TRUE;
|
|
this->unk138_24 = TRUE;
|
|
|
|
}//L80387A54
|
|
|
|
switch(this->state){//D_8038CD40
|
|
case 1:// 80387A84
|
|
if(!this->initialized){
|
|
actor_collisionOff(this);
|
|
func_80387490(this);
|
|
}
|
|
func_80387774(&this);
|
|
|
|
if(func_80328BD4(this, 2, 0.0f, 1, 0.007f))
|
|
break;
|
|
|
|
func_80328FB0(this, 3.0f);
|
|
func_8038771C(this);
|
|
func_80387830(this, 0.14f, 0.68f);
|
|
func_80387678(this);
|
|
break;
|
|
|
|
case 2:// 80387B10
|
|
func_80387774(&this);
|
|
if( actor_animationIsAt(this, 0.99f)
|
|
&& func_80328BD4(this, 1, 0.0f, 1, 0.78f)
|
|
){
|
|
this->unk28 = 4.0f;
|
|
break;
|
|
}
|
|
|
|
if(actor_animationIsAt(this, 0.3f)){
|
|
FUNC_8030E8B4(SFX_83_BLUBBER_CRYING, 0.95f, 17000, this->position, 1250, 2500);
|
|
}
|
|
|
|
if(actor_animationIsAt(this, 0.53f)){
|
|
FUNC_8030E8B4(SFX_83_BLUBBER_CRYING, 0.93f, 17000, this->position, 1250, 2500);
|
|
}
|
|
|
|
if(actor_animationIsAt(this, 0.72f)){
|
|
FUNC_8030E8B4(SFX_83_BLUBBER_CRYING, 0.91f, 17000, this->position, 1250, 2500);
|
|
}
|
|
|
|
func_80387678(this);
|
|
break;
|
|
|
|
case 3:
|
|
break;
|
|
|
|
case 4:// 80387C04
|
|
{
|
|
func_80328FB0(this, 3.0f);
|
|
local = (ActorLocal_Blubber*)&this->local;
|
|
if(actor_animationIsAt(this, 0.99f) && !local->unk24){
|
|
func_80328A84(this, 5);
|
|
this->unk28 = 8.0f;
|
|
}
|
|
}
|
|
|
|
if(actor_animationIsAt(this, 0.3f) && !func_803114B0()){
|
|
FUNC_8030E624(SFX_8C_BOGGY_WAHEY, 1.0f, 27000);
|
|
}
|
|
|
|
if(actor_animationIsAt(this, 0.28f) ||
|
|
(actor_animationIsAt(this, 0.78f) && !func_803114B0())
|
|
){
|
|
FUNC_8030E624(SFX_80_YUMYUM_CLACK, 0.9f, 13000);
|
|
}
|
|
break;
|
|
|
|
case 5:// 80387CD4
|
|
local = (ActorLocal_Blubber*)&this->local;
|
|
func_8032A95C(this, local->unkE, 0x21c);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void TTC_func_80387CF4(Actor *this){
|
|
func_80343DEC(this);
|
|
if(0.99 <= this->unk48){
|
|
func_8028F918(0);
|
|
func_80324E88(0.0f);
|
|
marker_despawn(this->marker);
|
|
}
|
|
func_80387830(this, 0.5f, 0.97f);
|
|
}
|
|
|
|
Actor *func_80387D6C(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){
|
|
func_8033A45C(4, 0);
|
|
return func_80325888(marker, gfx, mtx, vtx);
|
|
}
|