diff options
author | Colin Noga <Tempus@chronometry.ca> | 2012-03-03 15:41:03 -0600 |
---|---|---|
committer | Colin Noga <Tempus@chronometry.ca> | 2012-03-03 15:41:03 -0600 |
commit | b8b1efc008e5ca2c455b8ab225b5d005449de851 (patch) | |
tree | 4f9a65ccf18a8b38bbe7144b3de34deed7e3dfb9 /src/bossThwompaDomp.cpp | |
parent | 5dece655469940b4752cb0dc81328c8171e2b5e7 (diff) | |
download | kamek-b8b1efc008e5ca2c455b8ab225b5d005449de851.tar.gz kamek-b8b1efc008e5ca2c455b8ab225b5d005449de851.zip |
Lots of boss fixes, working on thwomp - linking error
Diffstat (limited to '')
-rw-r--r-- | src/bossThwompaDomp.cpp | 703 |
1 files changed, 388 insertions, 315 deletions
diff --git a/src/bossThwompaDomp.cpp b/src/bossThwompaDomp.cpp index e84867d..75aafdd 100644 --- a/src/bossThwompaDomp.cpp +++ b/src/bossThwompaDomp.cpp @@ -2,50 +2,74 @@ #include <game.h> #include <g3dhax.h> #include <sfx.h> +#include <stage.h> +#include "effects.h" -#include "daEnDosun_c.h" -#if 0 -/* called from _vf228 */ -/* handles overall scale */ -void sub_8009ea50( _464_struct* data ) { - u32 ctr = data->ctr; // _0x14 - dEn_c* en = data->en; // _0x18 +extern "C" int posIsInZone(Vec,float*,float*,u8 zone); +extern "C" void* ScreenPositionClass; +extern "C" void ShakeScreen(void*,int,int,int,int); // (ScreenPositionClass, some other ints - set the second one to 1 to shake it) +extern "C" int SpawnThwompEffects(dEn_c *); - if(!ctr) { - en->scale.x = en->scale.y = en->scale.z = 1.0; - data->x = data->y = data->z = data->_0xC = 1.0 - return; - } - data->ctr--; - - /*FIXME continue */ -} -#endif - - -//FIXME find if needed -extern "C" int s_800b56e0(Vec,float*,float*,u8 zone); -//FIXME -extern "C" void* unk_8042A008; -extern "C" void UnknownBullshit(void*,int,int,int,int); -//FIXME extern "C" void* SoundRelatedClass; extern "C" Vec ConvertStagePositionIntoScreenPosition__Maybe(Vec); extern "C" void AnotherSoundRelatedFunction(void*,SFX,Vec,int); -#define OLD 0 -#define STATES_NEEDED 1 -#define SETTINGS1CHANGE 1 -class daEnMegaDosun_c : public daEnDosun_c { - int onCreate(); // overload for mega +extern "C" void *PlaySound(dEn_c *, int soundID); +extern "C" void *PlaySoundAsync(dEn_c *, int soundID); +extern "C" dStageActor_c *GetSpecificPlayerActor(int number); + +extern "C" void *StopBGMMusic(); +extern "C" void *StartBGMMusic(); + +extern "C" void *MakeMarioEnterDemoMode(); +extern "C" void *MakeMarioExitDemoMode(); +extern "C" void *UpdateGameMgr(); + + +class daEnMegaDosun_c : public dEn_c { + int onCreate(); int onExecute(); + int onDraw(); + static daEnMegaDosun_c *build(); - //int checkZoneBoundaries(int); + mHeapAllocator_c allocator; // _524 + + nw4r::g3d::ResFile resFile; // _540 + m3d::mdl_c bodyModel; // _544 + m3d::anmVis_c anmVis; // _584 + + u32 collision_struct[4]; // _5BC + float shakePosXoffset; // _5CC shakePosXoffset + u16 puruMoveCounter; // _5D8 + u16 shakeIndex; // _5DA 0=shake,1=normal + u32 countdownTimer; // _5DC + + int timer; + char notFalling; + char dying; + float leftBuffer; + float rightBuffer; + float topBuffer; + + dEn_c *Kameck; + + void setupBodyModel(); + void updateModelMatrices(); + + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); + + void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); + bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat7_WMWaggleWaterYoshi(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 collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther); -#if STATES_NEEDED - //FIXME USING_STATES(daEnMegaDosun_c); DECLARE_STATE(UpWait); DECLARE_STATE(DownMoveWait); @@ -54,10 +78,10 @@ class daEnMegaDosun_c : public daEnDosun_c { DECLARE_STATE(DownMove); DECLARE_STATE(DownWait); DECLARE_STATE(UpMove); -#endif + DECLARE_STATE(Grow); + DECLARE_STATE(Outro); }; -#if STATES_NEEDED CREATE_STATE(daEnMegaDosun_c, UpWait); CREATE_STATE(daEnMegaDosun_c, DownMoveWait); CREATE_STATE(daEnMegaDosun_c, PuruMove); @@ -65,25 +89,35 @@ CREATE_STATE(daEnMegaDosun_c, DownMoveKameck); CREATE_STATE(daEnMegaDosun_c, DownMove); CREATE_STATE(daEnMegaDosun_c, DownWait); CREATE_STATE(daEnMegaDosun_c, UpMove); -#endif +CREATE_STATE(daEnMegaDosun_c, Grow); +CREATE_STATE(daEnMegaDosun_c, Outro); daEnMegaDosun_c *daEnMegaDosun_c::build() { - OSReport("Building MegaThwomp\n"); void *buffer = AllocFromGameHeap1(sizeof(daEnMegaDosun_c)); return new(buffer) daEnMegaDosun_c; } -#if 1 -//FIXME stops halfway up +void daEnMegaDosun_c::setupBodyModel() { + allocator.link(-1, GameHeaps[0], 0, 0x20); + + this->resFile.data = getResource("dossun", "g3d/dossun.brres"); + nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("dossun_big"); + bodyModel.setup(mdl, &allocator, 0x224, 1, 0); + SetupTextures_Enemy(&bodyModel, 0); + + nw4r::g3d::ResAnmVis anmRes = this->resFile.GetResAnmVis("dossun_big"); + this->anmVis.setup(mdl, anmRes, &this->allocator, 0); + this->anmVis.bind(&bodyModel, anmRes, 1); + + allocator.unlink(); +} + int daEnMegaDosun_c::onCreate() { OSReport("daEnMegaDosun::onCreate()\n"); - this->bigOrSmall = 1; // 0=small,1=big,2=mega - - this->setupBodyModel(); // add this for linking/rename + this->setupBodyModel(); this->_36D = 0; // byte - this->holdsFromSettings = this->settings & 0xf; //0=normal,1=??,2=fall this->frzMgr.setSomething(1,1,1); //@0x809f5c5c @@ -95,15 +129,8 @@ int daEnMegaDosun_c::onCreate() { this->collision_struct[2] = 0x0001F000; this->collision_struct[3] = 0x00005000; - /* - //0x80ACF990 + 0x8C = 80acfa1C - 0.0,41.0,36.0,38.0, - 0x03, 0x00, 0x0000,0x0000004F,0x0000820E,0x0100,0x0000 - dEn_c::collisionCallback (0x80095950) - */ ActivePhysics::Info hm; hm.xDistToCenter = 0.0; - //FIXME find the missing link hm.yDistToCenter = 41.0; hm.xDistToEdge = 36.0; hm.yDistToEdge = 38.0; @@ -113,14 +140,8 @@ int daEnMegaDosun_c::onCreate() { hm.bitfield2 = 0x0000820E; hm.unkShort1C = 0x0100; hm.callback = &dEn_c::collisionCallback; - OSReport("this->aPhysiscs.initWithStruct(this,&hm);\n"); this->aPhysics.initWithStruct(this, &hm); - /* 0x00000001,0xfffe1000,0x0001f000,0x00055000, - * 0.0,20.0,16.0,19.0 - * 0x03000000,0x0000004f,0x0000820e,0x01000000, - * dEn_c::collisionCallback - */ //u8 s3[] = {0,0,0,1,0xff,0xfe,0x10,0,0,1,0xf0,0,0,5,0x50,0}; u8 s3[] = {0,0,0,1,0xff,0xfe,0x10,0,0,1,0xf0,0,0xff,0xfe,0x10,0}; OSReport("this->collMgr.Init(this,(u8*)&this->collision_struct,(u8*)&s3,0);\n"); @@ -145,314 +166,366 @@ int daEnMegaDosun_c::onCreate() { this->rot.x = 0; this->rot.y = 0; this->rot.z = 0; + this->notFalling = 0; + this->direction = 0; + this->countdownTimer = 0; - OSReport("this->doStateChange(FOO): %d\n", this->holdsFromSettings); - // check settings bit - if(this->holdsFromSettings == 2) { - this->doStateChange(&StateID_DownMove_Kameck); - }else{ - this->doStateChange(&StateID_UpWait); - } + // Measured in half tiles + this->leftBuffer = this->pos.x - ((float)((this->settings >> 24) & 0xFF) * 8.0); //nyb 5-6 LEFT + this->rightBuffer = this->pos.x + ((float)((this->settings >> 16) & 0xFF) * 8.0); //nyb 7-8 RIGHT + this->topBuffer = this->pos.y + ((float)((this->settings >> 8) & 0xFF) * 8.0); //nyb 9-10 TOP + + + this->doStateChange(&StateID_Grow); return 1; } -#endif + int daEnMegaDosun_c::onExecute() { acState.execute(); - /* - float tempRect[4] = {this->_320,this->_324,0.5*this->spriteSomeRectX,0.5*this->spriteSomeRectY}; - int foo = this->outOfZone(this->pos, tempRect, this->currentZoneID); - //float tempRect2[4] = {this->_338, this->_33C, this->_340, this->_344}; - //OSReport("s_800b56e0()\n"); - //int bar = s_800b56e0(this->pos, tempRect, tempRect2, this->currentZoneID); - //OSReport("foo: %d, bar: %d\n", foo, bar); - if(foo) { - OSReport("this->outOfZone(%d) : %d\n", this->currentZoneID, foo); - OSReport("daEnMegaDosun_c has left the building\n"); - this->Delete(this->_390); - //FIXME change to do outro when leaving screen - }else{ - OSReport("this->outOfZone(%d) : %d\n", this->currentZoneID, foo); - } - */ int ret = this->checkZoneBoundaries(0); if(ret) { OSReport("daEnMegaDosun_c has left the building\n"); + doStateChange(&StateID_Outro); } return 1; } -#if STATES_NEEDED -//FIXME add sideways moving -//StateID_UpWait -void daEnMegaDosun_c::beginState_UpWait() { - OSReport("beginState_UpWait()\n"); - this->countdownTimer = 0; - if(!this->bigOrSmall) - return; - this->collision_struct[0] = 0x11804101; -} -void daEnMegaDosun_c::executeState_UpWait() { - OSReport("executeState_UpWait()\n"); - if(this->countdownTimer != 0) { - this->countdownTimer--; - return; - } - - //FIXME need megasized - also needs to be less leeway - float _array[] = { 48.0, 80.0 }; // small, big - //CheckIfPlayerBelow(xDelta, yDelta); - //if(this->CheckIfPlayerBelow(80.0, 256.0)) { - if(this->CheckIfPlayerBelow(40.0, 256.0)) { - this->doStateChange(&StateID_DownMoveWait); - this->speed.y = 0.0; - } -} -void daEnMegaDosun_c::endState_UpWait() { - OSReport("endState_UpWait()\n"); - return; -} -//StateID_DownMoveWait -void daEnMegaDosun_c::beginState_DownMoveWait() { - OSReport("beginState_DownMoveWait()\n"); - this->anmVis.playState = 1; - this->bodyModel.bindAnim(&this->anmVis, 0.5); -} -void daEnMegaDosun_c::executeState_DownMoveWait() { - OSReport("executeState_DownMoveWait()\n"); - if(this->anmVis.isAnimationDone()) - this->doStateChange(&StateID_PuruMove); - this->anmVis.process(); -} -void daEnMegaDosun_c::endState_DownMoveWait() { - OSReport("endState_DownMoveWait()\n"); - return; +int daEnMegaDosun_c::onDraw() { + bodyModel.scheduleForDrawing(); + return true; } -//StateID_PuruMove -void daEnMegaDosun_c::beginState_PuruMove() { - OSReport("beginState_PuruMove()\n"); - this->puruMoveCounter = 8; - this->shakeIndex = 0; -} -void daEnMegaDosun_c::executeState_PuruMove() { - OSReport("executeState_PuruMove()\n"); - if(this->puruMoveCounter == 0) { - this->shakePosXoffset = 0.0; - this->doStateChange(&StateID_DownMove); - return; - } - this->puruMoveCounter--; - if(this->puruMoveCounter & 2 == 0) - return; +void daEnMegaDosun_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); - float _array[] = {2.0, 0.0}; - this->shakeIndex ^= 1; - this->shakePosXoffset = _array[this->shakeIndex]; -} -void daEnMegaDosun_c::endState_PuruMove() { - OSReport("endState_PuruMove()\n"); - return; + bodyModel.setDrawMatrix(matrix); + bodyModel.setScale(&scale); + bodyModel.calcWorld(false); } -//StateID_DownMoveKameck -void daEnMegaDosun_c::beginState_DownMoveKameck() { - OSReport("beginState_DownMoveKameck()\n"); - this->anmVis.playState = 1; - this->bodyModel.bindAnim(&this->anmVis, 0.5); -} -void daEnMegaDosun_c::executeState_DownMoveKameck() { - OSReport("executeState_DownMoveKameck()\n"); - if(this->anmVis.isAnimationDone()) - this->doStateChange(&StateID_DownMove); - this->anmVis.process(); -} -void daEnMegaDosun_c::endState_DownMoveKameck() { - OSReport("endState_DownMoveKameck()\n"); - return; -} -//StateID_DownMove -void daEnMegaDosun_c::beginState_DownMove() { - OSReport("beginState_DownMove()\n"); - this->speed.y = 0.0; -} -void daEnMegaDosun_c::executeState_DownMove() { - OSReport("executeState_DownMove()\n"); - this->HandleYSpeed(); - this->UpdateObjectPosBasedOnSpeedValuesReal(); - - //FIXME what do I do? - bottom detection - int ret = this->collMgr.execute(); - OSReport("s_80072BC0(): %08x\n", ret); - if(!ret) - return; +// Grow State -#if SETTINGS1CHANGE - if((this->holdsFromSettings == 1) && (ret & 0x8000)) { - OSReport("this->speed.y = 0.0;\n"); - this->speed.y = 0.0; - } + void daEnMegaDosun_c::beginState_Grow() { + this->scale = (Vec){0.5, 0.5, 0.5}; - if(this->holdsFromSettings == 2) { - OSReport("ret |= 0x400000\n"); - ret |= 0x400000; - } -#else - if(this->holdsFromSettings == 1) { - OSReport("ret |= 0x400000\n"); - ret |= 0x400000; - } -#endif + this->timer = 0; - if(!(ret & 0x400000)) { - OSReport("doStateChange(&StateID_DownWait)\n"); - this->doStateChange(&StateID_DownWait); - this->countdownTimer = 0x40; - this->speed.y = 0.0; - UnknownBullshit(unk_8042A008, 0, 1, 0, 0); - }else{ - this->collision_struct[0] = 0x00000001; - this->speed.y = 0.0; - OSReport("UnknownBullshit(%x,%d,%d,%d,%d)\n", unk_8042A008,0,1,0,0); - UnknownBullshit(unk_8042A008, 0, 1, 0, 0); - this->collMgr.Clear2(); - } + // Stop the BGM Music + StopBGMMusic(); - this->spawnEffects(); - Vec p = ConvertStagePositionIntoScreenPosition__Maybe(this->pos); - AnotherSoundRelatedFunction(SoundRelatedClass, SE_EMY_BIG_DOSSUN, p, 0); - //SoundRelatedClass.AnotherSoundRelatedFunction(SE_EMY_BIG_DOSSUN, p, 0); -} -void daEnMegaDosun_c::endState_DownMove() { - OSReport("endState_DownMove()\n"); - return; -} + // Set the necessary Flags and make Mario enter Demo Mode + dStage32C_c::instance->freezeMarioBossFlag = 1; + WLClass::instance->_4 = 4; + WLClass::instance->_8 = 0; -//StateID_DownWait -void daEnMegaDosun_c::beginState_DownWait() { - OSReport("beginState_DownWait()\n"); - return; -} -void daEnMegaDosun_c::executeState_DownWait() { - OSReport("executeState_DownWait()\n"); - if(this->countdownTimer == 0) { - this->doStateChange(&StateID_UpMove); - }else{ - this->countdownTimer--; - if(this->countdownTimer & 0xff == 0x20) - this->anmVis.playState = 3; - } + MakeMarioEnterDemoMode(); - this->anmVis.process(); -} -void daEnMegaDosun_c::endState_DownWait() { - OSReport("endState_DownWait()\n"); - return; -} + // Make sure to use the correct position + Vec pos = (Vec){this->pos.x - 124.0, this->pos.y + 104.0, 3564.0}; + S16Vec rot = (S16Vec){0, 0, 0}; -//StateID_UpMove -void daEnMegaDosun_c::beginState_UpMove() { - OSReport("beginState_UpMove()\n"); - this->collMgr.Clear2(); -} -void daEnMegaDosun_c::executeState_UpMove() { - OSReport("executeState_UpMove()\n"); - this->speed.y = 0.875; - this->UpdateObjectPosBasedOnSpeedValuesReal(); - int ret = this->collMgr.SomethingSemiImportant(0); - OSReport("this->collMgr.SomethingSemiImportant(0): %08x\n", ret); - if(ret != 0) { // at top - this->doStateChange(&StateID_UpWait); - this->countdownTimer = 0xc; + // Create And use Kameck + Kameck = (daKameckDemo*)createChild(KAMECK_FOR_CASTLE_DEMO, (dStageActor_c*)this, 0, &pos, &rot, 0); + Kameck->doStateChange(&daKameckDemo::StateID_DemoWait); } -} -void daEnMegaDosun_c::endState_UpMove() { - OSReport("endState_UpMove()\n"); - return; -} -#endif -#if 0 -int daEnMegaDosun_c::checkZoneBoundaries(int foo) { - if(this->eatenState == 2) { // is eaten - return 0; + void daEnMegaDosun_c::executeState_Grow() { + + if (this->timer == 130) { Kameck->doStateChange(&daKameckDemo::StateID_DemoSt); } + if (this->timer == 400) { Kameck->doStateChange(&daKameckDemo::StateID_DemoSt2); } + + this->timer = this->timer + 1; + + float scaleSpeed, yPosScaling; + + if (this->timer == 150) { PlaySound(this, SE_BOSS_IGGY_WANWAN_TO_L); } + + if ((this->timer > 150) && (this->timer < 230)) { + + scaleSpeed = 0.00625; + + float modifier; + + modifier = 0.5 + ((this->timer - 150) * scaleSpeed); + + this->scale = (Vec){modifier, modifier, modifier}; + + } + + if (this->timer == 360) { + Vec tempPos = (Vec){this->pos.x - 40.0, this->pos.y + 120.0, 3564.0}; + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 175); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 400); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 401); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 564); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 583); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 754); // 400 & 401 // 564 // 583 // 754 // 958 + CreateEffect(&tempPos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 958); // 400 & 401 // 564 // 583 // 754 // 958 + } + + if (this->timer > 420) { + PlaySound(this, SE_EMY_BIG_DOSSUN); + doStateChange(&StateID_UpMove); + } } + void daEnMegaDosun_c::endState_Grow() { - if( (0 == (foo&0x8)) && \ - (this->collMgr.checkBits15and16ofBitfield() != 0) ) { - return 0; - } + // Clean up the flags and Kameck + dStage32C_c::instance->freezeMarioBossFlag = 0; + WLClass::instance->_8 = 1; - int ret = 0; + MakeMarioExitDemoMode(); + StartBGMMusic(); - Rect tempRect = (Rect){this->_320, this->_324, - 0.5 * this->spriteSomeRectX, 0.5 * this->spriteSomeRectY}; - Rect tempRect2 = (Rect){_338, _33C, _340, _344}; - if(this->outOfZone(this->pos, &tempRect, currentZoneId) || - (!(foo&0x4) && s_800b56e0(pos, &tempRect, &tempRect2, currentZoneId)) ) - { - ret = 1; + Kameck->Delete(1); } - if(ret && !(foo & 0x2)) - this->Delete(this->_390); - - return ret; -} -#endif +// StateID_UpWait + void daEnMegaDosun_c::beginState_UpWait() { + this->collision_struct[0] = 0x11804101; + this->timer = 0; + } + void daEnMegaDosun_c::executeState_UpWait() { + if(this->countdownTimer != 0) { + this->countdownTimer--; + return; + } + + if (this->pos.x > this->rightBuffer) { + this->direction = 0; + } + + if (this->pos.x < this->leftBuffer) { + this->direction = 1; + } + + this->pos.x += (direction) ? -0.5 : 0.5; + + if (this->notFalling == 0) { + if(this->CheckIfPlayerBelow(40.0, 256.0)) { + this->doStateChange(&StateID_DownMoveWait); + this->speed.y = 0.0; + } + } + + if (this->timer == 60) { + this->notFalling = 0; + } + + this->timer += 1; + } + void daEnMegaDosun_c::endState_UpWait() { + this->notFalling = 1; + return; + } -#if 0 -extern "C" bool CollidedWithTile(u8 *); -extern "C" void *SomeStrangeModification(dEn_c *); +// StateID_DownMoveWait + void daEnMegaDosun_c::beginState_DownMoveWait() { + this->anmVis.playState = 1; + this->bodyModel.bindAnim(&this->anmVis, 0.5); + } + void daEnMegaDosun_c::executeState_DownMoveWait() { + if(this->anmVis.isAnimationDone()) + this->doStateChange(&StateID_PuruMove); + this->anmVis.process(); + } + void daEnMegaDosun_c::endState_DownMoveWait() { + return; + } -void ThwompaDompMoveC(dEn_c *Sprite) { +// StateID_PuruMove + void daEnMegaDosun_c::beginState_PuruMove() { + this->puruMoveCounter = 8; + this->shakeIndex = 0; + } + void daEnMegaDosun_c::executeState_PuruMove() { + if(this->puruMoveCounter == 0) { + this->shakePosXoffset = 0.0; + this->doStateChange(&StateID_DownMove); + return; + } + + this->puruMoveCounter--; + if(this->puruMoveCounter & 2 == 0) + return; + + float _array[] = {2.0, 0.0}; + this->shakeIndex ^= 1; + this->shakePosXoffset = _array[this->shakeIndex]; + } + void daEnMegaDosun_c::endState_PuruMove() { + return; + } +//StateID_DownMove + void daEnMegaDosun_c::beginState_DownMove() { + OSReport("beginState_DownMove()\n"); + this->speed.y = 0.0; + } + void daEnMegaDosun_c::executeState_DownMove() { + OSReport("executeState_DownMove()\n"); + this->HandleYSpeed(); + this->UpdateObjectPosBasedOnSpeedValuesReal(); + + //FIXME what do I do? - bottom detection + int ret = this->collMgr.execute(); + OSReport("collMgr Returns(): %08x\n", ret); + if(!ret) + return; + + if(!(ret & 0x400000)) { + OSReport("doStateChange(&StateID_DownWait)\n"); + this->doStateChange(&StateID_DownWait); + this->countdownTimer = 0x40; + this->speed.y = 0.0; + ShakeScreen(ScreenPositionClass, 0, 1, 0, 0); + } + else { + this->collision_struct[0] = 0x00000001; + this->speed.y = 0.0; + OSReport("ShakeScreen(%x,%d,%d,%d,%d)\n", ScreenPositionClass,0,1,0,0); + ShakeScreen(ScreenPositionClass, 0, 1, 0, 0); + this->collMgr.Clear2(); + } + + SpawnThwompEffects(this); + Vec p = ConvertStagePositionIntoScreenPosition__Maybe(this->pos); + AnotherSoundRelatedFunction(SoundRelatedClass, SE_EMY_BIG_DOSSUN, p, 0); + //SoundRelatedClass.AnotherSoundRelatedFunction(SE_EMY_BIG_DOSSUN, p, 0); + } + void daEnMegaDosun_c::endState_DownMove() { + OSReport("endState_DownMove()\n"); + return; + } +// StateID_DownWait + void daEnMegaDosun_c::beginState_DownWait() { + return; + } + void daEnMegaDosun_c::executeState_DownWait() { + if(this->countdownTimer == 0) { + this->doStateChange(&StateID_UpMove); + } + else{ + this->countdownTimer--; + if(this->countdownTimer & 0xff == 0x20) + this->anmVis.playState = 3; + } + + this->anmVis.process(); + } + void daEnMegaDosun_c::endState_DownWait() { + return; + } - bool FirstCheck; - bool SecondCheck; +// StateID_UpMove + void daEnMegaDosun_c::beginState_UpMove() { + this->collMgr.Clear2(); + } + void daEnMegaDosun_c::executeState_UpMove() { + // this->speed.y = 0.0; + // this->UpdateObjectPosBasedOnSpeedValuesReal(); + + if (this->pos.y > this->topBuffer) { + this->doStateChange(&StateID_UpWait); + this->countdownTimer = 0xc; + } + else { + this->pos.y += 0.5; + } + } + void daEnMegaDosun_c::endState_UpMove() { + return; + } - // Check for collisions with walls? - FirstCheck = CollidedWithTile(Sprite->collMgr); - SomeStrangeModification(Sprite); - SecondCheck = CollidedWithTile(Sprite->collMgr); +// Outro + void daEnMegaDosun_c::beginState_Outro() { - OSReport("XPos = %f, FirstCheck = %d, SecondCheck = %d", Sprite->pos.x, FirstCheck, SecondCheck); + WLClass::instance->_4 = 5; + WLClass::instance->_8 = 0; - if ((FirstCheck != 0) && (SecondCheck != 0)) { - OSReport("Actually doing something, I swear"); + this->removeMyActivePhysics(); + this->timer = 0; + StopBGMMusic(); - Sprite->pos.y = Sprite->pos.y + 16.0; - Sprite->pos.x = Sprite->pos.x - 180.0; + dStage32C_c::instance->freezeMarioBossFlag = 1; - if (Sprite->direction == 0) { - Sprite->direction = 1; - Sprite->pos.x = Sprite->pos.x - 80.0; } - else { - Sprite->direction = 0; - Sprite->pos.x = Sprite->pos.x + 80.0; } } - else { - if (Sprite->direction == 0) { - Sprite->pos.x = Sprite->pos.x + 1.0; } + void daEnMegaDosun_c::executeState_Outro() { + + if (this->dying == 1) { + if (this->timer > 180) { + ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE); + } + + if (this->timer == 60) { + + UpdateGameMgr(); + + if (GetSpecificPlayerActor(0) != 0) { + PlaySound(this, SE_VOC_MA_CLEAR_BOSS); + // Send PlBase into DemoGoal State here, kthxbai + } + + if (GetSpecificPlayerActor(1) != 0) { + PlaySound(this, SE_VOC_LU_CLEAR_BOSS); + // Send PlBase into DemoGoal State here, kthxbai + } + + if (GetSpecificPlayerActor(2) != 0) { + PlaySound(this, SE_VOC_KO_CLEAR_BOSS); + // Send PlBase into DemoGoal State here, kthxbai + } + + if (GetSpecificPlayerActor(3) != 0) { + PlaySound(this, SE_VOC_KO2_CLEAR_BOSS); + // Send PlBase into DemoGoal State here, kthxbai + } + } + + this->timer += 1; + return; + } + + if (this->scale.x > 0.1) { + + PlaySound(this, SE_EMY_BIG_DOSSUN_DEAD); + + // Adjust this to equal the scale of your boss / 80. + this->scale.x -= 0.015; + this->scale.y -= 0.015; + this->scale.z -= 0.015; + + if (this->timer == 30) { + CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 756); + CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 801); + CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 957); + this->timer = 0; + } + + this->timer += 1; + } else { - Sprite->pos.x = Sprite->pos.x - 1.0; } - } - - - return; -} -#endif - -/* -class daYoshi_c : public dStageActor_c { - u32 _1520; // holds actorID of actor eaten -}; -*/ + this->scale.x = 0.0; + this->scale.y = 0.0; + this->scale.z = 0.0; + + CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){2.0, 2.0, 2.0}, 588); + this->dying = 1; + this->timer = 0; + + PlaySound(this, STRM_BGM_SHIRO_BOSS_CLEAR); + MakeMarioEnterDemoMode(); + } + } + void daEnMegaDosun_c::endState_Outro() { } |