diff --git a/Output/Languages/Deutsch.xml b/Output/Languages/Deutsch.xml index e3aac4ae..abae22f4 100644 --- a/Output/Languages/Deutsch.xml +++ b/Output/Languages/Deutsch.xml @@ -23,6 +23,7 @@ Normal Duett Medley + Kurz-Version Vocal Hero Superstar diff --git a/Output/Languages/English.xml b/Output/Languages/English.xml index fb5d72e4..e6a4240f 100644 --- a/Output/Languages/English.xml +++ b/Output/Languages/English.xml @@ -23,6 +23,7 @@ Normal Duet Medley + Short version Vocal Hero Superstar diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs index f0cf4245..54df8b2c 100644 --- a/Vocaluxe/Base/CGame.cs +++ b/Vocaluxe/Base/CGame.cs @@ -112,15 +112,18 @@ namespace Vocaluxe.Base { switch (Mode) { - case EGameMode.Normal: + case EGameMode.TR_GAMEMODE_NORMAL: _GameMode = new CGameModeNormal(); break; - case EGameMode.Medley: + case EGameMode.TR_GAMEMODE_MEDLEY: _GameMode = new CGameModeMedley(); break; - case EGameMode.Duet: + case EGameMode.TR_GAMEMODE_DUET: _GameMode = new CGameModeDuet(); break; + case EGameMode.TR_GAMEMODE_SHORTSONG: + _GameMode = new CGameModeShortSong(); + break; default: break; } diff --git a/Vocaluxe/GameModes/CGameMode.cs b/Vocaluxe/GameModes/CGameMode.cs index b1dede96..2e1fbd2d 100644 --- a/Vocaluxe/GameModes/CGameMode.cs +++ b/Vocaluxe/GameModes/CGameMode.cs @@ -202,7 +202,7 @@ namespace Vocaluxe.GameModes { if (_ActualSong > -1) { - _Points.SetPoints(_ActualSong, _Songs[_ActualSong].ID, Player, _GameMode == EGameMode.Medley, _GameMode == EGameMode.Duet); + _Points.SetPoints(_ActualSong, _Songs[_ActualSong].ID, Player, _GameMode == EGameMode.TR_GAMEMODE_MEDLEY, _GameMode == EGameMode.TR_GAMEMODE_DUET); } _ActualSong++; } diff --git a/Vocaluxe/GameModes/CGameModeDuet.cs b/Vocaluxe/GameModes/CGameModeDuet.cs index cf105151..09f64b95 100644 --- a/Vocaluxe/GameModes/CGameModeDuet.cs +++ b/Vocaluxe/GameModes/CGameModeDuet.cs @@ -10,7 +10,7 @@ namespace Vocaluxe.GameModes { base.Init(); - _GameMode = EGameMode.Duet; + _GameMode = EGameMode.TR_GAMEMODE_DUET; _Initialized = true; } } diff --git a/Vocaluxe/GameModes/CGameModeMedley.cs b/Vocaluxe/GameModes/CGameModeMedley.cs index 7b22f145..7257e86a 100644 --- a/Vocaluxe/GameModes/CGameModeMedley.cs +++ b/Vocaluxe/GameModes/CGameModeMedley.cs @@ -13,7 +13,7 @@ namespace Vocaluxe.GameModes { base.Init(); - _GameMode = EGameMode.Medley; + _GameMode = EGameMode.TR_GAMEMODE_MEDLEY; _Initialized = true; } diff --git a/Vocaluxe/GameModes/CGameModeNormal.cs b/Vocaluxe/GameModes/CGameModeNormal.cs index 6a27341b..008d55cc 100644 --- a/Vocaluxe/GameModes/CGameModeNormal.cs +++ b/Vocaluxe/GameModes/CGameModeNormal.cs @@ -10,7 +10,7 @@ namespace Vocaluxe.GameModes { base.Init(); - _GameMode = EGameMode.Normal; + _GameMode = EGameMode.TR_GAMEMODE_NORMAL; _Initialized = true; } } diff --git a/Vocaluxe/GameModes/CGameModeShortSong.cs b/Vocaluxe/GameModes/CGameModeShortSong.cs new file mode 100644 index 00000000..18027a52 --- /dev/null +++ b/Vocaluxe/GameModes/CGameModeShortSong.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using Vocaluxe.Base; +using Vocaluxe.Lib.Song; + +namespace Vocaluxe.GameModes +{ + class CGameModeShortSong : CGameMode + { + public override void Init() + { + base.Init(); + + _GameMode = EGameMode.TR_GAMEMODE_SHORTSONG; + _Initialized = true; + } + + protected override void SongManipulation(int SongIndex) + { + CSong song = _Songs[SongIndex]; + + song.Finish = CGame.GetTimeFromBeats(song.ShortEnd, song.BPM) + CSettings.DefaultMedleyFadeOutTime + song.Gap; + + // set lines to medley mode + song.Notes.SetMedley(song.Notes.GetLines(0).Line[0].FirstNoteBeat, song.ShortEnd); + } + } +} diff --git a/Vocaluxe/GameModes/IGameMode.cs b/Vocaluxe/GameModes/IGameMode.cs index e7d69afb..3daba3a2 100644 --- a/Vocaluxe/GameModes/IGameMode.cs +++ b/Vocaluxe/GameModes/IGameMode.cs @@ -9,9 +9,10 @@ namespace Vocaluxe.GameModes { public enum EGameMode { - Normal, - Medley, - Duet + TR_GAMEMODE_NORMAL, + TR_GAMEMODE_MEDLEY, + TR_GAMEMODE_DUET, + TR_GAMEMODE_SHORTSONG } interface IGameMode diff --git a/Vocaluxe/Lib/Song/CSong.cs b/Vocaluxe/Lib/Song/CSong.cs index e906c285..bd8a8df5 100644 --- a/Vocaluxe/Lib/Song/CSong.cs +++ b/Vocaluxe/Lib/Song/CSong.cs @@ -59,6 +59,8 @@ namespace Vocaluxe.Lib.Song public bool CalculateMedley = true; public float PreviewStart = 0f; + public int ShortEnd = 0; + public Encoding Encoding = Encoding.Default; public string Folder = String.Empty; public string FolderName = String.Empty; @@ -161,6 +163,8 @@ namespace Vocaluxe.Lib.Song this.CalculateMedley = song.CalculateMedley; this.PreviewStart = song.PreviewStart; + this.ShortEnd = song.ShortEnd; + this.Encoding = song.Encoding; this.Folder = song.Folder; this.FolderName = song.FolderName; @@ -652,6 +656,7 @@ namespace Vocaluxe.Lib.Song return false; } FindRefrain(); + FindShortEnd(); _NotesLoaded = true; return true; @@ -836,5 +841,88 @@ namespace Vocaluxe.Lib.Song this.PreviewStart = CGame.GetTimeFromBeats(this.Medley.StartBeat, this.BPM); } } + + private void FindShortEnd(){ + CLines lines = this.Notes.GetLines(0); + + if (lines.LineCount == 0) + return; + + // build sentences list + List sentences = new List(); + foreach (CLine line in lines.Line) + { + if (line.Points != 0) + sentences.Add(line.Lyrics); + else + sentences.Add(String.Empty); + } + + // find equal sentences series + List series = new List(); + for (int i = 0; i < lines.LineCount - 1; i++) + { + for (int j = i + 1; j < lines.LineCount; j++) + { + if (sentences[i] == sentences[j] && sentences[i] != String.Empty) + { + Series tempSeries = new Series(); + tempSeries.start = i; + tempSeries.end = i; + + int max = 0; + if (j + j - i - 1 > lines.LineCount - 1) + max = lines.LineCount - 1 - j; + else + max = j - i - 1; + + for (int k = 1; k <= max; k++) + { + if (sentences[i + k] == sentences[j + k] && sentences[i + k] != String.Empty) + tempSeries.end = i + k; + else + break; + } + + tempSeries.length = tempSeries.end - tempSeries.start + 1; + series.Add(tempSeries); + } + } + } + + //Calculate length of singing + int stop = (lines.Line[lines.Line.Length - 1].LastNoteBeat - lines.Line[0].FirstNoteBeat) / 2; + + //Check if stop is in series + for (int i = 0; i < series.Count; i++) + { + if (lines.Line[series[i].start].FirstNoteBeat < stop && lines.Line[series[i].end].LastNoteBeat > stop) + { + if (stop < (lines.Line[series[i].start].FirstNoteBeat + ((lines.Line[series[i].end].LastNoteBeat - lines.Line[series[i].start].FirstNoteBeat) / 2))) + { + this.ShortEnd = lines.Line[series[i].start-1].LastNote.EndBeat; + return; + } + else + { + this.ShortEnd = lines.Line[series[i].end].LastNote.EndBeat; + return; + } + } + } + + //Check if stop is in line + for (int i = 0; i < lines.Line.Length; i++) + { + if (lines.Line[i].FirstNoteBeat < stop && lines.Line[i].LastNoteBeat > stop) + { + this.ShortEnd = lines.Line[i].LastNoteBeat; + return; + } + } + + ShortEnd = stop; + + } } } diff --git a/Vocaluxe/Screens/CPopupScreenPlayerControl.cs b/Vocaluxe/Screens/CPopupScreenPlayerControl.cs index 85e1467d..cb21d9d4 100644 --- a/Vocaluxe/Screens/CPopupScreenPlayerControl.cs +++ b/Vocaluxe/Screens/CPopupScreenPlayerControl.cs @@ -214,9 +214,9 @@ namespace Vocaluxe.Screens if (SongNr >= 0 && CSongs.SongsLoaded) { if (Duet) - CGame.SetGameMode(GameModes.EGameMode.Duet); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_DUET); else - CGame.SetGameMode(GameModes.EGameMode.Normal); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL); CGame.Reset(); CGame.ClearSongs(); diff --git a/Vocaluxe/Screens/CScreenHighscore.cs b/Vocaluxe/Screens/CScreenHighscore.cs index 6f499513..78c199fd 100644 --- a/Vocaluxe/Screens/CScreenHighscore.cs +++ b/Vocaluxe/Screens/CScreenHighscore.cs @@ -250,15 +250,15 @@ namespace Vocaluxe.Screens switch (CGame.GameMode) { - case EGameMode.Normal: + case EGameMode.TR_GAMEMODE_NORMAL: Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_NORMAL"; break; - case EGameMode.Medley: + case EGameMode.TR_GAMEMODE_MEDLEY: Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_MEDLEY"; break; - case EGameMode.Duet: + case EGameMode.TR_GAMEMODE_DUET: Texts[htTexts(TextSongMode)].Text = "TR_GAMEMODE_DUET"; _IsDuet = true; break; diff --git a/Vocaluxe/Screens/CScreenSong.cs b/Vocaluxe/Screens/CScreenSong.cs index d8035d7a..4c5427d2 100644 --- a/Vocaluxe/Screens/CScreenSong.cs +++ b/Vocaluxe/Screens/CScreenSong.cs @@ -347,9 +347,9 @@ namespace Vocaluxe.Screens else { if (CSongs.VisibleSongs[SongNr].IsDuet) - CGame.SetGameMode(GameModes.EGameMode.Duet); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_DUET); else - CGame.SetGameMode(GameModes.EGameMode.Normal); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL); } CGame.Reset(); @@ -366,7 +366,7 @@ namespace Vocaluxe.Screens if ((CSongs.Category >= 0) && (SongNr >= 0)) { if (CSongs.VisibleSongs[SongNr].Medley.Source != EMedleySource.None) - CGame.SetGameMode(GameModes.EGameMode.Medley); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_MEDLEY); else return; @@ -382,7 +382,7 @@ namespace Vocaluxe.Screens { CGame.Reset(); CGame.ClearSongs(); - CGame.SetGameMode(GameModes.EGameMode.Normal); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL); List IDs = new List(); for (int i = 0; i < CSongs.AllSongs.Length; i++) @@ -409,7 +409,7 @@ namespace Vocaluxe.Screens { CGame.Reset(); CGame.ClearSongs(); - CGame.SetGameMode(GameModes.EGameMode.Normal); + CGame.SetGameMode(GameModes.EGameMode.TR_GAMEMODE_NORMAL); List IDs = new List(); for (int i = 0; i < CSongs.VisibleSongs.Length; i++) @@ -491,18 +491,20 @@ namespace Vocaluxe.Screens SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Clear(); if (!CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].IsDuet) { - SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Normal)); - _AvailableGameModes.Add(GameModes.EGameMode.Normal); + SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_NORMAL)); + _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_NORMAL); + SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_SHORTSONG)); + _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_SHORTSONG); } if (CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].IsDuet) { - SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Duet)); - _AvailableGameModes.Add(GameModes.EGameMode.Duet); + SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_DUET)); + _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_DUET); } if (CSongs.VisibleSongs[SongMenus[htSongMenus(SongMenu)].GetSelectedSong()].Medley.Source != EMedleySource.None) { - SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.Medley)); - _AvailableGameModes.Add(GameModes.EGameMode.Medley); + SelectSlides[htSelectSlides(SelectSlideOptionsMode)].AddValue(Enum.GetName(typeof(GameModes.EGameMode), GameModes.EGameMode.TR_GAMEMODE_MEDLEY)); + _AvailableGameModes.Add(GameModes.EGameMode.TR_GAMEMODE_MEDLEY); } SelectSlides[htSelectSlides(SelectSlideOptionsMode)].Visible = true; Buttons[htButtons(ButtonOptionsClose)].Visible = true; diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index e8282b61..7dfc6eea 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -135,6 +135,7 @@ + Form