protected override IEnumerable <Toil> MakeNewToils() { Pawn patient = TargetA.Thing as Pawn; Toil gotoPatient = new Toil() { initAction = () => { pawn.pather.StartPath(TargetA, PathEndMode.Touch); }, defaultCompleteMode = ToilCompleteMode.PatherArrival }; yield return(gotoPatient); Toil doHealing = new Toil(); doHealing.initAction = delegate { if (age > duration) { this.EndJobWith(JobCondition.Succeeded); } if (patient.DestroyedOrNull() || patient.Dead) { this.EndJobWith(JobCondition.Incompletable); } }; doHealing.tickAction = delegate { if (patient.DestroyedOrNull() || patient.Dead) { this.EndJobWith(JobCondition.Incompletable); } if (Find.TickManager.TicksGame % 1 == 0) { EffectMaker.MakeEffect(ThingDef.Named("Mote_HealingMote"), this.pawn.DrawPos, this.Map, Rand.Range(.3f, .5f), (Quaternion.AngleAxis(90, Vector3.up) * GetVector(this.pawn.Position, patient.Position)).ToAngleFlat() + Rand.Range(-10, 10), 5f, 0); } if (age > (lastHeal + ticksTillNextHeal)) { DoHealingEffect(patient); EffectMaker.MakeEffect(ThingDef.Named("Mote_HealingCircles"), patient.DrawPos, this.Map, Rand.Range(.3f, .4f), 0, 0, Rand.Range(400, 500), Rand.Range(0, 360), .08f, .01f, .24f, false); lastHeal = age; if (this.injuryCount == 0) { this.EndJobWith(JobCondition.Succeeded); } } if (!patient.Drafted && patient.CurJobDef != JobDefOf.Wait) { if (patient.jobs.posture == PawnPosture.Standing) { Job job = new Job(JobDefOf.Wait, patient); patient.jobs.TryTakeOrderedJob(job, JobTag.Misc); } } age++; ticksLeftThisToil = duration - age; if (age > duration) { this.EndJobWith(JobCondition.Succeeded); } }; doHealing.defaultCompleteMode = ToilCompleteMode.Delay; doHealing.defaultDuration = this.duration; doHealing.WithProgressBar(TargetIndex.B, delegate { if (this.pawn.DestroyedOrNull() || this.pawn.Dead) { return(1f); } return(1f - (float)doHealing.actor.jobs.curDriver.ticksLeftThisToil / this.duration); }, false, 0f); doHealing.AddFinishAction(delegate { CompWizardry comp = pawn.GetComp <CompWizardry>(); PawnAbility pawnAbility = comp.AbilityData.Powers.FirstOrDefault((PawnAbility x) => x.Def == WizardryDefOf.LotRW_Nienna_HealingTouch); pawnAbility.PostAbilityAttempt(); patient.jobs.EndCurrentJob(JobCondition.Succeeded, true); }); yield return(doHealing); }
private static void DoPhase(Pawn caster, IntVec3 targetCell, PawnAbility ability, Thing carriedThing) { JobDef retainJobDef = caster.CurJobDef; LocalTargetInfo retainTargetA = caster.CurJob.targetA; int retainCount = 1; if (retainTargetA.Thing != null && retainTargetA.Thing.stackCount != 1) { retainCount = retainTargetA.Thing.stackCount; } LocalTargetInfo retainTargetB = caster.CurJob.targetB; LocalTargetInfo retainTargetC = caster.CurJob.targetC; Pawn p = caster; Thing cT = carriedThing; if (cT != null && cT.stackCount != 1) { retainCount = cT.stackCount; } Map map = caster.Map; IntVec3 casterCell = caster.Position; bool selectCaster = false; if (Find.Selector.FirstSelectedObject == caster) { selectCaster = true; } try { for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } caster.DeSpawn(); GenSpawn.Spawn(p, targetCell, map); if (carriedThing != null) { carriedThing.DeSpawn(); GenPlace.TryPlaceThing(cT, targetCell, map, ThingPlaceMode.Near); //GenSpawn.Spawn(cT, targetCell, map); } caster.GetComp <CompAbilityUserMight>().MightUserXP -= 50; ability.PostAbilityAttempt(); if (selectCaster) { Find.Selector.Select(caster, false, true); } for (int i = 0; i < 3; i++) { TM_MoteMaker.ThrowGenericMote(ThingDefOf.Mote_Smoke, caster.DrawPos, caster.Map, Rand.Range(.6f, 1f), .4f, .1f, Rand.Range(.8f, 1.2f), 0, Rand.Range(2, 3), Rand.Range(-30, 30), 0); TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_Enchanting, caster.DrawPos, caster.Map, Rand.Range(1.4f, 2f), .2f, .05f, Rand.Range(.4f, .6f), Rand.Range(-200, 200), 0, 0, 0); } Job job = new Job(retainJobDef, retainTargetA, retainTargetB, retainTargetC) { count = retainCount, playerForced = false }; //caster.jobs.TryTakeOrderedJob(); caster.jobs.StartJob(job); } catch { if (!caster.Spawned) { GenSpawn.Spawn(p, casterCell, map); } } }
protected override IEnumerable <Toil> MakeNewToils() { if (TargetA.Thing != null) { targetThing = TargetA.Thing; } Toil gotoThing = new Toil() { initAction = () => { pawn.pather.StartPath(TargetA, PathEndMode.Touch); }, defaultCompleteMode = ToilCompleteMode.PatherArrival }; yield return(gotoThing); Toil doSpell = new Toil(); doSpell.initAction = delegate { if (ability != null) { this.duration = (int)(ability.Def.MainVerb.warmupTime * 60 * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); } if (age > duration) { this.EndJobWith(JobCondition.Succeeded); } if (targetThing != null && (targetThing.DestroyedOrNull() || targetThing.Map == null)) { this.EndJobWith(JobCondition.Incompletable); } if (targetThing != null) { this.pawn.rotationTracker.FaceTarget(targetThing); } }; doSpell.tickAction = delegate { if (targetThing != null && (targetThing.DestroyedOrNull() || targetThing.Map == null)) { this.EndJobWith(JobCondition.Incompletable); } age++; ticksLeftThisToil = duration - age; if (Find.TickManager.TicksGame % 12 == 0) { TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f)); } if (age > duration) { this.EndJobWith(JobCondition.Succeeded); } }; doSpell.defaultCompleteMode = ToilCompleteMode.Never; doSpell.defaultDuration = this.duration; doSpell.AddFinishAction(delegate { if (ability != null) { if (ability.Def == TorannMagicDefOf.TM_Transmutate && targetThing != null) { bool flagRawResource = false; bool flagStuffItem = false; bool flagNoStuffItem = false; bool flagNutrition = false; bool flagCorpse = false; TM_Calc.GetTransmutableThingFromCell(targetThing.Position, pawn, out flagRawResource, out flagStuffItem, out flagNoStuffItem, out flagNutrition, out flagCorpse); TM_Action.DoTransmutate(pawn, targetThing, flagNoStuffItem, flagRawResource, flagStuffItem, flagNutrition, flagCorpse); } else if (ability.Def == TorannMagicDefOf.TM_RegrowLimb) { AbilityUser.SpawnThings tempThing = new SpawnThings(); tempThing.def = ThingDef.Named("SeedofRegrowth"); Verb_RegrowLimb.SingleSpawnLoop(tempThing, TargetA.Cell, pawn.Map); } ability.PostAbilityAttempt(); } //AssignXP(); }); yield return(doSpell); }