[Tool] GD save file editor

GD Savefile editor

Links:
https://tiny.cc/gdedexe (Windows)
https://tiny.cc/gdednixbin (Linux)

What is it?

This is a tool that lets you look at and modify the contents of your save file.
Want to rename your character? Sure.
Want to change your level? What about skill points or devotion points? Not a problem.
Want to a specific piece of gear? Easy.

That is… if you’re willing to put up with a command-line tool.

Yes, it’s a command-line tool. Why would I choose to make such a thing?
Because… I’m a lazy programmer?

A command-line tool lets me just focus on dealing with the features instead of fighting the UI. If
you’re willing to overlook the barebones non-UI, I think you’ll find a pretty useful little utility
to tweak your character to better enjoy the game.

Need help?

Please see the FAQ page first!

https://odie.github.io/gd-edit-docs/faq/

There’s even a search function there.
If an answer isn’t there, you can always post your question here!

Also, if you’d like an exhaustive list of commands and detailed documentation on them, try:
https://odie.github.io/gd-edit-docs/commands/

Leave me a note here if any of the documentation seems hard to read!

Before getting started

This thing needs Java 8 to run.
You can get your very own copy here: https://java.com/en/download/manual.jsp
Please be sure to download the 64bit version for your platform.

How to use it

TLDR version

  • show command to explore and examine fields
  • set command to set new values into fields
  • help <cmd name> command to see some help and get some examples
  • Press up-arrow key for command history

The First step

Run the program. A “beautiful” command line window will pop up, having located all your save files. A little > is shown at the bottom of the screen, showing you that the program is waiting for your input. This is “the prompt”.

At the prompt, all the capabilities (commands) of the program is at your fingertips! How exciting! Also, whatever is shown on screen can also be used as additional commands. Let’s try one now!

Select a save file to load by pressing the number corresponding to the save file you want to
load. Hit enter to send your input to the program. (For example, hit ‘1’, then enter)

That’s it! You’ve loaded your character (hopefully). You’ve just entered a “command”, which consists of putting in some text at the prompt and hitting the enter key.

The core commands: show and set

So what exactly can we do with this character file that’s been loaded? Where are these so-called “capabilities” that we talked about?

Well, now that you have the file loaded, you can change every piece of information that the
Crate devs have carefully packed into the save files.

Try using the show command. A list of 90 some fields, listed in alphabetical order, should scroll by. Enlarge the window or use your mouse wheel to see more of the output.

Changing your level

[This example illustrates how to use the “set” and “show” command. For a more robust way to change your character level, use the “level” command.]

The editor should have shown you a LOT of fields. Don’t feel like look at them all?
Try this command: show level
This says to show any fields with the string “level” in its name.

On my loaded character, it shows something like this:

 
character-level : 42
   level-in-bio : 42
      max-level : 42

                3 fields

What? A lowly 42 level character? But I want a god-like 85 level character!

Try putting in these commands:
set character-level 85
set level-in-bio 85
set max-level 85
show level

Okay. Now your character is at level 85. Save your character by inputting w at the prompt. This will make a backup of your current save file, then write out a file that gives you a level 85 character. Go ahead and make sure it worked by loading up the character in the game. I can wait. =)

Okay! That wasn’t so hard now, was it? What else can this thing do? Well, as said, the program can manipulate any field you can see. So things like devotion points (try show devotion) or skill points (try show skill) can be changed just like we did with the character level. The same can be done with your character name or gender or whatever-you-want. Just look around with the show command.

Changing your equipment and weapon

So changing some values are neat. But you want a bit more? Didn’t I mention something about items?

Let’s take a look at where they are in your loaded character.
show equipment shows you all the items you have equipped on your character
show inventory-sacks shows you all your inventory sacks
show weapon-sets shows your equipped weapons, including your alternate set

Let’s try checking out the weapons you have equipped.
show weapon-sets

hmm… The output is a bit cryptic…

	0:
   		items : collection of 2 items
   	       unused : false

	1:
   		items : collection of 2 items
  	       unused : true

There seem to be two sets of identical fields. The top one is labeled “0:”?

Try “show weapon-sets/0”
Now it just says:

  	   items : collection of 2 items
	  unused : false

       2 fields

Right, the second set isn’t shown anymore because you asked to see the first set, labeled “0”.
Can we see what the items actually are?

