public override float GetPriority(Pawn pawn)
        {
            CompAbilityUser abilityUser = pawn.Abilities();

            if (abilityUser == null)
            {
                return(-100f);
            }

            return(100);
        }
        public override void Initialize(CompProperties props)
        {
            Log.Message("initializing AbilityController");
            CompAbilityUser comp = this.parent.GetComp <CompAbilityUser>();

            if (comp != null)
            {
                Log.Message("adding abilities");
                comp.AddPawnAbility(AIDefOf.CC_Shrapnel);

                //for(int i =0; i < this.Props.Abilities.Count; i++)
                //{
                //    comp.AddPawnAbility(this.Props.Abilities[i]);
                //}
            }
            base.Initialize(props);
        }
Example #3
0
 private void InitializeAbilities(Apparel abilityApparel)
 {
     if (abilityApparel != null && abilityApparel.Wearer != null && MagicAbilities != null && MagicAbilities.Count > 0)
     {
         CompAbilityUser comp = abilityApparel.TryGetComp <CompAbilityUser>();
         if (comp != null)
         {
             foreach (AbilityUser.AbilityDef abilityDef in MagicAbilities)
             {
                 comp.RemoveApparelAbility(abilityDef);
                 comp.AddApparelAbility(abilityDef);
             }
         }
         //AbilityUserMod.Notify_ApparelRemoved_PostFix(abilityApparel.Wearer.apparel, abilityApparel);
         //AbilityUserMod.Notify_ApparelAdded_PostFix(abilityApparel.Wearer.apparel, abilityApparel);
         this.abilitiesInitialized = true;
     }
 }
Example #4
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
     }
 }
Example #5
0
 public void PostCastShot(bool inResult)
 {
     if (inResult)
     {
         List <Apparel> apparel = this.CasterPawn.apparel.WornApparel;
         if (apparel != null)
         {
             for (int i = 0; i < apparel.Count; i++)
             {
                 Apparel item = apparel[i];
                 if (item != null && item.def == TorannMagicDefOf.TM_Artifact_OrbOfSouls_Full)
                 {
                     item.SplitOff(1).Destroy(DestroyMode.Vanish);
                 }
             }
         }
         CompAbilityUser comp = this.CasterPawn.GetComp <CompAbilityUser>();
         if (comp != null)
         {
             comp.RemoveApparelAbility(TorannMagicDefOf.TM_Artifact_TraitInfuse);
         }
     }
 }
Example #6
0
 public MagicAbility(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = (abilityUser as CompAbilityUserMagic);
 }
        public override AbilityAIDef TryPickAbility(Pawn caster)
        {
            //Get all eligible abilities.
            IEnumerable <AbilityAIDef> abilities =
                from validAbilityDef in
                //Initial filtering.
                (from abilityAIDef in profileDef.abilities
                 //where tags.FindAll(tag => tags.Contains(tag))?.Count() >= tags.Count
                 where tags.FindAll(tag => abilityAIDef.tags.Contains(tag))?.Count() >= tags.Count
                 select abilityAIDef)
                //Blacklist filtering.
                where !validAbilityDef.tags.Any(tag => blacklistedTags.Contains(tag))
                select validAbilityDef;

            //Debug
            //Log.Message("-=abilities list=-");
            //GenDebug.LogList(abilities);

            if (abilities != null)
            {
                //Filter out abilities we do not have.
                ThingComp       thingComp       = caster.AllComps.First(comp => comp.GetType() == profileDef.compAbilityUserClass);
                CompAbilityUser compAbilityUser = thingComp as CompAbilityUser;

                IEnumerable <AbilityAIDef> knownAbilities =
                    from abilityAIDef in abilities
                    from abilityUserAbility in compAbilityUser.AbilityData.AllPowers
                    where abilityAIDef.ability == abilityUserAbility.Def && profileDef.Worker.CanUseAbility(profileDef, caster, abilityAIDef)
                    orderby abilityAIDef.Worker.PowerScoreFor(abilityAIDef, caster) descending
                    select abilityAIDef;

                //Debug
                //Log.Message("-=knownAbilities list=-");
                //GenDebug.LogList(knownAbilities);

                if (compAbilityUser != null)
                {
                    if (knownAbilities != null && knownAbilities.Count() > 0)
                    {
                        //Return highest power ability which can be cast.
                        foreach (AbilityAIDef ability in knownAbilities)
                        {
                            string reason = "";

                            //Log.Message("-=AbilityVerbs list=-");
                            //GenDebug.LogList(compAbilityUser.AbilityVerbs);

                            //Can we cast the ability in the implementation of it?
                            PawnAbility     pawnAbility = compAbilityUser.AbilityData.AllPowers.First(pawnAbilityInt => pawnAbilityInt.Def == ability.ability);
                            Verb_UseAbility abilityVerb = pawnAbility.Verb; //.First(abilityIntVerb => abilityIntVerb.Ability.Def == ability.ability);

                            //Log.Message("abilityVerb=" + abilityVerb.ability.powerdef.defName);
                            if (compAbilityUser.CanCastPowerCheck(abilityVerb, out reason) /*&& !pawnAbility.NeedsCooldown*/) //To-Do: Put back check after Ability Framework redesign.
                            {
                                //Debug
                                //Log.Message("Can cast abilityVerb=" + abilityVerb.ability.powerdef.defName);

                                if (ability.usedOnCaster)
                                {
                                    //Target self.
                                    if (ability.CanPawnUseThisAbility(caster, caster))
                                    {
                                        return(ability);
                                    }
                                }
                                else if (ability.needEnemyTarget)
                                {
                                    //Enemy target specific.
                                    if (caster.mindState.enemyTarget != null && ability.CanPawnUseThisAbility(caster, caster.mindState.enemyTarget))
                                    {
                                        return(ability);
                                    }
                                }
                                else
                                {
                                    //Need no target.
                                    if (ability.CanPawnUseThisAbility(caster, LocalTargetInfo.Invalid))
                                    {
                                        return(ability);
                                    }
                                }
                            }
                            else
                            {
                                //Debug
                                //Log.Message("Can't cast abilityVerb=" + abilityVerb.ability.powerdef.defName + ", with reason: " + reason.Translate(abilityVerb.caster.ToString()));
                            }
                        }
                    }
                }
            }

            return(null);
        }
