Initial round of CMorphBall implementations

This commit is contained in:
Jack Andersen 2017-09-10 16:18:49 -10:00
parent 1022e4819c
commit 10092821c8
26 changed files with 1192 additions and 436 deletions

View File

@ -10,9 +10,11 @@ struct ITweakBall : ITweak
virtual float GetMaxBallTranslationAcceleration(int s) const=0; virtual float GetMaxBallTranslationAcceleration(int s) const=0;
virtual float GetBallTranslationFriction(int s) const=0; virtual float GetBallTranslationFriction(int s) const=0;
virtual float GetBallTranslationMaxSpeed(int s) const=0; virtual float GetBallTranslationMaxSpeed(int s) const=0;
virtual float GetSpiderBallRollSpeed() const=0;
virtual float GetBallCameraControlDistance() const=0; virtual float GetBallCameraControlDistance() const=0;
virtual float GetLeftStickDivisor() const=0; virtual float GetLeftStickDivisor() const=0;
virtual float GetRightStickDivisor() const=0; virtual float GetRightStickDivisor() const=0;
virtual float GetBallTouchRadius() const=0;
}; };
} }

View File

@ -7,53 +7,53 @@ namespace DNAMP1
void CTweakBall::read(athena::io::IStreamReader& __dna_reader) void CTweakBall::read(athena::io::IStreamReader& __dna_reader)
{ {
/* x4_[0] */ /* x4_maxTranslationAcceleration[0] */
x4_maxTranslationAcceleration[0] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[0] = __dna_reader.readFloatBig();
/* x4_[1] */ /* x4_maxTranslationAcceleration[1] */
x4_maxTranslationAcceleration[1] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[1] = __dna_reader.readFloatBig();
/* x4_[2] */ /* x4_maxTranslationAcceleration[2] */
x4_maxTranslationAcceleration[2] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[2] = __dna_reader.readFloatBig();
/* x4_[3] */ /* x4_maxTranslationAcceleration[3] */
x4_maxTranslationAcceleration[3] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[3] = __dna_reader.readFloatBig();
/* x4_[4] */ /* x4_maxTranslationAcceleration[4] */
x4_maxTranslationAcceleration[4] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[4] = __dna_reader.readFloatBig();
/* x4_[5] */ /* x4_maxTranslationAcceleration[5] */
x4_maxTranslationAcceleration[5] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[5] = __dna_reader.readFloatBig();
/* x4_[6] */ /* x4_maxTranslationAcceleration[6] */
x4_maxTranslationAcceleration[6] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[6] = __dna_reader.readFloatBig();
/* x4_[7] */ /* x4_maxTranslationAcceleration[7] */
x4_maxTranslationAcceleration[7] = __dna_reader.readFloatBig(); x4_maxTranslationAcceleration[7] = __dna_reader.readFloatBig();
/* x24_[0] */ /* x24_translationFriction[0] */
x24_translationFriction[0] = __dna_reader.readFloatBig(); x24_translationFriction[0] = __dna_reader.readFloatBig();
/* x24_[1] */ /* x24_translationFriction[1] */
x24_translationFriction[1] = __dna_reader.readFloatBig(); x24_translationFriction[1] = __dna_reader.readFloatBig();
/* x24_[2] */ /* x24_translationFriction[2] */
x24_translationFriction[2] = __dna_reader.readFloatBig(); x24_translationFriction[2] = __dna_reader.readFloatBig();
/* x24_[3] */ /* x24_translationFriction[3] */
x24_translationFriction[3] = __dna_reader.readFloatBig(); x24_translationFriction[3] = __dna_reader.readFloatBig();
/* x24_[4] */ /* x24_translationFriction[4] */
x24_translationFriction[4] = __dna_reader.readFloatBig(); x24_translationFriction[4] = __dna_reader.readFloatBig();
/* x24_[5] */ /* x24_translationFriction[5] */
x24_translationFriction[5] = __dna_reader.readFloatBig(); x24_translationFriction[5] = __dna_reader.readFloatBig();
/* x24_[6] */ /* x24_translationFriction[6] */
x24_translationFriction[6] = __dna_reader.readFloatBig(); x24_translationFriction[6] = __dna_reader.readFloatBig();
/* x24_[7] */ /* x24_translationFriction[7] */
x24_translationFriction[7] = __dna_reader.readFloatBig(); x24_translationFriction[7] = __dna_reader.readFloatBig();
/* x44_[0] */ /* x44_translationMaxSpeed[0] */
x44_translationMaxSpeed[0] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[0] = __dna_reader.readFloatBig();
/* x44_[1] */ /* x44_translationMaxSpeed[1] */
x44_translationMaxSpeed[1] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[1] = __dna_reader.readFloatBig();
/* x44_[2] */ /* x44_translationMaxSpeed[2] */
x44_translationMaxSpeed[2] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[2] = __dna_reader.readFloatBig();
/* x44_[3] */ /* x44_translationMaxSpeed[3] */
x44_translationMaxSpeed[3] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[3] = __dna_reader.readFloatBig();
/* x44_[4] */ /* x44_translationMaxSpeed[4] */
x44_translationMaxSpeed[4] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[4] = __dna_reader.readFloatBig();
/* x44_[5] */ /* x44_translationMaxSpeed[5] */
x44_translationMaxSpeed[5] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[5] = __dna_reader.readFloatBig();
/* x44_[6] */ /* x44_translationMaxSpeed[6] */
x44_translationMaxSpeed[6] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[6] = __dna_reader.readFloatBig();
/* x44_[7] */ /* x44_translationMaxSpeed[7] */
x44_translationMaxSpeed[7] = __dna_reader.readFloatBig(); x44_translationMaxSpeed[7] = __dna_reader.readFloatBig();
/* x64_ */ /* x64_ */
x64_ = __dna_reader.readFloatBig(); x64_ = __dna_reader.readFloatBig();
@ -79,8 +79,8 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader)
xc4_[6] = __dna_reader.readFloatBig(); xc4_[6] = __dna_reader.readFloatBig();
/* xc4_[7] */ /* xc4_[7] */
xc4_[7] = __dna_reader.readFloatBig(); xc4_[7] = __dna_reader.readFloatBig();
/* xe4_ */ /* xe4_spiderBallRollSpeed */
xe4_ = __dna_reader.readFloatBig(); xe4_spiderBallRollSpeed = __dna_reader.readFloatBig();
/* xe8_ */ /* xe8_ */
xe8_ = __dna_reader.readFloatBig(); xe8_ = __dna_reader.readFloatBig();
/* x14c_ */ /* x14c_ */
@ -191,20 +191,20 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader)
x1c8_ = __dna_reader.readFloatBig(); x1c8_ = __dna_reader.readFloatBig();
/* x1cc_ */ /* x1cc_ */
x1cc_ = __dna_reader.readFloatBig(); x1cc_ = __dna_reader.readFloatBig();
/* x1d0_ */ /* x1d0_ballCameraControlDistance */
x1d0_ballCameraControlDistance = __dna_reader.readFloatBig(); x1d0_ballCameraControlDistance = __dna_reader.readFloatBig();
/* x1d4_ */ /* x1d4_ */
x1d4_ = __dna_reader.readFloatBig(); x1d4_ = __dna_reader.readFloatBig();
/* x1d8_ */ /* x1d8_ */
x1d8_ = __dna_reader.readFloatBig(); x1d8_ = __dna_reader.readFloatBig();
/* x1e4_ */ /* x1e4_leftStickDivisor */
x1e4_leftStickDivisor = __dna_reader.readFloatBig(); x1e4_leftStickDivisor = __dna_reader.readFloatBig();
/* x1e8_ */ /* x1e8_rightStickDivisor */
x1e8_rightStickDivisor = __dna_reader.readFloatBig(); x1e8_rightStickDivisor = __dna_reader.readFloatBig();
/* x200_ */ /* x200_ */
x200_ = __dna_reader.readFloatBig(); x200_ = __dna_reader.readFloatBig();
/* x204_ */ /* x204_ballTouchRadius */
x204_ = __dna_reader.readFloatBig(); x204_ballTouchRadius = __dna_reader.readFloatBig();
/* x20c_ */ /* x20c_ */
x20c_ = __dna_reader.readFloatBig(); x20c_ = __dna_reader.readFloatBig();
/* x218_ */ /* x218_ */
@ -227,53 +227,53 @@ void CTweakBall::read(athena::io::IStreamReader& __dna_reader)
void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const
{ {
/* x4_[0] */ /* x4_maxTranslationAcceleration[0] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[0]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[0]);
/* x4_[1] */ /* x4_maxTranslationAcceleration[1] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[1]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[1]);
/* x4_[2] */ /* x4_maxTranslationAcceleration[2] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[2]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[2]);
/* x4_[3] */ /* x4_maxTranslationAcceleration[3] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[3]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[3]);
/* x4_[4] */ /* x4_maxTranslationAcceleration[4] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[4]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[4]);
/* x4_[5] */ /* x4_maxTranslationAcceleration[5] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[5]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[5]);
/* x4_[6] */ /* x4_maxTranslationAcceleration[6] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[6]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[6]);
/* x4_[7] */ /* x4_maxTranslationAcceleration[7] */
__dna_writer.writeFloatBig(x4_maxTranslationAcceleration[7]); __dna_writer.writeFloatBig(x4_maxTranslationAcceleration[7]);
/* x24_[0] */ /* x24_translationFriction[0] */
__dna_writer.writeFloatBig(x24_translationFriction[0]); __dna_writer.writeFloatBig(x24_translationFriction[0]);
/* x24_[1] */ /* x24_translationFriction[1] */
__dna_writer.writeFloatBig(x24_translationFriction[1]); __dna_writer.writeFloatBig(x24_translationFriction[1]);
/* x24_[2] */ /* x24_translationFriction[2] */
__dna_writer.writeFloatBig(x24_translationFriction[2]); __dna_writer.writeFloatBig(x24_translationFriction[2]);
/* x24_[3] */ /* x24_translationFriction[3] */
__dna_writer.writeFloatBig(x24_translationFriction[3]); __dna_writer.writeFloatBig(x24_translationFriction[3]);
/* x24_[4] */ /* x24_translationFriction[4] */
__dna_writer.writeFloatBig(x24_translationFriction[4]); __dna_writer.writeFloatBig(x24_translationFriction[4]);
/* x24_[5] */ /* x24_translationFriction[5] */
__dna_writer.writeFloatBig(x24_translationFriction[5]); __dna_writer.writeFloatBig(x24_translationFriction[5]);
/* x24_[6] */ /* x24_translationFriction[6] */
__dna_writer.writeFloatBig(x24_translationFriction[6]); __dna_writer.writeFloatBig(x24_translationFriction[6]);
/* x24_[7] */ /* x24_translationFriction[7] */
__dna_writer.writeFloatBig(x24_translationFriction[7]); __dna_writer.writeFloatBig(x24_translationFriction[7]);
/* x44_[0] */ /* x44_translationMaxSpeed[0] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[0]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[0]);
/* x44_[1] */ /* x44_translationMaxSpeed[1] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[1]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[1]);
/* x44_[2] */ /* x44_translationMaxSpeed[2] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[2]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[2]);
/* x44_[3] */ /* x44_translationMaxSpeed[3] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[3]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[3]);
/* x44_[4] */ /* x44_translationMaxSpeed[4] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[4]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[4]);
/* x44_[5] */ /* x44_translationMaxSpeed[5] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[5]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[5]);
/* x44_[6] */ /* x44_translationMaxSpeed[6] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[6]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[6]);
/* x44_[7] */ /* x44_translationMaxSpeed[7] */
__dna_writer.writeFloatBig(x44_translationMaxSpeed[7]); __dna_writer.writeFloatBig(x44_translationMaxSpeed[7]);
/* x64_ */ /* x64_ */
__dna_writer.writeFloatBig(x64_); __dna_writer.writeFloatBig(x64_);
@ -299,8 +299,8 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const
__dna_writer.writeFloatBig(xc4_[6]); __dna_writer.writeFloatBig(xc4_[6]);
/* xc4_[7] */ /* xc4_[7] */
__dna_writer.writeFloatBig(xc4_[7]); __dna_writer.writeFloatBig(xc4_[7]);
/* xe4_ */ /* xe4_spiderBallRollSpeed */
__dna_writer.writeFloatBig(xe4_); __dna_writer.writeFloatBig(xe4_spiderBallRollSpeed);
/* xe8_ */ /* xe8_ */
__dna_writer.writeFloatBig(xe8_); __dna_writer.writeFloatBig(xe8_);
/* x14c_ */ /* x14c_ */
@ -411,20 +411,20 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const
__dna_writer.writeFloatBig(x1c8_); __dna_writer.writeFloatBig(x1c8_);
/* x1cc_ */ /* x1cc_ */
__dna_writer.writeFloatBig(x1cc_); __dna_writer.writeFloatBig(x1cc_);
/* x1d0_ */ /* x1d0_ballCameraControlDistance */
__dna_writer.writeFloatBig(x1d0_ballCameraControlDistance); __dna_writer.writeFloatBig(x1d0_ballCameraControlDistance);
/* x1d4_ */ /* x1d4_ */
__dna_writer.writeFloatBig(x1d4_); __dna_writer.writeFloatBig(x1d4_);
/* x1d8_ */ /* x1d8_ */
__dna_writer.writeFloatBig(x1d8_); __dna_writer.writeFloatBig(x1d8_);
/* x1e4_ */ /* x1e4_leftStickDivisor */
__dna_writer.writeFloatBig(x1e4_leftStickDivisor); __dna_writer.writeFloatBig(x1e4_leftStickDivisor);
/* x1e8_ */ /* x1e8_rightStickDivisor */
__dna_writer.writeFloatBig(x1e8_rightStickDivisor); __dna_writer.writeFloatBig(x1e8_rightStickDivisor);
/* x200_ */ /* x200_ */
__dna_writer.writeFloatBig(x200_); __dna_writer.writeFloatBig(x200_);
/* x204_ */ /* x204_ballTouchRadius */
__dna_writer.writeFloatBig(x204_); __dna_writer.writeFloatBig(x204_ballTouchRadius);
/* x20c_ */ /* x20c_ */
__dna_writer.writeFloatBig(x20c_); __dna_writer.writeFloatBig(x20c_);
/* x218_ */ /* x218_ */
@ -447,68 +447,68 @@ void CTweakBall::write(athena::io::IStreamWriter& __dna_writer) const
void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin) void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin)
{ {
/* x4_ */ /* x4_maxTranslationAcceleration */
size_t __x4_Count; 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] */
x4_maxTranslationAcceleration[0] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[0] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[1] */ /* x4_maxTranslationAcceleration[1] */
x4_maxTranslationAcceleration[1] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[1] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[2] */ /* x4_maxTranslationAcceleration[2] */
x4_maxTranslationAcceleration[2] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[2] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[3] */ /* x4_maxTranslationAcceleration[3] */
x4_maxTranslationAcceleration[3] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[3] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[4] */ /* x4_maxTranslationAcceleration[4] */
x4_maxTranslationAcceleration[4] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[4] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[5] */ /* x4_maxTranslationAcceleration[5] */
x4_maxTranslationAcceleration[5] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[5] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[6] */ /* x4_maxTranslationAcceleration[6] */
x4_maxTranslationAcceleration[6] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[6] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
/* x4_[7] */ /* x4_maxTranslationAcceleration[7] */
x4_maxTranslationAcceleration[7] = __dna_docin.readFloat("x4_"); x4_maxTranslationAcceleration[7] = __dna_docin.readFloat("x4_maxTranslationAcceleration");
} }
/* x24_ */ /* x24_translationFriction */
size_t __x24_Count; 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] */
x24_translationFriction[0] = __dna_docin.readFloat("x24_"); x24_translationFriction[0] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[1] */ /* x24_translationFriction[1] */
x24_translationFriction[1] = __dna_docin.readFloat("x24_"); x24_translationFriction[1] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[2] */ /* x24_translationFriction[2] */
x24_translationFriction[2] = __dna_docin.readFloat("x24_"); x24_translationFriction[2] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[3] */ /* x24_translationFriction[3] */
x24_translationFriction[3] = __dna_docin.readFloat("x24_"); x24_translationFriction[3] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[4] */ /* x24_translationFriction[4] */
x24_translationFriction[4] = __dna_docin.readFloat("x24_"); x24_translationFriction[4] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[5] */ /* x24_translationFriction[5] */
x24_translationFriction[5] = __dna_docin.readFloat("x24_"); x24_translationFriction[5] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[6] */ /* x24_translationFriction[6] */
x24_translationFriction[6] = __dna_docin.readFloat("x24_"); x24_translationFriction[6] = __dna_docin.readFloat("x24_translationFriction");
/* x24_[7] */ /* x24_translationFriction[7] */
x24_translationFriction[7] = __dna_docin.readFloat("x24_"); x24_translationFriction[7] = __dna_docin.readFloat("x24_translationFriction");
} }
/* x44_ */ /* x44_translationMaxSpeed */
size_t __x44_Count; 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] */
x44_translationMaxSpeed[0] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[0] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[1] */ /* x44_translationMaxSpeed[1] */
x44_translationMaxSpeed[1] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[1] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[2] */ /* x44_translationMaxSpeed[2] */
x44_translationMaxSpeed[2] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[2] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[3] */ /* x44_translationMaxSpeed[3] */
x44_translationMaxSpeed[3] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[3] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[4] */ /* x44_translationMaxSpeed[4] */
x44_translationMaxSpeed[4] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[4] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[5] */ /* x44_translationMaxSpeed[5] */
x44_translationMaxSpeed[5] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[5] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[6] */ /* x44_translationMaxSpeed[6] */
x44_translationMaxSpeed[6] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[6] = __dna_docin.readFloat("x44_translationMaxSpeed");
/* x44_[7] */ /* x44_translationMaxSpeed[7] */
x44_translationMaxSpeed[7] = __dna_docin.readFloat("x44_"); x44_translationMaxSpeed[7] = __dna_docin.readFloat("x44_translationMaxSpeed");
} }
/* x64_ */ /* x64_ */
x64_ = __dna_docin.readFloat("x64_"); x64_ = __dna_docin.readFloat("x64_");
@ -539,8 +539,8 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin)
/* xc4_[7] */ /* xc4_[7] */
xc4_[7] = __dna_docin.readFloat("xc4_"); xc4_[7] = __dna_docin.readFloat("xc4_");
} }
/* xe4_ */ /* xe4_spiderBallRollSpeed */
xe4_ = __dna_docin.readFloat("xe4_"); xe4_spiderBallRollSpeed = __dna_docin.readFloat("xe4_spiderBallRollSpeed");
/* xe8_ */ /* xe8_ */
xe8_ = __dna_docin.readFloat("xe8_"); xe8_ = __dna_docin.readFloat("xe8_");
/* x14c_ */ /* x14c_ */
@ -651,20 +651,20 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin)
x1c8_ = __dna_docin.readFloat("x1c8_"); x1c8_ = __dna_docin.readFloat("x1c8_");
/* x1cc_ */ /* x1cc_ */
x1cc_ = __dna_docin.readFloat("x1cc_"); x1cc_ = __dna_docin.readFloat("x1cc_");
/* x1d0_ */ /* x1d0_ballCameraControlDistance */
x1d0_ballCameraControlDistance = __dna_docin.readFloat("x1d0_"); x1d0_ballCameraControlDistance = __dna_docin.readFloat("x1d0_ballCameraControlDistance");
/* x1d4_ */ /* x1d4_ */
x1d4_ = __dna_docin.readFloat("x1d4_"); x1d4_ = __dna_docin.readFloat("x1d4_");
/* x1d8_ */ /* x1d8_ */
x1d8_ = __dna_docin.readFloat("x1d8_"); x1d8_ = __dna_docin.readFloat("x1d8_");
/* x1e4_ */ /* x1e4_leftStickDivisor */
x1e4_leftStickDivisor = __dna_docin.readFloat("x1e4_"); x1e4_leftStickDivisor = __dna_docin.readFloat("x1e4_leftStickDivisor");
/* x1e8_ */ /* x1e8_rightStickDivisor */
x1e8_rightStickDivisor = __dna_docin.readFloat("x1e8_"); x1e8_rightStickDivisor = __dna_docin.readFloat("x1e8_rightStickDivisor");
/* x200_ */ /* x200_ */
x200_ = __dna_docin.readFloat("x200_"); x200_ = __dna_docin.readFloat("x200_");
/* x204_ */ /* x204_ballTouchRadius */
x204_ = __dna_docin.readFloat("x204_"); x204_ballTouchRadius = __dna_docin.readFloat("x204_ballTouchRadius");
/* x20c_ */ /* x20c_ */
x20c_ = __dna_docin.readFloat("x20c_"); x20c_ = __dna_docin.readFloat("x20c_");
/* x218_ */ /* x218_ */
@ -687,65 +687,65 @@ void CTweakBall::read(athena::io::YAMLDocReader& __dna_docin)
void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const
{ {
/* x4_ */ /* x4_maxTranslationAcceleration */
if (auto v = __dna_docout.enterSubVector("x4_")) if (auto v = __dna_docout.enterSubVector("x4_maxTranslationAcceleration"))
{ {
/* x4_[0] */ /* x4_maxTranslationAcceleration[0] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[0]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[0]);
/* x4_[1] */ /* x4_maxTranslationAcceleration[1] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[1]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[1]);
/* x4_[2] */ /* x4_maxTranslationAcceleration[2] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[2]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[2]);
/* x4_[3] */ /* x4_maxTranslationAcceleration[3] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[3]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[3]);
/* x4_[4] */ /* x4_maxTranslationAcceleration[4] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[4]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[4]);
/* x4_[5] */ /* x4_maxTranslationAcceleration[5] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[5]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[5]);
/* x4_[6] */ /* x4_maxTranslationAcceleration[6] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[6]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[6]);
/* x4_[7] */ /* x4_maxTranslationAcceleration[7] */
__dna_docout.writeFloat("x4_", x4_maxTranslationAcceleration[7]); __dna_docout.writeFloat("x4_maxTranslationAcceleration", x4_maxTranslationAcceleration[7]);
} }
/* x24_ */ /* x24_translationFriction */
if (auto v = __dna_docout.enterSubVector("x24_")) if (auto v = __dna_docout.enterSubVector("x24_translationFriction"))
{ {
/* x24_[0] */ /* x24_translationFriction[0] */
__dna_docout.writeFloat("x24_", x24_translationFriction[0]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[0]);
/* x24_[1] */ /* x24_translationFriction[1] */
__dna_docout.writeFloat("x24_", x24_translationFriction[1]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[1]);
/* x24_[2] */ /* x24_translationFriction[2] */
__dna_docout.writeFloat("x24_", x24_translationFriction[2]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[2]);
/* x24_[3] */ /* x24_translationFriction[3] */
__dna_docout.writeFloat("x24_", x24_translationFriction[3]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[3]);
/* x24_[4] */ /* x24_translationFriction[4] */
__dna_docout.writeFloat("x24_", x24_translationFriction[4]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[4]);
/* x24_[5] */ /* x24_translationFriction[5] */
__dna_docout.writeFloat("x24_", x24_translationFriction[5]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[5]);
/* x24_[6] */ /* x24_translationFriction[6] */
__dna_docout.writeFloat("x24_", x24_translationFriction[6]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[6]);
/* x24_[7] */ /* x24_translationFriction[7] */
__dna_docout.writeFloat("x24_", x24_translationFriction[7]); __dna_docout.writeFloat("x24_translationFriction", x24_translationFriction[7]);
} }
/* x44_ */ /* x44_translationMaxSpeed */
if (auto v = __dna_docout.enterSubVector("x44_")) if (auto v = __dna_docout.enterSubVector("x44_translationMaxSpeed"))
{ {
/* x44_[0] */ /* x44_translationMaxSpeed[0] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[0]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[0]);
/* x44_[1] */ /* x44_translationMaxSpeed[1] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[1]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[1]);
/* x44_[2] */ /* x44_translationMaxSpeed[2] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[2]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[2]);
/* x44_[3] */ /* x44_translationMaxSpeed[3] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[3]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[3]);
/* x44_[4] */ /* x44_translationMaxSpeed[4] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[4]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[4]);
/* x44_[5] */ /* x44_translationMaxSpeed[5] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[5]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[5]);
/* x44_[6] */ /* x44_translationMaxSpeed[6] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[6]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[6]);
/* x44_[7] */ /* x44_translationMaxSpeed[7] */
__dna_docout.writeFloat("x44_", x44_translationMaxSpeed[7]); __dna_docout.writeFloat("x44_translationMaxSpeed", x44_translationMaxSpeed[7]);
} }
/* x64_ */ /* x64_ */
__dna_docout.writeFloat("x64_", x64_); __dna_docout.writeFloat("x64_", x64_);
@ -775,8 +775,8 @@ void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const
/* xc4_[7] */ /* xc4_[7] */
__dna_docout.writeFloat("xc4_", xc4_[7]); __dna_docout.writeFloat("xc4_", xc4_[7]);
} }
/* xe4_ */ /* xe4_spiderBallRollSpeed */
__dna_docout.writeFloat("xe4_", xe4_); __dna_docout.writeFloat("xe4_spiderBallRollSpeed", xe4_spiderBallRollSpeed);
/* xe8_ */ /* xe8_ */
__dna_docout.writeFloat("xe8_", xe8_); __dna_docout.writeFloat("xe8_", xe8_);
/* x14c_ */ /* x14c_ */
@ -887,20 +887,20 @@ void CTweakBall::write(athena::io::YAMLDocWriter& __dna_docout) const
__dna_docout.writeFloat("x1c8_", x1c8_); __dna_docout.writeFloat("x1c8_", x1c8_);
/* x1cc_ */ /* x1cc_ */
__dna_docout.writeFloat("x1cc_", x1cc_); __dna_docout.writeFloat("x1cc_", x1cc_);
/* x1d0_ */ /* x1d0_ballCameraControlDistance */
__dna_docout.writeFloat("x1d0_", x1d0_ballCameraControlDistance); __dna_docout.writeFloat("x1d0_ballCameraControlDistance", x1d0_ballCameraControlDistance);
/* x1d4_ */ /* x1d4_ */
__dna_docout.writeFloat("x1d4_", x1d4_); __dna_docout.writeFloat("x1d4_", x1d4_);
/* x1d8_ */ /* x1d8_ */
__dna_docout.writeFloat("x1d8_", x1d8_); __dna_docout.writeFloat("x1d8_", x1d8_);
/* x1e4_ */ /* x1e4_leftStickDivisor */
__dna_docout.writeFloat("x1e4_", x1e4_leftStickDivisor); __dna_docout.writeFloat("x1e4_leftStickDivisor", x1e4_leftStickDivisor);
/* x1e8_ */ /* x1e8_rightStickDivisor */
__dna_docout.writeFloat("x1e8_", x1e8_rightStickDivisor); __dna_docout.writeFloat("x1e8_rightStickDivisor", x1e8_rightStickDivisor);
/* x200_ */ /* x200_ */
__dna_docout.writeFloat("x200_", x200_); __dna_docout.writeFloat("x200_", x200_);
/* x204_ */ /* x204_ballTouchRadius */
__dna_docout.writeFloat("x204_", x204_); __dna_docout.writeFloat("x204_ballTouchRadius", x204_ballTouchRadius);
/* x20c_ */ /* x20c_ */
__dna_docout.writeFloat("x20c_", x20c_); __dna_docout.writeFloat("x20c_", x20c_);
/* x218_ */ /* x218_ */

