#include #include "functions.h" #include "variables.h" extern void player_setYPosition(f32); extern void yaw_applyIdeal(void); extern void func_802978DC(int); extern f32 func_80257A44(f32, f32); extern f32 cosf(f32); extern f32 func_802588B0(f32, f32); extern f32 func_80257AD4(f32, f32); /* .bss */ struct { ParticleEmitter *unk0; ParticleEmitter *unk4; f32 unk8; f32 unkC; f32 unk10; f32 unk14; f32 unk18; u8 unk1C; u8 pad1D[0x3]; f32 unk20; f32 unk24; f32 unk28; f32 unk2C; u8 unk30; u8 unk31; //enum bs_e u8 unk32; } D_8037D470; /* .code */ void func_802AF7A0(ParticleEmitter *arg0, enum asset_e arg1){ func_802F0D54(arg0); particleEmitter_setSprite(arg0, arg1); particleEmitter_setParticleAccelerationRange(arg0, 0.0f, -50.0f, 0.0f, 0.0f, -50.0f, 0.0f); func_802EFA5C(arg0, 0.4f, 0.8f); func_802EFB84(arg0, 0.03f, 0.03f); func_802EFE24(arg0, 0.0f, 0.0f, 300.0f, 0.0f, 0.0f, 300.0f); func_802EFEC0(arg0, 0.65f, 0.65f); func_802EFF50(arg0, 1.0f); } void func_802AF88C(Actor * arg0, f32 arg1, f32 arg2){ particleEmitter_setParticleVelocityRange(arg0, arg1*30.0f, 10.0f, arg2*30.0f, arg1*30.0f, 10.0f, arg2*30.0f); func_802EFB70(arg0, D_8037D470.unk14, D_8037D470.unk14); } void func_802AF900(void){ f32 sp4C; f32 sp48; f32 sp44; f32 sp40; f32 sp3C; f32 sp30[3]; player_getPosition(&sp30); sp3C = D_8037D470.unk8; sp48 = func_80257A44(sp3C, 0.38f); sp4C = sp48 * 6.283185308; sp40 = sinf(sp4C); sp44 = cosf(sp4C); sp30[0] += sp40 * D_8037D470.unk18; sp30[1] += func_80257C48(func_80257A44(sp3C, 1.14f), 0.0f, 130.0f); sp30[2] += sp44 * D_8037D470.unk18; func_802AF88C(D_8037D470.unk4, sp40, sp44); particleEmitter_setPosition(D_8037D470.unk4, &sp30); particleEmitter_emitN(D_8037D470.unk4, 1); player_getPosition(&sp30); sp4C = (1.0 - func_802588B0(sp48 + 0.5, 1.0f))* 6.283185308; sp30[0] -= sinf(sp4C) * D_8037D470.unk18; sp30[1] += func_80257C48(func_80257A44(sp3C, 1.14f), 130.0f, 0.0f); sp30[2] -= cosf(sp4C) * D_8037D470.unk18; func_802AF88C(D_8037D470.unk0, sp40, sp44); particleEmitter_setPosition(D_8037D470.unk0, &sp30); particleEmitter_emitN(D_8037D470.unk0, 1); } void func_802AFADC(void){ func_802F0C78(D_8037D470.unk4); func_802F0C78(D_8037D470.unk0); } void func_802AFB0C(void){ D_8037D470.unk0 = partEmitList_pushNew(0x32); func_802AF7A0(D_8037D470.unk0, ASSET_476_SPRITE_BLUE_GLOW); //blue glow D_8037D470.unk4 = partEmitList_pushNew(0x32); func_802AF7A0(D_8037D470.unk4, ASSET_477_SPRITE_YELLOW_GLOW); //orange glow D_8037D470.unkC = 1.0f; D_8037D470.unk10 = 0.0f; D_8037D470.unk8 = 0.0f; D_8037D470.unk18 = 55.0f; D_8037D470.unk14 = 0.35f; D_8037D470.unk1C = 0; } void func_802AFB94(f32 arg0){ D_8037D470.unkC = arg0; } void func_802AFBA0(f32 arg0){ D_8037D470.unk18 = arg0; } void func_802AFBAC(f32 arg0){ D_8037D470.unk14 = arg0; } void func_802AFBB8(f32 (* arg0)[3]){ static struct41s D_80364BB0 = { {{-150.0f, 10.0f, -150.0f}, { 150.0f, 50.0f, 150.0f}}, {{ 0.0f, -50.0f, 0.0f}, { 0.0f, -50.0f, 0.0f}} }; static struct41s D_80364BE0 = { {{-300.0f, 150.0f, -300.0f}, { 300.0f, 200.0f, 300.0f}}, {{ 0.0f, -150.0f, 0.0f}, { 0.0f, -150.0f, 0.0f}} }; static struct41s D_80364C10 = { {{-100.0f, 10.0f, -100.0f}, { 100.0f, 15.0f, 100.0f}}, {{ 0.0f, -700.0f, 0.0f}, { 0.0f, -700.0f, 0.0f}} }; static struct41s D_80364C40 = { {{ -50.0f, 60.0f, -50.0f}, { 50.0f, 150.0f, 50.0f}}, {{ 0.0f, -50.0f, 0.0f}, { 0.0f, -50.0f, 0.0f}} }; static struct41s D_80364C70 = { {{-400.0f, 150.0f, -400.0f}, { 400.0f, 200.0f, 400.0f}}, {{ 0.0f, -200.0f, 0.0f}, { 0.0f, -200.0f, 0.0f}} }; static struct41s D_80364CA0 = { {{-200.0f, 10.0f, -200.0f}, { 200.0f, 20.0f, 200.0f}}, {{ 0.0f, -850.0f, 0.0f}, { 0.0f, -850.0f, 0.0f}} }; ParticleEmitter* s0 = partEmitList_pushNew(1); particleEmitter_setSprite(s0, ASSET_6C4_SPRITE_SMOKE_YELLOW); //yellow blast func_802EFA5C(s0, 0.7f, 0.8f); particleEmitter_setParticleFramerateRange(s0, 12.0f, 12.0f); particleEmitter_setPosition(s0, arg0); func_802EFB70(s0, 3.2f, 3.2f); func_802EFB84(s0, 3.2f, 3.2f); func_802EFEC0(s0, 0.8f, 0.8f); particleEmitter_emitN(s0, 1); s0 = partEmitList_pushNew(1); particleEmitter_setSprite(s0, ASSET_6C2_SPRITE_SMOKE_WHITE); //smoke func_802EFA5C(s0, 0.1f, 0.8f); particleEmitter_setParticleFramerateRange(s0, 15.0f, 15.0f); particleEmitter_setPosition(s0, arg0); func_802EFB70(s0, 3.0f, 3.0f); func_802EFB84(s0, 3.0f, 3.0f); func_802EFEC0(s0, 0.65f, 0.65f); particleEmitter_emitN(s0, 1); s0 = partEmitList_pushNew(0x11); particleEmitter_setSprite(s0, ASSET_713_SPRITE_SPARKLE_YELLOW); //sparkle particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364BB0); func_802EFA5C(s0, 0.0f, 0.6f); func_802EFB70(s0, 0.28f, 0.32f); func_802EFB84(s0, 0.03f, 0.03f); func_802EFE24(s0, 0.0f, 0.0f, 300.0f, 0.0f, 0.0f, 300.0f); func_802EFEC0(s0, 2.0f, 2.0f); func_802EFF50(s0, 1.0f); particleEmitter_setPosition(s0, arg0); particleEmitter_emitN(s0, 8); particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364BE0); particleEmitter_emitN(s0, 5); particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364C10); func_802EF9F8(s0, 0.4f); func_802EFA18(s0, 3); particleEmitter_emitN(s0, 4); s0 = partEmitList_pushNew(0x11); particleEmitter_setSprite(s0, ASSET_716_SPRITE_SPARKLE_WHITE); //sparkle particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364C40); func_802EFA5C(s0, 0.0f, 0.6f); func_802EFB70(s0, 0.28f, 0.32f); func_802EFB84(s0, 0.03f, 0.03f); func_802EFE24(s0, 0.0f, 0.0f, 300.0f, 0.0f, 0.0f, 300.0f); func_802EFEC0(s0, 2.0f, 2.0f); func_802EFF50(s0, 1.0f); particleEmitter_setPosition(s0, arg0); particleEmitter_emitN(s0, 8); particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364C70); particleEmitter_emitN(s0, 5); particleEmitter_setVelocityAndAccelerationRanges(s0, &D_80364CA0); func_802EF9F8(s0, 0.4f); func_802EFA18(s0, 3); particleEmitter_emitN(s0, 4); } void func_802AFFAC(void){ D_8037D470.unk10 -= time_getDelta(); while(D_8037D470.unk10 < 0.0f){ func_802AF900(); D_8037D470.unk8 += 0.017 * D_8037D470.unkC; D_8037D470.unk10 += 0.017; } } void func_802B0060(UNK_TYPE(s32) arg0, UNK_TYPE(s32) arg1){ f32 sp4C[3]; int i; for(i = 0; i < 3; i++){ sp4C[i] = func_80257AD4(D_8037D470.unk20 + ((f32)i/3.0)*0.5, 0.5f)*(D_8037D470.unk24*D_8037D470.unk28) + D_8037D470.unk24; } func_8033A928(arg0, 3, sp4C); } void func_802B014C(void){ func_80289EBC(NULL); } void func_802B016C(void){ D_8037D470.unk20 = 0.0f; D_8037D470.unk28 = 0.0f; D_8037D470.unk24 = 1.0f; func_80289EBC(func_802B0060); } void func_802B01B0(f32 arg0){ D_8037D470.unk28 = arg0; } void func_802B01BC(f32 arg0){ D_8037D470.unk24 = arg0; } void func_802B01C8(void){ D_8037D470.unk20 += time_getDelta(); } static void __bsdronexform_setState(int arg0){ enum asset_e sp34; f32 sp30; f32 sp24[3]; D_8037D470.unk32 = arg0; switch(arg0){ case 1:// 802B0230 D_8037D470.unk1C = 1; D_8037D470.unk2C = player_getYPosition(); func_802AFB94(0.28f); func_802AFBA0(180.0f); func_802AFBAC(0.04f); func_802B01B0(0.05f); func_802978DC(7); func_8029E3C0(0, 2.8f); FUNC_8030E624(SFX_17E_MUMBO_TRANSFORMATION_01, 1.0f, 15000); break; case 2:// 802B02A8 func_8029E3C0(0, 0.5f); func_802978DC(0xb); break; case 3:// 802B02C4 func_8029E3C0(0, 0.05f); break; case 4:// 802B02DC func_8029E3C0(0, 0.8f); break; case 5:// 802B02F4 _player_getPosition(&sp24); sp24[1] += 30.0f; func_8024E3A8(&sp24, 80.0f); func_802AFBB8(&sp24); func_8029E3C0(0, 0.1f); break; case 6: // 802B033C func_802BB3DC(2, 80.0f, 0.85f); func_8030E6D4(SFX_147_GRUNTY_SPELL_ATTACK_2); if(D_8037D470.unk30 == 7 || D_8037D470.unk31 == 7){ yaw_setIdeal(yaw_get() + 180.0f); yaw_applyIdeal(); } func_8029A95C(func_80294A4C()); //set player transformation func_80291D04(); //update player model func_8029BD44(&sp34, &sp30); func_8028A010(sp34, sp30); func_8029E3C0(0, 0.1f); break; case 7: // 802B03E4 func_8029E3C0(0, 0.8f); break; case 8: // 802B03FC if(D_8037D470.unk30 == 1 && D_8037D470.unk31 == 1){ func_8025A6EC(COMUSIC_3C_MINIGAME_LOSS, 28000); } func_8029E3C0(0, 1.0f); break; case 9:// 802B0438 D_8037D470.unk1C = 0; func_8029E3C0(0, 0.7f); func_802978DC(7); break; } } void bsdronexform_init(void){ f32 sp1C; enum asset_e sp18; func_8029BCAC(&sp18, &sp1C); func_8028A010(sp18, sp1C); func_8029C7F4(1,1,3,7); func_80297A0C(0); func_80297930(0); pitch_setIdeal(0.0f); roll_setIdeal(0.0f); func_80294378(6); func_802AFB0C(); func_802B016C(); D_8037D470.unk31 = _player_getTransformation(); D_8037D470.unk30 = func_80294A4C(); miscflag_set(MISC_FLAG_1B_TRANSFORMING); D_8037D470.unk32 = 0; __bsdronexform_setState(1); } f32 func_802B051C(s32 arg0, f32 arg1, f32 arg2, f32 arg3){ return ml_map_f(func_8029E270(arg0), arg1, 0.0f, arg2, arg3); } void bsdronexform_update(void){ int sp24; if(D_8037D470.unk1C) func_802AFFAC(); func_802B01C8(); switch(D_8037D470.unk32){ case 1: sp24 = func_8029E1A8(0); player_setYPosition(func_802B051C(0, 2.8f, 0.0f, 90.0f) + D_8037D470.unk2C); func_802AFB94(func_802B051C(0, 2.8f, 0.28f, 1.0f)); func_802AFBA0(func_802B051C(0, 2.8f, 180.0f, 55.0f)); func_802AFBAC(func_802B051C(0, 2.8f, 0.04f, 0.35f)); func_802B01BC(func_802B051C(0, 2.8f, 1.0f, 0.8f)); func_802B01B0(func_802B051C(0, 2.8f, 0.05f, 0.4f)); func_8031B990( (s32)func_802B051C(0, 2.8f, 255.0f, 200.0f), (s32)func_802B051C(0, 2.8f, 255.0f, 80.0f), (s32)func_802B051C(0, 2.8f, 255.0f, 80.0f) ); if(sp24) __bsdronexform_setState(2); break; case 2: sp24 = func_8029E1A8(0); func_802B01B0(func_802B051C(0, 0.5f, 0.4f, 0.6f)); if(sp24) __bsdronexform_setState(3); break; case 3: sp24 = func_8029E1A8(0); func_802B01BC(func_802B051C(0, 0.05f, 0.8f, 1.2f)); if(sp24) __bsdronexform_setState(4); break; case 4: sp24 = func_8029E1A8(0); func_802B01BC(func_802B051C(0, 0.8f, 1.2f, 0.09f)); if(sp24) __bsdronexform_setState(5); break; case 5: sp24 = func_8029E1A8(0); if(sp24) __bsdronexform_setState(6); break; case 6: sp24 = func_8029E1A8(0); if(sp24) __bsdronexform_setState(7); break; case 7: sp24 = func_8029E1A8(0); func_802B01BC(func_802B051C(0, 0.8f, 0.09f, 1.0f)); if(sp24) __bsdronexform_setState(8); break; case 8: func_802AFBAC(func_802B051C(0, 1.0f, 0.35f, 0.03f)); func_802B01B0(func_802B051C(0, 1.0f, 0.6f, 0.05f)); func_8031B990( (s32)func_802B051C(0, 1.0f, 200.0f, 255.0f), (s32)func_802B051C(0, 1.0f, 80.0f, 255.0f), (s32)func_802B051C(0, 1.0f, 80.0f, 255.0f) ); if(func_8029E1A8(0)){ if(player_getTransformation() == TRANSFORM_7_WISHWASHY){ bs_setState(0x33); }else{ __bsdronexform_setState(9); } } break; case 9: sp24 = func_8029E1A8(0); player_setYPosition(func_802B051C(0, 0.7f, 90.0f, 0.0f) + D_8037D470.unk2C); if(sp24) bs_setState(bs_getIdleState()); break; // 802B08AC 8 // 802B09A4 9 } } void bsdronexform_end(void){ func_80294378(1); func_8031B990(0xff,0xff,0xff); func_802AFADC(); func_802B014C(); func_80298A64(); miscflag_clear(MISC_FLAG_1B_TRANSFORMING); } void bsdronexform_interrupt(void){};