feat(progression): capabilities the adapters need (commit A of the swap)
no behaviour change - additive only. GrantSkill: pickups are free unlocks, and collecting one already owned is a no-op rather than a free upgrade. RevokeSkill: for skills that consume themselves (brick shield). AbandonAttempt: leaving a level without dying, so no life is charged. ApplyCheat rewrites the Playthrough through its snapshot rather than via SetLives/AddCoins mutators, which ADR-0005 rules out - a bare mutator is an invitation, and the old code had two paths to exactly that. Every value is re-validated on the way back in and a rejected cheat leaves the Playthrough untouched, which is asserted. 73 tests.
This commit is contained in:
@@ -174,6 +174,37 @@ public partial class ProgressionRoot : Node
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/// <summary>Free unlock, as a pickup gives. Returns false if it was already owned.</summary>
|
||||
public bool GrantSkill(SkillId skill)
|
||||
{
|
||||
if (_service == null) return false;
|
||||
|
||||
var granted = _service.GrantSkill(skill);
|
||||
Publish();
|
||||
return granted;
|
||||
}
|
||||
|
||||
/// <summary>Takes a Skill away — for Skills that consume themselves.</summary>
|
||||
public bool RevokeSkill(SkillId skill)
|
||||
{
|
||||
if (_service == null) return false;
|
||||
|
||||
var revoked = _service.RevokeSkill(skill);
|
||||
Publish();
|
||||
return revoked;
|
||||
}
|
||||
|
||||
/// <summary>Discards the current Attempt without charging a life — leaving a Level, not dying.</summary>
|
||||
public void AbandonAttempt() => Run(() => _service.AbandonAttempt());
|
||||
|
||||
/// <summary>Console only — see <see cref="ProgressionService.ApplyCheat"/>.</summary>
|
||||
public void ApplyCheat(Func<PlaythroughSnapshot, PlaythroughSnapshot> change) =>
|
||||
Run(() => _service.ApplyCheat(change));
|
||||
|
||||
/// <summary>Whether there is a resumable Playthrough, for enabling the Continue button.</summary>
|
||||
public bool HasSavedPlaythrough =>
|
||||
PeekPlaythrough(SoleSlot) == LoadOutcome.Loaded;
|
||||
|
||||
private void Run(System.Action operation)
|
||||
{
|
||||
if (_service == null) return;
|
||||
|
||||
Reference in New Issue
Block a user