SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
TalkMessageCtrl.cpp
1#include "Game/NPC/TalkMessageCtrl.hpp"
2#include "Game/NPC/TalkNodeCtrl.hpp"
3#include "Game/LiveActor/LiveActor.hpp"
4#include "Game/LiveActor/ActorCameraInfo.hpp"
5
6#ifdef NON_MATCHING
7// one liner regswap with mNodeCtrl->mCurrentNode
8void TalkMessageCtrl::createMessage(const JMapInfoIter &rIter, const char *pName) {
9 mNodeCtrl = new TalkNodeCtrl();
10 mNodeCtrl->createFlowNode(this, rIter, pName, &mCameraInfo);
11
12 if (mNodeCtrl->mCurrentNode != nullptr) {
13 mAlreadyDoneFlags = MR::setupAlreadyDoneFlag(((MessageNode*)mNodeCtrl->mCurrentNode)->mMessage, rIter, &_3C);
14 }
15 else {
16 _3C = 1;
17 }
18}
19#endif
20
21void TalkMessageCtrl::createMessageDirect(const JMapInfoIter &rIter, const char *pName) {
22 mNodeCtrl = new TalkNodeCtrl();
23 mNodeCtrl->createFlowNode(this, rIter, pName, &mCameraInfo);
24 _3C = 1;
25}
26
27
28// ...
29
30void TalkMessageCtrl::rootNodePst() {
31 TalkNodeCtrl* ctrl = mNodeCtrl;
32 if (!ctrl->isExistNextNode()) {
33 ctrl->resetFlowNode();
34 }
35 else {
36 ctrl->forwardFlowNode();
37 }
38
39 ctrl->recordTempFlowNode();
40}
41
42void TalkMessageCtrl::rootNodeSel(bool a1) {
43 TalkNodeCtrl* ctrl = mNodeCtrl;
44 ctrl->forwardFlowNode();
45
46 if (a1) {
47 ctrl->forwardCurrentBranchNode(true);
48 }
49 else {
50 ctrl->forwardCurrentBranchNode(false);
51 }
52
53 ctrl->recordTempFlowNode();
54}
55
56void TalkMessageCtrl::registerBranchFunc(const TalkMessageFuncBase &rFunc) {
57 mBranchFunc = rFunc.clone();
58}
59
60void TalkMessageCtrl::registerEventFunc(const TalkMessageFuncBase &rFunc) {
61 mEventFunc = rFunc.clone();
62}
63
64void TalkMessageCtrl::registerAnimeFunc(const TalkMessageFuncBase &rFunc) {
65 mAnimeFunc = rFunc.clone();
66}
67
68void TalkMessageCtrl::registerKillFunc(const TalkMessageFuncBase &rFunc) {
69 mKillFunc = rFunc.clone();
70}
71
72void TalkMessageCtrl::readMessage() {
73 if (mIsOnReadNodeAuto) {
74 mNodeCtrl->readMessage();
75 }
76
77 if (!_3C) {
78 MR::updateAlreadyDoneFlag(mAlreadyDoneFlags, 1);
79 }
80}
81
82bool TalkMessageCtrl::isSelectYesNo() const {
83 TalkNode* node = mNodeCtrl->getNextNodeBranch();
84
85 if (node == nullptr || node->mIndex != 0) {
86 return false;
87 }
88
89 switch (node->mNextIdx) {
90 case 16:
91 return false;
92 case 14:
93 return false;
94 }
95
96 return true;
97}
98
99u32 TalkMessageCtrl::getMessageID() const {
100 TalkNodeCtrl* ctrl = mNodeCtrl;
101 if (ctrl->getCurrentNodeMessage() != nullptr) {
102 return ctrl->getCurrentNodeMessage()->mIndex;
103 }
104 else {
105 return ctrl->mCurrentNodeIdx;
106 }
107}
108
109// TalkMessageCtrl::requestTalk
110// TalkMessageCtrl::requestTalkForce
111// TalkMessageCtrl::startTalk
112// TalkMessageCtrl::startTalkForce
113// TalkMessageCtrl::startTalkForcePuppetable
114// TalkMessageCtrl::startTalkForceWithoutDemo
115// TalkMessageCtrl::startTalkForceWithoutDemoPuppetable
116// TalkMessageCtrl::endTalk
117// TalkMessageCtrl::updateBalloonPos
118
119bool TalkMessageCtrl::isNearPlayer(const TalkMessageCtrl *pCtrl) {
120 if (pCtrl == nullptr) {
121 return true;
122 }
123
124 TVec3f* playerPos = MR::getPlayerPos();
125 return mHostActor->getPosPtr()->squared(*playerPos) < pCtrl->mHostActor->getPosPtr()->squared(*playerPos);
126}
127
128void TalkMessageCtrl::startCamera(s32 a1) {
129 TalkMessageInfo* inf = &mNodeCtrl->mMessageInfo;
130 if (inf->isCameraNormal()) {
131 MR::startNPCTalkCamera(this, mHostActor->getBaseMtx(), 1.0f, a1);
132 }
133 else if (inf->isCameraEvent()) {
134 if (inf->_4) {
135 mCameraInfo->mCameraSetID = inf->_4;
136 MR::startMultiActorCameraNoTarget(mHostActor, mCameraInfo, "会話", a1);
137 }
138 }
139}
140
141const char* TalkMessageCtrl::getBranchID() const {
142 TalkNode* node = mNodeCtrl->getNextNodeBranch();
143
144 if (node == nullptr || node->mIndex != 0 ) {
145 return nullptr;
146 }
147
148 const char* result = nullptr;
149
150 switch (node->mNextIdx) {
151 case 0:
152 result = "PenguinRace";
153 break;
154 case 1:
155 result = "SwimmingSchool";
156 break;
157 case 2:
158 result = "PenguinRace";
159 break;
160 case 3:
161 result = "BombTimeAttackLv1";
162 break;
163 case 4:
164 result = "PhantomTeresaRacer";
165 break;
166 case 5:
167 result = "BombTimeAttackLv2";
168 break;
169 case 6:
170 result = "TrialSurfingCoach";
171 break;
172 case 7:
173 result = "TrialSurfingHowTo";
174 break;
175 case 8:
176 result = "DeathPromenadeTeresaRacer";
177 break;
178 case 9:
179 result = "RosettaFinalBattle";
180 break;
181 case 10:
182 result = "CometTico";
183 break;
184 case 11:
185 result = "TransformTico";
186 break;
187 case 12:
188 result = "ChallengeSurfingCoach";
189 break;
190 case 13:
191 result = "TicoShopExchange";
192 break;
193 case 14:
194 result = "TicoShopWhich";
195 break;
196 case 15:
197 result = "KinopioPurple";
198 break;
199 case 16:
200 result = "CometTicoTell";
201 break;
202 case 17:
203 result = "TrialTamakoroHowTo";
204 break;
205 case 18:
206 result = "KnockOnTheDoor";
207 break;
208 case 19:
209 result = "LedPattern";
210 break;
211 }
212
213 return result;
214}
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.