mirror of
https://github.com/ppy/osu.git
synced 2025-02-21 20:12:57 +08:00
Externalise autoplay generation
This commit is contained in:
parent
7f9318d976
commit
7c89dbcd35
@ -1,9 +1,13 @@
|
|||||||
// 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;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Scoring;
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens.Ranking;
|
using osu.Game.Screens.Ranking;
|
||||||
|
|
||||||
@ -11,15 +15,28 @@ namespace osu.Game.Screens.Play
|
|||||||
{
|
{
|
||||||
public class ReplayPlayer : Player, IKeyBindingHandler<GlobalAction>
|
public class ReplayPlayer : Player, IKeyBindingHandler<GlobalAction>
|
||||||
{
|
{
|
||||||
protected readonly Score Score;
|
protected Score Score { get; private set; }
|
||||||
|
|
||||||
|
private readonly Func<GameplayBeatmap, IReadOnlyList<Mod>, Score> createScore;
|
||||||
|
|
||||||
// Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108)
|
// Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108)
|
||||||
protected override bool CheckModsAllowFailure() => false;
|
protected override bool CheckModsAllowFailure() => false;
|
||||||
|
|
||||||
public ReplayPlayer(Score score, PlayerConfiguration configuration = null)
|
public ReplayPlayer(Score score, PlayerConfiguration configuration = null)
|
||||||
|
: this((_, __) => score, configuration)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReplayPlayer(Func<GameplayBeatmap, IReadOnlyList<Mod>, Score> createScore, PlayerConfiguration configuration = null)
|
||||||
: base(configuration)
|
: base(configuration)
|
||||||
{
|
{
|
||||||
Score = score;
|
this.createScore = createScore;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
Score = createScore(GameplayBeatmap, Mods.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void PrepareReplay()
|
protected override void PrepareReplay()
|
||||||
|
@ -21,7 +21,7 @@ namespace osu.Game.Screens.Select
|
|||||||
public class PlaySongSelect : SongSelect
|
public class PlaySongSelect : SongSelect
|
||||||
{
|
{
|
||||||
private bool removeAutoModOnResume;
|
private bool removeAutoModOnResume;
|
||||||
private OsuScreen player;
|
private OsuScreen playerLoader;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private NotificationOverlay notifications { get; set; }
|
private NotificationOverlay notifications { get; set; }
|
||||||
@ -49,7 +49,7 @@ namespace osu.Game.Screens.Select
|
|||||||
{
|
{
|
||||||
base.OnResuming(last);
|
base.OnResuming(last);
|
||||||
|
|
||||||
player = null;
|
playerLoader = null;
|
||||||
|
|
||||||
if (removeAutoModOnResume)
|
if (removeAutoModOnResume)
|
||||||
{
|
{
|
||||||
@ -79,14 +79,14 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
protected override bool OnStart()
|
protected override bool OnStart()
|
||||||
{
|
{
|
||||||
if (player != null) return false;
|
if (playerLoader != null) return false;
|
||||||
|
|
||||||
// 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)
|
||||||
{
|
{
|
||||||
var autoplayMod = getAutoplayMod();
|
var autoInstance = getAutoplayMod();
|
||||||
|
|
||||||
if (autoplayMod == null)
|
if (autoInstance == null)
|
||||||
{
|
{
|
||||||
notifications?.Post(new SimpleNotification
|
notifications?.Post(new SimpleNotification
|
||||||
{
|
{
|
||||||
@ -97,18 +97,26 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
var mods = Mods.Value;
|
var mods = Mods.Value;
|
||||||
|
|
||||||
if (mods.All(m => m.GetType() != autoplayMod.GetType()))
|
if (mods.All(m => m.GetType() != autoInstance.GetType()))
|
||||||
{
|
{
|
||||||
Mods.Value = mods.Append(autoplayMod).ToArray();
|
Mods.Value = mods.Append(autoInstance).ToArray();
|
||||||
removeAutoModOnResume = true;
|
removeAutoModOnResume = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleConfirm?.Play();
|
SampleConfirm?.Play();
|
||||||
|
|
||||||
this.Push(player = new PlayerLoader(() => new SoloPlayer()));
|
this.Push(playerLoader = new PlayerLoader(createPlayer));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
Player createPlayer()
|
||||||
|
{
|
||||||
|
var autoplayMod = Mods.Value.OfType<ModAutoplay>().FirstOrDefault();
|
||||||
|
if (autoplayMod != null)
|
||||||
|
return new ReplayPlayer((beatmap, mods) => autoplayMod.CreateReplayScore(beatmap, mods));
|
||||||
|
|
||||||
|
return new SoloPlayer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user