Пример #1
0
        private List <Db.MiniGameData> PerformSelection_Sequence(Db.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)
            SortedDictionary <float, MiniGameCode> 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)
            List <Db.MiniGameData> minigame_data_list = new List <Db.MiniGameData>();

            foreach (var orderedPair in ordered_minigamecodes)
            {
                var data = dbManager.GetMiniGameDataByCode(orderedPair.Value);
                if (data.Available)
                {
                    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);
        }
Пример #2
0
        public List <Db.MiniGameData> PerformSelection(string playSessionId, int numberToSelect)
        {
            Db.PlaySessionData playSessionData = dbManager.GetPlaySessionDataById(playSessionId);

            List <Db.MiniGameData> selectedMiniGameData = null;

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

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

            return(selectedMiniGameData);
        }
Пример #3
0
        private List <Db.MiniGameData> PerformSelection_Random(Db.PlaySessionData playSessionData, int numberToSelect)
        {
            // Get all minigames ids for the given playsession (from PlaySessionData)
            // ... also, keep the weights around
            Dictionary <MiniGameCode, float> playsession_weights_dict = new Dictionary <MiniGameCode, float>();
            List <string> minigame_id_list = new List <string>();

            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)
            List <Db.MiniGameData> minigame_data_list = dbManager.FindMiniGameData(x => x.Available && minigame_id_list.Contains(x.GetId()));

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

            // Retrieve the current score data (state) for each minigame (from the dynamic DB)
            List <Db.ScoreData> minigame_score_list = dbManager.FindScoreDataByQuery("SELECT * FROM ScoreData WHERE TableName = 'MiniGames'");

            //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
            string debugString = "----- TEACHER: MiniGameSelection ----- \n";

            foreach (var minigame_data in minigame_data_list)
            {
                float cumulativeWeight   = 0;
                var   minigame_scoredata = minigame_score_list.Find(x => x.ElementId == minigame_data.GetId());
                int   daysSinceLastScore = 0;
                if (minigame_scoredata != null)
                {
                    var timespanFromLastScoreToNow = GenericUtilities.GetTimeSpanBetween(minigame_scoredata.LastAccessTimestamp, GenericUtilities.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_playSessionWeight;
                debugString      += " PSw: " + playSessionWeight * ConfigAI.minigame_playSessionWeight + "(" + playSessionWeight + ")";

                // 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_recentPlayWeight;
                debugString      += " RPw: " + recentPlayWeight * ConfigAI.minigame_recentPlayWeight + "(" + recentPlayWeight + ")";

                // Save cumulative weight
                weights_list.Add(cumulativeWeight);
                debugString += " TOTw: " + cumulativeWeight;
                debugString += "\n";
            }
            if (ConfigAI.verboseTeacher)
            {
                UnityEngine.Debug.Log(debugString);
            }


            // 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 N minigames based on these weights
            var selectedMiniGameData = RandomHelper.RouletteSelectNonRepeating(minigame_data_list, weights_list, actualNumberToSelect);

            return(selectedMiniGameData);
        }