// 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 }); }
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(); }
/// <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 }); } }
/// <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) { }