// Injects the specific largos into the slime diet or adapts if present
        private static void InjectSpecLargoDiet(Identifiable.Id slime, SlimeDiet diet)
        {
            if (!SPEC_LARGOS.ContainsKey(slime))
            {
                return;
            }

            Identifiable.Id plort  = SPEC_LARGOS[slime].Item1;
            Identifiable.Id result = SPEC_LARGOS[slime].Item2;

            bool found = false;

            foreach (SlimeDiet.EatMapEntry entry in diet.EatMap.Where(entry => entry.eats == plort))
            {
                entry.becomesId = result;

                found = true;
                break;
            }

            if (!found)
            {
                diet.EatMap.Add(new SlimeDiet.EatMapEntry
                {
                    eats      = plort,
                    becomesId = result
                });
            }
        }
        // TODO: Add Guu UMF Support
        // Takes care of all intermod communication,
        // this will also work with UMF mods as
        // Guu has a way to connect to those mods
        internal static void IntermodComms()
        {
            // TODO: Remove this code (Glitch Slime version)
            #region Glitch Slime Workaround

            SlimeDiet diet = GameContext.Instance?.SlimeDefinitions
                             .GetSlimeByIdentifiableId(Identifiable.Id.PINK_SLIME).Diet;

            diet?.EatMap.Add(new SlimeDiet.EatMapEntry()
            {
                becomesId = Enums.Identifiables.REAL_GLITCH_SLIME,
                driver    = SlimeEmotions.Emotion.NONE,
                eats      = Identifiable.Id.MANIFOLD_CUBE_CRAFT
            });

            diet?.EatMap.Add(new SlimeDiet.EatMapEntry()
            {
                becomesId = Enums.Identifiables.REAL_DIGITARR_SLIME,
                driver    = SlimeEmotions.Emotion.NONE,
                eats      = Enums.Identifiables.REAL_GLITCH_PLORT
            });

            #endregion

            // Run Injectors
            foreach (Injector inject in injectors)
            {
                inject.IntermodComms();
            }

            // Clears all the temporary memory
            GC.Collect();
        }
        /// <summary>Registers the item into it's registry</summary>
        public override IdentifiableItem Register()
        {
            Identifiable.LARGO_CLASS.Add(ID);

            base.Register();

            if (Definition.Diet == null)
            {
                Definition.Diet = new SlimeDiet();
            }

            if (SuperFoods != null)
            {
                FavoriteFoods.AddRange(SuperFoods);
            }

            SlimeDiet diet = Definition.Diet;

            // TODO: Add the new diets
            if (FoodGroups.Contains(SlimeEat.FoodGroup.FRUIT))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.FRUIT_CLASS, diet, FavoriteFoods, Plort);
                SlimeUtils.PopulateDiet(ID, Identifiable.FRUIT_CLASS, diet, FavoriteFoods, Plort2);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.VEGGIES))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.VEGGIE_CLASS, diet, FavoriteFoods, Plort);
                SlimeUtils.PopulateDiet(ID, Identifiable.VEGGIE_CLASS, diet, FavoriteFoods, Plort2);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.MEAT))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.MEAT_CLASS, diet, FavoriteFoods, Plort);
                SlimeUtils.PopulateDiet(ID, Identifiable.MEAT_CLASS, diet, FavoriteFoods, Plort2);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.GINGER))
            {
                SlimeUtils.PopulateDiet(ID, new[] { Identifiable.Id.GINGER_VEGGIE }, diet, FavoriteFoods, Plort);
                SlimeUtils.PopulateDiet(ID, new[] { Identifiable.Id.GINGER_VEGGIE }, diet, FavoriteFoods, Plort2);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.NONTARRGOLD_SLIMES))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.TOFU_CLASS, diet, FavoriteFoods, Plort);
                SlimeUtils.PopulateDiet(ID, Identifiable.TOFU_CLASS, diet, FavoriteFoods, Plort2);
            }

            // Populates the synergy part
            SlimeUtils.PopulateDiet(ID, SuperFoods, diet, SuperFoods, SynergyPlort);

            return(this);
        }
        /// <summary>Registers the item into it's registry</summary>
        public override IdentifiableItem Register()
        {
            base.Register();

            if (Definition.Diet == null)
            {
                Definition.Diet = new SlimeDiet();
            }

            Definition.Diet.EatMap = new List <SlimeDiet.EatMapEntry>();
            SlimeDiet diet = Definition.Diet;

            if (CustomDietBehaviour || FoodGroups.Count <= 0)
            {
                return(this);
            }

            // TODO: Add the new diets
            if (FoodGroups.Contains(SlimeEat.FoodGroup.FRUIT))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.FRUIT_CLASS, diet, FavoriteFoods, Plort);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.VEGGIES))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.VEGGIE_CLASS, diet, FavoriteFoods, Plort);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.MEAT))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.MEAT_CLASS, diet, FavoriteFoods, Plort);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.GINGER))
            {
                SlimeUtils.PopulateDiet(ID, new[]
                {
                    Identifiable.Id.GINGER_VEGGIE
                }, diet, FavoriteFoods, Plort);
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.PLORTS))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.PLORT_CLASS, diet, FavoriteFoods, Plort, true);
                Definition.CanLargofy = false;
            }

            if (FoodGroups.Contains(SlimeEat.FoodGroup.NONTARRGOLD_SLIMES))
            {
                SlimeUtils.PopulateDiet(ID, Identifiable.TOFU_CLASS, diet, FavoriteFoods, Plort);
            }

            return(this);
        }
        // Injects the favorites into the slime diet or adapts if present
        private static void InjectFavoriteDiet(Identifiable.Id slime, SlimeDiet diet, Identifiable.Id slimeB = Identifiable.Id.NONE)
        {
            if (!FAVORITES.ContainsKey(slime))
            {
                return;
            }

            foreach (Identifiable.Id fav in FAVORITES[slime])
            {
                bool found = false;
                foreach (SlimeDiet.EatMapEntry entry in diet.EatMap.Where(entry => entry.eats == fav))
                {
                    entry.isFavorite = true;
                    entry.favoriteProductionCount = SlimeUtils.DEFAULT_FAV_COUNT;

                    found = true;
                }

                if (found)
                {
                    continue;
                }

                diet.EatMap.Add(new SlimeDiet.EatMapEntry
                {
                    eats       = fav,
                    isFavorite = true,
                    favoriteProductionCount = SlimeUtils.DEFAULT_FAV_COUNT,
                    driver     = SlimeEmotions.Emotion.HUNGER,
                    minDrive   = SlimeUtils.EAT_MIN_DRIVE,
                    producesId = SlimeUtils.SlimeToPlort(slime)
                });

                if (slimeB != Identifiable.Id.NONE)
                {
                    diet.EatMap.Add(new SlimeDiet.EatMapEntry
                    {
                        eats       = fav,
                        isFavorite = true,
                        favoriteProductionCount = SlimeUtils.DEFAULT_FAV_COUNT,
                        driver     = SlimeEmotions.Emotion.HUNGER,
                        minDrive   = SlimeUtils.EAT_MIN_DRIVE,
                        producesId = SlimeUtils.SlimeToPlort(slimeB)
                    });
                }
            }
        }
        // Injects any extra spicy tofu diet it might find
        private static void InjectSpicyDiet(Identifiable.Id slime, SlimeDiet diet)
        {
            if (!SPICY_DIETS.ContainsKey(slime))
            {
                return;
            }

            diet.EatMap.Add(new AdvEatMapEntry()
            {
                driver     = SlimeEmotions.Emotion.NONE,
                producesId = SPICY_DIETS[slime],
                eats       = Enums.Identifiables.EXTRA_SPICY_TOFU,
                isRange    = true,
                minCount   = 1,
                maxCount   = 2
            });
        }
