99 lines
3.7 KiB
C#
99 lines
3.7 KiB
C#
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;
|
||
}
|
||
}
|
||
} |