diff options
Diffstat (limited to '')
-rw-r--r-- | kamek_pal.x | 10 | ||||
-rwxr-xr-x | src/mrsun.cpp | 291 |
2 files changed, 279 insertions, 22 deletions
diff --git a/kamek_pal.x b/kamek_pal.x index c9d0095..12d1ea4 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -23,12 +23,14 @@ SECTIONS { /* Mr Sun Related */ - BubbleModel = 0x809D0C80; - BubbleDraw = 0x809D0810; ActivePhysics_InitWithStruct = 0x8008C3E0; ActivePhysics_AddToList = 0x8008C330; - - + HandleXSpeed = 0x8006CD90; + HandleYSpeed = 0x8006CDE0; + UpdateObjectPosBasedOnSpeedValues_real = 0x8006CD40; + dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3 = 0x80096240; + + _savefpr_14 = 0x802DCF98; diff --git a/src/mrsun.cpp b/src/mrsun.cpp index bce5908..00ca9ca 100755 --- a/src/mrsun.cpp +++ b/src/mrsun.cpp @@ -11,6 +11,15 @@ class daMrSun_c : public dEn_c { mHeapAllocator_c allocator; m3d::mdl_c model; + float Baseline; + float SwoopSlope; + float SpiralLoop; + float yThreshold; + float yAccel; + Vec swoopTarget; + float slope; + u32 timer; + static daMrSun_c *build(); void updateModelMatrix(); @@ -21,6 +30,7 @@ class daMrSun_c : public dEn_c { DECLARE_STATE(Spiral); DECLARE_STATE(Spit); DECLARE_STATE(Spin); + DECLARE_STATE(Wait); }; daMrSun_c *daMrSun_c::build() { @@ -28,6 +38,17 @@ daMrSun_c *daMrSun_c::build() { return new(buffer) daMrSun_c; } + +extern "C" void *HandleXSpeed(daMrSun_c *); +extern "C" void *HandleYSpeed(daMrSun_c *); +extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daMrSun_c *); +extern "C" u32 GenerateRandomNumber(int max); +extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daMrSun_c *, Vec pos); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); + + + CREATE_STATE(daMrSun_c, Follow); CREATE_STATE(daMrSun_c, Swoop); CREATE_STATE(daMrSun_c, Spiral); @@ -55,8 +76,8 @@ int daMrSun_c::onCreate() { ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = 0.0; - HitMeBaby.xDistToEdge = 8.0; - HitMeBaby.yDistToEdge = 8.0; + HitMeBaby.xDistToEdge = 32.0; + HitMeBaby.yDistToEdge = 32.0; HitMeBaby.category1 = 0x3; HitMeBaby.category2 = 0x0; HitMeBaby.bitfield1 = 0x4F; @@ -69,7 +90,17 @@ int daMrSun_c::onCreate() { this->aPhysics.initWithStruct(this, &HitMeBaby); this->aPhysics.addToList(); - doStateChange(&StateID_Follow); + OSReport("Setting up Mr.Sun's Box of Goodies"); + this->Baseline = this->pos.y; + this->SwoopSlope = 0.0; + this->SpiralLoop = 0; + this->yThreshold = 10.0; + this->yAccel = 0.2; + this->timer = 0; + + + OSReport("Setting Mr.Sun's State"); + doStateChange(&StateID_Swoop); OSReport("Going to Execute Mr.Sun"); this->onExecute(); @@ -104,25 +135,249 @@ void daMrSun_c::updateModelMatrix() { } +// Follow State + +void daMrSun_c::beginState_Follow() { + OSReport("Mr.Sun is following youuuuu."); + this->timer = 0; +} +void daMrSun_c::executeState_Follow() { + + if (this->timer > 1000) + this->doStateChange(&StateID_Wait); + + this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + + if (this->direction == 0) { + if (this->speed.x > 10.0) + this->speed.x = this->speed.x + 0.1; + } + else { + if (this->speed.x < -10.0) + this->speed.x = this->speed.x - 0.1; + } + + HandleXSpeed(this); + + + if (this->pos.y > this->Baseline) { + if (this->speed.y > -this->yThreshold) + this->speed.y = this->speed.y - this->yAccel; + } + + else if (this->pos.y < this->Baseline) { + if (this->speed.y > -this->yThreshold) + this->speed.y = this->speed.y + this->yAccel; + } + + else { + this->pos.y = this->Baseline; + this->speed.y = 0; + } + + HandleYSpeed(this); + + UpdateObjectPosBasedOnSpeedValues_real(this); + this->timer = this->timer + 1; +} +void daMrSun_c::endState_Follow() { OSReport("Mr.Sun is coming for you."); } + + +// Swoop State + +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); + + + this->swoopTarget = Player->pos; + + float relativeSunX = this->swoopTarget.x - this->pos.x; + float relativeSunY = this->swoopTarget.y - this->pos.y; + + this->slope = relativeSunY / relativeSunX; +} +void daMrSun_c::executeState_Swoop() { + + if (this->pos.y > this->swoopTarget.y) + doStateChange(&StateID_Follow); + + if (this->slope < 0.0) + this->speed.x = this->speed.x + 0.2; + + if (this->slope > 0.0) + this->speed.x = this->speed.x - 0.2; + + HandleXSpeed(this); + HandleYSpeed(this); + UpdateObjectPosBasedOnSpeedValues_real(this); + +} +void daMrSun_c::endState_Swoop() { + OSReport("Returning to the sky, Mr.Sun flies into the sunset."); + + this->swoopTarget = (Vec){0.0, 0.0, 0.0}; +} + + + +// Spiral State + +void daMrSun_c::beginState_Spiral() { OSReport("Super Spiral Sunspot!"); } +void daMrSun_c::executeState_Spiral() { + + if (this->SpiralLoop > (6.28 * 5)) + doStateChange(&StateID_Follow); + + this->pos.x = this->SpiralLoop * cos(this->SpiralLoop); + this->pos.y = this->SpiralLoop * sin(this->SpiralLoop); + + this->SpiralLoop = this->SpiralLoop + 0.1; +} +void daMrSun_c::endState_Spiral() { OSReport("Nightmare Spiral Attack Ends!"); } + + + +// Spit State + +void daMrSun_c::beginState_Spit() { OSReport("Goodness Gracious Great Balls of Fire!"); } +void daMrSun_c::executeState_Spit() { + + if (this->timer > 1000) + doStateChange(&StateID_Follow); + + dStageActor_c *spawner = CreateActor(107, 0, this->pos, 0, 0); + spawner->speed.x = 10.0; + spawner->speed.y = 10.0; + + spawner = CreateActor(107, 0, this->pos, 0, 0); + spawner->speed.x = 8.0; + spawner->speed.y = 5.0; + + spawner = CreateActor(107, 0, this->pos, 0, 0); + spawner->speed.x = 4.0; + spawner->speed.y = 0.0; + + this->timer = this->timer + 1; + +} +void daMrSun_c::endState_Spit() { OSReport("Armageddon complete."); } + + + +// Spin State + +void daMrSun_c::beginState_Spin() { OSReport("Hoola hoola hoola hoop."); } +void daMrSun_c::executeState_Spin() { + + if (this->timer > 1000) + this->doStateChange(&StateID_Wait); + + this->direction = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + + if (this->direction == 0) { + if (this->speed.x > 10.0) + this->speed.x = this->speed.x + 0.1; + } + else { + if (this->speed.x < -10.0) + this->speed.x = this->speed.x - 0.1; + } + + HandleXSpeed(this); + UpdateObjectPosBasedOnSpeedValues_real(this); + + this->timer = this->timer + 1; + + int direction; + direction = GenerateRandomNumber(8); + + float xlaunch; + float ylaunch; + + switch (direction) { + case 1: // E + xlaunch = 10.0; + ylaunch = 0.0; + case 2: // SE + xlaunch = 10.0; + ylaunch = 10.0; + case 3: // S + xlaunch = 0.0; + ylaunch = 10.0; + case 4: // SW + xlaunch = -10.0; + ylaunch = 10.0; + case 5: // W + xlaunch = -10.0; + ylaunch = 0.0; + case 6: // NW + xlaunch = -10.0; + ylaunch = -10.0; + case 7: // N + xlaunch = 0.0; + ylaunch = -10.0; + case 8: // NE + xlaunch = 10.0; + ylaunch = -10.0; + default: + xlaunch = 10.0; + ylaunch = -10.0; + } + + dStageActor_c *spawner = CreateActor(107, 0, this->pos, 0, 0); + spawner->speed.x = xlaunch; + spawner->speed.y = ylaunch; + +} +void daMrSun_c::endState_Spin() { OSReport("K, I is dizzy now."); } -void daMrSun_c::beginState_Follow() { } -void daMrSun_c::executeState_Follow() { } -void daMrSun_c::endState_Follow() { } -void daMrSun_c::beginState_Swoop() { } -void daMrSun_c::executeState_Swoop() { } -void daMrSun_c::endState_Swoop() { } -void daMrSun_c::beginState_Spiral() { } -void daMrSun_c::executeState_Spiral() { } -void daMrSun_c::endState_Spiral() { } +// Wait State -void daMrSun_c::beginState_Spit() { } -void daMrSun_c::executeState_Spit() { } -void daMrSun_c::endState_Spit() { } +void daMrSun_c::beginState_Wait() { -void daMrSun_c::beginState_Spin() { } -void daMrSun_c::executeState_Spin() { } -void daMrSun_c::endState_Spin() { } + OSReport("Preparing an attack!"); + + this->timer = 0; + this->speed.x = 0.0; +} +void daMrSun_c::executeState_Wait() { + int Choice; + + if (this->timer > 1000) { + + Choice = GenerateRandomNumber(4); + + switch (Choice) { + case 1: + doStateChange(&StateID_Swoop); + case 2: + doStateChange(&StateID_Spiral); + case 3: + doStateChange(&StateID_Spit); + case 4: + doStateChange(&StateID_Follow); + default: + doStateChange(&StateID_Follow); + } + } + + this->timer = this->timer + 1; +} +void daMrSun_c::endState_Wait() { + OSReport("Mr.Sun Cometh!"); + this->timer = 0; +} |