feat(progression): Attempt ledger with terminal-outcome guard (slice 2)

Attempt carries its LevelId so settlement decides First Clear vs Replay
without trusting the caller. Outcome is terminal and refuses to change:
one death costs one life, one completion banks once.

Coins.Zero/Add driven out by the ledger rather than added up front.
21 tests. ADR-0005: Playthrough settles Attempts, has no LoseLife.
This commit is contained in:
2026-07-28 18:40:20 +02:00
parent 9767941c65
commit 40bd5c1d86
6 changed files with 232 additions and 4 deletions

View File

@@ -0,0 +1,12 @@
namespace Mr.BrickAdventures.Progression;
/// <summary>
/// How an Attempt finished, or that it has not finished yet. An Attempt reaches a terminal outcome
/// once and refuses to change afterwards — that refusal is what guarantees one death costs one life.
/// </summary>
public enum AttemptOutcome
{
InProgress,
Died,
Cleared,
}