- 组合式单位与数值基础重构:scripts/Models/UnitModel.cs, scripts/Models/UnitComponents.cs, scripts/Models/StudentModel.cs, scripts/Models/MentorModel.cs, scripts/Models/StaffModel.cs, scripts/Models/PropertyValue.cs, scripts/Models/StatusValue.cs - 任务与运行时状态骨架:scripts/Models/Task.cs, scripts/Models/TaskDefinitions.cs, scripts/Models/GameState.cs - 配置与规则定义骨架:scripts/Models/DefinitionSupport.cs, scripts/Models/DomainEnums.cs, scripts/Models/Modifiers.cs, scripts/Models/DisciplineDefinitions.cs, scripts/Models/SynergyDefinitions.cs, scripts/Models/ItemDefinitions.cs, scripts/Models/PaperDefinitions.cs, scripts/Models/RogueliteDefinitions.cs, scripts/Models/GameContentDatabase.cs, scripts/Models/CoreIds.cs - MVC/会话/系统/i18n/Mod 支撑:scripts/Core/GameSession.cs, scripts/Core/GameSystems.cs, scripts/Core/GameController.cs, scripts/Core/Mvc.cs, scripts/Core/LocalizationService.cs, scripts/Core/ContentRegistry.cs, scripts/Core/ModManifest.cs, scripts/Core/EventBus.cs - 主控流程衔接:scripts/GameManager.cs
129 lines
3.0 KiB
C#
129 lines
3.0 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using Models;
|
||
|
||
namespace Core;
|
||
|
||
/// <summary>
|
||
/// 内容加载与合并(基础 + Mod)
|
||
/// 设计说明:
|
||
/// 1) 通过 IContentSource 抽象读取来源,支持 res:// 与 user://mods。
|
||
/// 2) ContentRegistry 负责合并,同 Id 以后加载覆盖先加载。
|
||
/// 注意事项:
|
||
/// - 真实加载逻辑应避免在主线程做大规模 IO。
|
||
/// 未来扩展:
|
||
/// - 可加入“补丁合并策略”(例如列表合并/字段覆盖)。
|
||
/// </summary>
|
||
public interface IContentSource
|
||
{
|
||
int Priority { get; }
|
||
IEnumerable<T> LoadAll<T>() where T : class;
|
||
}
|
||
|
||
public enum ContentMergeMode
|
||
{
|
||
Override,
|
||
KeepFirst
|
||
}
|
||
|
||
public sealed class ContentRegistry
|
||
{
|
||
private readonly List<IContentSource> _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<DisciplineDefinition>(), d => d.Header.Id);
|
||
Merge(db.Archetypes, LoadAll<ArchetypeDefinition>(), d => d.Header.Id);
|
||
Merge(db.Roles, LoadAll<RoleDefinition>(), d => d.Header.Id);
|
||
Merge(db.Traits, LoadAll<TraitDefinition>(), d => d.Header.Id);
|
||
Merge(db.Tasks, LoadAll<TaskDefinition>(), d => d.Header.Id);
|
||
Merge(db.Items, LoadAll<ItemDefinition>(), d => d.Header.Id);
|
||
Merge(db.Papers, LoadAll<PaperDefinition>(), d => d.Header.Id);
|
||
Merge(db.RoguelitePerks, LoadAll<RoguelitePerkDefinition>(), d => d.Header.Id);
|
||
return db;
|
||
}
|
||
|
||
private IEnumerable<T> LoadAll<T>() where T : class
|
||
{
|
||
foreach (var source in _sources)
|
||
{
|
||
foreach (var item in source.LoadAll<T>())
|
||
{
|
||
yield return item;
|
||
}
|
||
}
|
||
}
|
||
|
||
private void Merge<T>(Dictionary<string, T> target, IEnumerable<T> items, Func<T, string> 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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 资源读取示例:res:// 中的 .tres/.res
|
||
/// 这里只给出接口骨架,具体解析留给后续实现。
|
||
/// </summary>
|
||
public sealed class ResourceContentSource : IContentSource
|
||
{
|
||
public int Priority { get; }
|
||
public List<string> ResourcePaths { get; } = new();
|
||
|
||
public ResourceContentSource(int priority)
|
||
{
|
||
Priority = priority;
|
||
}
|
||
|
||
public IEnumerable<T> LoadAll<T>() where T : class
|
||
{
|
||
yield break;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 资源读取示例:json/yaml/自定义格式(Mod 友好)
|
||
/// </summary>
|
||
public sealed class JsonContentSource : IContentSource
|
||
{
|
||
public int Priority { get; }
|
||
public List<string> DataPaths { get; } = new();
|
||
|
||
public JsonContentSource(int priority)
|
||
{
|
||
Priority = priority;
|
||
}
|
||
|
||
public IEnumerable<T> LoadAll<T>() where T : class
|
||
{
|
||
yield break;
|
||
}
|
||
}
|
||
|