Jump to content

"Spiritual Successor" - Modding Tool - Released!


Recommended Posts

So I was fiddling around trying to mod the upgrades to Frenzy (blood frenzy->blood storm & spirit frenzy-> Spirit Tornado) to remove the increased Rage costs (Upgrade turns it from 1->2, trying to put it back to 1), but I can't find them (or even the base Frenzy) in the Abilities section of your mod tool.  The effects are there in the attack & effects sections, but I can't change the costs in those bundles, near as I can tell.  I opened my local abilities.gamedatabundle & found them there, and seem to have modded them successfully (though in the UI the cost is listed at 2, using it only consumes 1). 

 

Is there some reason for this?  I know you mentioned it filters out things that shouldn't be modded, but this doesn't seem terribly different from any other ability & seems to have taken the modification properly?

The fix is up. You can now find and edit 275 new abilities on the Abilities Screen, including Frenzy and its upgrades. This will help everyone else who are using the editor.

 

From the SpecialGenericAbility object's structure it isn't clear why is this a separate type. Might be some hack Obsidian programmers had to make, maybe they wanted to classify all upgradeable abilities as Special Generic Abilities at some point, then dropped the idea but the $type value wasn't changed.

Edited by Gairnulf

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

Abilities that have special code have their own gamedata types. There are about 32 of these types available, though I don't know how many are actually used currently.  SpecialGenericAbilityGameData is the most common. The most correct way to identify ability gamedata would be to see if it has a "Game.GameData.GenericAbilityComponent" component on it.

  • Like 2
Link to comment
Share on other sites

Abilities that have special code have their own gamedata types. There are about 32 of these types available, though I don't know how many are actually used currently.  SpecialGenericAbilityGameData is the most common. The most correct way to identify ability gamedata would be to see if it has a "Game.GameData.GenericAbilityComponent" component on it.

The way I'm doing it currently is by adding root-level objects according to their $type value. I chose to do it this way because I didn't have perfect information on the objects' structure, and if some $types wouldn't require me to add a lot of extra form controls because of extra components they may contain. Also this way I have the most control over what shows in the list and what will not be included in the query as unimportant to modders. I imagine that in a perfect setup the editor users will only see the stuff in the lists and in the detail views which they "need in the majority of situations". So as a result, I am currently using a function that's like this:

 

 

determineGameDataQueryOptions(dbName: string): string[] {

switch (dbName) {

case 'characters':

return [this.gameDataObjectTypes.CHARACTERSTATS];

case 'progressiontables':

return [this.gameDataObjectTypes.PROGRESSIONTABLE];

case 'abilities':

return [this.gameDataObjectTypes.ABILITY, this.gameDataObjectTypes.SPECIALABILITY];

case 'attacks':

return [

this.gameDataObjectTypes.RECOVERYTIME, this.gameDataObjectTypes.ATTACK_AOE, this.gameDataObjectTypes.ATTACK_AURA, this.gameDataObjectTypes.ATTACK_BEAM,

this.gameDataObjectTypes.ATTACK_FIREARM, this.gameDataObjectTypes.ATTACK_GRAPPLE, this.gameDataObjectTypes.ATTACK_MELEE,

this.gameDataObjectTypes.ATTACK_PULSEDAOE, this.gameDataObjectTypes.ATTACK_RANDOMAOE, this.gameDataObjectTypes.ATTACK_RANGED,

this.gameDataObjectTypes.ATTACK_SUMMON, this.gameDataObjectTypes.ATTACK_SUMMONRANDOM, this.gameDataObjectTypes.ATTACK_TELEPORT,

this.gameDataObjectTypes.ATTACK_BEAMTELEPORT, this.gameDataObjectTypes.ATTACK_TELEPORT, this.gameDataObjectTypes.ATTACK_HAZARD,

this.gameDataObjectTypes.ATTACK_MASTERSCALL, this.gameDataObjectTypes.ATTACK_WALL

];

case 'statuseffects':

return [this.gameDataObjectTypes.STATUSEFFECT, this.gameDataObjectTypes.AFFLICTION];

}

}

 

It's tempting to just filter them by their first component's type as you suggest, but my concern is that if I just include every object that has a Game.GameData.GenericAbilityComponent, I may offer objects in the editor for which I don't yet have all the appropriate form controls, and this may confuse users. I've looked over part of the objects in abilities.gamedatabundle and some seem to have modding-relevant data in their components after the GenericAbilityComponent.

 

