#include #include #include class daFuzzyBear_c : public dEn_c { int onCreate(); int onDelete(); int onExecute(); int onDraw(); mHeapAllocator_c allocator; m3d::mdl_c bodyModel; int timer; float Baseline; float AreaWidthLeft; float AreaWidthRight; float LaunchSpeedShort; float LaunchSpeedHigh; float dying; Vec initialPos; void dieBigFall_Execute(); static daFuzzyBear_c *build(); void updateModelMatrices(); // 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); 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); }; daFuzzyBear_c *daFuzzyBear_c::build() { void *buffer = AllocFromGameHeap1(sizeof(daFuzzyBear_c)); return new(buffer) daFuzzyBear_c; } 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" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daFuzzyBear_c *, Vec pos); extern "C" dStageActor_c *GetSpecificPlayerActor(int number); CREATE_STATE(daFuzzyBear_c, Grow); CREATE_STATE(daFuzzyBear_c, Bounce); #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::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Rolling Object"); this->timer = 0; doStateChange(&StateID_DieBigFall); } void daFuzzyBear_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); this->timer = 0; doStateChange(&StateID_DieBigFall); } void daFuzzyBear_c::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Yoshi Fire"); } void daFuzzyBear_c::dieBigFall_Execute() { this->timer = this->timer + 1; this->dying = this->dying + 0.15; this->pos.x = this->pos.x + 0.15; this->pos.y = this->pos.y + ((-0.2 * (this->dying*this->dying)) + 5); this->dEn_c::dieBigFall_Execute(); } int daFuzzyBear_c::onCreate() { OSReport("Creating the Fuzzy Bear Model"); allocator.link(-1, GameHeaps[0], 0, 0x20); nw4r::g3d::ResFile rf(getResource("chorobon", "g3d/chorobon.brres")); bodyModel.setup(rf.GetResMdl("chorobon"), &allocator, 0x224, 1, 0); SetupTextures_Enemy(&bodyModel, 0); allocator.unlink(); OSReport("Setting Fuzzy Bear's Size to 1.0"); this->scale = (Vec){1.0, 1.0, 1.0}; OSReport("Creating Fuzzy Bear's Physics Struct"); ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = 0.0; HitMeBaby.xDistToEdge = 38.0; HitMeBaby.yDistToEdge = 38.0; HitMeBaby.category1 = 0x3; HitMeBaby.category2 = 0x0; HitMeBaby.bitfield1 = 0x4F; HitMeBaby.bitfield2 = 0x828E; HitMeBaby.unkShort1C = 0; HitMeBaby.callback = &dEn_c::collisionCallback; OSReport("Making the Physics Class and adding to the list"); this->aPhysics.initWithStruct(this, &HitMeBaby); this->aPhysics.addToList(); OSReport("Setting up Fuzzy Bear's Box of Goodies"); this->pos.y = this->pos.y + 6; this->rot.x = 0; // X is vertical axis this->rot.y = 0; // Y is horizontal axis this->rot.z = 0; // Z is ... an axis >.> this->direction = 0; // Heading left. this->speed.x = 0; this->LaunchSpeedShort = ((this->settings >> 20) && 0xF) * 10.0; this->LaunchSpeedHigh = ((this->settings >> 24) && 0xF) * 10.0; this->AreaWidthRight = this->settings && 0xFF; this->AreaWidthLeft = (this->settings >> 8) && 0xFF; this->initialPos = this->pos; OSReport("Setting Fuzzy Bear's State"); doStateChange(&StateID_Grow); OSReport("Going to Execute Fuzzy Bear"); this->onExecute(); return true; } int daFuzzyBear_c::onDelete() { return true; } int daFuzzyBear_c::onExecute() { // OSReport("Fuzzy Bear was Executed."); acState.execute(); updateModelMatrices(); // this->speed.y = this->speed.y - 0.2; // Gravity return true; } int daFuzzyBear_c::onDraw() { bodyModel.scheduleForDrawing(); return true; } void daFuzzyBear_c::updateModelMatrices() { // This won't work with wrap because I'm lazy. matrix.translation(pos.x, pos.y, pos.z); matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); bodyModel.setDrawMatrix(matrix); bodyModel.setScale(&scale); bodyModel.calcWorld(false); } // Grow State void daFuzzyBear_c::beginState_Grow() { OSReport("Growing when Kameck Tells me to."); this->timer = 0; } void daFuzzyBear_c::executeState_Grow() { this->timer = this->timer + 1; if ((this->timer > 60) && (this->timer < 140)) { float modifier; modifier = 1.0 + ((this->timer - 60) * 0.025); this->scale = (Vec){modifier, modifier, modifier}; this->pos.y = this->pos.y + (25/80); } if (this->timer > 170) { doStateChange(&StateID_Bounce); } } void daFuzzyBear_c::endState_Grow() { this->Baseline = this->pos.y; OSReport("OK. All grown up now."); } // Bounce State void daFuzzyBear_c::beginState_Bounce() { 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; this->timer = 20; } void daFuzzyBear_c::executeState_Bounce() { // Check for walls if (this->pos.x <= this->initialPos.x - ((AreaWidthLeft * 24.0) + 38.0)) { // Hit left wall, head right. this->speed.x = -this->speed.x; this->direction = 0; 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. this->speed.x = -this->speed.x; this->direction = 1; this->pos.x = this->pos.x - 1.0; } // Check if we're on the ground. if (this->pos.y < this->Baseline) { OSReport("Prepare for Landing."); this->timer = this->timer + 1; this->speed.x = 0; this->speed.y = 0; if (this->timer < 10) { float modifier; modifier = 3.0 - (this->timer * 0.05); this->scale.y = modifier; this->pos.y = this->pos.y + (6/15); if (this->pos.y > this->Baseline) { this->pos.y = this->Baseline - 1.0; } } else { float modifier; modifier = 2.0 + ((this->timer - 20) * 0.05); this->scale.y = modifier; this->pos.y = this->pos.y + (24/15); if (this->pos.y > this->Baseline) { this->pos.y = this->Baseline - 1.0; } } if (this->timer >= 20) { int randChoice; randChoice = GenerateRandomNumber(5); if (randChoice == 0) { this->speed.y = LaunchSpeedHigh; } else { this->speed.y = LaunchSpeedShort; } 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; } } } else { this->speed.y = this->speed.y - 0.1; } // Gravity HandleXSpeed(this); HandleYSpeed(this); UpdateObjectPosBasedOnSpeedValues_real(this); } void daFuzzyBear_c::endState_Bounce() { }