Skip to main content

Act 7 Gate Spec: Reclamation to Campaign End

Context

This doc authors the gate predicate that authorizes the ActState.CurrentAct: 7 -> CampaignEnded transition (the Act 7 Reclamation act finishing and the campaign-end ceremony beginning) per ../lore/adr/ad-0010-act-progression-actstate-scope.md lines 101-104. The transition is driven by the ActProgression system. Unlike earlier Act-N -> Act-(N+1) transitions, the Act 7 completion fires OnActCompleted(7) followed by a follow-on CampaignEnded event rather than OnActStarted(8) (there is no Act 8; the campaign concludes).

The source act doc is ./gd-act-7-reclamation.md. The "Required Outcomes" section at lines 30-37 names the act's end state: the player can sustain long reclamation campaigns; realm projects, armies, and settlement output are tied into the same late-game agenda; corruption and gate systems are being reversed or contained at large scale; and the campaign has reached its final strategic identity.

The exact resolution shape of the apex-demon outcome is a deferred design call. Per ../lore/adr/ad-0011-true-harm-placeholder-convention.md and per .claude/rules/lore-conventions.md § "Deferred terms" (the [apex demon gate name] and [specific True Harm material] rows), the campaign-end resolution cannot name specific apex-demon or True Harm material content here. The predicate uses placeholder slots where the resolution shape is itself a deferred design call.

Gate Predicate

Act 7 is complete when the player has sustained Crown-scale reclamation campaigns to the point that the campaign's final strategic objective resolves. Expressed as named state on committed scopes:

ActState.CurrentAct == 7
&& Realm.PolityRank == PolityRank.Crown
&& Realm.Fronts.Count(f => f.FrontStatus == FrontStatus.Concluded
&& f.CampaignGoalKind == CampaignGoalKind.ReclamationCluster)
>= Config.Act7.MinConcludedReclamationFrontCount
&& Realm.SealedGateScars.Count >= Config.Act7.MinSealedGateScarCount
&& Realm.ApexDemonOutcomeState == ApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId>
&& Realm.AfterwarReadinessState == AfterwarReadinessState.Ready

Named-state sources:

  • ActState.CurrentAct per ad-0010 line 53.
  • Realm.PolityRank per ad-0009 lines 56-71 (the rank remains Crown).
  • Realm.Fronts, Front.FrontStatus, and Front.CampaignGoalKind per gd-fronts.md lines 176-190 and the Campaign Goal binding at gd-act-7-reclamation.md lines 17-20 and gd-act-6-crown.md lines 22-26. CampaignGoalKind.ReclamationCluster corresponds to the "Reclaim Territory Cluster" goal at gd-act-7-reclamation.md line 75.
  • Realm.SealedGateScars is the Realm-scoped count of gate scars that have completed the SealGateScar Operation per ../systems/gd-operations.md and gd-act-7-reclamation.md line 17.
  • Realm.ApexDemonOutcomeState and the ApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId> slot is the apex-demon resolution predicate. The specific resolution shape (whether through [apex demon gate name] sealing, through [specific True Harm material] presented at the Wardheart, or through a different apex-class outcome) is deferred per ad-0011; Wave M binds the concrete resolution state.
  • Realm.AfterwarReadinessState is the readiness flag for the Afterwar consequence surface per gd-act-7-reclamation.md line 75 and the Afterwar period state row via lh-game1-world-hooks.md.
  • Config.Act7.MinConcludedReclamationFrontCount and Config.Act7.MinSealedGateScarCount are UI-exposed Config fields with world-size-parameterized defaults.

Triggered Events

When the predicate transitions to true, the ActProgression system fires:

  • OnActCompleted(ActProgressionArgs { PreviousAct = 7, NewAct = 8, TransitionDay = <current day> }) per ad-0010 lines 62-66. NewAct = 8 is the campaign-ended sentinel; its binding rule is authored in Wave 5a.
  • CampaignEnded follow-on event per ad-0010 lines 101-104; its handler binding is deferred to Wave 5a.

OnActStarted does NOT fire on this transition; there is no Act 8.

Capability Unlocks

The Act 7 -> CampaignEnded transition surfaces the campaign-end ceremony per ad-0010 line 102; it does not unlock new in-campaign capability. The Afterwar consequence surface activates and the cosmological reveal lane's resolution concludes per gd-act-7-reclamation.md lines 53-57. The CampaignEnded event handler in Wave 5a surfaces the end-of-campaign UI surface; the exact ceremony shape is itself deferred Wave-5a content per ad-0010 lines 103-104.

Runtime Backing Status

Status at this doc's acceptance time: contract-only.

  • Host/runtime owner: legacy/v1/examples/valenar/Host/Systems/ActProgressionSystem.cs reads the predicate and fires the CampaignEnded follow-on.
  • Source/generated owner: predicate body in Content/acts/systems.secs; CampaignEnded event declaration in Content/acts/events.secs. The ApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId> slot binds in Wave M when the apex-demon resolution shape lands.
  • Read-model/UI owner: the React client gains a campaign-end view per the CampaignEnded handler; ad-0010 lines 169-172 names the saga-position display surface that this view supersedes.
  • Tests: <deferred-to-wave-5a> runtime-backing wave and <deferred-to-wave-M> for the apex-demon resolution binding.
  • Illegal fallback behavior: throws IllegalTransitionException if any input cannot resolve. No fallback that admits a [apex demon gate name] placeholder as already-resolved; the predicate explicitly fails until the deferred slot is bound. No calendar-elapsed, no time-in-Act-7 fallback.
  • Next closure wave: Wave 5a runtime-backing wave for CampaignEnded wiring; Wave M for apex-demon resolution binding.

Cross-References