ignus Posted August 16, 2018 Posted August 16, 2018 It is recommended that you bring along Rekke on this quest. I did and he didn't say one single word during the whole quest. So my question is, did I miss something? Anyone else had anything interesting happen with Rekke during this quest? 1
handsomenat Posted August 16, 2018 Posted August 16, 2018 Apparently you can present him to the king as an ambassador from Yezuha but I have no idea what triggers it. I tried leaving Tekehu and bringing just Rekke but he never chimed in 1
Tick Posted August 17, 2018 Posted August 17, 2018 In addition to what handsomenat said, I read that (at least some of the) the runes in the circle on the ground, in the main level of the quest, are in Seki, which is his native language. Originally a companion or companions were supposed to comment on it, but the developers couldn't add it because the voice actors had already done their voice acting by the time that part was going to be put in. So I suspect that Rekke would have initially added to that. 3
Zap Gun For Hire Posted August 17, 2018 Posted August 17, 2018 (edited) *does some deep deep deeeeeeeeep digging into the game code* Is that... Really? Aw, man. That's kinda funny. You need to either have an Aristocrat background or a Merchant background to fob off Rekke as your associate when talking to the king. Plus have a Diplomacy skill of 4 or greater If I read this right it goes something like this: [Node 200] (leads to several options) [King Waturi I]: "My great hall stands open for all who would pay fealty to their beloved king. [King Waturi I]: "Why are you here?" [Node 38] [Aristocrat] OR [Merchant] ONLY [Watcher]: "I am an emissary from a distant land come to seek your favor." [Node 169] (response) [King Waturi I]: "Ah, so the ants of other empires still scurry beyond my bounds." He gives you self-satisfied smile and reclines on his throne. [Node 82] (many possible options flow from this statement [and to it for that matter]) The king regards you with one eyebrow raised and a smug smile just forming on his lips. [Node 46] [Node 38 must have been played] + [Rekke must be in party] + [Diplomacy >= 4] [Watcher] "May I present my associate, Ambassador Rekke of Yezuha." The game then branches on whether or not Rekke knows Aedyran: If Rekke knows Aedyran: [Node 219] [Rekke] "What? Watcher - !" Alarm gives his voice a sharp edge. Which then goes on for a bit, but I don't want to go down all the branching trees. If folks want, I can look into it but I kinda don't want to spoil the surprise. ==== If Rekke doesn't know Aedyran, you get a negative relations hit with the King unless you have the Betrayal trinket and have already disguised yourself as his son. I think, as it's a conditional and I'm not entirely sure I'm reading it right. This appears to be a silent code check though, as the game doesn't make any comment on it. The King will make a comment about your mute friend, but not much else. Maia, if she's present, also makes a crack: [Maia] "Captain, I would love to know how you expected that to go." Maia chuckles into her palm. So, yes, there is Rekke stuff there. If the Watcher has the right background. ==== Edit. Yep. Pulled up a save and I see the unavailable option for Aristocrat/Merchant marked in red. So there's your path, for folks who want to take it. Edited August 17, 2018 by Zap Gun For Hire 6
Zap Gun For Hire Posted August 17, 2018 Posted August 17, 2018 (edited) As for other Rekke content in the DLC, a raw code check has: (spoilered, coz it's kinda long and because there are a couple of interesting finds in there) Banters: He can lob a banter to the Watcher when they show up at Harbinger's Watch for the first time. He can lob a banter when he sees the dracolich attacking Harbinger's Watch. He can lob a banter at Eder when they see the dracolich leave Harbinger's Watch after defeating it. He can lob a banter to the Watcher when interacting with one of the ropes that the Watcher uses. He can lob a banter in his native language when he sees the dracolich get sucked into the White Void if he doesn't know Aedyran. Otherwise he can lob a banter the Watcher understands when he sees the dracolich get sucked into the White Void. He can lob a banter to the Watcher when the Watcher manipulates a water puzzle (I believe in the Drowned Kingdom). He can lob a banter to the Watcher when you first show up in the Endless Queries. He can lob a banter in his native language when the party first enters The Bridge Ablaze. Otherwise he can lob a banter the Watcher understands when when the party first enters The Bridge Ablaze. He can lob a banter to the Watcher about you using the sundial (first time on the bridge, I believe). Conversations: As mentioned, some conversations with the Huana King, if the Watcher is a Diplomat or Merchant. Doesn't look to be THAT many conversation options though. Waidwen can mention that you "travel with one of the Stormfolk" if Rekke is in your party [Which is.... INTERESTING ] Rekke can comment that Rynhaeder appears to be speaking in Seki, which shocks him. [this is just the telepathy in action though, as other companions can make similar comments] If the Watcher suggests that the two halves of the Inquisitor kiss in an attempt to resolve their differences, Rekke can make a observation supporting that suggestion. =============== And, finally, if you tell the Inquisitor in an attempt to get the two halves of the personality to reconcile that "Remember that you're not only the worst things you've done, but the best as well," Rekke will have a very interesting reaction to that comment: (If Rekke present and knows Aedyran): Rekke quietly gasps. When you flick your gaze to him, his face is turned away, his features obscured by a curtain of hair. He takes shallow, shaking breaths. (NOTE: If Ydwin is present she ALSO will make a comment at this point) Apparently that observations struck him pretty deeply given his presumed crime as an arsonist. That's actually a pretty decent chunk of content for a sidekick. Not nearly as much as Ydwin, but more than I was expecting for him before I started the DLC. Edited August 17, 2018 by Zap Gun For Hire 5
handsomenat Posted August 17, 2018 Posted August 17, 2018 I had some of his banters and interjections in my game and then I found the audio of the comment about Rynhaedr appearing to speak Seki on tumblr. Thanks for listing all of it in one place. I had a feeling the Rekke content might be hidden under the background check. It's a shame they added the seki/engwithan/huana text engravings after doing the VO so we don't see reactions from the companions. After seeing how Ixamitl language seems to be similar to Seki I thought that perhaps those two peoples were related in the past, before the Ondra's Mortar storms were activated. On a different note... how do I navigate the conversationbundle and stringtable file? to know which line refers to which. 1
Tick Posted August 17, 2018 Posted August 17, 2018 I'd love to know what files you're digging through, too, Zap. It'd be cool to see this stuff. And yeah! Rekke acts like the Ixamitl language is familiar if you try to ask him if he speaks it. Probably have a related history /culture that split off. Very interesting.
house2fly Posted August 17, 2018 Posted August 17, 2018 I think the conversation files are in the LAX2_exported folder, look in there for a folder saying "localized" and then another folder saying "conversations". Then there should be a list of folders, think one will say "companions", and there will be some files you can open with notepad to view the conversation text. This is a rough approximation from a memory because I'm not at my computer right now, so sorry if it's a little off 1
handsomenat Posted August 17, 2018 Posted August 17, 2018 I know where to find them. I don't know how to use the conversationbundle files. I can read the stringtable files but always out of order because I don't know how to make sense of them (how to recreate the dialogue tree so to speak). Does that explain my problem here better?
Zap Gun For Hire Posted August 17, 2018 Posted August 17, 2018 (edited) I know where to find them. I don't know how to use the conversationbundle files. I can read the stringtable files but always out of order because I don't know how to make sense of them (how to recreate the dialogue tree so to speak). Does that explain my problem here better? Yeah, it took some getting used to. Okay, there are things in the conversation bundles called "nodes". It's what the game uses to not only go from each conversation option you see in the game, but also various checks made silently in the background. When it's simple, you look for something like this (using LAX02_01_cv_huana_wandering_soul.conversation as an example): { "$type": "OEIFormats.FlowCharts.Conversations.TalkNode, OEIFormats", "SpeakerGuid": "6a99a109-0000-0000-0000-000000000000", "ListenerGuid": "b1a8e901-0000-0000-0000-000000000000", "ExternalVO": "", "HasVO": false, "NotSkippable": false, "IsQuestionNode": false, "HideSpeaker": false, "IsTempText": false, "PlayVOAs3DSound": false, "PlayType": 0, "Persistence": 1, "NoPlayRandomWeight": 0, "VOPositioning": 0, "DisplayType": 1, "NodeID": 5, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 5, "ToNodeID": 11, "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": [] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] } "NodeID": 5 says this is, well, node number 5. In the "Links": subsection there is this: "FromNodeID": 5, "ToNodeID": 11, That says if NodeID 5 is accessed then go to NodeID 11. ***IF*** there is a corresponding stringtable number for NodeID 5, display it in the game. Then if there is text in NodeID 11, display that. And so on and so on. In this case, the game is accessing the following in lax02_01_cv_huana_wandering_soul.stringtable: <Entry> <ID>5</ID> <DefaultText>A wandering clump of soul essence waits for you in the path. When it senses the pieces of itself already within you, it rushes to join them.</DefaultText> <FemaleText /> </Entry> It will then go to this entry: <Entry> <ID>11</ID> <DefaultText>Your people wave and shout your name as you tour the outlander around your city. You have come to value his counsel more even than your own advisors', for he would not see you fettered by ceremony and politesse as they would.</DefaultText> <FemaleText /> </Entry> And so on and so on. (NOTE: When exactly the game decides to display something from a node in a conversation bundle to the corresponding text in the stringtable might be a little off here. But for a general explanation, that should suffice) Simple enough, right? If there are multiple options for the "ToNodeID", display all of those child nodes as well, as seen in this example: { "$type": "OEIFormats.FlowCharts.Conversations.TalkNode, OEIFormats", "SpeakerGuid": "6cebcf8c-2255-46cc-b560-5fae1a8ad356", "ListenerGuid": "b1a8e901-0000-0000-0000-000000000000", "ExternalVO": "", "HasVO": true, "NotSkippable": false, "IsQuestionNode": true, "HideSpeaker": false, "IsTempText": false, "PlayVOAs3DSound": false, "PlayType": 0, "Persistence": 0, "NoPlayRandomWeight": 0, "VOPositioning": 0, "DisplayType": 1, "NodeID": 200, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 83, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 77, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 71, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 38, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 36, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 200, "ToNodeID": 37, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } } ], "ClassExtender": { "ExtendedProperties": [ "SpeakerAnimation,0", "ListenerAnimation,0", "DoNotClearText,False", "FocusedSpeaker,6cebcf8c-2255-46cc-b560-5fae1a8ad356", "VOEventOverride,None" ] }, "Conditionals": { "Operator": 0, "Components": [] }, "OnEnterScripts": [], "OnExitScripts": [], "OnUpdateScripts": [] } This will display what is in NodeID 200. Then it will check each of those nodes listed (83, 77, 71, 38, 36, 37) and see if it should display them as well. This is how dialogue options are shown on the screen. The trick is that there can be conditions on whether or not a node is accessed or not. Here is an example of a node with a condition: { "$type": "OEIFormats.FlowCharts.Conversations.PlayerResponseNode, OEIFormats", "NotSkippable": false, "IsQuestionNode": false, "HideSpeaker": false, "IsTempText": false, "PlayVOAs3DSound": false, "PlayType": 0, "Persistence": 3, "NoPlayRandomWeight": 0, "VOPositioning": 0, "DisplayType": 1, "NodeID": 46, "ContainerNodeID": -1, "Links": [ { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 46, "ToNodeID": 219, "PointsToGhost": false, "Conditionals": { "Operator": 0, "Components": [] }, "ClassExtender": { "ExtendedProperties": [] } }, { "$type": "OEIFormats.FlowCharts.Conversations.DialogueLink, OEIFormats", "RandomWeight": 1, "PlayQuestionNodeVO": true, "QuestionNodeTextDisplay": 0, "FromNodeID": 46, "ToNodeID": 50, "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 IsCompanionActiveInParty(Guid)", "Parameters": [ "b1a7e809-0000-0000-0000-000000000000" ], "Flags": "", "UnrealCall": "", "FunctionHash": 1667060059, "ParameterHash": 337802082 }, "Not": false, "Operator": 0 }, { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean HasConversationNodeBeenPlayed(Guid, Int32)", "Parameters": [ "3fa7b7b0-e37f-44fe-a9bd-9a36dc71914c", "38" ], "Flags": "", "UnrealCall": "", "FunctionHash": -1870187966, "ParameterHash": 1462353276 }, "Not": false, "Operator": 0 }, { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean IsSkillValue(Guid, Guid, Operator, Int32, Boolean, Boolean)", "Parameters": [ "b1a8e901-0000-0000-0000-000000000000", "c7e22ee0-bdd6-4ca8-99f0-a46f3dd66606", "GreaterThanOrEqualTo", "4", "True", "False" ], "Flags": "", "UnrealCall": "", "FunctionHash": 193829831, "ParameterHash": 1726143461 }, "Not": false, "Operator": 0 } ] } This node will only be accessible by the player if Rekke is present (he is companion "b1a7e809-0000-0000-0000-000000000000"), if a previous conversation node has been played already (#38 from this conversationbundle in this case), and if the Watcher can pass a Diplomacy check of 4 ("c7e22ee0-bdd6-4ca8-99f0-a46f3dd66606"). ==== That's the SIMPLE stuff. There's things in the conversation bundles that I haven't fully wrapped my head around. But mostly following the "to"/"from" stuff and looking at the conditionals is enough for me to figure out 95% of what is going on in the code. There are things like 'children nodes' and other things that I haven't spent the time to fully understand. Or at least understand enough to try to explain it. ============== If that didn't explain it enough, I can try again if you'd like. Edited August 17, 2018 by Zap Gun For Hire 3
handsomenat Posted August 18, 2018 Posted August 18, 2018 Ok, thanks, that should clear things up! Thanks for taking your time to explain this. Providing examples made it easy enough to follow. How would I know which code refers to which companion and skill though? 2
Zap Gun For Hire Posted August 18, 2018 Posted August 18, 2018 How would I know which code refers to which companion and skill though? Now we're getting into the nitty gritty stuff. Since this is a long post with some example code, I'll put it all behind a spoiler box so I don't make this thread take up more screen space than I already am. A tiny amount of background. This time around, Obsidian is using what are called UUIDs to define pretty much every last thing in the game. Characters, items, skills. Even the files themselves. You name it, it probably has a UUID. To find out what a UUID represents (for most things), you have to look in the exported/gamedata folder (as opposed to exported/conversations folder) in either the base game directory or the various DLC directories. There are a bunch of files with .gamedatabundle names in there. The good news, is that they are all readable. The BAD news is that they are all JSON files, which means you need a text editor that can easily format them from their current format (everything on one line) to something more comprehensible by us humans (formatted so they display like normal code where everything is on separate lines). If you already use Notepad++, there is an extension called JSToolNpp which can turn that irritating JSON format into much cleaner code (I use the JSFormat tool in the plugin). If you don't use Notepad++, I'd see if there is a JSON formatter for whatever you do use. Visual Studio Code, for instance, has a built in JSON formatter (though you might have to tell VSC that the file is a JSON file and not a text file in some cases). Finally, and thankfully, Deadfire doesn't care whether or not its .gamedatabundles are in its native 'on one line' format or if a .gamedatabundle has been formatted to look better in our eyes. Game will run the same either way. That being said, it's probably for the best to copy the files and save them elsewhere when mucking about with them, lest you accidentally change something and break the game. ============ And with all of THAT out of the way, I can finally answer your question. As I said, practically everything has a UUID. To find out the UUID of a character in the game, check out characters.gamedatabundle and search for whatever UUID you saw in a conversationbundle ***OR*** search for the companion name and look at the entry that says "CompanionGuidString" (making sure you look at the Companion Data and not the Companion Stats - see below for a longer explanation). For items, check items.gamedatabundle. For skills, check global.gamedatabundle. NOTE::: Things introduced in various DLCs will be in the DLC directory, not the base game. So Vatnir, for example, will be found in lax2_characters.gamedatabundle in the DLC directory for Beast of winter. Where other things are can be found by multifile searching the UUID in question, as nearly every UUID found in conversationbundle files are either in the various gamedata directories or in the various conversations directories. For an example of the latter, every single conversationbundle script has its own UUID at the very beginning as seen here: {"Conversations": [ { "ID": "3fa7b7b0-e37f-44fe-a9bd-9a36dc71914c", "Filename": "Conversations/LAX02_01_Iceberg_Dungeon/LAX02_01_cv_huana_wandering_soul.conversation", This was used earlier in the thread when I noted the game checked to see if Node 38 of that script had been played, in this case it used the UUID "3fa7b7b0-e37f-44fe-a9bd-9a36dc71914c" to run the check. For an example of a skill, here is the Diplomacy entry in global.gamedatabundle: { "$type": "Game.GameData.SkillGameData, Assembly-CSharp", "DebugName": "Diplomacy", "ID": "c7e22ee0-bdd6-4ca8-99f0-a46f3dd66606", "Components": [ { "$type": "Game.GameData.SkillComponent, Assembly-CSharp", "DisplayName": 2563, "Description": 2917, "Icon": "gui/icons/gamesystems/skill_diplomacy.png", "ActiveSkill": "false", "AudioEventListID": "cf7c7e4c-0248-47f7-88ed-faffbf904646", "GlossaryEntryID": "b34ce9a3-e4bf-4c8a-be85-0f3a902e7760" } ] } In this case "c7e22ee0-bdd6-4ca8-99f0-a46f3dd66606" is the UUID that represents a Diplomacy check. So instead of having Diplomacy in the conversationbundle, it will have that UUID. Here is an example of a companion from characters.gamedatabundle: { "$type": "Game.GameData.CompanionGameData, Assembly-CSharp", "DebugName": "CompanionRekke", "ID": "d1ae8df2-c699-49e6-a6a6-d3c704cbe0e9", "Components": [ { "$type": "Game.GameData.CompanionComponent, Assembly-CSharp", "CompanionGuidString": "b1a7e809-0000-0000-0000-000000000000", "ScriptName": "c_rekke", "SpeakerID": "c9f4c0dd-9caa-4351-b008-ee8584e515b5", "Topics": [], "TopicReactions": [], "PlayerRelationship": [ { "Threshold": "Neutral", "Conversation": { "GuidString": "00000000-0000-0000-0000-000000000000" }, "Node": 0, "Conditionals": { "Operator": 0, "Components": [] } }, { "Threshold": "Positive", "Conversation": { "GuidString": "00000000-0000-0000-0000-000000000000" }, "Node": 0, "Conditionals": { "Operator": 0, "Components": [] } }, { "Threshold": "VeryPositive", "Conversation": { "GuidString": "00000000-0000-0000-0000-000000000000" }, "Node": 0, "Conditionals": { "Operator": 0, "Components": [] } }, { "Threshold": "Negative", "Conversation": { "GuidString": "00000000-0000-0000-0000-000000000000" }, "Node": 0, "Conditionals": { "Operator": 0, "Components": [] } }, { "Threshold": "VeryNegative", "Conversation": { "GuidString": "00000000-0000-0000-0000-000000000000" }, "Node": 0, "Conditionals": { "Operator": 0, "Components": [] } } ], "CompanionRelationships": [], "ProgressionTablesIDs": [ "801c0384-416d-41e1-aa09-7ed573f590ba", "fa1486f8-de84-448c-936b-a83a6cbe56b1", "58babef3-baab-40a2-8d88-08383d0fe3b0" ], "IsSidekick": "true" } ] } As mentioned earlier in THIS case, you want the value in CompanionGuidString. WARNING NOTE: There are TWO entries in characters.gamedatabundle for companions. Make sure to get the one that has a "CompanionGameData" definition type but not the one that has a "CharacterStatsGameData" type. Sadly, there are a few UUIDs which are hard coded into the level design, which we can't easily access. You probably won't run across them in the conversationbundles files unless you are looking at Vendor information, but if you try to search for a UUID found in a conversationbundle and can't find it anywhere in any of the various exported directories for the base game or the DLCs, that's probably why. That should pretty much give a decent introduction in to how to decipher this stuff, I hope. 1
handsomenat Posted August 18, 2018 Posted August 18, 2018 Thank you so much once again for taking your time to explain it. Poking around the game files always seemed interesting to me and now I'm equipped with more knowledge to actually do it. Your contributions are great. Cheers. 1
ignus Posted August 19, 2018 Author Posted August 19, 2018 Thanks for the info everyone. I think it is a little weird to recommend a character who most likely won't have any input at all. Same thing with the BoW task which recommends the orlan pirate I guess. He didn't do/say anything for me either.
house2fly Posted August 19, 2018 Posted August 19, 2018 I don't know how they come up with the "recommended character" thing. I wonder if there's a script which checks how many lines of dialogue there are related to the quest and recommends the characters with the most lines?
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