using System.Collections.Generic;
using Models;
namespace Core;
///
/// 数值解析器(用于统一计算有效属性)
/// 设计说明:
/// 1) 只做“读+合成”,不直接修改 Model。
/// 2) 合成来源包含:羁绊、学科 Buff、特质、装备。
/// 注意事项:
/// - 规则型效果(RuleIds)暂不在此处理,由系统层扩展。
/// 未来扩展:
/// - 可引入“上下文参数”(任务类型/场景)以处理条件加成。
///
public sealed class StatResolver
{
private readonly GameSession _session;
///
/// 构造函数
///
/// 游戏会话
public StatResolver(GameSession session)
{
_session = session;
}
///
/// 获取计算后的属性值
///
/// 单位
/// 属性类型
/// 属性值
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;
}
///
/// 获取基础属性值
///
/// 单位
/// 属性类型
/// 基础值
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
};
}
///
/// 应用学科加成
///
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);
}
///
/// 应用特质加成
///
private void ApplyTraits(List 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);
}
}
}
///
/// 应用装备加成
///
private void ApplyItems(List 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);
}
}
}
///
/// 应用修正包
///
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;
}
}
}