diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 6d0caae2ec..ad90915947 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -167,6 +167,8 @@ namespace osu.Game.Configuration SetDefault(OsuSetting.DiscordRichPresence, DiscordRichPresenceMode.Full); SetDefault(OsuSetting.EditorWaveformOpacity, 0.25f); + + SetDefault(OsuSetting.MisskeyToken, string.Empty); } public IDictionary GetLoggableState() => diff --git a/osu.Game/Online/MisskeyAPI/APIAccess.cs b/osu.Game/Online/MisskeyAPI/APIAccess.cs index 8c09186de5..09e6c4c8d1 100644 --- a/osu.Game/Online/MisskeyAPI/APIAccess.cs +++ b/osu.Game/Online/MisskeyAPI/APIAccess.cs @@ -199,8 +199,9 @@ namespace osu.Game.Online.MisskeyAPI // The Success callback event is fired on the main thread, so we should wait for that to run before proceeding. // Without this, we will end up circulating this Connecting loop multiple times and queueing up many web requests // before actually going online. - while (State.Value > APIState.Offline && State.Value < APIState.Online) - Thread.Sleep(500); + + // while (State.Value > APIState.Offline && State.Value < APIState.Online) + // Thread.Sleep(500); break; } @@ -264,11 +265,6 @@ namespace osu.Game.Online.MisskeyAPI // public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => // new HubClientConnector(clientName, endpoint, this, versionHash, preferMessagePack); - public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true) - { - throw new NotImplementedException(); - } - public RegistrationRequest.RegistrationRequestErrors CreateAccount(string email, string username, string password) { Debug.Assert(State.Value == APIState.Offline); @@ -398,11 +394,11 @@ namespace osu.Game.Online.MisskeyAPI { lock (queue) { - if (state.Value == APIState.Offline) - { - request.Fail(new WebException(@"User not logged in")); - return; - } + // if (state.Value == APIState.Offline) + // { + // request.Fail(new WebException(@"User not logged in")); + // return; + // } queue.Enqueue(request); } diff --git a/osu.Game/Online/MisskeyAPI/APIRequest.cs b/osu.Game/Online/MisskeyAPI/APIRequest.cs index c070dc84d9..2d1c86b7e8 100644 --- a/osu.Game/Online/MisskeyAPI/APIRequest.cs +++ b/osu.Game/Online/MisskeyAPI/APIRequest.cs @@ -123,8 +123,16 @@ namespace osu.Game.Online.MisskeyAPI if (isFailing) return; - Logger.Log($@"Performing request {this}", LoggingTarget.Network); - WebRequest.Perform(); + try + { + Logger.Log($@"Performing request {this}", LoggingTarget.Network); + WebRequest.Perform(); + } + catch (OperationCanceledException) + { + // ignore this. internally Perform is running async and the fail state may have changed since + // the last check of `isFailing` above. + } if (isFailing) return; diff --git a/osu.Game/Online/MisskeyAPI/DummyAPIAccess.cs b/osu.Game/Online/MisskeyAPI/DummyAPIAccess.cs new file mode 100644 index 0000000000..45ed06d216 --- /dev/null +++ b/osu.Game/Online/MisskeyAPI/DummyAPIAccess.cs @@ -0,0 +1,124 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable + +using System; +using System.Threading; +using System.Threading.Tasks; +using osu.Framework.Bindables; +using osu.Framework.Graphics; +using osu.Game.Online.MisskeyAPI.Requests.Responses; +using osu.Game.Users; + +namespace osu.Game.Online.MisskeyAPI +{ + public class DummyAPIAccess : Component//, IAPIProvider + { + public const string DUMMY_USER_ID = "1001"; + + public Bindable LocalUser { get; } = new Bindable(new MisskeyAPI.Requests.Responses.I + { + Username = @"Dummy", + Id = "DUMMY_USER_ID", + }); + + public BindableList Friends { get; } = new BindableList(); + + public Bindable Activity { get; } = new Bindable(); + + public string AccessToken => "token"; + + public bool IsLoggedIn => State.Value == APIState.Online; + + public string ProvidedUsername => LocalUser.Value.Username; + + public string APIEndpointUrl => "http://localhost"; + + public string WebsiteRootUrl => "http://localhost"; + + public int APIVersion => int.Parse(DateTime.Now.ToString("yyyyMMdd")); + + public Exception LastLoginError { get; private set; } + + /// + /// Provide handling logic for an arbitrary API request. + /// Should return true is a request was handled. If null or false return, the request will be failed with a . + /// + public Func HandleRequest; + + private readonly Bindable state = new Bindable(APIState.Online); + + private bool shouldFailNextLogin; + + /// + /// The current connectivity state of the API. + /// + public IBindable State => state; + + public DummyAPIAccess() + { + } + + public virtual void Queue(APIRequest request) + { + Schedule(() => + { + if (HandleRequest?.Invoke(request) != true) + { + request.Fail(new InvalidOperationException($@"{nameof(DummyAPIAccess)} cannot process this request.")); + } + }); + } + + public void Perform(APIRequest request) => HandleRequest?.Invoke(request); + + public Task PerformAsync(APIRequest request) + { + HandleRequest?.Invoke(request); + return Task.CompletedTask; + } + + public void Login(string username, string password) + { + state.Value = APIState.Connecting; + + if (shouldFailNextLogin) + { + LastLoginError = new APIException("Not powerful enough to login.", new ArgumentException(nameof(shouldFailNextLogin))); + + state.Value = APIState.Offline; + shouldFailNextLogin = false; + return; + } + + LastLoginError = null; + LocalUser.Value = new MisskeyAPI.Requests.Responses.I + { + Username = username, + Id = "1001", + }; + + state.Value = APIState.Online; + } + + public void Logout() + { + state.Value = APIState.Offline; + } + + public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null; + + public RegistrationRequest.RegistrationRequestErrors CreateAccount(string email, string username, string password) + { + Thread.Sleep(200); + return null; + } + + public void SetState(APIState newState) => state.Value = newState; + + // IBindable IAPIProvider.Activity => Activity; + + public void FailNextLogin() => shouldFailNextLogin = true; + } +} diff --git a/osu.Game/Online/MisskeyAPI/IAPIProvider.cs b/osu.Game/Online/MisskeyAPI/IAPIProvider.cs index b0d4d80a22..3d1e8cbedb 100644 --- a/osu.Game/Online/MisskeyAPI/IAPIProvider.cs +++ b/osu.Game/Online/MisskeyAPI/IAPIProvider.cs @@ -103,13 +103,13 @@ namespace osu.Game.Online.MisskeyAPI /// void Logout(); - /// - /// Constructs a new . May be null if not supported. - /// - /// The name of the client this connector connects for, used for logging. - /// The endpoint to the hub. - /// Whether to use MessagePack for serialisation if available on this platform. - IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true); + // /// + // /// Constructs a new . May be null if not supported. + // /// + // /// The name of the client this connector connects for, used for logging. + // /// The endpoint to the hub. + // /// Whether to use MessagePack for serialisation if available on this platform. + // IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true); /// /// Create a new user account. This is a blocking operation. diff --git a/osu.Game/Online/MisskeyAPI/Requests/Meta.cs b/osu.Game/Online/MisskeyAPI/Requests/Meta.cs index ef30ca6db1..c3081c28e2 100644 --- a/osu.Game/Online/MisskeyAPI/Requests/Meta.cs +++ b/osu.Game/Online/MisskeyAPI/Requests/Meta.cs @@ -1,18 +1,17 @@ // Copyright (c) ppy Pty Ltd , sim1222 . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +#nullable disable + using System.Net.Http; using osu.Framework.IO.Network; namespace osu.Game.Online.MisskeyAPI.Requests { - public class Meta : APIRequest + public class Meta : APIRequest { - public string instanceUrl { get; } - - public Meta(string instanceUrl) + public Meta() { - this.instanceUrl = instanceUrl; } protected override WebRequest CreateWebRequest() @@ -22,7 +21,7 @@ namespace osu.Game.Online.MisskeyAPI.Requests return req; } - public string APIEndpointUrl => $"https://{instanceUrl}"; + protected override string Uri => $@"https://misskey.io/api/meta"; protected override string Target => @"meta"; } } diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs index ead3eeb0dc..fbba00fcad 100644 --- a/osu.Game/OsuGameBase.cs +++ b/osu.Game/OsuGameBase.cs @@ -40,6 +40,7 @@ using osu.Game.Input.Bindings; using osu.Game.IO; using osu.Game.Online; using osu.Game.Online.API; +using osu.Game.Online.MisskeyAPI; using osu.Game.Online.Chat; using osu.Game.Online.Multiplayer; using osu.Game.Online.Spectator; @@ -88,9 +89,11 @@ namespace osu.Game public virtual bool UseDevelopmentServer => DebugUtils.IsDebugBuild; - internal EndpointConfiguration CreateEndpoints() => + internal Online.EndpointConfiguration CreateEndpoints() => UseDevelopmentServer ? new DevelopmentEndpointConfiguration() : new ProductionEndpointConfiguration(); + internal Online.MisskeyAPI.EndpointConfiguration CreateMisskeyEndpoints() => new osu.Game.Online.MisskeyAPI.DefaultEndpointConfigration(); + public virtual Version AssemblyVersion => Assembly.GetEntryAssembly()?.GetName().Version ?? new Version(); /// @@ -142,7 +145,9 @@ namespace osu.Game protected MusicController MusicController { get; private set; } - protected IAPIProvider API { get; set; } + protected Online.API.IAPIProvider API { get; set; } + + protected Online.MisskeyAPI.IAPIProvider MisskeyAPI { get; set; } protected Storage Storage { get; set; } @@ -257,11 +262,13 @@ namespace osu.Game dependencies.Cache(SkinManager = new SkinManager(Storage, realm, Host, Resources, Audio, Scheduler)); dependencies.CacheAs(SkinManager); - EndpointConfiguration endpoints = CreateEndpoints(); + Online.EndpointConfiguration endpoints = CreateEndpoints(); + osu.Game.Online.MisskeyAPI.EndpointConfiguration misskeyendpoints = CreateMisskeyEndpoints(); MessageFormatter.WebsiteRootUrl = endpoints.WebsiteRootUrl; - dependencies.CacheAs(API ??= new APIAccess(LocalConfig, endpoints, VersionHash)); + dependencies.CacheAs(API ??= new Online.API.APIAccess(LocalConfig, endpoints, VersionHash)); + dependencies.CacheAs(MisskeyAPI ??= new Online.MisskeyAPI.APIAccess(LocalConfig, misskeyendpoints, VersionHash)); dependencies.CacheAs(spectatorClient = new OnlineSpectatorClient(endpoints)); dependencies.CacheAs(multiplayerClient = new OnlineMultiplayerClient(endpoints)); @@ -314,8 +321,10 @@ namespace osu.Game dependencies.CacheAs(Beatmap); // add api components to hierarchy. - if (API is APIAccess apiAccess) + if (API is Online.API.APIAccess apiAccess) AddInternal(apiAccess); + if (MisskeyAPI is Online.MisskeyAPI.APIAccess misskeyAPIAccess) + AddInternal(misskeyAPIAccess); AddInternal(spectatorClient); AddInternal(multiplayerClient); diff --git a/osu.Game/Screens/Misskey/Components/PopupButton.cs b/osu.Game/Screens/Misskey/Components/PopupButton.cs new file mode 100644 index 0000000000..5bfa6e11e9 --- /dev/null +++ b/osu.Game/Screens/Misskey/Components/PopupButton.cs @@ -0,0 +1,48 @@ +// Copyright (c) sim1222 . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Game.Graphics; +using osu.Game.Graphics.UserInterface; +using osuTK; + +namespace osu.Game.Screens.Misskey.Components +{ + public class PopupButton : IconButton + { + public PopupButton() + { + AutoSizeAxes = Axes.Both; + } + + [BackgroundDependencyLoader] + private void load(OsuColour colours) + { + HoverColour = colours.YellowDark.Opacity(0.6f); + FlashColour = colours.Yellow; + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + // works with AutoSizeAxes above to make buttons autosize with the scale animation. + Content.AutoSizeAxes = Axes.None; + Content.Size = new Vector2(DEFAULT_BUTTON_SIZE); + } + } + + // Hou to use + // private IconButton playlistButton; + // playlistButton = new PopupButton + // { + // Origin = Anchor.Centre, + // Anchor = Anchor.CentreRight, + // Position = new Vector2(-bottom_black_area_height / 2, 0), + // Icon = FontAwesome.Solid.Bars, + // Action = togglePlaylist + // }, + +} diff --git a/osu.Game/Screens/Misskey/MisskeyInstanceSelect.cs b/osu.Game/Screens/Misskey/MisskeyInstanceSelect.cs index db5127d511..da6b966755 100644 --- a/osu.Game/Screens/Misskey/MisskeyInstanceSelect.cs +++ b/osu.Game/Screens/Misskey/MisskeyInstanceSelect.cs @@ -11,12 +11,15 @@ using osu.Framework.Graphics.Containers; using osu.Game.Graphics; using osuTK.Graphics; using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; using osu.Framework.Logging; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Online.MisskeyAPI; using osu.Game.Online.MisskeyAPI.Requests; using osu.Game.Online.MisskeyAPI.Requests.Responses; +using osu.Game.Overlays; +using osu.Game.Overlays.Notifications; using osuTK; using Meta = osu.Game.Online.MisskeyAPI.Requests.Meta; @@ -34,13 +37,17 @@ namespace osu.Game.Screens.Misskey // [Resolved] private IAPIProvider api { get; set; } - // private Meta getMeta; + private Online.MisskeyAPI.Requests.Meta request; + + [Resolved] + private INotificationOverlay notificationOverlay { get; set; } + [Resolved] private OsuColour colours { get; set; } [BackgroundDependencyLoader(true)] - private void load() + private void load(IAPIProvider api, INotificationOverlay notifications) { InternalChild = contentContainer = new Container { @@ -104,14 +111,22 @@ namespace osu.Game.Screens.Misskey private void insetanceFetch() { - var getMeta = new Meta(searchTextBox.Text); + request = new Meta(); - getMeta.Success += response => + request.Success += () => { - Logger.Log($"{response}"); }; - api.Queue(getMeta); + request.Failure += e => + { + notificationOverlay?.Post(new SimpleNotification + { + Text = e.Message, + Icon = FontAwesome.Solid.Times, + }); + }; + + api.Queue(request); } } } diff --git a/osu.Game/Screens/Misskey/MisskeyScreenSelector.cs b/osu.Game/Screens/Misskey/MisskeyScreenSelector.cs index 076cf5604f..92a173f947 100644 --- a/osu.Game/Screens/Misskey/MisskeyScreenSelector.cs +++ b/osu.Game/Screens/Misskey/MisskeyScreenSelector.cs @@ -11,6 +11,8 @@ using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.UserInterface; using osu.Framework.Screens; using osu.Game.Graphics; +using osu.Game.Graphics.UserInterface; +using osu.Game.Overlays.Dashboard.Friends; using osuTK; using osuTK.Graphics; @@ -18,8 +20,10 @@ namespace osu.Game.Screens.Misskey { public class MisskeyScreenSelector : OsuScreen { + private Box background; private Container contentContainer; + [Resolved] private OsuGameBase game { get; set; } @@ -29,48 +33,75 @@ namespace osu.Game.Screens.Misskey [BackgroundDependencyLoader(true)] private void load() { - InternalChild = contentContainer = new Container() + InternalChild = contentContainer = new Container { + Masking = true, CornerRadius = 10, RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre, Origin = Anchor.Centre, Size = new Vector2(0.9f, 0.8f), - Children = new Drawable[] { - new Box - { - Colour = colours.GreySeaFoamDark, - RelativeSizeAxes = Axes.Both, - }, new Container { - RelativeSizeAxes = Axes.Both, - //Width = 0.35f, - Anchor = Anchor.TopLeft, - Origin = Anchor.TopLeft, + Name = "List", + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, Children = new Drawable[] { - new BasicButton() + background = new Box { - Text = "MisskeyLogin", - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - RelativeSizeAxes = Axes.X, - Height = 60f, - Width = 0.9f, - Action = () => this.Push(new MisskeyLogin()) + RelativeSizeAxes = Axes.Both, + Colour = colours.Gray9 }, - new BasicButton() + new FillFlowContainer { - Text = "MisskeyInstanceSelect", - Anchor = Anchor.Centre, - Origin = Anchor.Centre, RelativeSizeAxes = Axes.X, - Height = 60f, - Width = 0.9f, - Action = () => this.Push(new MisskeyInstanceSelect()) + AutoSizeAxes = Axes.Y, + Margin = new MarginPadding { Bottom = 20 }, + Children = new Drawable[] + { + //ここに足す + new Container + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Padding = new MarginPadding + { + Horizontal = 40, + Vertical = 20 + }, + Child = new OsuButton() + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Size = new Vector2(500f, 50f), + Text = "MisskeyInstanceSelect", + Action = () => this.Push(new MisskeyInstanceSelect()) + } + }, + new Container + { + RelativeSizeAxes = Axes.X, + AutoSizeAxes = Axes.Y, + Padding = new MarginPadding + { + Horizontal = 40, + Vertical = 20 + }, + Child = new OsuButton() + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Size = new Vector2(500f, 50f), + Text = "Welcome", + Action = () => this.Push(new Welcome()) + } + }, + } } } } diff --git a/osu.Game/Screens/Misskey/Welcome.cs b/osu.Game/Screens/Misskey/Welcome.cs new file mode 100644 index 0000000000..81fb43c4e2 --- /dev/null +++ b/osu.Game/Screens/Misskey/Welcome.cs @@ -0,0 +1,187 @@ +// Copyright (c) sim1222 . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable + +using osu.Framework.Allocation; +using osu.Framework.Extensions.Color4Extensions; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Effects; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.UserInterface; +using osu.Framework.Screens; +using osu.Game.Graphics; +using osu.Game.Graphics.Containers; +using osu.Game.Graphics.Sprites; +using osu.Game.Graphics.UserInterface; +using osu.Game.Overlays; +using osu.Game.Screens.Misskey.Components; +using osu.Game.Screens.Select; +using osuTK; +using osuTK.Graphics; + +namespace osu.Game.Screens.Misskey +{ + public class Welcome : OsuScreen + { + private Container carouselContainer; + private IconButton aboutButton; + + [BackgroundDependencyLoader(true)] + private void load() + { + InternalChild = new Container + { + Masking = true, + CornerRadius = 10, + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + Children = new Drawable[] + { + new GridContainer // used for max width implementation + { + Name = "ParrallaxBackgroundShape", + RelativeSizeAxes = Axes.Both, + ColumnDimensions = new[] + { + new Dimension(), + new Dimension(GridSizeMode.Relative, 0.5f, maxSize: 850), + }, + Content = new[] + { + new Drawable[] + { + new ParallaxContainer + { + ParallaxAmount = 0.005f, + RelativeSizeAxes = Axes.Both, + Child = new WedgeBackground + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding { Right = -150 }, + }, + }, + carouselContainer = new Container + { + RelativeSizeAxes = Axes.Both, + Padding = new MarginPadding + { + Top = FilterControl.HEIGHT, + Bottom = Footer.HEIGHT + }, + Child = new LoadingSpinner(true) { State = { Value = Visibility.Visible } } + } + }, + } + }, + new Container() + { + Name = "Panel", + Anchor = Anchor.CentreLeft, + Origin = Anchor.CentreLeft, + Width = 500f, + Height = 500f, + Margin = new MarginPadding(80), + CornerRadius = 10, + Masking = true, + EdgeEffect = new EdgeEffectParameters + { + Type = EdgeEffectType.Shadow, + Colour = Color4.Black.Opacity(60), + Radius = 30, + }, + Children = new Drawable[] + { + new Box() + { + Name = "BackGround", + RelativeSizeAxes = Axes.Both, + Colour = Colour4.DarkSlateGray, + Width = 1f, + Height = 1f, + }, + new OsuSpriteText() + { + Name = "InsetanceName", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Margin = new MarginPadding(50), + Text = "Misskey", + Font = new FontUsage(size: 30), + Colour = Colour4.White, + }, + aboutButton = new PopupButton + { + Origin = Anchor.TopRight, + Anchor = Anchor.TopRight, + Margin = new MarginPadding(20), + Position = new Vector2(0), + Icon = FontAwesome.Solid.EllipsisH, + // Action = () => OsuMenu.Empty() + // TODO: コンテキストメニューの実装 + }, + new OsuSpriteText() + { + Name = "InsetanceInfo", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Margin = new MarginPadding(100), + Width = 400f, + Text = "Misskey.io は、地球で生まれた分散マイクロブログSNSです。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。\n暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。", + Font = new FontUsage(size: 20), + Colour = Colour4.White, + }, + new GridContainer() + { + Name = "Buttons", + RelativeSizeAxes = Axes.Both, + Position = new Vector2(0, 300), + ColumnDimensions = new[] + { + new Dimension(), + new Dimension(GridSizeMode.Relative, 0.5f, maxSize: 850), + }, + Content = new[] + { + new Drawable[] + { + new OsuButton() + { + Name = "SignUpButton", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Width = 100f, + Text = "新規登録" + }, + new OsuButton() + { + Name = "SignInButton", + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + Width = 100f, + Text = "ログイン" + }, + } + }, + // TODO: 横棒 + // TODO: インスタンス情報の表示(ユーザー数など) + } + } + } + } + }; + } + public override void OnResuming(ScreenTransitionEvent e) + { + base.OnResuming(e); + + this.FadeIn(250); + + this.ScaleTo(1, 250, Easing.OutSine); + + } + } +} diff --git a/osu.Game/Screens/Select/WedgeBackground.cs b/osu.Game/Screens/Select/WedgeBackground.cs index 4a5b9d8911..4a09a5a850 100644 --- a/osu.Game/Screens/Select/WedgeBackground.cs +++ b/osu.Game/Screens/Select/WedgeBackground.cs @@ -22,7 +22,7 @@ namespace osu.Game.Screens.Select { RelativeSizeAxes = Axes.Both, Size = new Vector2(1, 0.5f), - Colour = Color4.Black.Opacity(0.5f), + Colour = Color4.GreenYellow, Shear = new Vector2(0.15f, 0), EdgeSmoothness = new Vector2(2, 0), }, @@ -32,7 +32,7 @@ namespace osu.Game.Screens.Select RelativePositionAxes = Axes.Y, Size = new Vector2(1, -0.5f), Position = new Vector2(0, 1), - Colour = Color4.Black.Opacity(0.5f), + Colour = Color4.GreenYellow, Shear = new Vector2(-0.15f, 0), EdgeSmoothness = new Vector2(2, 0), },