/// <summary>called every once and a while</summary> public override void TickRare() { if (!Spawned || !LoadedModManager.GetMod <PawnmorpherMod>().GetSettings <PawnmorpherSettings>().enableMutagenMeteor) { return; } IEnumerable <Thing> enumerable = GenRadial.RadialDistinctThingsAround(Position, Map, 2.5f, true); var mutagen = MutagenDefOf.defaultMutagen; foreach (Thing thing in enumerable) { if (thing is Pawn pawn) { MutatePawn(pawn, mutagen); } else if (thing is Plant plant) { if (Rand.Value >= _p) { continue; } PMPlantUtilities.TryMutatePlant(plant); } } }
private void SubstitutePlant([NotNull] Plant plant) { var plantDef = PMPlantUtilities.GetMutantVersionOf(plant); var pos = plant.Position; var map = plant.Map; if (plantDef != null) //spawn a new plant { var newPlant = (Plant)GenSpawn.Spawn(plantDef, pos, map); newPlant.Growth = plant.Growth * 1.3f; // Make the new plant a little more mature then the one that was substituted. } plant.Kill(); }
private void MutateInRadius(float radius, HediffDef hediff) { IntVec3 c = parent.Position + (Rand.InsideUnitCircleVec3 * radius).ToIntVec3(); if (!c.InBounds(parent.Map)) { return; } foreach (Pawn pawn in _pawnsCache) { float distanceTo = pawn.Position.DistanceTo(parent.Position); if (distanceTo < radius) //make pawns closer to the mutagenic ship mutate faster { //also increase the effect as the radius increases float rHat = distanceTo / radius; float baseMRate; if (rHat <= EPSILON) { baseMRate = BASE_BUILDUP_RATE; } else { baseMRate = A / (Mathf.Pow(rHat, DISTANCE_POW)); } MutatePawn(pawn, baseMRate); } } Plant plant = c.GetPlant(parent.Map); if (plant != null && !plant.def.IsMutantPlant()) //don't harm mutant plants { if (!plant.LeaflessNow) { plant.MakeLeafless(Plant.LeaflessCause.Poison); } else if (Rand.Value < 0.3f) //30% chance { PMPlantUtilities.TryMutatePlant(plant); } } }