Пример #1
0
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var attack = rr.Attacks.FirstOrDefault(a => a.Spell == spell);

            if (attack == null || !attack.IsHit || attack.Damage <= 0)
            {
                return;
            }

            var roll = Rnd.Next(1, 3);

            if (player.Settings.PrimaryWeaponProc == WeaponProc.RazorsEdge && attack.IsCrit && roll == 2)
            {
                GimmickResource++;
            }

            if (_deluge >= 6)
            {
                player.AddBonusAttack(rr, new SpiritBlade());
                _deluge = 0;
            }

            ChiGenerator(player);
            ChiConsumer();
            SpiritBladeConsumer(player, rr);
            SpiritBladeExtender();
        }
Пример #2
0
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var roll       = Rnd.Next(1, 11);
            var highroller = Rnd.Next(1, 1001);

            if (roll >= 1 && roll <= 3)
            {
                ParadoxGenerator(player);
            }

            roll = Rnd.Next(1, 9);
            {
                if (roll == 8)
                {
                    ParadoxGenerator(player);
                }
            }

            ParadoxGenerator(player);

            if (GimmickResource != 8)
            {
                return;
            }

            if (player.Settings.PrimaryWeaponProc == WeaponProc.WarpedVisage && GimmickResource == 8)
            {
                player.AddBonusAttack(rr, new Doppleganger(player));
            }

            if (GimmickResource == 8 || player.Settings.PrimaryWeaponProc == WeaponProc.SovTechParadoxGenerator && highroller <= 55)
            {
                ChaoticEffects(player, rr);
            }
        }
Пример #3
0
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var roll = Rnd.Next(1, 6);

            if (player.Settings.PrimaryWeaponProc == WeaponProc.IfritanDespoiler)
            {
                if (spell.GetType() == typeof(DragonBreath))
                {
                    _ifritanDespoilerCounter += 2;
                }
                if (spell.GetType() == typeof(DepletedUranium))
                {
                    _ifritanDespoilerCounter++;
                }
                if (_ifritanDespoilerCounter >= 12)
                {
                    player.AddBonusAttack(rr, new IfritanDespoiler(player, ""));
                    _ifritanDespoilerCounter = 0;
                }
            }

            if (player.Settings.PrimaryWeaponProc == WeaponProc.Spesc221 && GimmickResource < _shellstamp && roll == 5)
            {
                player.AddBonusAttack(rr, new SpesC221());
            }

            // Not all spells should procc gimmick
            if (spell.GetType() == typeof(Reload) || spell.GetType() == typeof(ShellSalvage))
            {
                return;
            }

            if (Rnd.Next(1, 3) == 1)
            {
                // TODO: Check & FIX DOT duration/stacks and assume perfect play by default
                // in weapon-model so APL does not have to worry about it at all.
                player.AddBonusAttack(rr, new DragonBreath());
            }
            else
            {
                player.AddBonusAttack(rr, new DepletedUranium());
            }
        }
Пример #4
0
        private void ChaoticEffects(IPlayer player, RoundResult rr)
        {
            // TODO: 30% chance here also???
            var roll = Rnd.Next(1, 11);

            switch (roll)
            {
            case 1:
                player.AddBonusAttack(rr, new Singularity());
                break;

            case 2:
                player.AddBonusAttack(rr, new Doppleganger());
                break;

            case 3:
                player.AddBonusAttack(rr, new Enigma());
                break;
            }
        }
