Skip to content

Outcomes: Winning and Losing

Outcome Basics

An Outcome is a string enum, with values ["victory", "defeat"].

An OutcomeChecker is a Subscriber subclass that checks whether its parent Faction has won or lost (or neither).

Some examples of outcomes to check for:

  • "Win when all mafia are eliminated" (a typical "town" win condition).
  • "Win when we are the last faction alive" (for the "serial killer" alignment).
  • "Lose when you are eliminated" (for the "survivor" alignment).

If an OutcomeChecker determines that its conditions apply, it responds to the current event with an OutcomeAction. Assuming nothing stops the faction from winning, the action runs, setting each Actor's actor.status['outcome']. The EPostAction is actually a subclass called EOutcomeAchieved, which can be listened to specifically.

An EOutcomeAchieved event represents a Faction achieving an outcome, i. e. the alignment has already won or lost. This doesn't necessarily mean that the other factions have achieved an Outcome, though.

Ending the game

The EOutcomeAchieved events don't end the game by themselves. If you want the game to end after all alignments achieve an Outcome, add a GameEnder auxiliary object - it keeps track of all outcomes and creates the EndTheGame action, followed by the EGameEnded event.

The action changes the current Phase to the "shutdown" phase.

Nothing else actually happens when the game ends, but you can subscribe to the EGameEnded event in your own application (via AuxObject) to wrap up the game and award the victory to the proper alignment(s).

Wrapping Up

That's it! The User Guide is over, but you can look at the Examples, Reference documentation, or the source code, for more info.