Possible noob question, but wanted to know if it is possible to create a custom class?

Maybe not with this tool but with the current modding potential.

The short answer is yes :) The long one is that you need to replicate objects in many of the files, if you want to build a custom class, with its own full set of abilities and their own effects. It's doable but it's a lot of work, for some of which the editor can help you, but not for everything. It would help if you are very proficient with the game first, so you know what capabilities the game's rules offer your character, and you can better design and balance its abilities and their effects. Edited by Gairnulf
  • Like 1

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

I've updated the GameDataObjectTypes class to reflect the different types of objects in abilities.gamedatabundle. Here is a relevant excerpt:

 

 

// Abilities.gamedatabundle types

LINKEDEFFECTABILITY = 'Game.GameData.LinkedEffectAbilityGameData, Assembly-CSharp';

PHRASE = 'Game.GameData.PhraseGameData, Assembly-CSharp'; // Doesn't have a GenericAbilityComponent Component

ATTACKLOWESTDEFENSE = 'Game.GameData.AttackLowestDefenseAbilityGameData, Assembly-CSharp'; // needs additional form controls

AURAABILITY = 'Game.GameData.AuraAbilityGameData, Assembly-CSharp'; // needs additional form controls

CHANT = 'Game.GameData.ChantGameData, Assembly-CSharp'; // needs additional form controls

COORDINATEDPOSITIONINGABILITY = 'Game.GameData.CoordinatedPositioningAbilityGameData, Assembly-CSharp'; // needs additional form controls

DEATHBLOWS = 'Game.GameData.DeathblowsGameData, Assembly-CSharp'; // needs additional form controls

FINISHINGBLOWABILITY = 'Game.GameData.FinishingBlowAbilityGameData, Assembly-CSharp'; // needs additional form controls

FOCUSTRAIT = 'Game.GameData.FocusTraitGameData, Assembly-CSharp' // needs additional form controls

 

ABILITY = 'Game.GameData.GenericAbilityGameData, Assembly-CSharp'; // the basic ability

SPECIALABILITY = 'Game.GameData.SpecialGenericAbilityGameData, Assembly-CSharp'; // needs one more form control

 

WEAPONATTACKABILITY = 'Game.GameData.WeaponAttackAbilityGameData, Assembly-CSharp'; // needs additional form controls

WOUNDSTRAITABILITY = 'Game.GameData.WoundsTraitAbilityGameData, Assembly-CSharp'; // needs additional form controls

SHAREDTARGETABILITY = 'Game.GameData.SharedTargetAbilityGameData, Assembly-CSharp'; // needs one more form control

 

I can add all these types to the editor, but their specific properties will not be accessible for now. I'll have to add the respective ability type-specific form controls for each of these types.

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

 

Abilities that have special code have their own gamedata types. There are about 32 of these types available, though I don't know how many are actually used currently.  SpecialGenericAbilityGameData is the most common. The most correct way to identify ability gamedata would be to see if it has a "Game.GameData.GenericAbilityComponent" component on it.

The way I'm doing it currently is by adding root-level objects according to their $type value. I chose to do it this way because I didn't have perfect information on the objects' structure, and if some $types wouldn't require me to add a lot of extra form controls because of extra components they may contain. Also this way I have the most control over what shows in the list and what will not be included in the query as unimportant to modders. I imagine that in a perfect setup the editor users will only see the stuff in the lists and in the detail views which they "need in the majority of situations". So as a result, I am currently using a function that's like this:

 

 

