1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 19:42:55 +08:00

Merge pull request #24409 from cdwcgt/tournament-nullable

Remove #nullable disable in tournament
This commit is contained in:
Dean Herbert 2023-08-10 19:38:16 +09:00 committed by GitHub
commit 5b44124ecf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
61 changed files with 349 additions and 424 deletions

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using NUnit.Framework; using NUnit.Framework;
using osu.Game.Tests.Visual; using osu.Game.Tests.Visual;
using osu.Game.Tournament.Components; using osu.Game.Tournament.Components;
@ -13,7 +11,7 @@ namespace osu.Game.Tournament.Tests.Components
{ {
public partial class TestSceneDateTextBox : OsuManualInputManagerTestScene public partial class TestSceneDateTextBox : OsuManualInputManagerTestScene
{ {
private DateTextBox textBox; private DateTextBox textBox = null!;
[SetUp] [SetUp]
public void Setup() => Schedule(() => public void Setup() => Schedule(() =>

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -22,7 +20,7 @@ namespace osu.Game.Tournament.Tests.Components
[Test] [Test]
public void TestSongBar() public void TestSongBar()
{ {
SongBar songBar = null; SongBar songBar = null!;
AddStep("create bar", () => Child = songBar = new SongBar AddStep("create bar", () => Child = songBar = new SongBar
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
@ -19,12 +17,12 @@ namespace osu.Game.Tournament.Tests.Components
public partial class TestSceneTournamentModDisplay : TournamentTestScene public partial class TestSceneTournamentModDisplay : TournamentTestScene
{ {
[Resolved] [Resolved]
private IAPIProvider api { get; set; } private IAPIProvider api { get; set; } = null!;
[Resolved] [Resolved]
private IRulesetStore rulesets { get; set; } private IRulesetStore rulesets { get; set; } = null!;
private FillFlowContainer<TournamentBeatmapPanel> fillFlow; private FillFlowContainer<TournamentBeatmapPanel> fillFlow = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -45,7 +43,7 @@ namespace osu.Game.Tournament.Tests.Components
private void success(APIBeatmap beatmap) private void success(APIBeatmap beatmap)
{ {
var ruleset = rulesets.GetRuleset(Ladder.Ruleset.Value.OnlineID); var ruleset = rulesets.GetRuleset(Ladder.Ruleset.Value?.OnlineID ?? -1);
if (ruleset == null) if (ruleset == null)
return; return;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -81,11 +79,11 @@ namespace osu.Game.Tournament.Tests.NonVisual
public partial class TestTournament : TournamentGameBase public partial class TestTournament : TournamentGameBase
{ {
private readonly bool resetRuleset; private readonly bool resetRuleset;
private readonly Action runOnLoadComplete; private readonly Action? runOnLoadComplete;
public new Task BracketLoadTask => base.BracketLoadTask; public new Task BracketLoadTask => base.BracketLoadTask;
public TestTournament(bool resetRuleset = false, [InstantHandle] Action runOnLoadComplete = null) public TestTournament(bool resetRuleset = false, [InstantHandle] Action? runOnLoadComplete = null)
{ {
this.resetRuleset = resetRuleset; this.resetRuleset = resetRuleset;
this.runOnLoadComplete = runOnLoadComplete; this.runOnLoadComplete = runOnLoadComplete;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using NUnit.Framework; using NUnit.Framework;
@ -36,11 +34,11 @@ namespace osu.Game.Tournament.Tests.NonVisual
{ {
var osu = LoadTournament(host); var osu = LoadTournament(host);
TournamentStorage storage = (TournamentStorage)osu.Dependencies.Get<Storage>(); TournamentStorage storage = (TournamentStorage)osu.Dependencies.Get<Storage>();
FileBasedIPC ipc = null; FileBasedIPC? ipc = null;
WaitForOrAssert(() => (ipc = osu.Dependencies.Get<MatchIPCInfo>() as FileBasedIPC)?.IsLoaded == true, @"ipc could not be populated in a reasonable amount of time"); WaitForOrAssert(() => (ipc = osu.Dependencies.Get<MatchIPCInfo>() as FileBasedIPC)?.IsLoaded == true, @"ipc could not be populated in a reasonable amount of time");
Assert.True(ipc.SetIPCLocation(testStableInstallDirectory)); Assert.True(ipc!.SetIPCLocation(testStableInstallDirectory));
Assert.True(storage.AllTournaments.Exists("stable.json")); Assert.True(storage.AllTournaments.Exists("stable.json"));
} }
finally finally

View File

@ -35,8 +35,8 @@ namespace osu.Game.Tournament.Tests.NonVisual
PlayersPerTeam = { Value = 4 }, PlayersPerTeam = { Value = 4 },
Teams = Teams =
{ {
match.Team1.Value, match.Team1.Value!,
match.Team2.Value, match.Team2.Value!,
}, },
Rounds = Rounds =
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -13,7 +11,7 @@ namespace osu.Game.Tournament.Tests.NonVisual
{ {
public abstract class TournamentHostTest public abstract class TournamentHostTest
{ {
public static TournamentGameBase LoadTournament(GameHost host, TournamentGameBase tournament = null) public static TournamentGameBase LoadTournament(GameHost host, TournamentGameBase? tournament = null)
{ {
tournament ??= new TournamentGameBase(); tournament ??= new TournamentGameBase();
Task.Factory.StartNew(() => host.Run(tournament), TaskCreationOptions.LongRunning) Task.Factory.StartNew(() => host.Run(tournament), TaskCreationOptions.LongRunning)

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Linq; using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;

View File

@ -94,7 +94,7 @@ namespace osu.Game.Tournament.Tests.Screens
AddStep("release mouse button", () => InputManager.ReleaseButton(MouseButton.Left)); AddStep("release mouse button", () => InputManager.ReleaseButton(MouseButton.Left));
AddAssert("assert ladder teams reset", () => Ladder.CurrentMatch.Value.Team1.Value == null && Ladder.CurrentMatch.Value.Team2.Value == null); AddAssert("assert ladder teams reset", () => Ladder.CurrentMatch.Value?.Team1.Value == null && Ladder.CurrentMatch.Value?.Team2.Value == null);
} }
} }
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Linq; using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
@ -16,7 +14,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
public partial class TestSceneMapPoolScreen : TournamentScreenTestScene public partial class TestSceneMapPoolScreen : TournamentScreenTestScene
{ {
private MapPoolScreen screen; private MapPoolScreen screen = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -32,7 +30,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load few maps", () => AddStep("load few maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
addBeatmap(); addBeatmap();
@ -52,7 +50,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load just enough maps", () => AddStep("load just enough maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 18; i++) for (int i = 0; i < 18; i++)
addBeatmap(); addBeatmap();
@ -72,7 +70,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load many maps", () => AddStep("load many maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 19; i++) for (int i = 0; i < 19; i++)
addBeatmap(); addBeatmap();
@ -92,7 +90,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load many maps", () => AddStep("load many maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 11; i++) for (int i = 0; i < 11; i++)
addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM"); addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM");
@ -118,7 +116,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load many maps", () => AddStep("load many maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 12; i++) for (int i = 0; i < 12; i++)
addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM"); addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM");
@ -138,7 +136,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
AddStep("load many maps", () => AddStep("load many maps", () =>
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Clear(); Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
for (int i = 0; i < 12; i++) for (int i = 0; i < 12; i++)
addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM"); addBeatmap(i > 4 ? Ruleset.Value.CreateInstance().AllMods.ElementAt(i).Acronym : "NM");
@ -155,7 +153,7 @@ namespace osu.Game.Tournament.Tests.Screens
private void addBeatmap(string mods = "NM") private void addBeatmap(string mods = "NM")
{ {
Ladder.CurrentMatch.Value.Round.Value.Beatmaps.Add(new RoundBeatmap Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Add(new RoundBeatmap
{ {
Beatmap = CreateSampleBeatmap(), Beatmap = CreateSampleBeatmap(),
Mods = mods Mods = mods

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;

View File

@ -2,6 +2,7 @@
// 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 osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Game.Tournament.Models; using osu.Game.Tournament.Models;
using osu.Game.Tournament.Screens.Editors; using osu.Game.Tournament.Screens.Editors;
@ -17,7 +18,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
var match = CreateSampleMatch(); var match = CreateSampleMatch();
Add(new SeedingEditorScreen(match.Team1.Value, new TeamEditorScreen()) Add(new SeedingEditorScreen(match.Team1.Value.AsNonNull(), new TeamEditorScreen())
{ {
Width = 0.85f // create room for control panel Width = 0.85f // create room for control panel
}); });

View File

@ -17,7 +17,7 @@ namespace osu.Game.Tournament.Tests.Screens
{ {
var match = Ladder.CurrentMatch.Value!; var match = Ladder.CurrentMatch.Value!;
match.Round.Value = Ladder.Rounds.FirstOrDefault(g => g.Name.Value == "Finals"); match.Round.Value = Ladder.Rounds.First(g => g.Name.Value == "Quarterfinals");
match.Completed.Value = true; match.Completed.Value = true;
}); });

View File

@ -40,10 +40,10 @@ namespace osu.Game.Tournament.Tests
match = CreateSampleMatch(); match = CreateSampleMatch();
Ladder.Rounds.Add(match.Round.Value); Ladder.Rounds.Add(match.Round.Value!);
Ladder.Matches.Add(match); Ladder.Matches.Add(match);
Ladder.Teams.Add(match.Team1.Value); Ladder.Teams.Add(match.Team1.Value!);
Ladder.Teams.Add(match.Team2.Value); Ladder.Teams.Add(match.Team2.Value!);
Ruleset.BindTo(Ladder.Ruleset); Ruleset.BindTo(Ladder.Ruleset);
Dependencies.CacheAs(new StableInfo(storage)); Dependencies.CacheAs(new StableInfo(storage));
@ -152,7 +152,7 @@ namespace osu.Game.Tournament.Tests
}, },
Round = Round =
{ {
Value = new TournamentRound { Name = { Value = "Quarterfinals" } } Value = new TournamentRound { Name = { Value = "Quarterfinals" } },
} }
}; };

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using JetBrains.Annotations; using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -17,14 +15,14 @@ namespace osu.Game.Tournament.Components
{ {
public partial class DrawableTeamFlag : Container public partial class DrawableTeamFlag : Container
{ {
private readonly TournamentTeam team; private readonly TournamentTeam? team;
[UsedImplicitly] [UsedImplicitly]
private Bindable<string> flag; private Bindable<string>? flag;
private Sprite flagSprite; private Sprite? flagSprite;
public DrawableTeamFlag(TournamentTeam team) public DrawableTeamFlag(TournamentTeam? team)
{ {
this.team = team; this.team = team;
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using JetBrains.Annotations; using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -12,12 +10,12 @@ namespace osu.Game.Tournament.Components
{ {
public partial class DrawableTeamTitle : TournamentSpriteTextWithBackground public partial class DrawableTeamTitle : TournamentSpriteTextWithBackground
{ {
private readonly TournamentTeam team; private readonly TournamentTeam? team;
[UsedImplicitly] [UsedImplicitly]
private Bindable<string> acronym; private Bindable<string>? acronym;
public DrawableTeamTitle(TournamentTeam team) public DrawableTeamTitle(TournamentTeam? team)
{ {
this.team = team; this.team = team;
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using JetBrains.Annotations; using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -14,15 +12,15 @@ namespace osu.Game.Tournament.Components
{ {
public abstract partial class DrawableTournamentTeam : CompositeDrawable public abstract partial class DrawableTournamentTeam : CompositeDrawable
{ {
public readonly TournamentTeam Team; public readonly TournamentTeam? Team;
protected readonly Container Flag; protected readonly Container Flag;
protected readonly TournamentSpriteText AcronymText; protected readonly TournamentSpriteText AcronymText;
[UsedImplicitly] [UsedImplicitly]
private Bindable<string> acronym; private Bindable<string>? acronym;
protected DrawableTournamentTeam(TournamentTeam team) protected DrawableTournamentTeam(TournamentTeam? team)
{ {
Team = team; Team = team;
@ -36,7 +34,8 @@ namespace osu.Game.Tournament.Components
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
{ {
if (Team == null) return; if (Team == null)
return;
(acronym = Team.Acronym.GetBoundCopy()).BindValueChanged(_ => AcronymText.Text = Team?.Acronym.Value?.ToUpperInvariant() ?? string.Empty, true); (acronym = Team.Acronym.GetBoundCopy()).BindValueChanged(_ => AcronymText.Text = Team?.Acronym.Value?.ToUpperInvariant() ?? string.Empty, true);
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -24,14 +22,14 @@ namespace osu.Game.Tournament.Components
{ {
public partial class SongBar : CompositeDrawable public partial class SongBar : CompositeDrawable
{ {
private TournamentBeatmap beatmap; private TournamentBeatmap? beatmap;
public const float HEIGHT = 145 / 2f; public const float HEIGHT = 145 / 2f;
[Resolved] [Resolved]
private IBindable<RulesetInfo> ruleset { get; set; } private IBindable<RulesetInfo> ruleset { get; set; } = null!;
public TournamentBeatmap Beatmap public TournamentBeatmap? Beatmap
{ {
set set
{ {
@ -55,7 +53,7 @@ namespace osu.Game.Tournament.Components
} }
} }
private FillFlowContainer flow; private FillFlowContainer flow = null!;
private bool expanded; private bool expanded;

View File

@ -146,7 +146,12 @@ namespace osu.Game.Tournament.Components
private void updateState() private void updateState()
{ {
var newChoice = currentMatch.Value?.PicksBans.FirstOrDefault(p => p.BeatmapID == Beatmap?.OnlineID); if (currentMatch.Value == null)
{
return;
}
var newChoice = currentMatch.Value.PicksBans.FirstOrDefault(p => p.BeatmapID == Beatmap?.OnlineID);
bool shouldFlash = newChoice != choice; bool shouldFlash = newChoice != choice;

View File

@ -92,9 +92,9 @@ namespace osu.Game.Tournament.Components
{ {
if (info.CurrentMatch.Value is TournamentMatch match) if (info.CurrentMatch.Value is TournamentMatch match)
{ {
if (match.Team1.Value.Players.Any(u => u.OnlineID == Message.Sender.OnlineID)) if (match.Team1.Value?.Players.Any(u => u.OnlineID == Message.Sender.OnlineID) == true)
UsernameColour = TournamentGame.COLOUR_RED; UsernameColour = TournamentGame.COLOUR_RED;
else if (match.Team2.Value.Players.Any(u => u.OnlineID == Message.Sender.OnlineID)) else if (match.Team2.Value?.Players.Any(u => u.OnlineID == Message.Sender.OnlineID) == true)
UsernameColour = TournamentGame.COLOUR_BLUE; UsernameColour = TournamentGame.COLOUR_BLUE;
} }
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Colour;
@ -19,8 +17,8 @@ namespace osu.Game.Tournament.Components
{ {
private readonly string filename; private readonly string filename;
private readonly bool drawFallbackGradient; private readonly bool drawFallbackGradient;
private Video video; private Video? video;
private ManualClock manualClock; private ManualClock? manualClock;
public bool VideoAvailable => video != null; public bool VideoAvailable => video != null;

View File

@ -1,12 +1,9 @@
// 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.
#nullable disable
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using JetBrains.Annotations;
using Microsoft.Win32; using Microsoft.Win32;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Extensions.ObjectExtensions;
@ -24,36 +21,35 @@ namespace osu.Game.Tournament.IPC
{ {
public partial class FileBasedIPC : MatchIPCInfo public partial class FileBasedIPC : MatchIPCInfo
{ {
public Storage IPCStorage { get; private set; } public Storage? IPCStorage { get; private set; }
[Resolved] [Resolved]
protected IAPIProvider API { get; private set; } protected IAPIProvider API { get; private set; } = null!;
[Resolved] [Resolved]
protected IRulesetStore Rulesets { get; private set; } protected IRulesetStore Rulesets { get; private set; } = null!;
[Resolved] [Resolved]
private GameHost host { get; set; } private GameHost host { get; set; } = null!;
[Resolved] [Resolved]
private LadderInfo ladder { get; set; } private LadderInfo ladder { get; set; } = null!;
[Resolved] [Resolved]
private StableInfo stableInfo { get; set; } private StableInfo stableInfo { get; set; } = null!;
private int lastBeatmapId; private int lastBeatmapId;
private ScheduledDelegate scheduled; private ScheduledDelegate? scheduled;
private GetBeatmapRequest beatmapLookupRequest; private GetBeatmapRequest? beatmapLookupRequest;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
{ {
string stablePath = stableInfo.StablePath ?? findStablePath(); string? stablePath = stableInfo.StablePath ?? findStablePath();
initialiseIPCStorage(stablePath); initialiseIPCStorage(stablePath);
} }
[CanBeNull] private Storage? initialiseIPCStorage(string? path)
private Storage initialiseIPCStorage(string path)
{ {
scheduled?.Cancel(); scheduled?.Cancel();
@ -89,7 +85,7 @@ namespace osu.Game.Tournament.IPC
lastBeatmapId = beatmapId; lastBeatmapId = beatmapId;
var existing = ladder.CurrentMatch.Value?.Round.Value?.Beatmaps.FirstOrDefault(b => b.ID == beatmapId && b.Beatmap != null); var existing = ladder.CurrentMatch.Value?.Round.Value?.Beatmaps.FirstOrDefault(b => b.ID == beatmapId);
if (existing != null) if (existing != null)
Beatmap.Value = existing.Beatmap; Beatmap.Value = existing.Beatmap;
@ -97,6 +93,7 @@ namespace osu.Game.Tournament.IPC
{ {
beatmapLookupRequest = new GetBeatmapRequest(new APIBeatmap { OnlineID = beatmapId }); beatmapLookupRequest = new GetBeatmapRequest(new APIBeatmap { OnlineID = beatmapId });
beatmapLookupRequest.Success += b => Beatmap.Value = new TournamentBeatmap(b); beatmapLookupRequest.Success += b => Beatmap.Value = new TournamentBeatmap(b);
beatmapLookupRequest.Failure += _ => Beatmap.Value = null;
API.Queue(beatmapLookupRequest); API.Queue(beatmapLookupRequest);
} }
} }
@ -114,7 +111,7 @@ namespace osu.Game.Tournament.IPC
using (var stream = IPCStorage.GetStream(file_ipc_channel_filename)) using (var stream = IPCStorage.GetStream(file_ipc_channel_filename))
using (var sr = new StreamReader(stream)) using (var sr = new StreamReader(stream))
{ {
ChatChannel.Value = sr.ReadLine(); ChatChannel.Value = sr.ReadLine().AsNonNull();
} }
} }
catch (Exception) catch (Exception)
@ -140,8 +137,8 @@ namespace osu.Game.Tournament.IPC
using (var stream = IPCStorage.GetStream(file_ipc_scores_filename)) using (var stream = IPCStorage.GetStream(file_ipc_scores_filename))
using (var sr = new StreamReader(stream)) using (var sr = new StreamReader(stream))
{ {
Score1.Value = int.Parse(sr.ReadLine()); Score1.Value = int.Parse(sr.ReadLine().AsNonNull());
Score2.Value = int.Parse(sr.ReadLine()); Score2.Value = int.Parse(sr.ReadLine().AsNonNull());
} }
} }
catch (Exception) catch (Exception)
@ -164,7 +161,7 @@ namespace osu.Game.Tournament.IPC
/// </summary> /// </summary>
/// <param name="path">Path to the IPC directory</param> /// <param name="path">Path to the IPC directory</param>
/// <returns>Whether the supplied path was a valid IPC directory.</returns> /// <returns>Whether the supplied path was a valid IPC directory.</returns>
public bool SetIPCLocation(string path) public bool SetIPCLocation(string? path)
{ {
if (path == null || !ipcFileExistsInDirectory(path)) if (path == null || !ipcFileExistsInDirectory(path))
return false; return false;
@ -184,29 +181,28 @@ namespace osu.Game.Tournament.IPC
/// <returns>Whether an IPC directory was successfully auto-detected.</returns> /// <returns>Whether an IPC directory was successfully auto-detected.</returns>
public bool AutoDetectIPCLocation() => SetIPCLocation(findStablePath()); public bool AutoDetectIPCLocation() => SetIPCLocation(findStablePath());
private static bool ipcFileExistsInDirectory(string p) => p != null && File.Exists(Path.Combine(p, "ipc.txt")); private static bool ipcFileExistsInDirectory(string? p) => p != null && File.Exists(Path.Combine(p, "ipc.txt"));
[CanBeNull] private string? findStablePath()
private string findStablePath()
{ {
string stableInstallPath = findFromEnvVar() ?? string? stableInstallPath = findFromEnvVar() ??
findFromRegistry() ?? findFromRegistry() ??
findFromLocalAppData() ?? findFromLocalAppData() ??
findFromDotFolder(); findFromDotFolder();
Logger.Log($"Stable path for tourney usage: {stableInstallPath}"); Logger.Log($"Stable path for tourney usage: {stableInstallPath}");
return stableInstallPath; return stableInstallPath;
} }
private string findFromEnvVar() private string? findFromEnvVar()
{ {
try try
{ {
Logger.Log("Trying to find stable with environment variables"); Logger.Log("Trying to find stable with environment variables");
string stableInstallPath = Environment.GetEnvironmentVariable("OSU_STABLE_PATH"); string? stableInstallPath = Environment.GetEnvironmentVariable("OSU_STABLE_PATH");
if (ipcFileExistsInDirectory(stableInstallPath)) if (ipcFileExistsInDirectory(stableInstallPath))
return stableInstallPath; return stableInstallPath!;
} }
catch catch
{ {
@ -215,7 +211,7 @@ namespace osu.Game.Tournament.IPC
return null; return null;
} }
private string findFromLocalAppData() private string? findFromLocalAppData()
{ {
Logger.Log("Trying to find stable in %LOCALAPPDATA%"); Logger.Log("Trying to find stable in %LOCALAPPDATA%");
string stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"osu!"); string stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"osu!");
@ -226,7 +222,7 @@ namespace osu.Game.Tournament.IPC
return null; return null;
} }
private string findFromDotFolder() private string? findFromDotFolder()
{ {
Logger.Log("Trying to find stable in dotfolders"); Logger.Log("Trying to find stable in dotfolders");
string stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".osu"); string stableInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".osu");
@ -237,16 +233,16 @@ namespace osu.Game.Tournament.IPC
return null; return null;
} }
private string findFromRegistry() private string? findFromRegistry()
{ {
Logger.Log("Trying to find stable in registry"); Logger.Log("Trying to find stable in registry");
try try
{ {
string stableInstallPath; string? stableInstallPath;
#pragma warning disable CA1416 #pragma warning disable CA1416
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("osu")) using (RegistryKey? key = Registry.ClassesRoot.OpenSubKey("osu"))
stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(string.Empty)?.ToString()?.Split('"')[1].Replace("osu!.exe", ""); stableInstallPath = key?.OpenSubKey(@"shell\open\command")?.GetValue(string.Empty)?.ToString()?.Split('"')[1].Replace("osu!.exe", "");
#pragma warning restore CA1416 #pragma warning restore CA1416

View File

@ -10,7 +10,7 @@ namespace osu.Game.Tournament.IPC
{ {
public partial class MatchIPCInfo : Component public partial class MatchIPCInfo : Component
{ {
public Bindable<TournamentBeatmap> Beatmap { get; } = new Bindable<TournamentBeatmap>(); public Bindable<TournamentBeatmap?> Beatmap { get; } = new Bindable<TournamentBeatmap?>();
public Bindable<LegacyMods> Mods { get; } = new Bindable<LegacyMods>(); public Bindable<LegacyMods> Mods { get; } = new Bindable<LegacyMods>();
public Bindable<TourneyState> State { get; } = new Bindable<TourneyState>(); public Bindable<TourneyState> State { get; } = new Bindable<TourneyState>();
public Bindable<string> ChatChannel { get; } = new Bindable<string>(); public Bindable<string> ChatChannel { get; } = new Bindable<string>();

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
@ -28,7 +26,7 @@ namespace osu.Game.Tournament
if (reader.TokenType != JsonToken.StartObject) if (reader.TokenType != JsonToken.StartObject)
{ {
// if there's no object present then this is using string representation (System.Drawing.Point serializes to "x,y") // if there's no object present then this is using string representation (System.Drawing.Point serializes to "x,y")
string str = (string)reader.Value; string? str = (string?)reader.Value;
Debug.Assert(str != null); Debug.Assert(str != null);
@ -45,9 +43,12 @@ namespace osu.Game.Tournament
if (reader.TokenType == JsonToken.PropertyName) if (reader.TokenType == JsonToken.PropertyName)
{ {
string name = reader.Value?.ToString(); string? name = reader.Value?.ToString();
int? val = reader.ReadAsInt32(); int? val = reader.ReadAsInt32();
if (name == null)
continue;
if (val == null) if (val == null)
continue; continue;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -17,7 +15,7 @@ namespace osu.Game.Tournament.Models
[Serializable] [Serializable]
public class LadderInfo public class LadderInfo
{ {
public Bindable<RulesetInfo> Ruleset = new Bindable<RulesetInfo>(); public Bindable<RulesetInfo?> Ruleset = new Bindable<RulesetInfo?>();
public BindableList<TournamentMatch> Matches = new BindableList<TournamentMatch>(); public BindableList<TournamentMatch> Matches = new BindableList<TournamentMatch>();
public BindableList<TournamentRound> Rounds = new BindableList<TournamentRound>(); public BindableList<TournamentRound> Rounds = new BindableList<TournamentRound>();
@ -27,7 +25,7 @@ namespace osu.Game.Tournament.Models
public List<TournamentProgression> Progressions = new List<TournamentProgression>(); public List<TournamentProgression> Progressions = new List<TournamentProgression>();
[JsonIgnore] // updated manually in TournamentGameBase [JsonIgnore] // updated manually in TournamentGameBase
public Bindable<TournamentMatch> CurrentMatch = new Bindable<TournamentMatch>(); public Bindable<TournamentMatch?> CurrentMatch = new Bindable<TournamentMatch?>();
public Bindable<int> ChromaKeyWidth = new BindableInt(1024) public Bindable<int> ChromaKeyWidth = new BindableInt(1024)
{ {

View File

@ -8,7 +8,6 @@ namespace osu.Game.Tournament.Models
public class RoundBeatmap public class RoundBeatmap
{ {
public int ID; public int ID;
public string Mods = string.Empty; public string Mods = string.Empty;
[JsonProperty("BeatmapInfo")] [JsonProperty("BeatmapInfo")]

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.IO; using System.IO;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -20,12 +18,12 @@ namespace osu.Game.Tournament.Models
/// <summary> /// <summary>
/// Path to the IPC directory used by the stable (cutting-edge) install. /// Path to the IPC directory used by the stable (cutting-edge) install.
/// </summary> /// </summary>
public string StablePath { get; set; } public string? StablePath { get; set; }
/// <summary> /// <summary>
/// Fired whenever stable info is successfully saved to file. /// Fired whenever stable info is successfully saved to file.
/// </summary> /// </summary>
public event Action OnStableInfoSaved; public event Action? OnStableInfoSaved;
private const string config_path = "stable.json"; private const string config_path = "stable.json";

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@ -33,16 +31,16 @@ namespace osu.Game.Tournament.Models
} }
[JsonIgnore] [JsonIgnore]
public readonly Bindable<TournamentTeam> Team1 = new Bindable<TournamentTeam>(); public readonly Bindable<TournamentTeam?> Team1 = new Bindable<TournamentTeam?>();
public string Team1Acronym; public string? Team1Acronym;
public readonly Bindable<int?> Team1Score = new Bindable<int?>(); public readonly Bindable<int?> Team1Score = new Bindable<int?>();
[JsonIgnore] [JsonIgnore]
public readonly Bindable<TournamentTeam> Team2 = new Bindable<TournamentTeam>(); public readonly Bindable<TournamentTeam?> Team2 = new Bindable<TournamentTeam?>();
public string Team2Acronym; public string? Team2Acronym;
public readonly Bindable<int?> Team2Score = new Bindable<int?>(); public readonly Bindable<int?> Team2Score = new Bindable<int?>();
@ -53,13 +51,13 @@ namespace osu.Game.Tournament.Models
public readonly ObservableCollection<BeatmapChoice> PicksBans = new ObservableCollection<BeatmapChoice>(); public readonly ObservableCollection<BeatmapChoice> PicksBans = new ObservableCollection<BeatmapChoice>();
[JsonIgnore] [JsonIgnore]
public readonly Bindable<TournamentRound> Round = new Bindable<TournamentRound>(); public readonly Bindable<TournamentRound?> Round = new Bindable<TournamentRound?>();
[JsonIgnore] [JsonIgnore]
public readonly Bindable<TournamentMatch> Progression = new Bindable<TournamentMatch>(); public readonly Bindable<TournamentMatch?> Progression = new Bindable<TournamentMatch?>();
[JsonIgnore] [JsonIgnore]
public readonly Bindable<TournamentMatch> LosersProgression = new Bindable<TournamentMatch>(); public readonly Bindable<TournamentMatch?> LosersProgression = new Bindable<TournamentMatch?>();
/// <summary> /// <summary>
/// Should not be set directly. Use LadderInfo.CurrentMatch.Value = this instead. /// Should not be set directly. Use LadderInfo.CurrentMatch.Value = this instead.
@ -79,7 +77,7 @@ namespace osu.Game.Tournament.Models
Team2.BindValueChanged(t => Team2Acronym = t.NewValue?.Acronym.Value, true); Team2.BindValueChanged(t => Team2Acronym = t.NewValue?.Acronym.Value, true);
} }
public TournamentMatch(TournamentTeam team1 = null, TournamentTeam team2 = null) public TournamentMatch(TournamentTeam? team1 = null, TournamentTeam? team2 = null)
: this() : this()
{ {
Team1.Value = team1; Team1.Value = team1;
@ -87,10 +85,10 @@ namespace osu.Game.Tournament.Models
} }
[JsonIgnore] [JsonIgnore]
public TournamentTeam Winner => !Completed.Value ? null : Team1Score.Value > Team2Score.Value ? Team1.Value : Team2.Value; public TournamentTeam? Winner => !Completed.Value ? null : Team1Score.Value > Team2Score.Value ? Team1.Value : Team2.Value;
[JsonIgnore] [JsonIgnore]
public TournamentTeam Loser => !Completed.Value ? null : Team1Score.Value > Team2Score.Value ? Team2.Value : Team1.Value; public TournamentTeam? Loser => !Completed.Value ? null : Team1Score.Value > Team2Score.Value ? Team2.Value : Team1.Value;
public TeamColour WinnerColour => Winner == Team1.Value ? TeamColour.Red : TeamColour.Blue; public TeamColour WinnerColour => Winner == Team1.Value ? TeamColour.Red : TeamColour.Blue;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Linq; using System.Linq;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -39,7 +37,7 @@ namespace osu.Game.Tournament.Models
{ {
int[] ranks = Players.Select(p => p.Rank) int[] ranks = Players.Select(p => p.Rank)
.Where(i => i.HasValue) .Where(i => i.HasValue)
.Select(i => i.Value) .Select(i => i!.Value)
.ToArray(); .ToArray();
if (ranks.Length == 0) if (ranks.Length == 0)
@ -66,14 +64,14 @@ namespace osu.Game.Tournament.Models
{ {
// use a sane default flag name based on acronym. // use a sane default flag name based on acronym.
if (val.OldValue.StartsWith(FlagName.Value, StringComparison.InvariantCultureIgnoreCase)) if (val.OldValue.StartsWith(FlagName.Value, StringComparison.InvariantCultureIgnoreCase))
FlagName.Value = val.NewValue.Length >= 2 ? val.NewValue?.Substring(0, 2).ToUpperInvariant() : string.Empty; FlagName.Value = val.NewValue?.Length >= 2 ? val.NewValue.Substring(0, 2).ToUpperInvariant() : string.Empty;
}; };
FullName.ValueChanged += val => FullName.ValueChanged += val =>
{ {
// use a sane acronym based on full name. // use a sane acronym based on full name.
if (val.OldValue.StartsWith(Acronym.Value, StringComparison.InvariantCultureIgnoreCase)) if (val.OldValue.StartsWith(Acronym.Value, StringComparison.InvariantCultureIgnoreCase))
Acronym.Value = val.NewValue.Length >= 3 ? val.NewValue?.Substring(0, 3).ToUpperInvariant() : string.Empty; Acronym.Value = val.NewValue?.Length >= 3 ? val.NewValue.Substring(0, 3).ToUpperInvariant() : string.Empty;
}; };
} }

View File

@ -37,7 +37,7 @@ namespace osu.Game.Tournament.Screens
SongBar.Mods = mods.NewValue; SongBar.Mods = mods.NewValue;
} }
private void beatmapChanged(ValueChangedEvent<TournamentBeatmap> beatmap) private void beatmapChanged(ValueChangedEvent<TournamentBeatmap?> beatmap)
{ {
SongBar.FadeInFromZero(300, Easing.OutQuint); SongBar.FadeInFromZero(300, Easing.OutQuint);
SongBar.Beatmap = beatmap.NewValue; SongBar.Beatmap = beatmap.NewValue;

View File

@ -84,7 +84,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
public bool ContainsTeam(string fullName) public bool ContainsTeam(string fullName)
{ {
return allTeams.Any(t => t.Team.FullName.Value == fullName); return allTeams.Any(t => t.Team?.FullName.Value == fullName);
} }
public bool RemoveTeam(TournamentTeam team) public bool RemoveTeam(TournamentTeam team)
@ -112,7 +112,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
foreach (GroupTeam gt in allTeams) foreach (GroupTeam gt in allTeams)
sb.AppendLine(gt.Team.FullName.Value); sb.AppendLine(gt.Team?.FullName.Value);
return sb.ToString(); return sb.ToString();
} }
} }

View File

@ -1,12 +1,11 @@
// 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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
@ -22,8 +21,8 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
{ {
public partial class ScrollingTeamContainer : Container public partial class ScrollingTeamContainer : Container
{ {
public event Action OnScrollStarted; public event Action? OnScrollStarted;
public event Action<TournamentTeam> OnSelected; public event Action<TournamentTeam>? OnSelected;
private readonly List<TournamentTeam> availableTeams = new List<TournamentTeam>(); private readonly List<TournamentTeam> availableTeams = new List<TournamentTeam>();
@ -42,7 +41,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
private double lastTime; private double lastTime;
private ScheduledDelegate delayedStateChangeDelegate; private ScheduledDelegate? delayedStateChangeDelegate;
public ScrollingTeamContainer() public ScrollingTeamContainer()
{ {
@ -117,7 +116,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
if (!Children.Any()) if (!Children.Any())
break; break;
ScrollingTeam closest = null; ScrollingTeam? closest = null;
foreach (var c in Children) foreach (var c in Children)
{ {
@ -137,9 +136,8 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
closest = stc; closest = stc;
} }
Trace.Assert(closest != null, "closest != null"); Debug.Assert(closest != null, "closest != null");
// ReSharper disable once PossibleNullReferenceException
offset += DrawWidth / 2f - (closest.Position.X + closest.DrawWidth / 2f); offset += DrawWidth / 2f - (closest.Position.X + closest.DrawWidth / 2f);
ScrollingTeam st = closest; ScrollingTeam st = closest;
@ -147,7 +145,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
availableTeams.RemoveAll(at => at == st.Team); availableTeams.RemoveAll(at => at == st.Team);
st.Selected = true; st.Selected = true;
OnSelected?.Invoke(st.Team); OnSelected?.Invoke(st.Team.AsNonNull());
delayedStateChangeDelegate = Scheduler.AddDelayed(() => setScrollState(ScrollState.Idle), 10000); delayedStateChangeDelegate = Scheduler.AddDelayed(() => setScrollState(ScrollState.Idle), 10000);
break; break;
@ -174,7 +172,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
setScrollState(ScrollState.Idle); setScrollState(ScrollState.Idle);
} }
public void AddTeams(IEnumerable<TournamentTeam> teams) public void AddTeams(IEnumerable<TournamentTeam>? teams)
{ {
if (teams == null) if (teams == null)
return; return;
@ -311,6 +309,8 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
public partial class ScrollingTeam : DrawableTournamentTeam public partial class ScrollingTeam : DrawableTournamentTeam
{ {
public new TournamentTeam Team => base.Team.AsNonNull();
public const float WIDTH = 58; public const float WIDTH = 58;
public const float HEIGHT = 44; public const float HEIGHT = 44;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@ -39,7 +37,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
{ {
while (sr.Peek() != -1) while (sr.Peek() != -1)
{ {
string line = sr.ReadLine()?.Trim(); string? line = sr.ReadLine()?.Trim();
if (string.IsNullOrEmpty(line)) if (string.IsNullOrEmpty(line))
continue; continue;
@ -56,7 +54,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
teams.Add(new TournamentTeam teams.Add(new TournamentTeam
{ {
FullName = { Value = split[1], }, FullName = { Value = split[1], },
Acronym = { Value = split.Length >= 3 ? split[2] : null, }, Acronym = { Value = split.Length >= 3 ? split[2] : string.Empty, },
FlagName = { Value = split[0] } FlagName = { Value = split[0] }
}); });
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
@ -72,7 +70,7 @@ namespace osu.Game.Tournament.Screens.Drawings.Components
private float leftPos => -(float)((Time.Current + Offset) / CycleTime) + expiredCount; private float leftPos => -(float)((Time.Current + Offset) / CycleTime) + expiredCount;
private Texture texture; private Texture texture = null!;
private int expiredCount; private int expiredCount;

View File

@ -1,14 +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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
@ -28,28 +27,29 @@ namespace osu.Game.Tournament.Screens.Drawings
{ {
private const string results_filename = "drawings_results.txt"; private const string results_filename = "drawings_results.txt";
private ScrollingTeamContainer teamsContainer; private ScrollingTeamContainer teamsContainer = null!;
private GroupContainer groupsContainer; private GroupContainer groupsContainer = null!;
private TournamentSpriteText fullTeamNameText; private TournamentSpriteText fullTeamNameText = null!;
private readonly List<TournamentTeam> allTeams = new List<TournamentTeam>(); private readonly List<TournamentTeam> allTeams = new List<TournamentTeam>();
private DrawingsConfigManager drawingsConfig; private DrawingsConfigManager drawingsConfig = null!;
private Task writeOp; private Task? writeOp;
private Storage storage; private Storage storage = null!;
public ITeamList TeamList; public ITeamList TeamList = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(Storage storage) private void load(Storage storage)
{ {
RelativeSizeAxes = Axes.Both;
this.storage = storage; this.storage = storage;
TeamList ??= new StorageBackedTeamList(storage); RelativeSizeAxes = Axes.Both;
if (TeamList.IsNull())
TeamList = new StorageBackedTeamList(storage);
if (!TeamList.Teams.Any()) if (!TeamList.Teams.Any())
{ {
@ -251,7 +251,7 @@ namespace osu.Game.Tournament.Screens.Drawings
using (Stream stream = storage.GetStream(results_filename, FileAccess.Read, FileMode.Open)) using (Stream stream = storage.GetStream(results_filename, FileAccess.Read, FileMode.Open))
using (StreamReader sr = new StreamReader(stream)) using (StreamReader sr = new StreamReader(stream))
{ {
string line; string? line;
while ((line = sr.ReadLine()?.Trim()) != null) while ((line = sr.ReadLine()?.Trim()) != null)
{ {
@ -261,8 +261,7 @@ namespace osu.Game.Tournament.Screens.Drawings
if (line.ToUpperInvariant().StartsWith("GROUP", StringComparison.Ordinal)) if (line.ToUpperInvariant().StartsWith("GROUP", StringComparison.Ordinal))
continue; continue;
// ReSharper disable once AccessToModifiedClosure TournamentTeam? teamToAdd = allTeams.FirstOrDefault(t => t.FullName.Value == line);
TournamentTeam teamToAdd = allTeams.FirstOrDefault(t => t.FullName.Value == line);
if (teamToAdd == null) if (teamToAdd == null)
continue; continue;

View File

@ -1,12 +1,9 @@
// 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.
#nullable disable
using System; using System;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
@ -35,13 +32,12 @@ namespace osu.Game.Tournament.Screens.Editors
[Cached] [Cached]
private LadderEditorInfo editorInfo = new LadderEditorInfo(); private LadderEditorInfo editorInfo = new LadderEditorInfo();
private WarningBox rightClickMessage; private WarningBox rightClickMessage = null!;
private RectangularPositionSnapGrid grid; private RectangularPositionSnapGrid grid = null!;
[Resolved(canBeNull: true)] [Resolved]
[CanBeNull] private IDialogOverlay? dialogOverlay { get; set; }
private IDialogOverlay dialogOverlay { get; set; }
protected override bool DrawLoserPaths => true; protected override bool DrawLoserPaths => true;
@ -94,36 +90,28 @@ namespace osu.Game.Tournament.Screens.Editors
ScrollContent.Add(new JoinVisualiser(MatchesContainer, match, losers, UpdateLayout)); ScrollContent.Add(new JoinVisualiser(MatchesContainer, match, losers, UpdateLayout));
} }
public MenuItem[] ContextMenuItems public MenuItem[] ContextMenuItems =>
{ new MenuItem[]
get
{ {
if (editorInfo == null) new OsuMenuItem("Create new match", MenuItemType.Highlighted, () =>
return Array.Empty<MenuItem>();
return new MenuItem[]
{ {
new OsuMenuItem("Create new match", MenuItemType.Highlighted, () => Vector2 pos = MatchesContainer.Count == 0 ? Vector2.Zero : lastMatchesContainerMouseDownPosition;
TournamentMatch newMatch = new TournamentMatch { Position = { Value = new Point((int)pos.X, (int)pos.Y) } };
LadderInfo.Matches.Add(newMatch);
editorInfo.Selected.Value = newMatch;
}),
new OsuMenuItem("Reset teams", MenuItemType.Destructive, () =>
{
dialogOverlay?.Push(new LadderResetTeamsDialog(() =>
{ {
Vector2 pos = MatchesContainer.Count == 0 ? Vector2.Zero : lastMatchesContainerMouseDownPosition; foreach (var p in MatchesContainer)
p.Match.Reset();
TournamentMatch newMatch = new TournamentMatch { Position = { Value = new Point((int)pos.X, (int)pos.Y) } }; }));
})
LadderInfo.Matches.Add(newMatch); };
editorInfo.Selected.Value = newMatch;
}),
new OsuMenuItem("Reset teams", MenuItemType.Destructive, () =>
{
dialogOverlay?.Push(new LadderResetTeamsDialog(() =>
{
foreach (var p in MatchesContainer)
p.Match.Reset();
}));
})
};
}
}
public void Remove(TournamentMatch match) public void Remove(TournamentMatch match)
{ {
@ -135,11 +123,11 @@ namespace osu.Game.Tournament.Screens.Editors
private readonly Container<DrawableTournamentMatch> matchesContainer; private readonly Container<DrawableTournamentMatch> matchesContainer;
public readonly TournamentMatch Source; public readonly TournamentMatch Source;
private readonly bool losers; private readonly bool losers;
private readonly Action complete; private readonly Action? complete;
private ProgressionPath path; private ProgressionPath? path;
public JoinVisualiser(Container<DrawableTournamentMatch> matchesContainer, TournamentMatch source, bool losers, Action complete) public JoinVisualiser(Container<DrawableTournamentMatch> matchesContainer, TournamentMatch source, bool losers, Action? complete)
{ {
this.matchesContainer = matchesContainer; this.matchesContainer = matchesContainer;
RelativeSizeAxes = Axes.Both; RelativeSizeAxes = Axes.Both;
@ -153,7 +141,7 @@ namespace osu.Game.Tournament.Screens.Editors
Source.Progression.Value = null; Source.Progression.Value = null;
} }
private DrawableTournamentMatch findTarget(InputState state) private DrawableTournamentMatch? findTarget(InputState state)
{ {
return matchesContainer.FirstOrDefault(d => d.ReceivePositionalInputAt(state.Mouse.Position)); return matchesContainer.FirstOrDefault(d => d.ReceivePositionalInputAt(state.Mouse.Position));
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
@ -14,9 +12,9 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
{ {
public partial class MatchHeader : Container public partial class MatchHeader : Container
{ {
private TeamScoreDisplay teamDisplay1; private TeamScoreDisplay teamDisplay1 = null!;
private TeamScoreDisplay teamDisplay2; private TeamScoreDisplay teamDisplay2 = null!;
private DrawableTournamentHeaderLogo logo; private DrawableTournamentHeaderLogo logo = null!;
private bool showScores = true; private bool showScores = true;

View File

@ -35,7 +35,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
} }
} }
public TeamDisplay(TournamentTeam team, TeamColour colour, Bindable<int?> currentTeamScore, int pointsToWin) public TeamDisplay(TournamentTeam? team, TeamColour colour, Bindable<int?> currentTeamScore, int pointsToWin)
: base(team) : base(team)
{ {
AutoSizeAxes = Axes.Both; AutoSizeAxes = Axes.Both;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -17,16 +15,22 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
{ {
private readonly TeamColour teamColour; private readonly TeamColour teamColour;
private readonly Bindable<TournamentMatch> currentMatch = new Bindable<TournamentMatch>(); private readonly Bindable<TournamentMatch?> currentMatch = new Bindable<TournamentMatch?>();
private readonly Bindable<TournamentTeam> currentTeam = new Bindable<TournamentTeam>(); private readonly Bindable<TournamentTeam?> currentTeam = new Bindable<TournamentTeam?>();
private readonly Bindable<int?> currentTeamScore = new Bindable<int?>(); private readonly Bindable<int?> currentTeamScore = new Bindable<int?>();
private TeamDisplay teamDisplay; private TeamDisplay? teamDisplay;
public bool ShowScore public bool ShowScore
{ {
get => teamDisplay.ShowScore; get => teamDisplay?.ShowScore ?? false;
set => teamDisplay.ShowScore = value; set
{
if (teamDisplay != null)
{
teamDisplay.ShowScore = value;
}
}
} }
public TeamScoreDisplay(TeamColour teamColour) public TeamScoreDisplay(TeamColour teamColour)
@ -48,7 +52,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
updateMatch(); updateMatch();
} }
private void matchChanged(ValueChangedEvent<TournamentMatch> match) private void matchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
currentTeamScore.UnbindBindings(); currentTeamScore.UnbindBindings();
currentTeam.UnbindBindings(); currentTeam.UnbindBindings();
@ -78,7 +82,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
switch (e.Button) switch (e.Button)
{ {
case MouseButton.Left: case MouseButton.Left:
if (currentTeamScore.Value < currentMatch.Value.PointsToWin) if (currentTeamScore.Value < currentMatch.Value?.PointsToWin)
currentTeamScore.Value++; currentTeamScore.Value++;
return true; return true;
@ -91,7 +95,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
return base.OnMouseDown(e); return base.OnMouseDown(e);
} }
private void teamChanged(ValueChangedEvent<TournamentTeam> team) private void teamChanged(ValueChangedEvent<TournamentTeam?> team)
{ {
bool wasShowingScores = teamDisplay?.ShowScore ?? false; bool wasShowingScores = teamDisplay?.ShowScore ?? false;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -146,7 +144,7 @@ namespace osu.Game.Tournament.Screens.Gameplay.Components
private partial class MatchScoreCounter : CommaSeparatedScoreCounter private partial class MatchScoreCounter : CommaSeparatedScoreCounter
{ {
private OsuSpriteText displayedSpriteText; private OsuSpriteText displayedSpriteText = null!;
public MatchScoreCounter() public MatchScoreCounter()
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -26,16 +24,16 @@ namespace osu.Game.Tournament.Screens.Gameplay
private readonly BindableBool warmup = new BindableBool(); private readonly BindableBool warmup = new BindableBool();
public readonly Bindable<TourneyState> State = new Bindable<TourneyState>(); public readonly Bindable<TourneyState> State = new Bindable<TourneyState>();
private OsuButton warmupButton; private OsuButton warmupButton = null!;
private MatchIPCInfo ipc; private MatchIPCInfo ipc = null!;
[Resolved(canBeNull: true)]
private TournamentSceneManager sceneManager { get; set; }
[Resolved] [Resolved]
private TournamentMatchChatDisplay chat { get; set; } private TournamentSceneManager? sceneManager { get; set; }
private Drawable chroma; [Resolved]
private TournamentMatchChatDisplay chat { get; set; } = null!;
private Drawable chroma = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(LadderInfo ladder, MatchIPCInfo ipc) private void load(LadderInfo ladder, MatchIPCInfo ipc)
@ -142,7 +140,7 @@ namespace osu.Game.Tournament.Screens.Gameplay
State.BindValueChanged(_ => updateState(), true); State.BindValueChanged(_ => updateState(), true);
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
base.CurrentMatchChanged(match); base.CurrentMatchChanged(match);
@ -153,29 +151,35 @@ namespace osu.Game.Tournament.Screens.Gameplay
scheduledScreenChange?.Cancel(); scheduledScreenChange?.Cancel();
} }
private ScheduledDelegate scheduledScreenChange; private ScheduledDelegate? scheduledScreenChange;
private ScheduledDelegate scheduledContract; private ScheduledDelegate? scheduledContract;
private TournamentMatchScoreDisplay scoreDisplay; private TournamentMatchScoreDisplay scoreDisplay = null!;
private TourneyState lastState; private TourneyState lastState;
private MatchHeader header; private MatchHeader header = null!;
private void contract() private void contract()
{ {
if (!IsLoaded)
return;
scheduledContract?.Cancel(); scheduledContract?.Cancel();
SongBar.Expanded = false; SongBar.Expanded = false;
scoreDisplay.FadeOut(100); scoreDisplay.FadeOut(100);
using (chat?.BeginDelayedSequence(500)) using (chat.BeginDelayedSequence(500))
chat?.Expand(); chat.Expand();
} }
private void expand() private void expand()
{ {
if (!IsLoaded)
return;
scheduledContract?.Cancel(); scheduledContract?.Cancel();
chat?.Contract(); chat.Contract();
using (BeginDelayedSequence(300)) using (BeginDelayedSequence(300))
{ {
@ -252,7 +256,7 @@ namespace osu.Game.Tournament.Screens.Gameplay
private partial class ChromaArea : CompositeDrawable private partial class ChromaArea : CompositeDrawable
{ {
[Resolved] [Resolved]
private LadderInfo ladder { get; set; } private LadderInfo ladder { get; set; } = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -28,20 +26,20 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{ {
private readonly TournamentMatch match; private readonly TournamentMatch match;
private readonly bool losers; private readonly bool losers;
private TournamentSpriteText scoreText; private TournamentSpriteText scoreText = null!;
private Box background; private Box background = null!;
private Box backgroundRight; private Box backgroundRight = null!;
private readonly Bindable<int?> score = new Bindable<int?>(); private readonly Bindable<int?> score = new Bindable<int?>();
private readonly BindableBool completed = new BindableBool(); private readonly BindableBool completed = new BindableBool();
private Color4 colourWinner; private Color4 colourWinner;
private readonly Func<bool> isWinner; private readonly Func<bool>? isWinner;
private LadderEditorScreen ladderEditor; private LadderEditorScreen ladderEditor = null!;
[Resolved(canBeNull: true)] [Resolved]
private LadderInfo ladderInfo { get; set; } private LadderInfo? ladderInfo { get; set; }
private void setCurrent() private void setCurrent()
{ {
@ -55,10 +53,10 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
ladderInfo.CurrentMatch.Value.Current.Value = true; ladderInfo.CurrentMatch.Value.Current.Value = true;
} }
[Resolved(CanBeNull = true)] [Resolved]
private LadderEditorInfo editorInfo { get; set; } private LadderEditorInfo? editorInfo { get; set; }
public DrawableMatchTeam(TournamentTeam team, TournamentMatch match, bool losers) public DrawableMatchTeam(TournamentTeam? team, TournamentMatch match, bool losers)
: base(team) : base(team)
{ {
this.match = match; this.match = match;
@ -72,14 +70,11 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
AcronymText.Padding = new MarginPadding { Left = 50 }; AcronymText.Padding = new MarginPadding { Left = 50 };
AcronymText.Font = OsuFont.Torus.With(size: 22, weight: FontWeight.Bold); AcronymText.Font = OsuFont.Torus.With(size: 22, weight: FontWeight.Bold);
if (match != null) isWinner = () => match.Winner == Team;
{
isWinner = () => match.Winner == Team;
completed.BindTo(match.Completed); completed.BindTo(match.Completed);
if (team != null) if (team != null)
score.BindTo(team == match.Team1.Value ? match.Team1Score : match.Team2Score); score.BindTo(team == match.Team1.Value ? match.Team1Score : match.Team2Score);
}
} }
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]

View File

@ -1,10 +1,9 @@
// 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.
#nullable disable
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing; using System.Drawing;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -27,13 +26,13 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
protected readonly FillFlowContainer<DrawableMatchTeam> Flow; protected readonly FillFlowContainer<DrawableMatchTeam> Flow;
private readonly Drawable selectionBox; private readonly Drawable selectionBox;
private readonly Drawable currentMatchSelectionBox; private readonly Drawable currentMatchSelectionBox;
private Bindable<TournamentMatch> globalSelection; private Bindable<TournamentMatch>? globalSelection;
[Resolved(CanBeNull = true)] [Resolved]
private LadderEditorInfo editorInfo { get; set; } private LadderEditorInfo? editorInfo { get; set; }
[Resolved(CanBeNull = true)] [Resolved]
private LadderInfo ladderInfo { get; set; } private LadderInfo? ladderInfo { get; set; }
public DrawableTournamentMatch(TournamentMatch match, bool editor = false) public DrawableTournamentMatch(TournamentMatch match, bool editor = false)
{ {
@ -129,7 +128,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
/// <summary> /// <summary>
/// Fired when something changed that requires a ladder redraw. /// Fired when something changed that requires a ladder redraw.
/// </summary> /// </summary>
public Action Changed; public Action? Changed;
private readonly List<IUnbindable> refBindables = new List<IUnbindable>(); private readonly List<IUnbindable> refBindables = new List<IUnbindable>();
@ -201,20 +200,22 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
} }
else else
{ {
transferProgression(Match.Progression?.Value, Match.Winner); Debug.Assert(Match.Winner != null);
transferProgression(Match.LosersProgression?.Value, Match.Loser); transferProgression(Match.Progression.Value, Match.Winner);
Debug.Assert(Match.Loser != null);
transferProgression(Match.LosersProgression.Value, Match.Loser);
} }
Changed?.Invoke(); Changed?.Invoke();
} }
private void transferProgression(TournamentMatch destination, TournamentTeam team) private void transferProgression(TournamentMatch? destination, TournamentTeam team)
{ {
if (destination == null) return; if (destination == null) return;
bool progressionAbove = destination.ID < Match.ID; bool progressionAbove = destination.ID < Match.ID;
Bindable<TournamentTeam> destinationTeam; Bindable<TournamentTeam?> destinationTeam;
// check for the case where we have already transferred out value // check for the case where we have already transferred out value
if (destination.Team1.Value == team) if (destination.Team1.Value == team)
@ -268,8 +269,8 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{ {
foreach (var conditional in Match.ConditionalMatches) foreach (var conditional in Match.ConditionalMatches)
{ {
bool team1Match = conditional.Acronyms.Contains(Match.Team1Acronym); bool team1Match = Match.Team1Acronym != null && conditional.Acronyms.Contains(Match.Team1Acronym);
bool team2Match = conditional.Acronyms.Contains(Match.Team2Acronym); bool team2Match = Match.Team2Acronym != null && conditional.Acronyms.Contains(Match.Team2Acronym);
if (team1Match && team2Match) if (team1Match && team2Match)
Match.Date.Value = conditional.Date.Value; Match.Date.Value = conditional.Date.Value;
@ -344,6 +345,9 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
Match.Progression.Value = null; Match.Progression.Value = null;
Match.LosersProgression.Value = null; Match.LosersProgression.Value = null;
if (ladderInfo == null)
return;
ladderInfo.Matches.Remove(Match); ladderInfo.Matches.Remove(Match);
foreach (var m in ladderInfo.Matches) foreach (var m in ladderInfo.Matches)

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using JetBrains.Annotations; using JetBrains.Annotations;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -52,7 +50,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
name.BindValueChanged(_ => textName.Text = ((losers ? "Losers " : "") + round.Name).ToUpperInvariant(), true); name.BindValueChanged(_ => textName.Text = ((losers ? "Losers " : "") + round.Name).ToUpperInvariant(), true);
description = round.Description.GetBoundCopy(); description = round.Description.GetBoundCopy();
description.BindValueChanged(_ => textDescription.Text = round.Description.Value?.ToUpperInvariant(), true); description.BindValueChanged(_ => textDescription.Text = round.Description.Value?.ToUpperInvariant() ?? string.Empty, true);
} }
} }
} }

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Diagnostics; using System.Diagnostics;
@ -23,17 +21,17 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{ {
public partial class LadderEditorSettings : CompositeDrawable public partial class LadderEditorSettings : CompositeDrawable
{ {
private SettingsDropdown<TournamentRound> roundDropdown; private SettingsDropdown<TournamentRound?> roundDropdown = null!;
private PlayerCheckbox losersCheckbox; private PlayerCheckbox losersCheckbox = null!;
private DateTextBox dateTimeBox; private DateTextBox dateTimeBox = null!;
private SettingsTeamDropdown team1Dropdown; private SettingsTeamDropdown team1Dropdown = null!;
private SettingsTeamDropdown team2Dropdown; private SettingsTeamDropdown team2Dropdown = null!;
[Resolved] [Resolved]
private LadderEditorInfo editorInfo { get; set; } private LadderEditorInfo editorInfo { get; set; } = null!;
[Resolved] [Resolved]
private LadderInfo ladderInfo { get; set; } private LadderInfo ladderInfo { get; set; } = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -77,7 +75,7 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
}; };
} }
private void roundDropdownChanged(ValueChangedEvent<TournamentRound> round) private void roundDropdownChanged(ValueChangedEvent<TournamentRound?> round)
{ {
if (editorInfo.Selected.Value?.Date.Value < round.NewValue?.StartDate.Value) if (editorInfo.Selected.Value?.Date.Value < round.NewValue?.StartDate.Value)
{ {
@ -101,11 +99,11 @@ namespace osu.Game.Tournament.Screens.Ladder.Components
{ {
} }
private partial class SettingsRoundDropdown : SettingsDropdown<TournamentRound> private partial class SettingsRoundDropdown : SettingsDropdown<TournamentRound?>
{ {
public SettingsRoundDropdown(BindableList<TournamentRound> rounds) public SettingsRoundDropdown(BindableList<TournamentRound> rounds)
{ {
Current = new Bindable<TournamentRound>(); Current = new Bindable<TournamentRound?>();
foreach (var r in rounds.Prepend(new TournamentRound())) foreach (var r in rounds.Prepend(new TournamentRound()))
add(r); add(r);

View File

@ -12,7 +12,7 @@ using osu.Game.Tournament.Models;
namespace osu.Game.Tournament.Screens.Ladder.Components namespace osu.Game.Tournament.Screens.Ladder.Components
{ {
public partial class SettingsTeamDropdown : SettingsDropdown<TournamentTeam> public partial class SettingsTeamDropdown : SettingsDropdown<TournamentTeam?>
{ {
public SettingsTeamDropdown(BindableList<TournamentTeam> teams) public SettingsTeamDropdown(BindableList<TournamentTeam> teams)
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
@ -22,13 +20,13 @@ namespace osu.Game.Tournament.Screens.Ladder
{ {
public partial class LadderScreen : TournamentScreen public partial class LadderScreen : TournamentScreen
{ {
protected Container<DrawableTournamentMatch> MatchesContainer; protected Container<DrawableTournamentMatch> MatchesContainer = null!;
private Container<Path> paths; private Container<Path> paths = null!;
private Container headings; private Container headings = null!;
protected LadderDragContainer ScrollContent; protected LadderDragContainer ScrollContent = null!;
protected Container Content; protected Container Content = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -24,20 +22,20 @@ namespace osu.Game.Tournament.Screens.MapPool
{ {
public partial class MapPoolScreen : TournamentMatchScreen public partial class MapPoolScreen : TournamentMatchScreen
{ {
private FillFlowContainer<FillFlowContainer<TournamentBeatmapPanel>> mapFlows; private FillFlowContainer<FillFlowContainer<TournamentBeatmapPanel>> mapFlows = null!;
[Resolved(canBeNull: true)] [Resolved]
private TournamentSceneManager sceneManager { get; set; } private TournamentSceneManager? sceneManager { get; set; }
private TeamColour pickColour; private TeamColour pickColour;
private ChoiceType pickType; private ChoiceType pickType;
private OsuButton buttonRedBan; private OsuButton buttonRedBan = null!;
private OsuButton buttonBlueBan; private OsuButton buttonBlueBan = null!;
private OsuButton buttonRedPick; private OsuButton buttonRedPick = null!;
private OsuButton buttonBluePick; private OsuButton buttonBluePick = null!;
private ScheduledDelegate scheduledScreenChange; private ScheduledDelegate? scheduledScreenChange;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(MatchIPCInfo ipc) private void load(MatchIPCInfo ipc)
@ -113,7 +111,7 @@ namespace osu.Game.Tournament.Screens.MapPool
ipc.Beatmap.BindValueChanged(beatmapChanged); ipc.Beatmap.BindValueChanged(beatmapChanged);
} }
private Bindable<bool> splitMapPoolByMods; private Bindable<bool>? splitMapPoolByMods;
protected override void LoadComplete() protected override void LoadComplete()
{ {
@ -123,13 +121,13 @@ namespace osu.Game.Tournament.Screens.MapPool
splitMapPoolByMods.BindValueChanged(_ => updateDisplay()); splitMapPoolByMods.BindValueChanged(_ => updateDisplay());
} }
private void beatmapChanged(ValueChangedEvent<TournamentBeatmap> beatmap) private void beatmapChanged(ValueChangedEvent<TournamentBeatmap?> beatmap)
{ {
if (CurrentMatch.Value == null || CurrentMatch.Value.PicksBans.Count(p => p.Type == ChoiceType.Ban) < 2) if (CurrentMatch.Value == null || CurrentMatch.Value.PicksBans.Count(p => p.Type == ChoiceType.Ban) < 2)
return; return;
// if bans have already been placed, beatmap changes result in a selection being made autoamtically // if bans have already been placed, beatmap changes result in a selection being made autoamtically
if (beatmap.NewValue.OnlineID > 0) if (beatmap.NewValue?.OnlineID > 0)
addForBeatmap(beatmap.NewValue.OnlineID); addForBeatmap(beatmap.NewValue.OnlineID);
} }
@ -148,6 +146,9 @@ namespace osu.Game.Tournament.Screens.MapPool
private void setNextMode() private void setNextMode()
{ {
if (CurrentMatch.Value == null)
return;
const TeamColour roll_winner = TeamColour.Red; //todo: draw from match const TeamColour roll_winner = TeamColour.Red; //todo: draw from match
var nextColour = (CurrentMatch.Value.PicksBans.LastOrDefault()?.Team ?? roll_winner) == TeamColour.Red ? TeamColour.Blue : TeamColour.Red; var nextColour = (CurrentMatch.Value.PicksBans.LastOrDefault()?.Team ?? roll_winner) == TeamColour.Red ? TeamColour.Blue : TeamColour.Red;
@ -169,11 +170,11 @@ namespace osu.Game.Tournament.Screens.MapPool
addForBeatmap(map.Beatmap.OnlineID); addForBeatmap(map.Beatmap.OnlineID);
else else
{ {
var existing = CurrentMatch.Value.PicksBans.FirstOrDefault(p => p.BeatmapID == map.Beatmap?.OnlineID); var existing = CurrentMatch.Value?.PicksBans.FirstOrDefault(p => p.BeatmapID == map.Beatmap?.OnlineID);
if (existing != null) if (existing != null)
{ {
CurrentMatch.Value.PicksBans.Remove(existing); CurrentMatch.Value?.PicksBans.Remove(existing);
setNextMode(); setNextMode();
} }
} }
@ -186,13 +187,13 @@ namespace osu.Game.Tournament.Screens.MapPool
private void reset() private void reset()
{ {
CurrentMatch.Value.PicksBans.Clear(); CurrentMatch.Value?.PicksBans.Clear();
setNextMode(); setNextMode();
} }
private void addForBeatmap(int beatmapId) private void addForBeatmap(int beatmapId)
{ {
if (CurrentMatch.Value == null) if (CurrentMatch.Value?.Round.Value == null)
return; return;
if (CurrentMatch.Value.Round.Value.Beatmaps.All(b => b.Beatmap?.OnlineID != beatmapId)) if (CurrentMatch.Value.Round.Value.Beatmaps.All(b => b.Beatmap?.OnlineID != beatmapId))
@ -228,7 +229,7 @@ namespace osu.Game.Tournament.Screens.MapPool
base.Hide(); base.Hide();
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
base.CurrentMatchChanged(match); base.CurrentMatchChanged(match);
updateDisplay(); updateDisplay();
@ -245,8 +246,8 @@ namespace osu.Game.Tournament.Screens.MapPool
if (CurrentMatch.Value.Round.Value != null) if (CurrentMatch.Value.Round.Value != null)
{ {
FillFlowContainer<TournamentBeatmapPanel> currentFlow = null; FillFlowContainer<TournamentBeatmapPanel>? currentFlow = null;
string currentMods = null; string? currentMods = null;
int flowCount = 0; int flowCount = 0;
foreach (var b in CurrentMatch.Value.Round.Value.Beatmaps) foreach (var b in CurrentMatch.Value.Round.Value.Beatmaps)

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
@ -21,9 +19,9 @@ namespace osu.Game.Tournament.Screens.Schedule
{ {
public partial class ScheduleScreen : TournamentScreen public partial class ScheduleScreen : TournamentScreen
{ {
private readonly Bindable<TournamentMatch> currentMatch = new Bindable<TournamentMatch>(); private readonly Bindable<TournamentMatch?> currentMatch = new Bindable<TournamentMatch?>();
private Container mainContainer; private Container mainContainer = null!;
private LadderInfo ladder; private LadderInfo ladder = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(LadderInfo ladder) private void load(LadderInfo ladder)
@ -107,7 +105,7 @@ namespace osu.Game.Tournament.Screens.Schedule
currentMatch.BindValueChanged(matchChanged, true); currentMatch.BindValueChanged(matchChanged, true);
} }
private void matchChanged(ValueChangedEvent<TournamentMatch> match) private void matchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
var upcoming = ladder.Matches.Where(p => !p.Completed.Value && p.Team1.Value != null && p.Team2.Value != null && Math.Abs(p.Date.Value.DayOfYear - DateTimeOffset.UtcNow.DayOfYear) < 4); var upcoming = ladder.Matches.Where(p => !p.Completed.Value && p.Team1.Value != null && p.Team2.Value != null && Math.Abs(p.Date.Value.DayOfYear - DateTimeOffset.UtcNow.DayOfYear) < 4);
var conditionals = ladder var conditionals = ladder

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
@ -14,9 +12,9 @@ namespace osu.Game.Tournament.Screens.Setup
private const int minimum_window_height = 480; private const int minimum_window_height = 480;
private const int maximum_window_height = 2160; private const int maximum_window_height = 2160;
public new Action<int> Action; public new Action<int>? Action;
private OsuNumberBox numberBox; private OsuNumberBox? numberBox;
protected override Drawable CreateComponent() protected override Drawable CreateComponent()
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Drawing; using System.Drawing;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -24,27 +22,27 @@ namespace osu.Game.Tournament.Screens.Setup
{ {
public partial class SetupScreen : TournamentScreen public partial class SetupScreen : TournamentScreen
{ {
private FillFlowContainer fillFlow; private FillFlowContainer fillFlow = null!;
private LoginOverlay loginOverlay; private LoginOverlay? loginOverlay;
private ResolutionSelector resolution; private ResolutionSelector resolution = null!;
[Resolved] [Resolved]
private MatchIPCInfo ipc { get; set; } private MatchIPCInfo ipc { get; set; } = null!;
[Resolved] [Resolved]
private StableInfo stableInfo { get; set; } private StableInfo stableInfo { get; set; } = null!;
[Resolved] [Resolved]
private IAPIProvider api { get; set; } private IAPIProvider api { get; set; } = null!;
[Resolved] [Resolved]
private RulesetStore rulesets { get; set; } private RulesetStore rulesets { get; set; } = null!;
[Resolved(canBeNull: true)] [Resolved]
private TournamentSceneManager sceneManager { get; set; } private TournamentSceneManager? sceneManager { get; set; }
private Bindable<Size> windowSize; private Bindable<Size> windowSize = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(FrameworkConfigManager frameworkConfig) private void load(FrameworkConfigManager frameworkConfig)
@ -115,7 +113,7 @@ namespace osu.Game.Tournament.Screens.Setup
Failing = api.IsLoggedIn != true, Failing = api.IsLoggedIn != true,
Description = "In order to access the API and display metadata, signing in is required." Description = "In order to access the API and display metadata, signing in is required."
}, },
new LabelledDropdown<RulesetInfo> new LabelledDropdown<RulesetInfo?>
{ {
Label = "Ruleset", Label = "Ruleset",
Description = "Decides what stats are displayed and which ranks are retrieved for players. This requires a restart to reload data for an existing bracket.", Description = "Decides what stats are displayed and which ranks are retrieved for players. This requires a restart to reload data for an existing bracket.",

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.IO; using System.IO;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -23,20 +21,20 @@ namespace osu.Game.Tournament.Screens.Setup
{ {
public partial class StablePathSelectScreen : TournamentScreen public partial class StablePathSelectScreen : TournamentScreen
{ {
[Resolved(canBeNull: true)] [Resolved]
private TournamentSceneManager sceneManager { get; set; } private TournamentSceneManager? sceneManager { get; set; }
[Resolved] [Resolved]
private MatchIPCInfo ipc { get; set; } private MatchIPCInfo ipc { get; set; } = null!;
private OsuDirectorySelector directorySelector; private OsuDirectorySelector directorySelector = null!;
private DialogOverlay overlay; private DialogOverlay? overlay;
[BackgroundDependencyLoader(true)] [BackgroundDependencyLoader(true)]
private void load(Storage storage, OsuColour colours) private void load(Storage storage, OsuColour colours)
{ {
var initialStorage = (ipc as FileBasedIPC)?.IPCStorage ?? storage; var initialStorage = (ipc as FileBasedIPC)?.IPCStorage ?? storage;
string initialPath = new DirectoryInfo(initialStorage.GetFullPath(string.Empty)).Parent?.FullName; string? initialPath = new DirectoryInfo(initialStorage.GetFullPath(string.Empty)).Parent?.FullName;
AddRangeInternal(new Drawable[] AddRangeInternal(new Drawable[]
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
@ -13,12 +11,12 @@ namespace osu.Game.Tournament.Screens.Setup
{ {
internal partial class TournamentSwitcher : ActionableInfo internal partial class TournamentSwitcher : ActionableInfo
{ {
private OsuDropdown<string> dropdown; private OsuDropdown<string> dropdown = null!;
private OsuButton folderButton; private OsuButton folderButton = null!;
private OsuButton reloadTournamentsButton; private OsuButton reloadTournamentsButton = null!;
[Resolved] [Resolved]
private TournamentGameBase game { get; set; } private TournamentGameBase game { get; set; } = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(TournamentStorage storage) private void load(TournamentStorage storage)

View File

@ -42,7 +42,7 @@ namespace osu.Game.Tournament.Screens.Showcase
}); });
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
// showcase screen doesn't care about a match being selected. // showcase screen doesn't care about a match being selected.
// base call intentionally omitted to not show match warning. // base call intentionally omitted to not show match warning.

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Diagnostics; using System.Diagnostics;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
@ -22,12 +20,12 @@ namespace osu.Game.Tournament.Screens.TeamIntro
{ {
public partial class SeedingScreen : TournamentMatchScreen public partial class SeedingScreen : TournamentMatchScreen
{ {
private Container mainContainer; private Container mainContainer = null!;
private readonly Bindable<TournamentTeam> currentTeam = new Bindable<TournamentTeam>(); private readonly Bindable<TournamentTeam?> currentTeam = new Bindable<TournamentTeam?>();
private TourneyButton showFirstTeamButton; private TourneyButton showFirstTeamButton = null!;
private TourneyButton showSecondTeamButton; private TourneyButton showSecondTeamButton = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -53,13 +51,13 @@ namespace osu.Game.Tournament.Screens.TeamIntro
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Text = "Show first team", Text = "Show first team",
Action = () => currentTeam.Value = CurrentMatch.Value.Team1.Value, Action = () => currentTeam.Value = CurrentMatch.Value?.Team1.Value,
}, },
showSecondTeamButton = new TourneyButton showSecondTeamButton = new TourneyButton
{ {
RelativeSizeAxes = Axes.X, RelativeSizeAxes = Axes.X,
Text = "Show second team", Text = "Show second team",
Action = () => currentTeam.Value = CurrentMatch.Value.Team2.Value, Action = () => currentTeam.Value = CurrentMatch.Value?.Team2.Value,
}, },
new SettingsTeamDropdown(LadderInfo.Teams) new SettingsTeamDropdown(LadderInfo.Teams)
{ {
@ -73,7 +71,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
currentTeam.BindValueChanged(teamChanged, true); currentTeam.BindValueChanged(teamChanged, true);
} }
private void teamChanged(ValueChangedEvent<TournamentTeam> team) => updateTeamDisplay(); private void teamChanged(ValueChangedEvent<TournamentTeam?> team) => updateTeamDisplay();
public override void Show() public override void Show()
{ {
@ -84,7 +82,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
updateTeamDisplay(); updateTeamDisplay();
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
base.CurrentMatchChanged(match); base.CurrentMatchChanged(match);
@ -256,7 +254,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
private partial class LeftInfo : CompositeDrawable private partial class LeftInfo : CompositeDrawable
{ {
public LeftInfo(TournamentTeam team) public LeftInfo(TournamentTeam? team)
{ {
FillFlowContainer fill; FillFlowContainer fill;
@ -315,7 +313,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
private partial class TeamDisplay : DrawableTournamentTeam private partial class TeamDisplay : DrawableTournamentTeam
{ {
public TeamDisplay(TournamentTeam team) public TeamDisplay(TournamentTeam? team)
: base(team) : base(team)
{ {
AutoSizeAxes = Axes.Both; AutoSizeAxes = Axes.Both;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -15,7 +13,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
{ {
public partial class TeamIntroScreen : TournamentMatchScreen public partial class TeamIntroScreen : TournamentMatchScreen
{ {
private Container mainContainer; private Container mainContainer = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -36,7 +34,7 @@ namespace osu.Game.Tournament.Screens.TeamIntro
}; };
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
base.CurrentMatchChanged(match); base.CurrentMatchChanged(match);

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -16,12 +14,12 @@ namespace osu.Game.Tournament.Screens.TeamWin
{ {
public partial class TeamWinScreen : TournamentMatchScreen public partial class TeamWinScreen : TournamentMatchScreen
{ {
private Container mainContainer; private Container mainContainer = null!;
private readonly Bindable<bool> currentCompleted = new Bindable<bool>(); private readonly Bindable<bool> currentCompleted = new Bindable<bool>();
private TourneyVideo blueWinVideo; private TourneyVideo blueWinVideo = null!;
private TourneyVideo redWinVideo; private TourneyVideo redWinVideo = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
@ -51,7 +49,7 @@ namespace osu.Game.Tournament.Screens.TeamWin
currentCompleted.BindValueChanged(_ => update()); currentCompleted.BindValueChanged(_ => update());
} }
protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected override void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
base.CurrentMatchChanged(match); base.CurrentMatchChanged(match);
@ -70,7 +68,7 @@ namespace osu.Game.Tournament.Screens.TeamWin
{ {
var match = CurrentMatch.Value; var match = CurrentMatch.Value;
if (match.Winner == null) if (match?.Winner == null)
{ {
mainContainer.Clear(); mainContainer.Clear();
return; return;

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Game.Tournament.Models; using osu.Game.Tournament.Models;
@ -10,8 +8,8 @@ namespace osu.Game.Tournament.Screens
{ {
public abstract partial class TournamentMatchScreen : TournamentScreen public abstract partial class TournamentMatchScreen : TournamentScreen
{ {
protected readonly Bindable<TournamentMatch> CurrentMatch = new Bindable<TournamentMatch>(); protected readonly Bindable<TournamentMatch?> CurrentMatch = new Bindable<TournamentMatch?>();
private WarningBox noMatchWarning; private WarningBox? noMatchWarning;
protected override void LoadComplete() protected override void LoadComplete()
{ {
@ -21,7 +19,7 @@ namespace osu.Game.Tournament.Screens
CurrentMatch.BindValueChanged(CurrentMatchChanged, true); CurrentMatch.BindValueChanged(CurrentMatchChanged, true);
} }
protected virtual void CurrentMatchChanged(ValueChangedEvent<TournamentMatch> match) protected virtual void CurrentMatchChanged(ValueChangedEvent<TournamentMatch?> match)
{ {
if (match.NewValue == null) if (match.NewValue == null)
{ {

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
@ -35,12 +33,12 @@ namespace osu.Game.Tournament
public static readonly Color4 ELEMENT_FOREGROUND_COLOUR = Color4Extensions.FromHex("#000"); public static readonly Color4 ELEMENT_FOREGROUND_COLOUR = Color4Extensions.FromHex("#000");
public static readonly Color4 TEXT_COLOUR = Color4Extensions.FromHex("#fff"); public static readonly Color4 TEXT_COLOUR = Color4Extensions.FromHex("#fff");
private Drawable heightWarning; private Drawable heightWarning = null!;
private Bindable<WindowMode> windowMode; private Bindable<WindowMode> windowMode = null!;
private readonly BindableSize windowSize = new BindableSize(); private readonly BindableSize windowSize = new BindableSize();
private LoadingSpinner loadingSpinner; private LoadingSpinner loadingSpinner = null!;
[Cached(typeof(IDialogOverlay))] [Cached(typeof(IDialogOverlay))]
private readonly DialogOverlay dialogOverlay = new DialogOverlay(); private readonly DialogOverlay dialogOverlay = new DialogOverlay();

View File

@ -1,14 +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.
#nullable disable
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Textures;
using osu.Framework.Input; using osu.Framework.Input;
@ -31,11 +30,11 @@ namespace osu.Game.Tournament
public partial class TournamentGameBase : OsuGameBase public partial class TournamentGameBase : OsuGameBase
{ {
public const string BRACKET_FILENAME = @"bracket.json"; public const string BRACKET_FILENAME = @"bracket.json";
private LadderInfo ladder; private LadderInfo ladder = new LadderInfo();
private TournamentStorage storage; private TournamentStorage storage = null!;
private DependencyContainer dependencies; private DependencyContainer dependencies = null!;
private FileBasedIPC ipc; private FileBasedIPC ipc = null!;
private BeatmapLookupCache beatmapCache; private BeatmapLookupCache beatmapCache = null!;
protected Task BracketLoadTask => bracketLoadTaskCompletionSource.Task; protected Task BracketLoadTask => bracketLoadTaskCompletionSource.Task;
@ -54,7 +53,7 @@ namespace osu.Game.Tournament
return new ProductionEndpointConfiguration(); return new ProductionEndpointConfiguration();
} }
private TournamentSpriteText initialisationText; private TournamentSpriteText initialisationText = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(Storage baseStorage) private void load(Storage baseStorage)
@ -100,11 +99,11 @@ namespace osu.Game.Tournament
{ {
using (Stream stream = storage.GetStream(BRACKET_FILENAME, FileAccess.Read, FileMode.Open)) using (Stream stream = storage.GetStream(BRACKET_FILENAME, FileAccess.Read, FileMode.Open))
using (var sr = new StreamReader(stream)) using (var sr = new StreamReader(stream))
ladder = JsonConvert.DeserializeObject<LadderInfo>(await sr.ReadToEndAsync().ConfigureAwait(false), new JsonPointConverter()); {
ladder = JsonConvert.DeserializeObject<LadderInfo>(await sr.ReadToEndAsync().ConfigureAwait(false), new JsonPointConverter()) ?? ladder;
}
} }
ladder ??= new LadderInfo();
var resolvedRuleset = ladder.Ruleset.Value != null var resolvedRuleset = ladder.Ruleset.Value != null
? RulesetStore.GetRuleset(ladder.Ruleset.Value.ShortName) ? RulesetStore.GetRuleset(ladder.Ruleset.Value.ShortName)
: RulesetStore.AvailableRulesets.First(); : RulesetStore.AvailableRulesets.First();
@ -283,7 +282,7 @@ namespace osu.Game.Tournament
private void updateLoadProgressMessage(string s) => Schedule(() => initialisationText.Text = s); private void updateLoadProgressMessage(string s) => Schedule(() => initialisationText.Text = s);
public void PopulatePlayer(TournamentUser user, Action success = null, Action failure = null, bool immediate = false) public void PopulatePlayer(TournamentUser user, Action? success = null, Action? failure = null, bool immediate = false)
{ {
var req = new GetUserRequest(user.OnlineID, ladder.Ruleset.Value); var req = new GetUserRequest(user.OnlineID, ladder.Ruleset.Value);
@ -348,8 +347,8 @@ namespace osu.Game.Tournament
foreach (var r in ladder.Rounds) foreach (var r in ladder.Rounds)
r.Matches = ladder.Matches.Where(p => p.Round.Value == r).Select(p => p.ID).ToList(); r.Matches = ladder.Matches.Where(p => p.Round.Value == r).Select(p => p.ID).ToList();
ladder.Progressions = ladder.Matches.Where(p => p.Progression.Value != null).Select(p => new TournamentProgression(p.ID, p.Progression.Value.ID)).Concat( ladder.Progressions = ladder.Matches.Where(p => p.Progression.Value != null).Select(p => new TournamentProgression(p.ID, p.Progression.Value.AsNonNull().ID)).Concat(
ladder.Matches.Where(p => p.LosersProgression.Value != null).Select(p => new TournamentProgression(p.ID, p.LosersProgression.Value.ID, true))) ladder.Matches.Where(p => p.LosersProgression.Value != null).Select(p => new TournamentProgression(p.ID, p.LosersProgression.Value.AsNonNull().ID, true)))
.ToList(); .ToList();
return JsonConvert.SerializeObject(ladder, return JsonConvert.SerializeObject(ladder,

View File

@ -1,8 +1,6 @@
// 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.
#nullable disable
using System; using System;
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
@ -35,8 +33,8 @@ namespace osu.Game.Tournament
[Cached] [Cached]
public partial class TournamentSceneManager : CompositeDrawable public partial class TournamentSceneManager : CompositeDrawable
{ {
private Container screens; private Container screens = null!;
private TourneyVideo video; private TourneyVideo video = null!;
public const int CONTROL_AREA_WIDTH = 200; public const int CONTROL_AREA_WIDTH = 200;
@ -50,8 +48,8 @@ namespace osu.Game.Tournament
[Cached] [Cached]
private TournamentMatchChatDisplay chat = new TournamentMatchChatDisplay(); private TournamentMatchChatDisplay chat = new TournamentMatchChatDisplay();
private Container chatContainer; private Container chatContainer = null!;
private FillFlowContainer buttons; private FillFlowContainer buttons = null!;
public TournamentSceneManager() public TournamentSceneManager()
{ {
@ -166,10 +164,10 @@ namespace osu.Game.Tournament
private float depth; private float depth;
private Drawable currentScreen; private Drawable? currentScreen;
private ScheduledDelegate scheduledHide; private ScheduledDelegate? scheduledHide;
private Drawable temporaryScreen; private Drawable? temporaryScreen;
public void SetScreen(Drawable screen) public void SetScreen(Drawable screen)
{ {
@ -284,7 +282,7 @@ namespace osu.Game.Tournament
Y = -2, Y = -2,
Anchor = Anchor.Centre, Anchor = Anchor.Centre,
Origin = Anchor.Centre, Origin = Anchor.Centre,
Text = shortcutKey.ToString(), Text = shortcutKey.Value.ToString(),
} }
} }
}); });
@ -304,7 +302,7 @@ namespace osu.Game.Tournament
private bool isSelected; private bool isSelected;
public Action<Type> RequestSelection; public Action<Type>? RequestSelection;
public bool IsSelected public bool IsSelected
{ {