#include #include "functions.h" #include "variables.h" extern void func_8028E668(f32[3], f32, f32, f32); extern Actor *func_80328230(enum actor_e id, f32 pos[3], f32 rot[3]); extern NodeProp *cubeList_findNodePropByActorIdAndPosition_s32(enum actor_e, s32[3]); extern f32 func_8038BE20(f32 arg0[3]); typedef struct { ParticleEmitter *unk0; ParticleEmitter *unk4; f32 unk8; f32 unkC; f32 unk10; f32 unk14; u8 unk18; u8 unk19; }ActorLocal_FP_2350; typedef struct { s32 unk0; s32 actor_id; }Struct_FP_2350; Actor *func_80388740(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx); void func_80388D70(ActorMarker *caller, enum asset_e text_id, s32 arg2); void func_80388EE8(ParticleEmitter *pCtrl); void FP_func_80388F4C(Actor *this); void func_803896FC(Actor *this); /* .data */ ActorAnimationInfo D_80391C80[] = { {0x000, 0.0f}, {0x150, 0.6f}, {0x150, 0.6f}, {0x150, 0.6f}, {0x150, 0.6f}, {0x179, 2.3f}, {0x17A, 1.3f}, {0x17B, 2.0f}, {0x150, 1.0f}, {0x1AA, 4.3f}, {0x1AB, 4.3f}, {0x150, 1.0f}, {0x150, 0.6f} }; ActorInfo D_80391CE8 = { MARKER_97_BOGGY_2, ACTOR_C8_BOGGY_2, ASSET_38A_MODEL_BOGGY_1, 0x1, D_80391C80, FP_func_80388F4C, func_803896FC, func_80388740, 0, 0, 1.4f, 0 }; /* .bss */ s32 D_80392F20[3]; /* .code */ Actor *func_80388740(ActorMarker *marker, Gfx **gfx, Mtx **mtx, Vtx **vtx){ Actor *this = marker_getActor(marker); ActorLocal_FP_2350 * local = (ActorLocal_FP_2350 *) &this->local; f32 sp2C[3]; func_8033A45C(1, 1); func_8033A45C(3, 1); this = actor_draw(marker, gfx, mtx, vtx); if(this->volatile_initialized && marker->unk14_21){ if( this->state == 4 || this->state == 5 || this->state == 6 || this->state == 8 ){ if(this->unk4C != 0.0f && (globalTimer_getTime() & 1)){ if(-2.0 < this->roll){ func_8034A174(func_80329934(), 6, sp2C); particleEmitter_setPosition(local->unk0, sp2C); particleEmitter_emitN(local->unk0, 1); } if(this->roll < 2.0){ func_8034A174(func_80329934(), 7, sp2C); particleEmitter_setPosition(local->unk4, sp2C); particleEmitter_emitN(local->unk4, 1); } } }//L803888D4 } return this; } void FP_func_803888E4(Actor *this){ static f32 D_80391D0C[3] = {1842.0f, 658.0f, 5758.0f}; static f32 D_80391D18[3] = {1463.0f, 635.0f, 5193.0f}; subaddie_set_state_with_direction(this, 0xC, 0.0001f, 1); if(!jiggyscore_isSpawned(JIGGY_30_FP_BOGGY_2)){ if(mapSpecificFlags_get(5)){ func_80324DBC(0.1f, 0xc06, 0x2a, D_80391D18, this->marker, func_80388D70, NULL); } else{//L80388964 func_80324DBC(0.1f, 0xc03, 0x2a, D_80391D18, this->marker, func_80388D70, NULL); } } else{//L803889A0 func_8028F490(D_80391D0C); if(mapSpecificFlags_get(6)){ func_80324DBC(0.1f, 0xc29, 0x2a, D_80391D18, this->marker, func_80388D70, NULL); } else{ func_80324DBC(0.1f, 0xc28, 0x2a, D_80391D18, this->marker, func_80388D70, NULL); } }//L80388A30 mapSpecificFlags_set(5, TRUE); func_8038B9C8(); } void func_80388A50(Actor *this){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; subaddie_set_state_with_direction(this, 2, 0.0001f, 1); timed_setStaticCameraToNode(0.0f, 4); local->unk18 = 0; } void func_80388A94(Actor *this){ func_80388A50(this); if(mapSpecificFlags_get(6)){ gcdialog_showText(ASSET_C0A_DIALOG_UNKNOWN, 0xe, this->position, this->marker, func_80388D70, NULL); } else{ gcdialog_showText(ASSET_C09_DIALOG_UNKNOWN, 0xe, this->position, this->marker, func_80388D70, NULL); } } void func_80388B18(Actor *this, u8 arg1){ if(arg1 == TRUE){ if(player_getTransformation() == TRANSFORM_4_WALRUS){ func_80388A50(this); if(mapSpecificFlags_get(5)){ gcdialog_showText(ASSET_C05_DIALOG_UNKNOWN, 0xf, this->position, this->marker, func_80388D70, NULL); } else{ gcdialog_showText(ASSET_C02_DIALOG_UNKNOWN, 0xf, this->position, this->marker, func_80388D70, NULL); } } else{//L80388BB8 if(!volatileFlag_get(VOLATILE_FLAG_B3)){ if(gcdialog_showText(ASSET_C01_DIALOG_UNKNOWN, 0xe, this->position, this->marker, func_80388D70, NULL)){ volatileFlag_set(VOLATILE_FLAG_B3, TRUE); func_80388A50(this); } } } } else{//L80388C08 if(player_getTransformation() == TRANSFORM_4_WALRUS){ if(!volatileFlag_get(VOLATILE_FLAG_B4)){ if(gcdialog_showText(ASSET_C08_DIALOG_UNKNOWN, 0xe, this->position, this->marker, func_80388D70, NULL)){ volatileFlag_set(VOLATILE_FLAG_B4, TRUE); func_80388A50(this); } } } else{ func_80388A94(this); } } } void func_80388C88(Actor *this){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; this->unk10_12 = 0; local->unk18 = 1; } bool FP_func_80388CA0(Actor *this){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; u32 sp20; if(func_8028ECAC() != 0 && func_8028ECAC() != BSGROUP_8_TROT) return FALSE; if( !func_80329530(this, 1100) ){ local->unk18 = TRUE; } sp20 = this->unk10_12; this->unk10_12 = func_80329530(this, 0x1C2); return (sp20 == 0 && this->unk10_12 && local->unk18); } void func_80388D70(ActorMarker *caller, enum asset_e text_id, s32 arg2){ Actor *this = marker_getActor(caller); ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; timed_exitStaticCamera(0.0f); switch(text_id){ case 0xc03: case 0xc06: case 0xc28: case 0xc29://L80388DC4 func_8025A6EC(COMUSIC_3A_FP_BOGGY_RACE, 25000); func_8025A58C(0, 4000); core1_ce60_incOrDecCounter(FALSE); func_802BE720(); local->unk0 = partEmitMgr_newEmitter(16); local->unk4 = partEmitMgr_newEmitter(16); func_80388EE8(local->unk0); func_80388EE8(local->unk4); subaddie_set_state_with_direction(this, 4, 0.0001f, 1); local->unk14 = (local->unk19 == 2) ? 1.0f : 0.0f; this->marker->unk40_23 = TRUE; break; default://L80388E78 switch(arg2){ case 1: FP_func_803888E4(this); mapSpecificFlags_set(6, TRUE); break; case 0: subaddie_set_state_with_direction(this, 1, 0.0001f, 1); break; default: subaddie_set_state_with_direction(this, 1, 0.0001f, 1); break; } break; } } void func_80388EE8(ParticleEmitter *pCtrl){ static s32 D_80391D24[3] = {0xc8, 0xc8, 0xe6}; static ParticleScaleAndLifetimeRanges D_80391D30 = { {0.2f, 0.4f}, {1.2f, 1.6f}, {0.0f, 0.001f}, {0.3f, 0.45f}, 0.0f, 0.01f }; static ParticleSettingsVelocityPosition D_80391D58 = { {{-10.0f, 10.0f, -10.0f}, {10.0f, 240.0f, 10.0f}}, /*position*/ {{0.0f, 0.0f, 0.0f}, {0.0f, 20.0f, 0.0f}} /*velocity*/ }; particleEmitter_setSprite(pCtrl, ASSET_700_SPRITE_DUST); particleEmitter_setRGB(pCtrl, D_80391D24); particleEmitter_setPositionAndVelocityRanges(pCtrl, &D_80391D58); particleEmitter_setScaleAndLifetimeRanges(pCtrl, &D_80391D30); particleEmitter_manualFree(pCtrl); } void FP_func_80388F4C(Actor *this){} void func_80388F54(ActorMarker *marker){ static f32 D_80391D88[3] = { 1592.0f, 673.0f, 5895.0f}; static f32 FP_D_80391D94[3] = {0.0f, 0.0f, 0.0f}; Actor *other = func_80328230(ACTOR_C8_BOGGY_2, D_80391D88, FP_D_80391D94); func_80343DEC(other); } void func_80388F90(Actor *this){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; func_8030DB04(this->unk44_31, 32000, this->position, 1000.0f, 4000.0f); sfxsource_playSfxAtVolume(this->unk44_31, local->unk8); func_8030E2C4(this->unk44_31); } bool func_80388FE8(Actor *this, f32 arg1, f32 arg2){ if(arg2 < 0.0f && 0.0f < arg1){ func_8030E878(SFX_8D_BOGGY_OHWW, randf2(1.04f, 1.12f), 32000, this->position, 600.0f, 1200.0f); return TRUE; } else if( 0.0f < arg2 && arg1 < 0.0f){ func_8030E878(SFX_F9_GRUNTLING_NOISE_1, randf2(1.04f, 1.12f), 32000, this->position, 600.0f, 1200.0f); return TRUE; } return FALSE; } void func_803890DC(Actor *this, u8 arg1){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; f32 yaw_to_target; f32 yaw; f32 f16; f32 prev_roll; f32 dyaw; yaw_to_target = (this->unk1C[0] < 180.0f) ? this->unk1C[0] : this->unk1C[0] - 360.0f; yaw = (this->yaw < 180.0f) ? this->yaw : this->yaw - 360.0f; prev_roll = this->roll; f16 = (arg1 == 2) ? 1100.0f : 780.0f; dyaw = yaw - yaw_to_target; dyaw = (180.0f < dyaw) ? 360.0f - dyaw : (dyaw < -180.0f) ? 360.0f + dyaw : dyaw; this->roll += (2.0*dyaw)*(this->unk4C / f16); this->roll = (26.0f < this->roll) ? 26.0f : (this->roll < -26.0f) ? -26.0f : this->roll; this->roll += (this->roll < 0.0f) ? 1.8 : (0.0f < this->roll) ? -1.8 : 0.0; if(local->unk10 == 0.0){ if(this->state != 9 && this->state != 10 && this->state != 11){ if( (23.0f < this->roll && prev_roll < 23.0f) || (this->roll < -23.0f && -23.0f < prev_roll) ){//L8038933C func_8030E878(SFX_8C_BOGGY_WAHEY, randf2(1.04f, 1.12f), 32000, this->position, 600.0f, 1500.0f); local->unk10 = 1.5f; }//L80389394 } }//L80389398 if(this->roll <= 1.8 && -1.8 <= this->roll){ this->roll = 0.0f; } } void func_803893E4(Actor *this, f32 arg1, u8 arg2){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; f32 sp30; f32 sp2C; f32 sp28; if((u8)arg2 != 2){ sp30 = 575.0f; sp2C = 780.0f; sp28 = 1.7f; } else{ sp30 = 700.0f; sp2C = 1100.0f; sp28 = 2.3f; } func_80343DEC(this); if(this->state == 7){ this->unk4C += ((f32)D_80392F20[1] - this->position_y)*0.02; } else{ this->unk4C += ((f32)D_80392F20[1] - this->position_y)*0.03 + sp28*func_8038BE20(this->position); } if(this->unk4C < sp30){ this->unk4C = sp30; } if(sp2C < this->unk4C){ this->unk4C = sp2C; } if((u8)arg2 == 2 && func_8028ECAC() != 6){ this->unk4C = 1200.0f; } local->unk8 = ((this->unk4C - sp30)/(sp2C - sp30))*(0.6000000000000001) + 0.7; func_803890DC(this, (u8)(arg2)); } void func_803895E0(void){ static s32 D_80391DA0[3] = {0x5F5, 0x292, 0x1539}; static s32 D_80391DAC[3] = {-0x11F8, 0x637, -0x1816}; static Struct_FP_2350 D_80391DB8[7]={ {0x361, 0x35D}, {0x365, 0x35D}, {0x362, 0x360}, {0x366, 0x35D}, {0x37B, 0x35D}, {0x363, 0x35F}, {0x364, 0x35E} }; int i; NodeProp *s0; f32 sp64[3]; Actor *actor; f32 f20; f32 f22; f32 f8; for (i = 0; i< 7; i++){ s0 = (i < 3) ? cubeList_findNodePropByActorIdAndPosition_s32(D_80391DB8[i].unk0, D_80391DA0) : cubeList_findNodePropByActorIdAndPosition_s32(D_80391DB8[i].unk0, D_80391DAC); nodeprop_getPosition(s0, sp64); f20 = (f32)func_80304DA8(s0); f8 = (f32)func_80304DB8(s0); f22 = f8*0.01; actor = actor_spawnWithYaw_f32(D_80391DB8[i].actor_id, sp64, (s32)f20); actor->scale = f22; } } void func_803896FC(Actor *this){ ActorLocal_FP_2350 *local = (ActorLocal_FP_2350 *)&this->local; f32 sp58; f32 sp54; s32 sp3C[6]; sp58 = func_8038BE20(this->position); sp54 = time_getDelta(); controller_copyFaceButtons(0, sp3C); if(!this->volatile_initialized){ this->volatile_initialized = TRUE; this->marker->unk40_23 = FALSE; this->marker->propPtr->unk8_3 = FALSE; this->marker->unk2C_1 = TRUE; this->unk44_31 = func_8030ED2C(SFX_18_BIGBUTT_SLIDE, 2); D_80392F20[0] = this->position_x; D_80392F20[1] = this->position_y; D_80392F20[2] = this->position_z; this->unk1C[0] = this->yaw; local->unk0 = NULL; local->unk4 = NULL; local->unk8 = 0.0f; local->unkC = 0.0f; local->unk10 = 0.0f; local->unk8 = 1.0f; func_8038B9B0(this->marker); this->unk38_31 = 0; func_80388C88(this); __spawnQueue_add_0(func_803895E0); if(jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2)){ local->unk19 = 2; this->unk4C = 900.0f; } else if(jiggyscore_isSpawned(JIGGY_30_FP_BOGGY_2)){ local->unk19 = 1; this->unk38_31 = 2; this->unk4C = 600.0f; subaddie_set_state_with_direction(this, 11, 0.0001f, 1); } else{ local->unk19 = 1; this->unk4C = 600.0f; mapSpecificFlags_set(4, TRUE); } }//L803898CC func_8028E668(this->position, 200.0f, -200.0f, 140.0f); if(!func_8038A1A0(this->marker)){ switch(this->unk38_31){ case 1://L80389920 subaddie_set_state_with_direction(this, 9, 0.0001f, 1); break; case 2://L80389938 subaddie_set_state_with_direction(this, 10, 0.0001f, 1); break; } }//L80389950 if(0.0 unk10 - sp54) local->unk10 =local->unk10 - sp54; else local->unk10 = 0.0f; switch(this->state){ case 1:// L803899B8 if(FP_func_80388CA0(this)){ func_80388B18(this, local->unk19); }//L803899DC else if(!jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2) && func_8028ECAC() == BSGROUP_C_WALRUS_SLED){ FP_func_803888E4(this); } else if( func_80329530(this, 0x1C2) && func_8028ECAC() == 0 && func_8028F20C() && func_8028EFC8() && sp3C[FACE_BUTTON(BUTTON_B)] == 1 && !func_803114B0() ){ if( local->unk19 == 1 && player_getTransformation() != TRANSFORM_4_WALRUS && volatileFlag_get(VOLATILE_FLAG_B3) ){ gcdialog_showText(ASSET_C01_DIALOG_UNKNOWN, 0xf, this->position, this->marker, func_80388D70, NULL); } else if( local->unk19 == 2){ if( player_getTransformation() == TRANSFORM_4_WALRUS && volatileFlag_get(VOLATILE_FLAG_B4) ){ gcdialog_showText(ASSET_C08_DIALOG_UNKNOWN, 0xf, this->position, this->marker, func_80388D70, NULL); } else if( player_getTransformation() != TRANSFORM_4_WALRUS){ func_80388A94(this); } } } break; case 4:// L80389B50 if(0.0 < local->unk14){ local->unk14 -= sp54; } else{ local->unk14 = 0.0f; if( randf() < 0.02 && sp58 < 0.0){ if(randf() < 0.5) subaddie_set_state_with_direction(this, 5, 0.0001f, 1); else subaddie_set_state_with_direction(this, 6, 0.0001f, 1); }//L80389C18 func_803893E4(this, sp58, local->unk19); func_80388F90(this); if(0.0 ==local->unk10 && func_80388FE8(this, sp58,local->unkC)){ local->unk10 = 1.5f; } }//L80389C78 break; case 5:// L80389C80 case 6:// L80389C80 if(actor_animationIsAt(this, 0.9999f) || sp58 >= 0.0){ subaddie_set_state_with_direction(this, 4, 0.0001f, 1); }//L80389CC8 func_803893E4(this, sp58, local->unk19); func_80388F90(this); if(0.0 == local->unk10 && func_80388FE8(this, sp58, local->unkC)){ local->unk10 = 1.5f; } break; case 7:// L80389D34 if(actor_animationIsAt(this, 0.9999f)){ subaddie_set_state_with_direction(this, 4, 0.0001f, 1); }//L80389D60 func_803893E4(this, sp58, local->unk19); func_80388F90(this); break; case 8:// L80389D84 func_80343DEC(this); if(this->unk4C < 740.0f){ this->unk4C += 10.0f; } else if(740.0f < this->unk4C) { this->unk4C -= 10.0f; } func_803890DC(this, local->unk19); func_80388F90(this); if(0.0 == local->unk10 && func_80388FE8(this, sp58, local->unkC)){ local->unk10 = 1.5f; } break; case 9:// L80389E48 func_803893E4(this, sp58, local->unk19); if(this->unk48 < 0.99999999999){ func_80388F90(this); } if(actor_animationIsAt(this, 0.9999f)){ subaddie_set_state_with_direction(this, 11, 0.0001f, 1); } break; case 10:// L80389EB4 func_803893E4(this, sp58, local->unk19); if(this->unk48 < 0.99999999999){ func_80388F90(this); } if(actor_animationIsAt(this, 0.9999f)){ subaddie_set_state_with_direction(this, 11, 0.0001f, 1); } break; case 11:// L80389F20 func_803890DC(this, local->unk19); if(!subaddie_playerIsWithinSphere(this, 2000) && !this->marker->unk14_21 ){ switch(local->unk19){ case 1: //L80389F78 if(this->unk38_31 == 2){ if(jiggyscore_isCollected(JIGGY_30_FP_BOGGY_2)){ __spawnQueue_add_1((GenFunction_1)func_80388F54, reinterpret_cast(s32, this->marker)); func_8038B9BC(); marker_despawn(this->marker); } } else{ func_8038B9BC(); marker_despawn(this->marker); } break; case 2: //L80389FDC if(this->unk38_31 == 2){ if(jiggyscore_isCollected(JIGGY_2C_FP_BOGGY_3)){ func_8038B9BC(); marker_despawn(this->marker); mapSpecificFlags_set(0xC, TRUE); } } else{ func_8038B9BC(); marker_despawn(this->marker); } break; } } break; }//L8038A034 D_80392F20[0] = (s32)this->position[0]; D_80392F20[1] = (s32)this->position[1]; D_80392F20[2] = (s32)this->position[2]; this->unk1C[0] = this->yaw; local->unkC = sp58; } void func_8038A09C(f32 arg0[3]){ arg0[0] = (f32)D_80392F20[0]; arg0[1] = (f32)D_80392F20[1]; arg0[2] = (f32)D_80392F20[2]; } void func_8038A0E4(UNK_TYPE(s32) arg0, ActorMarker *marker){ Actor *actor = marker_getActor(marker); if(actor){ if(actor->state != 7){ subaddie_set_state_with_direction(actor, 7, 0.0001f, 1); } else{ subaddie_set_state_with_direction(actor, 4, 0.0001f, 1); } }; } void func_8038A150(UNK_TYPE(s32) arg0, ActorMarker *marker){ Actor *actor = marker_getActor(marker); if(actor && actor->state != 8){ subaddie_set_state_with_direction(actor, 8, 0.0001f, 1); }; } bool func_8038A1A0(ActorMarker *marker){ Actor *actor = marker_getActor(marker); switch (actor->state){ case 9: case 10: case 11: return TRUE; default: return FALSE; } }