determineGameDataQueryOptions(dbName: string): string[] {

switch (dbName) {

case 'characters':

return [this.gameDataObjectTypes.CHARACTERSTATS];

case 'progressiontables':

return [this.gameDataObjectTypes.PROGRESSIONTABLE];

case 'abilities':

return [this.gameDataObjectTypes.ABILITY, this.gameDataObjectTypes.SPECIALABILITY];

case 'attacks':

return [

this.gameDataObjectTypes.RECOVERYTIME, this.gameDataObjectTypes.ATTACK_AOE, this.gameDataObjectTypes.ATTACK_AURA, this.gameDataObjectTypes.ATTACK_BEAM,

this.gameDataObjectTypes.ATTACK_FIREARM, this.gameDataObjectTypes.ATTACK_GRAPPLE, this.gameDataObjectTypes.ATTACK_MELEE,

this.gameDataObjectTypes.ATTACK_PULSEDAOE, this.gameDataObjectTypes.ATTACK_RANDOMAOE, this.gameDataObjectTypes.ATTACK_RANGED,

this.gameDataObjectTypes.ATTACK_SUMMON, this.gameDataObjectTypes.ATTACK_SUMMONRANDOM, this.gameDataObjectTypes.ATTACK_TELEPORT,

this.gameDataObjectTypes.ATTACK_BEAMTELEPORT, this.gameDataObjectTypes.ATTACK_TELEPORT, this.gameDataObjectTypes.ATTACK_HAZARD,

this.gameDataObjectTypes.ATTACK_MASTERSCALL, this.gameDataObjectTypes.ATTACK_WALL

];

case 'statuseffects':

return [this.gameDataObjectTypes.STATUSEFFECT, this.gameDataObjectTypes.AFFLICTION];

}

}

 

It's tempting to just filter them by their first component's type as you suggest, but my concern is that if I just include every object that has a Game.GameData.GenericAbilityComponent, I may offer objects in the editor for which I don't yet have all the appropriate form controls, and this may confuse users. I've looked over part of the objects in abilities.gamedatabundle and some seem to have modding-relevant data in their components after the GenericAbilityComponent.

 

Possible noob question, but wanted to know if it is possible to create a custom class?

Maybe not with this tool but with the current modding potential.

The short answer is yes :) The long one is that you need to replicate objects in many of the files, if you want to build a custom class, with its own full set of abilities and their own effects. It's doable but it's a lot of work, for some of which the editor can help you, but not for everything. It would help if you are very proficient with the game first, so you know what capabilities the game's rules offer your character, and you can better design and balance its abilities and their effects.

 

 

Thank you for your quick reply.

  • Like 1
Link to comment
Share on other sites

General question now that there's a substantial balance patch incoming: is it possible to open assets that have already been modded?

 

When I tried to use the editor to open a previous mod to look at the changes made, the editor gave me an error. I think it said the file name didn't match? The thought later occurred to me that it might have worked if the mods were the same name as the original file, but I didn't think about that till later. Even if it did, it seems easier to compartmentalize changes (and therefore troubleshoot and customize) if you have differently named files for separate classes or such within a mod folder.

 

I can kinda understand why it doesn't do this currently, since you have the different bundles linked together in order for the changes to propagate across the proper bundles. But it seems like having to re-modify every change after every patch would be frustrating.

 

I don't have a great answer for this, but it's something to think about with the huge numbers of changes coming in 1.1 for balance purposes that people are already saying they want to change/revert.

Link to comment
Share on other sites

General question now that there's a substantial balance patch incoming: is it possible to open assets that have already been modded?

 

When I tried to use the editor to open a previous mod to look at the changes made, the editor gave me an error. I think it said the file name didn't match? The thought later occurred to me that it might have worked if the mods were the same name as the original file, but I didn't think about that till later. Even if it did, it seems easier to compartmentalize changes (and therefore troubleshoot and customize) if you have differently named files for separate classes or such within a mod folder.

 

I can kinda understand why it doesn't do this currently, since you have the different bundles linked together in order for the changes to propagate across the proper bundles. But it seems like having to re-modify every change after every patch would be frustrating.

 

I don't have a great answer for this, but it's something to think about with the huge numbers of changes coming in 1.1 for balance purposes that people are already saying they want to change/revert.

The quick answer is, depending on the mod file you want to edit, if the modded objects all belong to the same vanilla file, renaming the mod file to the respective vanilla file's name will let you load it into the editor.

If the modded file contains objects which belong to different vanilla gamedatabundle files, you should either split the objects into different files and load them separately, or load the same file into multiple Load Data screen forms.

 

The editor currently checks the filename of the file you are loading and determines which database to fill with the file's data. I know this shouldn't work like that. When I fix it, there will be just one Load Data form, which will take all kinds of files, and will recognize the objects inside by their $type property, and load them in the right place automatically.

 

When I began work on the editor, I didn't yet know that the game doesn't care about the name of the mod file, nor that it isn't required to separate changes into different mod files, if these changes apply to different gamedatabundle files, i.e. that you can group changed objects that belong to a few different vanilla files in the same mod gamedatabundle. I thought modded objects were required to be separated in their own properly-named gamedatabundle files which match the vanilla names.

 

