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
{