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