From fd0dd24cb30961a8f7ee9c672ebdea742b8140d4 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Mon, 19 Sep 2011 16:54:56 -0500 Subject: Mr.Sun, nearly finished! --- kamek_pal.x | 4 +++ src/mrsun.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/kamek_pal.x b/kamek_pal.x index 12d1ea4..3112bb8 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -33,6 +33,10 @@ SECTIONS { + applyRotationX__4mMtxFPs = 0x8016EDF0; + applyRotationZ__4mMtxFPs = 0x8016F030; + applyRotationY__4mMtxFPs = 0x8016EF10; + _savefpr_14 = 0x802DCF98; _savefpr_15 = 0x802DCF9C; _savefpr_16 = 0x802DCFA0; diff --git a/src/mrsun.cpp b/src/mrsun.cpp index a5fa121..a62c723 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -27,6 +27,9 @@ class daMrSun_c : public dEn_c { float swoopB; float swoopC; float swoopSpeed; + float glowPos; + float spinReduce; + float spinStateOn; static daMrSun_c *build(); @@ -166,10 +169,25 @@ void daMrSun_c::updateModelMatrices() { if (hasGlow) { mMtx glowMatrix; + short rotZ; + float scaleX; + + glowPos += 0.01666666666666; + if (glowPos > 1) { glowPos = 0; } + + if (this->spinStateOn = 0) { rotZ = (2000 * sin(glowPos * 3.14)) + 1000; } + else { rotZ = (0xFFFF * sin(glowPos * 3.14)) + 0x7FFF; } + + scaleX = (0.2 * sin(glowPos * 3.14)) + 0.5; + + Vec glowscale = (Vec){scaleX, scaleX, 0.5}; + glowMatrix.translation(pos.x, pos.y, pos.z); + glowMatrix.applyRotationX(&rot.x); + glowMatrix.applyRotationZ(&rotZ); glowModel.setDrawMatrix(glowMatrix); - glowModel.setScale(&scale); + glowModel.setScale(&glowscale); glowModel.calcWorld(false); } } @@ -180,9 +198,9 @@ void daMrSun_c::updateModelMatrices() { void daMrSun_c::beginState_Follow() { OSReport("Mr.Sun is following youuuuu."); this->timer = 0; - this->rot.x = 11000; + this->rot.x = 14000; this->rot.y = 0; -// this->rot.z = 11000; +// this->rot.z = 14000; } void daMrSun_c::executeState_Follow() { @@ -198,13 +216,13 @@ void daMrSun_c::executeState_Follow() { this->speed.x = this->speed.x + speedDelta; if (this->speed.x < 0) { this->speed.x = this->speed.x + (speedDelta / 2); } - if (this->speed.x < 10.0) { this->speed.x = this->speed.x + (speedDelta); } + if (this->speed.x < 50.0) { this->speed.x = this->speed.x + (speedDelta * 2); } } else { this->speed.x = this->speed.x - speedDelta; if (this->speed.x > 0) { this->speed.x = this->speed.x - (speedDelta / 2); } - if (this->speed.x > 10.0) { this->speed.x = this->speed.x + (speedDelta); } + if (this->speed.x < 50.0) { this->speed.x = this->speed.x - (speedDelta * 2); } } HandleXSpeed(this); @@ -236,7 +254,7 @@ void daMrSun_c::beginState_Swoop() { // Not enough space to swoop, spit instead. if (this->swoopTarget.y < (this->pos.y - 50)) { doStateChange(&StateID_Spit); } - if ((this->pos.x - 64) < this->swoopTarget.x < (this->pos.x + 64)) { doStateChange(&StateID_Spit); } + if (((this->pos.x - 96) < this->swoopTarget.x) && (this->swoopTarget.x < (this->pos.x + 96))) { doStateChange(&StateID_Spit); } if (this->settings == 0) { this->swoopTarget.y = this->swoopTarget.y - 16; @@ -323,7 +341,7 @@ void daMrSun_c::beginState_Spit() { OSReport("Goodness Gracious Great Balls of Fire!"); this->timer = 0; - + this->spinStateOn = 1; } void daMrSun_c::executeState_Spit() { @@ -338,14 +356,17 @@ void daMrSun_c::executeState_Spit() { dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = 6.0 * neg; spawner->speed.y = -2.5; + spawner->pos.z = 3350.0; spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = 0.0 * neg; spawner->speed.y = -6.0; + spawner->pos.z = 3350.0; spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = 3.5 * neg; spawner->speed.y = -6.0; + spawner->pos.z = 3350.0; } // It's a sun @@ -353,14 +374,17 @@ void daMrSun_c::executeState_Spit() { dStageActor_c *spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = 6.0 * neg; spawner->speed.y = -2.5; + spawner->pos.z = 3350.0; spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = 0.0 * neg; spawner->speed.y = -6.0; + spawner->pos.z = 3350.0; spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = 3.5 * neg; spawner->speed.y = -6.0; + spawner->pos.z = 3350.0; } // It's a moon } @@ -370,22 +394,34 @@ void daMrSun_c::executeState_Spit() { if (this->timer > 30) { doStateChange(&StateID_Follow); } } -void daMrSun_c::endState_Spit() { OSReport("Armageddon complete."); } +void daMrSun_c::endState_Spit() { + this->spinStateOn = 0; + OSReport("Armageddon complete."); +} // Spin State -void daMrSun_c::beginState_Spin() { OSReport("Hoola hoola hoola hoop."); } +void daMrSun_c::beginState_Spin() { + OSReport("Hoola hoola hoola hoop."); + this->spinReduce = 0; +} void daMrSun_c::executeState_Spin() { this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); if (this->direction == 0) { this->speed.x = this->speed.x + 0.2; + + if (this->speed.x < 0) { this->speed.x = this->speed.x + (0.2 / 2); } + if (this->speed.x < 80.0) { this->speed.x = this->speed.x + (0.2 * 2); } } else { this->speed.x = this->speed.x - 0.2; + + if (this->speed.x > 0) { this->speed.x = this->speed.x - (0.2 / 2); } + if (this->speed.x > 80.0) { this->speed.x = this->speed.x - (0.2 * 2); } } HandleXSpeed(this); @@ -397,9 +433,17 @@ void daMrSun_c::executeState_Spin() { if (this->timer < 60) { rotBonus = this->timer; } else { rotBonus = 120 - this->timer; } -// this->rot.x = this->rot.x + (50 * rotBonus); + this->rot.z = this->rot.z + (50 * rotBonus); this->rot.y = this->rot.y + (50 * rotBonus); + if ((this->spinReduce = 0) && (this->timer < 100)) { + this->spinReduce = this->rot.z / 20; } + + if (this->timer < 100) { + this->rot.z = this->rot.z - this->spinReduce; + this->rot.y = this->rot.y - this->spinReduce; } + + int randomBall; randomBall = GenerateRandomNumber(6); if (randomBall == 1) { @@ -439,27 +483,26 @@ void daMrSun_c::executeState_Spin() { dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = xlaunch; spawner->speed.y = ylaunch; + spawner->pos.z = 3350.0; } // It's a sun else { dStageActor_c *spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = xlaunch; spawner->speed.y = ylaunch; + spawner->pos.z = 3350.0; } // It's a moon } - if (this->timer > 120) { -// this->rot.x = this->rot.x / 2; -// this->rot.y = this->rot.y / 2; - this->doStateChange(&StateID_Follow); } + if (this->timer > 120) { this->doStateChange(&StateID_Follow); } } void daMrSun_c::endState_Spin() { OSReport("K, I is dizzy now."); - this->rot.x = 11000; + this->rot.x = 14000; this->rot.y = 0; -// this->rot.z = 11000; + this->rot.z = 0; this->speed.x = 0; } @@ -474,9 +517,6 @@ void daMrSun_c::beginState_Wait() { this->timer = 0; this->speed.x = 0.0; - this->rot.x = 11000; - this->rot.y = 0; -// this->rot.z = 11000; dStageActor_c *Player = GetSpecificPlayerActor(0); if (Player == 0) { Player = GetSpecificPlayerActor(1); } @@ -513,9 +553,6 @@ void daMrSun_c::executeState_Wait() { void daMrSun_c::endState_Wait() { OSReport("Mr.Sun Cometh!"); this->timer = 0; - this->rot.x = 11000; - this->rot.y = 0; -// this->rot.z = 11000; } -- cgit v1.2.3