From 463bf1cb5059e14b3af73adf0037a9ae8a5dcd2c Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Sun, 25 Sep 2011 14:32:18 -0500 Subject: Fuzzy Bear and Mr.Sun fixes/improvements --- include/game.h | 2 +- kamek_pal.x | 2 +- src/bossFuzzyBear.cpp | 391 ++++++++++++++++++++++++++++++++++++++++++++++---- src/mrsun.cpp | 167 ++++++++++++++++----- 4 files changed, 496 insertions(+), 66 deletions(-) diff --git a/include/game.h b/include/game.h index f7728db..c57a93d 100755 --- a/include/game.h +++ b/include/game.h @@ -1549,7 +1549,7 @@ public: virtual void collisionCat11_PipeCannon(ActivePhysics *apThis, ActivePhysics *apOther); virtual void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); virtual void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); - virtual void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + virtual bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); virtual void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); virtual void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); diff --git a/kamek_pal.x b/kamek_pal.x index 801c7ed..8535c2c 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -29,7 +29,7 @@ SECTIONS { HandleYSpeed = 0x8006CDE0; UpdateObjectPosBasedOnSpeedValues_real = 0x8006CD40; dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3 = 0x80096240; - + CalculateDistanceFromActorsNextPosToFurthestPlayer = 0x80064740; diff --git a/src/bossFuzzyBear.cpp b/src/bossFuzzyBear.cpp index b206299..6b0fab0 100644 --- a/src/bossFuzzyBear.cpp +++ b/src/bossFuzzyBear.cpp @@ -12,30 +12,40 @@ class daFuzzyBear_c : public dEn_c { m3d::mdl_c bodyModel; int timer; + char BigBossFuzzyBear; float Baseline; float AreaWidthLeft; float AreaWidthRight; float LaunchSpeedShort; float LaunchSpeedHigh; float dying; + float storeSpeed; Vec initialPos; + char RolyBounces; + Vec RolyPos; + char falldown; + char damage; + char fireballs; void dieBigFall_Execute(); static daFuzzyBear_c *build(); void updateModelMatrices(); -// void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); // void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); - void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); - void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); USING_STATES(daFuzzyBear_c); DECLARE_STATE(Grow); DECLARE_STATE(Bounce); + DECLARE_STATE(Needles); + DECLARE_STATE(Spray); + DECLARE_STATE(RolyPoly); }; daFuzzyBear_c *daFuzzyBear_c::build() { @@ -48,29 +58,47 @@ extern "C" void *HandleXSpeed(daFuzzyBear_c *); extern "C" void *HandleYSpeed(daFuzzyBear_c *); extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daFuzzyBear_c *); extern "C" u32 GenerateRandomNumber(int max); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daFuzzyBear_c *, Vec pos); extern "C" dStageActor_c *GetSpecificPlayerActor(int number); +int NearestPlayerF(daFuzzyBear_c *Sprite); +float PlayertoSpriteDistanceF(Vec sprite, Vec player); CREATE_STATE(daFuzzyBear_c, Grow); CREATE_STATE(daFuzzyBear_c, Bounce); +CREATE_STATE(daFuzzyBear_c, Needles); +CREATE_STATE(daFuzzyBear_c, Spray); +CREATE_STATE(daFuzzyBear_c, RolyPoly); #define ACTIVATE 1 #define DEACTIVATE 0 -void daFuzzyBear_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Fireball"); } -void daFuzzyBear_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); } +void daFuzzyBear_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + this->_vf220(apOther->owner); + OSReport("I hit Mario."); +} +void daFuzzyBear_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { + OSReport("Hit Fireball"); + this->timer = 0; + this->fireballs = this->fireballs + 1; + if (this->fireballs > 4) { this->damage = this->damage + 1; } + if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } +} +bool daFuzzyBear_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; } void daFuzzyBear_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Rolling Object"); this->timer = 0; - doStateChange(&StateID_DieBigFall); } + this->damage = this->damage + 1; + if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } } void daFuzzyBear_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); this->timer = 0; - doStateChange(&StateID_DieBigFall); } + this->damage = this->damage + 1; + if (this->damage > 2) { doStateChange(&StateID_DieBigFall); } } void daFuzzyBear_c::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Yoshi Fire"); } @@ -98,6 +126,9 @@ int daFuzzyBear_c::onCreate() { allocator.unlink(); + this->BigBossFuzzyBear = this->settings >> 28; + + OSReport("Setting Fuzzy Bear's Size to 1.0"); this->scale = (Vec){1.0, 1.0, 1.0}; @@ -106,12 +137,20 @@ int daFuzzyBear_c::onCreate() { ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = 0.0; - HitMeBaby.xDistToEdge = 38.0; - HitMeBaby.yDistToEdge = 38.0; - HitMeBaby.category1 = 0x3; + + if (BigBossFuzzyBear == 0) { + HitMeBaby.xDistToEdge = 38.0; + HitMeBaby.yDistToEdge = 38.0; } + else { + HitMeBaby.xDistToEdge = 50.0; + HitMeBaby.yDistToEdge = 50.0; } + + HitMeBaby.category1 = 0x7; HitMeBaby.category2 = 0x0; - HitMeBaby.bitfield1 = 0x4F; - HitMeBaby.bitfield2 = 0x828E; + HitMeBaby.bitfield1 = 0x0; + HitMeBaby.bitfield2 = 0x0; +// HitMeBaby.bitfield1 = 0x4F; +// HitMeBaby.bitfield2 = 0x828E; HitMeBaby.unkShort1C = 0; HitMeBaby.callback = &dEn_c::collisionCallback; @@ -136,6 +175,10 @@ int daFuzzyBear_c::onCreate() { this->AreaWidthLeft = (this->settings >> 8) && 0xFF; this->initialPos = this->pos; + this->storeSpeed = 0; + this->falldown = 0; + this->fireballs = 0; + this->damage = 0; OSReport("Setting Fuzzy Bear's State"); doStateChange(&StateID_Grow); @@ -153,12 +196,67 @@ int daFuzzyBear_c::onExecute() { // OSReport("Fuzzy Bear was Executed."); acState.execute(); updateModelMatrices(); - -// this->speed.y = this->speed.y - 0.2; // Gravity + if (this->aPhysics.result1 == 1) { + char PlayerID = NearestPlayerF(this); + dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); + + this->_vf220(Player); + } + return true; } +int NearestPlayerF(daFuzzyBear_c *Sprite) { + float pfloat[] = { 0.0, 0.0, 0.0, 0.0 }; + float max = 1000000.0; + char maxPlayer = 5; + int i; + OSReport("FINDING NEAREST PLAYER"); + + for (i=0; i<4; i++) { + OSReport("K, let's check out Player %d", i); + dStageActor_c *Player = GetSpecificPlayerActor(i); + if (Player != 0) { + OSReport("Player %d exists", i); + pfloat[i] = PlayertoSpriteDistanceF(Sprite->pos, Player->pos); + + OSReport("if %f > %f", pfloat[i], max); + if (pfloat[i] < max) { + max = pfloat[i]; + maxPlayer = i; + OSReport("MaxPlayer now %d", i); + } + } + } + + OSReport("MaxPlayer finalized at %d", maxPlayer); + + return maxPlayer; +} + +float PlayertoSpriteDistanceF(Vec sprite, Vec player) { + float x = sprite.x - player.x; + float y = sprite.y - player.y; + + float x2 = x * x; + float y2 = y * y; + + float returnval = x2+y2; + + OSReport("X: (%f - %f)^2 = %f", sprite.x, player.x, x2); + OSReport("Y: (%f - %f)^2 = %f", sprite.y, player.y, y2); + + + if (returnval < 0) { returnval = -returnval; } + + OSReport("Return: %f", returnval); + + return returnval; +} + + + int daFuzzyBear_c::onDraw() { bodyModel.scheduleForDrawing(); return true; @@ -187,13 +285,22 @@ void daFuzzyBear_c::executeState_Grow() { this->timer = this->timer + 1; + float scaleSpeed, yPosScaling; + if ((this->timer > 60) && (this->timer < 140)) { + if (BigBossFuzzyBear == 0) { + scaleSpeed = 0.025; + yPosScaling = 25; } + else { + scaleSpeed = 0.0375; + yPosScaling = 33; } float modifier; - modifier = 1.0 + ((this->timer - 60) * 0.025); + + modifier = 1.0 + ((this->timer - 60) * scaleSpeed); this->scale = (Vec){modifier, modifier, modifier}; - this->pos.y = this->pos.y + (25/80); + this->pos.y = this->pos.y + (yPosScaling/80); } if (this->timer > 170) { doStateChange(&StateID_Bounce); } @@ -212,25 +319,45 @@ void daFuzzyBear_c::endState_Grow() { void daFuzzyBear_c::beginState_Bounce() { + OSReport("Begin Bouncing"); if (this->direction = 0) { this->speed.x = ((this->settings >> 16) && 0xF) * 0.5; } else { this->speed.x = ((this->settings >> 16) && 0xF) * -0.5; } - this->pos.y = this->Baseline - 1.0; + if (this->storeSpeed != 0) { this->speed.x = this->storeSpeed; } this->timer = 20; } void daFuzzyBear_c::executeState_Bounce() { + + float wallDistance, scaleDown, scaleUp, scaleBase; + + if (BigBossFuzzyBear == 0) { + wallDistance = 38.0; + scaleDown = 3.0; + scaleUp = 12.0; + scaleBase = 3.0; + } + else { + wallDistance = 50.0; + scaleDown = 4.0; + scaleUp = 16.0; + scaleBase = 4.0; + } + + + if (this->falldown == 1) { this->speed.x = 0; this->timer = 0; } + // Check for walls - if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + 38.0)) { // Hit left wall, head right. + if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + wallDistance)) { // Hit left wall, head right. this->speed.x = -this->speed.x; - this->direction = 0; + this->direction = 1; this->pos.x = this->pos.x + 1.0; } - if (this->pos.x >= this->initialPos.x + ((AreaWidthRight * 24.0) - 38.0)) { // Hit right wall, head left. + if (this->pos.x >= this->initialPos.x + ((AreaWidthRight * 24.0) - wallDistance)) { // Hit right wall, head left. this->speed.x = -this->speed.x; - this->direction = 1; + this->direction = 0; this->pos.x = this->pos.x - 1.0; } @@ -238,32 +365,49 @@ void daFuzzyBear_c::executeState_Bounce() { if (this->pos.y < this->Baseline) { - OSReport("Prepare for Landing."); + this->falldown = 0; this->timer = this->timer + 1; + if (this->speed.x != 0) { + this->storeSpeed = this->speed.x; } this->speed.x = 0; this->speed.y = 0; if (this->timer < 10) { float modifier; - modifier = 3.0 - (this->timer * 0.05); + modifier = scaleBase - (this->timer * 0.1); this->scale.y = modifier; - this->pos.y = this->pos.y + (6/15); + this->pos.y = this->pos.y + (scaleDown/10.0); if (this->pos.y > this->Baseline) { this->pos.y = this->Baseline - 1.0; } } else { float modifier; - modifier = 2.0 + ((this->timer - 20) * 0.05); + modifier = (scaleBase - 1.0) + ((this->timer - 10) * 0.1); this->scale.y = modifier; - this->pos.y = this->pos.y + (24/15); + this->pos.y = this->pos.y + (scaleUp/10.0); if (this->pos.y > this->Baseline) { this->pos.y = this->Baseline - 1.0; } } if (this->timer >= 20) { + int randChoice; + + if (BigBossFuzzyBear == 1) { + randChoice = GenerateRandomNumber(5); + + if (randChoice == 0) { doStateChange(&StateID_Spray); } + else if (randChoice == 1) { doStateChange(&StateID_Needles); } + else if (randChoice == 2) { doStateChange(&StateID_RolyPoly); } + + } + else { + randChoice = GenerateRandomNumber(2); + if (randChoice == 0) { doStateChange(&StateID_RolyPoly); } + } + randChoice = GenerateRandomNumber(5); if (randChoice == 0) { this->speed.y = LaunchSpeedHigh; } @@ -272,15 +416,91 @@ void daFuzzyBear_c::executeState_Bounce() { this->timer = 0; this->pos.y = this->Baseline + 1; OSReport("Takeoff Initiated"); - - if (this->direction = 0) { this->speed.x = ((this->settings >> 16) && 0xF) * 0.5; } - else { this->speed.x = ((this->settings >> 16) && 0xF) * -0.5; } + + this->speed.x = this->storeSpeed; } } else { this->speed.y = this->speed.y - 0.1; } // Gravity + HandleXSpeed(this); + HandleYSpeed(this); + + UpdateObjectPosBasedOnSpeedValues_real(this); + +} + +void daFuzzyBear_c::endState_Bounce() { OSReport("No more bouncing."); } + + + + + +// Needles State - shoots out some black icicles + +void daFuzzyBear_c::beginState_Needles() { + this->timer = 0; + this->speed.y = 0; + this->speed.x = 0; + OSReport("Fuzzy Needle State Begin"); +} +void daFuzzyBear_c::executeState_Needles() { + float origScale; + + this->speed.y = 0; + this->speed.x = 0; + + if (BigBossFuzzyBear == 0) { + origScale = 3.0; + } + else { + origScale = 4.0; + } + + this->timer = this->timer + 1; + OSReport("Needle Timer: %d", this->timer); + + if (this->timer < 120) { + this->scale.y = (sin(this->timer * 3.14 / 5.0) / 2.0) + origScale; // 3 shakes per second, exactly 24 shakes overall + this->scale.x = (sin(this->timer * 3.14 / 5.0) / 2.0) + origScale; // 3 shakes per second, exactly 24 shakes overall + + if (this->timer == 30) { + dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + spawner->speed.x = -6.0; + spawner->speed.y = 0.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } + + if (this->timer == 45) { + dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + spawner->speed.x = 6.0; + spawner->speed.y = 6.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } + + if (this->timer == 60) { + dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + spawner->speed.x = 0.0; + spawner->speed.y = 6.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } + + if (this->timer == 75) { + dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + spawner->speed.x = -6.0; + spawner->speed.y = 6.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } + + if (this->timer == 90) { + dStageActor_c *spawner = CreateActor(511, 0, this->pos, 0, 0); + spawner->speed.x = -6.0; + spawner->speed.y = 0.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } + } + else { doStateChange(&StateID_Bounce); } HandleXSpeed(this); HandleYSpeed(this); @@ -288,10 +508,121 @@ void daFuzzyBear_c::executeState_Bounce() { UpdateObjectPosBasedOnSpeedValues_real(this); } +void daFuzzyBear_c::endState_Needles() { OSReport("Fuzzy Needle State End"); } -void daFuzzyBear_c::endState_Bounce() { +// Spray State - jumps in the air and shakes out some small fuzzies + +void daFuzzyBear_c::beginState_Spray() { + this->timer = 0; + this->speed.y = 7.0; + this->speed.x = 0.0; + OSReport("Fuzzy Spray State Begin"); } +void daFuzzyBear_c::executeState_Spray() { + + this->speed.x = 0.0; + OSReport("Fuzzy Spray State Execute"); + if (this->speed.y < 1.0) { + this->speed.y = 0; + + if (this->timer < 120) { + + this->rot.y = sin(this->timer * 3.14 / 5) * 4000; // 3 shakes per second, exactly 24 shakes overall + int randChoice; + randChoice = GenerateRandomNumber(20); // 1.3 Fuzzies per second, 6 fuzzies overall + + if (randChoice == 0) { + int randChoiceX, randChoiceY; + randChoiceX = GenerateRandomNumber(24); + randChoiceY = GenerateRandomNumber(16); + + dStageActor_c *spawner = CreateActor(144, 0, this->pos, 0, 0); + spawner->speed.x = randChoiceX - 12.0; + spawner->speed.y = randChoiceY * 1.0; + spawner->scale = (Vec){1.0, 1.0, 1.0}; + } } + + else { doStateChange(&StateID_Bounce); } + this->timer = this->timer + 1; + + } + + else { this->speed.y = this->speed.y - 0.1; } // Gravity + + + HandleXSpeed(this); + HandleYSpeed(this); + + UpdateObjectPosBasedOnSpeedValues_real(this); + +} +void daFuzzyBear_c::endState_Spray() { + this->rot.y = 0; + this->timer = 20; + this->falldown = 1; + OSReport("Fuzzy Spray State End"); +} + + +// Roly Poly State - Rolls from left to right, bounces off both walls, and returns to original position. + +void daFuzzyBear_c::beginState_RolyPoly() { + this->speed.x = this->storeSpeed; + this->speed.y = 0; + this->RolyBounces = 0; + this->RolyPos = this->pos; + OSReport("Fuzzy Roly State Begin"); +} +void daFuzzyBear_c::executeState_RolyPoly() { + OSReport("Fuzzy Roly State Execute"); + float wallDistance, scaleDown, scaleUp; + + if (BigBossFuzzyBear == 0) { + wallDistance = 38.0; + } + else { + wallDistance = 50.0; + } + + this->speed.y = 0; + + if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + wallDistance)) { // Hit left wall, head right. + this->speed.x = -this->speed.x; + this->direction = 1; + this->pos.x = this->pos.x + 1.0; + this->RolyBounces = this->RolyBounces + 1; + } + + if (this->pos.x >= this->initialPos.x + ((AreaWidthRight * 24.0) - wallDistance)) { // Hit right wall, head left. + this->speed.x = -this->speed.x; + this->direction = 0; + this->pos.x = this->pos.x - 1.0; + this->RolyBounces = this->RolyBounces + 1; + } + + + if (this->direction == 1) { this->rot.z = this->rot.z + 0x1000; } + else { this->rot.z = this->rot.z - 0x1000; } + + if (this->RolyBounces == 2) { + if (this->direction == 1) { + if (this->pos.x > this->RolyPos.x) { + this->speed.x = 0; + if (this->rot.z == 0) { doStateChange(&StateID_Bounce); } } } + else { + if (this->pos.x < this->RolyPos.x) { + this->speed.x = 0; + if (this->rot.z == 0) { doStateChange(&StateID_Bounce); } } } + } + + HandleXSpeed(this); + HandleYSpeed(this); + + UpdateObjectPosBasedOnSpeedValues_real(this); + + } +void daFuzzyBear_c::endState_RolyPoly() { this->rot.z = 0; OSReport("Fuzzy Roly State End"); } diff --git a/src/mrsun.cpp b/src/mrsun.cpp index 19b5902..01ab485 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -34,18 +34,21 @@ class daMrSun_c : public dEn_c { int dying; char sunDying; + u64 eventFlag; + + void dieFall_Execute(); static daMrSun_c *build(); void updateModelMatrices(); -// void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); -// void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); - void collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); - void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther); USING_STATES(daMrSun_c); DECLARE_STATE(Follow); @@ -71,6 +74,8 @@ extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char r extern "C" dStageActor_c *GetSpecificPlayerActor(int number); +int NearestPlayer(daMrSun_c *Sprite); +float PlayertoSpriteDistance(Vec sprite, Vec player); CREATE_STATE(daMrSun_c, Follow); CREATE_STATE(daMrSun_c, Swoop); @@ -83,16 +88,34 @@ CREATE_STATE(daMrSun_c, Wait); #define DEACTIVATE 0 +struct EventTable_t { + u64 events; + // ... +}; + +extern EventTable_t *EventTable; + + + +void daMrSun_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + this->_vf220(apOther->owner); + OSReport("I hit Mario."); +} + void daMrSun_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Fireball"); } -void daMrSun_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { +bool daMrSun_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); - if (this->settings == 0) { // It's a sun - if (this->sunDying == 5) { - this->isDead = 1; - doStateChange(&StateID_DieIceVanish); } - else { - this->sunDying = this->sunDying + 1; } - } } + + if (this->settings == 1) { // It's a moon + OSReport("What Kind is it?: %d", apOther->owner->name); + if (apOther->owner->name == 0x76) { // BROS_ICEBALL + OSReport("No hits 4 u."); + return true; + } + } + OSReport("K it hit."); + return false; +} void daMrSun_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Rolling Object"); this->timer = 0; @@ -101,13 +124,17 @@ void daMrSun_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOt OSReport("Hit Hammer"); this->timer = 0; doStateChange(&StateID_DieFall); } -void daMrSun_c::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Yoshi Fire"); } +void daMrSun_c::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther) { + OSReport("Hit StarMario"); + this->timer = 0; + doStateChange(&StateID_DieFall); } +void daMrSun_c::collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Groundpound"); } + void daMrSun_c::dieFall_Execute() { this->timer = this->timer + 1; - this->dying = this->dying + 0.15; @@ -132,6 +159,7 @@ void daMrSun_c::dieFall_Execute() { doStateChange(&StateID_Follow); } this->pos.y = this->Baseline; + this->aPhysics.addToList(); doStateChange(&StateID_Follow); } } @@ -141,7 +169,7 @@ int daMrSun_c::onCreate() { OSReport("Creating the Mr.Sun Models"); allocator.link(-1, GameHeaps[0], 0, 0x20); - if (this->settings == 0) { // It's a sun + if ((this->settings & 0xF) == 0) { // It's a sun hasGlow = true; nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/sun.brres")); @@ -158,9 +186,6 @@ int daMrSun_c::onCreate() { nw4r::g3d::ResFile rf(getResource("bilikyu", "g3d/moon.brres")); bodyModel.setup(rf.GetResMdl("Moon"), &allocator, 0x224, 1, 0); SetupTextures_Map(&bodyModel, 0); - -// glowModel.setup(rf.GetResMdl("MoonGlow"), &allocator, 0x224, 1, 0); -// SetupTextures_Map(&glowModel, 0); } allocator.unlink(); @@ -173,17 +198,19 @@ int daMrSun_c::onCreate() { ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = 0.0; - HitMeBaby.xDistToEdge = 16.0; - HitMeBaby.yDistToEdge = 16.0; HitMeBaby.category1 = 0x3; HitMeBaby.category2 = 0x0; - HitMeBaby.bitfield1 = 0x4F; + HitMeBaby.bitfield1 = 0x6F; - if (this->settings == 0) { // It's a sun - HitMeBaby.bitfield2 = 0x3E020C; // Can be hit by iceballs of all kinds, shells and rollies, pipe cannons, and star power + if ((this->settings & 0xF) == 0) { // It's a sun + HitMeBaby.bitfield2 = 0xffbafffc; + HitMeBaby.xDistToEdge = 24.0; + HitMeBaby.yDistToEdge = 24.0; } else { // It's a moon - HitMeBaby.bitfield2 = 0x3E0200; // Can be hit by fireballs of all kinds, shells and rollies, pipe cannons, and star power + HitMeBaby.bitfield2 = 0xffbafffe; + HitMeBaby.xDistToEdge = 12.0; + HitMeBaby.yDistToEdge = 12.0; } HitMeBaby.unkShort1C = 0; @@ -207,6 +234,14 @@ int daMrSun_c::onCreate() { this->sunDying = 0; this->pos.z = 3300.00; + + + char eventNum = (this->settings >> 16) & 0xFF; + OSReport("Event to activate: %d", eventNum); + + this->eventFlag = (u64)1 << (eventNum - 1); + + OSReport("Setting Mr.Sun's State"); doStateChange(&StateID_Follow); @@ -224,9 +259,69 @@ int daMrSun_c::onExecute() { //OSReport("Oh Mr.Sun, Sun, Mr.Golden Sun"); acState.execute(); updateModelMatrices(); + if (this->aPhysics.result1 == 1) { + char PlayerID = NearestPlayer(this); + dStageActor_c *Player = GetSpecificPlayerActor(PlayerID); + + this->_vf220(Player); + } + + if (EventTable->events & this->eventFlag) { + this->kill(); + this->pos.y = this->pos.y + 800.0; + } + return true; } +int NearestPlayer(daMrSun_c *Sprite) { + float pfloat[] = { 0.0, 0.0, 0.0, 0.0 }; + float max = 1000000.0; + char maxPlayer = 5; + int i; + OSReport("FINDING NEAREST PLAYER"); + + for (i=0; i<4; i++) { + OSReport("K, let's check out Player %d", i); + dStageActor_c *Player = GetSpecificPlayerActor(i); + if (Player != 0) { + OSReport("Player %d exists", i); + pfloat[i] = PlayertoSpriteDistance(Sprite->pos, Player->pos); + + OSReport("if %f > %f", pfloat[i], max); + if (pfloat[i] < max) { + max = pfloat[i]; + maxPlayer = i; + OSReport("MaxPlayer now %d", i); + } + } + } + + OSReport("MaxPlayer finalized at %d", i); + + return maxPlayer; +} + +float PlayertoSpriteDistance(Vec sprite, Vec player) { + float x = sprite.x - player.x; + float y = sprite.y - player.y; + + float x2 = x * x; + float y2 = y * y; + + float returnval = x2+y2; + + OSReport("X: (%f - %f)^2 = %f", sprite.x, player.x, x2); + OSReport("Y: (%f - %f)^2 = %f", sprite.y, player.y, y2); + + + if (returnval < 0) { returnval = -returnval; } + + OSReport("Return: %f", returnval); + + return returnval; +} + int daMrSun_c::onDraw() { bodyModel.scheduleForDrawing(); if (hasGlow) @@ -282,10 +377,10 @@ 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 + if ((this->settings & 0xF) == 0) { speedDelta = 0.1; } // It's a sun else { speedDelta = 0.15; } // It's a moon - OSReport("Speed: %f", this->speed.x); +// OSReport("Speed: %f", this->speed.x); if (this->direction == 0) { this->speed.x = this->speed.x + speedDelta; @@ -328,7 +423,7 @@ void daMrSun_c::beginState_Swoop() { if (this->swoopTarget.y < (this->pos.y - 50)) { 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) { + if ((this->settings & 0xF) == 0) { this->swoopTarget.y = this->swoopTarget.y - 16; } // It's a sun @@ -392,7 +487,7 @@ void daMrSun_c::executeState_Spiral() { Magnitude = 11.0; // Use a period of 0.1 for the moon - if (this->settings == 0) { Period = 0.1; } // It's a sun + if ((this->settings & 0xF) == 0) { Period = 0.1; } // It's a sun else { Period = 0.125; } // It's a moon this->pos.x = this->xSpiralOffset + Magnitude*((this->SpiralLoop * cos(this->SpiralLoop))); @@ -424,7 +519,7 @@ void daMrSun_c::executeState_Spit() { if (this->direction == 0) { neg = 1.0; } - if (this->settings == 0) { + if ((this->settings & 0xF) == 0) { dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = 6.0 * neg; spawner->speed.y = -2.5; @@ -447,16 +542,19 @@ void daMrSun_c::executeState_Spit() { spawner->speed.x = 6.0 * neg; spawner->speed.y = -2.5; spawner->pos.z = 3350.0; + *((u32 *) (((char *) spawner) + 0x3DC)) = this->id; spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = 0.0 * neg; spawner->speed.y = -6.0; spawner->pos.z = 3350.0; + *((u32 *) (((char *) spawner) + 0x3DC)) = this->id; spawner = CreateActor(118, 0, this->pos, 0, 0); spawner->speed.x = 3.5 * neg; spawner->speed.y = -6.0; spawner->pos.z = 3350.0; + *((u32 *) (((char *) spawner) + 0x3DC)) = this->id; } // It's a moon } @@ -557,7 +655,7 @@ void daMrSun_c::executeState_Spin() { ylaunch = -5.0; } - if (this->settings == 0) { + if ((this->settings & 0xF) == 0) { dStageActor_c *spawner = CreateActor(106, 0, this->pos, 0, 0); spawner->speed.x = xlaunch; spawner->speed.y = ylaunch; @@ -569,6 +667,8 @@ void daMrSun_c::executeState_Spin() { spawner->speed.x = xlaunch; spawner->speed.y = ylaunch; spawner->pos.z = 3350.0; + + *((u32 *) (((char *) spawner) + 0x3DC)) = this->id; } // It's a moon } @@ -608,15 +708,14 @@ void daMrSun_c::executeState_Wait() { int Choice; int TimerMax; - if (this->settings == 0) { TimerMax = 20; } // It's a sun + if ((this->settings & 0xF) == 0) { TimerMax = 20; } // It's a sun else { TimerMax = 15; } // It's a moon if (this->timer > TimerMax) { -// doStateChange(&StateID_Spit); - Choice = GenerateRandomNumber(7); + Choice = GenerateRandomNumber(9); - OSReport("Choice: %d", Choice); +// OSReport("Choice: %d", Choice); if (Choice == 0) { doStateChange(&StateID_Spit); } else if (Choice == 1) { doStateChange(&StateID_Spit); } -- cgit v1.2.3