Files
huangjun 7dcac0ac87 M1 回合制战斗架构收敛与 1v1 攻击闭环:BattleRuntime 内核、组件唯一入口、UI 数据驱动与 EditMode 测试
- 删除中间契约(BattleStartRequest/BattlePlayerInput/BattleReturnPlan/桥接与策略接口/FlowState),收敛为 BattleViewState/BattleStep/一层 BattleEvent
- 新增内部 BattleRuntime/BattleUnit/BattleStatus 共享上下文;TurnBattleComponent 成为唯一外部入口,吸收启动/暂停/回写职责
- 内核支持 1v1 攻击闭环:效果公式、HP/MP 钳制、阵亡、Victory/TotalDefeat、敌人随机决策;敌人行动间歇 0.6s 由组件协程编排并经 StepListener 推送
- UI:玩家卡片/敌人槽/回合槽按战局重建,图标配置驱动(含新增 EnemyConfig.Icon),每轮刷新一次 TurnSlots 且轮内只移动高亮
- 新增 Tests 程序集 + InternalsVisibleTo,25 个 BattleRuntime 纯逻辑用例全部通过
2026-09-02 08:42:04 +08:00

84 lines
2.4 KiB
C#

using System.Collections.Generic;
namespace SepCore.Battle
{
/// <summary>
/// 每名参战玩家的战后结果。
/// 保留原始战斗值:阵亡者 HP 为 0;恢复 1/1 的规则由 TurnBattleComponent 统一应用。
/// </summary>
public sealed class BattlePlayerResult
{
/// <summary>
/// 角色配置标识。
/// </summary>
public readonly int CharacterId;
/// <summary>
/// 战斗结束时的当前 HP。
/// </summary>
public readonly int CurrentHp;
/// <summary>
/// 战斗结束时的当前 MP。
/// </summary>
public readonly int CurrentMp;
/// <summary>
/// 是否在本场战斗中阵亡。
/// </summary>
public readonly bool WasDefeated;
/// <summary>
/// 是否在本场战斗中成功逃跑。
/// </summary>
public readonly bool Escaped;
public BattlePlayerResult(int characterId, int currentHp, int currentMp, bool wasDefeated, bool escaped)
{
CharacterId = characterId;
CurrentHp = currentHp;
CurrentMp = currentMp;
WasDefeated = wasDefeated;
Escaped = escaped;
}
}
/// <summary>
/// 战斗结果。
/// </summary>
public sealed class BattleResult
{
/// <summary>
/// 关联原地图敌人实例。
/// </summary>
public readonly int EncounterId;
/// <summary>
/// 四种战斗结果之一。
/// </summary>
public readonly BattleOutcome Outcome;
/// <summary>
/// 每名参战玩家的原始战后结果。
/// </summary>
public readonly IReadOnlyList<BattlePlayerResult> Players;
public BattleResult(int encounterId, BattleOutcome outcome, IReadOnlyList<BattlePlayerResult> players)
{
EncounterId = encounterId;
Outcome = outcome;
Players = players != null ? Copy(players) : new BattlePlayerResult[0];
}
private static BattlePlayerResult[] Copy(IReadOnlyList<BattlePlayerResult> source)
{
BattlePlayerResult[] copy = new BattlePlayerResult[source.Count];
for (int i = 0; i < source.Count; i++)
{
copy[i] = source[i];
}
return copy;
}
}
}