mirror of
https://github.com/ppy/osu.git
synced 2026-05-18 07:49:52 +08:00
0988552567
I don't really have much to say here. Instead, I'll give a brief history rundown that lists many pages of documentation you can read, if interested. - Started off as BTMC + Happy24 (Vivi)'s ["The Vision"](https://docs.google.com/document/d/1p1IpPmd2RICp8G4OqkCSs7u8Ug8FbFv8qqP0mfSrHf0/edit?tab=t.0#heading=h.fol093d9f9xi) - Initial [designs](https://www.figma.com/design/f5qqC57t9jFlgpzhRqUNVX/The-Vision?node-id=0-1&p=f) were led by Vivi. - Designs [morphed](https://www.figma.com/design/vtFmLrXKvWNyYiRjTezFTM/Untitled--Copy-?node-id=0-1&p=f) during development into what's currently present, led by @minetoblend. - There is some more ongoing work creating a [game design document](https://docs.google.com/document/d/1iffJFCsIBfYF0D4ogItSBEj6YBmbp-rdCpItAeaJiTA/edit?tab=t.0). **tl;dr:** Create something with the mechanics of a trading card game within osu!. The name of this is "ranked play". --- To be frank, a lot of stuff is missing here. Some of it I don't want to mention, because the point of this exercise is to get the system into the hands of players, gather feedback especially around mechanics, and discuss any further direction with the team. I am expecting a blanket approval on all of the new code, with particular attention to changes in existing components that I'll point out in a self review. There is also some [ongoing work](https://github.com/smoogipoo/osu/pulls) that may arrive in this branch prior to being merged. --------- Co-authored-by: maarvin <minetoblend@gmail.com> Co-authored-by: Marvin <m.schuerz@hautzy.com> Co-authored-by: Jamie Taylor <me@nekodex.net> Co-authored-by: ArijanJ <arijanj@proton.me> Co-authored-by: Dean Herbert <pe@ppy.sh> Co-authored-by: Tim Oliver <git@tim.dev> Co-authored-by: Joseph Madamba <madamba.joehu@outlook.com> Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com> Co-authored-by: nil <25884226+voidstar0@users.noreply.github.com> Co-authored-by: Ботников Максим <mr.botnikoff@ya.ru> Co-authored-by: Denis Titovets <den232titovets@yandex.ru> Co-authored-by: Michael Middlezong <119022671+mmiddlezong@users.noreply.github.com> Co-authored-by: SupDos <6813986+SupDos@users.noreply.github.com> Co-authored-by: failaip12 <86018517+failaip12@users.noreply.github.com>
146 lines
3.6 KiB
C#
146 lines
3.6 KiB
C#
// 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.
|
|
|
|
using System;
|
|
using osu.Framework.Allocation;
|
|
using osu.Framework.Audio.Track;
|
|
using osu.Framework.Graphics;
|
|
using osu.Framework.Threading;
|
|
|
|
namespace osu.Game.Audio
|
|
{
|
|
[LongRunningLoad]
|
|
public abstract partial class PreviewTrack : Component
|
|
{
|
|
/// <summary>
|
|
/// Invoked when this <see cref="PreviewTrack"/> has stopped playing.
|
|
/// Not invoked in a thread-safe context.
|
|
/// </summary>
|
|
public event Action? Stopped;
|
|
|
|
/// <summary>
|
|
/// Invoked when this <see cref="PreviewTrack"/> has started playing.
|
|
/// Not invoked in a thread-safe context.
|
|
/// </summary>
|
|
public event Action? Started;
|
|
|
|
protected Track? Track { get; private set; }
|
|
|
|
private bool hasStarted;
|
|
|
|
[BackgroundDependencyLoader]
|
|
private void load()
|
|
{
|
|
Track = GetTrack();
|
|
|
|
if (Track != null)
|
|
{
|
|
Track.Completed += Stop;
|
|
Track.Looping = looping;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Length of the track.
|
|
/// </summary>
|
|
public double Length => Track?.Length ?? 0;
|
|
|
|
/// <summary>
|
|
/// The current track time.
|
|
/// </summary>
|
|
public double CurrentTime => Track?.CurrentTime ?? 0;
|
|
|
|
/// <summary>
|
|
/// Whether the track is loaded.
|
|
/// </summary>
|
|
public bool TrackLoaded => Track?.IsLoaded ?? false;
|
|
|
|
/// <summary>
|
|
/// Whether the track is playing.
|
|
/// </summary>
|
|
public bool IsRunning => Track?.IsRunning ?? false;
|
|
|
|
private bool looping;
|
|
|
|
/// <summary>
|
|
/// Whether the track should loop.
|
|
/// </summary>
|
|
public bool Looping
|
|
{
|
|
get => looping;
|
|
set
|
|
{
|
|
looping = value;
|
|
|
|
if (Track != null)
|
|
Track.Looping = looping;
|
|
}
|
|
}
|
|
|
|
private ScheduledDelegate? startDelegate;
|
|
|
|
/// <summary>
|
|
/// Starts playing this <see cref="PreviewTrack"/>.
|
|
/// </summary>
|
|
/// <returns>Whether the track is started or already playing.</returns>
|
|
public bool Start()
|
|
{
|
|
if (Track == null)
|
|
return false;
|
|
|
|
startDelegate = Schedule(() =>
|
|
{
|
|
if (hasStarted)
|
|
return;
|
|
|
|
hasStarted = true;
|
|
|
|
Track.Restart();
|
|
Started?.Invoke();
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Stops playing this <see cref="PreviewTrack"/>.
|
|
/// </summary>
|
|
public void Stop()
|
|
{
|
|
startDelegate?.Cancel();
|
|
|
|
if (Track == null)
|
|
return;
|
|
|
|
if (!hasStarted)
|
|
return;
|
|
|
|
hasStarted = false;
|
|
|
|
// This pre-check is important, fixes a BASS deadlock in some scenarios.
|
|
if (!Track.HasCompleted)
|
|
{
|
|
Track.Stop();
|
|
|
|
// Ensure the track is reset immediately on stopping, so the next time it is started it has a correct time value.
|
|
Track.Seek(0);
|
|
}
|
|
|
|
Stopped?.Invoke();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Retrieves the audio track.
|
|
/// </summary>
|
|
protected abstract Track? GetTrack();
|
|
|
|
protected override void Dispose(bool isDisposing)
|
|
{
|
|
base.Dispose(isDisposing);
|
|
|
|
Stop();
|
|
Track?.Dispose();
|
|
}
|
|
}
|
|
}
|