mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-20 13:24:40 -04:00
FlowService & MessageService (#2313)
This commit is contained in:
@@ -3491,7 +3491,7 @@ char* dMeter2Draw_c::getActionString(u8 i_action, u8 i_type, u8* param_2) {
|
||||
}
|
||||
|
||||
if (param_2 != NULL) {
|
||||
*param_2 = mesg_entry.output_type;
|
||||
*param_2 = mesg_entry.draw_type;
|
||||
|
||||
if (g_drawHIO.mButtonATextActionID == 0x3E6) {
|
||||
*param_2 = 7;
|
||||
@@ -3508,7 +3508,7 @@ char* dMeter2Draw_c::getActionString(u8 i_action, u8 i_type, u8* param_2) {
|
||||
}
|
||||
|
||||
if (param_2 != NULL) {
|
||||
*param_2 = mesg_entry.output_type;
|
||||
*param_2 = mesg_entry.draw_type;
|
||||
|
||||
if (i_action_num[i_action] == 0x3E6) {
|
||||
*param_2 = 7;
|
||||
|
||||
+16
-16
@@ -927,15 +927,15 @@ void jmessage_tMeasureProcessor::do_begin(void const* pEntry, char const* pszTex
|
||||
pReference->setRevoMessageID(0);
|
||||
field_0x38 = 1.0f;
|
||||
|
||||
mSeSpeaker = ((JMSMesgEntry_c*)pEntry)->se_speaker;
|
||||
mSeMood = ((JMSMesgEntry_c*)pEntry)->se_mood;
|
||||
mSeSpeaker = ((JMSMesgEntry_c*)pEntry)->speaker;
|
||||
mSeMood = ((JMSMesgEntry_c*)pEntry)->speaker_mood;
|
||||
|
||||
for (int i = 0; i < DUSK_IF_ELSE((dusk::version::isRegionJpn() ? 30 : D_MSG_CLASS_PAGE_CNT_MAX), D_MSG_CLASS_PAGE_CNT_MAX); i++) {
|
||||
pReference->setLineLength(i, 0.0f, 0.0f);
|
||||
pReference->setPageLine(i, 0);
|
||||
pReference->setPageLineMax(i, 0);
|
||||
pReference->setPageType(i, 0);
|
||||
pReference->setLineArrange(i, ((JMSMesgEntry_c*)pEntry)->unk_0xd);
|
||||
pReference->setLineArrange(i, ((JMSMesgEntry_c*)pEntry)->line_alignment);
|
||||
pReference->setLineScale(i, 100);
|
||||
|
||||
if (pReference->isPlaceName() || pReference->isStaffRoll() || pReference->isBossName() ||
|
||||
@@ -948,11 +948,11 @@ void jmessage_tMeasureProcessor::do_begin(void const* pEntry, char const* pszTex
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (!dusk::version::isRegionJpn() && ((JMSMesgEntry_c*)pEntry)->unk_0xd == 0) {
|
||||
if (!dusk::version::isRegionJpn() && ((JMSMesgEntry_c*)pEntry)->line_alignment == 0) {
|
||||
pReference->setLineArrange(i, 1);
|
||||
}
|
||||
#elif !REGION_JPN
|
||||
if (((JMSMesgEntry_c*)pEntry)->unk_0xd == 0) {
|
||||
if (((JMSMesgEntry_c*)pEntry)->line_alignment == 0) {
|
||||
pReference->setLineArrange(i, 1);
|
||||
}
|
||||
#endif
|
||||
@@ -1896,7 +1896,7 @@ void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszTe
|
||||
mpEntry = pEntry;
|
||||
mpText = pszText;
|
||||
|
||||
if (((JMSMesgEntry_c*)pEntry)->fuki_kind == 8) {
|
||||
if (((JMSMesgEntry_c*)pEntry)->box_kind == 8) {
|
||||
field_0xa8 = g_MsgObject_HIO_c.mDisplaySpeedSpirit;
|
||||
} else {
|
||||
field_0xa8 = g_MsgObject_HIO_c.mDisplaySpeed;
|
||||
@@ -1910,8 +1910,8 @@ void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszTe
|
||||
field_0xb2 = 0;
|
||||
field_0xaa = 0;
|
||||
field_0xac = 0;
|
||||
field_0xb4 = ((JMSMesgEntry_c*)pEntry)->se_speaker;
|
||||
field_0xb3 = ((JMSMesgEntry_c*)pEntry)->se_mood;
|
||||
field_0xb4 = ((JMSMesgEntry_c*)pEntry)->speaker;
|
||||
field_0xb3 = ((JMSMesgEntry_c*)pEntry)->speaker_mood;
|
||||
|
||||
jmessage_tReference* pReference = (jmessage_tReference*)getReference();
|
||||
pReference->resetCharCnt();
|
||||
@@ -1924,8 +1924,8 @@ void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszTe
|
||||
pReference->setNowTagScale(0);
|
||||
pReference->calcDistance();
|
||||
|
||||
dComIfGp_setMesgAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->base_anm_id);
|
||||
dComIfGp_setMesgFaceAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->face_anm_id);
|
||||
dComIfGp_setMesgAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->talk_anim);
|
||||
dComIfGp_setMesgFaceAnimeAttrInfo(((JMSMesgEntry_c*)pEntry)->face_anim);
|
||||
|
||||
if (dComIfGp_isHeapLockFlag() == 2) {
|
||||
pReference->setFukiPosType(1);
|
||||
@@ -1933,20 +1933,20 @@ void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszTe
|
||||
if (dComIfGp_isHeapLockFlag() == 3) {
|
||||
pReference->setFukiPosType(0);
|
||||
} else {
|
||||
pReference->setFukiPosType(((JMSMesgEntry_c*)pEntry)->fuki_pos_type);
|
||||
pReference->setFukiPosType(((JMSMesgEntry_c*)pEntry)->box_position);
|
||||
}
|
||||
}
|
||||
|
||||
pReference->setFukiKind(((JMSMesgEntry_c*)pEntry)->fuki_kind);
|
||||
pReference->setFukiKind(((JMSMesgEntry_c*)pEntry)->box_kind);
|
||||
|
||||
if (dMsgObject_getMsgOutputType() != 0xFF) {
|
||||
pReference->setForm(dMsgObject_getMsgOutputType());
|
||||
} else {
|
||||
pReference->setForm(((JMSMesgEntry_c*)pEntry)->output_type);
|
||||
pReference->setForm(((JMSMesgEntry_c*)pEntry)->draw_type);
|
||||
}
|
||||
|
||||
pReference->setArrange(((JMSMesgEntry_c*)pEntry)->unk_0xd);
|
||||
pReference->setForm(((JMSMesgEntry_c*)pEntry)->unk_0xd);
|
||||
pReference->setArrange(((JMSMesgEntry_c*)pEntry)->line_alignment);
|
||||
pReference->setForm(((JMSMesgEntry_c*)pEntry)->line_alignment);
|
||||
pReference->setMsgID(((JMSMesgEntry_c*)pEntry)->message_id);
|
||||
|
||||
if (((JMSMesgEntry_c*)pEntry)->event_label_id != 0) {
|
||||
@@ -1980,7 +1980,7 @@ void jmessage_tSequenceProcessor::do_begin(void const* pEntry, char const* pszTe
|
||||
if (dMsgObject_getMsgOutputType() != 0xFF) {
|
||||
field_0xae = dMsgObject_getMsgOutputType();
|
||||
} else {
|
||||
field_0xae = ((JMSMesgEntry_c*)pEntry)->output_type;
|
||||
field_0xae = ((JMSMesgEntry_c*)pEntry)->draw_type;
|
||||
}
|
||||
|
||||
if (mForceForm != 0xFF) {
|
||||
|
||||
+249
-2
@@ -15,6 +15,37 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/mods/svc/flow.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
template <typename Node>
|
||||
bool resolve_flow_node(u16 index, Node& outNode) {
|
||||
FlowNodeData data{};
|
||||
if (!dusk::flow::resolve_node(dMsgObject_getMsgDtPtr(), index, data)) {
|
||||
return false;
|
||||
}
|
||||
static_assert(sizeof(Node) == sizeof(data.bytes));
|
||||
std::memcpy(&outNode, data.bytes, sizeof(outNode));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool resolve_flow_edge(u16 index, u16& outTarget) {
|
||||
return dusk::flow::resolve_edge(dMsgObject_getMsgDtPtr(), index, outTarget);
|
||||
}
|
||||
|
||||
bool resolve_flow_message(u16 index, MessageEntryData& outEntry) {
|
||||
return dusk::flow::resolve_message_entry(dMsgObject_getMsgDtPtr(), index, outEntry);
|
||||
}
|
||||
|
||||
u16 message_id(const MessageEntryData& entry) {
|
||||
return static_cast<u16>(static_cast<u16>(entry.bytes[4]) << 8 | entry.bytes[5]);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
#endif
|
||||
|
||||
dMsgFlow_c::dMsgFlow_c() {
|
||||
mNonStopJunpFlowFlag = 0;
|
||||
setInitValue(1);
|
||||
@@ -38,6 +69,11 @@ void dMsgFlow_c::init(fopAc_ac_c* i_partner, int i_flowID, int param_2, fopAc_ac
|
||||
|
||||
dMsgObject_changeFlowGroup(i_flowID);
|
||||
|
||||
#if TARGET_PC
|
||||
dusk::flow::bind_resource(dMsgObject_getMsgDtPtr(),
|
||||
i_flowID >= 3000 ? 0 : static_cast<u16>(dMsgObject_getGroupID()));
|
||||
#endif
|
||||
|
||||
if (param_2 == 0) {
|
||||
setInitValue(1);
|
||||
|
||||
@@ -107,17 +143,37 @@ int dMsgFlow_c::checkOpenDoor(fopAc_ac_c* i_speaker_p, int* param_2) {
|
||||
mesg_flow_node_event* event_node = NULL;
|
||||
|
||||
while ((nodeIdx != 0xFFFF && !var_r27) && !var_r25) {
|
||||
#if TARGET_PC
|
||||
FlowNodeData resolvedData{};
|
||||
if (!dusk::flow::resolve_node(dMsgObject_getMsgDtPtr(), nodeIdx, resolvedData)) {
|
||||
break;
|
||||
}
|
||||
u8 type = resolvedData.bytes[0];
|
||||
#else
|
||||
u8 type = mFlowNodeTBL[nodeIdx].message.type;
|
||||
#endif
|
||||
|
||||
switch(type) {
|
||||
case NODETYPE_MESSAGE_e: {
|
||||
#if TARGET_PC
|
||||
mesg_flow_node resolved{};
|
||||
std::memcpy(&resolved, resolvedData.bytes, sizeof(resolved));
|
||||
msg_node = &resolved;
|
||||
#else
|
||||
msg_node = &mFlowNodeTBL[nodeIdx].message;
|
||||
#endif
|
||||
nodeIdx = msg_node->next_node_idx;
|
||||
var_r26++;
|
||||
break;
|
||||
}
|
||||
case NODETYPE_BRANCH_e: {
|
||||
#if TARGET_PC
|
||||
mesg_flow_node_branch resolved{};
|
||||
std::memcpy(&resolved, resolvedData.bytes, sizeof(resolved));
|
||||
branch_node = &resolved;
|
||||
#else
|
||||
branch_node = (mesg_flow_node_branch*)&mFlowNodeTBL[nodeIdx].branch;
|
||||
#endif
|
||||
|
||||
switch(branch_node->query_idx) {
|
||||
case 0:
|
||||
@@ -130,13 +186,38 @@ int dMsgFlow_c::checkOpenDoor(fopAc_ac_c* i_speaker_p, int* param_2) {
|
||||
break;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
u16 query_ret;
|
||||
if (branch_node->query_idx >= dusk::flow::kCustomQueryMin) {
|
||||
query_ret = dusk::flow::dispatch_query(branch_node->query_idx, i_speaker_p,
|
||||
branch_node->param, branch_node->result_count, FLOW_QUERY_PHASE_PROBE, nodeIdx);
|
||||
} else if (branch_node->query_idx < FLOW_QUERY_BUILTIN_COUNT) {
|
||||
query_ret =
|
||||
(this->*mQueryList[branch_node->query_idx])(branch_node, i_speaker_p, 0);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
#else
|
||||
u16 query_ret = (this->*mQueryList[branch_node->query_idx])(branch_node, i_speaker_p, 0);
|
||||
#endif
|
||||
u16 spE = branch_node->next_node_idx + query_ret;
|
||||
#if TARGET_PC
|
||||
if (!resolve_flow_edge(spE, nodeIdx)) {
|
||||
nodeIdx = 0xffff;
|
||||
}
|
||||
#else
|
||||
nodeIdx = mFlowIdxTBL[spE];
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case NODETYPE_EVENT_e: {
|
||||
#if TARGET_PC
|
||||
mesg_flow_node_event resolved{};
|
||||
std::memcpy(&resolved, resolvedData.bytes, sizeof(resolved));
|
||||
event_node = &resolved;
|
||||
#else
|
||||
event_node = &mFlowNodeTBL[nodeIdx].event;
|
||||
#endif
|
||||
|
||||
switch(event_node->event_idx) {
|
||||
case 12:
|
||||
@@ -151,7 +232,13 @@ int dMsgFlow_c::checkOpenDoor(fopAc_ac_c* i_speaker_p, int* param_2) {
|
||||
var_r25 = TRUE;
|
||||
break;
|
||||
default:
|
||||
#if TARGET_PC
|
||||
if (!resolve_flow_edge(event_node->next_node_idx, nodeIdx)) {
|
||||
nodeIdx = 0xffff;
|
||||
}
|
||||
#else
|
||||
nodeIdx = mFlowIdxTBL[event_node->next_node_idx];
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -311,6 +398,10 @@ void dMsgFlow_c::setInitValueGroupChange(int i_msgNo, fopAc_ac_c** i_talkPartner
|
||||
u16 var_r28 = i_msgNo;
|
||||
|
||||
dMsgObject_changeFlowGroup(i_msgNo);
|
||||
#if TARGET_PC
|
||||
dusk::flow::bind_resource(dMsgObject_getMsgDtPtr(),
|
||||
i_msgNo >= 3000 ? 0 : static_cast<u16>(dMsgObject_getGroupID()));
|
||||
#endif
|
||||
setInitValue(0);
|
||||
|
||||
mFlow_p = getMsgDataBlock("FLW1");
|
||||
@@ -387,7 +478,16 @@ void dMsgFlow_c::setNodeIndex(u16 i_nodeIdx, fopAc_ac_c** i_talkPartners) {
|
||||
dMsgObject_endFlowGroup();
|
||||
field_0x26 = 1;
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
FlowNodeData resolvedData{};
|
||||
if (!dusk::flow::resolve_node(dMsgObject_getMsgDtPtr(), i_nodeIdx, resolvedData)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return;
|
||||
}
|
||||
switch (resolvedData.bytes[0]) {
|
||||
#else
|
||||
switch (mFlowNodeTBL[i_nodeIdx].message.type) {
|
||||
#endif
|
||||
case 0:
|
||||
break;
|
||||
case NODETYPE_MESSAGE_e:
|
||||
@@ -397,7 +497,13 @@ void dMsgFlow_c::setNodeIndex(u16 i_nodeIdx, fopAc_ac_c** i_talkPartners) {
|
||||
break;
|
||||
case NODETYPE_EVENT_e:
|
||||
mesg_flow_node_event* node = NULL;
|
||||
#if TARGET_PC
|
||||
mesg_flow_node_event resolved{};
|
||||
std::memcpy(&resolved, resolvedData.bytes, sizeof(resolved));
|
||||
node = &resolved;
|
||||
#else
|
||||
node = &mFlowNodeTBL[i_nodeIdx].event;
|
||||
#endif
|
||||
|
||||
if (node->event_idx == 21 || node->event_idx == 32 || node->event_idx == 33) {
|
||||
if (node->event_idx == 21) {
|
||||
@@ -447,13 +553,24 @@ int dMsgFlow_c::setSelectMsg(mesg_flow_node* i_flowNode_p, mesg_flow_node* param
|
||||
|
||||
mesg_flow_node* var_r29 = NULL;
|
||||
|
||||
#if TARGET_PC
|
||||
MessageEntryData selectionEntry{};
|
||||
MessageEntryData messageEntry{};
|
||||
if (!resolve_flow_message(param_2->msg_index, selectionEntry) ||
|
||||
!resolve_flow_message(i_flowNode_p->msg_index, messageEntry))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
temp_r25 = message_id(selectionEntry);
|
||||
msg_no = message_id(messageEntry);
|
||||
#else
|
||||
inf_p = (BE(u16)*)getMsgDataBlock("INF1");
|
||||
|
||||
var_r29 = param_2;
|
||||
temp_r25 = ((inf_p + (var_r29->msg_index) * 10))[10];
|
||||
|
||||
var_r29 = i_flowNode_p;
|
||||
msg_no = ((inf_p + (var_r29->msg_index) * 10))[10];
|
||||
#endif
|
||||
|
||||
// "Message Set (Select)"
|
||||
OS_REPORT("\x1B[44;37mメッセ−ジセット(選択) \x1B[m|:");
|
||||
@@ -495,9 +612,17 @@ int dMsgFlow_c::setNormalMsg(mesg_flow_node* i_flowNode_p, fopAc_ac_c* i_speaker
|
||||
mesg_flow_node* var_r29 = NULL;
|
||||
u16 msg_no;
|
||||
|
||||
#if TARGET_PC
|
||||
MessageEntryData messageEntry{};
|
||||
if (!resolve_flow_message(i_flowNode_p->msg_index, messageEntry)) {
|
||||
return 0;
|
||||
}
|
||||
msg_no = message_id(messageEntry);
|
||||
#else
|
||||
var_r29 = i_flowNode_p;
|
||||
inf_p = (BE(u16)*)getMsgDataBlock("INF1");
|
||||
msg_no = (inf_p + (var_r29->msg_index) * 10)[10];
|
||||
#endif
|
||||
|
||||
// "Message Set"
|
||||
OS_REPORT("\x1B[44;37mメッセ−ジセット \x1B[m|:");
|
||||
@@ -536,13 +661,45 @@ int dMsgFlow_c::setNormalMsg(mesg_flow_node* i_flowNode_p, fopAc_ac_c* i_speaker
|
||||
|
||||
int dMsgFlow_c::messageNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPartners) {
|
||||
mesg_flow_node* flowNode_p = NULL;
|
||||
#if TARGET_PC
|
||||
mesg_flow_node resolvedFlowNode{};
|
||||
if (!resolve_flow_node(mNodeIdx, resolvedFlowNode)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
flowNode_p = &resolvedFlowNode;
|
||||
#else
|
||||
flowNode_p = &mFlowNodeTBL[mNodeIdx].message;
|
||||
#endif
|
||||
|
||||
if (field_0x25 != 0) {
|
||||
if (mSelType != SELTYPE_NONE_e) {
|
||||
u16 aNextNodeIndex = flowNode_p->next_node_idx;
|
||||
JUT_ASSERT(1051, 0xFFFF != aNextNodeIndex);
|
||||
|
||||
#if TARGET_PC
|
||||
mesg_flow_node nextNode{};
|
||||
if (!resolve_flow_node(aNextNodeIndex, nextNode)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
if (mSelType == SELTYPE_VERTICAL_e && nextNode.type == NODETYPE_MESSAGE_e) {
|
||||
if (setSelectMsg(flowNode_p, &nextNode, i_speaker_p)) {
|
||||
mNodeIdx = aNextNodeIndex;
|
||||
mSelType = SELTYPE_NONE_e;
|
||||
field_0x25 = 0;
|
||||
}
|
||||
} else if (mSelType == SELTYPE_HORIZONTAL_e && nextNode.type == NODETYPE_BRANCH_e) {
|
||||
if (setNormalMsg(flowNode_p, i_speaker_p)) {
|
||||
mSelType = SELTYPE_NONE_e;
|
||||
field_0x25 = 0;
|
||||
}
|
||||
} else {
|
||||
OS_REPORT("★sel select mesg ===> %d, %d, %d\n", mSelType, aNextNodeIndex, nextNode.type);
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
if (mSelType == SELTYPE_VERTICAL_e && mFlowNodeTBL[aNextNodeIndex].message.type == NODETYPE_MESSAGE_e) {
|
||||
JUT_ASSERT(1056, NODETYPE_MESSAGE_e == mFlowNodeTBL[aNextNodeIndex].message.type);
|
||||
if (setSelectMsg(&mFlowNodeTBL[mNodeIdx].message, &mFlowNodeTBL[aNextNodeIndex].message, i_speaker_p)) {
|
||||
@@ -559,8 +716,13 @@ int dMsgFlow_c::messageNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPart
|
||||
OS_REPORT("★sel select mesg ===> %d, %d, %d\n", mSelType, aNextNodeIndex, mFlowNodeTBL[aNextNodeIndex].message.type);
|
||||
JUT_ASSERT(1077, FALSE);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
if (setNormalMsg(flowNode_p, i_speaker_p)) {
|
||||
#else
|
||||
if (setNormalMsg(&mFlowNodeTBL[mNodeIdx].message, i_speaker_p)) {
|
||||
#endif
|
||||
field_0x25 = 0;
|
||||
}
|
||||
}
|
||||
@@ -609,8 +771,20 @@ int dMsgFlow_c::messageNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPart
|
||||
case 18:
|
||||
setNodeIndex(flowNode_p->next_node_idx, i_talkPartners);
|
||||
|
||||
#if TARGET_PC
|
||||
if (flowNode_p->next_node_idx == 0xffff) {
|
||||
return 1;
|
||||
}
|
||||
mesg_flow_node resolvedNext{};
|
||||
if (!resolve_flow_node(flowNode_p->next_node_idx, resolvedNext)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
mesg_flow_node* var_r26 = &resolvedNext;
|
||||
#else
|
||||
mesg_flow_node* var_r26 = &mFlowNodeTBL[flowNode_p->next_node_idx].message;
|
||||
if (var_r26->field_0x1 == 0x15 || var_r26->field_0x1 == 0x20 || var_r26->field_0x1 == 0x21) {
|
||||
#endif
|
||||
if (var_r26->subtype == 0x15 || var_r26->subtype == 0x20 || var_r26->subtype == 0x21) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -623,23 +797,81 @@ int dMsgFlow_c::messageNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPart
|
||||
|
||||
int dMsgFlow_c::branchNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPartners) {
|
||||
mesg_flow_node_branch* node = NULL;
|
||||
#if TARGET_PC
|
||||
mesg_flow_node_branch resolvedNode{};
|
||||
if (!resolve_flow_node(mNodeIdx, resolvedNode)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
node = &resolvedNode;
|
||||
u16 proc_status;
|
||||
if (node->query_idx >= dusk::flow::kCustomQueryMin) {
|
||||
proc_status = dusk::flow::dispatch_query(node->query_idx, i_speaker_p, node->param,
|
||||
node->result_count, FLOW_QUERY_PHASE_EXECUTE, mNodeIdx);
|
||||
} else if (node->query_idx < FLOW_QUERY_BUILTIN_COUNT) {
|
||||
proc_status = (this->*mQueryList[node->query_idx])(node, i_speaker_p, 1);
|
||||
} else {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
node = &mFlowNodeTBL[mNodeIdx].branch;
|
||||
u16 proc_status = (this->*mQueryList[node->query_idx])(node, i_speaker_p, 1);
|
||||
#endif
|
||||
|
||||
u16 var_r28 = node->next_node_idx + proc_status;
|
||||
#if TARGET_PC
|
||||
u16 target = 0xffff;
|
||||
resolve_flow_edge(var_r28, target);
|
||||
setNodeIndex(target, i_talkPartners);
|
||||
#else
|
||||
setNodeIndex(mFlowIdxTBL[var_r28], i_talkPartners);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dMsgFlow_c::eventNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPartners) {
|
||||
mesg_flow_node_event* node = NULL;
|
||||
#if TARGET_PC
|
||||
mesg_flow_node_event resolvedNode{};
|
||||
if (!resolve_flow_node(mNodeIdx, resolvedNode)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
node = &resolvedNode;
|
||||
int proc_status = 1;
|
||||
if (node->event_idx >= dusk::flow::kCustomEventMin) {
|
||||
dusk::flow::dispatch_event(node->event_idx, i_speaker_p, node->params);
|
||||
} else if (node->event_idx < FLOW_EVENT_BUILTIN_COUNT) {
|
||||
proc_status = (this->*mEventList[node->event_idx])(node, i_speaker_p);
|
||||
} else {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
node = &mFlowNodeTBL[mNodeIdx].event;
|
||||
int proc_status = (this->*mEventList[node->event_idx])(node, i_speaker_p);
|
||||
#endif
|
||||
|
||||
#if TARGET_PC
|
||||
if (node->event_idx >= dusk::flow::kCustomEventMin) {
|
||||
u16 target = 0xffff;
|
||||
resolve_flow_edge(node->next_node_idx, target);
|
||||
setNodeIndex(target, i_talkPartners);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (node->event_idx) {
|
||||
case 8: {
|
||||
getParam(&mEventId, &field_0x30, node->params);
|
||||
#if TARGET_PC
|
||||
u16 target = 0xffff;
|
||||
resolve_flow_edge(node->next_node_idx, target);
|
||||
setNodeIndex(target, i_talkPartners);
|
||||
#else
|
||||
setNodeIndex(mFlowIdxTBL[node->next_node_idx], i_talkPartners);
|
||||
#endif
|
||||
|
||||
if (field_0x26 != 0) {
|
||||
break;
|
||||
@@ -684,7 +916,13 @@ int dMsgFlow_c::eventNodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPartne
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
#if TARGET_PC
|
||||
u16 target = 0xffff;
|
||||
resolve_flow_edge(node->next_node_idx, target);
|
||||
setNodeIndex(target, i_talkPartners);
|
||||
#else
|
||||
setNodeIndex(mFlowIdxTBL[node->next_node_idx], i_talkPartners);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -705,7 +943,16 @@ int dMsgFlow_c::nodeProc(fopAc_ac_c* i_speaker_p, fopAc_ac_c** i_talkPartners) {
|
||||
aSpeaker_p = i_talkPartners[field_0x38];
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
FlowNodeData resolvedNode{};
|
||||
if (!dusk::flow::resolve_node(dMsgObject_getMsgDtPtr(), mNodeIdx, resolvedNode)) {
|
||||
setNodeIndex(0xffff, i_talkPartners);
|
||||
break;
|
||||
}
|
||||
u8 type = resolvedNode.bytes[0];
|
||||
#else
|
||||
u8 type = mFlowNodeTBL[mNodeIdx].message.type;
|
||||
#endif
|
||||
switch (type) {
|
||||
case NODETYPE_MESSAGE_e:
|
||||
proc_status = messageNodeProc(aSpeaker_p, i_talkPartners);
|
||||
|
||||
+122
-26
@@ -30,13 +30,15 @@
|
||||
#include "m_Do/m_Do_lib.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <vector>
|
||||
#include "dusk/language.hpp"
|
||||
#include "dusk/logging.h"
|
||||
#include "dusk/menu_pointer.h"
|
||||
#include "dusk/mods/svc/flow.hpp"
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/version.hpp"
|
||||
#include <vector>
|
||||
#include <array>
|
||||
#include <algorithm>
|
||||
#endif
|
||||
|
||||
static void dMsgObject_addFundRaising(s16 param_0);
|
||||
@@ -324,7 +326,7 @@ int dMsgObject_c::_create(msg_class* param_1) {
|
||||
|
||||
field_0x124 = NULL;
|
||||
field_0x100 = param_1;
|
||||
field_0x16c = -1;
|
||||
mCurrentGroupID = -1;
|
||||
field_0x16e = -1;
|
||||
mNowTalkFlowNo = 0;
|
||||
mpTalkActor = NULL;
|
||||
@@ -411,7 +413,7 @@ int dMsgObject_c::_create(msg_class* param_1) {
|
||||
field_0x197 = 0;
|
||||
mMessageID = 1000;
|
||||
field_0x158 = mMessageID;
|
||||
field_0x15c = 0;
|
||||
mSelectMessageID = 0;
|
||||
field_0x172 = 0;
|
||||
setStatusLocal(1);
|
||||
mpMsgString = JKR_NEW dMsgString_c();
|
||||
@@ -679,14 +681,14 @@ static u32 getMirrorMsgOverride(u32 msgId) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void dMsgObject_c::setMessageIndex(u32 revoIndex, u32 param_2, bool param_3) {
|
||||
void dMsgObject_c::setMessageIndex(u32 revoIndex, u32 i_selectMsgID, bool param_3) {
|
||||
field_0x158 = revoIndex;
|
||||
revoIndex = getRevoMessageIndex(revoIndex);
|
||||
if (field_0x4cc == 0) {
|
||||
mNoDemoFlag = 1;
|
||||
}
|
||||
mMessageID = revoIndex;
|
||||
field_0x15c = param_2;
|
||||
mSelectMessageID = i_selectMsgID;
|
||||
field_0x4d1 = 0;
|
||||
if (mpTalkPartner != field_0x13c && mpTalkPartner != NULL) {
|
||||
dComIfGp_event_setTalkPartner(mpTalkPartner);
|
||||
@@ -701,12 +703,58 @@ void dMsgObject_c::setMessageIndex(u32 revoIndex, u32 param_2, bool param_3) {
|
||||
|
||||
JMSMesgInfo_c* pMsg = (JMSMesgInfo_c*)((char*)mpMsgDt + 0x20);
|
||||
u8* iVar2 = (u8*)pMsg + pMsg->header.size;
|
||||
u32 msg_id = getMessageIndex(revoIndex);
|
||||
dComIfGp_setMesgCameraAttrInfo(pMsg->entries[msg_id].camera_id);
|
||||
if (field_0x15c == 1000) {
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
#if TARGET_PC
|
||||
const void* customEntry = NULL;
|
||||
const char* customText = NULL;
|
||||
u16 customGroup = 0;
|
||||
if (dusk::flow::custom_message_group(static_cast<u16>(revoIndex), customGroup)) {
|
||||
if (dusk::flow::custom_message_for_control(
|
||||
mpCtrl, static_cast<u16>(revoIndex), customEntry, customText))
|
||||
{
|
||||
dComIfGp_setMesgCameraAttrInfo(static_cast<const u8*>(customEntry)[0x0f]);
|
||||
}
|
||||
} else {
|
||||
u32 msgIndex = getMessageIndex(field_0x15c);
|
||||
#endif
|
||||
u32 msg_id = getMessageIndex(revoIndex);
|
||||
dComIfGp_setMesgCameraAttrInfo(pMsg->entries[msg_id].camera_attr);
|
||||
#if TARGET_PC
|
||||
}
|
||||
const auto setSelectionMessage = [&] {
|
||||
const void* selectionEntry = NULL;
|
||||
const char* selectionText = NULL;
|
||||
u16 selectionGroup = 0;
|
||||
if (dusk::flow::custom_message_group(static_cast<u16>(mSelectMessageID), selectionGroup)) {
|
||||
if (dusk::flow::custom_message_for_control(
|
||||
mpCtrl, static_cast<u16>(mSelectMessageID), selectionEntry, selectionText))
|
||||
{
|
||||
mpRefer->setSelMsgPtr(const_cast<char*>(selectionText));
|
||||
} else {
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
u32 msgIndex = getMessageIndex(mSelectMessageID);
|
||||
if (msgIndex == 0x264) {
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
return;
|
||||
}
|
||||
char* nativeText = (char*)(iVar2 + pMsg->entries[msgIndex].string_offset + 8);
|
||||
const void* resolvedEntry = &pMsg->entries[msgIndex];
|
||||
const char* resolvedText = nativeText;
|
||||
dusk::flow::resolve_message_for_control(mpCtrl, mpMsgDt, static_cast<u16>(msgIndex),
|
||||
resolvedEntry, nativeText, resolvedEntry, resolvedText);
|
||||
mpRefer->setSelMsgPtr(const_cast<char*>(resolvedText));
|
||||
};
|
||||
#endif
|
||||
if (mSelectMessageID == 1000) {
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
#if TARGET_PC
|
||||
} else {
|
||||
setSelectionMessage();
|
||||
}
|
||||
#else
|
||||
} else {
|
||||
u32 msgIndex = getMessageIndex(mSelectMessageID);
|
||||
if (msgIndex == 0x264) {
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
} else {
|
||||
@@ -714,6 +762,7 @@ void dMsgObject_c::setMessageIndex(u32 revoIndex, u32 param_2, bool param_3) {
|
||||
mpRefer->setSelMsgPtr(my_ptr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (param_3) {
|
||||
mpCtrl->setMessageID(mMessageID, 0, NULL);
|
||||
}
|
||||
@@ -726,7 +775,7 @@ void dMsgObject_c::setMessageIndexDemo(u32 revoMsgIndex, bool param_2) {
|
||||
field_0x4d4 = 1;
|
||||
dMsgObject_onCameraCancelFlag();
|
||||
mMessageID = revoMsgIndex;
|
||||
field_0x15c = 0x264;
|
||||
mSelectMessageID = 0x264;
|
||||
field_0x4d1 = 0;
|
||||
if (mpTalkPartner != field_0x13c && mpTalkPartner != NULL) {
|
||||
dComIfGp_event_setTalkPartner(mpTalkPartner);
|
||||
@@ -740,8 +789,23 @@ void dMsgObject_c::setMessageIndexDemo(u32 revoMsgIndex, bool param_2) {
|
||||
mpRefer->setPageNum(field_0x172);
|
||||
JMSMesgInfo_c* info_header_p = (JMSMesgInfo_c*)((char*)mpMsgDt + 0x20);
|
||||
JMSMesgInfo_c* reg_25 = (JMSMesgInfo_c*)((char*) info_header_p + info_header_p->header.size);
|
||||
#if TARGET_PC
|
||||
const void* customEntry = NULL;
|
||||
const char* customText = NULL;
|
||||
u16 customGroup = 0;
|
||||
if (dusk::flow::custom_message_group(static_cast<u16>(revoMsgIndex), customGroup)) {
|
||||
if (dusk::flow::custom_message_for_control(
|
||||
mpCtrl, static_cast<u16>(revoMsgIndex), customEntry, customText))
|
||||
{
|
||||
dComIfGp_setMesgCameraAttrInfo(static_cast<const u8*>(customEntry)[0x0f]);
|
||||
}
|
||||
} else {
|
||||
#endif
|
||||
int ind = getMessageIndex(revoMsgIndex);
|
||||
dComIfGp_setMesgCameraAttrInfo(info_header_p->entries[ind].camera_id);
|
||||
dComIfGp_setMesgCameraAttrInfo(info_header_p->entries[ind].camera_attr);
|
||||
#if TARGET_PC
|
||||
}
|
||||
#endif
|
||||
mpRefer->setSelMsgPtr(NULL);
|
||||
if (param_2) {
|
||||
mpCtrl->setMessageID(mMessageID, 0, NULL);
|
||||
@@ -767,10 +831,21 @@ u32 dMsgObject_c::getMessageIndex(u32 param_0) {
|
||||
}
|
||||
|
||||
u32 dMsgObject_c::getRevoMessageIndex(u32 param_1) {
|
||||
#if TARGET_PC
|
||||
if (!dusk::getSettings().game.enableMirrorMode) {
|
||||
if (!g_MsgObject_HIO_c.mMessageDisplay) { return param_1; } }
|
||||
if (param_1 == getMirrorMsgOverride(param_1)) { return param_1; }
|
||||
#if TARGET_PC
|
||||
u16 customGroup = 0;
|
||||
if (param_1 <= 0xffff &&
|
||||
dusk::flow::custom_message_group(static_cast<u16>(param_1), customGroup))
|
||||
{
|
||||
return param_1;
|
||||
}
|
||||
if (!dusk::getSettings().game.enableMirrorMode) {
|
||||
if (!g_MsgObject_HIO_c.mMessageDisplay) {
|
||||
return param_1;
|
||||
}
|
||||
}
|
||||
if (param_1 == getMirrorMsgOverride(param_1)) {
|
||||
return param_1;
|
||||
}
|
||||
#else
|
||||
if (!g_MsgObject_HIO_c.mMessageDisplay) { return param_1; }
|
||||
#endif
|
||||
@@ -826,6 +901,14 @@ u32 dMsgObject_c::getMessageIDAlways(u32 param_0) {
|
||||
}
|
||||
|
||||
s16 dMsgObject_c::getMessageGroup(u32 param_0) {
|
||||
#if TARGET_PC
|
||||
u16 customGroup = 0;
|
||||
if (param_0 <= 0xffff &&
|
||||
dusk::flow::custom_message_group(static_cast<u16>(param_0), customGroup))
|
||||
{
|
||||
return static_cast<s16>(customGroup);
|
||||
}
|
||||
#endif
|
||||
s16 messageGroup = 0;
|
||||
OS_REPORT("getMessgeGroup! msg no====>%d\n", param_0);
|
||||
if (param_0 > 5000) {
|
||||
@@ -852,7 +935,7 @@ void dMsgObject_c::waitProc() {
|
||||
if (mMessageID >= 0x47f && mMessageID <= 0x487) {
|
||||
setMessageIndexDemo(mMessageID, true);
|
||||
} else {
|
||||
setMessageIndex(mMessageID, field_0x15c, true);
|
||||
setMessageIndex(mMessageID, mSelectMessageID, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1099,7 +1182,7 @@ void dMsgObject_c::continueProc() {
|
||||
field_0x199 = 0;
|
||||
updateEquipBombInfoLocal();
|
||||
offAutoMessageFlagLocal();
|
||||
setMessageIndex(field_0x100->msg_idx, field_0x100->field_0xf0, true);
|
||||
setMessageIndex(field_0x100->msg_idx, field_0x100->select_msg_idx, true);
|
||||
mpScrnDraw->fukiPosCalc(pRef->getFukiPosType());
|
||||
SAFE_STRCPY(pRef->getTextPtr(), "");
|
||||
SAFE_STRCPY(pRef->getTextSPtr(), "");
|
||||
@@ -1351,7 +1434,7 @@ void dMsgObject_c::endProc() {
|
||||
}
|
||||
mMessageID = 0;
|
||||
field_0x158 = mMessageID;
|
||||
field_0x15c = 1000;
|
||||
mSelectMessageID = 1000;
|
||||
field_0x172 = 0;
|
||||
field_0x199 = 0;
|
||||
mpRefer->setPageNum(field_0x172);
|
||||
@@ -1423,12 +1506,22 @@ void dMsgObject_c::talkStartInit() {
|
||||
field_0x19b = 0;
|
||||
bool bVar1 = false;
|
||||
if (mFukiKind != mpRefer->getFukiKind()) {
|
||||
#if TARGET_PC
|
||||
// Safety check if MESSAGE_BOX_NOTICE is requested during a conversation
|
||||
if (mpScrnDraw != NULL && mpRefer->getFukiKind() == 15 &&
|
||||
dComIfGp_isHeapLockFlag() == 5) {
|
||||
DuskLog.error("MESSAGE_BOX_NOTICE cannot be created during a conversation\n");
|
||||
} else {
|
||||
#endif
|
||||
if (mpScrnDraw != NULL) {
|
||||
delete_screen(false);
|
||||
dVar19 = 1.0f;
|
||||
bVar1 = true;
|
||||
}
|
||||
mFukiKind = mpRefer->getFukiKind();
|
||||
#if TARGET_PC
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (dComIfGp_isHeapLockFlag() == 8 ||
|
||||
(dComIfGp_isHeapLockFlag() == 5 && dMeter2Info_isFloatingMessageVisible() && !field_0x4cd))
|
||||
@@ -1782,25 +1875,28 @@ void dMsgObject_c::endFlowGroupLocal() {
|
||||
|
||||
void dMsgObject_c::changeGroupLocal(s16 param_1) {
|
||||
JKRHeap* prevHeap = mDoExt_setCurrentHeap(dComIfGp_getMsgExpHeap());
|
||||
if (field_0x16c != param_1) {
|
||||
if (mCurrentGroupID != param_1) {
|
||||
if (mFlowChk != 0) {
|
||||
JUT_ASSERT(3688, mFlowChk != 2);
|
||||
mFlowChk = 2;
|
||||
}
|
||||
OS_REPORT("group change =====> %d\n", param_1);
|
||||
if (param_1 >= 1) {
|
||||
OS_REPORT("bmg data change =====> %d --> %d\n", field_0x16c, param_1);
|
||||
if (field_0x16c == 0) {
|
||||
OS_REPORT("bmg data change =====> %d --> %d\n", mCurrentGroupID, param_1);
|
||||
if (mCurrentGroupID == 0) {
|
||||
field_0x19d = 1;
|
||||
}
|
||||
mpMsgDt = dMeter2Info_getStageMsgResource();
|
||||
} else {
|
||||
mpMsgDt = mpMsgRes;
|
||||
}
|
||||
if (field_0x16c >= 0) {
|
||||
if (mCurrentGroupID >= 0) {
|
||||
field_0x124->parse(mpMsgDt, 0x80);
|
||||
}
|
||||
field_0x16c = param_1;
|
||||
#if TARGET_PC
|
||||
dusk::flow::bind_resource(mpMsgDt, static_cast<u16>(param_1));
|
||||
#endif
|
||||
mCurrentGroupID = param_1;
|
||||
}
|
||||
mDoExt_setCurrentHeap(prevHeap);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,81 @@
|
||||
#pragma once
|
||||
|
||||
#include "helpers/bits.hpp"
|
||||
#include "mods/svc/flow.h"
|
||||
#include "mods/svc/message.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace JMessage {
|
||||
struct TControl;
|
||||
struct TProcessor;
|
||||
struct TResource;
|
||||
} // namespace JMessage
|
||||
|
||||
namespace dusk::flow {
|
||||
|
||||
inline constexpr uint16_t kCustomNodeMin = 0x8000;
|
||||
inline constexpr uint16_t kCustomEdgeMin = 0x8000;
|
||||
inline constexpr uint16_t kCustomMessageMin = 0x8000;
|
||||
inline constexpr uint16_t kCustomMessageMax = 0xfeff;
|
||||
inline constexpr uint16_t kCustomQueryMin = 0x8000;
|
||||
inline constexpr uint8_t kCustomEventMin = 0x80;
|
||||
inline constexpr uint16_t kEnd = 0xffff;
|
||||
|
||||
/* Associates a parsed BMG resource with its service group and validates its reserved ranges. */
|
||||
bool bind_resource(const void* bmgData, uint16_t group);
|
||||
|
||||
/* All resolver outputs are copies so callbacks may mutate service registrations safely. */
|
||||
bool resolve_node(const void* bmgData, uint16_t nodeIndex, FlowNodeData& outNode);
|
||||
bool resolve_edge(const void* bmgData, uint16_t edgeIndex, uint16_t& outTarget);
|
||||
bool resolve_message_entry(
|
||||
const void* bmgData, uint16_t messageIndex, MessageEntryData& outEntry);
|
||||
|
||||
uint16_t dispatch_query(uint16_t queryId, const void* speakerActor, uint16_t parameter,
|
||||
uint8_t resultCount, FlowQueryPhase phase, uint16_t nodeIndex);
|
||||
void dispatch_event(uint8_t eventId, const void* speakerActor, const uint8_t parameters[4]);
|
||||
|
||||
bool custom_message_group(uint16_t messageId, uint16_t& outGroup);
|
||||
bool custom_message_for_control(
|
||||
JMessage::TControl* control, uint16_t messageId, const void*& outEntry, const char*& outText);
|
||||
|
||||
/* JMessage bridges. Return true when the service supplied a custom or overridden value. */
|
||||
bool message_code_for_id(
|
||||
const JMessage::TProcessor* processor, uint32_t messageId, uint32_t& outCode);
|
||||
bool custom_message_for_processor(JMessage::TControl* control,
|
||||
const JMessage::TProcessor* processor, uint16_t messageIndex,
|
||||
const JMessage::TResource*& outResource, const void*& outEntry, const char*& outText);
|
||||
bool resolve_message_for_control(JMessage::TControl* control, const void* bmgData,
|
||||
uint16_t messageIndex, const void* nativeEntry, const char* nativeText, const void*& outEntry,
|
||||
const char*& outText);
|
||||
bool resolve_message(const JMessage::TProcessor* processor, const void* bmgData,
|
||||
uint16_t messageIndex, const void* nativeEntry, const char* nativeText, const void*& outEntry,
|
||||
const char*& outText);
|
||||
void release_message_control(const JMessage::TControl* control);
|
||||
void release_message_processor(const JMessage::TProcessor* processor);
|
||||
|
||||
namespace detail {
|
||||
inline bool find_section(
|
||||
const uint8_t* bmg, uint32_t tag, const uint8_t*& outSection, size_t& outSize) {
|
||||
const uint32_t sectionCount = read_bits<uint32_t>(bmg + 0x0c);
|
||||
size_t offset = 0x20;
|
||||
for (uint32_t i = 0; i < sectionCount; ++i) {
|
||||
if (offset > std::numeric_limits<size_t>::max() - 8) {
|
||||
return false;
|
||||
}
|
||||
const size_t sectionSize = read_bits<uint32_t>(bmg + offset + 4);
|
||||
if (sectionSize < 8 || offset > std::numeric_limits<size_t>::max() - sectionSize) {
|
||||
return false;
|
||||
}
|
||||
if (read_bits<uint32_t>(bmg + offset) == tag) {
|
||||
outSection = bmg + offset;
|
||||
outSize = sectionSize;
|
||||
return true;
|
||||
}
|
||||
offset += sectionSize;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
} // namespace dusk::flow
|
||||
@@ -222,6 +222,8 @@ void ModLoader::init_services() {
|
||||
&svc::g_saveModule,
|
||||
&svc::g_stageModule,
|
||||
&svc::g_itemModule,
|
||||
&svc::g_flowModule,
|
||||
&svc::g_messageModule,
|
||||
})
|
||||
{
|
||||
svc::register_module(*module);
|
||||
|
||||
@@ -80,5 +80,7 @@ extern const ServiceModule g_gfxModule;
|
||||
extern const ServiceModule g_saveModule;
|
||||
extern const ServiceModule g_stageModule;
|
||||
extern const ServiceModule g_itemModule;
|
||||
extern const ServiceModule g_flowModule;
|
||||
extern const ServiceModule g_messageModule;
|
||||
|
||||
} // namespace dusk::mods::svc
|
||||
|
||||
@@ -88,7 +88,7 @@ int fopMsg_Create(void* i_this) {
|
||||
a_this->talk_actor = append->talk_actor;
|
||||
a_this->pos = append->pos;
|
||||
a_this->msg_idx = append->msg_idx;
|
||||
a_this->field_0xf0 = append->field_0x14;
|
||||
a_this->select_msg_idx = append->select_msg_idx;
|
||||
a_this->field_0xf4 = append->field_0x18;
|
||||
}
|
||||
}
|
||||
|
||||
+15
-15
@@ -31,7 +31,7 @@ void fopMsgM_Delete(void* i_this) {
|
||||
}
|
||||
|
||||
static fopMsg_prm_class* createAppend(fopAc_ac_c* i_talkActor, cXyz* i_pos, u32* i_msgIdx,
|
||||
u32* param_3, fpc_ProcID param_4) {
|
||||
u32* i_selectMsgIdx, fpc_ProcID param_4) {
|
||||
fopMsg_prm_class* append = (fopMsg_prm_class*)cMl::memalignB(-4, sizeof(fopMsg_prm_class));
|
||||
if (append == NULL) {
|
||||
return NULL;
|
||||
@@ -46,10 +46,10 @@ static fopMsg_prm_class* createAppend(fopAc_ac_c* i_talkActor, cXyz* i_pos, u32*
|
||||
i_msgIdx = NULL;
|
||||
}
|
||||
|
||||
if (param_3 != NULL) {
|
||||
append->field_0x14 = *param_3;
|
||||
if (i_selectMsgIdx != NULL) {
|
||||
append->select_msg_idx = *i_selectMsgIdx;
|
||||
} else {
|
||||
param_3 = NULL;
|
||||
i_selectMsgIdx = NULL;
|
||||
}
|
||||
|
||||
if (i_pos != NULL) {
|
||||
@@ -73,7 +73,7 @@ static fopMsg_prm_timer* createTimerAppend(int i_mode, u32 i_limitMs, u8 i_type,
|
||||
|
||||
appen->talk_actor = NULL;
|
||||
appen->msg_idx = 0;
|
||||
appen->field_0x14 = 0;
|
||||
appen->select_msg_idx = 0;
|
||||
appen->pos = cXyz(0.0f, 0.0f, 0.0f);
|
||||
appen->field_0x18 = param_8;
|
||||
appen->timer_mode = i_mode;
|
||||
@@ -88,9 +88,9 @@ static fopMsg_prm_timer* createTimerAppend(int i_mode, u32 i_limitMs, u8 i_type,
|
||||
}
|
||||
|
||||
fpc_ProcID fopMsgM_create(s16 i_procName, fopAc_ac_c* i_talkActor, cXyz* i_pos, u32* i_msgIdx,
|
||||
u32* param_4, FastCreateReqFunc i_createFunc) {
|
||||
u32* i_selectMsgIdx, FastCreateReqFunc i_createFunc) {
|
||||
fopMsg_prm_class* append =
|
||||
createAppend(i_talkActor, i_pos, i_msgIdx, param_4, fpcM_ERROR_PROCESS_ID_e);
|
||||
createAppend(i_talkActor, i_pos, i_msgIdx, i_selectMsgIdx, fpcM_ERROR_PROCESS_ID_e);
|
||||
if (append == NULL) {
|
||||
return fpcM_ERROR_PROCESS_ID_e;
|
||||
}
|
||||
@@ -115,7 +115,7 @@ void dummySet() {
|
||||
csXyz().set(0, 0, 0);
|
||||
}
|
||||
|
||||
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 param_2) {
|
||||
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 i_selectMsgIdx) {
|
||||
if (dComIfGp_isHeapLockFlag() == 8) {
|
||||
dMeter2Info_getMeterClass()->emphasisButtonDelete();
|
||||
}
|
||||
@@ -146,16 +146,16 @@ fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, fopAc_ac_c* i_talkActor, u32 param_2
|
||||
if (msg != NULL && msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
||||
msg->pos.set(pos);
|
||||
msg->msg_idx = i_msgIdx;
|
||||
msg->field_0xf0 = param_2;
|
||||
msg->select_msg_idx = i_selectMsgIdx;
|
||||
msg->talk_actor = i_talkActor;
|
||||
msg->setMessageIndex(i_msgIdx, param_2, false);
|
||||
msg->setMessageIndex(i_msgIdx, i_selectMsgIdx, false);
|
||||
return i_msgID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1) {
|
||||
fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 i_selectMsgIdx) {
|
||||
if (dComIfGp_isHeapLockFlag() == 8) {
|
||||
dMeter2Info_getMeterClass()->emphasisButtonDelete();
|
||||
}
|
||||
@@ -177,15 +177,15 @@ fpc_ProcID fopMsgM_messageSet(u32 i_msgIdx, u32 param_1) {
|
||||
if (msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
||||
msg->pos.set(pos);
|
||||
msg->msg_idx = i_msgIdx;
|
||||
msg->field_0xf0 = param_1;
|
||||
msg->select_msg_idx = i_selectMsgIdx;
|
||||
msg->talk_actor = actor;
|
||||
msg->setTalkPartner(NULL);
|
||||
msg->setMessageIndex(i_msgIdx, param_1, false);
|
||||
msg->setMessageIndex(i_msgIdx, i_selectMsgIdx, false);
|
||||
return i_msgID;
|
||||
} else if (msg->mode == fopMsg_MODE_MSG_CONTINUE_e) {
|
||||
msg->pos.set(pos);
|
||||
msg->msg_idx = i_msgIdx;
|
||||
msg->field_0xf0 = param_1;
|
||||
msg->select_msg_idx = i_selectMsgIdx;
|
||||
msg->talk_actor = actor;
|
||||
return i_msgID;
|
||||
}
|
||||
@@ -217,7 +217,7 @@ fpc_ProcID fopMsgM_messageSetDemo(u32 i_msgidx) {
|
||||
if (msg != NULL && msg->mode == fopMsg_MODE_MSG_PREPARING_e) {
|
||||
msg->pos.set(pos);
|
||||
msg->msg_idx = i_msgidx;
|
||||
msg->field_0xf0 = 1000;
|
||||
msg->select_msg_idx = 1000;
|
||||
msg->talk_actor = NULL_;
|
||||
msg->setMessageIndexDemo(i_msgidx, false);
|
||||
return i_msgID;
|
||||
|
||||
Reference in New Issue
Block a user