示例#7
0
        private void RandomizeSlimeDiets(System.Random rand)
        {
            if (!diet_enabled)
            {
                return;
            }

            // Build list of food items that cannot be set as favorite //
            List <Identifiable.Id> restrictedFavorites = new List <Identifiable.Id>();

            if (!diet_allowElderFavorite)
            {
                restrictedFavorites.Add(Identifiable.Id.ELDER_HEN);
                restrictedFavorites.Add(Identifiable.Id.ELDER_ROOSTER);
            }
            if (!diet_allowGildedGingerFavorite)
            {
                restrictedFavorites.Add(Identifiable.Id.GINGER_VEGGIE);
            }
            if (!diet_allowKookadobaFavorite)
            {
                restrictedFavorites.Add(Identifiable.Id.KOOKADOBA_FRUIT);
            }
            if (!diet_allowTofuFavorite)
            {
                restrictedFavorites.Add(Identifiable.Id.SPICY_TOFU);
            }


            // Build list of allowed slime & largo types //
            SlimeDefinitions       slimeDefinitions = SRSingleton <GameContext> .Instance.SlimeDefinitions;
            List <Identifiable.Id> allowedSlimes    = new List <Identifiable.Id>(Identifiable.EATERS_CLASS);

            //remove slimes from the list that are special cases or have no diet
            allowedSlimes.Remove(Identifiable.Id.FIRE_SLIME);
            allowedSlimes.Remove(Identifiable.Id.GLITCH_SLIME);
            allowedSlimes.Remove(Identifiable.Id.GLITCH_TARR_SLIME);
            allowedSlimes.Remove(Identifiable.Id.PUDDLE_SLIME);
            allowedSlimes.Remove(Identifiable.Id.QUICKSILVER_SLIME);
            allowedSlimes.Remove(Identifiable.Id.TARR_SLIME);

            //remove slimes as specified by options
            if (!diet_changeGoldSlimeDiet)
            {
                allowedSlimes.Remove(Identifiable.Id.GOLD_SLIME);
            }
            if (!diet_changeLuckySlimeDiet)
            {
                allowedSlimes.Remove(Identifiable.Id.LUCKY_SLIME);
            }
            if (!diet_changePinkSlimeDiet)
            {
                allowedSlimes.Remove(Identifiable.Id.PINK_SLIME);
            }


            // Handle base slime types //
            IEnumerable <Identifiable.Id> baseSlimes = from slime in allowedSlimes
                                                       where slime.ToString().EndsWith("_SLIME")
                                                       select slime;

            foreach (Identifiable.Id slime in baseSlimes)
            {
                SlimeDefinition currSlime = slimeDefinitions.GetSlimeByIdentifiableId(slime);

                Log("Slime: " + currSlime);

                //set new food group
                SlimeEat.FoodGroup newFoodGroup = PickRandom(VALID_FOOD_GROUPS, rand);
                currSlime.Diet.MajorFoodGroups = new SlimeEat.FoodGroup[] { newFoodGroup };

                Log("Food group: " + newFoodGroup.ToString());

                //set new favorite food
                Identifiable.Id newFavoriteFood = Identifiable.Id.NONE;
                while (newFavoriteFood == Identifiable.Id.NONE || restrictedFavorites.Contains(newFavoriteFood))
                {
                    IEnumerable <Identifiable.Id> idClass = null;
                    if (newFoodGroup == SlimeEat.FoodGroup.FRUIT)
                    {
                        idClass = Identifiable.FRUIT_CLASS;
                    }
                    else if (newFoodGroup == SlimeEat.FoodGroup.VEGGIES)
                    {
                        idClass = Identifiable.VEGGIE_CLASS;
                    }
                    else if (newFoodGroup == SlimeEat.FoodGroup.MEAT)
                    {
                        idClass = Identifiable.MEAT_CLASS;
                    }
                    else
                    {
                        Log("Invalid food group in RandomizeSlimeDiets. Applying fallback...");
                        newFavoriteFood = Identifiable.Id.POGO_FRUIT;
                        break;
                    }

                    newFavoriteFood = PickRandom(idClass, rand);
                }

                Log("Favorite food: " + newFavoriteFood.ToString());

                currSlime.Diet.Favorites = new Identifiable.Id[] { newFavoriteFood };
            }


            // Handle largo types //
            IEnumerable <Identifiable.Id> largos = from largo in allowedSlimes
                                                   where largo.ToString().EndsWith("_LARGO")
                                                   select largo;

            foreach (Identifiable.Id largo in largos)
            {
                SlimeDefinition currLargo = slimeDefinitions.GetSlimeByIdentifiableId(largo);
                if (currLargo.IsLargo && currLargo.BaseSlimes.Length == 2) //coherence check
                {
                    currLargo.Diet = SlimeDiet.Combine(currLargo.BaseSlimes[0].Diet, currLargo.BaseSlimes[1].Diet);
                }
                else
                {
                    Log("Non-largo coming through largo diet randomization? Id: " + largo.ToString());
                }
            }


            //refresh the EatMap of every slime definition (apply the changes, essentially)
            slimeDefinitions.RefreshDefinitions();
        }