Try show weapon-sets/0/items
Wait! Just in case you’ve been entering everything by hand up to this point by hand… Try pushing the up-arrow key. Yeah, it’ll show you the last command entered. You can use the up-arrow and down-arrow key to navigate forward and backward in the command history.

Less typing = less work = lazy = my cup of tea

Ohhh hey! It shows something more!

	0:
	        attached : true
	    augment-name : ""
	    augment-seed : 0
	        basename : records/items/gearweapons/melee2h/d005_blunt2h.dbr
	   modifier-name : ""
	     prefix-name : ""
	     relic-bonus : ""
	      relic-name : records/items/materia/compb_hauntedsteel.dbr
	      relic-seed : 472303388
	            seed : 458229418
	     stack-count : 1
	     suffix-name : ""
	  transmute-name : ""
	         unknown : 0
	            var1 : 4

	1:
	        attached : false
	    augment-name : ""
	    augment-seed : 0
	        basename : ""
	   modifier-name : ""
	     prefix-name : ""
	     relic-bonus : ""
	      relic-name : records/items/materia/compb_hauntedsteel.dbr
	      relic-seed : 472303388
	            seed : 458229418
	     stack-count : 1
	     suffix-name : ""
	  transmute-name : ""
	         unknown : 0
	            var1 : 4

So there are two items in the “weapon-sets/0/items” collection. But it’s hard to tell heads or tails from what’s being shown here.

Well, as it turns out, Grim Dawn items are first defined by a “basename”, which points to the game’s database record that defines what the thing is. It can then be further enhanced by prefix, suffix, and augment, all of which should point at their appropriate DB records.

Sooo… that means we can’t even tell what the item is until we look in the game’s DB? It just so happens that we have the DB loaded and ready to go.

Let’s dig a bit deeper into this item collection.

Try show weapon-sets/0/items/0

O-kay… It shows quite a bit more, doesn’t it? It shows you the primary weapon you have equipped. It’ll show you the name, then the “contents” or fields that define the weapon, then a list of records that relates to the item. More specifically, it’ll show you the basename, prefix, suffix, and augment records if they are available.

That just lets us look at the item though. How do we change the item?

As mentioned earlier, if you know the exact basename, prefix, and suffix, you make any item you want! As a matter of fact, the editor has a command to help look up records in the database!

Ain’t nobody got time for dat! I want my sweet gear NOW!
set weapon-sets/0/items/0 "Ultos' Stormseeker"

Save with ‘w’ and load up the game!

Be warned though. If you go overboard with boosting your character and gear, the game won’t be very fun anymore. So you might want to give yourself something a bit more modest.

set weapon-sets/0/items/0 "vampiric legion warhammer of valor"

As you can see, the editor is happy to decipher and find the right basename, prefix, and suffix for you.

Lastly, if you want to find out more about what the editor can do, or need some examples of how it can be used, use the “help” command!

Got questions and/or issues? Just drop me a note here.

That just about wraps it up for this post. I can’t believe you read this wall of text! Good work! Now go give yourself
some nice gear to play with.

Warning:
This is alpha quality software.
Although it does function normally most of the time,
don’t be surprised if you see some exceptions thrown here and there.

Also, I don’t claim to know how all the fields affect the game, but they are exposed for tinkering. If something should go wrong, the editor should have made a backup for you, so don’t worry (too much)!

12 Likes

Awesome!!! thanks man…was tired and chose the wrong faction…took 2 minutes to fix!!!

Great! Glad you found it useful!

Thanks for letting me know too! I honestly have no idea if anybody is using this thing.

try to use it for rename character, but can’t load anyone character is there any instructions for setup?

possibly a derp on me, but it keeps asking for java

and I have java installed :rolleyes:

Is this GoG Compatible? as all I get when I run it is :

Please choose a character to load:

No matter which character name I type in I get :

Don’t know how to handle this command

My save folder has a pile of loose files and a single main folder inside this folder is the name of my Characters shown as

_xxxxx
_yyyyy
_zzzzz

Regards

Hmm… The editor needs java 8 to run. Maybe you have an earlier version installed? Would you mind installing the latest version and trying again?

https://java.com/en/download/

Hi there!

There isn’t anything to setup (besides java). The editor was written assuming people are playing via Steam using cloud save though (only because that’s what my setup is).

Anyway, if you can tell me a bit more about your setup, I can update the editor to better find your character files.

