Implement NoFail mod

This commit is contained in:
Dean Herbert 2017-08-05 11:59:58 +09:00
parent 3416925233
commit 224de9cc1e
4 changed files with 19 additions and 4 deletions

View File

@ -45,5 +45,10 @@ public abstract class Mod
/// The mods this mod cannot be enabled with.
/// </summary>
public virtual Type[] IncompatibleMods => new Type[] { };
/// <summary>
/// Whether we should allow fails at the
/// </summary>
public virtual bool AllowFail => true;
}
}

View File

@ -15,5 +15,10 @@ public abstract class ModNoFail : Mod
public override double ScoreMultiplier => 0.5;
public override bool Ranked => true;
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModAutoplay) };
/// <summary>
/// We never fail, 'yo.
/// </summary>
public override bool AllowFail => false;
}
}

View File

@ -16,8 +16,9 @@ public abstract class ScoreProcessor
{
/// <summary>
/// Invoked when the ScoreProcessor is in a failed state.
/// Return true if the fail was permitted.
/// </summary>
public event Action Failed;
public event Func<bool> Failed;
/// <summary>
/// Invoked when a new judgement has occurred. This occurs after the judgement has been processed by the <see cref="ScoreProcessor"/>.
@ -106,8 +107,8 @@ protected void UpdateFailed()
if (alreadyFailed || !HasFailed)
return;
alreadyFailed = true;
Failed?.Invoke();
if (Failed?.Invoke() != false)
alreadyFailed = true;
}
/// <summary>

View File

@ -238,13 +238,17 @@ private void onCompletion()
}
}
private void onFail()
private bool onFail()
{
if (Beatmap.Value.Mods.Value.Any(m => !m.AllowFail))
return false;
decoupledClock.Stop();
HasFailed = true;
failOverlay.Retries = RestartCount;
failOverlay.Show();
return true;
}
protected override void OnEntering(Screen last)