Due to this confusion the Load Data screen works the way it does now. I will rework it, but I have a pretty big roadmap of changes I'd like to make first. The general order of priorities is: things that currently can't be done with the editor, then things that can be done, but require some manual work, then quality of life features, then improvements to the styles and layout, which also need more work.

 

I'll repost this in the dev blog, because it's probably a question a lot of people have.

Edited by Gairnulf

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

Regarding patch changes being reflected in the editor's defaults - I've got the game on GOG, so when the patch is out for GOG, I will update the defaults to their 1.1 state. Eventually it will be possible to revert to old versions of the gamedatabundle files too.

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

Hey Gairnulf,

 

any plans to add a search function to the tool?

 

There are so many abilities and effects that it can be daunting to find the one you want. A search feature like the one in the Unity Console mod would be amazing.

"Time is not your enemy. Forever is."

— Fall-From-Grace, Planescape: Torment

"It's the questions we can't answer that teach us the most. They teach us how to think. If you give a man an answer, all he gains is a little fact. But give him a question, and he'll look for his own answers."

— Kvothe, The Wise Man's Fears

My Deadfire mods: Brilliant Mod | Faster Deadfire | Deadfire Unnerfed | Helwalker Rekke | Permanent Per-Rest Bonuses | PoE Items for Deadfire | No Recyled Icons | Soul Charged Nautilus

 

Link to comment
Share on other sites

Hey Gairnulf,

 

any plans to add a search function to the tool?

 

There are so many abilities and effects that it can be daunting to find the one you want. A search feature like the one in the Unity Console mod would be amazing.

 

IDK if it's exactly what you're thinking of or not, but you can use the browser's search function to find something in the bundle you're currently editing rather than just trying to scroll through & read.  At least, it works in Chrome.

  • Like 1
Link to comment
Share on other sites

Hey Gairnulf,

 

any plans to add a search function to the tool?

 

There are so many abilities and effects that it can be daunting to find the one you want. A search feature like the one in the Unity Console mod would be amazing.

Yep, what Seroster says. I'm pretty sure I answered this question once, though I think it was on the Codex. It's also explained as a "Tip" in How-To #1 - Simple Edit & Export

 

I am still planning to make a search feature. It's pretty simple with Angular's patterns, but I want to enable Global.gamedatabundle objects for editing first.

  • Like 1

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

I'm experiencing a peculiar problem: I am trying to change whether abilities are castable outside of combat, which should be as simple as loading the abilities bundle & changing a "Yes" to "No" & clicking save.  However, when I do that and go to the "export" window, it says "There is nothing to export".  In something that might? be related, while modding the same abilities to allow self-targeting, it was listing/exporting the changes made to the attacks bundle (where you actually determine what targets are eligible) as the abilities bundle, in addition to an additional file for the attack bundle.

 

I haven't fiddled with this situation too much other than to re-load the editor in my browser, so I'll mess with it some more.  But it's odd for sure.

 

Edit: Fiddling around more, it seems to be having the same issue regardless of what fields I change, after saving & viewing the export window it's just "There is Nothing to Export".  I can then return to the abilities window & the changes are still listed there as having been made. I also realized that the Paladin ability changes I made before had the same issue, the actual text in the abilities bundle that was exported was data from the attacks bundle changes I made instead. 

Edited by Seroster01
Link to comment
Share on other sites

Hello friend, I am attempting to swap out the ability "mind wave" for "Citzals spirit lance" in the progression tables, however I do not see any effect when placing the edited gamedata in the override folder. does the name of the gamedata file have to be specific? Should I create a copy of the Spirit lance spell specifically for the cipher class, as to edit the resource it requires? I would also like to make the lance a once per encounter spell.

Link to comment
Share on other sites

I'm experiencing a peculiar problem: I am trying to change whether abilities are castable outside of combat, which should be as simple as loading the abilities bundle & changing a "Yes" to "No" & clicking save.  However, when I do that and go to the "export" window, it says "There is nothing to export".  In something that might? be related, while modding the same abilities to allow self-targeting, it was listing/exporting the changes made to the attacks bundle (where you actually determine what targets are eligible) as the abilities bundle, in addition to an additional file for the attack bundle.

 

