mirror of
https://github.com/osukey/osukey.git
synced 2025-08-08 00:53:56 +09:00
Merge remote-tracking branch 'origin/master' into fix-drumroll-conversion
This commit is contained in:
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
@ -3,6 +3,9 @@
|
|||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "Launch VisualTests",
|
"name": "Launch VisualTests",
|
||||||
|
"windows": {
|
||||||
|
"type": "clr"
|
||||||
|
},
|
||||||
"type": "mono",
|
"type": "mono",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${workspaceRoot}/osu.Desktop.VisualTests/bin/Debug/osu!.exe",
|
"program": "${workspaceRoot}/osu.Desktop.VisualTests/bin/Debug/osu!.exe",
|
||||||
@ -15,6 +18,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Launch Desktop",
|
"name": "Launch Desktop",
|
||||||
|
"windows": {
|
||||||
|
"type": "clr"
|
||||||
|
},
|
||||||
"type": "mono",
|
"type": "mono",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${workspaceRoot}/osu.Desktop/bin/Debug/osu!.exe",
|
"program": "${workspaceRoot}/osu.Desktop/bin/Debug/osu!.exe",
|
||||||
@ -27,6 +33,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Attach",
|
"name": "Attach",
|
||||||
|
"windows": {
|
||||||
|
"type": "clr",
|
||||||
|
"request": "attach",
|
||||||
|
"processName": "osu!"
|
||||||
|
},
|
||||||
"type": "mono",
|
"type": "mono",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"address": "localhost",
|
"address": "localhost",
|
||||||
|
34
.vscode/tasks.json
vendored
34
.vscode/tasks.json
vendored
@ -10,9 +10,39 @@
|
|||||||
"showOutput": "silent",
|
"showOutput": "silent",
|
||||||
"command": "msbuild",
|
"command": "msbuild",
|
||||||
"args": [
|
"args": [
|
||||||
// Ask msbuild to generate full paths for file names.
|
"/property:GenerateFullPaths=true",
|
||||||
"/property:GenerateFullPaths=true"
|
"/property:DebugType=portable"
|
||||||
],
|
],
|
||||||
|
"windows": {
|
||||||
|
"args": [
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/property:DebugType=portable",
|
||||||
|
"/m" //parallel compiling support. doesn't work well with mono atm
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Use the standard MS compiler pattern to detect errors, warnings and infos
|
||||||
|
"problemMatcher": "$msCompile",
|
||||||
|
"isBuildCommand": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"taskName": "rebuild",
|
||||||
|
"isShellCommand": true,
|
||||||
|
"showOutput": "silent",
|
||||||
|
"command": "msbuild",
|
||||||
|
"args": [
|
||||||
|
// Ask msbuild to generate full paths for file names.
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/property:DebugType=portable",
|
||||||
|
"/target:Clean,Build"
|
||||||
|
],
|
||||||
|
"windows": {
|
||||||
|
"args": [
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/property:DebugType=portable",
|
||||||
|
"/target:Clean,Build",
|
||||||
|
"/m" //parallel compiling support. doesn't work well with mono atm
|
||||||
|
]
|
||||||
|
},
|
||||||
// Use the standard MS compiler pattern to detect errors, warnings and infos
|
// Use the standard MS compiler pattern to detect errors, warnings and infos
|
||||||
"problemMatcher": "$msCompile",
|
"problemMatcher": "$msCompile",
|
||||||
"isBuildCommand": true
|
"isBuildCommand": true
|
||||||
|
10
README.md
10
README.md
@ -1,6 +1,4 @@
|
|||||||
# osu! [](https://ci.appveyor.com/project/peppy/osu)
|
# osu! [](https://ci.appveyor.com/project/peppy/osu) [](https://www.codefactor.io/repository/github/ppy/osu)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[osu! on the web](https://osu.ppy.sh) | [dev chat](https://discord.gg/ppy)
|
[osu! on the web](https://osu.ppy.sh) | [dev chat](https://discord.gg/ppy)
|
||||||
|
|
||||||
@ -12,14 +10,14 @@ This is still heavily under development and is not intended for end-user use. Th
|
|||||||
|
|
||||||
# Requirements
|
# Requirements
|
||||||
|
|
||||||
- A desktop platform which can compile .NET 4.5.
|
- A desktop platform which can compile .NET 4.5 (tested on macOS, linux and windows). We recommend using [Visual Studio Code](https://code.visualstudio.com/) (all platforms) or [Visual Studio Community Edition](https://www.visualstudio.com/) (windows only), both of which are free.
|
||||||
- Visual Studio or MonoDevelop is recommended.
|
- Make sure you initialise and keep submodules up-to-date.
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
We welcome all contributions, but keep in mind that we already have a lot of the UI designed. If you wish to work on something with the intention on having it included in the official distribution, please open an issue for discussion and we will give you what you need from a design perspective to proceed. If you want to make *changes* to the design, we recommend you open an issue with your intentions before spending too much time, to ensure no effort is wasted.
|
We welcome all contributions, but keep in mind that we already have a lot of the UI designed. If you wish to work on something with the intention on having it included in the official distribution, please open an issue for discussion and we will give you what you need from a design perspective to proceed. If you want to make *changes* to the design, we recommend you open an issue with your intentions before spending too much time, to ensure no effort is wasted.
|
||||||
|
|
||||||
Contributions can be made via pull requests to this repository. We hope to credit and reward larger contributions via a [bounty system](https://goo.gl/nFdoyI). If you're unsure of what you can help with, check out the [list](https://github.com/ppy/osu/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Abounty) of available issues with bounty.
|
Contributions can be made via pull requests to this repository. We hope to credit and reward larger contributions via a [bounty system](https://www.bountysource.com/teams/ppy). If you're unsure of what you can help with, check out the [list of open issues](https://github.com/ppy/osu-framework/issues).
|
||||||
|
|
||||||
Note that while we already have certain standards in place, nothing is set in stone. If you have an issue with the way code is structured; with any libraries we are using; with any processes involved with contributing, *please* bring it up. I welcome all feedback so we can make contributing to this project as pain-free as possible.
|
Note that while we already have certain standards in place, nothing is set in stone. If you have an issue with the way code is structured; with any libraries we are using; with any processes involved with contributing, *please* bring it up. I welcome all feedback so we can make contributing to this project as pain-free as possible.
|
||||||
|
|
||||||
|
Submodule osu-framework updated: e24091cf7f...cc50d1251b
@ -10,7 +10,6 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Framework.Graphics.UserInterface;
|
using osu.Framework.Graphics.UserInterface;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Framework.Timing;
|
using osu.Framework.Timing;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.Osu.Judgements;
|
using osu.Game.Rulesets.Osu.Judgements;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
@ -62,15 +61,12 @@ namespace osu.Desktop.VisualTests.Tests
|
|||||||
add(new DrawableSlider(new Slider
|
add(new DrawableSlider(new Slider
|
||||||
{
|
{
|
||||||
StartTime = framedClock.CurrentTime + 600,
|
StartTime = framedClock.CurrentTime + 600,
|
||||||
CurveObject = new CurvedHitObject
|
|
||||||
{
|
|
||||||
ControlPoints = new List<Vector2>
|
ControlPoints = new List<Vector2>
|
||||||
{
|
{
|
||||||
new Vector2(-200, 0),
|
new Vector2(-200, 0),
|
||||||
new Vector2(400, 0),
|
new Vector2(400, 0),
|
||||||
},
|
},
|
||||||
Distance = 400
|
Distance = 400,
|
||||||
},
|
|
||||||
Position = new Vector2(-200, 0),
|
Position = new Vector2(-200, 0),
|
||||||
Velocity = 1,
|
Velocity = 1,
|
||||||
TickDistance = 100,
|
TickDistance = 100,
|
||||||
|
@ -19,10 +19,10 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
|
|
||||||
protected override IEnumerable<OsuHitObject> ConvertHitObject(HitObject original, Beatmap beatmap)
|
protected override IEnumerable<OsuHitObject> ConvertHitObject(HitObject original, Beatmap beatmap)
|
||||||
{
|
{
|
||||||
IHasCurve curveData = original as IHasCurve;
|
var curveData = original as IHasCurve;
|
||||||
IHasEndTime endTimeData = original as IHasEndTime;
|
var endTimeData = original as IHasEndTime;
|
||||||
IHasPosition positionData = original as IHasPosition;
|
var positionData = original as IHasPosition;
|
||||||
IHasCombo comboData = original as IHasCombo;
|
var comboData = original as IHasCombo;
|
||||||
|
|
||||||
if (curveData != null)
|
if (curveData != null)
|
||||||
{
|
{
|
||||||
@ -30,7 +30,11 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
{
|
{
|
||||||
StartTime = original.StartTime,
|
StartTime = original.StartTime,
|
||||||
Samples = original.Samples,
|
Samples = original.Samples,
|
||||||
CurveObject = curveData,
|
ControlPoints = curveData.ControlPoints,
|
||||||
|
CurveType = curveData.CurveType,
|
||||||
|
Distance = curveData.Distance,
|
||||||
|
RepeatSamples = curveData.RepeatSamples,
|
||||||
|
RepeatCount = curveData.RepeatCount,
|
||||||
Position = positionData?.Position ?? Vector2.Zero,
|
Position = positionData?.Position ?? Vector2.Zero,
|
||||||
NewCombo = comboData?.NewCombo ?? false
|
NewCombo = comboData?.NewCombo ?? false
|
||||||
};
|
};
|
||||||
|
@ -20,26 +20,33 @@ namespace osu.Game.Rulesets.Osu.Objects
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private const float base_scoring_distance = 100;
|
private const float base_scoring_distance = 100;
|
||||||
|
|
||||||
public IHasCurve CurveObject { get; set; }
|
public readonly SliderCurve Curve = new SliderCurve();
|
||||||
|
|
||||||
public SliderCurve Curve => CurveObject.Curve;
|
|
||||||
|
|
||||||
public double EndTime => StartTime + RepeatCount * Curve.Distance / Velocity;
|
public double EndTime => StartTime + RepeatCount * Curve.Distance / Velocity;
|
||||||
public double Duration => EndTime - StartTime;
|
public double Duration => EndTime - StartTime;
|
||||||
|
|
||||||
public override Vector2 EndPosition => PositionAt(1);
|
public override Vector2 EndPosition => PositionAt(1);
|
||||||
|
|
||||||
public Vector2 PositionAt(double progress) => CurveObject.PositionAt(progress);
|
public List<Vector2> ControlPoints
|
||||||
public double ProgressAt(double progress) => CurveObject.ProgressAt(progress);
|
{
|
||||||
public int RepeatAt(double progress) => CurveObject.RepeatAt(progress);
|
get { return Curve.ControlPoints; }
|
||||||
|
set { Curve.ControlPoints = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public List<List<SampleInfo>> RepeatSamples => CurveObject.RepeatSamples;
|
public CurveType CurveType
|
||||||
|
{
|
||||||
|
get { return Curve.CurveType; }
|
||||||
|
set { Curve.CurveType = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public List<Vector2> ControlPoints => CurveObject.ControlPoints;
|
public double Distance
|
||||||
public CurveType CurveType => CurveObject.CurveType;
|
{
|
||||||
public double Distance => CurveObject.Distance;
|
get { return Curve.Distance; }
|
||||||
|
set { Curve.Distance = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public int RepeatCount => CurveObject.RepeatCount;
|
public List<List<SampleInfo>> RepeatSamples { get; set; } = new List<List<SampleInfo>>();
|
||||||
|
public int RepeatCount { get; set; } = 1;
|
||||||
|
|
||||||
private int stackHeight;
|
private int stackHeight;
|
||||||
public override int StackHeight
|
public override int StackHeight
|
||||||
@ -65,6 +72,18 @@ namespace osu.Game.Rulesets.Osu.Objects
|
|||||||
TickDistance = scoringDistance / difficulty.SliderTickRate;
|
TickDistance = scoringDistance / difficulty.SliderTickRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vector2 PositionAt(double progress) => Curve.PositionAt(ProgressAt(progress));
|
||||||
|
|
||||||
|
public double ProgressAt(double progress)
|
||||||
|
{
|
||||||
|
double p = progress * RepeatCount % 1;
|
||||||
|
if (RepeatAt(progress) % 2 == 1)
|
||||||
|
p = 1 - p;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int RepeatAt(double progress) => (int)(progress * RepeatCount);
|
||||||
|
|
||||||
public IEnumerable<SliderTick> Ticks
|
public IEnumerable<SliderTick> Ticks
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Beatmaps;
|
using osu.Game.Rulesets.Beatmaps;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
|
||||||
using osu.Game.Rulesets.Osu.Beatmaps;
|
using osu.Game.Rulesets.Osu.Beatmaps;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
using System;
|
using System;
|
||||||
@ -28,7 +27,7 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
protected override void PreprocessHitObjects()
|
protected override void PreprocessHitObjects()
|
||||||
{
|
{
|
||||||
foreach (var h in Objects)
|
foreach (var h in Objects)
|
||||||
(h as IHasCurve)?.Curve?.Calculate();
|
(h as Slider)?.Curve?.Calculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override double CalculateInternal(Dictionary<string, string> categoryDifficulty)
|
protected override double CalculateInternal(Dictionary<string, string> categoryDifficulty)
|
||||||
|
@ -3,14 +3,13 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Game.Rulesets.Taiko.UI;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
|
namespace osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces
|
||||||
{
|
{
|
||||||
public class ElongatedCirclePiece : CirclePiece
|
public class ElongatedCirclePiece : CirclePiece
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// As we are being used to define the absolute size of hits, we need to be given a relative reference of our containing <see cref="TaikoPlayfield"/>.
|
/// As we are being used to define the absolute size of hits, we need to be given a relative reference of our containing playfield container.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Func<float> PlayfieldLengthReference;
|
public Func<float> PlayfieldLengthReference;
|
||||||
|
|
||||||
|
69
osu.Game/Beatmaps/Drawables/DifficultyColouredContainer.cs
Normal file
69
osu.Game/Beatmaps/Drawables/DifficultyColouredContainer.cs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// 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.Framework.Allocation;
|
||||||
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Game.Database;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps.Drawables
|
||||||
|
{
|
||||||
|
internal class DifficultyColouredContainer : Container, IHasAccentColour
|
||||||
|
{
|
||||||
|
public Color4 AccentColour { get; set; }
|
||||||
|
|
||||||
|
private readonly BeatmapInfo beatmap;
|
||||||
|
private OsuColour palette;
|
||||||
|
|
||||||
|
public DifficultyColouredContainer(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
this.beatmap = beatmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(OsuColour palette)
|
||||||
|
{
|
||||||
|
this.palette = palette;
|
||||||
|
AccentColour = getColour(beatmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum DifficultyRating
|
||||||
|
{
|
||||||
|
Easy,
|
||||||
|
Normal,
|
||||||
|
Hard,
|
||||||
|
Insane,
|
||||||
|
Expert
|
||||||
|
}
|
||||||
|
|
||||||
|
private DifficultyRating getDifficultyRating(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
var rating = beatmap.StarDifficulty;
|
||||||
|
|
||||||
|
if (rating < 1.5) return DifficultyRating.Easy;
|
||||||
|
if (rating < 2.25) return DifficultyRating.Normal;
|
||||||
|
if (rating < 3.75) return DifficultyRating.Hard;
|
||||||
|
if (rating < 5.25) return DifficultyRating.Insane;
|
||||||
|
return DifficultyRating.Expert;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Color4 getColour(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
switch (getDifficultyRating(beatmap))
|
||||||
|
{
|
||||||
|
case DifficultyRating.Easy:
|
||||||
|
return palette.Green;
|
||||||
|
default:
|
||||||
|
case DifficultyRating.Normal:
|
||||||
|
return palette.Yellow;
|
||||||
|
case DifficultyRating.Hard:
|
||||||
|
return palette.Pink;
|
||||||
|
case DifficultyRating.Insane:
|
||||||
|
return palette.Purple;
|
||||||
|
case DifficultyRating.Expert:
|
||||||
|
return palette.Gray0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
@ -11,23 +10,20 @@ using OpenTK.Graphics;
|
|||||||
|
|
||||||
namespace osu.Game.Beatmaps.Drawables
|
namespace osu.Game.Beatmaps.Drawables
|
||||||
{
|
{
|
||||||
internal class DifficultyIcon : Container
|
|
||||||
|
internal class DifficultyIcon : DifficultyColouredContainer
|
||||||
{
|
{
|
||||||
private readonly BeatmapInfo beatmap;
|
private readonly BeatmapInfo beatmap;
|
||||||
private OsuColour palette;
|
|
||||||
|
|
||||||
public DifficultyIcon(BeatmapInfo beatmap)
|
public DifficultyIcon(BeatmapInfo beatmap) : base(beatmap)
|
||||||
{
|
{
|
||||||
this.beatmap = beatmap;
|
this.beatmap = beatmap;
|
||||||
const float size = 20;
|
Size = new Vector2(20);
|
||||||
Size = new Vector2(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour palette)
|
private void load()
|
||||||
{
|
{
|
||||||
this.palette = palette;
|
|
||||||
|
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
new TextAwesome
|
new TextAwesome
|
||||||
@ -35,7 +31,7 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
TextSize = Size.X,
|
TextSize = Size.X,
|
||||||
Colour = getColour(beatmap),
|
Colour = AccentColour,
|
||||||
Icon = FontAwesome.fa_circle
|
Icon = FontAwesome.fa_circle
|
||||||
},
|
},
|
||||||
new TextAwesome
|
new TextAwesome
|
||||||
@ -48,43 +44,5 @@ namespace osu.Game.Beatmaps.Drawables
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum DifficultyRating
|
|
||||||
{
|
|
||||||
Easy,
|
|
||||||
Normal,
|
|
||||||
Hard,
|
|
||||||
Insane,
|
|
||||||
Expert
|
|
||||||
}
|
|
||||||
|
|
||||||
private DifficultyRating getDifficultyRating(BeatmapInfo beatmap)
|
|
||||||
{
|
|
||||||
var rating = beatmap.StarDifficulty;
|
|
||||||
|
|
||||||
if (rating < 1.5) return DifficultyRating.Easy;
|
|
||||||
if (rating < 2.25) return DifficultyRating.Normal;
|
|
||||||
if (rating < 3.75) return DifficultyRating.Hard;
|
|
||||||
if (rating < 5.25) return DifficultyRating.Insane;
|
|
||||||
return DifficultyRating.Expert;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Color4 getColour(BeatmapInfo beatmap)
|
|
||||||
{
|
|
||||||
switch (getDifficultyRating(beatmap))
|
|
||||||
{
|
|
||||||
case DifficultyRating.Easy:
|
|
||||||
return palette.Green;
|
|
||||||
default:
|
|
||||||
case DifficultyRating.Normal:
|
|
||||||
return palette.Yellow;
|
|
||||||
case DifficultyRating.Hard:
|
|
||||||
return palette.Pink;
|
|
||||||
case DifficultyRating.Insane:
|
|
||||||
return palette.Purple;
|
|
||||||
case DifficultyRating.Expert:
|
|
||||||
return palette.Gray0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
// TODO: Not sure how far back to go, or differences between versions
|
// TODO: Not sure how far back to go, or differences between versions
|
||||||
}
|
}
|
||||||
|
|
||||||
private HitObjectParser parser;
|
private ConvertHitObjectParser parser;
|
||||||
|
|
||||||
private LegacySampleBank defaultSampleBank;
|
private LegacySampleBank defaultSampleBank;
|
||||||
private int defaultSampleVolume = 100;
|
private int defaultSampleVolume = 100;
|
||||||
@ -90,16 +90,16 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
switch (beatmap.BeatmapInfo.RulesetID)
|
switch (beatmap.BeatmapInfo.RulesetID)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
parser = new Rulesets.Objects.Legacy.Osu.HitObjectParser();
|
parser = new Rulesets.Objects.Legacy.Osu.ConvertHitObjectParser();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
parser = new Rulesets.Objects.Legacy.Taiko.HitObjectParser();
|
parser = new Rulesets.Objects.Legacy.Taiko.ConvertHitObjectParser();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
parser = new Rulesets.Objects.Legacy.Catch.HitObjectParser();
|
parser = new Rulesets.Objects.Legacy.Catch.ConvertHitObjectParser();
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
parser = new Rulesets.Objects.Legacy.Mania.HitObjectParser();
|
parser = new Rulesets.Objects.Legacy.Mania.ConvertHitObjectParser();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -8,6 +8,7 @@ using osu.Game.Database;
|
|||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
{
|
{
|
||||||
@ -17,7 +18,7 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
public readonly BeatmapSetInfo BeatmapSetInfo;
|
public readonly BeatmapSetInfo BeatmapSetInfo;
|
||||||
|
|
||||||
public readonly Bindable<IEnumerable<Mod>> Mods = new Bindable<IEnumerable<Mod>>();
|
public readonly Bindable<IEnumerable<Mod>> Mods = new Bindable<IEnumerable<Mod>>(new Mod[] { });
|
||||||
|
|
||||||
public readonly bool WithStoryboard;
|
public readonly bool WithStoryboard;
|
||||||
|
|
||||||
@ -26,6 +27,18 @@ namespace osu.Game.Beatmaps
|
|||||||
BeatmapInfo = beatmapInfo;
|
BeatmapInfo = beatmapInfo;
|
||||||
BeatmapSetInfo = beatmapSetInfo;
|
BeatmapSetInfo = beatmapSetInfo;
|
||||||
WithStoryboard = withStoryboard;
|
WithStoryboard = withStoryboard;
|
||||||
|
|
||||||
|
Mods.ValueChanged += mods => applyRateAdjustments();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyRateAdjustments()
|
||||||
|
{
|
||||||
|
var t = track;
|
||||||
|
if (t == null) return;
|
||||||
|
|
||||||
|
t.ResetSpeedAdjustments();
|
||||||
|
foreach (var mod in Mods.Value.OfType<IApplicableToClock>())
|
||||||
|
mod.ApplyToClock(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract Beatmap GetBeatmap();
|
protected abstract Beatmap GetBeatmap();
|
||||||
@ -66,7 +79,11 @@ namespace osu.Game.Beatmaps
|
|||||||
{
|
{
|
||||||
lock (trackLock)
|
lock (trackLock)
|
||||||
{
|
{
|
||||||
return track ?? (track = GetTrack());
|
if (track != null) return track;
|
||||||
|
|
||||||
|
track = GetTrack();
|
||||||
|
applyRateAdjustments();
|
||||||
|
return track;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
|
using osu.Game.Screens.Select;
|
||||||
|
|
||||||
namespace osu.Game.Configuration
|
namespace osu.Game.Configuration
|
||||||
{
|
{
|
||||||
@ -24,7 +25,7 @@ namespace osu.Game.Configuration
|
|||||||
|
|
||||||
Set(OsuConfig.MenuCursorSize, 1.0, 0.5f, 2);
|
Set(OsuConfig.MenuCursorSize, 1.0, 0.5f, 2);
|
||||||
Set(OsuConfig.GameplayCursorSize, 1.0, 0.5f, 2);
|
Set(OsuConfig.GameplayCursorSize, 1.0, 0.5f, 2);
|
||||||
Set(OsuConfig.DimLevel, 30, 0, 100);
|
Set(OsuConfig.DimLevel, 0.3, 0, 1);
|
||||||
|
|
||||||
Set(OsuConfig.MouseDisableButtons, false);
|
Set(OsuConfig.MouseDisableButtons, false);
|
||||||
Set(OsuConfig.MouseDisableWheel, false);
|
Set(OsuConfig.MouseDisableWheel, false);
|
||||||
@ -34,9 +35,16 @@ namespace osu.Game.Configuration
|
|||||||
|
|
||||||
Set(OsuConfig.MenuParallax, true);
|
Set(OsuConfig.MenuParallax, true);
|
||||||
|
|
||||||
|
Set(OsuConfig.MenuVoice, true);
|
||||||
|
Set(OsuConfig.MenuMusic, true);
|
||||||
|
|
||||||
|
Set(OsuConfig.BeatmapDetailTab, BeatmapDetailTab.Details);
|
||||||
|
|
||||||
Set(OsuConfig.ShowInterface, true);
|
Set(OsuConfig.ShowInterface, true);
|
||||||
Set(OsuConfig.KeyOverlay, false);
|
Set(OsuConfig.KeyOverlay, false);
|
||||||
|
|
||||||
//todo: implement all settings below this line (remove the Disabled set when doing so).
|
//todo: implement all settings below this line (remove the Disabled set when doing so).
|
||||||
|
Set(OsuConfig.AudioOffset, 0, -500.0, 500.0);
|
||||||
|
|
||||||
Set(OsuConfig.MouseSpeed, 1.0).Disabled = true;
|
Set(OsuConfig.MouseSpeed, 1.0).Disabled = true;
|
||||||
Set(OsuConfig.BeatmapDirectory, @"Songs").Disabled = true; // TODO: use thi.Disabled = trues
|
Set(OsuConfig.BeatmapDirectory, @"Songs").Disabled = true; // TODO: use thi.Disabled = trues
|
||||||
@ -103,7 +111,6 @@ namespace osu.Game.Configuration
|
|||||||
Set(OsuConfig.ManiaSpeedBPMScale, true).Disabled = true;
|
Set(OsuConfig.ManiaSpeedBPMScale, true).Disabled = true;
|
||||||
Set(OsuConfig.MenuTip, 0).Disabled = true;
|
Set(OsuConfig.MenuTip, 0).Disabled = true;
|
||||||
Set(OsuConfig.MouseSpeed, 1, 0.4, 6).Disabled = true;
|
Set(OsuConfig.MouseSpeed, 1, 0.4, 6).Disabled = true;
|
||||||
Set(OsuConfig.Offset, 0, -300, 300).Disabled = true;
|
|
||||||
Set(OsuConfig.ScoreMeterScale, 1, 0.5, 2).Disabled = true;
|
Set(OsuConfig.ScoreMeterScale, 1, 0.5, 2).Disabled = true;
|
||||||
//Set(OsuConfig.ScoreMeterScale, 1, 0.5, OsuGame.Tournament ? 10 : 2).Disabled = true;
|
//Set(OsuConfig.ScoreMeterScale, 1, 0.5, OsuGame.Tournament ? 10 : 2).Disabled = true;
|
||||||
Set(OsuConfig.DistanceSpacing, 0.8, 0.1, 6).Disabled = true;
|
Set(OsuConfig.DistanceSpacing, 0.8, 0.1, 6).Disabled = true;
|
||||||
@ -144,8 +151,6 @@ namespace osu.Game.Configuration
|
|||||||
Set(OsuConfig.YahooIntegration, false).Disabled = true;
|
Set(OsuConfig.YahooIntegration, false).Disabled = true;
|
||||||
Set(OsuConfig.ForceFrameFlush, false).Disabled = true;
|
Set(OsuConfig.ForceFrameFlush, false).Disabled = true;
|
||||||
Set(OsuConfig.DetectPerformanceIssues, true).Disabled = true;
|
Set(OsuConfig.DetectPerformanceIssues, true).Disabled = true;
|
||||||
Set(OsuConfig.MenuMusic, true).Disabled = true;
|
|
||||||
Set(OsuConfig.MenuVoice, true).Disabled = true;
|
|
||||||
Set(OsuConfig.RawInput, false).Disabled = true;
|
Set(OsuConfig.RawInput, false).Disabled = true;
|
||||||
Set(OsuConfig.AbsoluteToOsuWindow, Get<bool>(OsuConfig.RawInput)).Disabled = true;
|
Set(OsuConfig.AbsoluteToOsuWindow, Get<bool>(OsuConfig.RawInput)).Disabled = true;
|
||||||
Set(OsuConfig.ShowMenuTips, true).Disabled = true;
|
Set(OsuConfig.ShowMenuTips, true).Disabled = true;
|
||||||
@ -175,7 +180,6 @@ namespace osu.Game.Configuration
|
|||||||
Set(OsuConfig.ConfineMouse, Get<bool>(OsuConfig.ConfineMouseToFullscreen) ?
|
Set(OsuConfig.ConfineMouse, Get<bool>(OsuConfig.ConfineMouseToFullscreen) ?
|
||||||
ConfineMouseMode.Fullscreen : ConfineMouseMode.Never).Disabled = true;
|
ConfineMouseMode.Fullscreen : ConfineMouseMode.Never).Disabled = true;
|
||||||
|
|
||||||
|
|
||||||
GetOriginalBindable<bool>(OsuConfig.SavePassword).ValueChanged += delegate
|
GetOriginalBindable<bool>(OsuConfig.SavePassword).ValueChanged += delegate
|
||||||
{
|
{
|
||||||
if (Get<bool>(OsuConfig.SavePassword)) Set(OsuConfig.SaveUsername, true);
|
if (Get<bool>(OsuConfig.SavePassword)) Set(OsuConfig.SaveUsername, true);
|
||||||
@ -270,7 +274,7 @@ namespace osu.Game.Configuration
|
|||||||
MouseDisableButtons,
|
MouseDisableButtons,
|
||||||
MouseDisableWheel,
|
MouseDisableWheel,
|
||||||
MouseSpeed,
|
MouseSpeed,
|
||||||
Offset,
|
AudioOffset,
|
||||||
ScoreMeterScale,
|
ScoreMeterScale,
|
||||||
DistanceSpacing,
|
DistanceSpacing,
|
||||||
EditorBeatDivisor,
|
EditorBeatDivisor,
|
||||||
@ -315,6 +319,7 @@ namespace osu.Game.Configuration
|
|||||||
MenuMusic,
|
MenuMusic,
|
||||||
MenuVoice,
|
MenuVoice,
|
||||||
MenuParallax,
|
MenuParallax,
|
||||||
|
BeatmapDetailTab,
|
||||||
RawInput,
|
RawInput,
|
||||||
AbsoluteToOsuWindow,
|
AbsoluteToOsuWindow,
|
||||||
ConfineMouse,
|
ConfineMouse,
|
||||||
@ -339,6 +344,5 @@ namespace osu.Game.Configuration
|
|||||||
Ticker,
|
Ticker,
|
||||||
CompatibilityContext,
|
CompatibilityContext,
|
||||||
CanForceOptimusCompatibility,
|
CanForceOptimusCompatibility,
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// 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 System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace osu.Game.Database
|
namespace osu.Game.Database
|
||||||
{
|
{
|
||||||
@ -18,11 +19,13 @@ namespace osu.Game.Database
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Points of failure on a relative time scale (usually 0..100).
|
/// Points of failure on a relative time scale (usually 0..100).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty(@"fail")]
|
||||||
public IEnumerable<int> Fails { get; set; }
|
public IEnumerable<int> Fails { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Points of retry on a relative time scale (usually 0..100).
|
/// Points of retry on a relative time scale (usually 0..100).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty(@"exit")]
|
||||||
public IEnumerable<int> Retries { get; set; }
|
public IEnumerable<int> Retries { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,6 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
{
|
{
|
||||||
bindable = value;
|
bindable = value;
|
||||||
Current.BindTo(bindable);
|
Current.BindTo(bindable);
|
||||||
if (value?.Disabled ?? true)
|
|
||||||
Alpha = 0.3f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +82,11 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
else
|
else
|
||||||
sampleUnchecked?.Play();
|
sampleUnchecked?.Play();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Current.DisabledChanged += disabled =>
|
||||||
|
{
|
||||||
|
Alpha = disabled ? 0.3f : 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool OnHover(InputState state)
|
protected override bool OnHover(InputState state)
|
||||||
|
@ -23,14 +23,14 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
private readonly Box leftBox;
|
private readonly Box leftBox;
|
||||||
private readonly Box rightBox;
|
private readonly Box rightBox;
|
||||||
|
|
||||||
public string TooltipText
|
public virtual string TooltipText
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var bindableDouble = CurrentNumber as BindableNumber<double>;
|
var bindableDouble = CurrentNumber as BindableNumber<double>;
|
||||||
if (bindableDouble != null)
|
if (bindableDouble != null)
|
||||||
{
|
{
|
||||||
if (bindableDouble.MaxValue == 1 && bindableDouble.MinValue == 0)
|
if (bindableDouble.MaxValue == 1 && (bindableDouble.MinValue == 0 || bindableDouble.MinValue == -1))
|
||||||
return bindableDouble.Value.ToString(@"P0");
|
return bindableDouble.Value.ToString(@"P0");
|
||||||
return bindableDouble.Value.ToString(@"n1");
|
return bindableDouble.Value.ToString(@"n1");
|
||||||
}
|
}
|
||||||
@ -74,6 +74,11 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
Expanded = true,
|
Expanded = true,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Current.DisabledChanged += disabled =>
|
||||||
|
{
|
||||||
|
Alpha = disabled ? 0.3f : 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
|
@ -33,6 +33,11 @@ namespace osu.Game.Graphics.UserInterface
|
|||||||
Height = 40;
|
Height = 40;
|
||||||
TextContainer.Height = 0.5f;
|
TextContainer.Height = 0.5f;
|
||||||
CornerRadius = 5;
|
CornerRadius = 5;
|
||||||
|
|
||||||
|
Current.DisabledChanged += disabled =>
|
||||||
|
{
|
||||||
|
Alpha = disabled ? 0.3f : 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
|
46
osu.Game/Online/API/Requests/GetBeatmapDetailsRequest.cs
Normal file
46
osu.Game/Online/API/Requests/GetBeatmapDetailsRequest.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Database;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.API.Requests
|
||||||
|
{
|
||||||
|
public class GetBeatmapDetailsRequest : APIRequest<GetBeatmapDeatilsResponse>
|
||||||
|
{
|
||||||
|
private readonly BeatmapInfo beatmap;
|
||||||
|
|
||||||
|
private string lookupString => beatmap.OnlineBeatmapID > 0 ? beatmap.OnlineBeatmapID.ToString() : $@"lookup?checksum={beatmap.Hash}&filename={beatmap.Path}";
|
||||||
|
|
||||||
|
public GetBeatmapDetailsRequest(BeatmapInfo beatmap)
|
||||||
|
{
|
||||||
|
this.beatmap = beatmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string Target => $@"beatmaps/{lookupString}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GetBeatmapDeatilsResponse : BeatmapMetrics
|
||||||
|
{
|
||||||
|
//the online API returns some metrics as a nested object.
|
||||||
|
[JsonProperty(@"failtimes")]
|
||||||
|
private BeatmapMetrics failTimes
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Fails = value.Fails;
|
||||||
|
Retries = value.Retries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//and other metrics in the beatmap set.
|
||||||
|
[JsonProperty(@"beatmapset")]
|
||||||
|
private BeatmapMetrics beatmapSet
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
Ratings = value.Ratings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -203,13 +203,7 @@ namespace osu.Game
|
|||||||
{
|
{
|
||||||
Depth = -3,
|
Depth = -3,
|
||||||
OnHome = delegate { intro?.ChildScreen?.MakeCurrent(); },
|
OnHome = delegate { intro?.ChildScreen?.MakeCurrent(); },
|
||||||
OnRulesetChange = r => Ruleset.Value = r,
|
}, overlayContent.Add);
|
||||||
}, t =>
|
|
||||||
{
|
|
||||||
Ruleset.ValueChanged += delegate { Toolbar.SetRuleset(Ruleset.Value); };
|
|
||||||
Ruleset.TriggerChange();
|
|
||||||
overlayContent.Add(Toolbar);
|
|
||||||
});
|
|
||||||
|
|
||||||
options.StateChanged += delegate
|
options.StateChanged += delegate
|
||||||
{
|
{
|
||||||
|
@ -147,8 +147,17 @@ namespace osu.Game
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
Cursor = new MenuCursor { Depth = float.MinValue },
|
new Container
|
||||||
new TooltipContainer(Cursor) { Depth = float.MinValue }
|
{
|
||||||
|
AlwaysReceiveInput = true,
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Depth = float.MinValue,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
Cursor = new MenuCursor(),
|
||||||
|
new TooltipContainer(Cursor) { Depth = -1 },
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ using osu.Game.Database;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
|
||||||
namespace osu.Game.Overlays
|
namespace osu.Game.Overlays
|
||||||
@ -293,7 +294,7 @@ namespace osu.Game.Overlays
|
|||||||
trackManager.SetExclusive(current.Track);
|
trackManager.SetExclusive(current.Track);
|
||||||
current.Track.Start();
|
current.Track.Start();
|
||||||
beatmapSource.Value = current;
|
beatmapSource.Value = current;
|
||||||
});
|
}).ContinueWith(task => Schedule(task.ThrowIfFaulted), TaskContinuationOptions.OnlyOnFaulted);
|
||||||
updateDisplay(current, isNext ? TransformDirection.Next : TransformDirection.Prev);
|
updateDisplay(current, isNext ? TransformDirection.Next : TransformDirection.Prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,8 +34,6 @@ namespace osu.Game.Overlays.Options
|
|||||||
{
|
{
|
||||||
bindable = value;
|
bindable = value;
|
||||||
dropdown.Current.BindTo(bindable);
|
dropdown.Current.BindTo(bindable);
|
||||||
if (value?.Disabled ?? true)
|
|
||||||
Alpha = 0.3f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,6 +73,11 @@ namespace osu.Game.Overlays.Options
|
|||||||
Items = Items,
|
Items = Items,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dropdown.Current.DisabledChanged += disabled =>
|
||||||
|
{
|
||||||
|
Alpha = disabled ? 0.3f : 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,11 @@ using osu.Game.Graphics.UserInterface;
|
|||||||
|
|
||||||
namespace osu.Game.Overlays.Options
|
namespace osu.Game.Overlays.Options
|
||||||
{
|
{
|
||||||
public class OptionSlider<T> : FillFlowContainer where T : struct
|
public class OptionSlider<T> : OptionSlider<T, OsuSliderBar<T>> where T: struct
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OptionSlider<T, U> : FillFlowContainer where T : struct where U : SliderBar<T>, new()
|
||||||
{
|
{
|
||||||
private readonly SliderBar<T> slider;
|
private readonly SliderBar<T> slider;
|
||||||
private readonly SpriteText text;
|
private readonly SpriteText text;
|
||||||
@ -35,8 +39,6 @@ namespace osu.Game.Overlays.Options
|
|||||||
{
|
{
|
||||||
bindable = value;
|
bindable = value;
|
||||||
slider.Current.BindTo(bindable);
|
slider.Current.BindTo(bindable);
|
||||||
if (value?.Disabled ?? true)
|
|
||||||
Alpha = 0.3f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,7 +54,7 @@ namespace osu.Game.Overlays.Options
|
|||||||
{
|
{
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
},
|
},
|
||||||
slider = new OsuSliderBar<T>
|
slider = new U()
|
||||||
{
|
{
|
||||||
Margin = new MarginPadding { Top = 5, Bottom = 5 },
|
Margin = new MarginPadding { Top = 5, Bottom = 5 },
|
||||||
RelativeSizeAxes = Axes.X
|
RelativeSizeAxes = Axes.X
|
||||||
|
@ -16,8 +16,6 @@ namespace osu.Game.Overlays.Options
|
|||||||
{
|
{
|
||||||
bindable = value;
|
bindable = value;
|
||||||
Current.BindTo(bindable);
|
Current.BindTo(bindable);
|
||||||
if (value?.Disabled ?? true)
|
|
||||||
Alpha = 0.3f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
@ -18,10 +17,10 @@ namespace osu.Game.Overlays.Options.Sections.Audio
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new OptionSlider<int>
|
new OptionSlider<double, OffsetSlider>
|
||||||
{
|
{
|
||||||
LabelText = "Universal Offset",
|
LabelText = "Audio Offset",
|
||||||
Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.Offset)
|
Bindable = config.GetBindable<double>(OsuConfig.AudioOffset)
|
||||||
},
|
},
|
||||||
new OsuButton
|
new OsuButton
|
||||||
{
|
{
|
||||||
@ -30,5 +29,10 @@ namespace osu.Game.Overlays.Options.Sections.Audio
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class OffsetSlider : OsuSliderBar<double>
|
||||||
|
{
|
||||||
|
public override string TooltipText => Current.Value.ToString(@"0ms");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
@ -18,10 +17,10 @@ namespace osu.Game.Overlays.Options.Sections.Gameplay
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new OptionSlider<int>
|
new OptionSlider<double>
|
||||||
{
|
{
|
||||||
LabelText = "Background dim",
|
LabelText = "Background dim",
|
||||||
Bindable = (BindableInt)config.GetBindable<int>(OsuConfig.DimLevel)
|
Bindable = config.GetBindable<double>(OsuConfig.DimLevel)
|
||||||
},
|
},
|
||||||
new OptionEnumDropdown<ProgressBarType>
|
new OptionEnumDropdown<ProgressBarType>
|
||||||
{
|
{
|
||||||
@ -36,7 +35,7 @@ namespace osu.Game.Overlays.Options.Sections.Gameplay
|
|||||||
new OptionSlider<double>
|
new OptionSlider<double>
|
||||||
{
|
{
|
||||||
LabelText = "Score meter size",
|
LabelText = "Score meter size",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.ScoreMeterScale)
|
Bindable = config.GetBindable<double>(OsuConfig.ScoreMeterScale)
|
||||||
},
|
},
|
||||||
new OsuCheckbox
|
new OsuCheckbox
|
||||||
{
|
{
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Options.Sections.Gameplay
|
namespace osu.Game.Overlays.Options.Sections.Gameplay
|
||||||
{
|
{
|
||||||
@ -17,18 +17,23 @@ namespace osu.Game.Overlays.Options.Sections.Gameplay
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new OptionSlider<double>
|
new OptionSlider<double, StarSlider>
|
||||||
{
|
{
|
||||||
LabelText = "Display beatmaps from",
|
LabelText = "Display beatmaps from",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.DisplayStarsMinimum)
|
Bindable = config.GetBindable<double>(OsuConfig.DisplayStarsMinimum)
|
||||||
},
|
},
|
||||||
new OptionSlider<double>
|
new OptionSlider<double, StarSlider>
|
||||||
{
|
{
|
||||||
LabelText = "up to",
|
LabelText = "up to",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.DisplayStarsMaximum)
|
Bindable = config.GetBindable<double>(OsuConfig.DisplayStarsMaximum)
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class StarSlider : OsuSliderBar<double>
|
||||||
|
{
|
||||||
|
public override string TooltipText => Current.Value.ToString(@"0.## stars");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ namespace osu.Game.Overlays.Options.Sections.Graphics
|
|||||||
{
|
{
|
||||||
protected override string Header => "Layout";
|
protected override string Header => "Layout";
|
||||||
|
|
||||||
private OptionSlider<int> letterboxPositionX;
|
private OptionSlider<double> letterboxPositionX;
|
||||||
private OptionSlider<int> letterboxPositionY;
|
private OptionSlider<double> letterboxPositionY;
|
||||||
|
|
||||||
private Bindable<bool> letterboxing;
|
private Bindable<bool> letterboxing;
|
||||||
|
|
||||||
@ -35,15 +35,15 @@ namespace osu.Game.Overlays.Options.Sections.Graphics
|
|||||||
LabelText = "Letterboxing",
|
LabelText = "Letterboxing",
|
||||||
Bindable = letterboxing,
|
Bindable = letterboxing,
|
||||||
},
|
},
|
||||||
letterboxPositionX = new OptionSlider<int>
|
letterboxPositionX = new OptionSlider<double>
|
||||||
{
|
{
|
||||||
LabelText = "Horizontal position",
|
LabelText = "Horizontal position",
|
||||||
Bindable = (BindableInt)config.GetBindable<int>(FrameworkConfig.LetterboxPositionX)
|
Bindable = config.GetBindable<double>(FrameworkConfig.LetterboxPositionX)
|
||||||
},
|
},
|
||||||
letterboxPositionY = new OptionSlider<int>
|
letterboxPositionY = new OptionSlider<double>
|
||||||
{
|
{
|
||||||
LabelText = "Vertical position",
|
LabelText = "Vertical position",
|
||||||
Bindable = (BindableInt)config.GetBindable<int>(FrameworkConfig.LetterboxPositionY)
|
Bindable = config.GetBindable<double>(FrameworkConfig.LetterboxPositionY)
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
@ -18,10 +17,10 @@ namespace osu.Game.Overlays.Options.Sections.Input
|
|||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new OptionSlider<double>
|
new OptionSlider<double, SensitivitySlider>
|
||||||
{
|
{
|
||||||
LabelText = "Sensitivity",
|
LabelText = "Sensitivity",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.MouseSpeed),
|
Bindable = config.GetBindable<double>(OsuConfig.MouseSpeed)
|
||||||
},
|
},
|
||||||
new OsuCheckbox
|
new OsuCheckbox
|
||||||
{
|
{
|
||||||
@ -55,5 +54,10 @@ namespace osu.Game.Overlays.Options.Sections.Input
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class SensitivitySlider : OsuSliderBar<double>
|
||||||
|
{
|
||||||
|
public override string TooltipText => Current.Value.ToString(@"0.##x");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Configuration;
|
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Game.Configuration;
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
@ -59,15 +58,15 @@ namespace osu.Game.Overlays.Options.Sections
|
|||||||
LabelText = "Always use skin cursor",
|
LabelText = "Always use skin cursor",
|
||||||
Bindable = config.GetBindable<bool>(OsuConfig.UseSkinCursor)
|
Bindable = config.GetBindable<bool>(OsuConfig.UseSkinCursor)
|
||||||
},
|
},
|
||||||
new OptionSlider<double>
|
new OptionSlider<double, SizeSlider>
|
||||||
{
|
{
|
||||||
LabelText = "Menu cursor size",
|
LabelText = "Menu cursor size",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.MenuCursorSize)
|
Bindable = config.GetBindable<double>(OsuConfig.MenuCursorSize)
|
||||||
},
|
},
|
||||||
new OptionSlider<double>
|
new OptionSlider<double, SizeSlider>
|
||||||
{
|
{
|
||||||
LabelText = "Gameplay cursor size",
|
LabelText = "Gameplay cursor size",
|
||||||
Bindable = (BindableDouble)config.GetBindable<double>(OsuConfig.GameplayCursorSize)
|
Bindable = config.GetBindable<double>(OsuConfig.GameplayCursorSize)
|
||||||
},
|
},
|
||||||
new OsuCheckbox
|
new OsuCheckbox
|
||||||
{
|
{
|
||||||
@ -76,5 +75,10 @@ namespace osu.Game.Overlays.Options.Sections
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class SizeSlider : OsuSliderBar<double>
|
||||||
|
{
|
||||||
|
public override string TooltipText => Current.Value.ToString(@"0.##x");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@ using osu.Framework.Graphics.Colour;
|
|||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Database;
|
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
|
|
||||||
@ -20,9 +19,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
public const float TOOLTIP_HEIGHT = 30;
|
public const float TOOLTIP_HEIGHT = 30;
|
||||||
|
|
||||||
public Action OnHome;
|
public Action OnHome;
|
||||||
public Action<RulesetInfo> OnRulesetChange;
|
|
||||||
|
|
||||||
private readonly ToolbarModeSelector modeSelector;
|
|
||||||
private readonly ToolbarUserArea userArea;
|
private readonly ToolbarUserArea userArea;
|
||||||
|
|
||||||
protected override bool HideOnEscape => false;
|
protected override bool HideOnEscape => false;
|
||||||
@ -53,13 +50,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
{
|
{
|
||||||
Action = () => OnHome?.Invoke()
|
Action = () => OnHome?.Invoke()
|
||||||
},
|
},
|
||||||
modeSelector = new ToolbarModeSelector
|
new ToolbarModeSelector()
|
||||||
{
|
|
||||||
OnRulesetChange = mode =>
|
|
||||||
{
|
|
||||||
OnRulesetChange?.Invoke(mode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
@ -130,8 +121,6 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetRuleset(RulesetInfo ruleset) => modeSelector.SetRuleset(ruleset);
|
|
||||||
|
|
||||||
protected override void PopIn()
|
protected override void PopIn()
|
||||||
{
|
{
|
||||||
MoveToY(0, transition_time, EasingTypes.OutQuint);
|
MoveToY(0, transition_time, EasingTypes.OutQuint);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// 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 System;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Caching;
|
using osu.Framework.Caching;
|
||||||
@ -12,6 +11,7 @@ using osu.Framework.Graphics.Sprites;
|
|||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Toolbar
|
namespace osu.Game.Overlays.Toolbar
|
||||||
{
|
{
|
||||||
@ -23,7 +23,7 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
private readonly Drawable modeButtonLine;
|
private readonly Drawable modeButtonLine;
|
||||||
private ToolbarModeButton activeButton;
|
private ToolbarModeButton activeButton;
|
||||||
|
|
||||||
public Action<RulesetInfo> OnRulesetChange;
|
private readonly Bindable<RulesetInfo> ruleset = new Bindable<RulesetInfo>();
|
||||||
|
|
||||||
public ToolbarModeSelector()
|
public ToolbarModeSelector()
|
||||||
{
|
{
|
||||||
@ -66,30 +66,36 @@ namespace osu.Game.Overlays.Toolbar
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(RulesetDatabase rulesets)
|
private void load(RulesetDatabase rulesets, OsuGame game)
|
||||||
{
|
{
|
||||||
foreach (var ruleset in rulesets.AllRulesets)
|
foreach (var r in rulesets.AllRulesets)
|
||||||
{
|
{
|
||||||
modeButtons.Add(new ToolbarModeButton
|
modeButtons.Add(new ToolbarModeButton
|
||||||
{
|
{
|
||||||
Ruleset = ruleset,
|
Ruleset = r,
|
||||||
Action = delegate
|
Action = delegate
|
||||||
{
|
{
|
||||||
SetRuleset(ruleset);
|
ruleset.Value = r;
|
||||||
OnRulesetChange?.Invoke(ruleset);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ruleset.ValueChanged += rulesetChanged;
|
||||||
|
ruleset.DisabledChanged += disabledChanged;
|
||||||
|
ruleset.BindTo(game.Ruleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool HandleInput => !ruleset.Disabled;
|
||||||
|
|
||||||
|
private void disabledChanged(bool isDisabled) => FadeColour(isDisabled ? Color4.Gray : Color4.White, 300);
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
base.Update();
|
base.Update();
|
||||||
|
|
||||||
Size = new Vector2(modeButtons.DrawSize.X, 1);
|
Size = new Vector2(modeButtons.DrawSize.X, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetRuleset(RulesetInfo ruleset)
|
private void rulesetChanged(RulesetInfo ruleset)
|
||||||
{
|
{
|
||||||
foreach (ToolbarModeButton m in modeButtons.Children.Cast<ToolbarModeButton>())
|
foreach (ToolbarModeButton m in modeButtons.Children.Cast<ToolbarModeButton>())
|
||||||
{
|
{
|
||||||
|
@ -1,22 +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.Game.Rulesets.Objects.Drawables;
|
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Judgements
|
namespace osu.Game.Rulesets.Judgements
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Inidicates that the judgement this is attached to is a partial judgement and the scoring value may change.
|
/// Inidicates that the judgement this is attached to is a partial judgement and the scoring value may change.
|
||||||
/// <para>
|
|
||||||
/// This judgement will be continually processed by <see cref="DrawableHitObject{TObject, TJudgement}.CheckJudgement(bool)"/>
|
|
||||||
/// unless the result is a miss and will trigger a full re-process of the <see cref="ScoreProcessor"/> when changed.
|
|
||||||
/// </para>
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IPartialJudgement
|
public interface IPartialJudgement
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that this partial judgement has changed and requires a full re-process of the <see cref="ScoreProcessor"/>.
|
/// Indicates that this partial judgement has changed and requires reprocessing.
|
||||||
/// <para>
|
/// <para>
|
||||||
/// This is set to false once the judgement has been re-processed.
|
/// This is set to false once the judgement has been re-processed.
|
||||||
/// </para>
|
/// </para>
|
||||||
|
@ -17,6 +17,6 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
/// Applies the mod to a HitRenderer.
|
/// Applies the mod to a HitRenderer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="hitRenderer">The HitRenderer to apply the mod to.</param>
|
/// <param name="hitRenderer">The HitRenderer to apply the mod to.</param>
|
||||||
void Apply(HitRenderer<TObject> hitRenderer);
|
void ApplyToHitRenderer(HitRenderer<TObject> hitRenderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
osu.Game/Rulesets/Mods/IApplicableToClock.cs
Normal file
15
osu.Game/Rulesets/Mods/IApplicableToClock.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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.Framework.Timing;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// An interface for mods that make adjustments to the track.
|
||||||
|
/// </summary>
|
||||||
|
public interface IApplicableToClock
|
||||||
|
{
|
||||||
|
void ApplyToClock(IAdjustableClock clock);
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,8 @@
|
|||||||
// 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.Game.Beatmaps;
|
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
using osu.Game.Rulesets.UI;
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Game.Rulesets.Scoring;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mods
|
namespace osu.Game.Rulesets.Mods
|
||||||
{
|
{
|
||||||
@ -45,131 +41,4 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual Type[] IncompatibleMods => new Type[] { };
|
public virtual Type[] IncompatibleMods => new Type[] { };
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MultiMod : Mod
|
|
||||||
{
|
|
||||||
public override string Name => string.Empty;
|
|
||||||
public override string Description => string.Empty;
|
|
||||||
public override double ScoreMultiplier => 0.0;
|
|
||||||
|
|
||||||
public Mod[] Mods;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModNoFail : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "NoFail";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail;
|
|
||||||
public override string Description => "You can't fail, no matter what.";
|
|
||||||
public override double ScoreMultiplier => 0.5;
|
|
||||||
public override bool Ranked => true;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModAutoplay) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModEasy : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Easy";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy;
|
|
||||||
public override string Description => "Reduces overall difficulty - larger circles, more forgiving HP drain, less accuracy required.";
|
|
||||||
public override double ScoreMultiplier => 0.5;
|
|
||||||
public override bool Ranked => true;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModHardRock) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModHidden : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Hidden";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
|
||||||
public override bool Ranked => true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModHardRock : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Hard Rock";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock;
|
|
||||||
public override string Description => "Everything just got a bit harder...";
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModEasy) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModSuddenDeath : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Sudden Death";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath;
|
|
||||||
public override string Description => "Miss a note and fail.";
|
|
||||||
public override double ScoreMultiplier => 1;
|
|
||||||
public override bool Ranked => true;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModDoubleTime : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Double Time";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime;
|
|
||||||
public override string Description => "Zoooooooooom";
|
|
||||||
public override bool Ranked => true;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModHalfTime) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModRelax : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Relax";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
|
|
||||||
public override double ScoreMultiplier => 0;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModNoFail), typeof(ModSuddenDeath) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModHalfTime : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Half Time";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime;
|
|
||||||
public override string Description => "Less zoom";
|
|
||||||
public override bool Ranked => true;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModDoubleTime) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModNightcore : ModDoubleTime
|
|
||||||
{
|
|
||||||
public override string Name => "Nightcore";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore;
|
|
||||||
public override string Description => "uguuuuuuuu";
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModFlashlight : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Flashlight";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight;
|
|
||||||
public override string Description => "Restricted view area.";
|
|
||||||
public override bool Ranked => true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ModAutoplay : Mod
|
|
||||||
{
|
|
||||||
public override string Name => "Autoplay";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
|
|
||||||
public override string Description => "Watch a perfect automated play through the song";
|
|
||||||
public override double ScoreMultiplier => 0;
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModAutoplay<T> : ModAutoplay, IApplicableMod<T>
|
|
||||||
where T : HitObject
|
|
||||||
{
|
|
||||||
protected abstract Score CreateReplayScore(Beatmap<T> beatmap);
|
|
||||||
|
|
||||||
public void Apply(HitRenderer<T> hitRenderer)
|
|
||||||
{
|
|
||||||
hitRenderer.SetReplay(CreateReplayScore(hitRenderer.Beatmap)?.Replay);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModPerfect : ModSuddenDeath
|
|
||||||
{
|
|
||||||
public override string Name => "Perfect";
|
|
||||||
public override string Description => "SS or quit.";
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ModCinema : ModAutoplay
|
|
||||||
{
|
|
||||||
public override string Name => "Cinema";
|
|
||||||
public override FontAwesome Icon => FontAwesome.fa_osu_mod_cinema;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
32
osu.Game/Rulesets/Mods/ModAutoplay.cs
Normal file
32
osu.Game/Rulesets/Mods/ModAutoplay.cs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Rulesets.UI;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModAutoplay<T> : ModAutoplay, IApplicableMod<T>
|
||||||
|
where T : HitObject
|
||||||
|
{
|
||||||
|
protected abstract Score CreateReplayScore(Beatmap<T> beatmap);
|
||||||
|
|
||||||
|
public void ApplyToHitRenderer(HitRenderer<T> hitRenderer)
|
||||||
|
{
|
||||||
|
hitRenderer.SetReplay(CreateReplayScore(hitRenderer.Beatmap)?.Replay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ModAutoplay : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Autoplay";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_auto;
|
||||||
|
public override string Description => "Watch a perfect automated play through the song";
|
||||||
|
public override double ScoreMultiplier => 0;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };
|
||||||
|
}
|
||||||
|
}
|
13
osu.Game/Rulesets/Mods/ModCinema.cs
Normal file
13
osu.Game/Rulesets/Mods/ModCinema.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public class ModCinema : ModAutoplay
|
||||||
|
{
|
||||||
|
public override string Name => "Cinema";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_cinema;
|
||||||
|
}
|
||||||
|
}
|
25
osu.Game/Rulesets/Mods/ModDoubleTime.cs
Normal file
25
osu.Game/Rulesets/Mods/ModDoubleTime.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// 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.Framework.Timing;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public class ModDoubleTime : Mod, IApplicableToClock
|
||||||
|
{
|
||||||
|
public override string Name => "Double Time";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_doubletime;
|
||||||
|
public override string Description => "Zoooooooooom";
|
||||||
|
public override bool Ranked => true;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModHalfTime) };
|
||||||
|
|
||||||
|
public override double ScoreMultiplier => 1.12;
|
||||||
|
|
||||||
|
public virtual void ApplyToClock(IAdjustableClock clock)
|
||||||
|
{
|
||||||
|
clock.Rate = 1.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
osu.Game/Rulesets/Mods/ModEasy.cs
Normal file
18
osu.Game/Rulesets/Mods/ModEasy.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModEasy : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Easy";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_easy;
|
||||||
|
public override string Description => "Reduces overall difficulty - larger circles, more forgiving HP drain, less accuracy required.";
|
||||||
|
public override double ScoreMultiplier => 0.5;
|
||||||
|
public override bool Ranked => true;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModHardRock) };
|
||||||
|
}
|
||||||
|
}
|
15
osu.Game/Rulesets/Mods/ModFlashlight.cs
Normal file
15
osu.Game/Rulesets/Mods/ModFlashlight.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModFlashlight : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Flashlight";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_flashlight;
|
||||||
|
public override string Description => "Restricted view area.";
|
||||||
|
public override bool Ranked => true;
|
||||||
|
}
|
||||||
|
}
|
25
osu.Game/Rulesets/Mods/ModHalfTime.cs
Normal file
25
osu.Game/Rulesets/Mods/ModHalfTime.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// 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.Framework.Timing;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModHalfTime : Mod, IApplicableToClock
|
||||||
|
{
|
||||||
|
public override string Name => "Half Time";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_halftime;
|
||||||
|
public override string Description => "Less zoom";
|
||||||
|
public override bool Ranked => true;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModDoubleTime) };
|
||||||
|
|
||||||
|
public override double ScoreMultiplier => 1.12;
|
||||||
|
|
||||||
|
public void ApplyToClock(IAdjustableClock clock)
|
||||||
|
{
|
||||||
|
clock.Rate = 0.75;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
osu.Game/Rulesets/Mods/ModHardRock.cs
Normal file
16
osu.Game/Rulesets/Mods/ModHardRock.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModHardRock : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Hard Rock";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hardrock;
|
||||||
|
public override string Description => "Everything just got a bit harder...";
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModEasy) };
|
||||||
|
}
|
||||||
|
}
|
14
osu.Game/Rulesets/Mods/ModHidden.cs
Normal file
14
osu.Game/Rulesets/Mods/ModHidden.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModHidden : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Hidden";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_hidden;
|
||||||
|
public override bool Ranked => true;
|
||||||
|
}
|
||||||
|
}
|
25
osu.Game/Rulesets/Mods/ModNightcore.cs
Normal file
25
osu.Game/Rulesets/Mods/ModNightcore.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// 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.Framework.Audio;
|
||||||
|
using osu.Framework.Timing;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModNightcore : ModDoubleTime
|
||||||
|
{
|
||||||
|
public override string Name => "Nightcore";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nightcore;
|
||||||
|
public override string Description => "uguuuuuuuu";
|
||||||
|
|
||||||
|
public override void ApplyToClock(IAdjustableClock clock)
|
||||||
|
{
|
||||||
|
var pitchAdjust = clock as IHasPitchAdjust;
|
||||||
|
if (pitchAdjust != null)
|
||||||
|
pitchAdjust.PitchAdjust = 1.5;
|
||||||
|
else
|
||||||
|
base.ApplyToClock(clock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
osu.Game/Rulesets/Mods/ModNoFail.cs
Normal file
18
osu.Game/Rulesets/Mods/ModNoFail.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModNoFail : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "NoFail";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_nofail;
|
||||||
|
public override string Description => "You can't fail, no matter what.";
|
||||||
|
public override double ScoreMultiplier => 0.5;
|
||||||
|
public override bool Ranked => true;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModAutoplay) };
|
||||||
|
}
|
||||||
|
}
|
11
osu.Game/Rulesets/Mods/ModPerfect.cs
Normal file
11
osu.Game/Rulesets/Mods/ModPerfect.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModPerfect : ModSuddenDeath
|
||||||
|
{
|
||||||
|
public override string Name => "Perfect";
|
||||||
|
public override string Description => "SS or quit.";
|
||||||
|
}
|
||||||
|
}
|
16
osu.Game/Rulesets/Mods/ModRelax.cs
Normal file
16
osu.Game/Rulesets/Mods/ModRelax.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModRelax : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Relax";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_relax;
|
||||||
|
public override double ScoreMultiplier => 0;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModNoFail), typeof(ModSuddenDeath) };
|
||||||
|
}
|
||||||
|
}
|
18
osu.Game/Rulesets/Mods/ModSuddenDeath.cs
Normal file
18
osu.Game/Rulesets/Mods/ModSuddenDeath.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// 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.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public abstract class ModSuddenDeath : Mod
|
||||||
|
{
|
||||||
|
public override string Name => "Sudden Death";
|
||||||
|
public override FontAwesome Icon => FontAwesome.fa_osu_mod_suddendeath;
|
||||||
|
public override string Description => "Miss a note and fail.";
|
||||||
|
public override double ScoreMultiplier => 1;
|
||||||
|
public override bool Ranked => true;
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) };
|
||||||
|
}
|
||||||
|
}
|
14
osu.Game/Rulesets/Mods/MultiMod.cs
Normal file
14
osu.Game/Rulesets/Mods/MultiMod.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Mods
|
||||||
|
{
|
||||||
|
public class MultiMod : Mod
|
||||||
|
{
|
||||||
|
public override string Name => string.Empty;
|
||||||
|
public override string Description => string.Empty;
|
||||||
|
public override double ScoreMultiplier => 0.0;
|
||||||
|
|
||||||
|
public Mod[] Mods;
|
||||||
|
}
|
||||||
|
}
|
@ -1,52 +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 OpenTK;
|
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using osu.Game.Audio;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Objects
|
|
||||||
{
|
|
||||||
public class CurvedHitObject : HitObject, IHasCurve
|
|
||||||
{
|
|
||||||
public SliderCurve Curve { get; } = new SliderCurve();
|
|
||||||
|
|
||||||
public int RepeatCount { get; set; } = 1;
|
|
||||||
|
|
||||||
public double EndTime => 0;
|
|
||||||
public double Duration => 0;
|
|
||||||
|
|
||||||
public List<Vector2> ControlPoints
|
|
||||||
{
|
|
||||||
get { return Curve.ControlPoints; }
|
|
||||||
set { Curve.ControlPoints = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public CurveType CurveType
|
|
||||||
{
|
|
||||||
get { return Curve.CurveType; }
|
|
||||||
set { Curve.CurveType = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public double Distance
|
|
||||||
{
|
|
||||||
get { return Curve.Distance; }
|
|
||||||
set { Curve.Distance = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<List<SampleInfo>> RepeatSamples { get; set; } = new List<List<SampleInfo>>();
|
|
||||||
|
|
||||||
public Vector2 PositionAt(double progress) => Curve.PositionAt(ProgressAt(progress));
|
|
||||||
|
|
||||||
public double ProgressAt(double progress)
|
|
||||||
{
|
|
||||||
var p = progress * RepeatCount % 1;
|
|
||||||
if (RepeatAt(progress) % 2 == 1)
|
|
||||||
p = 1 - p;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int RepeatAt(double progress) => (int)(progress * RepeatCount);
|
|
||||||
}
|
|
||||||
}
|
|
@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The samples to be played when this hit object is hit.
|
/// The samples to be played when this hit object is hit.
|
||||||
/// <para>
|
/// <para>
|
||||||
/// In the case of <see cref="CurvedHitObject"/> types, this is the sample of the curve body
|
/// In the case of <see cref="IHasRepeats"/> types, this is the sample of the curve body
|
||||||
/// and can be treated as the default samples for the hit object.
|
/// and can be treated as the default samples for the hit object.
|
||||||
/// </para>
|
/// </para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!catch Hit-type, used for parsing Beatmaps.
|
/// Legacy osu!catch Hit-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Hit : HitObject, IHasCombo, IHasXPosition
|
internal sealed class ConvertHit : HitObject, IHasCombo, IHasXPosition
|
||||||
{
|
{
|
||||||
public float X { get; set; }
|
public float X { get; set; }
|
||||||
|
|
@ -11,11 +11,11 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A HitObjectParser to parse legacy osu!catch Beatmaps.
|
/// A HitObjectParser to parse legacy osu!catch Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class HitObjectParser : Legacy.HitObjectParser
|
internal class ConvertHitObjectParser : Legacy.ConvertHitObjectParser
|
||||||
{
|
{
|
||||||
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
||||||
{
|
{
|
||||||
return new Hit
|
return new ConvertHit
|
||||||
{
|
{
|
||||||
X = position.X,
|
X = position.X,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
@ -24,21 +24,21 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
||||||
{
|
{
|
||||||
return new Slider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
X = position.X,
|
X = position.X,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
ControlPoints = controlPoints,
|
ControlPoints = controlPoints,
|
||||||
Distance = length,
|
Distance = length,
|
||||||
CurveType = curveType,
|
CurveType = curveType,
|
||||||
RepeatCount = repeatCount,
|
RepeatSamples = repeatSamples,
|
||||||
RepeatSamples = repeatSamples
|
RepeatCount = repeatCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
||||||
{
|
{
|
||||||
return new Spinner
|
return new ConvertSpinner
|
||||||
{
|
{
|
||||||
EndTime = endTime
|
EndTime = endTime
|
||||||
};
|
};
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!catch Slider-type, used for parsing Beatmaps.
|
/// Legacy osu!catch Slider-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Slider : CurvedHitObject, IHasXPosition, IHasCombo
|
internal sealed class ConvertSlider : Legacy.ConvertSlider, IHasXPosition, IHasCombo
|
||||||
{
|
{
|
||||||
public float X { get; set; }
|
public float X { get; set; }
|
||||||
|
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!catch Spinner-type, used for parsing Beatmaps.
|
/// Legacy osu!catch Spinner-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Spinner : HitObject, IHasEndTime
|
internal sealed class ConvertSpinner : HitObject, IHasEndTime
|
||||||
{
|
{
|
||||||
public double EndTime { get; set; }
|
public double EndTime { get; set; }
|
||||||
|
|
@ -14,28 +14,28 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A HitObjectParser to parse legacy Beatmaps.
|
/// A HitObjectParser to parse legacy Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal abstract class HitObjectParser : Objects.HitObjectParser
|
internal abstract class ConvertHitObjectParser : HitObjectParser
|
||||||
{
|
{
|
||||||
public override HitObject Parse(string text)
|
public override HitObject Parse(string text)
|
||||||
{
|
{
|
||||||
string[] split = text.Split(',');
|
string[] split = text.Split(',');
|
||||||
HitObjectType type = (HitObjectType)int.Parse(split[3]) & ~HitObjectType.ColourHax;
|
ConvertHitObjectType type = (ConvertHitObjectType)int.Parse(split[3]) & ~ConvertHitObjectType.ColourHax;
|
||||||
bool combo = type.HasFlag(HitObjectType.NewCombo);
|
bool combo = type.HasFlag(ConvertHitObjectType.NewCombo);
|
||||||
type &= ~HitObjectType.NewCombo;
|
type &= ~ConvertHitObjectType.NewCombo;
|
||||||
|
|
||||||
var soundType = (LegacySoundType)int.Parse(split[4]);
|
var soundType = (LegacySoundType)int.Parse(split[4]);
|
||||||
var bankInfo = new SampleBankInfo();
|
var bankInfo = new SampleBankInfo();
|
||||||
|
|
||||||
HitObject result;
|
HitObject result;
|
||||||
|
|
||||||
if ((type & HitObjectType.Circle) > 0)
|
if ((type & ConvertHitObjectType.Circle) > 0)
|
||||||
{
|
{
|
||||||
result = CreateHit(new Vector2(int.Parse(split[0]), int.Parse(split[1])), combo);
|
result = CreateHit(new Vector2(int.Parse(split[0]), int.Parse(split[1])), combo);
|
||||||
|
|
||||||
if (split.Length > 5)
|
if (split.Length > 5)
|
||||||
readCustomSampleBanks(split[5], bankInfo);
|
readCustomSampleBanks(split[5], bankInfo);
|
||||||
}
|
}
|
||||||
else if ((type & HitObjectType.Slider) > 0)
|
else if ((type & ConvertHitObjectType.Slider) > 0)
|
||||||
{
|
{
|
||||||
CurveType curveType = CurveType.Catmull;
|
CurveType curveType = CurveType.Catmull;
|
||||||
double length = 0;
|
double length = 0;
|
||||||
@ -80,7 +80,8 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
readCustomSampleBanks(split[10], bankInfo);
|
readCustomSampleBanks(split[10], bankInfo);
|
||||||
|
|
||||||
// One node for each repeat + the start and end nodes
|
// One node for each repeat + the start and end nodes
|
||||||
int nodes = repeatCount + 2;
|
// Note that the first length of the slider is considered a repeat, but there are no actual repeats happening
|
||||||
|
int nodes = Math.Max(0, repeatCount - 1) + 2;
|
||||||
|
|
||||||
// Populate node sample bank infos with the default hit object sample bank
|
// Populate node sample bank infos with the default hit object sample bank
|
||||||
var nodeBankInfos = new List<SampleBankInfo>();
|
var nodeBankInfos = new List<SampleBankInfo>();
|
||||||
@ -128,21 +129,21 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
|
|
||||||
result = CreateSlider(new Vector2(int.Parse(split[0]), int.Parse(split[1])), combo, points, length, curveType, repeatCount, nodeSamples);
|
result = CreateSlider(new Vector2(int.Parse(split[0]), int.Parse(split[1])), combo, points, length, curveType, repeatCount, nodeSamples);
|
||||||
}
|
}
|
||||||
else if ((type & HitObjectType.Spinner) > 0)
|
else if ((type & ConvertHitObjectType.Spinner) > 0)
|
||||||
{
|
{
|
||||||
result = CreateSpinner(new Vector2(512, 384) / 2, Convert.ToDouble(split[5], CultureInfo.InvariantCulture));
|
result = CreateSpinner(new Vector2(512, 384) / 2, Convert.ToDouble(split[5], CultureInfo.InvariantCulture));
|
||||||
|
|
||||||
if (split.Length > 6)
|
if (split.Length > 6)
|
||||||
readCustomSampleBanks(split[6], bankInfo);
|
readCustomSampleBanks(split[6], bankInfo);
|
||||||
}
|
}
|
||||||
else if ((type & HitObjectType.Hold) > 0)
|
else if ((type & ConvertHitObjectType.Hold) > 0)
|
||||||
{
|
{
|
||||||
// Note: Hold is generated by BMS converts
|
// Note: Hold is generated by BMS converts
|
||||||
|
|
||||||
// Todo: Apparently end time is determined by samples??
|
// Todo: Apparently end time is determined by samples??
|
||||||
// Shouldn't need implementation until mania
|
// Shouldn't need implementation until mania
|
||||||
|
|
||||||
result = new Hold
|
result = new ConvertHold
|
||||||
{
|
{
|
||||||
Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
|
Position = new Vector2(int.Parse(split[0]), int.Parse(split[1])),
|
||||||
NewCombo = combo
|
NewCombo = combo
|
||||||
@ -201,9 +202,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
/// <param name="length">The slider length.</param>
|
/// <param name="length">The slider length.</param>
|
||||||
/// <param name="curveType">The slider curve type.</param>
|
/// <param name="curveType">The slider curve type.</param>
|
||||||
/// <param name="repeatCount">The slider repeat count.</param>
|
/// <param name="repeatCount">The slider repeat count.</param>
|
||||||
/// <param name="headSamples">The samples to be played when the head of the slider is hit.</param>
|
/// <param name="repeatSamples">The samples to be played when the repeat nodes are hit. This includes the head and tail of the slider.</param>
|
||||||
/// <param name="tailSamples">The samples to be played when the tail of the slider is hit.</param>
|
|
||||||
/// <param name="repeatSamples">The samples to be played when the repeat nodes are hit.</param>
|
|
||||||
/// <returns>The hit object.</returns>
|
/// <returns>The hit object.</returns>
|
||||||
protected abstract HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples);
|
protected abstract HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples);
|
||||||
|
|
@ -6,7 +6,7 @@ using System;
|
|||||||
namespace osu.Game.Rulesets.Objects.Legacy
|
namespace osu.Game.Rulesets.Objects.Legacy
|
||||||
{
|
{
|
||||||
[Flags]
|
[Flags]
|
||||||
public enum HitObjectType
|
internal enum ConvertHitObjectType
|
||||||
{
|
{
|
||||||
Circle = 1 << 0,
|
Circle = 1 << 0,
|
||||||
Slider = 1 << 1,
|
Slider = 1 << 1,
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy Hold-type, used for parsing "specials" in beatmaps.
|
/// Legacy Hold-type, used for parsing "specials" in beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Hold : HitObject, IHasPosition, IHasCombo, IHasHold
|
internal sealed class ConvertHold : HitObject, IHasPosition, IHasCombo, IHasHold
|
||||||
{
|
{
|
||||||
public Vector2 Position { get; set; }
|
public Vector2 Position { get; set; }
|
||||||
|
|
39
osu.Game/Rulesets/Objects/Legacy/ConvertSlider.cs
Normal file
39
osu.Game/Rulesets/Objects/Legacy/ConvertSlider.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// 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.Rulesets.Objects.Types;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenTK;
|
||||||
|
using osu.Game.Audio;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Objects.Legacy
|
||||||
|
{
|
||||||
|
internal abstract class ConvertSlider : HitObject, IHasCurve
|
||||||
|
{
|
||||||
|
public List<Vector2> ControlPoints { get; set; }
|
||||||
|
public CurveType CurveType { get; set; }
|
||||||
|
public double Distance { get; set; }
|
||||||
|
|
||||||
|
public List<List<SampleInfo>> RepeatSamples { get; set; }
|
||||||
|
public int RepeatCount { get; set; } = 1;
|
||||||
|
|
||||||
|
public double EndTime { get; set; }
|
||||||
|
public double Duration { get; set; }
|
||||||
|
|
||||||
|
public Vector2 PositionAt(double progress)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double ProgressAt(double progress)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int RepeatAt(double progress)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!mania Hit-type, used for parsing Beatmaps.
|
/// Legacy osu!mania Hit-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Hit : HitObject, IHasXPosition, IHasCombo
|
internal sealed class ConvertHit : HitObject, IHasXPosition, IHasCombo
|
||||||
{
|
{
|
||||||
public float X { get; set; }
|
public float X { get; set; }
|
||||||
|
|
@ -11,11 +11,11 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A HitObjectParser to parse legacy osu!mania Beatmaps.
|
/// A HitObjectParser to parse legacy osu!mania Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class HitObjectParser : Legacy.HitObjectParser
|
internal class ConvertHitObjectParser : Legacy.ConvertHitObjectParser
|
||||||
{
|
{
|
||||||
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
||||||
{
|
{
|
||||||
return new Hit
|
return new ConvertHit
|
||||||
{
|
{
|
||||||
X = position.X,
|
X = position.X,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
@ -24,21 +24,21 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
||||||
{
|
{
|
||||||
return new Slider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
X = position.X,
|
X = position.X,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
ControlPoints = controlPoints,
|
ControlPoints = controlPoints,
|
||||||
Distance = length,
|
Distance = length,
|
||||||
CurveType = curveType,
|
CurveType = curveType,
|
||||||
RepeatCount = repeatCount,
|
RepeatSamples = repeatSamples,
|
||||||
RepeatSamples = repeatSamples
|
RepeatCount = repeatCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
||||||
{
|
{
|
||||||
return new Spinner
|
return new ConvertSpinner
|
||||||
{
|
{
|
||||||
X = position.X,
|
X = position.X,
|
||||||
EndTime = endTime
|
EndTime = endTime
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!mania Slider-type, used for parsing Beatmaps.
|
/// Legacy osu!mania Slider-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Slider : CurvedHitObject, IHasXPosition, IHasCombo
|
internal sealed class ConvertSlider : Legacy.ConvertSlider, IHasXPosition, IHasCombo
|
||||||
{
|
{
|
||||||
public float X { get; set; }
|
public float X { get; set; }
|
||||||
|
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!mania Spinner-type, used for parsing Beatmaps.
|
/// Legacy osu!mania Spinner-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Spinner : HitObject, IHasEndTime, IHasXPosition
|
internal sealed class ConvertSpinner : HitObject, IHasEndTime, IHasXPosition
|
||||||
{
|
{
|
||||||
public double EndTime { get; set; }
|
public double EndTime { get; set; }
|
||||||
|
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu! Hit-type, used for parsing Beatmaps.
|
/// Legacy osu! Hit-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Hit : HitObject, IHasPosition, IHasCombo
|
internal sealed class ConvertHit : HitObject, IHasPosition, IHasCombo
|
||||||
{
|
{
|
||||||
public Vector2 Position { get; set; }
|
public Vector2 Position { get; set; }
|
||||||
|
|
@ -11,11 +11,11 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A HitObjectParser to parse legacy osu! Beatmaps.
|
/// A HitObjectParser to parse legacy osu! Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class HitObjectParser : Legacy.HitObjectParser
|
internal class ConvertHitObjectParser : Legacy.ConvertHitObjectParser
|
||||||
{
|
{
|
||||||
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
||||||
{
|
{
|
||||||
return new Hit
|
return new ConvertHit
|
||||||
{
|
{
|
||||||
Position = position,
|
Position = position,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
@ -24,21 +24,21 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
||||||
{
|
{
|
||||||
return new Slider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
Position = position,
|
Position = position,
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
ControlPoints = controlPoints,
|
ControlPoints = controlPoints,
|
||||||
Distance = length,
|
Distance = length,
|
||||||
CurveType = curveType,
|
CurveType = curveType,
|
||||||
RepeatCount = repeatCount,
|
RepeatSamples = repeatSamples,
|
||||||
RepeatSamples = repeatSamples
|
RepeatCount = repeatCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
||||||
{
|
{
|
||||||
return new Spinner
|
return new ConvertSpinner
|
||||||
{
|
{
|
||||||
Position = position,
|
Position = position,
|
||||||
EndTime = endTime
|
EndTime = endTime
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu! Slider-type, used for parsing Beatmaps.
|
/// Legacy osu! Slider-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Slider : CurvedHitObject, IHasPosition, IHasCombo
|
internal sealed class ConvertSlider : Legacy.ConvertSlider, IHasPosition, IHasCombo
|
||||||
{
|
{
|
||||||
public Vector2 Position { get; set; }
|
public Vector2 Position { get; set; }
|
||||||
|
|
@ -9,7 +9,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu! Spinner-type, used for parsing Beatmaps.
|
/// Legacy osu! Spinner-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Spinner : HitObject, IHasEndTime, IHasPosition
|
internal sealed class ConvertSpinner : HitObject, IHasEndTime, IHasPosition
|
||||||
{
|
{
|
||||||
public double EndTime { get; set; }
|
public double EndTime { get; set; }
|
||||||
|
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!taiko Hit-type, used for parsing Beatmaps.
|
/// Legacy osu!taiko Hit-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Hit : HitObject, IHasCombo
|
internal sealed class ConvertHit : HitObject, IHasCombo
|
||||||
{
|
{
|
||||||
public bool NewCombo { get; set; }
|
public bool NewCombo { get; set; }
|
||||||
}
|
}
|
@ -11,11 +11,11 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A HitObjectParser to parse legacy osu!taiko Beatmaps.
|
/// A HitObjectParser to parse legacy osu!taiko Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal class HitObjectParser : Legacy.HitObjectParser
|
internal class ConvertHitObjectParser : Legacy.ConvertHitObjectParser
|
||||||
{
|
{
|
||||||
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
protected override HitObject CreateHit(Vector2 position, bool newCombo)
|
||||||
{
|
{
|
||||||
return new Hit
|
return new ConvertHit
|
||||||
{
|
{
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
};
|
};
|
||||||
@ -23,20 +23,20 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, List<Vector2> controlPoints, double length, CurveType curveType, int repeatCount, List<List<SampleInfo>> repeatSamples)
|
||||||
{
|
{
|
||||||
return new Slider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
NewCombo = newCombo,
|
NewCombo = newCombo,
|
||||||
ControlPoints = controlPoints,
|
ControlPoints = controlPoints,
|
||||||
Distance = length,
|
Distance = length,
|
||||||
CurveType = curveType,
|
CurveType = curveType,
|
||||||
RepeatCount = repeatCount,
|
RepeatSamples = repeatSamples,
|
||||||
RepeatSamples = repeatSamples
|
RepeatCount = repeatCount
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
protected override HitObject CreateSpinner(Vector2 position, double endTime)
|
||||||
{
|
{
|
||||||
return new Spinner
|
return new ConvertSpinner
|
||||||
{
|
{
|
||||||
EndTime = endTime
|
EndTime = endTime
|
||||||
};
|
};
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!taiko Slider-type, used for parsing Beatmaps.
|
/// Legacy osu!taiko Slider-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Slider : CurvedHitObject, IHasCombo
|
internal sealed class ConvertSlider : Legacy.ConvertSlider, IHasCombo
|
||||||
{
|
{
|
||||||
public bool NewCombo { get; set; }
|
public bool NewCombo { get; set; }
|
||||||
}
|
}
|
@ -8,7 +8,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy osu!taiko Spinner-type, used for parsing Beatmaps.
|
/// Legacy osu!taiko Spinner-type, used for parsing Beatmaps.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class Spinner : HitObject, IHasEndTime
|
internal sealed class ConvertSpinner : HitObject, IHasEndTime
|
||||||
{
|
{
|
||||||
public double EndTime { get; set; }
|
public double EndTime { get; set; }
|
||||||
|
|
@ -11,11 +11,6 @@ namespace osu.Game.Rulesets.Objects.Types
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IHasCurve : IHasDistance, IHasRepeats
|
public interface IHasCurve : IHasDistance, IHasRepeats
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// The curve.
|
|
||||||
/// </summary>
|
|
||||||
SliderCurve Curve { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The control points that shape the curve.
|
/// The control points that shape the curve.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -157,7 +157,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (var mod in mods.OfType<IApplicableMod<TObject>>())
|
foreach (var mod in mods.OfType<IApplicableMod<TObject>>())
|
||||||
mod.Apply(this);
|
mod.ApplyToHitRenderer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -5,8 +5,10 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Audio;
|
using osu.Framework.Audio;
|
||||||
using osu.Framework.Audio.Sample;
|
using osu.Framework.Audio.Sample;
|
||||||
using osu.Framework.Audio.Track;
|
using osu.Framework.Audio.Track;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
@ -56,24 +58,32 @@ namespace osu.Game.Screens.Menu
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Bindable<bool> menuVoice;
|
||||||
|
private Bindable<bool> menuMusic;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(AudioManager audio)
|
private void load(AudioManager audio, OsuConfigManager config)
|
||||||
{
|
{
|
||||||
welcome = audio.Sample.Get(@"welcome");
|
menuVoice = config.GetBindable<bool>(OsuConfig.MenuVoice);
|
||||||
seeya = audio.Sample.Get(@"seeya");
|
menuMusic = config.GetBindable<bool>(OsuConfig.MenuMusic);
|
||||||
|
|
||||||
bgm = audio.Track.Get(@"circles");
|
bgm = audio.Track.Get(@"circles");
|
||||||
bgm.Looping = true;
|
bgm.Looping = true;
|
||||||
|
|
||||||
|
welcome = audio.Sample.Get(@"welcome");
|
||||||
|
seeya = audio.Sample.Get(@"seeya");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnEntering(Screen last)
|
protected override void OnEntering(Screen last)
|
||||||
{
|
{
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
|
|
||||||
|
if (menuVoice)
|
||||||
welcome.Play();
|
welcome.Play();
|
||||||
|
|
||||||
Scheduler.AddDelayed(delegate
|
Scheduler.AddDelayed(delegate
|
||||||
{
|
{
|
||||||
|
if (menuMusic)
|
||||||
bgm.Start();
|
bgm.Start();
|
||||||
|
|
||||||
LoadComponentAsync(mainMenu = new MainMenu());
|
LoadComponentAsync(mainMenu = new MainMenu());
|
||||||
@ -109,15 +119,17 @@ namespace osu.Game.Screens.Menu
|
|||||||
if (!(last is MainMenu))
|
if (!(last is MainMenu))
|
||||||
Content.FadeIn(300);
|
Content.FadeIn(300);
|
||||||
|
|
||||||
|
double fadeOutTime = 2000;
|
||||||
//we also handle the exit transition.
|
//we also handle the exit transition.
|
||||||
|
if (menuVoice)
|
||||||
seeya.Play();
|
seeya.Play();
|
||||||
|
else
|
||||||
|
fadeOutTime = 500;
|
||||||
|
|
||||||
const double fade_out_time = 2000;
|
Scheduler.AddDelayed(Exit, fadeOutTime);
|
||||||
|
|
||||||
Scheduler.AddDelayed(Exit, fade_out_time);
|
|
||||||
|
|
||||||
//don't want to fade out completely else we will stop running updates and shit will hit the fan.
|
//don't want to fade out completely else we will stop running updates and shit will hit the fan.
|
||||||
Game.FadeTo(0.01f, fade_out_time);
|
Game.FadeTo(0.01f, fadeOutTime);
|
||||||
|
|
||||||
base.OnResuming(last);
|
base.OnResuming(last);
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,14 @@
|
|||||||
// 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.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Audio.Track;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.MathUtils;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Database;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using osu.Game.Screens.Charts;
|
using osu.Game.Screens.Charts;
|
||||||
@ -15,6 +21,7 @@ using osu.Game.Screens.Select;
|
|||||||
using osu.Game.Screens.Tournament;
|
using osu.Game.Screens.Tournament;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Menu
|
namespace osu.Game.Screens.Menu
|
||||||
{
|
{
|
||||||
@ -54,11 +61,27 @@ namespace osu.Game.Screens.Menu
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Bindable<bool> menuMusic;
|
||||||
|
private TrackManager trackManager;
|
||||||
|
private WorkingBeatmap song;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuGame game)
|
private void load(OsuGame game, OsuConfigManager config, BeatmapDatabase beatmaps)
|
||||||
{
|
{
|
||||||
|
menuMusic = config.GetBindable<bool>(OsuConfig.MenuMusic);
|
||||||
LoadComponentAsync(background);
|
LoadComponentAsync(background);
|
||||||
|
|
||||||
|
if (!menuMusic)
|
||||||
|
{
|
||||||
|
trackManager = game.Audio.Track;
|
||||||
|
int choosableBeatmapsetAmmount = beatmaps.Query<BeatmapSetInfo>().Count();
|
||||||
|
if (choosableBeatmapsetAmmount > 0)
|
||||||
|
{
|
||||||
|
song = beatmaps.GetWorkingBeatmap(beatmaps.GetWithChildren<BeatmapSetInfo>(RNG.Next(1, choosableBeatmapsetAmmount)).Beatmaps[0]);
|
||||||
|
Beatmap = song;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buttons.OnSettings = game.ToggleOptions;
|
buttons.OnSettings = game.ToggleOptions;
|
||||||
|
|
||||||
preloadSongSelect();
|
preloadSongSelect();
|
||||||
@ -81,6 +104,17 @@ namespace osu.Game.Screens.Menu
|
|||||||
{
|
{
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
buttons.FadeInFromZero(500);
|
buttons.FadeInFromZero(500);
|
||||||
|
if (last is Intro && song != null)
|
||||||
|
{
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
trackManager.SetExclusive(song.Track);
|
||||||
|
song.Track.Seek(song.Beatmap.Metadata.PreviewTime);
|
||||||
|
if (song.Beatmap.Metadata.PreviewTime == -1)
|
||||||
|
song.Track.Seek(song.Track.Length * 0.4f);
|
||||||
|
song.Track.Start();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnSuspending(Screen next)
|
protected override void OnSuspending(Screen next)
|
||||||
|
@ -5,6 +5,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Database;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
|
|
||||||
namespace osu.Game.Screens
|
namespace osu.Game.Screens
|
||||||
@ -25,8 +26,12 @@ namespace osu.Game.Screens
|
|||||||
|
|
||||||
internal virtual bool HasLocalCursorDisplayed => false;
|
internal virtual bool HasLocalCursorDisplayed => false;
|
||||||
|
|
||||||
|
internal virtual bool AllowRulesetChange => true;
|
||||||
|
|
||||||
private readonly Bindable<WorkingBeatmap> beatmap = new Bindable<WorkingBeatmap>();
|
private readonly Bindable<WorkingBeatmap> beatmap = new Bindable<WorkingBeatmap>();
|
||||||
|
|
||||||
|
private readonly Bindable<RulesetInfo> ruleset = new Bindable<RulesetInfo>();
|
||||||
|
|
||||||
public WorkingBeatmap Beatmap
|
public WorkingBeatmap Beatmap
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -40,7 +45,7 @@ namespace osu.Game.Screens
|
|||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader(permitNulls: true)]
|
[BackgroundDependencyLoader(permitNulls: true)]
|
||||||
private void load(OsuGameBase game)
|
private void load(OsuGameBase game, OsuGame osuGame)
|
||||||
{
|
{
|
||||||
if (game != null)
|
if (game != null)
|
||||||
{
|
{
|
||||||
@ -52,11 +57,23 @@ namespace osu.Game.Screens
|
|||||||
}
|
}
|
||||||
|
|
||||||
beatmap.ValueChanged += OnBeatmapChanged;
|
beatmap.ValueChanged += OnBeatmapChanged;
|
||||||
|
|
||||||
|
if (osuGame != null)
|
||||||
|
ruleset.BindTo(osuGame.Ruleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The global Beatmap was changed.
|
||||||
|
/// </summary>
|
||||||
protected virtual void OnBeatmapChanged(WorkingBeatmap beatmap)
|
protected virtual void OnBeatmapChanged(WorkingBeatmap beatmap)
|
||||||
{
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Update()
|
||||||
|
{
|
||||||
|
if (!IsCurrentScreen) return;
|
||||||
|
|
||||||
|
ruleset.Disabled = !AllowRulesetChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnEntering(Screen last)
|
protected override void OnEntering(Screen last)
|
||||||
|
@ -20,6 +20,7 @@ using osu.Game.Screens.Backgrounds;
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Threading;
|
using osu.Framework.Threading;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
|
|
||||||
@ -39,6 +40,8 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
public bool IsPaused => !interpolatedSourceClock.IsRunning;
|
public bool IsPaused => !interpolatedSourceClock.IsRunning;
|
||||||
|
|
||||||
|
internal override bool AllowRulesetChange => false;
|
||||||
|
|
||||||
public bool HasFailed { get; private set; }
|
public bool HasFailed { get; private set; }
|
||||||
|
|
||||||
public int RestartCount;
|
public int RestartCount;
|
||||||
@ -49,13 +52,22 @@ namespace osu.Game.Screens.Play
|
|||||||
private bool canPause => ValidForResume && !HasFailed && Time.Current >= lastPauseActionTime + pause_cooldown;
|
private bool canPause => ValidForResume && !HasFailed && Time.Current >= lastPauseActionTime + pause_cooldown;
|
||||||
|
|
||||||
private IAdjustableClock sourceClock;
|
private IAdjustableClock sourceClock;
|
||||||
|
private OffsetClock offsetClock;
|
||||||
private IFrameBasedClock interpolatedSourceClock;
|
private IFrameBasedClock interpolatedSourceClock;
|
||||||
|
|
||||||
private RulesetInfo ruleset;
|
private RulesetInfo ruleset;
|
||||||
|
|
||||||
private ScoreProcessor scoreProcessor;
|
private ScoreProcessor scoreProcessor;
|
||||||
protected HitRenderer HitRenderer;
|
protected HitRenderer HitRenderer;
|
||||||
private Bindable<int> dimLevel;
|
|
||||||
|
#region User Settings
|
||||||
|
|
||||||
|
private Bindable<double> dimLevel;
|
||||||
|
private Bindable<bool> mouseWheelDisabled;
|
||||||
|
private Bindable<double> userAudioOffset;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
private SkipButton skipButton;
|
private SkipButton skipButton;
|
||||||
|
|
||||||
private HudOverlay hudOverlay;
|
private HudOverlay hudOverlay;
|
||||||
@ -65,7 +77,7 @@ namespace osu.Game.Screens.Play
|
|||||||
[BackgroundDependencyLoader(permitNulls: true)]
|
[BackgroundDependencyLoader(permitNulls: true)]
|
||||||
private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config, OsuGame osu)
|
private void load(AudioManager audio, BeatmapDatabase beatmaps, OsuConfigManager config, OsuGame osu)
|
||||||
{
|
{
|
||||||
dimLevel = config.GetBindable<int>(OsuConfig.DimLevel);
|
dimLevel = config.GetBindable<double>(OsuConfig.DimLevel);
|
||||||
mouseWheelDisabled = config.GetBindable<bool>(OsuConfig.MouseDisableWheel);
|
mouseWheelDisabled = config.GetBindable<bool>(OsuConfig.MouseDisableWheel);
|
||||||
|
|
||||||
Ruleset rulesetInstance;
|
Ruleset rulesetInstance;
|
||||||
@ -115,11 +127,19 @@ namespace osu.Game.Screens.Play
|
|||||||
}
|
}
|
||||||
|
|
||||||
sourceClock = (IAdjustableClock)track ?? new StopwatchClock();
|
sourceClock = (IAdjustableClock)track ?? new StopwatchClock();
|
||||||
interpolatedSourceClock = new InterpolatingFramedClock(sourceClock);
|
offsetClock = new OffsetClock(sourceClock);
|
||||||
|
|
||||||
|
userAudioOffset = config.GetBindable<double>(OsuConfig.AudioOffset);
|
||||||
|
userAudioOffset.ValueChanged += v => offsetClock.Offset = v;
|
||||||
|
userAudioOffset.TriggerChange();
|
||||||
|
|
||||||
|
interpolatedSourceClock = new InterpolatingFramedClock(offsetClock);
|
||||||
|
|
||||||
Schedule(() =>
|
Schedule(() =>
|
||||||
{
|
{
|
||||||
sourceClock.Reset();
|
sourceClock.Reset();
|
||||||
|
foreach (var mod in Beatmap.Mods.Value.OfType<IApplicableToClock>())
|
||||||
|
mod.ApplyToClock(sourceClock);
|
||||||
});
|
});
|
||||||
|
|
||||||
scoreProcessor = HitRenderer.CreateScoreProcessor();
|
scoreProcessor = HitRenderer.CreateScoreProcessor();
|
||||||
@ -296,11 +316,11 @@ namespace osu.Game.Screens.Play
|
|||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
|
|
||||||
(Background as BackgroundScreenBeatmap)?.BlurTo(Vector2.Zero, 1500, EasingTypes.OutQuint);
|
(Background as BackgroundScreenBeatmap)?.BlurTo(Vector2.Zero, 1500, EasingTypes.OutQuint);
|
||||||
Background?.FadeTo((100f - dimLevel) / 100, 1500, EasingTypes.OutQuint);
|
Background?.FadeTo(1 - (float)dimLevel, 1500, EasingTypes.OutQuint);
|
||||||
|
|
||||||
Content.Alpha = 0;
|
Content.Alpha = 0;
|
||||||
|
|
||||||
dimLevel.ValueChanged += newDim => Background?.FadeTo((100f - newDim) / 100, 800);
|
dimLevel.ValueChanged += newDim => Background?.FadeTo(1 - (float)newDim, 800);
|
||||||
|
|
||||||
Content.ScaleTo(0.7f);
|
Content.ScaleTo(0.7f);
|
||||||
|
|
||||||
@ -360,8 +380,6 @@ namespace osu.Game.Screens.Play
|
|||||||
Background?.FadeTo(1f, fade_out_duration);
|
Background?.FadeTo(1f, fade_out_duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bindable<bool> mouseWheelDisabled;
|
|
||||||
|
|
||||||
protected override bool OnWheel(InputState state) => mouseWheelDisabled.Value && !IsPaused;
|
protected override bool OnWheel(InputState state) => mouseWheelDisabled.Value && !IsPaused;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,6 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
{
|
{
|
||||||
base.Update();
|
|
||||||
|
|
||||||
if (parentClock == null) return;
|
if (parentClock == null) return;
|
||||||
|
|
||||||
clock.Rate = parentClock.Rate;
|
clock.Rate = parentClock.Rate;
|
||||||
|
@ -27,6 +27,8 @@ namespace osu.Game.Screens.Play
|
|||||||
private bool showOverlays = true;
|
private bool showOverlays = true;
|
||||||
internal override bool ShowOverlays => showOverlays;
|
internal override bool ShowOverlays => showOverlays;
|
||||||
|
|
||||||
|
internal override bool AllowRulesetChange => false;
|
||||||
|
|
||||||
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap);
|
protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap);
|
||||||
|
|
||||||
public PlayerLoader(Player player)
|
public PlayerLoader(Player player)
|
||||||
|
@ -31,6 +31,8 @@ namespace osu.Game.Screens.Ranking
|
|||||||
|
|
||||||
private ResultModeTabControl modeChangeButtons;
|
private ResultModeTabControl modeChangeButtons;
|
||||||
|
|
||||||
|
internal override bool AllowRulesetChange => false;
|
||||||
|
|
||||||
private Container currentPage;
|
private Container currentPage;
|
||||||
|
|
||||||
private static readonly Vector2 background_blur = new Vector2(20);
|
private static readonly Vector2 background_blur = new Vector2(20);
|
||||||
|
@ -7,12 +7,15 @@ using osu.Framework.Screens;
|
|||||||
using osu.Framework.Graphics;
|
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.UserInterface;
|
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Screens.Backgrounds;
|
using osu.Game.Screens.Backgrounds;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Audio;
|
||||||
|
using osu.Game.Graphics;
|
||||||
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
|
||||||
namespace osu.Game.Screens
|
namespace osu.Game.Screens
|
||||||
{
|
{
|
||||||
@ -24,8 +27,8 @@ namespace osu.Game.Screens
|
|||||||
|
|
||||||
protected virtual IEnumerable<Type> PossibleChildren => null;
|
protected virtual IEnumerable<Type> PossibleChildren => null;
|
||||||
|
|
||||||
private readonly Container textContainer;
|
private readonly FillFlowContainer textContainer;
|
||||||
private readonly Box box;
|
private readonly Container boxContainer;
|
||||||
|
|
||||||
protected override BackgroundScreen CreateBackground() => new BackgroundScreenCustom(@"Backgrounds/bg2");
|
protected override BackgroundScreen CreateBackground() => new BackgroundScreenCustom(@"Backgrounds/bg2");
|
||||||
|
|
||||||
@ -40,13 +43,13 @@ namespace osu.Game.Screens
|
|||||||
Content.Alpha = 0;
|
Content.Alpha = 0;
|
||||||
textContainer.Position = new Vector2(DrawSize.X / 16, 0);
|
textContainer.Position = new Vector2(DrawSize.X / 16, 0);
|
||||||
|
|
||||||
box.ScaleTo(0.2f);
|
boxContainer.ScaleTo(0.2f);
|
||||||
box.RotateTo(-20);
|
boxContainer.RotateTo(-20);
|
||||||
|
|
||||||
Content.Delay(300, true);
|
Content.Delay(300, true);
|
||||||
|
|
||||||
box.ScaleTo(1, transition_time, EasingTypes.OutElastic);
|
boxContainer.ScaleTo(1, transition_time, EasingTypes.OutElastic);
|
||||||
box.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
|
boxContainer.RotateTo(0, transition_time / 2, EasingTypes.OutQuint);
|
||||||
|
|
||||||
textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
|
textContainer.MoveTo(Vector2.Zero, transition_time, EasingTypes.OutExpo);
|
||||||
Content.FadeIn(transition_time, EasingTypes.OutExpo);
|
Content.FadeIn(transition_time, EasingTypes.OutExpo);
|
||||||
@ -82,36 +85,62 @@ namespace osu.Game.Screens
|
|||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
box = new Box
|
boxContainer = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
|
||||||
Size = new Vector2(0.3f),
|
Size = new Vector2(0.3f),
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
CornerRadius = 20,
|
||||||
|
Masking = true,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
|
||||||
Colour = getColourFor(GetType()),
|
Colour = getColourFor(GetType()),
|
||||||
Alpha = 1,
|
Alpha = 0.2f,
|
||||||
BlendingMode = BlendingMode.Additive,
|
BlendingMode = BlendingMode.Additive,
|
||||||
},
|
},
|
||||||
textContainer = new Container
|
textContainer = new FillFlowContainer
|
||||||
{
|
{
|
||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
|
Direction = FillDirection.Vertical,
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
new OsuSpriteText
|
new TextAwesome
|
||||||
{
|
{
|
||||||
Text = GetType().Name,
|
Icon = FontAwesome.fa_universal_access,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.TopCentre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.TopCentre,
|
||||||
TextSize = 50,
|
TextSize = 50,
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Text = GetType().Namespace,
|
Text = GetType().Name,
|
||||||
Anchor = Anchor.Centre,
|
Colour = getColourFor(GetType()).Lighten(0.8f),
|
||||||
Origin = Anchor.Centre,
|
Anchor = Anchor.TopCentre,
|
||||||
Position = new Vector2(0, 30)
|
Origin = Anchor.TopCentre,
|
||||||
|
TextSize = 50,
|
||||||
|
},
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = "is not yet ready for use!",
|
||||||
|
TextSize = 20,
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
},
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Text = "please check back a bit later.",
|
||||||
|
TextSize = 14,
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
|
},
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -120,17 +149,15 @@ namespace osu.Game.Screens
|
|||||||
Anchor = Anchor.BottomLeft,
|
Anchor = Anchor.BottomLeft,
|
||||||
Origin = Anchor.BottomLeft,
|
Origin = Anchor.BottomLeft,
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
Action = delegate {
|
Action = Exit
|
||||||
Exit();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
childModeButtons = new FillFlowContainer
|
childModeButtons = new FillFlowContainer
|
||||||
{
|
{
|
||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
Anchor = Anchor.TopRight,
|
Anchor = Anchor.TopRight,
|
||||||
Origin = Anchor.TopRight,
|
Origin = Anchor.TopRight,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Y,
|
||||||
Size = new Vector2(0.1f, 1)
|
Size = new Vector2(TwoLayerButton.SIZE_RETRACTED.X, 1)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -138,14 +165,11 @@ namespace osu.Game.Screens
|
|||||||
{
|
{
|
||||||
foreach (Type t in PossibleChildren)
|
foreach (Type t in PossibleChildren)
|
||||||
{
|
{
|
||||||
childModeButtons.Add(new Button
|
childModeButtons.Add(new ChildModeButton
|
||||||
{
|
{
|
||||||
Text = $@"{t.Name}",
|
Text = $@"{t.Name}",
|
||||||
RelativeSizeAxes = Axes.X,
|
|
||||||
Size = new Vector2(1, 40),
|
|
||||||
Anchor = Anchor.BottomRight,
|
|
||||||
Origin = Anchor.BottomRight,
|
|
||||||
BackgroundColour = getColourFor(t),
|
BackgroundColour = getColourFor(t),
|
||||||
|
HoverColour = getColourFor(t).Lighten(0.2f),
|
||||||
Action = delegate
|
Action = delegate
|
||||||
{
|
{
|
||||||
Push(Activator.CreateInstance(t) as Screen);
|
Push(Activator.CreateInstance(t) as Screen);
|
||||||
@ -163,5 +187,21 @@ namespace osu.Game.Screens
|
|||||||
byte b = (byte)MathHelper.Clamp((hash & 0x0000FF) * 0.8f, 20, 255);
|
byte b = (byte)MathHelper.Clamp((hash & 0x0000FF) * 0.8f, 20, 255);
|
||||||
return new Color4(r, g, b, 255);
|
return new Color4(r, g, b, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ChildModeButton : TwoLayerButton
|
||||||
|
{
|
||||||
|
public ChildModeButton()
|
||||||
|
{
|
||||||
|
Icon = FontAwesome.fa_osu_right_o;
|
||||||
|
Anchor = Anchor.BottomRight;
|
||||||
|
Origin = Anchor.BottomRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load(AudioManager audio)
|
||||||
|
{
|
||||||
|
ActivationSound = audio.Sample.Get(@"Menu/menuhit");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
beatmap = value;
|
beatmap = value;
|
||||||
Leaderboard.Beatmap = beatmap?.BeatmapInfo;
|
Leaderboard.Beatmap = beatmap?.BeatmapInfo;
|
||||||
Details.Beatmap = beatmap?.Beatmap.BeatmapInfo;
|
Details.Beatmap = beatmap?.BeatmapInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,14 +66,14 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
Details = new BeatmapDetails
|
Details = new BeatmapDetails
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.X,
|
||||||
Padding = new MarginPadding(5),
|
Masking = true,
|
||||||
|
Height = 352,
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
},
|
},
|
||||||
Leaderboard = new Leaderboard
|
Leaderboard = new Leaderboard
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
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.Game.Configuration;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
|
||||||
@ -21,15 +23,22 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
public Action<BeatmapDetailTab, bool> OnFilter; //passed the selected tab and if mods is checked
|
public Action<BeatmapDetailTab, bool> OnFilter; //passed the selected tab and if mods is checked
|
||||||
|
|
||||||
|
private Bindable<BeatmapDetailTab> selectedTab;
|
||||||
|
|
||||||
private void invokeOnFilter()
|
private void invokeOnFilter()
|
||||||
{
|
{
|
||||||
OnFilter?.Invoke(tabs.Current, modsCheckbox.Current);
|
OnFilter?.Invoke(tabs.Current, modsCheckbox.Current);
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colour)
|
private void load(OsuColour colour, OsuConfigManager config)
|
||||||
{
|
{
|
||||||
modsCheckbox.AccentColour = tabs.AccentColour = colour.YellowLight;
|
modsCheckbox.AccentColour = tabs.AccentColour = colour.YellowLight;
|
||||||
|
|
||||||
|
selectedTab = config.GetBindable<BeatmapDetailTab>(OsuConfig.BeatmapDetailTab);
|
||||||
|
|
||||||
|
tabs.Current.BindTo(selectedTab);
|
||||||
|
tabs.Current.TriggerChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BeatmapDetailAreaTabControl()
|
public BeatmapDetailAreaTabControl()
|
||||||
@ -62,8 +71,6 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
tabs.Current.ValueChanged += item => invokeOnFilter();
|
tabs.Current.ValueChanged += item => invokeOnFilter();
|
||||||
modsCheckbox.Current.ValueChanged += item => invokeOnFilter();
|
modsCheckbox.Current.ValueChanged += item => invokeOnFilter();
|
||||||
|
|
||||||
tabs.Current.Value = BeatmapDetailTab.Global;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,9 @@ using osu.Game.Graphics.Sprites;
|
|||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Online.API.Requests;
|
||||||
|
using osu.Framework.Threading;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select
|
namespace osu.Game.Screens.Select
|
||||||
{
|
{
|
||||||
@ -39,16 +42,23 @@ namespace osu.Game.Screens.Select
|
|||||||
private readonly BarGraph retryGraph;
|
private readonly BarGraph retryGraph;
|
||||||
private readonly BarGraph failGraph;
|
private readonly BarGraph failGraph;
|
||||||
|
|
||||||
|
private ScheduledDelegate pendingBeatmapSwitch;
|
||||||
private BeatmapInfo beatmap;
|
private BeatmapInfo beatmap;
|
||||||
|
|
||||||
public BeatmapInfo Beatmap
|
public BeatmapInfo Beatmap
|
||||||
{
|
{
|
||||||
get
|
get { return beatmap; }
|
||||||
{
|
|
||||||
return beatmap;
|
|
||||||
}
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
beatmap = value;
|
beatmap = value;
|
||||||
|
|
||||||
|
pendingBeatmapSwitch?.Cancel();
|
||||||
|
pendingBeatmapSwitch = Schedule(updateStats);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateStats()
|
||||||
|
{
|
||||||
if (beatmap == null) return;
|
if (beatmap == null) return;
|
||||||
|
|
||||||
description.Text = beatmap.Version;
|
description.Text = beatmap.Version;
|
||||||
@ -61,9 +71,40 @@ namespace osu.Game.Screens.Select
|
|||||||
approachRate.Value = beatmap.Difficulty.ApproachRate;
|
approachRate.Value = beatmap.Difficulty.ApproachRate;
|
||||||
stars.Value = (float)beatmap.StarDifficulty;
|
stars.Value = (float)beatmap.StarDifficulty;
|
||||||
|
|
||||||
if (beatmap.Metrics?.Ratings.Any() ?? false)
|
var requestedBeatmap = beatmap;
|
||||||
|
if (requestedBeatmap.Metrics == null)
|
||||||
{
|
{
|
||||||
var ratings = beatmap.Metrics.Ratings.ToList();
|
var lookup = new GetBeatmapDetailsRequest(requestedBeatmap);
|
||||||
|
lookup.Success += res =>
|
||||||
|
{
|
||||||
|
if (beatmap != requestedBeatmap)
|
||||||
|
//the beatmap has been changed since we started the lookup.
|
||||||
|
return;
|
||||||
|
|
||||||
|
requestedBeatmap.Metrics = res;
|
||||||
|
Schedule(() => updateMetrics(res));
|
||||||
|
};
|
||||||
|
lookup.Failure += e => updateMetrics(null);
|
||||||
|
|
||||||
|
api.Queue(lookup);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMetrics(requestedBeatmap.Metrics, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update displayed metrics.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="metrics">New metrics to overwrite the existing display. Can be null.</param>
|
||||||
|
/// <param name="failOnMissing">Whether to hide the display on null or empty metrics. If false, we will dim as if waiting for further updates.</param>
|
||||||
|
private void updateMetrics(BeatmapMetrics metrics, bool failOnMissing = true)
|
||||||
|
{
|
||||||
|
var hasRatings = metrics?.Ratings.Any() ?? false;
|
||||||
|
var hasRetriesFails = (metrics?.Retries.Any() ?? false) && metrics.Fails.Any();
|
||||||
|
|
||||||
|
if (hasRatings)
|
||||||
|
{
|
||||||
|
var ratings = metrics.Ratings.ToList();
|
||||||
ratingsContainer.Show();
|
ratingsContainer.Show();
|
||||||
|
|
||||||
negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2).Sum().ToString();
|
negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2).Sum().ToString();
|
||||||
@ -71,14 +112,18 @@ namespace osu.Game.Screens.Select
|
|||||||
ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2).Sum() / ratings.Sum();
|
ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2).Sum() / ratings.Sum();
|
||||||
|
|
||||||
ratingsGraph.Values = ratings.Select(rating => (float)rating);
|
ratingsGraph.Values = ratings.Select(rating => (float)rating);
|
||||||
}
|
|
||||||
else
|
|
||||||
ratingsContainer.Hide();
|
|
||||||
|
|
||||||
if ((beatmap.Metrics?.Retries.Any() ?? false) && beatmap.Metrics.Fails.Any())
|
ratingsContainer.FadeColour(Color4.White, 500, EasingTypes.Out);
|
||||||
|
}
|
||||||
|
else if (failOnMissing)
|
||||||
|
ratingsGraph.Values = new float[10];
|
||||||
|
else
|
||||||
|
ratingsContainer.FadeColour(Color4.Gray, 500, EasingTypes.Out);
|
||||||
|
|
||||||
|
if (hasRetriesFails)
|
||||||
{
|
{
|
||||||
var retries = beatmap.Metrics.Retries;
|
var retries = metrics.Retries;
|
||||||
var fails = beatmap.Metrics.Fails;
|
var fails = metrics.Fails;
|
||||||
retryFailContainer.Show();
|
retryFailContainer.Show();
|
||||||
|
|
||||||
float maxValue = fails.Zip(retries, (fail, retry) => fail + retry).Max();
|
float maxValue = fails.Zip(retries, (fail, retry) => fail + retry).Max();
|
||||||
@ -87,10 +132,16 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
failGraph.Values = fails.Select(fail => (float)fail);
|
failGraph.Values = fails.Select(fail => (float)fail);
|
||||||
retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
|
retryGraph.Values = retries.Zip(fails, (retry, fail) => retry + MathHelper.Clamp(fail, 0, maxValue));
|
||||||
|
|
||||||
|
retryFailContainer.FadeColour(Color4.White, 500, EasingTypes.Out);
|
||||||
|
}
|
||||||
|
else if (failOnMissing)
|
||||||
|
{
|
||||||
|
failGraph.Values = new float[100];
|
||||||
|
retryGraph.Values = new float[100];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
retryFailContainer.Hide();
|
retryFailContainer.FadeColour(Color4.Gray, 500, EasingTypes.Out);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BeatmapDetails()
|
public BeatmapDetails()
|
||||||
@ -113,7 +164,6 @@ namespace osu.Game.Screens.Select
|
|||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
LayoutDuration = 200,
|
LayoutDuration = 200,
|
||||||
LayoutEasing = EasingTypes.OutQuint,
|
LayoutEasing = EasingTypes.OutQuint,
|
||||||
Padding = new MarginPadding(10) { Top = 25 },
|
|
||||||
Children = new []
|
Children = new []
|
||||||
{
|
{
|
||||||
description = new MetadataSegment("Description"),
|
description = new MetadataSegment("Description"),
|
||||||
@ -148,8 +198,8 @@ namespace osu.Game.Screens.Select
|
|||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
Spacing = new Vector2(0,10),
|
Spacing = new Vector2(0,5),
|
||||||
Padding = new MarginPadding(15) { Top = 25 },
|
Padding = new MarginPadding(10),
|
||||||
Children = new []
|
Children = new []
|
||||||
{
|
{
|
||||||
circleSize = new DifficultyRow("Circle Size", 7),
|
circleSize = new DifficultyRow("Circle Size", 7),
|
||||||
@ -252,7 +302,7 @@ namespace osu.Game.Screens.Select
|
|||||||
new Container<BarGraph>
|
new Container<BarGraph>
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
Size = new Vector2(1/0.6f, 50),
|
Size = new Vector2(1 / 0.6f, 50),
|
||||||
Children = new[]
|
Children = new[]
|
||||||
{
|
{
|
||||||
retryGraph = new BarGraph
|
retryGraph = new BarGraph
|
||||||
@ -272,9 +322,13 @@ namespace osu.Game.Screens.Select
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private APIAccess api;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colour)
|
private void load(OsuColour colour, APIAccess api)
|
||||||
{
|
{
|
||||||
|
this.api = api;
|
||||||
|
|
||||||
description.AccentColour = colour.GrayB;
|
description.AccentColour = colour.GrayB;
|
||||||
source.AccentColour = colour.GrayB;
|
source.AccentColour = colour.GrayB;
|
||||||
tags.AccentColour = colour.YellowLight;
|
tags.AccentColour = colour.YellowLight;
|
||||||
@ -308,7 +362,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
difficultyValue = value;
|
difficultyValue = value;
|
||||||
bar.Length = value / maxValue;
|
bar.Length = value / maxValue;
|
||||||
valueText.Text = value.ToString(CultureInfo.InvariantCulture);
|
valueText.Text = value.ToString("N1", CultureInfo.CurrentCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Colour;
|
using osu.Framework.Graphics.Colour;
|
||||||
@ -148,11 +149,16 @@ namespace osu.Game.Screens.Select
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// Text for beatmap info
|
new DifficultyColourBar(beatmap.BeatmapInfo)
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Y,
|
||||||
|
Width = 20,
|
||||||
|
},
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
Anchor = Anchor.BottomLeft,
|
Name = "Top-aligned metadata",
|
||||||
Origin = Anchor.BottomLeft,
|
Anchor = Anchor.TopLeft,
|
||||||
|
Origin = Anchor.TopLeft,
|
||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
Margin = new MarginPadding { Top = 10, Left = 25, Right = 10, Bottom = 20 },
|
Margin = new MarginPadding { Top = 10, Left = 25, Right = 10, Bottom = 20 },
|
||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
@ -161,16 +167,32 @@ namespace osu.Game.Screens.Select
|
|||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Font = @"Exo2.0-MediumItalic",
|
Font = @"Exo2.0-MediumItalic",
|
||||||
Text = metadata.Artist + " -- " + metadata.Title,
|
Text = beatmapInfo.Version,
|
||||||
|
TextSize = 24,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new FillFlowContainer
|
||||||
|
{
|
||||||
|
Name = "Bottom-aligned metadata",
|
||||||
|
Anchor = Anchor.BottomLeft,
|
||||||
|
Origin = Anchor.BottomLeft,
|
||||||
|
Direction = FillDirection.Vertical,
|
||||||
|
Margin = new MarginPadding { Top = 15, Left = 25, Right = 10, Bottom = 20 },
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new OsuSpriteText
|
||||||
|
{
|
||||||
|
Font = @"Exo2.0-MediumItalic",
|
||||||
|
Text = !string.IsNullOrEmpty(metadata.Source) ? metadata.Source + " — " + metadata.Title : metadata.Title,
|
||||||
TextSize = 28,
|
TextSize = 28,
|
||||||
Shadow = true,
|
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Font = @"Exo2.0-MediumItalic",
|
Font = @"Exo2.0-MediumItalic",
|
||||||
Text = beatmapInfo.Version,
|
Text = metadata.Artist,
|
||||||
TextSize = 17,
|
TextSize = 17,
|
||||||
Shadow = true,
|
|
||||||
},
|
},
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
@ -184,20 +206,18 @@ namespace osu.Game.Screens.Select
|
|||||||
Font = @"Exo2.0-Medium",
|
Font = @"Exo2.0-Medium",
|
||||||
Text = "mapped by ",
|
Text = "mapped by ",
|
||||||
TextSize = 15,
|
TextSize = 15,
|
||||||
Shadow = true,
|
|
||||||
},
|
},
|
||||||
new OsuSpriteText
|
new OsuSpriteText
|
||||||
{
|
{
|
||||||
Font = @"Exo2.0-Bold",
|
Font = @"Exo2.0-Bold",
|
||||||
Text = metadata.Author,
|
Text = metadata.Author,
|
||||||
TextSize = 15,
|
TextSize = 15,
|
||||||
Shadow = true,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
Margin = new MarginPadding { Top = 20 },
|
Margin = new MarginPadding { Top = 20, Left = 10 },
|
||||||
Spacing = new Vector2(40, 0),
|
Spacing = new Vector2(40, 0),
|
||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Children = labels
|
Children = labels
|
||||||
@ -256,5 +276,37 @@ namespace osu.Game.Screens.Select
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class DifficultyColourBar : DifficultyColouredContainer
|
||||||
|
{
|
||||||
|
public DifficultyColourBar(BeatmapInfo beatmap) : base(beatmap)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
const float full_opacity_ratio = 0.7f;
|
||||||
|
|
||||||
|
Children = new Drawable[]
|
||||||
|
{
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Colour = AccentColour,
|
||||||
|
Width = full_opacity_ratio,
|
||||||
|
},
|
||||||
|
new Box
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
RelativePositionAxes = Axes.Both,
|
||||||
|
Colour = AccentColour,
|
||||||
|
Alpha = 0.5f,
|
||||||
|
X = full_opacity_ratio,
|
||||||
|
Width = 1 - full_opacity_ratio,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Threading;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Rulesets.Scoring;
|
using osu.Game.Rulesets.Scoring;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
@ -93,13 +94,18 @@ namespace osu.Game.Screens.Select.Leaderboards
|
|||||||
|
|
||||||
private BeatmapInfo beatmap;
|
private BeatmapInfo beatmap;
|
||||||
|
|
||||||
|
private ScheduledDelegate pendingBeatmapSwitch;
|
||||||
|
|
||||||
public BeatmapInfo Beatmap
|
public BeatmapInfo Beatmap
|
||||||
{
|
{
|
||||||
get { return beatmap; }
|
get { return beatmap; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
beatmap = value;
|
beatmap = value;
|
||||||
Schedule(updateScores);
|
Scores = null;
|
||||||
|
|
||||||
|
pendingBeatmapSwitch?.Cancel();
|
||||||
|
pendingBeatmapSwitch = Schedule(updateScores);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,19 +109,35 @@
|
|||||||
<Compile Include="IO\Serialization\IJsonSerializable.cs" />
|
<Compile Include="IO\Serialization\IJsonSerializable.cs" />
|
||||||
<Compile Include="IPC\ScoreIPCChannel.cs" />
|
<Compile Include="IPC\ScoreIPCChannel.cs" />
|
||||||
<Compile Include="Rulesets\BeatmapStatistic.cs" />
|
<Compile Include="Rulesets\BeatmapStatistic.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Catch\Hit.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Catch\ConvertHit.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Catch\HitObjectParser.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Catch\ConvertHitObjectParser.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Catch\Slider.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Catch\ConvertSlider.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Catch\Spinner.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Catch\ConvertSpinner.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Mania\Hit.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\ConvertSlider.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Mania\HitObjectParser.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Mania\ConvertHit.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Mania\Slider.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Mania\ConvertHitObjectParser.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Mania\Spinner.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Mania\ConvertSlider.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Osu\HitObjectParser.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Mania\ConvertSpinner.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Taiko\Hit.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Osu\ConvertHitObjectParser.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Taiko\HitObjectParser.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Taiko\ConvertHit.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Taiko\Slider.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Taiko\ConvertHitObjectParser.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Taiko\Spinner.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Taiko\ConvertSlider.cs" />
|
||||||
|
<Compile Include="Rulesets\Objects\Legacy\Taiko\ConvertSpinner.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\IApplicableToClock.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModAutoplay.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModCinema.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModDoubleTime.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModEasy.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModFlashlight.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModHalfTime.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModHardRock.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModHidden.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModNightcore.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModNoFail.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModPerfect.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModRelax.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\ModSuddenDeath.cs" />
|
||||||
|
<Compile Include="Rulesets\Mods\MultiMod.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Types\IHasXPosition.cs" />
|
<Compile Include="Rulesets\Objects\Types\IHasXPosition.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Types\IHasYPosition.cs" />
|
<Compile Include="Rulesets\Objects\Types\IHasYPosition.cs" />
|
||||||
<Compile Include="Rulesets\Replays\Replay.cs" />
|
<Compile Include="Rulesets\Replays\Replay.cs" />
|
||||||
@ -134,12 +150,11 @@
|
|||||||
<Compile Include="Rulesets\Objects\Drawables\HitResult.cs" />
|
<Compile Include="Rulesets\Objects\Drawables\HitResult.cs" />
|
||||||
<Compile Include="Rulesets\Objects\BezierApproximator.cs" />
|
<Compile Include="Rulesets\Objects\BezierApproximator.cs" />
|
||||||
<Compile Include="Rulesets\Objects\CircularArcApproximator.cs" />
|
<Compile Include="Rulesets\Objects\CircularArcApproximator.cs" />
|
||||||
<Compile Include="Rulesets\Objects\CurvedHitObject.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Osu\ConvertHit.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Osu\Hit.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\ConvertHitObjectParser.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\HitObjectParser.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\ConvertHold.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Hold.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Osu\ConvertSlider.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Osu\Slider.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\Osu\ConvertSpinner.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\Osu\Spinner.cs" />
|
|
||||||
<Compile Include="Rulesets\Objects\SliderCurve.cs" />
|
<Compile Include="Rulesets\Objects\SliderCurve.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Types\CurveType.cs" />
|
<Compile Include="Rulesets\Objects\Types\CurveType.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Drawables\IDrawableHitObjectWithProxiedApproach.cs" />
|
<Compile Include="Rulesets\Objects\Drawables\IDrawableHitObjectWithProxiedApproach.cs" />
|
||||||
@ -152,7 +167,7 @@
|
|||||||
<Compile Include="Rulesets\Objects\Types\IHasRepeats.cs" />
|
<Compile Include="Rulesets\Objects\Types\IHasRepeats.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Types\IHasPosition.cs" />
|
<Compile Include="Rulesets\Objects\Types\IHasPosition.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Types\IHasHold.cs" />
|
<Compile Include="Rulesets\Objects\Types\IHasHold.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Legacy\HitObjectType.cs" />
|
<Compile Include="Rulesets\Objects\Legacy\ConvertHitObjectType.cs" />
|
||||||
<Compile Include="Rulesets\Replays\ReplayButtonState.cs" />
|
<Compile Include="Rulesets\Replays\ReplayButtonState.cs" />
|
||||||
<Compile Include="Rulesets\Replays\ReplayFrame.cs" />
|
<Compile Include="Rulesets\Replays\ReplayFrame.cs" />
|
||||||
<Compile Include="Database\RulesetDatabase.cs" />
|
<Compile Include="Database\RulesetDatabase.cs" />
|
||||||
@ -164,6 +179,7 @@
|
|||||||
<Compile Include="Rulesets\UI\StandardHudOverlay.cs" />
|
<Compile Include="Rulesets\UI\StandardHudOverlay.cs" />
|
||||||
<Compile Include="Online\API\IOnlineComponent.cs" />
|
<Compile Include="Online\API\IOnlineComponent.cs" />
|
||||||
<Compile Include="Online\API\Requests\GetScoresRequest.cs" />
|
<Compile Include="Online\API\Requests\GetScoresRequest.cs" />
|
||||||
|
<Compile Include="Online\API\Requests\GetBeatmapDetailsRequest.cs" />
|
||||||
<Compile Include="Online\API\Requests\GetUserRequest.cs" />
|
<Compile Include="Online\API\Requests\GetUserRequest.cs" />
|
||||||
<Compile Include="Overlays\DragBar.cs" />
|
<Compile Include="Overlays\DragBar.cs" />
|
||||||
<Compile Include="Overlays\LoginOverlay.cs" />
|
<Compile Include="Overlays\LoginOverlay.cs" />
|
||||||
@ -172,6 +188,7 @@
|
|||||||
<Compile Include="Beatmaps\WorkingBeatmap.cs" />
|
<Compile Include="Beatmaps\WorkingBeatmap.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\BeatmapSetHeader.cs" />
|
<Compile Include="Beatmaps\Drawables\BeatmapSetHeader.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\DifficultyIcon.cs" />
|
<Compile Include="Beatmaps\Drawables\DifficultyIcon.cs" />
|
||||||
|
<Compile Include="Beatmaps\Drawables\DifficultyColouredContainer.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\Panel.cs" />
|
<Compile Include="Beatmaps\Drawables\Panel.cs" />
|
||||||
<Compile Include="Rulesets\Objects\Drawables\DrawableHitObject.cs" />
|
<Compile Include="Rulesets\Objects\Drawables\DrawableHitObject.cs" />
|
||||||
<Compile Include="Rulesets\Objects\HitObject.cs" />
|
<Compile Include="Rulesets\Objects\HitObject.cs" />
|
||||||
|
Reference in New Issue
Block a user