Open Charles-Stuart opened 2 months ago
I believe you want to serialize the save state so that it is no longer in the binary representation.
I was able to do this for my website by applying serde
to many structs in the code. You can read more about that on #34
After doing that, you can export the save state as json (I do this internally on my website, feel free to copy the code)
What language are you using? Or would a cli tool meet your needs?
@twp2000 what programming language 😂. I can compile you a library to convert save state to json. Just want to know how you would use it.
It could be a cli tool you call with bash or PowerShell.
Could be a python lib
Npm library... Etc
Hey, if I could get it as a CLI tool, that would be FANTASTIC. I'm a huge Powershell guy, a CLI tool would be the holy grail for my plans.
elden-ring-save-parser-cli.zip
Here is the code I used to make the executable: https://github.com/EthanShoeDev/elden-ring-compass/tree/cli-tool/packages/elden-ring-save-parser-cli
@Charles-Stuart
Download the zip, extract the exe. Open PowerShell in same folder as exe.
Run the command: 'elden-ring-save-parser-cli.exe --save-file {PATH_TO_SAVE_FILE}'
Then there will be a new file called 'output.json'
You can look at the screenshot I attached as an example
Download the zip, extract the exe. Open PowerShell in same folder as exe.
Run the command: 'elden-ring-save-parser-cli.exe --save-file {PATH_TO_SAVE_FILE}'
Then there will be a new file called 'output.json'
You can look at the screenshot I attached as an example
Thank you! I'll try this as soon as I'm home tonight
Could be something wrong with the cli, let me know when you give it a real shot. You can also try to upload it to my website here: www.eldenringcompasss.com.
If my website can't parse your save, neither will the cli. You can also send me your save and I will be sure it can work.
@EthanShoeDev , sorry for the delay. My flight got caught up in yesterday's nightmare outage. Thank you so much, the CLI seems to be working. I'll look in more depth soon to see if I can find a table or something to help convert the ID values to item names.
It definitely picked up on my save's current level! Again thank you!
@EthanShoeDev This cli looks great. However, inside the output.json, there are some entries that are not easily interpretable. For example, what are those hexadecimal numbers "_0x290" and "gaitem_handle"?
@SongTonyLi I somewhat lazily converted the raw save to json. Essentially the author of this repo made structs that match up perfectly with save offset.
Save is a file of contiguous memory.
ClayAmore wrote a lot of rust structs such as:
struct SaveHeader {
someRandomThing: 4 bytes
playerName: x bytes
}
This is a gross simplification but I think it gets the point across. Some properties in the struct are helpful, others are completely unknown.
The json cli that I made just json serializes the structs without much thought. This includes some useful properties (like playerLevel) and some unknown regions of the save.
Obviously, this could be cleaned up a lot but the op poster wanted to track the save with git. I figured that even if the json is a mess, they could still get some value by viewing the diffs.
There is a section in the save file that stores all inventory gaHandles (whatever that is) and another region of the save that has all the persistent event flags. If you actually want to read that data usefully, you need a map from Item names to item gaHandle and a map from event name to event flag offset.
The code that does this exists within this repo in the vm
folder. I did not include that in the cli.
I have also rewritten all the vm
(view models) in typescript for my website. I couldn't think of a way to easily embed my typescript view models in the cli unless the op installed bun or nodejs.
If I were better at rust, I could just rewrite the vms in this repo to work in a cli mode but I have not done that :)
Edit: It would be somewhat trivial to add a more useful export to json on my website (because I can use my typescript view models). Would that help?
I mean if it were something we could hook into (like a REST API), then that would be fantastic! Like, for example, if we could PUT with the .sl2 file's contents and have it respond with the JSON text, then we'd have a pretty solid way of building on this in the future. That being said, something like that would put more strain on you if you got too much traffic to your site...
hey @EthanShoeDev, I am looking for help parsing a save file using savewizard.net, when opening this file it simply crashes. The logs say the following error
thread 'main' panicked at src/save/common/user_data_11.rs:31:9:
assertion failed: user_data_11.rest[0] == 0 || user_data_11.rest[0] == 151 ||
user_data_11.rest[0] == 27
system: macos rust version: 1.78.0
full log running RUST_BACKTRACE=full cargo r
👇
thread 'main' panicked at src/save/common/user_data_11.rs:31:9:
assertion failed: user_data_11.rest[0] == 0 || user_data_11.rest[0] == 151 ||
user_data_11.rest[0] == 27
stack backtrace:
0: 0x1053cca10 - std::backtrace_rs::backtrace::libunwind::trace::h6de1cbf3f672a4f8
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/../../backtrace/src/backtrace/libunwind.rs:105:5
1: 0x1053cca10 - std::backtrace_rs::backtrace::trace_unsynchronized::hd0de2d5ef13b6f4d
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
2: 0x1053cca10 - std::sys_common::backtrace::_print_fmt::h2a33510d9b3bb866
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:68:5
3: 0x1053cca10 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h01b2beffade888b2
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:44:22
4: 0x1053e8f9c - core::fmt::rt::Argument::fmt::h5ddc0f22b2928899
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/fmt/rt.rs:142:9
5: 0x1053e8f9c - core::fmt::write::hbadb443a71b75f23
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/fmt/mod.rs:1153:17
6: 0x1053ca724 - std::io::Write::write_fmt::hc09d7755e3ead5f0
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/io/mod.rs:1843:15
7: 0x1053cc868 - std::sys_common::backtrace::_print::h3cd1786cbb1caf0f
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:47:5
8: 0x1053cc868 - std::sys_common::backtrace::print::h28349e5c25acbac7
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:34:9
9: 0x1053cdd7c - std::panicking::default_hook::{{closure}}::hd24b6196784d991e
10: 0x1053cda60 - std::panicking::default_hook::hfcec80a2720c8c73
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:292:9
11: 0x1053ce670 - std::panicking::rust_panic_with_hook::h84760468187ddc85
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:779:13
12: 0x1053ce030 - std::panicking::begin_panic_handler::{{closure}}::he666a5eb600a7203
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:649:13
13: 0x1053cce94 - std::sys_common::backtrace::__rust_end_short_backtrace::h592f44d2bf9f843f
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:171:18
14: 0x1053cddd4 - rust_begin_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:645:5
15: 0x105420af8 - core::panicking::panic_fmt::h98bbf7bdf4994454
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/panicking.rs:72:14
16: 0x105420b80 - core::panicking::panic::hc59c8a709a9b37ae
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/panicking.rs:145:5
17: 0x104921674 - <er_save_editor::save::common::user_data_11::UserData11 as er_save_editor::read::read::Read>::read::hbe71434c77e87c79
at er-dlc-save-editor/src/save/common/user_data_11.rs:31:9
18: 0x104b11c80 - <er_save_editor::save::playstation::ps_save::PSSave as er_save_editor::read::read::Read>::read::h620cd67910822666
at er-dlc-save-editor/src/save/playstation/ps_save.rs:34:29
19: 0x104b1b38c - <er_save_editor::save::save::save::Save as er_save_editor::read::read::Read>::read::hc4a6390bcc9297e8
at er-dlc-save-editor/src/save/save.rs:779:56
20: 0x104b1b81c - er_save_editor::save::save::save::Save::from_contents::h22ea09d1b0a9d3af
at er-dlc-save-editor/src/save/save.rs:809:13
21: 0x104b1b8a8 - er_save_editor::save::save::save::Save::from_path::h3fd9e13bb5bc0530
at er-dlc-save-editor/src/save/save.rs:814:13
22: 0x104b36eb8 - er_save_editor::App::open::hd07d3a8c44ff1453
at er-dlc-save-editor/src/main.rs:80:21
23: 0x10494eaa8 - <er_save_editor::App as eframe::epi::App>::update::{{closure}}::{{closure}}::{{closure}}::h5a2062e22634af7e
at er-dlc-save-editor/src/main.rs:127:43
24: 0x104b627a0 - core::ops::function::FnOnce::call_once{{vtable.shim}}::hb094262ac93a007b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
25: 0x10520b0b4 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h598133341d38b247
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/alloc/src/boxed.rs:2020:9
26: 0x105240e8c - egui::ui::Ui::with_layout_dyn::heb5f5b1c51007126
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/ui.rs:2020:21
27: 0x1049af9a0 - egui::ui::Ui::with_layout::hb74910119eb355df
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/ui.rs:2011:9
28: 0x10494e6d8 - <er_save_editor::App as eframe::epi::App>::update::{{closure}}::{{closure}}::ha0a790d770ad3cae
at er-dlc-save-editor/src/main.rs:123:17
29: 0x104b61204 - core::ops::function::FnOnce::call_once{{vtable.shim}}::h393d80366d45a598
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
30: 0x104ae39ac - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hd5ca5166b5a14537
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/alloc/src/boxed.rs:2020:9
31: 0x1049ae824 - egui::ui::Ui::columns_dyn::h96c39de6fc3c9b6e
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/ui.rs:2109:22
32: 0x1049b400c - egui::ui::Ui::columns::h04563544a582fa54
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/ui.rs:2081:9
33: 0x10494e5fc - <er_save_editor::App as eframe::epi::App>::update::{{closure}}::h4780e3f2d1afb899
at er-dlc-save-editor/src/main.rs:122:13
34: 0x104b61d60 - core::ops::function::FnOnce::call_once{{vtable.shim}}::h763b424c3eac57b3
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
35: 0x10520b0b4 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h598133341d38b247
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/alloc/src/boxed.rs:2020:9
36: 0x104973e10 - egui::containers::panel::TopBottomPanel::show_inside_dyn::{{closure}}::hbfe27be6b782af38
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/panel.rs:747:13
37: 0x104b62f10 - core::ops::function::FnOnce::call_once{{vtable.shim}}::hd05647eab352387e
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
38: 0x10520b0b4 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h598133341d38b247
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/alloc/src/boxed.rs:2020:9
39: 0x105223240 - egui::containers::frame::Frame::show_dyn::h425e7cea0c1c9bf0
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/frame.rs:270:19
40: 0x104b31ef8 - egui::containers::frame::Frame::show::h982c0d469af27c21
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/frame.rs:261:9
41: 0x104973950 - egui::containers::panel::TopBottomPanel::show_inside_dyn::ha5c772662630ad2d
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/panel.rs:744:30
42: 0x1049742e0 - egui::containers::panel::TopBottomPanel::show_dyn::h8f4e6ace8e745697
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/panel.rs:812:30
43: 0x104974130 - egui::containers::panel::TopBottomPanel::show::hc5f0d892e2556fb3
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/containers/panel.rs:796:9
44: 0x104b37514 - <er_save_editor::App as eframe::epi::App>::update::h067e6b43a361eeb9
at er-dlc-save-editor/src/main.rs:121:9
45: 0x104ee6cf4 - eframe::native::epi_integration::EpiIntegration::update::{{closure}}::h2bf02334eaecfbec
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/epi_integration.rs:284:17
46: 0x104edb23c - egui::context::Context::run::h002cbcc84c0ca0a3
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/egui-0.26.2/src/context.rs:753:9
47: 0x104ee69bc - eframe::native::epi_integration::EpiIntegration::update::h77942932cc6c5fa1
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/epi_integration.rs:277:27
48: 0x104ebbb00 - eframe::native::glow_integration::GlowWinitRunning::run_ui_and_paint::h2a54342119428098
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/glow_integration.rs:578:13
49: 0x104eba8f4 - <eframe::native::glow_integration::GlowWinitApp as eframe::native::winit_integration::WinitApp>::run_ui_and_paint::h0893e62079eb180a
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/glow_integration.rs:402:13
50: 0x104ed1220 - eframe::native::run::run_and_return::{{closure}}::h9d5fb8eda7ea08b2
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:99:17
51: 0x104ef826c - <winit::platform_impl::platform::app_state::EventLoopHandler<T> as winit::platform_impl::platform::app_state::EventHandler>::handle_nonuser_event::{{closure}}::h6a3e7828ceb5b474
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:87:13
52: 0x104efc0f8 - winit::platform_impl::platform::app_state::EventLoopHandler<T>::with_callback::h37d6070437bf6c33
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:70:13
53: 0x104ef8148 - <winit::platform_impl::platform::app_state::EventLoopHandler<T> as winit::platform_impl::platform::app_state::EventHandler>::handle_nonuser_event::hdc5a972b06f42499
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:86:9
54: 0x105087bbc - winit::platform_impl::platform::app_state::Handler::handle_nonuser_event::h2291bd83b5b89cc8
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:318:13
55: 0x1050898e0 - winit::platform_impl::platform::app_state::AppState::cleared::hb4ef04b3e0a8ca94
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:647:13
56: 0x10507ebf4 - winit::platform_impl::platform::observer::control_flow_end_handler::{{closure}}::h9fa80a0747fe73e0
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/observer.rs:79:21
57: 0x10507ea4c - winit::platform_impl::platform::observer::control_flow_handler::{{closure}}::h496abdcc0a7cf0ad
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/observer.rs:41:9
58: 0x1050a8584 - std::panicking::try::do_call::h65accbfd0b220231
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
59: 0x1050ad93c - ___rust_try
60: 0x1050a8384 - std::panicking::try::h2abeb3ce9ad889ba
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
61: 0x1050778dc - std::panic::catch_unwind::hf245e60f7e43ce25
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
62: 0x10508a244 - winit::platform_impl::platform::event_loop::stop_app_on_panic::h6878d14c8a2aabea
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:469:11
63: 0x10507e848 - winit::platform_impl::platform::observer::control_flow_handler::h45dd755bb0d917b0
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/observer.rs:39:5
64: 0x10507eb74 - winit::platform_impl::platform::observer::control_flow_end_handler::hbef54a328ad5a27a
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/observer.rs:74:9
65: 0x1900cd87c - <unknown>
66: 0x1900cd768 - <unknown>
67: 0x1900cce90 - <unknown>
68: 0x1900cc434 - <unknown>
69: 0x19a87019c - <unknown>
70: 0x19a86ffd8 - <unknown>
71: 0x19a86fd30 - <unknown>
72: 0x19392bd68 - <unknown>
73: 0x194121808 - <unknown>
74: 0x19391f09c - <unknown>
75: 0x1050ece60 - <() as objc2::message::MessageArguments>::__invoke::h33698c9396465128
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/message/mod.rs:531:39
76: 0x1050dbcc8 - objc2::message::platform::send_unverified::hb7b93c73b60c2f73
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/message/apple/mod.rs:35:34
77: 0x10506a7c0 - objc2::message::MessageReceiver::send_message::h7fd7aeb374cc5663
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/message/mod.rs:233:53
78: 0x10506d590 - winit::platform_impl::platform::appkit::application::NSApplication::run::h6b60bc62ee44d14d
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/macros/extern_methods.rs:240:14
79: 0x104efb48c - winit::platform_impl::platform::event_loop::EventLoop<T>::run_on_demand::{{closure}}::{{closure}}::h038ef51f97eeb3d8
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:310:26
80: 0x104ef227c - core::ops::function::FnOnce::call_once::h9cad5fd3a3ec15da
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
81: 0x104edcee0 - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::hf15d724d041de8fd
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/panic/unwind_safe.rs:272:9
82: 0x104ef8860 - std::panicking::try::do_call::hac6de455f3c22135
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
83: 0x104efd3d8 - ___rust_try
84: 0x104ef86fc - std::panicking::try::hca45e5dda94a63ac
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
85: 0x104eda464 - std::panic::catch_unwind::hdbcdf6a1bcf28d72
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
86: 0x104efb2f4 - winit::platform_impl::platform::event_loop::EventLoop<T>::run_on_demand::{{closure}}::hbeb9e5292c38f18a
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:299:32
87: 0x104ec502c - objc2::rc::autorelease::autoreleasepool::had6e1acc3316cb29
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/rc/autorelease.rs:438:15
88: 0x104efac6c - winit::platform_impl::platform::event_loop::EventLoop<T>::run_on_demand::hd52e813d86097b07
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:281:9
89: 0x104f0104c - <winit::event_loop::EventLoop<T> as winit::platform::run_on_demand::EventLoopExtRunOnDemand>::run_on_demand::hf574c72329948d18
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform/run_on_demand.rs:80:9
90: 0x104ed0c34 - eframe::native::run::run_and_return::ha5a8a79536c7c891
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:76:5
91: 0x104ed3db8 - eframe::native::run::run_glow::{{closure}}::hbf931888b914ac2f
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:400:13
92: 0x104ed09ac - eframe::native::run::with_event_loop::{{closure}}::he84e9b3afad897ee
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:58:12
93: 0x104ef1260 - std::thread::local::LocalKey<T>::try_with::h65a33c058f66e3b0
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/thread/local.rs:284:16
94: 0x104ef0f64 - std::thread::local::LocalKey<T>::with::h8fe869ef8824b12b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/thread/local.rs:260:9
95: 0x104ed0838 - eframe::native::run::with_event_loop::h890a8378504b2de5
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:48:5
96: 0x104ed3afc - eframe::native::run::run_glow::h4bad5e0c818682c1
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:398:16
97: 0x104ee7494 - eframe::run_native::h380827857d072058
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/lib.rs:262:13
98: 0x104b36c88 - er_save_editor::main::h63aa3f2eb8dc5ad1
at er-dlc-save-editor/src/main.rs:44:5
99: 0x104b65134 - core::ops::function::FnOnce::call_once::h8cda317e205e9840
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
100: 0x1049fbdec - std::sys_common::backtrace::__rust_begin_short_backtrace::h408844d981b09fea
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:155:18
101: 0x1049fbdb0 - std::rt::lang_start::{{closure}}::h669c18e8947b181c
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:166:18
102: 0x1053c7200 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::heaba8a29e0324069
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:284:13
103: 0x1053c7200 - std::panicking::try::do_call::h6e5fac4f4884d97b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
104: 0x1053c7200 - std::panicking::try::h2b98e2f3cf76cd78
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
105: 0x1053c7200 - std::panic::catch_unwind::hba9c97319335c08b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
106: 0x1053c7200 - std::rt::lang_start_internal::{{closure}}::h18efdcfb68f002e8
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:48
107: 0x1053c7200 - std::panicking::try::do_call::ha793e16770aada4d
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
108: 0x1053c7200 - std::panicking::try::h8aa812e3e1310d12
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
109: 0x1053c7200 - std::panic::catch_unwind::h38c4879f2623185e
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
110: 0x1053c7200 - std::rt::lang_start_internal::h39923ab4c3913741
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:20
111: 0x1049fbd74 - std::rt::lang_start::hc12deb7b2f512b49
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:165:17
112: 0x104b37ae8 - _main
thread 'main' panicked at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:387:33:
called `Result::unwrap()` on an `Err` value: PoisonError { .. }
stack backtrace:
0: 0x1053cca10 - std::backtrace_rs::backtrace::libunwind::trace::h6de1cbf3f672a4f8
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/../../backtrace/src/backtrace/libunwind.rs:105:5
1: 0x1053cca10 - std::backtrace_rs::backtrace::trace_unsynchronized::hd0de2d5ef13b6f4d
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
2: 0x1053cca10 - std::sys_common::backtrace::_print_fmt::h2a33510d9b3bb866
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:68:5
3: 0x1053cca10 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h01b2beffade888b2
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:44:22
4: 0x1053e8f9c - core::fmt::rt::Argument::fmt::h5ddc0f22b2928899
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/fmt/rt.rs:142:9
5: 0x1053e8f9c - core::fmt::write::hbadb443a71b75f23
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/fmt/mod.rs:1153:17
6: 0x1053ca724 - std::io::Write::write_fmt::hc09d7755e3ead5f0
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/io/mod.rs:1843:15
7: 0x1053cc868 - std::sys_common::backtrace::_print::h3cd1786cbb1caf0f
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:47:5
8: 0x1053cc868 - std::sys_common::backtrace::print::h28349e5c25acbac7
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:34:9
9: 0x1053cdd7c - std::panicking::default_hook::{{closure}}::hd24b6196784d991e
10: 0x1053cda60 - std::panicking::default_hook::hfcec80a2720c8c73
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:292:9
11: 0x1053ce670 - std::panicking::rust_panic_with_hook::h84760468187ddc85
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:779:13
12: 0x1053ce05c - std::panicking::begin_panic_handler::{{closure}}::he666a5eb600a7203
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:657:13
13: 0x1053cce94 - std::sys_common::backtrace::__rust_end_short_backtrace::h592f44d2bf9f843f
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:171:18
14: 0x1053cddd4 - rust_begin_unwind
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:645:5
15: 0x105420af8 - core::panicking::panic_fmt::h98bbf7bdf4994454
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/panicking.rs:72:14
16: 0x105420f08 - core::result::unwrap_failed::h8e3b933261dd7fec
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/result.rs:1654:5
17: 0x10508820c - core::result::Result<T,E>::unwrap::h64df12b210d2c568
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/result.rs:1077:23
18: 0x10508820c - winit::platform_impl::platform::app_state::AppState::clear_callback::hf401c9391d185b3c
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/app_state.rs:387:9
19: 0x104efb36c - winit::platform_impl::platform::event_loop::EventLoop<T>::run_on_demand::{{closure}}::hbeb9e5292c38f18a
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:329:13
20: 0x104ec502c - objc2::rc::autorelease::autoreleasepool::had6e1acc3316cb29
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/objc2-0.4.1/src/rc/autorelease.rs:438:15
21: 0x104efac6c - winit::platform_impl::platform::event_loop::EventLoop<T>::run_on_demand::hd52e813d86097b07
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform_impl/macos/event_loop.rs:281:9
22: 0x104f0104c - <winit::event_loop::EventLoop<T> as winit::platform::run_on_demand::EventLoopExtRunOnDemand>::run_on_demand::hf574c72329948d18
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/winit-0.29.10/src/platform/run_on_demand.rs:80:9
23: 0x104ed0c34 - eframe::native::run::run_and_return::ha5a8a79536c7c891
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:76:5
24: 0x104ed3db8 - eframe::native::run::run_glow::{{closure}}::hbf931888b914ac2f
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:400:13
25: 0x104ed09ac - eframe::native::run::with_event_loop::{{closure}}::he84e9b3afad897ee
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:58:12
26: 0x104ef1260 - std::thread::local::LocalKey<T>::try_with::h65a33c058f66e3b0
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/thread/local.rs:284:16
27: 0x104ef0f64 - std::thread::local::LocalKey<T>::with::h8fe869ef8824b12b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/thread/local.rs:260:9
28: 0x104ed0838 - eframe::native::run::with_event_loop::h890a8378504b2de5
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:48:5
29: 0x104ed3afc - eframe::native::run::run_glow::h4bad5e0c818682c1
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/native/run.rs:398:16
30: 0x104ee7494 - eframe::run_native::h380827857d072058
at .cargo/registry/src/index.crates.io-6f17d22bba15001f/eframe-0.26.2/src/lib.rs:262:13
31: 0x104b36c88 - er_save_editor::main::h63aa3f2eb8dc5ad1
at er-dlc-save-editor/src/main.rs:44:5
32: 0x104b65134 - core::ops::function::FnOnce::call_once::h8cda317e205e9840
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:250:5
33: 0x1049fbdec - std::sys_common::backtrace::__rust_begin_short_backtrace::h408844d981b09fea
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/sys_common/backtrace.rs:155:18
34: 0x1049fbdb0 - std::rt::lang_start::{{closure}}::h669c18e8947b181c
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:166:18
35: 0x1053c7200 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::heaba8a29e0324069
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/core/src/ops/function.rs:284:13
36: 0x1053c7200 - std::panicking::try::do_call::h6e5fac4f4884d97b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
37: 0x1053c7200 - std::panicking::try::h2b98e2f3cf76cd78
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
38: 0x1053c7200 - std::panic::catch_unwind::hba9c97319335c08b
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
39: 0x1053c7200 - std::rt::lang_start_internal::{{closure}}::h18efdcfb68f002e8
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:48
40: 0x1053c7200 - std::panicking::try::do_call::ha793e16770aada4d
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:552:40
41: 0x1053c7200 - std::panicking::try::h8aa812e3e1310d12
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panicking.rs:516:19
42: 0x1053c7200 - std::panic::catch_unwind::h38c4879f2623185e
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/panic.rs:146:14
43: 0x1053c7200 - std::rt::lang_start_internal::h39923ab4c3913741
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:148:20
44: 0x1049fbd74 - std::rt::lang_start::hc12deb7b2f512b49
at /rustc/9b00956e56009bab2aa15d7bff10916599e3d6d6/library/std/src/rt.rs:165:17
45: 0x104b37ae8 - _main
@eduarmreyes I have seen saves fail on that line before. I know ClayAmore is still working on a new update but if you only care about "reading" the data and not writing data I can probably patch it to pass.
You can DM me your save or upload it.
Also try the "Copy JSON" button at the bottom of eldenringcompass.com
I am actually looking to write data, I tried using eldenringcompass.com but it does not seem to support files exported from PS4Wizard, right?
eldenringcompass uses the same code as in this repo so it should support PS4 saves, though I haven't tested it so it may be broken in some way.
I think you will need to wait for ClayAmores update to write data anyway.
If you're looking for pure parsing of the save file, I've separated the editor and parser into two projects in the new release. The parser can be found in the er-save-lib repository.
The parser is located in the save
part of the project, while the save-api
is what I'm using to expose functions for use in the save editor. Currently, the save API is built specifically for my needs in the save editor, so it is not yet complete.
I may consider changing the access level of the raw save data to be public instead of restricting it within the crate. Let me know if this would be helpful.
I tried using the tool to export my save file to .txt, but it seems to just save the .sl2 file as a text file so it's unreadable.
Is there a way to export the save file's information to serialized text, like JSON or YAML?
I'm trying to put together an auto-tracker for game progress using git, where each time the game is saved, I check for what's changed and create a commit with those notes, adding tags when something big happens, like a boss kill. I have everything else, I just can't tell what's changed from one save to the next in the .sl2 file.
If you happen to have an easy way of generating that export with this tool... I'd love to know how!
If not, but you have somewhere I can go next to find info on reading the binary save file format, I'll happily go figure it out for myself. I just haven't found any resources like that online recently.