From 0289930897a47653a29324891f9c2a145e8cab17 Mon Sep 17 00:00:00 2001 From: VinPropane Date: Sun, 31 May 2026 16:44:48 -0400 Subject: [PATCH] NEO-104: Use subset check for all-targets-defeated predicate. Matches documented semantics; extra defeated ids via direct store calls no longer block completion readiness (Bugbot PR #143). --- .../EncounterProgressOperationsTests.cs | 22 +++++++++++++++++++ .../Encounters/EncounterProgressOperations.cs | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) 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); } }