Preserve damaged backup evidence across later saves

This commit is contained in:
NINI
2026-10-05 11:44:28 +09:00
parent 7c2f6d9fd1
commit 7641365e37
4 changed files with 24 additions and 1 deletions
@@ -75,6 +75,18 @@ namespace MagnetismHeroes.Tests
Assert.That(Directory.GetFiles(_directory, "*.damaged-*").Select(File.ReadAllText), Does.Contain("broken-primary"));
Assert.That(File.ReadAllText(_path + ".bak"), Is.EqualTo("broken-backup"));
}
[Test] public void BothDamagedOriginalsSurviveTwoSubsequentSuccessfulWrites()
{
File.WriteAllText(_path, "distinct-broken-primary"); File.WriteAllText(_path + ".bak", "distinct-broken-backup");
var store = Store(); Assert.That(store.TryLoad(out _, out _), Is.False);
Assert.That(store.TrySave(new ProgressSave(), out var error), Is.True, error);
Assert.That(store.TrySave(Puzzle(), out error), Is.True, error);
var forensic = Directory.GetFiles(_directory, "*.damaged-*").Select(File.ReadAllText).ToArray();
Assert.That(forensic, Does.Contain("distinct-broken-primary"));
Assert.That(forensic, Does.Contain("distinct-broken-backup"));
Assert.That(store.TryLoad(out var restored, out error), Is.True, error);
Assert.That(restored.puzzleStates.Single().stageId, Is.EqualTo(1));
}
[Test] public void InvalidGroupMembershipDoesNotReplaceAValidSave()
{
var store = Store(); var progress = Puzzle(); Assert.That(store.TrySave(progress, out _), Is.True);
@@ -14,6 +14,7 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
private readonly string _path;
private readonly IReadOnlyList<StageDefinition> _definitions;
private bool _preserveDamagedOriginal;
private bool _preserveDamagedBackup;
private sealed class SaveFieldsResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization serialization)
@@ -32,6 +33,7 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
if (Read(_path + ".bak", out save, out var backupError))
{ error = "Recovered valid backup: " + originalError; _preserveDamagedOriginal = true; return true; }
_preserveDamagedOriginal = true;
_preserveDamagedBackup = File.Exists(_path + ".bak");
error = "Invalid primary and backup: " + originalError + "; " + backupError;
return false;
}
@@ -105,6 +107,11 @@ namespace MagnetismHeroes.UnityRuntime.Persistence
File.Copy(_path, _path + ".damaged-" + Guid.NewGuid().ToString("N"));
_preserveDamagedOriginal = false;
}
if (_preserveDamagedBackup && File.Exists(_path + ".bak"))
{
File.Copy(_path + ".bak", _path + ".bak.damaged-" + Guid.NewGuid().ToString("N"));
_preserveDamagedBackup = false;
}
using (var stream = new FileStream(temporary, FileMode.Create, FileAccess.Write, FileShare.None))
using (var writer = new StreamWriter(stream))
{ createdTemporary = true; writer.Write(JsonConvert.SerializeObject(save, Formatting.Indented, SerializerSettings)); writer.Flush(); stream.Flush(true); }