mirror of
https://github.com/osukey/osukey.git
synced 2025-08-03 22:56:36 +09:00
Merge remote-tracking branch 'refs/remotes/peppy/lets-play'
This commit is contained in:
@ -17,7 +17,6 @@ namespace osu.Desktop.Platform
|
||||
|
||||
public override SQLiteConnection GetDatabase(string name)
|
||||
{
|
||||
Directory.CreateDirectory(BasePath);
|
||||
ISQLitePlatform platform;
|
||||
if (RuntimeInfo.IsWindows)
|
||||
platform = new SQLitePlatformWin32();
|
||||
|
@ -1,31 +1,96 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using OpenTK;
|
||||
using osu.Framework.GameModes.Testing;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Threading;
|
||||
using osu.Game;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using osu.Framework.Graphics.Sprites;
|
||||
using osu.Game.Online.Chat.Display;
|
||||
using osu.Framework;
|
||||
using osu.Desktop.Platform;
|
||||
using osu.Game.Database;
|
||||
using osu.Game.GameModes.Play;
|
||||
using SQLiteNetExtensions.Extensions;
|
||||
using osu.Framework;
|
||||
using osu.Game;
|
||||
|
||||
namespace osu.Desktop.Tests
|
||||
{
|
||||
class TestCasePlaySongSelect : TestCase
|
||||
{
|
||||
private BeatmapDatabase db;
|
||||
private TestStorage storage;
|
||||
|
||||
public override string Name => @"Song Select";
|
||||
public override string Description => @"Testing song selection UI";
|
||||
|
||||
public override string Description => @"with fake data";
|
||||
|
||||
public override void Reset()
|
||||
{
|
||||
base.Reset();
|
||||
Add(new PlaySongSelect());
|
||||
base.Reset();
|
||||
|
||||
if (db == null)
|
||||
{
|
||||
storage = new TestStorage(@"TestCasePlaySongSelect");
|
||||
db = new BeatmapDatabase(storage);
|
||||
|
||||
var sets = new List<BeatmapSetInfo>();
|
||||
|
||||
for (int i = 0; i < 100; i += 10)
|
||||
sets.Add(createTestBeatmapSet(i));
|
||||
|
||||
db.Import(sets);
|
||||
}
|
||||
|
||||
Add(new PlaySongSelect(db));
|
||||
}
|
||||
|
||||
private BeatmapSetInfo createTestBeatmapSet(int i)
|
||||
{
|
||||
return new BeatmapSetInfo
|
||||
{
|
||||
BeatmapSetID = 1234 + i,
|
||||
Hash = "d8e8fca2dc0f896fd7cb4cb0031ba249",
|
||||
Path = string.Empty,
|
||||
Metadata = new BeatmapMetadata
|
||||
{
|
||||
BeatmapSetID = 1234 + i,
|
||||
Artist = "MONACA",
|
||||
Title = "Black Song",
|
||||
Author = "Some Guy",
|
||||
},
|
||||
Beatmaps = new List<BeatmapInfo>(new[]
|
||||
{
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1234 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "normal.osu",
|
||||
Version = "Normal",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 3.5f,
|
||||
}
|
||||
},
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1235 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "hard.osu",
|
||||
Version = "Hard",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 5,
|
||||
}
|
||||
},
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1236 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "insane.osu",
|
||||
Version = "Insane",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 7,
|
||||
}
|
||||
},
|
||||
}),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -46,10 +46,11 @@ namespace osu.Desktop.VisualTests.Tests
|
||||
|
||||
Add(new Player()
|
||||
{
|
||||
Beatmap = new Beatmap
|
||||
{
|
||||
HitObjects = objects
|
||||
}
|
||||
Beatmap = new WorkingBeatmap(
|
||||
new Beatmap
|
||||
{
|
||||
HitObjects = objects
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -18,66 +18,9 @@ namespace osu.Desktop.VisualTests
|
||||
{
|
||||
class VisualTestGame : OsuGameBase
|
||||
{
|
||||
private void InsertTestMap(int i)
|
||||
{
|
||||
var beatmapSet = new BeatmapSetInfo
|
||||
{
|
||||
BeatmapSetID = 1234 + i,
|
||||
Hash = "d8e8fca2dc0f896fd7cb4cb0031ba249",
|
||||
Path = "/foo/bar/baz",
|
||||
Metadata = new BeatmapMetadata
|
||||
{
|
||||
BeatmapSetID = 1234 + i,
|
||||
Artist = "MONACA",
|
||||
Title = "Black Song",
|
||||
Author = "Some Guy",
|
||||
},
|
||||
Beatmaps = new List<BeatmapInfo>(new[]
|
||||
{
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1234 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "normal.osu",
|
||||
Version = "Normal",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 3.5f,
|
||||
}
|
||||
},
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1235 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "hard.osu",
|
||||
Version = "Hard",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 5,
|
||||
}
|
||||
},
|
||||
new BeatmapInfo
|
||||
{
|
||||
BeatmapID = 1236 + i,
|
||||
Mode = PlayMode.Osu,
|
||||
Path = "insane.osu",
|
||||
Version = "Insane",
|
||||
BaseDifficulty = new BaseDifficulty
|
||||
{
|
||||
OverallDifficulty = 7,
|
||||
}
|
||||
},
|
||||
}),
|
||||
};
|
||||
BeatmapDatabase.Connection.InsertWithChildren(beatmapSet, true);
|
||||
}
|
||||
|
||||
public override void Load(BaseGame game)
|
||||
{
|
||||
Host.Storage = new TestStorage(@"visual-tests");
|
||||
base.Load(game);
|
||||
for (int i = 0; i < 100; i += 10)
|
||||
InsertTestMap(i);
|
||||
Add(new TestBrowser());
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
||||
[TestFixture]
|
||||
public class OsuLegacyDecoderTest
|
||||
{
|
||||
[TestFixtureSetUp]
|
||||
[OneTimeSetUpAttribute]
|
||||
public void SetUp()
|
||||
{
|
||||
OsuLegacyDecoder.Register();
|
||||
|
@ -10,7 +10,7 @@ namespace osu.Game.Tests.Beatmaps.IO
|
||||
[TestFixture]
|
||||
public class OszArchiveReaderTest
|
||||
{
|
||||
[TestFixtureSetUp]
|
||||
[OneTimeSetUpAttribute]
|
||||
public void SetUp()
|
||||
{
|
||||
OszArchiveReader.Register();
|
||||
|
@ -1,7 +1,6 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenTK.Graphics;
|
||||
using osu.Game.Beatmaps.Objects;
|
||||
@ -13,6 +12,7 @@ namespace osu.Game.Beatmaps
|
||||
public class Beatmap
|
||||
{
|
||||
public BeatmapInfo BeatmapInfo { get; set; }
|
||||
public BeatmapMetadata Metadata => BeatmapInfo?.Metadata ?? BeatmapInfo?.BeatmapSet?.Metadata;
|
||||
public List<HitObject> HitObjects { get; set; }
|
||||
public List<ControlPoint> ControlPoints { get; set; }
|
||||
public List<Color4> ComboColors { get; set; }
|
||||
|
@ -2,24 +2,20 @@
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using osu.Framework;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Primitives;
|
||||
using osu.Framework.Input;
|
||||
using osu.Game.Database;
|
||||
using OpenTK;
|
||||
using OpenTK.Graphics;
|
||||
|
||||
namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
class BeatmapGroup : Container, IStateful<BeatmapGroupState>
|
||||
{
|
||||
private const float collapsedAlpha = 0.5f;
|
||||
private const float collapsedWidth = 0.8f;
|
||||
|
||||
private BeatmapPanel selectedPanel;
|
||||
public BeatmapPanel SelectedPanel;
|
||||
|
||||
/// <summary>
|
||||
/// Fires when one of our difficulties was selected. Will fire on first expand.
|
||||
@ -32,6 +28,8 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
|
||||
private BeatmapGroupState state;
|
||||
|
||||
public IEnumerable<BeatmapPanel> BeatmapPanels;
|
||||
|
||||
public BeatmapGroupState State
|
||||
{
|
||||
get { return state; }
|
||||
@ -44,23 +42,16 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
FadeTo(1, 250);
|
||||
difficulties.Show();
|
||||
|
||||
//todo: header should probably have a state, with this logic moved inside it.
|
||||
header.Width = 1;
|
||||
header.GlowRadius = 5;
|
||||
header.BorderColour = new Color4(header.BorderColour.R, header.BorderColour.G, header.BorderColour.B, 255);
|
||||
header.State = PanelSelectedState.Selected;
|
||||
|
||||
if (selectedPanel == null)
|
||||
(difficulties.Children.FirstOrDefault() as BeatmapPanel).Selected = true;
|
||||
SelectionChanged?.Invoke(this, selectedPanel?.Beatmap);
|
||||
if (SelectedPanel == null)
|
||||
((BeatmapPanel)difficulties.Children.FirstOrDefault()).State = PanelSelectedState.Selected;
|
||||
break;
|
||||
case BeatmapGroupState.Collapsed:
|
||||
FadeTo(collapsedAlpha, 250);
|
||||
difficulties.Hide();
|
||||
FadeTo(0.5f, 250);
|
||||
|
||||
//todo: header should probably have a state, with this logic moved inside it.
|
||||
header.Width = collapsedWidth;
|
||||
header.GlowRadius = 0;
|
||||
header.BorderColour = new Color4(header.BorderColour.R, header.BorderColour.G, header.BorderColour.B, 0);
|
||||
header.State = PanelSelectedState.NotSelected;
|
||||
difficulties.Hide();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -68,10 +59,22 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
|
||||
public BeatmapGroup(BeatmapSetInfo beatmapSet)
|
||||
{
|
||||
this.beatmapSet = beatmapSet;
|
||||
this.beatmapSet = beatmapSet;
|
||||
|
||||
Alpha = 0;
|
||||
AutoSizeAxes = Axes.Y;
|
||||
RelativeSizeAxes = Axes.X;
|
||||
RelativeSizeAxes = Axes.X;
|
||||
|
||||
BeatmapPanels = beatmapSet.Beatmaps.Select(b =>
|
||||
new BeatmapPanel(this.beatmapSet, b)
|
||||
{
|
||||
GainedSelection = panelGainedSelection,
|
||||
Anchor = Anchor.TopRight,
|
||||
Origin = Anchor.TopRight,
|
||||
RelativeSizeAxes = Axes.X,
|
||||
});
|
||||
|
||||
|
||||
Children = new[]
|
||||
{
|
||||
new FlowContainer
|
||||
@ -83,8 +86,8 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
header = new BeatmapSetHeader(beatmapSet)
|
||||
{
|
||||
GainedSelection = headerGainedSelection,
|
||||
RelativeSizeAxes = Axes.X,
|
||||
Width = collapsedWidth,
|
||||
Anchor = Anchor.TopRight,
|
||||
Origin = Anchor.TopRight,
|
||||
},
|
||||
@ -97,15 +100,7 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
Spacing = new Vector2(0, 5),
|
||||
Direction = FlowDirection.VerticalOnly,
|
||||
Alpha = 0,
|
||||
Children = this.beatmapSet.Beatmaps.Select(b =>
|
||||
new BeatmapPanel(this.beatmapSet, b)
|
||||
{
|
||||
GainedSelection = panelGainedSelection,
|
||||
Anchor = Anchor.TopRight,
|
||||
Origin = Anchor.TopRight,
|
||||
RelativeSizeAxes = Axes.X,
|
||||
}
|
||||
)
|
||||
Children = BeatmapPanels
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -118,18 +113,21 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
State = BeatmapGroupState.Collapsed;
|
||||
}
|
||||
|
||||
private void panelGainedSelection(BeatmapPanel panel)
|
||||
private void headerGainedSelection(BeatmapSetHeader panel)
|
||||
{
|
||||
if (selectedPanel != null) selectedPanel.Selected = false;
|
||||
selectedPanel = panel;
|
||||
|
||||
SelectionChanged?.Invoke(this, panel.Beatmap);
|
||||
State = BeatmapGroupState.Expanded;
|
||||
|
||||
SelectionChanged?.Invoke(this, SelectedPanel.Beatmap);
|
||||
}
|
||||
|
||||
protected override bool OnClick(InputState state)
|
||||
private void panelGainedSelection(BeatmapPanel panel)
|
||||
{
|
||||
State = BeatmapGroupState.Expanded;
|
||||
return true;
|
||||
|
||||
if (SelectedPanel != null) SelectedPanel.State = PanelSelectedState.NotSelected;
|
||||
SelectedPanel = panel;
|
||||
|
||||
SelectionChanged?.Invoke(this, panel.Beatmap);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@ using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Primitives;
|
||||
using osu.Framework.Graphics.Sprites;
|
||||
using osu.Framework.Input;
|
||||
using osu.Game.Database;
|
||||
using osu.Game.Graphics;
|
||||
using osu.Game.Graphics.UserInterface;
|
||||
@ -15,42 +14,23 @@ using OpenTK.Graphics;
|
||||
|
||||
namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
class BeatmapPanel : Container
|
||||
class BeatmapPanel : Panel
|
||||
{
|
||||
public BeatmapInfo Beatmap;
|
||||
|
||||
public Action<BeatmapPanel> GainedSelection;
|
||||
|
||||
private bool selected;
|
||||
|
||||
public bool Selected
|
||||
{
|
||||
get { return selected; }
|
||||
set
|
||||
{
|
||||
if (selected == value)
|
||||
return;
|
||||
selected = value;
|
||||
BorderColour = new Color4(
|
||||
BorderColour.R,
|
||||
BorderColour.G,
|
||||
BorderColour.B,
|
||||
selected ? 255 : 0);
|
||||
GlowRadius = selected ? 3 : 0;
|
||||
|
||||
if (selected) GainedSelection?.Invoke(this);
|
||||
}
|
||||
public Action<BeatmapPanel> GainedSelection;
|
||||
|
||||
protected override void Selected()
|
||||
{
|
||||
base.Selected();
|
||||
GainedSelection?.Invoke(this);
|
||||
}
|
||||
|
||||
public BeatmapPanel(BeatmapSetInfo set, BeatmapInfo beatmap)
|
||||
{
|
||||
Beatmap = beatmap;
|
||||
AutoSizeAxes = Axes.Y;
|
||||
Masking = true;
|
||||
CornerRadius = 5;
|
||||
BorderThickness = 2;
|
||||
BorderColour = new Color4(221, 255, 255, 0);
|
||||
GlowColour = new Color4(166, 221, 251, 0.75f); // TODO: Get actual color for this
|
||||
{
|
||||
Beatmap = beatmap;
|
||||
Height *= 0.75f;
|
||||
|
||||
Children = new Framework.Graphics.Drawable[]
|
||||
{
|
||||
new Box
|
||||
@ -87,8 +67,7 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
},
|
||||
new SpriteText
|
||||
{
|
||||
Text = string.Format(" mapped by {0}",
|
||||
(beatmap.Metadata ?? set.Metadata).Author),
|
||||
Text = $" mapped by {(beatmap.Metadata ?? set.Metadata).Author}",
|
||||
TextSize = 16,
|
||||
},
|
||||
}
|
||||
@ -99,12 +78,6 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected override bool OnClick(InputState state)
|
||||
{
|
||||
Selected = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Primitives;
|
||||
@ -12,35 +13,42 @@ using OpenTK.Graphics;
|
||||
|
||||
namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
class BeatmapSetHeader : Container
|
||||
class BeatmapSetHeader : Panel
|
||||
{
|
||||
public Action<BeatmapSetHeader> GainedSelection;
|
||||
|
||||
protected override void Selected()
|
||||
{
|
||||
base.Selected();
|
||||
|
||||
Width = 1;
|
||||
GainedSelection?.Invoke(this);
|
||||
}
|
||||
|
||||
protected override void Deselected()
|
||||
{
|
||||
base.Deselected();
|
||||
Width = 0.8f;
|
||||
}
|
||||
|
||||
public BeatmapSetHeader(BeatmapSetInfo beatmapSet)
|
||||
{
|
||||
AutoSizeAxes = Axes.Y;
|
||||
Masking = true;
|
||||
CornerRadius = 5;
|
||||
BorderThickness = 2;
|
||||
BorderColour = new Color4(221, 255, 255, 0);
|
||||
GlowColour = new Color4(166, 221, 251, 0.5f); // TODO: Get actual color for this
|
||||
Children = new Framework.Graphics.Drawable[]
|
||||
{
|
||||
new Box
|
||||
{
|
||||
Colour = new Color4(85, 85, 85, 255),
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
Size = Vector2.One,
|
||||
},
|
||||
new Container
|
||||
{
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
Size = Vector2.One,
|
||||
Children = new Framework.Graphics.Drawable[]
|
||||
{
|
||||
new Box // TODO: Gradient
|
||||
{
|
||||
Colour = new Color4(0, 0, 0, 100),
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
Size = Vector2.One,
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -48,7 +56,7 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
Direction = FlowDirection.VerticalOnly,
|
||||
Spacing = new Vector2(0, 2),
|
||||
Padding = new MarginPadding { Top = 3, Left = 20, Right = 20, Bottom = 3 },
|
||||
Padding = new MarginPadding { Top = 10, Left = 15, Right = 10, Bottom = 10 },
|
||||
AutoSizeAxes = Axes.Both,
|
||||
Children = new[]
|
||||
{
|
||||
@ -75,6 +83,8 @@ namespace osu.Game.Beatmaps.Drawable
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Deselected();
|
||||
}
|
||||
}
|
||||
}
|
81
osu.Game/Beatmaps/Drawable/Panel.cs
Normal file
81
osu.Game/Beatmaps/Drawable/Panel.cs
Normal file
@ -0,0 +1,81 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using osu.Framework;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Input;
|
||||
using OpenTK.Graphics;
|
||||
|
||||
namespace osu.Game.Beatmaps.Drawable
|
||||
{
|
||||
class Panel : Container, IStateful<PanelSelectedState>
|
||||
{
|
||||
public Panel()
|
||||
{
|
||||
Height = 80;
|
||||
|
||||
Masking = true;
|
||||
CornerRadius = 10;
|
||||
BorderColour = new Color4(221, 255, 255, 0);
|
||||
GlowColour = new Color4(102, 204, 255, 100);
|
||||
|
||||
RelativeSizeAxes = Axes.X;
|
||||
}
|
||||
|
||||
private PanelSelectedState state;
|
||||
|
||||
public PanelSelectedState State
|
||||
{
|
||||
get { return state; }
|
||||
|
||||
set
|
||||
{
|
||||
if (state == value) return;
|
||||
|
||||
state = value;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case PanelSelectedState.NotSelected:
|
||||
Deselected();
|
||||
break;
|
||||
case PanelSelectedState.Selected:
|
||||
Selected();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void Selected()
|
||||
{
|
||||
BorderColour = new Color4(BorderColour.R, BorderColour.G, BorderColour.B, 255);
|
||||
GlowRadius = 10;
|
||||
BorderThickness = 2.5f;
|
||||
}
|
||||
|
||||
protected virtual void Deselected()
|
||||
{
|
||||
BorderColour = new Color4(BorderColour.R, BorderColour.G, BorderColour.B, 0);
|
||||
GlowRadius = 0;
|
||||
BorderThickness = 0;
|
||||
}
|
||||
|
||||
protected override bool OnClick(InputState state)
|
||||
{
|
||||
State = PanelSelectedState.Selected;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
enum PanelSelectedState
|
||||
{
|
||||
NotSelected,
|
||||
Selected
|
||||
}
|
||||
}
|
@ -34,8 +34,8 @@ namespace osu.Game.Beatmaps.Objects.Catch.Drawable
|
||||
|
||||
Texture = game.Textures.Get(@"Menu/logo");
|
||||
|
||||
Transforms.Add(new TransformPosition(Clock) { StartTime = h.StartTime - 200, EndTime = h.StartTime, StartValue = new Vector2(h.Position, -0.1f), EndValue = new Vector2(h.Position, 0.9f) });
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Transforms.Add(new TransformPosition { StartTime = h.StartTime - 200, EndTime = h.StartTime, StartValue = new Vector2(h.Position, -0.1f), EndValue = new Vector2(h.Position, 0.9f) });
|
||||
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Expire(true);
|
||||
}
|
||||
}
|
||||
|
@ -25,8 +25,8 @@ namespace osu.Game.Beatmaps.Objects.Mania.Drawable
|
||||
base.Load(game);
|
||||
Texture = game.Textures.Get(@"Menu/logo");
|
||||
|
||||
Transforms.Add(new TransformPositionY(Clock) { StartTime = note.StartTime - 200, EndTime = note.StartTime, StartValue = -0.1f, EndValue = 0.9f });
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = note.StartTime + note.Duration + 200, EndTime = note.StartTime + note.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Transforms.Add(new TransformPositionY() { StartTime = note.StartTime - 200, EndTime = note.StartTime, StartValue = -0.1f, EndValue = 0.9f });
|
||||
Transforms.Add(new TransformAlpha() { StartTime = note.StartTime + note.Duration + 200, EndTime = note.StartTime + note.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Expire(true);
|
||||
}
|
||||
}
|
||||
|
@ -77,36 +77,36 @@ namespace osu.Game.Beatmaps.Objects.Osu.Drawable
|
||||
|
||||
Flush(); //move to DrawableHitObject
|
||||
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime - 1000, EndTime = h.StartTime - 800, StartValue = 0, EndValue = 1 });
|
||||
Transforms.Add(new TransformAlpha { StartTime = h.StartTime - 1000, EndTime = h.StartTime - 800, StartValue = 0, EndValue = 1 });
|
||||
|
||||
approachCircle.Transforms.Add(new TransformScale(Clock) { StartTime = h.StartTime - 1000, EndTime = h.StartTime, StartValue = new Vector2(2f), EndValue = new Vector2(0.6f) });
|
||||
approachCircle.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime, EndTime = h.StartTime, StartValue = 1, EndValue = 0 });
|
||||
approachCircle.Transforms.Add(new TransformScale { StartTime = h.StartTime - 1000, EndTime = h.StartTime, StartValue = new Vector2(2f), EndValue = new Vector2(0.6f) });
|
||||
approachCircle.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime, StartValue = 1, EndValue = 0 });
|
||||
|
||||
glow.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = glow.Alpha, EndValue = 0 });
|
||||
glow.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = glow.Alpha, EndValue = 0 });
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case ArmedState.Disarmed:
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
break;
|
||||
case ArmedState.Armed:
|
||||
const float flashIn = 30;
|
||||
const float fadeOut = 800;
|
||||
|
||||
//Transforms.Add(new TransformScale(Clock) { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = Scale, EndValue = Scale * 1.1f });
|
||||
//Transforms.Add(new TransformScale() { StartTime = h.StartTime, EndTime = h.StartTime + 400, StartValue = Scale, EndValue = Scale * 1.1f });
|
||||
|
||||
ring.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
circle.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
number.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
ring.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
circle.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
number.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0 });
|
||||
|
||||
flash.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0.8f });
|
||||
flash.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + 100, StartValue = 0.8f, EndValue = 0 });
|
||||
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 0.8f });
|
||||
flash.Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + 100, StartValue = 0.8f, EndValue = 0 });
|
||||
|
||||
explode.Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 1 });
|
||||
explode.Transforms.Add(new TransformAlpha { StartTime = h.StartTime, EndTime = h.StartTime + flashIn, StartValue = 0, EndValue = 1 });
|
||||
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + fadeOut, StartValue = 1, EndValue = 0 });
|
||||
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + flashIn, EndTime = h.StartTime + flashIn + fadeOut, StartValue = 1, EndValue = 0 });
|
||||
|
||||
Transforms.Add(new TransformScale(Clock) { StartTime = h.StartTime + h.Duration, EndTime = h.StartTime + h.Duration + 400, StartValue = Scale, EndValue = Scale * 1.5f, Easing = EasingTypes.OutQuad });
|
||||
Transforms.Add(new TransformScale { StartTime = h.StartTime + h.Duration, EndTime = h.StartTime + h.Duration + 400, StartValue = Scale, EndValue = Scale * 1.5f, Easing = EasingTypes.OutQuad });
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -29,8 +29,8 @@ namespace osu.Game.Beatmaps.Objects.Taiko.Drawable
|
||||
|
||||
Texture = game.Textures.Get(@"Menu/logo");
|
||||
|
||||
Transforms.Add(new TransformPositionX(Clock) { StartTime = h.StartTime - 200, EndTime = h.StartTime, StartValue = 1.1f, EndValue = 0.1f });
|
||||
Transforms.Add(new TransformAlpha(Clock) { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Transforms.Add(new TransformPositionX { StartTime = h.StartTime - 200, EndTime = h.StartTime, StartValue = 1.1f, EndValue = 0.1f });
|
||||
Transforms.Add(new TransformAlpha { StartTime = h.StartTime + h.Duration + 200, EndTime = h.StartTime + h.Duration + 400, StartValue = 1, EndValue = 0 });
|
||||
Expire(true);
|
||||
}
|
||||
}
|
||||
|
58
osu.Game/Beatmaps/WorkingBeatmap.cs
Normal file
58
osu.Game/Beatmaps/WorkingBeatmap.cs
Normal file
@ -0,0 +1,58 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using osu.Framework.Audio.Track;
|
||||
using osu.Game.Beatmaps.IO;
|
||||
|
||||
namespace osu.Game.Beatmaps
|
||||
{
|
||||
public class WorkingBeatmap : IDisposable
|
||||
{
|
||||
public readonly ArchiveReader Reader;
|
||||
public readonly Beatmap Beatmap;
|
||||
|
||||
private AudioTrack track;
|
||||
public AudioTrack Track
|
||||
{
|
||||
get
|
||||
{
|
||||
if (track != null) return track;
|
||||
|
||||
try
|
||||
{
|
||||
var trackData = Reader.ReadFile(Beatmap.Metadata.AudioFile);
|
||||
if (trackData != null)
|
||||
track = new AudioTrackBass(trackData);
|
||||
}
|
||||
catch { }
|
||||
|
||||
return track;
|
||||
}
|
||||
set { track = value; }
|
||||
}
|
||||
|
||||
public WorkingBeatmap(Beatmap beatmap, ArchiveReader reader = null)
|
||||
{
|
||||
Beatmap = beatmap;
|
||||
Reader = reader;
|
||||
}
|
||||
|
||||
private bool isDisposed;
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!isDisposed)
|
||||
{
|
||||
track?.Dispose();
|
||||
Reader?.Dispose();
|
||||
isDisposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -17,37 +17,41 @@ namespace osu.Game.Database
|
||||
{
|
||||
public class BeatmapDatabase
|
||||
{
|
||||
public static SQLiteConnection Connection { get; set; }
|
||||
private SQLiteConnection connection { get; set; }
|
||||
private BasicStorage storage;
|
||||
public event Action<BeatmapSetInfo> BeatmapSetAdded;
|
||||
|
||||
private BeatmapImporter ipc;
|
||||
|
||||
public BeatmapDatabase(BasicGameHost host)
|
||||
public BeatmapDatabase(BasicStorage storage, BasicGameHost importHost = null)
|
||||
{
|
||||
this.storage = host.Storage;
|
||||
this.storage = storage;
|
||||
|
||||
ipc = new BeatmapImporter(host, this);
|
||||
if (importHost != null)
|
||||
ipc = new BeatmapImporter(importHost, this);
|
||||
|
||||
if (Connection == null)
|
||||
if (connection == null)
|
||||
{
|
||||
Connection = storage.GetDatabase(@"beatmaps");
|
||||
Connection.CreateTable<BeatmapMetadata>();
|
||||
Connection.CreateTable<BaseDifficulty>();
|
||||
Connection.CreateTable<BeatmapSetInfo>();
|
||||
Connection.CreateTable<BeatmapInfo>();
|
||||
connection = storage.GetDatabase(@"beatmaps");
|
||||
connection.CreateTable<BeatmapMetadata>();
|
||||
connection.CreateTable<BaseDifficulty>();
|
||||
connection.CreateTable<BeatmapSetInfo>();
|
||||
connection.CreateTable<BeatmapInfo>();
|
||||
}
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
{
|
||||
foreach (var setInfo in Query<BeatmapSetInfo>())
|
||||
storage.Delete(setInfo.Path);
|
||||
{
|
||||
if (storage.Exists(setInfo.Path))
|
||||
storage.Delete(setInfo.Path);
|
||||
}
|
||||
|
||||
Connection.DeleteAll<BeatmapMetadata>();
|
||||
Connection.DeleteAll<BaseDifficulty>();
|
||||
Connection.DeleteAll<BeatmapSetInfo>();
|
||||
Connection.DeleteAll<BeatmapInfo>();
|
||||
connection.DeleteAll<BeatmapMetadata>();
|
||||
connection.DeleteAll<BaseDifficulty>();
|
||||
connection.DeleteAll<BeatmapSetInfo>();
|
||||
connection.DeleteAll<BeatmapInfo>();
|
||||
}
|
||||
|
||||
public void Import(params string[] paths)
|
||||
@ -62,7 +66,7 @@ namespace osu.Game.Database
|
||||
using (var reader = ArchiveReader.GetReader(storage, path))
|
||||
metadata = reader.ReadMetadata();
|
||||
|
||||
if (Connection.Table<BeatmapSetInfo>().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
|
||||
if (connection.Table<BeatmapSetInfo>().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
|
||||
return; // TODO: Update this beatmap instead
|
||||
|
||||
if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader
|
||||
@ -104,57 +108,73 @@ namespace osu.Game.Database
|
||||
}
|
||||
}
|
||||
}
|
||||
Connection.InsertWithChildren(beatmapSet, true);
|
||||
BeatmapSetAdded?.Invoke(beatmapSet);
|
||||
|
||||
Import(new[] { beatmapSet });
|
||||
}
|
||||
}
|
||||
|
||||
public void Import(IEnumerable<BeatmapSetInfo> beatmapSets)
|
||||
{
|
||||
connection.BeginTransaction();
|
||||
|
||||
foreach (var s in beatmapSets)
|
||||
{
|
||||
connection.InsertWithChildren(s, true);
|
||||
BeatmapSetAdded?.Invoke(s);
|
||||
}
|
||||
|
||||
connection.Commit();
|
||||
}
|
||||
|
||||
public ArchiveReader GetReader(BeatmapSetInfo beatmapSet)
|
||||
{
|
||||
return ArchiveReader.GetReader(storage, beatmapSet.Path);
|
||||
}
|
||||
|
||||
|
||||
public BeatmapSetInfo GetBeatmapSet(int id)
|
||||
{
|
||||
return Query<BeatmapSetInfo>().Where(s => s.BeatmapSetID == id).FirstOrDefault();
|
||||
}
|
||||
|
||||
|
||||
public WorkingBeatmap GetWorkingBeatmap(BeatmapInfo beatmapInfo)
|
||||
{
|
||||
var beatmapSet = Query<BeatmapSetInfo>().Where(s => s.BeatmapSetID == beatmapInfo.BeatmapSetID).FirstOrDefault();
|
||||
if (beatmapSet == null)
|
||||
throw new InvalidOperationException($@"Beatmap set {beatmapInfo.BeatmapSetID} is not in the local database.");
|
||||
|
||||
var reader = GetReader(beatmapSet);
|
||||
|
||||
using (var stream = new StreamReader(reader.ReadFile(beatmapInfo.Path)))
|
||||
return new WorkingBeatmap(BeatmapDecoder.GetDecoder(stream)?.Decode(stream), reader);
|
||||
}
|
||||
|
||||
public Beatmap GetBeatmap(BeatmapInfo beatmapInfo)
|
||||
{
|
||||
var beatmapSet = Query<BeatmapSetInfo>()
|
||||
.Where(s => s.BeatmapSetID == beatmapInfo.BeatmapSetID).FirstOrDefault();
|
||||
if (beatmapSet == null)
|
||||
throw new InvalidOperationException(
|
||||
$@"Beatmap set {beatmapInfo.BeatmapSetID} is not in the local database.");
|
||||
using (var reader = GetReader(beatmapSet))
|
||||
using (var stream = new StreamReader(reader.ReadFile(beatmapInfo.Path)))
|
||||
{
|
||||
var decoder = BeatmapDecoder.GetDecoder(stream);
|
||||
return decoder.Decode(stream);
|
||||
}
|
||||
using (WorkingBeatmap data = GetWorkingBeatmap(beatmapInfo))
|
||||
return data.Beatmap;
|
||||
}
|
||||
|
||||
|
||||
public TableQuery<T> Query<T>() where T : class
|
||||
{
|
||||
return Connection.Table<T>();
|
||||
return connection.Table<T>();
|
||||
}
|
||||
|
||||
|
||||
public T GetWithChildren<T>(object id) where T : class
|
||||
{
|
||||
return Connection.GetWithChildren<T>(id);
|
||||
return connection.GetWithChildren<T>(id);
|
||||
}
|
||||
|
||||
|
||||
public List<T> GetAllWithChildren<T>(Expression<Func<T, bool>> filter = null,
|
||||
bool recursive = true) where T : class
|
||||
{
|
||||
return Connection.GetAllWithChildren<T>(filter, recursive);
|
||||
return connection.GetAllWithChildren<T>(filter, recursive);
|
||||
}
|
||||
|
||||
|
||||
public T GetChildren<T>(T item, bool recursive = true)
|
||||
{
|
||||
if (item == null) return default(T);
|
||||
|
||||
Connection.GetChildren(item, recursive);
|
||||
connection.GetChildren(item, recursive);
|
||||
return item;
|
||||
}
|
||||
|
||||
@ -171,9 +191,9 @@ namespace osu.Game.Database
|
||||
if (!validTypes.Any(t => t == typeof(T)))
|
||||
throw new ArgumentException(nameof(T), "Must be a type managed by BeatmapDatabase");
|
||||
if (cascade)
|
||||
Connection.UpdateWithChildren(record);
|
||||
connection.UpdateWithChildren(record);
|
||||
else
|
||||
Connection.Update(record);
|
||||
connection.Update(record);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ using SQLiteNetExtensions.Attributes;
|
||||
|
||||
namespace osu.Game.Database
|
||||
{
|
||||
public class BeatmapInfo
|
||||
public class BeatmapInfo : IEquatable<BeatmapInfo>
|
||||
{
|
||||
[PrimaryKey]
|
||||
public int BeatmapID { get; set; }
|
||||
@ -64,5 +64,10 @@ namespace osu.Game.Database
|
||||
|
||||
// Metadata
|
||||
public string Version { get; set; }
|
||||
|
||||
public bool Equals(BeatmapInfo other)
|
||||
{
|
||||
return BeatmapID == other?.BeatmapID;
|
||||
}
|
||||
}
|
||||
}
|
@ -117,7 +117,7 @@ namespace osu.Game.GameModes.Menu
|
||||
icon.RotateTo(10, offset, EasingTypes.InOutSine);
|
||||
icon.ScaleTo(new Vector2(1, 0.9f), offset, EasingTypes.Out);
|
||||
|
||||
icon.Transforms.Add(new TransformRotation(Clock)
|
||||
icon.Transforms.Add(new TransformRotation
|
||||
{
|
||||
StartValue = -10,
|
||||
EndValue = 10,
|
||||
@ -128,7 +128,7 @@ namespace osu.Game.GameModes.Menu
|
||||
LoopDelay = duration * 2
|
||||
});
|
||||
|
||||
icon.Transforms.Add(new TransformPosition(Clock)
|
||||
icon.Transforms.Add(new TransformPosition()
|
||||
{
|
||||
StartValue = Vector2.Zero,
|
||||
EndValue = new Vector2(0, -10),
|
||||
@ -139,7 +139,7 @@ namespace osu.Game.GameModes.Menu
|
||||
LoopDelay = duration
|
||||
});
|
||||
|
||||
icon.Transforms.Add(new TransformScale(Clock)
|
||||
icon.Transforms.Add(new TransformScale()
|
||||
{
|
||||
StartValue = new Vector2(1, 0.9f),
|
||||
EndValue = Vector2.One,
|
||||
@ -150,7 +150,7 @@ namespace osu.Game.GameModes.Menu
|
||||
LoopDelay = duration
|
||||
});
|
||||
|
||||
icon.Transforms.Add(new TransformPosition(Clock)
|
||||
icon.Transforms.Add(new TransformPosition()
|
||||
{
|
||||
StartValue = new Vector2(0, -10),
|
||||
EndValue = Vector2.Zero,
|
||||
@ -161,7 +161,7 @@ namespace osu.Game.GameModes.Menu
|
||||
LoopDelay = duration
|
||||
});
|
||||
|
||||
icon.Transforms.Add(new TransformScale(Clock)
|
||||
icon.Transforms.Add(new TransformScale()
|
||||
{
|
||||
StartValue = Vector2.One,
|
||||
EndValue = new Vector2(1, 0.9f),
|
||||
@ -172,7 +172,7 @@ namespace osu.Game.GameModes.Menu
|
||||
LoopDelay = duration
|
||||
});
|
||||
|
||||
icon.Transforms.Add(new TransformRotation(Clock)
|
||||
icon.Transforms.Add(new TransformRotation
|
||||
{
|
||||
StartValue = 10,
|
||||
EndValue = -10,
|
||||
|
@ -10,6 +10,8 @@ using osu.Framework.Graphics.Transformations;
|
||||
using osu.Game.GameModes.Backgrounds;
|
||||
using OpenTK.Graphics;
|
||||
using osu.Framework;
|
||||
using osu.Framework.Configuration;
|
||||
using osu.Game.Beatmaps;
|
||||
|
||||
namespace osu.Game.GameModes.Menu
|
||||
{
|
||||
|
@ -3,17 +3,20 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using osu.Framework.Configuration;
|
||||
using osu.Framework.GameModes;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Graphics.Background;
|
||||
using osu.Game.Graphics.Containers;
|
||||
|
||||
namespace osu.Game.GameModes
|
||||
{
|
||||
public class OsuGameMode : GameMode
|
||||
public abstract class OsuGameMode : GameMode
|
||||
{
|
||||
internal BackgroundMode Background { get; private set; }
|
||||
|
||||
@ -23,6 +26,64 @@ namespace osu.Game.GameModes
|
||||
/// </summary>
|
||||
protected virtual BackgroundMode CreateBackground() => null;
|
||||
|
||||
private bool boundToBeatmap;
|
||||
private Bindable<WorkingBeatmap> beatmap;
|
||||
|
||||
public WorkingBeatmap Beatmap
|
||||
{
|
||||
get
|
||||
{
|
||||
bindBeatmap();
|
||||
return beatmap.Value;
|
||||
}
|
||||
set
|
||||
{
|
||||
bindBeatmap();
|
||||
beatmap.Value = value;
|
||||
}
|
||||
}
|
||||
|
||||
private void bindBeatmap()
|
||||
{
|
||||
if (beatmap == null)
|
||||
beatmap = new Bindable<WorkingBeatmap>();
|
||||
|
||||
if (!boundToBeatmap)
|
||||
{
|
||||
beatmap.ValueChanged += beatmap_ValueChanged;
|
||||
boundToBeatmap = true;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
if (boundToBeatmap)
|
||||
beatmap.ValueChanged -= beatmap_ValueChanged;
|
||||
|
||||
base.Dispose(isDisposing);
|
||||
}
|
||||
|
||||
private void beatmap_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
OnBeatmapChanged(beatmap.Value);
|
||||
}
|
||||
|
||||
public override bool Push(GameMode mode)
|
||||
{
|
||||
OsuGameMode nextOsu = mode as OsuGameMode;
|
||||
if (nextOsu != null)
|
||||
{
|
||||
nextOsu.beatmap = beatmap;
|
||||
}
|
||||
|
||||
return base.Push(mode);
|
||||
}
|
||||
|
||||
protected virtual void OnBeatmapChanged(WorkingBeatmap beatmap)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected override void OnEntering(GameMode last)
|
||||
{
|
||||
OsuGameMode lastOsu = last as OsuGameMode;
|
||||
|
@ -174,7 +174,7 @@ namespace osu.Game.GameModes.Play
|
||||
|
||||
protected virtual void OnCountRolling(ulong currentValue, ulong newValue)
|
||||
{
|
||||
transformRoll(new TransformComboRoll(Clock), currentValue, newValue);
|
||||
transformRoll(new TransformComboRoll(), currentValue, newValue);
|
||||
}
|
||||
|
||||
protected virtual void OnCountIncrement(ulong currentValue, ulong newValue) {
|
||||
@ -248,11 +248,11 @@ namespace osu.Game.GameModes.Play
|
||||
|
||||
protected class TransformComboRoll : Transform<ulong>
|
||||
{
|
||||
public override ulong CurrentValue
|
||||
protected override ulong CurrentValue
|
||||
{
|
||||
get
|
||||
{
|
||||
double time = Time;
|
||||
double time = CurrentTime ?? 0;
|
||||
if (time < StartTime) return StartValue;
|
||||
if (time >= EndTime) return EndValue;
|
||||
|
||||
@ -265,11 +265,6 @@ namespace osu.Game.GameModes.Play
|
||||
base.Apply(d);
|
||||
(d as ComboCounter).DisplayedCount = CurrentValue;
|
||||
}
|
||||
|
||||
public TransformComboRoll(IClock clock)
|
||||
: base(clock)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -41,11 +41,11 @@ namespace osu.Game.GameModes.Play
|
||||
|
||||
protected class TransformComboResult : Transform<ulong>
|
||||
{
|
||||
public override ulong CurrentValue
|
||||
protected override ulong CurrentValue
|
||||
{
|
||||
get
|
||||
{
|
||||
double time = Time;
|
||||
double time = CurrentTime ?? 0;
|
||||
if (time < StartTime) return StartValue;
|
||||
if (time >= EndTime) return EndValue;
|
||||
|
||||
@ -58,11 +58,6 @@ namespace osu.Game.GameModes.Play
|
||||
base.Apply(d);
|
||||
(d as ComboResultCounter).DisplayedCount = CurrentValue;
|
||||
}
|
||||
|
||||
public TransformComboResult(IClock clock)
|
||||
: base(clock)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using osu.Framework.Configuration;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
@ -15,23 +16,31 @@ using OpenTK;
|
||||
using OpenTK.Graphics;
|
||||
using osu.Framework.Graphics.UserInterface;
|
||||
using System.Threading.Tasks;
|
||||
using osu.Framework.Audio.Track;
|
||||
using osu.Game.Beatmaps.Drawable;
|
||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Framework.GameModes;
|
||||
|
||||
namespace osu.Game.GameModes.Play
|
||||
{
|
||||
public class PlaySongSelect : OsuGameMode
|
||||
{
|
||||
private Bindable<PlayMode> playMode;
|
||||
private BeatmapDatabase beatmaps;
|
||||
private BeatmapDatabase database;
|
||||
private BeatmapGroup selectedBeatmapGroup;
|
||||
private BeatmapInfo selectedBeatmap;
|
||||
private BeatmapInfo selectedBeatmapInfo;
|
||||
// TODO: use currently selected track as bg
|
||||
protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4");
|
||||
private ScrollContainer scrollContainer;
|
||||
private FlowContainer setList;
|
||||
private FlowContainer beatmapSetFlow;
|
||||
private TrackManager trackManager;
|
||||
|
||||
public PlaySongSelect()
|
||||
/// <param name="database">Optionally provide a database to use instead of the OsuGame one.</param>
|
||||
public PlaySongSelect(BeatmapDatabase database = null)
|
||||
{
|
||||
this.database = database;
|
||||
|
||||
const float scrollWidth = 640;
|
||||
const float bottomToolHeight = 50;
|
||||
Children = new Drawable[]
|
||||
@ -69,7 +78,7 @@ namespace osu.Game.GameModes.Play
|
||||
Origin = Anchor.CentreRight,
|
||||
Children = new Drawable[]
|
||||
{
|
||||
setList = new FlowContainer
|
||||
beatmapSetFlow = new FlowContainer
|
||||
{
|
||||
Padding = new MarginPadding { Left = 25, Top = 25, Bottom = 25 + bottomToolHeight },
|
||||
RelativeSizeAxes = Axes.X,
|
||||
@ -101,7 +110,10 @@ namespace osu.Game.GameModes.Play
|
||||
Width = 100,
|
||||
Text = "Play",
|
||||
Colour = new Color4(238, 51, 153, 255),
|
||||
Action = () => Push(new Player { Beatmap = beatmaps.GetBeatmap(selectedBeatmap) }),
|
||||
Action = () => Push(new Player {
|
||||
BeatmapInfo = selectedBeatmapGroup.SelectedPanel.Beatmap,
|
||||
PreferredPlayMode = playMode.Value
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -116,29 +128,78 @@ namespace osu.Game.GameModes.Play
|
||||
if (osuGame != null)
|
||||
{
|
||||
playMode = osuGame.PlayMode;
|
||||
playMode.ValueChanged += PlayMode_ValueChanged;
|
||||
playMode.ValueChanged += playMode_ValueChanged;
|
||||
// Temporary:
|
||||
scrollContainer.Padding = new MarginPadding { Top = osuGame.Toolbar.Height };
|
||||
}
|
||||
|
||||
beatmaps = (game as OsuGameBase).Beatmaps;
|
||||
beatmaps.BeatmapSetAdded += bset => Scheduler.Add(() => addBeatmapSet(bset));
|
||||
if (database == null)
|
||||
database = (game as OsuGameBase).Beatmaps;
|
||||
|
||||
database.BeatmapSetAdded += s => Schedule(() => addBeatmapSet(s));
|
||||
|
||||
trackManager = game.Audio.Track;
|
||||
|
||||
Task.Factory.StartNew(addBeatmapSets);
|
||||
}
|
||||
|
||||
protected override void OnEntering(GameMode last)
|
||||
{
|
||||
base.OnEntering(last);
|
||||
ensurePlayingSelected();
|
||||
}
|
||||
|
||||
protected override void OnResuming(GameMode last)
|
||||
{
|
||||
ensurePlayingSelected();
|
||||
|
||||
base.OnResuming(last);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
base.Dispose(isDisposing);
|
||||
if (playMode != null)
|
||||
playMode.ValueChanged -= PlayMode_ValueChanged;
|
||||
playMode.ValueChanged -= playMode_ValueChanged;
|
||||
}
|
||||
|
||||
private void PlayMode_ValueChanged(object sender, EventArgs e)
|
||||
private void playMode_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
private void selectBeatmap(BeatmapGroup group, BeatmapInfo beatmap)
|
||||
protected override void OnBeatmapChanged(WorkingBeatmap beatmap)
|
||||
{
|
||||
base.OnBeatmapChanged(beatmap);
|
||||
selectBeatmap(beatmap.Beatmap.BeatmapInfo);
|
||||
}
|
||||
|
||||
private void selectBeatmap(BeatmapInfo beatmap)
|
||||
{
|
||||
if (beatmap.Equals(selectedBeatmapInfo))
|
||||
return;
|
||||
|
||||
beatmapSetFlow.Children.Cast<BeatmapGroup>().First(b =>
|
||||
{
|
||||
var panel = b.BeatmapPanels.FirstOrDefault(p => p.Beatmap.Equals(beatmap));
|
||||
panel?.TriggerClick();
|
||||
return panel != null;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// selection has been changed as the result of interaction with the carousel.
|
||||
/// </summary>
|
||||
private void selectionChanged(BeatmapGroup group, BeatmapInfo beatmap)
|
||||
{
|
||||
selectedBeatmapInfo = beatmap;
|
||||
|
||||
if (!beatmap.Equals(Beatmap?.Beatmap?.BeatmapInfo))
|
||||
{
|
||||
Beatmap = database.GetWorkingBeatmap(beatmap);
|
||||
}
|
||||
|
||||
ensurePlayingSelected();
|
||||
|
||||
if (selectedBeatmapGroup == group)
|
||||
return;
|
||||
|
||||
@ -146,28 +207,36 @@ namespace osu.Game.GameModes.Play
|
||||
selectedBeatmapGroup.State = BeatmapGroupState.Collapsed;
|
||||
|
||||
selectedBeatmapGroup = group;
|
||||
selectedBeatmap = beatmap;
|
||||
}
|
||||
|
||||
private void ensurePlayingSelected()
|
||||
{
|
||||
var track = Beatmap?.Track;
|
||||
|
||||
if (track != null)
|
||||
{
|
||||
trackManager.SetExclusive(track);
|
||||
track.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void addBeatmapSet(BeatmapSetInfo beatmapSet)
|
||||
{
|
||||
beatmapSet = beatmaps.GetWithChildren<BeatmapSetInfo>(beatmapSet.BeatmapSetID);
|
||||
beatmapSet.Beatmaps.ForEach(b => beatmaps.GetChildren(b));
|
||||
beatmapSet = database.GetWithChildren<BeatmapSetInfo>(beatmapSet.BeatmapSetID);
|
||||
beatmapSet.Beatmaps.ForEach(b => database.GetChildren(b));
|
||||
beatmapSet.Beatmaps = beatmapSet.Beatmaps.OrderBy(b => b.BaseDifficulty.OverallDifficulty).ToList();
|
||||
Schedule(() =>
|
||||
{
|
||||
var group = new BeatmapGroup(beatmapSet) { SelectionChanged = selectBeatmap };
|
||||
setList.Add(group);
|
||||
if (setList.Children.Count() == 1)
|
||||
{
|
||||
var group = new BeatmapGroup(beatmapSet) { SelectionChanged = selectionChanged };
|
||||
beatmapSetFlow.Add(group);
|
||||
if (beatmapSetFlow.Children.Count() == 1)
|
||||
group.State = BeatmapGroupState.Expanded;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void addBeatmapSets()
|
||||
{
|
||||
foreach (var beatmapSet in beatmaps.Query<BeatmapSetInfo>())
|
||||
foreach (var beatmapSet in database.Query<BeatmapSetInfo>())
|
||||
addBeatmapSet(beatmapSet);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System.Collections.Generic;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Beatmaps.Objects;
|
||||
@ -11,6 +10,10 @@ using osu.Game.GameModes.Play.Mania;
|
||||
using osu.Game.GameModes.Play.Osu;
|
||||
using osu.Game.GameModes.Play.Taiko;
|
||||
using osu.Framework;
|
||||
using osu.Game.Database;
|
||||
using osu.Framework.Timing;
|
||||
using osu.Framework.GameModes;
|
||||
using osu.Framework.Audio.Track;
|
||||
|
||||
namespace osu.Game.GameModes.Play
|
||||
{
|
||||
@ -18,23 +21,74 @@ namespace osu.Game.GameModes.Play
|
||||
{
|
||||
protected override BackgroundMode CreateBackground() => new BackgroundModeCustom(@"Backgrounds/bg4");
|
||||
|
||||
public Beatmap Beatmap;
|
||||
public BeatmapInfo BeatmapInfo;
|
||||
|
||||
public PlayMode PlayMode;
|
||||
public PlayMode PreferredPlayMode;
|
||||
|
||||
protected override IFrameBasedClock Clock => playerClock;
|
||||
|
||||
private InterpolatingFramedClock playerClock;
|
||||
private IAdjustableClock sourceClock;
|
||||
|
||||
protected override bool OnExiting(GameMode next)
|
||||
{
|
||||
if (next == null)
|
||||
{
|
||||
//eagerly dispose as the finalizer runs too late right now.
|
||||
Beatmap?.Dispose();
|
||||
}
|
||||
|
||||
return base.OnExiting(next);
|
||||
}
|
||||
|
||||
public override void Load(BaseGame game)
|
||||
{
|
||||
base.Load(game);
|
||||
|
||||
Beatmap beatmap = new Beatmap
|
||||
try
|
||||
{
|
||||
HitObjects = Beatmap?.HitObjects ?? new List<HitObject>()
|
||||
};
|
||||
if (Beatmap == null)
|
||||
Beatmap = ((OsuGame)game).Beatmaps.GetWorkingBeatmap(BeatmapInfo);
|
||||
}
|
||||
catch
|
||||
{
|
||||
//couldn't load, hard abort!
|
||||
Exit();
|
||||
return;
|
||||
}
|
||||
|
||||
AudioTrack track = Beatmap.Track;
|
||||
|
||||
if (track != null)
|
||||
{
|
||||
game.Audio.Track.SetExclusive(track);
|
||||
sourceClock = track;
|
||||
}
|
||||
|
||||
sourceClock = (IAdjustableClock)track ?? new StopwatchClock();
|
||||
playerClock = new InterpolatingFramedClock(sourceClock);
|
||||
|
||||
Schedule(() =>
|
||||
{
|
||||
sourceClock.Reset();
|
||||
sourceClock.Start();
|
||||
});
|
||||
|
||||
HitRenderer hitRenderer;
|
||||
ScoreOverlay scoreOverlay;
|
||||
|
||||
switch (PlayMode)
|
||||
var beatmap = Beatmap.Beatmap;
|
||||
|
||||
if (beatmap.BeatmapInfo?.Mode > PlayMode.Osu)
|
||||
{
|
||||
//we only support osu! mode for now because the hitobject parsing is crappy and needs a refactor.
|
||||
Exit();
|
||||
return;
|
||||
}
|
||||
|
||||
PlayMode usablePlayMode = beatmap.BeatmapInfo?.Mode > PlayMode.Osu ? beatmap.BeatmapInfo.Mode : PreferredPlayMode;
|
||||
|
||||
switch (usablePlayMode)
|
||||
{
|
||||
default:
|
||||
scoreOverlay = new ScoreOverlayOsu();
|
||||
@ -47,7 +101,7 @@ namespace osu.Game.GameModes.Play
|
||||
};
|
||||
break;
|
||||
case PlayMode.Taiko:
|
||||
scoreOverlay = null;
|
||||
scoreOverlay = new ScoreOverlayOsu();
|
||||
|
||||
hitRenderer = new TaikoHitRenderer
|
||||
{
|
||||
@ -57,7 +111,7 @@ namespace osu.Game.GameModes.Play
|
||||
};
|
||||
break;
|
||||
case PlayMode.Catch:
|
||||
scoreOverlay = null;
|
||||
scoreOverlay = new ScoreOverlayOsu();
|
||||
|
||||
hitRenderer = new CatchHitRenderer
|
||||
{
|
||||
@ -67,7 +121,7 @@ namespace osu.Game.GameModes.Play
|
||||
};
|
||||
break;
|
||||
case PlayMode.Mania:
|
||||
scoreOverlay = null;
|
||||
scoreOverlay = new ScoreOverlayOsu();
|
||||
|
||||
hitRenderer = new ManiaHitRenderer
|
||||
{
|
||||
@ -87,5 +141,11 @@ namespace osu.Game.GameModes.Play
|
||||
scoreOverlay,
|
||||
};
|
||||
}
|
||||
|
||||
protected override void Update()
|
||||
{
|
||||
base.Update();
|
||||
playerClock.ProcessFrame();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,16 +1,11 @@
|
||||
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using osu.Framework.GameModes;
|
||||
using osu.Game.GameModes.Backgrounds;
|
||||
using OpenTK.Graphics;
|
||||
|
||||
namespace osu.Game.GameModes.Play
|
||||
namespace osu.Game.GameModes.Ranking
|
||||
{
|
||||
class Results : GameModeWhiteBox
|
||||
{
|
@ -57,11 +57,6 @@ namespace osu.Game.Graphics.UserInterface
|
||||
base.Apply(d);
|
||||
(d as PercentageCounter).DisplayedCount = CurrentValue;
|
||||
}
|
||||
|
||||
public TransformAccuracy(IClock clock)
|
||||
: base(clock)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -194,14 +194,12 @@ namespace osu.Game.Graphics.UserInterface
|
||||
/// <seealso cref="TransformType"/>
|
||||
protected virtual void TransformCount(T currentValue, T newValue)
|
||||
{
|
||||
object[] parameters = { Clock };
|
||||
|
||||
Debug.Assert(
|
||||
TransformType.IsSubclassOf(typeof(Transform<T>)) || TransformType == typeof(Transform<T>),
|
||||
@"transformType should be a subclass of Transform<T>."
|
||||
);
|
||||
|
||||
TransformCount((Transform<T>)Activator.CreateInstance(TransformType, parameters), currentValue, newValue);
|
||||
TransformCount((Transform<T>)Activator.CreateInstance(TransformType), currentValue, newValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -56,11 +56,11 @@ namespace osu.Game.Graphics.UserInterface
|
||||
|
||||
protected class TransformScore : Transform<ulong>
|
||||
{
|
||||
public override ulong CurrentValue
|
||||
protected override ulong CurrentValue
|
||||
{
|
||||
get
|
||||
{
|
||||
double time = Time;
|
||||
double time = CurrentTime ?? 0;
|
||||
if (time < StartTime) return StartValue;
|
||||
if (time >= EndTime) return EndValue;
|
||||
|
||||
@ -73,11 +73,6 @@ namespace osu.Game.Graphics.UserInterface
|
||||
base.Apply(d);
|
||||
(d as ScoreCounter).DisplayedCount = CurrentValue;
|
||||
}
|
||||
|
||||
public TransformScore(IClock clock)
|
||||
: base(clock)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +70,10 @@ namespace osu.Game
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
ActivateRequested = delegate { volume.Show(); }
|
||||
},
|
||||
intro = new Intro(),
|
||||
intro = new Intro
|
||||
{
|
||||
Beatmap = Beatmap
|
||||
},
|
||||
Toolbar = new Toolbar
|
||||
{
|
||||
OnHome = delegate { MainMenu?.MakeCurrent(); },
|
||||
|
@ -1,10 +1,13 @@
|
||||
using osu.Framework;
|
||||
using System;
|
||||
using osu.Framework;
|
||||
using osu.Framework.Configuration;
|
||||
using osu.Framework.GameModes;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Cursor;
|
||||
using osu.Framework.Graphics.Textures;
|
||||
using osu.Framework.IO.Stores;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Beatmaps.IO;
|
||||
using osu.Game.Configuration;
|
||||
using osu.Game.Database;
|
||||
@ -32,6 +35,8 @@ namespace osu.Game
|
||||
|
||||
public CursorContainer Cursor;
|
||||
|
||||
public readonly Bindable<WorkingBeatmap> Beatmap = new Bindable<WorkingBeatmap>();
|
||||
|
||||
public OsuGameBase()
|
||||
{
|
||||
AddInternal(ratioContainer = new RatioAdjust());
|
||||
@ -41,6 +46,13 @@ namespace osu.Game
|
||||
Options = new Options(),
|
||||
Cursor = new OsuCursorContainer()
|
||||
};
|
||||
|
||||
Beatmap.ValueChanged += Beatmap_ValueChanged;
|
||||
}
|
||||
|
||||
private void Beatmap_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override void Load(BaseGame game)
|
||||
@ -48,7 +60,7 @@ namespace osu.Game
|
||||
base.Load(game);
|
||||
|
||||
OszArchiveReader.Register();
|
||||
Beatmaps = new BeatmapDatabase(Host);
|
||||
Beatmaps = new BeatmapDatabase(Host.Storage, Host);
|
||||
|
||||
//this completely overrides the framework default. will need to change once we make a proper FontStore.
|
||||
Fonts = new TextureStore() { ScaleAdjust = 0.01f };
|
||||
|
@ -66,8 +66,10 @@
|
||||
<Compile Include="Overlays\DragBar.cs" />
|
||||
<Compile Include="Overlays\MusicController.cs" />
|
||||
<Compile Include="Beatmaps\Beatmap.cs" />
|
||||
<Compile Include="Beatmaps\WorkingBeatmap.cs" />
|
||||
<Compile Include="Beatmaps\Drawable\BeatmapSetHeader.cs" />
|
||||
<Compile Include="Beatmaps\Drawable\DifficultyIcon.cs" />
|
||||
<Compile Include="Beatmaps\Drawable\Panel.cs" />
|
||||
<Compile Include="Beatmaps\Objects\Catch\CatchConverter.cs" />
|
||||
<Compile Include="Beatmaps\Objects\Catch\Drawable\DrawableFruit.cs" />
|
||||
<Compile Include="Beatmaps\Objects\DrawableHitObject.cs" />
|
||||
@ -125,7 +127,7 @@
|
||||
<Compile Include="GameModes\Play\Player.cs" />
|
||||
<Compile Include="GameModes\Charts\ChartListing.cs" />
|
||||
<Compile Include="GameModes\Play\PlayMode.cs" />
|
||||
<Compile Include="GameModes\Play\Results.cs" />
|
||||
<Compile Include="GameModes\Ranking\Results.cs" />
|
||||
<Compile Include="GameModes\Direct\OnlineListing.cs" />
|
||||
<Compile Include="GameModes\Play\PlaySongSelect.cs" />
|
||||
<Compile Include="GameModes\Play\Catch\CatchHitRenderer.cs" />
|
||||
|
Reference in New Issue
Block a user