#include #include #include #include #include "effects.h" #include "player.h" class daRamboo_c : public dEn_c { int onCreate(); int onDelete(); int onExecute(); int onDraw(); mHeapAllocator_c allocator; m3d::mdl_c bodyModel; m3d::mdl_c fogModel; int timer; int ytimer; char BigBossRamboo; float Baseline; float dying; u64 eventFlag; void dieBigFall_Execute(); static daRamboo_c *build(); void updateModelMatrices(); void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat1_Fireball_E_Explosion(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); USING_STATES(daRamboo_c); DECLARE_STATE(Grow); DECLARE_STATE(Advance); DECLARE_STATE(Wait); DECLARE_STATE(Flee); }; daRamboo_c *daRamboo_c::build() { void *buffer = AllocFromGameHeap1(sizeof(daRamboo_c)); return new(buffer) daRamboo_c; } extern "C" void *HandleXSpeed(daRamboo_c *); extern "C" void *HandleYSpeed(daRamboo_c *); extern "C" void *UpdateObjectPosBasedOnSpeedValues_real(daRamboo_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(daRamboo_c *, Vec pos); extern "C" dStageActor_c *GetSpecificPlayerActor(int number); extern "C" void *PlaySound(daRamboo_c *, int soundID); CREATE_STATE(daRamboo_c, Grow); CREATE_STATE(daRamboo_c, Advance); CREATE_STATE(daRamboo_c, Wait); CREATE_STATE(daRamboo_c, Flee); struct EventTable_t { u64 events; // ... }; extern EventTable_t *EventTable; void daRamboo_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { this->_vf220(apOther->owner); OSReport("I hit Mario."); } void daRamboo_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Fireball"); CreateEffect(378, &apOther->owner->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5}); this->pos.x += 6.0; } bool daRamboo_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Iceball"); return false; } void daRamboo_c::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Rolling Object"); if (apOther->owner->name == 412) { // Check if it's a glow block CreateEffect(378, &apOther->owner->pos); CreateEffect(380, &apOther->owner->pos); doStateChange(&StateID_Flee); apOther->owner->Delete(); } } void daRamboo_c::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { OSReport("Hit Hammer"); } void daRamboo_c::dieBigFall_Execute() { if (this->dying == 1) { return; } this->rot.x = 0x0; // X is vertical axis this->rot.y = 0xE000; // Y is horizontal axis this->rot.z = 0x0; // Z is ... an axis >.> if (this->scale.x > 0.1) { this->pos.y += 2.0; PlaySound(this, SE_BOSS_CMN_DAMAGE_LAST); PlaySound(this, SE_EMY_BIG_TERESA_DEAD); this->scale.x -= 0.175; this->scale.y -= 0.175; this->scale.z -= 0.175; Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0}; if (this->timer == 30) { CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 756); CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 801); CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 957); this->timer = 0; } } else { this->scale.x = 0.0; this->scale.y = 0.0; this->scale.z = 0.0; Vec tempPos = (Vec){this->pos.x + 160.0, this->pos.y - 80.0, 5500.0}; CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 588); this->dying = 1; } this->timer += 1; } int daRamboo_c::onCreate() { OSReport("Creating the Ramboo Model"); allocator.link(-1, GameHeaps[0], 0, 0x20); nw4r::g3d::ResFile rf(getResource("teresa", "g3d/teresa.brres")); fogModel.setup(rf.GetResMdl("fog"), &allocator, 0x224, 1, 0); SetupTextures_Enemy(&fogModel, 0); bodyModel.setup(rf.GetResMdl("teresaA"), &allocator, 0x224, 1, 0); SetupTextures_Enemy(&bodyModel, 0); allocator.unlink(); // this->BigBossRamboo = this->settings >> 28; OSReport("Setting Ramboo's Size to 16.0"); this->scale = (Vec){2.0, 2.0, 2.0}; OSReport("Creating Ramboo's Physics Struct"); ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 160.0; HitMeBaby.yDistToCenter = -80.0; HitMeBaby.xDistToEdge = 154.0; HitMeBaby.yDistToEdge = 154.0; HitMeBaby.category1 = 0x3; HitMeBaby.category2 = 0x0; HitMeBaby.bitfield1 = 0x4F; HitMeBaby.bitfield2 = 0x222; 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 the Box of Goodies"); this->Baseline = this->pos.y; this->rot.x = 0; // X is vertical axis this->rot.y = 0xE000; // Y is horizontal axis this->rot.z = 0; // Z is ... an axis >.> this->direction = 0; // Heading left. this->speed.x = 0.0; this->ytimer = 0; char eventNum = (this->settings >> 16) & 0xFF; OSReport("Event to activate: %d", eventNum); this->eventFlag = (u64)1 << (eventNum - 1); OSReport("Setting the State"); doStateChange(&StateID_Grow); OSReport("Going to Execute Ramboo"); this->onExecute(); return true; } int daRamboo_c::onDelete() { return true; } int daRamboo_c::onExecute() { 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) { doStateChange(&StateID_DieBigFall); } return true; } int daRamboo_c::onDraw() { fogModel.scheduleForDrawing(); bodyModel.scheduleForDrawing(); return true; } void daRamboo_c::updateModelMatrices() { // This won't work with wrap because I'm lazy. matrix.translation(pos.x + 160.0, pos.y + (scale.x * 12.0) - 80.0, pos.z); fogModel.setDrawMatrix(matrix); fogModel.setScale(&scale); fogModel.calcWorld(false); matrix.translation(pos.x + 160.0, pos.y - 80.0, pos.z); matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); bodyModel.setDrawMatrix(matrix); bodyModel.setScale(&scale); bodyModel.calcWorld(false); } // Grow State void daRamboo_c::beginState_Grow() { OSReport("Growing when Kameck Tells me to."); this->timer = 0; // PlaySound(this, SE_BOSS_ROY_MAGIC_MAKE_FAST); } void daRamboo_c::executeState_Grow() { this->timer = this->timer + 1; float scaleSpeed, yPosScaling; if ((this->timer > 60) && (this->timer < 140)) { scaleSpeed = 0.175; // yPosScaling = 0; float modifier; modifier = 2.0 + ((this->timer - 60) * scaleSpeed); this->scale = (Vec){modifier, modifier, modifier}; // this->pos.y = this->pos.y + (yPosScaling/80); } if (this->timer > 170) { PlaySound(this, SE_EMY_CS_TERESA_BRING_IT); doStateChange(&StateID_Advance); } } void daRamboo_c::endState_Grow() { this->Baseline = this->pos.y; // StopSound(SE_BOSS_ROY_MAGIC_MAKE_FAST); OSReport("OK. All grown up now."); } // Advance State void daRamboo_c::beginState_Advance() { OSReport("Charge!"); this->speed.y = 0; this->speed.z = 0; this->timer = 0; } void daRamboo_c::executeState_Advance() { this->pos.x -= this->timer / 32; this->pos.y = this->Baseline + sin(this->ytimer * 3.14 / 192) * 48; if (this->timer >= 48) { this->timer = 47; } if (this->ytimer >= 384) { this->ytimer = 0; } PlaySound(this, SE_EMY_TERESA); this->timer += 1; this->ytimer += 1; } void daRamboo_c::endState_Advance() { OSReport("Ouch. Stop Charging."); } // Wait State void daRamboo_c::beginState_Wait() { OSReport("Waiting"); this->timer = 0; PlaySound(this, SE_EMY_TERESA_STOP); } void daRamboo_c::executeState_Wait() { if (this->timer > 60) { PlaySound(this, SE_EMY_CS_TERESA_BEAT_YOU); doStateChange(&StateID_Advance); } this->timer += 1; } void daRamboo_c::endState_Wait() { OSReport("No more bouncing."); } // Flee State void daRamboo_c::beginState_Flee() { OSReport("Damnit that hurt."); this->timer = 0; } void daRamboo_c::executeState_Flee() { this->pos.x += (60 - this->timer) / 8; if (this->timer > 60) { doStateChange(&StateID_Wait); } this->timer += 1; } void daRamboo_c::endState_Flee() { OSReport("Ugh, so dizzy."); }