Skip to content

Commit 066d102

Browse files
Wire arena revocation enforcement into runtime
1 parent 117483d commit 066d102

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

src/main/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntime.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
import io.github.legendaryforge.legendary.core.internal.event.SimpleEventBus;
1515
import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaInvariantBridge;
1616
import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaInvariantRegistry;
17-
import io.github.legendaryforge.legendary.core.internal.legendary.arena.PhaseGateInvariant;
17+
import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaRevocationTracker;
1818
import io.github.legendaryforge.legendary.core.internal.legendary.arena.BoundsInvariant;
19+
import io.github.legendaryforge.legendary.core.internal.legendary.arena.LegendaryInstanceTrackingEncounterManager;
20+
import io.github.legendaryforge.legendary.core.internal.legendary.arena.LegendaryRevokedRejoinEnforcingEncounterManager;
21+
import io.github.legendaryforge.legendary.core.internal.legendary.arena.PhaseGateInvariant;
1922
import io.github.legendaryforge.legendary.core.internal.legendary.manager.LegendaryAccessEnforcingEncounterManager;
2023
import io.github.legendaryforge.legendary.core.internal.legendary.penalty.NoopLegendaryPenaltyStatus;
2124
import io.github.legendaryforge.legendary.core.internal.legendary.start.DefaultLegendaryStartPolicy;
@@ -24,12 +27,10 @@
2427
import io.github.legendaryforge.legendary.core.internal.lifecycle.DefaultServiceRegistry;
2528
import io.github.legendaryforge.legendary.core.internal.registry.DefaultRegistryAccess;
2629
import java.time.Clock;
27-
import java.util.concurrent.ConcurrentHashMap;
28-
import java.util.Set;
29-
import io.github.legendaryforge.legendary.core.internal.legendary.arena.LegendaryInstanceTrackingEncounterManager;
30-
import io.github.legendaryforge.legendary.core.api.id.ResourceId;
3130
import java.util.Objects;
3231
import java.util.Optional;
32+
import java.util.Set;
33+
import java.util.concurrent.ConcurrentHashMap;
3334

3435
/**
3536
* Default internal wiring of LegendaryCore runtime components.
@@ -86,7 +87,7 @@ public DefaultCoreRuntime(Optional<PlayerDirectory> players, Optional<PartyDirec
8687
io.github.legendaryforge.legendary.core.api.encounter.event.EncounterEndedEvent.class,
8788
durationTelemetry::onEnded);
8889

89-
Set<java.util.UUID> legendaryInstanceIds = ConcurrentHashMap.newKeySet();
90+
Set<java.util.UUID> legendaryInstanceIds = ConcurrentHashMap.newKeySet();
9091
PhaseGateInvariant phaseGate = new PhaseGateInvariant();
9192
BoundsInvariant bounds = new BoundsInvariant(bus);
9293

@@ -97,11 +98,20 @@ public DefaultCoreRuntime(Optional<PlayerDirectory> players, Optional<PartyDirec
9798

9899
ArenaInvariantBridge.bind(bus, arenaRegistry, legendaryInstanceIds::contains, legendaryInstanceIds::remove);
99100

101+
ArenaRevocationTracker revocations = new ArenaRevocationTracker();
102+
103+
bus.subscribe(
104+
io.github.legendaryforge.legendary.core.api.encounter.event.EncounterEndedEvent.class,
105+
e -> revocations.clearInstance(e.instanceId()));
106+
100107
EncounterManager base = new DefaultEncounterManager(players, parties, Optional.of(bus));
101108
EncounterManager startGated = new LegendaryStartGatingEncounterManager(
102109
base, new DefaultLegendaryStartPolicy(), new NoopLegendaryPenaltyStatus());
103-
EncounterManager enforced = new LegendaryAccessEnforcingEncounterManager(startGated, new DefaultLegendaryAccessPolicy());
104-
this.encounters = new LegendaryInstanceTrackingEncounterManager(enforced, legendaryInstanceIds);
110+
EncounterManager enforced =
111+
new LegendaryAccessEnforcingEncounterManager(startGated, new DefaultLegendaryAccessPolicy());
112+
EncounterManager revokedRejoinEnforced = new LegendaryRevokedRejoinEnforcingEncounterManager(
113+
enforced, legendaryInstanceIds::contains, phaseGate, revocations);
114+
this.encounters = new LegendaryInstanceTrackingEncounterManager(revokedRejoinEnforced, legendaryInstanceIds);
105115

106116
this.players = Objects.requireNonNull(players, "players");
107117
this.parties = Objects.requireNonNull(parties, "parties");

src/test/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntimeWiringTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.github.legendaryforge.legendary.core.api.platform.CoreRuntime;
88
import io.github.legendaryforge.legendary.core.internal.encounter.DefaultEncounterManager;
99
import io.github.legendaryforge.legendary.core.internal.legendary.arena.LegendaryInstanceTrackingEncounterManager;
10+
import io.github.legendaryforge.legendary.core.internal.legendary.arena.LegendaryRevokedRejoinEnforcingEncounterManager;
1011
import io.github.legendaryforge.legendary.core.internal.legendary.manager.LegendaryAccessEnforcingEncounterManager;
1112
import io.github.legendaryforge.legendary.core.internal.legendary.start.LegendaryStartGatingEncounterManager;
1213
import java.lang.reflect.Field;
@@ -30,15 +31,22 @@ void defaultConstructorWiresLegendaryEncounterManagersInCorrectOrder() {
3031
CoreRuntime runtime = new DefaultCoreRuntime();
3132

3233
EncounterManager encounters = runtime.encounters();
33-
assertTrue(encounters instanceof LegendaryInstanceTrackingEncounterManager, "top-level should track legendary instances");
34+
assertTrue(
35+
encounters instanceof LegendaryInstanceTrackingEncounterManager,
36+
"top-level should track legendary instances");
3437

35-
EncounterManager enforcing = readDelegate(encounters);
36-
assertTrue(enforcing instanceof LegendaryAccessEnforcingEncounterManager, "second-level should enforce access");
38+
EncounterManager revokedRejoinEnforced = readDelegate(encounters);
39+
assertTrue(
40+
revokedRejoinEnforced instanceof LegendaryRevokedRejoinEnforcingEncounterManager,
41+
"second-level should enforce revocation");
3742

38-
EncounterManager startGated = readDelegate(enforcing);
39-
assertTrue(startGated instanceof LegendaryStartGatingEncounterManager, "third-level should gate start");
43+
EncounterManager enforcing = readDelegate(revokedRejoinEnforced);
44+
assertTrue(enforcing instanceof LegendaryAccessEnforcingEncounterManager, "third-level should enforce access");
4045

41-
EncounterManager base = readDelegate(startGated);
46+
EncounterManager startGated = readDelegate(enforcing);
47+
assertTrue(startGated instanceof LegendaryStartGatingEncounterManager, "fourth-level should gate start");
48+
49+
EncounterManager base = readDelegate(startGated);
4250
assertTrue(base instanceof DefaultEncounterManager, "base should be DefaultEncounterManager");
4351
}
4452

0 commit comments

Comments
 (0)