public override void OnSucessfullCast(Saveable_Caster caster, IEnumerable <Thing> targets, IExposable effectState) { MapComponent_Ability component = MapComponent_Ability.GetOrCreate(); foreach (Pawn target in targets) { AbilityEffect_UtilityChangeKind evolveItem = this.items.First(i => i.from.Contains(target.def)); Brain brain = target.GetSquadBrain(); foreach (PawnKindDef kind in evolveItem.to) { Pawn newPawn = AbilityEffect_Revive.Copy(caster.pawn, kind, target.Faction); GenSpawn.Spawn(newPawn, target.Position); if (brain != null) { brain.AddPawn(newPawn); } } Building building = StoreUtility.StoringBuilding(target); if (building != null) { ((Building_Storage)building).Notify_LostThing(target); } target.Destroy(DestroyMode.Vanish); } }
public override ThinkResult TryIssueJobPackage(Pawn pawn) { Saveable_Caster cachePawn = MapComponent_Ability.GetOrCreate().GetPawnHabilty(pawn); if (cachePawn.whaitingForThinkNode) { cachePawn.whaitingForThinkNode = false; Saveable_ExecutionLog log = cachePawn.GetLog(cachePawn.currentAbility); log.numberOfExecution++; log.ticksSinceExecution = 0; return(new ThinkResult(new Job(cachePawn.currentAbility.effect.StartJob(cachePawn.effectState)), this)); } return(ThinkResult.NoJob); }
protected override void FillTab() { Saveable_Caster pawn = MapComponent_Ability.GetOrCreate().GetPawnHabilty(this.HabilityPawn()); float num = 10; Rect rect; Text.Font = GameFont.Small; if (this.ShowMana(pawn)) { rect = new Rect(10, num, this.size.x - 20 - 30, 22); Text.Anchor = TextAnchor.MiddleLeft; GUI.DrawTexture(rect, BaseContent.BlackTex); float mana = pawn.manaValue; GUI.DrawTexture(new Rect(rect.xMin, rect.yMin, rect.width * mana / 100, rect.height), ITab_Pawn_Ability.manaColor); GUI.Label(new Rect(rect.xMin + 5, rect.yMin, rect.width - 10, rect.height), "AbilityPack.Mana".Translate() + mana.ToString("N1")); num += 22 + 10; } if (this.ShowAbility(pawn)) { rect = new Rect(10, num, this.size.x - 20, this.size.y - 10 - num); GUI.color = abilityLabelColor; Text.Anchor = TextAnchor.LowerLeft; Widgets.Label(new Rect(15, num, this.size.x - 20, 22f), "AbilityPack.Abilities".Translate()); num += 22; this.WriteLine(ref num, "AbilityPack.ExecutionNumber".Translate(), "AbilityPack.TicksSinseExecution".Translate(), "AbilityPack.AbilityName".Translate()); foreach (Saveable_ExecutionLog log in pawn.executionLogs.Where(i => i.isValid && i.ability.visible)) { this.WriteLine(ref num, log.numberOfExecution.ToString(), log.ticksSinceExecution.ToString(), log.ability.label); } Text.Anchor = TextAnchor.UpperLeft; } }
protected override IEnumerable <Toil> MakeNewToils() { Saveable_Caster caster = MapComponent_Ability.GetOrCreate().GetPawnHabilty(this.pawn); return(caster.currentAbility.effect.MakeNewToils(this, caster, caster.Targets, caster.effectState)); }
public override void OnSucessfullCast(Saveable_Caster caster, IEnumerable <Thing> targets, IExposable effectState) { MapComponent_Ability component = MapComponent_Ability.GetOrCreate(); Brain brain = caster.pawn.GetSquadBrain(); foreach (Corpse corpse in targets) { List <PawnKindDef> newKinds = new List <PawnKindDef>(); if (this.changes != null) { AbilityEffect_UtilityChangeKind kind = this.changes.FirstOrDefault(i => i.from.Contains(corpse.innerPawn.def)); if (kind != null) { newKinds.AddRange(kind.to); } else { newKinds.Add(corpse.innerPawn.kindDef); } } else { newKinds.Add(corpse.innerPawn.kindDef); } foreach (PawnKindDef kindDef in newKinds) { Pawn newPawn = AbilityEffect_Revive.Copy(caster.pawn, kindDef, this.changeFaction ? caster.pawn.Faction : corpse.innerPawn.Faction); if (corpse.innerPawn == caster.pawn) { component.ReplacePawnAbility(caster, newPawn); } IntVec3 position = corpse.Position; GenSpawn.Spawn(newPawn, position); if ((newPawn.Faction == caster.pawn.Faction) && (brain != null)) { brain.AddPawn(newPawn); } } Building building = StoreUtility.StoringBuilding(corpse); if (building != null) { ((Building_Storage)building).Notify_LostThing(corpse); } corpse.Destroy(DestroyMode.Vanish); //if (this.healUntil > 0) //{ // HediffSet hediffSet = newPawn.healthTracker.hediffSet; // while ((newPawn.healthTracker.summaryHealth.SummaryHealthPercent >= this.healUntil) && // (AbilityEffect_Revive.HittablePartsViolence(hediffSet).Any<BodyPartRecord>())) // { // BodyPartRecord bodyPartRecord = AbilityEffect_Revive.HittablePartsViolence(hediffSet).RandomElementByWeight((BodyPartRecord x) => x.absoluteFleshCoverage); // int amount = Rand.RangeInclusive(8, 25); // DamageDef def; // if (bodyPartRecord.depth == BodyPartDepth.Outside) // def = HealthUtility.RandomViolenceDamageType(); // else // def = DamageDefOf.Blunt; // DamageInfo dinfo = new DamageInfo(def, amount, null, new BodyPartDamageInfo?(new BodyPartDamageInfo(bodyPartRecord, false, (List<HediffDef>)null)), null); // newPawn.TakeDamage(dinfo); // } //} } }
public void AddMote(Saveable_Mote mote) { mote.InitializeMote(ref mote.mote); this.currentMotes.Add(mote); MapComponent_Ability.GetOrCreate().completingMotes.Add(mote); }