using System; using System.Collections.Generic; using Models; namespace Core; /// /// 内容加载与合并(基础 + Mod) /// 设计说明: /// 1) 通过 IContentSource 抽象读取来源,支持 res:// 与 user://mods。 /// 2) ContentRegistry 负责合并,同 Id 以后加载覆盖先加载。 /// 注意事项: /// - 真实加载逻辑应避免在主线程做大规模 IO。 /// 未来扩展: /// - 可加入“补丁合并策略”(例如列表合并/字段覆盖)。 /// public interface IContentSource { int Priority { get; } IEnumerable LoadAll() where T : class; } public enum ContentMergeMode { Override, KeepFirst } public sealed class ContentRegistry { private readonly List _sources = new(); public ContentMergeMode MergeMode { get; set; } = ContentMergeMode.Override; public void RegisterSource(IContentSource source) { _sources.Add(source); _sources.Sort((a, b) => a.Priority.CompareTo(b.Priority)); } public GameContentDatabase BuildDatabase() { var db = new GameContentDatabase(); Merge(db.Disciplines, LoadAll(), d => d.Header.Id); Merge(db.Archetypes, LoadAll(), d => d.Header.Id); Merge(db.Roles, LoadAll(), d => d.Header.Id); Merge(db.Traits, LoadAll(), d => d.Header.Id); Merge(db.Tasks, LoadAll(), d => d.Header.Id); Merge(db.Items, LoadAll(), d => d.Header.Id); Merge(db.Papers, LoadAll(), d => d.Header.Id); Merge(db.RoguelitePerks, LoadAll(), d => d.Header.Id); return db; } private IEnumerable LoadAll() where T : class { foreach (var source in _sources) { foreach (var item in source.LoadAll()) { yield return item; } } } private void Merge(Dictionary target, IEnumerable items, Func idSelector) where T : class { foreach (var item in items) { var id = idSelector(item); if (string.IsNullOrWhiteSpace(id)) { continue; } if (target.ContainsKey(id)) { if (MergeMode == ContentMergeMode.Override) { target[id] = item; } } else { target[id] = item; } } } } /// /// 资源读取示例:res:// 中的 .tres/.res /// 这里只给出接口骨架,具体解析留给后续实现。 /// public sealed class ResourceContentSource : IContentSource { public int Priority { get; } public List ResourcePaths { get; } = new(); public ResourceContentSource(int priority) { Priority = priority; } public IEnumerable LoadAll() where T : class { yield break; } } /// /// 资源读取示例:json/yaml/自定义格式(Mod 友好) /// public sealed class JsonContentSource : IContentSource { public int Priority { get; } public List DataPaths { get; } = new(); public JsonContentSource(int priority) { Priority = priority; } public IEnumerable LoadAll() where T : class { yield break; } }