示例#8
0
        /// <summary>
        /// Populates a diet with the given foods
        /// </summary>
        /// <param name="slimeID">Slime ID that owns the diet</param>
        /// <param name="foods">Foods to add</param>
        /// <param name="diet">The diet to populate</param>
        /// <param name="favoriteFoods">A list of favorite foods (null for no favorite foods)</param>
        /// <param name="plort">The plort to produce</param>
        /// <param name="plortAsFood">Are plorts food for this slime?</param>
        public static void PopulateDiet(Identifiable.Id slimeID, ICollection <Identifiable.Id> foods, SlimeDiet diet, ICollection <Identifiable.Id> favoriteFoods = null, Identifiable.Id?plort = null, bool plortAsFood = false)
        {
            if (diet.EatMap == null)
            {
                diet.EatMap = new List <SlimeDiet.EatMapEntry>();
            }

            Identifiable.Id slimePlort = plort ?? SlimeToPlort(slimeID);

            foreach (Identifiable.Id food in foods)
            {
                if (diet.EatMap.Exists((e) => e.eats == food))
                {
                    continue;
                }

                if (Identifiable.IsPlort(food) && !plortAsFood && PlortToLargo(slimePlort, food) == Identifiable.Id.NONE)
                {
                    continue;
                }

                diet.EatMap.Add(new SlimeDiet.EatMapEntry()
                {
                    becomesId = (Identifiable.IsPlort(food) && !plortAsFood)
                                                ? PlortToLargo(slimePlort, food)
                                                : Identifiable.Id.NONE,

                    driver     = SlimeEmotions.Emotion.HUNGER,
                    eats       = food,
                    extraDrive = DEFAULT_EXTRA_DRIVE,
                    favoriteProductionCount = DEFAULT_FAV_COUNT,
                    isFavorite = favoriteFoods?.Contains(food) ?? false,
                    minDrive   = (Identifiable.IsPlort(food) && !plortAsFood) ? EAT_PLORT_MIN_DRIVE : EAT_MIN_DRIVE,
                    producesId = (Identifiable.IsPlort(food) && !plortAsFood) ? Identifiable.Id.NONE
                                                : slimePlort
                });
            }
        }
示例#9
0
 /// <summary>
 /// Does this diet belongs to a given food group?
 /// </summary>
 /// <param name="diet">Diet to check</param>
 /// <param name="group">Group to check</param>
 private static bool HasFoodGroup(SlimeDiet diet, FoodGroup group)
 {
     return(diet.MajorFoodGroups.Any(food => food == group));
 }
 // Injects the Kookadoba Diets into the slimes
 private static void InjectKookadobaDiet(Identifiable.Id slime, SlimeDiet diet)
 {
 }