Пример #5
0
        private void SpiritBladeConsumer(IPlayer player, RoundResult rr)
        {
            if (!SpiritBladeActive)
            {
                return;
            }

            var highroller = Rnd.Next(1, 101);

            if (player.Settings.PrimaryWeaponProc == WeaponProc.BladeOfTheSeventhSon)
            {
                player.AddBonusAttack(rr, new SpiritBlade());
                player.AddBonusAttack(rr, new BladeOfTheSeventhSon());
                _spiritBladeCharges--;
            }

            if (player.HasPassive("HardenedBlade") && highroller <= 30)
            {
                {
                    if (player.HasPassive("Deluge"))
                    {
                        _deluge += 1;
                    }

                    player.AddBonusAttack(rr, new SpiritBlade());
                    return;
                }
            }

            if (player.HasPassive("Deluge"))
            {
                _deluge += 1;
            }

            else
            {
                player.AddBonusAttack(rr, new SpiritBlade());
            }
            _spiritBladeCharges--;
        }
Пример #6
0
 public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
 {
     if (player.Settings.PrimaryWeaponProc == WeaponProc.UnstableElectronCore && GimmickResource > 50 && (spell.ElementalType == "Fire" || spell.ElementalType == "Lightning"))
     {
         player.AddBonusAttack(rr, new UnstableElectronCore());
     }
     if (player.Settings.PrimaryWeaponProc == WeaponProc.CryoChargedConduit && spell.ElementalType == "Cold")
     {
         GimmickResource -= 15;
         //TODO: and cause any targets hit to become frostbitten for 6 seconds. Critically hitting a frostbitten enemy with an Elemental attack deals an additional (3.45*Combat Power) magical damage.
         //What does it even mean?
     }
 }
Пример #7
0
        private void ChaoticEffects(IPlayer player, RoundResult rr)
        {
            var roll = Rnd.Next(1, 11);

            switch (roll)
            {
            case 1:
                player.AddBonusAttack(rr, new Singularity(player));
                break;

            case 2:
                player.AddBonusAttack(rr, new Doppleganger(player));
                break;

            case 3:
                player.AddBonusAttack(rr, new Enigma(player));
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Пример #8
0
 public override void PreAttack(IPlayer player, RoundResult rr)
 {
     if (player.Settings.PrimaryWeaponProc == WeaponProc.BladedGauntlets && _bladedStartBonus == 1)
     {
         GimmickResource   = +15;
         _bladedStartBonus = 2;
     }
     if (player.Settings.PrimaryWeaponProc == WeaponProc.BladedGauntlets)
     {
         GimmickResource = +2;
     }
     if (player.Settings.PrimaryWeaponProc == WeaponProc.TreshingClaws && AllowFrenziedWrathAbilities)
     {
         player.AddBonusAttack(rr, new TreshingClaws(player));
     }
 }
Пример #9
0
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var enraged50  = GimmickResource >= 50 && GimmickResource < 100;
            var enraged100 = GimmickResource >= 100;

            // Has any enraged treshold passed since last time
            if (!_enraged50 && enraged50)
            {
                // Passed 50 treshold
                _enragedLockTimeStamp = player.CurrentTimeSec;
            }
            else if (!_enraged100 && _enraged50 && enraged100)
            {
                // Reached 100 treshold
                _enragedLockTimeStamp = player.CurrentTimeSec;
            }

            _enraged50  = enraged50;
            _enraged100 = enraged100;

            if (_fastAndFurious != null)
            {
                _timeSinceEnraged   = player.CurrentTimeSec - _enragedLockTimeStamp;
                FastAndFuriousBonus = _timeSinceEnraged < 3.5m;
            }

            if (player.Settings.PrimaryWeaponProc == WeaponProc.PneumaticMaul)
            {
                PneumaticMaul(player, rr, spell);
            }

            var spellName = spell.Name;

            if (player.Settings.PrimaryWeaponProc == WeaponProc.FumingDespoiler && spellName != null &&
                _hammerConsumers.Contains(spellName, StringComparer.CurrentCultureIgnoreCase))
            {
                player.AddBonusAttack(rr, new FumingDespoiler(player));
            }
        }
Пример #10
0
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var roll       = Rnd.Next(1, 11);
            var highroller = Rnd.Next(1, 1001);

            if (spell?.Name == "ChaosUnluckySpell") // Unit test
            {
                return;
            }

            // 30% chance of generating paradoxes
            if (roll > 3 && spell?.Name != "ChaosLuckySpell") // Unit test
            {
                return;
            }

            //// TODO: Whaaaaat is this?
            //roll = Rnd.Next(1, 9);
            //{
            //    if (roll == 8)
            //    {
            //        ParadoxGenerator(player);
            //    }
            //}

            ParadoxGenerator(player, spell);

            if (player.Settings.PrimaryWeaponProc == WeaponProc.WarpedVisage && GimmickResource == 8)
            {
                player.AddBonusAttack(rr, new Doppleganger());
            }

            if (GimmickResource == 8 || player.Settings.PrimaryWeaponProc == WeaponProc.SovTechParadoxGenerator &&
                highroller <= 55)
            {
                ChaoticEffects(player, rr);
            }
        }
