protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDespawnedNullOrForbidden(TurretInd); yield return(Toils_Goto.GotoCell(TurretInd, PathEndMode.Touch)); Toil upgrade = new Toil(); upgrade.initAction = delegate { UpgradableComp.ResolveWorkToUpgrade(); }; upgrade.tickAction = delegate { Pawn actor = upgrade.actor; actor.skills.Learn(SkillDefOf.Construction, SkillTuning.XpPerTickConstruction); float constructionSpeed = actor.GetStatValue(StatDefOf.ConstructionSpeed); if (TargetThingA.def.MadeFromStuff) { constructionSpeed *= TargetThingA.Stuff.GetStatValueAbstract(StatDefOf.ConstructionSpeedFactor); } float successChance = actor.GetStatValue(StatDefOf.ConstructSuccessChance) * UpgradableComp.Props.upgradeSuccessChanceFactor; if (Rand.Value < 1f - Mathf.Pow(successChance, constructionSpeed / UpgradableComp.upgradeWorkTotal) && UpgradableComp.Props.upgradeFailable) { UpgradableComp.upgradeWorkDone = 0f; FailUpgrade(actor, successChance, TargetThingA); ReadyForNextToil(); } UpgradableComp.upgradeWorkDone += constructionSpeed; if (UpgradableComp.upgradeWorkDone >= UpgradableComp.upgradeWorkTotal) { UpgradableComp.ResolveUpgrade(); Map.designationManager.TryRemoveDesignationOn(TargetThingA, TE_DesignationDefOf.UpgradeTurret); actor.records.Increment(TE_RecordDefOf.TurretsUpgraded); actor.jobs.EndCurrentJob(JobCondition.Succeeded); } }; upgrade.FailOnCannotTouch(TurretInd, PathEndMode.Touch); upgrade.WithEffect(TargetThingA.def.repairEffect, TurretInd); upgrade.WithProgressBar(TurretInd, () => UpgradableComp.upgradeWorkDone / UpgradableComp.upgradeWorkTotal); upgrade.defaultCompleteMode = ToilCompleteMode.Never; upgrade.activeSkill = (() => SkillDefOf.Construction); yield return(upgrade); yield break; }
private Toil Upgrade() { Toil upgrade = new Toil(); upgrade.tickAction = delegate { Pawn actor = upgrade.actor; actor.skills.Learn(SkillDefOf.Construction, SkillTuning.XpPerTickConstruction); float constructionSpeed = actor.GetStatValue(StatDefOf.ConstructionSpeed); if (TargetThingA.def.MadeFromStuff) { constructionSpeed *= TargetThingA.Stuff.GetStatValueAbstract(StatDefOf.ConstructionSpeedFactor); } float successChance = actor.GetStatValue(StatDefOf.ConstructSuccessChance) * UpgradableComp.Props.upgradeSuccessChanceFactor; if (Rand.Value < 1f - Mathf.Pow(successChance, constructionSpeed / UpgradableComp.upgradeWorkTotal) && UpgradableComp.Props.upgradeFailable) { UpgradableComp.upgradeWorkDone = 0f; FailUpgrade(actor, successChance, TargetThingA); ReadyForNextToil(); } UpgradableComp.upgradeWorkDone += constructionSpeed; if (UpgradableComp.upgradeWorkDone >= UpgradableComp.upgradeWorkTotal) { UpgradableComp.Upgrade(); Map.designationManager.TryRemoveDesignationOn(TargetThingA, DesignationDefOf.UpgradeTurret); actor.records.Increment(RecordDefOf.TurretsUpgraded); actor.jobs.EndCurrentJob(JobCondition.Succeeded); } }; upgrade.FailOnThingMissingDesignation(TurretInd, DesignationDefOf.UpgradeTurret); upgrade.FailOnCannotTouch(TurretInd, PathEndMode.Touch); upgrade.WithEffect(UpgradableComp.Props.UpgradeEffect((Building)job.GetTarget(TurretInd).Thing), TurretInd); upgrade.WithProgressBar(TurretInd, () => UpgradableComp.upgradeWorkDone / UpgradableComp.upgradeWorkTotal); upgrade.defaultCompleteMode = ToilCompleteMode.Never; upgrade.activeSkill = (() => SkillDefOf.Construction); return(upgrade); }