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 纯逻辑用例全部通过
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
using System.Collections.Generic;
|
||||
using NUnit.Framework;
|
||||
using SepCore.Battle;
|
||||
using SepCore.CustomComponent;
|
||||
|
||||
namespace SepCore.Tests
|
||||
{
|
||||
[TestFixture]
|
||||
public class BattleRuntimeCreateTests
|
||||
{
|
||||
[Test]
|
||||
public void Create_WithStandard1v1Inputs_BuildsExpectedUnits()
|
||||
{
|
||||
BattleRuntime runtime = TestBattle.Create1v1(TestBattle.Player());
|
||||
|
||||
Assert.NotNull(runtime);
|
||||
Assert.False(runtime.IsCompleted);
|
||||
Assert.AreEqual(1, runtime.RoundNumber);
|
||||
Assert.AreEqual(2, runtime.Units.Length);
|
||||
|
||||
BattleUnit player = runtime.Units[0];
|
||||
Assert.AreEqual(1, player.UnitId);
|
||||
Assert.AreEqual(BattleFaction.Player, player.Faction);
|
||||
Assert.AreEqual(1001, player.ConfigId);
|
||||
Assert.AreEqual(1, player.PartyOrder);
|
||||
Assert.AreEqual(120, player.CurrentHp);
|
||||
Assert.AreEqual(120, player.MaxHp);
|
||||
Assert.AreEqual(40, player.CurrentMp);
|
||||
Assert.AreEqual(14, player.Atk);
|
||||
Assert.AreEqual(6, player.Mat);
|
||||
Assert.AreEqual(12, player.Speed);
|
||||
CollectionAssert.AreEqual(new List<int> { 1, 101 }, player.ActionIds);
|
||||
|
||||
BattleUnit enemy = runtime.Units[1];
|
||||
Assert.AreEqual(2, enemy.UnitId);
|
||||
Assert.AreEqual(BattleFaction.Enemy, enemy.Faction);
|
||||
Assert.AreEqual(3001, enemy.ConfigId);
|
||||
Assert.AreEqual(50, enemy.CurrentHp);
|
||||
Assert.AreEqual(8, enemy.Atk);
|
||||
CollectionAssert.AreEqual(new List<int> { 201 }, enemy.ActionIds);
|
||||
|
||||
Assert.AreEqual(1, runtime.CurrentActorUnitId);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Create_WithNullInputs_ReturnsNull()
|
||||
{
|
||||
RunPlayerState player = TestBattle.Player();
|
||||
BattleEncounter encounter = TestBattle.Encounter();
|
||||
TestConfigProvider config = TestConfigProvider.Standard1v1();
|
||||
IRunRandomSource random = new TestRandomSource();
|
||||
|
||||
Assert.Null(BattleRuntime.Create(null, new List<RunPlayerState> { player }, config, random));
|
||||
Assert.Null(BattleRuntime.Create(encounter, null, config, random));
|
||||
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState>(), config, random));
|
||||
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState> { player }, null, random));
|
||||
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState> { player }, config, null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Create_WithMissingEnemyParty_ReturnsNull()
|
||||
{
|
||||
TestConfigProvider config = TestConfigProvider.Standard1v1();
|
||||
|
||||
Assert.Null(BattleRuntime.Create(new BattleEncounter(1, 999, false),
|
||||
new List<RunPlayerState> { TestBattle.Player() }, config, new TestRandomSource()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Create_WithMissingEnemyConfig_ReturnsNull()
|
||||
{
|
||||
TestConfigProvider config = TestConfigProvider.Standard1v1();
|
||||
config.AddParty(TestConfigs.Party(5001, 9999));
|
||||
|
||||
Assert.Null(BattleRuntime.Create(new BattleEncounter(1, 5001, false),
|
||||
new List<RunPlayerState> { TestBattle.Player() }, config, new TestRandomSource()));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user