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); }
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; } }
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 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); } } }
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); }
public MightAbility(CompAbilityUser abilityUser) : base(abilityUser) { this.abilityUser = (abilityUser as CompAbilityUserMight); }
public ForceAbility(CompAbilityUser abilityUser) : base(abilityUser) { this.abilityUser = abilityUser as CompForceUser; }
public VampAbility(CompAbilityUser abilityUser) : base(abilityUser) { this.abilityUser = abilityUser as CompVampire; }
public PawnAbilityAttunement(CompAbilityUser abilityUser) : base(abilityUser) { this.abilityUser = abilityUser as CompWizardry; }
public ForceAbility(CompAbilityUser abilityUser) : base(abilityUser) { }
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); }