Example #1
0
        public void RandomizeStaticPokemon(bool legendForLegend)
        {
            //  Load
            var currentStaticPokemon = RomHandler.StaticPokemon;

            if (legendForLegend)
            {
                var legendariesLeft = ValidPokemons.ToList();
                var nonlegsLeft     = ValidPokemons.ToList();
                legendariesLeft.RemoveAll(p => !p.Legendary);
                nonlegsLeft.RemoveAll(p => p.Legendary);

                for (var i = 0; i < currentStaticPokemon.Length; ++i)
                {
                    if (currentStaticPokemon[i].Legendary)
                    {
                        var num = Random.Next(legendariesLeft.Count);
                        currentStaticPokemon[i] = legendariesLeft[num];
                        legendariesLeft.RemoveAt(num);

                        if (legendariesLeft.Count != 0)
                        {
                            continue;
                        }

                        legendariesLeft.AddRange(ValidPokemons.Where(p => p.Legendary));
                    }
                    else
                    {
                        var num = Random.Next(nonlegsLeft.Count);
                        currentStaticPokemon[i] = nonlegsLeft[num];
                        nonlegsLeft.RemoveAt(num);

                        if (nonlegsLeft.Count != 0)
                        {
                            continue;
                        }

                        nonlegsLeft.AddRange(ValidPokemons.Where(p => !p.Legendary));
                    }
                }
            }
            else
            {
                var pokemonLeft = ValidPokemons.ToList();
                for (var i = 0; i < currentStaticPokemon.Length; i++)
                {
                    var num = Random.Next(pokemonLeft.Count);

                    currentStaticPokemon[i] = pokemonLeft[num];
                    pokemonLeft.RemoveAt(num);

                    if (pokemonLeft.Count == 0)
                    {
                        pokemonLeft.AddRange(ValidPokemons);
                    }
                }
            }
        }
Example #2
0
 private List <Pokemon> PokemonOfType(Typing type, bool noLegendaries)
 {
     return(ValidPokemons
            .Where(
                pk => pk != null &&
                (!noLegendaries || !pk.Legendary) &&
                (pk.PrimaryType == type || pk.SecondaryType == type))
            .ToList());
 }
        public Pokemon Random2EvosPokemon()
        {
            var twoEvoPokes =
                ValidPokemons
                .Where(
                    pk => pk.EvolutionsTo.Count == 0 &&
                    pk.EvolutionsFrom.Any(ev => ev.To.EvolutionsFrom.Count > 0))
                .ToArray();

            return(twoEvoPokes[Random.Next(twoEvoPokes.Length)]);
        }
