summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bossFuzzyBear.cpp77
-rwxr-xr-xsrc/meteor.cpp118
2 files changed, 146 insertions, 49 deletions
diff --git a/src/bossFuzzyBear.cpp b/src/bossFuzzyBear.cpp
index f22cf6c..b13955c 100644
--- a/src/bossFuzzyBear.cpp
+++ b/src/bossFuzzyBear.cpp
@@ -7,15 +7,6 @@
#include "player.h"
-class daKameckDemo : public dEn_c {
-
-public:
- USING_STATES(daKameckDemo);
- REF_NINTENDO_STATE(DemoWait);
- REF_NINTENDO_STATE(DemoSt);
- REF_NINTENDO_STATE(DemoSt2);
-};
-
class daFuzzyBear_c : public dEn_c {
int onCreate();
int onDelete();
@@ -83,11 +74,15 @@ extern "C" void *StopSound(int soundID);
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(daFuzzyBear_c *, Vec pos);
-extern "C" dStageActor_c *GetSpecificPlayerActor(int number);
+extern "C" dStageActor_c *GetSpecificPlayerActor(int num);
extern "C" void *StopBGMMusic();
extern "C" void *StartBGMMusic();
+extern "C" void *MakeMarioEnterDemoMode();
+extern "C" void *MakeMarioExitDemoMode();
+extern "C" void *UpdateGameMgr();
+
CREATE_STATE(daFuzzyBear_c, Grow);
CREATE_STATE(daFuzzyBear_c, Bounce);
@@ -311,33 +306,6 @@ void daFuzzyBear_c::updateModelMatrices() {
}
-// How to Start the Level, by Tempus
-//
-// Turn off the BGM (0x808B1670 ?)
-// Store 1 to PointerToStage32C @ 0x15C - This should freeze Mario
-//
-// Spawn sprite 0x1E as a child actor - You'll need to tweak the position just right!
-// It has three states - DemoWait, DemoSt, DemoSt2 - You'll need to trigger them by setting them with the REF_NINTENDO_STATE macro
-// Make sure to get the timing right!
-// You might also want to use RemoveUnwantedFireballsAndOtherMarioShit. I dunno.
-//
-// Store 0 to PointerToStage32C @ 0x15C - This should unfreeze Mario
-// Start The BGM again (0x808B1680 ?)
-//
-//
-// How to end the Level, by Tempus
-//
-// Turn off the BGM (0x808B1670 ?)
-//
-// Store 1 to PointerToStage32C @ 0x15C - This should freeze Mario
-// Do the necessary shrinking actions and effect junk
-// Do the Mario animation and play the victory sound?
-// End the stage with WORLD_MAP, 0, 0, 4
-//
-//
-//
-
-
// Grow State
void daFuzzyBear_c::beginState_Grow() {
@@ -347,9 +315,16 @@ void daFuzzyBear_c::beginState_Grow() {
OSReport("Stopping the Music.\n");
StopBGMMusic();
- OSReport("Setting the boss flag.\n");
- // dStage32C_c::instance->freezeMarioBossFlag = 1;
-// Store 1 to PointerToStage32C @ 0x15C - This should freeze Mario - But it doesn't. Must do something though, right?
+ OSReport("Setting the boss flag. %p\n", dStage32C_c::instance);
+ OSReport("Boss flag is; %d\n", dStage32C_c::instance->freezeMarioBossFlag);
+ dStage32C_c::instance->freezeMarioBossFlag = 1;
+
+ MakeMarioEnterDemoMode();
+
+ OSReport("WLClass Flags are; %d and %d\n", WLClass::instance->_4, WLClass::instance->_8);
+
+ WLClass::instance->_4 = 4;
+ WLClass::instance->_8 = 0;
OSReport("Creating the Vecs.\n");
Vec pos = (Vec){this->pos.x - 124.0, this->pos.y + 104.0, 3564.0};
@@ -415,11 +390,11 @@ void daFuzzyBear_c::endState_Grow() {
this->Baseline = this->pos.y;
OSReport("Ending boss flag.\n");
- // dStage32C_c::instance->freezeMarioBossFlag = 0;
+ dStage32C_c::instance->freezeMarioBossFlag = 0;
+ WLClass::instance->_8 = 1;
- // Store 0 to PointerToStage32C @ 0x15C - This should unfreeze Mario
+ MakeMarioExitDemoMode();
- // PlaySound(this, STRM_BGM_TORIDE_BOSS);
OSReport("Ending BGMusic.\n");
StartBGMMusic();
@@ -798,11 +773,16 @@ void daFuzzyBear_c::endState_Wait() { }
void daFuzzyBear_c::beginState_Outro() {
+ MakeMarioEnterDemoMode();
+
+ WLClass::instance->_4 = 5;
+ WLClass::instance->_8 = 0;
+
this->removeMyActivePhysics();
this->timer = 0;
StopBGMMusic();
- // Store 1 to PointerToStage32C @ 0x15C - This should freeze Mario
- // dStage32C_c::instance->freezeMarioBossFlag = 1;
+
+ dStage32C_c::instance->freezeMarioBossFlag = 1;
}
void daFuzzyBear_c::executeState_Outro() {
@@ -814,6 +794,8 @@ void daFuzzyBear_c::executeState_Outro() {
if (this->timer == 60) {
+ UpdateGameMgr();
+
if (GetSpecificPlayerActor(0) != 0) {
PlaySound(this, SE_VOC_MA_CLEAR_BOSS);
// Send PlBase into DemoGoal State here, kthxbai
@@ -867,11 +849,8 @@ void daFuzzyBear_c::executeState_Outro() {
this->timer = 0;
PlaySound(this, STRM_BGM_SHIRO_BOSS_CLEAR);
-
- this->timer += 1;
+ MakeMarioEnterDemoMode();
}
-
-
}
void daFuzzyBear_c::endState_Outro() { }
diff --git a/src/meteor.cpp b/src/meteor.cpp
new file mode 100755
index 0000000..85b1358
--- /dev/null
+++ b/src/meteor.cpp
@@ -0,0 +1,118 @@
+#include <common.h>
+#include <game.h>
+#include <g3dhax.h>
+
+class dMeteor : public dStageActor_c {
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ static dMeteor *build();
+
+ mHeapAllocator_c allocator;
+ m3d::mdl_c bodyModel;
+ nw4r::g3d::ResFile resFile;
+
+ int timer;
+ int spinSpeed;
+ char spinDir;
+
+ Physics MakeItRound;
+
+ void updateModelMatrices();
+};
+
+dMeteor *dMeteor::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dMeteor));
+ return new(buffer) dMeteor;
+}
+
+
+// extern "C" dStageActor_c *GetSpecificPlayerActor(int num);
+// extern "C" void *modifyPlayerPropertiesWithRollingObject(dStageActor_c *Player, float _52C);
+extern "C" void *spinningPhysicsCallback();
+
+
+int dMeteor::onCreate() {
+
+ // Setup Model
+ allocator.link(-1, GameHeaps[0], 0, 0x20);
+
+ this->resFile.data = getResource("kazan_rock", "g3d/kazan_rock.brres");
+ nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("kazan_rock");
+ bodyModel.setup(mdl, &allocator, 0x224, 1, 0);
+ SetupTextures_Enemy(&bodyModel, 0);
+
+ allocator.unlink();
+
+
+ // Retrieve Scale and set it up
+ float sca = (float)((this->settings >> 8) & 0xFF);
+ sca = (sca/5.0) + 0.2;
+
+ this->scale = (Vec){sca,sca,sca};
+
+ // Other settings
+ this->spinDir = this->settings & 0x1;
+ this->spinSpeed = ((this->settings >> 16) & 0xFF) * 4;
+
+ // Setup Physics
+ MakeItRound.baseSetup(this, &spinningPhysicsCallback, 0, 0, 1, 1);
+
+ MakeItRound.x = 0.0;
+ MakeItRound.y = 0.0;
+
+ MakeItRound.diameter = 160.0 * sca;
+ MakeItRound.isRound = 1;
+
+ MakeItRound.update();
+
+ MakeItRound.addToList();
+
+ this->pos.z = -3458.0;
+
+ this->onExecute();
+ return true;
+}
+
+int dMeteor::onDelete() {
+ return true;
+}
+
+int dMeteor::onExecute() {
+
+ if (spinDir == 0) { rot.z -= spinSpeed; }
+ else { rot.z += spinSpeed; }
+
+ MakeItRound.update();
+ updateModelMatrices();
+
+ // 518 == opposite of direction
+
+ // for (i=0; i<4; i++) {
+ // dStageActor_c *player = GetSpecificPlayerActor(i);
+ // modifyPlayerPropertiesWithRollingObject(player, );
+ // }
+
+ return true;
+}
+
+int dMeteor::onDraw() {
+
+ bodyModel.scheduleForDrawing();
+ bodyModel._vf1C();
+ return true;
+}
+
+void dMeteor::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);
+}
+
+