Skip to content

Commit f79d545

Browse files
author
serg.morozov
committed
not clean execution
1 parent ee744f0 commit f79d545

File tree

5 files changed

+33
-20
lines changed

5 files changed

+33
-20
lines changed

NuclearAbilitySystem.Tests/AbilitySystemTests.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void DoubleStrikeWithOneBully_Full()
2020
state.AbilityContextHolder.GetContext<ITurnAbilityContext>().NextTurn();
2121

2222
Assert.AreEqual(true, doubleStrikeAbility.CanExecute(null!, null!, state));
23-
var result = state.ExecuteAbility(new StringUnitId("A"), 0, new StringUnitId("B"));
23+
var result = state.ExecuteAbilityOnClone(new StringUnitId("A"), 0, new StringUnitId("B"));
2424

2525
// Tests
2626
Assert.AreEqual(6, result.Commands.Count);
@@ -46,11 +46,12 @@ public void DoubleStrikeWithOneBully_OneShot()
4646
.WithUnit(new TestUnit("C", 5, 1, new Vector2(0, 0)).WithBullyStatusEffect())
4747
.Build();
4848

49+
state.Connect();
4950
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
5051
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
5152
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
5253
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
53-
54+
state.Disconnect();
5455
var result = state.CommandQueue.CalculateCommandQueue();
5556
Assert.AreEqual(2, result.Count);
5657
Assert.AreEqual(new AttackCombatCommand(new StringUnitId("A"), new StringUnitId("B"), 5, 0), result[0]);
@@ -67,10 +68,12 @@ public void DoubleStrikeWithTwoBully_Full()
6768
.WithUnit(new TestUnit("D", 5, 1, new Vector2(0, 0)).WithBullyStatusEffect())
6869
.Build();
6970

71+
state.Connect();
7072
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
7173
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
7274
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
7375
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
76+
state.Disconnect();
7477

7578
var result = state.CommandQueue.CalculateCommandQueue();
7679
Assert.AreEqual(6, result.Count);
@@ -96,8 +99,10 @@ public void SingleStrikeWithOneDefender_Full()
9699
.WithUnit(new TestUnit("E", 5, 1, new Vector2(0, 0)).WithDefenderStatusEffect())
97100
.Build();
98101

102+
state.Connect();
99103
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
100104
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
105+
state.Disconnect();
101106

102107
var result = state.CommandQueue.CalculateCommandQueue();
103108
Assert.AreEqual(3, result.Count);
@@ -116,8 +121,10 @@ public void SingleStrikeWithOneBullyAndOneDefender()
116121
.WithUnit(new TestUnit("D", 5, 1, new Vector2(0, 0)).WithDefenderStatusEffect())
117122
.Build();
118123

124+
state.Connect();
119125
state.GetUnit(new StringUnitId("A")).GetUnitFeature<IDamageable>()
120126
.DealDamage(state.GetUnit(new StringUnitId("B")), 1);
127+
state.Disconnect();
121128

122129
var result = state.CommandQueue.CalculateCommandQueue();
123130
Assert.AreEqual(4, result.Count);
@@ -137,8 +144,8 @@ public void TwoAbilities()
137144
.WithUnit(new TestUnit("B", 5, 0, new Vector2(0, 2)))
138145
.Build();
139146

140-
state.ExecuteAbility(new StringUnitId("A"), 0, new StringUnitId("B"));
141-
state.ExecuteAbility(new StringUnitId("A"), 0, new StringUnitId("B"));
147+
state.ExecuteAbilityOnClone(new StringUnitId("A"), 0, new StringUnitId("B"));
148+
state.ExecuteAbilityOnClone(new StringUnitId("A"), 0, new StringUnitId("B"));
142149
}
143150
}
144151
}

NuclearAbilitySystem/CombatEventBus/CombatState.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,22 @@ public CombatState(List<IUnitMutable> units, IAbilityContextHolderMutable abilit
2020
}
2121

