#include #include "functions.h" #include "variables.h" #include "core2/particle.h" extern void viewport_get_position_vec3f(f32 (*)[3]); extern void subaddie_set_state_with_direction(Actor *, s32, f32, s32); extern void func_80386654(f32 arg0, f32 (*arg1)[4], f32 (*arg2)[4]); extern void func_80324CFC(f32, enum comusic_e, s32); extern void func_80387470(Actor *, f32 [3], f32, f32, f32, f32, f32); extern void func_80329904(ActorMarker*, s32, f32*); void func_8038C840(Actor *this); void func_8038D014(Actor *this); /* .data */ ActorAnimationInfo D_80391810[] = { {0, 0.0f}, {0x264, 1000000.0f}, {0x264, 2.26f}, {0x130, 1.75f}, {0x131, 2.13333f}, {0x262, 2.0f} }; ActorInfo D_80391840 = { MARKER_27B_BOSS_JINJO_ORANGE, ACTOR_3A5_BOSS_JINJO_ORANGE, ASSET_3BC_MODEL_JINJO_ORANGE, 0x1, D_80391810, func_8038C840, func_8038D014, actor_draw, 0, 0, 1.0f, 0 }; ActorInfo D_80391864 = { MARKER_27C_BOSS_JINJO_GREEN, ACTOR_3A6_BOSS_JINJO_GREEN, ASSET_3C2_MODEL_JINJO_GREEN, 0x1, D_80391810, func_8038C840, func_8038D014, actor_draw, 0, 0, 1.0f, 0 }; ActorInfo D_80391888 = { MARKER_27D_BOSS_JINJO_PINK, ACTOR_3A7_BOSS_JINJO_PINK, ASSET_3C1_MODEL_JINJO_PINK, 0x1, D_80391810, func_8038C840, func_8038D014, actor_draw, 0, 0, 1.0f, 0 }; ActorInfo D_803918AC = { MARKER_27E_BOSS_JINJO_YELLOW, ACTOR_3A8_BOSS_JINJO_YELLOW, ASSET_3BB_MODEL_JINJO_YELLOW, 0x1, D_80391810, func_8038C840, func_8038D014, actor_draw, 0, 0, 1.0f, 0 }; struct43s D_803918D0 = { { {-420.0f, 410.0f, -420.0f}, {480.0f, 860.0f, 480.0f}}, {{0.0f, -1200.0f, 0.0f}, {0.0f, -1200.0f, 0.0f}}, {{0.0f, -20.0f, 0.0f}, {0.0f, 20.0f, 0.0f}} }; struct42s D_80391918 = { { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}, { {-80.0f, -80.0f, -80.0f}, {80.0f, 80.0f, 80.0f}} }; f32 D_80391948[4] = {1.0f, 1.0f, 1.0f, 1.0f}; f32 D_80391958[4] = {0.33f, 0.33f, 0.33f, 1.0f}; struct31s D_80391968 = { {0.1f, 0.1f}, {10.0f, 10.0f}, {0.0f, 0.01f}, {0.8f, 0.8f}, 0.1f, 0.1f }; /* .code */ void fight_func_8038C2C0(f32 position[3], s32 count, enum asset_e id, f32 arg3){ ParticleEmitter * temp_s0 = partEmitMgr_newEmitter(count); f32 sp24; particleEmitter_setSprite(temp_s0, id); particleEmitter_setStartingFrameRange(temp_s0, 1, 6); particleEmitter_setPosition(temp_s0, position); particleEmitter_setAngularVelocityRange(temp_s0, -300.0f, -300.0f, -300.0f, 300.0f, 300.0f, 300.0f); func_802EFB70(temp_s0, arg3*0.35, arg3*0.65); func_802EFB84(temp_s0, 0.0f, 0.0f); func_802EF9F8(temp_s0, 0.5f); func_802EFA18(temp_s0, 3); particleEmitter_setSpawnIntervalRange(temp_s0, 0.0f, 0.01f); particleEmitter_setParticleLifeTimeRange(temp_s0, 3.0f, 3.3f); particleEmitter_setFade(temp_s0, 0.0f, 0.35f); particleEmitter_setPositionVelocityAndAccelerationRanges(temp_s0, &D_803918D0); particleEmitter_setDrawMode(temp_s0, 4); particleEmitter_emitN(temp_s0, count); } void func_8038C424(f32 position[3], s32 count, enum asset_e id, f32 arg3){ ParticleEmitter * temp_s0 = partEmitMgr_newEmitter(count); f32 sp24; particleEmitter_setSprite(temp_s0, id); particleEmitter_setStartingFrameRange(temp_s0, 0, 9); particleEmitter_setParticleFramerateRange(temp_s0, 12.0f, 12.0f); particleEmitter_setPosition(temp_s0, position); particleEmitter_setPositionAndVelocityRanges(temp_s0, &D_80391918); sp24 = arg3 * 5.0; func_802EFB70(temp_s0, sp24, sp24); func_802EFB84(temp_s0, sp24, sp24); particleEmitter_setSpawnIntervalRange(temp_s0, 0.0f, 0.0f); particleEmitter_setParticleLifeTimeRange(temp_s0, (arg3*0.5), (arg3*0.5)*1.5); particleEmitter_setFade(temp_s0, 0.7f, 0.8f); particleEmitter_setDrawMode(temp_s0, PART_EMIT_NO_DEPTH); particleEmitter_emitN(temp_s0, count); } void fight_func_8038C588(void){ func_80386654(1.0f, &D_80391958, &D_80391948); } void fight_func_8038C5BC(void){ func_80386654(1.0f, &D_80391948, &D_80391958); } void chbossjinjo_spawnParticles(Actor *this, enum asset_e arg1, enum asset_e arg2, f32 arg3){ f32 sp1C[3]; fight_func_8038C0DC(&sp1C); fight_func_8038C2C0(this->position, 0x20, arg1, arg3); func_8038C424(this->position, 4, arg2, arg3); timedFunc_set_0(0.0f, fight_func_8038C588); timedFunc_set_0(0.3f, fight_func_8038C5BC); } void chbossjinjo_spawnAttackParticles(Actor *this){ s32 sparkle_sprite_id; s32 smoke_sprite_id; switch(this->marker->unk14_20){ default: sparkle_sprite_id = ASSET_718_SPRITE_SPARKLE_WHITE_2; smoke_sprite_id = ASSET_6C2_SPRITE_SMOKE_WHITE; break; case MARKER_27B_BOSS_JINJO_ORANGE: sparkle_sprite_id = ASSET_71B_SPRITE_SPARKLE_ORANGE_2; smoke_sprite_id = ASSET_6C5_SPRITE_SMOKE_ORANGE; break; case MARKER_27C_BOSS_JINJO_GREEN: sparkle_sprite_id = ASSET_719_SPRITE_SPARKLE_GREEN_2; smoke_sprite_id = ASSET_6C3_SPRITE_SMOKE_GREEN; break; case MARKER_27D_BOSS_JINJO_PINK: sparkle_sprite_id = ASSET_71A_SPRITE_SPARKLE_PINK_2; smoke_sprite_id = ASSET_6C6_SPRITE_SMOKE_PINK; break; case MARKER_27E_BOSS_JINJO_YELLOW: sparkle_sprite_id = ASSET_717_SPRITE_SPARKLE_YELLOW_2; smoke_sprite_id = ASSET_6C4_SPRITE_SMOKE_YELLOW; break; } chbossjinjo_spawnParticles(this, sparkle_sprite_id, smoke_sprite_id, 1.0f); } void fight_func_8038C6FC(Actor *this, s16 arg1){ f32 temp_f2 = this->yaw; f32 tick = time_getDelta(); temp_f2 -= (tick*arg1)/45.0; if(360.0f <= temp_f2){ temp_f2 -= 360.0f; } else{ if(temp_f2 < 0.0f) temp_f2 += 360.0f; } this->yaw = temp_f2; } void func_8038C79C(Actor *this){ int i; for(i = 0; i < 4; i++){ if(randf() < 0.3){ func_8033E73C(this->marker, i + 5, func_80329904); func_8033E3F0(8, this->marker->unk14_21); } } } void func_8038C840(Actor *this){ f32 sp74 = time_getDelta(); f32 sp68[3]; f32 sp5C[3]; f32 sp50[3]; f32 sp4C; int sp48; s32 sp44; s16 sp42; s16 sp40; if(!this->unk16C_4){ this->unk16C_4 = 1; func_80324CFC(0.0f, SFX_JINJO_STATUE_POWERUP, 32000); func_80324D2C(this->unk60 + 2.26, SFX_JINJO_STATUE_POWERUP); }//L8038C8A4 func_8028E964(sp68); func_80257F18(this->position, sp68, &sp4C); sp40 = (this->yaw * 182.04444); sp42 = sp40 - (s16)(sp4C*182.04444); switch(this->state){ case 1: //8038C92C animctrl_setAnimTimer(this->animctrl, 0.0f); if(this->unk60 < 0.0) subaddie_set_state_with_direction(this, 2, 0.001f, 1); else//L8038C974 this->unk60 -= sp74; break; case 2: // 8038C980 if(actor_animationIsAt(this, 0.44f)) func_8030E878(SFX_105_EYRIE_YAWN, randf2(0.95f, 1.05f), 32000, this->position, 1000.0f, 5000.0f); if(actor_animationIsAt(this, 0.999f)){ subaddie_set_state_with_direction(this, 3, 0.001f, 1); func_8030E878(0x3ee, randf2(0.95f, 1.05f), 32000, this->position, 5000.0f, 12000.0f); } break; case 3: // 8038CA48 case 4: // 8038CA48 sp48 = (this->state == 3); if(!sp48 || 0.1 < animctrl_getAnimTimer(this->animctrl)){//L8038CA7C player_getVelocity(&sp5C); sp5C[0] *= sp74 * 6.0f; sp5C[1] *= sp74 * 6.0f; sp5C[2] *= sp74 * 6.0f; sp5C[0] = sp5C[0] + sp68[0]; sp5C[1] = sp5C[1] + sp68[1]; sp5C[2] = sp5C[2] + sp68[2]; sp5C[0] -= this->position_x; sp5C[1] -= this->position_y; sp5C[2] -= this->position_z; sp5C[0] *= sp74*3.0f; sp5C[1] *= sp74*3.0f; sp5C[2] *= sp74*3.0f; this->position_x = sp5C[0] + this->position_x; this->position_y = sp5C[1] + this->position_y; this->position_z = sp5C[2] + this->position_z; if(sp48 || animctrl_getAnimTimer(this->animctrl) < 0.8) func_8038C79C(this); }//L8038CB9C if(sp48){ if(animctrl_getAnimTimer(this->animctrl) < 0.2){ fight_func_8038C6FC(this, sp42); } if(actor_animationIsAt(this, 0.1f)){ this->unk44_31 = func_8030ED2C(0x18, 3); func_8030E2C4(this->unk44_31); func_8025A6EC(COMUSIC_43_ENTER_LEVEL_GLITTER, 0x7fff); FUNC_8030E8B4(SFX_C7_SHWOOP, 0.8f, 32750, this->position, 300, 2000); }//L8038CC2C if(actor_animationIsAt(this, 0.434f)){ FUNC_8030E8B4(SFX_C7_SHWOOP, 0.9f, 32750, this->position, 300, 2000); }//L8038CC58 if(actor_animationIsAt(this, 0.811f)){ FUNC_8030E8B4(SFX_C7_SHWOOP, 1.0f, 32750, this->position, 300, 2000); } } else{//L8038CC8C if(actor_animationIsAt(this, 0.214f)){ FUNC_8030E8B4(SFX_C7_SHWOOP, 1.1f, 32750, this->position, 300, 2000); }//L8038CCB0 if(actor_animationIsAt(this, 0.55f)){ FUNC_8030E8B4(SFX_53_BANJO_HUIII, 1.5f, 32750, this->position, 300, 2000); }//L8038CCDC if(actor_animationIsAt(this, 0.85f)){ if(func_8030E3FC(this->unk44_31)) func_8030E394(this->unk44_31); func_8030E484(SFX_19_BANJO_LANDING_08); func_8025A7DC(0x43); }//L8038CD20 } if(sp48){ if(actor_animationIsAt(this, 0.96f)){ subaddie_set_state_with_direction(this, 4, 0.0f, -1); actor_playAnimationOnce(this); } } else{//L8038CD68 if(actor_animationIsAt(this, 0.9f)){ animctrl_setSmoothTransition(this->animctrl, FALSE); subaddie_set_state_with_direction(this, 5, 0.001f, 1); FUNC_8030E8B4(SFX_135_CARTOONY_SPRING, 1.0f, 32000, this->position, 10000, 16000); func_80324D54(0.1f, SFX_C1_BUZZBOMB_ATTACK, 0.85f, 32000, this->position, 5000.0f, 12000.0f); func_8034A174(this->marker->unk44, 0x1f, this->position); this->velocity_x = (this->position_x - this->unk1C[0])/ sp74; this->velocity_y = (this->position_y - this->unk1C[1])/ sp74; this->velocity_z = (this->position_z - this->unk1C[2])/ sp74; } else{//L8038CE50 func_8034A174(this->marker->unk44, 0x1f, this->unk1C); } } break; case 5: // 8038CE68 fight_func_8038C0DC(&sp50); sp50[1] += 100.0f; func_80387470(this, sp50, 1200.0f, 3840.0f, 200.0f, 2500.0f, 70.0f); func_8038C79C(this); break; }//L8038CEC8 } void func_8038CED8(f32 arg0[3], enum asset_e model_id, f32 arg2, f32 arg3){ ParticleEmitter *s0 = partEmitMgr_newEmitter(1); f32 sp40[3]; f32 sp34[3]; viewport_get_position_vec3f(&sp40); sp34[0] = sp40[0] - arg0[0]; sp34[1] = sp40[1] - arg0[1]; sp34[2] = sp40[2] - arg0[2]; ml_vec3f_set_length(sp34, 20.0f); particleEmitter_setModel(s0, model_id); particleEmitter_setPosition(s0, arg0); particleEmitter_setParticleVelocityRange(s0, sp34[0], sp34[1], sp34[2], sp34[0], sp34[1], sp34[2]); D_80391968.unk20 = arg3; D_80391968.unk0[0] *= arg2; D_80391968.unk24 = arg3; D_80391968.unk0[1] *= arg2; D_80391968.unk8[0] *= arg2; D_80391968.unk8[1] *= arg2; func_802EFB98(s0, &D_80391968); particleEmitter_setDrawMode(s0, PART_EMIT_NO_DEPTH); func_802EFA78(s0, 1); particleEmitter_emitN(s0, 1); } void func_8038D014(Actor *this){ s32 temp_a1; if(!this->unk16C_4){ this->unk16C_4 = 1; this->marker->propPtr->unk8_3 = 0; actor_collisionOff(this); this->alpha_124_19 = 0x7d; actor_setOpacity(this, this->alpha_124_19); this->scale = (f64)this->scale + this->scale; subaddie_set_state_with_direction(this, 5, 0.001f, 1); func_80343DEC(this); }//L8038D0B8 if(!func_8038C298()){ this->unk58_0 = 0; }else{//L8038D0DC this->unk58_0 = 1; func_80343DEC(this); if(this->state == 5){ if(this->marker->unk14_21) func_8038C79C(this); if(0.98 < this->unk48){ func_8030E6A4(0x3ee, randf2(1.0f, 1.15f), 32000); timed_playSfx(0.1f, 0x416, 0.6f, 32000); marker_despawn(this->marker); switch (this->marker->unk14_20) { case MARKER_27B_BOSS_JINJO_ORANGE: temp_a1 = 0x557; break; case MARKER_27C_BOSS_JINJO_GREEN: temp_a1 = 0x558; break; case MARKER_27D_BOSS_JINJO_PINK: temp_a1 = 0x559; break; case MARKER_27E_BOSS_JINJO_YELLOW: temp_a1 = 0x556; break; default: temp_a1 = 0x556; break; } func_8038CED8(this->position, temp_a1, 1.0f, 0.1f); func_802BB3DC(0, 12.0f, 0.4f); } } }//L8038D200 } void chbossjinjo_attack(ActorMarker *marker){ Actor *actor = marker_getActor(marker); chbossjinjo_spawnAttackParticles(actor); FUNC_8030E8B4(SFX_1B_EXPLOSION_1, 1.0f, 32000, actor->position, 1000, 6500); marker_despawn(actor->marker); } f32 chbossjinjo_8038D268(void){ return 2.26f; }