mirror of
https://github.com/osukey/osukey.git
synced 2025-08-06 16:13:57 +09:00
Improve behaviour of "Autoplay" shortcut during gameplay start
This also opens up the way to adding shortcut for "Cinema" mod (Ctrl+Shift+Enter), but will leave adding that until there's a demand for it.
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
@ -14,13 +15,13 @@ using osu.Game.Scoring;
|
|||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
|
using osu.Game.Utils;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select
|
namespace osu.Game.Screens.Select
|
||||||
{
|
{
|
||||||
public class PlaySongSelect : SongSelect
|
public class PlaySongSelect : SongSelect
|
||||||
{
|
{
|
||||||
private bool removeAutoModOnResume;
|
|
||||||
private OsuScreen playerLoader;
|
private OsuScreen playerLoader;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
@ -43,25 +44,6 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
protected override BeatmapDetailArea CreateBeatmapDetailArea() => new PlayBeatmapDetailArea();
|
protected override BeatmapDetailArea CreateBeatmapDetailArea() => new PlayBeatmapDetailArea();
|
||||||
|
|
||||||
private ModAutoplay getAutoplayMod() => Ruleset.Value.CreateInstance().GetAutoplayMod();
|
|
||||||
|
|
||||||
public override void OnResuming(IScreen last)
|
|
||||||
{
|
|
||||||
base.OnResuming(last);
|
|
||||||
|
|
||||||
playerLoader = null;
|
|
||||||
|
|
||||||
if (removeAutoModOnResume)
|
|
||||||
{
|
|
||||||
var autoType = getAutoplayMod()?.GetType();
|
|
||||||
|
|
||||||
if (autoType != null)
|
|
||||||
Mods.Value = Mods.Value.Where(m => m.GetType() != autoType).ToArray();
|
|
||||||
|
|
||||||
removeAutoModOnResume = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool OnKeyDown(KeyDownEvent e)
|
protected override bool OnKeyDown(KeyDownEvent e)
|
||||||
{
|
{
|
||||||
switch (e.Key)
|
switch (e.Key)
|
||||||
@ -77,10 +59,16 @@ namespace osu.Game.Screens.Select
|
|||||||
return base.OnKeyDown(e);
|
return base.OnKeyDown(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IReadOnlyList<Mod> modsAtGameplayStart;
|
||||||
|
|
||||||
|
private ModAutoplay getAutoplayMod() => Ruleset.Value.CreateInstance().GetAutoplayMod();
|
||||||
|
|
||||||
protected override bool OnStart()
|
protected override bool OnStart()
|
||||||
{
|
{
|
||||||
if (playerLoader != null) return false;
|
if (playerLoader != null) return false;
|
||||||
|
|
||||||
|
modsAtGameplayStart = Mods.Value;
|
||||||
|
|
||||||
// Ctrl+Enter should start map with autoplay enabled.
|
// Ctrl+Enter should start map with autoplay enabled.
|
||||||
if (GetContainingInputManager().CurrentState?.Keyboard.ControlPressed == true)
|
if (GetContainingInputManager().CurrentState?.Keyboard.ControlPressed == true)
|
||||||
{
|
{
|
||||||
@ -95,13 +83,12 @@ namespace osu.Game.Screens.Select
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var mods = Mods.Value;
|
var mods = Mods.Value.Append(autoInstance).ToArray();
|
||||||
|
|
||||||
if (mods.All(m => m.GetType() != autoInstance.GetType()))
|
if (!ModUtils.CheckCompatibleSet(mods, out var invalid))
|
||||||
{
|
mods = mods.Except(invalid).Append(autoInstance).ToArray();
|
||||||
Mods.Value = mods.Append(autoInstance).ToArray();
|
|
||||||
removeAutoModOnResume = true;
|
Mods.Value = mods;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleConfirm?.Play();
|
SampleConfirm?.Play();
|
||||||
@ -118,5 +105,16 @@ namespace osu.Game.Screens.Select
|
|||||||
return new SoloPlayer();
|
return new SoloPlayer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void OnResuming(IScreen last)
|
||||||
|
{
|
||||||
|
base.OnResuming(last);
|
||||||
|
|
||||||
|
if (playerLoader != null)
|
||||||
|
{
|
||||||
|
Mods.Value = modsAtGameplayStart;
|
||||||
|
playerLoader = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user