diff options
author | Colin Noga <Tempus@chronometry.ca> | 2012-02-23 21:53:39 -0600 |
---|---|---|
committer | Colin Noga <Tempus@chronometry.ca> | 2012-02-23 21:53:39 -0600 |
commit | bc5140686e182ea63ee569ef29fe5a2de9f38578 (patch) | |
tree | 0bff0b3544aaf56ec14c7f425415dfab91fbb423 | |
parent | fc6395da2787175e1daf55771975ac0af9d2bd9e (diff) | |
download | kamek-bc5140686e182ea63ee569ef29fe5a2de9f38578.tar.gz kamek-bc5140686e182ea63ee569ef29fe5a2de9f38578.zip |
Shy Guy and some other changes
-rwxr-xr-x | include/game.h | 1 | ||||
-rw-r--r-- | kamek_pal.x | 2 | ||||
-rw-r--r-- | src/effects.cpp | 17 | ||||
-rw-r--r-- | src/effects.h | 1 | ||||
-rw-r--r-- | src/shyguy.cpp | 467 |
5 files changed, 336 insertions, 152 deletions
diff --git a/include/game.h b/include/game.h index ccc8fee..99a064a 100755 --- a/include/game.h +++ b/include/game.h @@ -1436,6 +1436,7 @@ public: u8 _ED[3]; //FIXME
};
+
class freezeMgr_c {
public:
u32 some_count;
diff --git a/kamek_pal.x b/kamek_pal.x index dc2e301..8074add 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -278,7 +278,7 @@ SECTIONS { _vfCC__5dEn_cFP7Point2df = 0x800973F0; _vfD0__5dEn_cFP7Point2df = 0x800974F0; doStateChange__5dEn_cFP12dStateBase_c = 0x800A7DF0; - collisionCallback__5dEn_cFPQ213ActivePhysics4InfoPQ213ActivePhysics4Info = 0x80095950; + collisionCallback__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095950; preSpriteCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095CE0; prePlayerCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095D30; preYoshiCollision__5dEn_cFP13ActivePhysicsP13ActivePhysics = 0x80095F50; diff --git a/src/effects.cpp b/src/effects.cpp index 3b2d5c7..c54678c 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -1012,7 +1012,7 @@ bool CreateEffect(dEn_c* enemy, int effect_num) { return false; if (effect_num < 0) return false; - Vec tempVec = (Vec){ enemy->pos.x, enemy->pos.y, 5500.0 }; + Vec tempVec = (Vec){ enemy->pos.x, enemy->pos.y, enemy->pos.z }; const char* effect_name = effects_name_list[effect_num]; return SpawnEffect(effect_name, 0, &tempVec, 0, 0); } @@ -1022,7 +1022,7 @@ bool CreateEffect(Vec* pos, S16Vec* rot, Vec* scale, int effect_num) { return false; if (effect_num < 0) return false; - Vec tempVec = (Vec){ pos->x, pos->y, 5500.0 }; + Vec tempVec = (Vec){ pos->x, pos->y, pos->z }; const char* effect_name = effects_name_list[effect_num]; return SpawnEffect(effect_name, 0, &tempVec, rot, scale); } @@ -1041,6 +1041,19 @@ bool CreateEffect(const char* name, Vec* pos) { return SpawnEffect(name, 0, pos, 0, 0); } +bool CreateEffect(int effect_num, Vec* pos, int leng) { + //check effects name list + bool exists = false; + if (effect_num > 1000) + return false; + if (effect_num < 0) + return false; + + const char* effect_name = effects_name_list[effect_num]; + + return SpawnEffect(effect_name, leng, pos, 0, 0); +} + bool CreateEffect(int effect_num, Vec* pos, S16Vec* rot, Vec* scale) { if (effect_num > 1000) return false; diff --git a/src/effects.h b/src/effects.h index ceda53f..744bef1 100644 --- a/src/effects.h +++ b/src/effects.h @@ -12,6 +12,7 @@ Vec* tScale = &(Vec){0.0, 0.0, 0.0}; bool CreateEffect(dEn_c* enemy, int effect_num); bool CreateEffect(Vec* pos, S16Vec* rot, Vec* scale, int effect_num); bool CreateEffect(Vec* pos, S16Vec* rot, Vec* scale, int effect_num); +bool CreateEffect(int effect_num, Vec* pos, int leng); bool CreateEffect(int effect_num, Vec* pos, S16Vec* rot = 0, Vec* scale = 0); // Actually will return an EGG::Effect instance diff --git a/src/shyguy.cpp b/src/shyguy.cpp index 89f92d0..15bf0d6 100644 --- a/src/shyguy.cpp +++ b/src/shyguy.cpp @@ -10,17 +10,17 @@ // Shy Guy Settings // // Nybble 5: Shy Guy Types -// 9 - Walker -// 0 - Pacing Walker -// 1 - Sleeper -// 2 - Jumper -// 6 - Judo Master -// 7 - Spike Thrower -// 3 - Ballooneer Horizontal -// 4 - Ballooneer Vertical -// 5 - Ballooneer Circular -// 10 - Walking Giatn -// 8 - Pacing Giant +// 0 - Walker +// 1 - Pacing Walker +// 2 - Sleeper +// 3 - Jumper +// 4 - Judo Master +// 5 - Spike Thrower +// 6 - Ballooneer Horizontal +// 7 - Ballooneer Vertical +// 8 - Ballooneer Circular +// 9 - Walking Giant +// 10 - Pacing Giant // // Nybble 6: Colour // 0 - Red @@ -65,6 +65,7 @@ class daShyGuy : public dEn_c { int type; int timer; int jumpCounter; + float dying; float Baseline; char damage; char isDown; @@ -74,21 +75,23 @@ class daShyGuy : public dEn_c { float XSpeed; u32 cmgr_returnValue; bool isBouncing; + float balloonSize; static daShyGuy *build(); void bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate); void updateModelMatrices(); - - + bool calculateTileCollisions(); // void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); void yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther); - // void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); - // void collisionCat7_WMWaggleWaterYoshi(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 collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); // bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); @@ -113,6 +116,8 @@ class daShyGuy : public dEn_c { DECLARE_STATE(FireKnockBack); DECLARE_STATE(FlameHit); DECLARE_STATE(Recover); + + DECLARE_STATE(Die); }; daShyGuy *daShyGuy::build() { @@ -153,6 +158,8 @@ daShyGuy *daShyGuy::build() { CREATE_STATE(daShyGuy, FlameHit); CREATE_STATE(daShyGuy, Recover); + CREATE_STATE(daShyGuy, Die); + //////////////////////// // Collision Functions //////////////////////// @@ -161,7 +168,7 @@ daShyGuy *daShyGuy::build() { void shyCollisionCallback(ActivePhysics *apThis, ActivePhysics *apOther) { if (apOther->owner->name != 89) { - apThis->owner->collisionCallback(apThis, apOther); + dEn_c::collisionCallback(apThis, apOther); } } @@ -177,15 +184,14 @@ daShyGuy *daShyGuy::build() { if (this->type < 6) { // Regular Shy Guys stateVar = &StateID_GoDizzy; - deathState = &StateID_DieFall; + deathState = &StateID_Die; } else if (this->type > 8) { // Giants - stateVar = &StateID_DieFall; - deathState = &StateID_DieFall; + return; } else { // Ballooneers stateVar = &StateID_BalloonDrop; - deathState = &StateID_DieFumi; + deathState = &StateID_Die; } char hitType; @@ -236,11 +242,27 @@ daShyGuy *daShyGuy::build() { } void daShyGuy::collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther) { - doStateChange(&StateID_DieFall); + doStateChange(&StateID_Die); + } + + void daShyGuy::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_Die); + } + + void daShyGuy::collisionCat7_WMWaggleWaterYoshi(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_Die); } void daShyGuy::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { - doStateChange(&StateID_DieFall); + doStateChange(&StateID_Die); + } + + void daShyGuy::collisionCat3_StarPower(ActivePhysics *apThis, ActivePhysics *apOther){ + doStateChange(&StateID_Die); + } + + void daShyGuy::collisionCat14_YoshiFire(ActivePhysics *apThis, ActivePhysics *apOther){ + doStateChange(&StateID_DieSmoke); } void daShyGuy::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { @@ -248,10 +270,7 @@ daShyGuy *daShyGuy::build() { dStateBase_c *stateVar; - if (this->type > 3) { // Jumpers - stateVar = &StateID_DieSmoke; - } - else if (this->type < 6) { // Regular Shy Guys Except Jumper + if (this->type < 6) { // Regular Shy Guys Except Jumper stateVar = &StateID_FireKnockBack; } else if (this->type > 8) { // Giants @@ -274,9 +293,80 @@ daShyGuy *daShyGuy::build() { // } void daShyGuy::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { - doStateChange(&StateID_DieFall); + doStateChange(&StateID_Die); + } + +bool daShyGuy::calculateTileCollisions() { + // Returns true if sprite should turn, false if not. + + HandleXSpeed(); + HandleYSpeed(); + doSpriteMovement(); + + cmgr_returnValue = collMgr.CollidedWithTile(); + collMgr.execute(); + + if (isBouncing) { + stuffRelatingToCollisions(0.1875f, 1.0f, 0.5f); + if (speed.y != 0.0f) + isBouncing = false; + } + + float xDelta = pos.x - last_pos.x; + if (xDelta >= 0.0f) + direction = 0; + else + direction = 1; + + if (collMgr.CollidedWithTile()) { + // Walking into a tile branch + + if (cmgr_returnValue == 0) + isBouncing = true; + + if (speed.x != 0.0f) { + //playWmEnIronEffect(); + } + + speed.y = 0.0f; + + // u32 blah = collMgr.s_80070760(); + // u8 one = (blah & 0xFF); + // static const float incs[5] = {0.00390625f, 0.0078125f, 0.015625f, 0.0234375f, 0.03125f}; + // x_speed_inc = incs[one]; + max_speed.x = (direction == 1) ? -1.0f : 1.0f; + } else { + x_speed_inc = 0.0f; + } + + // Bouncing checks + if (_34A & 4) { + Vec v = (Vec){0.0f, 1.0f, 0.0f}; + collMgr.parent_speed_ptr = &v; + + if (collMgr.SomethingSemiImportant(collMgr.bitfield_for_checks)) + speed.y = 0.0f; + + collMgr.parent_speed_ptr = &speed; + + } else { + if (collMgr.SomethingSemiImportant(collMgr.bitfield_for_checks)) + speed.y = 0.0f; } + collMgr.s_8006FA40(0); + + // Switch Direction + if (collMgr.bitfield_for_checks & (0x15 << direction)) { + if (collMgr.CollidedWithTile()) { + isBouncing = true; + } + return true; + } + return false; +} + + void daShyGuy::bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate) { nw4r::g3d::ResAnmChr anmChr = this->anmFile.GetResAnmChr(name); @@ -292,9 +382,9 @@ int daShyGuy::onCreate() { 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;} - else if (type == 5) {this->renderBalloon = 1;} + if (type == 6) {this->renderBalloon = 1;} + else if (type == 7) {this->renderBalloon = 1;} + else if (type == 8) {this->renderBalloon = 1;} else {this->renderBalloon = 0;} OSReport("Creating the ShyGuy Model\n"); @@ -333,14 +423,31 @@ int daShyGuy::onCreate() { allocator.unlink(); + // Stuff I do understand + OSReport("Setting up ShyGuy's Box of Goodies\n"); + OSReport("Setting ShyGuy's Size to 1.0\n"); this->scale = (Vec){20.0, 20.0, 20.0}; + 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->speed.x = 0.0; + this->speed.y = 0.0; + this->max_speed.x = 1.0; + this->x_speed_inc = 0.2; + this->Baseline = this->pos.y; + this->XSpeed = 1.0; + this->balloonSize = 1.5; + OSReport("Creating ShyGuy's Physics Struct\n"); ActivePhysics::Info HitMeBaby; - if (type == 8 || type == 10) { + if (type > 8) { this->scale = (Vec){40.0, 40.0, 40.0}; HitMeBaby.xDistToCenter = 0.0; @@ -372,22 +479,18 @@ int daShyGuy::onCreate() { // Tile collider OSReport("Making the Tile collider Class\n"); + // These fucking rects do something for the tile rect + spriteSomeRectX = 28.0f; + spriteSomeRectY = 32.0f; _320 = 0.0f; _324 = 16.0f; - spriteSomeRectX = 16.0f; - spriteSomeRectY = 16.0f; - - _338 = 256.0f; - _33C = 256.0f; - _340 = 256.0f + 80.0f; - _344 = 256.0f + 80.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}; - static const u8 one[16] = {0x01,0x80,0x41,0x01, 0xFF,0xFF,0x80,0x00, 0x00,0x00,0x70,0x00, 0x00,0x00,0xE0,0x00}; - static const u8 two[16] = {0x00,0x00,0x00,0x01, 0xFF,0xFF,0x80,0x00, 0x00,0x00,0x70,0x00, 0xFF,0xFF,0x20,0x00}; - static const u8 three[16] = {0x01,0x80,0x41,0x01, 0xFF,0xFF,0x90,0x00, 0x00,0x00,0x80,0x00, 0x00,0x00,0xE0,0x00}; - - collMgr.Init(this, two, one, three); + collMgr.Init(this, one, two, three); collMgr.execute(); cmgr_returnValue = collMgr.CollidedWithTile(); @@ -398,53 +501,40 @@ int daShyGuy::onCreate() { isBouncing = true; - // 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->speed.x = 0; - this->speed.y = 0.0; - this->x_speed_inc = 0.1; - this->Baseline = this->pos.y; - this->XSpeed = 1.0; - + // State Changers if (type == 0) { - doStateChange(&StateID_Walk); + doStateChange(&StateID_RealWalk); } else if (type == 1) { - doStateChange(&StateID_Sleep); + doStateChange(&StateID_Walk); } else if (type == 2) { - doStateChange(&StateID_Jump); + doStateChange(&StateID_Sleep); } else if (type == 3) { - doStateChange(&StateID_Balloon_H); + doStateChange(&StateID_Jump); } else if (type == 4) { - doStateChange(&StateID_Balloon_V); + doStateChange(&StateID_Judo); } else if (type == 5) { - doStateChange(&StateID_Balloon_C); + doStateChange(&StateID_Spike); } else if (type == 6) { - doStateChange(&StateID_Judo); + doStateChange(&StateID_Balloon_H); } else if (type == 7) { - doStateChange(&StateID_Spike); + doStateChange(&StateID_Balloon_V); } else if (type == 8) { - doStateChange(&StateID_Walk); + doStateChange(&StateID_Balloon_C); } else if (type == 9) { doStateChange(&StateID_RealWalk); } else if (type == 10) { - doStateChange(&StateID_RealWalk); + doStateChange(&StateID_Walk); } OSReport("Going to Execute ShyGuy\n"); @@ -474,15 +564,17 @@ int daShyGuy::onDraw() { bodyModel.scheduleForDrawing(); bodyModel._vf1C(); - balloonModel.scheduleForDrawing(); - balloonModelB.scheduleForDrawing(); + if (this->renderBalloon == 1) { + balloonModel.scheduleForDrawing(); + balloonModelB.scheduleForDrawing(); + } return true; } void daShyGuy::updateModelMatrices() { // This won't work with wrap because I'm lazy. - matrix.translation(pos.x, pos.y, pos.z); + matrix.translation(pos.x, pos.y - 2.0, pos.z); matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); bodyModel.setDrawMatrix(matrix); @@ -490,16 +582,15 @@ void daShyGuy::updateModelMatrices() { bodyModel.calcWorld(false); if (this->renderBalloon == 1) { - matrix.translation(pos.x, pos.y - 30.0, pos.z); + matrix.translation(pos.x, pos.y - 32.0, pos.z); balloonModel.setDrawMatrix(matrix); - balloonModel.setScale(1.5, 1.5, 1.5); + balloonModel.setScale(balloonSize, balloonSize, balloonSize); balloonModel.calcWorld(false); balloonModelB.setDrawMatrix(matrix); - balloonModelB.setScale(1.5, 1.5, 1.5); + balloonModelB.setScale(balloonSize, balloonSize, balloonSize); balloonModelB.calcWorld(false); - } } @@ -509,13 +600,11 @@ void daShyGuy::updateModelMatrices() { 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; } + this->rot.y = (direction) ? 0xD800 : 0x2800; } void daShyGuy::executeState_Walk() { - if (this->direction == 1) { this->pos.x -= 0.5; } - else { this->pos.x += 0.5; } + this->pos.x += (direction) ? -0.5 : 0.5; if(this->chrAnimation.isAnimationDone()) if (this->timer > (this->distance * 32)) { @@ -535,34 +624,29 @@ void daShyGuy::updateModelMatrices() { /////////////// void daShyGuy::beginState_Turn() { bindAnimChr_and_setUpdateRate("c18_IDLE_R", 1, 0.0, 1.0); - this->timer = 0; + this->direction ^= 1; + this->speed.x = 0.0; } void daShyGuy::executeState_Turn() { - 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->timer >= 15) { - doStateChange(&StateID_Walk); - } + u16 amt = (this->direction == 0) ? 0x2800 : 0xD800; + int done = SmoothRotation(&this->rot.y, amt, 0x800); - if(this->chrAnimation.isAnimationDone()) { - this->chrAnimation.setCurrentFrame(0.0); + if(done) { + this->doStateChange(&StateID_RealWalk); } - - this->timer += 1; } void daShyGuy::endState_Turn() { - if (this->direction == 1) { this->direction = 0; } - else { this->direction = 1; } } /////////////// // Jump State /////////////// void daShyGuy::beginState_Jump() { + this->max_speed.x = 0.0; + this->speed.x = 0.0; + this->x_speed_inc = 0.0; + this->timer = 0; this->jumpCounter = 0; } @@ -573,12 +657,7 @@ void daShyGuy::updateModelMatrices() { if (facing != this->direction) { this->direction = facing; - if (this->direction == 1) { - this->rot.y = 0xD800; - } - else { - this->rot.y = 0x2800; - } + this->rot.y = (direction) ? 0xD800 : 0x2800; } // Shy Guy is on ground @@ -892,39 +971,20 @@ void daShyGuy::updateModelMatrices() { 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.x = (direction) ? -1.0f : 1.0f; + + this->max_speed.y = -4.0; 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); - } - - // 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); + bool ret = calculateTileCollisions(); + if (ret) { + doStateChange(&StateID_RealTurn); } - DoStuffAndMarkDead(this, this->pos, 1.0); - if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } @@ -946,26 +1006,14 @@ void daShyGuy::updateModelMatrices() { 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); + int done = SmoothRotation(&this->rot.y, amt, 0x800); if(done) { this->doStateChange(&StateID_RealWalk); } } void daShyGuy::endState_RealTurn() { - this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; } /////////////// @@ -974,9 +1022,11 @@ void daShyGuy::updateModelMatrices() { void daShyGuy::beginState_GoDizzy() { bindAnimChr_and_setUpdateRate("c18_L_DMG_F_1_R", 1, 0.0, 1.0); - this->max_speed.y = -4.0; + CreateEffect(318, &(Vec){this->pos.x, this->pos.y + 24.0, 0}, 0); + + this->max_speed.y = -2.0; this->speed.x = 0; - this->speed.y = -4.0; + this->speed.y = -2.0; this->y_speed_inc = -0.1875; this->timer = 0; @@ -984,8 +1034,7 @@ void daShyGuy::updateModelMatrices() { this->isDown = 1; } void daShyGuy::executeState_GoDizzy() { - this->HandleYSpeed(); - this->doSpriteMovement(); + calculateTileCollisions(); // Needs tile collision shit here, because jumpers can get hit and fall downwards. @@ -1014,38 +1063,99 @@ void daShyGuy::updateModelMatrices() { // BalloonDrop State /////////////// void daShyGuy::beginState_BalloonDrop() { + bindAnimChr_and_setUpdateRate("c18_C_BLOCK_BREAK_R", 1, 0.0, 2.0); + + this->max_speed.x = 0.0; + this->speed.x = 0.0; + this->x_speed_inc = 0.0; + + this->max_speed.y = -2.0; + this->speed.y = -2.0; + this->y_speed_inc = -0.1875; + this->isDown = 1; + this->renderBalloon = 0; + CreateEffect(&(Vec){this->pos.x, this->pos.y - 32.0, 0}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 337); + + type = 0; } void daShyGuy::executeState_BalloonDrop() { + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + + bool ret = calculateTileCollisions(); + + if (speed.y == 0.0) { + CreateEffect(&(Vec){this->pos.x, this->pos.y, 0}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 6); + doStateChange(&StateID_GoDizzy); + } + } + void daShyGuy::endState_BalloonDrop() { } - void daShyGuy::endState_BalloonDrop() {} /////////////// // FireKnockBack State /////////////// void daShyGuy::beginState_FireKnockBack() { bindAnimChr_and_setUpdateRate("c18_C_BLOCK_BREAK_R", 1, 0.0, 1.0); - // this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; + this->direction ^= 1; + this->speed.x = (this->direction) ? -this->XSpeed / 6.0f : this->XSpeed / 6.0f; } void daShyGuy::executeState_FireKnockBack() { + + calculateTileCollisions(); // move backwards here if(this->chrAnimation.isAnimationDone()) { - // set state according to type + if (type == 0) { + doStateChange(&StateID_RealWalk); + } + else if (type == 1) { + doStateChange(&StateID_Walk); + } + else if (type == 2) { + doStateChange(&StateID_RealWalk); + } + else if (type == 3) { + doStateChange(&StateID_Jump); + } + else if (type == 4) { + doStateChange(&StateID_Judo); + } + else if (type == 5) { + doStateChange(&StateID_Spike); + } + else { + doStateChange(&StateID_RealWalk); + } } } - void daShyGuy::endState_FireKnockBack() {} + void daShyGuy::endState_FireKnockBack() { + this->direction ^= 1; + speed.x = (direction) ? -1.0f : 1.0f; + this->max_speed.x = (direction) ? -this->XSpeed : this->XSpeed; + } /////////////// // FlameHit State /////////////// void daShyGuy::beginState_FlameHit() { - bindAnimChr_and_setUpdateRate("c18_L_DMG_F_4_R", 1, 0.0, 1.0); + bindAnimChr_and_setUpdateRate("c18_C_BLOCK_BREAK_R", 1, 0.0, 1.0); } void daShyGuy::executeState_FlameHit() { + if(this->chrAnimation.isAnimationDone()) { - // set state according to type + if (type == 6) { + doStateChange(&StateID_Balloon_H); + } + else if (type == 7) { + doStateChange(&StateID_Balloon_V); + } + else if (type == 8) { + doStateChange(&StateID_Balloon_C); + } } } void daShyGuy::endState_FlameHit() {} @@ -1058,13 +1168,72 @@ void daShyGuy::updateModelMatrices() { } void daShyGuy::executeState_Recover() { - // Don't forget the tile collision shiz + calculateTileCollisions(); if(this->chrAnimation.isAnimationDone()) { - // set state according to type + if (type == 0) { + doStateChange(&StateID_RealWalk); + } + else if (type == 1) { + doStateChange(&StateID_Walk); + } + else if (type == 2) { + doStateChange(&StateID_RealWalk); + } + else if (type == 3) { + doStateChange(&StateID_Jump); + } + else if (type == 4) { + doStateChange(&StateID_Judo); + } + else if (type == 5) { + doStateChange(&StateID_Spike); + } + else { + doStateChange(&StateID_RealWalk); + } } } void daShyGuy::endState_Recover() { this->isDown = 0; + this->rot.y = (direction) ? 0xD800 : 0x2800; + } + +/////////////// +// Die State +/////////////// + void daShyGuy::beginState_Die() { + dEn_c::dieFall_Begin(); + + bindAnimChr_and_setUpdateRate("c18_C_BLOCK_BREAK_R", 1, 0.0, 2.0); + this->timer = 0; + this->dying = -10.0; + this->Baseline = this->pos.y; + } + void daShyGuy::executeState_Die() { + + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + + this->timer += 1; + + this->pos.x += 0.5; + this->pos.y = Baseline + (-0.2 * dying * dying) + 20.0; + + this->dying += 0.5; + + this->dEn_c::dieFall_Execute(); + + if (this->timer > 450) { + this->kill(); + return; + } + + dEn_c::dieFall_Execute(); + + } + void daShyGuy::endState_Die() { + dEn_c::dieFall_End(); } |