diff --git a/server/NeonSprawl.Server.Tests/Game/Encounters/EncounterProgressOperationsTests.cs b/server/NeonSprawl.Server.Tests/Game/Encounters/EncounterProgressOperationsTests.cs index 28f535c..6a99eaf 100644 --- a/server/NeonSprawl.Server.Tests/Game/Encounters/EncounterProgressOperationsTests.cs +++ b/server/NeonSprawl.Server.Tests/Game/Encounters/EncounterProgressOperationsTests.cs @@ -180,6 +180,28 @@ public sealed class EncounterProgressOperationsTests Assert.True(allDefeated); } + [Fact] + public async Task IsAllRequiredTargetsDefeated_ShouldReturnTrue_WhenDefeatedSetIsSupersetOfRequired() + { + // Arrange + await using var factory = new InMemoryWebApplicationFactory(); + var registry = factory.Services.GetRequiredService(); + var progress = factory.Services.GetRequiredService(); + _ = progress.TryActivate(PlayerId, EncounterId); + _ = progress.TryAddDefeatedTarget(PlayerId, EncounterId, MeleeNpc); + _ = progress.TryAddDefeatedTarget(PlayerId, EncounterId, RangedNpc); + _ = progress.TryAddDefeatedTarget(PlayerId, EncounterId, EliteNpc); + _ = progress.TryAddDefeatedTarget(PlayerId, EncounterId, "extra_non_required_npc"); + // Act + var allDefeated = EncounterProgressOperations.IsAllRequiredTargetsDefeated( + PlayerId, + EncounterId, + registry, + progress); + // Assert + Assert.True(allDefeated); + } + [Fact] public async Task TryMarkCompleted_ShouldReturnFalseOnSecondAttempt_WhenUsingCompletionStoreDirectly() { diff --git a/server/NeonSprawl.Server/Game/Encounters/EncounterProgressOperations.cs b/server/NeonSprawl.Server/Game/Encounters/EncounterProgressOperations.cs index 9aba447..10128e5 100644 --- a/server/NeonSprawl.Server/Game/Encounters/EncounterProgressOperations.cs +++ b/server/NeonSprawl.Server/Game/Encounters/EncounterProgressOperations.cs @@ -142,6 +142,6 @@ public static class EncounterProgressOperations return false; } - return required.SetEquals(progress.DefeatedNpcInstanceIds); + return required.IsSubsetOf(progress.DefeatedNpcInstanceIds); } }