The deletion line lands before RunSave, as the spec orders. Deleted, not demoted: - PlayerSettings.SavedRun (Key 1 stays unclaimed) and the SavedGame constructor that upserted a fresh SavedZone per zone on every save. - ActionGameManager: the PlayerSettings.msgpack getter, file path and writer; the .loadout format (_loadoutPath, Loadouts, SaveLoadout and its default-options serializer, the commented loader); OnApplicationQuit and SaveState; SaveZone, which had no caller. - MainMenu's SavedRun Continue branch and both `SavedRun = null` writes. - InventoryPanel's Save Loadout and Restore Loadout bodies. - InputDisplayLayout's KeyboardLayouts file reader, ParseJson, AssociateInputKeys, SaveLayout and the usings they alone needed. - AetherDb's Cut 9 importer (Import.cs, legacy-census, import). - The three-gates note on loading writes; Cut 3 made loading non-writing. - .gitignore ignores GameData/run.cc and GameData/player.cc instead of PlayerSettings.msgpack. DOES NOT BUILD in Unity: ActionGameManager, MainMenu and InputDisplayLayout still reference the deleted members until the next commit wires RunSave, the settings getter and the catalog layout read. Headless builds. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
No EOL
2.8 KiB
C#
82 lines
No EOL
2.8 KiB
C#
using GameCult.Caching;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using MessagePack;
|
|
|
|
[CultDocument("aetheria.playersettings", "1"), CultGlobal, MessagePackObject]
|
|
public class PlayerSettings
|
|
{
|
|
[Key(0)] public string Name = "Anonymous";
|
|
[Key(2)] public bool TutorialPassed;
|
|
[Key(3)] public Dictionary<string, string> HashedStoryFiles = new Dictionary<string, string>();
|
|
[Key(4)] public PlayerGameplaySettings GameplaySettings = new PlayerGameplaySettings();
|
|
[Key(5)] public PlayerInputSettings InputSettings = new PlayerInputSettings();
|
|
[Key(6)] public PlayerGraphicsSettings GraphicsSettings = new PlayerGraphicsSettings();
|
|
|
|
public string FormatTemperature(float t)
|
|
{
|
|
return GameplaySettings.TemperatureUnit switch
|
|
{
|
|
TemperatureUnit.Kelvin => $"{Format(t)}°K",
|
|
TemperatureUnit.Celsius => $"{Format(t - 273.15f)}°C",
|
|
TemperatureUnit.Fahrenheit => $"{Format(t * (9f / 5) - 459.67f)}°F",
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
};
|
|
}
|
|
|
|
public float ParseTemperature(string s)
|
|
{
|
|
var t = float.Parse(s);
|
|
return GameplaySettings.TemperatureUnit switch
|
|
{
|
|
TemperatureUnit.Kelvin => t,
|
|
TemperatureUnit.Celsius => t + 273.15f,
|
|
TemperatureUnit.Fahrenheit => (t - 32) * (5f / 9) + 273.15f,
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
};
|
|
}
|
|
|
|
public string Format(float d)
|
|
{
|
|
var magnitude = d == 0.0f ? 0 : (int)Math.Floor(Math.Log10(Math.Abs(d))) + 1;
|
|
var digits = GameplaySettings.SignificantDigits;
|
|
digits -= magnitude;
|
|
if (digits < 0)
|
|
digits = 0;
|
|
var strdec = d.ToString($"N{digits}");
|
|
var dec = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
|
|
return strdec.Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) ? strdec.TrimEnd('0').TrimEnd(dec) : strdec;
|
|
}
|
|
}
|
|
|
|
[MessagePackObject]
|
|
public class PlayerGameplaySettings
|
|
{
|
|
[Key(0)] public TemperatureUnit TemperatureUnit = TemperatureUnit.Celsius;
|
|
[Key(1)] public int SignificantDigits = 3;
|
|
}
|
|
|
|
[MessagePackObject]
|
|
public class PlayerGraphicsSettings
|
|
{
|
|
[Key(0)] public Quality NebulaQuality = Quality.Normal;
|
|
[Key(1)] public bool ShowAsteroidsInMinimap;
|
|
}
|
|
|
|
[MessagePackObject]
|
|
public class PlayerInputSettings
|
|
{
|
|
// Binding override paths by action name, then binding index. A tuple key has no hash-resistant comparer, so
|
|
// MessagePack's untrusted-data security refuses to read it back.
|
|
[Key(0)] public Dictionary<string, Dictionary<int, string>> InputActionMap = new Dictionary<string, Dictionary<int, string>>();
|
|
[Key(1)] public List<string> ActionBarInputs = new List<string>();
|
|
}
|
|
|
|
public enum Quality
|
|
{
|
|
Low,
|
|
Normal,
|
|
High,
|
|
Ultra
|
|
} |