diff --git a/README.md b/README.md index 0df99f7d6b..19aba5a31f 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ Detailed changelogs are published on the [official osu! site](https://osu.ppy.sh ![](https://puu.sh/DCmvA/f6a74f5fbb.png) -If you are not interested in developing the game, you can consume our [binary releases](https://github.com/ppy/osu/releases). +If you are not interested in developing the game, you can still consume our [binary releases](https://github.com/ppy/osu/releases). -**Latest build:*** +**Latest build:** | [Windows (x64)](https://github.com/ppy/osu/releases/latest/download/install.exe) | [macOS 10.12+](https://github.com/ppy/osu/releases/latest/download/osu.app.zip) | | ------------- | ------------- | diff --git a/osu.Desktop/Overlays/VersionManager.cs b/osu.Desktop/Overlays/VersionManager.cs index 5a8cf32f14..1f1d2cea5f 100644 --- a/osu.Desktop/Overlays/VersionManager.cs +++ b/osu.Desktop/Overlays/VersionManager.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; +using osu.Framework.Development; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; @@ -12,7 +13,6 @@ using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Overlays; using osu.Game.Overlays.Notifications; -using osu.Game.Utils; using osuTK; using osuTK.Graphics; @@ -61,7 +61,7 @@ namespace osu.Desktop.Overlays }, new OsuSpriteText { - Colour = DebugUtils.IsDebug ? colours.Red : Color4.White, + Colour = DebugUtils.IsDebugBuild ? colours.Red : Color4.White, Text = game.Version }, } diff --git a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs index 2f88a4b01d..06414af865 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneScoresContainer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; @@ -39,8 +40,7 @@ namespace osu.Game.Tests.Visual.Online { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, - AutoSizeAxes = Axes.Y, - RelativeSizeAxes = Axes.X, + RelativeSizeAxes = Axes.Both, Width = 0.8f, Children = new Drawable[] { @@ -173,7 +173,9 @@ namespace osu.Game.Tests.Visual.Online s.Statistics.Add(HitResult.Miss, RNG.Next(2000)); } - scoresContainer.Scores = scores; + AddStep("Load all scores", () => scoresContainer.Scores = scores); + AddStep("Load null scores", () => scoresContainer.Scores = null); + AddStep("Load only one score", () => scoresContainer.Scores = new[] { scores.First() }); } [BackgroundDependencyLoader] diff --git a/osu.Game.Tests/Visual/Online/TestSceneUserProfileHeader.cs b/osu.Game.Tests/Visual/Online/TestSceneUserProfileHeader.cs index d9230090fc..2285c9b799 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneUserProfileHeader.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneUserProfileHeader.cs @@ -39,13 +39,27 @@ namespace osu.Game.Tests.Visual.Online header = new ProfileHeader(); Add(header); - AddStep("Show offline dummy", () => header.User.Value = TestSceneUserProfileOverlay.TEST_USER); + AddStep("Show test dummy", () => header.User.Value = TestSceneUserProfileOverlay.TEST_USER); AddStep("Show null dummy", () => header.User.Value = new User { Username = "Null" }); + AddStep("Show online dummy", () => header.User.Value = new User + { + Username = "IAmOnline", + LastVisit = DateTimeOffset.Now, + IsOnline = true, + }); + + AddStep("Show offline dummy", () => header.User.Value = new User + { + Username = "IAmOffline", + LastVisit = DateTimeOffset.Now, + IsOnline = false, + }); + addOnlineStep("Show ppy", new User { Username = @"peppy", diff --git a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs index 738b7f14f3..962e0fb362 100644 --- a/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs +++ b/osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs @@ -214,37 +214,6 @@ namespace osu.Game.Tests.Visual.SongSelect AddAssert("start not requested", () => !startRequested); } - [Test] - public void TestAddNewBeatmapWhileSelectingRandom() - { - const int test_count = 10; - int beatmapChangedCount = 0; - int debounceCount = 0; - createSongSelect(); - AddStep("Setup counters", () => - { - beatmapChangedCount = 0; - debounceCount = 0; - songSelect.Carousel.SelectionChanged += _ => beatmapChangedCount++; - }); - AddRepeatStep($"Create beatmaps {test_count} times", () => - { - importForRuleset(0); - - Scheduler.AddDelayed(() => - { - // Wait for debounce - songSelect.Carousel.SelectNextRandom(); - ++debounceCount; - }, 400); - }, test_count); - - AddUntilStep("Debounce limit reached", () => debounceCount == test_count); - - // The selected beatmap should have changed an additional 2 times since both initially loading songselect and the first import also triggers selectionChanged - AddAssert($"Beatmap changed {test_count + 2} times", () => beatmapChangedCount == test_count + 2); - } - [Test] public void TestHideSetSelectsCorrectBeatmap() { diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneMods.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs similarity index 95% rename from osu.Game.Tests/Visual/UserInterface/TestSceneMods.cs rename to osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 2e36ba39ed..5a903b9417 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneMods.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -24,11 +24,10 @@ using osuTK.Graphics; namespace osu.Game.Tests.Visual.UserInterface { [Description("mod select and icon display")] - public class TestSceneMods : OsuTestScene + public class TestSceneModSelectOverlay : OsuTestScene { public override IReadOnlyList RequiredTypes => new[] { - typeof(ModSelectOverlay), typeof(ModDisplay), typeof(ModSection), typeof(ModIcon), @@ -217,13 +216,13 @@ namespace osu.Game.Tests.Visual.UserInterface private void testRankedText(Mod mod) { - AddWaitStep("wait for fade", 1); + waitForLoad(); AddAssert("check for ranked", () => modSelect.UnrankedLabel.Alpha == 0); selectNext(mod); - AddWaitStep("wait for fade", 1); + waitForLoad(); AddAssert("check for unranked", () => modSelect.UnrankedLabel.Alpha != 0); selectPrevious(mod); - AddWaitStep("wait for fade", 1); + waitForLoad(); AddAssert("check for ranked", () => modSelect.UnrankedLabel.Alpha == 0); } @@ -233,6 +232,7 @@ namespace osu.Game.Tests.Visual.UserInterface private void checkSelected(Mod mod) { + waitForLoad(); AddAssert($"check {mod.Name} is selected", () => { var button = modSelect.GetModButton(mod); @@ -240,8 +240,14 @@ namespace osu.Game.Tests.Visual.UserInterface }); } + private void waitForLoad() + { + AddUntilStep("wait for icons to load", () => modSelect.AllLoaded); + } + private void checkNotSelected(Mod mod) { + waitForLoad(); AddAssert($"check {mod.Name} is not selected", () => { var button = modSelect.GetModButton(mod); @@ -255,6 +261,8 @@ namespace osu.Game.Tests.Visual.UserInterface { public new Bindable> SelectedMods => base.SelectedMods; + public bool AllLoaded => ModSectionsContainer.Children.All(c => c.ModIconsLoaded); + public ModButton GetModButton(Mod mod) { var section = ModSectionsContainer.Children.Single(s => s.ModType == mod.Type); diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs index 3734c8d05c..dd7b3d77bf 100644 --- a/osu.Game/Beatmaps/BeatmapManager.cs +++ b/osu.Game/Beatmaps/BeatmapManager.cs @@ -363,7 +363,7 @@ namespace osu.Game.Beatmaps foreach (var name in reader.Filenames.Where(f => f.EndsWith(".osu"))) { using (var raw = reader.GetStream(name)) - using (var ms = new MemoryStream()) //we need a memory stream so we can seek and shit + using (var ms = new MemoryStream()) //we need a memory stream so we can seek using (var sr = new StreamReader(ms)) { raw.CopyTo(ms); diff --git a/osu.Game/Graphics/UserInterface/OsuButton.cs b/osu.Game/Graphics/UserInterface/OsuButton.cs index 494d4e4262..7a27f825f6 100644 --- a/osu.Game/Graphics/UserInterface/OsuButton.cs +++ b/osu.Game/Graphics/UserInterface/OsuButton.cs @@ -17,11 +17,11 @@ namespace osu.Game.Graphics.UserInterface /// /// A button with added default sound effects. /// - public abstract class OsuButton : Button + public class OsuButton : Button { private Box hover; - protected OsuButton() + public OsuButton() { Height = 40; diff --git a/osu.Game/Online/API/Requests/Responses/APIChangelogBuild.cs b/osu.Game/Online/API/Requests/Responses/APIChangelogBuild.cs index 40f1b791f9..36407c7b0e 100644 --- a/osu.Game/Online/API/Requests/Responses/APIChangelogBuild.cs +++ b/osu.Game/Online/API/Requests/Responses/APIChangelogBuild.cs @@ -31,9 +31,9 @@ namespace osu.Game.Online.API.Requests.Responses public List ChangelogEntries { get; set; } [JsonProperty("versions")] - public VersionNatigation Versions { get; set; } + public VersionNavigation Versions { get; set; } - public class VersionNatigation + public class VersionNavigation { [JsonProperty("next")] public APIChangelogBuild Next { get; set; } diff --git a/osu.Game/Online/Chat/Message.cs b/osu.Game/Online/Chat/Message.cs index 62f20daddf..2e41038a59 100644 --- a/osu.Game/Online/Chat/Message.cs +++ b/osu.Game/Online/Chat/Message.cs @@ -13,10 +13,6 @@ namespace osu.Game.Online.Chat [JsonProperty(@"message_id")] public readonly long? Id; - //todo: this should be inside sender. - [JsonProperty(@"sender_id")] - public long UserId; - [JsonProperty(@"channel_id")] public long ChannelId; diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index d5fbcdfee3..692e7189a3 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -181,9 +181,11 @@ namespace osu.Game configSkin.ValueChanged += skinId => SkinManager.CurrentSkinInfo.Value = SkinManager.Query(s => s.ID == skinId.NewValue) ?? SkinInfo.Default; configSkin.TriggerChange(); - LocalConfig.BindWith(OsuSetting.VolumeInactive, inactiveVolumeAdjust); + LocalConfig.BindWith(OsuSetting.VolumeInactive, userInactiveVolume); IsActive.BindValueChanged(active => updateActiveState(active.NewValue), true); + + Beatmap.BindValueChanged(beatmapChanged, true); } private ExternalLinkOpener externalLinkOpener; @@ -284,6 +286,23 @@ namespace osu.Game }, $"watch {databasedScoreInfo}", bypassScreenAllowChecks: true); } + #region Beatmap jukebox progression + + private void beatmapChanged(ValueChangedEvent beatmap) + { + var nextBeatmap = beatmap.NewValue; + if (nextBeatmap?.Track != null) + nextBeatmap.Track.Completed += currentTrackCompleted; + } + + private void currentTrackCompleted() + { + if (!Beatmap.Value.Track.Looping && !Beatmap.Disabled) + musicController.NextTrack(); + } + + #endregion + private ScheduledDelegate performFromMainMenuTask; /// @@ -446,7 +465,7 @@ namespace osu.Game Origin = Anchor.TopRight, }, rightFloatingOverlayContent.Add, true); - loadComponentSingleFile(new MusicController + loadComponentSingleFile(musicController = new MusicController { GetToolbarHeight = () => ToolbarOffset, Anchor = Anchor.TopRight, @@ -686,16 +705,28 @@ namespace osu.Game return false; } - private readonly BindableDouble inactiveVolumeAdjust = new BindableDouble(); + #region Inactive audio dimming + + private readonly BindableDouble userInactiveVolume = new BindableDouble(); + + private readonly BindableDouble inactiveVolumeFade = new BindableDouble(); private void updateActiveState(bool isActive) { if (isActive) - Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust); + { + this.TransformBindableTo(inactiveVolumeFade, 1, 500, Easing.OutQuint) + .Finally(_ => Audio.RemoveAdjustment(AdjustableProperty.Volume, inactiveVolumeFade)); //wait for the transition to finish to remove the inactive audio adjustment + } else - Audio.AddAdjustment(AdjustableProperty.Volume, inactiveVolumeAdjust); + { + Audio.AddAdjustment(AdjustableProperty.Volume, inactiveVolumeFade); + this.TransformBindableTo(inactiveVolumeFade, userInactiveVolume.Value, 1500, Easing.OutSine); + } } + #endregion + public bool OnReleased(GlobalAction action) => false; private Container overlayContent; @@ -707,8 +738,11 @@ namespace osu.Game private Container topMostOverlayContent; private FrameworkConfigManager frameworkConfig; + private ScalingContainer screenContainer; + private MusicController musicController; + protected override bool OnExiting() { if (screenStack.CurrentScreen is Loader) diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index 637708a0e5..87ff721bbb 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Bindables; +using osu.Framework.Development; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.IO.Stores; @@ -34,7 +35,6 @@ using osu.Game.Rulesets.Mods; using osu.Game.Scoring; using osu.Game.Skinning; using osuTK.Input; -using DebugUtils = osu.Game.Utils.DebugUtils; namespace osu.Game { @@ -97,7 +97,7 @@ namespace osu.Game get { if (!IsDeployedBuild) - return @"local " + (DebugUtils.IsDebug ? @"debug" : @"release"); + return @"local " + (DebugUtils.IsDebugBuild ? @"debug" : @"release"); var version = AssemblyVersion; return $@"{version.Major}.{version.Minor}.{version.Build}"; diff --git a/osu.Game/Overlays/BeatmapSet/Header.cs b/osu.Game/Overlays/BeatmapSet/Header.cs index a0f71d05c0..fb6c50d867 100644 --- a/osu.Game/Overlays/BeatmapSet/Header.cs +++ b/osu.Game/Overlays/BeatmapSet/Header.cs @@ -45,7 +45,7 @@ namespace osu.Game.Overlays.BeatmapSet ExternalLinkButton externalLink; RelativeSizeAxes = Axes.X; - Height = 400; + AutoSizeAxes = Axes.Y; Masking = true; EdgeEffect = new EdgeEffectParameters @@ -72,7 +72,8 @@ namespace osu.Game.Overlays.BeatmapSet }, new Container { - RelativeSizeAxes = Axes.Both, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, Padding = new MarginPadding { Top = tabs_height }, Children = new Drawable[] { @@ -84,6 +85,7 @@ namespace osu.Game.Overlays.BeatmapSet cover = new UpdateableBeatmapSetCover { RelativeSizeAxes = Axes.Both, + Masking = true, }, new Box { @@ -94,18 +96,26 @@ namespace osu.Game.Overlays.BeatmapSet }, new Container { - RelativeSizeAxes = Axes.Both, - Padding = new MarginPadding { Top = 20, Bottom = 30, Horizontal = BeatmapSetOverlay.X_PADDING }, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Padding = new MarginPadding + { + Top = 20, + Bottom = 30, + Left = BeatmapSetOverlay.X_PADDING, + Right = BeatmapSetOverlay.X_PADDING + BeatmapSetOverlay.RIGHT_WIDTH, + }, Child = new FillFlowContainer { - RelativeSizeAxes = Axes.Both, + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, Direction = FillDirection.Vertical, Children = new Drawable[] { new Container { RelativeSizeAxes = Axes.X, - Height = 113, + AutoSizeAxes = Axes.Y, Child = Picker = new BeatmapPicker(), }, new FillFlowContainer @@ -158,7 +168,7 @@ namespace osu.Game.Overlays.BeatmapSet Anchor = Anchor.BottomRight, Origin = Anchor.BottomRight, AutoSizeAxes = Axes.Both, - Margin = new MarginPadding { Right = BeatmapSetOverlay.X_PADDING }, + Margin = new MarginPadding { Top = BeatmapSetOverlay.TOP_PADDING, Right = BeatmapSetOverlay.X_PADDING }, Direction = FillDirection.Vertical, Spacing = new Vector2(10), Children = new Drawable[] diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs index 8ef3f71fe3..3e6c938802 100644 --- a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs +++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs @@ -124,6 +124,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores loading = false; scoreTable.Scores = scores?.Count > 1 ? scores : new List(); + scoreTable.FadeTo(scores?.Count > 1 ? 1 : 0); if (scores?.Any() == true) { diff --git a/osu.Game/Overlays/BeatmapSetOverlay.cs b/osu.Game/Overlays/BeatmapSetOverlay.cs index 1e687267a3..205909ce7d 100644 --- a/osu.Game/Overlays/BeatmapSetOverlay.cs +++ b/osu.Game/Overlays/BeatmapSetOverlay.cs @@ -24,6 +24,7 @@ namespace osu.Game.Overlays private const int fade_duration = 300; public const float X_PADDING = 40; + public const float TOP_PADDING = 25; public const float RIGHT_WIDTH = 275; private readonly Header header; diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs index 50400e254f..dedd397fa5 100644 --- a/osu.Game/Overlays/Mods/ModSection.cs +++ b/osu.Game/Overlays/Mods/ModSection.cs @@ -10,6 +10,7 @@ using osu.Game.Rulesets.Mods; using System; using System.Linq; using System.Collections.Generic; +using System.Threading; using osu.Framework.Input.Events; using osu.Game.Graphics; @@ -33,6 +34,13 @@ namespace osu.Game.Overlays.Mods public IEnumerable SelectedMods => buttons.Select(b => b.SelectedMod).Where(m => m != null); + private CancellationTokenSource modsLoadCts; + + /// + /// True when all mod icons have completed loading. + /// + public bool ModIconsLoaded { get; private set; } = true; + public IEnumerable Mods { set @@ -48,8 +56,28 @@ namespace osu.Game.Overlays.Mods }; }).ToArray(); - ButtonsContainer.Children = modContainers; + modsLoadCts?.Cancel(); + ModIconsLoaded = false; + + LoadComponentsAsync(modContainers, c => + { + ModIconsLoaded = true; + ButtonsContainer.ChildrenEnumerable = c; + }, (modsLoadCts = new CancellationTokenSource()).Token); + buttons = modContainers.OfType().ToArray(); + + if (value.Any()) + { + headerLabel.FadeIn(200); + this.FadeIn(200); + } + else + { + // transition here looks weird as mods instantly disappear. + headerLabel.Hide(); + Hide(); + } } } diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index 8e5c9588ce..9ff320841a 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -172,6 +172,8 @@ namespace osu.Game.Overlays.Mods AutoSizeAxes = Axes.Y, Spacing = new Vector2(0f, 10f), Width = content_width, + LayoutDuration = 200, + LayoutEasing = Easing.OutQuint, Children = new ModSection[] { new DifficultyReductionSection { Action = modButtonPressed }, diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 8b9bac877b..36937def2b 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -70,9 +70,6 @@ namespace osu.Game.Overlays { Width = 400; Margin = new MarginPadding(10); - - // required to let MusicController handle beatmap cycling. - AlwaysPresent = true; } [BackgroundDependencyLoader] @@ -349,18 +346,11 @@ namespace osu.Game.Overlays direction = last > next ? TransformDirection.Prev : TransformDirection.Next; } - - //current.Track.Completed -= currentTrackCompleted; } - current = beatmap.NewValue; - - if (current != null) - current.Track.Completed += currentTrackCompleted; - progressBar.CurrentTime = 0; - updateDisplay(current, direction); + updateDisplay(current = beatmap.NewValue, direction); updateAudioAdjustments(); queuedDirection = null; @@ -378,12 +368,6 @@ namespace osu.Game.Overlays mod.ApplyToClock(track); } - private void currentTrackCompleted() => Schedule(() => - { - if (!current.Track.Looping && !beatmap.Disabled && beatmapSets.Any()) - next(); - }); - private ScheduledDelegate pendingBeatmapSwitch; private void updateDisplay(WorkingBeatmap beatmap, TransformDirection direction) @@ -447,10 +431,6 @@ namespace osu.Game.Overlays { base.PopOut(); - // This is here mostly as a performance fix. - // If the playlist is not hidden it will update children even when the music controller is hidden (due to AlwaysPresent). - playlist.Hide(); - this.FadeOut(transition_length, Easing.OutQuint); dragContainer.ScaleTo(0.9f, transition_length, Easing.OutQuint); } @@ -548,5 +528,10 @@ namespace osu.Game.Overlays return base.OnDragEnd(e); } } + + /// + /// Play the next random or playlist track. + /// + public void NextTrack() => next(); } } diff --git a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs index ffbb9ad218..e7f7c2f490 100644 --- a/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs +++ b/osu.Game/Overlays/Profile/Header/BottomHeaderContainer.cs @@ -87,7 +87,12 @@ namespace osu.Game.Overlays.Profile.Header addSpacer(topLinkContainer); - if (user.LastVisit.HasValue) + if (user.IsOnline) + { + topLinkContainer.AddText("Currently online"); + addSpacer(topLinkContainer); + } + else if (user.LastVisit.HasValue) { topLinkContainer.AddText("Last seen "); topLinkContainer.AddText(new DrawableDate(user.LastVisit.Value), embolden); diff --git a/osu.Game/Overlays/Settings/SettingsFooter.cs b/osu.Game/Overlays/Settings/SettingsFooter.cs index b5ee4b4f0c..a815480094 100644 --- a/osu.Game/Overlays/Settings/SettingsFooter.cs +++ b/osu.Game/Overlays/Settings/SettingsFooter.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using osu.Framework.Allocation; +using osu.Framework.Development; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Graphics; @@ -12,7 +13,6 @@ using osu.Game.Graphics.UserInterface; using osu.Game.Rulesets; using osuTK; using osuTK.Graphics; -using DebugUtils = osu.Game.Utils.DebugUtils; namespace osu.Game.Overlays.Settings { @@ -59,7 +59,7 @@ namespace osu.Game.Overlays.Settings Text = game.Name, Font = OsuFont.GetFont(size: 18, weight: FontWeight.Bold), }, - new BuildDisplay(game.Version, DebugUtils.IsDebug) + new BuildDisplay(game.Version, DebugUtils.IsDebugBuild) { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, diff --git a/osu.Game/Overlays/Settings/SettingsItem.cs b/osu.Game/Overlays/Settings/SettingsItem.cs index 4776cd6442..ae840c8c00 100644 --- a/osu.Game/Overlays/Settings/SettingsItem.cs +++ b/osu.Game/Overlays/Settings/SettingsItem.cs @@ -63,6 +63,9 @@ namespace osu.Game.Overlays.Settings set { + if (bindable != null) + controlWithCurrent?.Current.UnbindFrom(bindable); + bindable = value; controlWithCurrent?.Current.BindTo(bindable); diff --git a/osu.Game/Screens/Menu/Intro.cs b/osu.Game/Screens/Menu/Intro.cs index cf5d247482..88537322ad 100644 --- a/osu.Game/Screens/Menu/Intro.cs +++ b/osu.Game/Screens/Menu/Intro.cs @@ -165,7 +165,7 @@ namespace osu.Game.Screens.Menu Scheduler.AddDelayed(this.Exit, fadeOutTime); - //don't want to fade out completely else we will stop running updates and shit will hit the fan. + //don't want to fade out completely else we will stop running updates. Game.FadeTo(0.01f, fadeOutTime); base.OnResuming(last); diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs index 3afe9b9371..c81f6ae8ea 100644 --- a/osu.Game/Screens/Menu/MainMenu.cs +++ b/osu.Game/Screens/Menu/MainMenu.cs @@ -28,7 +28,7 @@ namespace osu.Game.Screens.Menu { private ButtonSystem buttons; - public override bool HideOverlaysOnEnter => buttons.State == ButtonSystemState.Initial; + public override bool HideOverlaysOnEnter => buttons == null || buttons.State == ButtonSystemState.Initial; protected override bool AllowBackButton => buttons.State != ButtonSystemState.Initial && host.CanExit; diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs index 9e5c11e098..5252b41dfd 100644 --- a/osu.Game/Screens/Multi/Multiplayer.cs +++ b/osu.Game/Screens/Multi/Multiplayer.cs @@ -9,6 +9,7 @@ using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Framework.Logging; using osu.Framework.Screens; +using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Graphics.Backgrounds; using osu.Game.Graphics.Containers; @@ -185,6 +186,28 @@ namespace osu.Game.Screens.Multi { this.FadeIn(); waves.Show(); + + beginHandlingTrack(); + } + + public override void OnResuming(IScreen last) + { + this.FadeIn(250); + this.ScaleTo(1, 250, Easing.OutSine); + + base.OnResuming(last); + + beginHandlingTrack(); + } + + public override void OnSuspending(IScreen next) + { + this.ScaleTo(1.1f, 250, Easing.InSine); + this.FadeOut(250); + + endHandlingTrack(); + + roomManager.TimeBetweenPolls = 0; } public override bool OnExiting(IScreen next) @@ -193,12 +216,10 @@ namespace osu.Game.Screens.Multi this.Delay(WaveContainer.DISAPPEAR_DURATION).FadeOut(); - cancelLooping(); - if (screenStack.CurrentScreen != null) loungeSubScreen.MakeCurrent(); - updatePollingRate(isIdle.Value); + endHandlingTrack(); base.OnExiting(next); return false; @@ -212,23 +233,58 @@ namespace osu.Game.Screens.Multi logo.Delay(WaveContainer.DISAPPEAR_DURATION / 2).FadeOut(); } - public override void OnResuming(IScreen last) + private void beginHandlingTrack() { - this.FadeIn(250); - this.ScaleTo(1, 250, Easing.OutSine); - - base.OnResuming(last); - - updatePollingRate(isIdle.Value); + Beatmap.BindValueChanged(updateTrack, true); } - public override void OnSuspending(IScreen next) + private void endHandlingTrack() { - this.ScaleTo(1.1f, 250, Easing.InSine); - this.FadeOut(250); - cancelLooping(); - roomManager.TimeBetweenPolls = 0; + Beatmap.ValueChanged -= updateTrack; + } + + private void screenPushed(IScreen lastScreen, IScreen newScreen) => subScreenChanged(newScreen); + + private void screenExited(IScreen lastScreen, IScreen newScreen) + { + subScreenChanged(newScreen); + + if (screenStack.CurrentScreen == null && this.IsCurrentScreen()) + this.Exit(); + } + + private void subScreenChanged(IScreen newScreen) + { + updatePollingRate(isIdle.Value); + createButton.FadeTo(newScreen is MatchSubScreen ? 0 : 1, 200); + + updateTrack(); + } + + private void updateTrack(ValueChangedEvent _ = null) + { + bool isMatch = screenStack.CurrentScreen is MatchSubScreen; + + Beatmap.Disabled = isMatch; + + if (isMatch) + { + var track = Beatmap.Value?.Track; + + if (track != null) + { + track.RestartPoint = Beatmap.Value.Metadata.PreviewTime; + track.Looping = true; + + if (!track.IsRunning) + track.Restart(); + } + } + else + { + cancelLooping(); + } } private void cancelLooping() @@ -236,49 +292,10 @@ namespace osu.Game.Screens.Multi var track = Beatmap?.Value?.Track; if (track != null) - track.Looping = false; - } - - protected override void Update() - { - base.Update(); - - if (!this.IsCurrentScreen()) return; - - if (screenStack.CurrentScreen is MatchSubScreen) { - var track = Beatmap.Value.Track; - - if (track != null) - { - track.Looping = true; - - if (!track.IsRunning) - { - game.Audio.AddItem(track); - track.Seek(Beatmap.Value.Metadata.PreviewTime); - track.Start(); - } - } - - createButton.Hide(); + track.Looping = false; + track.RestartPoint = 0; } - else if (screenStack.CurrentScreen is LoungeSubScreen) - createButton.Show(); - } - - private void screenPushed(IScreen lastScreen, IScreen newScreen) - => updatePollingRate(isIdle.Value); - - private void screenExited(IScreen lastScreen, IScreen newScreen) - { - if (lastScreen is MatchSubScreen) - cancelLooping(); - - updatePollingRate(isIdle.Value); - - if (screenStack.CurrentScreen == null && this.IsCurrentScreen()) - this.Exit(); } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Users/User.cs b/osu.Game/Users/User.cs index c3ecd62e10..df41e194b0 100644 --- a/osu.Game/Users/User.cs +++ b/osu.Game/Users/User.cs @@ -78,6 +78,9 @@ namespace osu.Game.Users [JsonProperty(@"is_active")] public bool Active; + [JsonProperty(@"is_online")] + public bool IsOnline; + [JsonProperty(@"pm_friends_only")] public bool PMFriendsOnly; diff --git a/osu.Game/Utils/DebugUtils.cs b/osu.Game/Utils/DebugUtils.cs deleted file mode 100644 index 9b1d355a83..0000000000 --- a/osu.Game/Utils/DebugUtils.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -namespace osu.Game.Utils -{ - public static class DebugUtils - { - public static bool IsDebug - { - get - { - // ReSharper disable once RedundantAssignment - bool isDebug = false; - // Debug.Assert conditions are only evaluated in debug mode - System.Diagnostics.Debug.Assert(isDebug = true); - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - return isDebug; - } - } - } -} diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 957d365724..9dd8c8572e 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -15,7 +15,7 @@ - + diff --git a/osu.iOS.props b/osu.iOS.props index 9b146fa490..1482b6ed03 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -105,8 +105,8 @@ - - + +