private static Toil FinalizeMaintenance(Pawn targetPawn, Need_Maintenance need, Toil jumpToIfFailed) { Toil toil = new Toil(); toil.initAction = delegate { Pawn actor = toil.actor; float combatPowerCapped = targetPawn.kindDef.combatPower <= 10000 ? targetPawn.kindDef.combatPower : 300; float successChance = actor.GetStatValue(WTH_DefOf.WTH_HackingSuccessChance, true); if (Rand.Chance(successChance)) { actor.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.5f, false); actor.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.5f, false); need.RestoreUsingParts(actor.carryTracker.CarriedThing.stackCount); Thing part = actor.CurJob.targetB.Thing; if (!part.Destroyed) { part.Destroy(DestroyMode.Vanish); } } else { actor.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.25f, false); actor.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.25f, false); MoteMaker.ThrowText((actor.DrawPos + targetPawn.DrawPos) / 2f, actor.Map, "WTH_TextMote_MaintenanceFailed".Translate(new object[] { successChance.ToStringPercent() }), 8f); Thing part = actor.CurJob.targetB.Thing; if (!part.Destroyed) { part.Destroy(DestroyMode.Vanish); } actor.jobs.curDriver.JumpToToil(jumpToIfFailed); } }; return(toil); }
private static void MaintainMechsIfNeeded(Caravan caravan, List <Thing> allParts, List <Pawn> allHackedMechs) { Thing partItem = allParts.First(); List <Pawn> allPawnsCapableOfMaintenance = caravan.AllThings.Where((Thing t) => t is Pawn pawn && !pawn.Dead && !pawn.Downed).Cast <Pawn>().ToList(); if (allPawnsCapableOfMaintenance.NullOrEmpty()) { return; } List <Pawn> allMechsNeedingMaintenance = allHackedMechs.Where((Pawn p) => p.needs.TryGetNeed <Need_Maintenance>() is Need_Maintenance needM && needM.CurLevelPercentage < 0.5f).ToList(); if (allMechsNeedingMaintenance.NullOrEmpty()) { return; } Pawn bestPawn = allPawnsCapableOfMaintenance.MaxBy((Pawn p) => p.skills.AverageOfRelevantSkillsFor(WTH_DefOf.WTH_Hack)); float successChance = bestPawn.GetStatValue(WTH_DefOf.WTH_HackingSuccessChance, true); if (successChance < 0.20f) { return; } Pawn chosenMech = allMechsNeedingMaintenance.RandomElement(); Need_Maintenance need = chosenMech.needs.TryGetNeed <Need_Maintenance>(); int partsAvailable = Math.Min(need.PartsNeededToRestore(), partItem.stackCount); float combatPowerCapped = chosenMech.kindDef.combatPower <= 10000 ? chosenMech.kindDef.combatPower : 300; if (Rand.Chance(successChance)) { bestPawn.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.5f, false); bestPawn.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.5f, false); need.RestoreUsingParts(partsAvailable); } else { bestPawn.skills.Learn(SkillDefOf.Crafting, combatPowerCapped * 0.25f, false); bestPawn.skills.Learn(SkillDefOf.Intellectual, combatPowerCapped * 0.25f, false); } partItem.SplitOff(partsAvailable); }