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