using System; using System.Collections.Generic; using System.Linq; using Verse; using rjw; using Autopsy; using HarmonyLib; namespace RJW_patch_Autopsy { [HarmonyPatch(typeof(NewMedicalRecipesUtility), nameof(NewMedicalRecipesUtility.TraverseBody))] public static class NewMedicalRecipesUtilityPatch { private const bool DO_LOG = false; private static void log(String message) { if (DO_LOG) { Log.Message(message); } } [HarmonyPostfix] public static IEnumerable AddRjwParts(IEnumerable __result, RecipeInfo recipeInfo, Corpse corpse, float skillChance) { /*//Collect vanilla parts var core = corpse.InnerPawn.RaceProps.body.corePart; var queue = new List {core}; var hediffSet = corpse.InnerPawn.health.hediffSet; var results = new List(); var damagedParts = new List(); while (queue.Count > 0) { var part = queue.First(); queue.Remove(part); //Drop parts and bionics that are higher on the body tree. if (NewMedicalRecipesUtility.TryGetParts(corpse, recipeInfo, part, skillChance, ref results, ref damagedParts) && core != part) continue; queue.AddRange(part.parts.Where(x => !hediffSet.PartIsMissing(x))); } foreach (var part in damagedParts) NewMedicalRecipesUtility.DamageHarvested(corpse.InnerPawn, part); */ var results = __result.ToList(); log($"Collected {results.Count} vanilla parts"); //Collect rjw rediffs var rjwNaturalDiffs = (from x in corpse.InnerPawn.health.hediffSet.hediffs where x is Hediff_PartBaseNatural select x).ToList(); var rjwArtificialDiffs = (from x in corpse.InnerPawn.health.hediffSet.hediffs where x is Hediff_PartBaseArtifical select x).ToList(); log($"Collected {rjwNaturalDiffs.Count} natural and {rjwArtificialDiffs.Count} artificial hediffs"); //Collect parts from hediffs rjw's surgery methods var rjwNaturalThings = rjwNaturalDiffs.Select(hediff => { var tmp = SexPartAdder.recipePartRemover(hediff); Log.Message($"obtained ${tmp} from ${hediff} via rjw"); return tmp; }).ToList(); var rjwArtificialThings = rjwArtificialDiffs.Select(hediff => { var tmp = SexPartAdder.recipePartRemover(hediff); Log.Message($"obtained ${tmp} from ${hediff} via rjw"); return tmp; }).ToList(); log( $"Collected {rjwNaturalThings.Count} things from {rjwNaturalDiffs.Count} natural and {rjwArtificialThings.Count} things from {rjwArtificialDiffs.Count} artificial hediffs"); //Simulate success chance scaled with skill etc. rjwNaturalThings.ForEach(t => { if (Rand.Chance(Math.Min(skillChance, recipeInfo.NaturalChance))) results.Add(t); }); rjwArtificialThings.ForEach(t => { if (Rand.Chance(Math.Min(skillChance, recipeInfo.BionicChance))) results.Add(t); }); //Remove all parts that were tried to harvest from the corpse rjwNaturalDiffs.ForEach(d => corpse.InnerPawn.health.RemoveHediff(d)); rjwArtificialDiffs.ForEach(d => corpse.InnerPawn.health.RemoveHediff(d)); if (results.Count > recipeInfo.PartNumber) { var random = new Random(); results = results.OrderBy(i => random.Next()).Take(recipeInfo.PartNumber).ToList(); } foreach (var result in results) { yield return result; } // return false; } } }