Example #4
0
        public void Area1To1Encounters(
            bool useTimeOfDay,
            bool catchEmAll,
            bool typeThemed,
            bool usePowerLevels,
            bool noLegendaries)
        {
            var pickFrom   = noLegendaries ? ValidPokemons.Where(p => !p.Legendary) : ValidPokemons;
            var enumerable = pickFrom as Pokemon[] ?? pickFrom.ToArray();

            //  New: randomize the order encounter sets are randomized in.
            //  Leads to less predictable results for various modifiers.
            //  Need to keep the original ordering around for saving though.
            var scrambledEncounters = new List <EncounterSet>(RomHandler.Encounters);

            scrambledEncounters.Shuffle(Random);

            //  Assume EITHER catch em all OR type themed for now
            if (catchEmAll)
            {
                var allPokes = enumerable.ToList();

                foreach (var area in scrambledEncounters)
                {
                    //  Poke-set
                    var inArea = PokemonInArea(area);
                    //  Build area map using catch em all
                    var areaMap         = new Dictionary <Pokemon, Pokemon>();
                    var pickablePokemon = allPokes;
                    if (area.BannedPokemon.Count > 0)
                    {
                        pickablePokemon = new List <Pokemon>(allPokes);
                        pickablePokemon.RemoveAll(area.BannedPokemon.Contains);
                    }

                    foreach (var areaPk in inArea)
                    {
                        if (pickablePokemon.Count == 0)
                        {
                            //  No more pickable pokes left, take a random one
                            var tempPickable = enumerable.ToList();
                            tempPickable.RemoveAll(area.BannedPokemon.Contains);

                            if (tempPickable.Count == 0)
                            {
                                throw new NotImplementedException("ERROR: Couldn\'t replace a wild Pokemon!");
                            }

                            var picked   = Random.Next(tempPickable.Count);
                            var pickedMn = tempPickable[picked];
                            areaMap[areaPk] = pickedMn;
                        }
                        else
                        {
                            var picked   = Random.Next(allPokes.Count);
                            var pickedMn = allPokes[picked];
                            areaMap[areaPk] = pickedMn;
                            pickablePokemon.Remove(pickedMn);
                            if (allPokes != pickablePokemon)
                            {
                                allPokes.Remove(pickedMn);
                            }

                            if (allPokes.Count != 0)
                            {
                                continue;
                            }

                            allPokes.AddRange(enumerable);

                            if (pickablePokemon == allPokes)
                            {
                                continue;
                            }

                            pickablePokemon.AddRange(allPokes);
                            pickablePokemon.RemoveAll(area.BannedPokemon.Contains);
                        }
                    }

                    //  Apply the map
                    foreach (var enc in area.Encounters)
                    {
                        enc.Pokemon1 = areaMap[enc.Pokemon1];
                    }
                }
            }
            else if (typeThemed)
            {
                var cachedPokeLists = new Dictionary <Typing, List <Pokemon> >();
                foreach (var area in scrambledEncounters)
                {
                    //  Poke-set
                    var            inArea          = PokemonInArea(area);
                    List <Pokemon> possiblePokemon = null;
                    var            iterLoops       = 0;
                    while (possiblePokemon == null &&
                           iterLoops < 10000)
                    {
                        var areaTheme = RandomType();
                        if (!cachedPokeLists.ContainsKey(areaTheme))
                        {
                            var pType = PokemonOfType(areaTheme, noLegendaries);
                            cachedPokeLists[areaTheme] = pType;
                        }

                        possiblePokemon = new List <Pokemon>(cachedPokeLists[areaTheme]);
                        if (area.BannedPokemon.Count > 0)
                        {
                            possiblePokemon.RemoveAll(area.BannedPokemon.Contains);
                        }

                        if (possiblePokemon.Count < inArea.Count)
                        {
                            possiblePokemon = null;
                        }

                        iterLoops++;
                    }

                    if (possiblePokemon == null)
                    {
                        throw new NotImplementedException(
                                  "Could not randomize an area in a reasonable amount of attempts.");
                    }

                    //  Build area map using type theme.
                    var areaMap = new Dictionary <Pokemon, Pokemon>();
                    foreach (var areaPk in inArea)
                    {
                        var picked   = Random.Next(possiblePokemon.Count);
                        var pickedMn = possiblePokemon[picked];
                        areaMap[areaPk] = pickedMn;
                        possiblePokemon.RemoveAt(picked);
                    }

                    foreach (var enc in area.Encounters)
                    {
                        //  Apply the map
                        enc.Pokemon1 = areaMap[enc.Pokemon1];
                    }
                }
            }
            else if (usePowerLevels)
            {
                var allowedPokes = enumerable.ToList();
                foreach (var area in scrambledEncounters)
                {
                    //  Poke-set
                    var inArea = PokemonInArea(area);

                    //  Build area map using randoms
                    var areaMap      = new Dictionary <Pokemon, Pokemon>();
                    var usedPks      = new List <Pokemon>();
                    var localAllowed = allowedPokes;

                    if (area.BannedPokemon.Count > 0)
                    {
                        localAllowed = new List <Pokemon>(allowedPokes);
                        localAllowed.RemoveAll(area.BannedPokemon.Contains);
                    }

                    foreach (var areaPk in inArea)
                    {
                        var picked = PickWildPowerLvlReplacement(localAllowed, areaPk, false, usedPks);
                        areaMap[areaPk] = picked;
                        usedPks.Add(picked);
                    }

                    //  Apply the map
                    foreach (var enc in area.Encounters)
                    {
                        enc.Pokemon1 = areaMap[enc.Pokemon1];
                    }
                }
            }
            else
            {
                //  Entirely random
                foreach (var area in scrambledEncounters)
                {
                    //  Poke-set
                    var inArea = PokemonInArea(area);
                    //  Build area map using randoms
                    var areaMap = new Dictionary <Pokemon, Pokemon>();
                    foreach (var areaPk in inArea)
                    {
                        var picked = noLegendaries ? RandomPokemon(p => !p.Legendary) : RandomPokemon();
                        while (areaMap.ContainsValue(picked) || area.BannedPokemon.Contains(picked))
                        {
                            picked = noLegendaries ? RandomPokemon(p => !p.Legendary) : RandomPokemon();
                        }

                        areaMap[areaPk] = picked;
                    }

                    foreach (var enc in area.Encounters)
                    {
                        //  Apply the map
                        enc.Pokemon1 = areaMap[enc.Pokemon1];
                    }
                }
            }
        }
