diff --git a/UltraStar Play Companion/Assets/Common/Network/ClientSideConnectRequestManager.cs b/UltraStar Play Companion/Assets/Common/Network/ClientSideConnectRequestManager.cs index 6027bab7b..fdc86a5ea 100644 --- a/UltraStar Play Companion/Assets/Common/Network/ClientSideConnectRequestManager.cs +++ b/UltraStar Play Companion/Assets/Common/Network/ClientSideConnectRequestManager.cs @@ -27,7 +27,7 @@ public static ClientSideConnectRequestManager Instance if (instance == null) { ClientSideConnectRequestManager instanceInScene = FindObjectOfType(); - instanceInScene.InitSingleInstance(); + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref instanceInScene); } return instance; } @@ -63,7 +63,8 @@ public static ClientSideConnectRequestManager Instance private void Start() { - InitSingleInstance(); + ClientSideConnectRequestManager self = this; + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref self); if (!Application.isPlaying || instance != this) { return; @@ -132,17 +133,6 @@ private void DisposeConnectedServerHandler() } } - private void InitSingleInstance() - { - if (instance != null - && instance != this) - { - Destroy(gameObject); - return; - } - instance = this; - } - private void OnApplicationPause(bool pauseStatus) { isApplicationPaused = pauseStatus; diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic.meta b/UltraStar Play/Assets/Common/Audio/BackgroundMusic.meta new file mode 100644 index 000000000..4ac2c4690 --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8d436a2775f8ea04b9638369fced9763 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs new file mode 100644 index 000000000..ab9b60cff --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.UIElements; +using UniInject; +using UniRx; +using UnityEngine.SceneManagement; + +// Disable warning about fields that are never assigned, their values are injected. +#pragma warning disable CS0649 + +public class BackgroundMusicManager : MonoBehaviour, INeedInjection +{ + private static BackgroundMusicManager instance; + public static BackgroundMusicManager Instance + { + get + { + if (instance == null) + { + BackgroundMusicManager instanceInScene = GameObjectUtils.FindComponentWithTag("BackgroundMusicManager"); + if (instanceInScene != null) + { + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref instanceInScene); + } + } + return instance; + } + } + + private static readonly int timeInSecondsBeforeRestartingBackgroundMusic = 20; + private static readonly List scenesWithoutBackgroundMusic = new() + { + EScene.SingScene, + EScene.SongSelectScene, + EScene.SingingResultsScene, + EScene.HighscoreScene, + EScene.SongEditorScene, + }; + + private bool ShouldPlayBackgroundMusic + { + get + { + if (settings.AudioSettings.BackgroundMusicVolumePercent <= 0) + { + return false; + } + + EScene sceneEnum = ESceneUtils.GetSceneByBuildIndex(SceneManager.GetActiveScene().buildIndex); + return !scenesWithoutBackgroundMusic.Contains(sceneEnum); + } + } + + [Inject(SearchMethod = SearchMethods.GetComponentInChildren)] + private AudioSource backgroundMusicAudioSource; + + [Inject] + private Settings settings; + + private float lastPauseTimeInSeconds; + + private void Start() { + BackgroundMusicManager self = this; + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref self); + + instance.UpdateBackgroundMusic(); + + if (!Application.isPlaying || instance != this) + { + return; + } + + settings.ObserveEveryValueChanged(it => it.AudioSettings.BackgroundMusicVolumePercent) + .Subscribe(_ => UpdateBackgroundMusic()) + .AddTo(gameObject); + } + + private void UpdateBackgroundMusic() + { + // Update volume + backgroundMusicAudioSource.volume = settings.AudioSettings.BackgroundMusicVolumePercent / 100f; + + // Play or pause the music + if (ShouldPlayBackgroundMusic + && !backgroundMusicAudioSource.isPlaying) + { + // If the music did not play for a longer duration, then start it from the beginning. + float timeInSecondsWithoutBackgroundMusic = Time.time - lastPauseTimeInSeconds; + if (lastPauseTimeInSeconds > 0 + && timeInSecondsWithoutBackgroundMusic > timeInSecondsBeforeRestartingBackgroundMusic) + { + Debug.Log($"Did not play background music for {timeInSecondsWithoutBackgroundMusic} seconds. Restarting it from the beginning."); + backgroundMusicAudioSource.Stop(); + } + backgroundMusicAudioSource.Play(); + } + else if (!ShouldPlayBackgroundMusic + && backgroundMusicAudioSource.isPlaying) + { + backgroundMusicAudioSource.Pause(); + lastPauseTimeInSeconds = Time.time; + } + } +} diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs.meta b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs.meta new file mode 100644 index 000000000..982c95175 --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundMusicManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eadac8c505afd7a4789d617093dc1f6f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3 b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3 new file mode 100644 index 000000000..f32135fcb Binary files /dev/null and b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3 differ diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3.meta b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3.meta new file mode 100644 index 000000000..e7a490166 --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrack.mp3.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: 316dc88e9e575a443b59b16467547f89 +AudioImporter: + externalObjects: {} + serializedVersion: 6 + defaultSettings: + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + preloadAudioData: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt new file mode 100644 index 000000000..2395341ce --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt @@ -0,0 +1,10 @@ +This work is licensed under the Creative Commons license by-sa 3.0. +(http://creativecommons.org/licenses/by-sa/3.0/) + +Author: +DJad (http://www.jamendo.com/de/artist/DJad) + +Distributed by: +Site: jamendo.com +File: DJad - Walking Alone.mp3 +URL: http://www.jamendo.com/de/track/543970 diff --git a/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt.meta b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt.meta new file mode 100644 index 000000000..c482c043e --- /dev/null +++ b/UltraStar Play/Assets/Common/Audio/BackgroundMusic/BackgroundTrackLicense.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 23a08c316f3af6a4fade4e1b394d9b2a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Common/Audio/VolumeControl.cs b/UltraStar Play/Assets/Common/Audio/VolumeControl.cs index c6dbe3460..188c4097e 100644 --- a/UltraStar Play/Assets/Common/Audio/VolumeControl.cs +++ b/UltraStar Play/Assets/Common/Audio/VolumeControl.cs @@ -12,21 +12,15 @@ public class VolumeControl : MonoBehaviour, INeedInjection private void Start() { - UpdateVolumeInScene(); + UpdateGeneralVolume(); settings.AudioSettings .ObserveEveryValueChanged(audioSettings => audioSettings.VolumePercent) - .Subscribe(newValue => UpdateVolumeInScene()) + .Subscribe(newValue => UpdateGeneralVolume()) .AddTo(gameObject); } - private void UpdateVolumeInScene() + private void UpdateGeneralVolume() { - AudioSource[] audioSources = FindObjectsOfType(); - if (!audioSources.IsNullOrEmpty()) - { - audioSources.ForEach(audioSource => audioSource.volume = settings.AudioSettings.VolumePercent / 100.0f); - } - AudioListener.volume = settings.AudioSettings.VolumePercent / 100.0f; } } diff --git a/UltraStar Play/Assets/Common/Model/Setting/AudioSettings.cs b/UltraStar Play/Assets/Common/Model/Setting/AudioSettings.cs index f844cb8f6..57ee1aaa2 100644 --- a/UltraStar Play/Assets/Common/Model/Setting/AudioSettings.cs +++ b/UltraStar Play/Assets/Common/Model/Setting/AudioSettings.cs @@ -7,7 +7,7 @@ public class AudioSettings // Range: 0..100 public int PreviewVolumePercent { get; set; } = 50; public int VolumePercent { get; set; } = 100; - public bool BackgroundMusicEnabled { get; set; } = true; + public int BackgroundMusicVolumePercent { get; set; } = 70; public EPitchDetectionAlgorithm pitchDetectionAlgorithm = EPitchDetectionAlgorithm.Dywa; } diff --git a/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs b/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs new file mode 100644 index 000000000..b5814405f --- /dev/null +++ b/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs @@ -0,0 +1,6 @@ +public enum EScoreMode +{ + Individual, + CommonAverage, + None, +} diff --git a/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs.meta b/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs.meta new file mode 100644 index 000000000..e16218f1b --- /dev/null +++ b/UltraStar Play/Assets/Common/Model/Setting/EScoreMode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0b9b4c58eda45f5951aa647ae089551 +timeCreated: 1655735051 \ No newline at end of file diff --git a/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs b/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs new file mode 100644 index 000000000..9aabfa2ed --- /dev/null +++ b/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs @@ -0,0 +1,20 @@ +using System; +using ProTrans; + +public static class ScoreModeExtensions +{ + public static string GetTranslation(this EScoreMode scoreMode) + { + switch (scoreMode) + { + case EScoreMode.Individual: + return TranslationManager.GetTranslation(R.Messages.enum_scoreMode_individual); + case EScoreMode.CommonAverage: + return TranslationManager.GetTranslation(R.Messages.enum_scoreMode_commonAverage); + case EScoreMode.None: + return TranslationManager.GetTranslation(R.Messages.enum_scoreMode_none); + default: + throw new ArgumentOutOfRangeException(nameof(scoreMode), scoreMode, null); + } + } +} diff --git a/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs.meta b/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs.meta new file mode 100644 index 000000000..cae1f95a1 --- /dev/null +++ b/UltraStar Play/Assets/Common/Model/Setting/EScoreModeExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3ae608b3fec84a218a18b6835b923d1f +timeCreated: 1655920251 \ No newline at end of file diff --git a/UltraStar Play/Assets/Common/Model/Setting/GameSettings.cs b/UltraStar Play/Assets/Common/Model/Setting/GameSettings.cs index fb118df92..32906dea1 100644 --- a/UltraStar Play/Assets/Common/Model/Setting/GameSettings.cs +++ b/UltraStar Play/Assets/Common/Model/Setting/GameSettings.cs @@ -7,6 +7,6 @@ public class GameSettings { public SystemLanguage language = SystemLanguage.English; public List songDirs = new(); - public bool RatePlayers { get; set; } = true; - public bool CombineDuetScores { get; set; } = true; + public EScoreMode ScoreMode { get; set; } = EScoreMode.Individual; + public string CommonScoreNameSeparator { get; set; } = " & "; } diff --git a/UltraStar Play/Assets/Common/Model/Stats/SongStatistic.cs b/UltraStar Play/Assets/Common/Model/Stats/SongStatistic.cs index 725a9aa26..b7aee1f74 100644 --- a/UltraStar Play/Assets/Common/Model/Stats/SongStatistic.cs +++ b/UltraStar Play/Assets/Common/Model/Stats/SongStatistic.cs @@ -7,15 +7,17 @@ public class SongStatistic { public string PlayerName { get; private set; } public EDifficulty Difficulty { get; private set; } + public EScoreMode ScoreMode { get; private set; } public int Score { get; private set; } public DateTime DateTime { get; private set; } - public SongStatistic(string playerName, EDifficulty difficulty, int score) + public SongStatistic(string playerName, EDifficulty difficulty, int score, EScoreMode scoreMode) { this.PlayerName = playerName; this.Difficulty = difficulty; this.Score = score; this.DateTime = DateTime.Now; + this.ScoreMode = scoreMode; } } diff --git a/UltraStar Play/Assets/Common/Network/ServerSideConnectRequestManager.cs b/UltraStar Play/Assets/Common/Network/ServerSideConnectRequestManager.cs index f645ab5e1..45035bd27 100644 --- a/UltraStar Play/Assets/Common/Network/ServerSideConnectRequestManager.cs +++ b/UltraStar Play/Assets/Common/Network/ServerSideConnectRequestManager.cs @@ -32,7 +32,7 @@ public static ServerSideConnectRequestManager Instance ServerSideConnectRequestManager instanceInScene = GameObjectUtils.FindComponentWithTag("ServerSideConnectRequestManager"); if (instanceInScene != null) { - instanceInScene.InitSingleInstance(); + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref instanceInScene); } } return instance; @@ -59,7 +59,8 @@ public static ServerSideConnectRequestManager Instance private void Start() { - InitSingleInstance(); + ServerSideConnectRequestManager self = this; + GameObjectUtils.TryInitSingleInstanceWithDontDestroyOnLoad(ref instance, ref self); if (!Application.isPlaying || instance != this) { return; @@ -77,28 +78,6 @@ private void Start() }); } - private void InitSingleInstance() - { - if (!Application.isPlaying) - { - return; - } - - if (instance != null - && instance != this) - { - // This instance is not needed. - Destroy(gameObject); - return; - } - instance = this; - - // Move object to top level in scene hierarchy. - // Otherwise this object will be destroyed with its parent, even when DontDestroyOnLoad is used. - transform.SetParent(null); - DontDestroyOnLoad(gameObject); - } - private void ServerAcceptMessageFromClient() { try diff --git a/UltraStar Play/Assets/Common/R/RMessages.cs b/UltraStar Play/Assets/Common/R/RMessages.cs index f094ec37f..42fcee49d 100644 --- a/UltraStar Play/Assets/Common/R/RMessages.cs +++ b/UltraStar Play/Assets/Common/R/RMessages.cs @@ -57,6 +57,9 @@ public static class Messages public static readonly string difficulty_hard = "difficulty_hard"; public static readonly string difficulty_medium = "difficulty_medium"; public static readonly string enabled = "enabled"; + public static readonly string enum_scoreMode_commonAverage = "enum_scoreMode_commonAverage"; + public static readonly string enum_scoreMode_individual = "enum_scoreMode_individual"; + public static readonly string enum_scoreMode_none = "enum_scoreMode_none"; public static readonly string exit = "exit"; public static readonly string graph_button_label = "graph_button_label"; public static readonly string graph_legend_good = "graph_legend_good"; @@ -99,7 +102,6 @@ public static class Messages public static readonly string options_analyzeBeatsWithoutTargetNote = "options_analyzeBeatsWithoutTargetNote"; public static readonly string options_backgroundMusicEnabled = "options_backgroundMusicEnabled"; public static readonly string options_color = "options_color"; - public static readonly string options_combineDuetScores = "options_combineDuetScores"; public static readonly string options_companionApp_button = "options_companionApp_button"; public static readonly string options_companionApp_title = "options_companionApp_title"; public static readonly string options_connectedClientCount = "options_connectedClientCount"; @@ -131,12 +133,12 @@ public static class Messages public static readonly string options_playerProfiles_button = "options_playerProfiles_button"; public static readonly string options_playerProfiles_title = "options_playerProfiles_title"; public static readonly string options_previewVolume = "options_previewVolume"; - public static readonly string options_ratePlayers = "options_ratePlayers"; public static readonly string options_recording_button = "options_recording_button"; public static readonly string options_recording_title = "options_recording_title"; public static readonly string options_resolution = "options_resolution"; public static readonly string options_sampleRate = "options_sampleRate"; public static readonly string options_sampleRate_auto = "options_sampleRate_auto"; + public static readonly string options_scoreMode = "options_scoreMode"; public static readonly string options_showFps = "options_showFps"; public static readonly string options_showLyricsOnNotes = "options_showLyricsOnNotes"; public static readonly string options_showPitchIndicator = "options_showPitchIndicator"; diff --git a/UltraStar Play/Assets/Common/R/RUxmlClasses.cs b/UltraStar Play/Assets/Common/R/RUxmlClasses.cs index 7ba06a367..ada1e1c92 100644 --- a/UltraStar Play/Assets/Common/R/RUxmlClasses.cs +++ b/UltraStar Play/Assets/Common/R/RUxmlClasses.cs @@ -18,6 +18,7 @@ public static class UxmlClasses public const string error = "error"; public const string focusableNavigatorIgnore = "focusableNavigatorIgnore"; public const string focusableNavigatorRoot = "focusableNavigatorRoot"; + public const string fullMinHeightUnityContentContainer = "fullMinHeightUnityContentContainer"; public const string icon = "icon"; public const string iconImage = "iconImage"; public const string iconImageTextSized = "iconImageTextSized"; @@ -41,12 +42,12 @@ public static class UxmlClasses public const string optionsSceneTopRow = "optionsSceneTopRow"; public const string outline = "outline"; public const string outlineOnFocus = "outlineOnFocus"; - public const string overlay = "overlay"; public const string panel = "panel"; public const string previousNoteLyrics = "previousNoteLyrics"; public const string roundButton = "roundButton"; public const string roundCorners = "roundCorners"; public const string scoreRow = "scoreRow"; + public const string searchPropertyContainer = "searchPropertyContainer"; public const string secondarySideBarPanel = "secondarySideBarPanel"; public const string secondarySideBarTitle = "secondarySideBarTitle"; public const string singingLyrics = "singingLyrics"; diff --git a/UltraStar Play/Assets/Common/R/RUxmlNames.cs b/UltraStar Play/Assets/Common/R/RUxmlNames.cs index 2aaffbe35..c88d488ee 100644 --- a/UltraStar Play/Assets/Common/R/RUxmlNames.cs +++ b/UltraStar Play/Assets/Common/R/RUxmlNames.cs @@ -27,9 +27,9 @@ public static class UxmlNames public const string backButtonContainer = "backButtonContainer"; public const string backButtonLabel = "backButtonLabel"; public const string background = "background"; - public const string backgroundMusicEnabledChooser = "backgroundMusicEnabledChooser"; - public const string backgroundMusicEnabledContainer = "backgroundMusicEnabledContainer"; - public const string backgroundMusicEnabledLabel = "backgroundMusicEnabledLabel"; + public const string backgroundMusicVolumeChooser = "backgroundMusicVolumeChooser"; + public const string backgroundMusicVolumeContainer = "backgroundMusicVolumeContainer"; + public const string backgroundMusicVolumeLabel = "backgroundMusicVolumeLabel"; public const string backImage = "backImage"; public const string backToMainMenuButton = "backToMainMenuButton"; public const string bottomButtonRow = "bottomButtonRow"; @@ -56,6 +56,7 @@ public static class UxmlNames public const string characterQuickJumpCharacter = "characterQuickJumpCharacter"; public const string characterQuickJumpCharacterButton = "characterQuickJumpCharacterButton"; public const string characterQuickJumpContainer = "characterQuickJumpContainer"; + public const string closeLogOverlayButton = "closeLogOverlayButton"; public const string closeMenuOverlayButton = "closeMenuOverlayButton"; public const string closePlayerSelectOverlayButton = "closePlayerSelectOverlayButton"; public const string closePlaylistChooserDropdownButton = "closePlaylistChooserDropdownButton"; @@ -63,8 +64,12 @@ public static class UxmlNames public const string closeSongOverlayButton = "closeSongOverlayButton"; public const string colorContainer = "colorContainer"; public const string column = "column"; - public const string combineDuetScoresContainer = "combineDuetScoresContainer"; public const string commitHashText = "commitHashText"; + public const string commonScoreContainer = "commonScoreContainer"; + public const string commonScoreContainerBackground = "commonScoreContainerBackground"; + public const string commonScoreIcon = "commonScoreIcon"; + public const string commonScoreLabel = "commonScoreLabel"; + public const string commonScoreSentenceRatingContainer = "commonScoreSentenceRatingContainer"; public const string confirmDeletePlaylistButton = "confirmDeletePlaylistButton"; public const string connectedClientCountLabel = "connectedClientCountLabel"; public const string connectedClientList = "connectedClientList"; @@ -208,6 +213,12 @@ public static class UxmlNames public const string legendInnerContainer = "legendInnerContainer"; public const string lo = "lo"; public const string localHighScoreContainer = "localHighScoreContainer"; + public const string logLevelContainer = "logLevelContainer"; + public const string logLevelItemPicker = "logLevelItemPicker"; + public const string logOverlay = "logOverlay"; + public const string logOverlayButtonRow = "logOverlayButtonRow"; + public const string logPathLabel = "logPathLabel"; + public const string logTextField = "logTextField"; public const string lowerCenterContainer = "lowerCenterContainer"; public const string lyricsArea = "lyricsArea"; public const string lyricsAreaTextField = "lyricsAreaTextField"; @@ -263,8 +274,6 @@ public static class UxmlNames public const string musicVolumeSlider = "musicVolumeSlider"; public const string nameLabel = "nameLabel"; public const string nameTextField = "nameTextField"; - public const string NewVersionAvailableDialog = "NewVersionAvailableDialog"; - public const string newVersionDialogRoot = "newVersionDialogRoot"; public const string nextCharacterButton = "nextCharacterButton"; public const string nextItemButton = "nextItemButton"; public const string nextItemIcon = "nextItemIcon"; @@ -322,9 +331,12 @@ public static class UxmlNames public const string playerImage = "playerImage"; public const string playerInfoContainer = "playerInfoContainer"; public const string playerNameLabel = "playerNameLabel"; + public const string playerScoreContainer = "playerScoreContainer"; + public const string playerScoreLabel = "playerScoreLabel"; public const string playerScrollView = "playerScrollView"; public const string playerSelectOverlay = "playerSelectOverlay"; public const string playerSelectOverlayContainer = "playerSelectOverlayContainer"; + public const string playersIcon = "playersIcon"; public const string playerUi = "playerUi"; public const string PlayerUi = "PlayerUi"; public const string playerUiContainer = "playerUiContainer"; @@ -349,7 +361,6 @@ public static class UxmlNames public const string propertyNameLabel = "propertyNameLabel"; public const string propertyTextField = "propertyTextField"; public const string quitButton = "quitButton"; - public const string ratePlayersContainer = "ratePlayersContainer"; public const string ratingImage = "ratingImage"; public const string ratingLabel = "ratingLabel"; public const string recordedNote = "recordedNote"; @@ -377,9 +388,11 @@ public static class UxmlNames public const string sceneSubtitle = "sceneSubtitle"; public const string sceneTitle = "sceneTitle"; public const string scoreBar = "scoreBar"; - public const string scoreContainer = "scoreContainer"; public const string scoreIcon = "scoreIcon"; public const string scoreLabel = "scoreLabel"; + public const string scoreModeContainer = "scoreModeContainer"; + public const string scoreModeLabel = "scoreModeLabel"; + public const string scoreModePicker = "scoreModePicker"; public const string scoreName = "scoreName"; public const string scoreRow = "scoreRow"; public const string scoreValue = "scoreValue"; @@ -408,6 +421,7 @@ public static class UxmlNames public const string setBpmChangeNoteDurationButton = "setBpmChangeNoteDurationButton"; public const string setBpmKeepNoteDurationButton = "setBpmKeepNoteDurationButton"; public const string settingsButton = "settingsButton"; + public const string settingsIcon = "settingsIcon"; public const string settingsSideBarContainer = "settingsSideBarContainer"; public const string settingsTitle = "settingsTitle"; public const string showBackgroundButton = "showBackgroundButton"; @@ -415,6 +429,7 @@ public static class UxmlNames public const string showControlHintsToggle = "showControlHintsToggle"; public const string showCoverButton = "showCoverButton"; public const string showFpsContainer = "showFpsContainer"; + public const string showLogOverlayButton = "showLogOverlayButton"; public const string showLyricsAreaContainer = "showLyricsAreaContainer"; public const string showLyricsAreaToggle = "showLyricsAreaToggle"; public const string showStatusBarContainer = "showStatusBarContainer"; @@ -425,6 +440,7 @@ public static class UxmlNames public const string showVirtualPianoContainer = "showVirtualPianoContainer"; public const string showVirtualPianoToggle = "showVirtualPianoToggle"; public const string SingingLyricsUi = "SingingLyricsUi"; + public const string singingOptionsScrollView = "singingOptionsScrollView"; public const string singingResultsPlayerUi = "singingResultsPlayerUi"; public const string SingingResultsPlayerUi = "SingingResultsPlayerUi"; public const string SingingResultsPlayerUiAlternative = "SingingResultsPlayerUiAlternative"; @@ -516,6 +532,7 @@ public static class UxmlNames public const string toggleRecordingButton = "toggleRecordingButton"; public const string toggleSettingsButton = "toggleSettingsButton"; public const string toggleSideBarSizeButton = "toggleSideBarSizeButton"; + public const string toggleSingingOptionsButton = "toggleSingingOptionsButton"; public const string toggleSongDetailOverlayButton = "toggleSongDetailOverlayButton"; public const string toggleSongPropertiesButton = "toggleSongPropertiesButton"; public const string topContent = "topContent"; diff --git a/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab b/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab index 89f8389cd..3cfae7276 100644 --- a/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab +++ b/UltraStar Play/Assets/Common/Scene/CommonSceneObjects.prefab @@ -1,5 +1,146 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2765890730502511 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9143355034012100345} + - component: {fileID: 7292282949145755268} + - component: {fileID: 6352508338363783052} + m_Layer: 0 + m_Name: BackgroundMusicControl + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9143355034012100345 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2765890730502511} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8069444317427349030} + m_RootOrder: 26 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &7292282949145755268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2765890730502511} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eadac8c505afd7a4789d617093dc1f6f, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!82 &6352508338363783052 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2765890730502511} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 8300000, guid: 316dc88e9e575a443b59b16467547f89, type: 3} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 --- !u!1 &7677464548257696 GameObject: m_ObjectHideFlags: 0 @@ -499,6 +640,7 @@ Transform: - {fileID: 4093991565477540851} - {fileID: 4725083428892299482} - {fileID: 8570025457633197298} + - {fileID: 9143355034012100345} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -1373,6 +1515,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: focusLastElementIfNothingFocused: 1 + logFocusedVisualElements: 0 --- !u!1 &6117099576249912163 GameObject: m_ObjectHideFlags: 0 diff --git a/UltraStar Play/Assets/Common/Scene/CommonSceneObjectsBinder.cs b/UltraStar Play/Assets/Common/Scene/CommonSceneObjectsBinder.cs index 2303fbe67..23d5906e4 100644 --- a/UltraStar Play/Assets/Common/Scene/CommonSceneObjectsBinder.cs +++ b/UltraStar Play/Assets/Common/Scene/CommonSceneObjectsBinder.cs @@ -27,6 +27,7 @@ public List GetBindings() bb.BindExistingInstance(StatsManager.Instance); bb.BindExistingInstance(CoroutineManager.Instance); bb.BindExistingInstance(InputManager.Instance); + bb.BindExistingInstance(BackgroundMusicManager.Instance); bb.Bind(typeof(UltraStarPlayInputManager)).ToExistingInstance(UltraStarPlayInputManager.Instance); bb.BindExistingInstance(HttpServer.Instance); bb.Bind(typeof(IServerSideConnectRequestManager)).ToExistingInstance(ServerSideConnectRequestManager.Instance); diff --git a/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs b/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs new file mode 100644 index 000000000..2e2d8a18d --- /dev/null +++ b/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs @@ -0,0 +1,10 @@ +using System.Linq; + +public static class ESceneUtils +{ + public static EScene GetSceneByBuildIndex(int buildIndex) + { + return EnumUtils.GetValuesAsList() + .FirstOrDefault(sceneEnum => (int)sceneEnum == buildIndex); + } +} diff --git a/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs.meta b/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs.meta new file mode 100644 index 000000000..b358d8566 --- /dev/null +++ b/UltraStar Play/Assets/Common/Scene/ESceneUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 051154a62dc44c8d9a116ff60e0780d3 +timeCreated: 1655664089 \ No newline at end of file diff --git a/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControllerData.cs b/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControlData.cs similarity index 98% rename from UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControllerData.cs rename to UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControlData.cs index 26f328855..60f521633 100644 --- a/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControllerData.cs +++ b/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControlData.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; [Serializable] -public class PlayerScoreControllerData +public class PlayerScoreControlData { public Dictionary SentenceToSentenceScoreMap { get; set; } = new(); public Dictionary NoteToNoteScoreMap { get; set; } = new(); diff --git a/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControllerData.cs.meta b/UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControlData.cs.meta similarity index 100% rename from UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControllerData.cs.meta rename to UltraStar Play/Assets/Common/Scene/SceneData/PlayerScoreControlData.cs.meta diff --git a/UltraStar Play/Assets/Common/Scene/SceneData/SingSceneData.cs b/UltraStar Play/Assets/Common/Scene/SceneData/SingSceneData.cs index da32de153..72ba87f33 100644 --- a/UltraStar Play/Assets/Common/Scene/SceneData/SingSceneData.cs +++ b/UltraStar Play/Assets/Common/Scene/SceneData/SingSceneData.cs @@ -11,5 +11,5 @@ public class SingSceneData : SceneData public double PositionInSongInMillis { get; set; } public bool IsRestart { get; set; } public int NextBeatToScore { get; set; } - public Dictionary PlayerProfileToScoreDataMap { get; set; } = new(); + public Dictionary PlayerProfileToScoreDataMap { get; set; } = new(); } diff --git a/UltraStar Play/Assets/Common/Scene/SceneData/SingingResultsSceneData.cs b/UltraStar Play/Assets/Common/Scene/SceneData/SingingResultsSceneData.cs index 48e2ab009..87537bed2 100644 --- a/UltraStar Play/Assets/Common/Scene/SceneData/SingingResultsSceneData.cs +++ b/UltraStar Play/Assets/Common/Scene/SceneData/SingingResultsSceneData.cs @@ -8,9 +8,9 @@ public class SingingResultsSceneData : SceneData public int SongDurationInMillis { get; set; } public List PlayerProfiles { get; set; } = new(); public Dictionary PlayerProfileToMicProfileMap { get; set; } = new(); - private readonly Dictionary playerScoreMap = new(); + private readonly Dictionary playerScoreMap = new(); - public void AddPlayerScores(PlayerProfile profile, PlayerScoreControllerData scoreData) + public void AddPlayerScores(PlayerProfile profile, PlayerScoreControlData scoreData) { if (!PlayerProfiles.Contains(profile)) { @@ -19,7 +19,7 @@ public void AddPlayerScores(PlayerProfile profile, PlayerScoreControllerData sco playerScoreMap[profile] = scoreData; } - public PlayerScoreControllerData GetPlayerScores(PlayerProfile playerProfile) + public PlayerScoreControlData GetPlayerScores(PlayerProfile playerProfile) { return playerScoreMap[playerProfile]; } diff --git a/UltraStar Play/Assets/Common/UI/MouseEventScrollControl.cs b/UltraStar Play/Assets/Common/UI/MouseEventScrollControl.cs index 54e80090d..ecf92ab45 100644 --- a/UltraStar Play/Assets/Common/UI/MouseEventScrollControl.cs +++ b/UltraStar Play/Assets/Common/UI/MouseEventScrollControl.cs @@ -69,7 +69,8 @@ private void OnMouseDown(MouseDownEvent evt, ScrollView scrollView) private void OnMouseMove(MouseMoveEvent evt, ScrollView scrollView) { - if (dragging) + if (dragging + && !(uiDocument.rootVisualElement.focusController.focusedElement is TextField)) { Vector2 dragDelta = dragStartPosition - evt.localMousePosition; scrollView.scrollOffset = new Vector2( diff --git a/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls.meta b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls.meta new file mode 100644 index 000000000..47d4b83c2 --- /dev/null +++ b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e9b1c7f4137d401a866e559cd07bb280 +timeCreated: 1655919693 \ No newline at end of file diff --git a/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs new file mode 100644 index 000000000..579803927 --- /dev/null +++ b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs @@ -0,0 +1,9 @@ +public class ScoreModeItemPickerControl : TranslatedLabeledItemPickerControl +{ + public ScoreModeItemPickerControl(ItemPicker itemPicker) + : base(itemPicker, + EnumUtils.GetValuesAsList(), + scoreMode => scoreMode.GetTranslation()) + { + } +} diff --git a/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs.meta b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs.meta new file mode 100644 index 000000000..5e8e77ed1 --- /dev/null +++ b/UltraStar Play/Assets/Common/UI/UltraStarPlayItemPickerControls/ScoreModeItemPickerControl.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 844338d5059f44ac85baaddfd7bb388e +timeCreated: 1655919705 \ No newline at end of file diff --git a/UltraStar Play/Assets/Scenes/About/AboutScene.unity b/UltraStar Play/Assets/Scenes/About/AboutScene.unity index b3841de5b..8a983c79c 100644 --- a/UltraStar Play/Assets/Scenes/About/AboutScene.unity +++ b/UltraStar Play/Assets/Scenes/About/AboutScene.unity @@ -242,6 +242,7 @@ MonoBehaviour: - {fileID: 4900000, guid: 1296d2653c3d32e4a8cd8e99a69ed110, type: 3} - {fileID: 4900000, guid: 670162adbed1add498ccaf0d709abb4d, type: 3} - {fileID: 4900000, guid: c3213bc178de93b4198dd5d230cadd5e, type: 3} + - {fileID: 4900000, guid: fd949de9965211e4d8909c369ae6007f, type: 3} --- !u!1 &1698148302 GameObject: m_ObjectHideFlags: 0 diff --git a/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt b/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt new file mode 100644 index 000000000..503856c84 --- /dev/null +++ b/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt @@ -0,0 +1,10 @@ +The background music that plays in the menu is licensed under the Creative Commons license by-sa 3.0. +(http://creativecommons.org/licenses/by-sa/3.0/) + +Author: +DJad (http://www.jamendo.com/de/artist/DJad) + +Distributed by: +Site: jamendo.com +File: DJad - Walking Alone.mp3 +URL: http://www.jamendo.com/de/track/543970 \ No newline at end of file diff --git a/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt.meta b/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt.meta new file mode 100644 index 000000000..e20256243 --- /dev/null +++ b/UltraStar Play/Assets/Scenes/About/Texts/BackgroundMusicLicense.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fd949de9965211e4d8909c369ae6007f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UltraStar Play/Assets/Scenes/Highscore/HighscoreEntry.uxml b/UltraStar Play/Assets/Scenes/Highscore/HighscoreEntry.uxml index 46a1cd142..0bfe5fab7 100644 --- a/UltraStar Play/Assets/Scenes/Highscore/HighscoreEntry.uxml +++ b/UltraStar Play/Assets/Scenes/Highscore/HighscoreEntry.uxml @@ -3,10 +3,11 @@ - + + - \ No newline at end of file + diff --git a/UltraStar Play/Assets/Scenes/Highscore/HighscoreSceneControl.cs b/UltraStar Play/Assets/Scenes/Highscore/HighscoreSceneControl.cs index c25b3a0a0..62f5d4716 100644 --- a/UltraStar Play/Assets/Scenes/Highscore/HighscoreSceneControl.cs +++ b/UltraStar Play/Assets/Scenes/Highscore/HighscoreSceneControl.cs @@ -114,6 +114,7 @@ private void FillHighscoreEntry(VisualElement highscoreEntry, SongStatistic song highscoreEntry.Q