public static GameObject CreateHatch( string id, string name, string desc, string anim_file, bool is_baby) { GameObject wildCreature = EntityTemplates.ExtendEntityToWildCreature( BaseHatchConfig.BaseHatch( id, name, desc, anim_file, BaseTraitId, is_baby, SymbolOverride ), HatchTuning.PEN_SIZE_PER_CREATURE, MaxAge); CreateTrait(name); List <Diet.Info> diet_infos = SturdyDiet( poopTag: EmitElement.CreateTag(), caloriesPerKg: CaloriesPerKgOfFood, producedConversionRate: TUNING.CREATURES.CONVERSION_EFFICIENCY.NORMAL);//nerfed effiendy from 3 to normal wildCreature.AddOrGet <DecorProvider>()?.SetValues(tier); return(BaseHatchConfig.SetupDiet(wildCreature, diet_infos, CaloriesPerKgOfFood, MinPoopSizeKg)); }
public static GameObject CreateHatch( string id, string name, string desc, string anim_file, bool is_baby) { GameObject wildCreature = EntityTemplates.ExtendEntityToWildCreature( BaseHatchConfig.BaseHatch( id, name, desc, anim_file, BaseTraitId, is_baby, SymbolOverride ), HatchTuning.PEN_SIZE_PER_CREATURE, MaxAge); CreateTrait(name); List <Diet.Info> diet_infos = MutedDiet( poopTag: EmitElement.CreateTag(), caloriesPerKg: CaloriesPerKgOfFood, producedConversionRate: TUNING.CREATURES.CONVERSION_EFFICIENCY.GOOD_3); return(BaseHatchConfig.SetupDiet(wildCreature, diet_infos, CaloriesPerKgOfFood, MinPoopSizeKg)); }
public static void Postfix(ref GameObject __result) { var kgPerDay = 140f; var calPerDay = HatchTuning.STANDARD_CALORIES_PER_CYCLE; var dietList = new List <Diet.Info>(); dietList.AddRange(BaseHatchConfig.VeggieDiet(SimHashes.Lime.CreateTag(), calPerDay / kgPerDay, 1f, null, 0.0f)); dietList.AddRange(DietUtils.CreateFoodDiet(SimHashes.Lime.CreateTag(), calPerDay, kgPerDay)); __result = DietUtils.SetupDiet(__result, dietList, calPerDay / kgPerDay, 25f); }
public static void Postfix(ref GameObject __result) { var kgPerDay = 100f; var calPerDay = HatchTuning.STANDARD_CALORIES_PER_CYCLE; var dietList = new List <Diet.Info>(); dietList.AddRange(BaseHatchConfig.MetalDiet(GameTags.Metal, calPerDay / kgPerDay, 0.75f, null, 0.0f)); DietUtils.AddToDiet(dietList, SimHashes.Carbon.CreateTag(), SimHashes.Diamond.CreateTag(), calPerDay, kgPerDay, 0.1f); __result = DietUtils.SetupDiet(__result, dietList, calPerDay / kgPerDay, 10f); }
public static GameObject CreateHatch( string id, string name, string desc, string anim_file, bool is_baby) { GameObject wildCreature = EntityTemplates.ExtendEntityToWildCreature( BaseHatchConfig.BaseHatch( id, name, desc, anim_file, BaseTraitId, is_baby, SymbolOverride ), HatchTuning.PEN_SIZE_PER_CREATURE); CreateTrait(name); List <Diet.Info> diet_infos = WoodenDiet( poopTag: WoodLogConfig.TAG, caloriesPerKg: CaloriesPerKgOfFood, producedConversionRate: TUNING.CREATURES.CONVERSION_EFFICIENCY.GOOD_2);//nerfed effiendy from 3 to normal wildCreature.AddOrGet <DecorProvider>()?.SetValues(tier); if (!is_baby) { wildCreature.AddComponent <Storage>().capacityKg = 10f; ElementConsumer elementConsumer = (ElementConsumer)wildCreature.AddOrGet <PassiveElementConsumer>(); elementConsumer.elementToConsume = element_input; elementConsumer.consumptionRate = 0.2f; elementConsumer.capacityKG = 10f; elementConsumer.consumptionRadius = (byte)3; elementConsumer.showInStatusPanel = true; elementConsumer.sampleCellOffset = new Vector3(0.0f, 0.0f, 0.0f); elementConsumer.isRequired = false; elementConsumer.storeOnConsume = true; elementConsumer.showDescriptor = false; ElementConverter elementConverter = wildCreature.AddOrGet <ElementConverter>(); elementConverter.consumedElements = new ElementConverter.ConsumedElement[1] { new ElementConverter.ConsumedElement(element_input.CreateTag(), 0.2f) }; elementConverter.outputElements = new ElementConverter.OutputElement[1] { new ElementConverter.OutputElement(0.2f, element_output, 0.0f, false, false, 0.0f, 0.5f, 1f, byte.MaxValue, 0) }; } return(BaseHatchConfig.SetupDiet(wildCreature, diet_infos, CaloriesPerKgOfFood, MinPoopSizeKg)); }
public static void Postfix(ref GameObject __result) { var kgPerDay = 140f; var regolithKgPerDay = 280f; var calPerDay = HatchTuning.STANDARD_CALORIES_PER_CYCLE; var dietList = new List <Diet.Info>(); dietList.AddRange(BaseHatchConfig.BasicRockDiet(SimHashes.Carbon.CreateTag(), calPerDay / kgPerDay, 0.5f, null, 0.0f)); dietList.AddRange(DietUtils.CreateFoodDiet(SimHashes.Carbon.CreateTag(), calPerDay, kgPerDay * 0.75f)); DietUtils.AddToDiet(dietList, SimHashes.Regolith.CreateTag(), SimHashes.Carbon.CreateTag(), calPerDay, regolithKgPerDay); __result = DietUtils.SetupDiet(__result, dietList, calPerDay / kgPerDay, 25f); }
public static void Postfix(ref GameObject __result) { var kgPerDay = 140f; var calPerDay = HatchTuning.STANDARD_CALORIES_PER_CYCLE; var dietList = new List <Diet.Info>(); dietList.AddRange(BaseHatchConfig.HardRockDiet(SimHashes.Carbon.CreateTag(), calPerDay / kgPerDay, 0.75f, null, 0.0f)); DietUtils.AddToDiet(dietList, SimHashes.Copper.CreateTag(), SimHashes.Cuprite.CreateTag(), calPerDay, kgPerDay, 0.75f); DietUtils.AddToDiet(dietList, SimHashes.Gold.CreateTag(), SimHashes.GoldAmalgam.CreateTag(), calPerDay, kgPerDay, 0.75f); DietUtils.AddToDiet(dietList, SimHashes.Iron.CreateTag(), SimHashes.IronOre.CreateTag(), calPerDay, kgPerDay, 0.75f); DietUtils.AddToDiet(dietList, SimHashes.Tungsten.CreateTag(), SimHashes.Wolframite.CreateTag(), calPerDay, kgPerDay, 0.75f); __result = DietUtils.SetupDiet(__result, dietList, calPerDay / kgPerDay, 25f); }
public static GameObject CreateHatch(string id, string name, string desc, string anim_file, bool is_baby) { bool is_baby2 = is_baby; GameObject prefab = BaseHatchConfig.BaseHatch(id, name, desc, anim_file, "HatchMetalBaseTrait", is_baby2, "mtl_"); prefab = EntityTemplates.ExtendEntityToWildCreature(prefab, HatchTuning.PEN_SIZE_PER_CREATURE, 100f); Trait trait = Db.Get().CreateTrait("HatchMetalBaseTrait", name, name, null, false, null, true, true); trait.Add(new AttributeModifier(Db.Get().Amounts.Calories.maxAttribute.Id, HatchTuning.STANDARD_STOMACH_SIZE, name, false, false, true)); trait.Add(new AttributeModifier(Db.Get().Amounts.Calories.deltaAttribute.Id, (0f - HatchTuning.STANDARD_CALORIES_PER_CYCLE) / 600f, name, false, false, true)); trait.Add(new AttributeModifier(Db.Get().Amounts.HitPoints.maxAttribute.Id, 400f, name, false, false, true)); trait.Add(new AttributeModifier(Db.Get().Amounts.Age.maxAttribute.Id, 100f, name, false, false, true)); List <Diet.Info> diet_infos = BaseHatchConfig.MetalDiet(GameTags.Metal, CALORIES_PER_KG_OF_ORE, TUNING.CREATURES.CONVERSION_EFFICIENCY.GOOD_1, null, 0f); return(BaseHatchConfig.SetupDiet(prefab, diet_infos, CALORIES_PER_KG_OF_ORE, MIN_POOP_SIZE_IN_KG)); }
public static GameObject CreateHatch( string id, string name, string desc, string anim_file, bool is_baby) { GameObject wildCreature = EntityTemplates.ExtendEntityToWildCreature( BaseHatchConfig.BaseHatch( id, name, desc, anim_file, BaseTraitId, is_baby, SymbolOverride ), HatchTuning.PEN_SIZE_PER_CREATURE); CreateTrait(name); List <Diet.Info> diet_infos = FloralDiet( poopTag: GameTags.Edible, caloriesPerKg: CaloriesPerKgOfFood, producedConversionRate: TUNING.CREATURES.CONVERSION_EFFICIENCY.GOOD_1);// wildCreature.AddOrGet <DecorProvider>()?.SetValues(tier); DiseaseDropper.Def def = wildCreature.AddOrGetDef <DiseaseDropper.Def>(); def.diseaseIdx = Db.Get().Diseases.GetIndex(PollenGerms.ID); def.emitFrequency = 1f; def.averageEmitPerSecond = 1000 * 40; def.singleEmitQuantity = 0; IlluminationVulnerable illuminationVulnerable = wildCreature.AddOrGet <IlluminationVulnerable>(); illuminationVulnerable.SetPrefersDarkness(false); wildCreature.AddOrGetDef <CreatureLightMonitor.Def>(); return(BaseHatchConfig.SetupDiet(wildCreature, diet_infos, CaloriesPerKgOfFood, MinPoopSizeKg)); }
/// Creates new critters which were not already loaded by EntityLoad ... public static void CreateNewCritters() { foreach (var setting in CustomizeCritterState.StateManager.State.critter_settings) { if (setting?.id == null) { continue; } if (Assets.Prefabs.Find(a => a.gameObject?.name == setting.id) == null) { // configurations string id = setting.id; string name = setting.name ?? "Stone Hatch"; string desc = setting.desc ?? "Stone Hatches excrete solid Coal as waste and enjoy burrowing into the ground."; string anim_file = setting.anim_file ?? "hatch_kanim"; bool is_baby = setting.is_baby ?? false; string traitId = setting.traitId ?? "HatchHardBaseTrait"; string override_prefix = setting.override_prefix; int space_requirement = setting.space_requirement ?? HatchTuning.PEN_SIZE_PER_CREATURE; float lifespan = setting.lifespan ?? 100f; float mass = setting.mass ?? 100f; float width = setting.width ?? 1f; float height = setting.height ?? 1f; EffectorValues decor = setting.decor ?? TUNING.DECOR.BONUS.TIER0; string navGridName = setting.navGridName ?? (!is_baby ? "WalkerNavGrid1x1" : "WalkerBabyNavGrid"); NavType navi; Enum.TryParse(setting.navi, out navi);// ?? NavType.Floor; float moveSpeed = setting.moveSpeed ?? 2f; string[] dropOnDeath = setting.dropOnDeath ?? new string[] { "Meat", "Meat" }; bool canDrown = setting.canDrown ?? true; bool canCrushed = setting.canCrushed ?? false; float tempLowDeath = setting.tempLowDeath ?? 243.15f; float tempLowWarning = setting.tempLowWarning ?? 283.15f; float tempBorn = setting.tempBorn ?? 293f; float tempHighWarning = setting.tempHighWarning ?? 293.15f; float tempHighDeath = setting.tempHighDeath ?? 343.15f; bool pickup_only_from_top = setting.pickup_only_from_top ?? true; bool pickup_allow_mark = setting.pickup_allow_mark ?? true; bool pickup_use_gun = setting.pickup_use_gun ?? false; string[] tags = setting.tags ?? new string[] { GameTags.Creatures.Walker.ToString() }; Tag species = setting.species ?? GameTags.Creatures.Species.HatchSpecies; float attackValue = setting.attackValue ?? 1f; ChoreTable.Builder chore_table = setting.chore_table ?? new ChoreTable.Builder().Add(new DeathStates.Def(), true).Add(new AnimInterruptStates.Def(), true).Add(new ExitBurrowStates.Def(), !is_baby).Add(new PlayAnimsStates.Def(GameTags.Creatures.Burrowed, true, "idle_mound", STRINGS.CREATURES.STATUSITEMS.BURROWED.NAME, STRINGS.CREATURES.STATUSITEMS.BURROWED.TOOLTIP), !is_baby).Add(new GrowUpStates.Def(), true).Add(new TrappedStates.Def(), true).Add(new IncubatingStates.Def(), true).Add(new BaggedStates.Def(), true).Add(new FallStates.Def(), true).Add(new StunnedStates.Def(), true).Add(new DrowningStates.Def(), true).Add(new DebugGoToStates.Def(), true).Add(new FleeStates.Def(), true).Add(new AttackStates.Def(), !is_baby).PushInterruptGroup().Add(new CreatureSleepStates.Def(), true).Add(new FixedCaptureStates.Def(), true).Add(new RanchedStates.Def(), true).Add(new PlayAnimsStates.Def(GameTags.Creatures.WantsToEnterBurrow, false, "hide", STRINGS.CREATURES.STATUSITEMS.BURROWING.NAME, STRINGS.CREATURES.STATUSITEMS.BURROWING.TOOLTIP), !is_baby).Add(new LayEggStates.Def(), true).Add(new EatStates.Def(), true).Add(new PlayAnimsStates.Def(GameTags.Creatures.Poop, false, "poop", STRINGS.CREATURES.STATUSITEMS.EXPELLING_SOLID.NAME, STRINGS.CREATURES.STATUSITEMS.EXPELLING_SOLID.TOOLTIP), true).Add(new CallAdultStates.Def(), true).PopInterruptGroup().Add(new IdleStates.Def(), true); string adultId = setting.adultId ?? "HatchHard"; string eggId = setting.eggId ?? "HatchHardEgg"; string babyId = setting.babyId ?? "HatchHardBaby"; string dropOnMature = setting.dropOnMature ?? null; float fertility_cycles = setting.fertility_cycles ?? 60f; List <FertilityMonitor.BreedingChance> egg_chances = new List <FertilityMonitor.BreedingChance>(); egg_chances.Add(BreedingChance("HatchHardEgg", 1f)); bool is_ranchable = setting.is_ranchable ?? true; float calories_per_KG = setting.calories_per_KG ?? (700000f / 140f); float min_poop_KG = setting.min_poop_KG ?? 25f; List <Diet.Info> diet_list = setting.diet_list ?? BaseHatchConfig.HardRockDiet(SimHashes.Carbon.CreateTag(), calories_per_KG, TUNING.CREATURES.CONVERSION_EFFICIENCY.NORMAL, null, 0f); // end of configurations GameObject critter; critter = EntityTemplates.CreatePlacedEntity(id, name, desc, mass, Assets.GetAnim(anim_file), "idle_loop", Grid.SceneLayer.Creatures, (int)width, (int)height, decor, default(EffectorValues), SimHashes.Creature, null, tempBorn); EntityTemplates.ExtendEntityToBasicCreature(critter, FactionManager.FactionID.Pest, traitId, navGridName, navi, 32, moveSpeed, "Meat", 2, canDrown, canCrushed, tempLowWarning, tempHighWarning, tempLowDeath, tempHighDeath); critter.AddOrGet <Butcherable>().SetDrops(dropOnDeath); if (override_prefix != null) { critter.AddOrGet <SymbolOverrideController>().ApplySymbolOverridesByAffix(Assets.GetAnim(anim_file), override_prefix, null, 0); } critter.AddOrGet <Trappable>(); critter.AddOrGetDef <CreatureFallMonitor.Def>(); critter.AddOrGetDef <BurrowMonitor.Def>(); critter.AddOrGetDef <WorldSpawnableMonitor.Def>().adjustSpawnLocationCb = (int cell) => { return(cell); };//new Func<int, int>(BaseHatchConfig.AdjustSpawnLocationCB); critter.AddOrGetDef <ThreatMonitor.Def>().fleethresholdState = Health.HealthState.Dead; if (attackValue > 0f) { critter.AddWeapon(attackValue, attackValue, AttackProperties.DamageType.Standard, AttackProperties.TargetType.Single, 1, 0f); } EntityTemplates.CreateAndRegisterBaggedCreature(critter, pickup_only_from_top, pickup_allow_mark, pickup_use_gun); KPrefabID prefabID = critter.GetComponent <KPrefabID>(); prefabID.ProcessTags(tags); prefabID.prefabInitFn += delegate(GameObject inst) { inst.GetAttributes().Add(Db.Get().Attributes.MaxUnderwaterTravelCost); }; EntityTemplates.AddCreatureBrain(critter, chore_table, species, override_prefix); EntityTemplates.ExtendEntityToWildCreature(critter, space_requirement, lifespan); Diet diet = new Diet(diet_list.ToArray()); CreatureCalorieMonitor.Def calorieMonitor = critter.AddOrGetDef <CreatureCalorieMonitor.Def>(); calorieMonitor.diet = diet; calorieMonitor.minPoopSizeInCalories = calories_per_KG * min_poop_KG; critter.AddOrGetDef <SolidConsumerMonitor.Def>().diet = diet; if (is_baby) { EntityTemplates.ExtendEntityToBeingABaby(critter, adultId, dropOnMature); } else { FertilityMonitor.Def def = critter.AddOrGetDef <FertilityMonitor.Def>(); def.baseFertileCycles = fertility_cycles; def.eggPrefab = new Tag(eggId); def.initialBreedingWeights = egg_chances; KPrefabID creature_prefab_id = critter.GetComponent <KPrefabID>(); creature_prefab_id.prefabSpawnFn += delegate(GameObject inst) { WorldInventory.Instance.Discover(eggId.ToTag(), WorldInventory.GetCategoryForTags(egg_tags)); WorldInventory.Instance.Discover(babyId.ToTag(), WorldInventory.GetCategoryForTags(creature_prefab_id.Tags)); }; if (is_ranchable) { critter.AddOrGetDef <RanchableMonitor.Def>(); } critter.AddOrGetDef <FixedCapturableMonitor.Def>(); } if (setting.scales != null) { ScaleGrowthMonitor.Def def_scale = critter.AddOrGetDef <ScaleGrowthMonitor.Def>(); def_scale.defaultGrowthRate = setting.scales.growthRate ?? (setting.scales.growthRate ?? (1f / DreckoConfig.SCALE_GROWTH_TIME_IN_CYCLES / 600f)); def_scale.dropMass = setting.scales.mass ?? (DreckoConfig.FIBER_PER_CYCLE * DreckoConfig.SCALE_GROWTH_TIME_IN_CYCLES); def_scale.itemDroppedOnShear = setting.scales.drop ?? "Dirt"; def_scale.levelCount = setting.scales.levelCount ?? 6; def_scale.targetAtmosphere = (setting.scales.atmosphere ?? "Void").ToSimHash(); } if (setting.expulsion != null) { ElementDropperMonitor.Def def_morb = critter.AddOrGetDef <ElementDropperMonitor.Def>(); def_morb.dirtyEmitElement = (setting.expulsion.element ?? "Dirt").ToSimHash(); def_morb.dirtyProbabilityPercent = setting.expulsion.probability ?? 25f; def_morb.dirtyCellToTargetMass = setting.expulsion.cellTargetMass ?? 1f; def_morb.dirtyMassPerDirty = setting.expulsion.massPerDirt ?? 0.2f; def_morb.dirtyMassReleaseOnDeath = setting.expulsion.onDeath ?? 3f; def_morb.emitDiseaseIdx = Db.Get().Diseases.GetIndex(setting.expulsion.diseaseId ?? ""); def_morb.emitDiseasePerKg = setting.expulsion.diseaseAmount ?? 0f; } if (setting.light != null) { if (setting.light.color != Color.black) { Light2D light2D = critter.AddOrGet <Light2D>(); light2D.Color = setting.light.color ?? Color.white; light2D.overlayColour = TUNING.LIGHT2D.LIGHTBUG_OVERLAYCOLOR; light2D.Range = setting.light.range ?? 5f; light2D.Angle = 0f; light2D.Direction = TUNING.LIGHT2D.LIGHTBUG_DIRECTION; light2D.Offset = TUNING.LIGHT2D.LIGHTBUG_OFFSET; light2D.shape = LightShape.Circle; light2D.drawOverlay = true; light2D.Lux = setting.light.lux ?? 1800; critter.AddOrGet <LightSymbolTracker>().targetSymbol = "snapTo_light_locator"; critter.AddOrGetDef <CreatureLightToggleController.Def>(); } } } } }
public void test() { // configurations string id = "HatchHard"; string name = "Stone Hatch"; string desc = "Stone Hatches excrete solid Coal as waste and enjoy burrowing into the ground."; string anim_file = "hatch_kanim"; bool is_baby = false; string traitId = "HatchHardBaseTrait"; string override_prefix = "hvy_"; int space_requirement = HatchTuning.PEN_SIZE_PER_CREATURE; float lifespan = 100f; float mass = 100f; int width = 1; int height = 1; EffectorValues decor = TUNING.DECOR.BONUS.TIER0; string navGridName = !is_baby ? "WalkerNavGrid1x1" : "WalkerBabyNavGrid"; NavType navi = NavType.Floor; float moveSpeed = 2f; string dropOnDeath = "Meat"; int dropCount = 2; bool canDrown = true; bool canCrushed = false; float tempLowDeath = 243.15f; float tempLowWarning = 283.15f; float tempBorn = 293f; float tempHighWarning = 293.15f; float tempHighDeath = 343.15f; bool pickup_only_from_top = true; bool pickup_allow_mark = true; bool pickup_use_gun = false; Tag tag = GameTags.Creatures.Walker; Tag species = GameTags.Creatures.Species.HatchSpecies; float attackValue = 1f; ChoreTable.Builder chore_table = new ChoreTable.Builder().Add(new DeathStates.Def(), true).Add(new AnimInterruptStates.Def(), true).Add(new ExitBurrowStates.Def(), !is_baby).Add(new PlayAnimsStates.Def(GameTags.Creatures.Burrowed, true, "idle_mound", STRINGS.CREATURES.STATUSITEMS.BURROWED.NAME, STRINGS.CREATURES.STATUSITEMS.BURROWED.TOOLTIP), !is_baby).Add(new GrowUpStates.Def(), true).Add(new TrappedStates.Def(), true).Add(new IncubatingStates.Def(), true).Add(new BaggedStates.Def(), true).Add(new FallStates.Def(), true).Add(new StunnedStates.Def(), true).Add(new DrowningStates.Def(), true).Add(new DebugGoToStates.Def(), true).Add(new FleeStates.Def(), true).Add(new AttackStates.Def(), !is_baby).PushInterruptGroup().Add(new CreatureSleepStates.Def(), true).Add(new FixedCaptureStates.Def(), true).Add(new RanchedStates.Def(), true).Add(new PlayAnimsStates.Def(GameTags.Creatures.WantsToEnterBurrow, false, "hide", STRINGS.CREATURES.STATUSITEMS.BURROWING.NAME, STRINGS.CREATURES.STATUSITEMS.BURROWING.TOOLTIP), !is_baby).Add(new LayEggStates.Def(), true).Add(new EatStates.Def(), true).Add(new PlayAnimsStates.Def(GameTags.Creatures.Poop, false, "poop", STRINGS.CREATURES.STATUSITEMS.EXPELLING_SOLID.NAME, STRINGS.CREATURES.STATUSITEMS.EXPELLING_SOLID.TOOLTIP), true).Add(new CallAdultStates.Def(), true).PopInterruptGroup().Add(new IdleStates.Def(), true); string adultId = "HatchHard"; string eggId = "HatchHardBaby"; string eggName = "Stone Hatchling Egg"; string anim_egg = "egg_hatch_kanim"; float egg_mass = 2f; string dropOnMature = null; float fertility_cycles = 60f; float incubation_cycles = 20f; int egg_sortorder = 2; List <FertilityMonitor.BreedingChance> egg_chances = new List <FertilityMonitor.BreedingChance>(); egg_chances.Add(BreedingChance("HatchHardEgg", 1f)); bool is_ranchable = true; bool is_fish = false; float egg_scale = 1f; float calories_per_KG = 700000f / 140f; float min_poop_KG = 25; List <Diet.Info> diet_list = BaseHatchConfig.HardRockDiet(SimHashes.Carbon.CreateTag(), calories_per_KG, TUNING.CREATURES.CONVERSION_EFFICIENCY.NORMAL, null, 0f); // end of configurations // basic generation object obj = Activator.CreateInstance(typeof(HatchHardConfig)); KPrefabID obj_kPrefabID = (obj as HatchHardConfig).CreatePrefab().GetComponent <KPrefabID>(); obj_kPrefabID.prefabInitFn += (obj as HatchHardConfig).OnPrefabInit; obj_kPrefabID.prefabSpawnFn += (obj as HatchHardConfig).OnSpawn; Assets.AddPrefab(obj_kPrefabID); // advanced generation // critter = BaseHatchConfig.BaseHatch(id, name, desc, anim_file, traitId, is_baby, override_prefix); GameObject critter; critter = EntityTemplates.CreatePlacedEntity(id, name, desc, mass, Assets.GetAnim(anim_file), "idle_loop", Grid.SceneLayer.Creatures, width, height, decor, default(EffectorValues), SimHashes.Creature, null, tempBorn); EntityTemplates.ExtendEntityToBasicCreature(critter, FactionManager.FactionID.Pest, traitId, navGridName, navi, 32, moveSpeed, dropOnDeath, dropCount, canDrown, canCrushed, tempLowWarning, tempHighWarning, tempLowDeath, tempHighDeath); if (override_prefix != null) { critter.AddOrGet <SymbolOverrideController>().ApplySymbolOverridesByAffix(Assets.GetAnim(anim_file), override_prefix, null, 0); } critter.AddOrGet <Trappable>(); critter.AddOrGetDef <CreatureFallMonitor.Def>(); critter.AddOrGetDef <BurrowMonitor.Def>(); critter.AddOrGetDef <WorldSpawnableMonitor.Def>().adjustSpawnLocationCb = (int cell) => { return(cell); };//new Func<int, int>(BaseHatchConfig.AdjustSpawnLocationCB); critter.AddOrGetDef <ThreatMonitor.Def>().fleethresholdState = Health.HealthState.Dead; critter.AddWeapon(attackValue, attackValue, AttackProperties.DamageType.Standard, AttackProperties.TargetType.Single, 1, 0f); EntityTemplates.CreateAndRegisterBaggedCreature(critter, pickup_only_from_top, pickup_allow_mark, pickup_use_gun); KPrefabID prefabID = critter.GetComponent <KPrefabID>(); prefabID.AddTag(tag, false); prefabID.prefabInitFn += delegate(GameObject inst) { inst.GetAttributes().Add(Db.Get().Attributes.MaxUnderwaterTravelCost); }; EntityTemplates.AddCreatureBrain(critter, chore_table, species, override_prefix); EntityTemplates.ExtendEntityToWildCreature(critter, space_requirement, lifespan); Diet diet = new Diet(diet_list.ToArray()); CreatureCalorieMonitor.Def calorieMonitor = critter.AddOrGetDef <CreatureCalorieMonitor.Def>(); calorieMonitor.diet = diet; calorieMonitor.minPoopSizeInCalories = calories_per_KG * min_poop_KG; critter.AddOrGetDef <SolidConsumerMonitor.Def>().diet = diet; if (is_baby) { EntityTemplates.ExtendEntityToBeingABaby(critter, adultId, dropOnMature); } else { EntityTemplates.ExtendEntityToFertileCreature(critter, eggId, eggName, desc, anim_egg, egg_mass, eggId, fertility_cycles, incubation_cycles, egg_chances, egg_sortorder, is_ranchable, is_fish, true, egg_scale); } }