#include #include #include #include extern "C" void *PlaySound(dEn_c *, int soundID); extern "C" void *PlaySoundAsync(dStageActor_c *, int soundID); extern "C" bool SpawnEffect(const char*, int, Vec*, S16Vec*, Vec*); extern "C" dStageActor_c* GetSpecificPlayerActor(int number); extern int GlobalStarsCollected; struct EventTable_t { u64 events; }; extern EventTable_t *EventTable; class dChallengeStar : public dEn_c { int onCreate(); int onExecute(); int onDelete(); int onDraw(); mHeapAllocator_c allocator; m3d::mdl_c bodyModel; mEf::es2 effect; u64 eventFlag; s32 timer; static dChallengeStar *build(); void updateModelMatrices(); void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); }; void dChallengeStar::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { PlaySoundAsync(this, SE_OBJ_BROOM_KEY_SHOW); SpawnEffect("Wm_ob_greencoinkira_a", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}); GlobalStarsCollected--; if (GlobalStarsCollected == 0) { EventTable->events |= this->eventFlag; } this->Delete(1); } void dChallengeStar::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } void dChallengeStar::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } void dChallengeStar::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } void dChallengeStar::collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } void dChallengeStar::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } dChallengeStar *dChallengeStar::build() { void *buffer = AllocFromGameHeap1(sizeof(dChallengeStar)); return new(buffer) dChallengeStar; } int dChallengeStar::onCreate() { char die = this->settings & 0xF; if (GetSpecificPlayerActor(die) == 0) { this->Delete(1); return; } GlobalStarsCollected++; allocator.link(-1, GameHeaps[0], 0, 0x20); nw4r::g3d::ResFile rf(getResource("I_star", "g3d/silver_star.brres")); bodyModel.setup(rf.GetResMdl("I_star"), &allocator, 0x224, 1, 0); SetupTextures_Map(&bodyModel, 0); allocator.unlink(); ActivePhysics::Info HitMeBaby; HitMeBaby.xDistToCenter = 0.0; HitMeBaby.yDistToCenter = -4.0; HitMeBaby.xDistToEdge = 6.0; HitMeBaby.yDistToEdge = 6.0; HitMeBaby.category1 = 0x5; HitMeBaby.category2 = 0x0; HitMeBaby.bitfield1 = 0x4F; HitMeBaby.bitfield2 = 0x200; HitMeBaby.unkShort1C = 0; HitMeBaby.callback = &dEn_c::collisionCallback; this->aPhysics.initWithStruct(this, &HitMeBaby); this->aPhysics.addToList(); char eventNum = (this->settings >> 24) & 0xFF; this->eventFlag = (u64)1 << (eventNum - 1); this->scale.x = 0.70; this->scale.y = 0.70; this->scale.z = 0.70; this->pos.x += 8.0; this->pos.y -= 14.0; this->pos.z = 3300.0; this->onExecute(); return true; } int dChallengeStar::onDelete() { return true; } int dChallengeStar::onDraw() { bodyModel.scheduleForDrawing(); return true; } void dChallengeStar::updateModelMatrices() { 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); } int dChallengeStar::onExecute() { updateModelMatrices(); effect.spawn("Wm_ob_keyget02_kira", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}); this->rot.y += 0x200; return true; }