예제 #1
0
        private string GenerateLevelEmulation()
        {
            string filePath = GetFolderPath(SpecialFolder.MyDocuments) + @"\dtector_level_emulation.txt";

            using (StreamWriter file = new StreamWriter(filePath)) {
                file.WriteLine("Enemy\tLevel\tVictoryExp\tPercTotal\tDefeatExp\tPercTotal");
                for (int level = 1; level < 100; level++)
                {
                    int expThisLevel = (int)Mathf.Pow(level, 3);
                    int expNeeded    = (int)Mathf.Pow(level + 1, 3) - expThisLevel;
                    file.WriteLine($"==== LEVEL {level} ====");
                    file.WriteLine($"base exp: {expThisLevel}. Next level at: {expNeeded}");
                    for (int i = 0; i < 10; i++)
                    {
                        Digimon d = Database.GetRandomDigimonForBattle(level);
                        if (d == null)
                        {
                            file.WriteLine($"Digimon not found.");
                        }
                        else
                        {
                            uint victoryExp = gm.logicMgr.GetExperienceGained(level, d.baseLevel);
                            uint defeatExp  = gm.logicMgr.GetExperienceGained(d.baseLevel, level);
                            file.WriteLine($"{d.name}\t{d.baseLevel}\t{victoryExp}\t{victoryExp / (float)expNeeded}\t{defeatExp}\t{defeatExp / (float)expNeeded}");
                        }
                    }
                }
            }
            return(filePath);
        }
예제 #2
0
        public void CallRandomBattle(bool reduceDistance)
        {
            currentScreen = Screen.App;
            Digimon randomDigimon = Database.GetRandomDigimonForBattle(GetPlayerLevel());

            loadedApp = gm.appLoader.LoadApp <Battle>(App.Battle, this).Initialize(randomDigimon.name, reduceDistance);
            loadedApp.StartApp();
        }
