示例#1
0
        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();
        }
示例#3
0
        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();
        }
示例#4
0
        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();
            }
        }