/// <summary> Add mutations to the given part. </summary> private void AddMutationToPart(BodyPartRecord record, [NotNull] Pawn pawn, AnimalClassBase aClass = null, bool recursive = false, MutagenDef mutagen = null) { MutationDef mutation; if (aClass != null) { mutation = aClass?.GetAllMorphsInClass() .SelectMany(m => m.GetMutationForPart(record.def)) .RandomElementWithFallback(); } else { mutation = MutationUtilities.GetMutationsByPart(record.def).RandomElementWithFallback(); } if (mutation != null) { MutationUtilities.AddMutation(pawn, mutation, record); } mutagen?.TryApplyAspects(pawn); if (recursive) // Recursively add mutations to child parts. { foreach (BodyPartRecord cPart in record.GetDirectChildParts()) { AddMutationToPart(cPart, pawn, aClass, true, mutagen); } } }
private void ApplyMutagenicBuildup(Pawn curOccupant) { HediffDef hediffDef = MorphTransformationDefOf.MutagenicBuildup; var hediff = curOccupant.health.hediffSet.GetFirstHediffOfDef(hediffDef); if (hediff == null) { hediff = HediffMaker.MakeHediff(hediffDef, curOccupant); hediff.Severity = _initialSeverity; curOccupant.health.AddHediff(hediff); return; } if (hediff.Severity > MAX_SEVERITY) { return; } float sevOffset = GetSeverityOffset(curOccupant); if (sevOffset < EPSILON) { return; } MutationUtilities.AdjustMutagenicBuildup(curOccupant, sevOffset); }
private void DoPawnsMutagenicDamage(Map map) { List <Pawn> allPawnsSpawned = map.mapPawns.AllPawnsSpawned; var mutagen = MutagenDefOf.defaultMutagen; for (int i = 0; i < allPawnsSpawned.Count; i++) { Pawn pawn = allPawnsSpawned[i]; if (!pawn.Position.Roofed(map) && mutagen.CanInfect(pawn)) { float num = 0.028758334f; num *= pawn.GetMutagenicBuildupMultiplier(); if (num != 0f) { float num2 = Mathf.Lerp(0.85f, 1.15f, Rand.ValueSeeded(pawn.thingIDNumber ^ 0x46EDC5D)); //should be ok num *= num2; //what's the magic number? MutationUtilities.AdjustMutagenicBuildup(pawn, num); } } } }