Example #1
0
        public virtual void Initialize(TriggeredAbility triggeredAbility, Game game)
        {
            Game    = game;
            Ability = triggeredAbility;

            Initialize();
        }
Example #2
0
    public virtual void Initialize(TriggeredAbility triggeredAbility, Game game)
    {
      Game = game;
      Ability = triggeredAbility;

      Initialize();
    }
Example #3
0
    public IEnumerator TriggeredEffect(TriggeredAbility ability)
    {
        AddActiveEffect(ability.effect);

        yield return(new WaitForSeconds(ability.duration));

        RemoveActiveEffect(ability.effect);
    }
Example #4
0
 public void AddTriggeredAbility(TriggeredAbility ta)
 {
     if (ta.is_local)
     {
         local_triggered_abilities.Add(ta);
     }
     else
     {
         global_triggered_abilities.Add(ta);
     }
     ta.SetSource(card);
 }
Example #5
0
            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);
            }
Example #6
0
    //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;
        }
    }
Example #7
0
 public HeroPowerTriggeredAbility(HeroPower power, TriggeredAbility to_wrap)
 {
     this.to_wrap = to_wrap;
     this.to_wrap.SetSource(power);
 }
Example #8
0
 protected CardChangesZoneAbility(TriggeredAbility ability) : base(ability)
 {
 }
Example #9
0
 public abstract void DoAction(TriggeredAbility ability);
Example #10
0
 public SecretTriggeredAbility(Secret secret, TriggeredAbility to_wrap)
 {
     this.secret  = secret;
     this.to_wrap = to_wrap;
     this.to_wrap.SetSource(secret);
 }
Example #11
0
        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();
        }
    }
Example #13
0
 public abstract void Unregister(TriggeredAbility ability);
Example #14
0
 void MakeSecret()
 {
     secret_trigger = (TriggeredAbility)EditorGUILayout.ObjectField("Secret Trigger", secret_trigger, typeof(TriggeredAbility), true);
 }
 public WheneverThisCreatureAttacksAbility(TriggeredAbility ability) : base(ability)
 {
 }
Example #16
0
        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;
 }
Example #18
0
        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
        }
Example #20
0
        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
        }
Example #21
0
 public AddTriggeredAbility(TriggeredAbility triggeredAbility)
 {
     _triggeredAbility = triggeredAbility;
 }
 public AddTriggeredAbility(TriggeredAbility triggeredAbility)
 {
     _triggeredAbility = triggeredAbility;
 }
Example #23
0
        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%
        }
Example #24
0
 public bool FilterTargets(TriggeredAbility ability, GenericShip ship)
 {
     return(ability.FilterTargetsByParameters(ship, MinRange, MaxRange, InArcType, TargetTypes, HasToken));
 }
Example #25
0
        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);


            /**/
        }
Example #26
0
        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();
        }
Example #27
0
        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());
        }