diff --git a/osu-framework b/osu-framework
index 47aabeaee5..c95b9350ed 160000
--- a/osu-framework
+++ b/osu-framework
@@ -1 +1 @@
-Subproject commit 47aabeaee5a8d85a0e6769fd601736f8dc1eb051
+Subproject commit c95b9350edb6305cfefdf08f902f6f73d336736b
diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs
index e7c3370354..8c17e18ed8 100644
--- a/osu.Desktop/Overlays/VersionManager.cs
+++ b/osu.Desktop/Overlays/VersionManager.cs
@@ -233,7 +233,8 @@ namespace osu.Desktop.Overlays
Text = @"Update ready to install. Click to restart!",
Activated = () =>
{
- UpdateManager.RestartAppWhenExited();
+ // Squirrel returns execution to us after the update process is started, so it's safe to use Wait() here
+ UpdateManager.RestartAppWhenExited().Wait();
game.GracefullyExit();
return true;
}
diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapDetails.cs b/osu.Game.Tests/Visual/TestCaseBeatmapDetails.cs
index 5306121a92..b31eded9a0 100644
--- a/osu.Game.Tests/Visual/TestCaseBeatmapDetails.cs
+++ b/osu.Game.Tests/Visual/TestCaseBeatmapDetails.cs
@@ -39,7 +39,7 @@ namespace osu.Game.Tests.Visual
StarDifficulty = 5.3f,
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -63,7 +63,7 @@ namespace osu.Game.Tests.Visual
StarDifficulty = 4.8f,
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
},
});
diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs b/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
index 1ade0be626..c2de4ec05d 100644
--- a/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
+++ b/osu.Game.Tests/Visual/TestCaseBeatmapSetOverlay.cs
@@ -53,6 +53,7 @@ namespace osu.Game.Tests.Visual
Submitted = new DateTime(2016, 2, 10),
Ranked = new DateTime(2016, 6, 19),
BPM = 236,
+ HasVideo = true,
Covers = new BeatmapSetOnlineCovers
{
Cover = @"https://assets.ppy.sh/beatmaps/415886/covers/cover.jpg?1465651778",
@@ -75,7 +76,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 115000,
- HasVideo = false,
CircleCount = 265,
SliderCount = 71,
PlayCount = 47906,
@@ -83,7 +83,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -103,7 +103,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 118000,
- HasVideo = true,
CircleCount = 592,
SliderCount = 62,
PlayCount = 162021,
@@ -111,7 +110,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -131,7 +130,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 118000,
- HasVideo = false,
CircleCount = 1042,
SliderCount = 79,
PlayCount = 225178,
@@ -139,7 +137,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -159,7 +157,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 118000,
- HasVideo = false,
CircleCount = 1352,
SliderCount = 69,
PlayCount = 131545,
@@ -167,7 +164,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -187,7 +184,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 118000,
- HasVideo = false,
CircleCount = 1730,
SliderCount = 115,
PlayCount = 117673,
@@ -195,7 +191,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -227,6 +223,7 @@ namespace osu.Game.Tests.Visual
Submitted = new DateTime(2016, 6, 11),
Ranked = new DateTime(2016, 7, 12),
BPM = 160,
+ HasVideo = false,
Covers = new BeatmapSetOnlineCovers
{
Cover = @"https://assets.ppy.sh/beatmaps/625493/covers/cover.jpg?1499167472",
@@ -249,7 +246,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 193000,
- HasVideo = false,
CircleCount = 262,
SliderCount = 0,
PlayCount = 3952,
@@ -257,7 +253,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -277,7 +273,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 193000,
- HasVideo = false,
CircleCount = 464,
SliderCount = 0,
PlayCount = 4833,
@@ -285,7 +280,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -305,7 +300,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 193000,
- HasVideo = false,
CircleCount = 712,
SliderCount = 0,
PlayCount = 4405,
@@ -313,7 +307,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -333,7 +327,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 193000,
- HasVideo = false,
CircleCount = 943,
SliderCount = 0,
PlayCount = 3950,
@@ -341,7 +334,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
@@ -361,7 +354,6 @@ namespace osu.Game.Tests.Visual
OnlineInfo = new BeatmapOnlineInfo
{
Length = 193000,
- HasVideo = false,
CircleCount = 1068,
SliderCount = 0,
PlayCount = 5856,
@@ -369,7 +361,7 @@ namespace osu.Game.Tests.Visual
},
Metrics = new BeatmapMetrics
{
- Ratings = Enumerable.Range(0, 10),
+ Ratings = Enumerable.Range(0, 11),
Fails = Enumerable.Range(1, 100).Select(i => i % 12 - 6),
Retries = Enumerable.Range(-2, 100).Select(i => i % 12 - 6),
},
diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index e610073300..dde49fdf50 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -354,6 +354,8 @@ namespace osu.Game.Beatmaps
/// Returns a to a usable state if it has previously been deleted but not yet purged.
/// Is a no-op for already usable beatmaps.
///
+ /// The store to restore beatmaps from.
+ /// The store to restore beatmap files from.
/// The beatmap to restore.
private void undelete(BeatmapStore beatmaps, FileStore files, BeatmapSetInfo beatmapSet)
{
@@ -439,6 +441,8 @@ namespace osu.Game.Beatmaps
/// Import a beamap into our local storage.
/// If the beatmap is already imported, the existing instance will be returned.
///
+ /// The store to import beatmap files to.
+ /// The store to import beatmaps to.
/// The beatmap archive to be read.
/// The imported beatmap, or an existing instance if it is already present.
private BeatmapSetInfo importToStorage(FileStore files, BeatmapStore beatmaps, ArchiveReader reader)
diff --git a/osu.Game/Beatmaps/BeatmapOnlineInfo.cs b/osu.Game/Beatmaps/BeatmapOnlineInfo.cs
index 399cabda99..6a988036c5 100644
--- a/osu.Game/Beatmaps/BeatmapOnlineInfo.cs
+++ b/osu.Game/Beatmaps/BeatmapOnlineInfo.cs
@@ -1,8 +1,6 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using Newtonsoft.Json;
-
namespace osu.Game.Beatmaps
{
///
@@ -15,33 +13,24 @@ namespace osu.Game.Beatmaps
///
public double Length { get; set; }
- ///
- /// Whether or not this beatmap has a background video.
- ///
- public bool HasVideo { get; set; }
-
///
/// The amount of circles in this beatmap.
///
- [JsonProperty(@"count_circles")]
public int CircleCount { get; set; }
///
/// The amount of sliders in this beatmap.
///
- [JsonProperty(@"count_sliders")]
public int SliderCount { get; set; }
///
/// The amount of plays this beatmap has.
///
- [JsonProperty(@"playcount")]
public int PlayCount { get; set; }
///
/// The amount of passes this beatmap has.
///
- [JsonProperty(@"passcount")]
public int PassCount { get; set; }
}
}
diff --git a/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs b/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
index 27d1f057ca..b38f74b3f7 100644
--- a/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
+++ b/osu.Game/Beatmaps/BeatmapSetOnlineInfo.cs
@@ -26,16 +26,19 @@ namespace osu.Game.Beatmaps
///
public DateTimeOffset? LastUpdated { get; set; }
+ ///
+ /// Whether or not this beatmap set has a background video.
+ ///
+ public bool HasVideo { get; set; }
+
///
/// The different sizes of cover art for this beatmap set.
///
- [JsonProperty(@"covers")]
public BeatmapSetOnlineCovers Covers { get; set; }
///
/// A small sample clip of this beatmap set's song.
///
- [JsonProperty(@"previewUrl")]
public string Preview { get; set; }
///
@@ -46,13 +49,11 @@ namespace osu.Game.Beatmaps
///
/// The amount of plays this beatmap set has.
///
- [JsonProperty(@"play_count")]
public int PlayCount { get; set; }
///
/// The amount of people who have favourited this beatmap set.
///
- [JsonProperty(@"favourite_count")]
public int FavouriteCount { get; set; }
}
diff --git a/osu.Game/Database/OsuDbContext.cs b/osu.Game/Database/OsuDbContext.cs
index cb2bdf5c9f..928c355696 100644
--- a/osu.Game/Database/OsuDbContext.cs
+++ b/osu.Game/Database/OsuDbContext.cs
@@ -102,7 +102,7 @@ namespace osu.Game.Database
return null;
}
- public new int SaveChanges(IDbContextTransaction transaction = null)
+ public int SaveChanges(IDbContextTransaction transaction = null)
{
var ret = base.SaveChanges();
transaction?.Commit();
@@ -262,7 +262,7 @@ namespace osu.Game.Database
throw new MigrationFailedException(e);
}
}
- catch (MigrationFailedException e)
+ catch (MigrationFailedException)
{
throw;
}
diff --git a/osu.Game/Graphics/Containers/SectionsContainer.cs b/osu.Game/Graphics/Containers/SectionsContainer.cs
index 6e5c3c8183..1e2826189b 100644
--- a/osu.Game/Graphics/Containers/SectionsContainer.cs
+++ b/osu.Game/Graphics/Containers/SectionsContainer.cs
@@ -139,6 +139,8 @@ namespace osu.Game.Graphics.Containers
public void ScrollTo(Drawable section) => scrollContainer.ScrollTo(scrollContainer.GetChildPosInContent(section) - (FixedHeader?.BoundingBox.Height ?? 0));
+ public void ScrollToTop() => scrollContainer.ScrollTo(0);
+
private float lastKnownScroll;
protected override void UpdateAfterChildren()
{
diff --git a/osu.Game/Graphics/SpriteIcon.cs b/osu.Game/Graphics/SpriteIcon.cs
index d4f9127d54..ca108bfa7a 100644
--- a/osu.Game/Graphics/SpriteIcon.cs
+++ b/osu.Game/Graphics/SpriteIcon.cs
@@ -57,11 +57,6 @@ namespace osu.Game.Graphics
private void load(FontStore store)
{
this.store = store;
- }
-
- protected override void LoadComplete()
- {
- base.LoadComplete();
updateTexture();
}
diff --git a/osu.Game/IO/FileStore.cs b/osu.Game/IO/FileStore.cs
index 93d1086ee5..4eca310424 100644
--- a/osu.Game/IO/FileStore.cs
+++ b/osu.Game/IO/FileStore.cs
@@ -19,7 +19,7 @@ namespace osu.Game.IO
{
public readonly IResourceStore Store;
- public Storage Storage => base.Storage;
+ public new Storage Storage => base.Storage;
public FileStore(Func createContext, Storage storage) : base(createContext, storage.GetStorageForDirectory(@"files"))
{
diff --git a/osu.Game/Input/Bindings/DatabasedKeyBindingInputManager.cs b/osu.Game/Input/Bindings/DatabasedKeyBindingInputManager.cs
index 6dedf7385b..bae14fc1dc 100644
--- a/osu.Game/Input/Bindings/DatabasedKeyBindingInputManager.cs
+++ b/osu.Game/Input/Bindings/DatabasedKeyBindingInputManager.cs
@@ -51,7 +51,9 @@ namespace osu.Game.Input.Bindings
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
- store.KeyBindingChanged -= ReloadMappings;
+
+ if (store != null)
+ store.KeyBindingChanged -= ReloadMappings;
}
protected override void ReloadMappings() => KeyBindings = store.Query(ruleset?.ID, variant).ToList();
diff --git a/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs b/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
index f2ca0c1a2f..fa053d6418 100644
--- a/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
+++ b/osu.Game/Online/API/Requests/GetBeatmapSetsResponse.cs
@@ -6,6 +6,7 @@ using System.Linq;
using Newtonsoft.Json;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
+using System;
namespace osu.Game.Online.API.Requests
{
@@ -14,7 +15,7 @@ namespace osu.Game.Online.API.Requests
[JsonProperty(@"covers")]
private BeatmapSetOnlineCovers covers { get; set; }
- [JsonProperty(@"previewUrl")]
+ [JsonProperty(@"preview_url")]
private string preview { get; set; }
[JsonProperty(@"play_count")]
@@ -23,6 +24,21 @@ namespace osu.Game.Online.API.Requests
[JsonProperty(@"favourite_count")]
private int favouriteCount { get; set; }
+ [JsonProperty(@"bpm")]
+ private double bpm { get; set; }
+
+ [JsonProperty(@"video")]
+ private bool hasVideo { get; set; }
+
+ [JsonProperty(@"submitted_date")]
+ private DateTimeOffset submitted { get; set; }
+
+ [JsonProperty(@"ranked_date")]
+ private DateTimeOffset ranked { get; set; }
+
+ [JsonProperty(@"last_updated")]
+ private DateTimeOffset lastUpdated { get; set; }
+
[JsonProperty(@"user_id")]
private long creatorId {
set { Author.Id = value; }
@@ -43,6 +59,11 @@ namespace osu.Game.Online.API.Requests
Preview = preview,
PlayCount = playCount,
FavouriteCount = favouriteCount,
+ BPM = bpm,
+ HasVideo = hasVideo,
+ Submitted = submitted,
+ Ranked = ranked,
+ LastUpdated = lastUpdated,
},
Beatmaps = beatmaps.Select(b => b.ToBeatmap(rulesets)).ToList(),
};
@@ -62,6 +83,30 @@ namespace osu.Game.Online.API.Requests
[JsonProperty(@"difficulty_rating")]
private double starDifficulty { get; set; }
+ [JsonProperty(@"drain")]
+ private float drainRate { get; set; }
+
+ [JsonProperty(@"cs")]
+ private float circleSize { get; set; }
+
+ [JsonProperty(@"ar")]
+ private float approachRate { get; set; }
+
+ [JsonProperty(@"accuracy")]
+ private float overallDifficulty { get; set; }
+
+ [JsonProperty(@"total_length")]
+ private double length { get; set; }
+
+ [JsonProperty(@"count_circles")]
+ private int circleCount { get; set; }
+
+ [JsonProperty(@"count_sliders")]
+ private int sliderCount { get; set; }
+
+ [JsonProperty(@"version")]
+ private string version { get; set; }
+
public BeatmapInfo ToBeatmap(RulesetStore rulesets)
{
return new BeatmapInfo
@@ -69,10 +114,21 @@ namespace osu.Game.Online.API.Requests
Metadata = this,
Ruleset = rulesets.GetRuleset(ruleset),
StarDifficulty = starDifficulty,
+ Version = version,
+ BaseDifficulty = new BeatmapDifficulty
+ {
+ DrainRate = drainRate,
+ CircleSize = circleSize,
+ ApproachRate = approachRate,
+ OverallDifficulty = overallDifficulty,
+ },
OnlineInfo = new BeatmapOnlineInfo
{
PlayCount = playCount,
PassCount = passCount,
+ Length = length,
+ CircleCount = circleCount,
+ SliderCount = sliderCount,
},
};
}
diff --git a/osu.Game/Online/API/Requests/GetUserBeatmapsRequest.cs b/osu.Game/Online/API/Requests/GetUserBeatmapsRequest.cs
new file mode 100644
index 0000000000..a66799f404
--- /dev/null
+++ b/osu.Game/Online/API/Requests/GetUserBeatmapsRequest.cs
@@ -0,0 +1,33 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using Humanizer;
+using System.Collections.Generic;
+
+namespace osu.Game.Online.API.Requests
+{
+ public class GetUserBeatmapsRequest : APIRequest>
+ {
+ private readonly long userId;
+ private readonly int offset;
+ private readonly BeatmapSetType type;
+
+ public GetUserBeatmapsRequest(long userId, BeatmapSetType type, int offset = 0)
+ {
+ this.userId = userId;
+ this.offset = offset;
+ this.type = type;
+ }
+
+ protected override string Target => $@"users/{userId}/beatmapsets/{type.ToString().Underscore()}?offset={offset}";
+ }
+
+ public enum BeatmapSetType
+ {
+ MostPlayed,
+ Favourite,
+ RankedAndApproved,
+ Unranked,
+ Graveyard
+ }
+}
diff --git a/osu.Game/Overlays/BeatmapSet/BasicStats.cs b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
index 885f9cc219..3ecff85bee 100644
--- a/osu.Game/Overlays/BeatmapSet/BasicStats.cs
+++ b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
@@ -39,9 +39,9 @@ namespace osu.Game.Overlays.BeatmapSet
if (value == beatmap) return;
beatmap = value;
- length.Value = TimeSpan.FromMilliseconds(beatmap.OnlineInfo.Length).ToString(@"m\:ss");
- circleCount.Value = beatmap.OnlineInfo.CircleCount.ToString("N0");
- sliderCount.Value = beatmap.OnlineInfo.SliderCount.ToString("N0");
+ length.Value = TimeSpan.FromSeconds(beatmap.OnlineInfo.Length).ToString(@"m\:ss");
+ circleCount.Value = beatmap.OnlineInfo.CircleCount.ToString();
+ sliderCount.Value = beatmap.OnlineInfo.SliderCount.ToString();
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs
index a9802c8155..0cfa7be81a 100644
--- a/osu.Game/Overlays/BeatmapSet/Header.cs
+++ b/osu.Game/Overlays/BeatmapSet/Header.cs
@@ -26,6 +26,8 @@ namespace osu.Game.Overlays.BeatmapSet
private readonly Box tabsBg;
private readonly Container coverContainer;
private readonly OsuSpriteText title, artist;
+ private readonly Container noVideoButtons;
+ private readonly FillFlowContainer videoButtons;
private readonly AuthorInfo author;
private readonly Container downloadButtonsContainer;
public Details Details;
@@ -51,6 +53,9 @@ namespace osu.Game.Overlays.BeatmapSet
title.Text = BeatmapSet.Metadata.Title;
artist.Text = BeatmapSet.Metadata.Artist;
+ noVideoButtons.FadeTo(BeatmapSet.OnlineInfo.HasVideo ? 0 : 1, transition_duration);
+ videoButtons.FadeTo(BeatmapSet.OnlineInfo.HasVideo ? 1 : 0, transition_duration);
+
cover?.FadeOut(400, Easing.Out);
coverContainer.Add(cover = new DelayedLoadWrapper(new BeatmapSetCover(BeatmapSet)
{
@@ -82,9 +87,6 @@ namespace osu.Game.Overlays.BeatmapSet
Radius = 3,
Offset = new Vector2(0f, 1f),
};
-
- Container noVideoButtons;
- FillFlowContainer videoButtons;
Children = new Drawable[]
{
new Container
@@ -216,21 +218,7 @@ namespace osu.Game.Overlays.BeatmapSet
},
};
- Picker.Beatmap.ValueChanged += b =>
- {
- Details.Beatmap = b;
-
- if (b.OnlineInfo.HasVideo)
- {
- noVideoButtons.FadeOut(transition_duration);
- videoButtons.FadeIn(transition_duration);
- }
- else
- {
- noVideoButtons.FadeIn(transition_duration);
- videoButtons.FadeOut(transition_duration);
- }
- };
+ Picker.Beatmap.ValueChanged += b => Details.Beatmap = b;
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Overlays/BeatmapSet/Info.cs b/osu.Game/Overlays/BeatmapSet/Info.cs
index 4a59591a72..bd108a193b 100644
--- a/osu.Game/Overlays/BeatmapSet/Info.cs
+++ b/osu.Game/Overlays/BeatmapSet/Info.cs
@@ -74,20 +74,18 @@ namespace osu.Game.Overlays.BeatmapSet
{
RelativeSizeAxes = Axes.Both,
Padding = new MarginPadding { Right = metadata_width + BeatmapSetOverlay.RIGHT_WIDTH + spacing * 2 },
- Child = new ScrollContainer
+ Child = new Container
{
RelativeSizeAxes = Axes.Both,
- ScrollbarVisible = false,
Child = description = new MetadataSection("Description"),
},
},
- new ScrollContainer
+ new Container
{
Anchor = Anchor.TopRight,
Origin = Anchor.TopRight,
RelativeSizeAxes = Axes.Y,
Width = metadata_width,
- ScrollbarVisible = false,
Padding = new MarginPadding { Horizontal = 10 },
Margin = new MarginPadding { Right = BeatmapSetOverlay.RIGHT_WIDTH + spacing },
Child = new FillFlowContainer
diff --git a/osu.Game/Overlays/BeatmapSet/SuccessRate.cs b/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
index 9402ed82f4..6df31b9f85 100644
--- a/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
+++ b/osu.Game/Overlays/BeatmapSet/SuccessRate.cs
@@ -29,7 +29,10 @@ namespace osu.Game.Overlays.BeatmapSet
if (value == beatmap) return;
beatmap = value;
- var rate = (float)beatmap.OnlineInfo.PassCount / beatmap.OnlineInfo.PlayCount;
+ int passCount = beatmap.OnlineInfo.PassCount;
+ int playCount = beatmap.OnlineInfo.PlayCount;
+
+ var rate = playCount != 0 ? (float)passCount / playCount : 0;
successPercent.Text = rate.ToString("P0");
successRate.Length = rate;
percentContainer.ResizeWidthTo(successRate.Length, 250, Easing.InOutCubic);
diff --git a/osu.Game/Overlays/BeatmapSetOverlay.cs b/osu.Game/Overlays/BeatmapSetOverlay.cs
index 7e80f427de..1173390d57 100644
--- a/osu.Game/Overlays/BeatmapSetOverlay.cs
+++ b/osu.Game/Overlays/BeatmapSetOverlay.cs
@@ -33,6 +33,8 @@ namespace osu.Game.Overlays
private RulesetStore rulesets;
private BeatmapManager manager;
+ private readonly ScrollContainer scroll;
+
// receive input outside our bounds so we can trigger a close event on ourselves.
public override bool ReceiveMouseInputAt(Vector2 screenSpacePos) => true;
@@ -64,7 +66,7 @@ namespace osu.Game.Overlays
RelativeSizeAxes = Axes.Both,
Colour = OsuColour.Gray(0.2f)
},
- new ScrollContainer
+ scroll = new ScrollContainer
{
RelativeSizeAxes = Axes.Both,
ScrollbarVisible = false,
@@ -130,6 +132,7 @@ namespace osu.Game.Overlays
{
currentBeatmap = header.BeatmapSet = info.BeatmapSet = set;
Show();
+ scroll.ScrollTo(0);
}
}
}
diff --git a/osu.Game/Overlays/Direct/DirectGridPanel.cs b/osu.Game/Overlays/Direct/DirectGridPanel.cs
index e863f78e3f..a40f20850e 100644
--- a/osu.Game/Overlays/Direct/DirectGridPanel.cs
+++ b/osu.Game/Overlays/Direct/DirectGridPanel.cs
@@ -29,6 +29,7 @@ namespace osu.Game.Overlays.Direct
public DirectGridPanel(BeatmapSetInfo beatmap) : base(beatmap)
{
+ Width = 400;
Height = 140 + vertical_padding; //full height of all the elements plus vertical padding (autosize uses the image)
}
diff --git a/osu.Game/Overlays/DirectOverlay.cs b/osu.Game/Overlays/DirectOverlay.cs
index d11f2342cd..6f7fabb910 100644
--- a/osu.Game/Overlays/DirectOverlay.cs
+++ b/osu.Game/Overlays/DirectOverlay.cs
@@ -222,7 +222,7 @@ namespace osu.Game.Overlays
switch (displayStyle)
{
case PanelDisplayStyle.Grid:
- return new DirectGridPanel(b) { Width = 400 };
+ return new DirectGridPanel(b);
default:
return new DirectListPanel(b);
}
diff --git a/osu.Game/Overlays/Profile/Sections/Beatmaps/PaginatedBeatmapContainer.cs b/osu.Game/Overlays/Profile/Sections/Beatmaps/PaginatedBeatmapContainer.cs
new file mode 100644
index 0000000000..834328ca0e
--- /dev/null
+++ b/osu.Game/Overlays/Profile/Sections/Beatmaps/PaginatedBeatmapContainer.cs
@@ -0,0 +1,72 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using OpenTK;
+using osu.Framework.Configuration;
+using osu.Framework.Graphics;
+using osu.Game.Online.API.Requests;
+using osu.Game.Overlays.Direct;
+using osu.Game.Users;
+using System.Linq;
+
+namespace osu.Game.Overlays.Profile.Sections.Beatmaps
+{
+ public class PaginatedBeatmapContainer : PaginatedContainer
+ {
+ private const float panel_padding = 10f;
+
+ private readonly BeatmapSetType type;
+
+ private DirectPanel currentlyPlaying;
+
+ public PaginatedBeatmapContainer(BeatmapSetType type, Bindable user, string header, string missing = "None... yet.")
+ : base(user, header, missing)
+ {
+ this.type = type;
+
+ ItemsPerPage = 6;
+
+ ItemsContainer.Spacing = new Vector2(panel_padding);
+ }
+
+ protected override void ShowMore()
+ {
+ base.ShowMore();
+
+ var req = new GetUserBeatmapsRequest(User.Value.Id, type, VisiblePages++ * ItemsPerPage);
+
+ req.Success += sets =>
+ {
+ ShowMoreButton.FadeTo(sets.Count == ItemsPerPage ? 1 : 0);
+ ShowMoreLoading.Hide();
+
+ if (!sets.Any())
+ {
+ MissingText.Show();
+ return;
+ }
+
+ foreach (var s in sets)
+ {
+ if (!s.OnlineBeatmapSetID.HasValue)
+ continue;
+
+ var panel = new DirectGridPanel(s.ToBeatmapSet(Rulesets));
+ ItemsContainer.Add(panel);
+
+ panel.PreviewPlaying.ValueChanged += isPlaying =>
+ {
+ if (!isPlaying) return;
+
+ if (currentlyPlaying != null && currentlyPlaying != panel)
+ currentlyPlaying.PreviewPlaying.Value = false;
+
+ currentlyPlaying = panel;
+ };
+ }
+ };
+
+ Api.Queue(req);
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Profile/Sections/BeatmapsSection.cs b/osu.Game/Overlays/Profile/Sections/BeatmapsSection.cs
index 1c39223e6f..3e88795b77 100644
--- a/osu.Game/Overlays/Profile/Sections/BeatmapsSection.cs
+++ b/osu.Game/Overlays/Profile/Sections/BeatmapsSection.cs
@@ -1,6 +1,9 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+using osu.Game.Online.API.Requests;
+using osu.Game.Overlays.Profile.Sections.Beatmaps;
+
namespace osu.Game.Overlays.Profile.Sections
{
public class BeatmapsSection : ProfileSection
@@ -8,5 +11,16 @@ namespace osu.Game.Overlays.Profile.Sections
public override string Title => "Beatmaps";
public override string Identifier => "beatmaps";
+
+ public BeatmapsSection()
+ {
+ Children = new[]
+ {
+ new PaginatedBeatmapContainer(BeatmapSetType.Favourite, User, "Favourite Beatmaps"),
+ new PaginatedBeatmapContainer(BeatmapSetType.RankedAndApproved, User, "Ranked & Approved Beatmaps"),
+ new PaginatedBeatmapContainer(BeatmapSetType.Unranked, User, "Pending Beatmaps"),
+ new PaginatedBeatmapContainer(BeatmapSetType.Graveyard, User, "Graveyarded Beatmaps"),
+ };
+ }
}
}
diff --git a/osu.Game/Overlays/Profile/Sections/HistoricalSection.cs b/osu.Game/Overlays/Profile/Sections/HistoricalSection.cs
index d25407f4a3..a4d043d20a 100644
--- a/osu.Game/Overlays/Profile/Sections/HistoricalSection.cs
+++ b/osu.Game/Overlays/Profile/Sections/HistoricalSection.cs
@@ -14,7 +14,7 @@ namespace osu.Game.Overlays.Profile.Sections
public HistoricalSection()
{
- Child = new PaginatedScoreContainer(ScoreType.Recent, User, "Recent Plays (24h)");
+ Child = new PaginatedScoreContainer(ScoreType.Recent, User, "Recent Plays (24h)", "No performance records. :(");
}
}
}
diff --git a/osu.Game/Overlays/Profile/Sections/PaginatedContainer.cs b/osu.Game/Overlays/Profile/Sections/PaginatedContainer.cs
new file mode 100644
index 0000000000..1d4045c379
--- /dev/null
+++ b/osu.Game/Overlays/Profile/Sections/PaginatedContainer.cs
@@ -0,0 +1,110 @@
+// Copyright (c) 2007-2017 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using OpenTK;
+using osu.Framework.Allocation;
+using osu.Framework.Configuration;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Graphics.UserInterface;
+using osu.Game.Online.API;
+using osu.Game.Rulesets;
+using osu.Game.Users;
+
+namespace osu.Game.Overlays.Profile.Sections
+{
+ public class PaginatedContainer : FillFlowContainer
+ {
+ protected readonly FillFlowContainer ItemsContainer;
+ protected readonly OsuHoverContainer ShowMoreButton;
+ protected readonly LoadingAnimation ShowMoreLoading;
+ protected readonly OsuSpriteText MissingText;
+
+ protected int VisiblePages;
+ protected int ItemsPerPage;
+
+ protected readonly Bindable User = new Bindable();
+
+ protected APIAccess Api;
+ protected RulesetStore Rulesets;
+
+ public PaginatedContainer(Bindable user, string header, string missing)
+ {
+ User.BindTo(user);
+
+ RelativeSizeAxes = Axes.X;
+ AutoSizeAxes = Axes.Y;
+ Direction = FillDirection.Vertical;
+
+ Children = new Drawable[]
+ {
+ new OsuSpriteText
+ {
+ TextSize = 15,
+ Text = header,
+ Font = "Exo2.0-RegularItalic",
+ Margin = new MarginPadding { Top = 10, Bottom = 10 },
+ },
+ ItemsContainer = new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Y,
+ RelativeSizeAxes = Axes.X,
+ Margin = new MarginPadding { Bottom = 10 }
+ },
+ ShowMoreButton = new OsuHoverContainer
+ {
+ Alpha = 0,
+ Action = ShowMore,
+ AutoSizeAxes = Axes.Both,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Child = new OsuSpriteText
+ {
+ TextSize = 14,
+ Text = "show more",
+ }
+ },
+ ShowMoreLoading = new LoadingAnimation
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Size = new Vector2(14),
+ },
+ MissingText = new OsuSpriteText
+ {
+ TextSize = 14,
+ Text = missing,
+ Alpha = 0,
+ },
+ };
+ }
+
+ [BackgroundDependencyLoader]
+ private void load(APIAccess api, RulesetStore rulesets)
+ {
+ Api = api;
+ Rulesets = rulesets;
+
+ User.ValueChanged += onUserChanged;
+ User.TriggerChange();
+ }
+
+ private void onUserChanged(User newUser)
+ {
+ VisiblePages = 0;
+ ItemsContainer.Clear();
+ ShowMoreButton.Hide();
+
+ if (newUser != null)
+ ShowMore();
+ }
+
+ protected virtual void ShowMore()
+ {
+ ShowMoreLoading.Show();
+ ShowMoreButton.Hide();
+ }
+ }
+}
diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawablePerformanceScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawablePerformanceScore.cs
index 0380b6c4b7..e6ba5b26ac 100644
--- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawablePerformanceScore.cs
+++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawablePerformanceScore.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
}
[BackgroundDependencyLoader]
- private new void load(OsuColour colour)
+ private void load(OsuColour colour)
{
double pp = Score.PP ?? 0;
Stats.Add(new OsuSpriteText
diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs
index 91f5650b92..4fc15a202b 100644
--- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs
+++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableScore.cs
@@ -7,7 +7,6 @@ using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics;
-using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Sprites;
using osu.Game.Rulesets.Mods;
using osu.Game.Screens.Select.Leaderboards;
@@ -15,66 +14,113 @@ using System.Linq;
using osu.Framework.Localisation;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
+using OpenTK.Graphics;
+using osu.Framework.Graphics.Shapes;
+using osu.Framework.Graphics.Cursor;
+using osu.Framework.Input;
+using osu.Framework.Extensions.Color4Extensions;
+using osu.Game.Graphics.Containers;
namespace osu.Game.Overlays.Profile.Sections.Ranks
{
public abstract class DrawableScore : Container
{
+ private const int fade_duration = 200;
+
protected readonly FillFlowContainer Stats;
private readonly FillFlowContainer metadata;
private readonly ModContainer modContainer;
protected readonly Score Score;
+ private readonly Box underscoreLine;
+ private readonly Box coloredBackground;
+ private readonly Container background;
protected DrawableScore(Score score)
{
Score = score;
+ RelativeSizeAxes = Axes.X;
+ Height = 60;
Children = new Drawable[]
{
- new DrawableRank(score.Rank)
+ background = new Container
{
- RelativeSizeAxes = Axes.Y,
- Width = 60,
- FillMode = FillMode.Fit,
- },
- Stats = new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreRight,
- Direction = FillDirection.Vertical,
- },
- metadata = new FillFlowContainer
- {
- RelativeSizeAxes = Axes.X,
- AutoSizeAxes = Axes.Y,
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.CentreLeft,
- Margin = new MarginPadding { Left = 70 },
- Direction = FillDirection.Vertical,
- Child = new OsuSpriteText
+ RelativeSizeAxes = Axes.Both,
+ Masking = true,
+ CornerRadius = 3,
+ Alpha = 0,
+ EdgeEffect = new EdgeEffectParameters
{
- Text = score.Date.LocalDateTime.ToShortDateString(),
- TextSize = 11,
- Colour = OsuColour.Gray(0xAA),
- Depth = -1,
+ Type = EdgeEffectType.Shadow,
+ Offset = new Vector2(0f, 1f),
+ Radius = 1f,
+ Colour = Color4.Black.Opacity(0.2f),
},
+ Child = coloredBackground = new Box { RelativeSizeAxes = Axes.Both }
},
- modContainer = new ModContainer
+ new Container
{
- AutoSizeAxes = Axes.Y,
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreRight,
- Width = 60,
- Margin = new MarginPadding { Right = 150 }
- }
+ RelativeSizeAxes = Axes.Both,
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Width = 0.97f,
+ Children = new Drawable[]
+ {
+ underscoreLine = new Box
+ {
+ Anchor = Anchor.BottomCentre,
+ Origin = Anchor.BottomCentre,
+ RelativeSizeAxes = Axes.X,
+ Height = 1,
+ },
+ new DrawableRank(score.Rank)
+ {
+ RelativeSizeAxes = Axes.Y,
+ Width = 60,
+ FillMode = FillMode.Fit,
+ },
+ Stats = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ Direction = FillDirection.Vertical,
+ },
+ metadata = new FillFlowContainer
+ {
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Margin = new MarginPadding { Left = 70 },
+ Direction = FillDirection.Vertical,
+ Child = new OsuSpriteText
+ {
+ Text = score.Date.LocalDateTime.ToShortDateString(),
+ TextSize = 11,
+ Colour = OsuColour.Gray(0xAA),
+ Depth = -1,
+ },
+ },
+ modContainer = new ModContainer
+ {
+ AutoSizeAxes = Axes.Y,
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ Width = 60,
+ Margin = new MarginPadding { Right = 160 }
+ }
+ }
+ },
};
}
[BackgroundDependencyLoader(true)]
private void load(OsuColour colour, LocalisationEngine locale, BeatmapSetOverlay beatmapSetOverlay)
{
+ coloredBackground.Colour = underscoreLine.Colour = colour.Gray4;
+
Stats.Add(new OsuSpriteText
{
Text = $"accuracy: {Score.Accuracy:P2}",
@@ -86,7 +132,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
Depth = -1,
});
- metadata.Add(new OsuHoverContainer
+ metadata.Add(new MetadataContainer(Score.Beatmap.Metadata.Title, Score.Beatmap.Metadata.Artist)
{
AutoSizeAxes = Axes.Both,
Action = () =>
@@ -126,6 +172,22 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
});
}
+ protected override bool OnClick(InputState state) => true;
+
+ protected override bool OnHover(InputState state)
+ {
+ background.FadeIn(fade_duration, Easing.OutQuint);
+ underscoreLine.FadeOut(fade_duration, Easing.OutQuint);
+ return true;
+ }
+
+ protected override void OnHoverLost(InputState state)
+ {
+ background.FadeOut(fade_duration, Easing.OutQuint);
+ underscoreLine.FadeIn(fade_duration, Easing.OutQuint);
+ base.OnHoverLost(state);
+ }
+
private class ModContainer : FlowContainer
{
protected override IEnumerable ComputeLayoutPositions()
@@ -135,5 +197,15 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
yield return new Vector2(DrawWidth * i * (count == 1 ? 0 : 1f / (count - 1)), 0);
}
}
+
+ private class MetadataContainer : OsuHoverContainer, IHasTooltip
+ {
+ public string TooltipText { get; set; }
+
+ public MetadataContainer(string title, string artist)
+ {
+ TooltipText = $"{artist} - {title}";
+ }
+ }
}
}
diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableTotalScore.cs b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableTotalScore.cs
index 7aa9d75f02..537b208b39 100644
--- a/osu.Game/Overlays/Profile/Sections/Ranks/DrawableTotalScore.cs
+++ b/osu.Game/Overlays/Profile/Sections/Ranks/DrawableTotalScore.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
}
[BackgroundDependencyLoader]
- private new void load()
+ private void load()
{
Stats.Add(new OsuSpriteText
{
diff --git a/osu.Game/Overlays/Profile/Sections/Ranks/PaginatedScoreContainer.cs b/osu.Game/Overlays/Profile/Sections/Ranks/PaginatedScoreContainer.cs
index 060bb03014..bb383cac0d 100644
--- a/osu.Game/Overlays/Profile/Sections/Ranks/PaginatedScoreContainer.cs
+++ b/osu.Game/Overlays/Profile/Sections/Ranks/PaginatedScoreContainer.cs
@@ -1,130 +1,53 @@
// Copyright (c) 2007-2017 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using OpenTK;
-using osu.Framework.Allocation;
using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics.Containers;
-using osu.Game.Graphics.Sprites;
-using osu.Game.Graphics.UserInterface;
-using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
-using osu.Game.Rulesets;
using osu.Game.Users;
using System;
using System.Linq;
namespace osu.Game.Overlays.Profile.Sections.Ranks
{
- public class PaginatedScoreContainer : FillFlowContainer
+ public class PaginatedScoreContainer : PaginatedContainer
{
- private readonly FillFlowContainer scoreContainer;
- private readonly OsuSpriteText missing;
- private readonly OsuHoverContainer showMoreButton;
- private readonly LoadingAnimation showMoreLoading;
-
private readonly bool includeWeight;
private readonly ScoreType type;
- private int visiblePages;
- private readonly Bindable user = new Bindable();
-
- private RulesetStore rulesets;
- private APIAccess api;
-
- public PaginatedScoreContainer(ScoreType type, Bindable user, string header, bool includeWeight = false)
+ public PaginatedScoreContainer(ScoreType type, Bindable user, string header, string missing, bool includeWeight = false)
+ : base(user, header, missing)
{
this.type = type;
this.includeWeight = includeWeight;
- this.user.BindTo(user);
- RelativeSizeAxes = Axes.X;
- AutoSizeAxes = Axes.Y;
- Direction = FillDirection.Vertical;
+ ItemsPerPage = 5;
- Children = new Drawable[]
- {
- new OsuSpriteText
- {
- TextSize = 15,
- Text = header,
- Font = "Exo2.0-RegularItalic",
- Margin = new MarginPadding { Top = 10, Bottom = 10 },
- },
- scoreContainer = new FillFlowContainer
- {
- AutoSizeAxes = Axes.Y,
- RelativeSizeAxes = Axes.X,
- Direction = FillDirection.Vertical,
- },
- showMoreButton = new OsuHoverContainer
- {
- Alpha = 0,
- Action = showMore,
- AutoSizeAxes = Axes.Both,
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Child = new OsuSpriteText
- {
- TextSize = 14,
- Text = "show more",
- }
- },
- showMoreLoading = new LoadingAnimation
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.TopCentre,
- Size = new Vector2(14),
- },
- missing = new OsuSpriteText
- {
- TextSize = 14,
- Text = type == ScoreType.Recent ? "No performance records. :(" : "No awesome performance records yet. :(",
- },
- };
+ ItemsContainer.Direction = FillDirection.Vertical;
}
- [BackgroundDependencyLoader]
- private void load(APIAccess api, RulesetStore rulesets)
+ protected override void ShowMore()
{
- this.api = api;
- this.rulesets = rulesets;
+ base.ShowMore();
- user.ValueChanged += user_ValueChanged;
- user.TriggerChange();
- }
-
- private void user_ValueChanged(User newUser)
- {
- visiblePages = 0;
- scoreContainer.Clear();
- showMoreButton.Hide();
- missing.Show();
-
- if (newUser != null)
- showMore();
- }
-
- private void showMore()
- {
- var req = new GetUserScoresRequest(user.Value.Id, type, visiblePages++ * 5);
-
- showMoreLoading.Show();
- showMoreButton.Hide();
+ var req = new GetUserScoresRequest(User.Value.Id, type, VisiblePages++ * ItemsPerPage);
req.Success += scores =>
{
foreach (var s in scores)
- s.ApplyRuleset(rulesets.GetRuleset(s.OnlineRulesetID));
+ s.ApplyRuleset(Rulesets.GetRuleset(s.OnlineRulesetID));
- showMoreButton.FadeTo(scores.Count == 5 ? 1 : 0);
- showMoreLoading.Hide();
+ ShowMoreButton.FadeTo(scores.Count == ItemsPerPage ? 1 : 0);
+ ShowMoreLoading.Hide();
- if (!scores.Any()) return;
+ if (!scores.Any())
+ {
+ MissingText.Show();
+ return;
+ }
- missing.Hide();
+ MissingText.Hide();
foreach (OnlineScore score in scores)
{
@@ -133,21 +56,18 @@ namespace osu.Game.Overlays.Profile.Sections.Ranks
switch (type)
{
default:
- drawableScore = new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, scoreContainer.Count) : (double?)null);
+ drawableScore = new DrawablePerformanceScore(score, includeWeight ? Math.Pow(0.95, ItemsContainer.Count) : (double?)null);
break;
case ScoreType.Recent:
drawableScore = new DrawableTotalScore(score);
break;
}
- drawableScore.RelativeSizeAxes = Axes.X;
- drawableScore.Height = 60;
-
- scoreContainer.Add(drawableScore);
+ ItemsContainer.Add(drawableScore);
}
};
- api.Queue(req);
+ Api.Queue(req);
}
}
}
diff --git a/osu.Game/Overlays/Profile/Sections/RanksSection.cs b/osu.Game/Overlays/Profile/Sections/RanksSection.cs
index 553691ef77..7691100d7a 100644
--- a/osu.Game/Overlays/Profile/Sections/RanksSection.cs
+++ b/osu.Game/Overlays/Profile/Sections/RanksSection.cs
@@ -16,8 +16,8 @@ namespace osu.Game.Overlays.Profile.Sections
{
Children = new[]
{
- new PaginatedScoreContainer(ScoreType.Best, User, "Best Performance", true),
- new PaginatedScoreContainer(ScoreType.Firsts, User, "First Place Ranks"),
+ new PaginatedScoreContainer(ScoreType.Best, User, "Best Performance", "No performance records. :(", true),
+ new PaginatedScoreContainer(ScoreType.Firsts, User, "First Place Ranks", "No awesome performance records yet. :("),
};
}
}
diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs
index e03fc91aa7..a3933b775e 100644
--- a/osu.Game/Overlays/Settings/SettingsItem.cs
+++ b/osu.Game/Overlays/Settings/SettingsItem.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Overlays.Settings
private SpriteText text;
- private readonly RestoreDefaultValueButton restoreDefaultValueButton = new RestoreDefaultValueButton();
+ private readonly RestoreDefaultValueButton restoreDefaultValueButton = new RestoreDefaultValueButton();
public bool ShowsDefaultIndicator = true;
@@ -132,7 +132,7 @@ namespace osu.Game.Overlays.Settings
}
}
- private class RestoreDefaultValueButton : Box, IHasTooltip
+ private class RestoreDefaultValueButton : Box, IHasTooltip
{
private Bindable bindable;
internal Bindable Bindable
diff --git a/osu.Game/Overlays/UserProfileOverlay.cs b/osu.Game/Overlays/UserProfileOverlay.cs
index 5032f2d55b..dd31a43290 100644
--- a/osu.Game/Overlays/UserProfileOverlay.cs
+++ b/osu.Game/Overlays/UserProfileOverlay.cs
@@ -91,12 +91,12 @@ namespace osu.Game.Overlays
sections = new ProfileSection[]
{
- new AboutSection(),
+ //new AboutSection(),
//new RecentSection(),
new RanksSection(),
//new MedalsSection(),
new HistoricalSection(),
- //new BeatmapsSection(),
+ new BeatmapsSection(),
//new KudosuSection()
};
tabs = new ProfileTabControl
@@ -164,6 +164,7 @@ namespace osu.Game.Overlays
}
Show();
+ sectionsContainer.ScrollToTop();
}
private void userLoadComplete(User user)
diff --git a/osu.Game/Resources/Resource.cs b/osu.Game/Resources/Resource.cs
deleted file mode 100644
index 6c66b6818b..0000000000
--- a/osu.Game/Resources/Resource.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2007-2017 ppy Pty Ltd .
-// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-
-using System;
-using System.IO;
-using System.Reflection;
-
-namespace osu.Game.Tests.Resources
-{
- public static class Resource
- {
- public static Stream OpenResource(string name)
- {
- var localPath = Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path));
-
- return Assembly.GetExecutingAssembly().GetManifestResourceStream($@"osu.Game.Tests.Resources.{name}") ??
- Assembly.LoadFrom(Path.Combine(localPath, @"osu.Game.Resources.dll")).GetManifestResourceStream($@"osu.Game.Resources.{name}");
- }
- }
-}
\ No newline at end of file
diff --git a/osu.Game/Resources/Soleily - Renatus (Gamu) [Insane].osu b/osu.Game/Resources/Soleily - Renatus (Gamu) [Insane].osu
deleted file mode 100644
index 3e44dc0af8..0000000000
--- a/osu.Game/Resources/Soleily - Renatus (Gamu) [Insane].osu
+++ /dev/null
@@ -1,1002 +0,0 @@
-osu file format v14
-
-[General]
-AudioFilename: 03. Renatus - Soleily 192kbps.mp3
-AudioLeadIn: 0
-PreviewTime: 164471
-Countdown: 0
-SampleSet: Soft
-StackLeniency: 0.7
-Mode: 0
-LetterboxInBreaks: 0
-WidescreenStoryboard: 0
-
-[Editor]
-Bookmarks: 11505,22054,32604,43153,53703,64252,74802,85351,95901,106450,116999,119637,130186,140735,151285,161834,164471,175020,185570,196119,206669,209306
-DistanceSpacing: 1.8
-BeatDivisor: 4
-GridSize: 4
-TimelineZoom: 2
-
-[Metadata]
-Title:Renatus
-TitleUnicode:Renatus
-Artist:Soleily
-ArtistUnicode:Soleily
-Creator:Gamu
-Version:Insane
-Source:
-Tags:MBC7 Unisphere 地球ヤバイEP Chikyu Yabai
-BeatmapID:557821
-BeatmapSetID:241526
-
-[Difficulty]
-HPDrainRate:6.5
-CircleSize:4
-OverallDifficulty:8
-ApproachRate:9
-SliderMultiplier:1.8
-SliderTickRate:2
-
-[Events]
-//Background and Video events
-0,0,"machinetop_background.jpg",0,0
-//Break Periods
-2,122474,140135
-//Storyboard Layer 0 (Background)
-//Storyboard Layer 1 (Fail)
-//Storyboard Layer 2 (Pass)
-//Storyboard Layer 3 (Foreground)
-//Storyboard Sound Samples
-
-[TimingPoints]
-956,329.67032967033,4,2,0,60,1,0
-20736,-100,4,2,0,65,0,0
-22054,-100,4,2,0,70,0,0
-43153,-100,4,2,0,60,0,0
-48428,-100,4,2,0,50,0,0
-52879,-100,4,2,0,50,0,0
-53373,-100,4,2,0,60,0,0
-53703,-100,4,2,0,70,0,1
-74719,-100,4,2,0,70,0,0
-74802,-100,4,2,0,70,0,1
-95901,-100,4,2,0,70,0,0
-116999,-133.333333333333,4,2,0,50,0,0
-117164,-133.333333333333,4,2,0,30,0,0
-117329,-79.9999999999999,4,2,0,50,0,0
-117659,-100,4,2,0,50,0,0
-118977,-100,4,2,0,60,0,0
-119307,-100,4,2,0,70,0,0
-119637,659.340659340659,4,2,0,80,1,0
-119966,-100,4,2,0,70,0,0
-120296,-100,4,2,0,60,0,0
-120626,-100,4,2,0,50,0,0
-120955,-100,4,2,0,40,0,0
-121285,-100,4,2,0,30,0,0
-121615,-100,4,2,0,20,0,0
-121944,-100,4,2,0,10,0,0
-122274,-100,4,2,0,5,0,0
-140735,-100,4,2,0,50,0,0
-151285,-80,4,2,0,60,0,0
-161834,329.67032967033,4,2,0,65,1,0
-164141,-100,4,2,0,70,0,0
-164471,-100,4,2,0,70,0,1
-185487,-100,4,2,0,70,0,0
-185570,-100,4,2,0,70,0,1
-206669,659.340659340659,4,2,0,80,1,0
-206998,-100,4,2,0,70,0,0
-207328,-100,4,2,0,60,0,0
-207658,-100,4,2,0,50,0,0
-207987,-100,4,2,0,40,0,0
-208317,-100,4,2,0,30,0,0
-208647,-100,4,2,0,20,0,0
-208976,-100,4,2,0,10,0,0
-209306,-100,4,2,0,5,0,0
-
-
-[Colours]
-Combo1 : 142,199,255
-Combo2 : 255,128,128
-Combo3 : 128,255,255
-Combo4 : 128,255,128
-Combo5 : 255,187,255
-Combo6 : 255,177,140
-
-[HitObjects]
-192,168,956,6,0,P|184:128|200:80,1,90,4|0,1:2|0:0,0:0:0:0:
-304,56,1285,1,8,0:0:0:0:
-244,236,1450,2,0,P|204:252|156:244,1,90,2|0,0:0|0:0,0:0:0:0:
-276,156,1780,2,0,P|310:181|329:226,1,90,2|8,1:2|0:0,0:0:0:0:
-300,328,2109,1,2,0:0:0:0:
-192,332,2274,6,0,L|144:340,2,45,0|0|0,1:0|0:0|0:0,0:0:0:0:
-388,300,2604,1,8,0:0:0:0:
-244,236,2769,1,0,1:0:0:0:
-232,208,2851,1,0,0:0:0:0:
-224,176,2934,1,0,0:0:0:0:
-228,144,3016,1,0,0:0:0:0:
-244,116,3098,1,0,1:0:0:0:
-332,52,3263,2,0,P|376:48|424:56,1,90,8|0,0:0|0:0,0:0:0:0:
-488,228,3593,5,0,1:0:0:0:
-460,240,3675,1,0,0:0:0:0:
-428,236,3758,1,0,0:0:0:0:
-292,160,3923,2,0,P|288:204|300:252,1,90,8|0,0:0|0:0,0:0:0:0:
-316,276,4170,1,0,0:0:0:0:
-344,292,4252,2,0,L|388:300,1,45,0|0,0:0|0:0,0:0:0:0:
-288,356,4417,2,0,L|244:364,1,45,0|0,1:0|0:0,0:0:0:0:
-168,328,4582,2,0,P|124:324|72:332,1,90,8|0,0:0|0:0,0:0:0:0:
-24,188,4912,5,0,1:0:0:0:
-56,192,4994,1,0,0:0:0:0:
-88,196,5076,1,0,0:0:0:0:
-148,108,5241,1,8,0:0:0:0:
-188,240,5406,1,0,1:0:0:0:
-188,240,5488,1,0,0:0:0:0:
-188,240,5571,2,0,L|168:328,1,90,0|0,0:0|1:0,0:0:0:0:
-260,216,5901,2,0,P|236:180|188:164,1,90,8|0,0:0|0:0,0:0:0:0:
-248,296,6230,6,0,L|348:292,1,90,0|0,1:0|0:0,0:0:0:0:
-504,232,6560,1,8,0:0:0:0:
-400,204,6725,1,0,0:0:0:0:
-392,176,6807,1,0,0:0:0:0:
-384,144,6890,1,0,0:0:0:0:
-376,116,6972,1,0,0:0:0:0:
-368,88,7054,1,0,1:0:0:0:
-188,48,7219,2,0,L|208:140,1,90,8|0,0:0|0:0,0:0:0:0:
-248,296,7549,5,0,1:0:0:0:
-207,135,7714,1,0,0:0:0:0:
-156,232,7879,1,8,0:0:0:0:
-316,191,8043,1,0,1:0:0:0:
-316,191,8126,1,0,0:0:0:0:
-316,191,8208,2,0,L|372:200,1,45,0|0,0:0|0:0,0:0:0:0:
-492,200,8373,2,0,L|447:207,1,45,0|0,1:0|0:0,0:0:0:0:
-408,136,8538,2,0,P|396:92|400:48,1,90,8|0,0:0|0:0,0:0:0:0:
-260,32,8868,5,0,1:0:0:0:
-252,64,8950,1,0,0:0:0:0:
-236,92,9032,2,0,P|204:116|148:128,1,90,0|8,0:0|0:0,0:0:0:0:
-28,188,9362,1,0,0:0:0:0:
-60,196,9445,1,0,0:0:0:0:
-88,212,9527,2,0,P|112:244|124:300,1,90,0|0,0:0|1:0,0:0:0:0:
-112,128,9857,2,0,P|152:156|184:196,1,90,8|0,0:0|0:0,0:0:0:0:
-216,288,10186,5,0,1:0:0:0:
-216,288,10269,1,0,0:0:0:0:
-216,288,10351,1,0,0:0:0:0:
-268,192,10516,1,8,0:0:0:0:
-356,128,10681,1,0,1:0:0:0:
-388,120,10763,1,0,0:0:0:0:
-420,128,10846,2,0,P|440:168|436:220,1,90,0|0,0:0|1:0,0:0:0:0:
-332,328,11175,2,0,L|280:332,1,45,8|8,0:0|0:0,0:0:0:0:
-216,288,11340,2,0,L|164:292,1,45,0|0,1:0|0:0,1:0:0:0:
-100,248,11505,5,4,1:2:0:0:
-148,116,11670,1,2,0:0:0:0:
-268,192,11835,1,10,0:0:0:0:
-136,328,11999,2,0,L|44:336,1,90,2|0,0:0|0:0,0:0:0:0:
-216,288,12329,1,2,1:2:0:0:
-148,116,12494,1,10,0:0:0:0:
-100,248,12659,1,2,0:0:0:0:
-268,192,12824,5,0,1:0:0:0:
-268,192,12906,1,0,0:0:0:0:
-268,192,12988,1,0,0:0:0:0:
-340,272,13153,2,0,P|384:276|432:264,1,90,8|0,0:0|1:0,0:0:0:0:
-452,244,13401,1,0,0:0:0:0:
-468,216,13483,2,0,L|476:124,1,90,0|0,0:0|1:0,0:0:0:0:
-368,32,13813,2,0,L|360:121,1,90,8|0,0:0|0:0,0:0:0:0:
-340,272,14142,6,0,L|316:316,2,45,0|0|0,1:0|0:0|0:0,0:0:0:0:
-452,244,14472,1,8,0:0:0:0:
-268,192,14637,1,0,0:0:0:0:
-236,188,14719,1,0,0:0:0:0:
-204,192,14802,2,0,P|172:228|160:272,1,90,0|0,0:0|1:0,0:0:0:0:
-128,140,15131,2,0,P|160:104|172:60,1,90,8|0,0:0|0:0,0:0:0:0:
-64,52,15461,6,0,L|20:68,2,45,0|0|0,1:0|0:0|0:0,0:0:0:0:
-171,64,15791,1,8,0:0:0:0:
-264,8,15956,2,0,L|356:12,1,90,0|0,1:0|0:0,0:0:0:0:
-452,56,16285,1,0,1:0:0:0:
-296,140,16450,2,0,L|206:136,1,90,8|0,0:0|0:0,0:0:0:0:
-108,184,16780,6,0,P|92:224|96:272,1,90,0|0,1:0|0:0,0:0:0:0:
-200,244,17109,1,8,0:0:0:0:
-108,108,17274,2,0,L|12:116,1,90,0|0,0:0|0:0,0:0:0:0:
-200,244,17604,1,0,1:0:0:0:
-296,140,17769,2,0,L|385:132,1,90,8|0,0:0|0:0,0:0:0:0:
-480,184,18098,5,0,1:0:0:0:
-488,216,18181,1,0,0:0:0:0:
-496,248,18263,2,0,L|492:340,1,90,0|8,0:0|0:0,0:0:0:0:
-404,224,18593,2,0,L|396:176,2,45,0|0|0,1:0|0:0|0:0,0:0:0:0:
-304,264,18923,1,0,1:0:0:0:
-200,244,19087,2,0,P|156:240|108:248,1,90,8|0,0:0|0:0,0:0:0:0:
-296,140,19417,6,0,P|340:144|388:136,1,90,0|0,1:0|0:0,0:0:0:0:
-440,44,19747,1,8,0:0:0:0:
-404,224,19912,1,0,0:0:0:0:
-404,224,19994,1,0,0:0:0:0:
-404,224,20076,2,0,L|412:320,1,90,0|0,0:0|1:0,0:0:0:0:
-200,244,20406,2,0,L|192:154,1,90,8|0,0:0|0:0,0:0:0:0:
-184,44,20736,5,4,1:2:0:0:
-152,40,20818,1,0,0:0:0:0:
-120,48,20901,1,0,0:0:0:0:
-96,68,20983,1,0,0:0:0:0:
-76,92,21065,1,2,0:3:0:0:
-64,120,21148,1,0,0:0:0:0:
-60,152,21230,1,0,1:0:0:0:
-64,184,21313,1,0,0:0:0:0:
-76,212,21395,2,0,L|96:252,3,45,0|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-144,316,21725,2,0,L|188:324,3,45,0|0|2|0,0:0|0:0|0:3|0:0,0:0:0:0:
-268,340,22054,6,0,L|364:336,1,90,4|0,1:2|0:0,0:0:0:0:
-452,280,22384,1,8,0:0:0:0:
-512,188,22549,2,0,P|516:144|504:96,1,90,2|0,0:0|0:0,0:0:0:0:
-340,24,22879,2,0,P|336:68|348:116,1,90,2|8,1:2|0:0,0:0:0:0:
-420,192,23208,1,2,0:0:0:0:
-328,252,23373,6,0,L|232:240,1,90,0|0,1:0|0:0,0:0:0:0:
-64,256,23703,1,8,0:0:0:0:
-144,184,23868,2,0,P|148:140|136:88,1,90,0|0,1:0|0:0,0:0:0:0:
-40,52,24197,1,2,1:2:0:0:
-139,95,24362,1,8,0:0:0:0:
-216,20,24527,1,0,0:0:0:0:
-315,63,24692,6,0,P|360:72|408:68,1,90,2|0,1:2|0:0,0:0:0:0:
-492,132,25021,1,8,0:0:0:0:
-412,204,25186,2,0,P|403:249|407:297,1,90,2|0,0:0|0:0,0:0:0:0:
-268,328,25516,2,0,P|277:283|273:235,1,90,2|8,1:2|0:0,0:0:0:0:
-232,140,25846,2,0,P|187:131|139:135,1,90,2|0,0:0|1:0,0:0:0:0:
-64,208,26175,5,2,0:0:0:0:
-44,316,26340,1,8,0:0:0:0:
-148,280,26505,1,2,1:2:0:0:
-456,208,26835,1,2,1:2:0:0:
-476,316,26999,1,10,0:0:0:0:
-372,280,27164,1,2,0:0:0:0:
-356,172,27329,6,0,L|380:80,1,90,0|0,1:0|0:0,0:0:0:0:
-456,208,27659,1,8,0:0:0:0:
-300,236,27824,1,2,0:0:0:0:
-300,236,27906,1,0,0:0:0:0:
-300,236,27988,2,0,L|208:228,1,90,0|2,0:0|1:2,0:0:0:0:
-140,312,28318,1,8,0:0:0:0:
-372,280,28483,2,0,L|464:272,1,90,2|0,0:0|1:0,0:0:0:0:
-500,136,28813,5,2,0:0:0:0:
-432,56,28977,1,8,0:0:0:0:
-328,24,29142,2,0,P|284:24|236:28,1,90,2|0,1:2|0:0,0:0:0:0:
-80,144,29472,1,2,1:2:0:0:
-116,44,29637,1,10,0:0:0:0:
-184,128,29802,1,2,0:0:0:0:
-20,88,29966,6,0,P|1:164|73:227,1,180,2|10,1:2|0:0,0:0:0:0:
-184,128,30461,2,0,P|227:120|276:124,1,90,2|0,0:0|0:0,0:0:0:0:
-392,188,30791,1,2,1:2:0:0:
-272,260,30956,1,8,0:0:0:0:
-396,328,31120,1,0,0:0:0:0:
-256,348,31285,5,2,1:2:0:0:
-224,344,31368,1,0,1:0:0:0:
-192,340,31450,2,0,L|172:248,1,90,2|0,1:2|1:0,0:0:0:0:
-8,136,31780,2,0,L|27:223,1,90,2|0,1:2|0:0,0:0:0:0:
-56,328,32109,1,2,1:2:0:0:
-108,192,32274,1,2,1:2:0:0:
-100,160,32357,1,0,1:0:0:0:
-92,132,32439,1,2,1:2:0:0:
-84,104,32521,1,0,1:0:0:0:
-76,72,32604,6,0,P|100:112|148:136,1,90,4|0,1:2|0:0,0:0:0:0:
-240,168,32934,1,8,0:0:0:0:
-336,124,33098,2,0,L|344:80,2,45,2|0|0,0:0|0:0|0:0,0:0:0:0:
-264,248,33428,2,0,P|220:248|176:220,1,90,2|8,1:2|0:0,0:0:0:0:
-260,84,33758,1,2,0:0:0:0:
-344,212,33923,5,0,1:0:0:0:
-344,212,34005,1,0,0:0:0:0:
-344,212,34087,1,0,0:0:0:0:
-440,160,34252,1,8,0:0:0:0:
-312,320,34417,2,0,P|272:336|220:324,1,90,0|0,1:0|0:0,0:0:0:0:
-156,176,34747,2,0,P|196:160|248:172,2,90,2|8|0,1:2|0:0|0:0,0:0:0:0:
-132,280,35241,5,2,1:2:0:0:
-132,280,35324,1,0,0:0:0:0:
-132,280,35406,2,0,L|120:376,1,90,0|8,0:0|0:0,0:0:0:0:
-312,320,35736,2,0,L|300:230,1,90,2|0,0:0|0:0,0:0:0:0:
-316,124,36065,1,2,1:2:0:0:
-400,192,36230,1,8,0:0:0:0:
-300,230,36395,2,0,P|255:231|211:224,1,90,2|0,0:0|1:0,0:0:0:0:
-24,132,36725,5,0,0:0:0:0:
-132,152,36890,1,8,0:0:0:0:
-60,232,37054,1,2,1:2:0:0:
-60,232,37137,1,0,0:0:0:0:
-60,232,37219,1,0,0:0:0:0:
-92,56,37384,2,0,L|184:44,1,90,2|10,1:2|0:0,0:0:0:0:
-316,124,37714,2,0,L|226:135,1,90,2|0,0:0|1:0,0:0:0:0:
-60,232,38043,6,0,P|52:276|64:328,1,90,0|8,0:0|0:0,0:0:0:0:
-220,152,38373,2,0,P|176:144|124:156,1,90,2|0,0:0|0:0,0:0:0:0:
-176,252,38703,1,2,1:2:0:0:
-323,213,38868,2,0,L|316:124,1,90,8|2,0:0|0:0,0:0:0:0:
-332,320,39197,5,0,1:0:0:0:
-424,260,39362,1,2,0:0:0:0:
-260,272,39527,2,0,P|246:313|256:360,1,90,8|2,0:0|1:2,0:0:0:0:
-408,336,39857,1,0,0:0:0:0:
-176,252,40021,2,0,L|80:260,2,90,2|10|2,1:2|0:0|0:0,0:0:0:0:
-324,212,40516,5,2,1:2:0:0:
-324,212,40598,1,0,1:0:0:0:
-324,212,40681,1,0,1:0:0:0:
-200,336,40846,1,2,1:2:0:0:
-236,188,41010,1,2,1:2:0:0:
-236,188,41093,1,0,1:0:0:0:
-236,188,41175,1,0,1:0:0:0:
-281,357,41340,1,2,1:2:0:0:
-176,252,41505,1,2,1:2:0:0:
-176,252,41587,1,0,1:0:0:0:
-176,252,41670,1,0,1:0:0:0:
-344,297,41835,5,2,1:2:0:0:
-432,232,41999,1,2,1:2:0:0:
-444,204,42082,1,0,1:0:0:0:
-448,172,42164,1,0,1:0:0:0:
-444,140,42247,1,0,1:0:0:0:
-432,112,42329,2,0,L|440:64,2,45,2|0|0,1:2|1:0|1:0,0:0:0:0:
-236,188,42659,1,0,0:0:0:0:
-340,172,42824,1,2,0:3:0:0:
-272,88,42988,1,0,0:0:0:0:
-132,160,43153,6,0,P|148:248|220:296,1,180,4|8,1:2|0:0,0:0:0:0:
-324,320,43648,2,0,L|336:364,2,45,0|0|0,0:0|0:0|0:0,0:0:0:0:
-292,216,43977,1,0,1:0:0:0:
-396,240,44142,2,0,P|440:244|488:232,1,90,8|0,0:0|0:0,0:0:0:0:
-328,124,44472,6,0,P|284:120|236:132,1,90,0|0,1:0|0:0,0:0:0:0:
-168,212,44802,1,8,0:0:0:0:
-192,316,44966,1,0,1:0:0:0:
-140,220,45131,1,0,0:0:0:0:
-83,310,45296,1,0,1:0:0:0:
-114,205,45461,1,8,0:0:0:0:
-10,229,45626,1,0,0:0:0:0:
-106,176,45791,6,0,P|113:133|108:85,1,90,0|0,1:0|0:0,0:0:0:0:
-204,136,46120,1,8,0:0:0:0:
-256,40,46285,1,0,0:0:0:0:
-256,40,46368,1,0,0:0:0:0:
-256,40,46450,2,0,L|356:44,1,90,0|0,0:0|1:0,0:0:0:0:
-501,124,46780,2,0,L|412:128,1,90,8|0,0:0|0:0,0:0:0:0:
-324,192,47109,5,0,1:0:0:0:
-356,296,47274,1,0,0:0:0:0:
-284,216,47439,1,8,0:0:0:0:
-269,323,47604,1,0,1:0:0:0:
-237,220,47769,1,0,0:0:0:0:
-178,311,47934,1,0,1:0:0:0:
-191,203,48098,1,8,0:0:0:0:
-99,261,48263,1,0,0:0:0:0:
-156,168,48428,6,0,B|176:112|136:64|136:64|200:96,1,180,4|8,1:2|0:0,0:0:0:0:
-300,124,48923,2,0,L|392:120,1,90,0|0,0:0|0:0,0:0:0:0:
-468,48,49252,1,0,1:0:0:0:
-390,120,49417,2,0,P|390:164|406:208,1,90,8|0,0:0|0:0,0:0:0:0:
-352,344,49747,6,0,P|352:300|336:256,1,90,4|0,1:2|0:0,0:0:0:0:
-240,208,50076,1,8,0:0:0:0:
-163,320,50241,2,0,P|207:324|252:316,1,90,0|0,1:0|0:0,0:0:0:0:
-240,208,50571,1,0,1:0:0:0:
-76,296,50736,2,0,P|76:340|92:384,1,90,8|0,0:0|0:0,0:0:0:0:
-312,164,51065,6,0,P|236:124|160:184,1,180,4|8,1:2|0:0,0:0:0:0:
-247,297,51560,2,0,L|240:208,1,90,0|0,0:0|0:0,0:0:0:0:
-224,48,51890,1,0,1:0:0:0:
-332,56,52054,2,0,L|366:58,5,30,8|0|0|0|0|0,0:0|0:0|0:0|0:0|0:0|0:0,0:0:0:0:
-408,64,52384,6,0,P|420:108|416:156,1,90,0|0,1:0|0:0,0:0:0:0:
-360,260,52714,1,8,0:0:0:0:
-247,297,52879,2,0,B|203:281|159:297|159:297|115:313|71:297,1,180,0|0,1:0|1:0,0:0:0:0:
-116,196,53373,1,8,0:0:0:0:
-120,164,53456,1,0,0:0:0:0:
-124,132,53538,1,0,0:0:0:0:
-128,100,53620,1,0,0:0:0:0:
-132,68,53703,5,4,1:2:0:0:
-40,136,53868,1,0,0:0:0:0:
-204,160,54032,2,0,L|304:152,1,90,8|0,0:0|0:0,0:0:0:0:
-408,64,54362,1,0,0:0:0:0:
-408,64,54445,1,0,0:0:0:0:
-408,64,54527,2,0,P|404:112|416:160,1,90,0|8,1:0|0:0,0:0:0:0:
-484,236,54857,1,0,0:0:0:0:
-428,328,55021,5,0,1:0:0:0:
-328,296,55186,1,0,0:0:0:0:
-328,296,55269,1,0,0:0:0:0:
-328,296,55351,1,8,0:0:0:0:
-416,300,55516,1,0,1:0:0:0:
-472,208,55681,1,0,0:0:0:0:
-316,268,55846,1,0,1:0:0:0:
-460,180,56010,1,8,0:0:0:0:
-304,240,56175,1,0,0:0:0:0:
-404,272,56340,5,0,1:0:0:0:
-448,152,56505,1,0,0:0:0:0:
-448,152,56587,1,0,0:0:0:0:
-448,152,56670,2,0,P|456:112|448:60,1,90,8|0,0:0|0:0,0:0:0:0:
-268,28,56999,2,0,P|260:68|268:120,1,90,0|0,0:0|1:0,0:0:0:0:
-404,272,57329,2,0,P|444:280|496:272,2,90,8|0|0,0:0|0:0|1:0,0:0:0:0:
-304,240,57824,5,0,0:0:0:0:
-252,336,57988,1,8,0:0:0:0:
-196,244,58153,1,0,1:0:0:0:
-24,256,58318,1,0,0:0:0:0:
-116,200,58483,1,0,1:0:0:0:
-136,60,58648,1,8,0:0:0:0:
-192,152,58813,1,0,0:0:0:0:
-304,240,58977,6,0,P|348:252|396:248,1,90,0|0,1:0|0:0,0:0:0:0:
-456,116,59307,2,0,P|412:104|364:108,1,90,8|0,0:0|0:0,0:0:0:0:
-273,161,59637,1,0,0:0:0:0:
-136,60,59802,1,0,1:0:0:0:
-192,152,59966,1,8,0:0:0:0:
-23,177,60131,1,0,0:0:0:0:
-129,203,60296,5,0,1:0:0:0:
-88,304,60461,2,0,P|132:311|176:303,1,90,0|8,0:0|0:0,0:0:0:0:
-304,240,60791,1,0,1:0:0:0:
-304,240,60873,1,0,0:0:0:0:
-304,240,60956,2,0,L|312:288,3,45,0|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-384,256,61285,2,0,L|392:304,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-464,272,61615,5,2,1:2:0:0:
-488,168,61780,1,2,0:0:0:0:
-428,80,61945,1,10,0:0:0:0:
-332,32,62109,2,0,P|288:28|240:36,1,90,2|0,0:0|0:0,0:0:0:0:
-28,216,62439,1,2,1:2:0:0:
-88,304,62604,1,10,0:0:0:0:
-184,352,62769,2,0,P|228:356|276:348,1,90,2|0,0:0|1:0,0:0:0:0:
-384,256,63098,6,0,P|409:219|426:174,1,90,2|8,0:0|0:0,0:0:0:0:
-428,80,63428,2,0,L|420:36,2,45,2|0|0,1:2|0:0|0:0,0:0:0:0:
-456,288,63758,1,2,1:2:0:0:
-324,200,63923,1,10,1:2:0:0:
-292,204,64005,1,0,1:0:0:0:
-260,208,64087,1,2,1:2:0:0:
-228,212,64170,1,0,1:0:0:0:
-196,216,64252,5,4,1:2:0:0:
-104,160,64417,1,0,0:0:0:0:
-228,296,64582,2,0,L|320:284,1,90,8|0,0:0|0:0,0:0:0:0:
-344,112,64912,1,0,0:0:0:0:
-344,112,64994,1,0,0:0:0:0:
-344,112,65076,2,0,L|254:123,1,90,0|8,1:0|0:0,0:0:0:0:
-144,284,65406,2,0,P|148:328|176:364,1,90,0|0,0:0|1:0,0:0:0:0:
-196,216,65736,5,0,0:0:0:0:
-196,216,65818,1,0,0:0:0:0:
-196,216,65901,2,0,P|155:198|110:205,1,90,8|0,0:0|1:0,0:0:0:0:
-36,284,66230,1,0,0:0:0:0:
-4,180,66395,1,0,1:0:0:0:
-132,24,66560,1,8,0:0:0:0:
-100,128,66725,1,0,0:0:0:0:
-24,48,66890,5,0,1:0:0:0:
-212,108,67054,1,0,0:0:0:0:
-212,108,67137,1,0,0:0:0:0:
-212,108,67219,2,0,L|300:92,1,90,8|0,0:0|0:0,0:0:0:0:
-472,144,67549,2,0,L|384:160,1,90,0|0,0:0|1:0,0:0:0:0:
-196,216,67879,2,0,P|240:216|288:240,1,90,8|0,0:0|0:0,0:0:0:0:
-324,336,68208,5,0,1:0:0:0:
-144,288,68373,1,0,0:0:0:0:
-58,170,68538,1,8,0:0:0:0:
-196,215,68703,1,0,1:0:0:0:
-58,260,68868,1,0,0:0:0:0:
-144,142,69032,2,0,L|138:108,2,30,0|0|0,1:0|0:0|0:0,0:0:0:0:
-144,142,69197,2,0,P|184:124|232:132,1,90,8|0,0:0|0:0,0:0:0:0:
-312,248,69527,6,0,L|324:338,1,90,0|0,1:0|0:0,0:0:0:0:
-436,248,69857,1,8,0:0:0:0:
-432,216,69939,1,0,0:0:0:0:
-428,184,70021,1,0,0:0:0:0:
-328,120,70186,1,0,0:0:0:0:
-324,152,70269,1,0,0:0:0:0:
-320,184,70351,1,0,1:0:0:0:
-316,216,70434,1,0,0:0:0:0:
-312,248,70516,2,0,L|320:300,1,45,8|0,0:0|0:0,0:0:0:0:
-244,340,70681,2,0,L|237:295,1,45,0|0,0:0|0:0,0:0:0:0:
-216,224,70846,6,0,P|168:216|124:224,1,90,0|0,1:0|0:0,0:0:0:0:
-40,288,71175,1,8,0:0:0:0:
-2,95,71340,2,0,P|-4:139|4:184,1,90,0|0,1:0|0:0,0:0:0:0:
-164,304,71670,1,0,1:0:0:0:
-312,248,71835,1,8,0:0:0:0:
-244,340,71999,1,0,0:0:0:0:
-216,224,72164,6,0,L|228:132,1,90,0|0,1:0|0:0,0:0:0:0:
-332,148,72494,2,0,L|344:56,1,90,8|0,0:0|0:0,0:0:0:0:
-312,248,72824,1,0,0:0:0:0:
-164,304,72988,1,0,1:0:0:0:
-332,336,73153,1,8,0:0:0:0:
-360,324,73236,1,0,0:0:0:0:
-384,304,73318,1,0,0:0:0:0:
-399,276,73401,1,0,0:0:0:0:
-403,244,73483,6,0,L|396:200,3,45,4|0|2|0,1:2|0:0|0:0|1:0,0:0:0:0:
-420,112,73813,2,0,L|427:68,3,45,2|0|2|0,1:2|0:0|1:2|0:0,0:0:0:0:
-352,16,74142,2,0,L|345:60,3,45,0|0|2|0,0:0|1:0|1:2|0:0,0:0:0:0:
-332,148,74472,1,2,1:2:0:0:
-332,148,74554,1,0,1:0:0:0:
-332,148,74637,1,2,1:2:0:0:
-332,148,74719,1,0,1:0:0:0:
-332,148,74802,6,0,P|360:216|320:312,1,180,4|2,1:2|0:3,0:0:0:0:
-190,310,75296,2,0,P|151:231|180:148,1,180,4|0,1:2|0:0,0:0:0:0:
-256,56,75791,1,0,0:0:0:0:
-332,148,75956,1,2,0:3:0:0:
-179,148,76120,5,4,1:2:0:0:
-336,64,76285,1,4,1:2:0:0:
-256,224,76450,1,2,0:3:0:0:
-176,64,76615,1,4,1:2:0:0:
-256,140,76780,2,0,L|256:324,1,180,2|0,0:0|0:0,0:0:0:0:
-364,300,77274,1,2,0:3:0:0:
-148,300,77439,6,0,P|104:316|76:356,1,90,4|0,1:2|0:0,0:0:0:0:
-24,252,77769,2,0,L|16:208,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-96,212,78098,2,0,L|104:168,3,45,0|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-32,128,78428,2,0,L|24:84,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-104,88,78758,5,2,1:2:0:0:
-204,132,78923,1,0,0:0:0:0:
-236,124,79005,1,0,0:0:0:0:
-268,116,79087,2,0,L|280:68,3,45,8|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-348,100,79417,2,0,L|360:52,3,45,0|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-428,84,79747,1,8,1:2:0:0:
-460,76,79829,1,0,1:0:0:0:
-492,68,79912,1,0,1:0:0:0:
-492,260,80076,6,0,P|400:248|328:296,1,180,4|2,1:2|0:3,0:0:0:0:
-144,236,80571,2,0,P|236:248|308:200,1,180,4|0,1:2|0:0,0:0:0:0:
-348,100,81065,2,0,P|348:56|336:8,1,90,0|2,0:0|0:3,0:0:0:0:
-140,48,81395,5,4,1:2:0:0:
-244,68,81560,1,4,1:2:0:0:
-144,236,81725,1,2,0:3:0:0:
-176,133,81890,1,4,1:2:0:0:
-184,304,82054,2,0,P|100:300|68:220,1,180,2|0,0:0|0:0,0:0:0:0:
-100,116,82549,1,2,0:3:0:0:
-264,244,82714,6,0,L|272:340,1,90,4|0,1:2|0:0,0:0:0:0:
-380,316,83043,1,8,0:0:0:0:
-396,288,83126,1,0,0:0:0:0:
-400,256,83208,1,0,0:0:0:0:
-396,224,83291,1,0,0:0:0:0:
-380,196,83373,2,0,L|336:176,3,45,0|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-272,148,83703,1,8,0:0:0:0:
-256,120,83785,1,0,0:0:0:0:
-252,88,83868,1,0,0:0:0:0:
-256,56,83950,1,0,0:0:0:0:
-272,28,84032,6,0,L|316:8,3,45,2|0|0|0,1:2|0:0|0:0|0:0,0:0:0:0:
-360,72,84362,2,0,L|408:72,3,45,8|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-421,149,84692,2,0,L|464:169,3,45,2|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-443,244,85021,2,0,L|473:281,3,45,8|0|0|0,1:2|1:0|0:0|0:0,0:0:0:0:
-422,339,85351,6,0,L|240:348,1,180,4|2,1:2|0:3,0:0:0:0:
-76,172,85846,2,0,L|255:163,1,180,4|0,1:2|0:0,0:0:0:0:
-421,149,86340,2,0,P|435:107|428:56,1,90,0|2,0:0|0:3,0:0:0:0:
-228,56,86670,5,4,1:2:0:0:
-280,192,86835,1,4,1:2:0:0:
-328,96,86999,1,2,0:3:0:0:
-180,152,87164,1,4,1:2:0:0:
-28,100,87330,2,0,P|16:56|20:8,1,90,2|0,0:0|0:0,0:0:0:0:
-0,180,87659,1,0,0:0:0:0:
-28,284,87824,1,2,0:3:0:0:
-108,352,87988,6,0,P|152:360|196:356,1,90,4|0,1:2|0:0,0:0:0:0:
-276,284,88318,1,8,0:0:0:0:
-304,272,88401,1,0,0:0:0:0:
-336,268,88483,1,0,0:0:0:0:
-368,272,88565,1,0,0:0:0:0:
-396,284,88648,2,0,L|432:312,1,45,0|0,0:0|0:0,0:0:0:0:
-488,252,88813,2,0,L|452:224,1,45,0|0,1:0|0:0,0:0:0:0:
-400,164,88977,2,0,L|396:116,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-316,64,89307,6,0,L|320:160,1,90,2|0,1:2|0:0,0:0:0:0:
-276,284,89637,1,8,0:0:0:0:
-248,296,89719,1,0,0:0:0:0:
-216,300,89802,1,0,1:0:0:0:
-184,296,89884,1,0,0:0:0:0:
-156,284,89966,2,0,L|120:256,1,45,0|0,0:0|0:0,0:0:0:0:
-176,200,90131,2,0,L|140:172,1,45,0|0,1:0|0:0,0:0:0:0:
-196,116,90296,2,0,L|160:88,3,45,8|0|0|0,1:2|1:0|1:0|0:0,0:0:0:0:
-92,44,90626,6,0,P|48:44|24:160,1,180,4|2,1:2|0:3,0:0:0:0:
-156,284,91120,2,0,B|200:300|244:284|244:284|288:268|332:284,1,180,4|0,1:2|0:0,0:0:0:0:
-176,200,91615,2,0,P|176:156|196:116,1,90,0|2,0:0|0:3,0:0:0:0:
-264,28,91945,6,0,L|353:39,1,90,4|0,1:2|1:0,0:0:0:0:
-453,159,92274,2,0,L|364:148,1,90,2|4,0:3|1:2,0:0:0:0:
-268,196,92604,2,0,P|260:268|328:348,1,180,2|0,0:0|0:0,0:0:0:0:
-364,248,93098,1,2,0:3:0:0:
-176,200,93263,5,4,1:2:0:0:
-72,228,93428,1,0,1:0:0:0:
-152,92,93593,1,0,1:0:0:0:
-256,64,93758,1,0,1:0:0:0:
-336,200,93923,5,0,1:0:0:0:
-440,228,94087,1,0,1:0:0:0:
-360,92,94252,1,0,1:0:0:0:
-256,64,94417,1,0,1:0:0:0:
-176,200,94582,5,2,1:2:0:0:
-168,228,94664,1,0,1:0:0:0:
-168,260,94747,1,0,1:0:0:0:
-172,292,94829,1,0,1:0:0:0:
-192,316,94912,1,0,1:0:0:0:
-220,328,94994,1,0,1:0:0:0:
-252,332,95076,1,0,1:0:0:0:
-280,320,95159,1,0,1:0:0:0:
-300,296,95241,2,0,L|308:248,3,45,2|0|0|0,1:2|1:0|1:0|1:0,0:0:0:0:
-312,172,95571,2,0,L|304:127,3,45,0|0|0|0,1:0|1:0|1:0|1:0,0:0:0:0:
-256,64,95901,6,0,P|208:56|164:60,1,90,4|0,1:2|0:0,0:0:0:0:
-76,116,96230,1,8,0:0:0:0:
-60,224,96395,1,0,0:0:0:0:
-60,224,96477,1,0,0:0:0:0:
-160,184,96642,1,0,0:0:0:0:
-160,184,96725,1,0,1:0:0:0:
-63,26,96890,2,0,L|76:116,1,90,8|0,0:0|0:0,0:0:0:0:
-136,272,97219,5,0,1:0:0:0:
-168,268,97302,1,0,0:0:0:0:
-200,264,97384,1,0,0:0:0:0:
-232,260,97466,1,0,0:0:0:0:
-264,256,97549,1,8,0:0:0:0:
-384,136,97714,1,0,1:0:0:0:
-376,168,97796,1,0,0:0:0:0:
-380,200,97879,1,0,0:0:0:0:
-392,228,97961,1,0,0:0:0:0:
-416,248,98043,2,0,P|464:260|512:260,2,90,0|8|0,1:0|0:0|0:0,0:0:0:0:
-231,105,98538,6,0,L|188:116,2,45,0|0|0,1:0|0:0|0:0,0:0:0:0:
-376,56,98868,2,0,L|420:64,1,45,8|0,0:0|0:0,0:0:0:0:
-384,136,99032,1,0,0:0:0:0:
-384,136,99115,2,0,P|340:128|304:92,1,90,0|0,0:0|0:0,0:0:0:0:
-303,18,99362,2,0,L|207:26,2,90,0|8|0,1:0|0:0|0:0,0:0:0:0:
-452,88,99857,5,0,1:0:0:0:
-465,116,99939,1,0,0:0:0:0:
-466,147,100021,1,0,0:0:0:0:
-456,177,100104,1,0,0:0:0:0:
-436,201,100186,2,0,P|416:213|389:216,3,45,8|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-320,188,100516,2,0,P|300:176|273:173,3,45,0|0|0|0,0:0|1:0|1:0|0:0,0:0:0:0:
-204,200,100846,2,0,P|192:220|189:247,3,45,8|0|0|0,0:0|0:0|1:0|0:0,0:0:0:0:
-188,320,101175,6,0,P|143:322|100:310,1,90,0|0,1:0|0:0,0:0:0:0:
-76,292,101423,1,0,0:0:0:0:
-76,292,101505,1,8,0:0:0:0:
-76,292,101587,2,0,L|72:248,1,45
-12,68,101835,2,0,L|6:24,2,45,0|0|0,0:0|0:0|1:0,0:0:0:0:
-104,140,102164,2,0,L|171:132,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-224,124,102494,6,0,P|236:164|232:216,1,90,0|0,1:0|0:0,0:0:0:0:
-288,296,102824,1,8,0:0:0:0:
-288,296,102906,1,0,0:0:0:0:
-288,296,102988,2,0,P|328:284|380:288,1,90,0|0,1:0|0:0,0:0:0:0:
-404,304,103236,1,0,0:0:0:0:
-424,328,103318,1,0,1:0:0:0:
-448,188,103483,2,0,L|440:140,3,45,8|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0:
-424,72,103813,5,0,1:0:0:0:
-324,112,103977,1,0,0:0:0:0:
-324,112,104060,1,0,0:0:0:0:
-324,112,104142,2,0,P|280:116|232:104,1,90,8|0,0:0|0:0,0:0:0:0:
-160,28,104472,1,0,0:0:0:0:
-216,208,104637,1,0,1:0:0:0:
-216,208,104719,1,0,0:0:0:0:
-216,208,104802,1,8,0:0:0:0:
-352,240,104966,1,0,0:0:0:0:
-384,244,105049,1,0,0:0:0:0:
-416,248,105131,6,0,L|460:240,4,45,0|0|0|0|8,1:0|0:0|0:0|0:0|0:0,0:0:0:0:
-272,288,105626,1,0,1:0:0:0:
-264,320,105708,1,0,0:0:0:0:
-256,352,105791,2,0,L|204:356,5,30,0|0|0|0|0|0,0:0|0:0|0:0|1:0|0:0|0:0,0:0:0:0:
-156,332,106120,2,0,L|104:336,5,30,8|0|0|0|0|0,0:0|0:0|0:0|1:0|0:0|0:0,0:0:0:0:
-56,312,106450,5,4,1:2:0:0:
-4,188,106615,1,0,0:0:0:0:
-168,220,106780,2,0,P|127:232|79:228,1,90,8|0,0:0|0:0,0:0:0:0:
-112,124,107109,1,0,0:0:0:0:
-272,216,107274,2,0,L|264:316,1,90,0|8,1:0|0:0,0:0:0:0:
-400,268,107604,1,0,0:0:0:0:
-428,132,107769,5,0,1:0:0:0:
-428,132,107851,1,0,0:0:0:0:
-428,132,107934,1,0,0:0:0:0:
-428,132,108016,1,0,0:0:0:0:
-428,132,108098,1,8,0:0:0:0:
-332,84,108263,2,0,P|288:80|232:88,1,90,0|0,1:0|0:0,0:0:0:0:
-112,124,108593,1,0,1:0:0:0:
-148,264,108758,1,8,0:0:0:0:
-16,236,108923,1,0,0:0:0:0:
-264,126,109087,6,0,L|272:216,1,90,0|0,1:0|0:0,0:0:0:0:
-452,224,109417,2,0,L|460:320,1,90,8|0,0:0|0:0,0:0:0:0:
-360,232,109747,1,0,0:0:0:0:
-348,56,109912,1,0,1:0:0:0:
-416,140,110076,1,8,0:0:0:0:
-256,112,110241,2,0,P|212:120|160:112,1,90,0|0,0:0|1:0,0:0:0:0:
-348,56,110571,6,0,L|331:150,1,90,0|8,0:0|0:0,0:0:0:0:
-208,328,110901,2,0,L|191:239,1,90,0|0,1:0|0:0,0:0:0:0:
-184,216,111148,1,0,1:0:0:0:
-178,194,111230,1,0,1:0:0:0:
-68,272,111395,1,8,0:0:0:0:
-56,136,111560,1,0,1:0:0:0:
-178,194,111725,6,0,P|219:203|267:199,1,90,4|0,1:2|0:0,0:0:0:0:
-364,148,112054,1,8,0:0:0:0:
-384,256,112219,2,0,P|406:291|443:322,1,90,0|0,0:0|0:0,0:0:0:0:
-488,224,112549,1,0,1:0:0:0:
-304,232,112714,2,0,L|208:224,2,90,8|0|0,0:0|0:0|1:0,0:0:0:0:
-208,328,113208,6,0,L|112:320,1,90,0|8,0:0|0:0,0:0:0:0:
-26,184,113538,2,0,L|116:192,1,90,0|0,1:0|0:0,0:0:0:0:
-304,232,113868,1,0,1:0:0:0:
-116,192,114032,1,8,0:0:0:0:
-224,132,114197,1,0,0:0:0:0:
-208,328,114362,6,0,B|272:360|320:312|320:312|340:368,1,180,4|8,1:2|0:0,0:0:0:0:
-304,232,114857,2,0,P|300:184|308:140,1,90,0|0,0:0|0:0,0:0:0:0:
-384,64,115186,1,0,1:0:0:0:
-307,143,115351,1,8,0:0:0:0:
-256,48,115516,1,0,0:0:0:0:
-456,24,115681,6,0,B|482:101|420:136|420:136|440:184,1,180,4|8,1:2|0:0,0:0:0:0:
-384,64,116175,2,0,P|340:56|296:64,1,90,0|0,1:0|0:0,0:0:0:0:
-211,171,116505,1,0,1:0:0:0:
-439,181,116670,2,0,L|448:84,1,90,8|0,0:0|0:0,0:0:0:0:
-372,296,116999,6,2,L|304:292,1,67.5000025749208,2|0,0:1|0:0,0:0:0:0:
-136,252,117329,6,2,P|196:260|212:172,1,168.75,0|0,0:0|0:0,0:0:0:0:
-192,148,117659,1,2,0:3:0:0:
-164,132,117741,1,2,0:3:0:0:
-132,124,117824,1,2,1:3:0:0:
-100,132,117906,1,2,0:3:0:0:
-72,148,117988,2,0,L|52:56,1,90,2|8,0:3|0:0,0:0:0:0:
-36,244,118318,5,0,1:0:0:0:
-76,344,118483,1,0,1:0:0:0:
-184,352,118648,1,0,1:0:0:0:
-244,264,118813,1,0,1:0:0:0:
-244,264,118895,1,0,1:0:0:0:
-244,264,118977,2,0,L|288:260,3,45,2|0|2|0,1:2|0:0|0:0|0:0,0:0:0:0:
-332,328,119307,2,0,L|376:324,3,45,2|0|2|0,1:2|0:0|0:0|0:0,0:0:0:0:
-412,252,119637,5,4,1:2:0:0:
-256,192,119719,12,0,122274,0:0:0:0:
-256,192,140735,6,0,L|228:156,1,45,4|0,1:2|0:0,0:0:0:0:
-152,132,141065,2,0,P|129:129|104:136,1,45
-48,192,141395,2,0,P|40:236|52:280,1,90,8|8,0:0|0:0,0:0:0:0:
-196,352,142054,6,0,L|308:340,1,90,8|8,0:0|1:2,0:0:0:0:
-336,280,142549,1,0,0:0:0:0:
-404,324,142713,1,8,0:0:0:0:
-404,324,142878,1,8,0:0:0:0:
-292,120,143373,5,0,1:0:0:0:
-212,104,143538,1,0,0:0:0:0:
-140,140,143702,1,0,0:0:0:0:
-120,220,143867,1,0,0:0:0:0:
-144,296,144032,2,0,P|184:320|228:316,1,90,10|8,0:0|0:0,0:0:0:0:
-372,212,144691,6,0,P|327:209|290:232,1,90,10|8,0:0|1:2,0:0:0:0:
-348,288,145186,1,0,0:0:0:0:
-452,220,145351,1,10,0:0:0:0:
-452,220,145516,1,8,0:0:0:0:
-328,36,146010,5,2,1:2:0:0:
-264,88,146175,1,0,0:0:0:0:
-184,108,146340,1,0,0:0:0:0:
-104,88,146505,1,0,0:0:0:0:
-44,36,146669,1,8,0:0:0:0:
-44,36,146999,1,8,0:0:0:0:
-44,36,147329,6,0,L|24:84,1,45,8|0,0:0|0:0,0:0:0:0:
-52,156,147658,2,0,L|71:204,1,45,8|0,1:2|0:0,0:0:0:0:
-144,236,147988,1,8,0:0:0:0:
-144,236,148153,1,8,0:0:0:0:
-316,64,148647,5,0,1:0:0:0:
-380,116,148812,1,0,0:0:0:0:
-408,192,148977,1,0,0:0:0:0:
-380,268,149142,1,0,0:0:0:0:
-316,320,149307,2,0,L|224:316,1,90,10|8,0:0|0:0,0:0:0:0:
-64,248,149966,5,10,0:0:0:0:
-144,236,150131,1,0,0:0:0:0:
-188,168,150296,1,8,1:2:0:0:
-192,88,150461,1,0,0:0:0:0:
-140,24,150626,2,0,P|120:16|96:20,1,45,10|0,0:0|0:0,0:0:0:0:
-260,132,150955,2,0,P|280:140|304:136,1,45,2|0,0:0|0:0,0:0:0:0:
-476,48,151285,6,0,L|484:160,1,112.5,4|0,1:2|0:0,0:0:0:0:
-464,236,151779,1,0,0:0:0:0:
-436,308,151944,2,0,P|380:320|324:308,1,112.5,8|8,0:0|0:0,0:0:0:0:
-76,308,152604,6,0,P|132:320|188:308,1,112.5,8|8,0:0|1:2,0:0:0:0:
-256,88,153263,1,8,0:0:0:0:
-256,168,153428,1,8,0:0:0:0:
-256,168,153922,5,4,1:2:0:0:
-256,248,154087,1,0,0:0:0:0:
-324,128,154252,1,0,0:0:0:0:
-188,128,154417,1,0,0:0:0:0:
-332,212,154582,2,0,L|388:204,1,56.25,10|0,0:0|0:0,0:0:0:0:
-492,152,154911,2,0,L|436:144,1,56.25,8|0,0:0|0:0,0:0:0:0:
-324,128,155241,5,10,0:0:0:0:
-180,212,155406,1,0,0:0:0:0:
-332,212,155571,1,8,1:2:0:0:
-188,128,155735,1,0,0:0:0:0:
-256,248,155900,1,10,0:0:0:0:
-256,248,156065,2,0,L|256:304,2,56.25,0|0|0,0:0|0:0|0:0,0:0:0:0:
-180,212,156560,6,0,L|124:204,1,56.25,4|0,1:2|0:0,0:0:0:0:
-20,152,156889,2,0,L|76:144,1,56.25,0|0,0:0|0:0,0:0:0:0:
-188,128,157219,2,0,P|212:72|192:16,1,112.5,8|8,0:0|0:0,0:0:0:0:
-132,72,157713,1,0,0:0:0:0:
-180,212,157878,6,0,L|236:208,1,56.25,8|0,0:0|0:0,0:0:0:0:
-360,252,158208,2,8,L|304:248,1,56.25,8|0,1:2|0:0,0:0:0:0:
-168,292,158538,2,0,L|160:356,2,56.25,8|8|0,0:0|0:0|0:0,0:0:0:0:
-180,212,159032,1,0,0:0:0:0:
-144,140,159197,6,0,P|104:128|36:148,1,112.5,2|0,1:2|0:0,0:0:0:0:
-12,220,159691,1,0,0:0:0:0:
-36,296,159856,2,0,P|60:316|92:324,1,56.25,8|0,0:0|0:0,0:0:0:0:
-215,264,160186,2,0,P|189:273|168:292,1,56.25,8|0,0:0|0:0,0:0:0:0:
-228,344,160516,6,0,L|284:340,1,56.25,10|0,0:0|0:0,0:0:0:0:
-328,276,160845,2,0,L|384:272,1,56.25,8|0,1:2|0:0,0:0:0:0:
-428,208,161175,1,8,0:0:0:0:
-440,128,161340,1,8,0:0:0:0:
-400,60,161505,1,2,0:0:0:0:
-328,28,161669,1,0,0:0:0:0:
-212,76,161834,6,0,P|200:120|208:164,1,90,2|0,1:2|1:0,0:0:0:0:
-300,308,162163,2,0,P|312:264|304:220,1,90,2|0,1:2|1:0,0:0:0:0:
-140,236,162493,2,0,P|184:248|228:240,1,90,2|0,1:2|1:0,0:0:0:0:
-372,148,162823,2,0,P|328:136|284:144,1,90,2|0,1:2|1:0,0:0:0:0:
-104,316,163152,5,2,1:2:0:0:
-78,297,163235,1,0,1:0:0:0:
-60,270,163317,1,0,1:0:0:0:
-54,239,163399,1,0,1:0:0:0:
-58,207,163482,1,2,1:2:0:0:
-74,180,163564,1,0,1:0:0:0:
-98,159,163647,1,0,1:0:0:0:
-127,149,163729,1,0,1:0:0:0:
-158,150,163812,2,0,L|208:160,1,45,2|0,1:2|1:0,0:0:0:0:
-344,184,163976,2,0,L|294:194,1,45,0|0,1:0|1:0,0:0:0:0:
-140,236,164141,1,4,1:2:0:0:
-140,236,164471,6,0,L|232:252,1,90,4|0,1:2|0:0,0:0:0:0:
-344,184,164801,1,8,0:0:0:0:
-380,284,164965,1,0,0:0:0:0:
-368,104,165130,2,0,P|324:104|284:128,1,90,0|0,0:0|1:0,0:0:0:0:
-356,360,165460,2,0,P|400:360|440:336,1,90,8|0,0:0|0:0,0:0:0:0:
-432,208,165790,5,0,1:0:0:0:
-292,260,165954,1,0,0:0:0:0:
-344,184,166119,1,8,0:0:0:0:
-204,236,166284,1,0,1:0:0:0:
-204,236,166366,1,0,0:0:0:0:
-204,236,166449,2,0,L|216:328,1,90,0|0,0:0|1:0,0:0:0:0:
-120,208,166779,2,0,L|131:118,1,90,8|0,0:0|0:0,0:0:0:0:
-204,236,167108,5,0,1:0:0:0:
-32,216,167273,1,0,0:0:0:0:
-130,118,167438,1,8,0:0:0:0:
-110,298,167603,1,0,0:0:0:0:
-110,298,167685,1,0,0:0:0:0:
-110,298,167768,2,0,L|121:208,1,90,0|0,0:0|1:0,0:0:0:0:
-304,40,168097,2,0,L|315:130,1,90,8|0,0:0|0:0,0:0:0:0:
-328,236,168427,5,0,1:0:0:0:
-184,148,168592,1,0,0:0:0:0:
-314,129,168757,1,8,0:0:0:0:
-197,254,168921,1,0,1:0:0:0:
-197,254,169004,1,0,0:0:0:0:
-197,254,169086,2,0,P|220:292|260:312,1,90,0|0,0:0|1:0,0:0:0:0:
-409,210,169416,2,0,P|365:211|328:236,1,90,8|0,0:0|0:0,0:0:0:0:
-488,232,169746,6,0,P|487:192|464:149,1,90,0|0,1:0|0:0,0:0:0:0:
-314,129,170075,1,8,0:0:0:0:
-409,210,170240,1,0,0:0:0:0:
-332,40,170405,2,0,L|240:36,1,90,0|0,0:0|1:0,0:0:0:0:
-68,144,170735,2,0,L|157:140,1,90,8|0,0:0|0:0,0:0:0:0:
-314,129,171064,5,0,1:0:0:0:
-332,40,171229,1,0,0:0:0:0:
-324,216,171394,1,8,0:0:0:0:
-306,305,171559,1,0,1:0:0:0:
-257,178,171724,1,0,0:0:0:0:
-168,160,171888,1,0,1:0:0:0:
-384,164,172053,1,8,0:0:0:0:
-473,182,172218,1,0,0:0:0:0:
-306,305,172383,6,0,L|216:312,1,90,0|0,1:0|0:0,0:0:0:0:
-60,172,172713,1,8,0:0:0:0:
-120,260,172877,1,0,0:0:0:0:
-168,160,173042,2,0,L|172:68,1,90,0|0,0:0|1:0,0:0:0:0:
-309,216,173372,2,0,L|306:306,1,90,8|0,0:0|0:0,0:0:0:0:
-120,260,173702,5,0,1:0:0:0:
-152,256,173784,1,0,1:0:0:0:
-184,252,173866,1,0,1:0:0:0:
-309,216,174031,1,8,0:0:0:0:
-103,168,174196,1,0,1:0:0:0:
-135,164,174279,1,0,1:0:0:0:
-167,160,174361,1,0,1:0:0:0:
-292,124,174526,1,0,1:0:0:0:
-87,76,174691,1,8,1:2:0:0:
-119,72,174773,1,0,1:0:0:0:
-151,68,174855,1,0,1:0:0:0:
-276,32,175020,6,0,L|368:40,1,90,0|0,1:0|0:0,0:0:0:0:
-448,108,175350,1,8,0:0:0:0:
-292,124,175515,1,0,0:0:0:0:
-292,124,175597,1,0,0:0:0:0:
-292,124,175680,2,0,L|308:216,1,90,0|0,0:0|1:0,0:0:0:0:
-328,320,176009,1,8,0:0:0:0:
-408,248,176174,1,0,0:0:0:0:
-220,300,176339,6,0,P|176:304|128:292,1,90,0|0,1:0|0:0,0:0:0:0:
-16,120,176669,1,8,0:0:0:0:
-120,152,176834,1,0,1:0:0:0:
-120,152,176916,1,0,0:0:0:0:
-120,152,176998,2,0,L|124:200,1,45
-212,176,177163,2,0,L|239:215,1,45,0|0,1:0|0:0,0:0:0:0:
-292,124,177328,2,0,P|302:79|283:30,1,90,8|0,0:0|0:0,0:0:0:0:
-344,192,177658,6,0,P|372:156|376:104,1,90,0|0,1:0|0:0,0:0:0:0:
-212,88,177987,1,8,0:0:0:0:
-272,228,178152,1,0,0:0:0:0:
-272,228,178235,1,0,0:0:0:0:
-272,228,178317,1,0,0:0:0:0:
-292,124,178482,1,0,1:0:0:0:
-180,180,178647,1,8,0:0:0:0:
-200,284,178812,1,0,0:0:0:0:
-292,124,178976,5,0,1:0:0:0:
-288,92,179059,1,0,0:0:0:0:
-280,60,179141,2,0,P|248:24|208:14,1,90,0|8,0:0|0:0,0:0:0:0:
-22,65,179471,2,0,P|67:71|112:68,1,90,0|0,1:0|0:0,0:0:0:0:
-212,88,179801,1,0,1:0:0:0:
-22,65,179965,1,8,0:0:0:0:
-180,180,180130,5,0,0:0:0:0:
-180,180,180213,1,0,0:0:0:0:
-180,180,180295,2,0,P|184:224|172:272,1,90,0|0,1:0|0:0,0:0:0:0:
-76,216,180625,2,0,P|72:172|84:124,1,90,8|0,0:0|0:0,0:0:0:0:
-380,240,180954,2,0,P|384:284|372:332,1,90,0|0,0:0|1:0,0:0:0:0:
-276,276,181284,2,0,P|272:232|284:184,1,90,8|0,0:0|0:0,0:0:0:0:
-374,129,181614,5,0,1:0:0:0:
-300,352,181779,2,0,L|204:348,2,90,0|8|0,0:0|0:0|1:0,0:0:0:0:
-448,180,182273,1,2,0:0:0:0:
-448,180,182438,1,2,1:2:0:0:
-276,276,182603,1,10,0:0:0:0:
-276,276,182768,1,2,0:0:0:0:
-96,200,182932,6,0,L|88:108,1,90,0|0,1:0|0:0,0:0:0:0:
-96,200,183262,1,8,0:0:0:0:
-12,68,183427,2,0,P|72:24|164:68,1,180,0|0,0:0|1:0,0:0:0:0:
-140,272,183921,2,0,P|92:284|52:271,1,90,8|0,0:0|0:0,0:0:0:0:
-176,156,184251,5,0,1:0:0:0:
-208,152,184334,1,0,1:0:0:0:
-240,148,184416,1,0,1:0:0:0:
-308,64,184581,1,8,0:0:0:0:
-296,240,184746,1,0,1:0:0:0:
-312,268,184828,1,0,1:0:0:0:
-336,284,184910,1,0,1:0:0:0:
-368,292,184993,1,0,1:0:0:0:
-400,288,185075,1,0,1:0:0:0:
-464,184,185240,1,8,0:0:0:0:
-468,152,185323,1,0,0:0:0:0:
-472,120,185405,2,0,L|464:76,1,45,0|0,1:0|1:0,0:0:0:0:
-388,96,185570,6,0,P|360:132|316:148,1,90,4|0,1:2|0:0,0:0:0:0:
-224,46,185899,2,0,P|268:43|308:63,1,90,8|0,0:0|0:0,0:0:0:0:
-296,240,186229,1,0,0:0:0:0:
-308,64,186394,1,0,1:0:0:0:
-296,240,186559,2,0,L|312:332,1,90,8|0,0:0|0:0,0:0:0:0:
-464,184,186888,6,0,P|420:180|372:188,1,90,0|0,1:0|0:0,0:0:0:0:
-296,240,187218,1,8,0:0:0:0:
-136,292,187383,2,0,P|94:277|54:249,1,90,0|0,1:0|0:0,0:0:0:0:
-21,159,187713,1,0,1:0:0:0:
-104,8,187877,2,0,L|124:96,1,90,10|0,0:0|0:0,0:0:0:0:
-124,96,188207,6,0,P|152:132|196:148,1,90,0|0,1:0|0:0,0:0:0:0:
-287,46,188537,2,0,P|243:43|204:63,1,90,8|0,0:0|0:0,0:0:0:0:
-216,240,188866,1,2,0:0:0:0:
-204,64,189031,1,0,1:0:0:0:
-216,240,189196,2,0,L|200:332,1,90,8|0,0:0|0:0,0:0:0:0:
-40,240,189526,5,2,1:2:0:0:
-128,192,189691,1,0,0:0:0:0:
-216,240,189855,1,8,0:0:0:0:
-304,192,190020,1,0,1:0:0:0:
-392,240,190185,2,0,L|400:332,1,90,2|0,0:0|1:0,0:0:0:0:
-464,168,190515,2,0,L|456:76,1,90,8|0,0:0|0:0,0:0:0:0:
-392,240,190844,6,0,P|364:272|312:292,1,90,2|0,1:2|0:0,0:0:0:0:
-220,140,191174,2,0,P|248:108|296:92,1,90,8|0,0:0|0:0,0:0:0:0:
-324,96,191421,1,0,0:0:0:0:
-356,104,191504,2,0,L|340:16,1,90,0|0,0:0|1:0,0:0:0:0:
-256,276,191834,2,0,L|272:364,1,90,8|0,0:0|0:0,0:0:0:0:
-392,240,192163,5,0,1:0:0:0:
-356,104,192328,1,0,0:0:0:0:
-220,140,192493,1,8,0:0:0:0:
-256,276,192658,1,0,1:0:0:0:
-305,191,192823,1,0,0:0:0:0:
-212,56,192987,1,0,1:0:0:0:
-200,220,193152,1,10,0:0:0:0:
-200,220,193482,6,0,P|156:228|108:220,1,90,0|0,1:0|0:0,0:0:0:0:
-88,116,193812,1,8,0:0:0:0:
-16,192,193976,1,0,0:0:0:0:
-16,192,194059,1,0,0:0:0:0:
-16,192,194141,2,0,L|28:288,1,90,2|0,0:0|1:0,0:0:0:0:
-188,309,194471,2,0,L|200:220,1,90,8|0,0:0|0:0,0:0:0:0:
-216,112,194801,5,2,1:2:0:0:
-216,112,194883,1,0,1:0:0:0:
-216,112,194965,1,0,1:0:0:0:
-361,25,195130,1,8,0:0:0:0:
-294,180,195295,1,0,1:0:0:0:
-294,180,195377,1,0,1:0:0:0:
-294,180,195460,1,2,0:0:0:0:
-256,16,195625,1,0,1:0:0:0:
-384,127,195790,1,10,1:2:0:0:
-416,132,195872,1,0,1:0:0:0:
-448,140,195954,2,0,L|452:84,1,45,0|0,1:0|1:0,0:0:0:0:
-416,216,196119,6,0,P|412:264|432:312,1,90,4|0,1:2|0:0,0:0:0:0:
-304,268,196449,2,0,P|308:220|288:172,1,90,8|0,0:0|0:0,0:0:0:0:
-216,112,196779,2,0,L|120:104,1,90,0|0,0:0|1:0,0:0:0:0:
-52,248,197108,2,0,L|141:255,1,90,8|0,0:0|0:0,0:0:0:0:
-304,268,197438,5,0,1:0:0:0:
-416,216,197603,1,0,0:0:0:0:
-408,340,197768,1,8,0:0:0:0:
-332,180,197932,1,0,1:0:0:0:
-332,180,198015,1,0,0:0:0:0:
-332,180,198097,2,0,P|360:140|400:120,1,90,0|0,0:0|1:0,0:0:0:0:
-484,284,198427,1,10,0:0:0:0:
-304,268,198592,1,2,0:0:0:0:
-416,216,198757,6,0,P|428:172|420:124,1,90,2|0,1:2|0:0,0:0:0:0:
-344,52,199086,1,8,0:0:0:0:
-332,180,199251,1,0,0:0:0:0:
-164,236,199416,2,0,P|152:192|160:144,1,90,0|0,0:0|1:0,0:0:0:0:
-236,72,199746,1,8,0:0:0:0:
-248,200,199910,1,0,0:0:0:0:
-156,328,200075,6,0,L|56:320,1,90,2|0,1:2|0:0,0:0:0:0:
-164,236,200405,1,8,0:0:0:0:
-256,292,200570,2,0,P|300:296|344:284,1,90,0|0,1:0|0:0,0:0:0:0:
-432,220,200899,2,0,L|460:308,2,90,0|8|0,1:0|0:0|0:0,0:0:0:0:
-392,120,201394,5,4,1:2:0:0:
-396,32,201559,1,0,1:0:0:0:
-316,72,201724,1,0,1:0:0:0:
-256,6,201888,1,0,1:0:0:0:
-228,91,202053,1,0,1:0:0:0:
-139,87,202218,1,0,1:0:0:0:
-179,166,202383,1,0,1:0:0:0:
-113,226,202548,1,0,1:0:0:0:
-197,253,202713,5,4,1:2:0:0:
-193,342,202877,1,0,1:0:0:0:
-272,302,203042,1,0,1:0:0:0:
-332,367,203207,1,0,1:0:0:0:
-359,283,203372,1,2,1:2:0:0:
-448,287,203537,1,2,1:2:0:0:
-407,208,203702,1,2,1:2:0:0:
-472,147,203866,1,2,1:2:0:0:
-387,121,204031,5,4,1:2:0:0:
-360,100,204114,1,0,1:0:0:0:
-344,72,204196,1,0,1:0:0:0:
-336,40,204279,1,0,1:0:0:0:
-340,8,204361,1,0,1:0:0:0:
-316,28,204443,1,0,1:0:0:0:
-284,32,204526,1,0,1:0:0:0:
-252,28,204608,1,0,1:0:0:0:
-228,8,204691,2,0,L|184:20,7,45,4|0|0|0|0|0|0|0,1:2|1:0|1:0|1:0|1:0|1:0|1:0|1:0,0:0:0:0:
-112,56,205350,5,4,1:2:0:0:
-100,84,205432,1,0,1:0:0:0:
-96,116,205515,1,0,1:0:0:0:
-100,148,205597,1,0,1:0:0:0:
-112,176,205680,1,0,1:0:0:0:
-124,204,205762,1,0,1:0:0:0:
-128,236,205844,1,0,1:0:0:0:
-124,268,205927,1,0,1:0:0:0:
-112,296,206009,2,0,L|71:313,3,45,2|0|2|0,1:2|0:0|0:0|0:0,0:0:0:0:
-192,312,206339,2,0,L|175:353,3,45,2|0|2|0,1:2|0:0|0:0|0:0,0:0:0:0:
-256,264,206669,5,4,1:2:0:0:
-256,192,206751,12,0,209306,0:0:0:0:
diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index 091af04106..941cedca3f 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -212,6 +212,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
nestedHitObjects = new List>();
h.OnJudgement += (d, j) => OnJudgement?.Invoke(d, j);
+ h.OnJudgementRemoved += (d, j) => OnJudgementRemoved?.Invoke(d, j);
nestedHitObjects.Add(h);
}
diff --git a/osu.Game/Rulesets/UI/RulesetContainer.cs b/osu.Game/Rulesets/UI/RulesetContainer.cs
index 36dce7218d..278814ea7e 100644
--- a/osu.Game/Rulesets/UI/RulesetContainer.cs
+++ b/osu.Game/Rulesets/UI/RulesetContainer.cs
@@ -242,7 +242,7 @@ namespace osu.Game.Rulesets.UI
OnJudgement?.Invoke(j);
};
- drawableObject.OnJudgementRemoved += (d, j) => { OnJudgementRemoved?.Invoke(j); };
+ drawableObject.OnJudgementRemoved += (d, j) => OnJudgementRemoved?.Invoke(j);
Playfield.Add(drawableObject);
}
diff --git a/osu.Game/Rulesets/UI/RulesetInputManager.cs b/osu.Game/Rulesets/UI/RulesetInputManager.cs
index 0419070b42..8c4d6de1fe 100644
--- a/osu.Game/Rulesets/UI/RulesetInputManager.cs
+++ b/osu.Game/Rulesets/UI/RulesetInputManager.cs
@@ -76,6 +76,8 @@ namespace osu.Game.Rulesets.UI
#region Clock control
+ protected override bool ShouldProcessClock => false; // We handle processing the clock ourselves
+
private ManualClock clock;
private IFrameBasedClock parentClock;
@@ -151,6 +153,12 @@ namespace osu.Game.Rulesets.UI
}
requireMoreUpdateLoops = clock.CurrentTime != parentClock.CurrentTime;
+
+ // The manual clock time has changed in the above code. The framed clock now needs to be updated
+ // to ensure that the its time is valid for our children before input is processed
+ Clock.ProcessFrame();
+
+ // Process input
base.Update();
}
diff --git a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
index 587853be59..3e1d0329a9 100644
--- a/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
+++ b/osu.Game/Screens/Edit/Screens/Compose/Timeline/ScrollingTimelineContainer.cs
@@ -114,7 +114,7 @@ namespace osu.Game.Screens.Edit.Screens.Compose.Timeline
}
///
- /// Zoom target as a relative position in the space.
+ /// Zoom target as a relative position in the space.
///
private float? relativeContentZoomTarget;
diff --git a/osu.Game/Screens/Loader.cs b/osu.Game/Screens/Loader.cs
index 3afaa02824..ca541ea552 100644
--- a/osu.Game/Screens/Loader.cs
+++ b/osu.Game/Screens/Loader.cs
@@ -24,7 +24,6 @@ namespace osu.Game.Screens
{
base.LogoArriving(logo, resuming);
- logo.RelativePositionAxes = Axes.None;
logo.Triangles = false;
logo.Origin = Anchor.BottomRight;
logo.Anchor = Anchor.BottomRight;
@@ -47,11 +46,7 @@ namespace osu.Game.Screens
protected override void LogoSuspending(OsuLogo logo)
{
base.LogoSuspending(logo);
- logo.FadeOut(100).OnComplete(l =>
- {
- l.Anchor = Anchor.TopLeft;
- l.Origin = Anchor.Centre;
- });
+ logo.FadeOut(100);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs
index 0445733b23..987e29d6d6 100644
--- a/osu.Game/Screens/Menu/Intro.cs
+++ b/osu.Game/Screens/Menu/Intro.cs
@@ -12,7 +12,6 @@ using osu.Framework.MathUtils;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.IO;
using osu.Game.Configuration;
-using osu.Game.Graphics.Containers;
using osu.Game.Screens.Backgrounds;
using OpenTK;
using OpenTK.Graphics;
@@ -21,8 +20,6 @@ namespace osu.Game.Screens.Menu
{
public class Intro : OsuScreen
{
- private readonly IntroSequence introSequence;
-
private const string menu_music_beatmap_hash = "3c8b1fcc9434dbb29e2fb613d3b9eada9d7bb6c125ceb32396c3b53437280c83";
///
@@ -43,7 +40,6 @@ namespace osu.Game.Screens.Menu
private Bindable menuVoice;
private Bindable menuMusic;
private Track track;
- private readonly ParallaxContainer parallax;
[BackgroundDependencyLoader]
private void load(AudioManager audio, OsuConfigManager config, BeatmapManager beatmaps, Framework.Game game)
@@ -127,8 +123,6 @@ namespace osu.Game.Screens.Menu
if (!resuming)
{
- logo.Triangles = true;
-
logo.ScaleTo(1);
logo.FadeIn();
logo.PlayIntro();
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index b0170edfe1..90f68ba9f1 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -112,9 +112,6 @@ namespace osu.Game.Screens.Menu
buttons.SetOsuLogo(logo);
- logo.Triangles = true;
- logo.Ripple = false;
-
logo.FadeColour(Color4.White, 100, Easing.OutQuint);
logo.FadeIn(100, Easing.OutQuint);
diff --git a/osu.Game/Screens/Menu/OsuLogo.cs b/osu.Game/Screens/Menu/OsuLogo.cs
index dccb910d86..fb8e755b61 100644
--- a/osu.Game/Screens/Menu/OsuLogo.cs
+++ b/osu.Game/Screens/Menu/OsuLogo.cs
@@ -221,6 +221,30 @@ namespace osu.Game.Screens.Menu
};
}
+ ///
+ /// Schedule a new extenral animation. Handled queueing and finishing previous animations in a sane way.
+ ///
+ /// The animation to be performed
+ /// If true, the new animation is delayed until all previous transforms finish. If false, existing transformed are cleared.
+ internal void AppendAnimatingAction(Action action, bool waitForPrevious)
+ {
+ Action runnableAction = () =>
+ {
+ if (waitForPrevious)
+ this.DelayUntilTransformsFinished().Schedule(action);
+ else
+ {
+ ClearTransforms();
+ action();
+ }
+ };
+
+ if (IsLoaded)
+ runnableAction();
+ else
+ Schedule(() => runnableAction());
+ }
+
[BackgroundDependencyLoader]
private void load(TextureStore textures, AudioManager audio)
{
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 3dd175ca88..f5ff9ea036 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -76,7 +76,7 @@ namespace osu.Game.Screens
protected override void OnResuming(Screen last)
{
base.OnResuming(last);
- logo.DelayUntilTransformsFinished().Schedule(() => LogoArriving(logo, true));
+ logo.AppendAnimatingAction(() => LogoArriving(logo, true), true);
sampleExit?.Play();
}
@@ -118,11 +118,11 @@ namespace osu.Game.Screens
}
if ((logo = lastOsu?.logo) == null)
- AddInternal(logo = new OsuLogo());
+ LoadComponentAsync(logo = new OsuLogo { Alpha = 0 }, AddInternal);
+
+ logo.AppendAnimatingAction(() => LogoArriving(logo, false), true);
base.OnEntering(last);
-
- logo.DelayUntilTransformsFinished().Schedule(() => LogoArriving(logo, false));
}
protected override bool OnExiting(Screen next)
@@ -155,12 +155,16 @@ namespace osu.Game.Screens
{
logo.Action = null;
logo.FadeOut(300, Easing.OutQuint);
+ logo.Anchor = Anchor.TopLeft;
+ logo.Origin = Anchor.Centre;
+ logo.RelativePositionAxes = Axes.None;
+ logo.Triangles = true;
+ logo.Ripple = true;
}
private void onExitingLogo()
{
- logo.ClearTransforms();
- LogoExiting(logo);
+ logo.AppendAnimatingAction(() => { LogoExiting(logo); }, false);
}
///
@@ -172,8 +176,7 @@ namespace osu.Game.Screens
private void onSuspendingLogo()
{
- logo.ClearTransforms();
- LogoSuspending(logo);
+ logo.AppendAnimatingAction(() => { LogoSuspending(logo); }, false);
}
///
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 59d56a5a44..675d20fe63 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -144,22 +144,6 @@ namespace osu.Game.Screens.Play
userAudioOffset.ValueChanged += v => offsetClock.Offset = v;
userAudioOffset.TriggerChange();
- Task.Run(() =>
- {
- adjustableSourceClock.Reset();
-
- // this is temporary until we have blocking (async.Wait()) audio component methods.
- // then we can call ResetAsync().Wait() or the blocking version above.
- while (adjustableSourceClock.IsRunning)
- Thread.Sleep(1);
-
- Schedule(() =>
- {
- decoupledClock.ChangeSource(adjustableSourceClock);
- applyRateFromMods();
- });
- });
-
Children = new Drawable[]
{
storyboardContainer = new Container
@@ -329,10 +313,26 @@ namespace osu.Game.Screens.Play
.Delay(250)
.FadeIn(250);
- this.Delay(750).Schedule(() =>
+ Task.Run(() =>
{
- if (!pauseContainer.IsPaused)
- decoupledClock.Start();
+ adjustableSourceClock.Reset();
+
+ // this is temporary until we have blocking (async.Wait()) audio component methods.
+ // then we can call ResetAsync().Wait() or the blocking version above.
+ while (adjustableSourceClock.IsRunning)
+ Thread.Sleep(1);
+
+ Schedule(() =>
+ {
+ decoupledClock.ChangeSource(adjustableSourceClock);
+ applyRateFromMods();
+
+ this.Delay(750).Schedule(() =>
+ {
+ if (!pauseContainer.IsPaused)
+ decoupledClock.Start();
+ });
+ });
});
pauseContainer.Alpha = 0;
diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs
index 53a2dcc41f..de67bef004 100644
--- a/osu.Game/Screens/Play/PlayerLoader.cs
+++ b/osu.Game/Screens/Play/PlayerLoader.cs
@@ -99,7 +99,6 @@ namespace osu.Game.Screens.Play
{
base.LogoArriving(logo, resuming);
- logo.ClearTransforms(targetMember: nameof(Position));
logo.RelativePositionAxes = Axes.Both;
logo.ScaleTo(new Vector2(0.15f), 300, Easing.In);
diff --git a/osu.Game/Screens/Play/ReplaySettings/PlaybackSettings.cs b/osu.Game/Screens/Play/ReplaySettings/PlaybackSettings.cs
index bf2909b8ab..3109552532 100644
--- a/osu.Game/Screens/Play/ReplaySettings/PlaybackSettings.cs
+++ b/osu.Game/Screens/Play/ReplaySettings/PlaybackSettings.cs
@@ -3,11 +3,16 @@
using osu.Framework.Timing;
using osu.Framework.Configuration;
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
namespace osu.Game.Screens.Play.ReplaySettings
{
public class PlaybackSettings : ReplayGroup
{
+ private const int padding = 10;
+
protected override string Title => @"playback";
public IAdjustableClock AdjustableClock { set; get; }
@@ -16,17 +21,45 @@ namespace osu.Game.Screens.Play.ReplaySettings
public PlaybackSettings()
{
- Child = sliderbar = new ReplaySliderBar
+ OsuSpriteText multiplierText;
+
+ Children = new Drawable[]
{
- LabelText = "Playback speed",
- Bindable = new BindableDouble(1)
+ new Container
{
- Default = 1,
- MinValue = 0.5,
- MaxValue = 2,
- Precision = 0.01,
+ RelativeSizeAxes = Axes.X,
+ AutoSizeAxes = Axes.Y,
+ Padding = new MarginPadding { Horizontal = padding },
+ Children = new Drawable[]
+ {
+ new OsuSpriteText
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ Text = "Playback speed",
+ },
+ multiplierText = new OsuSpriteText
+ {
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreRight,
+ Text = "1x",
+ Font = @"Exo2.0-Bold",
+ }
+ },
},
+ sliderbar = new ReplaySliderBar
+ {
+ Bindable = new BindableDouble(1)
+ {
+ Default = 1,
+ MinValue = 0.5,
+ MaxValue = 2,
+ Precision = 0.01,
+ },
+ }
};
+
+ sliderbar.Bindable.ValueChanged += rateMultiplier => multiplierText.Text = $"{rateMultiplier}x";
}
protected override void LoadComplete()
diff --git a/osu.Game/Screens/Select/Details/UserRatings.cs b/osu.Game/Screens/Select/Details/UserRatings.cs
index db6d932464..2153eb150c 100644
--- a/osu.Game/Screens/Select/Details/UserRatings.cs
+++ b/osu.Game/Screens/Select/Details/UserRatings.cs
@@ -30,9 +30,9 @@ namespace osu.Game.Screens.Select.Details
metrics = value;
var ratings = Metrics.Ratings.ToList();
- negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2).Sum().ToString();
- positiveRatings.Text = ratings.GetRange(ratings.Count / 2, ratings.Count / 2).Sum().ToString();
- ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2).Sum() / ratings.Sum();
+ negativeRatings.Text = ratings.GetRange(0, ratings.Count / 2 + 1).Sum().ToString();
+ positiveRatings.Text = ratings.GetRange(ratings.Count / 2 + 1, ratings.Count / 2).Sum().ToString();
+ ratingsBar.Length = (float)ratings.GetRange(0, ratings.Count / 2 + 1).Sum() / ratings.Sum();
graph.Values = Metrics.Ratings.Select(r => (float)r);
}
}
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 121a53f699..5500d06136 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -315,9 +315,7 @@ namespace osu.Game.Screens.Select
{
base.LogoArriving(logo, resuming);
- logo.ClearTransforms();
logo.RelativePositionAxes = Axes.Both;
-
Vector2 position = new Vector2(0.95f, 0.96f);
if (logo.Alpha > 0.8f)
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 7faa395e8a..bf1960cfe8 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -88,6 +88,9 @@
$(SolutionDir)\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll
True
+
+ $(SolutionDir)\packages\Humanizer.Core.2.2.0\lib\netstandard1.0\Humanizer.dll
+
$(SolutionDir)\packages\Microsoft.Data.Sqlite.Core.2.0.0\lib\netstandard2.0\Microsoft.Data.Sqlite.dll
@@ -279,6 +282,9 @@
+
+
+
diff --git a/osu.Game/packages.config b/osu.Game/packages.config
index ae7b74ef16..02ace918de 100644
--- a/osu.Game/packages.config
+++ b/osu.Game/packages.config
@@ -5,6 +5,48 @@ Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/maste
-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+