// 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)
                    });
                }
            }
        }
        /// <summary>
        /// Adds a specific largo to a slime
        /// </summary>
        /// <param name="slimeA">The slime A to add to</param>
        /// <param name="slimeB">The slime B to add to</param>
        /// <param name="result">The result to generate</param>
        public static void AddSpecificLargo(Identifiable.Id slimeA, Identifiable.Id slimeB, Identifiable.Id result)
        {
            Tuple <Identifiable.Id, Identifiable.Id> mixA = Tuple.Create(SlimeUtils.SlimeToPlort(slimeB), result);
            Tuple <Identifiable.Id, Identifiable.Id> mixB = Tuple.Create(SlimeUtils.SlimeToPlort(slimeA), result);

            if (SPEC_LARGOS.ContainsKey(slimeA))
            {
                SPEC_LARGOS[slimeA] = mixA;
            }
            else
            {
                SPEC_LARGOS.Add(slimeA, mixA);
            }

            if (SPEC_LARGOS.ContainsKey(slimeB))
            {
                SPEC_LARGOS[slimeB] = mixB;
            }
            else
            {
                SPEC_LARGOS.Add(slimeB, mixB);
            }
        }
 // Injects the Kookadoba Diets into the slimes
 private static void InjectKookadobaDiet(Identifiable.Id slime, SlimeDiet diet)
 {
 }
예제 #4
0
 public static void AddPlortEntry(Identifiable.Id plortId)
 {
     AddPlortEntry(plortId, new ProgressDirector.ProgressType[0]);
 }
예제 #5
0
 public static void RegisterPlort(Identifiable.Id id, float value, float fullSaturationValue)
 {
     AddPlortEntry(id);
     AddEconomyEntry(id, value, fullSaturationValue);
 }
예제 #6
0
        // To setup the controller
        internal static void Setup()
        {
            MissingImage = SRObjects.MissingIcon?.texture;
            GadgetSite   = SRObjects.Get <Sprite>("iconPlaceGadget")?.texture;

            foreach (string name in Enum.GetNames(typeof(Identifiable.Id)))
            {
                Identifiable.Id ID = EnumUtils.Parse <Identifiable.Id>(name);
                if (toIgnoreIden.Contains(ID))
                {
                    continue;
                }

                GameObject obj = Identifiable.GORDO_CLASS.Contains(ID)
                                        ? ExceptionUtils.IgnoreErrors(() => GameContext.Instance.LookupDirector.GetGordo(ID))
                                        : ExceptionUtils.IgnoreErrors(() => GameContext.Instance.LookupDirector.GetPrefab(ID));

                if (obj == null)
                {
                    continue;
                }

                InstallIDMarker(ID, obj);
            }

            foreach (string name in Enum.GetNames(typeof(Gadget.Id)))
            {
                Gadget.Id ID = EnumUtils.Parse <Gadget.Id>(name);
                if (toIgnoreGadget.Contains(ID))
                {
                    continue;
                }

                GameObject obj = ExceptionUtils.IgnoreErrors(() => GameContext.Instance.LookupDirector.GetGadgetDefinition(ID).prefab);

                if (obj == null)
                {
                    continue;
                }

                InstallGadgetMarker(ID, obj);
            }

            foreach (Identifiable found in UnityEngine.Object.FindObjectsOfType <Identifiable>())
            {
                if (found.gameObject.scene.buildIndex == 3)
                {
                    InstallIDMarker(found.id, found.gameObject);
                }
            }

            foreach (GordoIdentifiable found in UnityEngine.Object.FindObjectsOfType <GordoIdentifiable>())
            {
                if (found.gameObject.scene.buildIndex == 3)
                {
                    InstallIDMarker(found.id, found.gameObject);
                }
            }

            foreach (Gadget found in UnityEngine.Object.FindObjectsOfType <Gadget>())
            {
                if (found.gameObject.scene.buildIndex == 3)
                {
                    InstallGadgetMarker(found.id, found.gameObject);
                }
            }

            foreach (GadgetSite found in UnityEngine.Object.FindObjectsOfType <GadgetSite>())
            {
                if (found.gameObject.scene.buildIndex == 3)
                {
                    found.gameObject.InstallMarker <GadgetSiteMarker>();
                }
            }

            OnMarkerSetup?.Invoke();
        }