Example #8
0
 public MightAbility(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = (abilityUser as CompAbilityUserMight);
 }
 public ForceAbility(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = abilityUser as CompForceUser;
 }
Example #10
0
 public VampAbility(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = abilityUser as CompVampire;
 }
 public PawnAbilityAttunement(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = abilityUser as CompWizardry;
 }
Example #12
0
 public ForceAbility(CompAbilityUser abilityUser) : base(abilityUser)
 {
 }
Example #13
0
 public AbilitySemblance(CompAbilityUser abilityUser) : base(abilityUser)
 {
     this.abilityUser = (abilityUser as CompAbilityUserAura);
 }
        protected override Job TryGiveJob(Pawn pawn)
        {
            //Do we have at least one elegible profile?
            IEnumerable <AbilityUserAIProfileDef> profiles = pawn.EligibleAIProfiles();

            /*StringBuilder builder = new StringBuilder("profiles = ");
             *
             * foreach(AbilityUserAIProfileDef profile in profiles)
             * {
             *  builder.Append(profile.defName + ", ");
             * }
             *
             * Log.Message(builder.ToString());*/

            if (profiles != null && profiles.Count() > 0)
            {
                //No Job to give. Yet.
                //Go through all available Profiles in order to find a Ability to use.
                foreach (AbilityUserAIProfileDef profile in profiles)
                {
                    if (profile != null)
                    {
                        //Traverse the decision tree.
                        //List<AbilityDecisionNode> currentNodes = new List<AbilityDecisionNode>();
                        //List<AbilityDecisionNode> nextNodes = new List<AbilityDecisionNode>();

                        //Seed root.
                        //nextNodes.Add(profile.decisionTree);

                        //Result AbilityAIDef to use.
                        AbilityAIDef useThisAbility = null;

                        if (profile.decisionTree != null)
                        {
                            useThisAbility = profile.decisionTree.RecursivelyGetAbility(pawn);
                        }

                        //Debug

                        /*int nodesTraversed = 0;
                         * AbilityDecisionNode lastNode = null;
                         *
                         * //Flat recursive iteration
                         * do
                         * {
                         *  //Add from next list to current list.
                         *  currentNodes.AddRange(nextNodes);
                         *  nextNodes.Clear();
                         *
                         *  //Check if we can continue traversing on the current level.
                         *  foreach (AbilityDecisionNode currentNode in currentNodes)
                         *  {
                         *      nodesTraversed++;
                         *
                         *      if (currentNode.CanContinueTraversing(pawn))
                         *          nextNodes.AddRange(currentNode.subNodes);
                         *
                         *      //Try picking an ability.
                         *      useThisAbility = currentNode.TryPickAbility(pawn);
                         *
                         *      //Found ability to use.
                         *      if (useThisAbility != null)
                         *      {
                         *          lastNode = currentNode;
                         *          break;
                         *      }
                         *  }
                         *
                         *  //Found ability to use.
                         *  if (useThisAbility != null)
                         *      break;
                         *
                         *  //Clear current set.
                         *  currentNodes.Clear();
                         * } while (nextNodes.Count > 0);*/

                        //Debug
                        //if (useThisAbility != null)
                        //    Log.Message("JobGiver_AIAbilityUser.TryGiveJob for '" + pawn.ThingID + "' with ability: " + useThisAbility.defName + ", while traversing " + nodesTraversed + " nodes.");
                        //else
                        //    Log.Message("JobGiver_AIAbilityUser.TryGiveJob for '" + pawn.ThingID + "' with ability: No ability, while traversing " + nodesTraversed + " nodes.");

                        if (useThisAbility != null)
                        {
                            //Debug

                            /*Log.Message("Ability '" + useThisAbility.defName + "' picked for AI.\n" +
                             *  "lastNode=" + lastNode.GetType().Name + "\n" +
                             *  "lastNode.parent=" + lastNode?.parent?.GetType()?.Name);*/

                            //Get CompAbilityUser
                            ThingComp       thingComp       = pawn.AllComps.First(comp => comp.GetType() == profile.compAbilityUserClass);
                            CompAbilityUser compAbilityUser = thingComp as CompAbilityUser;

                            if (compAbilityUser != null)
                            {
                                //Get Ability from Pawn.
                                PawnAbility useAbility = compAbilityUser.AbilityData.AllPowers.First(ability => ability.Def == useThisAbility.ability);

                                string reason = "";
                                //Give job.
                                if (useAbility.CanCastPowerCheck(AbilityContext.AI, out reason))
                                {
                                    LocalTargetInfo target = useThisAbility.Worker.TargetAbilityFor(useThisAbility, pawn);
                                    if (target.IsValid)
                                    {
                                        return(useAbility.UseAbility(AbilityContext.AI, target));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //No Job to give.
            //Report.
            //Log.Message("JobGiver_AIAbilityUser.TryGiveJob for '" + pawn.ThingID + "' is Invalid.");
            return(null);
        }