Aetheria/Assets/Scripts/ServerShared/PlayerSettings.cs
Meta Vens 8a0a29e0de Galaxy.IsPrelude is the one owner of whether a run is the prelude: ActionGameManager.IsTutorial and PlayerSettings.TutorialPassed are cut
IsTutorial duplicated Galaxy.IsPrelude; its readers read CurrentGalaxy.IsPrelude, and RunSave.Capture writes
SavedGame.IsTutorial from galaxy.IsPrelude with no isTutorial argument. TutorialPassed was never written and its only
reader was New Game's unreachable main-galaxy branch, which goes with it (S2 brings the main galaxy back as a
scenario). spawnturret's two identical generator branches collapse to one. Old player.cc files still load.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 20:26:30 +02:00

85 lines
No EOL
3 KiB
C#

using GameCult.Caching;
using System;
using System.Collections.Generic;
using System.Globalization;
using CultMath;
using MessagePack;
using static CultMath.math;
[CultDocument("aetheria.playersettings", "1"), CultGlobal, MessagePackObject]
public class PlayerSettings
{
[Key(0)] public string Name = "Anonymous";
// Keys 1 and 2 are retired; an older player.cc that still carries them loads, and they are dropped.
[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>();
[Key(2)] public float2 Sensitivity = float2(-0.001f, 0.001f);
}
public enum Quality
{
Low,
Normal,
High,
Ultra
}