Пример #11
0
        // Using a pistol ability triggers Chamber Roulette if it hits
        // Matching Chambers lasts for 3 seconds
        public override void AfterAttack(IPlayer player, ISpell spell, RoundResult rr)
        {
            var timeSinceLocked = player.CurrentTimeSec - ChamberLockTimeStamp;

            LastPistolSpellTimeStamp = player.CurrentTimeSec + spell.CastTime;

            if (_focusedFire != null && LeftChamber != RightChamber && spell.GetType() == typeof(KillBlind))
            {
                LeftChamber  = Chamber.White;
                RightChamber = Chamber.White;
            }

            if (timeSinceLocked > 3)
            {
                if (_holdout != null && LeftChamber == RightChamber)
                {
                    if (Rnd.Next(1, 4) < 3 && spell.GetType() == typeof(Unload))
                    {
                        ChamberRoulette(player);
                    }
                }
                else
                {
                    ChamberRoulette(player);
                }
            }

            if (LeftChamber == RightChamber)
            {
                if (_jackpot != null)
                {
                    _jackpotBonus = timeSinceLocked <= 3;
                }

                if (_winStreak != null)
                {
                    player.AddBonusAttack(rr, new WinStreak(GetRandomNumber(0.06, 0.335)));
                }

                if (_flechetteRounds != null)
                {
                    player.AddBonusAttack(rr, new FlechetteRounds());
                }

                switch (LeftChamber)
                {
                case Chamber.White:
                    if (_annihilators)
                    {
                        player.AddBonusAttack(rr, new Cb3Annihilators(player));
                    }
                    if (_harmonisers)
                    {
                        if (Rnd.Next(1, 5) == 4)
                        {
                            LeftChamber  = Chamber.Blue;
                            RightChamber = Chamber.Blue;
                            player.AddBonusAttack(rr, new BlueChambers(player));
                        }
                        else
                        {
                            player.AddBonusAttack(rr, new WhiteChambers(player));
                        }
                    }
                    else
                    {
                        player.AddBonusAttack(rr, new WhiteChambers(player));
                    }
                    break;

                case Chamber.Blue:
                    if (_annihilators)
                    {
                        player.AddBonusAttack(rr, new Cb3Annihilators(player));
                    }
                    if (_harmonisers)
                    {
                        if (Rnd.Next(1, 101) <= 15)
                        {
                            LeftChamber  = Chamber.Red;
                            RightChamber = Chamber.Red;
                            player.AddBonusAttack(rr, new RedChambers(player));
                        }
                        else
                        {
                            player.AddBonusAttack(rr, new BlueChambers(player));
                        }
                    }
                    else
                    {
                        player.AddBonusAttack(rr, new BlueChambers(player));
                    }
                    break;

                case Chamber.Red:
                    if (_annihilators)
                    {
                        player.AddBonusAttack(rr, new Cb3Annihilators(player));
                    }
                    player.AddBonusAttack(rr, new RedChambers(player));
                    break;
                }
            }
            else
            {
                _jackpotBonus = false;
            }
        }