public static void EvaluateMinSeverity(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, float minSeverity, out bool success) { success = false; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyInjuredPawn(caster, (int)(abilitydef.MainVerb.range * .9f), minSeverity); float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null) { if (abilitydef == TorannMagicDefOf.TM_CauterizeWound && jobTarget.Thing is Pawn) { Pawn targetPawn = jobTarget.Thing as Pawn; if (targetPawn.health.HasHediffsNeedingTend(false)) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); job.endIfCantShootTargetFromCurPos = true; caster.jobs.TryTakeOrderedJob(job); success = true; } } else { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } } }
public static void Evaluate(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, bool inCombat, bool reverse, out bool success) //reverse == true transfers mana to caster { success = false; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyMage(caster, (int)(abilitydef.MainVerb.range * .9f), inCombat); if (!inCombat && jobTarget != null && jobTarget.Thing != null) { Pawn transferPawn = jobTarget.Thing as Pawn; CompAbilityUserMagic tComp = transferPawn.GetComp <CompAbilityUserMagic>(); if (reverse) { if (casterComp.Mana.CurLevel >= .3f || tComp.Mana.CurLevel <= .9f) { jobTarget = null; } } else { if (casterComp.Mana.CurLevel <= .9f || tComp.Mana.CurLevel >= .9f) { jobTarget = null; } } } float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } }
public static void EvaluateMinRange(CompAbilityUserMight casterComp, TMAbilityDef abilitydef, PawnAbility ability, MightPower power, float minRange, out bool success) { success = false; if (casterComp.Stamina.CurLevel >= abilitydef.staminaCost && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyEnemy(caster, (int)(abilitydef.MainVerb.range * .9f)); if (jobTarget != null && jobTarget.Thing != null && abilitydef == TorannMagicDefOf.TM_AntiArmor) { Pawn targetPawn = jobTarget.Thing as Pawn; if (targetPawn.RaceProps.IsFlesh) { jobTarget = null; } } float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (jobTarget != null && jobTarget.Thing != null && (distanceToTarget > minRange && distanceToTarget < (abilitydef.MainVerb.range * .9f)) && TM_Calc.HasLoSFromTo(caster.Position, jobTarget, caster, 0, abilitydef.MainVerb.range)) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); job.endIfCantShootTargetFromCurPos = true; caster.jobs.TryTakeOrderedJob(job); success = true; } } }
public static void Evaluate(CompAbilityUserMight mightComp, TMAbilityDef abilitydef, PawnAbility ability, MightPower power, int minTargetCount, int radiusAround, IntVec3 evaluatedCenter, bool hostile, out bool success) { success = false; if (mightComp.Stamina.CurLevel >= abilitydef.staminaCost && ability.CooldownTicksLeft <= 0) { Pawn caster = mightComp.Pawn; List <Pawn> targetList = TM_Calc.FindPawnsNearTarget(caster, radiusAround, evaluatedCenter, hostile); if (targetList != null) { LocalTargetInfo jobTarget = null; if (targetList.Count >= minTargetCount && (abilitydef == TorannMagicDefOf.TM_BladeSpin)) { jobTarget = caster; } if (jobTarget != null && jobTarget.Thing != caster) { float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; } if (jobTarget != null && jobTarget.Thing != null) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } } }
public static void Evaluate(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, HediffDef hediffDef, out bool success) { success = false; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyPawn(caster, (int)(abilitydef.MainVerb.range * .9f)); float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null && jobTarget.Thing is Pawn) { Pawn targetPawn = jobTarget.Thing as Pawn; if (targetPawn.RaceProps.Humanlike && targetPawn.IsColonist) { bool tatteredApparel = false; //List<Thought_Memory> targetPawnThoughts = null; //targetPawn.needs.mood.thoughts.GetDistinctMoodThoughtGroups(targetPawnThoughts); //Log.Message("target pawn is " + targetPawn.LabelShort); //List<Thought_Memory> targetPawnThoughts = targetPawn.needs.mood.thoughts.memories.Memories; //for (int i = 0; i < targetPawnThoughts.Count; i++) //{ // if (targetPawnThoughts[i].def == ThoughtDefOf.ApparelDamaged) // { // tatteredApparel = true; // } //} List <Apparel> apparel = targetPawn.apparel.WornApparel; for (int i = 0; i < apparel.Count; i++) { //Log.Message("evaluating equipment " + apparel[i].def.defName + " with hitpoint % of " + (float)(apparel[i].HitPoints/ apparel[i].MaxHitPoints) + " or " + (float)(apparel[i].HitPoints) / (float)(apparel[i].MaxHitPoints)); if (((float)(apparel[i].HitPoints) / (float)(apparel[i].MaxHitPoints)) < .5f) { tatteredApparel = true; } } if (targetPawn.equipment.Primary != null) { if ((float)(targetPawn.equipment.Primary.HitPoints) / (float)(targetPawn.equipment.Primary.MaxHitPoints) < .5f) { tatteredApparel = true; } } if (!targetPawn.health.hediffSet.HasHediff(hediffDef, false) && tatteredApparel) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } } } }
public static void Evaluate(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, out bool success) { success = false; Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = caster.Position; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0 && jobTarget != null) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } }
public static void TryExecute(CompAbilityUserMight casterComp, TMAbilityDef abilitydef, PawnAbility ability, MightPower power, LocalTargetInfo target, out bool success) { success = false; if (casterComp.Stamina.CurLevel >= abilitydef.staminaCost && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = target; float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range) && jobTarget != null && jobTarget.Thing != null) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } }
public static void EvaluateMinRange(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, float minRange, out bool success) { success = false; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyEnemy(caster, (int)(abilitydef.MainVerb.range * .9f)); float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget > minRange && distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null && TM_Calc.HasLoSFromTo(caster.Position, jobTarget, caster, 0, abilitydef.MainVerb.range)) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); job.endIfCantShootTargetFromCurPos = true; caster.jobs.TryTakeOrderedJob(job); success = true; } } }
public static void EvaluateMinSeverity(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, float minSeverity, out bool success) { success = false; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyPermanentlyInjuredPawn(caster, (int)(abilitydef.MainVerb.range * .9f), minSeverity); float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; TM_Action.TM_Toils.GotoAndWait(jobTarget.Thing as Pawn, caster, Mathf.RoundToInt(ability.Def.MainVerb.warmupTime * 60)); } } }
public static void Evaluate(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, float minDistance, out bool success) { success = false; Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = caster.CurJob.targetA; float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; Vector3 directionToTarget = TM_Calc.GetVector(caster.Position, jobTarget.Cell); if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0 && jobTarget.Thing != null && jobTarget.Thing.def.EverHaulable) { //Log.Message("summon: " + caster.LabelShort + " job def is " + caster.CurJob.def.defName + " targetA " + caster.CurJob.targetA + " targetB " + caster.CurJob.targetB + " jobTarget " + jobTarget + " at distance " + distanceToTarget + " min distance " + minDistance + " at vector " + directionToTarget); if (distanceToTarget > minDistance && distanceToTarget < abilitydef.MainVerb.range && caster.CurJob.locomotionUrgency >= LocomotionUrgency.Jog && caster.CurJob.bill == null && distanceToTarget < 200) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } }
public static void TryExecute(CompAbilityUser casterComp, AbilityDef abilitydef, PawnAbility ability, LocalTargetInfo target, int minRange, out bool success) { success = false; if (ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = target; float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget > minRange && distanceToTarget < (abilitydef.MainVerb.range * .9f) && jobTarget != null && jobTarget.Thing != null && Functions.Eval.HasLoSFromTo(caster.Position, jobTarget, caster, 0, abilitydef.MainVerb.range)) { Log.Message("ability is " + ability.Def.defName + " target is " + jobTarget.Thing.LabelShort + " caster job is " + caster.CurJob); Job job = ability.GetJob(AbilityContext.AI, jobTarget); Log.Message("job is " + job); job.endIfCantShootTargetFromCurPos = true; caster.jobs.TryTakeOrderedJob(job); success = true; } //a small change to test a push } }
public static void Evaluate(CompAbilityUserMight casterComp, TMAbilityDef abilitydef, PawnAbility ability, MightPower power, out bool success) { success = false; if (casterComp.Stamina.CurLevel >= abilitydef.staminaCost && ability.CooldownTicksLeft <= 0) { Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = TM_Calc.FindNearbyFighter(caster, (int)(abilitydef.MainVerb.range * 1.5f), false); float distanceToTarget = (jobTarget.Cell - caster.Position).LengthHorizontal; if (distanceToTarget < (abilitydef.MainVerb.range * 1.5f) && jobTarget != null && jobTarget.Thing != null && jobTarget.Thing is Pawn) { Pawn targetPawn = jobTarget.Thing as Pawn; CompAbilityUserMight targetPawnComp = targetPawn.GetComp <CompAbilityUserMight>(); if (targetPawn.CurJobDef.joyKind != null || targetPawn.CurJobDef == JobDefOf.Wait_Wander || targetPawn.CurJobDef == JobDefOf.GotoWander) { if (targetPawn.IsColonist && targetPawnComp.MightUserLevel < casterComp.MightUserLevel && caster.relations.OpinionOf(targetPawn) >= 0) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } } } }
public static void Evaluate(CompAbilityUserMagic casterComp, TMAbilityDef abilitydef, PawnAbility ability, MagicPower power, out bool success) { success = false; Pawn caster = casterComp.Pawn; LocalTargetInfo jobTarget = caster; if (casterComp.Mana.CurLevel >= casterComp.ActualManaCost(abilitydef) && ability.CooldownTicksLeft <= 0 && jobTarget.Thing != null) { float injurySeverity = 0; using (IEnumerator <BodyPartRecord> enumerator = caster.health.hediffSet.GetInjuredParts().GetEnumerator()) { while (enumerator.MoveNext()) { BodyPartRecord rec = enumerator.Current; IEnumerable <Hediff_Injury> arg_BB_0 = caster.health.hediffSet.GetHediffs <Hediff_Injury>(); Func <Hediff_Injury, bool> arg_BB_1; arg_BB_1 = ((Hediff_Injury injury) => injury.Part == rec); foreach (Hediff_Injury current in arg_BB_0.Where(arg_BB_1)) { bool flag5 = current.CanHealNaturally() && !current.IsPermanent(); if (flag5) { injurySeverity += current.Severity; } } } } if (injurySeverity != 0 && !(caster.health.hediffSet.HasHediff(HediffDef.Named("TM_HediffShield")))) { Job job = ability.GetJob(AbilityContext.AI, jobTarget); caster.jobs.TryTakeOrderedJob(job); success = true; } } }