Opened 5 years ago
Closed 5 years ago
#12864 closed defect (fixed)
AGS: Crash making in-game saves in Strangeland
| Reported by: | dreammaster | Owned by: | dreammaster |
|---|---|---|---|
| Priority: | normal | Component: | Engine: AGS |
| Version: | Keywords: | ||
| Cc: | Game: |
Description
It seems like the filename is being created with a subdirectory folder as part of the name rather than a straight strangeland.001 form. Need to investigate further.
Change History (5)
comment:2 by , 5 years ago
Although if we want to make in-game saves compatible with saves from the GMM (to be able to mix the two, and in particular reload an in-game save from the launcher or command line), that would be more complicated.
comment:3 by , 5 years ago
This is weird. I actually double-checked with the standalone interpreter, and the filename it uses doesn't have a slash in it. Instead, it produces a file in the form of "save1-temp save.dat" (where "temp save" is the name I gave it). So it's not using subdirectories, it's just that there's something wrong in the way ScummVM is building up the filename that differs from the standalone.
On a side note, the produced file is only 24Kb.. quite a difference from the massive 300Mb+ file created for the autosave :)
comment:4 by , 5 years ago
Yes, there is something weird. It seems it is trying to both use a subdirectory, and not use one:
ResolveScriptPath($SAVEGAMEDIR$/save2_test.dat) ResolveScriptPath($SAVEGAMEDIR$/test/save2_test.dat)
I am not sure if this is something in our code, or if the original does that as well. It could try using a subdirectory only if it fails reading/writing without one for example...
In any case flattening paths ensure we are not going to assert if some games really try to do it (even if Strangeland doesn't), so I made the commit (and it was only a one line change).
However while saving and loading seems to work if I reload the game in the same session, this still does not work when closing the game and restarting. I suspect this is because we do not support the kFile_Create mode and always treat it as kFile_CreateAlways, which means that it replaces the file if is already exists instead of opening it in append mode or read-write mode. This may be why the strangeland-list.slot file, which contains a list of the saved games, seems to be cleared when closing and restarting the game.
comment:5 by , 5 years ago
| Owner: | set to |
|---|---|
| Resolution: | → fixed |
| Status: | new → closed |
Everything should be sorted out now.

It indeed does:
criezy@MacBook-Air scummvm % ./scummvm --debugflags=FilePath strangeland User picked target 'strangeland' (engine ID 'ags', game ID 'strangeland')... Looking for a plugin supporting this target... Adventure Game Studio [...] ResolveScriptPath($SAVEGAMEDIR$/test/save2.bmp) Adding ScummVM game target prefix ResolveScriptPath($SAVEGAMEDIR$/test/saveHD2.bmp) Adding ScummVM game target prefix ResolveScriptPath($SAVEGAMEDIR$/save2_test.dat) Adding ScummVM game target prefix ResolveScriptPath($SAVEGAMEDIR$/test/save2_test.dat) Adding ScummVM game target prefix Assertion failed: (!n.contains('/')), function getChild, file backends/fs/posix/posix-fs.cpp, line 139.Here
testwas the name I gave when trying to save into the second slot.I already noticed in the past that
SaveFileManagercannot deal with subdirectories and wondered if we needed to flatten paths inResolveScriptPath. But since I had not found a game needing that yet, and never looked into it further.My suggestion would be to flatten save paths if needed in
ResolveScriptPath. So for example$SAVEGAMEDIR$/test/save2_test.datwould become/saves/strangeland-test-save2_test.dat(instead of/saves/strangeland-test/save2_test.dat).I can look into that further tomorrow if you want.