public override void DoAbilityOnTarget(Pawn target) { Tracker.UseEnergy(Def.EnergyPerUse); CooldownTicker = CooldownTicks; if (!Rand.Chance(SuccessChanceOnTarget(target))) { MoteMaker.ThrowText(target.Position.ToVector3(), target.Map, ResistedKey.Translate(), 1.9f); Def.SoundDefFailure.PlayOneShot(new TargetInfo(User.Position, User.Map)); TryThrowFailMoteOnUser(); return; } TryThrowMoteOnTarget(target); TryThrowMoteSuccessPointerToTarget(target); Def.SoundDefSuccessOnCaster?.PlayOneShot(new TargetInfo(User.Position, User.Map)); Def.SoundDefSuccessOnTarget?.PlayOneShot(new TargetInfo(target.Position, target.Map)); var statTransfer = Mathf.Min(Def.BaseSkillTransfer * Tracker.GetTotalModifierActive() * target.PsiTracker().GetTotalModifierActive(), 1); active = PsiTechSkillTransferUtility.TryAddNewTransferPair(new TransferPair { Initiator = User, Receiver = target, SkillTransferAmount = statTransfer }); if (active) { linkedPawn = target; } }
public override void DoAbilityOnTarget(Pawn target) { Tracker.UseEnergy(Def.EnergyPerUse); CooldownTicker = CooldownTicks; if (!Rand.Chance(SuccessChanceOnTarget(target))) { MoteMaker.ThrowText(target.Position.ToVector3(), target.Map, ResistedKey.Translate(), 1.9f); Def.SoundDefFailure.PlayOneShot(new TargetInfo(User.Position, User.Map)); TryThrowFailMoteOnUser(); return; } TryThrowMoteOnTarget(target); TryThrowMoteSuccessPointerToTarget(target); Def.SoundDefSuccessOnCaster?.PlayOneShot(new TargetInfo(User.Position, User.Map)); Def.SoundDefSuccessOnCaster?.PlayOneShot(new TargetInfo(target.Position, target.Map)); TryPickAndDoEffect(target); TryPickAndDoEffectOnUser(); }
public override void DoAbility() { Tracker.UseEnergy(Def.EnergyPerUse); cooldownTicker = CooldownTicks; var cachedToAffect = PawnsToAffect.ToList().ListFullCopy(); foreach (var pawn in cachedToAffect) { if (!pawn.Position.InHorDistOf(User.Position, Def.Range)) { continue; } var stackMod = 0f; var didEffect = false; while (Rand.Chance(SuccessChanceOnTarget(pawn) - stackMod)) { TryPickAndDoEffect(pawn); stackMod += 1.0f; didEffect = true; if (pawn.Dead) { break; } } if (!didEffect) { MoteMaker.ThrowText(pawn.Position.ToVector3(), pawn.Map, ResistedKey.Translate(), 1.9f); } } Def.SoundDefSuccessOnCaster?.PlayOneShot(new TargetInfo(User.Position, User.Map)); TryThrowSuccessMoteOnUser(); TryPickAndDoEffectOnUser(); }
public void TriggerAbility(Pawn instigator) { if (!Tracker.CanUseEnergy(Def.EnergyPerUse) || cooldownTicker > 0) { return; } var success = false; switch (Def.Target) { case TargetType.Single: var target = Def.TargetValidator.SelectBestTargetFromLists(User, User.Map.mapPawns.AllPawns.Where(pawn => Def.TargetValidator.IsValidTarget(User, pawn)).ToList()); if (target == null) { break; } if (!Rand.Chance(SuccessChanceOnTarget(target))) { MoteMaker.ThrowText(target.Position.ToVector3(), target.Map, ResistedKey.Translate(), 1.9f); break; } TryThrowMoteOnTarget(target); TryPickAndDoEffect(target); success = true; break; case TargetType.AllAvailable: var targets = User.Map.mapPawns.AllPawns.Where(pawn => Def.TargetValidator.IsValidTarget(User, pawn)); foreach (var targ in targets) { if (targ == null) { continue; } if (!Rand.Chance(SuccessChanceOnTarget(targ))) { MoteMaker.ThrowText(targ.Position.ToVector3(), targ.Map, ResistedKey.Translate(), 1.9f); continue; } TryThrowMoteOnTarget(targ); TryPickAndDoEffect(targ); success = true; } break; case TargetType.Attacker: if (instigator == null || !Def.TargetValidator.IsValidTarget(User, instigator)) { break; } if (!Rand.Chance(SuccessChanceOnTarget(instigator))) { MoteMaker.ThrowText(instigator.Position.ToVector3(), instigator.Map, ResistedKey.Translate(), 1.9f); break; } TryThrowMoteOnTarget(instigator); TryPickAndDoEffect(instigator); success = true; break; default: Log.Warning("PsiTech tried to process a triggered passive with an unsupported target type " + Def.Target); break; } Tracker.UseEnergy(Def.EnergyPerUse); cooldownTicker = CooldownTicks; if (success) { Def.SoundDefSuccessOnCaster?.PlayOneShot(new TargetInfo(User.Position, User.Map)); Def.SoundDefSuccessOnTarget?.PlayOneShot(new TargetInfo(instigator.Position, instigator.Map)); TryPickAndDoEffectOnUser(); } else { Def.SoundDefFailure.PlayOneShot(new TargetInfo(User.Position, User.Map)); TryThrowFailMoteOnUser(); } }