예제 #3
0
        private string GenerateAttackEmulation()
        {
            int energy = 0, crush = 0, ability = 0, invalid = 0;

            System.Random enemyAttackRNG;

            for (int level = 1; level < 100; level++)
            {
                Digimon d = Database.GetRandomDigimonForBattle(level);
                if (d == null)
                {
                    continue;
                }
                enemyAttackRNG = new System.Random(gm.GetRandomSavedSeed());
                for (int i = 0; i < 10; i++)
                {
                    int attack = ChooseEnemyAttack(d.GetRegularStats());
                    if (attack == 0)
                    {
                        energy++;
                    }
                    else if (attack == 1)
                    {
                        crush++;
                    }
                    else if (attack == 2)
                    {
                        ability++;
                    }
                    else
                    {
                        invalid++;
                    }
                }
            }

            return($"En: {energy}, Cr: {crush}, Ab: {ability}, Invalid {invalid} <= This should be 0.");

            int ChooseEnemyAttack(MutableCombatStats enemyStats)
            {
                int total     = enemyStats.EN + enemyStats.CR + enemyStats.AB;
                int rngNumber = enemyAttackRNG.Next(total);

                if (rngNumber < enemyStats.EN)
                {
                    return(0);
                }
                else if (rngNumber < enemyStats.EN + enemyStats.CR)
                {
                    return(1);
                }
                else
                {
                    return(2);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Returns all Digimon of the given rarity, with level no higher than the level specified.
        /// </summary>
        /// <returns></returns>
        public static Digimon[] GetAllDigimonOfRarity(Rarity rarity, int maximumLevel)
        {
            List <Digimon> candidates = new List <Digimon>();

            foreach (DigimonRarity r in Rarities)
            {
                if (r.Rarity == rarity)
                {
                    Digimon digimon = GetDigimon(r.digimon);
                    if (digimon.baseLevel <= maximumLevel)
                    {
                        candidates.Add(digimon);
                    }
                }
            }

            return(candidates.ToArray());
        }
예제 #5
0
        /// <summary>
        /// Returns the chance that this Digimon will be erased, based on its rarity.
        /// </summary>
        public static float GetEraseChance(string digimon)
        {
            //You can't lose Default digimons.
            if (digimon == Constants.DEFAULT_DIGIMON.ToLower() ||
                digimon == Constants.DEFAULT_SPIRIT_DIGIMON.ToLower())
            {
                return(0f);
            }

            Rarity rarity = GetDigimonRarity(digimon);

            switch (rarity)
            {
            case Rarity.Common: return(0.75f);

            case Rarity.Rare: return(0.50f);

            case Rarity.Epic: return(0.25f);

            case Rarity.Legendary: return(0.10f);

            case Rarity.Boss:
                Digimon d = GetDigimon(digimon);
                if (d.stage == Stage.Spirit)
                {
                    if (d.spiritType == SpiritType.Human || d.spiritType == SpiritType.Animal)
                    {
                        return(0.50f);
                    }
                    else
                    {
                        return(0f);
                    }
                }
                else
                {
                    return(0.10f);
                }

            case Rarity.none: return(0f);

            default: return(0f);
            }
        }
예제 #6
0
        /// <summary>
        /// Loads all the Digimon that are not marked as "disabled" from the json database.
        /// </summary>
        private static Digimon[] LoadDigimonFromFile()
        {
            string digimonDBJson = ((TextAsset)Resources.Load("digimonDB")).text;
            JArray dbArray       = JArray.Parse(digimonDBJson);

            List <Digimon> tempList = new List <Digimon>();

            for (int i = 0; i < dbArray.Count; i++)
            {
                Digimon d = dbArray[i].ToObject <Digimon>();

                if (!d.disabled)
                {
                    tempList.Add(d);
                }
            }

            return(tempList.ToArray());
        }
예제 #7
0
        /// <summary>
        /// Gets a digimon at random from those in the database that can be chosen for a random battle.
        /// The level of the Digimon will be similar to the level of the player.
        /// </summary>
        /// <param name="playerLevel">The level of the player.</param>
        public static Digimon GetRandomDigimonForBattle(int playerLevel)
        {
            List <string> candidates  = new List <string>();
            List <float>  weightList  = new List <float>();
            float         totalWeight = 0f;

            int threshold; //The maximum level difference between the player and the chosen digimon.

            if (playerLevel <= 2)
            {
                threshold = 3;
            }
            else if (playerLevel <= 4)
            {
                threshold = 4;
            }
            else if (playerLevel <= 10)
            {
                threshold = 7;
            }
            else if (playerLevel <= 60)
            {
                threshold = 10;
            }
            else if (playerLevel <= 80)
            {
                threshold = 20;
            }
            else
            {
                threshold = 40;
            }

            //Populate the 'candidates' list with all eligible digimon, and store their individual weights and the total weight.
            foreach (DigimonRarity r in Rarities)
            {
                if (r.EligibleForBattle)
                {
                    Digimon thisDigimon = GetDigimon(r.digimon);
                    if (thisDigimon != null || thisDigimon.disabled)
                    {
                        if (thisDigimon.baseLevel > (playerLevel - threshold) && //The digimon's level is higher than the minimum.
                            thisDigimon.baseLevel < (playerLevel + threshold))    //And lower than the maximum.
                        {
                            candidates.Add(r.digimon);

                            float baseWeight = 0f;
                            switch (r.Rarity)
                            {
                            case Rarity.Common:
                                baseWeight = 10f;
                                break;

                            case Rarity.Rare:
                                baseWeight = 6f;
                                break;

                            case Rarity.Epic:
                                baseWeight = 3f;
                                break;

                            case Rarity.Legendary:
                                baseWeight = 1f;
                                break;
                            }

                            float thisWeight = (1.1f - (Mathf.Abs(playerLevel - thisDigimon.baseLevel) / (float)threshold)) * baseWeight;
                            weightList.Add(thisWeight);
                            totalWeight += thisWeight;
                        }
                    }
                }
            }

            float fChosen   = Random.Range(0, totalWeight);
            float weightSum = 0f;

            VisualDebug.WriteLine($"Weighted Digimon: candidates found: {candidates.Count} fChosen: {fChosen}, totalWeight: {totalWeight}");

            for (int i = 0; i < weightList.Count; i++)
            {
                weightSum += weightList[i];
                if (weightSum > fChosen)
                {
                    return(GetDigimon(candidates[i]));
                }
            }

            return(null);
        }
예제 #8
0
 public Sprite GetDigimonSprite(Digimon digimon, SpriteAction state = SpriteAction.Default) => GetDigimonSprite(digimon.name, state);
예제 #9
0
        private string GenerateAttackEmulationForDigimon(string digimon)
        {
            int energy = 0, crush = 0, ability = 0, invalid = 0;

            System.Random enemyAttackRNG;

            for (int attempt = 1; attempt < 50; attempt++)
            {
                Digimon d = Database.GetDigimon(digimon);
                if (d == null)
                {
                    continue;
                }
                enemyAttackRNG = new System.Random(gm.GetRandomSavedSeed());
                Debug.Log($"Attack selected: {enemyAttackRNG}");
                for (int i = 0; i < 20; i++)
                {
                    int attack = ChooseEnemyAttack(d.GetRegularStats());
                    Debug.Log($"Attack selected: {attack}");
                    if (attack == 0)
                    {
                        energy++;
                    }
                    else if (attack == 1)
                    {
                        crush++;
                    }
                    else if (attack == 2)
                    {
                        ability++;
                    }
                    else
                    {
                        invalid++;
                    }
                }
            }

            return($"En: {energy}, Cr: {crush}, Ab: {ability}, Invalid {invalid} <= This should be 0.");

            int ChooseEnemyAttack(MutableCombatStats enemyStats)
            {
                int total = enemyStats.EN + enemyStats.CR + enemyStats.AB;

                Debug.Log($"EN {enemyStats.EN}, CR: {enemyStats.CR}, AB: {enemyStats.AB}, total {total}");
                int rngNumber = enemyAttackRNG.Next(total);

                Debug.Log($"Number chosen: {rngNumber}");

                if (rngNumber < enemyStats.EN)
                {
                    return(0);
                }
                else if (rngNumber < enemyStats.EN + enemyStats.CR)
                {
                    return(1);
                }
                else
                {
                    return(2);
                }
            }
        }