using System.Collections.Generic; using SepCore.Definition; namespace SepCore.Battle { /// /// 单个效果对单个目标产生的数值或状态变化。 /// public sealed class BattleActionEffectRecord { /// /// 目标单位。 /// public readonly int TargetUnitId; /// /// 效果结算前的 HP。 /// public readonly int BeforeHp; /// /// 效果结算后的 HP。 /// public readonly int AfterHp; /// /// 效果结算前的 MP。 /// public readonly int BeforeMp; /// /// 效果结算后的 MP。 /// public readonly int AfterMp; /// /// 状态变化列表;无状态变化时为空。 /// public readonly IReadOnlyList StatusChanges; public BattleActionEffectRecord(int targetUnitId, int beforeHp, int afterHp, int beforeMp, int afterMp, IReadOnlyList statusChanges) { TargetUnitId = targetUnitId; BeforeHp = beforeHp; AfterHp = afterHp; BeforeMp = beforeMp; AfterMp = afterMp; StatusChanges = statusChanges != null ? Copy(statusChanges) : new BattleStatusChangeRecord[0]; } private static BattleStatusChangeRecord[] Copy(IReadOnlyList source) { BattleStatusChangeRecord[] copy = new BattleStatusChangeRecord[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } } /// /// 状态变化记录。 /// public sealed class BattleStatusChangeRecord { /// /// 状态类型。 /// public readonly BattleStatusType StatusType; /// /// 变化后的剩余持续次数;状态被移除时为 0。 /// public readonly int RemainingRounds; public BattleStatusChangeRecord(BattleStatusType statusType, int remainingRounds) { StatusType = statusType; RemainingRounds = remainingRounds; } } /// /// 一次行动产生的有序行动记录。 /// 首版 UI 立即消费并显示;未来动画系统可以逐条等待播放,不需要修改战斗规则内核。 /// public sealed class BattleActionRecord { /// /// 行动者。 /// public readonly int ActorUnitId; /// /// 指令类型,对应配表 BattleActionType。 /// public readonly BattleActionType CommandType; /// /// 攻击或技能配置 ID;逃跑为 0。 /// public readonly int ActionConfigId; /// /// 按结算顺序排列的效果记录。 /// public readonly IReadOnlyList Effects; public BattleActionRecord(int actorUnitId, BattleActionType commandType, int actionConfigId, IReadOnlyList effects) { ActorUnitId = actorUnitId; CommandType = commandType; ActionConfigId = actionConfigId; Effects = effects != null ? Copy(effects) : new BattleActionEffectRecord[0]; } private static BattleActionEffectRecord[] Copy(IReadOnlyList source) { BattleActionEffectRecord[] copy = new BattleActionEffectRecord[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } } /// /// 战斗推进返回值。 /// public sealed class BattleAdvance { /// /// 本次推进产生的有序行动记录列表。 /// public readonly IReadOnlyList Records; /// /// 推进结束后的只读战斗快照。 /// public readonly BattleSnapshot Snapshot; /// /// 流程状态。 /// public readonly BattleFlowState FlowState; /// /// 仅在 Completed 时存在,否则为 null。 /// public readonly BattleResult Result; public BattleAdvance(IReadOnlyList records, BattleSnapshot snapshot, BattleFlowState flowState, BattleResult result) { Records = records != null ? Copy(records) : new BattleActionRecord[0]; Snapshot = snapshot; FlowState = flowState; Result = result; } private static BattleActionRecord[] Copy(IReadOnlyList source) { BattleActionRecord[] copy = new BattleActionRecord[source.Count]; for (int i = 0; i < source.Count; i++) { copy[i] = source[i]; } return copy; } } }