public void ExtractPlaySessionsDataTest()
        {
            playsessions.Clear();
            ps1.BoardGame = catan;
            playsessions.Add(ps1);
            participants.Clear();
            participants.Add(par1);
            participants.Add(par2);
            players.Clear();
            players.Add(peter);
            players.Add(will);
            List <playerSearch> newParticipants = new List <playerSearch>();
            var playerSearch1 = new playerSearch(peter.Id, peter.Name);

            playerSearch1.Winner = true;
            playerSearch1.Team   = 1;
            var playerSearch2 = new playerSearch(will.Id, will.Name);

            playerSearch2.Winner = true;
            playerSearch2.Team   = 2;
            newParticipants.Add(playerSearch1);
            newParticipants.Add(playerSearch2);

            List <PlaySessionData> testPSD = new List <PlaySessionData>();
            var sample = new PlaySessionData(catan, newParticipants, TimeSpan.Zero, new DateTime(2017, 11, 15, 9, 30, 00).ToString());
            List <playerSearch> team1Members = new List <playerSearch>();

            team1Members.Add(playerSearch1);
            var team1 = new Team();

            team1.Name      = 1;
            team1.Name      = 1;
            team1.TeamMates = team1Members;
            team1.Winner    = true;
            sample.Teams    = new List <Team>();
            sample.Teams.Add(team1);
            List <playerSearch> team2Members = new List <playerSearch>();

            team2Members.Add(playerSearch2);
            var team2 = new Team();

            team2.Name      = 2;
            team2.TeamMates = team2Members;
            team2.Winner    = false;
            sample.Teams.Add(team2);
            testPSD.Add(sample);
            //heres the method
            List <PlaySessionData> returned = p.ExtractPlaySessionsData(playsessions, playerSearch1);

            //testPSD.ForEach(TestContext.WriteLine);
            TestContext.WriteLine(testPSD[0].BoardGame.Name.ToString());
            //returned.ForEach(TestContext.WriteLine);
            TestContext.WriteLine(returned[0].BoardGame.Name.ToString());
            var testLikeness = new Likeness <List <PlaySessionData>, List <PlaySessionData> >(testPSD);

            Assert.AreEqual(testLikeness, returned);
        }
