summaryrefslogtreecommitdiff
path: root/src/boss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boss.cpp')
-rw-r--r--src/boss.cpp140
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