mirror of
https://github.com/ppy/osu.git
synced 2024-12-16 15:42:54 +08:00
Merge branch 'master' into taiko_drumroll_drawable
This commit is contained in:
commit
75dba19e7b
@ -1 +1 @@
|
|||||||
Subproject commit 34c9f17a6ac6fa5e9fd5569f9e119331316c1313
|
Subproject commit 51737ec1320b4ea9dce4978f24e1d77a28f0a98e
|
@ -4,9 +4,9 @@
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Screens.Testing;
|
using osu.Framework.Screens.Testing;
|
||||||
using osu.Game.Modes;
|
|
||||||
using osu.Game.Modes.Mods;
|
using osu.Game.Modes.Mods;
|
||||||
using osu.Game.Modes.Osu.Mods;
|
using osu.Game.Modes.Osu.Mods;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Screens.Select.Leaderboards;
|
using osu.Game.Screens.Select.Leaderboards;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@ using osu.Game.Modes.Mods;
|
|||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Modes.Catch.Scoring;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Catch
|
namespace osu.Game.Modes.Catch
|
||||||
{
|
{
|
||||||
|
@ -7,8 +7,8 @@ namespace osu.Game.Modes.Catch.Judgements
|
|||||||
{
|
{
|
||||||
public class CatchJudgement : Judgement
|
public class CatchJudgement : Judgement
|
||||||
{
|
{
|
||||||
public override string ScoreString => string.Empty;
|
public override string ResultString => string.Empty;
|
||||||
|
|
||||||
public override string MaxScoreString => string.Empty;
|
public override string MaxResultString => string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
|
|
||||||
using osu.Game.Modes.Catch.Judgements;
|
using osu.Game.Modes.Catch.Judgements;
|
||||||
using osu.Game.Modes.Catch.Objects;
|
using osu.Game.Modes.Catch.Objects;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Catch
|
namespace osu.Game.Modes.Catch.Scoring
|
||||||
{
|
{
|
||||||
internal class CatchScoreProcessor : ScoreProcessor<CatchBaseHit, CatchJudgement>
|
internal class CatchScoreProcessor : ScoreProcessor<CatchBaseHit, CatchJudgement>
|
||||||
{
|
{
|
||||||
@ -18,7 +19,7 @@ namespace osu.Game.Modes.Catch
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateCalculations(CatchJudgement newJudgement)
|
protected override void OnNewJugement(CatchJudgement judgement)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,7 +5,9 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Modes.Catch.Beatmaps;
|
using osu.Game.Modes.Catch.Beatmaps;
|
||||||
using osu.Game.Modes.Catch.Judgements;
|
using osu.Game.Modes.Catch.Judgements;
|
||||||
using osu.Game.Modes.Catch.Objects;
|
using osu.Game.Modes.Catch.Objects;
|
||||||
|
using osu.Game.Modes.Catch.Scoring;
|
||||||
using osu.Game.Modes.Objects.Drawables;
|
using osu.Game.Modes.Objects.Drawables;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Catch.UI
|
namespace osu.Game.Modes.Catch.UI
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
<Compile Include="Beatmaps\CatchBeatmapConverter.cs" />
|
<Compile Include="Beatmaps\CatchBeatmapConverter.cs" />
|
||||||
<Compile Include="Beatmaps\CatchBeatmapProcessor.cs" />
|
<Compile Include="Beatmaps\CatchBeatmapProcessor.cs" />
|
||||||
<Compile Include="CatchDifficultyCalculator.cs" />
|
<Compile Include="CatchDifficultyCalculator.cs" />
|
||||||
<Compile Include="CatchScoreProcessor.cs" />
|
<Compile Include="Scoring\CatchScoreProcessor.cs" />
|
||||||
<Compile Include="Judgements\CatchJudgement.cs" />
|
<Compile Include="Judgements\CatchJudgement.cs" />
|
||||||
<Compile Include="Objects\CatchBaseHit.cs" />
|
<Compile Include="Objects\CatchBaseHit.cs" />
|
||||||
<Compile Include="Objects\Drawable\DrawableFruit.cs" />
|
<Compile Include="Objects\Drawable\DrawableFruit.cs" />
|
||||||
|
@ -7,8 +7,8 @@ namespace osu.Game.Modes.Mania.Judgements
|
|||||||
{
|
{
|
||||||
public class ManiaJudgement : Judgement
|
public class ManiaJudgement : Judgement
|
||||||
{
|
{
|
||||||
public override string ScoreString => string.Empty;
|
public override string ResultString => string.Empty;
|
||||||
|
|
||||||
public override string MaxScoreString => string.Empty;
|
public override string MaxResultString => string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ using osu.Game.Modes.Mods;
|
|||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Modes.Mania.Scoring;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Mania
|
namespace osu.Game.Modes.Mania
|
||||||
{
|
{
|
||||||
|
@ -3,9 +3,10 @@
|
|||||||
|
|
||||||
using osu.Game.Modes.Mania.Judgements;
|
using osu.Game.Modes.Mania.Judgements;
|
||||||
using osu.Game.Modes.Mania.Objects;
|
using osu.Game.Modes.Mania.Objects;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Mania
|
namespace osu.Game.Modes.Mania.Scoring
|
||||||
{
|
{
|
||||||
internal class ManiaScoreProcessor : ScoreProcessor<ManiaBaseHit, ManiaJudgement>
|
internal class ManiaScoreProcessor : ScoreProcessor<ManiaBaseHit, ManiaJudgement>
|
||||||
{
|
{
|
||||||
@ -18,7 +19,7 @@ namespace osu.Game.Modes.Mania
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateCalculations(ManiaJudgement newJudgement)
|
protected override void OnNewJugement(ManiaJudgement judgement)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,7 +5,9 @@ using osu.Game.Beatmaps;
|
|||||||
using osu.Game.Modes.Mania.Beatmaps;
|
using osu.Game.Modes.Mania.Beatmaps;
|
||||||
using osu.Game.Modes.Mania.Judgements;
|
using osu.Game.Modes.Mania.Judgements;
|
||||||
using osu.Game.Modes.Mania.Objects;
|
using osu.Game.Modes.Mania.Objects;
|
||||||
|
using osu.Game.Modes.Mania.Scoring;
|
||||||
using osu.Game.Modes.Objects.Drawables;
|
using osu.Game.Modes.Objects.Drawables;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Mania.UI
|
namespace osu.Game.Modes.Mania.UI
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
<Compile Include="Beatmaps\ManiaBeatmapProcessor.cs" />
|
<Compile Include="Beatmaps\ManiaBeatmapProcessor.cs" />
|
||||||
<Compile Include="Judgements\ManiaJudgement.cs" />
|
<Compile Include="Judgements\ManiaJudgement.cs" />
|
||||||
<Compile Include="ManiaDifficultyCalculator.cs" />
|
<Compile Include="ManiaDifficultyCalculator.cs" />
|
||||||
<Compile Include="ManiaScoreProcessor.cs" />
|
<Compile Include="Scoring\ManiaScoreProcessor.cs" />
|
||||||
<Compile Include="Objects\Drawable\DrawableNote.cs" />
|
<Compile Include="Objects\Drawable\DrawableNote.cs" />
|
||||||
<Compile Include="Objects\HoldNote.cs" />
|
<Compile Include="Objects\HoldNote.cs" />
|
||||||
<Compile Include="Objects\ManiaBaseHit.cs" />
|
<Compile Include="Objects\ManiaBaseHit.cs" />
|
||||||
|
@ -25,9 +25,9 @@ namespace osu.Game.Modes.Osu.Judgements
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public OsuScoreResult MaxScore = OsuScoreResult.Hit300;
|
public OsuScoreResult MaxScore = OsuScoreResult.Hit300;
|
||||||
|
|
||||||
public override string ScoreString => Score.GetDescription();
|
public override string ResultString => Score.GetDescription();
|
||||||
|
|
||||||
public override string MaxScoreString => MaxScore.GetDescription();
|
public override string MaxResultString => MaxScore.GetDescription();
|
||||||
|
|
||||||
public int ScoreValue => scoreToInt(Score);
|
public int ScoreValue => scoreToInt(Score);
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ using osu.Game.Modes.Mods;
|
|||||||
using osu.Game.Modes.Osu.Objects;
|
using osu.Game.Modes.Osu.Objects;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Osu.Mods
|
namespace osu.Game.Modes.Osu.Mods
|
||||||
{
|
{
|
||||||
|
@ -12,6 +12,8 @@ using osu.Game.Modes.UI;
|
|||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Modes.Osu.Scoring;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Osu
|
namespace osu.Game.Modes.Osu
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
namespace osu.Game.Modes.Osu
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
|
namespace osu.Game.Modes.Osu.Scoring
|
||||||
{
|
{
|
||||||
internal class OsuScore : Score
|
internal class OsuScore : Score
|
||||||
{
|
{
|
@ -4,9 +4,10 @@
|
|||||||
using osu.Game.Modes.Objects.Drawables;
|
using osu.Game.Modes.Objects.Drawables;
|
||||||
using osu.Game.Modes.Osu.Judgements;
|
using osu.Game.Modes.Osu.Judgements;
|
||||||
using osu.Game.Modes.Osu.Objects;
|
using osu.Game.Modes.Osu.Objects;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Osu
|
namespace osu.Game.Modes.Osu.Scoring
|
||||||
{
|
{
|
||||||
internal class OsuScoreProcessor : ScoreProcessor<OsuHitObject, OsuJudgement>
|
internal class OsuScoreProcessor : ScoreProcessor<OsuHitObject, OsuJudgement>
|
||||||
{
|
{
|
||||||
@ -27,7 +28,7 @@ namespace osu.Game.Modes.Osu
|
|||||||
Accuracy.Value = 1;
|
Accuracy.Value = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void UpdateCalculations(OsuJudgement judgement)
|
protected override void OnNewJugement(OsuJudgement judgement)
|
||||||
{
|
{
|
||||||
if (judgement != null)
|
if (judgement != null)
|
||||||
{
|
{
|
@ -7,6 +7,8 @@ using osu.Game.Modes.Osu.Beatmaps;
|
|||||||
using osu.Game.Modes.Osu.Judgements;
|
using osu.Game.Modes.Osu.Judgements;
|
||||||
using osu.Game.Modes.Osu.Objects;
|
using osu.Game.Modes.Osu.Objects;
|
||||||
using osu.Game.Modes.Osu.Objects.Drawables;
|
using osu.Game.Modes.Osu.Objects.Drawables;
|
||||||
|
using osu.Game.Modes.Osu.Scoring;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
|
|
||||||
|
@ -72,8 +72,8 @@
|
|||||||
<Compile Include="OsuAutoReplay.cs" />
|
<Compile Include="OsuAutoReplay.cs" />
|
||||||
<Compile Include="OsuDifficultyCalculator.cs" />
|
<Compile Include="OsuDifficultyCalculator.cs" />
|
||||||
<Compile Include="OsuKeyConversionInputManager.cs" />
|
<Compile Include="OsuKeyConversionInputManager.cs" />
|
||||||
<Compile Include="OsuScore.cs" />
|
<Compile Include="Scoring\OsuScore.cs" />
|
||||||
<Compile Include="OsuScoreProcessor.cs" />
|
<Compile Include="Scoring\OsuScoreProcessor.cs" />
|
||||||
<Compile Include="UI\OsuHitRenderer.cs" />
|
<Compile Include="UI\OsuHitRenderer.cs" />
|
||||||
<Compile Include="UI\OsuPlayfield.cs" />
|
<Compile Include="UI\OsuPlayfield.cs" />
|
||||||
<Compile Include="OsuRuleset.cs" />
|
<Compile Include="OsuRuleset.cs" />
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
|
using osu.Game.Beatmaps.Samples;
|
||||||
using osu.Game.Modes.Objects;
|
using osu.Game.Modes.Objects;
|
||||||
using osu.Game.Modes.Objects.Types;
|
using osu.Game.Modes.Objects.Types;
|
||||||
using osu.Game.Modes.Taiko.Objects;
|
using osu.Game.Modes.Taiko.Objects;
|
||||||
@ -43,12 +44,15 @@ namespace osu.Game.Modes.Taiko.Beatmaps
|
|||||||
IHasRepeats repeatsData = original as IHasRepeats;
|
IHasRepeats repeatsData = original as IHasRepeats;
|
||||||
IHasEndTime endTimeData = original as IHasEndTime;
|
IHasEndTime endTimeData = original as IHasEndTime;
|
||||||
|
|
||||||
|
bool accented = ((original.Sample?.Type ?? SampleType.None) & SampleType.Finish) > 0;
|
||||||
|
|
||||||
if (distanceData != null)
|
if (distanceData != null)
|
||||||
{
|
{
|
||||||
return new DrumRoll
|
return new DrumRoll
|
||||||
{
|
{
|
||||||
StartTime = original.StartTime,
|
StartTime = original.StartTime,
|
||||||
Sample = original.Sample,
|
Sample = original.Sample,
|
||||||
|
Accented = accented,
|
||||||
|
|
||||||
Distance = distanceData.Distance * (repeatsData?.RepeatCount ?? 1)
|
Distance = distanceData.Distance * (repeatsData?.RepeatCount ?? 1)
|
||||||
};
|
};
|
||||||
@ -61,6 +65,7 @@ namespace osu.Game.Modes.Taiko.Beatmaps
|
|||||||
{
|
{
|
||||||
StartTime = original.StartTime,
|
StartTime = original.StartTime,
|
||||||
Sample = original.Sample,
|
Sample = original.Sample,
|
||||||
|
Accented = accented,
|
||||||
|
|
||||||
EndTime = original.StartTime + endTimeData.Duration * bash_convert_factor
|
EndTime = original.StartTime + endTimeData.Duration * bash_convert_factor
|
||||||
};
|
};
|
||||||
@ -70,6 +75,7 @@ namespace osu.Game.Modes.Taiko.Beatmaps
|
|||||||
{
|
{
|
||||||
StartTime = original.StartTime,
|
StartTime = original.StartTime,
|
||||||
Sample = original.Sample,
|
Sample = original.Sample,
|
||||||
|
Accented = accented
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,12 @@ namespace osu.Game.Modes.Taiko.Judgements
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drum roll ticks don't display judgement text.
|
/// Drum roll ticks don't display judgement text.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override string ScoreString => string.Empty;
|
public override string ResultString => string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drum roll ticks don't display judgement text.
|
/// Drum roll ticks don't display judgement text.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override string MaxScoreString => string.Empty;
|
public override string MaxResultString => string.Empty;
|
||||||
|
|
||||||
protected override int NumericResultForScore(TaikoHitResult result)
|
protected override int NumericResultForScore(TaikoHitResult result)
|
||||||
{
|
{
|
||||||
|
@ -9,38 +9,38 @@ namespace osu.Game.Modes.Taiko.Judgements
|
|||||||
public class TaikoJudgement : Judgement
|
public class TaikoJudgement : Judgement
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum score value.
|
/// The maximum result.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const TaikoHitResult MAX_HIT_RESULT = TaikoHitResult.Great;
|
public const TaikoHitResult MAX_HIT_RESULT = TaikoHitResult.Great;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The score value.
|
/// The result.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TaikoHitResult TaikoResult;
|
public TaikoHitResult TaikoResult;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The score value for the combo portion of the score.
|
/// The result value for the combo portion of the score.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int ScoreValue => NumericResultForScore(TaikoResult);
|
public int ResultValueForScore => NumericResultForScore(TaikoResult);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The score value for the accuracy portion of the score.
|
/// The result value for the accuracy portion of the score.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int AccuracyScoreValue => NumericResultForAccuracy(TaikoResult);
|
public int ResultValueForAccuracy => NumericResultForAccuracy(TaikoResult);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum score value for the combo portion of the score.
|
/// The maximum result value for the combo portion of the score.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int MaxScoreValue => NumericResultForScore(MAX_HIT_RESULT);
|
public int MaxResultValueForScore => NumericResultForScore(MAX_HIT_RESULT);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum score value for the accuracy portion of the score.
|
/// The maximum result value for the accuracy portion of the score.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int MaxAccuracyScoreValue => NumericResultForAccuracy(MAX_HIT_RESULT);
|
public int MaxResultValueForAccuracy => NumericResultForAccuracy(MAX_HIT_RESULT);
|
||||||
|
|
||||||
public override string ScoreString => TaikoResult.GetDescription();
|
public override string ResultString => TaikoResult.GetDescription();
|
||||||
|
|
||||||
public override string MaxScoreString => MAX_HIT_RESULT.GetDescription();
|
public override string MaxResultString => MAX_HIT_RESULT.GetDescription();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether this Judgement has a secondary hit in the case of finishers.
|
/// Whether this Judgement has a secondary hit in the case of finishers.
|
||||||
@ -48,11 +48,11 @@ namespace osu.Game.Modes.Taiko.Judgements
|
|||||||
public bool SecondHit;
|
public bool SecondHit;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Computes the numeric score value for the combo portion of the score.
|
/// Computes the numeric result value for the combo portion of the score.
|
||||||
/// For the accuracy portion of the score (including accuracy percentage), see <see cref="NumericResultForAccuracy(TaikoHitResult)"/>.
|
/// For the accuracy portion of the score (including accuracy percentage), see <see cref="NumericResultForAccuracy(TaikoHitResult)"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="result">The result to compute the score value for.</param>
|
/// <param name="result">The result to compute the value for.</param>
|
||||||
/// <returns>The numeric score value.</returns>
|
/// <returns>The numeric result value.</returns>
|
||||||
protected virtual int NumericResultForScore(TaikoHitResult result)
|
protected virtual int NumericResultForScore(TaikoHitResult result)
|
||||||
{
|
{
|
||||||
switch (result)
|
switch (result)
|
||||||
@ -67,11 +67,11 @@ namespace osu.Game.Modes.Taiko.Judgements
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Computes the numeric score value for the accuracy portion of the score.
|
/// Computes the numeric result value for the accuracy portion of the score.
|
||||||
/// For the combo portion of the score, see <see cref="NumericResultForScore(TaikoHitResult)"/>.
|
/// For the combo portion of the score, see <see cref="NumericResultForScore(TaikoHitResult)"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="result">The result to compute the score value for.</param>
|
/// <param name="result">The result to compute the value for.</param>
|
||||||
/// <returns>The numeric score value.</returns>
|
/// <returns>The numeric result value.</returns>
|
||||||
protected virtual int NumericResultForAccuracy(TaikoHitResult result)
|
protected virtual int NumericResultForAccuracy(TaikoHitResult result)
|
||||||
{
|
{
|
||||||
switch (result)
|
switch (result)
|
||||||
|
@ -19,6 +19,12 @@ namespace osu.Game.Modes.Taiko.Objects
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public double PreEmpt;
|
public double PreEmpt;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether this HitObject is accented.
|
||||||
|
/// Accented hit objects give more points for hitting the hit object with both keys.
|
||||||
|
/// </summary>
|
||||||
|
public bool Accented;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether this HitObject is in Kiai time.
|
/// Whether this HitObject is in Kiai time.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
263
osu.Game.Modes.Taiko/Scoring/TaikoScoreProcessor.cs
Normal file
263
osu.Game.Modes.Taiko/Scoring/TaikoScoreProcessor.cs
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Database;
|
||||||
|
using osu.Game.Modes.Objects.Drawables;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
using osu.Game.Modes.Taiko.Judgements;
|
||||||
|
using osu.Game.Modes.Taiko.Objects;
|
||||||
|
using osu.Game.Modes.UI;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
|
namespace osu.Game.Modes.Taiko.Scoring
|
||||||
|
{
|
||||||
|
internal class TaikoScoreProcessor : ScoreProcessor<TaikoHitObject, TaikoJudgement>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum score achievable.
|
||||||
|
/// Does _not_ include bonus score - for bonus score see <see cref="bonusScore"/>.
|
||||||
|
/// </summary>
|
||||||
|
private const int max_score = 1000000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The amount of the score attributed to combo.
|
||||||
|
/// </summary>
|
||||||
|
private const double combo_portion_max = max_score * 0.2;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The amount of the score attributed to accuracy.
|
||||||
|
/// </summary>
|
||||||
|
private const double accuracy_portion_max = max_score * 0.8;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The factor used to determine relevance of combos.
|
||||||
|
/// </summary>
|
||||||
|
private const double combo_base = 4;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The HP awarded by a <see cref="TaikoHitResult.Great"/> hit.
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_hit_great = 0.03;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The HP awarded for a <see cref="TaikoHitResult.Good"/> hit.
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_hit_good = 0.011;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The minimum HP deducted for a <see cref="HitResult.Miss"/>.
|
||||||
|
/// This occurs when HP Drain = 0.
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_miss_min = -0.0018;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The median HP deducted for a <see cref="HitResult.Miss"/>.
|
||||||
|
/// This occurs when HP Drain = 5.
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_miss_mid = -0.0075;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum HP deducted for a <see cref="HitResult.Miss"/>.
|
||||||
|
/// This occurs when HP Drain = 10.
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_miss_max = -0.12;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The HP awarded for a <see cref="DrumRollTick"/> hit.
|
||||||
|
/// <para>
|
||||||
|
/// <see cref="DrumRollTick"/> hits award less HP as they're more spammable, although in hindsight
|
||||||
|
/// this probably awards too little HP and is kept at this value for now for compatibility.
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
private const double hp_hit_tick = 0.00000003;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Taiko fails at the end of the map if the player has not half-filled their HP bar.
|
||||||
|
/// </summary>
|
||||||
|
public override bool HasFailed => totalHits == maxTotalHits && Health.Value <= 0.5;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The cumulative combo portion of the score.
|
||||||
|
/// </summary>
|
||||||
|
private double comboScore => combo_portion_max * comboPortion / maxComboPortion;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The cumulative accuracy portion of the score.
|
||||||
|
/// </summary>
|
||||||
|
private double accuracyScore => accuracy_portion_max * Math.Pow(Accuracy, 3.6) * totalHits / maxTotalHits;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The cumulative bonus score.
|
||||||
|
/// This is added on top of <see cref="max_score"/>, thus the total score can exceed <see cref="max_score"/>.
|
||||||
|
/// </summary>
|
||||||
|
private double bonusScore;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The multiple of the original score added to the combo portion of the score
|
||||||
|
/// for correctly hitting an accented hit object with both keys.
|
||||||
|
/// </summary>
|
||||||
|
private double accentedHitScale;
|
||||||
|
|
||||||
|
private double hpIncreaseTick;
|
||||||
|
private double hpIncreaseGreat;
|
||||||
|
private double hpIncreaseGood;
|
||||||
|
private double hpIncreaseMiss;
|
||||||
|
|
||||||
|
private double maxComboPortion;
|
||||||
|
private double comboPortion;
|
||||||
|
private int maxTotalHits;
|
||||||
|
private int totalHits;
|
||||||
|
|
||||||
|
public TaikoScoreProcessor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public TaikoScoreProcessor(HitRenderer<TaikoHitObject, TaikoJudgement> hitRenderer)
|
||||||
|
: base(hitRenderer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ComputeTargets(Beatmap<TaikoHitObject> beatmap)
|
||||||
|
{
|
||||||
|
double hpMultiplierNormal = 1 / (hp_hit_great * beatmap.HitObjects.FindAll(o => o is Hit).Count * BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.Difficulty.DrainRate, 0.5, 0.75, 0.98));
|
||||||
|
|
||||||
|
hpIncreaseTick = hp_hit_tick;
|
||||||
|
hpIncreaseGreat = hpMultiplierNormal * hp_hit_great;
|
||||||
|
hpIncreaseGood = hpMultiplierNormal * hp_hit_good;
|
||||||
|
hpIncreaseMiss = BeatmapDifficulty.DifficultyRange(beatmap.BeatmapInfo.Difficulty.DrainRate, hp_miss_min, hp_miss_mid, hp_miss_max);
|
||||||
|
|
||||||
|
var accentedHits = beatmap.HitObjects.FindAll(o => o is Hit && o.Accented);
|
||||||
|
|
||||||
|
// This is a linear function that awards:
|
||||||
|
// 10 times bonus points for hitting an accented hit object with both keys with 30 accented hit objects in the map
|
||||||
|
// 3 times bonus points for hitting an accented hit object with both keys with 120 accented hit objects in the map
|
||||||
|
accentedHitScale = -7d / 90d * MathHelper.Clamp(accentedHits.Count, 30, 120) + 111d / 9d;
|
||||||
|
|
||||||
|
foreach (var obj in beatmap.HitObjects)
|
||||||
|
{
|
||||||
|
if (obj is Hit)
|
||||||
|
{
|
||||||
|
AddJudgement(new TaikoJudgement
|
||||||
|
{
|
||||||
|
Result = HitResult.Hit,
|
||||||
|
TaikoResult = TaikoHitResult.Great,
|
||||||
|
SecondHit = obj.Accented
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (obj is DrumRoll)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ((DrumRoll)obj).TotalTicks; i++)
|
||||||
|
{
|
||||||
|
AddJudgement(new TaikoDrumRollTickJudgement
|
||||||
|
{
|
||||||
|
Result = HitResult.Hit,
|
||||||
|
TaikoResult = TaikoHitResult.Great,
|
||||||
|
SecondHit = obj.Accented
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
AddJudgement(new TaikoJudgement
|
||||||
|
{
|
||||||
|
Result = HitResult.Hit,
|
||||||
|
TaikoResult = TaikoHitResult.Great,
|
||||||
|
SecondHit = obj.Accented
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (obj is Bash)
|
||||||
|
{
|
||||||
|
AddJudgement(new TaikoJudgement
|
||||||
|
{
|
||||||
|
Result = HitResult.Hit,
|
||||||
|
TaikoResult = TaikoHitResult.Great
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maxTotalHits = totalHits;
|
||||||
|
maxComboPortion = comboPortion;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnNewJugement(TaikoJudgement judgement)
|
||||||
|
{
|
||||||
|
bool isTick = judgement is TaikoDrumRollTickJudgement;
|
||||||
|
|
||||||
|
// Don't consider ticks as a type of hit that counts towards map completion
|
||||||
|
if (!isTick)
|
||||||
|
totalHits++;
|
||||||
|
|
||||||
|
// Apply score changes
|
||||||
|
if (judgement.Result == HitResult.Hit)
|
||||||
|
{
|
||||||
|
double baseValue = judgement.ResultValueForScore;
|
||||||
|
|
||||||
|
// Add bonus points for hitting an accented hit object with the second key
|
||||||
|
if (judgement.SecondHit)
|
||||||
|
baseValue += baseValue * accentedHitScale;
|
||||||
|
|
||||||
|
// Add score to portions
|
||||||
|
if (isTick)
|
||||||
|
bonusScore += baseValue;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Combo.Value++;
|
||||||
|
|
||||||
|
// A relevance factor that needs to be applied to make higher combos more relevant
|
||||||
|
// Value is capped at 400 combo
|
||||||
|
double comboRelevance = Math.Min(Math.Log(400, combo_base), Math.Max(0.5, Math.Log(Combo.Value, combo_base)));
|
||||||
|
|
||||||
|
comboPortion += baseValue * comboRelevance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply HP changes
|
||||||
|
switch (judgement.Result)
|
||||||
|
{
|
||||||
|
case HitResult.Miss:
|
||||||
|
// Missing ticks shouldn't drop HP
|
||||||
|
if (!isTick)
|
||||||
|
Health.Value += hpIncreaseMiss;
|
||||||
|
break;
|
||||||
|
case HitResult.Hit:
|
||||||
|
switch (judgement.TaikoResult)
|
||||||
|
{
|
||||||
|
case TaikoHitResult.Good:
|
||||||
|
Health.Value += hpIncreaseGood;
|
||||||
|
break;
|
||||||
|
case TaikoHitResult.Great:
|
||||||
|
if (isTick)
|
||||||
|
Health.Value += hpIncreaseTick;
|
||||||
|
else
|
||||||
|
Health.Value += hpIncreaseGreat;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the new score + accuracy
|
||||||
|
int scoreForAccuracy = 0;
|
||||||
|
int maxScoreForAccuracy = 0;
|
||||||
|
|
||||||
|
foreach (var j in Judgements)
|
||||||
|
{
|
||||||
|
scoreForAccuracy += j.ResultValueForAccuracy;
|
||||||
|
maxScoreForAccuracy = j.MaxResultValueForAccuracy;
|
||||||
|
}
|
||||||
|
|
||||||
|
Accuracy.Value = (double)scoreForAccuracy / maxScoreForAccuracy;
|
||||||
|
TotalScore.Value = comboScore + accuracyScore + bonusScore;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Reset()
|
||||||
|
{
|
||||||
|
base.Reset();
|
||||||
|
|
||||||
|
Health.Value = 0;
|
||||||
|
|
||||||
|
bonusScore = 0;
|
||||||
|
comboPortion = 0;
|
||||||
|
totalHits = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,8 @@ using osu.Game.Modes.Taiko.UI;
|
|||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
using osu.Game.Modes.Taiko.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Taiko
|
namespace osu.Game.Modes.Taiko
|
||||||
{
|
{
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
||||||
|
|
||||||
using osu.Game.Modes.Taiko.Judgements;
|
|
||||||
using osu.Game.Modes.Taiko.Objects;
|
|
||||||
using osu.Game.Modes.UI;
|
|
||||||
|
|
||||||
namespace osu.Game.Modes.Taiko
|
|
||||||
{
|
|
||||||
internal class TaikoScoreProcessor : ScoreProcessor<TaikoHitObject, TaikoJudgement>
|
|
||||||
{
|
|
||||||
public TaikoScoreProcessor()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaikoScoreProcessor(HitRenderer<TaikoHitObject, TaikoJudgement> hitRenderer)
|
|
||||||
: base(hitRenderer)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void UpdateCalculations(TaikoJudgement newJudgement)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,9 +3,11 @@
|
|||||||
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Modes.Objects.Drawables;
|
using osu.Game.Modes.Objects.Drawables;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Modes.Taiko.Beatmaps;
|
using osu.Game.Modes.Taiko.Beatmaps;
|
||||||
using osu.Game.Modes.Taiko.Judgements;
|
using osu.Game.Modes.Taiko.Judgements;
|
||||||
using osu.Game.Modes.Taiko.Objects;
|
using osu.Game.Modes.Taiko.Objects;
|
||||||
|
using osu.Game.Modes.Taiko.Scoring;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Taiko.UI
|
namespace osu.Game.Modes.Taiko.UI
|
||||||
|
@ -62,7 +62,7 @@
|
|||||||
<Compile Include="TaikoDifficultyCalculator.cs" />
|
<Compile Include="TaikoDifficultyCalculator.cs" />
|
||||||
<Compile Include="Objects\TaikoHitObject.cs" />
|
<Compile Include="Objects\TaikoHitObject.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="TaikoScoreProcessor.cs" />
|
<Compile Include="Scoring\TaikoScoreProcessor.cs" />
|
||||||
<Compile Include="UI\HitTarget.cs" />
|
<Compile Include="UI\HitTarget.cs" />
|
||||||
<Compile Include="UI\InputDrum.cs" />
|
<Compile Include="UI\InputDrum.cs" />
|
||||||
<Compile Include="UI\DrawableTaikoJudgement.cs" />
|
<Compile Include="UI\DrawableTaikoJudgement.cs" />
|
||||||
|
@ -8,6 +8,7 @@ using osu.Framework.Platform;
|
|||||||
using osu.Game.IO.Legacy;
|
using osu.Game.IO.Legacy;
|
||||||
using osu.Game.IPC;
|
using osu.Game.IPC;
|
||||||
using osu.Game.Modes;
|
using osu.Game.Modes;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using SharpCompress.Compressors.LZMA;
|
using SharpCompress.Compressors.LZMA;
|
||||||
|
|
||||||
namespace osu.Game.Database
|
namespace osu.Game.Database
|
||||||
|
@ -12,7 +12,7 @@ using osu.Framework.Configuration;
|
|||||||
|
|
||||||
namespace osu.Game.Graphics.Containers
|
namespace osu.Game.Graphics.Containers
|
||||||
{
|
{
|
||||||
internal class ParallaxContainer : Container
|
internal class ParallaxContainer : Container, IRequireHighFrequencyMousePosition
|
||||||
{
|
{
|
||||||
public float ParallaxAmount = 0.02f;
|
public float ParallaxAmount = 0.02f;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ namespace osu.Game.Modes.Judgements
|
|||||||
|
|
||||||
AutoSizeAxes = Axes.Both;
|
AutoSizeAxes = Axes.Both;
|
||||||
|
|
||||||
string scoreString = judgement.Result == HitResult.Hit ? judgement.ScoreString : judgement.Result.GetDescription();
|
string resultString = judgement.Result == HitResult.Hit ? judgement.ResultString : judgement.Result.GetDescription();
|
||||||
|
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
@ -43,7 +43,7 @@ namespace osu.Game.Modes.Judgements
|
|||||||
{
|
{
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Text = scoreString.ToUpper(),
|
Text = resultString.ToUpper(),
|
||||||
Font = @"Venera",
|
Font = @"Venera",
|
||||||
TextSize = 16
|
TextSize = 16
|
||||||
}
|
}
|
||||||
|
@ -23,13 +23,13 @@ namespace osu.Game.Modes.Judgements
|
|||||||
public ulong? ComboAtHit;
|
public ulong? ComboAtHit;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The string representation for the score achieved.
|
/// The string representation for the result achieved.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract string ScoreString { get; }
|
public abstract string ResultString { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The string representation for the max score achievable.
|
/// The string representation for the max result achievable.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract string MaxScoreString { get; }
|
public abstract string MaxResultString { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,6 +6,7 @@ using osu.Game.Graphics;
|
|||||||
using osu.Game.Modes.Objects;
|
using osu.Game.Modes.Objects;
|
||||||
using osu.Game.Modes.UI;
|
using osu.Game.Modes.UI;
|
||||||
using System;
|
using System;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.Mods
|
namespace osu.Game.Modes.Mods
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@ using osu.Game.Screens.Play;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes
|
namespace osu.Game.Modes
|
||||||
{
|
{
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using osu.Game.Users;
|
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Modes.Mods;
|
using osu.Game.Modes.Mods;
|
||||||
|
using osu.Game.Users;
|
||||||
|
|
||||||
namespace osu.Game.Modes
|
namespace osu.Game.Modes.Scoring
|
||||||
{
|
{
|
||||||
public class Score
|
public class Score
|
||||||
{
|
{
|
@ -1,15 +1,15 @@
|
|||||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Game.Modes.Judgements;
|
using osu.Framework.Configuration;
|
||||||
using osu.Game.Modes.UI;
|
|
||||||
using osu.Game.Modes.Objects;
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Modes.Judgements;
|
||||||
|
using osu.Game.Modes.Objects;
|
||||||
|
using osu.Game.Modes.UI;
|
||||||
|
|
||||||
namespace osu.Game.Modes
|
namespace osu.Game.Modes.Scoring
|
||||||
{
|
{
|
||||||
public abstract class ScoreProcessor
|
public abstract class ScoreProcessor
|
||||||
{
|
{
|
||||||
@ -122,7 +122,7 @@ namespace osu.Game.Modes
|
|||||||
{
|
{
|
||||||
Judgements.Capacity = hitRenderer.Beatmap.HitObjects.Count;
|
Judgements.Capacity = hitRenderer.Beatmap.HitObjects.Count;
|
||||||
|
|
||||||
hitRenderer.OnJudgement += addJudgement;
|
hitRenderer.OnJudgement += AddJudgement;
|
||||||
|
|
||||||
ComputeTargets(hitRenderer.Beatmap);
|
ComputeTargets(hitRenderer.Beatmap);
|
||||||
|
|
||||||
@ -139,11 +139,11 @@ namespace osu.Game.Modes
|
|||||||
/// Adds a judgement to this ScoreProcessor.
|
/// Adds a judgement to this ScoreProcessor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="judgement">The judgement to add.</param>
|
/// <param name="judgement">The judgement to add.</param>
|
||||||
private void addJudgement(TJudgement judgement)
|
protected void AddJudgement(TJudgement judgement)
|
||||||
{
|
{
|
||||||
Judgements.Add(judgement);
|
Judgements.Add(judgement);
|
||||||
|
|
||||||
UpdateCalculations(judgement);
|
OnNewJugement(judgement);
|
||||||
|
|
||||||
judgement.ComboAtHit = (ulong)Combo.Value;
|
judgement.ComboAtHit = (ulong)Combo.Value;
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ namespace osu.Game.Modes
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update any values that potentially need post-processing on a judgement change.
|
/// Update any values that potentially need post-processing on a judgement change.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="newJudgement">A new Judgement that triggered this calculation. May be null.</param>
|
/// <param name="judgement">The judgement that triggered this calculation.</param>
|
||||||
protected abstract void UpdateCalculations(TJudgement newJudgement);
|
protected abstract void OnNewJugement(TJudgement judgement);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace osu.Game.Modes
|
namespace osu.Game.Modes.Scoring
|
||||||
{
|
{
|
||||||
public enum ScoreRank
|
public enum ScoreRank
|
||||||
{
|
{
|
@ -14,6 +14,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.UI
|
namespace osu.Game.Modes.UI
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@ using osu.Game.Configuration;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using System;
|
using System;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Modes.UI
|
namespace osu.Game.Modes.UI
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,7 @@ using System.Collections.Generic;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using osu.Framework.IO.Network;
|
using osu.Framework.IO.Network;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Modes;
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Online.API.Requests
|
namespace osu.Game.Online.API.Requests
|
||||||
{
|
{
|
||||||
|
@ -26,6 +26,7 @@ using osu.Framework.Graphics.Primitives;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ using osu.Game.Screens.Backgrounds;
|
|||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play
|
namespace osu.Game.Screens.Play
|
||||||
{
|
{
|
||||||
|
@ -6,7 +6,7 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Transforms;
|
using osu.Framework.Graphics.Transforms;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Modes;
|
using osu.Game.Modes.Scoring;
|
||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
@ -22,6 +22,8 @@ namespace osu.Game.Screens.Select
|
|||||||
private const float play_song_select_button_width = 100;
|
private const float play_song_select_button_width = 100;
|
||||||
private const float play_song_select_button_height = 50;
|
private const float play_song_select_button_height = 50;
|
||||||
|
|
||||||
|
public const float HEIGHT = 50;
|
||||||
|
|
||||||
public const int TRANSITION_LENGTH = 300;
|
public const int TRANSITION_LENGTH = 300;
|
||||||
|
|
||||||
private const float padding = 80;
|
private const float padding = 80;
|
||||||
@ -69,10 +71,8 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
AlwaysReceiveInput = true;
|
AlwaysReceiveInput = true;
|
||||||
|
|
||||||
const float bottom_tool_height = 50;
|
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
Height = bottom_tool_height;
|
Height = HEIGHT;
|
||||||
Anchor = Anchor.BottomCentre;
|
Anchor = Anchor.BottomCentre;
|
||||||
Origin = Anchor.BottomCentre;
|
Origin = Anchor.BottomCentre;
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
|
@ -6,8 +6,8 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Graphics.Textures;
|
using osu.Framework.Graphics.Textures;
|
||||||
using osu.Game.Modes;
|
|
||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Leaderboards
|
namespace osu.Game.Screens.Select.Leaderboards
|
||||||
{
|
{
|
||||||
|
@ -9,8 +9,8 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Colour;
|
using osu.Framework.Graphics.Colour;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Game.Modes;
|
|
||||||
using System;
|
using System;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Leaderboards
|
namespace osu.Game.Screens.Select.Leaderboards
|
||||||
{
|
{
|
||||||
|
@ -10,11 +10,11 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Graphics.Transforms;
|
using osu.Framework.Graphics.Transforms;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Modes;
|
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Game.Modes.Mods;
|
using osu.Game.Modes.Mods;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
|
using osu.Game.Modes.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select.Leaderboards
|
namespace osu.Game.Screens.Select.Leaderboards
|
||||||
{
|
{
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@ -22,12 +23,11 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
public PlaySongSelect()
|
public PlaySongSelect()
|
||||||
{
|
{
|
||||||
Add(modSelect = new ModSelectOverlay
|
FooterPanels.Add(modSelect = new ModSelectOverlay
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Origin = Anchor.BottomCentre,
|
Origin = Anchor.BottomCentre,
|
||||||
Anchor = Anchor.BottomCentre,
|
Anchor = Anchor.BottomCentre,
|
||||||
Margin = new MarginPadding { Bottom = 50 }
|
|
||||||
});
|
});
|
||||||
|
|
||||||
LeftContent.Add(beatmapDetails = new BeatmapDetailArea
|
LeftContent.Add(beatmapDetails = new BeatmapDetailArea
|
||||||
@ -66,6 +66,17 @@ namespace osu.Game.Screens.Select
|
|||||||
base.OnResuming(last);
|
base.OnResuming(last);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool OnExiting(Screen next)
|
||||||
|
{
|
||||||
|
if (modSelect.State == Visibility.Visible)
|
||||||
|
{
|
||||||
|
modSelect.Hide();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnExiting(next);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void OnSelected()
|
protected override void OnSelected()
|
||||||
{
|
{
|
||||||
if (player != null) return;
|
if (player != null) return;
|
||||||
|
@ -65,6 +65,12 @@ namespace osu.Game.Screens.Select
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected readonly Footer Footer;
|
protected readonly Footer Footer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Contains any panel which is triggered by a footer button.
|
||||||
|
/// Helps keep them located beneath the footer itself.
|
||||||
|
/// </summary>
|
||||||
|
protected readonly Container FooterPanels;
|
||||||
|
|
||||||
public readonly FilterControl FilterControl;
|
public readonly FilterControl FilterControl;
|
||||||
|
|
||||||
protected SongSelect()
|
protected SongSelect()
|
||||||
@ -131,11 +137,15 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
if (ShowFooter)
|
if (ShowFooter)
|
||||||
{
|
{
|
||||||
Add(BeatmapOptions = new BeatmapOptionsOverlay
|
Add(FooterPanels = new Container
|
||||||
{
|
{
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
RelativeSizeAxes = Axes.X,
|
||||||
|
AutoSizeAxes = Axes.Y,
|
||||||
Margin = new MarginPadding
|
Margin = new MarginPadding
|
||||||
{
|
{
|
||||||
Bottom = 50,
|
Bottom = Footer.HEIGHT,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Add(Footer = new Footer
|
Add(Footer = new Footer
|
||||||
@ -143,6 +153,8 @@ namespace osu.Game.Screens.Select
|
|||||||
OnBack = Exit,
|
OnBack = Exit,
|
||||||
OnStart = raiseSelect,
|
OnStart = raiseSelect,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
FooterPanels.Add(BeatmapOptions = new BeatmapOptionsOverlay());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,8 +124,8 @@
|
|||||||
<Compile Include="Modes\Objects\Types\IHasHold.cs" />
|
<Compile Include="Modes\Objects\Types\IHasHold.cs" />
|
||||||
<Compile Include="Modes\Objects\Legacy\LegacyHitObjectType.cs" />
|
<Compile Include="Modes\Objects\Legacy\LegacyHitObjectType.cs" />
|
||||||
<Compile Include="Modes\Replay.cs" />
|
<Compile Include="Modes\Replay.cs" />
|
||||||
<Compile Include="Modes\Score.cs" />
|
<Compile Include="Modes\Scoring\Score.cs" />
|
||||||
<Compile Include="Modes\ScoreProcessor.cs" />
|
<Compile Include="Modes\Scoring\ScoreProcessor.cs" />
|
||||||
<Compile Include="Modes\UI\HealthDisplay.cs" />
|
<Compile Include="Modes\UI\HealthDisplay.cs" />
|
||||||
<Compile Include="Modes\UI\HudOverlay.cs" />
|
<Compile Include="Modes\UI\HudOverlay.cs" />
|
||||||
<Compile Include="Modes\UI\StandardHealthDisplay.cs" />
|
<Compile Include="Modes\UI\StandardHealthDisplay.cs" />
|
||||||
@ -359,7 +359,7 @@
|
|||||||
<Compile Include="Screens\Select\Leaderboards\LeaderboardScore.cs" />
|
<Compile Include="Screens\Select\Leaderboards\LeaderboardScore.cs" />
|
||||||
<Compile Include="Users\Country.cs" />
|
<Compile Include="Users\Country.cs" />
|
||||||
<Compile Include="Users\Team.cs" />
|
<Compile Include="Users\Team.cs" />
|
||||||
<Compile Include="Modes\ScoreRank.cs" />
|
<Compile Include="Modes\Scoring\ScoreRank.cs" />
|
||||||
<Compile Include="Users\Avatar.cs" />
|
<Compile Include="Users\Avatar.cs" />
|
||||||
<Compile Include="Screens\Select\Leaderboards\DrawableRank.cs" />
|
<Compile Include="Screens\Select\Leaderboards\DrawableRank.cs" />
|
||||||
<Compile Include="Graphics\UserInterface\OsuTabControl.cs" />
|
<Compile Include="Graphics\UserInterface\OsuTabControl.cs" />
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=_002A_002Efnt/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=_002A_002Emp3/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=_002A_002Epng/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=_002A_002Ewav/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=D9A367C9_002D4C1A_002D489F_002D9B05_002DA0CEA2B53B58/@EntryIndexedValue">ExplicitlyExcluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">SOLUTION</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">SOLUTION</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeModifiersOrder/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeModifiersOrder/@EntryIndexedValue">WARNING</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeRedundantParentheses/@EntryIndexedValue">WARNING</s:String>
|
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ArrangeRedundantParentheses/@EntryIndexedValue">WARNING</s:String>
|
||||||
|
Loading…
Reference in New Issue
Block a user