public static Identifiable.Id CraftLargo(this LookupDirector director, Identifiable.Id slimeA, Identifiable.Id slimeB, Action <SlimeDefinition> extraLargoBehaviour = null, Predicate <Identifiable.Id> canBeTarr = null, Predicate <Identifiable.Id> forceLargo = null) { if (director.LargoExists(slimeA, slimeB)) { return(Identifiable.Id.NONE); } string prefabName = "slime" + slimeA.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeA.ToString().Replace("_SLIME", "").ToLower().Substring(1) + slimeB.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeB.ToString().Replace("_SLIME", "").ToLower().Substring(1); string name = slimeA.ToString().Replace("_SLIME", "") + slimeB.ToString().Replace("_SLIME", "") + "_LARGO"; Identifiable.Id largoID = IdentifiableRegistry.CreateIdentifiableId(EnumPatcher.GetFirstFreeValue(typeof(Identifiable.Id)), name); SlimeDefinitions defs = GameContext.Instance.SlimeDefinitions; SlimeDefinition curr = defs.GetSlimeByIdentifiableId(slimeA); SlimeDefinition other = defs.GetSlimeByIdentifiableId(slimeB); bool largofyState = curr.CanLargofy; curr.CanLargofy = true; if (!other.CanLargofy && !(forceLargo?.Invoke(slimeB) ?? false)) { return(Identifiable.Id.NONE); } bool largofyStateB = other.CanLargofy; other.CanLargofy = true; SlimeDefinition largoDef = defs.GetLargoByBaseSlimes(curr, other); largoDef.IdentifiableId = largoID; curr.CanLargofy = largofyState; other.CanLargofy = largofyStateB; if (!(canBeTarr?.Invoke(slimeB) ?? true)) { largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.TARR_SLIME); largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.GLITCH_TARR_SLIME); } extraLargoBehaviour?.Invoke(largoDef); SlimeTemplate largoTemplate = new SlimeTemplate(prefabName, largoDef).SetVacSize(Vacuumable.Size.LARGE) .SetTranslation(curr.Name + " " + other.Name + " Largo").Create(); LookupRegistry.RegisterIdentifiablePrefab(largoTemplate.ToPrefab()); return(largoID); }
internal Identifiable.Id CraftLargo(bool canBeTarr, Identifiable.Id slimeA, Identifiable.Id slimeB, System.Action <SlimeDefinition> extraLargoBehaviour = null) { if (GameContext.Instance.LookupDirector.LargoExists(slimeA, slimeB)) { return(Identifiable.Id.NONE); } string prefabName = mainObject.Name + slimeB.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeB.ToString().Replace("_SLIME", "").ToLower().Substring(1); string name = slimeA.ToString().Replace("_SLIME", "") + slimeB.ToString().Replace("_SLIME", "") + "_LARGO"; Identifiable.Id largoID = IdentifiableRegistry.CreateIdentifiableId(EnumPatcher.GetFirstFreeValue(typeof(Identifiable.Id)), name); SlimeDefinitions defs = GameContext.Instance.SlimeDefinitions; SlimeDefinition other = defs.GetSlimeByIdentifiableId(slimeB); if (!other.CanLargofy) { return(Identifiable.Id.NONE); } SlimeDefinition largoDef = defs.GetLargoByBaseSlimes(definition, other); largoDef.IdentifiableId = largoID; if (!canBeTarr) { largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.TARR_SLIME); largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.GLITCH_TARR_SLIME); } extraLargoBehaviour?.Invoke(largoDef); SlimeTemplate largoTemplate = new SlimeTemplate(prefabName, largoDef).SetFeralState(canBeFeral).SetGlitchState(canBeAGlitch) .SetVacSize(Vacuumable.Size.LARGE).SetTranslation(definition.Name + " " + other.Name + " Largo").Create(); LookupRegistry.RegisterIdentifiablePrefab(largoTemplate.ToPrefab()); return(largoID); }
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> /// Gets a Largo from the given slimes /// </summary> /// <param name="slimeA">ID of slime A</param> /// <param name="slimeB">ID of slime B</param> public static Identifiable.Id Largo(Identifiable.Id slimeA, Identifiable.Id slimeB) { SlimeDefinitions defs = GameContext.Instance.SlimeDefinitions; return(defs.GetLargoByBaseSlimes(defs.GetSlimeByIdentifiableId(slimeA), defs.GetSlimeByIdentifiableId(slimeB))?.IdentifiableId ?? Identifiable.Id.NONE); }