Example #5
0
        public void RandomEncounters(EncountersRandomization encountersRandomization, bool noLegendaries)
        {
            var pickFrom   = noLegendaries ? ValidPokemons.Where(p => !p.Legendary) : ValidPokemons;
            var enumerable = pickFrom as Pokemon[] ?? pickFrom.ToArray();

            var currentEncounters = RomHandler.Encounters.ToList();

            currentEncounters.Shuffle(Random);

            switch (encountersRandomization)
            {
            case EncountersRandomization.CatchEmAll:
                // Clone, so we don't modify original
                var allPokes = enumerable.ToList();

                foreach (var area in currentEncounters)
                {
                    var pickablePokemon = allPokes;

                    if (area.BannedPokemon.Count > 0)
                    {
                        // Clone, so we don't modify original
                        pickablePokemon = allPokes.ToList();
                        pickablePokemon.RemoveAll(area.BannedPokemon);
                    }

                    foreach (var enc in area.Encounters)
                    {
                        if (pickablePokemon.Count == 0)
                        {
                            // Clone, so we don't modify original
                            var tempPickable = enumerable.ToList();
                            tempPickable.RemoveAll(area.BannedPokemon);

                            if (tempPickable.Count == 0)
                            {
                                throw new NotImplementedException("ERROR: Couldn't replace a wild Pokemon!");
                            }

                            enc.Pokemon1 = tempPickable[Random.Next(tempPickable.Count)];
                        }
                        else
                        {
                            var picked = Random.Next(pickablePokemon.Count);
                            enc.Pokemon1 = pickablePokemon[picked];

                            pickablePokemon.RemoveAt(picked);

                            if (allPokes != pickablePokemon)
                            {
                                allPokes.Remove(enc.Pokemon1);
                            }

                            if (allPokes.Count != 0)
                            {
                                continue;
                            }

                            allPokes.AddRange(enumerable);

                            if (pickablePokemon == allPokes)
                            {
                                continue;
                            }

                            pickablePokemon.AddRange(allPokes);

                            pickablePokemon.RemoveAll(area.BannedPokemon);
                        }
                    }
                }
                break;

            case EncountersRandomization.TypeThemed:
                var cachedPokeLists = new SortedDictionary <Typing, IList <Pokemon> >();
                foreach (var area in currentEncounters)
                {
                    IList <Pokemon> possiblePokemon = null;
                    var             iterLoops       = 0;
                    while (possiblePokemon == null && iterLoops < 10000)
                    {
                        var areaTheme = RandomType();
                        if (!cachedPokeLists.ContainsKey(areaTheme))
                        {
                            IList <Pokemon> pType = PokemonOfType(areaTheme, noLegendaries);

                            cachedPokeLists[areaTheme] = pType;
                        }

                        possiblePokemon = cachedPokeLists[areaTheme];
                        if (area.BannedPokemon.Count > 0)
                        {
                            possiblePokemon = possiblePokemon.ToList();
                            possiblePokemon.RemoveAll(area.BannedPokemon);
                        }
                        if (possiblePokemon.Count == 0)
                        {
                            possiblePokemon = null;
                        }
                        iterLoops++;
                    }
                    if (possiblePokemon == null)
                    {
                        throw new NotImplementedException(
                                  "Could not randomize an area in a reasonable amount of attempts.");
                    }
                    foreach (var enc in area.Encounters)
                    {
                        enc.Pokemon1 = possiblePokemon[Random.Next(possiblePokemon.Count)];
                    }
                }
                break;

            case EncountersRandomization.UsePowerLevel:
                var allowedPokes = enumerable.ToList();

                foreach (var area in currentEncounters)
                {
                    var localAllowed = allowedPokes;
                    if (area.BannedPokemon.Count > 0)
                    {
                        localAllowed = allowedPokes.ToList();
                        localAllowed.RemoveAll(area.BannedPokemon);
                    }
                    foreach (var enc in area.Encounters)
                    {
                        enc.Pokemon1 = PickWildPowerLvlReplacement(localAllowed, enc.Pokemon1, false, null);
                    }
                }
                break;

            default:
                foreach (var area in currentEncounters)
                {
                    foreach (var enc in area.Encounters)
                    {
                        enc.Pokemon1 = noLegendaries ? RandomPokemon(p => !p.Legendary) : RandomPokemon();
                        while (area.BannedPokemon.Contains(enc.Pokemon1))
                        {
                            enc.Pokemon1 = noLegendaries ? RandomPokemon(p => !p.Legendary) : RandomPokemon();
                        }
                    }
                }
                break;
            }
        }
