1#include "ObjectDossunTsuibiHolder.hh"
3#include "game/field/obj/ObjectDossunTsuibi.hh"
9 : ObjectCollidable(params), m_stillTimer(static_cast<u32>(params.setting(2))),
10 m_facingBackwards(false), m_forwardVel(static_cast<f32>(m_mapObj->setting(0))),
11 m_stillDuration(static_cast<u32>(m_mapObj->setting(3))) {
12 for (
auto *&dossun : m_dossuns) {
13 dossun =
new ObjectDossunTsuibi(params,
this);
19ObjectDossunTsuibiHolder::~ObjectDossunTsuibiHolder() =
default;
22void ObjectDossunTsuibiHolder::init() {
23 for (
auto *&dossun : m_dossuns) {
29 m_state = State::Still;
30 m_railInterpolator->init(0.0f, 0);
31 m_vel = m_railInterpolator->currVel();
33 m_movingForward =
false;
34 m_movingSideways =
false;
38 m_lastStompZ = m_pos.z;
43void ObjectDossunTsuibiHolder::calc() {
44 for (
auto &dossun : m_dossuns) {
56 case State::StartStomp:
69 case State::SillRotating:
78void ObjectDossunTsuibiHolder::calcForward() {
81 if (m_movingForward) {
83 }
else if (m_forwardTimer == 45) {
84 m_movingForward =
true;
87 if (m_movingSideways) {
88 calcForwardOscillation();
91 if (m_railInterpolator->curPoint().setting[1] == 1 && !m_facingBackwards) {
92 m_facingBackwards =
true;
93 m_backwardsCounter = 0;
97void ObjectDossunTsuibiHolder::calcStartStomp() {
98 for (
auto *&dossun : m_dossuns) {
99 dossun->m_anmState = ObjectDossun::AnmState::BeforeFall;
100 dossun->m_beforeFallTimer = 10;
101 f32 rot = dossun->m_rot.y;
102 dossun->m_currRot = rot;
105 dossun->m_currRot = rot - F_TAU;
108 dossun->m_cycleTimer = dossun->m_fullDuration;
111 m_state = State::Stomping;
114void ObjectDossunTsuibiHolder::calcStomp() {
115 for (
auto *&dossun : m_dossuns) {
121void ObjectDossunTsuibiHolder::calcBackwards() {
122 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
123 m_resetZVel = (m_lastStompZ - m_railInterpolator->curPos().z) /
124 static_cast<f32
>(HOME_RESET_FRAMES);
126 m_resetAngVel = m_facingBackwards ? 5.0f : 10.0f;
127 m_backwardsCounter = 0;
128 m_state = State::SillRotating;
129 m_facingBackwards =
false;
130 m_railInterpolator->init(0.0f, 0);
137void ObjectDossunTsuibiHolder::calcRot() {
138 constexpr f32 DEGREES_5_RAD = DEG2RAD * 5.0f;
139 STATIC_ASSERT(DEGREES_5_RAD == 0.08726646f);
141 if (m_facingBackwards) {
142 if (++m_backwardsCounter == HOME_RESET_FRAMES) {
143 updateRot(m_rot.y + F_PI);
145 m_movingSideways =
true;
148 if (m_flipSideways == 0) {
153 }
else if (m_backwardsCounter < HOME_RESET_FRAMES) {
154 updateRot(m_rot.y + DEGREES_5_RAD);
156 }
else if (m_state == State::SillRotating) {
157 updateRot(m_rot.y + m_resetAngVel * DEG2RAD);
159 if (++m_backwardsCounter == HOME_RESET_FRAMES) {
160 updateRot(m_initRotY);
162 m_state = State::Still;
163 m_stillTimer = m_stillDuration;
169void ObjectDossunTsuibiHolder::calcForwardRail() {
170 m_railInterpolator->setCurrVel(m_forwardVel);
172 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
173 m_state = State::StartStomp;
175 m_movingForward =
false;
176 m_lastStompZ = m_pos.z;
179 updatePos(m_railInterpolator->curPos());
183void ObjectDossunTsuibiHolder::calcForwardOscillation() {
184 constexpr f32 AMPLITUDE = 1500.0f;
185 constexpr f32 STOMP_PHASE = 170.0f;
187 m_sidewaysPhase += 2;
189 u32 phase = m_flipSideways ? m_sidewaysPhase + 180 : m_sidewaysPhase;
190 f32 posOffsetZ = AMPLITUDE *
EGG::Mathf::sin(
static_cast<f32
>(phase) * DEG2RAD);
191 updatePos(
EGG::Vector3f(m_pos.x, m_pos.y, m_pos.z + posOffsetZ));
193 if (m_sidewaysPhase == STOMP_PHASE) {
194 if (m_state != State::StartStomp) {
195 m_railInterpolator->reverseDirection();
198 m_state = State::StartStomp;
200 m_movingForward =
false;
201 m_lastStompZ = m_pos.z;
206void ObjectDossunTsuibiHolder::updatePos(
const EGG::Vector3f &pos) {
207 m_flags.setBit(eFlags::Position);
210 m_dossuns[0]->setPos(
EGG::Vector3f(pos.x, pos.y, pos.z + DOSSUN_POS_OFFSET));
211 m_dossuns[1]->setPos(
EGG::Vector3f(pos.x, pos.y, pos.z - DOSSUN_POS_OFFSET));
215void ObjectDossunTsuibiHolder::updateRot(f32 rot) {
216 m_flags.setBit(eFlags::Rotation);
219 m_dossuns[0]->m_flags.setBit(eFlags::Rotation);
220 m_dossuns[0]->m_rot.y = m_rot.y;
221 m_dossuns[1]->m_flags.setBit(eFlags::Rotation);
222 m_dossuns[1]->m_rot.y = m_rot.y;