From a550f21ec661ddd8771a9c779f2b784209fee1f9 Mon Sep 17 00:00:00 2001 From: Colin Noga Date: Tue, 20 Mar 2012 17:03:19 -0500 Subject: Added challenge star, clown car junk, bowser improvements, some fixes here and there, and a roll your own model sprite for skawo. --- src/bossCaptainBowser.cpp | 81 ++++++++++- src/bossFlameThrower.cpp | 291 ++++----------------------------------- src/bossKoopaThrow.cpp | 37 +---- src/bossPlayerClown.cpp | 60 +++++++++ src/challengeStar.cpp | 130 ++++++++++++++++++ src/growup.s | 4 + src/levelspecial.cpp | 18 +-- src/makeYourOwnModelSprite.cpp | 300 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 609 insertions(+), 312 deletions(-) create mode 100644 src/bossPlayerClown.cpp create mode 100644 src/challengeStar.cpp create mode 100644 src/makeYourOwnModelSprite.cpp (limited to 'src') diff --git a/src/bossCaptainBowser.cpp b/src/bossCaptainBowser.cpp index 710af77..6152b42 100644 --- a/src/bossCaptainBowser.cpp +++ b/src/bossCaptainBowser.cpp @@ -5,12 +5,34 @@ #include #include "boss.h" + + +const char* effects_name_list [] = { + "Wm_jr_electricline", // cool + "Wm_jr_fireattack", // cool + "Wm_jr_firehit", // cool + "Wm_jr_fireplace", // cool + "Wm_jr_fireplace_ind", // cool + "Wm_jr_shot", + "Wm_jr_sweat", + "Wm_ko_fireattack", // cool + "Wm_ko_firehit", // cool + "Wm_ko_firehitdie01", // cool + "Wm_ko_firehitdie02", // cool + "Wm_ko_firehitdie03", // cool + "Wm_ko_magmapocha", + "Wm_ko_magmapochabig", + "Wm_ko_shout", // cool + "Wm_ko_shout02", // cool + "Wm_seacloudout", // cool +}; + + + void ShipPhysicsCallback(daBoss *self, dStageActor_c *other) { - OSReport("Physics"); if (other->name == EN_CANNON_BULLET) { } - } @@ -32,9 +54,12 @@ public: m3d::anmChr_c shipAnm; Physics ShipPhysics; + ActivePhysics Roar; + mEf::es2 effect; char isAngry; char isInvulnerable; + float scaleIncreaser; // int isInvulnerableCountdown; // int isTurningCountdown; // char charging; @@ -182,6 +207,25 @@ int daCaptainBowser::onCreate() { this->aPhysics.addToList(); + + // Roar Physics! + ActivePhysics::Info RoarStruct; + RoarStruct.xDistToCenter = -186.0; + RoarStruct.yDistToCenter = 138.0; + + RoarStruct.xDistToEdge = 20.0; + RoarStruct.yDistToEdge = 20.0; + + RoarStruct.category1 = 0x3; + RoarStruct.category2 = 0x0; + RoarStruct.bitfield1 = 0x4F; + RoarStruct.bitfield2 = 0x8028E; + RoarStruct.unkShort1C = 0; + RoarStruct.callback = &dEn_c::collisionCallback; + + this->Roar.initWithStruct(this, &RoarStruct); + + // State Changers doStateChange(&StateID_Wait); @@ -196,6 +240,8 @@ int daCaptainBowser::onExecute() { acState.execute(); this->ShipPhysics.update(); + PlaySound(this, SE_BOSS_SHIP_PRPL); + bodyModel._vf1C(); shipModel._vf1C(); @@ -265,6 +311,9 @@ int daCaptainBowser::onDraw() { if (num == 0) { doStateChange(&StateID_Fire); } + else if (num == 1) { + doStateChange(&StateID_Roar); + } else{ doStateChange(&StateID_Throw); } @@ -320,8 +369,9 @@ int daCaptainBowser::onDraw() { } void daCaptainBowser::executeState_Fire() { - if (this->chrAnimation.getCurrentFrame() == 70) { // spit fire - CreateActor(KOOPA_FIRE, 0x30, (Vec){pos.x-156.0, pos.y+128.0, pos.z}, 0, 0); // Seems like nyb 5 has a setting, 2 bits long, maybe. + if (this->chrAnimation.getCurrentFrame() == 70.5) { // spit fire + PlaySound(this, SE_BOSS_KOOPA_L_FIRE_SHOT); + CreateActor(WM_ANTLION, 0, (Vec){pos.x-172.0, pos.y+152.0, pos.z}, 0, 0); } if (this->chrAnimation.isAnimationDone()) { @@ -349,11 +399,30 @@ int daCaptainBowser::onDraw() { void daCaptainBowser::beginState_Roar() { bindAnimChr_and_setUpdateRate("kp_roar3", 1, 0.0, 1.0); this->isInvulnerable = 1; + this->timer = 0; + this->scaleIncreaser = 0.5; + + this->Roar.info.xDistToEdge = 70.0 * scaleIncreaser; + this->Roar.info.yDistToEdge = 70.0 * scaleIncreaser; + this->Roar.addToList(); } void daCaptainBowser::executeState_Roar() { + if (this->chrAnimation.getCurrentFrame() == 53.0) { // This is where the smackdown starts - SpawnEffect("Wm_ob_itemget_ring", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); + PlaySound(this, SE_VOC_KP_L_SHOUT); + } + + if (this->chrAnimation.getCurrentFrame() > 53.0) { // This is where the smackdown starts + scaleIncreaser += 0.014285; + effect.spawn("Wm_ko_shout", 0, &(Vec){pos.x-186.0+(scaleIncreaser*16.0), pos.y+138.0+(scaleIncreaser*16.0), pos.z}, &(S16Vec){0,0,0}, &(Vec){scaleIncreaser, scaleIncreaser, scaleIncreaser}); + + this->Roar.info.xDistToEdge = 70.0 * scaleIncreaser; + this->Roar.info.yDistToEdge = 70.0 * scaleIncreaser; + } + + if (this->chrAnimation.getCurrentFrame() == 197.0) { // This is where the smackdown ends + this->Roar.removeFromList(); } if (this->chrAnimation.isAnimationDone()) { @@ -375,6 +444,8 @@ int daCaptainBowser::onDraw() { bindAnimChr_and_setUpdateRate("grow_big", 1, 0.0, 1.0); this->isInvulnerable = 1; this->chrAnimation.setCurrentFrame(9.0); + + PlaySound(this, SE_VOC_KP_DAMAGE_HPDP); } void daCaptainBowser::executeState_Damage() { diff --git a/src/bossFlameThrower.cpp b/src/bossFlameThrower.cpp index 70583fd..3a77621 100644 --- a/src/bossFlameThrower.cpp +++ b/src/bossFlameThrower.cpp @@ -7,69 +7,17 @@ class daKoopaBreath : public dEn_c { int onCreate(); int onExecute(); - int onDelete(); - int onDraw(); - - mHeapAllocator_c allocator; - m3d::mdl_c bodyModel; - - int timer; - char Kaboom; - char direction; - char front; - float ymod; - int lifespan; - u32 cmgr_returnValue; + mEf::es2 effect; static daKoopaBreath *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); - void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); - void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); - - - USING_STATES(daKoopaBreath); - DECLARE_STATE(Straight); - DECLARE_STATE(Kaboom); + void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); }; -CREATE_STATE(daKoopaBreath, Straight); -CREATE_STATE(daKoopaBreath, Kaboom); - - -extern "C" void *PlayWrenchSound(dEn_c *); - - void daKoopaBreath::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { DamagePlayer(this, apThis, apOther); } - -void daKoopaBreath::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { } -bool daKoopaBreath::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { - return false; -} -void daKoopaBreath::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) {} -void daKoopaBreath::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { - SpawnEffect("Wm_ob_cmnboxgrain", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5}); - - PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK); - this->Delete(1); -} -void daKoopaBreath::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther) {} -void daKoopaBreath::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) { - this->_vf220(apOther->owner); - - SpawnEffect("Wm_ob_cmnboxgrain", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5}); - - PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK); - this->Delete(1); -} - +void daKoopaBreath::spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) {} daKoopaBreath *daKoopaBreath::build() { @@ -80,234 +28,43 @@ daKoopaBreath *daKoopaBreath::build() { int daKoopaBreath::onCreate() { - allocator.link(-1, GameHeaps[0], 0, 0x20); - - nw4r::g3d::ResFile rf(getResource("choropoo", "g3d/choropoo.brres")); - bodyModel.setup(rf.GetResMdl("spanner"), &allocator, 0x224, 1, 0); - SetupTextures_Enemy(&bodyModel, 0); - - allocator.unlink(); - - - this->direction = this->settings & 0xF; - this->Kaboom = (this->settings >> 4) & 0xF; - this->front = (this->settings >> 8) & 0xF; - - ActivePhysics::Info HitMeBaby; - - if (this->Kaboom == 0) { - HitMeBaby.xDistToCenter = 0.0; - HitMeBaby.yDistToCenter = 0.0; - HitMeBaby.xDistToEdge = 5.0; - HitMeBaby.yDistToEdge = 5.0; - - this->scale.x = 1.25; - this->scale.y = 1.25; - this->scale.z = 1.25; - } - - else { - HitMeBaby.xDistToCenter = 0.0; - HitMeBaby.yDistToCenter = 0.0; - HitMeBaby.xDistToEdge = 8.0; - HitMeBaby.yDistToEdge = 8.0; + OSReport("Made a fireball"); + ActivePhysics::Info GreatBalls; - this->scale.x = 2.0; - this->scale.y = 2.0; - this->scale.z = 2.0; - } + GreatBalls.xDistToCenter = 0.0; + GreatBalls.yDistToCenter = 18.0; + GreatBalls.xDistToEdge = 38.0; + GreatBalls.yDistToEdge = 38.0; - HitMeBaby.category1 = 0x3; - HitMeBaby.category2 = 0x0; - HitMeBaby.bitfield1 = 0x47; - HitMeBaby.bitfield2 = 0xFFFFFFFF; - HitMeBaby.unkShort1C = 0; - HitMeBaby.callback = &dEn_c::collisionCallback; - - this->aPhysics.initWithStruct(this, &HitMeBaby); + GreatBalls.category1 = 0x3; + GreatBalls.category2 = 0x0; + GreatBalls.bitfield1 = 0x47; + GreatBalls.bitfield2 = 0xFFFFFFFF; + GreatBalls.unkShort1C = 0; + GreatBalls.callback = &dEn_c::collisionCallback; + + this->aPhysics.initWithStruct(this, &GreatBalls); this->aPhysics.addToList(); - - - spriteSomeRectX = 5.0f; - spriteSomeRectY = 5.0f; - _320 = 0.0f; - _324 = 5.0f; - - // These structs tell stupid collider what to collide with - these are from koopa troopa - static const u8 one[16] = {0,0,0,1, 0,0,0xC0,0, 0,0,0x40,0, 0,0,0,0}; - static const u8 two[12] = {0,0,0,0, 0,0,0,0, 0,0,0xC0,0}; - static const u8 three[16] = {0,0,0,1, 0,0,0x60,0, 0,0,0x90,0, 0,0,0x60,0}; - - collMgr.Init(this, one, two, three); - collMgr.execute(); - - cmgr_returnValue = collMgr.CollidedWithTile(); - - - if (this->direction == 0) { // Ground Facing Left - this->pos.x -= 0.0; // -32 to +32 - this->pos.y += 36.0; - this->rot.z = 0x2000; - } - else if (this->direction == 1) { // Ground Facing Right - this->pos.x += 0.0; // +32 to -32 - this->pos.y += 36.0; - this->rot.z = 0xE000; - } - if (this->front == 1) { this->pos.z = -1804.0; } - else { this->pos.z = 3300.0; } - - - if (this->Kaboom) { - doStateChange(&StateID_Kaboom); } - else { - doStateChange(&StateID_Straight); } + speed.x = -2.0; this->onExecute(); return true; } -int daKoopaBreath::onDelete() { - return true; -} - -int daKoopaBreath::onDraw() { - bodyModel.scheduleForDrawing(); - return true; -} - - -void daKoopaBreath::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 daKoopaBreath::onExecute() { - acState.execute(); - updateModelMatrices(); - - return true; -} - - -void daKoopaBreath::beginState_Kaboom() { - float rand = (float)GenerateRandomNumber(10) * 0.4; - - if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards - speed.x = 1.0 + rand; - } - else { // directions 0 spins anti-clockwise, fly leftwards - speed.x = -1.0 - rand; - } - - speed.y = 6.0; -} -void daKoopaBreath::executeState_Kaboom() { - - speed.y = speed.y - 0.01875; - - HandleXSpeed(); - HandleYSpeed(); - doSpriteMovement(); - - cmgr_returnValue = collMgr.CollidedWithTile(); - collMgr.execute(); - - if (collMgr.CollidedWithTile()) { - // hit the ground - PlaySoundAsync(this, SE_BOSS_JR_BOMB_BURST); - - SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75}); - SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.25, 1.25, 1.25}); - this->Delete(1); - } - if (collMgr.bitfield_for_checks & (0x15 << direction)) { - // hit the wall - PlaySoundAsync(this, SE_BOSS_JR_BOMB_BURST); - - if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards - SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0x4000,0}, &(Vec){0.75, 0.75, 0.75}); - SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0x4000,0}, &(Vec){1.25, 1.25, 1.25}); - } - else { // directions 0 spins anti-clockwise, fly leftwards - SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0xE000,0}, &(Vec){0.75, 0.75, 0.75}); - SpawnEffect("Wm_mr_wirehit", 0, &this->pos, &(S16Vec){0,0xE000,0}, &(Vec){1.25, 1.25, 1.25}); - } - - this->Delete(1); - } - - if (this->direction == 1) { // directions 1 spins clockwise, fly rightwards - this->rot.z -= 0x1000; } - else { // directions 0 spins anti-clockwise, fly leftwards - this->rot.z += 0x1000; } - - PlayWrenchSound(this); - -} -void daKoopaBreath::endState_Kaboom() { } - - - -void daKoopaBreath::beginState_Straight() { - float rand = (float)GenerateRandomNumber(10) * 0.4; - - if (this->direction == 0) { // directions 1 spins clockwise, fly rightwards - speed.x = 1.0 + rand; - } - else { // directions 0 spins anti-clockwise, fly leftwards - speed.x = -1.0 - rand; - } - - speed.y = 6.0; -} -void daKoopaBreath::executeState_Straight() { - - speed.y = speed.y - 0.01875; - HandleXSpeed(); - HandleYSpeed(); doSpriteMovement(); - cmgr_returnValue = collMgr.CollidedWithTile(); - collMgr.execute(); + PlaySound(this, SE_BOSS_JR_FIRE_BURNING); - if (collMgr.CollidedWithTile()) { - // hit the ground - PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK); + effect.spawn("Wm_ko_fireattack", 0, &(Vec){pos.x, pos.y, pos.z}, &(S16Vec){0,0,0}, &(Vec){3.0, 3.0, 3.0}); - SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75}); + float rect[] = {0.0, 0.0, 38.0, 38.0}; + int ret = this->outOfZone(this->pos, (float*)&rect, this->currentZoneID); + if(ret) { this->Delete(1); } - if (collMgr.bitfield_for_checks & (0x15 << direction)) { - // hit the wall - PlaySoundAsync(this, SE_BOSS_JR_FLOOR_BREAK); - - SpawnEffect("Wm_en_burst_s", 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){0.75, 0.75, 0.75}); - this->Delete(1); - } - - if (this->direction == 1) { // directions 1 spins clockwise, fly rightwards - this->rot.z -= 0x1000; } - else { // directions 0 spins anti-clockwise, fly leftwards - this->rot.z += 0x1000; } - - PlayWrenchSound(this); + return true; } -void daKoopaBreath::endState_Straight() { } - - - - - -// Wm_en_explosion_smk - - - diff --git a/src/bossKoopaThrow.cpp b/src/bossKoopaThrow.cpp index 19beadd..821a848 100644 --- a/src/bossKoopaThrow.cpp +++ b/src/bossKoopaThrow.cpp @@ -22,10 +22,10 @@ struct TypeInfo { static const TypeInfo types[6] = { {"choropoo", "g3d/choropoo.brres", "spanner", "Wm_en_hit", 0, SE_BOSS_JR_FLOOR_BREAK, 0, 8.0f, 2.0f, 0, 0, 0x1000}, {"choropoo", "g3d/choropoo.brres", "spanner", "Wm_en_burst_s", 0, SE_BOSS_JR_BOMB_BURST, 0, 8.0f, 2.0f, 0, 0, 0x1000}, - {"koopa_clown_bomb", "g3d/koopa_clown_bomb.brres", "koopa_clown_bomb", "Wm_en_burst_s", SE_BOSS_JR_BOMB_BOUND, SE_BOSS_JR_BOMB_BURST, 0, 16.0f, 0.8f, 0x200, 0x800, 0x1000}, + {"koopa_clown_bomb", "g3d/koopa_clown_bomb.brres", "koopa_clown_bomb", "Wm_en_burst_s", SE_EMY_ELCJ_THROW, SE_BOSS_JR_BOMB_BURST, 0, 16.0f, 0.8f, 0x200, 0x800, 0x1000}, {"bros", "g3d/t00.brres", "bros_hammer", "Wm_en_hit", 0, SE_OBJ_HAMMER_HIT_BOTH, SE_EMY_MEGA_BROS_HAMMER, 16.0f, 2.0f, 0, 0, 0x1000}, {"dossun", "g3d/t00.brres", "dossun", "Wm_en_hit", SE_EMY_DOSSUN, SE_EMY_DOSSUN_DEAD, 0, 16.0f, 1.0f, 0x100, 0x100, 0x100}, - {"KoopaShip", "g3d/present.brres", "PresentBox_penguin", "Wm_dm_presentopen",SE_DEMO_OP_PRESENT_THROW_2400f, SE_DEMO_OP_PRESENT_BOX_BURST, 0, 12.0f, 1.0f, 0x20, 0x40, 0x200} + {"KoopaShip", "g3d/present.brres", "PresentBox_penguin", "Wm_dm_presentopen",SE_DEMO_OP_PRESENT_THROW_2400f, SE_DEMO_OP_PRESENT_BOX_BURST, 0, 20.0f, 1.0f, 0x20, 0x40, 0x200} }; @@ -88,7 +88,7 @@ void daKoopaThrow::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther if (Type == 5) { PlaySoundAsync(this, currentInfo->breakSound); SpawnEffect(currentInfo->deathEffect, 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){3.0, 3.0, 3.0}); - dStageActor_c *spawned = CreateActor(EN_HATENA_BALLOON, 0x100, this->pos, 0, 0); + dStageActor_c *spawned = CreateActor(EN_ITEM, 0x20000063, this->pos, 0, 0); spawned->pos.x = this->pos.x; spawned->pos.y = this->pos.y; this->Delete(1); @@ -141,9 +141,7 @@ void daKoopaThrow::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhys daKoopaThrow *daKoopaThrow::build() { - OSReport("Building"); void *buffer = AllocFromGameHeap1(sizeof(daKoopaThrow)); - OSReport("Built"); return new(buffer) daKoopaThrow; } @@ -154,31 +152,20 @@ int daKoopaThrow::onCreate() { this->Type = (this->settings >> 4) & 0xF; this->front = (this->settings >> 8) & 0xF; - OSReport("Type is %d", this->Type); - currentInfo = &types[Type]; - OSReport("Current Info is: %s, %s, %s", currentInfo->arcName, currentInfo->brresName, currentInfo->modelName); - allocator.link(-1, GameHeaps[0], 0, 0x20); - OSReport("Allocated"); - nw4r::g3d::ResFile rf(getResource(currentInfo->arcName, currentInfo->brresName)); - OSReport("Res File Gotten"); bodyModel.setup(rf.GetResMdl(currentInfo->modelName), &allocator, 0x224, 1, 0); - OSReport("Body model setup"); SetupTextures_Enemy(&bodyModel, 0); - OSReport("Textures setup"); allocator.unlink(); - OSReport("Onwards to Physics"); - ActivePhysics::Info KoopaJunk; - KoopaJunk.xDistToCenter = 0.0; + KoopaJunk.xDistToCenter = -currentInfo->size; KoopaJunk.yDistToCenter = 0.0; KoopaJunk.xDistToEdge = currentInfo->size; KoopaJunk.yDistToEdge = currentInfo->size; @@ -266,7 +253,6 @@ int daKoopaThrow::onExecute() { float rect[] = {this->_320, this->_324, this->spriteSomeRectX, this->spriteSomeRectY}; int ret = this->outOfZone(this->pos, (float*)&rect, this->currentZoneID); if(ret) { - OSReport("Deleting"); this->Delete(1); } @@ -295,8 +281,8 @@ void daKoopaThrow::executeState_Straight() { HandleYSpeed(); doSpriteMovement(); - cmgr_returnValue = collMgr.CollidedWithTile(); - collMgr.execute(); + // cmgr_returnValue = collMgr.CollidedWithTile(); + // collMgr.execute(); // if (collMgr.CollidedWithTile() || (collMgr.bitfield_for_checks & (0x15 << direction))) { // // hit the ground or wall @@ -324,17 +310,6 @@ void daKoopaThrow::executeState_Straight() { PlaySound(this, currentInfo->flySound); } - if (Type == 5) { - if (this->speed.y < 0.0) { - PlaySoundAsync(this, currentInfo->breakSound); - SpawnEffect(currentInfo->deathEffect, 0, &this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); - dStageActor_c *spawned = CreateActor(EN_HATENA_BALLOON, 0x100, this->pos, 0, 0); - spawned->pos.x = this->pos.x; - spawned->pos.y = this->pos.y; - this->Delete(1); - } - } - } void daKoopaThrow::endState_Straight() { } diff --git a/src/bossPlayerClown.cpp b/src/bossPlayerClown.cpp new file mode 100644 index 0000000..afa8c3e --- /dev/null +++ b/src/bossPlayerClown.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include "boss.h" + + +#define CLOWN_MODEL(clown) ((m3d::mdl_c*)( ((u32)(clown)) + 0xFD0 )) + +dEn_c *newClownCtor(dEn_c *clown); +void newClownDtor(dEn_c *clown, u32 willDelete); + +void CConDraw(dEn_c *clown) { + // setup matrices + CLOWN_MODEL(clown)->scheduleForDrawing(); + + // run normal clown function +} + +void CConExecute(dEn_c *clown) { + // run normal execute +} + +void CCafterCreate(dEn_c *clown) { + clown->scale.x = clown->scale.x * 1.25; + clown->scale.y = clown->scale.y * 1.25; + clown->scale.z = clown->scale.z * 1.25; + + // setup the model + + // dEn_c::afterCreate(1); +} + +void CConExecuteMove(dEn_c *clown) { + // run normal move + + // check for wiimote button presses + + // spawn effect and attack if there are any +} + + +extern "C" m3d::mdl_c *__ct__Q23m3d5mdl_cFv(m3d::mdl_c *mdl); +extern "C" dEn_c *__ct__20daJrClownForPlayer_cFv(dEn_c *clown); + +dEn_c *newClownCtor(dEn_c *clown) { + __ct__20daJrClownForPlayer_cFv(clown); + __ct__Q23m3d5mdl_cFv(CLOWN_MODEL(clown)); + return clown; +} + + +extern "C" void __dt__Q23m3d5mdl_cFv(m3d::mdl_c *mdl, u32 willDelete); +extern "C" void __dt__20daJrClownForPlayer_cFv(dEn_c *mdl, u32 willDelete); + +void newClownDtor(dEn_c *clown, u32 willDelete) { + __dt__Q23m3d5mdl_cFv(CLOWN_MODEL(clown), 0xFFFFFFFF); + __dt__20daJrClownForPlayer_cFv(clown, willDelete); +} diff --git a/src/challengeStar.cpp b/src/challengeStar.cpp new file mode 100644 index 0000000..fc710d4 --- /dev/null +++ b/src/challengeStar.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include + + +extern "C" void *PlaySound(dEn_c *, int soundID); +extern "C" bool SpawnEffect(const char*, int, Vec*, S16Vec*, Vec*); + +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 collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); + +}; + + +void dChallengeStar::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + PlaySound(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 == 50) { + GlobalStarsCollected = 0; + EventTable->events = EventTable->events | this->eventFlag; + } + + this->Delete(this->_390); +} + +void dChallengeStar::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } +void dChallengeStar::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { this->playerCollision(apThis, apOther); } + + +dChallengeStar *dChallengeStar::build() { + void *buffer = AllocFromGameHeap1(sizeof(dChallengeStar)); + return new(buffer) dChallengeStar; +} + + +int dChallengeStar::onCreate() { + + OSReport("Creating a star collectable\n"); + allocator.link(-1, GameHeaps[0], 0, 0x20); + + nw4r::g3d::ResFile rf(getResource("I_star", "g3d/I_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 = -3.0; + HitMeBaby.xDistToEdge = 4.0; + HitMeBaby.yDistToEdge = 4.0; + HitMeBaby.category1 = 0x5; + HitMeBaby.category2 = 0x0; + HitMeBaby.bitfield1 = 0x4F; + HitMeBaby.bitfield2 = 0xFFFFFFFF; + 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.5; + this->scale.y = 0.5; + this->scale.z = 0.5; + + 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){1.0, 1.0, 1.0}); + this->rot.y += 0x200; + return true; +} + diff --git a/src/growup.s b/src/growup.s index 0b284ce..6e78e52 100755 --- a/src/growup.s +++ b/src/growup.s @@ -1291,6 +1291,10 @@ GlobalSpriteSpeed: GlobalRiderSize: .float 1.0 +.global GlobalStarsCollected +GlobalStarsCollected: + .int 0 + .global SizerOn SizerOn: .byte 0 diff --git a/src/levelspecial.cpp b/src/levelspecial.cpp index b5447e9..f57e14a 100644 --- a/src/levelspecial.cpp +++ b/src/levelspecial.cpp @@ -26,8 +26,8 @@ struct EventTable_t { extern EventTable_t *EventTable; -// extern u16 TimeStopFlag; -// extern u32 TimerBranch; +extern u16 TimeStopFlag; +extern u32 TimerBranch; extern u32 AlwaysDrawFlag; extern u32 AlwaysDrawBranch; @@ -62,7 +62,7 @@ fBase_c *FindActorByID(u32 id); bool ResetAfterLevel(void) { // TimeStopFlag = 0; - // TimerBranch = 0x3403FFA4; + TimerBranch = 0x3403FFA4; MarioDescentRate = -4; MarioJumpMax = 3.628; MarioJumpArc = 2.5; @@ -120,9 +120,9 @@ void LevelSpecial_Update(LevelSpecial *self) { // TimeStopFlag = self->effect * 0x100; // break; - // case 2: // Stop Timer - // TimerBranch = 0x7C601B78; - // break; + case 2: // Stop Timer + TimerBranch = 0x7C601B78; + break; case 3: // Mario Gravity @@ -262,9 +262,9 @@ void LevelSpecial_Update(LevelSpecial *self) { // TimeStopFlag = 0; // break; - // case 2: // Stop Timer - // TimerBranch = 0x3403FFA4; - // break; + case 2: // Stop Timer + TimerBranch = 0x3403FFA4; + break; case 3: // Mario Gravity diff --git a/src/makeYourOwnModelSprite.cpp b/src/makeYourOwnModelSprite.cpp new file mode 100644 index 0000000..d607f78 --- /dev/null +++ b/src/makeYourOwnModelSprite.cpp @@ -0,0 +1,300 @@ +#include +#include +#include + + +////////////////////////////////////////////////////////// +// +// How it works: +// +// 1) Skip down to line 70 - read the comments along the way if you like +// 2) Change the stuff inside " " to be what you want. +// 3) Copy paste an entire 'case' section of code, and change the number to change the setting it uses +// 4) give it back to Tempus to compile in +// + + + +// This is the class allocator, you don't need to touch this +class dMakeYourOwn : public dStageActor_c { + // Let's give ourselves a few functions + int onCreate(); + int onDelete(); + int onExecute(); + int onDraw(); + + static dMakeYourOwn *build(); + + // And a model and an anmChr + mHeapAllocator_c allocator; + m3d::mdl_c bodyModel; + nw4r::g3d::ResFile resFile; + m3d::anmChr_c chrAnimation; + + nw4r::g3d::ResMdl mdl; + + // Some variables to use + int model; + char isAnimating; + float size; + + void setupAnim(const char* name, float rate); + void setupModel(const char* arcName, const char* brresName, const char* mdlName); +}; + +// This sets up how much space we have in memory +dMakeYourOwn *dMakeYourOwn::build() { + void *buffer = AllocFromGameHeap1(sizeof(dMakeYourOwn)); + return new(buffer) dMakeYourOwn; +} + + +// Saves space when we do it like this +void dMakeYourOwn::setupAnim(const char* name, float rate) { + if (isAnimating) { + nw4r::g3d::ResAnmChr anmChr; + + anmChr = this->resFile.GetResAnmChr(name); + this->chrAnimation.setup(this->mdl, anmChr, &this->allocator, 0); + this->chrAnimation.bind(&this->bodyModel, anmChr, 1); + this->bodyModel.bindAnim(&this->chrAnimation, 0.0); + this->chrAnimation.setUpdateRate(rate); + } +} + +void dMakeYourOwn::setupModel(const char* arcName, const char* brresName, const char* mdlName) { + this->resFile.data = getResource(arcName, brresName); + this->mdl = this->resFile.GetResMdl(mdlName); + + bodyModel.setup(mdl, &allocator, 0x224, 1, 0); +} + + +// This gets run when the sprite spawns! +int dMakeYourOwn::onCreate() { + + // Settings for your sprite! + + this->model = this->settings & 0xFF; // Sets nubble 12 to choose the model you want + this->isAnimating = this->settings & 0x100; // Sets nybble 11 to a checkbox for whether or not the model has an anmChr to use + this->size = (float)((this->settings >> 24) & 0xFF) / 4.0; // Sets nybbles 5-6 to size. Size equals value / 4. + + // Setup the models inside an allocator + allocator.link(-1, GameHeaps[0], 0, 0x20); + + + // Makes the code shorter and clearer to put these up here + + // A switch case, add extra models in here + switch (this->model) { + + // COPY FROM BELOW HERE + + case 0: // If nyb 12 is 0, it'll load this model + + setupModel("arrow", "g3d/bre0.brres", "ballon_red"); // arc name (no .arc), brres name, model name + SetupTextures_Item(&bodyModel, 0); + this->pos.z = -3300.0; + + setupAnim("anim00", 1.0); // AnmChr name, animation speed + + break; // ends the case + + // TO HERE + // That is a 'block' of case code, which will run depending on your sprite setting + + case 1: // If nyb 12 is 1, it'll load this model. Add more cases for each model you'd like! + + setupModel("arrow", "g3d/bre1.brres", "ballon_green"); // arc name (no .arc), brres name, model name + SetupTextures_Item(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim01", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 2: // If nyb 12 is 2, it'll load this model + + setupModel("arrow", "g3d/bre2.brres", "mario_ts"); // arc name (no .arc), brres name, model name + SetupTextures_Player(&bodyModel, 0); + this->pos.z = -3000.0; + + setupAnim("anim02", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 3: // If nyb 12 is 0, it'll load this model + + setupModel("arrow", "g3d/bre3.brres", "peach_ts"); // arc name (no .arc), brres name, model name + SetupTextures_Enemy(&bodyModel, 0); + this->pos.z = -3000.0; + + setupAnim("anim03", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 4: // If nyb 12 is 0, it'll load this model + + setupModel("arrow", "g3d/bre4.brres", "luigi_ts"); // arc name (no .arc), brres name, model name + SetupTextures_Player(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim04", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 5: // If nyb 12 is 0, it'll load this model + + setupModel("arrow", "g3d/bre5.brres", "toady_ts"); // arc name (no .arc), brres name, model name + SetupTextures_Player(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim05", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 6: // If nyb 12 is 0, it'll load this model + + setupModel("arrow", "g3d/bre6.brres", "toadb_ts"); // arc name (no .arc), brres name, model name + SetupTextures_Player(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim06", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 7: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre7.brres", "clowncar_mario"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim07", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 8: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre8.brres", "clowncar_luigi"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim08", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 9: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre9.brres", "clowncar_toady"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim09", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 10: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre10.brres", "clowncar_toadb"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim10", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 11: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre11.brres", "clowncar_peach"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3300.0; + + setupAnim("anim11", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 12: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre12.brres", "mario_end"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim12", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 13: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre13.brres", "luigi_end"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim13", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 14: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre14.brres", "toady_end"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim14", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 15: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre15.brres", "toadb_end"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim15", 1.0); // AnmChr name, animation speed + break; // ends the case + + case 16: // If nyb 12 is 0, it'll load this model + + setupModel("block_arrow", "g3d/bre16.brres", "peach_end"); // arc name (no .arc), brres name, model name + SetupTextures_MapObj(&bodyModel, 0); + this->pos.z = 3000.0; + + setupAnim("anim16", 1.0); // AnmChr name, animation speed + break; // ends the case + + // COPY the entire case here, and then change the number + // + //case 2: + //case 3: + //etc, etc... + } + + allocator.unlink(); + + if (size == 0.0) { // If the person has the size nybble at zero, make it normal sized + this->scale = (Vec){1.0,1.0,1.0}; + } + else { // Else, use our size + this->scale = (Vec){size,size,size}; + } + + this->onExecute(); + return true; +} + + +// YOU'RE DONE, no need to do anything below here. + + +int dMakeYourOwn::onDelete() { + return true; +} + +int dMakeYourOwn::onExecute() { + if (isAnimating) { + bodyModel._vf1C(); // Advances the animation one update + + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); // Resets the animation when it's done + } + } + + return true; +} + +int dMakeYourOwn::onDraw() { + matrix.translation(pos.x, pos.y, pos.z - 6500.0); // Set where to draw the model : -5500.0 is the official behind layer 2, while 5500.0 is in front of layer 0. + matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); // Set how to rotate the drawn model + + bodyModel.setDrawMatrix(matrix); // Apply matrix + bodyModel.setScale(&scale); // Apply scale + bodyModel.calcWorld(false); // Do some shit + + bodyModel.scheduleForDrawing(); // Add it to the draw list for the game + return true; +} -- cgit v1.2.3