I haven't fiddled with this situation too much other than to re-load the editor in my browser, so I'll mess with it some more.  But it's odd for sure.

 

Edit: Fiddling around more, it seems to be having the same issue regardless of what fields I change, after saving & viewing the export window it's just "There is Nothing to Export".  I can then return to the abilities window & the changes are still listed there as having been made. I also realized that the Paladin ability changes I made before had the same issue, the actual text in the abilities bundle that was exported was data from the attacks bundle changes I made instead.

I'll test this out, it could be some error on my end.

 

Is there a way to use this tool to edit individual weapons or armor? Like if i wanted to give the valian republic clothes 9 armor rating instead of 3?

I don't think there is a tool for that yet. I'll make a section for items.gamedatabundle objects, though that will come after I'm done with other tasks - global.gamedataobjects, revisiting abilities to add forms for specific ability types, adding a sort field on object lists, possibly some layout improvements for better readability. I also have stuff to fix on the upload screen.
  • Like 1

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

Thought of something that might be relevant: I was loading the 1.1 versions of the bundles to edit since I DLd the Beta already.

 

It didn't seem to be a problem for anything I changed, other than the abilities bundle like I mentioned. But I figured it might be part of the problem so I figured I'd bring it up.

  • Like 1
Link to comment
Share on other sites

Another Bug report:

 

I made a small mod to change the base duration of Time Parasite's buff portion from 12s to 20s and hit save.  I later got in-game & viewed the tooltip, it read 0% buff w/ the new duration.  Looked in the exported file, the value of the buff had been changed from "BaseValue": 1.5 to "BaseValue": 1 without me touching that field at all. 

 

To make sure the issue wasn't related to the fact that I'm using 1.1 bundles I closed the editor in my browser & opened a new session, and the base value was 1.5, which is correct for the release version (it was nerfed to 1.25 in the 1.1 version).  I then made the mod again, and checked the file, which had the same problem, the value had changed itself to 1.

 

I then realized I could view the export text in the editor itself, and reloaded the editor another time to repeat the process.  This time I additionally modded the duration of the Time Parasite debuff. Once again, if I changed the duration to 20 (did not test other values), and the result was the buff was "BaseValue": 1,.debuff was "BaseValue": 0,.

 

Not sure what the deal is here, this doesn't make sense from what I know of scripting.   :blink:

  • Like 1
Link to comment
Share on other sites

Gairnulf, would it be possible to have a feature whereby you load two versions of the same file and Spiritual Successor highlights the differences?

 

It would be super-handy to have the possibility to quickly work on changes.

"Time is not your enemy. Forever is."

— Fall-From-Grace, Planescape: Torment

"It's the questions we can't answer that teach us the most. They teach us how to think. If you give a man an answer, all he gains is a little fact. But give him a question, and he'll look for his own answers."

— Kvothe, The Wise Man's Fears

My Deadfire mods: Brilliant Mod | Faster Deadfire | Deadfire Unnerfed | Helwalker Rekke | Permanent Per-Rest Bonuses | PoE Items for Deadfire | No Recyled Icons | Soul Charged Nautilus

 

Link to comment
Share on other sites

Although that would indeed be handy, you can already do that kind of thing using offline software like Notepad++ or Ultra Notepad or just your random basic Hex Editor app.

I haven't checked (i.e. I don't know) but I THINK that online JSON editor that was recommended in one of the threads here had a Compare feature.

Link to comment
Share on other sites

Gairnulf, would it be possible to have a feature whereby you load two versions of the same file and Spiritual Successor highlights the differences?

 

It would be super-handy to have the possibility to quickly work on changes.

It is possible, but I doubt I'll ever get to doing such a feature, because there are so many free programs that can do the same. Here is one for example. It's just a huge luxury when you are coding something in your free time :) I have other QoL features in mind though, which will be unique and will make editing a lot easier.

 

Although that would indeed be handy, you can already do that kind of thing using offline software like Notepad++ or Ultra Notepad or just your random basic Hex Editor app.

 

I haven't checked (i.e. I don't know) but I THINK that online JSON editor that was recommended in one of the threads here had a Compare feature.

There is an online JSON editor which is also available as a Chrome extension. It's great for searching and for quickly formatting the gamedatabundle files.

A Custom Editor for Deadfire's Data:
eFoHp9V.png

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...