Runtime and build
- Move all projects to .NET 10 with SDK-style project files and a shared
Directory.Build.props (WIN/LINUX, x86/x64 defines)
- Load managed and unmanaged dependencies from libs/managed and
libs/unmanaged through assembly and native library resolvers
- Compile party modes with Roslyn instead of CodeDom
- Update AppVeyor to the .NET 10 SDK and dotnet test
- Download the FFmpeg and gstreamer runtimes from the dependencies
repository during the build
- Remove the VC++ 2015-2022 runtime check, no dependency needs it anymore
Graphics and windowing
- Replace the Direct3D 9 renderer with Direct3D 11 (Vortice)
- Pace Direct3D 11 frames with a frame latency waitable swap chain
- Move window, input and message boxes to SDL3
- Replace System.Drawing with SkiaSharp and WinForms with SDL3 and a
software renderer
Video and audio
- Replace Acinerella with FFmpeg 8.1.3 (FFmpeg.AutoGen)
- Add hardware accelerated video decoding (D3D11VA, DXVA2, VideoToolbox,
VAAPI, VDPAU) with software fallback
- Convert YUV video frames to RGB on the GPU in Direct3D 11 and OpenGL
- Add the video options HardwareDecoding, GpuColorConversion,
DecoderThreads and VideoDownscaleResolution
- Update OpenAL to OpenTK 4 and NAudio recording to WasapiRecorder
Fixes
- Fix the song preview start and shorten the reporter buttons
- Fix a crash when opening the highscore without a selected song
- Use the options slide highlight in the party mode screens to avoid
brightness flicker on VRR displays
- Disable GameInput in the x86 build, SDL3 crashes in GameInputCreate
on 32-bit systems with the GameInput runtime installed
- Fix a truncation warning in PitchTracker
* Translate en.xml in cs
100% translated source file: 'en.xml'
on 'cs'.
* Translate en.xml in es
100% translated source file: 'en.xml'
on 'es'.
* Translate en.xml in fr
100% translated source file: 'en.xml'
on 'fr'.
* Translate en.xml in de
100% translated source file: 'en.xml'
on 'de'.
* Translate en.xml in de
100% translated source file: 'en.xml'
on 'de'.
* Translate en.xml in fr
100% translated source file: 'en.xml'
on 'fr'.
* Translate en.xml in es
100% translated source file: 'en.xml'
on 'es'.
* Translate en.xml in sv
100% translated source file: 'en.xml'
on 'sv'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
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>
93% of minimum 90% translated source file: 'en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
A new party mode for 2 to 12 players that only needs 2 microphones. Players sing duels against each other, and before every duel a wheel decides the rule for this round. Every player sings equally often, and the player with the most points wins.
- 20 rules: from short songs, medleys, double packs, duets and free song choice to rules that change what counts (golden notes, line bonus, target score, fewer points win, teamwork) or how many points there are (double points, all or nothing, point steal, lead counts, underdog bonus, jokers)
- The rules on the wheel are drawn randomly for each game, or chosen manually: every rule can be set to always, random or never
- Every rule on the wheel comes up once before any rule comes up again; rules already used are dimmed
- Rules that need special songs are only used if the song selection has enough of them
- The wheel spins with a running light that slows down, and the winner is celebrated at the end
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Add partner swap party mode
A new party mode for 3 to 12 players that only needs 2 microphones. Everyone plays for themselves, but always sings together with a partner. Both singers get the score of the pair, and the partners change every round.
- In each round every player sings once, with a partner they haven't sung with yet; with an odd number of players someone takes a break, in turns
- Ranking by the average score per song, so breaks are no disadvantage
- Optional harmony bonus of 500 points when both singers are no more than 500 points apart
- Duet songs are sung with both voices; duets can be mixed in, used exclusively or left out
- Up to 3 jokers per player to skip a song
- The best pair is shown all the time, and the winner and the best pair of the night are celebrated at the end
* Rename the harmony bonus points constant to avoid shadowing
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Add team survival party mode
A new party mode for two teams that only needs 2 microphones. In every duel one player of each team sings against one of the other team. Whoever loses a duel loses a heart, players without hearts are out, and the team whose players are all out loses.
- Every player sings once per round before anyone sings again, the duels are drawn randomly
- Teams of different sizes are possible, in the smaller team some players sing a second time per round
- Hearts can be the same for everyone or set per player, to balance uneven teams or strong and weak singers
- Up to 3 jokers per player to skip a song
- On a tie, the duel is sung again
- A lost heart is animated, and the winning team is celebrated at the end
* Trigger CI rebuild
---------
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
- A won field pops up and fades into the color of the winning team
- At the end, the winning line pulses while all other fields are dimmed
- The jokers are labeled ("New song", "Replay a field"), so it's clear what they do
- Darker panels behind the team areas and more room between the board and the title
- Long player names no longer reach into the board
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
- Instead of a number of rounds, you now choose how many songs each player sings
- New option to remember sung songs, so a new challenge doesn't repeat songs from the previous ones
- Up to 16 players
- The number of jokers and the joker refill setting are kept instead of being reset every time
- The overview shows each player's avatar, the top three in gold, silver and bronze and highlights the leader
- The winner of each round is highlighted in the round list
- The winner is celebrated at the end with avatar, a pulsing gold name and stars
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>
* Redesign party mode selection
- All party modes are shown at a glance as tiles with an icon and their name, sorted by their name
- The tiles look and behave like the theme buttons, the details of the selected mode (description, target audience, players, teams, microphones, author and version) are shown below
- Modes that need more microphones than configured are dimmed and can't be started
- Select with the arrow keys or the mouse, the arrow keys also reach the Start and Back buttons, a click on a tile starts it
- More than six modes are split into pages
- Icons for Challenge and Tic-Tac-Toe and a general icon for modes without their own
- Fixes the number of players shown for modes with a fixed number of players
* Highlight Sing and Party in the main menu
- Sing and Party are shown as two large buttons side by side above the other buttons
- Statistics, Profiles, Options and Exit stay in one row at the bottom
- Without a profile the missing profile warning takes the place of Sing and Party, because both are locked then, and looks like the other warnings
* Add Player Select Option
* Add Player Select Option
* Add Player Select Option
* Add Player Select Option
* Theme System Version 9
* Theme System Version 9
* Theme System Version 9
* Add Player Select Option
* Add Player Select Option
* Theme System Version 9
* Theme System Version 9
* Theme System Version 9
* Add Player Select Option
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
* Translate en.xml in es
100% translated source file: 'en.xml'
on 'es'.
* Translate en.xml in es
100% translated source file: 'en.xml'
on 'es'.
* Translate Output/Languages/en.xml in es
100% translated source file: 'Output/Languages/en.xml'
on 'es'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate en.xml in fi
100% translated source file: 'en.xml'
on 'fi'.
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in fi
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'fi'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in fi
100% translated source file: 'Output/Languages/en.xml'
on 'fi'.
* Translate en.xml in fi
100% translated source file: 'en.xml'
on 'fi'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
* Translate en.xml in de
100% translated source file: 'en.xml'
on 'de'.
* Translate en.xml in de
100% translated source file: 'en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Output/Languages/en.xml in cs
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
98% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
98% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
98% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
99% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
100% translated source file: 'Output/Languages/en.xml'
on 'cs'.
* Translate en.xml in cs
100% translated source file: 'en.xml'
on 'cs'.
* Translate en.xml in cs
100% translated source file: 'en.xml'
on 'cs'.
* Translate en.xml in cs
100% translated source file: 'en.xml'
on 'cs'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate en.xml in ru
100% translated source file: 'en.xml'
on 'ru'.
* Translate en.xml in ru
90% of minimum 90% translated source file: 'en.xml'
on 'ru'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in ru
93% of minimum 90% translated source file: 'en.xml'
on 'ru'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in ru
96% of minimum 90% translated source file: 'en.xml'
on 'ru'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Vocaluxe/Website/locales/en.json in ru
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'ru'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate en.xml in fr
93% of minimum 90% translated source file: 'en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in fr
93% of minimum 90% translated source file: 'en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in fr
96% of minimum 90% translated source file: 'en.xml'
on 'fr'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in fr
100% translated source file: 'en.xml'
on 'fr'.
* Translate en.xml in fr
100% translated source file: 'en.xml'
on 'fr'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Translate Vocaluxe/Website/locales/en.json in de
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'de'.
* Translate en.xml in de
90% of minimum 90% translated source file: 'en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in de
93% of minimum 90% translated source file: 'en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in de
96% of minimum 90% translated source file: 'en.xml'
on 'de'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate en.xml in de
100% translated source file: 'en.xml'
on 'de'.
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
* Add: Transifex file and renamed lang files
* Translate Vocaluxe/Website/locales/en.json in tr
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'tr'.
* Translate Vocaluxe/Website/locales/en.json in es
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'es'.
* Rename all language files to match transifex.
* Manual sync of translations
* Another manual sync of translations
* Adjust pr branch name
* Translate Output/Languages/en.xml in pt
97% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'pt'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in cs
96% of minimum 90% translated source file: 'Output/Languages/en.xml'
on 'cs'.
Sync of partially translated files:
untranslated content is included with an empty translation
or source language content depending on file format
* Translate Output/Languages/en.xml in it
100% translated source file: 'Output/Languages/en.xml'
on 'it'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Translate Output/Languages/en.xml in sv
100% translated source file: 'Output/Languages/en.xml'
on 'sv'.
* Translate Output/Languages/en.xml in de
100% translated source file: 'Output/Languages/en.xml'
on 'de'.
* Translate Output/Languages/en.xml in fr
100% translated source file: 'Output/Languages/en.xml'
on 'fr'.
* Translate Vocaluxe/Website/locales/en.json in hu
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'hu'.
* Translate Vocaluxe/Website/locales/en.json in ru
100% translated source file: 'Vocaluxe/Website/locales/en.json'
on 'ru'.
* Fix: Unescape String during xml reading
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Translate Output/Languages/en.xml in ru
100% translated source file: 'Output/Languages/en.xml'
on 'ru'.
* Fix: Seperate handling of unescaping
* Fix: Typo
* Fix: Typo
---------
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>