using System.Collections.Generic; using SepCore.Definition; namespace SepCore.Battle { /// /// 单个战斗状态的只读视图。 /// public sealed class BattleStatusView { /// /// 状态类型。 /// public readonly BattleStatusType StatusType; /// /// 剩余持续次数(行动机会);重复施加取较大值,移除后为 0。 /// public readonly int RemainingRounds; public BattleStatusView(BattleStatusType statusType, int remainingRounds) { StatusType = statusType; RemainingRounds = remainingRounds; } } /// /// 单个战斗单位的只读视图。 /// 内部调度与效果结算不得读取本视图;视图只在外部边界按需生成。 /// public sealed class BattleUnitView { /// /// 本场战斗单位的唯一运行时标识;重复配置的敌人拥有不同 ID。 /// public readonly int BattleUnitId; /// /// 阵营。 /// public readonly BattleFaction Faction; /// /// 配置标识:玩家为 CharacterId,敌人为 EnemyConfigId。 /// public readonly int ConfigId; /// /// 同阵营同速度的最终并列规则顺序,也是显示顺序。 /// public readonly int PartyOrder; /// /// 当前 HP。 /// public readonly int CurrentHp; /// /// HP 上限。 /// public readonly int MaxHp; /// /// 当前 MP。 /// public readonly int CurrentMp; /// /// MP 上限。 /// public readonly int MaxMp; /// /// 当前速度。 /// public readonly int Speed; /// /// 是否阵亡。 /// public readonly bool IsDefeated; /// /// 是否已逃跑。 /// public readonly bool IsEscaped; /// /// 当前剩余状态列表。 /// public readonly IReadOnlyList Statuses; public BattleUnitView(int battleUnitId, BattleFaction faction, int configId, int partyOrder, int currentHp, int maxHp, int currentMp, int maxMp, int speed, bool isDefeated, bool isEscaped, IReadOnlyList statuses) { BattleUnitId = battleUnitId; Faction = faction; ConfigId = configId; PartyOrder = partyOrder; CurrentHp = currentHp; MaxHp = maxHp; CurrentMp = currentMp; MaxMp = maxMp; Speed = speed; IsDefeated = isDefeated; IsEscaped = isEscaped; Statuses = statuses != null ? Copy(statuses) : new BattleStatusView[0]; } private static BattleStatusView[] Copy(IReadOnlyList source) { BattleStatusView[] copy = new BattleStatusView[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } } /// /// 当前战斗的只读视图,是 UI 唯一允许读取的战斗状态。 /// 每次推进后在外部边界生成,不把内部可变对象暴露给 UI 或探索层。 /// public sealed class BattleViewState { /// /// 当前轮次,从 1 开始。 /// public readonly int RoundNumber; /// /// 当前行动者;战斗完成时为 0。 /// public readonly int CurrentActorUnitId; /// /// 全部单位的只读视图,保持稳定显示顺序。 /// public readonly IReadOnlyList Units; /// /// 本轮从当前行动者开始的剩余运行时单位 ID;速度变化后重建。 /// public readonly IReadOnlyList RemainingTurnOrder; /// /// 当前玩家可用的行动配置 ID;当前行动者不是玩家或战斗完成时为空。 /// public readonly IReadOnlyList AvailableActionIds; public BattleViewState(int roundNumber, int currentActorUnitId, IReadOnlyList units, IReadOnlyList remainingTurnOrder, IReadOnlyList availableActionIds) { RoundNumber = roundNumber; CurrentActorUnitId = currentActorUnitId; Units = units != null ? Copy(units) : new BattleUnitView[0]; RemainingTurnOrder = remainingTurnOrder != null ? Copy(remainingTurnOrder) : new int[0]; AvailableActionIds = availableActionIds != null ? Copy(availableActionIds) : new int[0]; } private static BattleUnitView[] Copy(IReadOnlyList source) { BattleUnitView[] copy = new BattleUnitView[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } private static int[] Copy(IReadOnlyList source) { int[] copy = new int[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } } }