SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
SkeletalFishRailControl.cpp
1#include "Game/Boss/SkeletalFishRailControl.hpp"
2
3SkeletalFishRailControl::SkeletalFishRailControl() {
4 _0 = 2;
5 _4 = nullptr;
6 _8 = nullptr;
7 _10 = 0.0f;
8 _14 = 20.0f;
9 _18 = false;
10}
11
12void SkeletalFishRailControl::setRailActor(LiveActor *a1, LiveActor *a2, bool a3) {
13 _4 = a2;
14 _8 = a1;
15
16 if (a2 != nullptr) {
17 _0 = 0;
18 MR::setRailCoord(a2, 0.0f);
19 MR::setRailDirectionToEnd(_4);
20 }
21 else {
22 _0 = 2;
23 }
24
25 if (a3) {
26 MR::setRailCoord(_8, 0.0f);
27 MR::setRailDirectionToEnd(_8);
28 }
29}
30
31void SkeletalFishRailControl::update() {
32 if (_4 != nullptr) {
33 MR::setRailCoordSpeed(_4, _14);
34 }
35
36 MR::setRailCoordSpeed(_8, _14);
37
38 switch (_0) {
39 case 0:
40 {
41 f32 railLength = MR::getRailTotalLength(_4);
42 f32 v3 = ((_14 + MR::getRailCoord(_4) - railLength));
43 if (v3 >= 0.0f) {
44 f32 coord = MR::calcNearestRailCoord(_8, MR::getRailPointPosEnd(_4));
45 _10 = coord;
46 _C = (coord - v3);
47 MR::setRailCoord(_8, _C);
48 _0 = 1;
49 }
50 break;
51 }
52
53 case 1:
54 if (_C - _10 >= MR::getRailTotalLength(_8)) {
55 _0 = 2;
56 }
57 break;
58 case 2:
59 break;
60 }
61
62 _18 = false;
63
64 switch (_0) {
65 case 0:
66 MR::moveRailRider(_4);
67 break;
68 case 1:
69 _C += _14;
70 MR::getRailTotalLength(_8);
71 MR::setRailCoord(_8, _C);
72 break;
73 case 2:
74 if (MR::getRailCoord(_8) + MR::getRailCoordSpeed(_8) > MR::getRailTotalLength(_8)) {
75 _18 = true;
76 }
77
78 MR::moveRailRider(_8);
79 break;
80 }
81}
82
83void SkeletalFishRailControl::getRailInfo(SkeletalFishRailInfo* pOutInfo, f32 a2) {
84 switch (_0) {
85 case 0:
86 {
87 f32 coord = MR::getRailCoord(_4);
88 pOutInfo->_0 = _4;
89 pOutInfo->_4 = coord - a2;
90 break;
91 }
92 case 1:
93 {
94 f32 dist = _C - a2;
95 if (dist < _10) {
96 f32 railLength = MR::getRailTotalLength(_4);
97 f32 diff = _10 - dist;
98 pOutInfo->_0 = _4;
99 dist = railLength - diff;
100 }
101 else {
102 pOutInfo->_0 = _8;
103 }
104
105 pOutInfo->_4 = dist;
106 break;
107 }
108
109 case 2:
110 {
111 f32 coord = MR::getRailCoord(_8);
112 pOutInfo->_0 = _8;
113 pOutInfo->_4 = coord - a2;
114 break;
115 }
116 }
117}
118
119void SkeletalFishRailControl::getPos(TVec3f *pOut, f32 a2) {
121 getRailInfo(&info, a2);
122
123 if (info._4 < 0.0f && !MR::isLoopRail(info._0)) {
124 MR::calcRailPosAtCoord(pOut, info._0, 0.0f);
125 TVec3f railDir;
126 MR::calcRailDirectionAtCoord(&railDir, info._0, 0.0f);
127 railDir.scale(info._4);
128 pOut->add(railDir);
129
130 }
131 else {
132 MR::calcRailPosAtCoord(pOut, info._0, info._4);
133 }
134}
135
136void SkeletalFishRailControl::getMtx(TPos3f *pOut, f32 a2) {
137 SkeletalFishRailInfo normalRailInfo;
138 SkeletalFishRailInfo distRailInfo;
139 getRailInfo(&normalRailInfo, a2);
140 getRailInfo(&distRailInfo, a2 - 1000.0f);
141
142 TVec3f railPos;
143 TVec3f railDir;
144 TVec3f gravityVec;
145 TVec3f stack_3C;
146 TVec3f v15;
147 TVec3f v14;
148 TVec3f negVector;
149
150 if (normalRailInfo._4 < 0.0f && !MR::isLoopRail(normalRailInfo._0)) {
151 MR::calcRailPosAtCoord(&railPos, normalRailInfo._0, 0.0f);
152 MR::calcRailDirectionAtCoord(&railDir, normalRailInfo._0, 0.0f);
153 stack_3C.setInlinePS_2(railDir);
154 stack_3C.scale(normalRailInfo._4);
155 railPos.add(stack_3C);
156 }
157 else {
158 MR::calcRailPosAtCoord(&railPos, normalRailInfo._0, normalRailInfo._4);
159 MR::calcRailDirectionAtCoord(&railDir, normalRailInfo._0, normalRailInfo._4);
160 }
161
162 MR::normalizeOrZero(&railDir);
163 MR::calcGravityVector(normalRailInfo._0, railPos, &gravityVec, nullptr, 0);
164 negVector.negateInline(gravityVec);
165 PSVECCrossProduct(negVector.toCVec(), railDir.toCVec(), v15.toVec());
166 PSVECCrossProduct(railDir.toCVec(), v15.toCVec(), v14.toVec());
167
168 MR::normalizeOrZero(&v15);
169 MR::normalizeOrZero(&v14);
170 MR::normalizeOrZero(&railDir);
171
172 pOut->mMtx[0][0] = v15.x;
173 pOut->mMtx[1][0] = v15.y;
174 pOut->mMtx[2][0] = v15.z;
175 pOut->mMtx[0][1] = v14.x;
176 pOut->mMtx[1][1] = v14.y;
177 pOut->mMtx[2][1] = v14.z;
178 pOut->mMtx[0][2] = railDir.x;
179 pOut->mMtx[1][2] = railDir.y;
180 pOut->mMtx[2][2] = railDir.z;
181 pOut->mMtx[0][3] = railPos.x;
182 pOut->mMtx[1][3] = railPos.y;
183 pOut->mMtx[2][3] = railPos.z;
184}
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24