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);
        }
Beispiel #2
0
        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);
        }