2019-03-04 04:24:19 +00:00
|
|
|
|
// 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.
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2022-06-17 07:37:17 +00:00
|
|
|
|
#nullable disable
|
|
|
|
|
|
2017-02-27 05:19:07 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2017-03-03 11:21:11 +00:00
|
|
|
|
using System.IO;
|
2017-02-27 05:19:07 +00:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
2017-02-27 13:50:34 +00:00
|
|
|
|
using osu.Framework.Allocation;
|
2017-03-03 11:21:11 +00:00
|
|
|
|
using osu.Framework.Graphics;
|
|
|
|
|
using osu.Framework.Graphics.Containers;
|
2021-07-30 04:21:50 +00:00
|
|
|
|
using osu.Framework.Graphics.Shapes;
|
2017-03-03 06:59:33 +00:00
|
|
|
|
using osu.Framework.Logging;
|
2017-03-03 11:21:11 +00:00
|
|
|
|
using osu.Framework.Platform;
|
2018-11-03 19:58:35 +00:00
|
|
|
|
using osu.Game.Graphics;
|
2021-07-30 04:21:50 +00:00
|
|
|
|
using osu.Game.Graphics.Containers;
|
2018-08-25 16:24:19 +00:00
|
|
|
|
using osu.Game.Tournament.Components;
|
2019-06-18 05:51:48 +00:00
|
|
|
|
using osu.Game.Tournament.Models;
|
2018-08-25 12:40:40 +00:00
|
|
|
|
using osu.Game.Tournament.Screens.Drawings.Components;
|
2018-11-22 01:25:30 +00:00
|
|
|
|
using osuTK;
|
|
|
|
|
using osuTK.Graphics;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-08-25 12:40:40 +00:00
|
|
|
|
namespace osu.Game.Tournament.Screens.Drawings
|
2017-02-27 05:19:07 +00:00
|
|
|
|
{
|
2022-07-11 11:42:04 +00:00
|
|
|
|
public class DrawingsScreen : TournamentScreen
|
2017-02-27 05:19:07 +00:00
|
|
|
|
{
|
2017-03-03 03:59:58 +00:00
|
|
|
|
private const string results_filename = "drawings_results.txt";
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-02-27 13:50:34 +00:00
|
|
|
|
private ScrollingTeamContainer teamsContainer;
|
2017-03-03 11:46:07 +00:00
|
|
|
|
private GroupContainer groupsContainer;
|
2020-03-03 10:14:44 +00:00
|
|
|
|
private TournamentSpriteText fullTeamNameText;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-08-25 12:40:40 +00:00
|
|
|
|
private readonly List<TournamentTeam> allTeams = new List<TournamentTeam>();
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-02-27 14:09:26 +00:00
|
|
|
|
private DrawingsConfigManager drawingsConfig;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-02 03:02:50 +00:00
|
|
|
|
private Task writeOp;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 03:59:58 +00:00
|
|
|
|
private Storage storage;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 11:21:11 +00:00
|
|
|
|
public ITeamList TeamList;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-02-27 13:50:34 +00:00
|
|
|
|
[BackgroundDependencyLoader]
|
2022-07-11 11:36:05 +00:00
|
|
|
|
private void load(Storage storage)
|
2017-02-27 13:50:34 +00:00
|
|
|
|
{
|
2018-11-03 19:58:35 +00:00
|
|
|
|
RelativeSizeAxes = Axes.Both;
|
|
|
|
|
|
2017-03-03 03:59:58 +00:00
|
|
|
|
this.storage = storage;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2020-06-03 07:48:44 +00:00
|
|
|
|
TeamList ??= new StorageBackedTeamList(storage);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 11:21:11 +00:00
|
|
|
|
if (!TeamList.Teams.Any())
|
2017-03-03 03:43:48 +00:00
|
|
|
|
{
|
2021-07-30 04:21:50 +00:00
|
|
|
|
LinkFlowContainer links;
|
|
|
|
|
|
|
|
|
|
InternalChildren = new Drawable[]
|
|
|
|
|
{
|
|
|
|
|
new Box
|
|
|
|
|
{
|
|
|
|
|
Colour = Color4.Black,
|
|
|
|
|
RelativeSizeAxes = Axes.Both,
|
|
|
|
|
Anchor = Anchor.Centre,
|
|
|
|
|
Origin = Anchor.Centre,
|
|
|
|
|
Height = 0.3f,
|
|
|
|
|
},
|
|
|
|
|
new WarningBox("No drawings.txt file found. Please create one and restart the client."),
|
|
|
|
|
links = new LinkFlowContainer
|
|
|
|
|
{
|
|
|
|
|
Anchor = Anchor.Centre,
|
|
|
|
|
Origin = Anchor.Centre,
|
|
|
|
|
Y = 60,
|
|
|
|
|
AutoSizeAxes = Axes.Both
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
links.AddLink("Click for details on the file format", "https://osu.ppy.sh/wiki/en/Tournament_Drawings", t => t.Colour = Color4.White);
|
2017-03-03 03:43:48 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 03:59:58 +00:00
|
|
|
|
drawingsConfig = new DrawingsConfigManager(storage);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-02-02 09:29:20 +00:00
|
|
|
|
InternalChildren = new Drawable[]
|
2017-02-27 05:19:07 +00:00
|
|
|
|
{
|
2018-11-03 19:58:35 +00:00
|
|
|
|
// Main container
|
|
|
|
|
new Container
|
2017-02-28 01:26:37 +00:00
|
|
|
|
{
|
|
|
|
|
RelativeSizeAxes = Axes.Both,
|
2017-02-27 13:50:34 +00:00
|
|
|
|
Children = new Drawable[]
|
|
|
|
|
{
|
2022-07-11 06:35:00 +00:00
|
|
|
|
new TourneyVideo("drawings")
|
|
|
|
|
{
|
|
|
|
|
Loop = true,
|
|
|
|
|
RelativeSizeAxes = Axes.Both,
|
|
|
|
|
},
|
2018-11-03 19:58:35 +00:00
|
|
|
|
// Visualiser
|
|
|
|
|
new VisualiserContainer
|
|
|
|
|
{
|
|
|
|
|
Anchor = Anchor.Centre,
|
|
|
|
|
Origin = Anchor.Centre,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
RelativeSizeAxes = Axes.X,
|
|
|
|
|
Size = new Vector2(1, 10),
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
Colour = new Color4(255, 204, 34, 255),
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
Lines = 6
|
|
|
|
|
},
|
|
|
|
|
// Groups
|
|
|
|
|
groupsContainer = new GroupContainer(drawingsConfig.Get<int>(DrawingsConfig.Groups), drawingsConfig.Get<int>(DrawingsConfig.TeamsPerGroup))
|
|
|
|
|
{
|
|
|
|
|
Anchor = Anchor.TopCentre,
|
|
|
|
|
Origin = Anchor.TopCentre,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
RelativeSizeAxes = Axes.Y,
|
|
|
|
|
AutoSizeAxes = Axes.X,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
Padding = new MarginPadding
|
|
|
|
|
{
|
|
|
|
|
Top = 35f,
|
|
|
|
|
Bottom = 35f
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// Scrolling teams
|
|
|
|
|
teamsContainer = new ScrollingTeamContainer
|
|
|
|
|
{
|
|
|
|
|
Anchor = Anchor.Centre,
|
|
|
|
|
Origin = Anchor.Centre,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
RelativeSizeAxes = Axes.X,
|
|
|
|
|
},
|
|
|
|
|
// Scrolling team name
|
2020-03-03 10:14:44 +00:00
|
|
|
|
fullTeamNameText = new TournamentSpriteText
|
2018-11-03 19:58:35 +00:00
|
|
|
|
{
|
|
|
|
|
Anchor = Anchor.Centre,
|
|
|
|
|
Origin = Anchor.TopCentre,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
Position = new Vector2(0, 45f),
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2020-03-03 10:14:44 +00:00
|
|
|
|
Colour = OsuColour.Gray(0.95f),
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-03 19:58:35 +00:00
|
|
|
|
Alpha = 0,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2020-03-03 10:14:44 +00:00
|
|
|
|
Font = OsuFont.Torus.With(weight: FontWeight.Light, size: 42),
|
2018-11-03 19:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// Control panel container
|
2018-11-07 18:51:39 +00:00
|
|
|
|
new ControlPanel
|
2018-11-03 19:58:35 +00:00
|
|
|
|
{
|
2019-11-08 08:00:47 +00:00
|
|
|
|
new TourneyButton
|
2018-11-03 19:58:35 +00:00
|
|
|
|
{
|
2018-11-07 18:51:39 +00:00
|
|
|
|
RelativeSizeAxes = Axes.X,
|
2018-11-03 19:58:35 +00:00
|
|
|
|
|
2018-11-07 18:51:39 +00:00
|
|
|
|
Text = "Begin random",
|
|
|
|
|
Action = teamsContainer.StartScrolling,
|
|
|
|
|
},
|
2019-11-08 08:00:47 +00:00
|
|
|
|
new TourneyButton
|
2018-11-07 18:51:39 +00:00
|
|
|
|
{
|
|
|
|
|
RelativeSizeAxes = Axes.X,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-07 18:51:39 +00:00
|
|
|
|
Text = "Stop random",
|
|
|
|
|
Action = teamsContainer.StopScrolling,
|
|
|
|
|
},
|
2019-11-08 08:00:47 +00:00
|
|
|
|
new TourneyButton
|
2018-11-07 18:51:39 +00:00
|
|
|
|
{
|
|
|
|
|
RelativeSizeAxes = Axes.X,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-07 18:51:39 +00:00
|
|
|
|
Text = "Reload",
|
|
|
|
|
Action = reloadTeams
|
|
|
|
|
},
|
|
|
|
|
new ControlPanel.Spacer(),
|
2019-11-08 08:00:47 +00:00
|
|
|
|
new TourneyButton
|
2018-11-07 18:51:39 +00:00
|
|
|
|
{
|
|
|
|
|
RelativeSizeAxes = Axes.X,
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-11-07 18:51:39 +00:00
|
|
|
|
Text = "Reset",
|
|
|
|
|
Action = () => reset()
|
2017-02-27 13:50:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-02-27 05:19:07 +00:00
|
|
|
|
};
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 05:51:19 +00:00
|
|
|
|
teamsContainer.OnSelected += onTeamSelected;
|
|
|
|
|
teamsContainer.OnScrollStarted += () => fullTeamNameText.FadeOut(200);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 05:51:19 +00:00
|
|
|
|
reset(true);
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-08-25 12:40:40 +00:00
|
|
|
|
private void onTeamSelected(TournamentTeam team)
|
2017-03-03 05:51:19 +00:00
|
|
|
|
{
|
|
|
|
|
groupsContainer.AddTeam(team);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-06-17 07:28:58 +00:00
|
|
|
|
fullTeamNameText.Text = team.FullName.Value;
|
2017-03-03 05:51:19 +00:00
|
|
|
|
fullTeamNameText.FadeIn(200);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 11:42:22 +00:00
|
|
|
|
writeResults(groupsContainer.GetStringRepresentation());
|
2017-03-02 03:02:50 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-02 03:02:50 +00:00
|
|
|
|
private void writeResults(string text)
|
|
|
|
|
{
|
2018-01-15 18:42:17 +00:00
|
|
|
|
void writeAction()
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 06:59:33 +00:00
|
|
|
|
try
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 06:59:33 +00:00
|
|
|
|
// Write to drawings_results
|
2022-05-16 09:03:53 +00:00
|
|
|
|
using (Stream stream = storage.CreateFileSafely(results_filename))
|
2017-03-03 06:59:33 +00:00
|
|
|
|
using (StreamWriter sw = new StreamWriter(stream))
|
|
|
|
|
{
|
|
|
|
|
sw.Write(text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.Error(ex, "Failed to write results.");
|
2017-03-02 03:02:50 +00:00
|
|
|
|
}
|
2018-01-15 18:42:17 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2022-06-24 12:25:23 +00:00
|
|
|
|
writeOp = writeOp?.ContinueWith(_ => { writeAction(); }) ?? Task.Run(writeAction);
|
2017-02-27 13:50:34 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-02-27 13:50:34 +00:00
|
|
|
|
private void reloadTeams()
|
|
|
|
|
{
|
|
|
|
|
teamsContainer.ClearTeams();
|
2017-03-02 03:02:50 +00:00
|
|
|
|
allTeams.Clear();
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-08-25 12:40:40 +00:00
|
|
|
|
foreach (TournamentTeam t in TeamList.Teams)
|
2017-02-27 05:19:07 +00:00
|
|
|
|
{
|
2019-06-17 07:28:58 +00:00
|
|
|
|
if (groupsContainer.ContainsTeam(t.FullName.Value))
|
2017-03-03 09:47:56 +00:00
|
|
|
|
continue;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-17 21:16:59 +00:00
|
|
|
|
allTeams.Add(t);
|
|
|
|
|
teamsContainer.AddTeam(t);
|
2017-02-27 05:19:07 +00:00
|
|
|
|
}
|
2017-02-27 13:50:34 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-02 03:02:50 +00:00
|
|
|
|
private void reset(bool loadLastResults = false)
|
2017-02-27 13:50:34 +00:00
|
|
|
|
{
|
|
|
|
|
groupsContainer.ClearTeams();
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-02-27 13:50:34 +00:00
|
|
|
|
reloadTeams();
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-04 14:24:32 +00:00
|
|
|
|
if (!storage.Exists(results_filename))
|
|
|
|
|
return;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-03 06:59:33 +00:00
|
|
|
|
if (loadLastResults)
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 06:59:33 +00:00
|
|
|
|
try
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
|
|
|
|
// Read from drawings_results
|
2017-03-03 03:59:58 +00:00
|
|
|
|
using (Stream stream = storage.GetStream(results_filename, FileAccess.Read, FileMode.Open))
|
|
|
|
|
using (StreamReader sr = new StreamReader(stream))
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 11:24:34 +00:00
|
|
|
|
string line;
|
2019-05-15 03:08:23 +00:00
|
|
|
|
|
2017-03-03 11:24:34 +00:00
|
|
|
|
while ((line = sr.ReadLine()?.Trim()) != null)
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(line))
|
|
|
|
|
continue;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2020-10-16 03:49:31 +00:00
|
|
|
|
if (line.ToUpperInvariant().StartsWith("GROUP", StringComparison.Ordinal))
|
2017-03-02 03:02:50 +00:00
|
|
|
|
continue;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-11-20 09:55:48 +00:00
|
|
|
|
// ReSharper disable once AccessToModifiedClosure
|
2019-06-17 07:28:58 +00:00
|
|
|
|
TournamentTeam teamToAdd = allTeams.FirstOrDefault(t => t.FullName.Value == line);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-02 03:02:50 +00:00
|
|
|
|
if (teamToAdd == null)
|
|
|
|
|
continue;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2017-03-02 03:02:50 +00:00
|
|
|
|
groupsContainer.AddTeam(teamToAdd);
|
|
|
|
|
teamsContainer.RemoveTeam(teamToAdd);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-03-03 06:59:33 +00:00
|
|
|
|
catch (Exception ex)
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 06:59:33 +00:00
|
|
|
|
Logger.Error(ex, "Failed to read last drawings results.");
|
2017-03-02 03:02:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-03-03 06:59:33 +00:00
|
|
|
|
else
|
2017-03-02 03:02:50 +00:00
|
|
|
|
{
|
2017-03-03 06:59:33 +00:00
|
|
|
|
writeResults(string.Empty);
|
2017-03-02 03:02:50 +00:00
|
|
|
|
}
|
2017-02-27 05:19:07 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|