#include #include "functions.h" #include "variables.h" extern void func_8025AE50(s32, f32); extern void func_8028F710(s32, f32); typedef struct { s32 unk0; }ActorLocal_Grabba; void GV_func_8038BEA0(Actor *this); /* .data */ ActorAnimationInfo D_80391120[] ={ {0x00, 0.0f}, {ASSET_C5_ANIM_GRABBA_APPEAR, 8000000.0f}, {ASSET_C5_ANIM_GRABBA_APPEAR, 1.6f}, {ASSET_C7_ANIM_GRABBA_IDLE, 1.8f}, {ASSET_C6_ANIM_GRABBA_HIDE, 0.55f}, {ASSET_C8_ANIM_GRABBA_DEFEATED, 0.8f}, {ASSET_C7_ANIM_GRABBA_IDLE, 1.8f} }; ActorInfo D_80391158 = { MARKER_A6_GRABBA, ACTOR_118_GRABBA, ASSET_371_MODEL_GRABBA, 0x1, D_80391120, GV_func_8038BEA0, func_80326224, func_80325888, 0, 0, 0.0f, 0 }; s32 D_8039117C[3] = {160, 100, 0}; /* .bss */ s32 D_80391A80; /* .code */ void func_8038B960(void){ func_8025AE50(5000, 3.19f); } /* .bss */ extern s32 D_80391A80; /* .code */ void func_8038B988(ActorMarker *caller, enum asset_e text_id, s32 arg2){ Actor *this = marker_getActor(caller); func_80328B8C(this, 5, 0.01f, 1); actor_loopAnimation(this); func_802BAFE4(0x13); FUNC_8030E624(SFX_8D_BOGGY_OHWW, 0.9f, 32000); timedFunc_set_0(2.5f, func_8038B960); D_80391A80 = this->state; } void func_8038BA08(Actor *this){ func_80328B8C(this, 6, 0.01f, 1); actor_loopAnimation(this); this->unk100 = NULL; D_80391A80 = 3; if(func_8028ECAC() == BSGROUP_6_TURBO_TALON_TRAINERS) func_8028F710(3, 0.0f); func_80311480(ASSET_A79_TEXT_GRABBA_DEFEAT, 0xf, this->position, this->marker, func_8038B988, NULL); comusic_8025AB44(COMUSIC_57_TURBO_TRAINERS, 7000, 700); } s32 func_8038BAA4(Actor *jiggy){ s32 tmp_v0; s32 sp18[3]; map_get(); sp18[0] = (s32)jiggy->position_x; sp18[1] = (s32)jiggy->position_y; sp18[2] = (s32)jiggy->position_z; tmp_v0 = func_80307164(sp18); if( tmp_v0 < 0) return 0; else return func_80306DBC(tmp_v0) + 1; } int func_8038BB24(Actor *this){ if(func_80329530(this, 1560) && !func_80329530(this, 1380)){ return TRUE; } else{ return FALSE; } } void func_8038BB6C(Actor *jiggy, ActorMarker * grabba_marker) { Actor *grabba; ActorLocal_Grabba *grabba_local; ActorMarker *tmp = reinterpret_cast(ActorMarker *, grabba_marker); grabba = marker_getActor(tmp); grabba_local = (ActorLocal_Grabba *)&grabba->local; grabba->unk100 = jiggy->marker; grabba_local->unk0 = grabba->unk100->unk5C; jiggy->unk10_1 = TRUE; grabba->unk1C[2] = (f32)func_8038BAA4(jiggy); if(jiggyscore_isCollected((s32)grabba->unk1C[2])){ func_8038C748(); marker_despawn(grabba->marker); } } void func_8038BBFC(ParticleEmitter *pCtrl, f32 position[3], s32 cnt){ particleEmitter_setRGB(pCtrl, D_8039117C); particleEmitter_setAlpha(pCtrl, 0x96); particleEmitter_setSprite(pCtrl, ASSET_700_SPRITE_DUST); particleEmitter_setFade(pCtrl, 0.0f, 0.01f); particleEmitter_setStartingFrameRange(pCtrl, 0, 7); particleEmitter_setPosition(pCtrl, position); } void func_8038BC7C(f32 position[3], s32 cnt){ ParticleEmitter *pCtrl = partEmitMgr_newEmitter(cnt); func_8038BBFC(pCtrl, position, cnt); particleEmitter_setParticleSpawnPositionRange(pCtrl, -60.0f, 0.0f, -60.0f, 60.0f, 30.0f, 60.0f ); particleEmitter_setParticleVelocityRange(pCtrl, -250.0f, 10.0f, -250.0f, 250.0f, 110.0f, 250.0f ); func_802EFB70(pCtrl, 0.1f, 0.5f); func_802EFB84(pCtrl, 2.0f, 2.6f); particleEmitter_setSpawnIntervalRange(pCtrl, 0.0f, 0.01f); particleEmitter_setParticleLifeTimeRange(pCtrl, 0.5f, 1.4f); particleEmitter_emitN(pCtrl, cnt); } void func_8038BD8C(f32 position[3], s32 cnt){ ParticleEmitter *pCtrl = partEmitMgr_newEmitter(cnt); func_8038BBFC(pCtrl, position, cnt); particleEmitter_setParticleSpawnPositionRange(pCtrl, -40.0f, 0.0f, -40.0f, 40.0f, 30.0f, 40.0f ); particleEmitter_setParticleVelocityRange(pCtrl, -100.0f, 20.0f, -100.0f, 100.0f, 60.0f, 100.0f ); func_802EFB70(pCtrl, 0.1f, 0.5f); func_802EFB84(pCtrl, 1.2, 1.6f); particleEmitter_setSpawnIntervalRange(pCtrl, 0.0f, 0.01f); particleEmitter_setParticleLifeTimeRange(pCtrl, 0.5f, 1.4f); particleEmitter_emitN(pCtrl, cnt); } void GV_func_8038BEA0(Actor *this){ ActorLocal_Grabba *local = (ActorLocal_Grabba *)&this->local; f32 sp38[3]; if(!this->initialized){ this->initialized = TRUE; this->marker->propPtr->unk8_3 = TRUE; actor_collisionOff(this); this->unk38_31 = 0; this->unk1C[1] = this->position_y; D_80391A80 = this->state; func_80333270(JIGGY_3E_GV_GRABBA, this->position, func_8038BB6C, this->marker); }//L8038BF24 if(!this->unk16C_4){ this->unk16C_4 = TRUE; if(this->unk44_31 == 0){ this->unk44_31 = func_8030D90C(); sfxsource_setSfxId(this->unk44_31, SFX_3EC_CCW_DOOR_OPENING); func_8030DD14(this->unk44_31, 2); func_8030DBB4(this->unk44_31, 0.1f); sfxsource_setSampleRate(this->unk44_31, 32000); } if(this->unk100 == NULL){ this->unk100 = func_8032B16C(JIGGY_3E_GV_GRABBA); local->unk0 = this->unk100 != NULL ? this->unk100->unk5C : NULL; } func_80328B8C(this, this->state, 0.01f, 1); this->unk58_0 = FALSE; this->marker->propPtr->unk8_3 = FALSE; }//L8038BFF4 if(subaddie_playerIsWithinSphere(this, 4000) || this->state == 5){ this->unk58_0 = TRUE; this->marker->propPtr->unk8_3 = TRUE; switch(this->state){ case 1: //L8038C064 this->unk58_0 = FALSE; this->marker->propPtr->unk8_3 = FALSE; if(func_8038BB24(this)){ func_80328B8C(this, 2, 0.01f, 1); actor_playAnimationOnce(this); this->unk38_31 = 0; D_80391A80 = this->state; func_802BB3DC(0, 14.0f, 0.92f); __spawnQueue_add_4((GenMethod_4)func_802C4140, 0x11f, reinterpret_cast(s32, this->position_x), reinterpret_cast(s32, this->position_y), reinterpret_cast(s32, this->position_z) ); } break; case 2: //L8038C108 if(actor_animationIsAt(this, 0.69f)){ func_80328B8C(this, 3, 0.01f, 1); actor_loopAnimation(this); D_80391A80 = this->state; if(this->unk100){ this->unk100->collidable = TRUE; } } else{ if(animctrl_getAnimTimer(this->animctrl) < 0.55){ func_8030E2C4(this->unk44_31); if(randf() < 0.6){ func_8038BC7C(this->position, 0xA); } } } break; case 3: //L8038C1CC if(this->unk100 && this->unk100->unk5C != local->unk0){ func_8038BA08(this); } else if(this->unk38_31 >= 0xC){ func_80328B8C(this, 4, 0.01f, 1); actor_playAnimationOnce(this); D_80391A80 = this->state; func_802BB3DC(0, 12.0f, 0.92f); } else if(func_80329530(this, 600)){ if(func_8028ECAC() == BSGROUP_6_TURBO_TALON_TRAINERS){ this->unk38_31++; } else{ this->unk38_31 += 4; } } else{ if(!this->unk138_24){ if(func_80311480(ASSET_A78_TEXT_GRABBA_MEET, 0, NULL, NULL, NULL, NULL)){ this->unk138_24 = TRUE; } } } break; case 4: //L8038C304 if(this->unk100 && this->unk100->unk5C != local->unk0){ func_8038BA08(this); } else if(actor_animationIsAt(this, 0.89f)){ func_80328B8C(this, 1, 0.01f, 1); actor_loopAnimation(this); D_80391A80 = this->state; } else{ if(0.35 < animctrl_getAnimTimer(this->animctrl)){ func_8030E2C4(this->unk44_31); if(randf() < 0.6){ func_8038BC7C(this->position, 5); } } if(actor_animationIsAt(this, 0.4f)){ if(this->unk100){ this->unk100->collidable = FALSE; func_8030E878(SFX_3F5_UNKNOWN, randf2(0.95f, 1.05f), 32000, this->position, 1250.0f, 2500.0f); } if(!this->unk138_23){ if(func_80311480(ASSET_A7A_TEXT_GRABBA_TOO_FAST, 0, NULL, NULL, NULL, NULL)){ this->unk138_23 = TRUE; } } } } break; case 5: //L8038C488 if(this->position_y <= this->unk1C[1] - 330.0f){ marker_despawn(this->marker); func_8038C748(); } else{ func_8030E2C4(this->unk44_31); this->position_y -= 7.0; if(func_8023DB5C() & 1){ sp38[0] = this->position_x; sp38[1] = this->position_y; sp38[2] = this->position_z; sp38[1] = this->unk1C[1]; func_8038BD8C(sp38, 1); } } break; }//L8038C528 if(this->unk100 && this->unk100->unk5C == local->unk0){ Actor *tmp_v0; tmp_v0 = subaddie_getLinkedActor(this); if(this->marker->unk14_21){ func_8034A174(this->marker->unk44, 5, tmp_v0->position); } else{ tmp_v0->position_x = this->position_x; tmp_v0->position_y = this->position_y; tmp_v0->position_z = this->position_z; tmp_v0->position_y -= 200.0f; } } }//L8038C5AC } s32 GV_func_8038C5BC(void){ return D_80391A80; }