It’ll be really helpful to know:

  • Are you running the Steam version or GOG version?
  • If on Steam, are you using cloud save?

Unfortunately, the editor was developed against the steam version so it looks in the default steam save file path. It shouldn’t be too hard to add more paths to look for save files though.

Can you give me the full path to the “main” folder where your characters are? Also, did you install the game to the default install path? Or did you install the game to a custom location?

I’m just trying to figure out if I should add a way for people to just tell the editor where the save file directory is, in case they installed to a non-standard location.

“My Documents\My Games\Grim Dawn\save”, that’s the non-cloud steam folder at least.

https://dl.dropboxusercontent.com/u/3848680/grimdawn/editor/gd-edit-0.1.0-SNAPSHOT.exe

Alrighty… Here’s a build that will look both in the local save folder “My Documents\My Games…” and the steam cloud save folder.

Let me know if this works for you!

1 Like

Hello Odie,

your last upload works for GoG.com users. Thank you.

Will it be possible, that the tool looks in the directory where it is for the save files. Or can you make an command line option to define the path? Then people with a custom paths can use it too.

Hi Wariat,

Sure. All the options you laid out are possible. Can I ask what kind of workflow you imagine a feature like this might support? If you can describe what you want to achieve, it’ll help me a lot in figuring out what exact features to put in.

Let me describe the workflow the editor currently supports. The editor reads and write to the save files at the location that can be found be the game. That means it’s possible to fire up the editor, make a change, write out the file, fire up the game to check the changes (without quitting the editor), then drop out of the game to continue any edits. If I make a change to the character while I’m in the game checking the edits, when I return to the editor, I have the option to load the new changes by using the reload menu command, or I can overwrite the changes made by the game by writing out the character file again.

If we add a new feature for the editor to also be able to find save files in custom locations, then the previous workflow would become quite a bit more complicated. Making edits and checking those edits would then involve having to manually move the save files to where the game can see the file. I imagine juggling files like this might get tiresome quite quickly.

This isn’t to say that the editor can’t help automate some of this stuff though. But, once again, I think I need to get a better idea of what you’re trying to do with the editor to better help design a set of commands or features around it.

from occultist to nightblade…how? lol ty and happy holidays

From occultist to nightblade…how? happy holidays!

Hi,

GoG version, java is installed, Rus localization, so characters have cyrillic letters, but i try to rename new character with English name.

In folder path with save files there is no cyrillic letters.

I’ve tryed version posted above but still no characters in list and got this exception

> load _Loken

caught exception: nil
java.lang.NullPointerException: null
at clojure.lang.Atom.swap (Atom.java:37)
clojure.core$swap_BANG_.invokeStatic (core.clj:2342)
clojure.core$swap_BANG_.invoke (core.clj:2335)
gd_edit.command_handlers$choose_character_handler.invokeStatic (command_handlers.clj:280)
gd_edit.command_handlers$choose_character_handler.invoke (command_handlers.clj:277)
gd_edit.core$fn__2012.invokeStatic (core.clj:46)
gd_edit.core/fn (core.clj:46)
gd_edit.core$repl_eval.invokeStatic (core.clj:148)
gd_edit.core$repl_eval.invoke (core.clj:118)
gd_edit.core$repl_iter.invokeStatic (core.clj:158)
gd_edit.core$repl_iter.invoke (core.clj:153)
gd_edit.core$repl$fn__2046.invoke (core.clj:166)
gd_edit.core$repl.invokeStatic (core.clj:165)
gd_edit.core$repl.invoke (core.clj:161)
gd_edit.core$_main.invokeStatic (core.clj:196)
gd_edit.core$_main.doInvoke (core.clj:186)
clojure.lang.RestFn.invoke (RestFn.java:397)
clojure.lang.AFn.applyToHelper (AFn.java:152)
clojure.lang.RestFn.applyTo (RestFn.java:132)
gd_edit.core.main (:-1)

Happy Holidays Stryker13!

https://dl.dropboxusercontent.com/u/3848680/grimdawn/editor/gd-edit-0.1.1-SNAPSHOT-standalone.exe

Here’s a new build that can help you when changing your class (a bit).
There are 3 new commands:

“class” => Shows you the loaded character’s classes/masteries
“class add” => Add a new class/mastery to the character
“class remove” => Remove a current class/mastery from the character

How to use them
So!
Here’s how to use this…

