示例#1
0
 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;
             }
         }
     }
 }
示例#2
0
 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;
         }
     }
 }
示例#3
0
 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;
         }
     }
 }
示例#4
0
 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;
             }
         }
     }
 }
示例#5
0
        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;
                        }
                    }
                }
            }
        }
示例#6
0
        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;
            }
        }
示例#7
0
 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;
         }
     }
 }
示例#8
0
 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;
         }
     }
 }
示例#9
0
 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));
         }
     }
 }
示例#10
0
        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;
                }
            }
        }
示例#11
0
 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
     }
 }
示例#12
0
 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;
                 }
             }
         }
     }
 }
示例#13
0
        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;
                }
            }
        }