supervisor-simulator/scripts/Core/ContentRegistry.cs
wjsjwr b8fecd080f 已把模型层改成组合式结构并补齐 MVC/内容配置骨架:Unit/任务/运行时状态现在通过组件组合,GameManager 作为桥接层改为驱动 GameSession/Controller;同时新增学科/羁绊/装备/任务/肉鸽等定义结构,预留 i18n 与 Mod 内容加载接口。
- 组合式单位与数值基础重构: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
2025-12-31 23:54:31 +08:00

129 lines
3.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}