diff options
Diffstat (limited to 'src/boss.cpp')
-rw-r--r-- | src/boss.cpp | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/src/boss.cpp b/src/boss.cpp new file mode 100644 index 0000000..e90dd2c --- /dev/null +++ b/src/boss.cpp @@ -0,0 +1,140 @@ +#include "boss.h" + + + +void DamagePlayer(dEn_c *actor, ActivePhysics *apThis, ActivePhysics *apOther) { + actor->dEn_c::playerCollision(apThis, apOther); + actor->_vf220(apOther->owner); + + // fix multiple player collisions via megazig + actor->isDead = 0; + actor->flags_4FC |= (1<<(31-7)); + if(apOther->owner->which_player < 4) { + actor->counter_504[apOther->owner->which_player] = 0; + } +} + + +void SetupKameck(daBoss *actor, daKameckDemo *Kameck) { + // Stop the BGM Music + StopBGMMusic(); + + // Set the necessary Flags and make Mario enter Demo Mode + dStage32C_c::instance->freezeMarioBossFlag = 1; + WLClass::instance->_4 = 4; + WLClass::instance->_8 = 0; + + MakeMarioEnterDemoMode(); + + // Make sure to use the correct position + Vec pos = (Vec){actor->pos.x - 124.0, actor->pos.y + 104.0, 3564.0}; + S16Vec rot = (S16Vec){0, 0, 0}; + + // Create And use Kameck + Kameck = (daKameckDemo*)actor->createChild(KAMECK_FOR_CASTLE_DEMO, (dStageActor_c*)actor, 0, &pos, &rot, 0); + Kameck->doStateChange(&daKameckDemo::StateID_DemoWait); +} + + +void CleanupKameck(daBoss *actor, daKameckDemo *Kameck) { + // Clean up the flags and Kameck + dStage32C_c::instance->freezeMarioBossFlag = 0; + WLClass::instance->_8 = 1; + + MakeMarioExitDemoMode(); + StartBGMMusic(); + + Kameck->Delete(1); +} + + +bool GrowBoss(daBoss *actor, daKameckDemo *Kameck, float initialScale, float endScale, float yPosModifier, int timer) { + if (timer == 130) { Kameck->doStateChange(&daKameckDemo::StateID_DemoSt); } + if (timer == 400) { Kameck->doStateChange(&daKameckDemo::StateID_DemoSt2); } + + float scaleSpeed, yPosScaling; + + if (timer == 150) { PlaySound(actor, SE_BOSS_IGGY_WANWAN_TO_L); } + + if ((timer > 150) && (timer < 230)) { + scaleSpeed = (endScale -initialScale) / 80.0; + + float modifier; + + modifier = initialScale + ((timer - 150) * scaleSpeed); + + actor->scale = (Vec){modifier, modifier, modifier}; + actor->pos.y = actor->pos.y + (yPosModifier/80.0); + } + + if (timer == 360) { + Vec tempPos = (Vec){actor->pos.x - 40.0, actor->pos.y + 120.0, 3564.0}; + SpawnEffect("Wm_ob_greencoinkira", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_mr_yoshiicehit_a", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_mr_yoshiicehit_b", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_ob_redringget", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_ob_keyget01", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_ob_greencoinkira_a", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + SpawnEffect("Wm_ob_keyget01_c", 0, &tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + } + + if (timer > 420) { return true; } + return false; +} + + +void OutroSetup(daBoss *actor) { + actor->removeMyActivePhysics(); + + StopBGMMusic(); + + WLClass::instance->_4 = 5; + WLClass::instance->_8 = 0; + dStage32C_c::instance->freezeMarioBossFlag = 1; +} + + +bool ShrinkBoss(daBoss *actor, Vec *pos, float scale, int timer) { + PlaySound(actor, SE_BOSS_CMN_DAMAGE_LAST); + + // Adjust actor to equal the scale of your boss / 80. + actor->scale.x -= scale / 80.0; + actor->scale.y -= scale / 80.0; + actor->scale.z -= scale / 80.0; + + actor->pos.y += 2.0; + + + if (actor->timer == 30) { + SpawnEffect("Wm_ob_starcoinget_gl", 0, pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}); + SpawnEffect("Wm_mr_vshipattack_hosi", 0, pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}); + SpawnEffect("Wm_ob_keyget01_b", 0, pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}); + actor->timer = 0; + } + + if (actor->scale.x < 0) { return true; } + return false; +} + + +void BossExplode(daBoss *actor, Vec *pos) { + actor->scale.x = 0.0; + actor->scale.y = 0.0; + actor->scale.z = 0.0; + + SpawnEffect("Wm_ob_keyget02", 0, pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}); + actor->dying = 1; + actor->timer = 0; + + PlaySound(actor, STRM_BGM_SHIRO_BOSS_CLEAR); + MakeMarioEnterDemoMode(); +} + + +void PlayerVictoryCries(daBoss *actor) { + UpdateGameMgr(); + if (GetSpecificPlayerActor(0) != 0) { PlaySound(actor, SE_VOC_MA_CLEAR_BOSS); } + if (GetSpecificPlayerActor(1) != 0) { PlaySound(actor, SE_VOC_LU_CLEAR_BOSS); } + if (GetSpecificPlayerActor(2) != 0) { PlaySound(actor, SE_VOC_KO_CLEAR_BOSS); } + if (GetSpecificPlayerActor(3) != 0) { PlaySound(actor, SE_VOC_KO2_CLEAR_BOSS); } +}
\ No newline at end of file |