Exemple #2
0
 public bool CanMiniGameBePlayedAtPlaySession(PlaySessionData psData, MiniGameCode code)
 {
     if (psData != null)
     {
         var mgIndex = psData.Minigames.ToList().FindIndex(x => x.MiniGameCode == code);
         if (mgIndex >= 0)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #3
0
        private List <MiniGameData> PerformSelection_Sequence(PlaySessionData playSessionData, int numberToSelect)
        {
            // Get all minigame codes for the given playsession
            // ... also, use the weights to determine insertion order (used to determine the sequential order)
            var ordered_minigamecodes = new SortedDictionary <float, MiniGameCode>();
            int fakeNumber            = 1000;

            foreach (var minigameInPlaySession in playSessionData.Minigames)
            {
                if (ordered_minigamecodes.ContainsKey(minigameInPlaySession.Weight))
                {
                    ordered_minigamecodes[fakeNumber] = minigameInPlaySession.MiniGameCode;
                    fakeNumber++;
                }
                else
                {
                    ordered_minigamecodes[minigameInPlaySession.Weight] = minigameInPlaySession.MiniGameCode;
                }
            }

            // Get, in order, each minigame data, filter by availability (from the static DB)
            var minigame_data_list = new List <MiniGameData>();

            foreach (var orderedPair in ordered_minigamecodes)
            {
                var data = dbManager.GetMiniGameDataByCode(orderedPair.Value);
                if (data.Active)
                {
                    minigame_data_list.Add(data);
                }
            }

            // Number checks
            int actualNumberToSelect = UnityEngine.Mathf.Min(numberToSelect, minigame_data_list.Count);

            if (minigame_data_list.Count == 0)
            {
                throw new System.Exception("Cannot find even a single minigame for play session " + playSessionData.Id);
            }
            if (numberToSelect > minigame_data_list.Count)
            {
                UnityEngine.Debug.LogWarning("Could not select the requested number of " + numberToSelect + " minigames for play session " + playSessionData.Id + " (only " + minigame_data_list.Count + " are available)");
            }

            // Choose the first N minigames in the ordered list
            var selectedMiniGameData = minigame_data_list.GetRange(0, actualNumberToSelect);

            return(selectedMiniGameData);
        }
Exemple #4
0
        private string[] GetAllLetterIdsFromPreviousPlaySessions(PlaySessionData current_ps)
        {
            // @note: this assumes that all play sessions are correctly ordered
            var all_ps_list = dbManager.GetAllPlaySessionData();
            int current_id  = all_ps_list.IndexOf(current_ps);

            List <string> all_ids = new List <string>();

            for (int prev_id = 0; prev_id < current_id; prev_id++)
            {
                all_ids.AddRange(all_ps_list[prev_id].Letters);
            }

            return(all_ids.ToArray());
        }
Exemple #5
0
        public List <MiniGameData> PerformSelection(string playSessionId, int numberToSelect)
        {
            PlaySessionData playSessionData = dbManager.GetPlaySessionDataById(playSessionId);

            List <MiniGameData> selectedMiniGameData = null;

            switch (playSessionData.Order)
            {
            case PlaySessionDataOrder.Sequence:
                selectedMiniGameData = PerformSelection_Sequence(playSessionData, numberToSelect);
                break;

            case PlaySessionDataOrder.Random:
                selectedMiniGameData = PerformSelection_Random(playSessionData, numberToSelect);
                break;
            }

            return(selectedMiniGameData);
        }
Exemple #6
0
 public PlaySessionState(PlaySessionData _psData, JourneyScoreData _scoreData)
 {
     this.psData    = _psData;
     this.scoreData = _scoreData;
 }
Exemple #7
0
        private List <MiniGameData> PerformSelection_Random(PlaySessionData playSessionData, int numberToSelect)
        {
            // Get all minigames ids for the given playsession (from PlaySessionData)
            // ... also, keep the weights around
            var minigame_id_list         = new List <string>();
            var playsession_weights_dict = new Dictionary <MiniGameCode, float>();

            foreach (var minigameInPlaySession in playSessionData.Minigames)
            {
                minigame_id_list.Add(minigameInPlaySession.MiniGameCode.ToString());
                playsession_weights_dict[minigameInPlaySession.MiniGameCode] = minigameInPlaySession.Weight;
            }

            // Get all minigame data, filter by availability (from the static DB)
            var minigame_data_list = dbManager.FindMiniGameData(x => x.Active && minigame_id_list.Contains(x.GetId()));

            // Create the weights list too
            var weights_list = new List <float>(minigame_data_list.Count);

            // Retrieve the current score data (state) for each minigame (from the dynamic DB)
            var minigame_score_list = dbManager.Query <MiniGameScoreData>("SELECT * FROM " + typeof(MiniGameScoreData).Name);

            //UnityEngine.Debug.Log("M GAME SCORE LIST: " + minigame_score_list.Count);
            //foreach(var l in minigame_score_list) UnityEngine.Debug.Log(l.ElementId);

            // Determine the final weight for each minigame
            var required_minigames = new List <MiniGameData>();

            string debugString = ConfigAI.FormatTeacherReportHeader("Minigame Selection");

            foreach (var minigame_data in minigame_data_list)
            {
                float cumulativeWeight   = 0;
                var   minigame_scoredata = minigame_score_list.Find(x => x.MiniGameCode == minigame_data.Code);
                int   daysSinceLastScore = 0;
                if (minigame_scoredata != null)
                {
                    var timespanFromLastScoreToNow = GenericHelper.GetTimeSpanBetween(minigame_scoredata.UpdateTimestamp, GenericHelper.GetTimestampForNow());
                    daysSinceLastScore = timespanFromLastScoreToNow.Days;
                }
                debugString += minigame_data.Code + " --- \t";

                // PlaySession Weight [0,1]
                float playSessionWeight = playsession_weights_dict[minigame_data.Code] / 100f; //  [0-100]
                cumulativeWeight += playSessionWeight * ConfigAI.MiniGame_PlaySession_Weight;
                debugString      += " PSw: " + playSessionWeight * ConfigAI.MiniGame_PlaySession_Weight + "(" + playSessionWeight + ")";

                // Some minigames are required to appear (weight 100+)
                if (playsession_weights_dict[minigame_data.Code] >= 100)
                {
                    required_minigames.Add(minigame_data);
                    debugString += " REQUIRED!\n";
                    continue;
                }

                // RecentPlay Weight  [1,0]
                const float dayLinerWeightDecrease = 1f / ConfigAI.DaysForMaximumRecentPlayMalus;
                float       weightMalus            = daysSinceLastScore * dayLinerWeightDecrease;
                float       recentPlayWeight       = 1f - UnityEngine.Mathf.Min(1, weightMalus);
                cumulativeWeight += recentPlayWeight * ConfigAI.MiniGame_RecentPlay_Weight;
                debugString      += " RPw: " + recentPlayWeight * ConfigAI.MiniGame_RecentPlay_Weight + "(" + recentPlayWeight + ")";

                // Save cumulative weight
                weights_list.Add(cumulativeWeight);
                debugString += " TOTw: " + cumulativeWeight + "\n";
            }
            if (ConfigAI.VerboseMinigameSelection)
            {
                ConfigAI.AppendToTeacherReport(debugString);
            }

            // Number checks
            int actualNumberToSelect = UnityEngine.Mathf.Min(numberToSelect, minigame_data_list.Count);

            // Remove the required ones
            actualNumberToSelect -= required_minigames.Count;
            foreach (var requiredMinigame in required_minigames)
            {
                minigame_data_list.Remove(requiredMinigame);
            }

            if (actualNumberToSelect > 0 && minigame_data_list.Count == 0)
            {
                throw new System.Exception("Cannot find even a single minigame for play session " + playSessionData.Id);
            }

            if (actualNumberToSelect > minigame_data_list.Count)
            {
                UnityEngine.Debug.LogWarning("Could not select the requested number of " + numberToSelect + " minigames for play session " + playSessionData.Id + " (only " + minigame_data_list.Count + " are available)");
            }

            // Choose N minigames based on these weights
            var selectedMiniGameData = RandomHelper.RouletteSelectNonRepeating(minigame_data_list, weights_list, actualNumberToSelect);

            // Output
            var finalList = new List <MiniGameData>();

            finalList.AddRange(required_minigames);
            finalList.AddRange(selectedMiniGameData);

            return(finalList);
        }
        public void AnalyzePlayStats()
        {
            playsessions.Clear();
            ps1.BoardGame = catan;
            playsessions.Add(ps1);
            participants.Clear();
            participants.Add(par1);
            participants.Add(par2);
            players.Clear();
            players.Add(peter);
            players.Add(will);
            List <playerSearch> newParticipants = new List <playerSearch>();
            var playerSearch1 = new playerSearch(peter.Id, peter.Name);

            playerSearch1.Winner = true;
            playerSearch1.Team   = 1;
            var playerSearch2 = new playerSearch(will.Id, will.Name);

            playerSearch2.Winner = true;
            playerSearch2.Team   = 2;
            newParticipants.Add(playerSearch1);
            newParticipants.Add(playerSearch2);
            List <PlaySessionData> testPSD = new List <PlaySessionData>();
            var sample = new PlaySessionData(catan, newParticipants, TimeSpan.Zero, new DateTime(2017, 11, 15, 9, 30, 00).ToString());
            List <playerSearch> team1Members = new List <playerSearch>();

            team1Members.Add(playerSearch1);
            var team1 = new Team();

            team1.Name      = 1;
            team1.Name      = 1;
            team1.TeamMates = team1Members;
            team1.Winner    = true;
            sample.Teams    = new List <Team>();
            sample.Teams.Add(team1);
            List <playerSearch> team2Members = new List <playerSearch>();

            team2Members.Add(playerSearch2);
            var team2 = new Team();

            team2.Name      = 2;
            team2.TeamMates = team2Members;
            team2.Winner    = false;
            sample.Teams.Add(team2);
            testPSD.Add(sample);
            var         testlist  = new List <PlayerStats>();
            PlayerStats willstats = new PlayerStats(will.Id, will.Name);

            willstats.Plays = 1;
            //willstats.Wins = 1;
            willstats.OpponentWin = 1;
            testlist.Add(willstats);
            var results          = StatsCtrl.AnalyzePlayStats(testPSD, playerSearch1);
            var testlistlikeness = new Likeness <List <PlayerStats>, List <PlayerStats> >(testlist);
            //Assert.AreEqual(results.AshamedLosers, new List<PlayerStats>());
            //Assert.AreEqual(results.CourageousAllies, new List<PlayerStats>());
            //Assert.AreEqual(results.FrailAllies, new List<PlayerStats>());
            //Assert.AreEqual(results.TieGuys, new List<PlayerStats>());
            //Assert.AreEqual(results.Conqueror, new List<PlayerStats>());
            //Assert.AreEqual(results.DastardlyVillan, new List<PlayerStats>());
            //Assert.AreEqual( testlistlikeness, results.Buddies);
            //Assert.AreEqual(testlistlikeness, results.CowardlyVillan);
            //Assert.AreEqual(testlistlikeness, results.Fodder);
        }
Exemple #9
0
 public void RegisterSessionStar(string gameName, string levelOrMode)
 {
     currentData           = new PlaySessionData();
     currentData.GameMode  = levelOrMode;
     currentData.StartTime = DateTime.Now;
 }