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