Jump to content

Kvellen

Members
  • Posts

    209
  • Joined

  • Last visited

Everything posted by Kvellen

  1. So I did a bit of tinkering using the excellent documentation noqn has provided, and have created a basic proof of concept! PoE2_Adventurer_Conversation.zip There isn't really much to this mod beyond this one custom conversation, with a man giving monosyllabic responses (and possibly challenging you to a staring contest), but it does maybe give some insights into a few aspects of how a custom conversations can be implemented. For convenience, the "Speech Bubble" in the actual mod comes pre-equipped on the character. There is likely a lot I am skipping over explaining, so if there is something that anyone is curious about or would like me to go into further detail on, please let me know! Here are a few interesting aspects: As you can hear the conversation uses voice lines from the Stoic Male voice set. I've used the "ExternalVO" line on some nodes in the .conversationbundle to play specific audiofiles during certain points. For example "ExternalVO": "player_stoic_m/ch_player_stoic_m_investigate_40011", is used on the first node of the conversation for the character to give a sort of grunt as a greeting. However it's totally possible to add new voiced dialogue for characters during a custom conversation! I only did things this way to keep it simple for myself. But as I mentioned in the original post, if there is an audio file related to a conversation in the folder associated with the speaker (this is defined by the ChatterPrefix line) the game will play it. The audio file itself needs to be named after conversation and the 4 digit ID of the specific node it should be played on. So for example if there were an audio file named "adventurer_caedman_0001.wem" in the "player_stoic_m" folder, this could be played without needing "ExternalVO": "", to be used. There are a few minor details you might noticed that don't really sell this as a proper conversation between the characters: The adventurer and Watcher don't turn to face each other when speaking. Which is pretty impolite if you ask me! The Watcher won't approach the adventurer like they do other companions, which leads to potential for instances of conversations happening over long distances, or from other rooms entirely. The scripts FaceTarget and AIPathToObject/AIPathToPoint could be potential solutions for these respective problems? But I've yet to actually test them, since I've only just become aware of them as I am writing this post. Moving on to the character themselves, there are some pretty cool things that could potentially be done using the GUID of an exported character. An example of this is to do with the "Speech Bubble" item. On the "InspectOnUseButton": [ ] there is a conditional to only display the "Talk to Caedman" button when a character with the specific GUID of the adventurer is in the party. Oh and with regards to making a fully featured companion with topics of interest... this GUID can be used to link companion data to the adventurer! I haven't looked into anything really surrounding flagging a node as a topic, so I have no idea if this character will "roll their eyes and let out a long sigh" when an assigned topic is mentioned in other conversations. So yeah really exciting stuff!
  2. Hey, I believe that the line you would need to change for Borrowed Instinct to be: "OverrideTacticalActionType": "None", to "Free", . This might actually affect spell casting time in turnbased as well? So worth trying changing that line for Mental Binding to one of the options here to see if it will work: https://eternity.obsidian.net/game-data-formats/enumerations#tacticalactiontype Could it be that you are changing the values on "Mental_Binding_AOE" instead of "Mental_Binding_Target"? Though according to the modding documentation CastSpeedID is to do with the duration of the casting animation, but it is unclear if it relates to the amount of turns it takes to cast in turn based mode. Otherwise it's worth checking that the mod is loading properly by searching the output_log.txt file for any mention of "error"? Even one error in a gamedatabundle can cause the file to either not load, or partially load. The Output log can be a little hard parse, but usually it will mention if there is an "unexpected" character like a comma, "quotes" or bracket {} [] as causes.
  3. Despite my not really being that into the setting anymore, a 40k CRPG is always something that is rolling around in my head pretty often. Specifically this section of the intro before the "In the grim darkness of the far future, there is Only War" bit, always seems to me really ripe with unexplored potential subject matter: 40k narratives don't tend to focus in on the nitty gritty details of day to day life for very long. Which I kind of get. The fantasy of 40k is being the arm of the Imperium, carelessly weeding out corruption to prevent the forces of Chaos bleeding into reality. As opposed to something as mundane as an inquisitor looking into mutations among the population, and finding the most likely cause to be slurry from the massive factory seeping into the water supply of its workers. I have yet to get round to any of the Pathfinder games, but from reviews Owlcat seem like a good choice for making a CRPG based on an established licence.
  4. Oh yeah now that you mention it, script hooks could total work for this couldn't they! I do wonder though, would there potentially be some impact on performance with a lot of scripts checking if their conditions are met on level load? Awesome!
  5. This isn't something I am really working on, but I figured it might be interesting to others. I've just discovered it is possible to have adventurers (the custom characters that can be hired from most inns) speak during a conversation! In brief you can do this by adding the speaker GUID (these are found in speakers.gamedatabundle) of the voice set in use by the character to the SpeakerGuid and FocusedSpeaker sections of a conversation node. The name of the character and the current portrait will then appear in the conversation window. If there are audiofiles that correspond to the conversation node in the folder associated with the voice set these will also be played during the conversation. This should in theory allow for the creation of rudimentary sidekicks/companions with voiced dialogue! With a lot of work and some degree of trial and error possibly even full conversation hubs of their own... Though the main hurdle as far as that goes, is that the lack of a button to start a conversation with adventurers directly. So the only way I could think of is using something like an item to start the conversation, similar to how the burned book works. There is also the lack of modding documentation related to the data structure of .conversationbundle files to contend with. None the less could be really cool to see what someone dedicated enough might come up with! I'm happy to answer questions to the best of my ability about anything I have written here.
  6. Matter of fact a mod that does this already exists: https://www.nexusmods.com/pillarsofeternity2/mods/499 Uses the same data structure as other promotional item DLC for Deadfire from what I can tell, and the author mentions having Obsidian's permission to upload it.
  7. The thing is all the backer items are actually present in the game files and as such can be acquired by console commands or with mods. If there were an official release that made the items easier to access for everyone? I don't know what the reaction would be.
  8. I am really glad that it works now! Only have the GOG version so can't upload to Steam's Workshop, I've uploaded it to Nexus though.
  9. That is strange... I assume that Deadfire stores a snapshot of some data related to acquired weapons/items/companions/etc in the save of the character, which would be my guess for why the changes might not apply to the weapon if it already in your inventory. Maybe changing the event list to use the standard arquebus sounds might work? Try placing the "dragons dowry fix" folder in the attached zip into the override folder (if there is no folder called "override" create it). Hope this works! dowry_sound_fix.zip
  10. Huh you are right about it lacking sound effects and is seemingly (from a quick glance on my part) the only Arquebus with a GUID to an audio event list. The following should work for adding typical Arquebus sounds effects to the weapon: { "GameDataObjects": [ { "$type": "Game.GameData.WeaponGameData, Assembly-CSharp", "DebugName": "Arquebus_U_Dragons_Dowry", "ID": "1261d34f-af56-42c4-983e-bee8f11c28b5", "Components": [{ "$type": "Game.GameData.WeaponComponent, Assembly-CSharp", "AudioEventListID": "00000000-0000-0000-0000-000000000000" } ] } ] } Interestingly searching for GUID the event list "16dcb3b6-6d7f-455d-b1ca-ec1594389032" in audio.gamedatabundle points to list that seems to be something related the Blazing Fury ability, but since this list lacks all the typical Arquebus audio events this leads to no audio playing.
  11. That sounds like it could work. Though having looked up some more context for the conversation, I think the main point of the line is to show Xoti's frustration with Vatnir for lying to everyone at Harbingers' Watch, and for trying to defend that lie now. I'm not a German speaker so don't know if this would make sense but maybe something like: "You were trying to sell people horse apples/droppings as potatoes, you mean." or: "You were talking out of your butt this whole time. Just admit it." Otherwise it might be a case of just replacing that line with a German saying along the lines of calling someone a liar.
  12. It's a variation on the common English saying "full of ****", but changed to take into account Xoti's upbringing on a farm, and in a culture that doesn't like swearing. So where she grew up people might have likely used the term "horse apples"* to refer to "horse excrement" and as such use that in place of the swear word in the saying. Basically Xoti is dismissing Vatnir's previous theory and explanation of the dragon as a harbinger of Rymergand as lies. And strongly implying that he really doesn't know what he is talking about. *it would seem there is actually a type of fruit that is sometimes referred to as a "Horse Apple". It grows on a very throny bush that was used as type of natural fence around some farms. The fruit itself isn't edible, so would be seen as pretty useless. So it is possible something being "full of horse apples" (which are basically useless) might be a part of what she is saying as well?
  13. Unfortunately Eternity Keeper is not compatible with Deadfire Saves. It was created with the save structure of PoE1 in mind, and Obsidian overhauled their save system in an effort to improve load times for the sequel.
  14. Yes this is possible to do, there is a particular folder structure for it to work though: override\yourmodfolder\conversations\03_neketaka_vailian_district\03_cv_rtc_soldiers.conversationbundle The "iroll20s" console command is the only thing that disables achievements I think.
  15. It is a really frustrating bug. Escaping combat to heal only for my Assassin to glide on back towards the enemy with a sliver of health was a constant problem in my first playthrough. Always just thought it was due to having too high an action speed or something. Had no idea it was tied to AI Behaviour. I imagine this is a long shot but is there a chance that some kind of modded .aibehaviorbundle can fix it? It looks to me when it happens like the character might not be waiting the correct amount of time for the consume action to complete, or are possibly cancelling it in favour of the higher priority action of attacking perhaps?.
  16. I don't believe so. Have you checked the output_log.txt file for mentions of the word "error"? That usually shows if something in a mod is causing it not to load properly.
  17. Made a Watercolor converter file for Photopea. Double-click the thumbnail of the "Portrait" layer. This will open a smart layer tab in the program. replace the Calista image with your desired picture (can remove the background with https://www.remove.bg/) Go to file->Save(Smart Object) (or press ctrl+s) and then go back to the Deadfire Watercolor Template.psd tab. Might have to tweak a few things to get it to look right (altering the properties of the "Level 1", and/or Gaussian Blur effect strength, will make the lines darker/stronger). When you are happy with the results (or just want to preview it) go to File->Export as->PNG and change the dimensions to 90px by 141px. It's not perfect, but it works pretty well. The below were all made with this file, all except 2 required only minor edits.
  18. Decided to change this to a scripthook instead. Since that will account for the cases where the Drunkard's Regret is already collected and will also check if Oswald is dead. The only outlier remaining I could see is a situation where the ring was sold or lost some how before the scripthook is used. { "GameDataObjects": [ { "$type": "Game.GameData.ModScriptHookGameData, Assembly-CSharp", "DebugName": "Erol_Searched_Modscript", "ID": "d7891c14-b47e-4b71-9557-fbf10382f6e3", "Components": [ { "$type": "Game.GameData.ModScriptHookComponent, Assembly-CSharp", "RunOnlyOnce": "false", "SucceedOnlyOnce": "true", "Script": { "Conditional": { "Operator": 0, "Components": [ { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean IsGlobalValue(String, Operator, Int32)", "Parameters": ["n_Erol_State", "EqualTo", "3"], "Flags": "", "UnrealCall": "", }, "Not": false, "Operator": 0 }, { "$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats", "Data": { "FullName": "Boolean IsItemCount(Guid, Operator, Int32)", "Parameters": [ "8e0aa96f-1726-43aa-8d67-a3a1c3816cdd", "GreaterThanOrEqualTo", "1" ] }, "Not": false, "Operator": 0 } ] }, "Scripts": [ { "Data": { "FullName": "Void SetGlobalValue(String, Int32)", "Parameters": ["b_10_erol_body_searched", "1"], "Flags": "", "UnrealCall": "", }, "Conditional": { "Operator": 0, "Components": [] } } ] } } ] } ] } Interesting bit of trivia, all variables to do with Oswald use the name "Erol", and hint that at some point during development this quest would have been about the original owner of the Goose and Fox Tavern from PoE1. There is an unused quest item called Erol's Ring which is described as : "A simple band of gold with the words "Goose and Fox" written on the inside." In PoE1 Bishop (the current owner) mentions that Erol fled after getting into an argument with a Thayn during a debate.
  19. That's a really interesting find! I wonder if perhaps these were intended as special injuries that could be inflicted in certain areas, like the area beneath the Gullet? Probably a case of a feature being thematically interesting, but frustrating in practise.
  20. I experienced this same crash on start up whilst trying to install Special K recently, so that is likely the cause. Deleting the "dxgi.dll" file fixed the issue for me.
  21. Have run into this bug on a recent version of the game, and I am trying to make a fix. Essentially if you take the quest from Khan then head to Oathbinder's Sanctum, interrupt Oswald's trial, but let the Steel Garrotte proceed his execution. You are rewarded with 1400 copper, and at the end of the conversation teleported to the entrance chamber. This is where the problem occurs as to progress to the next stage of the quest you need to go back to trial chamber and search Oswald's body. From what I can tell the script that should set the variable "b_10_erol_body_searched" to "1" (True) when interacting with the corpse, doesn't activate when interacting with the loot pile that has replaced it with the scene changed. If you let the trial playout without interrupting it, then search the corpse the script will activates just fine though. Is there someway to maybe set it so a script will also trigger when searching this instance of the loot pile? Currently the only potential workaround I've come up with is to set following script on the Drunkard's Regret ring on his corpse, that activate once the item is picked up. { "GameDataObjects": [ { "$type": "Game.GameData.EquippableGameData, Assembly-CSharp", "DebugName": "Ring_U_Drunkards_Regret", "ID": "8e0aa96f-1726-43aa-8d67-a3a1c3816cdd", "Components": [{ "$type": "Game.GameData.DataScriptEventComponent, Assembly-CSharp", "Scripts": [{ "Event": "OnItemCollected", "Script": { "Conditional": { "Operator": 0, "Components": [] }, "Scripts": [{ "Data": { "FullName": "Void SetGlobalValue(String, Int32)", "Parameters": ["b_10_erol_body_searched", "1"], "Flags": "", "UnrealCall": "", }, "Conditional": { "Operator": 0, "Components": [] } } ] } } ] } ] } ] }
  22. So after a bit of testing, I think this might be possible. The game will load a .globalscriptbundle mod, provided all 3 of the lines below are present. { "GlobalScripts": [], "GlobalExpressions": [], "GlobalPreferences": [] } This seems the case even in cases such as yours where what you'd want to change only involves the GlobalScripts brackets. Making changes this way does work from what I can tell from a very rough test involving modifying a few of the variables in the script that sets the VTC to unfriendly if you reject Alvari's offer in favour of keeping Maia in your party. The faction relation with the VTC seems to remain friendly (though they were still unwilling to work with me after the conversation), and upon leaving Neketaka I did not received the letter from Pallegina that removes her from my roster. I'm not 100% sure it was just overriding the specific changes made to the script in the file or was actually overriding (and erasing) all other lines from the globalscripts.globalscriptbundle. From what I gather global scripts only run when they are called to, so my concern is that the modded file might just be setting this line as the only global script in existence. Nevermind, this is actually how a global script gets added for The Beast of Winter, so modding global scripts in this way should be totally fine! Formatting example: { "GlobalScripts": [ { "ScriptCalls": [ { "Data": { "FullName": "Void SetGlobalValue(String, Int32)", "Parameters": [ "b_Queen_Hasongo_Missive_Delivered", "2" ], "Flags": "", "UnrealCall": "", "FunctionHash": 1935477378, "ParameterHash": 1987798281 }, "Conditional": { "Operator": 0, "Components": [] } }, { "Data": { "FullName": "Void DeliverMissive(StringTableType, Int32, Guid)", "Parameters": [ "Gui", "3790", "1e1efe1c-4781-40a0-b07d-741c839cdf06" ], "Flags": "", "UnrealCall": "", "FunctionHash": -275187270, "ParameterHash": 724583833 }, "Conditional": { "Operator": 0, "Components": [] } } ], "ID": "03b357d7-7a96-454f-a9d3-c80820416374", "ScriptType": 0, "Filename": "gsd_04_queen_hasongo_missive.globalscript" } ], "GlobalExpressions": [], "GlobalPreferences": [] } The above script normally would deliver the message from Onekaza that acknowledging your having gone to Hasongo, but will now instead deliver you one from Furrante instead. You can test this by saving it as a .globalscriptbundle file, enabling cheats in the console and then calling the script using the console command: CallGlobalScript 03b357d7-7a96-454f-a9d3-c80820416374
×
×
  • Create New...