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(); }
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); } }
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()); } }
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; } }
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--; }
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? } }
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(); } }
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)); } }
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)); } }
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); } }
// 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; } }