diff --git a/DataSpec/DNACommon/Tweaks/ITweakBall.hpp b/DataSpec/DNACommon/Tweaks/ITweakBall.hpp index 17f64287b..3002d7cb0 100644 --- a/DataSpec/DNACommon/Tweaks/ITweakBall.hpp +++ b/DataSpec/DNACommon/Tweaks/ITweakBall.hpp @@ -10,9 +10,11 @@ struct ITweakBall : ITweak virtual float GetMaxBallTranslationAcceleration(int s) const=0; virtual float GetBallTranslationFriction(int s) const=0; virtual float GetBallTranslationMaxSpeed(int s) const=0; + virtual float GetSpiderBallRollSpeed() const=0; virtual float GetBallCameraControlDistance() const=0; virtual float GetLeftStickDivisor() const=0; virtual float GetRightStickDivisor() const=0; + virtual float GetBallTouchRadius() const=0; }; } diff --git a/DataSpec/DNAMP1/Tweaks/CTweakBall.cpp b/DataSpec/DNAMP1/Tweaks/CTweakBall.cpp index 05f438d24..921009d69 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakBall.cpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakBall.cpp @@ -7,53 +7,53 @@ namespace DNAMP1 void CTweakBall::read(athena::io::IStreamReader& __dna_reader) { - /* x4_[0] */ + /* x4_maxTranslationAcceleration[0] */ x4_maxTranslationAcceleration[0] = __dna_reader.readFloatBig(); - /* x4_[1] */ + /* x4_maxTranslationAcceleration[1] */ x4_maxTranslationAcceleration[1] = __dna_reader.readFloatBig(); - /* x4_[2] */ + /* x4_maxTranslationAcceleration[2] */ x4_maxTranslationAcceleration[2] = __dna_reader.readFloatBig(); - /* x4_[3] */ + /* x4_maxTranslationAcceleration[3] */ x4_maxTranslationAcceleration[3] = __dna_reader.readFloatBig(); - /* x4_[4] */ + /* x4_maxTranslationAcceleration[4] */ x4_maxTranslationAcceleration[4] = __dna_reader.readFloatBig(); - /* x4_[5] */ + /* x4_maxTranslationAcceleration[5] */ x4_maxTranslationAcceleration[5] = __dna_reader.readFloatBig(); - /* x4_[6] */ + /* x4_maxTranslationAcceleration[6] */ x4_maxTranslationAcceleration[6] = __dna_reader.readFloatBig(); - /* x4_[7] */ + /* x4_maxTranslationAcceleration[7] */ x4_maxTranslationAcceleration[7] = __dna_reader.readFloatBig(); - /* x24_[0] */ + /* x24_translationFriction[0] */ x24_translationFriction[0] = __dna_reader.readFloatBig(); - /* x24_[1] */ + /* x24_translationFriction[1] */ x24_translationFriction[1] = __dna_reader.readFloatBig(); - /* x24_[2] */ + /* x24_translationFriction[2] */ x24_translationFriction[2] = __dna_reader.readFloatBig(); - /* x24_[3] */ + /* x24_translationFriction[3] */ x24_translationFriction[3] = __dna_reader.readFloatBig(); - /* x24_[4] */ + /* x24_translationFriction[4] */ x24_translationFriction[4] = __dna_reader.readFloatBig(); - /* x24_[5] */ + /* x24_translationFriction[5] */ x24_translationFriction[5] = __dna_reader.readFloatBig(); - /* x24_[6] */ + /* x24_translationFriction[6] */ x24_translationFriction[6] = __dna_reader.readFloatBig(); - /* x24_[7] */ + /* x24_translationFriction[7] */ x24_translationFriction[7] = __dna_reader.readFloatBig(); - /* x44_[0] */ + /* x44_translationMaxSpeed[0] */ x44_translationMaxSpeed[0] = __dna_reader.readFloatBig(); - /* x44_[1] */ + /* x44_translationMaxSpeed[1] */ x44_translationMaxSpeed[1] = __dna_reader.readFloatBig(); - /* x44_[2] */ + /* x44_translationMaxSpeed[2] */ x44_translationMaxSpeed[2] = __dna_reader.readFloatBig(); - /* x44_[3] */ + /* x44_translationMaxSpeed[3] */ x44_translationMaxSpeed[3] = __dna_reader.readFloatBig(); - /* x44_[4] */ + /* x44_translationMaxSpeed[4] */ x44_translationMaxSpeed[4] = __dna_reader.readFloatBig(); - /* x44_[5] */ + /* x44_translationMaxSpeed[5] */ x44_translationMaxSpeed[5] = __dna_reader.readFloatBig(); - /* x44_[6] */ + /* x44_translationMaxSpeed[6] */ x44_translationMaxSpeed[6] = __dna_reader.readFloatBig(); - /* x44_[7] */ + /* x44_translationMaxSpeed[7] */ x44_translationMaxSpeed[7] = __dna_reader.readFloatBig(); /* x64_ */ x64_ = __dna_reader.readFloatBig(); @@ -79,8 +79,8 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader) xc4_[6] = __dna_reader.readFloatBig(); /* xc4_[7] */ xc4_[7] = __dna_reader.readFloatBig(); - /* xe4_ */ - xe4_ = __dna_reader.readFloatBig(); + /* xe4_spiderBallRollSpeed */ + xe4_spiderBallRollSpeed = __dna_reader.readFloatBig(); /* xe8_ */ xe8_ = __dna_reader.readFloatBig(); /* x14c_ */ @@ -191,20 +191,20 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader) x1c8_ = __dna_reader.readFloatBig(); /* x1cc_ */ x1cc_ = __dna_reader.readFloatBig(); - /* x1d0_ */ + /* x1d0_ballCameraControlDistance */ x1d0_ballCameraControlDistance = __dna_reader.readFloatBig(); /* x1d4_ */ x1d4_ = __dna_reader.readFloatBig(); /* x1d8_ */ x1d8_ = __dna_reader.readFloatBig(); - /* x1e4_ */ + /* x1e4_leftStickDivisor */ x1e4_leftStickDivisor = __dna_reader.readFloatBig(); - /* x1e8_ */ + /* x1e8_rightStickDivisor */ x1e8_rightStickDivisor = __dna_reader.readFloatBig(); /* x200_ */ x200_ = __dna_reader.readFloatBig(); - /* x204_ */ - x204_ = __dna_reader.readFloatBig(); + /* x204_ballTouchRadius */ + x204_ballTouchRadius = __dna_reader.readFloatBig(); /* x20c_ */ x20c_ = __dna_reader.readFloatBig(); /* x218_ */ @@ -227,53 +227,53 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader) void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const { - /* x4_[0] */ + /* x4_maxTranslationAcceleration[0] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[0]); - /* x4_[1] */ + /* x4_maxTranslationAcceleration[1] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[1]); - /* x4_[2] */ + /* x4_maxTranslationAcceleration[2] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[2]); - /* x4_[3] */ + /* x4_maxTranslationAcceleration[3] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[3]); - /* x4_[4] */ + /* x4_maxTranslationAcceleration[4] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[4]); - /* x4_[5] */ + /* x4_maxTranslationAcceleration[5] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[5]); - /* x4_[6] */ + /* x4_maxTranslationAcceleration[6] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[6]); - /* x4_[7] */ + /* x4_maxTranslationAcceleration[7] */ __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[7]); - /* x24_[0] */ + /* x24_translationFriction[0] */ __dna_writer.writeFloatBig(x24_translationFriction[0]); - /* x24_[1] */ + /* x24_translationFriction[1] */ __dna_writer.writeFloatBig(x24_translationFriction[1]); - /* x24_[2] */ + /* x24_translationFriction[2] */ __dna_writer.writeFloatBig(x24_translationFriction[2]); - /* x24_[3] */ + /* x24_translationFriction[3] */ __dna_writer.writeFloatBig(x24_translationFriction[3]); - /* x24_[4] */ + /* x24_translationFriction[4] */ __dna_writer.writeFloatBig(x24_translationFriction[4]); - /* x24_[5] */ + /* x24_translationFriction[5] */ __dna_writer.writeFloatBig(x24_translationFriction[5]); - /* x24_[6] */ + /* x24_translationFriction[6] */ __dna_writer.writeFloatBig(x24_translationFriction[6]); - /* x24_[7] */ + /* x24_translationFriction[7] */ __dna_writer.writeFloatBig(x24_translationFriction[7]); - /* x44_[0] */ + /* x44_translationMaxSpeed[0] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[0]); - /* x44_[1] */ + /* x44_translationMaxSpeed[1] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[1]); - /* x44_[2] */ + /* x44_translationMaxSpeed[2] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[2]); - /* x44_[3] */ + /* x44_translationMaxSpeed[3] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[3]); - /* x44_[4] */ + /* x44_translationMaxSpeed[4] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[4]); - /* x44_[5] */ + /* x44_translationMaxSpeed[5] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[5]); - /* x44_[6] */ + /* x44_translationMaxSpeed[6] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[6]); - /* x44_[7] */ + /* x44_translationMaxSpeed[7] */ __dna_writer.writeFloatBig(x44_translationMaxSpeed[7]); /* x64_ */ __dna_writer.writeFloatBig(x64_); @@ -299,8 +299,8 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const __dna_writer.writeFloatBig(xc4_[6]); /* xc4_[7] */ __dna_writer.writeFloatBig(xc4_[7]); - /* xe4_ */ - __dna_writer.writeFloatBig(xe4_); + /* xe4_spiderBallRollSpeed */ + __dna_writer.writeFloatBig(xe4_spiderBallRollSpeed); /* xe8_ */ __dna_writer.writeFloatBig(xe8_); /* x14c_ */ @@ -411,20 +411,20 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const __dna_writer.writeFloatBig(x1c8_); /* x1cc_ */ __dna_writer.writeFloatBig(x1cc_); - /* x1d0_ */ + /* x1d0_ballCameraControlDistance */ __dna_writer.writeFloatBig(x1d0_ballCameraControlDistance); /* x1d4_ */ __dna_writer.writeFloatBig(x1d4_); /* x1d8_ */ __dna_writer.writeFloatBig(x1d8_); - /* x1e4_ */ + /* x1e4_leftStickDivisor */ __dna_writer.writeFloatBig(x1e4_leftStickDivisor); - /* x1e8_ */ + /* x1e8_rightStickDivisor */ __dna_writer.writeFloatBig(x1e8_rightStickDivisor); /* x200_ */ __dna_writer.writeFloatBig(x200_); - /* x204_ */ - __dna_writer.writeFloatBig(x204_); + /* x204_ballTouchRadius */ + __dna_writer.writeFloatBig(x204_ballTouchRadius); /* x20c_ */ __dna_writer.writeFloatBig(x20c_); /* x218_ */ @@ -447,68 +447,68 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin) { - /* x4_ */ + /* x4_maxTranslationAcceleration */ size_t __x4_Count; - if (auto v = __dna_docin.enterSubVector("x4_", __x4_Count)) + if (auto v = __dna_docin.enterSubVector("x4_maxTranslationAcceleration", __x4_Count)) { - /* x4_[0] */ - x4_maxTranslationAcceleration[0] = __dna_docin.readFloat("x4_"); - /* x4_[1] */ - x4_maxTranslationAcceleration[1] = __dna_docin.readFloat("x4_"); - /* x4_[2] */ - x4_maxTranslationAcceleration[2] = __dna_docin.readFloat("x4_"); - /* x4_[3] */ - x4_maxTranslationAcceleration[3] = __dna_docin.readFloat("x4_"); - /* x4_[4] */ - x4_maxTranslationAcceleration[4] = __dna_docin.readFloat("x4_"); - /* x4_[5] */ - x4_maxTranslationAcceleration[5] = __dna_docin.readFloat("x4_"); - /* x4_[6] */ - x4_maxTranslationAcceleration[6] = __dna_docin.readFloat("x4_"); - /* x4_[7] */ - x4_maxTranslationAcceleration[7] = __dna_docin.readFloat("x4_"); + /* x4_maxTranslationAcceleration[0] */ + x4_maxTranslationAcceleration[0] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[1] */ + x4_maxTranslationAcceleration[1] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[2] */ + x4_maxTranslationAcceleration[2] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[3] */ + x4_maxTranslationAcceleration[3] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[4] */ + x4_maxTranslationAcceleration[4] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[5] */ + x4_maxTranslationAcceleration[5] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[6] */ + x4_maxTranslationAcceleration[6] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); + /* x4_maxTranslationAcceleration[7] */ + x4_maxTranslationAcceleration[7] = __dna_docin.readFloat("x4_maxTranslationAcceleration"); } - /* x24_ */ + /* x24_translationFriction */ size_t __x24_Count; - if (auto v = __dna_docin.enterSubVector("x24_", __x24_Count)) + if (auto v = __dna_docin.enterSubVector("x24_translationFriction", __x24_Count)) { - /* x24_[0] */ - x24_translationFriction[0] = __dna_docin.readFloat("x24_"); - /* x24_[1] */ - x24_translationFriction[1] = __dna_docin.readFloat("x24_"); - /* x24_[2] */ - x24_translationFriction[2] = __dna_docin.readFloat("x24_"); - /* x24_[3] */ - x24_translationFriction[3] = __dna_docin.readFloat("x24_"); - /* x24_[4] */ - x24_translationFriction[4] = __dna_docin.readFloat("x24_"); - /* x24_[5] */ - x24_translationFriction[5] = __dna_docin.readFloat("x24_"); - /* x24_[6] */ - x24_translationFriction[6] = __dna_docin.readFloat("x24_"); - /* x24_[7] */ - x24_translationFriction[7] = __dna_docin.readFloat("x24_"); + /* x24_translationFriction[0] */ + x24_translationFriction[0] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[1] */ + x24_translationFriction[1] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[2] */ + x24_translationFriction[2] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[3] */ + x24_translationFriction[3] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[4] */ + x24_translationFriction[4] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[5] */ + x24_translationFriction[5] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[6] */ + x24_translationFriction[6] = __dna_docin.readFloat("x24_translationFriction"); + /* x24_translationFriction[7] */ + x24_translationFriction[7] = __dna_docin.readFloat("x24_translationFriction"); } - /* x44_ */ + /* x44_translationMaxSpeed */ size_t __x44_Count; - if (auto v = __dna_docin.enterSubVector("x44_", __x44_Count)) + if (auto v = __dna_docin.enterSubVector("x44_translationMaxSpeed", __x44_Count)) { - /* x44_[0] */ - x44_translationMaxSpeed[0] = __dna_docin.readFloat("x44_"); - /* x44_[1] */ - x44_translationMaxSpeed[1] = __dna_docin.readFloat("x44_"); - /* x44_[2] */ - x44_translationMaxSpeed[2] = __dna_docin.readFloat("x44_"); - /* x44_[3] */ - x44_translationMaxSpeed[3] = __dna_docin.readFloat("x44_"); - /* x44_[4] */ - x44_translationMaxSpeed[4] = __dna_docin.readFloat("x44_"); - /* x44_[5] */ - x44_translationMaxSpeed[5] = __dna_docin.readFloat("x44_"); - /* x44_[6] */ - x44_translationMaxSpeed[6] = __dna_docin.readFloat("x44_"); - /* x44_[7] */ - x44_translationMaxSpeed[7] = __dna_docin.readFloat("x44_"); + /* x44_translationMaxSpeed[0] */ + x44_translationMaxSpeed[0] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[1] */ + x44_translationMaxSpeed[1] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[2] */ + x44_translationMaxSpeed[2] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[3] */ + x44_translationMaxSpeed[3] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[4] */ + x44_translationMaxSpeed[4] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[5] */ + x44_translationMaxSpeed[5] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[6] */ + x44_translationMaxSpeed[6] = __dna_docin.readFloat("x44_translationMaxSpeed"); + /* x44_translationMaxSpeed[7] */ + x44_translationMaxSpeed[7] = __dna_docin.readFloat("x44_translationMaxSpeed"); } /* x64_ */ x64_ = __dna_docin.readFloat("x64_"); @@ -539,8 +539,8 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin) /* xc4_[7] */ xc4_[7] = __dna_docin.readFloat("xc4_"); } - /* xe4_ */ - xe4_ = __dna_docin.readFloat("xe4_"); + /* xe4_spiderBallRollSpeed */ + xe4_spiderBallRollSpeed = __dna_docin.readFloat("xe4_spiderBallRollSpeed"); /* xe8_ */ xe8_ = __dna_docin.readFloat("xe8_"); /* x14c_ */ @@ -651,20 +651,20 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin) x1c8_ = __dna_docin.readFloat("x1c8_"); /* x1cc_ */ x1cc_ = __dna_docin.readFloat("x1cc_"); - /* x1d0_ */ - x1d0_ballCameraControlDistance = __dna_docin.readFloat("x1d0_"); + /* x1d0_ballCameraControlDistance */ + x1d0_ballCameraControlDistance = __dna_docin.readFloat("x1d0_ballCameraControlDistance"); /* x1d4_ */ x1d4_ = __dna_docin.readFloat("x1d4_"); /* x1d8_ */ x1d8_ = __dna_docin.readFloat("x1d8_"); - /* x1e4_ */ - x1e4_leftStickDivisor = __dna_docin.readFloat("x1e4_"); - /* x1e8_ */ - x1e8_rightStickDivisor = __dna_docin.readFloat("x1e8_"); + /* x1e4_leftStickDivisor */ + x1e4_leftStickDivisor = __dna_docin.readFloat("x1e4_leftStickDivisor"); + /* x1e8_rightStickDivisor */ + x1e8_rightStickDivisor = __dna_docin.readFloat("x1e8_rightStickDivisor"); /* x200_ */ x200_ = __dna_docin.readFloat("x200_"); - /* x204_ */ - x204_ = __dna_docin.readFloat("x204_"); + /* x204_ballTouchRadius */ + x204_ballTouchRadius = __dna_docin.readFloat("x204_ballTouchRadius"); /* x20c_ */ x20c_ = __dna_docin.readFloat("x20c_"); /* x218_ */ @@ -687,65 +687,65 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin) void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const { - /* x4_ */ - if (auto v = __dna_docout.enterSubVector("x4_")) + /* x4_maxTranslationAcceleration */ + if (auto v = __dna_docout.enterSubVector("x4_maxTranslationAcceleration")) { - /* x4_[0] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[0]); - /* x4_[1] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[1]); - /* x4_[2] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[2]); - /* x4_[3] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[3]); - /* x4_[4] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[4]); - /* x4_[5] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[5]); - /* x4_[6] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[6]); - /* x4_[7] */ - __dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[7]); + /* x4_maxTranslationAcceleration[0] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[0]); + /* x4_maxTranslationAcceleration[1] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[1]); + /* x4_maxTranslationAcceleration[2] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[2]); + /* x4_maxTranslationAcceleration[3] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[3]); + /* x4_maxTranslationAcceleration[4] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[4]); + /* x4_maxTranslationAcceleration[5] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[5]); + /* x4_maxTranslationAcceleration[6] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[6]); + /* x4_maxTranslationAcceleration[7] */ + __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[7]); } - /* x24_ */ - if (auto v = __dna_docout.enterSubVector("x24_")) + /* x24_translationFriction */ + if (auto v = __dna_docout.enterSubVector("x24_translationFriction")) { - /* x24_[0] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[0]); - /* x24_[1] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[1]); - /* x24_[2] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[2]); - /* x24_[3] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[3]); - /* x24_[4] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[4]); - /* x24_[5] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[5]); - /* x24_[6] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[6]); - /* x24_[7] */ - __dna_docout.writeFloat("x24_", x24_translationFriction[7]); + /* x24_translationFriction[0] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[0]); + /* x24_translationFriction[1] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[1]); + /* x24_translationFriction[2] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[2]); + /* x24_translationFriction[3] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[3]); + /* x24_translationFriction[4] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[4]); + /* x24_translationFriction[5] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[5]); + /* x24_translationFriction[6] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[6]); + /* x24_translationFriction[7] */ + __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[7]); } - /* x44_ */ - if (auto v = __dna_docout.enterSubVector("x44_")) + /* x44_translationMaxSpeed */ + if (auto v = __dna_docout.enterSubVector("x44_translationMaxSpeed")) { - /* x44_[0] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[0]); - /* x44_[1] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[1]); - /* x44_[2] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[2]); - /* x44_[3] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[3]); - /* x44_[4] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[4]); - /* x44_[5] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[5]); - /* x44_[6] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[6]); - /* x44_[7] */ - __dna_docout.writeFloat("x44_", x44_translationMaxSpeed[7]); + /* x44_translationMaxSpeed[0] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[0]); + /* x44_translationMaxSpeed[1] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[1]); + /* x44_translationMaxSpeed[2] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[2]); + /* x44_translationMaxSpeed[3] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[3]); + /* x44_translationMaxSpeed[4] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[4]); + /* x44_translationMaxSpeed[5] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[5]); + /* x44_translationMaxSpeed[6] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[6]); + /* x44_translationMaxSpeed[7] */ + __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[7]); } /* x64_ */ __dna_docout.writeFloat("x64_", x64_); @@ -775,8 +775,8 @@ void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const /* xc4_[7] */ __dna_docout.writeFloat("xc4_", xc4_[7]); } - /* xe4_ */ - __dna_docout.writeFloat("xe4_", xe4_); + /* xe4_spiderBallRollSpeed */ + __dna_docout.writeFloat("xe4_spiderBallRollSpeed", xe4_spiderBallRollSpeed); /* xe8_ */ __dna_docout.writeFloat("xe8_", xe8_); /* x14c_ */ @@ -887,20 +887,20 @@ void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const __dna_docout.writeFloat("x1c8_", x1c8_); /* x1cc_ */ __dna_docout.writeFloat("x1cc_", x1cc_); - /* x1d0_ */ - __dna_docout.writeFloat("x1d0_", x1d0_ballCameraControlDistance); + /* x1d0_ballCameraControlDistance */ + __dna_docout.writeFloat("x1d0_ballCameraControlDistance", x1d0_ballCameraControlDistance); /* x1d4_ */ __dna_docout.writeFloat("x1d4_", x1d4_); /* x1d8_ */ __dna_docout.writeFloat("x1d8_", x1d8_); - /* x1e4_ */ - __dna_docout.writeFloat("x1e4_", x1e4_leftStickDivisor); - /* x1e8_ */ - __dna_docout.writeFloat("x1e8_", x1e8_rightStickDivisor); + /* x1e4_leftStickDivisor */ + __dna_docout.writeFloat("x1e4_leftStickDivisor", x1e4_leftStickDivisor); + /* x1e8_rightStickDivisor */ + __dna_docout.writeFloat("x1e8_rightStickDivisor", x1e8_rightStickDivisor); /* x200_ */ __dna_docout.writeFloat("x200_", x200_); - /* x204_ */ - __dna_docout.writeFloat("x204_", x204_); + /* x204_ballTouchRadius */ + __dna_docout.writeFloat("x204_ballTouchRadius", x204_ballTouchRadius); /* x20c_ */ __dna_docout.writeFloat("x20c_", x20c_); /* x218_ */ diff --git a/DataSpec/DNAMP1/Tweaks/CTweakBall.hpp b/DataSpec/DNAMP1/Tweaks/CTweakBall.hpp index f42e35b1a..23c4db892 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakBall.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakBall.hpp @@ -38,7 +38,7 @@ struct CTweakBall final : public ITweakBall Value xbc_; Value xc0_; Value xc4_[8]; - Value xe4_; + Value xe4_spiderBallRollSpeed; Value xe8_; float xec_ = 10000.f; float xf0_ = 1000.f; @@ -106,7 +106,7 @@ struct CTweakBall final : public ITweakBall Value x1e4_leftStickDivisor; Value x1e8_rightStickDivisor; Value x200_; - Value x204_; + Value x204_ballTouchRadius; float x208_; Value x20c_; Value x218_; @@ -140,9 +140,11 @@ struct CTweakBall final : public ITweakBall float GetMaxBallTranslationAcceleration(int s) const { return x4_maxTranslationAcceleration[s]; } float GetBallTranslationFriction(int s) const { return x24_translationFriction[s]; } float GetBallTranslationMaxSpeed(int s) const { return x44_translationMaxSpeed[s]; } + float GetSpiderBallRollSpeed() const { return xe4_spiderBallRollSpeed; } float GetBallCameraControlDistance() const { return x1d0_ballCameraControlDistance; } float GetLeftStickDivisor() const { return x1e4_leftStickDivisor; } float GetRightStickDivisor() const { return x1e8_rightStickDivisor; } + float GetBallTouchRadius() const { return x204_ballTouchRadius; } }; } } diff --git a/Runtime/Character/CParticleDatabase.cpp b/Runtime/Character/CParticleDatabase.cpp index 559a0fb2e..0e01ffca4 100644 --- a/Runtime/Character/CParticleDatabase.cpp +++ b/Runtime/Character/CParticleDatabase.cpp @@ -391,8 +391,7 @@ void CParticleDatabase::AddAuxiliaryParticleEffect(const std::string& name, int auto search = x0_particleDescs.find(data.GetTag().id); if (search != x0_particleDescs.end()) { - auto sys = std::make_shared(*search->second, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + auto sys = std::make_shared(*search->second); newGen = std::make_unique(data.GetTag(), sys, data.GetDuration(), "NOT_A_VALID_LOCATOR", scaleVec, CParticleData::EParentedMode::Initial, flags, mgr, aid, lightId + _getGraphicLightId(sys, *search->second), @@ -438,8 +437,7 @@ void CParticleDatabase::AddParticleEffect(const std::string& name, int flags, co auto search = x0_particleDescs.find(data.GetTag().id); if (search != x0_particleDescs.end()) { - auto sys = std::make_shared(*search->second, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + auto sys = std::make_shared(*search->second); newGen = std::make_unique(data.GetTag(), sys, data.GetDuration(), data.GetSegmentName(), scaleVec, data.GetParentedMode(), flags, mgr, aid, lightId + _getGraphicLightId(sys, *search->second), diff --git a/Runtime/MP1/CSamusDoll.cpp b/Runtime/MP1/CSamusDoll.cpp index 9f1c36872..c720da154 100644 --- a/Runtime/MP1/CSamusDoll.cpp +++ b/Runtime/MP1/CSamusDoll.cpp @@ -168,9 +168,7 @@ CSamusDoll::CSamusDoll(const CDependencyGroup& suitDgrp, const CDependencyGroup& x20c_invGrappleBeam = g_SimplePool->GetObj("CMDL_InvGrappleBeam"); x218_invFins = g_SimplePool->GetObj(FinModels[int(suit)]); x224_ballInnerGlow = g_SimplePool->GetObj("BallInnerGlow"); - x22c_ballInnerGlowGen = std::make_unique(x224_ballInnerGlow, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x22c_ballInnerGlowGen = std::make_unique(x224_ballInnerGlow); x230_ballTransitionFlash = g_SimplePool->GetObj("MorphBallTransitionFlash"); x23c_lights.push_back(CLight::BuildDirectional(zeus::CVector3f::skForward, zeus::CColor::skWhite)); x24c_actorLights = std::make_unique(8, zeus::CVector3f::skZero, 4, 4, false, false, false, 0.1f); @@ -285,9 +283,7 @@ void CSamusDoll::Update(float dt, CRandom16& rand) oldRemTransTime >= x50_totalTransitionTime - 0.5f && x54_remTransitionTime < x50_totalTransitionTime - 0.5f) { - x238_ballTransitionFlashGen = std::make_unique(x230_ballTransitionFlash, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x238_ballTransitionFlashGen = std::make_unique(x230_ballTransitionFlash); x238_ballTransitionFlashGen->SetGlobalScale(zeus::CVector3f(0.625f)); } diff --git a/Runtime/Particle/CElementGen.hpp b/Runtime/Particle/CElementGen.hpp index 69cbd8f8c..5be496297 100644 --- a/Runtime/Particle/CElementGen.hpp +++ b/Runtime/Particle/CElementGen.hpp @@ -157,7 +157,9 @@ private: void AccumulateBounds(zeus::CVector3f& pos, float size); public: - CElementGen(const TToken& gen, EModelOrientationType orientType, EOptionalSystemFlags flags); + CElementGen(const TToken& gen, + EModelOrientationType orientType = EModelOrientationType::Normal, + EOptionalSystemFlags flags = EOptionalSystemFlags::One); ~CElementGen(); boo::GraphicsDataToken m_gfxToken; diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index 754aa45c8..af455eb4b 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -57,9 +57,7 @@ CParticleElectric::CParticleElectric(const TToken& token) x400_gpsmGenerators.reserve(x154_SCNT); for (int i=0 ; ix50_GPSM.m_token, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)); + x400_gpsmGenerators.emplace_back(new CElementGen(desc->x50_GPSM.m_token)); x400_gpsmGenerators.back()->SetParticleEmission(false); } } @@ -70,9 +68,7 @@ CParticleElectric::CParticleElectric(const TToken& token) x410_epsmGenerators.reserve(x154_SCNT); for (int i=0 ; ix60_EPSM.m_token, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)); + x410_epsmGenerators.emplace_back(new CElementGen(desc->x60_EPSM.m_token)); x410_epsmGenerators.back()->SetParticleEmission(false); } } diff --git a/Runtime/Weapon/CAuxWeapon.cpp b/Runtime/Weapon/CAuxWeapon.cpp index 6b4387e0c..5795eec91 100644 --- a/Runtime/Weapon/CAuxWeapon.cpp +++ b/Runtime/Weapon/CAuxWeapon.cpp @@ -253,9 +253,7 @@ void CAuxWeapon::CreateFlameThrower(const zeus::CTransform& xf, CStateManager& m mgr.AddObject(ft); ft->Think(dt, mgr); ft->StartFiring(xf, mgr); - x24_muzzleFxGen = std::make_unique(xc_flameMuzzle, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x24_muzzleFxGen = std::make_unique(xc_flameMuzzle); x7c_comboSfx = NWeaponTypes::play_sfx(1842, false, true, 0.165f); mgr.GetCameraManager()->AddCameraShaker(skHardShake, false); mgr.GetPlayerState()->SetFiringComboBeam(true); @@ -286,9 +284,7 @@ void CAuxWeapon::CreateWaveBusterBeam(CWeapon::EProjectileAttrib attribs, TUniqu CGunWeapon::GetShotDamageInfo(g_tweakPlayerGun->GetComboShotInfo(2), mgr), x70_waveBusterId, kInvalidAreaId, x6c_playerId, homingTarget, attribs); mgr.AddObject(wb); - x24_muzzleFxGen = std::make_unique(x18_busterMuzzle, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x24_muzzleFxGen = std::make_unique(x18_busterMuzzle); x7c_comboSfx = NWeaponTypes::play_sfx(1847, false, true, 0.165f); mgr.GetCameraManager()->AddCameraShaker(CCameraShakeData::skChargedShotCameraShakeData, false); mgr.GetPlayerState()->SetFiringComboBeam(true); diff --git a/Runtime/Weapon/CFlameThrower.cpp b/Runtime/Weapon/CFlameThrower.cpp index 3c17b6c42..d3e6f3335 100644 --- a/Runtime/Weapon/CFlameThrower.cpp +++ b/Runtime/Weapon/CFlameThrower.cpp @@ -16,8 +16,7 @@ CFlameThrower::CFlameThrower(const TToken& wDesc, const std: zeus::CVector3f(1.f), {}, -1, false) , x2e8_(xf) , x33c_flameDesc(g_SimplePool->GetObj({FOURCC('PART'), flameInfo.GetFlameFxId()})) -, x348_flameGen(new CElementGen(x33c_flameDesc, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)) +, x348_flameGen(new CElementGen(x33c_flameDesc)) { } diff --git a/Runtime/Weapon/CGrappleArm.cpp b/Runtime/Weapon/CGrappleArm.cpp index 74ca2be8e..322174a78 100644 --- a/Runtime/Weapon/CGrappleArm.cpp +++ b/Runtime/Weapon/CGrappleArm.cpp @@ -29,18 +29,10 @@ CGrappleArm::CGrappleArm(const zeus::CVector3f& scale) x36c_grappleHitDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xbc_grappleHit})), x378_grappleMuzzleDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc0_grappleMuzzle})), x384_grappleSwooshDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc4_grappleSwoosh})), - x390_grappleSegmentGen(std::make_unique(x354_grappleSegmentDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)), - x394_grappleClawGen(std::make_unique(x360_grappleClawDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)), - x398_grappleHitGen(std::make_unique(x36c_grappleHitDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)), - x39c_grappleMuzzleGen(std::make_unique(x378_grappleMuzzleDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)), + x390_grappleSegmentGen(std::make_unique(x354_grappleSegmentDesc)), + x394_grappleClawGen(std::make_unique(x360_grappleClawDesc)), + x398_grappleHitGen(std::make_unique(x36c_grappleHitDesc)), + x39c_grappleMuzzleGen(std::make_unique(x378_grappleMuzzleDesc)), x3a0_grappleSwooshGen(std::make_unique(x384_grappleSwooshDesc, 0)), x3a4_rainSplashGenerator(std::make_unique(scale, 20, 2, 0.f, 0.125f)) { @@ -280,12 +272,8 @@ void CGrappleArm::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, case EUserEventType::Projectile: if (x3b2_27_armMoving) return; - x398_grappleHitGen = std::make_unique(x36c_grappleHitDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x39c_grappleMuzzleGen = std::make_unique(x378_grappleMuzzleDesc, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x398_grappleHitGen = std::make_unique(x36c_grappleHitDesc); + x39c_grappleMuzzleGen = std::make_unique(x378_grappleMuzzleDesc); x338_beamT = 0.f; x33c_beamDist = 0.f; x340_anglePhase = 0.f; diff --git a/Runtime/Weapon/CGunWeapon.cpp b/Runtime/Weapon/CGunWeapon.cpp index de9e8db33..47a362950 100644 --- a/Runtime/Weapon/CGunWeapon.cpp +++ b/Runtime/Weapon/CGunWeapon.cpp @@ -270,17 +270,13 @@ void CGunWeapon::EnableFrozenEffect(EFrozenFxType type) case EFrozenFxType::Thawed: if (x204_frozenEffect == EFrozenFxType::Thawed) break; - x1b8_frozenGenerator = std::make_unique(x188_frozenEffects[1], - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x1b8_frozenGenerator = std::make_unique(x188_frozenEffects[1]); x1b8_frozenGenerator->SetGlobalScale(x4_scale); break; case EFrozenFxType::Frozen: if (x204_frozenEffect == EFrozenFxType::Frozen) break; - x1b8_frozenGenerator = std::make_unique(x188_frozenEffects[0], - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x1b8_frozenGenerator = std::make_unique(x188_frozenEffects[0]); x1b8_frozenGenerator->SetGlobalScale(x4_scale); break; default: @@ -296,9 +292,7 @@ void CGunWeapon::ActivateCharge(bool enable, bool resetEffect) if (enable || resetEffect) { x1a4_muzzleGenerators[x208_muzzleEffectIdx] = - std::make_unique(x16c_muzzleEffects[x208_muzzleEffectIdx], - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + std::make_unique(x16c_muzzleEffects[x208_muzzleEffectIdx]); } } @@ -434,8 +428,7 @@ void CGunWeapon::LoadMuzzleFx(float dt) { for (int i=0 ; i<2 ; ++i) { - x1a4_muzzleGenerators.push_back(std::make_unique(x16c_muzzleEffects[i], - CElementGen::EModelOrientationType::Normal, CElementGen::EOptionalSystemFlags::One)); + x1a4_muzzleGenerators.push_back(std::make_unique(x16c_muzzleEffects[i])); x1a4_muzzleGenerators.back()->SetParticleEmission(false); x1a4_muzzleGenerators.back()->Update(dt); } diff --git a/Runtime/Weapon/CIceBeam.cpp b/Runtime/Weapon/CIceBeam.cpp index dc21d260a..91a21008e 100644 --- a/Runtime/Weapon/CIceBeam.cpp +++ b/Runtime/Weapon/CIceBeam.cpp @@ -101,16 +101,14 @@ void CIceBeam::EnableSecondaryFx(ESecondaryFxType type) case ESecondaryFxType::CancelCharge: if (!x248_25_inEndFx) { - x244_chargeFx = std::make_unique(x234_ice2nd2, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x244_chargeFx = std::make_unique(x234_ice2nd2); x244_chargeFx->SetGlobalScale(x4_scale); x248_25_inEndFx = true; x1cc_enabledSecondaryEffect = ESecondaryFxType::CancelCharge; } break; case ESecondaryFxType::Charge: - x244_chargeFx = std::make_unique(x228_ice2nd1, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x244_chargeFx = std::make_unique(x228_ice2nd1); x244_chargeFx->SetGlobalScale(x4_scale); x248_25_inEndFx = false; x1cc_enabledSecondaryEffect = type; @@ -129,8 +127,7 @@ void CIceBeam::Update(float dt, CStateManager& mgr) x248_24_loaded = x21c_iceSmoke.IsLoaded() && x228_ice2nd1.IsLoaded() && x234_ice2nd2.IsLoaded(); if (x248_24_loaded) { - x240_smokeGen = std::make_unique(x21c_iceSmoke, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x240_smokeGen = std::make_unique(x21c_iceSmoke); x240_smokeGen->SetGlobalScale(x4_scale); x240_smokeGen->SetParticleEmission(false); } diff --git a/Runtime/Weapon/CNewFlameThrower.cpp b/Runtime/Weapon/CNewFlameThrower.cpp index 38ea22fba..06ed04423 100644 --- a/Runtime/Weapon/CNewFlameThrower.cpp +++ b/Runtime/Weapon/CNewFlameThrower.cpp @@ -60,21 +60,11 @@ void CNewFlameThrower::CreateLightObjects(CStateManager& mgr) void CNewFlameThrower::EnableFx(CStateManager& mgr) { DeleteProjectileLight(mgr); - x358_mainFireGen = std::make_unique(x304_mainFire, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x35c_mainSmokeGen = std::make_unique(x310_mainSmoke, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x360_secondarySmokeGen = std::make_unique(x31c_secondarySmoke, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x364_secondaryFireGen = std::make_unique(x328_secondaryFire, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x368_secondarySparksGen = std::make_unique(x334_secondarySparks, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x358_mainFireGen = std::make_unique(x304_mainFire); + x35c_mainSmokeGen = std::make_unique(x310_mainSmoke); + x360_secondarySmokeGen = std::make_unique(x31c_secondarySmoke); + x364_secondaryFireGen = std::make_unique(x328_secondaryFire); + x368_secondarySparksGen = std::make_unique(x334_secondarySparks); x36c_swooshCenterGen = std::make_unique(x340_swooshCenter, 0); x36c_swooshCenterGen->SetRenderGaps(true); x370_swooshFireGen = std::make_unique(x34c_swooshFire, 0); diff --git a/Runtime/Weapon/CPhazonBeam.cpp b/Runtime/Weapon/CPhazonBeam.cpp index c0f1b6fad..56b90390e 100644 --- a/Runtime/Weapon/CPhazonBeam.cpp +++ b/Runtime/Weapon/CPhazonBeam.cpp @@ -50,8 +50,7 @@ void CPhazonBeam::UpdateBeam(float dt, const zeus::CTransform& targetXf, void CPhazonBeam::CreateBeam(CStateManager& mgr) { - x234_chargeFxGen = std::make_unique(x228_phazon2nd1, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x234_chargeFxGen = std::make_unique(x228_phazon2nd1); if (x234_chargeFxGen) { x234_chargeFxGen->SetGlobalScale(x4_scale); diff --git a/Runtime/Weapon/CPlasmaBeam.cpp b/Runtime/Weapon/CPlasmaBeam.cpp index 25b27f806..9990ab6df 100644 --- a/Runtime/Weapon/CPlasmaBeam.cpp +++ b/Runtime/Weapon/CPlasmaBeam.cpp @@ -109,8 +109,7 @@ void CPlasmaBeam::EnableSecondaryFx(ESecondaryFxType type) x228_chargeFx->SetParticleEmission(false); break; case ESecondaryFxType::Charge: - x228_chargeFx = std::make_unique(x21c_plasma2nd1, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x228_chargeFx = std::make_unique(x21c_plasma2nd1); x228_chargeFx->SetGlobalScale(x4_scale); default: break; diff --git a/Runtime/Weapon/CPlayerGun.cpp b/Runtime/Weapon/CPlayerGun.cpp index 787320a36..2146a0e9f 100644 --- a/Runtime/Weapon/CPlayerGun.cpp +++ b/Runtime/Weapon/CPlayerGun.cpp @@ -53,8 +53,7 @@ CPlayerGun::CPlayerGun(TUniqueId playerId) x75c_phazonBeam = std::make_unique(g_tweakGunRes->x20_phazonBeam, EWeaponType::Phazon, playerId, EMaterialTypes::Player, sGunScale); x774_holoTransitionGen = std::make_unique( - g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->x24_holoTransition}), - CElementGen::EModelOrientationType::Normal, CElementGen::EOptionalSystemFlags::One); + g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->x24_holoTransition})); x82c_shadow = std::make_unique(32, 32, true); x832_31_inRestPose = true; @@ -112,9 +111,7 @@ void CPlayerGun::InitMuzzleData() { x7c0_auxMuzzleEffects.push_back(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xa4_auxMuzzle[i]})); - x800_auxMuzzleGenerators.emplace_back(new CElementGen(x7c0_auxMuzzleEffects.back(), - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One)); + x800_auxMuzzleGenerators.emplace_back(new CElementGen(x7c0_auxMuzzleEffects.back())); x800_auxMuzzleGenerators.back()->SetParticleEmission(false); } } @@ -1241,9 +1238,7 @@ void CPlayerGun::EnableChargeFx(EChargeState state, CStateManager& mgr) x833_30_canShowAuxMuzzleEffect = true; x800_auxMuzzleGenerators[int(x320_currentAuxBeam)] = - std::make_unique(x7c0_auxMuzzleEffects[int(x320_currentAuxBeam)], - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + std::make_unique(x7c0_auxMuzzleEffects[int(x320_currentAuxBeam)]); x800_auxMuzzleGenerators[int(x320_currentAuxBeam)]->SetParticleEmission(true); } @@ -1584,8 +1579,7 @@ void CPlayerGun::ActivateCombo(CStateManager& mgr) if (xferEffect.IsLoaded()) { x77c_comboXferGen = - std::make_unique(xferEffect, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + std::make_unique(xferEffect); x77c_comboXferGen->SetGlobalScale(sGunScale); } x72c_currentBeam->EnableCharge(true); diff --git a/Runtime/Weapon/CPowerBeam.cpp b/Runtime/Weapon/CPowerBeam.cpp index 8b2e39e83..4185ec688 100644 --- a/Runtime/Weapon/CPowerBeam.cpp +++ b/Runtime/Weapon/CPowerBeam.cpp @@ -99,9 +99,7 @@ void CPowerBeam::EnableSecondaryFx(ESecondaryFxType type) x1cc_enabledSecondaryEffect = ESecondaryFxType::None; break; case ESecondaryFxType::Charge: - x238_power2ndGen = std::make_unique(x228_power2nd1, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x238_power2ndGen = std::make_unique(x228_power2nd1); x238_power2ndGen->SetGlobalScale(x4_scale); x1cc_enabledSecondaryEffect = type; break; @@ -120,9 +118,7 @@ void CPowerBeam::Update(float dt, CStateManager& mgr) x244_25_loaded = x21c_shotSmoke.IsLoaded() && x228_power2nd1.IsLoaded(); if (x244_25_loaded) { - x234_shotSmokeGen = std::make_unique(x21c_shotSmoke, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x234_shotSmokeGen = std::make_unique(x21c_shotSmoke); x234_shotSmokeGen->SetParticleEmission(false); } } diff --git a/Runtime/Weapon/CWaveBeam.cpp b/Runtime/Weapon/CWaveBeam.cpp index 03f5c804c..8b124966b 100644 --- a/Runtime/Weapon/CWaveBeam.cpp +++ b/Runtime/Weapon/CWaveBeam.cpp @@ -128,8 +128,7 @@ void CWaveBeam::EnableSecondaryFx(ESecondaryFxType type) } break; case ESecondaryFxType::ToCombo: - x254_chargeFx = std::make_unique(x240_wave2nd3, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x254_chargeFx = std::make_unique(x240_wave2nd3); x254_chargeFx->SetGlobalScale(x4_scale); x24c_effectTimer = 0.f; x258_25_effectTimerActive = true; diff --git a/Runtime/Weapon/CWaveBuster.cpp b/Runtime/Weapon/CWaveBuster.cpp index b3bc1cd7f..6ab29abc2 100644 --- a/Runtime/Weapon/CWaveBuster.cpp +++ b/Runtime/Weapon/CWaveBuster.cpp @@ -23,12 +23,8 @@ CWaveBuster::CWaveBuster(const TToken& desc, EWeaponType typ x378_busterLight.GetObj(); x384_busterSwoosh1Gen = std::make_unique(x354_busterSwoosh1, 0); x388_busterSwoosh2Gen = std::make_unique(x360_busterSwoosh2, 0); - x38c_busterSparksGen = std::make_unique(x36c_busterSparks, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); - x390_busterLightGen = std::make_unique(x378_busterLight, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + x38c_busterSparksGen = std::make_unique(x36c_busterSparks); + x390_busterLightGen = std::make_unique(x378_busterLight); x3d0_24_firing = true; x3d0_25_ = true; x3d0_26_ = false; diff --git a/Runtime/World/CActorModelParticles.cpp b/Runtime/World/CActorModelParticles.cpp index 59c307b22..17fde9f46 100644 --- a/Runtime/World/CActorModelParticles.cpp +++ b/Runtime/World/CActorModelParticles.cpp @@ -153,37 +153,27 @@ void CActorModelParticles::LoadParticleDGRPs() std::unique_ptr CActorModelParticles::MakeOnFireGen() const { - return std::make_unique(x18_onFire, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + return std::make_unique(x18_onFire); } std::unique_ptr CActorModelParticles::MakeAshGen() const { - return std::make_unique(x20_ash, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + return std::make_unique(x20_ash); } std::unique_ptr CActorModelParticles::MakeIceGen() const { - return std::make_unique(x28_iceBreak, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + return std::make_unique(x28_iceBreak); } std::unique_ptr CActorModelParticles::MakeFirePopGen() const { - return std::make_unique(x30_firePop, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + return std::make_unique(x30_firePop); } std::unique_ptr CActorModelParticles::MakeIcePopGen() const { - return std::make_unique(x38_icePop, - CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + return std::make_unique(x38_icePop); } std::unique_ptr CActorModelParticles::MakeElectricGen() const diff --git a/Runtime/World/CHUDBillboardEffect.cpp b/Runtime/World/CHUDBillboardEffect.cpp index 817892ffd..9143fbe48 100644 --- a/Runtime/World/CHUDBillboardEffect.cpp +++ b/Runtime/World/CHUDBillboardEffect.cpp @@ -26,8 +26,7 @@ CHUDBillboardEffect::CHUDBillboardEffect(const std::experimental::optional(*particle, CElementGen::EModelOrientationType::Normal, - CElementGen::EOptionalSystemFlags::One); + xe8_generator = std::make_unique(*particle); if (static_cast(*xe8_generator).IsIndirectTextured()) ++g_IndirectTexturedBillboardCount; } diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index c72153ae5..8d0834639 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -1,21 +1,182 @@ +#include "GameGlobalObjects.hpp" +#include "CDependencyGroup.hpp" #include "CMorphBall.hpp" #include "CPlayer.hpp" #include "CMorphBallShadow.hpp" -#include "Particle/CGenDescription.hpp" +#include "CSimplePool.hpp" +#include "CGameLight.hpp" namespace urde { -CMorphBall::CMorphBall(CPlayer& player, float) -: x0_player(player) +static float kSpiderBallCollisionRadius; + +CMorphBall::CMorphBall(CPlayer& player, float radius) +: x0_player(player), xc_radius(radius), + x38_collisionSphere({{0.f, 0.f, radius}, radius}, + {EMaterialTypes::Player, EMaterialTypes::Solid, EMaterialTypes::GroundCollider}), + x58_ballModel(GetMorphBallModel("SamusBallANCS", radius)), + x60_spiderBallGlassModel(GetMorphBallModel("SamusSpiderBallGlassCMDL", radius)), + x68_lowPolyBallModel(GetMorphBallModel("SamusBallLowPolyCMDL", radius)), + x70_frozenBallModel(GetMorphBallModel("SamusBallFrozenCMDL", radius)), + x1968_slowBlueTailSwoosh(g_SimplePool->GetObj("SlowBlueTailSwoosh")), + x1970_slowBlueTailSwoosh2(g_SimplePool->GetObj("SlowBlueTailSwoosh2")), + x1978_jaggyTrail(g_SimplePool->GetObj("JaggyTrail")), + x1980_wallSpark(g_SimplePool->GetObj("WallSpark")), + x1988_ballInnerGlow(g_SimplePool->GetObj("BallInnerGlow")), + x1990_spiderBallMagnetEffect(g_SimplePool->GetObj("SpiderBallMagnetEffect")), + x1998_boostBallGlow(g_SimplePool->GetObj("BoostBallGlow")), + x19a0_spiderElectric(g_SimplePool->GetObj("SpiderElectric")), + x19a8_morphBallTransitionFlash(g_SimplePool->GetObj("MorphBallTransitionFlash")), + x19b0_effect_morphBallIceBreak(g_SimplePool->GetObj("Effect_MorphBallIceBreak")) { + x19b8_slowBlueTailSwooshGen = std::make_unique(x1968_slowBlueTailSwoosh, 0); + x19bc_slowBlueTailSwooshGen2 = std::make_unique(x1968_slowBlueTailSwoosh, 0); + x19c0_slowBlueTailSwoosh2Gen = std::make_unique(x1970_slowBlueTailSwoosh2, 0); + x19c4_slowBlueTailSwoosh2Gen2 = std::make_unique(x1970_slowBlueTailSwoosh2, 0); + x19c8_jaggyTrailGen = std::make_unique(x1978_jaggyTrail, 0); + x19cc_wallSparkGen = std::make_unique(x1980_wallSpark); + x19d0_ballInnerGlowGen = std::make_unique(x1988_ballInnerGlow); + x19d4_spiderBallMagnetEffectGen = std::make_unique(x1990_spiderBallMagnetEffect); + x19d8_boostBallGlowGen = std::make_unique(x1998_boostBallGlow); + x1c14_worldShadow = std::make_unique(16, 16, false); + x1c18_actorLights = std::make_unique(8, zeus::CVector3f::skZero, 4, 4, false, false, false, 0.1f); + x1c1c_rainSplashGen = std::make_unique(x58_ballModel->GetScale(), 40, 2, 0.15f, 0.5f); + x1c3c_quats.resize(5); + x1c90_vecs.resize(5); + x1cd0_.resize(15); + x1d10_.resize(15); + x1de4_24 = false; + x1de4_25 = true; + x1df8_24 = false; + x1df8_25 = false; + x1df8_26 = false; + x1df8_27 = false; + + x19d4_spiderBallMagnetEffectGen->SetParticleEmission(false); + x19d4_spiderBallMagnetEffectGen->Update(1.0 / 60.0); + + kSpiderBallCollisionRadius = GetBallRadius() + 0.2f; + + for (int i=0 ; i<32 ; ++i) + x19e4_spiderElectricGens.emplace_back(std::make_unique(x19a0_spiderElectric, 0), false); + + LoadAnimationTokens("SamusBallANCS"); + InitializeWakeEffects(); +} + +void CMorphBall::LoadAnimationTokens(const std::string& ancsName) +{ + TToken dgrp = g_SimplePool->GetObj((ancsName + "_DGRP").c_str()); + x1958_animationTokens.clear(); + x1958_animationTokens.reserve(dgrp->GetObjectTagVector().size()); + for (const SObjectTag& tag : dgrp->GetObjectTagVector()) + { + if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('CSKR') || tag.type == FOURCC('TXTR')) + continue; + x1958_animationTokens.push_back(g_SimplePool->GetObj(tag)); + x1958_animationTokens.back().Lock(); + } +} + +/* Maps material index to effect in generator array */ +static const s32 skWakeEffectMap[32] = +{ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, // Phazon + 2, // Dirt + 3, // Lava + -1, + 4, // Snow + 5, // MudSlow + -1, + -1, + -1, + -1, + 6, // Sand + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 +}; + +void CMorphBall::InitializeWakeEffects() +{ + TToken nullParticle = + CToken(TObjOwnerDerivedFromIObj::GetNewDerivedObject(std::make_unique())); + for (int i=0 ; i<8 ; ++i) + x1b84_wakeEffects.push_back(nullParticle); + + x1b84_wakeEffects[2] = g_SimplePool->GetObj("DirtWake"); + x1b84_wakeEffects[0] = g_SimplePool->GetObj("PhazonWake"); + x1b84_wakeEffects[1] = g_SimplePool->GetObj("PhazonWakeOrange"); + x1b84_wakeEffects[3] = g_SimplePool->GetObj("LavaWake"); + x1b84_wakeEffects[4] = g_SimplePool->GetObj("SnowWake"); + x1b84_wakeEffects[5] = g_SimplePool->GetObj("MudWake"); + x1b84_wakeEffects[6] = g_SimplePool->GetObj("SandWake"); + x1b84_wakeEffects[7] = g_SimplePool->GetObj("RainWake"); + + x1bc8_wakeEffectGens.resize(8); + x1bc8_wakeEffectGens[2] = std::make_unique(x1b84_wakeEffects[2]); + x1bc8_wakeEffectGens[0] = std::make_unique(x1b84_wakeEffects[0]); + x1bc8_wakeEffectGens[1] = std::make_unique(x1b84_wakeEffects[1]); + x1bc8_wakeEffectGens[3] = std::make_unique(x1b84_wakeEffects[3]); + x1bc8_wakeEffectGens[4] = std::make_unique(x1b84_wakeEffects[4]); + x1bc8_wakeEffectGens[5] = std::make_unique(x1b84_wakeEffects[5]); + x1bc8_wakeEffectGens[6] = std::make_unique(x1b84_wakeEffects[6]); + x1bc8_wakeEffectGens[7] = std::make_unique(x1b84_wakeEffects[7]); +} + +std::unique_ptr CMorphBall::GetMorphBallModel(const char* name, float radius) +{ + const SObjectTag* tag = g_ResFactory->GetResourceIdByName(name); + if (tag->type == FOURCC('CMDL')) + return std::make_unique(CStaticRes(tag->id, zeus::CVector3f(radius * 2.f))); + else + return std::make_unique(CAnimRes(tag->id, 0, zeus::CVector3f(radius * 2.f), 0, false)); } void CMorphBall::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) { - + switch (msg) + { + case EScriptObjectMessage::Registered: + if (x19d0_ballInnerGlowGen && x19d0_ballInnerGlowGen->SystemHasLight()) + { + x1c10_ballInnerGlowLight = mgr.AllocateUniqueId(); + CGameLight* l = new CGameLight(x1c10_ballInnerGlowLight, kInvalidAreaId, false, "BallLight", + GetBallToWorld(), x0_player.GetUniqueId(), + x19d0_ballInnerGlowGen->GetLight(), + u32(reinterpret_cast(x1988_ballInnerGlow.GetObj())), 0, 0.f); + mgr.AddObject(l); + } + break; + case EScriptObjectMessage::Deleted: + DeleteLight(mgr); + break; + default: + break; + } } +zeus::CVector3f CMorphBall::GetBallContactSurfaceNormal() const { return {}; } + void CMorphBall::DrawBallShadow(const CStateManager& mgr) { if (!x1e50_shadow) @@ -31,10 +192,12 @@ void CMorphBall::DrawBallShadow(const CStateManager& mgr) if (x0_player.x578_morphDuration != 0.f) alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f); alpha = 1.f - alpha; + break; case CPlayer::EPlayerMorphBallState::Morphing: alpha = 0.f; if (x0_player.x578_morphDuration != 0.f) alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f); + break; default: break; } x1e50_shadow->Render(mgr, alpha); @@ -42,15 +205,581 @@ void CMorphBall::DrawBallShadow(const CStateManager& mgr) void CMorphBall::DeleteBallShadow() { - + x1e50_shadow.reset(); } void CMorphBall::CreateBallShadow() { - + x1e50_shadow = std::make_unique(); } void CMorphBall::RenderToShadowTex(CStateManager& mgr) +{ + if (x1e50_shadow) + { + zeus::CVector3f center = + x0_player.GetPrimitiveOffset() + x0_player.GetTranslation() + zeus::CVector3f(0.f, 0.f, xc_radius); + zeus::CAABox aabb(center - zeus::CVector3f(1.25f * xc_radius, 1.25f * xc_radius, 10.f), + center + zeus::CVector3f(1.25f * xc_radius, 1.25f * xc_radius, xc_radius)); + x1e50_shadow->RenderIdBuffer(aabb, mgr, x0_player); + } +} + +static const u16 skBallRollSfx[] = +{ + 0xFFFF, 0x05DE, 0x05DD, 0x062F, 0x0786, + 0xFFFF, 0x05DC, 0x060B, 0x05C8, 0x088A, + 0x0698, 0x0787, 0x0630, 0xFFFF, 0x0628, + 0x05DD, 0x05DD, 0x05C8, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0x05FE, 0x0628 +}; + +static const u16 skBallLandSfx[] = +{ + 0xFFFF, 0x05C3, 0x05E0, 0x062C, 0x065B, + 0xFFFF, 0x05DA, 0x0609, 0x05C0, 0x0697, + 0x0697, 0x065C, 0x062D, 0xFFFF, 0x0627, + 0x05E0, 0x05E0, 0x05C0, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0x05FD, 0x0627 +}; + +void CMorphBall::SelectMorphBallSounds(const CMaterialList& mat) +{ + u16 rollSfx; + if (x0_player.x9c5_30_selectFluidBallSound) + { + if (x0_player.x82c_inLava) + rollSfx = 2186; + else + rollSfx = 1481; + } + else + { + rollSfx = CPlayer::SfxIdFromMaterial(mat, skBallRollSfx, 24, 0xffff); + } + x0_player.x9c5_30_selectFluidBallSound = false; + + if (rollSfx != 0xffff) + { + if (x1e34_rollSfx != rollSfx && x1e2c_rollSfxHandle) + { + CSfxManager::SfxStop(x1e2c_rollSfxHandle); + x1e2c_rollSfxHandle.reset(); + } + x1e34_rollSfx = rollSfx; + } + + x1e36_landSfx = CPlayer::SfxIdFromMaterial(mat, skBallLandSfx, 24, 0xffff); +} + +void CMorphBall::UpdateMorphBallSounds(float dt) +{ + zeus::CVector3f velocity = x0_player.GetVelocity(); + if (x187c_spiderBallState != ESpiderBallState::Active) + velocity.z = 0.f; + + switch (x0_player.GetPlayerMovementState()) + { + case CPlayer::EPlayerMovementState::OnGround: + case CPlayer::EPlayerMovementState::FallingMorphed: + { + float vel = velocity.magnitude(); + if (x187c_spiderBallState == ESpiderBallState::Active) + vel += g_tweakBall->GetSpiderBallRollSpeed() * dt * 4.f; + if (vel > 0.8f) + { + if (!x1e2c_rollSfxHandle) + { + if (x1e34_rollSfx != 0xffff) + { + x1e2c_rollSfxHandle = + CSfxManager::AddEmitter(x1e34_rollSfx, x0_player.GetTranslation(), zeus::CVector3f::skZero, + true, true, 0x7f, kInvalidAreaId); + } + x0_player.ApplySubmergedPitchBend(x1e2c_rollSfxHandle); + } + CSfxManager::PitchBend(x1e2c_rollSfxHandle, zeus::clamp(-1.f, vel * 0.122f - 0.831f, 1.f)); + float maxVol = zeus::clamp(0.f, 0.025f * vel + 0.5f, 1.f); + CSfxManager::UpdateEmitter(x1e2c_rollSfxHandle, x0_player.GetTranslation(), + zeus::CVector3f::skZero, maxVol); + break; + } + } + default: + if (x1e2c_rollSfxHandle) + { + CSfxManager::SfxStop(x1e2c_rollSfxHandle); + x1e2c_rollSfxHandle.reset(); + } + break; + } + + if (x187c_spiderBallState == ESpiderBallState::Active) + { + if (!x1e30_spiderSfxHandle) + { + x1e30_spiderSfxHandle = + CSfxManager::AddEmitter(1523, x0_player.GetTranslation(), zeus::CVector3f::skZero, + true, true, 0xc8, kInvalidAreaId); + x0_player.ApplySubmergedPitchBend(x1e30_spiderSfxHandle); + } + CSfxManager::UpdateEmitter(x1e30_spiderSfxHandle, x0_player.GetTranslation(), + zeus::CVector3f::skZero, 1.f); + } + else if (x1e30_spiderSfxHandle) + { + CSfxManager::SfxStop(x1e30_spiderSfxHandle); + x1e30_spiderSfxHandle.reset(); + } +} + +float CMorphBall::GetBallRadius() const +{ + return g_tweakPlayer->GetPlayerBallHalfExtent(); +} + +float CMorphBall::GetBallTouchRadius() const +{ + return g_tweakBall->GetBallTouchRadius(); +} + +void CMorphBall::ForwardInput(const CFinalInput&) const +{ + +} + +void CMorphBall::ComputeBallMovement(const CFinalInput&, CStateManager&, float) +{ + +} + +bool CMorphBall::IsMovementAllowed() const +{ + return false; +} + +void CMorphBall::UpdateSpiderBall(const CFinalInput&, CStateManager&, float) +{ + +} + +void CMorphBall::ApplySpiderBallSwingingForces(const CFinalInput&, CStateManager&, float) +{ + +} + +void CMorphBall::ApplySpiderBallRollForces(const CFinalInput&, CStateManager&, float) +{ + +} + +void CMorphBall::CalculateSpiderBallAttractionSurfaceForces(const CFinalInput&, CStateManager&, + const zeus::CTransform&) +{ + +} + +void CMorphBall::CheckForSwitchToSpiderBallSwinging(CStateManager&) +{ + +} + +void CMorphBall::FindClosestSpiderBallWaypoint(CStateManager&, const zeus::CVector3f&, zeus::CVector3f&, + zeus::CVector3f&, zeus::CVector3f&, float&, zeus::CVector3f&, bool&, + zeus::CTransform&) const +{ + +} + +void CMorphBall::SetSpiderBallSwingingState(bool) +{ + +} + +void CMorphBall::GetSpiderBallControllerMovement(const CFinalInput&, bool, bool) +{ + +} + +void CMorphBall::ResetSpiderBallSwingControllerMovementTimer() +{ + +} + +void CMorphBall::UpdateSpiderBallSwingControllerMovementTimer(float, float) +{ + +} + +float CMorphBall::GetSpiderBallSwingControllerMovementScalar() const +{ + return 0.f; +} + +void CMorphBall::CreateSpiderBallParticles(const zeus::CVector3f&, const zeus::CVector3f&) +{ + +} + +void CMorphBall::ComputeMarioMovement(const CFinalInput&, CStateManager&, float) +{ + +} + +void CMorphBall::GetSwooshToWorld() const +{ + +} + +zeus::CTransform CMorphBall::GetBallToWorld() const +{ + return zeus::CTransform::Translate(x0_player.GetTranslation() + zeus::CVector3f(0.f, 0.f, GetBallRadius())) * + x0_player.GetTransform().getRotation(); +} + +void CMorphBall::CalculateSurfaceToWorld(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&) const +{ + +} + +void CMorphBall::CalculateBallContactInfo(zeus::CVector3f&, zeus::CVector3f&) const +{ + +} + +void CMorphBall::BallTurnInput(const CFinalInput&) const +{ + +} + +void CMorphBall::UpdateBallDynamics(CStateManager&, float) +{ + +} + +void CMorphBall::SwitchToMarble() +{ + +} + +void CMorphBall::SwitchToTire() +{ + +} + +void CMorphBall::Update(float dt, CStateManager& mgr) +{ + if (x187c_spiderBallState == ESpiderBallState::Active) + CreateSpiderBallParticles(GetBallToWorld().origin, x1890_spiderTrackPoint); + + if (x0_player.GetDeathTime() <= 0.f) + UpdateEffects(dt, mgr); + + if (x1e44_ > 0.f) + { + x1e44_ -= x1e48_ * dt; + if (x1e44_ <= 0.f) + { + x1e44_ = 0.f; + x1e48_ = 0.f; + x1e4c_ = 0.f; + } + else + { + x1e4c_ += dt; + } + } + + if (x58_ballModel) + x58_ballModel->AdvanceAnimation(dt, mgr, kInvalidAreaId, true); + + if (x1c2c_) + { + x1c20_ += x1c28_ * dt; + if (x1c20_ < 0.f) + { + x1c2c_ = false; + x1c20_ = 0.f; + } + else if (x1c20_ > x1c24_) + { + x1c2c_ = false; + x1c20_ = x1c24_; + } + } + + if (x1c1c_rainSplashGen) + x1c1c_rainSplashGen->Update(dt, mgr); + + UpdateMorphBallSounds(dt); +} + +void CMorphBall::UpdateScriptMessage(EScriptObjectMessage, TUniqueId, CStateManager&) +{ + +} + +void CMorphBall::DeleteLight(CStateManager&) +{ + +} + +void CMorphBall::SetBallLightActive(CStateManager&, bool) +{ + +} + +void CMorphBall::EnterMorphBallState(CStateManager&) +{ + +} + +void CMorphBall::LeaveMorphBallState(CStateManager&) +{ + +} + +void CMorphBall::UpdateEffects(float, CStateManager&) +{ + +} + +void CMorphBall::ComputeBoostBallMovement(const CFinalInput&, const CStateManager&, float) +{ + +} + +void CMorphBall::EnterBoosting() +{ + +} + +void CMorphBall::LeaveBoosting() +{ + +} + +void CMorphBall::CancelBoosting() +{ + +} + +void CMorphBall::UpdateMarbleDynamics(CStateManager&, float, const zeus::CVector3f&) +{ + +} + +void CMorphBall::ApplyFriction(float) +{ + +} + +void CMorphBall::DampLinearAndAngularVelocities(float, float) +{ + +} + +zeus::CTransform CMorphBall::GetPrimitiveTransform() const +{ + return {}; +} + +void CMorphBall::DrawCollisionPrimitive() const +{ + +} + +void CMorphBall::GetMinimumAlignmentSpeed() const +{ + +} + +void CMorphBall::PreRender(CStateManager&, const zeus::CFrustum&) +{ + +} + +void CMorphBall::Render(const CStateManager&, const CActorLights*) const +{ + +} + +void CMorphBall::ResetMorphBallTransitionFlash() +{ + +} + +void CMorphBall::UpdateMorphBallTransitionFlash(float) +{ + +} + +void CMorphBall::RenderMorphBallTransitionFlash(const CStateManager&) const +{ + +} + +void CMorphBall::RenderDamageEffects(const CStateManager&, const zeus::CTransform&) const +{ + +} + +void CMorphBall::UpdateHalfPipeStatus(CStateManager&, float) +{ + +} + +bool CMorphBall::GetIsInHalfPipeMode() const +{ + return false; +} + +void CMorphBall::SetIsInHalfPipeMode(bool) +{ + +} + +void CMorphBall::GetIsInHalfPipeModeInAir() const +{ + +} + +void CMorphBall::SetIsInHalfPipeModeInAir(bool) +{ + +} + +void CMorphBall::GetTouchedHalfPipeRecently() const +{ + +} + +void CMorphBall::SetTouchedHalfPipeRecently(bool) +{ + +} + +void CMorphBall::DisableHalfPipeStatus() +{ + +} + +bool CMorphBall::BallCloseToCollision(const CStateManager&, float, const CMaterialFilter& filter) const +{ + return false; +} + +void CMorphBall::CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&) +{ + +} + +bool CMorphBall::IsInFrustum(const zeus::CFrustum&) const +{ + return false; +} + +void CMorphBall::ComputeLiftForces(const zeus::CVector3f&, const zeus::CVector3f&, const CStateManager&) +{ + +} + +void CMorphBall::CalculateSurfaceFriction() const +{ + +} + +void CMorphBall::ApplyGravity(CStateManager&) +{ + +} + +void CMorphBall::SpinToSpeed(float, zeus::CVector3f, float) +{ + +} + +void CMorphBall::ComputeMaxSpeed() const +{ + +} + +void CMorphBall::Touch(CActor&, CStateManager&) +{ + +} + +bool CMorphBall::IsClimbable(const CCollisionInfo&) const +{ + return false; +} + +void CMorphBall::FluidFXThink(CActor::EFluidState, CScriptWater&, CStateManager&) +{ + +} + +void CMorphBall::GetMorphBallModel(const std::string&, float) +{ + +} + +void CMorphBall::LoadMorphBallModel(CStateManager& mgr) +{ + +} + +void CMorphBall::AddSpiderBallElectricalEffect() +{ + +} + +void CMorphBall::UpdateSpiderBallElectricalEffect() +{ + +} + +void CMorphBall::RenderSpiderBallElectricalEffect() const +{ + +} + +void CMorphBall::RenderEnergyDrainEffects(const CStateManager&) const +{ + +} + +void CMorphBall::TouchModel(const CStateManager&) const +{ + +} + +void CMorphBall::SetAsProjectile(const CDamageInfo&, const CDamageInfo&) +{ + +} + +void CMorphBall::TakeDamage(float) +{ + +} + +void CMorphBall::StartLandingSfx() +{ + +} + +void CMorphBall::Stop() +{ + +} + +void CMorphBall::StopSounds() +{ + +} + +void CMorphBall::ActorAttached() { } diff --git a/Runtime/World/CMorphBall.hpp b/Runtime/World/CMorphBall.hpp index 8e4c6a9b6..5cebc6cd4 100644 --- a/Runtime/World/CMorphBall.hpp +++ b/Runtime/World/CMorphBall.hpp @@ -6,6 +6,12 @@ #include "zeus/CVector3f.hpp" #include "Collision/CCollidableSphere.hpp" #include "RetroTypes.hpp" +#include "Character/CAnimCharacterSet.hpp" +#include "Particle/CParticleSwoosh.hpp" +#include "Particle/CElementGen.hpp" +#include "CWorldShadow.hpp" +#include "Graphics/CRainSplashGenerator.hpp" +#include "CMorphBallShadow.hpp" namespace urde { @@ -15,7 +21,6 @@ class CDamageInfo; class CFinalInput; class CScriptWater; class CStateManager; -class CMorphBallShadow; class CMorphBall { @@ -27,7 +32,8 @@ public: enum class ESpiderBallState { - Zero + Inactive, + Active }; enum class EBombJumpState @@ -37,6 +43,15 @@ public: }; private: CPlayer& x0_player; + s32 x4_ = -1; + u32 x8_ = 0; + float xc_radius; + zeus::CVector3f x10_; + zeus::CVector3f x1c_; + bool x28_ = false; + float x2c_ = 0.f; + float x30_ = 0.f; + CCollidableSphere x38_collisionSphere; std::unique_ptr x58_ballModel; u32 x5c_ballModelShader = 0; std::unique_ptr x60_spiderBallGlassModel; @@ -45,138 +60,219 @@ private: u32 x6c_lowPolyBallModelShader = 0; std::unique_ptr x70_frozenBallModel; u32 x74_frozenBallModelShader = 0; - u32 x187c_ = 0; + u32 xc78_ = 0; + ESpiderBallState x187c_spiderBallState = ESpiderBallState::Inactive; + zeus::CVector3f x1880_; + float x188c_ = 1.f; + zeus::CVector3f x1890_spiderTrackPoint; + zeus::CVector3f x189c_; + zeus::CVector3f x18a8_; + float x18b4_ = 0.f; + float x18b8_ = 0.f; + bool x18bc_ = false; + bool x18bd_ = false; + bool x18be_ = false; + bool x18bf_ = true; + bool x18c0_ = false; + zeus::CTransform x18c4_; + float x18f4_ = 0.f; + float x18f8_ = 0.f; + float x18fc_ = 0.f; + float x1900_ = 0.f; + float x1904_ = 0.f; + float x1908_ = 0.f; + zeus::CVector2f x190c_; float x1914_ = 0.f; float x1918_ = 0.f; float x191c_damageTimer = 0.f; bool x1920_ = false; zeus::CTransform x1924_; bool x1954_isProjectile = false; - u32 x195c_ = false; - u32 x1960_ = false; - u32 x1964_ = false; - u32 x19dc_ = false; - union - { - struct - { - bool x1de4_25 : 1; - }; - u32 _dummy = 0; - }; - float x1DE8_boostTime = 0.f; + std::vector x1958_animationTokens; + TToken x1968_slowBlueTailSwoosh; + TToken x1970_slowBlueTailSwoosh2; + TToken x1978_jaggyTrail; + TToken x1980_wallSpark; + TToken x1988_ballInnerGlow; + TToken x1990_spiderBallMagnetEffect; + TToken x1998_boostBallGlow; + TToken x19a0_spiderElectric; + TToken x19a8_morphBallTransitionFlash; + TToken x19b0_effect_morphBallIceBreak; + std::unique_ptr x19b8_slowBlueTailSwooshGen; + std::unique_ptr x19bc_slowBlueTailSwooshGen2; + std::unique_ptr x19c0_slowBlueTailSwoosh2Gen; + std::unique_ptr x19c4_slowBlueTailSwoosh2Gen2; + std::unique_ptr x19c8_jaggyTrailGen; + std::unique_ptr x19cc_wallSparkGen; + std::unique_ptr x19d0_ballInnerGlowGen; + std::unique_ptr x19d4_spiderBallMagnetEffectGen; + std::unique_ptr x19d8_boostBallGlowGen; + u32 x19dc_ = 0; + u32 x19e0_ = 0; + rstl::reserved_vector, bool>, 32> x19e4_spiderElectricGens; + std::list x1b6c_; + CRandom16 x1b80_rand = {99}; + rstl::reserved_vector, 8> x1b84_wakeEffects; + rstl::reserved_vector, 8> x1bc8_wakeEffectGens; + std::unique_ptr x1bcc_[8]; + s32 x1c0c_wakeEffectIdx = -1; + TUniqueId x1c10_ballInnerGlowLight = kInvalidUniqueId; + std::unique_ptr x1c14_worldShadow; + std::unique_ptr x1c18_actorLights; + std::unique_ptr x1c1c_rainSplashGen; + float x1c20_ = 0.f; + float x1c24_ = 0.5f; + float x1c28_ = 1.f; + bool x1c2c_ = false; + float x1c30_ = 0.f; + float x1c34_ = 0.f; + float x1c38_ = 0.f; + rstl::reserved_vector x1c3c_quats; + rstl::reserved_vector x1c90_vecs; + rstl::reserved_vector x1cd0_; + rstl::reserved_vector x1d10_; + zeus::CVector3f x1dcc_; + zeus::CVector3f x1dd8_; + bool x1de4_24 : 1; + bool x1de4_25 : 1; + float x1de8_boostTime = 0.f; + float x1dec_ = 0.f; + float x1df0_ = 0.f; + float x1df4_ = 0.f; + bool x1df8_24 : 1; + bool x1df8_25 : 1; + bool x1df8_26 : 1; + bool x1df8_27 : 1; + float x1dfc_ = 0.f; + float x1e00_ = 0.f; + float x1e04_ = 0.f; + zeus::CVector3f x1e08_; + zeus::CVector3f x1e14_; + u32 x1e20_ = 0; + CSfxHandle x1e24_boostSfxHandle; + u32 x1e28_ = 0; + CSfxHandle x1e2c_rollSfxHandle; + CSfxHandle x1e30_spiderSfxHandle; + u16 x1e34_rollSfx = 0xffff; + u16 x1e36_landSfx = 0xffff; + u32 x1e38_ = 0; + EBallBoostState x1e3c_boostState = EBallBoostState::Zero; EBombJumpState x1e40_bombJumpState = EBombJumpState::Zero; - CMorphBallShadow* x1e50_shadow = nullptr; - + float x1e44_ = 0.f; + float x1e48_ = 0.f; + float x1e4c_ = 0.f; + std::unique_ptr x1e50_shadow; + void LoadAnimationTokens(const std::string& ancsName); + void InitializeWakeEffects(); + static std::unique_ptr GetMorphBallModel(const char* name, float radius); + void SelectMorphBallSounds(const CMaterialList& mat); + void UpdateMorphBallSounds(float dt); public: - CMorphBall(CPlayer& player, float); + CMorphBall(CPlayer& player, float radius); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr); - ESpiderBallState GetSpiderBallState() const { return ESpiderBallState::Zero; } - bool InSpiderMode() const { return false; } - zeus::CVector3f GetBallContactSurfaceNormal() const { return {}; } - void GetModel() const {} - const CCollidableSphere* GetCollidableSphere() const { return nullptr; } + zeus::CVector3f GetBallContactSurfaceNormal() const; + const CCollidableSphere& GetCollidableSphere() const { return x38_collisionSphere; } bool IsProjectile() const { return x1954_isProjectile; } - void GetBallContactMeterials() const {} + void GetBallContactMaterials() const {} void GetWallBumpCounter() const {} void GetBoostChargeTimer() const {} bool IsBoosting() const { return false; } - float GetBallRadius() const { return 0.f; } - float GetBallTouchRadius() const { return 0.f; } - void ForwardInput(const CFinalInput&) const {} - void ComputeBallMovement(const CFinalInput&, CStateManager&, float) {} - bool IsMovementAllowed() const { return false; } - void UpdateSpiderBall(const CFinalInput&, CStateManager&, float) {} - void ApplySpiderBallSwingingForces(const CFinalInput&, CStateManager&, float) {} - void ApplySpiderBallRollForces(const CFinalInput&, CStateManager&, float) {} + float GetBallRadius() const; + float GetBallTouchRadius() const; + void ForwardInput(const CFinalInput&) const; + void ComputeBallMovement(const CFinalInput&, CStateManager&, float); + bool IsMovementAllowed() const; + void UpdateSpiderBall(const CFinalInput&, CStateManager&, float); + void ApplySpiderBallSwingingForces(const CFinalInput&, CStateManager&, float); + void ApplySpiderBallRollForces(const CFinalInput&, CStateManager&, float); void CalculateSpiderBallAttractionSurfaceForces(const CFinalInput&, CStateManager&, - const zeus::CTransform&) {} - void CheckForSwitchToSpiderBallSwinging(CStateManager&) {} + const zeus::CTransform&); + void CheckForSwitchToSpiderBallSwinging(CStateManager&); void FindClosestSpiderBallWaypoint(CStateManager&, const zeus::CVector3f&, zeus::CVector3f&, zeus::CVector3f&, zeus::CVector3f&, float&, zeus::CVector3f&, bool&, - zeus::CTransform&) const {} - void SetSpiderBallSwingingState(bool) {} - void GetSpiderBallControllerMovement(const CFinalInput&, bool, bool) {} - void ResetSpiderBallSwingControllerMovementTimer() {} - void UpdateSpiderBallSwingControllerMovementTimer(float, float) {} - float GetSpiderBallSwingControllerMovementScalar() const { return 0.f; } - void CreateSpiderBallParticles(const zeus::CVector3f&, const zeus::CVector3f&) {} - void ComputeMarioMovement(const CFinalInput&, CStateManager&, float) {} - void SetSpiderBallState(ESpiderBallState) {} - void GetSwooshToWorld() const {} - zeus::CTransform GetBallToWorld() const { return {}; } - void CalculateSurfaceToWorld(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&) const {} - void CalculateBallContactInfo(zeus::CVector3f&, zeus::CVector3f&) const {} - void BallTurnInput(const CFinalInput&) const {} - void UpdateBallDynamics(CStateManager&, float) {} - void SwitchToMarble() {} - void SwitchToTire() {} - void Update(float, CStateManager&) {} - void UpdateScriptMessage(EScriptObjectMessage, TUniqueId, CStateManager&) {} - void DeleteLight(CStateManager&) {} - void SetBallLightActive(CStateManager&, bool) {} - void EnterMorphBallState(CStateManager&) {} - void LeaveMorphBallState(CStateManager&) {} - void UpdateEffects(float, CStateManager&) {} - void ComputeBoostBallMovement(const CFinalInput&, const CStateManager&, float) {} - void EnterBoosting() {} - void LeaveBoosting() {} - void CancelBoosting() {} - void UpdateMarbleDynamics(CStateManager&, float, const zeus::CVector3f&) {} - void ApplyFriction(float) {} - void DampLinearAndAngularVelocities(float, float) {} - zeus::CTransform GetPrimitiveTransform() const { return {}; } - void DrawCollisionPrimitive() const {} - void GetMinimumAlignmentSpeed() const {} - void PreRender(CStateManager&, const zeus::CFrustum&) {} - void Render(const CStateManager&, const CActorLights*) const {} - void ResetMorphBallTransitionFlash() {} - void UpdateMorphBallTransitionFlash(float) {} - void RenderMorphBallTransitionFlash(const CStateManager&) const {} + zeus::CTransform&) const; + void SetSpiderBallSwingingState(bool); + void GetSpiderBallControllerMovement(const CFinalInput&, bool, bool); + void ResetSpiderBallSwingControllerMovementTimer(); + void UpdateSpiderBallSwingControllerMovementTimer(float, float); + float GetSpiderBallSwingControllerMovementScalar() const; + void CreateSpiderBallParticles(const zeus::CVector3f&, const zeus::CVector3f&); + void ComputeMarioMovement(const CFinalInput&, CStateManager&, float); + void SetSpiderBallState(ESpiderBallState state) { x187c_spiderBallState = state; } + void GetSwooshToWorld() const; + zeus::CTransform GetBallToWorld() const; + void CalculateSurfaceToWorld(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&) const; + void CalculateBallContactInfo(zeus::CVector3f&, zeus::CVector3f&) const; + void BallTurnInput(const CFinalInput&) const; + void UpdateBallDynamics(CStateManager&, float); + void SwitchToMarble(); + void SwitchToTire(); + void Update(float dt, CStateManager& mgr); + void UpdateScriptMessage(EScriptObjectMessage, TUniqueId, CStateManager&); + void DeleteLight(CStateManager&); + void SetBallLightActive(CStateManager&, bool); + void EnterMorphBallState(CStateManager&); + void LeaveMorphBallState(CStateManager&); + void UpdateEffects(float, CStateManager&); + void ComputeBoostBallMovement(const CFinalInput&, const CStateManager&, float); + void EnterBoosting(); + void LeaveBoosting(); + void CancelBoosting(); + void UpdateMarbleDynamics(CStateManager&, float, const zeus::CVector3f&); + void ApplyFriction(float); + void DampLinearAndAngularVelocities(float, float); + zeus::CTransform GetPrimitiveTransform() const; + void DrawCollisionPrimitive() const; + void GetMinimumAlignmentSpeed() const; + void PreRender(CStateManager&, const zeus::CFrustum&); + void Render(const CStateManager&, const CActorLights*) const; + void ResetMorphBallTransitionFlash(); + void UpdateMorphBallTransitionFlash(float); + void RenderMorphBallTransitionFlash(const CStateManager&) const; bool IsMorphBallTransitionFlashValid() const { return x19dc_ != 0; } - void RenderDamageEffects(const CStateManager&, const zeus::CTransform&) const {} - void UpdateHalfPipeStatus(CStateManager&, float) {} - bool GetIsInHalfPipeMode() const { return false; } - void SetIsInHalfPipeMode(bool) {} - void GetIsInHalfPipeModeInAir() const {} - void SetIsInHalfPipeModeInAir(bool) {} - void GetTouchedHalfPipeRecently() const {} - void SetTouchedHalfPipeRecently(bool) {} - void DisableHalfPipeStatus() {} - bool BallCloseToCollision(const CStateManager&, float, const CMaterialFilter& filter) const { return false; } - void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&) {} - bool IsInFrustum(const zeus::CFrustum&) const { return false; } - void ComputeLiftForces(const zeus::CVector3f&, const zeus::CVector3f&, const CStateManager&) {} - void CalculateSurfaceFriction() const {} - void ApplyGravity(CStateManager&) {} - void SpinToSpeed(float, zeus::CVector3f, float) {} - void ComputeMaxSpeed() const {} - void Touch(CActor&, CStateManager&) {} - bool IsClimbable(const CCollisionInfo&) const { return false; } - void FluidFXThink(CActor::EFluidState, CScriptWater&, CStateManager&) {} - void GetMorphBallModel(const std::string&, float) {} - void LoadMorphBallModel(CStateManager& mgr) {} - void AddSpiderBallElectricalEffect() {} - void UpdateSpiderBallElectricalEffect() {} - void RenderSpiderBallElectricalEffect() const {} - void RenderEnergyDrainEffects(const CStateManager&) const {} - void TouchModel(const CStateManager&) const {} - void SetAsProjectile(const CDamageInfo&, const CDamageInfo&) {} - EBallBoostState GetBallBoostState() const { return EBallBoostState::Zero; } - void SetBallBoostState(EBallBoostState) {} + void RenderDamageEffects(const CStateManager&, const zeus::CTransform&) const; + void UpdateHalfPipeStatus(CStateManager&, float); + bool GetIsInHalfPipeMode() const; + void SetIsInHalfPipeMode(bool); + void GetIsInHalfPipeModeInAir() const; + void SetIsInHalfPipeModeInAir(bool); + void GetTouchedHalfPipeRecently() const; + void SetTouchedHalfPipeRecently(bool); + void DisableHalfPipeStatus(); + bool BallCloseToCollision(const CStateManager&, float, const CMaterialFilter& filter) const; + void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&); + bool IsInFrustum(const zeus::CFrustum&) const; + void ComputeLiftForces(const zeus::CVector3f&, const zeus::CVector3f&, const CStateManager&); + void CalculateSurfaceFriction() const; + void ApplyGravity(CStateManager&); + void SpinToSpeed(float, zeus::CVector3f, float); + void ComputeMaxSpeed() const; + void Touch(CActor&, CStateManager&); + bool IsClimbable(const CCollisionInfo&) const; + void FluidFXThink(CActor::EFluidState, CScriptWater&, CStateManager&); + void GetMorphBallModel(const std::string&, float); + void LoadMorphBallModel(CStateManager& mgr); + void AddSpiderBallElectricalEffect(); + void UpdateSpiderBallElectricalEffect(); + void RenderSpiderBallElectricalEffect() const; + void RenderEnergyDrainEffects(const CStateManager&) const; + void TouchModel(const CStateManager&) const; + void SetAsProjectile(const CDamageInfo&, const CDamageInfo&); + EBallBoostState GetBallBoostState() const { return x1e3c_boostState; } + void SetBallBoostState(EBallBoostState state) { x1e3c_boostState = state; } EBombJumpState GetBombJumpState() const { return x1e40_bombJumpState; } - void LoadAnimationTokens(const std::string&) {} - void TakeDamage(float) {} + void TakeDamage(float); void DrawBallShadow(const CStateManager& mgr); void DeleteBallShadow(); void CreateBallShadow(); void RenderToShadowTex(CStateManager& mgr); - void StartLandingSfx() {} - bool GetX187c() const { return x187c_ != 0; } + void StartLandingSfx(); + ESpiderBallState GetSpiderBallState() const { return x187c_spiderBallState; } void SetDamageTimer(float t) { x191c_damageTimer = t; } - void Stop() {} - void StopSounds() {} - void ActorAttached() {} + void Stop(); + void StopSounds(); + void ActorAttached(); CModelData& GetMorphballModelData() const { return *x58_ballModel; } u32 GetMorphballModelShader() const { return x5c_ballModelShader; } bool GetX1DE4_25() const { return x1de4_25; } diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index 12436e0f6..1a25f2db1 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -862,7 +862,7 @@ void CPlayer::FluidFXThink(EFluidState state, CScriptWater& water, CStateManager { x768_morphball->FluidFXThink(state, water, mgr); if (state == EFluidState::InFluid) - x9c5_30_ = true; + x9c5_30_selectFluidBallSound = true; } else if (x2f8_morphBallState != EPlayerMorphBallState::Unmorphed) { @@ -2821,7 +2821,7 @@ void CPlayer::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CState break; case EScriptObjectMessage::Falling: if (x2f8_morphBallState == EPlayerMorphBallState::Morphed) - if (x768_morphball->GetX187c() == 1) + if (x768_morphball->GetSpiderBallState() == CMorphBall::ESpiderBallState::Active) break; if (x2f8_morphBallState != EPlayerMorphBallState::Morphed) SetMoveState(EPlayerMovementState::Falling, mgr); @@ -2830,7 +2830,7 @@ void CPlayer::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CState break; case EScriptObjectMessage::LandOnNotFloor: if (x2f8_morphBallState == EPlayerMorphBallState::Morphed && - x768_morphball->GetX187c() == 1 && + x768_morphball->GetSpiderBallState() == CMorphBall::ESpiderBallState::Active && x258_movementState != EPlayerMovementState::StartingJump) SetMoveState(EPlayerMovementState::StartingJump, mgr); break; @@ -5476,7 +5476,7 @@ const CCollisionPrimitive* CPlayer::GetCollisionPrimitive() const const CCollidableSphere* CPlayer::GetCollidableSphere() const { - return x768_morphball->GetCollidableSphere(); + return &x768_morphball->GetCollidableSphere(); } zeus::CTransform CPlayer::GetPrimitiveTransform() const diff --git a/Runtime/World/CPlayer.hpp b/Runtime/World/CPlayer.hpp index 9e666cba0..d179ab4ee 100644 --- a/Runtime/World/CPlayer.hpp +++ b/Runtime/World/CPlayer.hpp @@ -374,7 +374,7 @@ private: bool x9c5_27_camSubmerged : 1; bool x9c5_28_slidingOnWall : 1; bool x9c5_29_hitWall : 1; - bool x9c5_30_ : 1; + bool x9c5_30_selectFluidBallSound : 1; bool x9c5_31_stepCameraZBiasDirty : 1; bool x9c6_24_extendTargetDistance : 1; bool x9c6_25_interpolatingControlDir : 1; @@ -512,7 +512,7 @@ public: void SetVisorSteam(float, float, float, CAssetId, bool); void UpdateFootstepSounds(const CFinalInput& input, CStateManager&, float); u16 GetMaterialSoundUnderPlayer(CStateManager& mgr, const u16*, u32, u16); - u16 SfxIdFromMaterial(const CMaterialList&, const u16*, u32, u16); + static u16 SfxIdFromMaterial(const CMaterialList&, const u16*, u32, u16); void UpdateCrosshairsState(const CFinalInput&); void UpdateVisorTransition(float, CStateManager& mgr); void UpdateVisorState(const CFinalInput&, float, CStateManager& mgr); diff --git a/hecl b/hecl index 5291cd71d..a7bc172e9 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 5291cd71d77848a5c7e4cb4d38aba5c31d453be9 +Subproject commit a7bc172e938ca97cef01794a77b5412b12f44949