예제 #7
0
 /// <summary>
 /// Checks if there is a prefab for the given identifiable ID
 /// </summary>
 /// <param name="dir">The lookup director</param>
 /// <param name="id">The ID to check</param>
 public static bool HasPrefab(this LookupDirector dir, Identifiable.Id id)
 {
     return(dir.GetPrivateField <Dictionary <Identifiable.Id, GameObject> >("identifiablePrefabDict").ContainsKey(id));
 }
예제 #8
0
 /// <summary>
 /// Adds a new bonus spawn to the list
 /// </summary>
 /// <param name="ID">The ID for the spawnable</param>
 public BushPlantableTemplate AddBonusSpawn(Identifiable.Id ID)
 {
     bonusToSpawn.Add(GameContext.Instance.LookupDirector.GetPrefab(ID));
     return(this);
 }
예제 #9
0
 /// <summary>
 /// Adds a spawn to the list
 /// </summary>
 /// <param name="ID">The ID for the spawnable</param>
 public FruitPlantableTemplate AddSpawn(Identifiable.Id ID)
 {
     toSpawn.Add(GameContext.Instance.LookupDirector.GetPrefab(ID));
     return(this);
 }
예제 #10
0
 public static void Postfix(ref bool __result, Identifiable.Id id)
 {
     __result = __result || AmmoRegistry.customRefineryResources.Contains(id);
 }
 private static bool IsWater_Prefix(out bool @return, Identifiable.Id id)
 {
     @return = IdentifiableHandler.IsWater(id);
     return(false);
 }
    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);
    }
    // Check Methods
    public static bool LargoExists(this LookupDirector director, Identifiable.Id slimeA, Identifiable.Id slimeB)
    {
        string nameA = slimeA.ToString().Replace("_SLIME", "");
        string nameB = slimeB.ToString().Replace("_SLIME", "");

        string largoA = $"{nameA}_{nameB}_LARGO";
        string largoB = $"{nameB}_{nameA}_LARGO";

        object result = Enum.Parse(typeof(Identifiable.Id), largoA) ?? Enum.Parse(typeof(Identifiable.Id), largoB);

        return(result != null);
    }
 // Get Component Methods
 public static Identifiable GetIdentifiable(this LookupDirector director, Identifiable.Id ID)
 {
     return(director.GetPrefab(ID).GetComponent <Identifiable>());
 }
    public static GameObject GetLargoPrefab(this LookupDirector director, Identifiable.Id slimeA, Identifiable.Id slimeB)
    {
        Identifiable.Id largo = Identifiable.Id.NONE;

        string nameA = slimeA.ToString().Replace("_SLIME", "");
        string nameB = slimeB.ToString().Replace("_SLIME", "");

        string largoA = $"{nameA}_{nameB}_LARGO";
        string largoB = $"{nameB}_{nameA}_LARGO";

        object result = Enum.Parse(typeof(Identifiable.Id), largoA) ?? Enum.Parse(typeof(Identifiable.Id), largoB);

        if (result != null)
        {
            largo = (Identifiable.Id)result;
        }

        return(largo == Identifiable.Id.NONE ? null : director.GetPrefab(largo));
    }
 public static GordoTemplate MakeStaticGordo(this LookupDirector director, string name, Identifiable.Id gordoID, SlimeDefinition definition, Material[] gordoMaterials)
 {
     return(new GordoTemplate(name, gordoID, definition, gordoMaterials).SetTranslation(definition.Name + " Gordo"));
 }