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); }
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(); }
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); } } }
/// <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()); }
/// <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); } }
/// <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()); }
/// <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); }
public Sprite GetDigimonSprite(Digimon digimon, SpriteAction state = SpriteAction.Default) => GetDigimonSprite(digimon.name, state);
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); } } }