diff options
Diffstat (limited to 'src/topman.cpp')
-rw-r--r-- | src/topman.cpp | 119 |
1 files changed, 101 insertions, 18 deletions
diff --git a/src/topman.cpp b/src/topman.cpp index 4509272..a255a82 100644 --- a/src/topman.cpp +++ b/src/topman.cpp @@ -27,6 +27,7 @@ class daTopman : public dEn_c { bool isBouncing; char isInSpace; char fromBehind; + char isWaiting; static daTopman *build(); @@ -51,10 +52,13 @@ class daTopman : public dEn_c { void _vf148(); void _vf14C(); + bool CreateIceActors(); + void addScoreWhenHit(void *other); USING_STATES(daTopman); DECLARE_STATE(Walk); DECLARE_STATE(Turn); + DECLARE_STATE(Wait); DECLARE_STATE(KnockBack); DECLARE_STATE(Die); }; @@ -81,6 +85,7 @@ daTopman *daTopman::build() { CREATE_STATE(daTopman, Walk); CREATE_STATE(daTopman, Turn); + CREATE_STATE(daTopman, Wait); CREATE_STATE(daTopman, KnockBack); CREATE_STATE(daTopman, Die); @@ -106,20 +111,18 @@ daTopman *daTopman::build() { hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 0); if(hitType == 1) { // regular jump - apOther->someFlagByte |= 2; - this->dEn_c::playerCollision(apThis, apOther); this->_vf220(apOther->owner); } else if(hitType == 3) { // spinning jump or whatever? - apOther->someFlagByte |= 2; - this->dEn_c::playerCollision(apThis, apOther); this->_vf220(apOther->owner); } else if(hitType == 0) { EN_LandbarrelPlayerCollision(this, apThis, apOther); - if (this->direction == apOther->owner->direction) { - this->direction ^= 1; - this->fromBehind = 1; + if (this->pos.x > apOther->owner->pos.x) { + this->direction = 1; + } + else { + this->direction = 0; } doStateChange(&StateID_KnockBack); } @@ -163,6 +166,10 @@ daTopman *daTopman::build() { doStateChange(&StateID_Die); } + void daTopman::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_Die); + } + void daTopman::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther){ doStateChange(&StateID_KnockBack); } @@ -189,10 +196,35 @@ daTopman *daTopman::build() { doStateChange(&StateID_Die); } - void daTopman::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { - doStateChange(&StateID_Die); + struct DoSomethingCool { + u32 unk_01; //0000 + Vec3 pos; //0004 + Vec3 scale; //0010 + f32 unk_02; //001C + f32 unk_03; //0020 + f32 unk_04; //0024 + f32 unk_05; //0028 + f32 unk_06; //002C + f32 unk_07; //0030 + f32 unk_08; //0034 + f32 unk_09; //0038 + } my_struct; + + extern "C" void sub_80024C20(void); + extern "C" void __destroy_arr(void*, void(*)(void), int, int); + //extern "C" __destroy_arr(struct DoSomethingCool, void(*)(void), int cnt, int bar); + + bool daTopman::CreateIceActors() + { + struct DoSomethingCool my_struct = { 0, this->pos, {2.5, 2.5, 2.5}, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + this->frzMgr.Create_ICEACTORs( (void*)&my_struct, 1 ); + __destroy_arr( (void*)&my_struct, sub_80024C20, 0x3C, 1 ); + return true; } + void daTopman::addScoreWhenHit(void *other) {} + + bool daTopman::calculateTileCollisions() { // Returns true if sprite should turn, false if not. @@ -303,6 +335,7 @@ int daTopman::onCreate() { this->XSpeed = 0.8; this->isInSpace = this->settings & 0xF; + this->isWaiting = (this->settings >> 4) & 0xF; this->fromBehind = 0; ActivePhysics::Info HitMeBaby; @@ -352,7 +385,10 @@ int daTopman::onCreate() { // State Changers bindAnimChr_and_setUpdateRate("begoman_wait2", 1, 0.0, 1.0); - doStateChange(&StateID_Walk); + if (this->isWaiting == 0) { + doStateChange(&StateID_Walk); } + else { + doStateChange(&StateID_Wait); } this->onExecute(); return true; @@ -371,7 +407,6 @@ int daTopman::onExecute() { int daTopman::onDraw() { bodyModel.scheduleForDrawing(); - bodyModel._vf1C(); return true; } @@ -399,16 +434,20 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Walk() { + PlaySound(this, SE_BOSS_JR_CROWN_JR_RIDE); // 5 + bool ret = calculateTileCollisions(); if (ret) { doStateChange(&StateID_Turn); } + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } } - void daTopman::endState_Walk() { } + void daTopman::endState_Walk() { this->timer += 1; } + /////////////// // Turn State @@ -419,6 +458,7 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Turn() { + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } @@ -434,6 +474,34 @@ void daTopman::updateModelMatrices() { /////////////// +// Wait State +/////////////// + void daTopman::beginState_Wait() { + this->max_speed.x = 0; + this->speed.x = 0; + + this->max_speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->y_speed_inc = (this->isInSpace) ? -0.09375 : -0.1875; + } + void daTopman::executeState_Wait() { + + PlaySound(this, SE_BOSS_JR_CROWN_JR_RIDE); // 5 + + bool ret = calculateTileCollisions(); + if (ret) { + doStateChange(&StateID_Turn); + } + + bodyModel._vf1C(); + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + } + void daTopman::endState_Wait() { } + + +/////////////// // Die State /////////////// void daTopman::beginState_Die() { @@ -444,6 +512,9 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Die() { + bodyModel._vf1C(); + + PlaySound(this, SE_EMY_MECHAKOOPA_DAMAGE); if(this->chrAnimation.isAnimationDone()) { this->kill(); this->Delete(1); @@ -457,24 +528,36 @@ void daTopman::updateModelMatrices() { /////////////// void daTopman::beginState_KnockBack() { bindAnimChr_and_setUpdateRate("begoman_damage", 1, 0.0, 0.75); - this->timer = 0; + this->max_speed.x = (this->direction) ? this->XSpeed*5.0 : -this->XSpeed*5.0; - this->speed.x = (direction) ? 4.0f : -4.0f; + this->speed.x = (this->direction) ? 4.0f : -4.0f; } void daTopman::executeState_KnockBack() { bool ret = calculateTileCollisions(); this->speed.x = this->speed.x / 1.1; + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { - doStateChange(&StateID_Walk); + if (this->isWaiting == 0) { + doStateChange(&StateID_Walk); } + else { + doStateChange(&StateID_Wait); } } } void daTopman::endState_KnockBack() { - if (this->fromBehind == 0) { - this->direction ^= 1; } - this->fromBehind = 0; + if (this->rot.y == 0x2800) { + // CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 175); + this->direction = 0; + } + else { + // CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 192); + this->direction = 1; + } + // OSReport("Rotation: %x", this->rot.y); + // OSReport("Direction: %d", this->direction); + // this->direction ^= 1; bindAnimChr_and_setUpdateRate("begoman_wait2", 1, 0.0, 1.0); }
\ No newline at end of file |