public virtual void Initialize(TriggeredAbility triggeredAbility, Game game) { Game = game; Ability = triggeredAbility; Initialize(); }
public IEnumerator TriggeredEffect(TriggeredAbility ability) { AddActiveEffect(ability.effect); yield return(new WaitForSeconds(ability.duration)); RemoveActiveEffect(ability.effect); }
public void AddTriggeredAbility(TriggeredAbility ta) { if (ta.is_local) { local_triggered_abilities.Add(ta); } else { global_triggered_abilities.Add(ta); } ta.SetSource(card); }
public Tower(Towers tower, MainEncounterLogic caller, TriggeredAbility ability) { whichTower = tower; parent = caller; warningAbility = ability; nextTick = new TriggeredAbility(); nextTick.warningTime = TimeSpan.Zero; nextTick.warningCallback = this.tick; parent.timedAbilities.Add(warningAbility); parent.timedAbilities.Add(nextTick); }
//void StaticsFoldout(StaticAbility sa) { // if (!statics_foldouts.ContainsKey(sa)) { // statics_foldouts.Add(sa, false); // } // statics_foldouts[sa] = EditorGUILayout.InspectorTitlebar(statics_foldouts[sa], sa); // if (statics_foldouts[sa]) { // EditorGUI.indentLevel += 1; // Editor editor = Editor.CreateEditor(sa); // editor.OnInspectorGUI(); // EditorGUI.indentLevel -= 1; // } //} void TriggersFoldout(TriggeredAbility ta) { if (!triggered_foldouts.ContainsKey(ta)) { triggered_foldouts.Add(ta, false); } triggered_foldouts[ta] = EditorGUILayout.InspectorTitlebar(triggered_foldouts[ta], ta); if (triggered_foldouts[ta]) { EditorGUI.indentLevel += 1; Editor editor = Editor.CreateEditor(ta); editor.OnInspectorGUI(); EditorGUI.indentLevel -= 1; } }
public HeroPowerTriggeredAbility(HeroPower power, TriggeredAbility to_wrap) { this.to_wrap = to_wrap; this.to_wrap.SetSource(power); }
protected CardChangesZoneAbility(TriggeredAbility ability) : base(ability) { }
public abstract void DoAction(TriggeredAbility ability);
public SecretTriggeredAbility(Secret secret, TriggeredAbility to_wrap) { this.secret = secret; this.to_wrap = to_wrap; this.to_wrap.SetSource(secret); }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Bahamut Prime"; int phaseNum = 1; // for convenience lastAddedNewMob = DateTime.Now; akhMornCount = 0; RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; TriggeredAbility GigaflareTrigger = new TriggeredAbility(); timedAbilities.Add(GigaflareTrigger); GigaflareTrigger.announceWarning = true; GigaflareTrigger.match = new Regex(@" readies Gigaflare."); GigaflareTrigger.matchMessage = "Giga-flare"; // Boss's abilities RotationAbility FlareBreath = new RotationAbility(); // Flare Breath FlareBreath.announceWarning = false; FlareBreath.match = new Regex(@"\ uses\ Flare\ Breath\."); FlareBreath.warningMessage = @"Flare Breath"; RotationAbility Megaflare = new RotationAbility(); // Megaflare Megaflare.announceWarning = true; Megaflare.match = new Regex(@"\ readies\ Megaflare\."); Megaflare.warningMessage = @"Mega-flare"; Megaflare.warningTime = TimeSpan.FromSeconds(2); RotationAbility Flatten = new RotationAbility(); // Flatten Flatten.announceWarning = true; Flatten.match = new Regex(@"\ readies\ Flatten\."); Flatten.warningMessage = @"Flatten"; Flatten.warningTime = TimeSpan.FromSeconds(2); RotationAbility EarthShaker = new RotationAbility(); // Earth Shaker EarthShaker.announceWarning = true; EarthShaker.match = new Regex(@"\ uses\ Earth\ Shaker\."); EarthShaker.warningMessage = @"Earth Shaker"; EarthShaker.warningTime = TimeSpan.FromSeconds(8); RotationAbility FlareStar = new RotationAbility(); // Flare Star FlareStar.announceWarning = false; FlareStar.match = new Regex(@"\ readies\ Flare\ Star\."); FlareStar.warningMessage = @"Flare Star"; RotationAbility RageofBahamut = new RotationAbility(); // Rage of Bahamut RageofBahamut.announceWarning = false; RageofBahamut.match = new Regex(@"\ readies\ Rage\ of\ Bahamut\."); RageofBahamut.warningMessage = @"Rage of Bahamut"; RotationAbility MegaflareDive = new RotationAbility(); // Megaflare Dive MegaflareDive.announceWarning = true; MegaflareDive.match = new Regex(@"\ readies\ Megaflare\ Dive\."); MegaflareDive.warningMessage = @"Dive bombs"; MegaflareDive.warningTime = TimeSpan.FromSeconds(6); RotationAbility DoubleDive = new RotationAbility(); // Double Dive DoubleDive.announceWarning = true; DoubleDive.match = new Regex(@"\ readies\ Double\ Dive\."); DoubleDive.warningMessage = @"Move"; DoubleDive.warningTime = TimeSpan.FromSeconds(1); RotationAbility EvilEye = new RotationAbility(); // Evil Eye EvilEye.announceWarning = true; EvilEye.match = new Regex(@"\ uses\ Evil\ Eye\."); EvilEye.warningMessage = @"Evil Eye"; EvilEye.warningTime = TimeSpan.FromSeconds(6); RotationAbility DeathSentence = new RotationAbility(); // Death Sentence DeathSentence.announceWarning = true; DeathSentence.match = new Regex(@"\ readies\ Death\ Sentence\."); DeathSentence.warningMessage = @"Death Sentence"; DeathSentence.warningTime = TimeSpan.FromSeconds(6); RotationAbility Teraflare = new RotationAbility(); // Teraflare Teraflare.announceWarning = true; Teraflare.match = new Regex(@"\ readies\ Teraflare\."); Teraflare.warningMessage = @"Tera flare"; Teraflare.warningTime = TimeSpan.FromSeconds(-15); RotationAbility AkhMorn = new RotationAbility(); // Akh Morn AkhMorn.announceWarning = true; AkhMorn.match = new Regex(@"\ readies\ Akh\ Morn\."); //AkhMorn.warningMessage = @"Akh Morn"; AkhMorn.warningTime = TimeSpan.FromSeconds(3); AkhMorn.warningCallback = delegate(Ability abil) { akhMornCount++; tts("Akh Morn " + akhMornCount); }; RotationAbility TempestWing = new RotationAbility(); // Tempest Wing TempestWing.announceWarning = false; TempestWing.match = new Regex(@"\ uses\ Tempest\ Wing\."); TempestWing.warningMessage = @"Tempest Wing"; RotationAbility MegaflareStrike = new RotationAbility(); // Megaflare Strike MegaflareStrike.announceWarning = false; MegaflareStrike.match = new Regex(@"\ uses\ Megaflare\ Strike\."); MegaflareStrike.warningMessage = @"Megaflare Strike"; // Boss ability rotation // You'll need to split these up into phases // And separate out any timed moves which aren't part of a rotation // For now we'll assume they're all part of phase 1 phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4933142), FlareBreath); // 20:13:17:626 @ 99.7963599245106% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4212529), Megaflare); // 20:13:22:47 @ 99.3454269458595% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.769788), FlareBreath); // 20:13:35:817 @ 97.7115535215109% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3851936), Flatten); // 20:13:39:202 @ 97.4483935101334% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0224017), FlareBreath); // 20:13:46:225 @ 96.5393617620241% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.6008923), EarthShaker); // 20:14:1:826 @ 94.7920056097905% phases[phaseNum].phaseEndRegex = new Regex(@" readies Gigaflare."); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(4); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.14158), FlareStar); // 17:56:45:834 @ 65.0017658555918% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.992686), FlareBreath); // 17:56:57:827 @ 64.6718469972046% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.3335338), Flatten); // 17:57:7:160 @ 64.4565076714178% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.052461), FlareBreath); // 17:57:15:213 @ 64.129513625605% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.184640), Megaflare); // 17:57:26:398 @ 63.1931348799255% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.035803), FlareBreath); // 17:57:40:433 @ 61.249377563324% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2970742), RageofBahamut); // 17:57:41:730 @ 61.070671515031% phases[phaseNum].phaseEndRegex = new Regex(@" readies Gigaflare."); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.5868343), MegaflareDive); // 20:35:25:639 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.080119), DoubleDive); // 20:35:27:719 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5484317), Megaflare); // 20:35:35:267 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(73.822223), EvilEye); // 20:36:49:89 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8134469), MegaflareDive); // 20:36:56:903 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3261331), DoubleDive); // 20:36:59:229 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2824165), Megaflare); // 20:37:6:511 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(29.619694), DeathSentence); // 20:37:36:131 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(34.063948), EvilEye); // 21:28:43:170 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.506029), DeathSentence); // 21:28:43:676 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.797189), MegaflareDive); // 21:29:4:473 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), DoubleDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.621551), Megaflare); // 20:44:13:610 @ 48.7553825691407% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8141038), Teraflare); // 20:44:15:424 @ 48.7553825691407% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(500), RotationAbility.Blank()); // 21:29:10:972 @ 50.2021411090451% phases[phaseNum].phaseEndRegex = new Regex(@" uses Teraflare."); phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(7.7964459); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2493575), AkhMorn); // 21:30:29:675 @ 50.5811968186814% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.0688619), Megaflare); // 21:30:44:744 @ 48.0261536740399% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.187640), TempestWing); // 21:30:55:931 @ 45.5459857313019% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.019145), EarthShaker); // 21:31:15:950 @ 41.7421207377255% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.010401), TempestWing); // 21:31:22:961 @ 40.6754415918585% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.834105), FlareBreath); // 21:31:24:795 @ 40.3881518767426% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4923713), AkhMorn); // 21:31:31:287 @ 39.5602105572572% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.3789368), Megaflare); // 21:31:47:666 @ 36.3374327018907% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.914624), TempestWing); // 21:31:58:581 @ 34.9454412774411% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.279160), EarthShaker); // 21:32:18:861 @ 31.3452894796685% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0264019), TempestWing); // 21:32:25:887 @ 30.1016591730531% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.801103), FlareBreath); // 21:32:27:688 @ 29.9565153490508% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.937969), AkhMorn); // 21:32:44:626 @ 26.559272423624% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.3839943), Megaflare); // 21:33:2:10 @ 22.8380333852731% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.168639), TempestWing); // 21:33:13:179 @ 21.1687697287748% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.036146), EarthShaker); // 21:33:33:216 @ 18.0587433981496% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.263415), TempestWing); // 21:33:40:480 @ 17.1958505684008% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8871079), FlareBreath); // 21:33:42:367 @ 16.8741943055362% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.1823536), AkhMorn); // 21:33:48:549 @ 15.7258397685303% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.698069), Megaflare); // 21:34:7:247 @ 12.1152317658044% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.192640), TempestWing); // 21:34:18:440 @ 10.5601820403346% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.525174), EarthShaker); // 21:34:38:965 @ 7.6563549962014% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.516373), TempestWing); // 21:34:45:481 @ 7.1320823422484% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0921197), FlareBreath); // 21:34:47:573 @ 4.52461193221162% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.616950), AkhMorn); // 21:35:4:190 @ 1.68505764439982% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(500), RotationAbility.Blank()); // 21:29:10:972 @ 50.2021411090451% }
public void PlayCard(CardView card) { if (card.CanBePlayed(this)) { gameUI.endTurnButton.SetEnabled(false); var gameConfig = GameManager.Instance.config; var libraryCard = gameConfig.GetCard(card.card.cardId); var cardType = gameConfig.cardTypes.Find(x => x.id == libraryCard.cardTypeId); if (cardType.name == "Creature") { var boardCreature = Instantiate(boardCreaturePrefab); var board = GameObject.Find("PlayerBoard"); boardCreature.tag = "PlayerOwned"; boardCreature.transform.parent = board.transform; boardCreature.transform.position = new Vector2(1.9f * playerBoardCards.Count, 0); boardCreature.GetComponent <BoardCreature>().ownerPlayer = this; boardCreature.GetComponent <BoardCreature>().PopulateWithInfo(card.card); playerHandCards.Remove(card); RearrangeHand(); playerBoardCards.Add(boardCreature.GetComponent <BoardCreature>()); Destroy(card.gameObject); currentCreature = boardCreature.GetComponent <BoardCreature>(); RearrangeBottomBoard(() => { var triggeredAbilities = libraryCard.abilities.FindAll(x => x is TriggeredAbility); TriggeredAbility targetableAbility = null; foreach (var ability in triggeredAbilities) { var triggeredAbility = ability as TriggeredAbility; var trigger = triggeredAbility.trigger as OnCardEnteredZoneTrigger; if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget) { targetableAbility = triggeredAbility; break; } } // Preemptively move the card so that the effect solver can properly check the availability of targets // by also taking into account this card (that is trying to be played). playerInfo.namedZones["Hand"].RemoveCard(card.card); playerInfo.namedZones["Board"].AddCard(card.card); if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target)) { var targetingArrow = Instantiate(spellTargetingArrowPrefab).GetComponent <SpellTargetingArrow>(); boardCreature.GetComponent <BoardCreature>().abilitiesTargetingArrow = targetingArrow; targetingArrow.effectTarget = targetableAbility.target; targetingArrow.targetType = targetableAbility.target.GetTarget(); targetingArrow.onTargetSelected += () => { PlayCreatureCard(card.card, targetingArrow.targetInfo); effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo); currentCreature = null; gameUI.endTurnButton.SetEnabled(true); }; targetingArrow.Begin(boardCreature.transform.localPosition); } else { PlayCreatureCard(card.card); effectSolver.MoveCard(netId, card.card, "Hand", "Board"); currentCreature = null; gameUI.endTurnButton.SetEnabled(true); } boardCreature.GetComponent <BoardCreature>().fightTargetingArrowPrefab = fightTargetingArrowPrefab; }); } else if (cardType.name == "Spell") { var spellsPivot = GameObject.Find("PlayerSpellsPivot"); var sequence = DOTween.Sequence(); sequence.Append(card.transform.DOMove(spellsPivot.transform.position, 0.5f)); sequence.Insert(0, card.transform.DORotate(Vector3.zero, 0.2f)); sequence.Play().OnComplete(() => { card.GetComponent <SortingGroup>().sortingLayerName = "BoardCards"; card.GetComponent <SortingGroup>().sortingOrder = 1000; var boardSpell = card.gameObject.AddComponent <BoardSpell>(); var triggeredAbilities = libraryCard.abilities.FindAll(x => x is TriggeredAbility); TriggeredAbility targetableAbility = null; foreach (var ability in triggeredAbilities) { var triggeredAbility = ability as TriggeredAbility; var trigger = triggeredAbility.trigger as OnCardEnteredZoneTrigger; if (trigger != null && trigger.zoneId == boardZone.zoneId && triggeredAbility.target is IUserTarget) { targetableAbility = triggeredAbility; break; } } currentSpellCard = card; if (targetableAbility != null && effectSolver.AreTargetsAvailable(targetableAbility.effect, card.card, targetableAbility.target)) { var targetingArrow = Instantiate(spellTargetingArrowPrefab).GetComponent <SpellTargetingArrow>(); boardSpell.targetingArrow = targetingArrow; targetingArrow.effectTarget = targetableAbility.target; targetingArrow.targetType = targetableAbility.target.GetTarget(); targetingArrow.onTargetSelected += () => { PlaySpellCard(card.card, targetingArrow.targetInfo); effectSolver.MoveCard(netId, card.card, "Hand", "Board", targetingArrow.targetInfo); currentSpellCard = null; gameUI.endTurnButton.SetEnabled(true); }; targetingArrow.Begin(boardSpell.transform.localPosition); } else { PlaySpellCard(card.card); effectSolver.MoveCard(netId, card.card, "Hand", "Board"); currentSpellCard = null; gameUI.endTurnButton.SetEnabled(true); } }); } } else { card.GetComponent <HandCard>().ResetToInitialPosition(); } }
public abstract void Unregister(TriggeredAbility ability);
void MakeSecret() { secret_trigger = (TriggeredAbility)EditorGUILayout.ObjectField("Secret Trigger", secret_trigger, typeof(TriggeredAbility), true); }
public WheneverThisCreatureAttacksAbility(TriggeredAbility ability) : base(ability) { }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Rafflesia"; int phaseNum = 1; // for convenience TriggeredAbility HoneyGlazed = new TriggeredAbility(); HoneyGlazed.match = new Regex("(?<beemember>[^ ]+?) [^ ]* suffers the effect of Honey-glazed"); HoneyGlazed.matchMessage = "Bee is up"; //HoneyGlazed.warningMessage = "${beemember} get devoured"; // no longer need to be devoured HoneyGlazed.timerDuration = TimeSpan.FromSeconds(25); HoneyGlazed.warningTime = TimeSpan.FromSeconds(0); timedAbilities.Add(HoneyGlazed); TriggeredAbility LeafstormTriggered = new TriggeredAbility(); LeafstormTriggered.match = new Regex("The rafflesia readies Leafstorm"); LeafstormTriggered.matchMessage = "Leaf storm"; timedAbilities.Add(LeafstormTriggered); TriggeredAbility Blighted = new TriggeredAbility(); Blighted.match = new Regex("The rafflesia readies Blighted Bouquet"); Blighted.matchMessage = "Stay still"; timedAbilities.Add(Blighted); // Boss's abilities RotationAbility BloodyCaress = new RotationAbility(); // Bloody Caress BloodyCaress.announceWarning = false; BloodyCaress.match = new Regex(@" uses Bloody Caress\."); BloodyCaress.warningMessage = @"Bloody Caress"; RotationAbility ThornyVine = new RotationAbility(); // Thorny Vine ThornyVine.announceWarning = false; ThornyVine.match = new Regex(@" suffers the effect of Thorny Vine"); ThornyVine.warningMessage = @"Vines"; RotationAbility BriaryGrowth = new RotationAbility(); // Briary Growth BriaryGrowth.announceWarning = false; BriaryGrowth.match = new Regex(@" uses Briary Growth\."); BriaryGrowth.warningMessage = @"Briary Growth"; RotationAbility FloralTrap = new RotationAbility(); // Floral Trap FloralTrap.announceWarning = false; FloralTrap.match = new Regex(@" uses Floral Trap\."); FloralTrap.warningMessage = @"Floral Trap"; RotationAbility Devour = new RotationAbility(); // Devour Devour.announceWarning = true; Devour.match = new Regex(@" uses Devour\."); Devour.warningMessage = @"Devour"; Devour.warningTime = TimeSpan.FromSeconds(10); RotationAbility Spit = new RotationAbility(); // Spit Spit.announceWarning = false; Spit.match = new Regex(@" readies Spit\."); Spit.warningMessage = @"Spit"; RotationAbility BlightedBouquet = new RotationAbility(); // Blighted Bouquet BlightedBouquet.announceWarning = true; BlightedBouquet.match = new Regex(@" readies Blighted Bouquet\."); BlightedBouquet.warningMessage = @"Blighted Bouquet"; BlightedBouquet.warningTime = TimeSpan.FromSeconds(3); RotationAbility ViscidEmission = new RotationAbility(); // Viscid Emission ViscidEmission.announceWarning = false; ViscidEmission.match = new Regex(@" uses Viscid Emission\."); ViscidEmission.warningMessage = @"Viscid Emission"; RotationAbility Leafstorm = new RotationAbility(); // Leafstorm Leafstorm.announceWarning = false; Leafstorm.match = new Regex(@" uses Leafstorm"); Leafstorm.warningMessage = @"Leafstorm"; RotationAbility AcidRain = new RotationAbility(); // Acid Rain AcidRain.announceWarning = true; AcidRain.match = new Regex(@" readies Acid Rain"); AcidRain.warningMessage = @"Acid Rain"; RotationAbility Swarm = new RotationAbility(); // Swarm Swarm.announceWarning = true; Swarm.match = new Regex(@" readies Swarm\."); Swarm.warningMessage = @"Swarm"; RotationAbility RottenStench = new RotationAbility(); // Rotten Stench RottenStench.announceWarning = true; RottenStench.match = new Regex(@" uses Rotten Stench\."); RottenStench.warningMessage = @"Rotten Stench"; phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), BloodyCaress); // 19:48:24:941 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), ThornyVine); // 19:48:28 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5346598), BriaryGrowth); // 19:48:36:476 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.6230928), BloodyCaress); // 19:48:38:99 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), ThornyVine); // 19:48:46:99 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.8748508), FloralTrap); // 19:48:52:974 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.7561004), Devour); // 19:48:54:730 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3300761), Spit); // 19:48:56:60 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.709441), BloodyCaress); // 19:49:3:769 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), ThornyVine); // 19:49:11:769 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.8926802), BloodyCaress); // 19:49:15:662 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.41931), BriaryGrowth); // 19:49:21:81 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4563692), BloodyCaress); // 19:49:27:538 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), ThornyVine); // 19:49:29:538 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.9805709), FloralTrap); // 19:49:37:518 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0681183), Devour); // 19:49:39:586 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0800618), Spit); // 19:49:40:666 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.8897372), RotationAbility.Blank()); // 19:49:53:556 phases[phaseNum].phaseEndRegex = new Regex(@" readies Blighted Bouquet"); //phases[phaseNum].phaseEndHP = 69; // Ends at 70, but also search for Blighted Bouquet, just in case phaseNum = 2; phases[phaseNum] = new Phase(); //phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(3); //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), BloodyCaress); // 19:50:18:571 //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1051204), BlightedBouquet); // 19:50:20:881 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), BlightedBouquet); // 19:50:20:881 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8725647), BriaryGrowth); // 19:50:30:753 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.5852622), BloodyCaress); // 19:50:35:339 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), ThornyVine); // 19:50:39:339 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8386772), FloralTrap); // 19:50:47:177 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3001315), Devour); // 19:50:49:477 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.1110636), Spit); // 19:50:50:588 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.077462), ViscidEmission); // 19:50:58:666 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9062234), BloodyCaress); // 19:51:2:572 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), ThornyVine); // 19:51:5:572 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4674843), BlightedBouquet); // 19:51:11:40 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.5324881), BloodyCaress); // 19:51:19:572 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3561347), BriaryGrowth); // 19:51:21:928 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), ThornyVine); // 19:51:29:928 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.3658789), FloralTrap); // 19:51:37:294 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1531231), Devour); // 19:51:39:447 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0600607), Spit); // 19:51:40:507 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.3703643), BloodyCaress); // 19:51:46:878 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), ThornyVine); // 19:51:46:878 // moved these to the bottom of this rotation, so that blighted is right at the start phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), BloodyCaress); // 19:50:18:571 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1051204), RotationAbility.Blank()); // 19:50:18:571 phases[phaseNum].phaseEndRegex = new Regex(@" readies Leafstorm"); phases[phaseNum].phaseEndHP = 39; phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Leafstorm); // 19:38:23:727 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8), AcidRain); // 19:38:31:530 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), ThornyVine); // 19:38:40:530 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.3), Leafstorm); // 19:38:40:834 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Swarm); // 19:38:49:848 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Leafstorm); // 19:38:55:918 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), ThornyVine); // 19:39:05:918 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Leafstorm); // 19:39:10:925 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), RottenStench); // 19:39:11:361 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), Swarm); // 19:39:22:382 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.4), Leafstorm); // 19:39:25:771 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), ThornyVine); // 19:39:38:771 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.4), Leafstorm); // 19:39:41:203 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2), Swarm); // 19:39:47:420 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), ThornyVine); // 19:39:47:420 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), Leafstorm); // 19:39:55:972 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), RottenStench); // 19:40:1:71 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Leafstorm); // 19:40:11:60 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Swarm); // 19:40:25:286 }
public AbilityTriggeredEvent(TriggeredAbility ability) { Ability = ability; }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Ravana"; int phaseNum = 1; // for convenience RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; TriggeredAbility Prey = new TriggeredAbility(); TriggeredAbility PreyToTank = new TriggeredAbility(); timedAbilities.Add(PreyToTank); PreyToTank.announceWarning = true; PreyToTank.collectMultipleLinesFor = TimeSpan.FromSeconds(0.5); PreyToTank.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); PreyToTank.matchMessage = "${member.last} prey to tank"; PreyToTank.timerDuration = TimeSpan.FromSeconds(1); PreyToTank.warningTime = TimeSpan.FromSeconds(0); PreyToTank.warningCallback = delegate(Ability self) { Prey.announceWarning = false; PreyToTank.announceWarning = false; }; timedAbilities.Add(Prey); Prey.announceWarning = false; Prey.collectMultipleLinesFor = TimeSpan.FromSeconds(0.5); Prey.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); Prey.matchMessage = "${member.1} ${member.2} ${member.3} prey to markers"; Prey.timerDuration = TimeSpan.FromSeconds(1); Prey.warningTime = TimeSpan.FromSeconds(0); Prey.warningCallback = delegate(Ability self) { Prey.announceWarning = false; PreyToTank.announceWarning = false; }; TriggeredAbility TheSeeingLeft = new TriggeredAbility(); timedAbilities.Add(TheSeeingLeft); TheSeeingLeft.match = new Regex(@"Ravana readies The Seeing Left"); TheSeeingLeft.matchMessage = "Right"; TriggeredAbility TheSeeingRight = new TriggeredAbility(); timedAbilities.Add(TheSeeingRight); TheSeeingRight.match = new Regex(@"Ravana readies The Seeing Right"); TheSeeingRight.matchMessage = "Left"; TriggeredAbility TheSeeingWings = new TriggeredAbility(); timedAbilities.Add(TheSeeingWings); TheSeeingWings.match = new Regex(@"Ravana readies The Seeing Wings"); TheSeeingWings.matchMessage = "Wings"; // Boss's abilities RotationAbility BlindingBlade = new RotationAbility(); // Blinding Blade BlindingBlade.announceWarning = true; BlindingBlade.warningTime = TimeSpan.FromSeconds(6); BlindingBlade.match = new Regex(@"\ uses\ Blinding\ Blade\."); BlindingBlade.warningMessage = @"Blinding Blade"; RotationAbility BladesofCarnageandLiberationAway = new RotationAbility(); // Blades of Carnage and Liberation BladesofCarnageandLiberationAway.announceWarning = true; BladesofCarnageandLiberationAway.warningTime = TimeSpan.FromSeconds(-3); BladesofCarnageandLiberationAway.match = new Regex(@"\ uses\ Blades\ of\ Carnage\ and\ Liberation\."); BladesofCarnageandLiberationAway.warningMessage = @"Move to wall"; RotationAbility BladesofCarnageandLiberationBehind = new RotationAbility(); // Blades of Carnage and Liberation BladesofCarnageandLiberationBehind.announceWarning = true; BladesofCarnageandLiberationBehind.warningTime = TimeSpan.FromSeconds(0); BladesofCarnageandLiberationBehind.match = new Regex(@"\ uses\ Blades\ of\ Carnage\ and\ Liberation\."); BladesofCarnageandLiberationBehind.warningMessage = @"Move behind"; RotationAbility BladesofCarnageandLiberationNumbers = new RotationAbility(); // Blades of Carnage and Liberation BladesofCarnageandLiberationNumbers.announceWarning = true; BladesofCarnageandLiberationNumbers.warningTime = TimeSpan.FromSeconds(0); BladesofCarnageandLiberationNumbers.match = new Regex(@"\ uses\ Blades\ of\ Carnage\ and\ Liberation\."); BladesofCarnageandLiberationNumbers.warningMessage = @"Numbers to markers. Everyone else to 4."; RotationAbility BladesofCarnageandLiberationPrey = new RotationAbility(); // Blades of Carnage and Liberation BladesofCarnageandLiberationPrey.announceWarning = false; BladesofCarnageandLiberationPrey.warningTime = TimeSpan.FromSeconds(0); BladesofCarnageandLiberationPrey.match = new Regex(@"\ uses\ Blades\ of\ Carnage\ and\ Liberation\."); BladesofCarnageandLiberationPrey.warningCallback = delegate(Ability self) { Prey.announceWarning = true; PreyToTank.announceWarning = false; }; RotationAbility PillarsofHeaven = new RotationAbility(); // Pillars of Heaven PillarsofHeaven.announceWarning = true; PillarsofHeaven.warningTime = TimeSpan.FromSeconds(2); PillarsofHeaven.match = new Regex(@"\ readies\ Pillars\ of\ Heaven\."); PillarsofHeaven.warningMessage = @"Knockback soon"; PillarsofHeaven.warningCallback = delegate(Ability self) { Prey.announceWarning = false; PreyToTank.announceWarning = true; }; RotationAbility LaughingRose = new RotationAbility(); // Laughing Rose LaughingRose.announceWarning = true; LaughingRose.warningTime = TimeSpan.FromSeconds(6); LaughingRose.match = new Regex(@"\ uses\ Laughing\ Rose\."); LaughingRose.warningMessage = @"Gather in black circle"; RotationAbility TheRoseofConviction = new RotationAbility(); // The Rose of Conviction TheRoseofConviction.announceWarning = true; TheRoseofConviction.warningTime = TimeSpan.FromSeconds(5); TheRoseofConviction.match = new Regex(@"\ uses\ The\ Rose\ of\ Conviction\."); TheRoseofConviction.warningMessage = @"Orbs soon"; RotationAbility BeetleAvatar = new RotationAbility(); // Beetle Avatar BeetleAvatar.announceWarning = false; BeetleAvatar.match = new Regex(@"\ uses\ Beetle\ Avatar\."); RotationAbility DragonflyAvatar = new RotationAbility(); // Dragonfly Avatar DragonflyAvatar.announceWarning = false; DragonflyAvatar.match = new Regex(@"\ uses\ Dragonfly\ Avatar\."); RotationAbility TheSeeingRotation = new RotationAbility(); // The Seeing Right TheSeeingRotation.announceWarning = false; TheSeeingRotation.match = new Regex(@"\ readies\ The\ Seeing\ "); RotationAbility AtmaLinga = new RotationAbility(); // Atma-Linga AtmaLinga.announceWarning = false; AtmaLinga.match = new Regex(@"\ uses\ Atma-Linga\."); RotationAbility Tapasya = new RotationAbility(); // Tapasya Tapasya.announceWarning = false; Tapasya.match = new Regex(@"\ uses\ Tapasya\."); RotationAbility ScorpionAvatar = new RotationAbility(); // Scorpion Avatar ScorpionAvatar.announceWarning = false; ScorpionAvatar.match = new Regex(@"\ uses\ Scorpion\ Avatar\."); RotationAbility BladesofCarnageandLiberation = new RotationAbility(); // Blades of Carnage and Liberation BladesofCarnageandLiberation.announceWarning = false; BladesofCarnageandLiberation.match = new Regex(@"\ uses\ Blades\ of\ Carnage\ and\ Liberation\."); RotationAbility PreludetoLiberation = new RotationAbility(); // Prelude to Liberation PreludetoLiberation.announceWarning = false; PreludetoLiberation.match = new Regex(@"\ readies\ Prelude\ to\ Liberation\."); RotationAbility Liberation = new RotationAbility(); // Liberation Liberation.announceWarning = false; Liberation.match = new Regex(@"\ readies\ Liberation\."); RotationAbility WarlordShell = new RotationAbility(); // Warlord Shell WarlordShell.announceWarning = false; WarlordShell.match = new Regex(@"\ readies\ Warlord\ Shell\."); RotationAbility BloodyFuller = new RotationAbility(); // Bloody Fuller BloodyFuller.announceWarning = false; BloodyFuller.match = new Regex(@"\ readies\ Bloody\ Fuller\."); RotationAbility Surpanakha = new RotationAbility(); // Surpanakha Surpanakha.announceWarning = false; Surpanakha.match = new Regex(@"\ uses\ Surpanakha\."); RotationAbility TheRoseofHate = new RotationAbility(); // The Rose of Hate TheRoseofHate.announceWarning = false; TheRoseofHate.match = new Regex(@"\ readies\ The\ Rose\ of\ Hate\."); RotationAbility SwiftLiberation = new RotationAbility(); // Swift Liberation SwiftLiberation.announceWarning = false; SwiftLiberation.match = new Regex(@"\ readies\ Swift\ Liberation\."); RotationAbility FinalLiberation = new RotationAbility(); // Final Liberation FinalLiberation.announceWarning = false; FinalLiberation.match = new Regex(@"\ readies\ Final\ Liberation\."); // Boss ability rotation // You'll need to split these up into phases // And separate out any timed moves which aren't part of a rotation // For now we'll assume they're all part of phase 1 phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(2); // You can use one of the following two methods for determining the end of a phase. // Just choose which is appropriate to the encounter and uncomment/modify to fit //phases[phaseNum].phaseEndHP = 90; //phases[phaseNum].phaseEndRegex = new Regex(@"Titan uses Geocrush"); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3891938), BlindingBlade); // 18:59:14:969 @ 99.1163158144839% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3481343), TheSeeingRotation); // 18:59:17:317 @ 98.6382698156244% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.979342), AtmaLinga); // 18:59:23:296 @ 96.7243038395742% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2423571), Tapasya); // 18:59:29:538 @ 95.2761475955142% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0094009), AtmaLinga); // 18:59:36:548 @ 93.2072087055693% phases[phaseNum].phaseEndRegex = new Regex(@"\ uses\ Scorpion\ Avatar\."); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3094752), ScorpionAvatar); // 18:59:58:389 @ 86.9275090287018% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9582836), BladesofCarnageandLiberationAway); // 19:0:3:347 @ 85.2610007603117% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7750444), PreludetoLiberation); // 19:0:4:122 @ 84.9592520433378% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.6610101), PreludetoLiberation); // 19:0:21:783 @ 75.0606467401635% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.5337741), PreludetoLiberation); // 19:0:35:317 @ 75.0606467401635% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.273416), BladesofCarnageandLiberationBehind); // 19:0:42:591 @ 74.7178530697586% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3180754), Liberation); // 19:0:43:909 @ 74.2740804980042% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.6720108), Liberation); // 19:1:1:581 @ 67.2606206044478% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1836397), Liberation); // 19:1:12:764 @ 67.2606206044478% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.2937604), NextPhase); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); // 19:1:12:764 @ 67.2606206044478% phases[phaseNum].phaseEndRegex = new Regex(@"\ uses\ Dragonfly\ Avatar\."); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), DragonflyAvatar); // 19:1:23:948 @ 66.4834394601787% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5080291), WarlordShell); // 19:1:24:456 @ 66.1968969777609% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9522832), TheSeeingRotation); // 19:1:29:408 @ 65.4513162896788% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7914457), TheSeeingRotation); // 19:1:37:200 @ 65.2590405816385% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.0728621), Tapasya); // 19:1:52:273 @ 62.1980136856111% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2854167), AtmaLinga); // 19:1:59:558 @ 60.2155008553507% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.238128), BlindingBlade); // 19:2:1:796 @ 59.9950104542863% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1791247), TheSeeingRotation); // 19:2:3:975 @ 59.8162183995438% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2433571), AtmaLinga); // 19:2:10:219 @ 59.101050180574% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.0852908), Tapasya); // 19:2:15:304 @ 58.8442667743775% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.4054236), AtmaLinga); // 19:2:22:709 @ 58.2063177152633% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8361622), BlindingBlade); // 19:2:25:545 @ 58.081519673066% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7283276), Tapasya); // 19:2:31:274 @ 57.2644815624406% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.5784907), BlindingBlade); // 19:2:39:852 @ 56.4530863904201% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.0181726), TheSeeingRotation); // 19:2:42:870 @ 56.1412397833112% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.885394), AtmaLinga); // 19:2:49:756 @ 55.3360815434328% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6145499), BloodyFuller); // 19:2:59:370 @ 53.8129633149591% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NextPhase); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); // 19:1:12:764 @ 67.2606206044478% phases[phaseNum].phaseEndRegex = new Regex(@"\ readies\ Bloody\ Fuller\."); phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(23.390337); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8845654), BeetleAvatar); // 19:3:25:612 @ 50.9159380345942% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2750157), PillarsofHeaven); // 19:3:25:887 @ 50.9159380345942% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.9646844), LaughingRose); // 19:3:37:852 @ 49.9891299182665% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.805847), Surpanakha); // 19:3:52:657 @ 48.0743917506178% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.5814909), TheRoseofConviction); // 19:4:1:239 @ 46.9768104923018% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8301046), TheRoseofHate); // 19:4:3:69 @ 46.8498740733701% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8415057), Surpanakha); // 19:4:11:911 @ 46.0647928150542% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.14058), ScorpionAvatar); // 19:4:22:51 @ 45.216094848888% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9242817), BladesofCarnageandLiberationNumbers); // 19:4:26:975 @ 44.2476477855921% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5210298), SwiftLiberation); // 19:4:27:496 @ 44.2476477855921% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.7100701), SwiftLiberation); // 19:4:46:207 @ 35.82856158525% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.433654), SwiftLiberation); // 19:4:57:640 @ 35.82856158525% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.634666), BladesofCarnageandLiberationPrey); // 19:5:9:275 @ 35.416745865805% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.646037), FinalLiberation); // 19:5:9:921 @ 35.1754062915796% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.6980695), FinalLiberation); // 19:5:28:619 @ 30.7056049230184% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.516773), FinalLiberation); // 19:5:42:136 @ 30.7056049230184% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.3408775), DragonflyAvatar); // 19:5:57:477 @ 29.974220680479% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.508029), WarlordShell); // 19:5:57:985 @ 29.8415819235887% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1942971), TheSeeingRotation); // 19:6:3:179 @ 29.0033382436799% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2553578), AtmaLinga); // 19:6:9:434 @ 27.4062084204524% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5430883), TheSeeingRotation); // 19:6:10:977 @ 27.0402490020909% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.456655), BlindingBlade); // 19:6:22:434 @ 24.7106657479567% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5881481), AtmaLinga); // 19:6:25:22 @ 23.7753635240449% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.09812), Tapasya); // 19:6:27:120 @ 23.0389303364379% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.3435344), BlindingBlade); // 19:6:36:464 @ 20.3507531838054% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8621637), AtmaLinga); // 19:6:39:326 @ 19.7432759931572% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9422827), Tapasya); // 19:6:44:268 @ 18.3481633719825% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.765387), BlindingBlade); // 19:6:51:34 @ 16.5104661661281% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1511802), AtmaLinga); // 19:6:54:185 @ 15.7070305075081% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.808847), BeetleAvatar); // 19:27:20:62 @ 23.4730208135336% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5130293), PillarsofHeaven); // 19:27:20:575 @ 23.2640538870937% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.2467005), LaughingRose); // 19:27:32:822 @ 21.9825722296141% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.558832), Surpanakha); // 19:27:47:381 @ 20.3381011214598% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.584491), TheRoseofConviction); // 19:27:55:965 @ 19.184684470633% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0701184), TheRoseofHate); // 19:27:58:35 @ 19.0196136666033% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.5794908), Surpanakha); // 19:28:6:615 @ 18.4432617373123% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6782675), ScorpionAvatar); // 19:28:11:293 @ 18.1206044478236% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6792677), BladesofCarnageandLiberationPrey); // 19:28:15:972 @ 17.3441360957993% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.808047), FinalLiberation); // 19:28:16:780 @ 17.2332969017297% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.692069), FinalLiberation); // 19:28:35:473 @ 5.62892035734651% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.509773), FinalLiberation); // 19:28:48:982 @ 5.62892035734651% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.570833), BladesofCarnageandLiberation); // 19:29:3:553 @ 5.00445495153013% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5680325), Liberation); // 19:29:4:121 @ 4.95028274092378% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); // 19:1:12:764 @ 67.2606206044478% }
public void onStartEncounter() { // Enrage @ 13 minutes // bossName is needed if you want health based phase swaps bossName = "Nael Deus Darnus"; // Triggered abilities // Enrage Timer TriggeredAbility EnrageTrigger = new TriggeredAbility(); timedAbilities.Add(EnrageTrigger); EnrageTrigger.warningMessage = "Enrage in one minute"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(13); EnrageTrigger.warningTime = TimeSpan.FromSeconds(65); EnrageTrigger.start(); // Person with thunderstruck needs to get away from everyone else TriggeredAbility ThunderstruckTrigger = new TriggeredAbility(); timedAbilities.Add(ThunderstruckTrigger); ThunderstruckTrigger.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Thunderstruck"); ThunderstruckTrigger.matchMessage = "${member} Thunder"; // When this drops, need to be about 55% - 75% along the radius of the arena away from the edge (0% is at edge, 100% is at center of arena) TriggeredAbility HeavensfallTrigger = new TriggeredAbility(); timedAbilities.Add(HeavensfallTrigger); HeavensfallTrigger.match = new Regex(@" readies Heavensfall"); HeavensfallTrigger.matchMessage = "Heaven's fall"; // Needs to be silenced TriggeredAbility EarthshockTrigger = new TriggeredAbility(); timedAbilities.Add(EarthshockTrigger); EarthshockTrigger.match = new Regex(@" readies Earthshock"); EarthshockTrigger.matchMessage = "Earth shock"; // Blight lasts 12 seconds. Warn 5 seconds before it ends (12-5=7) TriggeredAbility RavenBlightTrigger = new TriggeredAbility(); timedAbilities.Add(RavenBlightTrigger); RavenBlightTrigger.match = new Regex(@" suffers the effect of Raven Blight"); RavenBlightTrigger.warningMessage = "Blight"; RavenBlightTrigger.timerDuration = TimeSpan.FromSeconds(12); RavenBlightTrigger.warningTime = TimeSpan.FromSeconds(5); TriggeredAbility GarroteTwist = new TriggeredAbility(); // Garrote Twist timedAbilities.Add(GarroteTwist); GarroteTwist.announceWarning = true; GarroteTwist.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Garrote Twist"); GarroteTwist.matchMessage = @"${member} Twist"; // Rotation abilities // 4k conal AOE RotationAbility Ravensclaw = new RotationAbility(); Ravensclaw.announceWarning = false; Ravensclaw.match = new Regex(@" uses Ravensclaw"); Ravensclaw.warningMessage = "Ravensclaw"; // T9 version of Death sentance. On 47 second timer outside of rotation. Places Raven's Blight debuff on tank, which does big damage when it wears off RotationAbility Ravensbeak = new RotationAbility(); Ravensbeak.announceWarning = true; Ravensbeak.match = new Regex(@" readies Ravensbeak"); Ravensbeak.warningMessage = "Ravensbeak"; Ravensbeak.warningTime = TimeSpan.FromSeconds(4); RotationAbility RavenBlight = new RotationAbility(); // Raven Blight RavenBlight.announceWarning = false; RavenBlight.match = new Regex(@" suffers the effect of Raven Blight"); RavenBlight.warningMessage = @"Raven Blight"; // This is the damage from Raven Blight after it wears off (applied by Ravensbeak) // Not announcing here, since I have a triggered ability above for it (better timing) // This is just here to help with rotation timings RotationAbility RavensAscent = new RotationAbility(); RavensAscent.announceWarning = false; RavensAscent.match = new Regex(@" uses Raven's Ascent"); RavensAscent.warningMessage = "Raven's Ascent"; // Stardust on 38 second timer, outside of rotation. Starts at ??? // Meteor lands 12 seconds after stardust // Announcing 2 seconds after it happens (right when icon should show up), since this will just act as a prompt to look for the icon above your head RotationAbility Stardust = new RotationAbility(); Stardust.announceWarning = true; Stardust.match = new Regex(@" readies Stardust"); Stardust.warningMessage = "Stardust"; Stardust.warningTime = TimeSpan.FromSeconds(-2); // Jumps on main tank. RotationAbility RavenDive = new RotationAbility(); RavenDive.announceWarning = false; RavenDive.match = new Regex(@" uses Raven Dive"); RavenDive.warningMessage = "Raven Dive"; // Iron chariot point blank AOE, which starts off the chariot/dive/thermionic beam combo RotationAbility IronChariot = new RotationAbility(); IronChariot.announceWarning = true; IronChariot.match = new Regex(@" readies Iron Chariot"); IronChariot.warningMessage = "Chariot"; IronChariot.warningTime = TimeSpan.FromSeconds(7); // Damage is split by all who it hits. Very small range. Need to stack tight on one person (usually in the center of the arena) RotationAbility ThermionicBeam = new RotationAbility(); // Inertia Stream ThermionicBeam.announceWarning = true; ThermionicBeam.match = new Regex(@" uses Thermionic Beam"); ThermionicBeam.warningMessage = "Thermeonic"; ThermionicBeam.warningTime = TimeSpan.FromSeconds(7); RotationAbility LunarDynamo = new RotationAbility(); LunarDynamo.announceWarning = true; LunarDynamo.match = new Regex(@" readies Lunar Dynamo"); LunarDynamo.warningMessage = "Lunar Dynamo"; LunarDynamo.warningTime = TimeSpan.FromSeconds(5); RotationAbility MeteorStream = new RotationAbility(); MeteorStream.announceWarning = true; MeteorStream.match = new Regex(@" uses Meteor Stream"); MeteorStream.warningMessage = "Meteor Stream"; RotationAbility DalamudDive = new RotationAbility(); DalamudDive.announceWarning = false; DalamudDive.match = new Regex(@" uses Dalamud Dive"); DalamudDive.warningMessage = "Dalamud Dive"; RotationAbility MeteorImpact = new RotationAbility(); // Meteor Impact MeteorImpact.announceWarning = false; MeteorImpact.match = new Regex(@" uses Meteor Impact"); MeteorImpact.warningMessage = @"Meteor Impact"; /* * RotationAbility GarroteTwist = new RotationAbility(); * GarroteTwist.announceWarning = true; * GarroteTwist.match = new Regex("uses Garrote Twist"); * GarroteTwist.warningMessage = "Garrote Twist"; * * RotationAbility Heavensfall = new RotationAbility(); * Heavensfall.announceWarning = true; * Heavensfall.match = new Regex("readies Heavensfall"); * Heavensfall.warningMessage = "Heaven's fall"; */ RotationAbility BahamutsFavor = new RotationAbility(); BahamutsFavor.announceWarning = false; BahamutsFavor.match = new Regex(@"Nael Deus Darnus uses Bahamut's Favor"); BahamutsFavor.warningMessage = "Bahamut's Favor"; RotationAbility BahamutsClaw = new RotationAbility(); BahamutsClaw.announceWarning = false; BahamutsClaw.match = new Regex(@"Nael Deus Darnus uses Bahamut's Claw"); BahamutsClaw.warningMessage = "Bahamut's Claw"; RotationAbility FireTetherOut = new RotationAbility(); FireTetherOut.announceWarning = true; FireTetherOut.match = new Regex(@"uses Fire Tether"); FireTetherOut.warningMessage = "Fire away"; FireTetherOut.warningTime = TimeSpan.FromSeconds(9); RotationAbility FireTetherIn = new RotationAbility(); FireTetherIn.announceWarning = true; FireTetherIn.match = new Regex(@"uses Fire Tether"); FireTetherIn.warningMessage = "Fire in"; FireTetherIn.warningTime = TimeSpan.FromSeconds(9); FireTetherIn.warningCallback = delegate(Ability self) { // PartyList seems to be broken currently in FFXIV-APP, so disabling this until it's fixed return; string output = "except "; foreach (PartyEntity member in partyList) { foreach (StatusEntry status in member.StatusEntries) { if (status.StatusName == "Firescorched") { output += member.Name + " "; } } } if (output != "except ") { tts(output); } }; /* * RotationAbility Thunderstruck = new RotationAbility(); * Thunderstruck.announceWarning = true; * Thunderstruck.match = new Regex("uses Thunderstruck"); * Thunderstruck.warningMessage = "Thunderstruck"; */ RotationAbility SuperNova = new RotationAbility(); SuperNova.announceWarning = false; SuperNova.match = new Regex(@" uses SuperNova"); SuperNova.warningMessage = "Super Nova"; SuperNova.warningTime = TimeSpan.FromSeconds(7); RotationAbility DoubleDragonDivebombs = new RotationAbility(); DoubleDragonDivebombs.announceWarning = true; DoubleDragonDivebombs.warningMessage = "Divebombs soon"; DoubleDragonDivebombs.warningCallback = delegate(Ability self) { string output = ""; foreach (ActorEntity mob in mobList) { output += Environment.NewLine + "Mob: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")"; } foreach (ActorEntity mob in pcEntities) { output += Environment.NewLine + "Player: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")"; } debug(output, DBMErrorLevel.EncounterInfo); }; RotationAbility SingleDivebomb = new RotationAbility(); SingleDivebomb.announceWarning = false; SingleDivebomb.warningMessage = "Divebomb"; int phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndHP = 65; phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 20:20:12:381 @ 99.7669476312431% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1666387), Ravensclaw); // 20:20:23:548 @ 97.2918055007918% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.343134), Stardust); // 20:20:25:891 @ 96.9166541742199% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0644612), Ravensbeak); // 20:20:33:955 @ 94.6969878296274% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.374193), RavenBlight); // 20:20:37:329 @ 93.9135539478441% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020002), MeteorImpact); // 20:20:37:331 @ 93.9135539478441% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2323564), RavenDive); // 20:20:43:564 @ 92.5051617950323% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3050747), IronChariot); // 20:20:44:869 @ 92.2785341131979% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972972), RavensAscent); // 20:20:50:66 @ 92.0977610595946% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2690154), ThermionicBeam); // 20:20:50:335 @ 92.0977610595946% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.9723416), Ravensclaw); // 20:20:56:308 @ 91.5090833735401% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5324309), Stardust); // 20:21:3:840 @ 90.4482541858095% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8274477), Ravensclaw); // 20:21:11:667 @ 88.884031881564% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5771474), LunarDynamo); // 20:21:14:245 @ 88.2785996198097% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2960741), MeteorImpact); // 20:21:15:541 @ 88.159679924617% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1692385), MeteorStream); // 20:21:19:710 @ 87.7250687504488% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1141781), DalamudDive); // 20:21:22:824 @ 87.7250687504488% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4493117), Ravensbeak); // 20:21:28:273 @ 87.293229009855% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.392194), RavenBlight); // 20:21:31:666 @ 86.8082281343339% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4953715), Ravensclaw); // 20:21:38:161 @ 85.3030877549246% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.342134), Stardust); // 20:21:40:503 @ 84.8061193253323% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1522375), RavensAscent); // 20:21:44:655 @ 83.9348813889417% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5474316), MeteorImpact); // 20:21:52:203 @ 82.3632266037467% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551634), MeteorStream); // 20:21:55:58 @ 82.1137975820502% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3104753), DalamudDive); // 20:22:3:368 @ 82.1137975820502% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9562835), Ravensclaw); // 20:22:8:325 @ 81.9026647333818% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4833708), Ravensbeak); // 20:22:14:808 @ 80.9578578330161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3881938), RavenBlight); // 20:22:18:196 @ 80.5018310357729% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8481629), Stardust); // 20:22:21:44 @ 80.1182394342244% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.291417), Ravensclaw); // 20:22:28:336 @ 78.8102487613581% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5911482), RavensAscent); // 20:22:30:927 @ 78.3490570197263% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5580892), MeteorImpact); // 20:22:32:485 @ 78.2656620639874% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8661639), RavenDive); // 20:22:35:351 @ 77.9222562492678% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0330591), IronChariot); // 20:22:36:384 @ 77.7649144067936% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9402826), ThermionicBeam); // 20:22:41:325 @ 77.4672372460516% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.9306251), Ravensclaw); // 20:22:52:255 @ 76.5414524579466% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.866164), Stardust); // 20:22:55:121 @ 76.0711905700713% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7794449), Ravensbeak); // 20:23:2:901 @ 74.8106921907301% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6432084), RavenBlight); // 20:23:6:544 @ 74.3047795891476% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2560147), MeteorImpact); // 20:23:6:800 @ 74.3047795891476% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551633), LunarDynamo); // 20:23:9:655 @ 73.7472175436784% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4643125), MeteorStream); // 20:23:15:119 @ 73.1727749482561% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1221786), DalamudDive); // 20:23:18:242 @ 73.1727749482561% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.424253), Ravensclaw); // 20:23:22:666 @ 72.9851992849701% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7884455), Stardust); // 20:23:30:454 @ 72.0324560066414% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2804164), Ravensclaw); // 20:23:37:735 @ 71.0940737931981% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4282533), MeteorImpact); // 20:23:42:163 @ 70.5569195767769% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4202528), MeteorStream); // 20:23:46:583 @ 70.0340004509878% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0484604), DalamudDive); // 20:23:54:632 @ 70.0340004509878% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9442828), Ravensbeak); // 20:23:59:576 @ 69.7943974210551% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3731929), RavenBlight); // 20:24:2:949 @ 69.2946575578883% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), Ravensclaw); // 20:24:9:188 @ 68.3382610262115% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8701642), Stardust); // 20:24:12:58 @ 67.9610941115855% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3681926), RavensAscent); // 20:24:15:426 @ 67.4105866243057% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3294765), MeteorImpact); // 20:24:23:755 @ 66.2358767115177% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5600892), RavenDive); // 20:24:25:315 @ 66.0641738041579% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.032059), IronChariot); // 20:24:26:348 @ 66.0321763437988% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7443286), ThermionicBeam); // 20:24:32:92 @ 65.8216733663974% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6592665), Ravensclaw); // 20:24:36:751 @ 65.5844638472789% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank()); // 20:24:36:751 @ 65.5844638472789% // I couldn't make my group kill slower than this, so no idea where the rotation goes after 7 meteors. // Shouldn't be an issue though - usually you won't have more than 4 or 5 meteors /** / * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Ravensclaw); // 00:06 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), Ravensclaw); // 00:17 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Stardust); // 00:22 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 00:28 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands); // 00:31 * * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), RavenDive); // 00:37 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), IronChariot); // 00:38 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam); // 00:43 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), RavensAscent); // 00:43 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 00:45 * * // Ravensbeak here? * * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw); // 00:50 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Stardust); // 00:57 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensclaw); // 01:05 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), LunarDynamo); // 01:08 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), YellowMeteorLands); // 01:09 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 01:14 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), DalamudDive); // 01:16 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 01:22 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Ravensclaw); // 01:32 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), Stardust); // 01:34 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RavensAscent); // 01:37 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), RedMeteorLands); // 01:46 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream); // 01:49 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 01:54 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), DalamudDive); // 01:57 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw); // 02:02 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 02:08 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Stardust); // 02:14 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 02:23 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), RavensAscent); // 02:24 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands); // 02:26 * * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 02:28 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), IronChariot); // 02:30 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam); // 02:35 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 02:37 * * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 02:46 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust); // 02:49 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak); // 02:57 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands); // 03:00 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), LunarDynamo); // 03:02 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 03:07 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavensAscent); // 03:09 * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak); // ?? * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust); // ?? * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream); // ?? * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // ?? * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands); // ?? * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank()); // ?? * /**/ phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Megaflare"); // Golems phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Bahamut's Favor"); // Heavenfall/ghosts // Start @ 6:06 //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavensfall); phaseNum = 4; phases[phaseNum] = new Phase(); // Dragons/soft enrage phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), BahamutsFavor); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.5013718), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.4737135), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7770444), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1926402), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8685644), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.3431341), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3771931), SuperNova); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2523576), ThermionicBeam); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3321334), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1582379), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8188476), MeteorStream); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.3945945), DalamudDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4797138), BahamutsFavor); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4867142), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0030002), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.2156987), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8735075), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.0841764), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), SuperNova); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4673128), ThermionicBeam); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6742673), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9186245), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0184015), RavenDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3000743), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(19.7651305), RotationAbility.Blank()); // 11:08 }
public void onStartEncounter() { calloutDefensivePush = true; calloutDefensivePushByName = false; calloutTowerStrategy = true; // bossName is needed if you want health based phase swaps, or access to "bossEntity" for custom logic bossName = "The Avatar"; TriggeredAbility EnrageTrigger = new TriggeredAbility(); EnrageTrigger.warningMessage = "Enrage in one minute"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11); EnrageTrigger.warningTime = TimeSpan.FromSeconds(60); timedAbilities.Add(EnrageTrigger); EnrageTrigger.start(); TriggeredAbility mineTowerWarning = new TriggeredAbility(); mineTowerWarning.warningTime = TimeSpan.FromSeconds(5); mineTowerWarning.warningMessage = "Mines soon"; TriggeredAbility dreadTowerWarning = new TriggeredAbility(); dreadTowerWarning.warningTime = TimeSpan.FromSeconds(3); dreadTowerWarning.warningMessage = "Dreadnaught"; TriggeredAbility westTowerWarning = new TriggeredAbility(); westTowerWarning.warningTime = TimeSpan.FromSeconds(5); westTowerWarning.warningMessage = "Defensive reaction"; TriggeredAbility southTowerWarning = new TriggeredAbility(); southTowerWarning.warningTime = TimeSpan.FromSeconds(5); southTowerWarning.warningMessage = "Defensive reaction"; towers[Towers.mine] = new Tower(Towers.mine, this, mineTowerWarning); towers[Towers.dread] = new Tower(Towers.dread, this, dreadTowerWarning); towers[Towers.west] = new Tower(Towers.west, this, westTowerWarning); towers[Towers.south] = new Tower(Towers.south, this, southTowerWarning); TriggeredAbility LifeDrainMessage = new TriggeredAbility(); LifeDrainMessage.announceWarning = false; LifeDrainMessage.match = new Regex("The support module uses Life Drain"); LifeDrainMessage.matchCallback = delegate(Ability self, Match match) { // life drain should happen before Languishing. // We take a snapshot of everyone's position here, and use that when determining which tower. // Otherwise, if a monk were to use shoulder tackle between life drain and languishing, it may be difficult to tell which tower he pushed takeLifedrainSnapshot(); }; timedAbilities.Add(LifeDrainMessage); TriggeredAbility LanguishingMessage = new TriggeredAbility(); LanguishingMessage.collectMultipleLinesFor = TimeSpan.Zero; // set to zero so we can process each match ourselves LanguishingMessage.announceWarning = false; LanguishingMessage.match = new Regex("(?<member>.+?) suffers the effect of Languishing"); LanguishingMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { string dOut = "Languishing: " + match.Groups["member"].Value.Trim(); // snapshot is only valid for 2 seconds if (!lifeDrainSnapshot.Any() || (DateTime.Now - lastSnapshot).Duration() > TimeSpan.FromSeconds(1)) { takeLifedrainSnapshot(); } if (lifeDrainSnapshot.ContainsKey(match.Groups["member"].Value.Trim())) { if (!foundCoords) { towers[Towers.mine].pos = new Coordinate(bossEntity.Coordinate.X + 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.dread].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y - 15); towers[Towers.west].pos = new Coordinate(bossEntity.Coordinate.X - 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.south].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y + 15); foundCoords = true; } Coordinate playerCoord = lifeDrainSnapshot[match.Groups["member"].Value.Trim()]; SortedDictionary <double, Towers> distances = new SortedDictionary <double, Towers>(); distances.Add(playerCoord.DistanceTo(towers[Towers.mine].pos), Towers.mine); distances.Add(playerCoord.DistanceTo(towers[Towers.dread].pos), Towers.dread); distances.Add(playerCoord.DistanceTo(towers[Towers.west].pos), Towers.west); distances.Add(playerCoord.DistanceTo(towers[Towers.south].pos), Towers.south); towers[distances.First().Value].addCharge(); dOut += " Tower: " + Enum.GetName(typeof(Towers), distances.First().Value); debug(dOut, DBMErrorLevel.EncounterInfo); } } }; timedAbilities.Add(LanguishingMessage); SpawnTowers.timerDuration = TimeSpan.FromSeconds(20); SpawnTowers.warningTime = TimeSpan.Zero; SpawnTowers.warningCallback = this.startTowers; timedAbilities.Add(SpawnTowers); RotationAbility startTowers = new RotationAbility(); startTowers.warningTime = TimeSpan.Zero; startTowers.warningCallback = this.startTowers; TriggeredAbility BrainjackOver = new TriggeredAbility(); BrainjackOver.match = new Regex("recovers from the effect of Confused"); BrainjackOver.matchMessage = "Brainjack over"; timedAbilities.Add(BrainjackOver); TriggeredAbility AllaganFieldMessage = new TriggeredAbility(); AllaganFieldMessage.timerDuration = TimeSpan.FromSeconds(30); AllaganFieldMessage.warningTime = TimeSpan.FromSeconds(5); AllaganFieldMessage.warningMessage = "Field exploding"; AllaganFieldMessage.match = new Regex("(?<member>[^ ]+?) [^ ]* suffers the effect of Allagan Field"); AllaganFieldMessage.matchMessage = "Allagan field on ${member}"; AllaganFieldMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { lastAllaganField = match.Groups["member"].Value; } else { lastAllaganField = ""; } }; timedAbilities.Add(AllaganFieldMessage); if (calloutDefensivePush) { TriggeredAbility AllaganFieldRecovery = new TriggeredAbility(); AllaganFieldRecovery.announceWarning = false; AllaganFieldRecovery.match = new Regex("(?<member>[^ ]+?) [^ ]* recovers from the effect of Allagan Field"); AllaganFieldRecovery.matchCallback = delegate(Ability self, Match match) { if (defensiveWarningOnFieldDrop) { if (calloutDefensivePushByName) { tts(lastAllaganField + " west tower now"); } else { tts("One to west now"); } defensiveWarningOnFieldDrop = false; } }; timedAbilities.Add(AllaganFieldRecovery); } RotationAbility Brainjack = new RotationAbility(); // Homing Missile Brainjack.announceWarning = true; Brainjack.match = new Regex("The Avatar readies Brainjack"); Brainjack.warningMessage = "Brain jack"; RotationAbility HomingMissile = new RotationAbility(); // Homing Missile HomingMissile.announceWarning = true; HomingMissile.match = new Regex("The Avatar uses Homing Missile"); HomingMissile.warningMessage = "Homing Missile"; HomingMissile.warningTime = TimeSpan.FromSeconds(5); RotationAbility GaseousBomb = new RotationAbility(); // Gaseous Bomb GaseousBomb.announceWarning = false; GaseousBomb.match = new Regex("The Avatar uses Gaseous Bomb"); GaseousBomb.warningMessage = "Gaseous"; RotationAbility InertiaStream = new RotationAbility(); // Inertia Stream InertiaStream.announceWarning = true; InertiaStream.match = new Regex("The Avatar uses Inertia Stream"); InertiaStream.warningMessage = "Gather for circles"; RotationAbility BallisticMissile = new RotationAbility(); // Ballistic Missile BallisticMissile.announceWarning = false; BallisticMissile.match = new Regex("The Avatar readies Ballistic Missile"); BallisticMissile.warningMessage = "Ballistic Missile"; RotationAbility NextPhase = new RotationAbility(); NextPhase.announceWarning = false; NextPhase.matchRegex = false; NextPhase.warningTime = TimeSpan.Zero; NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; // This is just a placeholder. Rotation can watch for it to make sure the timing is right. RotationAbility AllaganField = new RotationAbility(); AllaganField.announceWarning = false; AllaganField.match = new Regex("The Avatar uses Allagan Field"); AllaganField.warningMessage = ""; RotationAbility Dreadnaught = new RotationAbility(); // Dreadnaught RotationAbility Mines = new RotationAbility(); // Mines RotationAbility Defensive = new RotationAbility(); // Defensive RotationAbility DreadnaughtTower = new RotationAbility(); // RotationAbility MineTower = new RotationAbility(); // RotationAbility P3TowerSet1 = new RotationAbility(); RotationAbility P3TowerSet2 = new RotationAbility(); // // This is the old way of doing towers. Hard coded into the rotation. // New way understands towers much better, and will work with strategies other than the one this rotation was scripted for /** / * Dreadnaught.announceWarning = true; * Dreadnaught.match = new Regex("A reinforcement dreadnaught appears!"); * Dreadnaught.warningMessage = "Dreadnaught"; * Dreadnaught.warningTime = TimeSpan.FromSeconds(5); * * * Mines.announceWarning = true; * Mines.match = new Regex("Landmines have been scattered"); * Mines.warningMessage = "Mines soon"; * Mines.warningTime = TimeSpan.FromSeconds(5); * * * * Defensive.announceWarning = true; * Defensive.match = new Regex("The support module uses Defensive Reaction."); * Defensive.warningMessage = "Defensive reaction"; * Defensive.warningTime = TimeSpan.FromSeconds(5); * * * * DreadnaughtTower.announceWarning = true; * DreadnaughtTower.matchRegex = false; * DreadnaughtTower.warningMessage = "Two to dreadnaught tower"; * DreadnaughtTower.warningTime = TimeSpan.FromSeconds(1); * * * * MineTower.announceWarning = true; * MineTower.matchRegex = false; * MineTower.warningMessage = "Two to mine tower."; * MineTower.warningTime = TimeSpan.FromSeconds(1); * * * * P3TowerSet1.announceWarning = false; * P3TowerSet1.matchRegex = false; * P3TowerSet1.warningMessage = ""; * P3TowerSet1.warningTime = TimeSpan.FromSeconds(1); * P3TowerSet1.warningCallback = delegate(Ability self) * { * tts("Two to west defensive. One to south tower. " + lastAllaganField + " stand near west tower"); * defensiveWarningOnFieldDrop = true; * }; * * * * * P3TowerSet2.announceWarning = true; * P3TowerSet2.matchRegex = false; * P3TowerSet2.warningTime = TimeSpan.FromSeconds(1); * P3TowerSet2.warningMessage = "Two to mine tower. One to dreadnaught tower."; * /**/ int phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), startTowers); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6771255), HomingMissile); // 19:45:41:498 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1835252), GaseousBomb); // 19:45:50:681 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.0937785), HomingMissile); // 19:46:21:775 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:46:30:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), MineTower); // 19:46:54:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8667655), HomingMissile); // 19:47:1:570 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.074519), GaseousBomb); // 19:47:10:645 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), HomingMissile); // 19:47:41:906 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), GaseousBomb); // 19:47:50:768 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), Defensive); // // maybe add in other logic for the phase switch someday, but I've never heard of anyone not phase swapping at this point phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NextPhase); phases[phaseNum].phaseEndRegex = new Regex("The Avatar uses Inertia Stream"); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4024234), InertiaStream); // 19:47:58:171 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.255129), BallisticMissile); // 19:48:0:426 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:48:10:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Brainjack); // 19:48:16:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.5), HomingMissile); // 19:48:35:170 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:48:50:876 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Brainjack); // 19:48:56:315 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), HomingMissile); // 19:49:14:960 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), InertiaStream); // 19:49:17:29 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5), BallisticMissile); // 19:49:19:398 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), GaseousBomb); // 19:49:31:70 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1832965), Brainjack); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.8150762), HomingMissile); // 19:49:55:68 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), GaseousBomb); // 19:50:11:108 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.280302), Brainjack); // 19:50:16:389 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.654067), HomingMissile); // 19:50:35:43 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1181211), InertiaStream); // 19:50:37:161 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.4061376), BallisticMissile); // 19:50:39:567 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:50:51:71 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.332305), Brainjack); // 19:50:56:403 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.7060699), HomingMissile); // 19:51:15:109 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.9849143), GaseousBomb); // 19:51:31:94 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1712958), Brainjack); // 19:51:36:265 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.2110988), HomingMissile); // 19:51:55:476 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8141038), InertiaStream); // 19:51:57:290 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2931311), BallisticMissile); // 19:51:59:584 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:52:10.503 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.332305), Brainjack); // 19:52:15.835 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), RotationAbility.Blank()); // Next phase should be here somewhere. Let Allagan Field trigger it. //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), NextPhase); // 19:52:15.835 phases[phaseNum].phaseEndRegex = new Regex("The Avatar readies Allagan Field"); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), AllaganField); // 20:12:25.00 / 19:52:3:380 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6915543), HomingMissile); // 20:12:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), P3TowerSet1); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), GaseousBomb); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(22), AllaganField); // 20:13:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:13:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16), AllaganField); // 20:13:45.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:55.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), GaseousBomb); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), P3TowerSet2); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), AllaganField); // 20:14:25.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:14:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:14:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), AllaganField); // 20:15:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:15:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), GaseousBomb); // 20:15:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), RotationAbility.Blank()); // 20:15:45.00 }
public AddTriggeredAbility(TriggeredAbility triggeredAbility) { _triggeredAbility = triggeredAbility; }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Oppressor"; int phaseNum = 1; // for convenience RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; TriggeredAbility Prey = new TriggeredAbility(); timedAbilities.Add(Prey); Prey.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); Prey.matchMessage = "${member.1} ${member.2} ${member.3} prey"; RotationAbility ResinBomb = new RotationAbility(); // Resin Bomb ResinBomb.announceWarning = true; ResinBomb.warningTime = TimeSpan.FromSeconds(2); ResinBomb.match = new Regex(@"\ readies\ Resin\ Bomb\."); ResinBomb.warningMessage = @"Raisins"; RotationAbility EmergencyDeployment = new RotationAbility(); // Emergency Deployment EmergencyDeployment.announceWarning = true; EmergencyDeployment.warningTime = TimeSpan.FromSeconds(1); EmergencyDeployment.match = new Regex(@"\ readies\ Emergency\ Deployment\."); EmergencyDeployment.warningMessage = @"Adds"; RotationAbility DistressBeacon = new RotationAbility(); // Distress Beacon DistressBeacon.announceWarning = false; DistressBeacon.warningTime = TimeSpan.FromSeconds(0); DistressBeacon.match = new Regex(@"\ uses\ Distress\ Beacon\."); DistressBeacon.warningMessage = @"Distress Beacon"; RotationAbility HypercompressedPlasma = new RotationAbility(); // Hypercompressed Plasma HypercompressedPlasma.announceWarning = true; HypercompressedPlasma.warningTime = TimeSpan.FromSeconds(4); HypercompressedPlasma.match = new Regex(@"\ readies\ Hypercompressed\ Plasma\."); HypercompressedPlasma.warningMessage = @"Plasma"; RotationAbility EmergencyLiftoff = new RotationAbility(); // Emergency Liftoff EmergencyLiftoff.announceWarning = true; EmergencyLiftoff.warningTime = TimeSpan.FromSeconds(5); EmergencyLiftoff.match = new Regex(@"\ uses\ Emergency\ Liftoff\."); EmergencyLiftoff.warningMessage = @"Lift off"; // Frontal laser cleave RotationAbility RoyalFount = new RotationAbility(); // Royal Fount RoyalFount.announceWarning = false; RoyalFount.match = new Regex(@"\ uses\ Royal\ Fount\."); RotationAbility GunneryPod = new RotationAbility(); // Gunnery Pod GunneryPod.announceWarning = false; GunneryPod.match = new Regex(@"\ uses\ Gunnery\ Pod\."); RotationAbility HydrothermalMissile = new RotationAbility(); // Hydrothermal Missile HydrothermalMissile.announceWarning = false; HydrothermalMissile.match = new Regex(@"\ readies\ Hydrothermal\ Missile\."); HydrothermalMissile.warningMessage = @"Prey missile"; RotationAbility PhotonSpaser = new RotationAbility(); // Photon Spaser PhotonSpaser.announceWarning = false; PhotonSpaser.match = new Regex(@"\ readies\ Photon\ Spaser\."); RotationAbility a3000tonzeMissile = new RotationAbility(); // 3000-tonze Missile a3000tonzeMissile.announceWarning = false; a3000tonzeMissile.match = new Regex(@"\ readies\ 3000-tonze\ Missile\."); a3000tonzeMissile.warningMessage = @"3000-tonze Missile"; RotationAbility QuickLanding = new RotationAbility(); // Quick Landing QuickLanding.announceWarning = false; QuickLanding.match = new Regex(@"\ uses\ Quick\ Landing\."); QuickLanding.warningMessage = @"Quick Landing"; RotationAbility ParticleCollision = new RotationAbility(); // Particle Collision ParticleCollision.announceWarning = false; ParticleCollision.match = new Regex(@"\ uses\ Particle\ Collision\."); ParticleCollision.warningMessage = @"Particle Collision"; // You'll need to split these up into phases // And separate out any timed moves which aren't part of a rotation // For now we'll assume they're all part of phase 1 phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9022804), RoyalFount); // 18:52:44:542 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9022232), GunneryPod); // 18:52:48:444 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.307075), HydrothermalMissile); // 18:52:49:751 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3034749), PhotonSpaser); // 18:52:58:55 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.6251501), HydrothermalMissile); // 18:53:0:680 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4493117), RoyalFount); // 18:53:6:129 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.4531975), ResinBomb); // 18:53:9:583 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.1894112), RoyalFount); // 18:53:16:772 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8361051), PhotonSpaser); // 18:53:18:608 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.700326), GunneryPod); // 18:53:24:308 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1261788), RoyalFount); // 18:53:27:435 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3070748), EmergencyDeployment); // 18:53:28:742 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.271416), HydrothermalMissile); // 18:53:36:13 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.733328), GunneryPod); // 18:53:41:746 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.363192), RoyalFount); // 18:53:45:110 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.767101), HydrothermalMissile); // 18:53:46:877 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.443197), PhotonSpaser); // 18:53:50:320 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7203272), GunneryPod); // 18:53:56:40 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.6203786), RoyalFount); // 18:54:2:661 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2121266), DistressBeacon); // 18:54:4:873 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1922973), NextPhase); // 18:54:4:873 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); // 18:54:4:873 @ 99.9460681483161% phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.703669), a3000tonzeMissile); // 18:54:21:769 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1375798), GunneryPod); // 18:54:31:907 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.696097), EmergencyDeployment); // 18:54:33:603 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.8933942), ResinBomb); // 18:54:40:499 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.259415), RoyalFount); // 18:54:47:759 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.561089), PhotonSpaser); // 18:54:49:320 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.027402), GunneryPod); // 18:54:56:348 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.330132), HydrothermalMissile); // 18:54:58:678 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.636551), RoyalFount); // 18:55:8:314 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.035059), HydrothermalMissile); // 18:55:9:349 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.808103), HypercompressedPlasma); // 18:55:11:158 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.706669), PhotonSpaser); // 18:55:22:864 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.908624), GunneryPod); // 18:55:33:773 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.099521), RoyalFount); // 18:55:42:872 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.016401), EmergencyLiftoff); // 18:55:49:889 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.559832), ResinBomb); // 18:56:4:449 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.281416), QuickLanding); // 18:56:11:730 @ 99.9460681483161% }
public bool FilterTargets(TriggeredAbility ability, GenericShip ship) { return(ability.FilterTargetsByParameters(ship, MinRange, MaxRange, InArcType, TargetTypes, HasToken)); }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Imdugud"; midPointReached = false; chargeCalled = false; int phaseNum = 1; // for convenience // Boss's abilities TriggeredAbility Prey = new TriggeredAbility(); timedAbilities.Add(Prey); Prey.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); Prey.matchMessage = "${member.1} ${member.2} ${member.3} prey"; TriggeredAbility HeatLightningAnnounce = new TriggeredAbility(); // Heat Lightning timedAbilities.Add(HeatLightningAnnounce); HeatLightningAnnounce.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningAnnounce.matchMessage = @"Heat Lightning"; RotationAbility CrackleHiss = new RotationAbility(); // Crackle Hiss CrackleHiss.announceWarning = false; CrackleHiss.match = new Regex(@"Imdugud uses Crackle Hiss\."); CrackleHiss.warningMessage = @"Crackle Hiss"; RotationAbility CriticalRip = new RotationAbility(); // Critical Rip CriticalRip.announceWarning = true; CriticalRip.match = new Regex(@"Imdugud readies Critical Rip\."); CriticalRip.warningMessage = @"Critical Rip"; RotationAbility WildCharge = new RotationAbility(); // Wild Charge WildCharge.warningTime = TimeSpan.FromSeconds(7); WildCharge.match = new Regex(@"Imdugud readies Wild Charge\."); WildCharge.warningCallback = delegate(Ability self) { if (!chargeCalled) { tts("Charge"); } }; RotationAbility ErraticBlaster = new RotationAbility(); // Erratic Blaster ErraticBlaster.announceWarning = false; ErraticBlaster.match = new Regex(@"Imdugud uses Erratic Blaster\."); ErraticBlaster.warningMessage = @"Erratic Blaster"; RotationAbility HeatLightning = new RotationAbility(); // Heat Lightning HeatLightning.announceWarning = false; HeatLightning.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightning.warningMessage = @"Heat Lightning"; RotationAbility HeatLightningUnique = new RotationAbility(); // Heat Lightning HeatLightningUnique.announceWarning = false; HeatLightningUnique.uniqueInPhase = true; HeatLightningUnique.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningUnique.warningMessage = @"Heat Lightning"; RotationAbility Electrification = new RotationAbility(); // Electrification Electrification.announceWarning = false; Electrification.match = new Regex(@"\ uses\ Electrification\."); Electrification.warningMessage = @"Electrification"; RotationAbility CyclonicChaos = new RotationAbility(); // Cyclonic Chaos CyclonicChaos.announceWarning = true; CyclonicChaos.match = new Regex(@" uses Cyclonic Chaos\."); CyclonicChaos.warningMessage = @"Tether"; RotationAbility NextAdds = new RotationAbility(); NextAdds.warningTime = TimeSpan.Zero; NextAdds.announceWarning = true; NextAdds.warningMessage = @"Adds soon"; RotationAbility Tether = new RotationAbility(); Tether.announceWarning = true; Tether.warningMessage = @"Tether"; RotationAbility WildChargeAndTether = new RotationAbility(); WildChargeAndTether.warningTime = TimeSpan.Zero; WildChargeAndTether.warningCallback = delegate(Ability self) { chargeCalled = true; tts("Charge"); }; TriggeredAbility SpikeFlail = new TriggeredAbility(); // Spike Flail timedAbilities.Add(SpikeFlail); SpikeFlail.announceWarning = false; SpikeFlail.match = new Regex(@"Imdugud readies Spike Flail\."); SpikeFlail.matchCallback = delegate(Ability self, Match match) { delayRotation(TimeSpan.FromSeconds(5.3)); }; TriggeredAbility ElectricBurst = new TriggeredAbility(); // Electric Burst timedAbilities.Add(ElectricBurst); ElectricBurst.announceWarning = false; ElectricBurst.match = new Regex(@"Imdugud readies Electric Burst\."); ElectricBurst.matchCallback = delegate(Ability self, Match match) { delayRotation(TimeSpan.FromSeconds(5.7)); }; RotationAbility GoTo6 = new RotationAbility(); GoTo6.warningTime = TimeSpan.Zero; GoTo6.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(6); }; RotationAbility GoTo7 = new RotationAbility(); GoTo7.warningTime = TimeSpan.Zero; GoTo7.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(7); }; RotationAbility GoTo8 = new RotationAbility(); GoTo8.warningTime = TimeSpan.Zero; GoTo8.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(8); }; RotationAbility MidRotation = new RotationAbility(); MidRotation.warningTime = TimeSpan.Zero; MidRotation.warningCallback = delegate(Ability self) { midPointReached = true; }; TriggeredAbility HeatLightningChargeSwapFromTether = new TriggeredAbility(); HeatLightningChargeSwapFromTether.announceWarning = false; HeatLightningChargeSwapFromTether.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningChargeSwapFromTether.matchCallback = delegate(Ability self, Match match) { if (midPointReached) { midPointReached = false; setPhase(8); } }; TriggeredAbility HeatLightningChargeSwap = new TriggeredAbility(); HeatLightningChargeSwap.announceWarning = false; HeatLightningChargeSwap.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningChargeSwap.matchCallback = delegate(Ability self, Match match) { if (!midPointReached) { midPointReached = false; setPhase(8); } }; TriggeredAbility HeatLightningTetherSwap = new TriggeredAbility(); HeatLightningTetherSwap.announceWarning = false; HeatLightningTetherSwap.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningTetherSwap.matchCallback = delegate(Ability self, Match match) { if (midPointReached) { midPointReached = false; setPhase(7); } }; // // Phase 1 // phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.2112981), CrackleHiss); // 20:2:55:189 @ 99.3684518799455% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1175215), CriticalRip); // 20:3:4:307 @ 97.7928231542308% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7904456), CrackleHiss); // 20:3:12:97 @ 95.8220576843757% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.3645356), WildCharge); // 20:3:21:462 @ 93.4524667822456% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0074008), CrackleHiss); // 20:3:28:469 @ 92.5618162653262% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.5968921), ErraticBlaster); // 20:3:44:66 @ 89.6093008594643% phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electrocharge\."); // // Phase 2 // phaseNum = 2; phases[phaseNum] = new Phase(); // Nothing to warn about in this phase. Prey is being handled by a trigger. phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electric Burst\."); // // Phase 3 // phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.637208), HeatLightning); // 20:6:36:943 @ 76.1975661365016% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.1159218), ErraticBlaster); // 20:6:57:482 @ 72.6669326993261% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3781932), CrackleHiss); // 20:7:0:860 @ 72.1929921632144% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3411339), HeatLightning); // 20:7:3:202 @ 71.7703579257054% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7984461), WildCharge); // 20:7:11:0 @ 70.705668395879% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.274416), CrackleHiss); // 20:7:18:274 @ 70.1388399858265% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.5804908), CriticalRip); // 20:7:27:381 @ 69.1835815373334% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7583866), CrackleHiss); // 20:7:34:139 @ 68.375647057377% phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electrocharge\."); // // Phase 4 // phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), NextAdds); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electric Burst\."); /**/ // // Phase 5 // phaseNum = 5; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.7), GoTo7); // // Phase 6 // Tether/charge combo rotation phaseNum = 6; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningChargeSwap); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), WildChargeAndTether); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(125.3316205), GoTo7); // // Phase 7 // Heat Lightning/Tether rotation // Seems like this is always the first rotation for the final phase // This also seems to always follow a charge/tether rotation phaseNum = 7; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningChargeSwapFromTether); //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), HeatLightning); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2), CyclonicChaos); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7033262), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.767461), CriticalRip); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7563865), ErraticBlaster); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3811933), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.498), GoTo6); // // Phase 8 // Heat Lightning/Charge rotation phaseNum = 8; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), HeatLightning); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.287417), Electrification); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.779045), WildCharge); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0214016), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(121.3940121), GoTo7); /**/ }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Melusine"; renaudCount = 0; pausedDamage = false; lastRenaud = DateTime.MinValue; lastVoice = DateTime.MinValue; lastAddedNewMob = DateTime.Now; TriggeredAbility PetrifactionTrigger = new TriggeredAbility(); timedAbilities.Add(PetrifactionTrigger); PetrifactionTrigger.match = new Regex(@" readies Petrifaction\."); PetrifactionTrigger.matchMessage = "petrefaction look away"; TriggeredAbility CursedShriekTrigger = new TriggeredAbility(); timedAbilities.Add(CursedShriekTrigger); CursedShriekTrigger.match = new Regex("(?<member>[^ ]+?) [^ ]+ suffers the effect of Cursed Shriek"); CursedShriekTrigger.matchMessage = "Shriek on ${member}"; CursedShriekTrigger.warningMessage = "3. 2. 1"; CursedShriekTrigger.timerDuration = TimeSpan.FromSeconds(10); CursedShriekTrigger.warningTime = TimeSpan.FromSeconds(3); // Every 24 seconds, although phase transitions will alter TriggeredAbility CursedVoiceTrigger = new TriggeredAbility(); timedAbilities.Add(CursedVoiceTrigger); CursedVoiceTrigger.match = new Regex("(?<member>[^ ]+?) [^ ]+ suffers the effect of Cursed Voice"); CursedVoiceTrigger.matchMessage = "${member.1}, ${member.2}, and ${member.3}"; TriggeredAbility CursedVoiceUsed = new TriggeredAbility(); timedAbilities.Add(CursedVoiceUsed); CursedVoiceUsed.announceWarning = false; CursedVoiceUsed.match = new Regex(@" readies Cursed Voice\."); CursedVoiceUsed.matchCallback = delegate(Ability self, Match m) { lastVoice = DateTime.Now; if (pausedDamage) { TimeSpan timeSinceRenaud = DateTime.Now - lastRenaud; if (renaudCount >= 4 || timeSinceRenaud < TimeSpan.FromSeconds(20)) { pausedDamage = false; tts("Continue damage"); } } }; TriggeredAbility firstDamagePause = new TriggeredAbility(); timedAbilities.Add(firstDamagePause); firstDamagePause.healthTriggerAt = 84; firstDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; TriggeredAbility secondDamagePause = new TriggeredAbility(); timedAbilities.Add(secondDamagePause); secondDamagePause.healthTriggerAt = 64; secondDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; TriggeredAbility thirdDamagePause = new TriggeredAbility(); timedAbilities.Add(thirdDamagePause); thirdDamagePause.healthTriggerAt = 39; thirdDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; phases[1] = new Phase(); }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Phoenix"; int phaseNum = 1; // for convenience bennuCount = 0; TriggeredAbility EnrageTrigger = new TriggeredAbility(); timedAbilities.Add(EnrageTrigger); EnrageTrigger.warningMessage = "Enrage soon"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(13); EnrageTrigger.warningTime = TimeSpan.FromSeconds(30); EnrageTrigger.start(); TriggeredAbility FlamesofUnforgivenessTrigger = new TriggeredAbility(); // Flames of Unforgiveness timedAbilities.Add(FlamesofUnforgivenessTrigger); FlamesofUnforgivenessTrigger.announceWarning = true; FlamesofUnforgivenessTrigger.match = new Regex(@"\ readies\ Flames\ of\ Unforgiveness\."); FlamesofUnforgivenessTrigger.matchMessage = @"Flames of Unforgiveness"; TriggeredAbility BrandofPurgatoryTrigger = new TriggeredAbility(); timedAbilities.Add(BrandofPurgatoryTrigger); BrandofPurgatoryTrigger.announceWarning = true; BrandofPurgatoryTrigger.match = new Regex(@"\ readies\ Brand\ of\ Purgatory\."); BrandofPurgatoryTrigger.matchMessage = "Purgatory"; TriggeredAbility ChainofPurgatory = new TriggeredAbility(); // Chain of Purgatory timedAbilities.Add(ChainofPurgatory); ChainofPurgatory.announceWarning = false; ChainofPurgatory.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers\ the\ effect\ of\ Chain\ of\ Purgatory\."); ChainofPurgatory.matchMessage = "${member.1} ${member.2} ${member.3} Purgatory"; TriggeredAbility ArmofPurgatory = new TriggeredAbility(); // Chain of Purgatory timedAbilities.Add(ArmofPurgatory); ArmofPurgatory.announceWarning = false; ArmofPurgatory.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers\ the\ effect\ of\ Arm\ of\ Purgatory\."); ArmofPurgatory.matchMessage = "${member.1} ${member.2} ${member.3} Purgatory"; Bennu = new TriggeredAbility(); Bennu.warningTime = TimeSpan.FromSeconds(6); Bennu.announceWarning = true; Bennu.warningCallback = delegate(Ability abil) { bennuCount++; tts("Add " + bennuCount); }; Bennu.timerDuration = TimeSpan.FromSeconds(6); Bennu.start(); Bennu.timerDuration = TimeSpan.FromSeconds(60); // Boss's abilities RotationAbility Revelation = new RotationAbility(); // Revelation Revelation.announceWarning = true; Revelation.match = new Regex(@"\ readies\ Revelation\."); Revelation.warningMessage = @"Revelation"; Revelation.warningTime = TimeSpan.FromSeconds(4); RotationAbility Blackfire = new RotationAbility(); // Blackfire Blackfire.announceWarning = true; Blackfire.match = new Regex(@"\ readies\ Blackfire\."); Blackfire.warningMessage = @"Blackfire"; Blackfire.warningTime = TimeSpan.FromSeconds(2); RotationAbility Whitefire = new RotationAbility(); // Whitefire Whitefire.announceWarning = false; Whitefire.match = new Regex(@"\ uses\ Whitefire\."); Whitefire.warningMessage = @"Whitefire"; RotationAbility FlamesofUnforgiveness = new RotationAbility(); // Flames of Unforgiveness FlamesofUnforgiveness.announceWarning = false; FlamesofUnforgiveness.match = new Regex(@"\ readies\ Flames\ of\ Unforgiveness\."); FlamesofUnforgiveness.warningMessage = @"Flames of Unforgiveness"; FlamesofUnforgiveness.warningTime = TimeSpan.FromSeconds(2); RotationAbility Bluefire = new RotationAbility(); // Bluefire Bluefire.announceWarning = true; Bluefire.match = new Regex(@"\ uses\ Bluefire\."); Bluefire.warningMessage = @"Blue fire"; Bluefire.warningTime = TimeSpan.FromSeconds(7); RotationAbility Redfire = new RotationAbility(); // Redfire Redfire.announceWarning = true; Redfire.match = new Regex(@"\ readies\ Redfire\."); Redfire.warningMessage = @"Red fire"; Redfire.warningTime = TimeSpan.FromSeconds(3); RotationAbility RedfirePlume = new RotationAbility(); // Redfire Plume RedfirePlume.announceWarning = false; RedfirePlume.match = new Regex(@"\ uses\ Redfire\ Plume\."); RedfirePlume.warningMessage = @"Plumes"; RotationAbility FountainofFire = new RotationAbility(); // Fountain of Fire FountainofFire.announceWarning = true; FountainofFire.match = new Regex(@"\ readies\ Fountain\ of\ Fire\."); FountainofFire.warningMessage = @"Fountain of Fire"; FountainofFire.warningTime = TimeSpan.FromSeconds(0); RotationAbility Summon = new RotationAbility(); // Summon Summon.announceWarning = false; Summon.match = new Regex(@"\ uses\ Summon\."); Summon.warningMessage = @"Pinions"; RotationAbility FlamesofRebirth = new RotationAbility(); // Flames of Rebirth FlamesofRebirth.announceWarning = false; FlamesofRebirth.match = new Regex(@"\ uses\ Flames\ of\ Rebirth\."); FlamesofRebirth.warningMessage = @"Flames of Rebirth"; phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(Bennu); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.2996463), Revelation); // 19:54:26:533 @ 98.6916419856706% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.063804), Blackfire); // 19:54:40:597 @ 96.5580581595509% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.0318026), Whitefire); // 19:54:54:629 @ 93.7983939241556% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(19.4051099), RotationAbility.Blank()); // 19:54:54:629 @ 93.7983939241556% //phases[phaseNum].phaseEndHP = 80; phases[phaseNum].phaseEndRegex = new Regex(@"\ readies\ Brand\ of\ Purgatory\."); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(0); phases[phaseNum].timedAbilities.Add(Bennu); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.512459), Bluefire); // 19:56:49:932 @ 77.817657377155% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.0053435), FlamesofUnforgiveness); // 19:56:55:937 @ 76.7435452792082% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.917625), Redfire); // 19:57:6:855 @ 74.8648493815126% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972973), Revelation); // 19:57:12:52 @ 74.180298427115% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.819848), Bluefire); // 19:57:26:872 @ 72.2938731416506% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.237357), FlamesofUnforgiveness); // 19:57:33:110 @ 71.8471145286119% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.917625), Redfire); // 19:57:6:855 @ 74.8648493815126% phases[phaseNum].phaseEndRegex = new Regex(@"\ readies\ Flames\ of\ Rebirth\."); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex(@"\ readies\ Rebirth\."); phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.436654), FountainofFire); // 18:50:49:525 @ 51.3640550732519% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0204016), Summon); // 18:50:56:545 @ 50.2009186150028% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.162238), Revelation); // 18:51:0:708 @ 49.2614797321813% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.979085), FlamesofUnforgiveness); // 18:51:19:687 @ 46.1791817579174% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.156981), FlamesofRebirth); // 18:51:36:844 @ 43.348316221075% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3194759), FountainofFire); // 18:51:45:163 @ 41.7393304895249% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0194014), Summon); // 18:51:52:183 @ 40.0732382224591% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1652383), Revelation); // 18:51:56:348 @ 39.2448297215875% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.977086), FlamesofUnforgiveness); // 18:52:15:325 @ 35.5056247209464% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.144980), FlamesofRebirth); // 18:52:32:470 @ 32.1134237641391% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.024402), RedfirePlume); // 18:52:39:494 @ 30.9370109457224% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.3985949), RotationAbility.Blank()); }