using Decentralized.Domain;
using UnityEngine;
namespace Decentralized
{
///
/// mod 设置(游戏自带的模组配置:主菜单“改装件”里选中 mod 后点齿轮)。
/// 文件在 persistentDataPath/ModConfigs/probably_decentralized.json,全局生效,不随存档。
/// 分类(Section):界面、剧情、难度。
///
public static class Settings
{
/// 终端窗口尺寸档位(宽×高,界面单位)。第一项是旧版大小。
public static readonly string[] TerminalSizes = { "828×680", "1200×900", "1400×1000" };
public const string DefaultTerminalSize = "1200×900";
private static ConfigEntry _size, _risk, _mining;
private static ConfigEntry _tumbler;
/// Tumbler 上门剧情开关:关掉后不再有新的上门,已有进度保留。
public static bool TumblerStory => _tumbler?.Value ?? true;
public static float TerminalW => Size().w;
public static float TerminalH => Size().h;
private static (float w, float h) Size()
{
var s = _size?.Value ?? DefaultTerminalSize;
var p = s.Split('×');
if (p.Length == 2 && float.TryParse(p[0], out var w) && float.TryParse(p[1], out var h)) return (w, h);
return (1200f, 900f);
}
///
/// 登记设置项。本地化表要等主菜单起来才读得到,而分类名是字符串(不是回调),所以等表可用了再登记。
///
public static void DefineWhenReady(ModConfig config)
{
var go = new GameObject("pd_settings_defer");
Object.DontDestroyOnLoad(go);
go.AddComponent().Config = config;
}
private sealed class Waiter : MonoBehaviour
{
public ModConfig Config;
private int _frames;
private void Update()
{
_frames++;
if (_frames < 300 || (L.T("settings.section.ui") == "settings.section.ui" && _frames < 1800)) return;
Log.Guard("登记 mod 设置", () => Define(Config));
Destroy(gameObject);
}
}
public static void Define(ModConfig config)
{
if (config == null) { Log.Warn("[Settings] 拿不到模组配置,用默认值"); return; }
string ui = L.T("settings.section.ui");
_size = config.Define("terminal_size", DefaultTerminalSize, ui, () => L.T("settings.terminal_size"), TerminalSizes,
() => L.T("settings.terminal_size_desc"));
_size.OnChanged += _ => { if (CustomUIManager.Instance != null && CustomUIManager.Instance.IsOpen(TerminalWindow.Id)) TerminalWindow.Open(); };
_tumbler = config.Define("tumbler_story", true, L.T("settings.section.story"), () => L.T("settings.tumbler_story"), () => L.T("settings.tumbler_story_desc"));
string hard = L.T("settings.section.difficulty");
_risk = config.Define("risk_scale", Scales.Default, hard, () => L.T("settings.risk_scale"), Scales.Choices, () => L.T("settings.risk_scale_desc"));
_mining = config.Define("mining_scale", Scales.Default, hard, () => L.T("settings.mining_scale"), Scales.Choices, () => L.T("settings.mining_scale_desc"));
_risk.OnChanged += _ => Apply();
_mining.OnChanged += _ => Apply();
Apply();
}
private static void Apply()
{
Scales.Risk = Scales.Parse(_risk?.Value);
Scales.Mining = Scales.Parse(_mining?.Value);
Log.Info($"[Settings] 风险 ×{Scales.Risk},挖矿 ×{Scales.Mining}"); }
}
}