From 7f58ea5312aa2be7fe392347fd02246cdc67f9c4 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Mon, 19 Sep 2011 06:14:47 -0500 Subject: MrSun behavioually finished. Needs collision work, a little model work. --- src/mrsun.cpp | 196 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 66 deletions(-) (limited to 'src') diff --git a/src/mrsun.cpp b/src/mrsun.cpp index 0b2c798..5c20169 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -17,10 +17,14 @@ class daMrSun_c : public dEn_c { float yThreshold; float yAccel; Vec swoopTarget; - float slope; u32 timer; float xSpiralOffset; float ySpiralOffset; + float swoopA; + float swoopB; + float swoopC; + float swoopSpeed; + static daMrSun_c *build(); @@ -65,11 +69,20 @@ int daMrSun_c::onCreate() { OSReport("Creating the Mr.Sun Model"); allocator.link(-1, GameHeaps[0], 0, 0x20); - nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/sun.brres")); - model.setup(rf.GetResMdl("Sun"), &allocator, 0x224, 1, 0); -// SetupTextures_Enemy(&model, 0); - SetupTextures_Map(&model, 0); - + if (this->settings == 0) { // It's a sun + nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/sun.brres")); + model.setup(rf.GetResMdl("Sun"), &allocator, 0x224, 1, 0); + // SetupTextures_Enemy(&model, 0); + SetupTextures_Map(&model, 0); + } + + else { // It's a moon + nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/bilikyu.brres")); + model.setup(rf.GetResMdl("bilikyu"), &allocator, 0x224, 1, 0); + // SetupTextures_Enemy(&model, 0); + SetupTextures_Map(&model, 0); + } + allocator.unlink(); OSReport("Setting Mr.Sun's Size to 4.0"); @@ -156,11 +169,19 @@ void daMrSun_c::executeState_Follow() { this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + float speedDelta; + if (this->settings == 0) { speedDelta = 0.1; } // It's a sun + else { speedDelta = 0.15; } // It's a moon + if (this->direction == 0) { - this->speed.x = this->speed.x + 0.1; + this->speed.x = this->speed.x + speedDelta; + + if (this->speed.x < 0) { this->speed.x = this->speed.x + (speedDelta / 2); } } else { - this->speed.x = this->speed.x - 0.1; + this->speed.x = this->speed.x - speedDelta; + + if (this->speed.x > 0) { this->speed.x = this->speed.x - (speedDelta / 2); } } HandleXSpeed(this); @@ -190,49 +211,51 @@ void daMrSun_c::endState_Follow() { void daMrSun_c::beginState_Swoop() { OSReport("Swooping down from above, Mr.Sun falls down."); - dStageActor_c *Player = GetSpecificPlayerActor(0); - if (Player == 0) { Player = GetSpecificPlayerActor(1); } - if (Player == 0) { Player = GetSpecificPlayerActor(2); } - if (Player == 0) { Player = GetSpecificPlayerActor(3); } - if (Player == 0) { doStateChange(&StateID_Follow); } + // 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->settings == 0) { + this->swoopTarget.y = this->swoopTarget.y - 16; + } // It's a sun - this->swoopTarget = Player->pos; - this->swoopTarget.y = this->swoopTarget.y - 24; + else { + this->swoopTarget.y = this->swoopTarget.y - 4; + } // It's a moon + + + float x1, x2, x3, y1, y2, y3; + + x1 = this->pos.x - this->swoopTarget.x; + x2 = 0; + x3 = -x1; + + y1 = this->pos.y - this->swoopTarget.y; + y2 = 0; + y3 = y1; + + float denominator = (x1 - x2) * (x1 - x3) * (x2 - x3); + this->swoopA = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / denominator; + this->swoopB = (x3*x3 * (y1 - y2) + x2*x2 * (y3 - y1) + x1*x1 * (y2 - y3)) / denominator; + this->swoopC = (x2 * x3 * (x2 - x3) * y1 + x3 * x1 * (x3 - x1) * y2 + x1 * x2 * (x1 - x2) * y3) / denominator; - float relativeSunX = this->swoopTarget.x - this->pos.x; - float relativeSunY = this->swoopTarget.y - this->pos.y; + this->swoopSpeed = x3 * 2 / 75; - this->slope = relativeSunY / relativeSunX; } void daMrSun_c::executeState_Swoop() { - - if (this->slope < 0.0) { - this->speed.x = this->speed.x + 0.3; - this->speed.y = this->speed.y - (0.2 * -slope); - } - else if (this->slope > 0.0) { - this->speed.x = this->speed.x - 0.3; - this->speed.y = this->speed.y - (0.2 * slope); - } + // Everything is calculated up top, just need to modify it. - float yDiff; + this->pos.x = this->pos.x + this->swoopSpeed; - if (this->pos.y < this->swoopTarget.y) { - this->speed.x = this->speed.x * 0.2; - this->speed.y = this->speed.y * 0.2; - } - - HandleXSpeed(this); - HandleYSpeed(this); - UpdateObjectPosBasedOnSpeedValues_real(this); + this->pos.y = ( this->swoopA*(this->pos.x - this->swoopTarget.x)*(this->pos.x - this->swoopTarget.x) + this->swoopB*(this->pos.x - this->swoopTarget.x) + this->swoopC ) + this->swoopTarget.y; + + if (this->pos.y > this->Baseline) { doStateChange(&StateID_Follow); } - if (this->pos.y < this->swoopTarget.y) { - if (this->speed.y < 0.1) { doStateChange(&StateID_Follow); } } - } void daMrSun_c::endState_Swoop() { OSReport("Returning to the sky, Mr.Sun flies into the sunset."); + this->speed.y = 0; } @@ -249,14 +272,16 @@ void daMrSun_c::beginState_Spiral() { void daMrSun_c::executeState_Spiral() { float Loops; - float Period; float Magnitude; + float Period; Loops = 6.0; - // Use a period of 0.1 for the moon - Period = 0.075; Magnitude = 11.0; + // Use a period of 0.1 for the moon + if (this->settings == 0) { Period = 0.075; } // It's a sun + else { Period = 0.1; } // It's a moon + this->pos.x = this->xSpiralOffset + Magnitude*((this->SpiralLoop * cos(this->SpiralLoop))); this->pos.y = this->ySpiralOffset + Magnitude*((this->SpiralLoop * sin(this->SpiralLoop))); @@ -285,17 +310,36 @@ void daMrSun_c::executeState_Spit() { float neg = -1.0; if (this->direction == 0) { neg = 1.0; } - dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); - spawner->speed.x = 6.0 * neg; - spawner->speed.y = -2.5; + + if (this->settings == 0) { + dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); + spawner->speed.x = 6.0 * neg; + spawner->speed.y = -2.5; + + spawner = CreateActor(106, 0, this->pos, 0, 0); + spawner->speed.x = 0.0 * neg; + spawner->speed.y = -6.0; - spawner = CreateActor(106, 0, this->pos, 0, 0); - spawner->speed.x = 0.0 * neg; - spawner->speed.y = -6.0; - - spawner = CreateActor(106, 0, this->pos, 0, 0); - spawner->speed.x = 3.5 * neg; - spawner->speed.y = -6.0; + spawner = CreateActor(106, 0, this->pos, 0, 0); + spawner->speed.x = 3.5 * neg; + spawner->speed.y = -6.0; + } // It's a sun + + + else { + dStageActor_c *spawner = CreateActor(118, 0, this->pos, 0, 0); + spawner->speed.x = 6.0 * neg; + spawner->speed.y = -2.5; + + spawner = CreateActor(118, 0, this->pos, 0, 0); + spawner->speed.x = 0.0 * neg; + spawner->speed.y = -6.0; + + spawner = CreateActor(118, 0, this->pos, 0, 0); + spawner->speed.x = 3.5 * neg; + spawner->speed.y = -6.0; + } // It's a moon + } this->timer = this->timer + 1; @@ -330,8 +374,8 @@ 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.y = this->rot.y + (50 * rotBonus); +// this->rot.x = this->rot.x + (50 * rotBonus); + this->rot.z = this->rot.z + (50 * rotBonus); int randomBall; randomBall = GenerateRandomNumber(6); @@ -368,14 +412,22 @@ void daMrSun_c::executeState_Spin() { ylaunch = -7.5; } - dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); - spawner->speed.x = xlaunch; - spawner->speed.y = ylaunch; + if (this->settings == 0) { + dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); + spawner->speed.x = xlaunch; + spawner->speed.y = ylaunch; + } // It's a sun + + else { + dStageActor_c *spawner = CreateActor(118, 0, this->pos, 0, 0); + spawner->speed.x = xlaunch; + spawner->speed.y = ylaunch; + } // It's a moon } if (this->timer > 120) { - this->rot.x = this->rot.x / 2; - this->rot.y = this->rot.y / 2; +// this->rot.x = this->rot.x / 2; +// this->rot.y = this->rot.y / 2; this->doStateChange(&StateID_Follow); } } @@ -401,21 +453,33 @@ void daMrSun_c::beginState_Wait() { this->rot.x = 11000; this->rot.y = 0; // this->rot.z = 11000; + + dStageActor_c *Player = GetSpecificPlayerActor(0); + if (Player == 0) { Player = GetSpecificPlayerActor(1); } + if (Player == 0) { Player = GetSpecificPlayerActor(2); } + if (Player == 0) { Player = GetSpecificPlayerActor(3); } + if (Player == 0) { doStateChange(&StateID_Follow); } + + this->swoopTarget = Player->pos; } void daMrSun_c::executeState_Wait() { int Choice; - - if (this->timer > 20) { + int TimerMax; + + if (this->settings == 0) { TimerMax = 20; } // It's a sun + else { TimerMax = 15; } // It's a moon + + if (this->timer > TimerMax) { // doStateChange(&StateID_Spit); - Choice = GenerateRandomNumber(1); + Choice = GenerateRandomNumber(6); OSReport("Choice: %d", Choice); - if (Choice == 0) { doStateChange(&StateID_Swoop); } -// else if (Choice == 1) { doStateChange(&StateID_Spin); } -// else if (Choice == 2) { doStateChange(&StateID_Swoop); } -// else if (Choice == 3) { doStateChange(&StateID_Spiral); } + if (Choice == 0) { doStateChange(&StateID_Spit); } + else if (Choice == 1) { doStateChange(&StateID_Spin); } + else if (Choice == 2) { doStateChange(&StateID_Spiral); } + else { doStateChange(&StateID_Swoop); } } -- cgit v1.2.3