View File

@ -38,7 +38,7 @@ struct CTweakBall final : public ITweakBall
Value<float> xbc_; Value<float> xbc_;
Value<float> xc0_; Value<float> xc0_;
Value<float> xc4_[8]; Value<float> xc4_[8];
Value<float> xe4_; Value<float> xe4_spiderBallRollSpeed;
Value<float> xe8_; Value<float> xe8_;
float xec_ = 10000.f; float xec_ = 10000.f;
float xf0_ = 1000.f; float xf0_ = 1000.f;
@ -106,7 +106,7 @@ struct CTweakBall final : public ITweakBall
Value<float> x1e4_leftStickDivisor; Value<float> x1e4_leftStickDivisor;
Value<float> x1e8_rightStickDivisor; Value<float> x1e8_rightStickDivisor;
Value<float> x200_; Value<float> x200_;
Value<float> x204_; Value<float> x204_ballTouchRadius;
float x208_; float x208_;
Value<float> x20c_; Value<float> x20c_;
Value<float> x218_; Value<float> x218_;
@ -140,9 +140,11 @@ struct CTweakBall final : public ITweakBall
float GetMaxBallTranslationAcceleration(int s) const { return x4_maxTranslationAcceleration[s]; } float GetMaxBallTranslationAcceleration(int s) const { return x4_maxTranslationAcceleration[s]; }
float GetBallTranslationFriction(int s) const { return x24_translationFriction[s]; } float GetBallTranslationFriction(int s) const { return x24_translationFriction[s]; }
float GetBallTranslationMaxSpeed(int s) const { return x44_translationMaxSpeed[s]; } float GetBallTranslationMaxSpeed(int s) const { return x44_translationMaxSpeed[s]; }
float GetSpiderBallRollSpeed() const { return xe4_spiderBallRollSpeed; }
float GetBallCameraControlDistance() const { return x1d0_ballCameraControlDistance; } float GetBallCameraControlDistance() const { return x1d0_ballCameraControlDistance; }
float GetLeftStickDivisor() const { return x1e4_leftStickDivisor; } float GetLeftStickDivisor() const { return x1e4_leftStickDivisor; }
float GetRightStickDivisor() const { return x1e8_rightStickDivisor; } float GetRightStickDivisor() const { return x1e8_rightStickDivisor; }
float GetBallTouchRadius() const { return x204_ballTouchRadius; }
}; };
} }
} }

