mirror of
https://github.com/ppy/osu.git
synced 2025-01-14 20:32:55 +08:00
Merge remote-tracking branch 'upstream/master' into download-tracking-component
# Conflicts: # osu.Game/Overlays/BeatmapSet/Buttons/DownloadButton.cs
This commit is contained in:
commit
7d6d7cf457
68
README.md
68
README.md
@ -11,25 +11,71 @@ We are accepting bug reports (please report with as much detail as possible). Fe
|
|||||||
# Requirements
|
# Requirements
|
||||||
|
|
||||||
- A desktop platform with the [.NET Core SDK 2.2](https://www.microsoft.com/net/learn/get-started) or higher installed.
|
- A desktop platform with the [.NET Core SDK 2.2](https://www.microsoft.com/net/learn/get-started) or higher installed.
|
||||||
- When working with the codebase, we recommend using an IDE with intellisense and syntax highlighting, such as [Visual Studio Community Edition](https://www.visualstudio.com/) (Windows), [Visual Studio Code](https://code.visualstudio.com/) (with the C# plugin installed) or [Jetbrains Rider](https://www.jetbrains.com/rider/) (commercial).
|
- When working with the codebase, we recommend using an IDE with intellisense and syntax highlighting, such as [Visual Studio 2017+](https://visualstudio.microsoft.com/vs/), [Jetbrains Rider](https://www.jetbrains.com/rider/) or [Visual Studio Code](https://code.visualstudio.com/).
|
||||||
|
- Note that there are **[additional requirements for Windows 7 and Windows 8.1](https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites?tabs=netcore2x)** which you may need to manually install if your operating system is not up-to-date.
|
||||||
|
|
||||||
# Building and running
|
# Running osu!
|
||||||
|
|
||||||
If you are not interested in developing the game, please head over to the [releases](https://github.com/ppy/osu/releases) to download a precompiled build with automatic updating enabled (download and run the install executable for your platform).
|
## Releases
|
||||||
|
|
||||||
Clone the repository including submodules
|
If you are not interested in developing the game, please head over to the [releases](https://github.com/ppy/osu/releases) to download a precompiled build with automatic updating enabled.
|
||||||
|
|
||||||
`git clone --recurse-submodules https://github.com/ppy/osu`
|
- Windows (x64) users should download and run `install.exe`.
|
||||||
|
- macOS users (10.12 "Sierra" and higher) should download and run `osu.app.zip`.
|
||||||
|
- iOS users can join the [TestFlight beta program](https://t.co/xQJmHkfC18).
|
||||||
|
|
||||||
Build and run
|
If your platform is not listed above, there is still a chance you can manually build it by following the instructions below.
|
||||||
|
|
||||||
- Using Visual Studio 2017, Rider or Visual Studio Code (configurations are included)
|
## Downloading the source code
|
||||||
- From command line using `dotnet run --project osu.Desktop`. When building for non-development purposes, add `-c Release` to gain higher performance.
|
|
||||||
- To run with code analysis, instead use `powershell ./build.ps1` or `build.sh`. This is currently only supported under windows due to [resharper cli shortcomings](https://youtrack.jetbrains.com/issue/RSRP-410004). Alternative, you can install resharper or use rider to get inline support in your IDE of choice.
|
|
||||||
|
|
||||||
Note: If you run from command line under linux, you will need to prefix the output folder to your `LD_LIBRARY_PATH`. See `.vscode/launch.json` for an example
|
Clone the repository **including submodules**:
|
||||||
|
|
||||||
If you run into issues building you may need to restore nuget packages (commonly via `dotnet restore`). Visual Studio Code users must run `Restore` task from debug tab before attempt to build.
|
```shell
|
||||||
|
git clone --recurse-submodules https://github.com/ppy/osu
|
||||||
|
cd osu
|
||||||
|
```
|
||||||
|
|
||||||
|
> If you forgot the `--recurse-submodules` option, run this command inside the `osu` directory:
|
||||||
|
>
|
||||||
|
> `git submodule update --init --recursive`
|
||||||
|
|
||||||
|
To update the source code to the latest commit, run the following command inside the `osu` directory:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git pull --recurse-submodules
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Build configurations for the recommended IDEs (listed above) are included. You should use the provided Build/Run functionality of your IDE to get things going. When testing or building new components, it's highly encouraged you use the `VisualTests` project/configuration. More information on this provided below.
|
||||||
|
|
||||||
|
> Visual Studio Code users must run the `Restore` task before any build attempt.
|
||||||
|
|
||||||
|
You can also build and run osu! from the command-line with a single command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dotnet run --project osu.Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are not interested in debugging osu!, you can add `-c Release` to gain performance. In this case, you must replace `Debug` with `Release` in any commands mentioned in this document.
|
||||||
|
|
||||||
|
If the build fails, try to restore nuget packages with `dotnet restore`.
|
||||||
|
|
||||||
|
### A note for Linux users
|
||||||
|
|
||||||
|
On Linux, the environment variable `LD_LIBRARY_PATH` must point to the build directory, located at `osu.Desktop/bin/Debug/$NETCORE_VERSION`.
|
||||||
|
|
||||||
|
`$NETCORE_VERSION` is the version of .NET Core SDK. You can have it with `grep TargetFramework osu.Desktop/osu.Desktop.csproj | sed -r 's/.*>(.*)<\/.*/\1/'`.
|
||||||
|
|
||||||
|
For example, you can run osu! with the following command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
LD_LIBRARY_PATH="$(pwd)/osu.Desktop/bin/Debug/netcoreapp2.2" dotnet run --project osu.Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code analysis
|
||||||
|
|
||||||
|
Code analysis can be run with `powershell ./build.ps1` or `build.sh`. This is currently only supported under windows due to [resharper cli shortcomings](https://youtrack.jetbrains.com/issue/RSRP-410004). Alternative, you can install resharper or use rider to get inline support in your IDE of choice.
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@ using osu.Framework.Logging;
|
|||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game.Beatmaps.Formats;
|
using osu.Game.Beatmaps.Formats;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Graphics;
|
|
||||||
using osu.Game.IO.Archives;
|
using osu.Game.IO.Archives;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Online.API.Requests;
|
using osu.Game.Online.API.Requests;
|
||||||
@ -147,16 +146,6 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
if (existing != null || api == null) return false;
|
if (existing != null || api == null) return false;
|
||||||
|
|
||||||
if (!api.LocalUser.Value.IsSupporter)
|
|
||||||
{
|
|
||||||
PostNotification?.Invoke(new SimpleNotification
|
|
||||||
{
|
|
||||||
Icon = FontAwesome.fa_superpowers,
|
|
||||||
Text = "You gotta be an osu!supporter to download for now 'yo"
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var downloadNotification = new DownloadNotification
|
var downloadNotification = new DownloadNotification
|
||||||
{
|
{
|
||||||
CompletionText = $"Imported {beatmapSetInfo.Metadata.Artist} - {beatmapSetInfo.Metadata.Title}!",
|
CompletionText = $"Imported {beatmapSetInfo.Metadata.Artist} - {beatmapSetInfo.Metadata.Title}!",
|
||||||
|
@ -61,21 +61,21 @@ namespace osu.Game.Graphics.Containers
|
|||||||
AddText(text.Substring(previousLinkEnd));
|
AddText(text.Substring(previousLinkEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddLink(string text, string url, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null, Action<SpriteText> creationParameters = null)
|
public IEnumerable<Drawable> AddLink(string text, string url, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null, Action<SpriteText> creationParameters = null)
|
||||||
=> createLink(AddText(text, creationParameters), text, url, linkType, linkArgument, tooltipText);
|
=> createLink(AddText(text, creationParameters), text, url, linkType, linkArgument, tooltipText);
|
||||||
|
|
||||||
public void AddLink(string text, Action action, string tooltipText = null, Action<SpriteText> creationParameters = null)
|
public IEnumerable<Drawable> AddLink(string text, Action action, string tooltipText = null, Action<SpriteText> creationParameters = null)
|
||||||
=> createLink(AddText(text, creationParameters), text, tooltipText: tooltipText, action: action);
|
=> createLink(AddText(text, creationParameters), text, tooltipText: tooltipText, action: action);
|
||||||
|
|
||||||
public void AddLink(IEnumerable<SpriteText> text, string url, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null)
|
public IEnumerable<Drawable> AddLink(IEnumerable<SpriteText> text, string url, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null)
|
||||||
{
|
{
|
||||||
foreach (var t in text)
|
foreach (var t in text)
|
||||||
AddArbitraryDrawable(t);
|
AddArbitraryDrawable(t);
|
||||||
|
|
||||||
createLink(text, null, url, linkType, linkArgument, tooltipText);
|
return createLink(text, null, url, linkType, linkArgument, tooltipText);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createLink(IEnumerable<Drawable> drawables, string text, string url = null, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null, Action action = null)
|
private IEnumerable<Drawable> createLink(IEnumerable<Drawable> drawables, string text, string url = null, LinkAction linkType = LinkAction.External, string linkArgument = null, string tooltipText = null, Action action = null)
|
||||||
{
|
{
|
||||||
AddInternal(new DrawableLinkCompiler(drawables.OfType<SpriteText>().ToList())
|
AddInternal(new DrawableLinkCompiler(drawables.OfType<SpriteText>().ToList())
|
||||||
{
|
{
|
||||||
@ -122,6 +122,8 @@ namespace osu.Game.Graphics.Containers
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return drawables;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We want the compilers to always be visible no matter where they are, so RelativeSizeAxes is used.
|
// We want the compilers to always be visible no matter where they are, so RelativeSizeAxes is used.
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
@ -19,6 +20,6 @@ namespace osu.Game.Graphics.Containers
|
|||||||
|
|
||||||
public void AddArbitraryDrawable(Drawable drawable) => AddInternal(drawable);
|
public void AddArbitraryDrawable(Drawable drawable) => AddInternal(drawable);
|
||||||
|
|
||||||
public void AddIcon(FontAwesome icon, Action<SpriteText> creationParameters = null) => AddText(((char)icon).ToString(), creationParameters);
|
public IEnumerable<Drawable> AddIcon(FontAwesome icon, Action<SpriteText> creationParameters = null) => AddText(((char)icon).ToString(), creationParameters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -355,11 +355,7 @@ namespace osu.Game.Online.API
|
|||||||
State = APIState.Offline;
|
State = APIState.Offline;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static User createGuestUser() => new User
|
private static User createGuestUser() => new GuestUser();
|
||||||
{
|
|
||||||
Username = @"Guest",
|
|
||||||
Id = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
protected override void Dispose(bool isDisposing)
|
||||||
{
|
{
|
||||||
@ -370,6 +366,15 @@ namespace osu.Game.Online.API
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class GuestUser : User
|
||||||
|
{
|
||||||
|
public GuestUser()
|
||||||
|
{
|
||||||
|
Username = @"Guest";
|
||||||
|
Id = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public enum APIState
|
public enum APIState
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -221,13 +221,18 @@ namespace osu.Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var databasedSet = BeatmapManager.QueryBeatmapSet(s => s.OnlineBeatmapSetID == beatmap.OnlineBeatmapSetID);
|
var databasedSet = beatmap.OnlineBeatmapSetID != null ?
|
||||||
|
BeatmapManager.QueryBeatmapSet(s => s.OnlineBeatmapSetID == beatmap.OnlineBeatmapSetID) :
|
||||||
|
BeatmapManager.QueryBeatmapSet(s => s.Hash == beatmap.Hash);
|
||||||
|
|
||||||
// Use first beatmap available for current ruleset, else switch ruleset.
|
if (databasedSet != null)
|
||||||
var first = databasedSet.Beatmaps.Find(b => b.Ruleset == ruleset.Value) ?? databasedSet.Beatmaps.First();
|
{
|
||||||
|
// Use first beatmap available for current ruleset, else switch ruleset.
|
||||||
|
var first = databasedSet.Beatmaps.Find(b => b.Ruleset == ruleset.Value) ?? databasedSet.Beatmaps.First();
|
||||||
|
|
||||||
ruleset.Value = first.Ruleset;
|
ruleset.Value = first.Ruleset;
|
||||||
Beatmap.Value = BeatmapManager.GetWorkingBeatmap(first);
|
Beatmap.Value = BeatmapManager.GetWorkingBeatmap(first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (currentScreen)
|
switch (currentScreen)
|
||||||
@ -359,11 +364,11 @@ namespace osu.Game
|
|||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
},
|
},
|
||||||
mainContent = new Container
|
overlayContent = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
},
|
},
|
||||||
overlayContent = new Container { RelativeSizeAxes = Axes.Both, Depth = float.MinValue },
|
floatingOverlayContent = new Container { RelativeSizeAxes = Axes.Both, Depth = float.MinValue },
|
||||||
idleTracker = new IdleTracker(6000)
|
idleTracker = new IdleTracker(6000)
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -382,32 +387,32 @@ namespace osu.Game
|
|||||||
CloseAllOverlays(false);
|
CloseAllOverlays(false);
|
||||||
intro?.ChildScreen?.MakeCurrent();
|
intro?.ChildScreen?.MakeCurrent();
|
||||||
},
|
},
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
loadComponentSingleFile(volume = new VolumeOverlay(), overlayContent.Add);
|
loadComponentSingleFile(volume = new VolumeOverlay(), floatingOverlayContent.Add);
|
||||||
loadComponentSingleFile(onscreenDisplay = new OnScreenDisplay(), Add);
|
loadComponentSingleFile(onscreenDisplay = new OnScreenDisplay(), Add);
|
||||||
|
|
||||||
loadComponentSingleFile(screenshotManager, Add);
|
loadComponentSingleFile(screenshotManager, Add);
|
||||||
|
|
||||||
//overlay elements
|
//overlay elements
|
||||||
loadComponentSingleFile(direct = new DirectOverlay { Depth = -1 }, mainContent.Add);
|
loadComponentSingleFile(direct = new DirectOverlay { Depth = -1 }, overlayContent.Add);
|
||||||
loadComponentSingleFile(social = new SocialOverlay { Depth = -1 }, mainContent.Add);
|
loadComponentSingleFile(social = new SocialOverlay { Depth = -1 }, overlayContent.Add);
|
||||||
loadComponentSingleFile(channelManager = new ChannelManager(), AddInternal);
|
loadComponentSingleFile(channelManager = new ChannelManager(), AddInternal);
|
||||||
loadComponentSingleFile(chatOverlay = new ChatOverlay { Depth = -1 }, mainContent.Add);
|
loadComponentSingleFile(chatOverlay = new ChatOverlay { Depth = -1 }, overlayContent.Add);
|
||||||
loadComponentSingleFile(settings = new MainSettings
|
loadComponentSingleFile(settings = new MainSettings
|
||||||
{
|
{
|
||||||
GetToolbarHeight = () => ToolbarOffset,
|
GetToolbarHeight = () => ToolbarOffset,
|
||||||
Depth = -1
|
Depth = -1
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
loadComponentSingleFile(userProfile = new UserProfileOverlay { Depth = -2 }, mainContent.Add);
|
loadComponentSingleFile(userProfile = new UserProfileOverlay { Depth = -2 }, overlayContent.Add);
|
||||||
loadComponentSingleFile(beatmapSetOverlay = new BeatmapSetOverlay { Depth = -3 }, mainContent.Add);
|
loadComponentSingleFile(beatmapSetOverlay = new BeatmapSetOverlay { Depth = -3 }, overlayContent.Add);
|
||||||
loadComponentSingleFile(musicController = new MusicController
|
loadComponentSingleFile(musicController = new MusicController
|
||||||
{
|
{
|
||||||
Depth = -5,
|
Depth = -5,
|
||||||
Position = new Vector2(0, Toolbar.HEIGHT),
|
Position = new Vector2(0, Toolbar.HEIGHT),
|
||||||
Anchor = Anchor.TopRight,
|
Anchor = Anchor.TopRight,
|
||||||
Origin = Anchor.TopRight,
|
Origin = Anchor.TopRight,
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
loadComponentSingleFile(notifications = new NotificationOverlay
|
loadComponentSingleFile(notifications = new NotificationOverlay
|
||||||
{
|
{
|
||||||
@ -415,22 +420,22 @@ namespace osu.Game
|
|||||||
Depth = -4,
|
Depth = -4,
|
||||||
Anchor = Anchor.TopRight,
|
Anchor = Anchor.TopRight,
|
||||||
Origin = Anchor.TopRight,
|
Origin = Anchor.TopRight,
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
loadComponentSingleFile(accountCreation = new AccountCreationOverlay
|
loadComponentSingleFile(accountCreation = new AccountCreationOverlay
|
||||||
{
|
{
|
||||||
Depth = -6,
|
Depth = -6,
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
loadComponentSingleFile(dialogOverlay = new DialogOverlay
|
loadComponentSingleFile(dialogOverlay = new DialogOverlay
|
||||||
{
|
{
|
||||||
Depth = -7,
|
Depth = -7,
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
loadComponentSingleFile(externalLinkOpener = new ExternalLinkOpener
|
loadComponentSingleFile(externalLinkOpener = new ExternalLinkOpener
|
||||||
{
|
{
|
||||||
Depth = -8,
|
Depth = -8,
|
||||||
}, overlayContent.Add);
|
}, floatingOverlayContent.Add);
|
||||||
|
|
||||||
dependencies.Cache(idleTracker);
|
dependencies.Cache(idleTracker);
|
||||||
dependencies.Cache(settings);
|
dependencies.Cache(settings);
|
||||||
@ -649,10 +654,10 @@ namespace osu.Game
|
|||||||
|
|
||||||
public bool OnReleased(GlobalAction action) => false;
|
public bool OnReleased(GlobalAction action) => false;
|
||||||
|
|
||||||
private Container mainContent;
|
|
||||||
|
|
||||||
private Container overlayContent;
|
private Container overlayContent;
|
||||||
|
|
||||||
|
private Container floatingOverlayContent;
|
||||||
|
|
||||||
private OsuScreen currentScreen;
|
private OsuScreen currentScreen;
|
||||||
private FrameworkConfigManager frameworkConfig;
|
private FrameworkConfigManager frameworkConfig;
|
||||||
private ScalingContainer screenContainer;
|
private ScalingContainer screenContainer;
|
||||||
@ -696,6 +701,7 @@ namespace osu.Game
|
|||||||
Beatmap.Disabled = applyBeatmapRulesetRestrictions;
|
Beatmap.Disabled = applyBeatmapRulesetRestrictions;
|
||||||
|
|
||||||
screenContainer.Padding = new MarginPadding { Top = ToolbarOffset };
|
screenContainer.Padding = new MarginPadding { Top = ToolbarOffset };
|
||||||
|
overlayContent.Padding = new MarginPadding { Top = ToolbarOffset };
|
||||||
|
|
||||||
MenuCursorContainer.CanShowCursor = currentScreen?.CursorVisible ?? false;
|
MenuCursorContainer.CanShowCursor = currentScreen?.CursorVisible ?? false;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,8 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
public class DownloadButton : DownloadTrackingComposite, IHasTooltip
|
public class DownloadButton : DownloadTrackingComposite, IHasTooltip
|
||||||
{
|
{
|
||||||
private readonly bool noVideo;
|
private readonly bool noVideo;
|
||||||
public string TooltipText => button.Enabled ? null : "You gotta be an osu!supporter to download for now 'yo";
|
|
||||||
|
public string TooltipText => button.Enabled ? "Download this beatmap" : "Login to download";
|
||||||
|
|
||||||
private readonly IBindable<User> localUser = new Bindable<User>();
|
private readonly IBindable<User> localUser = new Bindable<User>();
|
||||||
|
|
||||||
@ -147,7 +148,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
|
|||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void userChanged(User user) => button.Enabled.Value = user.IsSupporter;
|
private void userChanged(User user) => button.Enabled.Value = !(user is GuestUser);
|
||||||
|
|
||||||
private void enabledChanged(bool enabled) => this.FadeColour(enabled ? Color4.White : Color4.Gray, 200, Easing.OutQuint);
|
private void enabledChanged(bool enabled) => this.FadeColour(enabled ? Color4.White : Color4.Gray, 200, Easing.OutQuint);
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,16 @@ namespace osu.Game.Overlays.Settings.Sections
|
|||||||
LabelText = "Adjust gameplay cursor size based on current beatmap",
|
LabelText = "Adjust gameplay cursor size based on current beatmap",
|
||||||
Bindable = config.GetBindable<bool>(OsuSetting.AutoCursorSize)
|
Bindable = config.GetBindable<bool>(OsuSetting.AutoCursorSize)
|
||||||
},
|
},
|
||||||
|
new SettingsCheckbox
|
||||||
|
{
|
||||||
|
LabelText = "Beatmap skins",
|
||||||
|
Bindable = config.GetBindable<bool>(OsuSetting.BeatmapSkins)
|
||||||
|
},
|
||||||
|
new SettingsCheckbox
|
||||||
|
{
|
||||||
|
LabelText = "Beatmap hitsounds",
|
||||||
|
Bindable = config.GetBindable<bool>(OsuSetting.BeatmapHitsounds)
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
skins.ItemAdded += itemAdded;
|
skins.ItemAdded += itemAdded;
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
@ -24,7 +28,10 @@ namespace osu.Game.Screens.Menu
|
|||||||
|
|
||||||
public override bool CursorVisible => false;
|
public override bool CursorVisible => false;
|
||||||
|
|
||||||
private const float icon_y = -0.09f;
|
private readonly List<Drawable> supporterDrawables = new List<Drawable>();
|
||||||
|
private Drawable heart;
|
||||||
|
|
||||||
|
private const float icon_y = -85;
|
||||||
|
|
||||||
public Disclaimer()
|
public Disclaimer()
|
||||||
{
|
{
|
||||||
@ -42,7 +49,6 @@ namespace osu.Game.Screens.Menu
|
|||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Icon = FontAwesome.fa_warning,
|
Icon = FontAwesome.fa_warning,
|
||||||
Size = new Vector2(30),
|
Size = new Vector2(30),
|
||||||
RelativePositionAxes = Axes.Both,
|
|
||||||
Y = icon_y,
|
Y = icon_y,
|
||||||
},
|
},
|
||||||
textFlow = new LinkFlowContainer
|
textFlow = new LinkFlowContainer
|
||||||
@ -51,8 +57,9 @@ namespace osu.Game.Screens.Menu
|
|||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Padding = new MarginPadding(50),
|
Padding = new MarginPadding(50),
|
||||||
TextAnchor = Anchor.TopCentre,
|
TextAnchor = Anchor.TopCentre,
|
||||||
|
Y = -110,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.TopCentre,
|
||||||
Spacing = new Vector2(0, 2),
|
Spacing = new Vector2(0, 2),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -68,14 +75,37 @@ namespace osu.Game.Screens.Menu
|
|||||||
t.Font = @"Exo2.0-SemiBold";
|
t.Font = @"Exo2.0-SemiBold";
|
||||||
});
|
});
|
||||||
|
|
||||||
textFlow.AddParagraph("Don't expect everything to work perfectly.");
|
textFlow.AddParagraph("Things may not work as expected", t => t.TextSize = 20);
|
||||||
textFlow.AddParagraph("");
|
textFlow.NewParagraph();
|
||||||
textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.");
|
|
||||||
textFlow.AddParagraph("");
|
|
||||||
|
|
||||||
textFlow.AddText("Visit ");
|
Action<SpriteText> format = t =>
|
||||||
textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy");
|
{
|
||||||
textFlow.AddText(" if you want to help out or follow progress!");
|
t.TextSize = 15;
|
||||||
|
t.Font = @"Exo2.0-SemiBold";
|
||||||
|
};
|
||||||
|
|
||||||
|
textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format);
|
||||||
|
textFlow.NewParagraph();
|
||||||
|
|
||||||
|
textFlow.AddText("Visit ", format);
|
||||||
|
textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters:format);
|
||||||
|
textFlow.AddText(" to help out or follow progress!", format);
|
||||||
|
|
||||||
|
textFlow.NewParagraph();
|
||||||
|
textFlow.NewParagraph();
|
||||||
|
textFlow.NewParagraph();
|
||||||
|
|
||||||
|
supporterDrawables.AddRange(textFlow.AddText("Consider becoming an ", format));
|
||||||
|
supporterDrawables.AddRange(textFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format));
|
||||||
|
supporterDrawables.AddRange(textFlow.AddText(" to help support the game", format));
|
||||||
|
|
||||||
|
supporterDrawables.Add(heart = textFlow.AddIcon(FontAwesome.fa_heart, t =>
|
||||||
|
{
|
||||||
|
t.Padding = new MarginPadding { Left = 5 };
|
||||||
|
t.TextSize = 12;
|
||||||
|
t.Colour = colours.Pink;
|
||||||
|
t.Origin = Anchor.Centre;
|
||||||
|
}).First());
|
||||||
|
|
||||||
iconColour = colours.Yellow;
|
iconColour = colours.Yellow;
|
||||||
}
|
}
|
||||||
@ -90,8 +120,15 @@ namespace osu.Game.Screens.Menu
|
|||||||
{
|
{
|
||||||
base.OnEntering(last);
|
base.OnEntering(last);
|
||||||
|
|
||||||
icon.Delay(1500).FadeColour(iconColour, 200, Easing.OutQuint);
|
icon.Delay(1000).FadeColour(iconColour, 200, Easing.OutQuint);
|
||||||
icon.Delay(1500).MoveToY(icon_y * 1.1f, 100, Easing.OutCirc).Then().MoveToY(icon_y, 100, Easing.InCirc);
|
icon.Delay(1000)
|
||||||
|
.MoveToY(icon_y * 1.1f, 160, Easing.OutCirc)
|
||||||
|
.RotateTo(-10, 160, Easing.OutCirc)
|
||||||
|
.Then()
|
||||||
|
.MoveToY(icon_y, 160, Easing.InCirc)
|
||||||
|
.RotateTo(0, 160, Easing.InCirc);
|
||||||
|
|
||||||
|
supporterDrawables.ForEach(d => d.FadeOut().Delay(2000).FadeIn(500));
|
||||||
|
|
||||||
Content
|
Content
|
||||||
.FadeInFromZero(500)
|
.FadeInFromZero(500)
|
||||||
@ -99,6 +136,8 @@ namespace osu.Game.Screens.Menu
|
|||||||
.FadeOut(250)
|
.FadeOut(250)
|
||||||
.ScaleTo(0.9f, 250, Easing.InQuint)
|
.ScaleTo(0.9f, 250, Easing.InQuint)
|
||||||
.Finally(d => Push(intro));
|
.Finally(d => Push(intro));
|
||||||
|
|
||||||
|
heart.FlashColour(Color4.White, 750, Easing.OutQuint).Loop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
using osuTK.Graphics.ES30;
|
|
||||||
using osu.Framework.Configuration;
|
using osu.Framework.Configuration;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Batches;
|
using osu.Framework.Graphics.Batches;
|
||||||
@ -150,7 +149,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
|
|
||||||
private class VisualiserSharedData
|
private class VisualiserSharedData
|
||||||
{
|
{
|
||||||
public readonly LinearBatch<TexturedVertex2D> VertexBatch = new LinearBatch<TexturedVertex2D>(100 * 4, 10, PrimitiveType.Quads);
|
public readonly QuadBatch<TexturedVertex2D> VertexBatch = new QuadBatch<TexturedVertex2D>(100, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class VisualisationDrawNode : DrawNode
|
private class VisualisationDrawNode : DrawNode
|
||||||
|
@ -50,7 +50,7 @@ namespace osu.Game.Screens.Play.HUD
|
|||||||
protected override void PopOut() => this.FadeOut(fade_duration);
|
protected override void PopOut() => this.FadeOut(fade_duration);
|
||||||
|
|
||||||
//We want to handle keyboard inputs all the time in order to trigger ToggleVisibility() when not visible
|
//We want to handle keyboard inputs all the time in order to trigger ToggleVisibility() when not visible
|
||||||
public override bool HandleNonPositionalInput => true;
|
public override bool PropagateNonPositionalInputSubTree => true;
|
||||||
|
|
||||||
protected override bool OnKeyDown(KeyDownEvent e)
|
protected override bool OnKeyDown(KeyDownEvent e)
|
||||||
{
|
{
|
||||||
|
@ -50,15 +50,25 @@ namespace osu.Game.Screens.Play
|
|||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
AlwaysPresent = true, // The hud may be hidden but certain elements may need to still be updated
|
AlwaysPresent = true, // The hud may be hidden but certain elements may need to still be updated
|
||||||
Children = new Drawable[] {
|
Children = new Drawable[] {
|
||||||
ComboCounter = CreateComboCounter(),
|
new Container {
|
||||||
ScoreCounter = CreateScoreCounter(),
|
Anchor = Anchor.TopCentre,
|
||||||
AccuracyCounter = CreateAccuracyCounter(),
|
Origin = Anchor.TopCentre,
|
||||||
|
Y = 30,
|
||||||
|
AutoSizeAxes = Axes.Both,
|
||||||
|
AutoSizeDuration = 200,
|
||||||
|
AutoSizeEasing = Easing.Out,
|
||||||
|
Children = new Drawable[] {
|
||||||
|
AccuracyCounter = CreateAccuracyCounter(),
|
||||||
|
ScoreCounter = CreateScoreCounter(),
|
||||||
|
ComboCounter = CreateComboCounter(),
|
||||||
|
},
|
||||||
|
},
|
||||||
HealthDisplay = CreateHealthDisplay(),
|
HealthDisplay = CreateHealthDisplay(),
|
||||||
Progress = CreateProgress(),
|
Progress = CreateProgress(),
|
||||||
ModDisplay = CreateModsContainer(),
|
ModDisplay = CreateModsContainer(),
|
||||||
PlayerSettingsOverlay = CreatePlayerSettingsOverlay(),
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
PlayerSettingsOverlay = CreatePlayerSettingsOverlay(),
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
Anchor = Anchor.BottomRight,
|
Anchor = Anchor.BottomRight,
|
||||||
@ -159,20 +169,27 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
protected virtual RollingCounter<double> CreateAccuracyCounter() => new PercentageCounter
|
protected virtual RollingCounter<double> CreateAccuracyCounter() => new PercentageCounter
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopRight,
|
|
||||||
Position = new Vector2(0, 35),
|
|
||||||
TextSize = 20,
|
TextSize = 20,
|
||||||
Margin = new MarginPadding { Right = 140 },
|
BypassAutoSizeAxes = Axes.X,
|
||||||
|
Anchor = Anchor.TopLeft,
|
||||||
|
Origin = Anchor.TopRight,
|
||||||
|
Margin = new MarginPadding { Top = 5, Right = 20 },
|
||||||
|
};
|
||||||
|
|
||||||
|
protected virtual ScoreCounter CreateScoreCounter() => new ScoreCounter(6)
|
||||||
|
{
|
||||||
|
TextSize = 40,
|
||||||
|
Anchor = Anchor.TopCentre,
|
||||||
|
Origin = Anchor.TopCentre,
|
||||||
};
|
};
|
||||||
|
|
||||||
protected virtual RollingCounter<int> CreateComboCounter() => new SimpleComboCounter
|
protected virtual RollingCounter<int> CreateComboCounter() => new SimpleComboCounter
|
||||||
{
|
{
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopLeft,
|
|
||||||
Position = new Vector2(0, 35),
|
|
||||||
Margin = new MarginPadding { Left = 140 },
|
|
||||||
TextSize = 20,
|
TextSize = 20,
|
||||||
|
BypassAutoSizeAxes = Axes.X,
|
||||||
|
Anchor = Anchor.TopRight,
|
||||||
|
Origin = Anchor.TopLeft,
|
||||||
|
Margin = new MarginPadding { Top = 5, Left = 20 },
|
||||||
};
|
};
|
||||||
|
|
||||||
protected virtual HealthDisplay CreateHealthDisplay() => new StandardHealthDisplay
|
protected virtual HealthDisplay CreateHealthDisplay() => new StandardHealthDisplay
|
||||||
@ -191,14 +208,6 @@ namespace osu.Game.Screens.Play
|
|||||||
AudioClock = offsetClock
|
AudioClock = offsetClock
|
||||||
};
|
};
|
||||||
|
|
||||||
protected virtual ScoreCounter CreateScoreCounter() => new ScoreCounter(6)
|
|
||||||
{
|
|
||||||
Anchor = Anchor.TopCentre,
|
|
||||||
Origin = Anchor.TopCentre,
|
|
||||||
TextSize = 40,
|
|
||||||
Position = new Vector2(0, 30),
|
|
||||||
};
|
|
||||||
|
|
||||||
protected virtual SongProgress CreateProgress() => new SongProgress
|
protected virtual SongProgress CreateProgress() => new SongProgress
|
||||||
{
|
{
|
||||||
Anchor = Anchor.BottomLeft,
|
Anchor = Anchor.BottomLeft,
|
||||||
|
@ -38,7 +38,7 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
|||||||
},
|
},
|
||||||
showStoryboardToggle = new PlayerCheckbox { LabelText = "Storyboards" },
|
showStoryboardToggle = new PlayerCheckbox { LabelText = "Storyboards" },
|
||||||
beatmapSkinsToggle = new PlayerCheckbox { LabelText = "Beatmap skins" },
|
beatmapSkinsToggle = new PlayerCheckbox { LabelText = "Beatmap skins" },
|
||||||
beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = "Beatmap hit sounds" }
|
beatmapHitsoundsToggle = new PlayerCheckbox { LabelText = "Beatmap hitsounds" }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,9 +101,10 @@ namespace osu.Game.Skinning
|
|||||||
bool hasExtension = filename.Contains('.');
|
bool hasExtension = filename.Contains('.');
|
||||||
|
|
||||||
string lastPiece = filename.Split('/').Last();
|
string lastPiece = filename.Split('/').Last();
|
||||||
|
var legacyName = filename.StartsWith("Gameplay/taiko/") ? "taiko-" + lastPiece : lastPiece;
|
||||||
|
|
||||||
var file = source.Files.Find(f =>
|
var file = source.Files.Find(f =>
|
||||||
string.Equals(hasExtension ? f.Filename : Path.ChangeExtension(f.Filename, null), lastPiece, StringComparison.InvariantCultureIgnoreCase));
|
string.Equals(hasExtension ? f.Filename : Path.ChangeExtension(f.Filename, null), legacyName, StringComparison.InvariantCultureIgnoreCase));
|
||||||
return file?.FileInfo.StoragePath;
|
return file?.FileInfo.StoragePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="2.2.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2019.117.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2019.122.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
<PackageReference Include="SharpCompress" Version="0.22.0" />
|
||||||
<PackageReference Include="NUnit" Version="3.11.0" />
|
<PackageReference Include="NUnit" Version="3.11.0" />
|
||||||
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
<PackageReference Include="SharpRaven" Version="2.4.0" />
|
||||||
|
Loading…
Reference in New Issue
Block a user