using System; using System.Collections.Generic; using Decentralized.Domain; using Newtonsoft.Json; namespace Decentralized { /// 上一晚的挖矿报告(终端"报告"页和晨间日志)。 public sealed class NightReport { public int Day; public int Rigs, PoweredRigs; public double Hash, NetworkHash, Mined, Price, Kj; public List Burnt = new List(); } /// 一局的 mod 状态。整体序列化成 JSON 存进游戏的 mod 存档数据;显卡的健康度等存在显卡物品的标签上。 public sealed class SaveData { public int Version = 1; public int Day; public Rng Rng = new Rng((ulong)DateTime.UtcNow.Ticks); public Market Market; public Stablecoins Stable = new Stablecoins(); public Network Network = new Network(); public Wallet Hot = new Wallet { Address = "hot" }; public Exchange Exchange = new Exchange(); public Mixer Mixer = new Mixer(); public List ActiveEvents = new List(); public NightReport LastNight; public bool OpeningNewsShown; /// 当天用币付款的成交额(信用点),夜间清零。 public double CoinSalesToday; } /// 当前这一局的状态:读档 / 新游戏时载入,睡觉结算后写回。 public static class Session { private const string Key = "state"; public static SaveData Data; /// 今晚有电的矿架上的显卡(矿架在夜间早段扣电时登记,结算时用)。 public static readonly List> TonightCards = new List>(); public static int TonightRigs, TonightPoweredRigs; public static double TonightKj; public static void Load() { Data = null; try { string json = ModHelper.GetModData(ModInfo.Id, Key); if (!string.IsNullOrEmpty(json)) Data = JsonConvert.DeserializeObject(json); } catch (Exception ex) { Log.Error($"读取存档数据失败,重新开始:{ex.Message}"); } if (Data == null) Data = new SaveData(); if (Data.Market == null) Data.Market = Market.CreateDefault(StoreStation.GetDayCounter()); Log.Info($"状态已载入(第 {Data.Day} 天,PSC {Data.Market.Price:0.00})"); } public static void Save() { if (Data == null) return; try { ModHelper.SetModData(ModInfo.Id, Key, JsonConvert.SerializeObject(Data)); } catch (Exception ex) { Log.Error($"写入存档数据失败:{ex.Message}"); } } /// 链上资产的信用点价格。 public static double Price(string asset) { if (asset == Assets.PSC) return Data.Market.Price; var spec = Assets.Get(asset); if (spec != null && spec.Stable) return Data.Stable.Price(asset); return 0; } public static double Rent() => PlayerStore.Instance != null ? PlayerStore.Instance.rentValue : 200; } }