omgFIREBALLS Posted August 15, 2023 Posted August 15, 2023 (edited) A problem I encountered in my compilation efforts is that sometimes the skill check is associated with the node you end up at if you pass the check, and sometimes with the node you cannot press unless you pass the check. Typically the first kind exists in scripted interactions, and the second in regular conversations, but not always. This was mostly an annoyance that I handled by including the strings of both the nodes before and after the skill check node, thus providing enough context to figure out which one is really the check and perhaps "what it's all about" too. However, now that I want to add alternate ways to pass the check, I can no longer be in doubt about this. I've been trying to find a pattern to no avail. The bottom of my post has four JSON entries, from which I removed a few parameters they all had in common. The first one is for a wilderness scripted interaction on Maje Island, in which you can choose to search the area. re_si_wilder_trap.conversationbundle The second one is the node you arrive at if you choose to search the area with the Watcher and the Watcher has 1 survival. This is what my program will consider the node associated with the skill check, as the skill check is a conditional on that node. re_si_wilder_trap.conversationbundle The third one is for an interaction with Bekarna in TFS, in which you can impress her by passing a 19 Arcana check. The option isn't available if you don't have 19 Arcana. This is what my program will consider the node associated with the skill check, as the skill check is a conditional on that node. lax03_00_cv_bekarna.conversationbundle The fourth one is the node you reach after wooing her with the 19 Arcana line. lax03_00_cv_bekarna.conversationbundle Here are some of my discarded theories: PlayerResponseNode always leads to skill checks: Negative, there are such nodes where there is a skill check neither on the source nor target nodes. TalkNode is always the result of a skill check: Negative, same reason. If a TalkNode has conditions, it's the result of a skill check: Mayyyybe, but there are TalkNodes with check conditionals on themselves, who also have links to other nodes, with checks (even if not necessarily skill checks) attached to those links. Check 00_cv_ruanu.conversationbundle, node 277, for example. If this is the logic, it's hyper spaghetti. Update: This logic might be waterproof! If the prior node has the Void InteractionSelectPartyMember(Int32) stuff in it, it's the "real" node. If that doesn't exist, the skill check node itself is. Now in theory, there can be multiple prior nodes, and at times there are, but probably not in these cases... Search the area { "$type": "OEIFormats.FlowCharts.Conversations.PlayerResponseNode, OEIFormats", "Persistence": 3, "NodeID": 290, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 290, "ToNodeID": 73, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 290, "ToNodeID": 148, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 290, "ToNodeID": 74, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 290, "ToNodeID": 289, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 290, "ToNodeID": 286, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [] }, "OnEnterScripts": [ { "Data": { "FullName": "Void InteractionSelectPartyMember(Int32)", "Parameters": [ "0" ], "Flags": "", "UnrealCall": "", "FunctionHash": 997632775, "ParameterHash": 1233874279 }, "Conditional": { "Operator": 0, "Components": [] } } ], "OnExitScripts": [], "OnUpdateScripts": [] } Survival 1 Watcher skill check { "$type": "OEIFormats.FlowCharts.Conversations.TalkNode, OEIFormats", "EmotionType": "", "EmotionStrength": 0.5, "PersistEmotion": true, "EmotionDelay": 0.0, "SpeakerGuid": "6a99a109-0000-0000-0000-000000000000", "ListenerGuid": "b1a8e901-0000-0000-0000-000000000000", "ExternalVO": "", "HasVO": false, "Persistence": 0, "NodeID": 73, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 73, "ToNodeID": 75, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,6a99a109-0000-0000-0000-000000000000", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [ { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean AreGuidsSameObject(Guid, Guid)", "Parameters": [ "4e3d0000-0000-0000-0000-000000000000", "b1a8e901-0000-0000-0000-000000000000" ], "Flags": "", "UnrealCall": "", "FunctionHash": -2074419224, "ParameterHash": -790561223 }, "Not": false, "Operator": 0 }, { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean IsSkillValue(Guid, Guid, Operator, Int32, Boolean, Boolean)", "Parameters": [ "4e3d0000-0000-0000-0000-000000000000", "9c7962b8-bf69-4670-ba67-acc86a09fca8", "GreaterThanOrEqualTo", "1", "True", "False" ], "Flags": "", "UnrealCall": "", "FunctionHash": 193829831, "ParameterHash": 691694871 }, "Not": false, "Operator": 1 } ] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] } You can press me if you have Arcana 19 { "$type": "OEIFormats.FlowCharts.Conversations.PlayerResponseNode, OEIFormats", "Persistence": 3, "NodeID": 160, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 160, "ToNodeID": 163, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [ { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean IsSkillValue(Guid, Guid, Operator, Int32, Boolean, Boolean)", "Parameters": [ "b1a8e901-0000-0000-0000-000000000000", "e5f33551-ec5c-4cc8-b5f2-1eb03d210374", "GreaterThanOrEqualTo", "19", "True", "False" ], "Flags": "", "UnrealCall": "", "FunctionHash": 193829831, "ParameterHash": -409713188 }, "Not": false, "Operator": 0 } ] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] } Gellarde, a fellow nerd, sayeth Bekarna { "$type": "OEIFormats.FlowCharts.Conversations.TalkNode, OEIFormats", "EmotionType": "", "EmotionStrength": 0.5, "PersistEmotion": true, "EmotionDelay": 0.0, "SpeakerGuid": "934adb9c-d294-46b0-8dd7-5e6d79d7000d", "ListenerGuid": "b1a8e901-0000-0000-0000-000000000000", "ExternalVO": "", "HasVO": true, "Persistence": 0, "NodeID": 163, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 163, "ToNodeID": 146, "PointsToGhost": true, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,934adb9c-d294-46b0-8dd7-5e6d79d7000d", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] } Edited August 15, 2023 by omgFIREBALLS My Deadfire mods Out With The Good: The mod for tidying up your Deadfire combat tooltip. Waukeen's Berth: Make all your basic purchases at Queen's Berth. Carrying Voice: Wider chanter invocations. Nemnok's Congregation: Lets all priests express their true faith. Deadfire skill check catalogue right here!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now