diff options
-rwxr-xr-x | include/game.h | 4 | ||||
-rw-r--r-- | src/shyguy.cpp | 348 |
2 files changed, 307 insertions, 45 deletions
diff --git a/include/game.h b/include/game.h index a7bafac..9dd1605 100755 --- a/include/game.h +++ b/include/game.h @@ -1160,7 +1160,7 @@ public: class ActivePhysics {
public:
struct Info; // forward declaration
- typedef void (*Callback)(Info *self, Info *other);
+ typedef void (*Callback)(ActivePhysics *self, ActivePhysics *other);
struct Info {
float xDistToCenter;
@@ -1912,7 +1912,7 @@ public: ~dEn_c();
- static void collisionCallback(ActivePhysics::Info *one, ActivePhysics::Info *two);
+ static void collisionCallback(ActivePhysics *one, ActivePhysics *two);
void doSpriteMovement();
bool CheckIfPlayerBelow(float,float);
diff --git a/src/shyguy.cpp b/src/shyguy.cpp index a81143f..f524cb9 100644 --- a/src/shyguy.cpp +++ b/src/shyguy.cpp @@ -10,16 +10,18 @@ // 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 -// 6 - Judo Master -// 7 - Spike Thrower +// 10 - Walking Giatn // 8 - Pacing Giant -// +// // Nybble 6: Colour // 0 - Red // 1 - Blue @@ -58,20 +60,40 @@ class daShyGuy : public dEn_c { m3d::anmChr_c chrAnimation; + int type; int timer; int jumpCounter; float Baseline; char damage; + char isDown; char renderBalloon; Vec initialPos; int distance; float XSpeed; + u32 cmgr_returnValue; + bool isBouncing; static daShyGuy *build(); void bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate); void updateModelMatrices(); + void shyCollisionCallback(ActivePhysics *apThis, ActivePhysics *apOther); + + + // void spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); + void yoshiCollision(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 collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); + // bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); + void collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther); + + USING_STATES(daShyGuy); DECLARE_STATE(Walk); DECLARE_STATE(Turn); @@ -84,6 +106,12 @@ class daShyGuy : public dEn_c { DECLARE_STATE(Balloon_C); DECLARE_STATE(Judo); DECLARE_STATE(Spike); + + DECLARE_STATE(GoDizzy); + DECLARE_STATE(BalloonDrop); + DECLARE_STATE(FireKnockBack); + DECLARE_STATE(FlameHit); + DECLARE_STATE(Recover); }; daShyGuy *daShyGuy::build() { @@ -91,29 +119,162 @@ daShyGuy *daShyGuy::build() { return new(buffer) daShyGuy; } -extern "C" void *PlaySound(daShyGuy *, int soundID); +/////////////////////// +// Externs and States +/////////////////////// + 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); + CREATE_STATE(daShyGuy, Balloon_V); + CREATE_STATE(daShyGuy, Balloon_C); + CREATE_STATE(daShyGuy, Judo); + CREATE_STATE(daShyGuy, Spike); + + CREATE_STATE(daShyGuy, GoDizzy); + CREATE_STATE(daShyGuy, BalloonDrop); + CREATE_STATE(daShyGuy, FireKnockBack); + CREATE_STATE(daShyGuy, FlameHit); + CREATE_STATE(daShyGuy, Recover); + +//////////////////////// +// Collision Functions +//////////////////////// + + // Collision callback to help shy guy not die at inappropriate times and ruin the dinner + + void daShyGuy::shyCollisionCallback(ActivePhysics *apThis, ActivePhysics *apOther) { + if (apOther->owner->name != 89) { + this->collisionCallback(apThis, apOther); + } + } + + // spriteCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + // if (apThis->owner->shyGuyState == #notPickupable) { Do Normal Things; } + // else { Shy Guy is in throwy mode, and should kill enemies instead; } + // } + + void daShyGuy::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + + dStateBase_c *stateVar; + dStateBase_c *deathState; + + if (this->type < 6) { // Regular Shy Guys + stateVar = &StateID_GoDizzy; + deathState = &StateID_DieFall; + } + else if (this->type > 8) { // Giants + stateVar = &StateID_DieFall; + deathState = &StateID_DieFall; + } + else { // Ballooneers + stateVar = &StateID_BalloonDrop; + deathState = &StateID_DieFumi; + } + + char hitType; + if (this->isDown == 0) { + hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 2); + } + else { // Shy Guy is in throwy mode + hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 0); + } + + if(hitType == 1) { // regular jump + apOther->someFlagByte |= 2; + if (this->isDown == 0) { + doStateChange(stateVar); + } + else { // Shy Guy is in throwy mode - kill it with fire + doStateChange(deathState); + } + } + else if(hitType == 3) { // spinning jump or whatever? + apOther->someFlagByte |= 2; + if (this->isDown == 0) { + doStateChange(stateVar); + } + else { // Shy Guy is in throwy mode - kill it with fire + doStateChange(deathState); + } + } + else if(hitType == 0) { + this->dEn_c::playerCollision(apThis, apOther); + this->_vf220(apOther->owner); + } + // else if(hitType == 2) { \\ Minimario? } + + + // fix multiple player collisions via megazig + this->isDead = 0; + this->flags_4FC |= (1<<(31-7)); + if(apOther->owner->which_player > 3) { + OSReport("!!!ATTENTION!!!\napOther->owner->which_player > 3\n"); + }else{ + this->counter_504[apOther->owner->which_player] = 0; + } + } + + void daShyGuy::yoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + this->playerCollision(apThis, apOther); + } -extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); -extern "C" u8 dSprite_c__getXDirectionOfFurthestPlayerRelativeToVEC3(daShyGuy *, Vec pos); + void daShyGuy::collisionCatD_GroundPound(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_DieFall); + } -//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); + void daShyGuy::collisionCat9_RollingObject(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_DieFall); + } + void daShyGuy::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { + this->damage += 1; -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); -CREATE_STATE(daShyGuy, Balloon_V); -CREATE_STATE(daShyGuy, Balloon_C); -CREATE_STATE(daShyGuy, Judo); -CREATE_STATE(daShyGuy, Spike); + dStateBase_c *stateVar; + + if (this->type > 3) { // Jumpers + stateVar = &StateID_DieSmoke; + } + else if (this->type < 6) { // Regular Shy Guys Except Jumper + stateVar = &StateID_FireKnockBack; + } + else if (this->type > 8) { // Giants + return; + } + else { // Ballooneers + stateVar = &StateID_FlameHit; + } + + if (this->damage > 2) { + doStateChange(&StateID_DieSmoke); + } + else { + doStateChange(stateVar); + } + } + + // void daShyGuy::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { + // doStateChange(&StateID_DieFall); + // } + + void daShyGuy::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_DieFall); + } void daShyGuy::bindAnimChr_and_setUpdateRate(const char* name, int unk, float unk2, float rate) { @@ -125,7 +286,7 @@ void daShyGuy::bindAnimChr_and_setUpdateRate(const char* name, int unk, float un int daShyGuy::onCreate() { - int type = this->settings >> 28 & 0xF; + this->type = this->settings >> 28 & 0xF; int anim = this->settings >> 24 & 0xF; int baln = this->settings >> 20 & 0xF; this->distance = this->settings >> 12 & 0xF; @@ -201,7 +362,7 @@ int daShyGuy::onCreate() { HitMeBaby.bitfield1 = 0x4F; HitMeBaby.bitfield2 = 0x8828E; HitMeBaby.unkShort1C = 0; - HitMeBaby.callback = &dEn_c::collisionCallback; + HitMeBaby.callback = shyCollisionCallback; OSReport("Making the Physics Class and adding to the list\n"); this->aPhysics.initWithStruct(this, &HitMeBaby); @@ -209,30 +370,31 @@ int daShyGuy::onCreate() { // Tile collider OSReport("Making the Tile collider Class\n"); - u8 struct_1[] = { 0, 0, 0, 1, 0xff, 0xff, 0x40, 0, 0, 0, 0xc0, 0, 0, 0, 0, 0 }; - u8 struct_3[] = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0x3f, 0x2a, 0x7e, 0xfa }; - 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; + _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; - // 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; + 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}; - // this->_518 = 2; + collMgr.Init(this, two, one, three); + collMgr.execute(); - // this->_120 |= 0x200; - // this->_36D = 0; - // this->_518 = 2; + cmgr_returnValue = collMgr.CollidedWithTile(); + + if (collMgr.CollidedWithTile()) + isBouncing = false; + else + isBouncing = true; // Stuff I do understand @@ -805,3 +967,103 @@ void daShyGuy::updateModelMatrices() { this->max_speed.x = (this->direction) ? -this->XSpeed : this->XSpeed; } +/////////////// +// GoDizzy State +/////////////// + void daShyGuy::beginState_GoDizzy() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_1_R", 1, 0.0, 1.0); + + this->max_speed.y = -4.0; + this->speed.x = 0; + this->speed.y = -4.0; + this->y_speed_inc = -0.1875; + + this->timer = 0; + this->jumpCounter = 0; + this->isDown = 1; + } + void daShyGuy::executeState_GoDizzy() { + this->HandleYSpeed(); + this->doSpriteMovement(); + + // Needs tile collision shit here, because jumpers can get hit and fall downwards. + + if (this->jumpCounter == 0) { + if(this->chrAnimation.isAnimationDone()) { + this->jumpCounter = 1; + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_3_R", 1, 0.0, 1.0); + } + } + + else { + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + + if (this->timer > 600) { + doStateChange(&StateID_Recover) + } + + this->timer += 1; + } + } + void daShyGuy::endState_GoDizzy() {} + +/////////////// +// BalloonDrop State +/////////////// + void daShyGuy::beginState_BalloonDrop() { + this->isDown = 1; + } + void daShyGuy::executeState_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; + } + void daShyGuy::executeState_FireKnockBack() { + // move backwards here + + if(this->chrAnimation.isAnimationDone()) { + // set state according to type + } + } + void daShyGuy::endState_FireKnockBack() {} + +/////////////// +// FlameHit State +/////////////// + void daShyGuy::beginState_FlameHit() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_4_R", 1, 0.0, 1.0); + } + void daShyGuy::executeState_FlameHit() { + if(this->chrAnimation.isAnimationDone()) { + // set state according to type + } + } + void daShyGuy::endState_FlameHit() {} + +/////////////// +// Recover State +/////////////// + void daShyGuy::beginState_Recover() { + bindAnimChr_and_setUpdateRate("c18_L_DMG_F_4_R", 1, 0.0, 1.0); + } + void daShyGuy::executeState_Recover() { + + // Don't forget the tile collision shiz + + if(this->chrAnimation.isAnimationDone()) { + // set state according to type + } + } + void daShyGuy::endState_Recover() { + this->isDown = 0; + } + |