diff --git a/PartyModeChallenge/ChallengeRounds.cs b/PartyModeChallenge/ChallengeRounds.cs index 95bf2b98..e9412be6 100644 --- a/PartyModeChallenge/ChallengeRounds.cs +++ b/PartyModeChallenge/ChallengeRounds.cs @@ -9,13 +9,13 @@ namespace Vocaluxe.PartyModes public class ChallengeRounds { private Random _Rand; - private List _Rounds; private int _NumPlayer; + public List Rounds; public ChallengeRounds(int NumRounds, int NumPlayer, int NumPlayerAtOnce) { - _Rounds = new List(); + Rounds = new List(); _Rand = new Random(System.DateTime.Now.Millisecond); if (NumPlayerAtOnce < 1 || NumRounds < 1 || NumPlayer == 0) @@ -29,21 +29,21 @@ namespace Vocaluxe.PartyModes public Combination GetRound(int RoundNr) { - if (RoundNr >= _Rounds.Count || _NumPlayer == 0 || _Rounds.Count == 0) + if (RoundNr >= Rounds.Count || _NumPlayer == 0 || Rounds.Count == 0) return null; - return _Rounds[RoundNr]; + return Rounds[RoundNr]; } private void BuildRounds(int NumRounds, int NumPlayerAtOnce, Random Rand) { Combinations Combinations = new Combinations(_NumPlayer, NumPlayerAtOnce, Rand); - _Rounds.Add(Combinations.GetNextCombination(null)); + Rounds.Add(Combinations.GetNextCombination(null)); for (int i = 1; i < NumRounds; i++) { - _Rounds.Add(Combinations.GetNextCombination(GetPlayerDemand(i))); + Rounds.Add(Combinations.GetNextCombination(GetPlayerDemand(i))); } } @@ -57,7 +57,7 @@ namespace Vocaluxe.PartyModes for (int i = 0; i < RoundIndex; i++) { - foreach (int PlayerIndex in _Rounds[i].Player) + foreach (int PlayerIndex in Rounds[i].Player) { NumPlayed[PlayerIndex]++; } @@ -70,7 +70,7 @@ namespace Vocaluxe.PartyModes max = p; } - int num = _Rounds[0].Player.Count; + int num = Rounds[0].Player.Count; List result = new List(); List other = new List(); List last = new List(); @@ -83,7 +83,7 @@ namespace Vocaluxe.PartyModes { if (RoundIndex > 0) { - if (!_Rounds[RoundIndex - 1].IsAvailable(i)) + if (!Rounds[RoundIndex - 1].IsAvailable(i)) other.Add(i); else last.Add(i); diff --git a/PartyModeChallenge/PartyModeChallenge.cs b/PartyModeChallenge/PartyModeChallenge.cs index c520e6fc..1b412442 100644 --- a/PartyModeChallenge/PartyModeChallenge.cs +++ b/PartyModeChallenge/PartyModeChallenge.cs @@ -24,8 +24,20 @@ namespace Vocaluxe.PartyModes public struct DataToScreenMain { public int CurrentRoundNr; - + public List Combs; + public List ResultTable; } + + public struct ResultTableRow + { + public int PlayerID; + public int NumWon; + public int NumDrawn; + public int NumLost; + public int SumSingPoints; + public int NumGamePoints; + } + #endregion ToScreen #region FromScreen @@ -82,10 +94,21 @@ namespace Vocaluxe.PartyModes public List ProfileIDs; public ChallengeRounds Rounds; + public List ResultTable; public int CurrentRoundNr; } + struct Stats + { + public int ProfileID; + public int SingPoints; + public int GamePoints; + public int Won; + public int Drawn; + public int Lost; + } + private DataToScreenConfig ToScreenConfig; private DataToScreenNames ToScreenNames; private DataToScreenMain ToScreenMain; @@ -126,6 +149,9 @@ namespace Vocaluxe.PartyModes _ScreenSongOptions.Sorting.SongSorting = ESongSorting.TR_CONFIG_FOLDER; _ScreenSongOptions.Sorting.Tabs = EOffOn.TR_CONFIG_ON; + ToScreenMain.ResultTable = new List(); + GameData.ResultTable = new List(); + return true; } @@ -234,7 +260,10 @@ namespace Vocaluxe.PartyModes if (_Screens != null) { GameData.Rounds = new ChallengeRounds(GameData.NumRounds, GameData.NumPlayer, GameData.NumPlayerAtOnce); - GameData.CurrentRoundNr = 0; + GameData.CurrentRoundNr = 1; + ToScreenMain.CurrentRoundNr = 1; + ToScreenMain.Combs = GameData.Rounds.Rounds; + UpdateScores(); Screen.DataToScreen(ToScreenMain); } break; @@ -244,7 +273,13 @@ namespace Vocaluxe.PartyModes case EStage.Singing: _Screens.TryGetValue("PartyScreenChallengeMain", out Screen); if (_Screens != null) + { + UpdateScores(); + ToScreenMain.CurrentRoundNr = GameData.CurrentRoundNr; + ToScreenMain.Combs = GameData.Rounds.Rounds; + Screen.DataToScreen(ToScreenMain); + } break; default: break; @@ -443,5 +478,107 @@ namespace Vocaluxe.PartyModes _ScreenSongOptions.Selection.TeamNames[i] = "foobar"; } } + + private void UpdateScores() + { + if (GameData.ResultTable.Count == 0) + { + for (int i = 0; i < GameData.NumPlayer; i++) + { + ResultTableRow row = new ResultTableRow(); + row.PlayerID = GameData.ProfileIDs[i]; + row.NumWon = 0; + row.NumDrawn = 0; + row.NumLost = 0; + row.SumSingPoints = 0; + row.NumGamePoints = 0; + GameData.ResultTable.Add(row); + } + } + else + { + SPlayer[] results = _Base.Game.GetPlayer(); + if (results == null) + return; + + if (results.Length < GameData.NumPlayerAtOnce) + return; + + List points = GetPointsForPlayer(results); + + for (int i = 0; i < GameData.NumPlayerAtOnce; i++) + { + int index = -1; + for (int j = 0; j < GameData.ResultTable.Count; j++) + { + if (results[i].ProfileID == GameData.ResultTable[i].PlayerID) + { + index = j; + break; + } + } + + if (index != -1) + { + ResultTableRow row = GameData.ResultTable[index]; + + row.NumWon += points[i].Won; + row.NumDrawn += points[i].Drawn; + row.NumLost += points[i].Lost; + row.SumSingPoints += points[i].SingPoints; + row.NumGamePoints += points[i].GamePoints; + + GameData.ResultTable[index] = row; + } + } + } + + + } + + private List GetPointsForPlayer(SPlayer[] Results) + { + List result = new List(); + for(int i = 0; i < GameData.NumPlayerAtOnce; i++) + { + Stats stat = new Stats(); + stat.ProfileID = Results[i].ProfileID; + stat.SingPoints = (int)Results[i].Points; + stat.Won = 0; + stat.Drawn = 0; + stat.Lost = 0; + stat.GamePoints = 0; + result.Add(stat); + } + + result.Sort(delegate(Stats s1, Stats s2) { return s1.SingPoints.CompareTo(s2.SingPoints); }); + + int current = result[result.Count - 1].SingPoints; + int points = result.Count; + + for (int i = result.Count - 1; i >= 0; i--) + { + Stats res = result[i]; + + if (i < result.Count - 1) + { + if (current > res.SingPoints) + { + res.GamePoints = i * 2; + } + else + res.GamePoints = points; + } + else + res.GamePoints = i * 2; + + current = res.SingPoints; + points = res.GamePoints; + + result[i] = res; + } + + return result; + } } } \ No newline at end of file