I still don't see how it makes permadeath more meaningful but I realize now it's not a worthless exercise.
It's the only thing that makes permadeath meaningful in the first place
Permadeath isn't a thing if it's not permanent
Yes but making cheating harder doesn't affect that at all. For the people who don't cheat permadeath is just as meaningful as it was before and for people who do cheat it will also be just as meaningful (i.e. not at all).
Well, the presumption is that there is actually a third group you're not considering. Those who
would have cheated, but now cannot. Considering my roguelike will be on the Mac only, in general this group will be bigger than you may think. First, the stereotype is that Mac users in general are less sophisticated when it comes to technical details of the OS. Secondly, many of the players will never have even heard of roguelikes, so there will be less accomplished save scummers and many more "casual game players".
However, I believe that there is such a group in the Windows and Linux crowds too.
The experiment for me then, is to implement some "low hanging fruit" that will help this group play permadeath as it is intended, as permanent death.
As for the "online" part I had always thought that if I had the resources/inclination for a server, that I would simply implement a remote-key system:
1) Split the "Secure save" into at least two files:
a) the essential character file ( Payload_0 )
b) the rest of the save state (vendors, dungeons, etc)
When saving a permadeath game for the first time, the client sends up Payload_0 in plaintext* to the server. The server then sends down Payload_0 in encrypted form* [using a "master key" generated at random on the server] along with a subkey for Payload_1 -- client then creates Payload_1 file(s) in encrypted form on disk using the key from the server. (Payload_0 from the server is saved as-is on disk by the client). [* network traffic could be obscured/weak-crypted if desired ]
When loading a permadeath game, client sends up encrypted Payload_0 from disk to server, which then decrypts and "increments" the keys associated with this save game [for next use]. Payload_0 and the previous subkey are sent to the client for decrypting/loading. On next save/load the newer keys are used (which is stored on the server only)
So saving a game, and they making a backup will only be valid until that save game (or it's copy) is loaded. Once loaded, the backup files will no longer be decryptable by the client.
Of course, Payload_0 has to be pretty small to keep ISP costs down for this system to be realistic, and as someone mentioned it means if you're offline you can't load/save your "hardcore" character. However, if your server also tracks "non-secure games" you could offer an option to "move a hardcore character offline" which would move that save game into the "non-secure" bracket, etc.
In-memory hacking (which I wasn't really worried about with the OP) is "easily solved" by storing critical values using a simple custom obscuring algorithm. Players can feel free to search for "0x0012" for gold, but they won't find "0x34FF" which is the actual value stored in var. I'd also combine that with limits on stats via the mechanics. You can also do some clever things with CRCs so that simply "replace CRC checking to NOP" won't work. But I'm not so concerned at that point. If someone is navigating memory and altering code execution, they aren't in the target group for me. The main goal/proposal was just about reverting to backups to cheat death.
Great ideas, pretty good discussion! =)
(( In retrospect, I probably should have mentioned, I'd also make non-trivial effort to make death in those situations interesting, carrots to the sticks, as it were. Because I think that is one major reason for save scumming is that there is too much investiment vs no reward for not cheating. So consider that along with the "counter measures" there would also be incentives. Perhaps that aspect would make a better thread. ;P ))