best times only improve; achievement unlock announces on the transition only, so popup/Steam subscribers cannot double-fire; statistics are increase-only (IncrementStat took any int). RelockAchievement is console-only and documented as not reaching Steam - a Steam achievement cannot be un-earned, so the disagreement is permanent and deliberate. refactor: extract EventLog, composed by both aggregates now that the duplication actually exists. 34 tests.
18 lines
818 B
C#
18 lines
818 B
C#
namespace Mr.BrickAdventures.Progression;
|
|
|
|
/// <summary>
|
|
/// Something that happened to player progression, raised by an aggregate as part of the operation
|
|
/// that caused it. Plain records with no engine dependency — an adapter republishes them as Godot
|
|
/// signals (ADR-0004), which is what makes "state changed ⇒ signal fired" un-bypassable.
|
|
/// </summary>
|
|
public abstract record ProgressionEvent;
|
|
|
|
/// <summary>Raised when a Playthrough loses its last life.</summary>
|
|
public sealed record RunEnded : ProgressionEvent;
|
|
|
|
/// <summary>
|
|
/// Raised the first time an Achievement is unlocked, and only then — so a subscriber that shows a
|
|
/// popup or pushes to Steam cannot fire twice however often it is told.
|
|
/// </summary>
|
|
public sealed record AchievementUnlocked(AchievementId Achievement) : ProgressionEvent;
|