View File

@ -391,8 +391,7 @@ void CParticleDatabase::AddAuxiliaryParticleEffect(const std::string& name, int
auto search = x0_particleDescs.find(data.GetTag().id); auto search = x0_particleDescs.find(data.GetTag().id);
if (search != x0_particleDescs.end()) if (search != x0_particleDescs.end())
{ {
auto sys = std::make_shared<CElementGen>(*search->second, CElementGen::EModelOrientationType::Normal, auto sys = std::make_shared<CElementGen>(*search->second);
CElementGen::EOptionalSystemFlags::One);
newGen = std::make_unique<CParticleGenInfoGeneric>(data.GetTag(), sys, data.GetDuration(), "NOT_A_VALID_LOCATOR", newGen = std::make_unique<CParticleGenInfoGeneric>(data.GetTag(), sys, data.GetDuration(), "NOT_A_VALID_LOCATOR",
scaleVec, CParticleData::EParentedMode::Initial, flags, mgr, aid, scaleVec, CParticleData::EParentedMode::Initial, flags, mgr, aid,
lightId + _getGraphicLightId(sys, *search->second), 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); auto search = x0_particleDescs.find(data.GetTag().id);
if (search != x0_particleDescs.end()) if (search != x0_particleDescs.end())
{ {
auto sys = std::make_shared<CElementGen>(*search->second, CElementGen::EModelOrientationType::Normal, auto sys = std::make_shared<CElementGen>(*search->second);
CElementGen::EOptionalSystemFlags::One);
newGen = std::make_unique<CParticleGenInfoGeneric>(data.GetTag(), sys, data.GetDuration(), data.GetSegmentName(), newGen = std::make_unique<CParticleGenInfoGeneric>(data.GetTag(), sys, data.GetDuration(), data.GetSegmentName(),
scaleVec, data.GetParentedMode(), flags, mgr, aid, scaleVec, data.GetParentedMode(), flags, mgr, aid,
lightId + _getGraphicLightId(sys, *search->second), lightId + _getGraphicLightId(sys, *search->second),

View File

@ -168,9 +168,7 @@ CSamusDoll::CSamusDoll(const CDependencyGroup& suitDgrp, const CDependencyGroup&
x20c_invGrappleBeam = g_SimplePool->GetObj("CMDL_InvGrappleBeam"); x20c_invGrappleBeam = g_SimplePool->GetObj("CMDL_InvGrappleBeam");
x218_invFins = g_SimplePool->GetObj(FinModels[int(suit)]); x218_invFins = g_SimplePool->GetObj(FinModels[int(suit)]);
x224_ballInnerGlow = g_SimplePool->GetObj("BallInnerGlow"); x224_ballInnerGlow = g_SimplePool->GetObj("BallInnerGlow");
x22c_ballInnerGlowGen = std::make_unique<CElementGen>(x224_ballInnerGlow, x22c_ballInnerGlowGen = std::make_unique<CElementGen>(x224_ballInnerGlow);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x230_ballTransitionFlash = g_SimplePool->GetObj("MorphBallTransitionFlash"); x230_ballTransitionFlash = g_SimplePool->GetObj("MorphBallTransitionFlash");
x23c_lights.push_back(CLight::BuildDirectional(zeus::CVector3f::skForward, zeus::CColor::skWhite)); x23c_lights.push_back(CLight::BuildDirectional(zeus::CVector3f::skForward, zeus::CColor::skWhite));
x24c_actorLights = std::make_unique<CActorLights>(8, zeus::CVector3f::skZero, 4, 4, false, false, false, 0.1f); x24c_actorLights = std::make_unique<CActorLights>(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 && oldRemTransTime >= x50_totalTransitionTime - 0.5f &&
x54_remTransitionTime < x50_totalTransitionTime - 0.5f) x54_remTransitionTime < x50_totalTransitionTime - 0.5f)
{ {
x238_ballTransitionFlashGen = std::make_unique<CElementGen>(x230_ballTransitionFlash, x238_ballTransitionFlashGen = std::make_unique<CElementGen>(x230_ballTransitionFlash);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x238_ballTransitionFlashGen->SetGlobalScale(zeus::CVector3f(0.625f)); x238_ballTransitionFlashGen->SetGlobalScale(zeus::CVector3f(0.625f));
} }

View File

@ -157,7 +157,9 @@ private:
void AccumulateBounds(zeus::CVector3f& pos, float size); void AccumulateBounds(zeus::CVector3f& pos, float size);
public: public:
CElementGen(const TToken<CGenDescription>& gen, EModelOrientationType orientType, EOptionalSystemFlags flags); CElementGen(const TToken<CGenDescription>& gen,
EModelOrientationType orientType = EModelOrientationType::Normal,
EOptionalSystemFlags flags = EOptionalSystemFlags::One);
~CElementGen(); ~CElementGen();
boo::GraphicsDataToken m_gfxToken; boo::GraphicsDataToken m_gfxToken;

View File

@ -57,9 +57,7 @@ CParticleElectric::CParticleElectric(const TToken<CElectricDescription>& token)
x400_gpsmGenerators.reserve(x154_SCNT); x400_gpsmGenerators.reserve(x154_SCNT);
for (int i=0 ; i<x154_SCNT ; ++i) for (int i=0 ; i<x154_SCNT ; ++i)
{ {
x400_gpsmGenerators.emplace_back(new CElementGen(desc->x50_GPSM.m_token, x400_gpsmGenerators.emplace_back(new CElementGen(desc->x50_GPSM.m_token));
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One));
x400_gpsmGenerators.back()->SetParticleEmission(false); x400_gpsmGenerators.back()->SetParticleEmission(false);
} }
} }
@ -70,9 +68,7 @@ CParticleElectric::CParticleElectric(const TToken<CElectricDescription>& token)
x410_epsmGenerators.reserve(x154_SCNT); x410_epsmGenerators.reserve(x154_SCNT);
for (int i=0 ; i<x154_SCNT ; ++i) for (int i=0 ; i<x154_SCNT ; ++i)
{ {
x410_epsmGenerators.emplace_back(new CElementGen(desc->x60_EPSM.m_token, x410_epsmGenerators.emplace_back(new CElementGen(desc->x60_EPSM.m_token));
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One));
x410_epsmGenerators.back()->SetParticleEmission(false); x410_epsmGenerators.back()->SetParticleEmission(false);
} }
} }

View File

@ -253,9 +253,7 @@ void CAuxWeapon::CreateFlameThrower(const zeus::CTransform& xf, CStateManager& m
mgr.AddObject(ft); mgr.AddObject(ft);
ft->Think(dt, mgr); ft->Think(dt, mgr);
ft->StartFiring(xf, mgr); ft->StartFiring(xf, mgr);
x24_muzzleFxGen = std::make_unique<CElementGen>(xc_flameMuzzle, x24_muzzleFxGen = std::make_unique<CElementGen>(xc_flameMuzzle);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x7c_comboSfx = NWeaponTypes::play_sfx(1842, false, true, 0.165f); x7c_comboSfx = NWeaponTypes::play_sfx(1842, false, true, 0.165f);
mgr.GetCameraManager()->AddCameraShaker(skHardShake, false); mgr.GetCameraManager()->AddCameraShaker(skHardShake, false);
mgr.GetPlayerState()->SetFiringComboBeam(true); mgr.GetPlayerState()->SetFiringComboBeam(true);
@ -286,9 +284,7 @@ void CAuxWeapon::CreateWaveBusterBeam(CWeapon::EProjectileAttrib attribs, TUniqu
CGunWeapon::GetShotDamageInfo(g_tweakPlayerGun->GetComboShotInfo(2), mgr), x70_waveBusterId, CGunWeapon::GetShotDamageInfo(g_tweakPlayerGun->GetComboShotInfo(2), mgr), x70_waveBusterId,
kInvalidAreaId, x6c_playerId, homingTarget, attribs); kInvalidAreaId, x6c_playerId, homingTarget, attribs);
mgr.AddObject(wb); mgr.AddObject(wb);
x24_muzzleFxGen = std::make_unique<CElementGen>(x18_busterMuzzle, x24_muzzleFxGen = std::make_unique<CElementGen>(x18_busterMuzzle);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x7c_comboSfx = NWeaponTypes::play_sfx(1847, false, true, 0.165f); x7c_comboSfx = NWeaponTypes::play_sfx(1847, false, true, 0.165f);
mgr.GetCameraManager()->AddCameraShaker(CCameraShakeData::skChargedShotCameraShakeData, false); mgr.GetCameraManager()->AddCameraShaker(CCameraShakeData::skChargedShotCameraShakeData, false);
mgr.GetPlayerState()->SetFiringComboBeam(true); mgr.GetPlayerState()->SetFiringComboBeam(true);

View File

@ -16,8 +16,7 @@ CFlameThrower::CFlameThrower(const TToken<CWeaponDescription>& wDesc, const std:
zeus::CVector3f(1.f), {}, -1, false) zeus::CVector3f(1.f), {}, -1, false)
, x2e8_(xf) , x2e8_(xf)
, x33c_flameDesc(g_SimplePool->GetObj({FOURCC('PART'), flameInfo.GetFlameFxId()})) , x33c_flameDesc(g_SimplePool->GetObj({FOURCC('PART'), flameInfo.GetFlameFxId()}))
, x348_flameGen(new CElementGen(x33c_flameDesc, CElementGen::EModelOrientationType::Normal, , x348_flameGen(new CElementGen(x33c_flameDesc))
CElementGen::EOptionalSystemFlags::One))
{ {
} }

View File

@ -29,18 +29,10 @@ CGrappleArm::CGrappleArm(const zeus::CVector3f& scale)
x36c_grappleHitDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xbc_grappleHit})), x36c_grappleHitDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xbc_grappleHit})),
x378_grappleMuzzleDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc0_grappleMuzzle})), x378_grappleMuzzleDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc0_grappleMuzzle})),
x384_grappleSwooshDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc4_grappleSwoosh})), x384_grappleSwooshDesc(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->xc4_grappleSwoosh})),
x390_grappleSegmentGen(std::make_unique<CElementGen>(x354_grappleSegmentDesc, x390_grappleSegmentGen(std::make_unique<CElementGen>(x354_grappleSegmentDesc)),
CElementGen::EModelOrientationType::Normal, x394_grappleClawGen(std::make_unique<CElementGen>(x360_grappleClawDesc)),
CElementGen::EOptionalSystemFlags::One)), x398_grappleHitGen(std::make_unique<CElementGen>(x36c_grappleHitDesc)),
x394_grappleClawGen(std::make_unique<CElementGen>(x360_grappleClawDesc, x39c_grappleMuzzleGen(std::make_unique<CElementGen>(x378_grappleMuzzleDesc)),
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One)),
x398_grappleHitGen(std::make_unique<CElementGen>(x36c_grappleHitDesc,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One)),
x39c_grappleMuzzleGen(std::make_unique<CElementGen>(x378_grappleMuzzleDesc,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One)),
x3a0_grappleSwooshGen(std::make_unique<CParticleSwoosh>(x384_grappleSwooshDesc, 0)), x3a0_grappleSwooshGen(std::make_unique<CParticleSwoosh>(x384_grappleSwooshDesc, 0)),
x3a4_rainSplashGenerator(std::make_unique<CRainSplashGenerator>(scale, 20, 2, 0.f, 0.125f)) x3a4_rainSplashGenerator(std::make_unique<CRainSplashGenerator>(scale, 20, 2, 0.f, 0.125f))
{ {
@ -280,12 +272,8 @@ void CGrappleArm::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node,
case EUserEventType::Projectile: case EUserEventType::Projectile:
if (x3b2_27_armMoving) if (x3b2_27_armMoving)
return; return;
x398_grappleHitGen = std::make_unique<CElementGen>(x36c_grappleHitDesc, x398_grappleHitGen = std::make_unique<CElementGen>(x36c_grappleHitDesc);
CElementGen::EModelOrientationType::Normal, x39c_grappleMuzzleGen = std::make_unique<CElementGen>(x378_grappleMuzzleDesc);
CElementGen::EOptionalSystemFlags::One);
x39c_grappleMuzzleGen = std::make_unique<CElementGen>(x378_grappleMuzzleDesc,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x338_beamT = 0.f; x338_beamT = 0.f;
x33c_beamDist = 0.f; x33c_beamDist = 0.f;
x340_anglePhase = 0.f; x340_anglePhase = 0.f;

View File

@ -270,17 +270,13 @@ void CGunWeapon::EnableFrozenEffect(EFrozenFxType type)
case EFrozenFxType::Thawed: case EFrozenFxType::Thawed:
if (x204_frozenEffect == EFrozenFxType::Thawed) if (x204_frozenEffect == EFrozenFxType::Thawed)
break; break;
x1b8_frozenGenerator = std::make_unique<CElementGen>(x188_frozenEffects[1], x1b8_frozenGenerator = std::make_unique<CElementGen>(x188_frozenEffects[1]);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x1b8_frozenGenerator->SetGlobalScale(x4_scale); x1b8_frozenGenerator->SetGlobalScale(x4_scale);
break; break;
case EFrozenFxType::Frozen: case EFrozenFxType::Frozen:
if (x204_frozenEffect == EFrozenFxType::Frozen) if (x204_frozenEffect == EFrozenFxType::Frozen)
break; break;
x1b8_frozenGenerator = std::make_unique<CElementGen>(x188_frozenEffects[0], x1b8_frozenGenerator = std::make_unique<CElementGen>(x188_frozenEffects[0]);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x1b8_frozenGenerator->SetGlobalScale(x4_scale); x1b8_frozenGenerator->SetGlobalScale(x4_scale);
break; break;
default: default:
@ -296,9 +292,7 @@ void CGunWeapon::ActivateCharge(bool enable, bool resetEffect)
if (enable || resetEffect) if (enable || resetEffect)
{ {
x1a4_muzzleGenerators[x208_muzzleEffectIdx] = x1a4_muzzleGenerators[x208_muzzleEffectIdx] =
std::make_unique<CElementGen>(x16c_muzzleEffects[x208_muzzleEffectIdx], std::make_unique<CElementGen>(x16c_muzzleEffects[x208_muzzleEffectIdx]);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
} }
@ -434,8 +428,7 @@ void CGunWeapon::LoadMuzzleFx(float dt)
{ {
for (int i=0 ; i<2 ; ++i) for (int i=0 ; i<2 ; ++i)
{ {
x1a4_muzzleGenerators.push_back(std::make_unique<CElementGen>(x16c_muzzleEffects[i], x1a4_muzzleGenerators.push_back(std::make_unique<CElementGen>(x16c_muzzleEffects[i]));
CElementGen::EModelOrientationType::Normal, CElementGen::EOptionalSystemFlags::One));
x1a4_muzzleGenerators.back()->SetParticleEmission(false); x1a4_muzzleGenerators.back()->SetParticleEmission(false);
x1a4_muzzleGenerators.back()->Update(dt); x1a4_muzzleGenerators.back()->Update(dt);
} }

View File

@ -101,16 +101,14 @@ void CIceBeam::EnableSecondaryFx(ESecondaryFxType type)
case ESecondaryFxType::CancelCharge: case ESecondaryFxType::CancelCharge:
if (!x248_25_inEndFx) if (!x248_25_inEndFx)
{ {
x244_chargeFx = std::make_unique<CElementGen>(x234_ice2nd2, CElementGen::EModelOrientationType::Normal, x244_chargeFx = std::make_unique<CElementGen>(x234_ice2nd2);
CElementGen::EOptionalSystemFlags::One);
x244_chargeFx->SetGlobalScale(x4_scale); x244_chargeFx->SetGlobalScale(x4_scale);
x248_25_inEndFx = true; x248_25_inEndFx = true;
x1cc_enabledSecondaryEffect = ESecondaryFxType::CancelCharge; x1cc_enabledSecondaryEffect = ESecondaryFxType::CancelCharge;
} }
break; break;
case ESecondaryFxType::Charge: case ESecondaryFxType::Charge:
x244_chargeFx = std::make_unique<CElementGen>(x228_ice2nd1, CElementGen::EModelOrientationType::Normal, x244_chargeFx = std::make_unique<CElementGen>(x228_ice2nd1);
CElementGen::EOptionalSystemFlags::One);
x244_chargeFx->SetGlobalScale(x4_scale); x244_chargeFx->SetGlobalScale(x4_scale);
x248_25_inEndFx = false; x248_25_inEndFx = false;
x1cc_enabledSecondaryEffect = type; 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(); x248_24_loaded = x21c_iceSmoke.IsLoaded() && x228_ice2nd1.IsLoaded() && x234_ice2nd2.IsLoaded();
if (x248_24_loaded) if (x248_24_loaded)
{ {
x240_smokeGen = std::make_unique<CElementGen>(x21c_iceSmoke, CElementGen::EModelOrientationType::Normal, x240_smokeGen = std::make_unique<CElementGen>(x21c_iceSmoke);
CElementGen::EOptionalSystemFlags::One);
x240_smokeGen->SetGlobalScale(x4_scale); x240_smokeGen->SetGlobalScale(x4_scale);
x240_smokeGen->SetParticleEmission(false); x240_smokeGen->SetParticleEmission(false);
} }

View File

@ -60,21 +60,11 @@ void CNewFlameThrower::CreateLightObjects(CStateManager& mgr)
void CNewFlameThrower::EnableFx(CStateManager& mgr) void CNewFlameThrower::EnableFx(CStateManager& mgr)
{ {
DeleteProjectileLight(mgr); DeleteProjectileLight(mgr);
x358_mainFireGen = std::make_unique<CElementGen>(x304_mainFire, x358_mainFireGen = std::make_unique<CElementGen>(x304_mainFire);
CElementGen::EModelOrientationType::Normal, x35c_mainSmokeGen = std::make_unique<CElementGen>(x310_mainSmoke);
CElementGen::EOptionalSystemFlags::One); x360_secondarySmokeGen = std::make_unique<CElementGen>(x31c_secondarySmoke);
x35c_mainSmokeGen = std::make_unique<CElementGen>(x310_mainSmoke, x364_secondaryFireGen = std::make_unique<CElementGen>(x328_secondaryFire);
CElementGen::EModelOrientationType::Normal, x368_secondarySparksGen = std::make_unique<CElementGen>(x334_secondarySparks);
CElementGen::EOptionalSystemFlags::One);
x360_secondarySmokeGen = std::make_unique<CElementGen>(x31c_secondarySmoke,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x364_secondaryFireGen = std::make_unique<CElementGen>(x328_secondaryFire,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x368_secondarySparksGen = std::make_unique<CElementGen>(x334_secondarySparks,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x36c_swooshCenterGen = std::make_unique<CParticleSwoosh>(x340_swooshCenter, 0); x36c_swooshCenterGen = std::make_unique<CParticleSwoosh>(x340_swooshCenter, 0);
x36c_swooshCenterGen->SetRenderGaps(true); x36c_swooshCenterGen->SetRenderGaps(true);
x370_swooshFireGen = std::make_unique<CParticleSwoosh>(x34c_swooshFire, 0); x370_swooshFireGen = std::make_unique<CParticleSwoosh>(x34c_swooshFire, 0);

View File

@ -50,8 +50,7 @@ void CPhazonBeam::UpdateBeam(float dt, const zeus::CTransform& targetXf,
void CPhazonBeam::CreateBeam(CStateManager& mgr) void CPhazonBeam::CreateBeam(CStateManager& mgr)
{ {
x234_chargeFxGen = std::make_unique<CElementGen>(x228_phazon2nd1, CElementGen::EModelOrientationType::Normal, x234_chargeFxGen = std::make_unique<CElementGen>(x228_phazon2nd1);
CElementGen::EOptionalSystemFlags::One);
if (x234_chargeFxGen) if (x234_chargeFxGen)
{ {
x234_chargeFxGen->SetGlobalScale(x4_scale); x234_chargeFxGen->SetGlobalScale(x4_scale);

View File

@ -109,8 +109,7 @@ void CPlasmaBeam::EnableSecondaryFx(ESecondaryFxType type)
x228_chargeFx->SetParticleEmission(false); x228_chargeFx->SetParticleEmission(false);
break; break;
case ESecondaryFxType::Charge: case ESecondaryFxType::Charge:
x228_chargeFx = std::make_unique<CElementGen>(x21c_plasma2nd1, CElementGen::EModelOrientationType::Normal, x228_chargeFx = std::make_unique<CElementGen>(x21c_plasma2nd1);
CElementGen::EOptionalSystemFlags::One);
x228_chargeFx->SetGlobalScale(x4_scale); x228_chargeFx->SetGlobalScale(x4_scale);
default: default:
break; break;

View File

@ -53,8 +53,7 @@ CPlayerGun::CPlayerGun(TUniqueId playerId)
x75c_phazonBeam = std::make_unique<CPhazonBeam>(g_tweakGunRes->x20_phazonBeam, EWeaponType::Phazon, x75c_phazonBeam = std::make_unique<CPhazonBeam>(g_tweakGunRes->x20_phazonBeam, EWeaponType::Phazon,
playerId, EMaterialTypes::Player, sGunScale); playerId, EMaterialTypes::Player, sGunScale);
x774_holoTransitionGen = std::make_unique<CElementGen>( x774_holoTransitionGen = std::make_unique<CElementGen>(
g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->x24_holoTransition}), g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->x24_holoTransition}));
CElementGen::EModelOrientationType::Normal, CElementGen::EOptionalSystemFlags::One);
x82c_shadow = std::make_unique<CWorldShadow>(32, 32, true); x82c_shadow = std::make_unique<CWorldShadow>(32, 32, true);
x832_31_inRestPose = true; x832_31_inRestPose = true;
@ -112,9 +111,7 @@ void CPlayerGun::InitMuzzleData()
{ {
x7c0_auxMuzzleEffects.push_back(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), x7c0_auxMuzzleEffects.push_back(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'),
g_tweakGunRes->xa4_auxMuzzle[i]})); g_tweakGunRes->xa4_auxMuzzle[i]}));
x800_auxMuzzleGenerators.emplace_back(new CElementGen(x7c0_auxMuzzleEffects.back(), x800_auxMuzzleGenerators.emplace_back(new CElementGen(x7c0_auxMuzzleEffects.back()));
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One));
x800_auxMuzzleGenerators.back()->SetParticleEmission(false); x800_auxMuzzleGenerators.back()->SetParticleEmission(false);
} }
} }
@ -1241,9 +1238,7 @@ void CPlayerGun::EnableChargeFx(EChargeState state, CStateManager& mgr)
x833_30_canShowAuxMuzzleEffect = true; x833_30_canShowAuxMuzzleEffect = true;
x800_auxMuzzleGenerators[int(x320_currentAuxBeam)] = x800_auxMuzzleGenerators[int(x320_currentAuxBeam)] =
std::make_unique<CElementGen>(x7c0_auxMuzzleEffects[int(x320_currentAuxBeam)], std::make_unique<CElementGen>(x7c0_auxMuzzleEffects[int(x320_currentAuxBeam)]);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x800_auxMuzzleGenerators[int(x320_currentAuxBeam)]->SetParticleEmission(true); x800_auxMuzzleGenerators[int(x320_currentAuxBeam)]->SetParticleEmission(true);
} }
@ -1584,8 +1579,7 @@ void CPlayerGun::ActivateCombo(CStateManager& mgr)
if (xferEffect.IsLoaded()) if (xferEffect.IsLoaded())
{ {
x77c_comboXferGen = x77c_comboXferGen =
std::make_unique<CElementGen>(xferEffect, CElementGen::EModelOrientationType::Normal, std::make_unique<CElementGen>(xferEffect);
CElementGen::EOptionalSystemFlags::One);
x77c_comboXferGen->SetGlobalScale(sGunScale); x77c_comboXferGen->SetGlobalScale(sGunScale);
} }
x72c_currentBeam->EnableCharge(true); x72c_currentBeam->EnableCharge(true);

View File

@ -99,9 +99,7 @@ void CPowerBeam::EnableSecondaryFx(ESecondaryFxType type)
x1cc_enabledSecondaryEffect = ESecondaryFxType::None; x1cc_enabledSecondaryEffect = ESecondaryFxType::None;
break; break;
case ESecondaryFxType::Charge: case ESecondaryFxType::Charge:
x238_power2ndGen = std::make_unique<CElementGen>(x228_power2nd1, x238_power2ndGen = std::make_unique<CElementGen>(x228_power2nd1);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x238_power2ndGen->SetGlobalScale(x4_scale); x238_power2ndGen->SetGlobalScale(x4_scale);
x1cc_enabledSecondaryEffect = type; x1cc_enabledSecondaryEffect = type;
break; break;
@ -120,9 +118,7 @@ void CPowerBeam::Update(float dt, CStateManager& mgr)
x244_25_loaded = x21c_shotSmoke.IsLoaded() && x228_power2nd1.IsLoaded(); x244_25_loaded = x21c_shotSmoke.IsLoaded() && x228_power2nd1.IsLoaded();
if (x244_25_loaded) if (x244_25_loaded)
{ {
x234_shotSmokeGen = std::make_unique<CElementGen>(x21c_shotSmoke, x234_shotSmokeGen = std::make_unique<CElementGen>(x21c_shotSmoke);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x234_shotSmokeGen->SetParticleEmission(false); x234_shotSmokeGen->SetParticleEmission(false);
} }
} }

View File

@ -128,8 +128,7 @@ void CWaveBeam::EnableSecondaryFx(ESecondaryFxType type)
} }
break; break;
case ESecondaryFxType::ToCombo: case ESecondaryFxType::ToCombo:
x254_chargeFx = std::make_unique<CElementGen>(x240_wave2nd3, CElementGen::EModelOrientationType::Normal, x254_chargeFx = std::make_unique<CElementGen>(x240_wave2nd3);
CElementGen::EOptionalSystemFlags::One);
x254_chargeFx->SetGlobalScale(x4_scale); x254_chargeFx->SetGlobalScale(x4_scale);
x24c_effectTimer = 0.f; x24c_effectTimer = 0.f;
x258_25_effectTimerActive = true; x258_25_effectTimerActive = true;

View File

@ -23,12 +23,8 @@ CWaveBuster::CWaveBuster(const TToken<CWeaponDescription>& desc, EWeaponType typ
x378_busterLight.GetObj(); x378_busterLight.GetObj();
x384_busterSwoosh1Gen = std::make_unique<CParticleSwoosh>(x354_busterSwoosh1, 0); x384_busterSwoosh1Gen = std::make_unique<CParticleSwoosh>(x354_busterSwoosh1, 0);
x388_busterSwoosh2Gen = std::make_unique<CParticleSwoosh>(x360_busterSwoosh2, 0); x388_busterSwoosh2Gen = std::make_unique<CParticleSwoosh>(x360_busterSwoosh2, 0);
x38c_busterSparksGen = std::make_unique<CElementGen>(x36c_busterSparks, x38c_busterSparksGen = std::make_unique<CElementGen>(x36c_busterSparks);
CElementGen::EModelOrientationType::Normal, x390_busterLightGen = std::make_unique<CElementGen>(x378_busterLight);
CElementGen::EOptionalSystemFlags::One);
x390_busterLightGen = std::make_unique<CElementGen>(x378_busterLight,
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
x3d0_24_firing = true; x3d0_24_firing = true;
x3d0_25_ = true; x3d0_25_ = true;
x3d0_26_ = false; x3d0_26_ = false;

View File

@ -153,37 +153,27 @@ void CActorModelParticles::LoadParticleDGRPs()
std::unique_ptr<CElementGen> CActorModelParticles::MakeOnFireGen() const std::unique_ptr<CElementGen> CActorModelParticles::MakeOnFireGen() const
{ {
return std::make_unique<CElementGen>(x18_onFire, return std::make_unique<CElementGen>(x18_onFire);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
std::unique_ptr<CElementGen> CActorModelParticles::MakeAshGen() const std::unique_ptr<CElementGen> CActorModelParticles::MakeAshGen() const
{ {
return std::make_unique<CElementGen>(x20_ash, return std::make_unique<CElementGen>(x20_ash);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
std::unique_ptr<CElementGen> CActorModelParticles::MakeIceGen() const std::unique_ptr<CElementGen> CActorModelParticles::MakeIceGen() const
{ {
return std::make_unique<CElementGen>(x28_iceBreak, return std::make_unique<CElementGen>(x28_iceBreak);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
std::unique_ptr<CElementGen> CActorModelParticles::MakeFirePopGen() const std::unique_ptr<CElementGen> CActorModelParticles::MakeFirePopGen() const
{ {
return std::make_unique<CElementGen>(x30_firePop, return std::make_unique<CElementGen>(x30_firePop);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
std::unique_ptr<CElementGen> CActorModelParticles::MakeIcePopGen() const std::unique_ptr<CElementGen> CActorModelParticles::MakeIcePopGen() const
{ {
return std::make_unique<CElementGen>(x38_icePop, return std::make_unique<CElementGen>(x38_icePop);
CElementGen::EModelOrientationType::Normal,
CElementGen::EOptionalSystemFlags::One);
} }
std::unique_ptr<CParticleElectric> CActorModelParticles::MakeElectricGen() const std::unique_ptr<CParticleElectric> CActorModelParticles::MakeElectricGen() const

View File

@ -26,8 +26,7 @@ CHUDBillboardEffect::CHUDBillboardEffect(const std::experimental::optional<TToke
if (particle) if (particle)
{ {
xe8_generator = std::make_unique<CElementGen>(*particle, CElementGen::EModelOrientationType::Normal, xe8_generator = std::make_unique<CElementGen>(*particle);
CElementGen::EOptionalSystemFlags::One);
if (static_cast<CElementGen&>(*xe8_generator).IsIndirectTextured()) if (static_cast<CElementGen&>(*xe8_generator).IsIndirectTextured())
++g_IndirectTexturedBillboardCount; ++g_IndirectTexturedBillboardCount;
} }

View File

@ -1,20 +1,181 @@
#include "GameGlobalObjects.hpp"
#include "CDependencyGroup.hpp"
#include "CMorphBall.hpp" #include "CMorphBall.hpp"
#include "CPlayer.hpp" #include "CPlayer.hpp"
#include "CMorphBallShadow.hpp" #include "CMorphBallShadow.hpp"
#include "Particle/CGenDescription.hpp" #include "CSimplePool.hpp"
#include "CGameLight.hpp"
namespace urde namespace urde
{ {
CMorphBall::CMorphBall(CPlayer& player, float) static float kSpiderBallCollisionRadius;
: x0_player(player)
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<CParticleSwoosh>(x1968_slowBlueTailSwoosh, 0);
x19bc_slowBlueTailSwooshGen2 = std::make_unique<CParticleSwoosh>(x1968_slowBlueTailSwoosh, 0);
x19c0_slowBlueTailSwoosh2Gen = std::make_unique<CParticleSwoosh>(x1970_slowBlueTailSwoosh2, 0);
x19c4_slowBlueTailSwoosh2Gen2 = std::make_unique<CParticleSwoosh>(x1970_slowBlueTailSwoosh2, 0);
x19c8_jaggyTrailGen = std::make_unique<CParticleSwoosh>(x1978_jaggyTrail, 0);
x19cc_wallSparkGen = std::make_unique<CElementGen>(x1980_wallSpark);
x19d0_ballInnerGlowGen = std::make_unique<CElementGen>(x1988_ballInnerGlow);
x19d4_spiderBallMagnetEffectGen = std::make_unique<CElementGen>(x1990_spiderBallMagnetEffect);
x19d8_boostBallGlowGen = std::make_unique<CElementGen>(x1998_boostBallGlow);
x1c14_worldShadow = std::make_unique<CWorldShadow>(16, 16, false);
x1c18_actorLights = std::make_unique<CActorLights>(8, zeus::CVector3f::skZero, 4, 4, false, false, false, 0.1f);
x1c1c_rainSplashGen = std::make_unique<CRainSplashGenerator>(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<CParticleSwoosh>(x19a0_spiderElectric, 0), false);
LoadAnimationTokens("SamusBallANCS");
InitializeWakeEffects();
}
void CMorphBall::LoadAnimationTokens(const std::string& ancsName)
{
TToken<CDependencyGroup> 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<CGenDescription> nullParticle =
CToken(TObjOwnerDerivedFromIObj<CGenDescription>::GetNewDerivedObject(std::make_unique<CGenDescription>()));
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<CElementGen>(x1b84_wakeEffects[2]);
x1bc8_wakeEffectGens[0] = std::make_unique<CElementGen>(x1b84_wakeEffects[0]);
x1bc8_wakeEffectGens[1] = std::make_unique<CElementGen>(x1b84_wakeEffects[1]);
x1bc8_wakeEffectGens[3] = std::make_unique<CElementGen>(x1b84_wakeEffects[3]);
x1bc8_wakeEffectGens[4] = std::make_unique<CElementGen>(x1b84_wakeEffects[4]);
x1bc8_wakeEffectGens[5] = std::make_unique<CElementGen>(x1b84_wakeEffects[5]);
x1bc8_wakeEffectGens[6] = std::make_unique<CElementGen>(x1b84_wakeEffects[6]);
x1bc8_wakeEffectGens[7] = std::make_unique<CElementGen>(x1b84_wakeEffects[7]);
}
std::unique_ptr<CModelData> CMorphBall::GetMorphBallModel(const char* name, float radius)
{
const SObjectTag* tag = g_ResFactory->GetResourceIdByName(name);
if (tag->type == FOURCC('CMDL'))
return std::make_unique<CModelData>(CStaticRes(tag->id, zeus::CVector3f(radius * 2.f)));
else
return std::make_unique<CModelData>(CAnimRes(tag->id, 0, zeus::CVector3f(radius * 2.f), 0, false));
} }
void CMorphBall::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) 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<uintptr_t>(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) void CMorphBall::DrawBallShadow(const CStateManager& mgr)
{ {
@ -31,10 +192,12 @@ void CMorphBall::DrawBallShadow(const CStateManager& mgr)
if (x0_player.x578_morphDuration != 0.f) if (x0_player.x578_morphDuration != 0.f)
alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f); alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f);
alpha = 1.f - alpha; alpha = 1.f - alpha;
break;
case CPlayer::EPlayerMorphBallState::Morphing: case CPlayer::EPlayerMorphBallState::Morphing:
alpha = 0.f; alpha = 0.f;
if (x0_player.x578_morphDuration != 0.f) if (x0_player.x578_morphDuration != 0.f)
alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f); alpha = zeus::clamp(0.f, x0_player.x574_morphTime / x0_player.x578_morphDuration, 1.f);
break;
default: break; default: break;
} }
x1e50_shadow->Render(mgr, alpha); x1e50_shadow->Render(mgr, alpha);
@ -42,15 +205,581 @@ void CMorphBall::DrawBallShadow(const CStateManager& mgr)
void CMorphBall::DeleteBallShadow() void CMorphBall::DeleteBallShadow()
{ {
x1e50_shadow.reset();
} }
void CMorphBall::CreateBallShadow() void CMorphBall::CreateBallShadow()
{ {
x1e50_shadow = std::make_unique<CMorphBallShadow>();
} }
void CMorphBall::RenderToShadowTex(CStateManager& mgr) 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()
{ {
} }

View File

@ -6,6 +6,12 @@
#include "zeus/CVector3f.hpp" #include "zeus/CVector3f.hpp"
#include "Collision/CCollidableSphere.hpp" #include "Collision/CCollidableSphere.hpp"
#include "RetroTypes.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 namespace urde
{ {
@ -15,7 +21,6 @@ class CDamageInfo;
class CFinalInput; class CFinalInput;
class CScriptWater; class CScriptWater;
class CStateManager; class CStateManager;
class CMorphBallShadow;
class CMorphBall class CMorphBall
{ {
@ -27,7 +32,8 @@ public:
enum class ESpiderBallState enum class ESpiderBallState
{ {
Zero Inactive,
Active
}; };
enum class EBombJumpState enum class EBombJumpState
@ -37,6 +43,15 @@ public:
}; };
private: private:
CPlayer& x0_player; 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<CModelData> x58_ballModel; std::unique_ptr<CModelData> x58_ballModel;
u32 x5c_ballModelShader = 0; u32 x5c_ballModelShader = 0;
std::unique_ptr<CModelData> x60_spiderBallGlassModel; std::unique_ptr<CModelData> x60_spiderBallGlassModel;
@ -45,138 +60,219 @@ private:
u32 x6c_lowPolyBallModelShader = 0; u32 x6c_lowPolyBallModelShader = 0;
std::unique_ptr<CModelData> x70_frozenBallModel; std::unique_ptr<CModelData> x70_frozenBallModel;
u32 x74_frozenBallModelShader = 0; 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 x1914_ = 0.f;
float x1918_ = 0.f; float x1918_ = 0.f;
float x191c_damageTimer = 0.f; float x191c_damageTimer = 0.f;
bool x1920_ = false; bool x1920_ = false;
zeus::CTransform x1924_; zeus::CTransform x1924_;
bool x1954_isProjectile = false; bool x1954_isProjectile = false;
u32 x195c_ = false; std::vector<CToken> x1958_animationTokens;
u32 x1960_ = false; TToken<CSwooshDescription> x1968_slowBlueTailSwoosh;
u32 x1964_ = false; TToken<CSwooshDescription> x1970_slowBlueTailSwoosh2;
u32 x19dc_ = false; TToken<CSwooshDescription> x1978_jaggyTrail;
union TToken<CGenDescription> x1980_wallSpark;
{ TToken<CGenDescription> x1988_ballInnerGlow;
struct TToken<CGenDescription> x1990_spiderBallMagnetEffect;
{ TToken<CGenDescription> x1998_boostBallGlow;
TToken<CSwooshDescription> x19a0_spiderElectric;
TToken<CGenDescription> x19a8_morphBallTransitionFlash;
TToken<CGenDescription> x19b0_effect_morphBallIceBreak;
std::unique_ptr<CParticleSwoosh> x19b8_slowBlueTailSwooshGen;
std::unique_ptr<CParticleSwoosh> x19bc_slowBlueTailSwooshGen2;
std::unique_ptr<CParticleSwoosh> x19c0_slowBlueTailSwoosh2Gen;
std::unique_ptr<CParticleSwoosh> x19c4_slowBlueTailSwoosh2Gen2;
std::unique_ptr<CParticleSwoosh> x19c8_jaggyTrailGen;
std::unique_ptr<CElementGen> x19cc_wallSparkGen;
std::unique_ptr<CElementGen> x19d0_ballInnerGlowGen;
std::unique_ptr<CElementGen> x19d4_spiderBallMagnetEffectGen;
std::unique_ptr<CElementGen> x19d8_boostBallGlowGen;
u32 x19dc_ = 0;
u32 x19e0_ = 0;
rstl::reserved_vector<std::pair<std::unique_ptr<CParticleSwoosh>, bool>, 32> x19e4_spiderElectricGens;
std::list<u32> x1b6c_;
CRandom16 x1b80_rand = {99};
rstl::reserved_vector<TToken<CGenDescription>, 8> x1b84_wakeEffects;
rstl::reserved_vector<std::unique_ptr<CElementGen>, 8> x1bc8_wakeEffectGens;
std::unique_ptr<CElementGen> x1bcc_[8];
s32 x1c0c_wakeEffectIdx = -1;
TUniqueId x1c10_ballInnerGlowLight = kInvalidUniqueId;
std::unique_ptr<CWorldShadow> x1c14_worldShadow;
std::unique_ptr<CActorLights> x1c18_actorLights;
std::unique_ptr<CRainSplashGenerator> 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<zeus::CQuaternion, 5> x1c3c_quats;
rstl::reserved_vector<zeus::CVector3f, 5> x1c90_vecs;
rstl::reserved_vector<float, 15> x1cd0_;
rstl::reserved_vector<zeus::CVector3f, 15> x1d10_;
zeus::CVector3f x1dcc_;
zeus::CVector3f x1dd8_;
bool x1de4_24 : 1;
bool x1de4_25 : 1; bool x1de4_25 : 1;
}; float x1de8_boostTime = 0.f;
u32 _dummy = 0; float x1dec_ = 0.f;
}; float x1df0_ = 0.f;
float x1DE8_boostTime = 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; EBombJumpState x1e40_bombJumpState = EBombJumpState::Zero;
CMorphBallShadow* x1e50_shadow = nullptr; float x1e44_ = 0.f;
float x1e48_ = 0.f;
float x1e4c_ = 0.f;
std::unique_ptr<CMorphBallShadow> x1e50_shadow;
void LoadAnimationTokens(const std::string& ancsName);
void InitializeWakeEffects();
static std::unique_ptr<CModelData> GetMorphBallModel(const char* name, float radius);
void SelectMorphBallSounds(const CMaterialList& mat);
void UpdateMorphBallSounds(float dt);
public: public:
CMorphBall(CPlayer& player, float); CMorphBall(CPlayer& player, float radius);
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr); void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr);
ESpiderBallState GetSpiderBallState() const { return ESpiderBallState::Zero; } zeus::CVector3f GetBallContactSurfaceNormal() const;
bool InSpiderMode() const { return false; } const CCollidableSphere& GetCollidableSphere() const { return x38_collisionSphere; }
zeus::CVector3f GetBallContactSurfaceNormal() const { return {}; }
void GetModel() const {}
const CCollidableSphere* GetCollidableSphere() const { return nullptr; }
bool IsProjectile() const { return x1954_isProjectile; } bool IsProjectile() const { return x1954_isProjectile; }
void GetBallContactMeterials() const {} void GetBallContactMaterials() const {}
void GetWallBumpCounter() const {} void GetWallBumpCounter() const {}
void GetBoostChargeTimer() const {} void GetBoostChargeTimer() const {}
bool IsBoosting() const { return false; } bool IsBoosting() const { return false; }
float GetBallRadius() const { return 0.f; } float GetBallRadius() const;
float GetBallTouchRadius() const { return 0.f; } float GetBallTouchRadius() const;
void ForwardInput(const CFinalInput&) const {} void ForwardInput(const CFinalInput&) const;
void ComputeBallMovement(const CFinalInput&, CStateManager&, float) {} void ComputeBallMovement(const CFinalInput&, CStateManager&, float);
bool IsMovementAllowed() const { return false; } bool IsMovementAllowed() const;
void UpdateSpiderBall(const CFinalInput&, CStateManager&, float) {} void UpdateSpiderBall(const CFinalInput&, CStateManager&, float);
void ApplySpiderBallSwingingForces(const CFinalInput&, CStateManager&, float) {} void ApplySpiderBallSwingingForces(const CFinalInput&, CStateManager&, float);
void ApplySpiderBallRollForces(const CFinalInput&, CStateManager&, float) {} void ApplySpiderBallRollForces(const CFinalInput&, CStateManager&, float);
void CalculateSpiderBallAttractionSurfaceForces(const CFinalInput&, CStateManager&, void CalculateSpiderBallAttractionSurfaceForces(const CFinalInput&, CStateManager&,
const zeus::CTransform&) {} const zeus::CTransform&);
void CheckForSwitchToSpiderBallSwinging(CStateManager&) {} void CheckForSwitchToSpiderBallSwinging(CStateManager&);
void FindClosestSpiderBallWaypoint(CStateManager&, const zeus::CVector3f&, zeus::CVector3f&, void FindClosestSpiderBallWaypoint(CStateManager&, const zeus::CVector3f&, zeus::CVector3f&,
zeus::CVector3f&, zeus::CVector3f&, float&, zeus::CVector3f&, bool&, zeus::CVector3f&, zeus::CVector3f&, float&, zeus::CVector3f&, bool&,
zeus::CTransform&) const {} zeus::CTransform&) const;
void SetSpiderBallSwingingState(bool) {} void SetSpiderBallSwingingState(bool);
void GetSpiderBallControllerMovement(const CFinalInput&, bool, bool) {} void GetSpiderBallControllerMovement(const CFinalInput&, bool, bool);
void ResetSpiderBallSwingControllerMovementTimer() {} void ResetSpiderBallSwingControllerMovementTimer();
void UpdateSpiderBallSwingControllerMovementTimer(float, float) {} void UpdateSpiderBallSwingControllerMovementTimer(float, float);
float GetSpiderBallSwingControllerMovementScalar() const { return 0.f; } float GetSpiderBallSwingControllerMovementScalar() const;
void CreateSpiderBallParticles(const zeus::CVector3f&, const zeus::CVector3f&) {} void CreateSpiderBallParticles(const zeus::CVector3f&, const zeus::CVector3f&);
void ComputeMarioMovement(const CFinalInput&, CStateManager&, float) {} void ComputeMarioMovement(const CFinalInput&, CStateManager&, float);
void SetSpiderBallState(ESpiderBallState) {} void SetSpiderBallState(ESpiderBallState state) { x187c_spiderBallState = state; }
void GetSwooshToWorld() const {} void GetSwooshToWorld() const;
zeus::CTransform GetBallToWorld() const { return {}; } zeus::CTransform GetBallToWorld() const;
void CalculateSurfaceToWorld(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&) const {} void CalculateSurfaceToWorld(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&) const;
void CalculateBallContactInfo(zeus::CVector3f&, zeus::CVector3f&) const {} void CalculateBallContactInfo(zeus::CVector3f&, zeus::CVector3f&) const;
void BallTurnInput(const CFinalInput&) const {} void BallTurnInput(const CFinalInput&) const;
void UpdateBallDynamics(CStateManager&, float) {} void UpdateBallDynamics(CStateManager&, float);
void SwitchToMarble() {} void SwitchToMarble();
void SwitchToTire() {} void SwitchToTire();
void Update(float, CStateManager&) {} void Update(float dt, CStateManager& mgr);
void UpdateScriptMessage(EScriptObjectMessage, TUniqueId, CStateManager&) {} void UpdateScriptMessage(EScriptObjectMessage, TUniqueId, CStateManager&);
void DeleteLight(CStateManager&) {} void DeleteLight(CStateManager&);
void SetBallLightActive(CStateManager&, bool) {} void SetBallLightActive(CStateManager&, bool);
void EnterMorphBallState(CStateManager&) {} void EnterMorphBallState(CStateManager&);
void LeaveMorphBallState(CStateManager&) {} void LeaveMorphBallState(CStateManager&);
void UpdateEffects(float, CStateManager&) {} void UpdateEffects(float, CStateManager&);
void ComputeBoostBallMovement(const CFinalInput&, const CStateManager&, float) {} void ComputeBoostBallMovement(const CFinalInput&, const CStateManager&, float);
void EnterBoosting() {} void EnterBoosting();
void LeaveBoosting() {} void LeaveBoosting();
void CancelBoosting() {} void CancelBoosting();
void UpdateMarbleDynamics(CStateManager&, float, const zeus::CVector3f&) {} void UpdateMarbleDynamics(CStateManager&, float, const zeus::CVector3f&);
void ApplyFriction(float) {} void ApplyFriction(float);
void DampLinearAndAngularVelocities(float, float) {} void DampLinearAndAngularVelocities(float, float);
zeus::CTransform GetPrimitiveTransform() const { return {}; } zeus::CTransform GetPrimitiveTransform() const;
void DrawCollisionPrimitive() const {} void DrawCollisionPrimitive() const;
void GetMinimumAlignmentSpeed() const {} void GetMinimumAlignmentSpeed() const;
void PreRender(CStateManager&, const zeus::CFrustum&) {} void PreRender(CStateManager&, const zeus::CFrustum&);
void Render(const CStateManager&, const CActorLights*) const {} void Render(const CStateManager&, const CActorLights*) const;
void ResetMorphBallTransitionFlash() {} void ResetMorphBallTransitionFlash();
void UpdateMorphBallTransitionFlash(float) {} void UpdateMorphBallTransitionFlash(float);
void RenderMorphBallTransitionFlash(const CStateManager&) const {} void RenderMorphBallTransitionFlash(const CStateManager&) const;
bool IsMorphBallTransitionFlashValid() const { return x19dc_ != 0; } bool IsMorphBallTransitionFlashValid() const { return x19dc_ != 0; }
void RenderDamageEffects(const CStateManager&, const zeus::CTransform&) const {} void RenderDamageEffects(const CStateManager&, const zeus::CTransform&) const;
void UpdateHalfPipeStatus(CStateManager&, float) {} void UpdateHalfPipeStatus(CStateManager&, float);
bool GetIsInHalfPipeMode() const { return false; } bool GetIsInHalfPipeMode() const;
void SetIsInHalfPipeMode(bool) {} void SetIsInHalfPipeMode(bool);
void GetIsInHalfPipeModeInAir() const {} void GetIsInHalfPipeModeInAir() const;
void SetIsInHalfPipeModeInAir(bool) {} void SetIsInHalfPipeModeInAir(bool);
void GetTouchedHalfPipeRecently() const {} void GetTouchedHalfPipeRecently() const;
void SetTouchedHalfPipeRecently(bool) {} void SetTouchedHalfPipeRecently(bool);
void DisableHalfPipeStatus() {} void DisableHalfPipeStatus();
bool BallCloseToCollision(const CStateManager&, float, const CMaterialFilter& filter) const { return false; } bool BallCloseToCollision(const CStateManager&, float, const CMaterialFilter& filter) const;
void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&) {} void CollidedWith(TUniqueId, const CCollisionInfoList&, CStateManager&);
bool IsInFrustum(const zeus::CFrustum&) const { return false; } bool IsInFrustum(const zeus::CFrustum&) const;
void ComputeLiftForces(const zeus::CVector3f&, const zeus::CVector3f&, const CStateManager&) {} void ComputeLiftForces(const zeus::CVector3f&, const zeus::CVector3f&, const CStateManager&);
void CalculateSurfaceFriction() const {} void CalculateSurfaceFriction() const;
void ApplyGravity(CStateManager&) {} void ApplyGravity(CStateManager&);
void SpinToSpeed(float, zeus::CVector3f, float) {} void SpinToSpeed(float, zeus::CVector3f, float);
void ComputeMaxSpeed() const {} void ComputeMaxSpeed() const;
void Touch(CActor&, CStateManager&) {} void Touch(CActor&, CStateManager&);
bool IsClimbable(const CCollisionInfo&) const { return false; } bool IsClimbable(const CCollisionInfo&) const;
void FluidFXThink(CActor::EFluidState, CScriptWater&, CStateManager&) {} void FluidFXThink(CActor::EFluidState, CScriptWater&, CStateManager&);
void GetMorphBallModel(const std::string&, float) {} void GetMorphBallModel(const std::string&, float);
void LoadMorphBallModel(CStateManager& mgr) {} void LoadMorphBallModel(CStateManager& mgr);
void AddSpiderBallElectricalEffect() {} void AddSpiderBallElectricalEffect();
void UpdateSpiderBallElectricalEffect() {} void UpdateSpiderBallElectricalEffect();
void RenderSpiderBallElectricalEffect() const {} void RenderSpiderBallElectricalEffect() const;
void RenderEnergyDrainEffects(const CStateManager&) const {} void RenderEnergyDrainEffects(const CStateManager&) const;
void TouchModel(const CStateManager&) const {} void TouchModel(const CStateManager&) const;
void SetAsProjectile(const CDamageInfo&, const CDamageInfo&) {} void SetAsProjectile(const CDamageInfo&, const CDamageInfo&);
EBallBoostState GetBallBoostState() const { return EBallBoostState::Zero; } EBallBoostState GetBallBoostState() const { return x1e3c_boostState; }
void SetBallBoostState(EBallBoostState) {} void SetBallBoostState(EBallBoostState state) { x1e3c_boostState = state; }
EBombJumpState GetBombJumpState() const { return x1e40_bombJumpState; } EBombJumpState GetBombJumpState() const { return x1e40_bombJumpState; }
void LoadAnimationTokens(const std::string&) {} void TakeDamage(float);
void TakeDamage(float) {}
void DrawBallShadow(const CStateManager& mgr); void DrawBallShadow(const CStateManager& mgr);
void DeleteBallShadow(); void DeleteBallShadow();
void CreateBallShadow(); void CreateBallShadow();
void RenderToShadowTex(CStateManager& mgr); void RenderToShadowTex(CStateManager& mgr);
void StartLandingSfx() {} void StartLandingSfx();
bool GetX187c() const { return x187c_ != 0; } ESpiderBallState GetSpiderBallState() const { return x187c_spiderBallState; }
void SetDamageTimer(float t) { x191c_damageTimer = t; } void SetDamageTimer(float t) { x191c_damageTimer = t; }
void Stop() {} void Stop();
void StopSounds() {} void StopSounds();
void ActorAttached() {} void ActorAttached();
CModelData& GetMorphballModelData() const { return *x58_ballModel; } CModelData& GetMorphballModelData() const { return *x58_ballModel; }
u32 GetMorphballModelShader() const { return x5c_ballModelShader; } u32 GetMorphballModelShader() const { return x5c_ballModelShader; }
bool GetX1DE4_25() const { return x1de4_25; } bool GetX1DE4_25() const { return x1de4_25; }

View File

@ -862,7 +862,7 @@ void CPlayer::FluidFXThink(EFluidState state, CScriptWater& water, CStateManager
{ {
x768_morphball->FluidFXThink(state, water, mgr); x768_morphball->FluidFXThink(state, water, mgr);
if (state == EFluidState::InFluid) if (state == EFluidState::InFluid)
x9c5_30_ = true; x9c5_30_selectFluidBallSound = true;
} }
else if (x2f8_morphBallState != EPlayerMorphBallState::Unmorphed) else if (x2f8_morphBallState != EPlayerMorphBallState::Unmorphed)
{ {
@ -2821,7 +2821,7 @@ void CPlayer::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CState
break; break;
case EScriptObjectMessage::Falling: case EScriptObjectMessage::Falling:
if (x2f8_morphBallState == EPlayerMorphBallState::Morphed) if (x2f8_morphBallState == EPlayerMorphBallState::Morphed)
if (x768_morphball->GetX187c() == 1) if (x768_morphball->GetSpiderBallState() == CMorphBall::ESpiderBallState::Active)
break; break;
if (x2f8_morphBallState != EPlayerMorphBallState::Morphed) if (x2f8_morphBallState != EPlayerMorphBallState::Morphed)
SetMoveState(EPlayerMovementState::Falling, mgr); SetMoveState(EPlayerMovementState::Falling, mgr);
@ -2830,7 +2830,7 @@ void CPlayer::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CState
break; break;
case EScriptObjectMessage::LandOnNotFloor: case EScriptObjectMessage::LandOnNotFloor:
if (x2f8_morphBallState == EPlayerMorphBallState::Morphed && if (x2f8_morphBallState == EPlayerMorphBallState::Morphed &&
x768_morphball->GetX187c() == 1 && x768_morphball->GetSpiderBallState() == CMorphBall::ESpiderBallState::Active &&
x258_movementState != EPlayerMovementState::StartingJump) x258_movementState != EPlayerMovementState::StartingJump)
SetMoveState(EPlayerMovementState::StartingJump, mgr); SetMoveState(EPlayerMovementState::StartingJump, mgr);
break; break;
@ -5476,7 +5476,7 @@ const CCollisionPrimitive* CPlayer::GetCollisionPrimitive() const
const CCollidableSphere* CPlayer::GetCollidableSphere() const const CCollidableSphere* CPlayer::GetCollidableSphere() const
{ {
return x768_morphball->GetCollidableSphere(); return &x768_morphball->GetCollidableSphere();
} }
zeus::CTransform CPlayer::GetPrimitiveTransform() const zeus::CTransform CPlayer::GetPrimitiveTransform() const

View File

@ -374,7 +374,7 @@ private:
bool x9c5_27_camSubmerged : 1; bool x9c5_27_camSubmerged : 1;
bool x9c5_28_slidingOnWall : 1; bool x9c5_28_slidingOnWall : 1;
bool x9c5_29_hitWall : 1; bool x9c5_29_hitWall : 1;
bool x9c5_30_ : 1; bool x9c5_30_selectFluidBallSound : 1;
bool x9c5_31_stepCameraZBiasDirty : 1; bool x9c5_31_stepCameraZBiasDirty : 1;
bool x9c6_24_extendTargetDistance : 1; bool x9c6_24_extendTargetDistance : 1;
bool x9c6_25_interpolatingControlDir : 1; bool x9c6_25_interpolatingControlDir : 1;
@ -512,7 +512,7 @@ public:
void SetVisorSteam(float, float, float, CAssetId, bool); void SetVisorSteam(float, float, float, CAssetId, bool);
void UpdateFootstepSounds(const CFinalInput& input, CStateManager&, float); void UpdateFootstepSounds(const CFinalInput& input, CStateManager&, float);
u16 GetMaterialSoundUnderPlayer(CStateManager& mgr, const u16*, u32, u16); 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 UpdateCrosshairsState(const CFinalInput&);
void UpdateVisorTransition(float, CStateManager& mgr); void UpdateVisorTransition(float, CStateManager& mgr);
void UpdateVisorState(const CFinalInput&, float, CStateManager& mgr); void UpdateVisorState(const CFinalInput&, float, CStateManager& mgr);

2
hecl

@ -1 +1 @@
Subproject commit 5291cd71d77848a5c7e4cb4d38aba5c31d453be9 Subproject commit a7bc172e938ca97cef01794a77b5412b12f44949