2222
public IAbilityContextHolder AbilityContextHolder => _abilityContextHolder;
23-
public IAbilityExecutionResult ExecuteAbility(UnitId sourceId, int abilityIndex, UnitId? targetId)
23+
public IAbilityExecutionResult ExecuteAbilityOnClone(UnitId sourceId, int abilityIndex, UnitId? targetId)
2424
{
2525
var resultState = DeepClone();
2626
resultState.Connect();
27-
28-
resultState.GetUnit(sourceId)
27+
var result = resultState.ExecuteAbility(sourceId, abilityIndex, targetId);
28+
resultState.Disconnect();
29+
return result;
30+
}
31+
32+
public IAbilityExecutionResult ExecuteAbility(UnitId sourceId, int abilityIndex, UnitId? targetId)
33+
{
34+
GetUnit(sourceId)
2935
.GetUnitFeature<IAbilitiesHolder>()
3036
.Abilities[abilityIndex]
31-
.Execute(sourceId, targetId, resultState);
32-
33-
resultState.Disconnect();
34-
var commands = resultState.CommandQueue.CalculateCommandQueue();
35-
36-
return new AbilityExecutionResult(commands, resultState);
37+
.Execute(sourceId, targetId, this);
38+
return new AbilityExecutionResult(CommandQueue.CalculateCommandQueue(), this);
3739
}
3840

3941
public ICombatEventBus CombatEventBus => _combatEventBus;
@@ -46,19 +48,19 @@ public IUnit GetUnit(UnitId unitId)
4648

4749
public ReadOnlyCollection<IUnit> GetUnits() => _units.OfType<IUnit>().ToList().AsReadOnly();
4850

49-
private void Connect()
51+
public void Connect()
5052
{
5153
_units.ForEach(u => u.Connect(this));
5254
_abilityContextHolder.Connect(this);
5355
}
5456

55-
private void Disconnect()
57+
public void Disconnect()
5658
{
5759
_units.ForEach(u => u.Disconnect());
5860
_abilityContextHolder.Disconnect();
5961
}
6062

61-
private CombatState DeepClone()
63+
public ICombatStateMutable DeepClone()
6264
{
6365
return new CombatState(_units.Select(u => u.DeepClone()).ToList(),
6466
_abilityContextHolder.DeepClone());

NuclearAbilitySystem/CombatEventBus/IAbilityExecutionResult.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ namespace Nuclear.AbilitySystem
55
public interface IAbilityExecutionResult
66
{
77
ReadOnlyCollection<ICombatCommand> Commands { get; }
8-
ICombatState ResultState { get; }
8+
ICombatStateMutable ResultState { get; }
99
}
1010

11-
public record AbilityExecutionResult(ReadOnlyCollection<ICombatCommand> Commands, ICombatState ResultState)
11+
public record AbilityExecutionResult(ReadOnlyCollection<ICombatCommand> Commands, ICombatStateMutable ResultState)
1212
: IAbilityExecutionResult;
1313

1414
}

NuclearAbilitySystem/CombatEventBus/ICombatState.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ public interface ICombatState
77
IUnit GetUnit(UnitId unitId);
88
ReadOnlyCollection<IUnit> GetUnits();
99
IAbilityContextHolder AbilityContextHolder { get; }
10-
IAbilityExecutionResult ExecuteAbility(UnitId sourceId, int abilityIndex, UnitId? targetId);
10+
IAbilityExecutionResult ExecuteAbilityOnClone(UnitId sourceId, int abilityIndex, UnitId? targetId);
1111
}
1212

1313
public interface ICombatStateMutable : ICombatState
1414
{
1515
ICombatEventBus CombatEventBus { get; }
1616
ICommandQueue CommandQueue { get; }
17+
void Connect();
18+
void Disconnect();
19+
IAbilityExecutionResult ExecuteAbility(UnitId sourceId, int abilityIndex, UnitId? targetId);
20+
ICombatStateMutable DeepClone();
1721
}
1822
}

NuclearAbilitySystem/NuclearAbilitySystem.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<Platforms>AnyCPU</Platforms>
1010
<IsPackable>true</IsPackable>
1111
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
12-
<Version>0.2.0</Version>
12+
<Version>0.2.1</Version>
1313
<Title>NuclearAbilitySystem</Title>
1414
<Authors>NuclearBand</Authors>
1515
<Description>A flexible ability system that allows creating, configuring, and executing abilities in games</Description>

0 commit comments

Comments
 (0)