diff options
-rw-r--r-- | src/shyguy.cpp | 711 |
1 files changed, 435 insertions, 276 deletions
diff --git a/src/shyguy.cpp b/src/shyguy.cpp index 87c7749..69d0827 100644 --- a/src/shyguy.cpp +++ b/src/shyguy.cpp @@ -10,15 +10,15 @@ // Shy Guy Settings // // Nybble 5: Shy Guy Types -// 0 - Walker +// 0 - Pacing Walker // 1 - Sleeper // 2 - Jumper // 3 - Ballooneer Horizontal // 4 - Ballooneer Vertical -// 6 - Ballooneer Circular -// 7 - Judo Master -// 8 - Spike Thrower -// 9 - Giant +// 5 - Ballooneer Circular +// 6 - Judo Master +// 7 - Spike Thrower +// 8 - Pacing Giant // // Nybble 6: Colour // 0 - Red @@ -35,6 +35,9 @@ // 0 - Nothing // 1 - ??? // +// Nybble 9: Distance Moved +// # - Distance for Pacing Walker, Pacing Giants, and Ballooneers +// // I_kinoko, I_fireflower, I_propeller_model, I_iceflower, I_star, I_penguin - model names // anmChr - wait2 @@ -61,6 +64,8 @@ class daShyGuy : public dEn_c { char damage; char renderBalloon; Vec initialPos; + int distance; + float XSpeed; static daShyGuy *build(); @@ -70,6 +75,8 @@ class daShyGuy : public dEn_c { USING_STATES(daShyGuy); DECLARE_STATE(Walk); DECLARE_STATE(Turn); + DECLARE_STATE(RealWalk); + DECLARE_STATE(RealTurn); DECLARE_STATE(Jump); DECLARE_STATE(Sleep); DECLARE_STATE(Balloon_H); @@ -84,15 +91,22 @@ daShyGuy *daShyGuy::build() { return new(buffer) daShyGuy; } - extern "C" void *PlaySound(daShyGuy *, int soundID); extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daShyGuy *, Vec pos); +//FIXME make this dEn_c->used... +extern "C" char usedForDeterminingStatePress_or_playerCollision(dEn_c* t, ActivePhysics *apThis, ActivePhysics *apOther, int unk1); +extern "C" int SomeStrangeModification(dStageActor_c* actor); +extern "C" void DoStuffAndMarkDead(dStageActor_c *actor, Vec vector, float unk); +extern "C" int SmoothRotation(short* rot, u16 amt, int unk2); + CREATE_STATE(daShyGuy, Walk); CREATE_STATE(daShyGuy, Turn); +CREATE_STATE(daShyGuy, RealWalk); +CREATE_STATE(daShyGuy, RealTurn); CREATE_STATE(daShyGuy, Jump); CREATE_STATE(daShyGuy, Sleep); CREATE_STATE(daShyGuy, Balloon_H); @@ -109,12 +123,12 @@ void daShyGuy::bindAnimChr_and_setUpdateRate(const char* name, int unk, float un this->chrAnimation.setUpdateRate(rate); } - int daShyGuy::onCreate() { int type = this->settings >> 28 & 0xF; int anim = this->settings >> 24 & 0xF; int baln = this->settings >> 20 & 0xF; + this->distance = this->settings >> 12 & 0xF; if (type == 3) {this->renderBalloon = 1;} else if (type == 4) {this->renderBalloon = 1;} @@ -164,7 +178,7 @@ int daShyGuy::onCreate() { ActivePhysics::Info HitMeBaby; - if (type == 8) { + if (type == 8 || type == 10) { this->scale = (Vec){40.0, 40.0, 40.0}; HitMeBaby.xDistToCenter = 0.0; @@ -193,17 +207,46 @@ int daShyGuy::onCreate() { this->aPhysics.initWithStruct(this, &HitMeBaby); this->aPhysics.addToList(); + // Tile collider + OSReport("Making the Tile collider Class\n"); + this->collMgr.Init(this, struct_1, 0, struct_3); + + // // A bunch of things that I don't understand? Megazig used em. None seem to do anything + // char foo = this->_391; + // this->pos_delta2.x = 0.0; + // this->pos_delta2.y = 16.0; + // this->pos_delta2.z = 0.0; + + // this->spriteSomeRectX = 32.0; + // this->spriteSomeRectY = 32.0; + // this->_320 = 0.0; + // this->_324 = 16.0; + // this->_328 = 80.0; + // this->_32C = 256.0; + + // this->pos.z = (foo == 0) ? 1500.0 : -2500.0; + + // this->_518 = 2; + + // this->_120 |= 0x200; + // this->_36D = 0; + // this->_518 = 2; + + + // Stuff I do understand OSReport("Setting up ShyGuy's Box of Goodies\n"); this->pos.y = this->pos.y + 30.0; // X is vertical axis this->rot.x = 0; // X is vertical axis this->rot.y = 0xD800; // Y is horizontal axis this->rot.z = 0; // Z is ... an axis >.> this->direction = 1; // Heading left. - this->currentLayerID = 1; - + this->speed.x = 0; + this->speed.y = 0.0; + this->x_speed_inc = 0.1; this->Baseline = this->pos.y; - + this->XSpeed = 1.0; + if (type == 0) { doStateChange(&StateID_Walk); @@ -232,6 +275,12 @@ int daShyGuy::onCreate() { else if (type == 8) { doStateChange(&StateID_Walk); } + else if (type == 9) { + doStateChange(&StateID_RealWalk); + } + else if (type == 10) { + doStateChange(&StateID_RealWalk); + } OSReport("Going to Execute ShyGuy\n"); this->onExecute(); @@ -256,7 +305,6 @@ int daShyGuy::onExecute() { return true; } - int daShyGuy::onDraw() { bodyModel.scheduleForDrawing(); bodyModel._vf1C(); @@ -274,373 +322,484 @@ void daShyGuy::updateModelMatrices() { bodyModel.setDrawMatrix(matrix); bodyModel.setScale(&scale); - bodyModel.calcWorld(true); + bodyModel.calcWorld(false); if (this->renderBalloon == 1) { matrix.translation(pos.x, pos.y - 30.0, pos.z); balloonModel.setDrawMatrix(matrix); balloonModel.setScale(1.5, 1.5, 1.5); - balloonModel.calcWorld(true); + balloonModel.calcWorld(false); balloonModelB.setDrawMatrix(matrix); balloonModelB.setScale(1.5, 1.5, 1.5); - balloonModelB.calcWorld(true); + balloonModelB.calcWorld(false); } } +/////////////// +// Walk State +/////////////// + void daShyGuy::beginState_Walk() { + bindAnimChr_and_setUpdateRate("c18_EV_WIN_2_R", 1, 0.0, 1.5); + this->timer = 0; + if (this->direction == 1) { this->rot.y = 0xD800; } + else { this->rot.y = 0x2800; } + } + void daShyGuy::executeState_Walk() { -void daShyGuy::beginState_Walk() { - bindAnimChr_and_setUpdateRate("c18_EV_WIN_2_R", 1, 0.0, 1.5); - this->timer = 0; - if (this->direction == 1) { this->rot.y = 0xD800; } - else { this->rot.y = 0x2800; } -} -void daShyGuy::executeState_Walk() { + if (this->direction == 1) { this->pos.x -= 0.5; } + else { this->pos.x += 0.5; } - if (this->direction == 1) { this->pos.x -= 0.5; } - else { this->pos.x += 0.5; } + if(this->chrAnimation.isAnimationDone()) + if (this->timer > (this->distance * 32)) { + doStateChange(&StateID_Turn); + } + else { + this->chrAnimation.setCurrentFrame(0.0); + } - if(this->chrAnimation.isAnimationDone()) - if (this->timer > 200) { - doStateChange(&StateID_Turn); - } - else { - this->chrAnimation.setCurrentFrame(0.0); - } + this->timer = this->timer + 1; + } + void daShyGuy::endState_Walk() { + } - this->timer = this->timer + 1; -} -void daShyGuy::endState_Walk() { -} +/////////////// +// Turn State +/////////////// + void daShyGuy::beginState_Turn() { + bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); + this->timer = 0; + } + void daShyGuy::executeState_Turn() { -void daShyGuy::beginState_Turn() { - bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); - this->timer = 0; -} -void daShyGuy::executeState_Turn() { + int modifier = sin(this->timer * 3.14 / 30.0) * 0x5000; - int modifier = sin(this->timer * 3.14 / 30.0) * 0x5000; + if (this->direction == 1) { this->rot.y = 0xD800 + modifier; } + else { this->rot.y = 0x2800 - modifier; } - if (this->direction == 1) { this->rot.y = 0xD800 + modifier; } - else { this->rot.y = 0x2800 - modifier; } + if (this->timer >= 15) { + doStateChange(&StateID_Walk); + } - if (this->timer >= 15) { - doStateChange(&StateID_Walk); + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + + this->timer += 1; + } + void daShyGuy::endState_Turn() { + if (this->direction == 1) { this->direction = 0; } + else { this->direction = 1; } } - if(this->chrAnimation.isAnimationDone()) { - this->chrAnimation.setCurrentFrame(0.0); +/////////////// +// Jump State +/////////////// + void daShyGuy::beginState_Jump() { + this->timer = 0; + this->jumpCounter = 0; } + void daShyGuy::executeState_Jump() { - this->timer += 1; -} -void daShyGuy::endState_Turn() { - if (this->direction == 1) { this->direction = 0; } - else { this->direction = 1; } -} + // Always face Mario + u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); -void daShyGuy::beginState_Jump() { - this->timer = 0; - this->jumpCounter = 0; -} -void daShyGuy::executeState_Jump() { + if (facing != this->direction) { + this->direction = facing; + if (this->direction == 1) { + this->rot.y = 0xD800; + } + else { + this->rot.y = 0x2800; + } + } - // Always face Mario - u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + // Shy Guy is on ground + if (this->pos.y < this->Baseline) { - if (facing != this->direction) { - this->direction = facing; - if (this->direction == 1) { - this->rot.y = 0xD800; - } - else { - this->rot.y = 0x2800; - } - } + bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); + + this->timer = this->timer + 1; - // Shy Guy is on ground - if (this->pos.y < this->Baseline) { + // Make him wait for 0.5 seconds + if (this->timer > 30) { - bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); - - this->timer = this->timer + 1; + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); - // Make him wait for 0.5 seconds - if (this->timer > 30) { + this->speed.x = 0; + this->speed.y = 0; + } - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); + // Then Jump! + else { + if (this->jumpCounter == 3) { this->jumpCounter = 0; } - this->speed.x = 0; - this->speed.y = 0; + this->pos.y = this->Baseline + 1; + this->timer = 0; + this->jumpCounter = this->jumpCounter + 1; + + + if (this->jumpCounter == 3) { + bindAnimChr_and_setUpdateRate("c18_NORMAL_STEAL_R", 1, 0.0, 1.0); + this->speed.y = 8.0; + PlaySound(this, SE_PLY_JUMPDAI_HIGH); + } + else { + bindAnimChr_and_setUpdateRate("c18_EV_WIN_1_R", 1, 0.0, 1.0); + this->speed.y = 6.0; + PlaySound(this, SE_PLY_JUMPDAI); + } + + OSReport("Takeoff Initiated"); + } } - // Then Jump! + // While he's jumping, it's time for gravity. else { - if (this->jumpCounter == 3) { this->jumpCounter = 0; } - - this->pos.y = this->Baseline + 1; - this->timer = 0; - this->jumpCounter = this->jumpCounter + 1; + this->speed.y = this->speed.y - 0.15; if (this->jumpCounter == 3) { - bindAnimChr_and_setUpdateRate("c18_NORMAL_STEAL_R", 1, 0.0, 1.0); - this->speed.y = 8.0; - PlaySound(this, SE_PLY_JUMPDAI_HIGH); + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); } else { - bindAnimChr_and_setUpdateRate("c18_EV_WIN_1_R", 1, 0.0, 1.0); - this->speed.y = 6.0; - PlaySound(this, SE_PLY_JUMPDAI); + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); } - - OSReport("Takeoff Initiated"); } - } - // While he's jumping, it's time for gravity. - else { - - this->speed.y = this->speed.y - 0.15; - - if (this->jumpCounter == 3) { - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); - } - else { - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); - } + this->HandleXSpeed(); + this->HandleYSpeed(); + this->UpdateObjectPosBasedOnSpeedValuesReal(); + } + void daShyGuy::endState_Jump() { } - this->HandleXSpeed(); - this->HandleYSpeed(); - this->UpdateObjectPosBasedOnSpeedValuesReal(); -} -void daShyGuy::endState_Jump() { -} - - -void daShyGuy::beginState_Sleep() { - bindAnimChr_and_setUpdateRate("c18_EV_LOSE_2_R", 1, 0.0, 1.0); - this->rot.y = 0x0000; -} -void daShyGuy::executeState_Sleep() { - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); -} -void daShyGuy::endState_Sleep() { -} - - +/////////////// +// Sleep State +/////////////// + void daShyGuy::beginState_Sleep() { + bindAnimChr_and_setUpdateRate("c18_EV_LOSE_2_R", 1, 0.0, 1.0); + this->rot.y = 0x0000; + } + void daShyGuy::executeState_Sleep() { + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); + } + void daShyGuy::endState_Sleep() { + } -void daShyGuy::beginState_Balloon_H() { - bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); - this->timer = 0; - this->initialPos = this->pos; - this->rot.x = 0xFE00; - this->rot.y = 0; -} -void daShyGuy::executeState_Balloon_H() { +/////////////// +// Balloon H State +/////////////// + void daShyGuy::beginState_Balloon_H() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); + this->timer = 0; + this->initialPos = this->pos; + this->rot.x = 0xFE00; + this->rot.y = 0; + } + void daShyGuy::executeState_Balloon_H() { - // Makes him bob up and down - this->pos.y = this->initialPos.y + ( sin(this->timer * 3.14 / 60.0) * 6.0 ); + // Makes him bob up and down + this->pos.y = this->initialPos.y + ( sin(this->timer * 3.14 / 60.0) * 6.0 ); - // Makes him move side to side - this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 600.0) * 64.0 ); + // Makes him move side to side + this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 600.0) * (float)this->distance * 8.0); - this->timer = this->timer + 1; + this->timer = this->timer + 1; - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); -} -void daShyGuy::endState_Balloon_H() { -} + } + void daShyGuy::endState_Balloon_H() { + } +/////////////// +// Balloon V State +/////////////// + void daShyGuy::beginState_Balloon_V() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); + this->timer = 0; + this->initialPos = this->pos; + this->rot.x = 0xFE00; + this->rot.y = 0; + } + void daShyGuy::executeState_Balloon_V() { + // Makes him bob up and down + this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 60.0) * 6.0 ); + // Makes him move side to side + this->pos.y = this->initialPos.y + ( sin(this->timer * 3.14 / 600.0) * (float)this->distance * 8.0 ); -void daShyGuy::beginState_Balloon_V() { - bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); - this->timer = 0; - this->initialPos = this->pos; - this->rot.x = 0xFE00; - this->rot.y = 0; -} -void daShyGuy::executeState_Balloon_V() { - // Makes him bob up and down - this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 60.0) * 6.0 ); + this->timer = this->timer + 1; - // Makes him move side to side - this->pos.y = this->initialPos.y + ( sin(this->timer * 3.14 / 600.0) * 64.0 ); + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); + } + void daShyGuy::endState_Balloon_V() { + } - this->timer = this->timer + 1; +/////////////// +// Balloon C State +/////////////// + void daShyGuy::beginState_Balloon_C() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); + this->timer = 0; + this->initialPos = this->pos; + this->rot.x = 0xFE00; + this->rot.y = 0; + } + void daShyGuy::executeState_Balloon_C() { + // Makes him bob up and down + this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 600.0) * (float)this->distance * 8.0 ); - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); -} -void daShyGuy::endState_Balloon_V() { -} + // Makes him move side to side + this->pos.y = this->initialPos.y + ( cos(this->timer * 3.14 / 600.0) * (float)this->distance * 8.0 ); + this->timer = this->timer + 1; + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); + } + void daShyGuy::endState_Balloon_C() { + } -void daShyGuy::beginState_Balloon_C() { - bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); - this->timer = 0; - this->initialPos = this->pos; - this->rot.x = 0xFE00; - this->rot.y = 0; -} -void daShyGuy::executeState_Balloon_C() { - // Makes him bob up and down - this->pos.x = this->initialPos.x + ( sin(this->timer * 3.14 / 600.0) * 64.0 ); +/////////////// +// Judo State +/////////////// + void daShyGuy::beginState_Judo() { + this->timer = 0; + } + void daShyGuy::executeState_Judo() { - // Makes him move side to side - this->pos.y = this->initialPos.y + ( cos(this->timer * 3.14 / 600.0) * 64.0 ); + // chargin 476? 673? 760? 768? 808? 966? + if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0); } - this->timer = this->timer + 1; + this->timer = this->timer + 1; - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); -} -void daShyGuy::endState_Balloon_C() { -} + if (this->timer == 80) { + if (this->direction == 1) { + CreateEffect(&(Vec){this->pos.x + 7.0, this->pos.y + 14.0, this->pos.z + 5600.0}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}, 966); + } + else { + CreateEffect(&(Vec){this->pos.x - 7.0, this->pos.y + 14.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}, 966); + } + } -void daShyGuy::beginState_Judo() { - this->timer = 0; -} -void daShyGuy::executeState_Judo() { + if (this->timer < 120) { + // Always face Mario + u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + + if (facing != this->direction) { + this->direction = facing; + if (this->direction == 1) { + this->rot.y = 0xD800; + } + else { + this->rot.y = 0x2800; + } + } - if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0); } + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); + } - this->timer = this->timer + 1; + else if (this->timer == 120) { + bindAnimChr_and_setUpdateRate("c18_H_CUT_R", 1, 0.0, 1.0); + + } - if (this->timer < 120) { - // Always face Mario - u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + else if (this->timer == 132) { + PlaySound(this, SE_EMY_CRASHER_PUNCH); - if (facing != this->direction) { - this->direction = facing; - if (this->direction == 1) { - this->rot.y = 0xD800; + if (this->direction == 1) { + CreateEffect(&(Vec){this->pos.x - 18.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 123); + changeActivePhysicsRect(this, 0.0, 12.0, 54.0, 12.0); } else { - this->rot.y = 0x2800; - } + CreateEffect(&(Vec){this->pos.x + 18.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 124); + changeActivePhysicsRect(this, 20.0, 12.0, 34.0, 12.0); + } } - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); - } + else { - else if (this->timer == 120) { - bindAnimChr_and_setUpdateRate("c18_H_CUT_R", 1, 0.0, 1.0); - + if(this->chrAnimation.isAnimationDone()) { + if (this->direction == 1) { + CreateEffect(&(Vec){this->pos.x - 38.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 171); + } + else { + CreateEffect(&(Vec){this->pos.x + 38.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 171); + } + + this->timer = 0; + PlaySound(this, SE_EMY_BIG_PAKKUN_DAMAGE_1); + changeActivePhysicsRect(this, 0.0, 12.0, 14.0, 12.0); + } + } + } + void daShyGuy::endState_Judo() { } - else if (this->timer == 132) { - PlaySound(this, SE_EMY_CRASHER_PUNCH); - - if (this->direction == 1) { - CreateEffect(&(Vec){this->pos.x - 18.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 123); - } - else { - CreateEffect(&(Vec){this->pos.x + 18.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}, 124); - } - - changeActivePhysicsRect(this, 20.0, 12.0, 34.0, 12.0); +/////////////// +// Spike State +/////////////// + void daShyGuy::beginState_Spike() { + this->timer = 0; } + void daShyGuy::executeState_Spike() { - else { + if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0); } - if(this->chrAnimation.isAnimationDone()) { - if (this->direction == 1) { - CreateEffect(&(Vec){this->pos.x - 38.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}, 157); - } - else { - CreateEffect(&(Vec){this->pos.x + 38.0, this->pos.y + 16.0, this->pos.z}, &(S16Vec){0,0,0}, &(Vec){0.8, 0.8, 0.8}, 157); + this->timer = this->timer + 1; + + if (this->timer < 120) { + // Always face Mario + u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + + if (facing != this->direction) { + this->direction = facing; + if (this->direction == 1) { + this->rot.y = 0xD800; + } + else { + this->rot.y = 0x2800; + } } - this->timer = 0; - PlaySound(this, SE_EMY_BIG_PAKKUN_DAMAGE_1); - changeActivePhysicsRect(this, 0.0, 12.0, 14.0, 12.0); + if(this->chrAnimation.isAnimationDone()) + this->chrAnimation.setCurrentFrame(0.0); } - } -} -void daShyGuy::endState_Judo() { -} -void daShyGuy::beginState_Spike() { - this->timer = 0; -} -void daShyGuy::executeState_Spike() { - - if (this->timer == 0) { bindAnimChr_and_setUpdateRate("c18_OB_IDLE_R", 1, 0.0, 1.0); } + else if (this->timer == 120) { + bindAnimChr_and_setUpdateRate("c18_H_SHOT_R", 1, 0.0, 1.0); + + } - this->timer = this->timer + 1; + else if (this->timer == 160) { + PlaySound(this, SE_EMY_KANIBO_THROW); - if (this->timer < 120) { - // Always face Mario - u8 facing = dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(this, this->pos); + Vec pos; + pos.x = this->pos.x; + pos.y = this->pos.y; + pos.z = this->pos.z; + + if (this->direction == 1) { + dStageActor_c *spawned = CreateActor(89, 0x2, pos, 0, 0); + spawned->scale.x = 0.5; + spawned->scale.y = 0.5; + spawned->scale.z = 0.5; - if (facing != this->direction) { - this->direction = facing; - if (this->direction == 1) { - this->rot.y = 0xD800; + spawned->speed.x = -2.0; + spawned->speed.y = 2.0; } else { - this->rot.y = 0x2800; + dStageActor_c *spawned = CreateActor(89, 0x12, pos, 0, 0); + spawned->scale.x = 0.5; + spawned->scale.y = 0.5; + spawned->scale.z = 0.5; + + spawned->speed.x = 2.0; + spawned->speed.y = 2.0; } } - if(this->chrAnimation.isAnimationDone()) - this->chrAnimation.setCurrentFrame(0.0); - } + else { - else if (this->timer == 120) { - bindAnimChr_and_setUpdateRate("c18_H_SHOT_R", 1, 0.0, 1.0); - + if(this->chrAnimation.isAnimationDone()) { + this->timer = 0; + } + } + } + void daShyGuy::endState_Spike() { } - else if (this->timer == 160) { - PlaySound(this, SE_EMY_KANIBO_THROW); +/////////////// +// Real Walk State +/////////////// + void daShyGuy::beginState_RealWalk() { + //inline this piece of code + bindAnimChr_and_setUpdateRate("c18_EV_WIN_2_R", 1, 0.0, 1.5); + this->max_speed.y = -4.0; + this->speed.x = this->speed.z = 0.0; + this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; + this->speed.y = -4.0; + this->y_speed_inc = -0.1875; + } + void daShyGuy::executeState_RealWalk() { + this->HandleXSpeed(); + this->HandleYSpeed(); + this->doSpriteMovement(); + + u16 amt = (this->direction == 0) ? 0x2800 : 0xD800; + SmoothRotation(&this->rot.y, amt, 0x200); + + int ret = SomeStrangeModification(this); + if(ret & 1) + this->speed.y = 0.0; + + u32 bitfield = this->collMgr.bitfield_for_checks; + if(bitfield & (0x15<<this->direction)) { + this->pos.x = this->last_pos.x; + this->doStateChange(&StateID_RealTurn); + } - Vec pos; - pos.x = this->pos.x; - pos.y = this->pos.y; - pos.z = this->pos.z; - - if (this->direction == 1) { - dStageActor_c *spawned = CreateActor(89, 0x2, pos, 0, 0); - spawned->scale.x = 0.5; - spawned->scale.y = 0.5; - spawned->scale.z = 0.5; - - spawned->speed.x = -2.0; - spawned->speed.y = 2.0; + // collisionMgr_c ??? Seems like a useful function, not sure if it's mapped in game.h as something else, though + + u32 bitfield2 = this->collMgr.directional_bitfields[this->direction]; + if(bitfield2) { + this->doStateChange(&StateID_RealTurn); } - else { - dStageActor_c *spawned = CreateActor(89, 0x12, pos, 0, 0); - spawned->scale.x = 0.5; - spawned->scale.y = 0.5; - spawned->scale.z = 0.5; - spawned->speed.x = 2.0; - spawned->speed.y = 2.0; + DoStuffAndMarkDead(this, this->pos, 1.0); + + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); } } + void daShyGuy::endState_RealWalk() { } - else { +/////////////// +// Real Turn State +/////////////// + void daShyGuy::beginState_RealTurn() { + bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); + + this->direction ^= 1; + this->speed.x = 0.0; + } + void daShyGuy::executeState_RealTurn() { if(this->chrAnimation.isAnimationDone()) { - this->timer = 0; + this->chrAnimation.setCurrentFrame(0.0); + } + + this->HandleYSpeed(); + this->doSpriteMovement(); + + int ret = SomeStrangeModification(this); + + if(ret & 1) + this->speed.y = 0.0; + if(ret & 4) + this->pos.x = this->last_pos.x; + DoStuffAndMarkDead(this, this->pos, 1.0); + + u16 amt = (this->direction == 0) ? 0x2800 : 0xD800; + int done = SmoothRotation(&this->rot.y, amt, 0x200); + + if(done) { + this->doStateChange(&StateID_RealWalk); } } -} -void daShyGuy::endState_Spike() { -} + void daShyGuy::endState_RealTurn() { + this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; + } |