Try the command “class”
On one of my characters, the editor shows me…

classes:
    Arcanist

If the character had multiple masteries selected, it’ll show all of them. Well, maybe I don’t want to be an Arcanist anymore. I hear Warder builds can be kind of neat…

Do “class remove arcanist”

Removing class: Arcanist
classes:
    None

Follow that up by “class add soldier” and “class add shaman”.

Adding class: Soldier
classes:
    Soldier
Adding class: Shaman
classes:
    Soldier
    Shaman

Each time one of these command runs, it’ll tell you what it just tried to do and what classes your character ended up with. You can always run the “class” command to check again.

Anyway, hit ‘w’ to write out the save file and fire up the game. At the character selection screen, you’ll see that the class of the character has not been changed. Worry not. Just start the game with your character and open up the skill window. You’ll see that the right masteries really has been chosen. Your character selection screen will show the right class the next time you visit it.

What they don’t do
These commands don’t change or remove any of the skills you have already invested points into. If you want to remove those, you’ll have to visit Morland at Devil’s Crossing. You may want to give yourself a bit of iron for that (“set iron <whatever number you want>”). You might also want to change the skill-points-reclaimed field to decrease the respec cost.

You might also want to look at the “masteries-allowed” field. A character usually ends up with 2 masteries. You can try changing this to 3 or more if you’re adventurous. The editor places no limits on how many masteries you can add via “class add”. I don’t know how the game will react to this though.

Did I mention this is alpha software and that everything is experimental?

Anyway, give it a spin and let me know how it goes!

Howdy!

When you start up the game, do you see a menu that looks like this?

Please choose a character to load:
1) _Blank Slate (cloud save)
2) _Odie (cloud save)

If you do, then you can just enter “1” or “2” at the prompt, followed by the enter key to choose the character you want to edit.

If the character is loaded successfully, you should see the next menu, which looks like:

Character:  Odie
r) reload
w) write

This lets you know that the character named “Odie” has been loaded and that the current options are to either type “r” or “w” for the corresponding actions.

The editor mixes menu options/commands with other commands you can enter at the prompt. Sorry if this is all a bit confusing. Perhaps I didn’t give that part of the program very much thought. :o

If you’re still having issues… you might want to zip up the save directory and send it to me to test with.

There is still issues…


screenshot with runing utilitie and zip with save

Hi Odie, great program!

Encountered this error when I was trying to access the weaponsets menu. My steam folder isn’t installed in C:\ <_>. I’m wondering if I can get around this by making a copy of the file/folder into the resource path it’s looking for.

Oh, and I’m using the latest version you posted, 2-3 posts above. 0.11 I believe.

“show weaponsets/0/item/0”

caught exception: java.io.FileNotFoundException: C:\Program Files (x86)\Steam\steamapps\common\Grim Dawn\resources ext_en.arc (The system cannot find the path
specified)

caught exception: nil
org.jline.reader.UserInterruptException: null
at org.jline.reader.impl.LineReaderImpl.readLine (LineReaderImpl.java:562)
sun.reflect.NativeMethodAccessorImpl.invoke0 (:-2)
sun.reflect.NativeMethodAccessorImpl.invoke (:-1)
sun.reflect.DelegatingMethodAccessorImpl.invoke (:-1)
java.lang.reflect.Method.invoke (:-1)
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:93)
clojure.lang.Reflector.invokeInstanceMethod (Reflector.java:28)
gd_edit.jline$readline.invokeStatic (jline.clj:31)
gd_edit.jline$readline.invoke (jline.clj:17)
gd_edit.core$repl_read.invokeStatic (core.clj:35)
gd_edit.core$repl_read.invoke (core.clj:31)
gd_edit.core$repl_iter.invokeStatic (core.clj:167)
gd_edit.core$repl_iter.invoke (core.clj:162)
gd_edit.core$repl$fn__2100.invoke (core.clj:175)
gd_edit.core$repl.invokeStatic (core.clj:174)
gd_edit.core$repl.invoke (core.clj:170)
gd_edit.core$_main.invokeStatic (core.clj:205)
gd_edit.core$_main.doInvoke (core.clj:195)
clojure.lang.RestFn.invoke (RestFn.java:397)
clojure.lang.AFn.applyToHelper (AFn.java:152)
clojure.lang.RestFn.applyTo (RestFn.java:132)
gd_edit.core.main (:-1)