コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }