1#include "Game/NPC/TalkNodeCtrl.hpp"
2#include "Game/System/MessageHolder.hpp"
3#include "Game/Util.hpp"
6void TalkMessageHistory::entry(u16 msgID) {
7 mHistory[mCount++] = msgID;
10bool TalkMessageHistory::search(u16 msgID)
const {
11 for (s32 i = 0; i < mCount; i++) {
12 if (mHistory[i] == msgID) {
20TalkNodeCtrl::TalkNodeCtrl() : _0(0), mCurrentNodeIdx(-1), mMessageInfo() {
23 mCurrentNode =
nullptr;
27void TalkNodeCtrl::resetFlowNode() {
28 if (mCurrentNode != _38) {
35void TalkNodeCtrl::resetTempFlowNode() {
36 if (mCurrentNode != mFlowNode) {
37 mCurrentNode = mFlowNode;
42void TalkNodeCtrl::recordTempFlowNode() {
43 mFlowNode = mCurrentNode;
46void TalkNodeCtrl::forwardFlowNode() {
49 if (node ==
nullptr) {
53 if (node->mNodeType == 1) {
54 u16 idx = node->mNextIdx;
55 MessageData* msg = MessageSystem::getSceneMessageData();
56 mCurrentNode = msg->getNode(idx);
58 else if (node->mNodeType == 3) {
59 u16 idx = node->mNextIdx;
60 MessageData* msg = MessageSystem::getSceneMessageData();
61 mCurrentNode = msg->getBranchNode(idx);
67bool TalkNodeCtrl::isExistNextNode()
const {
68 return getNextNode() !=
nullptr;
71bool TalkNodeCtrl::isNextNodeMessage()
const {
74 if (next !=
nullptr || next->mNodeType != 1) {
81bool TalkNodeCtrl::isCurrentNodeEvent()
const {
82 return getCurrentNodeEvent() !=
nullptr;
85TalkNode* TalkNodeCtrl::getNextNode()
const {
89 if (node ==
nullptr) {
93 if (node->mNodeType == 1) {
96 return MessageSystem::getSceneMessageData()->getNode(idx);
99 else if (node->mNodeType == 3) {
101 MessageData* msg = MessageSystem::getSceneMessageData();
103 if (msg->isValidBranchNode(idx)) {
105 MessageData* msg = MessageSystem::getSceneMessageData();
106 return msg->getBranchNode(idx);
113TalkNode* TalkNodeCtrl::getNextNodeBranch()
const {
116 if (node ==
nullptr) {
120 return node->mNodeType != 2 ? nullptr : node;
123TalkNode* TalkNodeCtrl::getCurrentNodeBranch()
const {
124 if (mCurrentNode !=
nullptr && mCurrentNode->mNodeType == 2) {
131TalkNode* TalkNodeCtrl::getCurrentNodeMessage()
const {
132 if (mCurrentNode !=
nullptr && mCurrentNode->mNodeType == 1) {
139TalkNode* TalkNodeCtrl::getCurrentNodeEvent()
const {
140 if (mCurrentNode !=
nullptr && mCurrentNode->mNodeType == 3) {
147TalkNode* TalkNodeCtrl::getNextNodeEvent()
const {
150 if (node ==
nullptr) {
154 return node->mNodeType != 3 ? nullptr : node;
157void TalkNodeCtrl::updateMessage() {
162 if (cur !=
nullptr) {
163 if (cur->mNodeType != 1) {
168 groupID = cur->mGroupID;
169 MessageData* msg = MessageSystem::getSceneMessageData();
170 msg->getMessage(&mMessageInfo, groupID, idx);
171 mCurrentNodeIdx = cur->mIndex;
173 TalkNode* nextBranchNode = getNextNodeBranch();
175 if (nextBranchNode !=
nullptr) {
176 mNodeData = nextBranchNode->mIndex;
184 if (mMessageInfo.isEventTalk()) {
185 if (mHistory.search(mCurrentNodeIdx)) {
186 mMessageInfo.mTalkType = 0;
189 s8 msgId = mMessageInfo._B;
192 if (MR::isOnMessageAlreadyRead(msgId)) {
193 mMessageInfo.mTalkType = 0;
199void TalkNodeCtrl::readMessage() {
200 if (mMessageInfo.isEventTalk()) {
201 if (!mHistory.search(mCurrentNodeIdx)) {
202 mHistory.entry(mCurrentNodeIdx);
205 mMessageInfo.mTalkType = 0;
208 if (mMessageInfo._B != -1) {
209 MR::onMessageAlreadyRead(mMessageInfo._B);
213void TalkNodeCtrl::forwardCurrentBranchNode(
bool storeCurrent) {
217 u16 group = cur->mNextGroup;
218 MessageData* msg = MessageSystem::getSceneMessageData();
219 mCurrentNode = msg->getBranchNode(group);
222 u16 group = cur->mNextGroup;
223 MessageData* msg = MessageSystem::getSceneMessageData();
224 mCurrentNode = msg->getBranchNode(group + 1);
234 s32 msgID = MR::getMessageID(rIter);
235 snprintf(buf, 0x100,
"%s_%s%03d", MR::getCurrentPlacementZoneName(), pName, msgID);
236 createFlowNodeDirect(pMsgCtrl, rIter, buf, pCameraInf);