diff --git a/Vocaluxe/Base/CConfig.cs b/Vocaluxe/Base/CConfig.cs index c1a6bed4..2eed7474 100644 --- a/Vocaluxe/Base/CConfig.cs +++ b/Vocaluxe/Base/CConfig.cs @@ -704,7 +704,7 @@ namespace Vocaluxe.Base /// Parameters public static void LoadCommandLineParams(string[] args) { - var spliterParam = new Regex(@"-{1,2}|\/", RegexOptions.IgnoreCase); + Regex spliterParam = new Regex(@"-{1,2}|\/", RegexOptions.IgnoreCase); //Complete argument string string arguments = args.Aggregate(string.Empty, (current, arg) => current + (arg + " ")); @@ -713,7 +713,7 @@ namespace Vocaluxe.Base foreach (string text in args) { - var spliterVal = new Regex(@"\s", RegexOptions.IgnoreCase); + Regex spliterVal = new Regex(@"\s", RegexOptions.IgnoreCase); //split arg with Spilter-Regex and save in parts string[] parts = spliterVal.Split(text, 2); diff --git a/Vocaluxe/Base/CGame.cs b/Vocaluxe/Base/CGame.cs index f66e0409..a8fdf622 100644 --- a/Vocaluxe/Base/CGame.cs +++ b/Vocaluxe/Base/CGame.cs @@ -274,7 +274,16 @@ namespace Vocaluxe.Base Players[p].NoteDiff = Math.Abs(tone - tonePlayer); bool hit = Players[p].NoteDiff <= (2 - (int)CProfiles.GetDifficulty(Players[p].ProfileID)); - if (hit) + bool alreadySung = false; + if (Players[p].SungLines.Count - 1 == line) + { + if (note < Players[p].SungLines[line].NoteCount) + alreadySung = true; + } + else if (Players[p].SungLines.Count - 1 > line) + alreadySung = true; + + if (hit && !alreadySung) { // valid //CSound.RecordSetTone(p, Tone); @@ -289,8 +298,9 @@ namespace Vocaluxe.Base if (Players[p].SungLines[line].NoteCount > 0) { CSungNote lastNote = Players[p].SungLines[line].LastNote; + if (notes[note].StartBeat == beat || lastNote.EndBeat + 1 != beat || lastNote.Tone != tone || !lastNote.Hit) - Players[p].SungLines[line].AddNote(new CSungNote(beat, 1, tone, notes[note], points)); + Players[p].SungLines[line].AddNote(new CSungNote(beat, 1, tone, notes[note], points, notes[note].NoteType == ENoteType.Golden)); else { Players[p].SungLines[line].IncLastNoteLength(); @@ -298,12 +308,12 @@ namespace Vocaluxe.Base } } else - Players[p].SungLines[line].AddNote(new CSungNote(beat, 1, tone, notes[note], points)); + Players[p].SungLines[line].AddNote(new CSungNote(beat, 1, tone, notes[note], points, notes[note].NoteType == ENoteType.Golden)); Players[p].SungLines[line].LastNote.CheckPerfect(); Players[p].SungLines[line].IsPerfect(lines[line]); } - else + else //if(!alreadySung) { if (Players[p].SungLines[line].NoteCount > 0) { @@ -339,12 +349,122 @@ namespace Vocaluxe.Base double points = CSettings.LinebonusScore * factor * 1f / numLinesWithPoints; Players[p].Points += points; Players[p].PointsLineBonus += points; - Players[p].SungLines[line].BonusPoints = points; + Players[p].SungLines[line].BonusPoints += points; } } } } _OldBeatD = ActBeatD; } + + public static void ResetToLastLine(int soundStream, int vidStream) + { + float[] time = GetLastSungLineStart(); + ResetToTime(time[0], time[1], soundStream, vidStream); + } + + public static void ResetToTime(float time, float nextStart, int soundStream, int vidStream) + { + if (time < 0) + time = 0; + + Beat = GetBeatFromTime(time, GetSong().BPM, GetSong().Gap); + CurrentBeat = (int)Math.Floor(Beat); + + for (int p = 0; p < _NumPlayer; p++) + { + Players[p].Points = 0; + Players[p].PointsGoldenNotes = 0; + Players[p].PointsLineBonus = 0; + int l = 0; + int deleteLine = 0; + foreach (CSungLine line in Players[p].SungLines) + { + int n = -1; + int deleteNote = 0; + Players[p].PointsLineBonus += line.BonusPoints; + foreach (CSungNote note in line.Notes) + { + if (note.StartBeat < nextStart) + { + if (note.GoldenNote) + Players[p].PointsGoldenNotes += note.Points; + Players[p].Points += note.Points; + } + else if(deleteNote != -1) + deleteNote = n; + n++; + } + while (line.NoteCount > n && n >= 0) + { + if (line.Notes[n].GoldenNote) + Players[p].PointsGoldenNotes -= line.Notes[n].Points; + Players[p].Points -= line.Notes[n].Points; + line.DeleteNote(n); + } + + if (line.LastNoteBeat > CurrentBeat && deleteLine == 0) + deleteLine = l; + l++; + } + Players[p].SungLines.RemoveRange(deleteLine, Players[p].SungLines.Count - deleteLine); + } + CSong song = GetSong(); + for (int i = 0; i < GetSong().Notes.Voices[0].Lines.Length; i++) + { + CLog.LogError((i + 1) + ". " + song.Notes.Voices[0].Lines[i].NoteCount + " - " + Players[0].SungLines[i].NoteCount); + } + + CSound.SetPosition(soundStream, time); + CVideo.Skip(vidStream, time, GetSong().VideoGap); + } + + private static float[] GetLastSungLineStart() + { + return GetNoteTimeBeforeBeat(CurrentBeat); + } + + private static float[] GetNoteTimeBeforeBeat(int beat) + { + CSong song = GetSong(); + int StartBeat = (int)Math.Floor(beat - GetBeatFromTime(CSettings.PauseResetTime, song.BPM, 0f)); + int lastStart = 0; + int nextStart = 0; + foreach (CVoice voice in song.Notes.Voices) + { + int lastEnd = 0; + int voiceStart = 0; + int nextStartNote = 0; + foreach (CSongLine line in voice.Lines) + { + foreach (CSongNote note in line.Notes) + { + if (note.StartBeat > StartBeat) + { + nextStartNote = note.StartBeat; + break; + } + else + { + voiceStart = note.StartBeat; + lastEnd = note.EndBeat; + } + } + if (nextStartNote > 0) + break; + } + if (nextStartNote - beat > CSettings.PauseResetTime) + lastStart = beat; + else if (nextStartNote - lastEnd > CSettings.PauseResetTime) + lastStart = nextStartNote - (int)Math.Floor(GetBeatFromTime(CSettings.PauseResetTime, song.BPM, 0f)); + if (voiceStart > lastStart) + { + lastStart = voiceStart; + nextStart = nextStartNote; + } + } + + return new float[]{GetTimeFromBeats(lastStart, GetSong().BPM), nextStart}; + } } } \ No newline at end of file diff --git a/Vocaluxe/Base/CGraphics.cs b/Vocaluxe/Base/CGraphics.cs index 87164ab1..f531a3c7 100644 --- a/Vocaluxe/Base/CGraphics.cs +++ b/Vocaluxe/Base/CGraphics.cs @@ -218,7 +218,7 @@ namespace Vocaluxe.Base if (_Fading) { - var fadeTime = (long)(CConfig.FadeTime * 1000); + long fadeTime = (long)(CConfig.FadeTime * 1000); if ((_FadingTimer.ElapsedMilliseconds < fadeTime) && (CConfig.FadeTime > 0)) { @@ -349,10 +349,10 @@ namespace Vocaluxe.Base #region private stuff private static bool _HandleInputs(CKeys keys, CMouse mouse) { - var keyEvent = new SKeyEvent(); - var mouseEvent = new SMouseEvent(); - var inputKeyEvent = new SKeyEvent(); - var inputMouseEvent = new SMouseEvent(); + SKeyEvent keyEvent = new SKeyEvent(); + SMouseEvent mouseEvent = new SMouseEvent(); + SKeyEvent inputKeyEvent = new SKeyEvent(); + SMouseEvent inputMouseEvent = new SMouseEvent(); bool popupPlayerControlAllowed = _CurrentScreen != EScreens.ScreenOptionsRecord && _CurrentScreen != EScreens.ScreenSing && (_CurrentScreen != EScreens.ScreenSong || @@ -541,8 +541,8 @@ namespace Vocaluxe.Base private static bool _HandleInputThemeEditor(CKeys keys, CMouse mouse) { - var keyEvent = new SKeyEvent(); - var mouseEvent = new SMouseEvent(); + SKeyEvent keyEvent = new SKeyEvent(); + SMouseEvent mouseEvent = new SMouseEvent(); while (keys.PollEvent(ref keyEvent)) { @@ -598,7 +598,7 @@ namespace Vocaluxe.Base if (CConfig.DebugLevel == EDebugLevel.TR_CONFIG_OFF) return; - var debugOutput = new List {CTime.GetFPS().ToString("FPS: 000")}; + List debugOutput = new List {CTime.GetFPS().ToString("FPS: 000")}; if (CConfig.DebugLevel >= EDebugLevel.TR_CONFIG_LEVEL1) { @@ -627,11 +627,11 @@ namespace Vocaluxe.Base CFonts.Style = EStyle.Normal; CFonts.SetFont("Normal"); CFonts.Height = 25; - var gray = new SColorF(1f, 1f, 1f, 0.5f); + SColorF gray = new SColorF(1f, 1f, 1f, 0.5f); float y = 0; foreach (string txt in debugOutput) { - var rect = new RectangleF(CSettings.RenderW - CFonts.GetTextWidth(txt), y, CFonts.GetTextWidth(txt), CFonts.GetTextHeight(txt)); + RectangleF rect = new RectangleF(CSettings.RenderW - CFonts.GetTextWidth(txt), y, CFonts.GetTextWidth(txt), CFonts.GetTextHeight(txt)); CDraw.DrawColor(gray, new SRectF(rect.X, rect.Top, rect.Width, rect.Height, CSettings.ZNear)); CFonts.DrawText(txt, rect.X, rect.Y, CSettings.ZNear); y += rect.Height; diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs index 289bf251..427b79c7 100644 --- a/Vocaluxe/Base/CSettings.cs +++ b/Vocaluxe/Base/CSettings.cs @@ -142,6 +142,7 @@ namespace Vocaluxe.Base public const bool TabNavigation = false; public const float BackgroundMusicFadeTime = 0.5f; + public const float PauseResetTime = 1f; public static readonly List MusicFileTypes = new List { diff --git a/Vocaluxe/Screens/CScreenSing.cs b/Vocaluxe/Screens/CScreenSing.cs index a77c8a6c..093d0f17 100644 --- a/Vocaluxe/Screens/CScreenSing.cs +++ b/Vocaluxe/Screens/CScreenSing.cs @@ -868,6 +868,7 @@ namespace Vocaluxe.Screens } else { + CGame.ResetToLastLine(_CurrentStream, _CurrentVideo); _Buttons[_ButtonCancel].Visible = false; _Buttons[_ButtonContinue].Visible = false; _Buttons[_ButtonSkip].Visible = false; diff --git a/VocaluxeLib/Songs/CSungNote.cs b/VocaluxeLib/Songs/CSungNote.cs index dfb95395..94a7aebe 100644 --- a/VocaluxeLib/Songs/CSungNote.cs +++ b/VocaluxeLib/Songs/CSungNote.cs @@ -43,14 +43,16 @@ namespace VocaluxeLib.Songs /// /// /// - public CSungNote(int startBeat, int duration, int tone, CSongNote hitNote, double points) : this(startBeat, duration, tone) + public CSungNote(int startBeat, int duration, int tone, CSongNote hitNote, double points, bool golden) : this(startBeat, duration, tone) { HitNote = hitNote; Points = points; + GoldenNote = golden; } #region Properties public double Points; + public bool GoldenNote; // for drawing player notes public bool Hit {