Add knockout tournament party mode (#913)

A new party mode for 3 to 16 players who sing against each other in one-on-one duels. Whoever scores more points moves on, the loser is out, until only the champion is left.

- The bracket is shown mirrored: both halves lead towards the final in the center, where the champion is crowned
- Players are drawn randomly; if the number of players doesn't fill the bracket, some players get a bye in the first round
- Songs are picked randomly from all songs, a category or a playlist, sung as normal, short or medley version, and no song is played twice
- Each player has up to 3 jokers for the whole tournament to skip a song they don't like
- On a tie, the duel is sung again
- The winner of each duel visibly moves on to the next round, and the champion is celebrated at the end

Also fixes "Select random" in the player selection of party modes, which only filled half of the slots.

Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
This commit is contained in:
McSchneidarandFlorian Ostertag authored and GitHub committed 2026-10-18 10:36:19 +02:00
1 parent b4d8f7ef8f
commit 944022f30b
20 files changed
+4285 -21

No files matched your search

+4 -21
View File
@@ -479,30 +479,13 @@ namespace VocaluxeLib.Menu
public Guid GetRandomUnusedProfile()
{
var id = Guid.Empty;
if (_VisibleProfiles.Count == 0)
var unusedProfiles = _VisibleProfiles.Where(profileId => !_UsedProfiles.Contains(profileId)).ToList();
if (unusedProfiles.Count == 0)
{
return id;
return Guid.Empty;
}
if (_VisibleProfiles.Count == _UsedProfiles.Count)
{
return id;
}
while (id == Guid.Empty)
{
var rand = CBase.Game.GetRandom(_VisibleProfiles.Count);
if (_UsedProfiles.Contains(_VisibleProfiles[rand]))
{
continue;
}
id = _VisibleProfiles.ElementAt(rand);
}
return id;
return unusedProfiles[CBase.Game.GetRandom(unusedProfiles.Count)];
}
private void _PrepareTiles()