44 [[nodiscard]] u32 loadFlags()
const override {
48 Kart::Reaction onCollision(
Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
49 Kart::Reaction reactionOnObj,
EGG::Vector3f &hitDepth)
override;
63 void calcChainAttachMat();
68 void calcWanderTimer() {
73 void calcWanderEnd() {
86 void calcTangent(f32 t);
88 void calcRandomTarget();
89 void initTransformKeyframes();
96 return (v2.x - v1.x) * (v0.z - v1.z) - (v0.x - v1.x) * (v2.z - v1.z);
99 static void SampleHermiteInterp(f32 start, f32 end, f32 startTangent, f32 endTangent,
109 std::array<EGG::Matrix34f, 15> m_transformKeyframes;
110 const f32 m_chainLength;
111 const f32 m_attackDistance;
112 const f32 m_attackArcTargetX;
113 const f32 m_attackArcTargetZ;
119 bool m_touchingFloor;
136 static constexpr f32 SCALE = 2.0f;
138 static constexpr f32 CHAIN_LENGTH = 135.0f;
140 static constexpr std::array<StateManagerEntry, 3> STATE_ENTRIES = {{
141 {StateEntry<ObjectWanwan, &ObjectWanwan::enterWait, &ObjectWanwan::calcWait>(0)},
142 {StateEntry<ObjectWanwan, &ObjectWanwan::enterAttack, &ObjectWanwan::calcAttack>(1)},
143 {StateEntry<ObjectWanwan, &ObjectWanwan::enterBack, &ObjectWanwan::calcBack>(2)},