supervisor-simulator/scripts/Core/StatResolver.cs
2026-01-18 20:05:23 +08:00

99 lines
3.7 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.Collections.Generic;
using Models;
namespace Core;
/// <summary>
/// 数值解析器(用于统一计算有效属性)
/// 设计说明:
/// 1) 只做“读+合成”,不直接修改 Model。
/// 2) 合成来源包含:羁绊、学科 Buff、特质、装备。
/// 注意事项:
/// - 规则型效果RuleIds暂不在此处理由系统层扩展。
/// 未来扩展:
/// - 可引入“上下文参数”(任务类型/场景)以处理条件加成。
/// </summary>
public sealed class StatResolver {
private readonly GameSession _session;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="session">游戏会话</param>
public StatResolver(GameSession session) {
_session = session;
}
/// <summary>
/// 获取计算后的属性值
/// </summary>
/// <param name="unit">单位</param>
/// <param name="type">属性类型</param>
/// <returns>属性值</returns>
public float GetAttribute(UnitModel unit, AttributeType type) {
var value = GetBaseAttribute(unit, type);
ApplyBundle(_session.State.Synergy.ActiveModifiers, type, ref value);
ApplyDiscipline(unit.Tags.DisciplineId, type, ref value);
ApplyTraits(unit.Tags.TraitIds, type, ref value);
ApplyItems(unit.Equipment.EquippedItemIds, type, ref value);
return value;
}
/// <summary>
/// 获取基础属性值
/// </summary>
/// <param name="unit">单位</param>
/// <param name="type">属性类型</param>
/// <returns>基础值</returns>
private float GetBaseAttribute(UnitModel unit, AttributeType type) {
return type switch {
AttributeType.Academic => unit.Attributes.Academic.Value,
AttributeType.Engineering => unit.Attributes.Engineering.Value,
AttributeType.Writing => unit.Attributes.Writing.Value,
AttributeType.Financial => unit.Attributes.Financial.Value,
AttributeType.Social => unit.Attributes.Social.Value,
AttributeType.Activation => unit.Attributes.Activation.Value,
_ => 0f
};
}
/// <summary>
/// 应用学科加成
/// </summary>
private void ApplyDiscipline(string disciplineId, AttributeType type, ref float value) {
if (string.IsNullOrWhiteSpace(disciplineId)) return;
if (!_session.Content.Disciplines.TryGetValue(disciplineId, out var discipline)) return;
ApplyBundle(discipline.Buff?.Modifiers, type, ref value);
}
/// <summary>
/// 应用特质加成
/// </summary>
private void ApplyTraits(List<string> traitIds, AttributeType type, ref float value) {
if (traitIds == null || traitIds.Count == 0) return;
foreach (var traitId in traitIds)
if (_session.Content.Traits.TryGetValue(traitId, out var trait))
ApplyBundle(trait.Modifiers, type, ref value);
}
/// <summary>
/// 应用装备加成
/// </summary>
private void ApplyItems(List<string> itemIds, AttributeType type, ref float value) {
if (itemIds == null || itemIds.Count == 0) return;
foreach (var itemId in itemIds)
if (_session.Content.Items.TryGetValue(itemId, out var item))
ApplyBundle(item.Effect?.Modifiers, type, ref value);
}
/// <summary>
/// 应用修正包
/// </summary>
private void ApplyBundle(ModifierBundle bundle, AttributeType type, ref float value) {
if (bundle == null) return;
foreach (var modifier in bundle.AttributeModifiers) {
if (modifier.Type != type) continue;
value = (value + modifier.Add) * modifier.Multiplier;
}
}
}