375 lines
12 KiB
C
375 lines
12 KiB
C
#include <ultra64.h>
|
|
#include "rand.h"
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
#ifndef MIN
|
|
#define MIN(s,t) ((s)<(t)?(s):(t))
|
|
#endif
|
|
|
|
#ifndef MAX
|
|
#define MAX(s,t) ((s)<(t)?(t):(s))
|
|
#endif
|
|
|
|
#ifndef SQUARE
|
|
#define SQUARE(s) ((s)*(s))
|
|
#endif
|
|
|
|
void func_80328FB0(Actor *, f32);
|
|
|
|
void subaddie_set_state_with_direction(Actor*, s32, f32, s32);
|
|
void func_802C8F70(f32);
|
|
void timed_exitStaticCamera(f32);
|
|
Actor *func_8032811C(s32 actor_id, s32 position[3], s32 yaw);
|
|
void MM_func_80387F44(void);
|
|
|
|
void func_803876D0(Actor *);
|
|
|
|
typedef struct chconga_s{
|
|
TUPLE(s32, orangeSpawnPosition);
|
|
s32 unkC;
|
|
s32 unk10;
|
|
u8 pad14[0x4];
|
|
s32 unk18;
|
|
s32 unk1C;
|
|
}ActorLocal_Conga;
|
|
|
|
|
|
/* .data */
|
|
ActorAnimationInfo chCongaAnimations[9] = {
|
|
{0, 0.0f},
|
|
{ASSET_51_ANIM_CONGA_IDLE, 3.8f},
|
|
{ASSET_52_ANIM_CONGA_OW, 1.0f},
|
|
{ASSET_53_ANIM_CONGA_DEFEAT, 2.0f},
|
|
{ASSET_54_ANIM_CONGA_THROW, 1.4f},
|
|
{ASSET_55_ANIM_CONGA_BEAT_CHEST, 0.4f},
|
|
{ASSET_56_ANIM_CONGA_RAISE_ARMS, 0.9f},
|
|
{ASSET_A2_ANIM_CONGA_THROW_2, 1.6f},
|
|
{ASSET_52_ANIM_CONGA_OW, 1.0f}
|
|
};
|
|
|
|
ActorInfo chcongaInfo = { MARKER_7_CONGA, ACTOR_8_CONGA, ASSET_35C_MODEL_CONGA,
|
|
1, chCongaAnimations,
|
|
func_803876D0, func_80326224, actor_draw,
|
|
0, 0x333, 0.0f, 0
|
|
};
|
|
|
|
|
|
/* code */
|
|
int func_80386ED0(Actor * this){
|
|
f32 plyrPos[3];
|
|
f32 tmpz;
|
|
|
|
if(map_get() != MAP_2_MM_MUMBOS_MOUNTAIN)
|
|
return 0;
|
|
|
|
if(!this->unk10_12)
|
|
return 0;
|
|
|
|
player_getPosition(plyrPos);
|
|
if(plyrPos[1] < 300.0f || 600.0f < plyrPos[1])
|
|
return 0;
|
|
|
|
tmpz = plyrPos[2]- 5029.0f;
|
|
if(52900.0f < (plyrPos[0]- -5011.0f)*(plyrPos[0]- -5011.0f) + (plyrPos[2]- 5029.0f)*(plyrPos[2]- 5029.0f))
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void func_80386FB0(Actor *this){
|
|
subaddie_set_ideal_yaw(this, func_80329784(this));
|
|
func_80328FB0(this, 3.0f);
|
|
}
|
|
|
|
void func_80386FE8(void){
|
|
if( (globalTimer_getTime() & 0xF) == 0xB
|
|
&& 0.85 < randf ()
|
|
&& !func_803114B0()
|
|
){
|
|
func_8030E58C(((s32)(randf ()*256.0f) & 1)? SFX_22_KONGA_NOISE_1: SFX_23_KONGA_NOISE_2, 1.0f);
|
|
}
|
|
}
|
|
|
|
void func_8038708C(Actor *this, s32 anim_id){
|
|
subaddie_set_state_with_direction(this, anim_id, 0.0f, 1);
|
|
func_8030E58C(SFX_24_KONGA_NOISE_3, randf2(0.9f, 1.1f));
|
|
}
|
|
|
|
void func_803870D0(Actor *this, ActorMarker *arg1){
|
|
marker_getActor(arg1)->unk100 = this->marker;
|
|
}
|
|
|
|
void func_80387100(ActorMarker *this){
|
|
ActorMarker *m = *(ActorMarker **)&this;
|
|
Actor* actorPtr;
|
|
f32 sp1C[3];
|
|
|
|
actorPtr = marker_getActor(m);
|
|
sp1C[0] = actorPtr->position_x;
|
|
sp1C[1] = actorPtr->position_y + 60.0f;
|
|
sp1C[2] = actorPtr->position_z;
|
|
func_802C8F70(0.0f);
|
|
func_80333270(JIGGY_A_MM_CONGA, sp1C, func_803870D0, m);
|
|
|
|
}
|
|
|
|
void func_80387168(ActorMarker *marker, ActorMarker *other_marker){
|
|
Actor *actorPtr;
|
|
|
|
actorPtr = marker_getActor(marker);
|
|
if(((ActorLocal_Conga *)&actorPtr->local)->unkC == 1){
|
|
if(actorPtr->unk10_12 == 0){
|
|
((ActorLocal_Conga *)&actorPtr->local)->unkC = 0;
|
|
if(mapSpecificFlags_get(0xA))
|
|
actorPtr->unk38_31++;
|
|
|
|
actorPtr->unk10_12 = MIN(actorPtr->unk38_31, 0xA);
|
|
if( actorPtr->unk38_31 == 3
|
|
&& !jiggyscore_isCollected(JIGGY_A_MM_CONGA)
|
|
){
|
|
subaddie_set_state_with_direction(actorPtr, 8, 0 ,1);
|
|
timed_setStaticCameraToNode(0.0f, 0x10);
|
|
func_80324E38(0.0f, 3);
|
|
FUNC_8030E624(SFX_84_GOBI_CRYING, 0.8f, 32750);
|
|
FUNC_8030E624(SFX_84_GOBI_CRYING, 0.8f, 32750);
|
|
}
|
|
else if( actorPtr->state != 3
|
|
&& actorPtr->state != 8
|
|
){
|
|
func_8038708C(actorPtr, 2);
|
|
if(actorPtr->unk38_31 == 1){
|
|
func_80311480(ASSET_B39_TEXT_CONGA_HIT_BY_EGG, 4, actorPtr->position, 0, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int func_803872EC(void){
|
|
s32 text_id = func_803114C4();
|
|
|
|
return text_id == ASSET_B37_TEXT_CONGA_SAFE_UP_HERE
|
|
|| text_id == ASSET_B38_TEXT_CONGA_DEFEAT
|
|
|| volatileFlag_get(VOLATILE_FLAG_1F_IN_CHARACTER_PARADE)
|
|
|| text_id == ASSET_B3B_TEXT_CONGA_ORANGE_PAD_JIGGY
|
|
|| text_id == ASSET_B45_TEXT_JIGGY_COLLECT_10
|
|
|| text_id == ASSET_B51_TEXT_BOTTLES_HOW_TO_EXIT_LEVEL;
|
|
}
|
|
|
|
void func_80387370(ActorMarker *this, enum asset_e text_id, s32 arg2){
|
|
marker_getActor(this)->velocity_x = 9.0f;
|
|
timed_setStaticCameraToNode(0.0f, 0x11);
|
|
timed_exitStaticCamera(3.2f);
|
|
func_80324E38(3.2f, 0);
|
|
}
|
|
|
|
void func_803873C8(ActorMarker *congaMarker){
|
|
ActorMarker *m = *(ActorMarker **)&congaMarker; //sp84
|
|
Actor * congaPtr = marker_getActor(m); //sp80
|
|
ActorLocal_Conga *conga_localPtr = (ActorLocal_Conga *)&congaPtr->local; //sp7C
|
|
s32 conga_state = congaPtr->state;
|
|
Actor * orangePtr;
|
|
f32 pad0;
|
|
TUPLE(f32, pos) plyr;
|
|
f32 temp_f22;
|
|
f32 temp_f20;
|
|
f32 temp_f18;
|
|
f32 iHeight;
|
|
f32 iVelY;
|
|
|
|
congaPtr->unk10_12 -= (congaPtr->unk10_12 && ( conga_state == 7));
|
|
MM_func_80387F44();
|
|
congaPtr->unk28 = 2.0f;
|
|
orangePtr = func_8032811C(ACTOR_14_ORANGE_PROJECTILE, conga_localPtr->orangeSpawnPosition, congaPtr->yaw);
|
|
|
|
if(orangePtr != NULL){
|
|
player_getPosition(plyr.pos);
|
|
orangePtr->velocity_x = plyr.pos_x - orangePtr->position_x;
|
|
orangePtr->velocity_y = (60.0)*((conga_state == 7) ? 0.5: 1.0);
|
|
orangePtr->velocity_z = plyr.pos_z - orangePtr->position_z;
|
|
if(SQUARE(plyr.pos_z - m->propPtr->z) + SQUARE(plyr.pos_x - m->propPtr->x) < 40000.0f ){
|
|
temp_f20 = randf2(2.4f, 4.4f); temp_f22 = randf2(2.4f, 4.4f); //f22
|
|
orangePtr->velocity[0] *= (randf() < 0.5)? temp_f20 : -temp_f20;
|
|
orangePtr->velocity[1] = randf2(1.8f, 2.2f) * 60.0;
|
|
orangePtr->velocity[2] *= (randf() < 0.5)? temp_f22 : -temp_f22;
|
|
}
|
|
|
|
iHeight = orangePtr->position_y;
|
|
iVelY = orangePtr->velocity_y;
|
|
for(temp_f18 = 0.0f; !(iHeight < plyr.pos_y && iVelY < 0.0f); temp_f18++){
|
|
iHeight += (iVelY -= 5.0);
|
|
}
|
|
orangePtr->velocity_x /= temp_f18;
|
|
orangePtr->velocity_z /= temp_f18;
|
|
}
|
|
}
|
|
|
|
void func_803876D0(Actor *this){
|
|
f32 tmp_f4;
|
|
NodeProp *sp40;
|
|
s32 sp3C;
|
|
|
|
this->marker->propPtr->unk8_3 = (timedFuncQueue_is_empty(this))?1:0;
|
|
if(!this->initialized){
|
|
((ActorLocal_Conga *)&this->local)->unkC = 1;
|
|
this->unk16C_0 = 1;
|
|
this->initialized = 1;
|
|
this->velocity_x = 0.0f;
|
|
this->unk28 = 0.0f;
|
|
sp40 = func_80304C38(0x150, this);
|
|
((ActorLocal_Conga *)&this->local)->unk1C = nodeprop_getRadius(sp40);
|
|
func_80304D4C(sp40, &((ActorLocal_Conga *)&this->local)->unk10);
|
|
}
|
|
if(0.0f == this->unk28){
|
|
this->unk28 = (actorArray_findActorFromMarkerId(MARKER_36_ORANGE_COLLECTIBLE) != NULL)? 2.0f: 1.0f;
|
|
}
|
|
if(0.0f != this->velocity_x){
|
|
this->velocity_x -= 1.0f;
|
|
if(0.0f == this->velocity_x){
|
|
__spawnQueue_add_1((GenFunction_1)func_80387100, (s32)this->marker);
|
|
}
|
|
}
|
|
marker_setCollisionScripts(this->marker, NULL, NULL, func_80387168);
|
|
if( !func_80329530(this, 2100)
|
|
&& this->state != 2
|
|
&& this->state != 8
|
|
){
|
|
if(this->state > 3 && this->state < 8){
|
|
actor_loopAnimation(this);
|
|
subaddie_set_state_with_direction(this, 1, 0.76f, 1);
|
|
}
|
|
return;
|
|
}
|
|
|
|
sp3C = func_80329530(this, 1000);
|
|
if( func_8032A9E4(((ActorLocal_Conga *)&this->local)->unk10, ((ActorLocal_Conga *)&this->local)->unk18, ((ActorLocal_Conga *)&this->local)->unk1C)
|
|
&& !this->unk138_23
|
|
&& func_80311480(ASSET_B37_TEXT_CONGA_SAFE_UP_HERE, 0, 0, 0, 0, 0)
|
|
){
|
|
this->unk138_23 = 1;
|
|
mapSpecificFlags_set(0xA, 1);
|
|
}//L803878F8
|
|
|
|
if( sp3C && !this->unk138_24){
|
|
if(func_80311480((player_getTransformation()== TRANSFORM_2_TERMITE) ? ASSET_B3E_TEXT_CONGA_MEET_AS_TERMITE : ASSET_B3C_TEXT_CONGA_MEET, 0, this->position, 0,0,0)){
|
|
this->unk138_24 = 1;
|
|
}
|
|
} //L80387968
|
|
|
|
switch(this->state){
|
|
case 1://80387990
|
|
actor_loopAnimation(this);
|
|
func_80386FB0(this);
|
|
func_80386FE8();
|
|
if(actor_animationIsAt(this, 0.0f) || actor_animationIsAt(this, 0.45f)){
|
|
if(randf() < 0.2){
|
|
animctrl_setDirection(this->animctrl, animctrl_isPlayedForwards(this->animctrl)?0:1);
|
|
};
|
|
}//L80387A18
|
|
if(actor_animationIsAt(this, 0.66f)){
|
|
subaddie_maybe_set_state_position_direction(this, 6, 0, 1, 0.38f);
|
|
}
|
|
if( sp3C
|
|
&& func_8028ECAC() != 1
|
|
&& !func_80386ED0(this)
|
|
&& timedFuncQueue_is_empty()
|
|
&& !func_8032A9E4(((ActorLocal_Conga *)&this->local)->unk10, ((ActorLocal_Conga *)&this->local)->unk18, ((ActorLocal_Conga *)&this->local)->unk1C)
|
|
&& !func_803872EC()
|
|
){
|
|
subaddie_set_state_with_direction(this, 4, 0.0f, 1);
|
|
}//L80387AC0
|
|
if( func_8028ECAC() != 1
|
|
&& func_80386ED0(this)
|
|
&& this->unk38_31 != 0
|
|
&& !func_803872EC()
|
|
){
|
|
subaddie_set_state_with_direction(this, 7, 0.0f, 1);
|
|
}
|
|
break;
|
|
|
|
case 6: //L80387B24
|
|
((ActorLocal_Conga *)&this->local)->unkC = 1;
|
|
actor_playAnimationOnce(this);
|
|
func_80386FE8();
|
|
if( animctrl_isPlayedForwards(this->animctrl) == TRUE
|
|
&& actor_animationIsAt(this, 0.0f)
|
|
){
|
|
subaddie_set_state_with_direction(this, 5, 0.0f, 1);
|
|
}
|
|
else if( !animctrl_isPlayedForwards(this->animctrl)
|
|
&& actor_animationIsAt(this, 0.001f)
|
|
){
|
|
subaddie_set_state_with_direction(this, 1, 0.76f, 1);
|
|
}
|
|
break;
|
|
|
|
case 5: //L80387BC0
|
|
((ActorLocal_Conga *)&this->local)->unkC = 1;
|
|
actor_loopAnimation(this);
|
|
func_80386FE8();
|
|
if( actor_animationIsAt(this, 0.99f)){
|
|
subaddie_maybe_set_state_position_direction(this, 6, 0.999f, 0, sp3C ? 1.0 : 0.4);
|
|
}//L80387C30
|
|
if( actor_animationIsAt(this, 0.9f)
|
|
|| actor_animationIsAt(this, 0.4f)
|
|
){
|
|
func_8030E6D4(SFX_3FB_UNKNOWN);
|
|
}
|
|
break;
|
|
|
|
case 4: //L80387C74
|
|
if(actor_animationIsAt(this, 0.6f)){
|
|
func_8030E58C(SFX_2_CLAW_SWIPE, 0.7f);
|
|
}
|
|
func_80386FB0(this);
|
|
if( !sp3C
|
|
|| player_is_in_jiggy_jig()
|
|
|| func_80386ED0(this)
|
|
|| !timedFuncQueue_is_empty()
|
|
|| func_803872EC()
|
|
){
|
|
subaddie_set_state_with_direction(this, 1, 0.0f, 1);
|
|
}
|
|
break;
|
|
|
|
case 2: //L80387D0C
|
|
actor_playAnimationOnce(this);
|
|
if(actor_animationIsAt(this, 0.99f)){
|
|
subaddie_set_state_with_direction(this, 1, 0.0f, 1);
|
|
}
|
|
break;
|
|
|
|
case 8: //L80387D4C
|
|
actor_playAnimationOnce(this);
|
|
if(actor_animationIsAt(this, 0.99f)){
|
|
subaddie_set_state_with_direction(this, 3, 0.0f, 1);
|
|
func_80311480(ASSET_B38_TEXT_CONGA_DEFEAT, 0xe, this->position, this->marker, func_80387370, NULL);
|
|
}
|
|
break;
|
|
|
|
case 3: //L80387DB8
|
|
actor_loopAnimation(this);
|
|
if(jiggyscore_isCollected(JIGGY_A_MM_CONGA)){
|
|
subaddie_set_state_with_direction(this, 1, 0.0f, 1);
|
|
}
|
|
break;
|
|
|
|
case 7: //L80387DF0
|
|
if(this->unk10_12 == 0){
|
|
if(actor_animationIsAt(this, 0.97f)){
|
|
((ActorLocal_Conga *)&this->local)->unkC = 1;
|
|
subaddie_set_state_with_direction(this, 6, 0.0f, 1);
|
|
}
|
|
}
|
|
break;
|
|
}//L80387E38
|
|
if( (this->state == 4 && actor_animationIsAt(this, 0.56f))
|
|
|| (this->state == 7 && actor_animationIsAt(this, 0.468f))
|
|
){
|
|
func_8034A1B4(this->marker->unk44, 5, &this->local);
|
|
__spawnQueue_add_1((GenFunction_1)func_803873C8, (s32)this->marker); //spawn orange
|
|
}
|
|
}
|