Example #6
0
        public void Game1To1Encounters(bool useTimeOfDay, bool usePowerLevels, bool noLegendaries)
        {
            var pickFrom   = noLegendaries ? ValidPokemons.Where(p => !p.Legendary) : ValidPokemons;
            var enumerable = pickFrom as Pokemon[] ?? pickFrom.ToArray();

            //  Build the full 1-to-1 map
            var translateMap   = new Dictionary <Pokemon, Pokemon>();
            var remainingLeft  = ValidPokemons.ToList();
            var remainingRight = enumerable.ToList();

            while (remainingLeft.Count != 0)
            {
                if (usePowerLevels)
                {
                    var pickedLeft  = Random.Next(remainingLeft.Count);
                    var pickedLeftP = remainingLeft[pickedLeft];
                    remainingLeft.RemoveAt(pickedLeft);

                    var pickedRightP = remainingRight.Count == 1
                        ? remainingRight[0]
                        : PickWildPowerLvlReplacement(remainingRight, pickedLeftP, true, null);

                    remainingRight.Remove(pickedRightP);
                    translateMap[pickedLeftP] = pickedRightP;
                }
                else
                {
                    var pickedLeft   = Random.Next(remainingLeft.Count);
                    var pickedRight  = Random.Next(remainingRight.Count);
                    var pickedLeftP  = remainingLeft[pickedLeft];
                    var pickedRightP = remainingRight[pickedRight];
                    remainingLeft.RemoveAt(pickedLeft);
                    while (pickedLeftP.Id == pickedRightP.Id &&
                           remainingRight.Count != 1)
                    {
                        //  Reroll for a different pokemon if at all possible
                        pickedRight  = Random.Next(remainingRight.Count);
                        pickedRightP = remainingRight[pickedRight];
                    }

                    remainingRight.RemoveAt(pickedRight);
                    translateMap[pickedLeftP] = pickedRightP;
                }

                if (remainingRight.Count != 0)
                {
                    continue;
                }

                remainingRight.AddRange(enumerable);
            }

            //  Map remaining to themselves just in case
            var allPokes = ValidPokemons;

            foreach (var poke in allPokes)
            {
                if (!translateMap.ContainsKey(poke))
                {
                    translateMap[poke] = poke;
                }
            }

            foreach (var area in RomHandler.Encounters)
            {
                foreach (var enc in area.Encounters)
                {
                    //  Apply the map
                    enc.Pokemon1 = translateMap[enc.Pokemon1];

                    if (!area.BannedPokemon.Contains(enc.Pokemon1))
                    {
                        continue;
                    }

                    //  Ignore the map and put a random non-banned poke
                    var tempPickable = enumerable.ToList();
                    tempPickable.RemoveAll(area.BannedPokemon.Contains);

                    if (tempPickable.Count == 0)
                    {
                        throw new NotImplementedException("ERROR: Couldn\'t replace a wild Pokemon!");
                    }

                    if (usePowerLevels)
                    {
                        enc.Pokemon1 = PickWildPowerLvlReplacement(tempPickable, enc.Pokemon1, false, null);
                    }
                    else
                    {
                        var picked = Random.Next(tempPickable.Count);
                        enc.Pokemon1 = tempPickable[picked];
                    }
                }
            }
        }