{"id":42558245,"url":"https://github.com/widberg/SeriousSaveEditor","last_synced_at":"2026-04-16T23:00:53.949Z","repository":{"id":297140537,"uuid":"994485243","full_name":"widberg/SeriousSaveEditor","owner":"widberg","description":"A save editor for Serious Engine games","archived":false,"fork":false,"pushed_at":"2025-12-25T01:07:59.000Z","size":38,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-29T10:15:36.912Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/widberg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-02T02:26:46.000Z","updated_at":"2025-12-25T01:08:02.000Z","dependencies_parsed_at":"2026-01-25T00:00:53.401Z","dependency_job_id":null,"html_url":"https://github.com/widberg/SeriousSaveEditor","commit_stats":null,"previous_names":["widberg/serioussaveeditor"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/widberg/SeriousSaveEditor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/widberg%2FSeriousSaveEditor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/widberg%2FSeriousSaveEditor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/widberg%2FSeriousSaveEditor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/widberg%2FSeriousSaveEditor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/widberg","download_url":"https://codeload.github.com/widberg/SeriousSaveEditor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/widberg%2FSeriousSaveEditor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31907720,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T18:22:33.417Z","status":"ssl_error","status_checked_at":"2026-04-16T18:21:47.142Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-28T20:00:26.606Z","updated_at":"2026-04-16T23:00:53.943Z","avatar_url":"https://github.com/widberg.png","language":"Rust","funding_links":[],"categories":["Game \u0026 Studio Tools"],"sub_categories":["Monolith Productions"],"readme":"# SeriousSaveEditor\n\nA save editor for Serious Engine games\n\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/widberg/SeriousSaveEditor/build.yml)](https://github.com/widberg/SeriousSaveEditor/actions)\n![GitHub Release](https://img.shields.io/github/v/release/widberg/SeriousSaveEditor)\n[![Release Nightly](https://img.shields.io/badge/release-nightly-5e025f?labelColor=301934)](https://nightly.link/widberg/SeriousSaveEditor/workflows/build/master)\n\n## Support\n\nRight now it only works with The Talos Principle since that's the only game I own, if I ever get more Serious Engine games I'll probably add support for them. I also only tested saves from the latest Steam version, but it may work with other versions. This was a weekend project, so manage expectations accordingly. The outer signature stream format used for save files is also used for some engine files like `The Talos Principle\\Content\\Talos\\{All.dat, DLC.dat}`.\n\n| Year | Game                                 | Serious Engine Version | Status |\n|------|--------------------------------------|------------------------|--------|\n| 2001 | Serious Sam: The First Encounter     | 1                      | ❌      |\n| 2002 | Serious Sam: The Second Encounter    | 1                      | ❌      |\n| 2002 | Serious Sam: Xbox                    | 1                      | ❌      |\n| 2005 | Serious Sam 2                        | 2                      | ❌      |\n| 2009 | Serious Sam HD: The First Encounter  | 3                      | ❌      |\n| 2009 | Serious Sam HD: The Second Encounter | 3                      | ❌      |\n| 2011 | Serious Sam 3: BFE                   | 3.5                    | ❌      |\n| 2014 | The Talos Principle                  | 4                      | ✔      |\n\n## Usage\n\nMake sure to back up any save files, and backup save files, before messing with them! It is also probably best to disable cloud saves and go offline to avoid Steam overwriting your files while messing with them.\n\nYou can extract a save file to JSON with the following command. The `-j` argument specifies the output format to be JSON instead of the default binary. The `-u` argument is optional and if supplied will check the save file signature using that userid. For Steam save files https://www.steamidfinder.com/ may be helpful in finding your lowercase steamID64 (Hex). I'll admit the user experience isn't great even with the JSON format, it's a complicated format and I only have so much time to spend on fun stuff so you get what you get.\n\n```console\n$ SeriousSaveEditor x PlayerProfile.dat PlayerProfile.dat.json -j -u 1100001075d8dea\n```\n\nIf you're interested in figuring out more about the format and what individual fields are for, I recommend using [difftastic](https://github.com/Wilfred/difftastic) to compare JSON extracted save files at different points in the game, i.e. before and after opening a door. It looks like in older versions of the save format field name strings were used instead of IDs, I might try downpatching my copy to see if I can get anything useful out of that or if it's left over from previous games. Also, since the game is extremely backwards compatible when it comes to loading old saves, it's possible these strings are still in the game if old saves used them.\n\nOnce you are done messing with it you can create a new save file from the JSON with the below command, with the options listed it will be as if the game itself created the save. Again the userid is optional. If you supply one the game will check for it and it must match for the save to load. By default this tool will not guess if the save was for the unrestricted version or not, and so the game wont check the executable when loading the save. You can pass `-g` to lock the save to a particular executable. Or pass `-m \"\u003cmemory stream:PlayerProfile_unrestricted.dat\u003e\"` or `-m \"\u003cmemory stream:PlayerProfile.dat\u003e\"` to force a particular stream name.\n\nNote that the backup saves do not include the `.bkp` extension in the memory stream name. Also note that the backup files are just older copies of the non-backup file and not special in any way. You must make sure a backup file exists with the correct name even if it is an empty file.\n\n```console\n$ SeriousSaveEditor c PlayerProfile.dat.json PlayerProfile.dat -j -g -u 1100001075d8dea\n```\n\n### Save Transfers\n\nIf you want to use someone else's save or make a save that any userid and executable can load you can extract and recreate it without specifying a memory stream name or userid. These commands will work even if the JSON parser doesn't work for your save file since they use the unparsed binary format.\n\n```console\n$ SeriousSaveEditor x PlayerProfile.dat PlayerProfile.dat.bin\n$ SeriousSaveEditor c PlayerProfile.dat.bin PlayerProfile.dat\n```\n\nKeep in mind that the next time the game saves it will be signed normally.\n\n### Other Engine Files\n\nThe `The Talos Principle\\Content\\Talos\\{All.dat, DLC.dat}` files can be modified using this tool by passing the `--no-gz` option. This works because those files are the same format as save files but not compressed. Also note that the memory stream names for these files are `Content/Talos/All.dat` and `Content/Talos/DLC.dat`.\n\n```console\n$ SeriousSaveEditor x All.dat All.dat.json -j --no-gz\n$ SeriousSaveEditor c All.dat.json All.dat -j --no-gz\n```\n\n## Issues\n\nIf you find a save file that fails to parse or yields unexpected results, please open an issue with the offending save file attached so I can add it to my test corpus. I don't have a large sample size of save files to test with, so I'm sure there are edge cases that I haven't encountered yet.\n\nAlso, if you have or want any information about Serious Engine internals, please feel free to reach out. If you're in a modding Discord for any Serious Engine games send me an invite.\n\n## Patterns\n\nI've left some [ImHex](https://imhex.werwolv.net/) patterns I made while working on this in the `patterns` directory. They're good for debugging but the Rust code is definitely the source of truth.\n\n## Prior Work\n\n* watto studios\n  - [Viewer_ZIP_PK_TEX_SIGSTRM12GIS](https://www.watto.org/specs.html?specs=Viewer_ZIP_PK_TEX_SIGSTRM12GIS)\n  - [Viewer_ZIP_PK_TEX_SIGSTRM12GIS.java](https://github.com/wattostudios/GameExtractor/blob/master/src/org/watto/ge/plugin/viewer/Viewer_ZIP_PK_TEX_SIGSTRM12GIS.java)\n* bmaupin\n  - [talos-principle-save-file.md](https://gist.github.com/bmaupin/a9f55a4fd167aad40857db2a26e1672f#file-talos-principle-save-file-md)\n\n## Getting Started\n\n### Prerequisites\n\n* [Rust](https://www.rust-lang.org/)\n\n### Checkout\n\n```sh\ngit clone https://github.com/widberg/SeriousSaveEditor.git\ncd SeriousSaveEditor\n```\n\n### Build\n\n```sh\ncargo build --release\n```\n\n### Test\n\n```sh\ncargo test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwidberg%2FSeriousSaveEditor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwidberg%2FSeriousSaveEditor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwidberg%2FSeriousSaveEditor/lists"}