private void testTimedAbilityTimer(TriggeredAbility abil)
        {
            if (abil.timerStarted)
            {
                if (abil.nextAbilityTime <= DateTime.Now)
                {
                    abil.timerStarted = false;

                    if (abil.announceWarning)
                    {
                        string message = parseMessage(abil, abil.warningMessage);

                        tts(message);
                    }

                    if (abil.warningCallback != null)
                    {
                        _inController = false;
                        abil.warningCallback(abil);
                        _inController = true;
                    }


                    if (abil.timerAutoRestart)
                    {
                        abil.start(false);
                    }
                }
            }
        }
        private void testTimedAbilityRegex(TriggeredAbility abil, string line)
        {
            if (abil != null && abil.matchRegex && abil.match != null)
            {
                Match m = abil.match.Match(line);

                if (m.Success)
                {
                    bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor;
                    abil.warningDelayStarted = true;

                    if (abil.collectMultipleLinesFor == TimeSpan.Zero || !delayed)
                    {
                        abil.lastMatch.Clear();
                    }

                    int lineNumber = abil.lastMatch.Count + 1;

                    abil.lastMatch[lineNumber] = new Dictionary <string, string>();

                    string[] groupNames = abil.match.GetGroupNames();

                    foreach (string groupName in groupNames)
                    {
                        abil.lastMatch[lineNumber][groupName] = m.Groups[groupName].Value;
                    }



                    if (abil.matchCallback != null)
                    {
                        _inController = false;
                        abil.matchCallback(abil, m);
                        _inController = true;
                    }

                    abil.start();
                }
            }
        }
        private void testTimedAbilityRegex(TriggeredAbility abil, string line)
        {
            if (abil != null && abil.matchRegex && abil.match != null)
            {
                Match m = abil.match.Match(line);

                if (m.Success)
                {
                    bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor;
                    abil.warningDelayStarted = true;

                    if (abil.collectMultipleLinesFor == TimeSpan.Zero || !delayed)
                    {
                        abil.lastMatch.Clear();
                    }

                    int lineNumber = abil.lastMatch.Count + 1;

                    abil.lastMatch[lineNumber] = new Dictionary<string, string>();

                    string[] groupNames = abil.match.GetGroupNames();

                    foreach (string groupName in groupNames)
                    {
                        abil.lastMatch[lineNumber][groupName] = m.Groups[groupName].Value;
                    }



                    if (abil.matchCallback != null)
                    {
                        _inController = false;
                        abil.matchCallback(abil, m);
                        _inController = true;
                    }

                    abil.start();
                }
            }
        }
        private void testTimedAbilityTimer(TriggeredAbility abil)
        {
            if (abil.timerStarted)
            {
                if (abil.nextAbilityTime <= DateTime.Now)
                {
                    abil.timerStarted = false;

                    if (abil.announceWarning)
                    {
                        string message = parseMessage(abil, abil.warningMessage);

                        tts(message);
                    }

                    if (abil.warningCallback != null)
                    {
                        _inController = false;
                        abil.warningCallback(abil);
                        _inController = true;
                    }


                    if (abil.timerAutoRestart)
                    {
                        abil.start(false);
                    }
                }
            }
        }
Exemple #5
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());

        }
Exemple #6
0
        public void onStartEncounter()
        {
            // bossName is needed if you want health based phase swaps
            bossName = "Kaliya";

            NerveCloudRotation = true;

            int phaseNum = 1; // for convenience


            TriggeredAbility EnrageTrigger = new TriggeredAbility();
            EnrageTrigger.warningMessage = "Enrage soon";
            EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11);
            EnrageTrigger.warningTime = TimeSpan.FromSeconds(30);

            timedAbilities.Add(EnrageTrigger);

            EnrageTrigger.start();


            TriggeredAbility ForkedLightning = new TriggeredAbility(); // Forked Lightning
            timedAbilities.Add(ForkedLightning);
            ForkedLightning.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Forked Lightning\.");
            ForkedLightning.matchMessage = "${member.1} ${member.2} ${member.3} forked lightning";

            TriggeredAbility SecondaryHeadTrigger = new TriggeredAbility(); // Forked Lightning
            //timedAbilities.Add(SecondaryHeadTrigger);
            SecondaryHeadTrigger.match = new Regex(@"\ uses\ Secondary\ Head\.");
            SecondaryHeadTrigger.matchMessage = "Second Head";


            TriggeredAbility ResonanceTrigger = new TriggeredAbility();
            ResonanceTrigger.match = new Regex(@"\ uses\ Resonance\.");
            ResonanceTrigger.warningCallback = delegate(Ability self)
            {
                setPhase(6);
            };

            TriggeredAbility NerveGasTrigger = new TriggeredAbility();
            NerveGasTrigger.match = new Regex(@"\ readies\ Nerve\ Gas\.");
            NerveGasTrigger.warningCallback = delegate(Ability self)
            {
                setPhase(7);
            };

            


            RotationAbility NextPhase = new RotationAbility(); // Nerve Gas
            NextPhase.announceWarning = false;
            NextPhase.warningTime = TimeSpan.FromSeconds(0);
            NextPhase.warningCallback = delegate(Ability self)
            {
                nextPhase();
            };

            RotationAbility GoToPhase5 = new RotationAbility(); // Nerve Gas
            GoToPhase5.announceWarning = false;
            GoToPhase5.warningTime = TimeSpan.FromSeconds(0);
            GoToPhase5.warningCallback = delegate(Ability self)
            {
                setPhase(5);
            };

            RotationAbility GoToPhase6 = new RotationAbility(); // Nerve Gas
            GoToPhase6.announceWarning = false;
            GoToPhase6.warningTime = TimeSpan.FromSeconds(0);
            GoToPhase6.warningCallback = delegate(Ability self)
            {
                setPhase(6);
            };

            RotationAbility GoToPhase7 = new RotationAbility(); // Nerve Gas
            GoToPhase7.announceWarning = false;
            GoToPhase7.warningTime = TimeSpan.FromSeconds(0);
            GoToPhase7.warningCallback = delegate(Ability self)
            {
                setPhase(7);
            };


            RotationAbility NerveCloud = new RotationAbility(); // Nerve Cloud
            NerveCloud.announceWarning = false;
            NerveCloud.match = new Regex(@"\ readies\ Nerve\ Cloud\.");
            NerveCloud.warningMessage = @"Nerve Cloud";
            NerveCloud.warningCallback = delegate(Ability self)
            {
                if (NerveCloudRotation)
                {
                    tts("Nerve Cloud");
                    delayRotation(TimeSpan.FromSeconds(8.5));
                }
                else
                {
                    delayRotation(TimeSpan.FromSeconds(-2));
                }
                NerveCloudRotation = !NerveCloudRotation;
            };


            RotationAbility NerveGasMaybe = new RotationAbility(); // Nerve Gas
            NerveGasMaybe.announceWarning = false;
            NerveGasMaybe.warningMessage = @"Nerve Gas";
            NerveGasMaybe.warningTime = TimeSpan.FromSeconds(3);

            RotationAbility Missiles = new RotationAbility(); // Seed of the Sea
            Missiles.announceWarning = true;
            //Missiles.match = new Regex(@"\ uses\ Seed\ of\ the\ Sea\.");
            Missiles.warningMessage = @"Missiles";
            Missiles.warningTime = TimeSpan.FromSeconds(8);

            RotationAbility NerveGas = new RotationAbility(); // Nerve Gas
            NerveGas.announceWarning = true;
            NerveGas.match = new Regex(@"\ readies\ Nerve\ Gas\.");
            NerveGas.warningMessage = @"Nerve Gas";
            NerveGas.warningTime = TimeSpan.FromSeconds(3);



            RotationAbility Resonance = new RotationAbility(); // Resonance
            Resonance.announceWarning = false;
            Resonance.match = new Regex(@"\ uses\ Resonance\.");
            Resonance.warningMessage = @"Resonance";


            RotationAbility Barofield = new RotationAbility(); // Barofield
            Barofield.announceWarning = false;
            Barofield.match = new Regex(@"\ readies\ Barofield\.");
            Barofield.warningMessage = @"Barofield";

            RotationAbility SeedoftheSea = new RotationAbility(); // Seed of the Sea
            SeedoftheSea.announceWarning = true;
            SeedoftheSea.match = new Regex(@"\ uses\ Seed\ of\ the\ Sea\.");
            SeedoftheSea.warningMessage = @"Seed of the Sea";

            RotationAbility SeedoftheRivers = new RotationAbility(); // Seed of the Rivers
            SeedoftheRivers.announceWarning = true;
            SeedoftheRivers.match = new Regex(@"\ uses\ Seed\ of\ the\ Rivers\.");
            SeedoftheRivers.warningMessage = @"Seed of the Rivers";

            RotationAbility SecondaryHead = new RotationAbility(); // Secondary Head
            SecondaryHead.announceWarning = true;
            SecondaryHead.match = new Regex(@"\ uses\ Secondary\ Head\.");
            SecondaryHead.warningMessage = @"Second Head";
            SecondaryHead.warningTime = TimeSpan.FromSeconds(2);


            RotationAbility IntheHeadlights = new RotationAbility(); // In the Headlights
            IntheHeadlights.announceWarning = false;
            IntheHeadlights.match = new Regex(@"\ suffers\ the\ effect\ of\ In\ the\ Headlights\.");
            IntheHeadlights.warningMessage = @"In the Headlights";

            RotationAbility MainHead = new RotationAbility(); // Main Head
            MainHead.announceWarning = false;
            MainHead.match = new Regex(@"\ uses\ Main\ Head\.");
            MainHead.warningMessage = @"Main Head";


            RotationAbility EmergencyMode = new RotationAbility(); // Emergency Mode
            EmergencyMode.announceWarning = true;
            EmergencyMode.match = new Regex(@"\ readies\ Emergency\ Mode\.");
            EmergencyMode.warningMessage = @"Emergency Mode";

            RotationAbility NanosporeJet = new RotationAbility(); // Nanospore Jet
            NanosporeJet.announceWarning = true;
            NanosporeJet.match = new Regex(@"\ readies\ Nanospore\ Jet\.");
            NanosporeJet.warningMessage = @"Tether";
            NanosporeJet.warningTime = TimeSpan.FromSeconds(2);

            RotationAbility AetherochemicalNanosporesA = new RotationAbility(); // Aetherochemical Nanospores α
            AetherochemicalNanosporesA.announceWarning = false;
            AetherochemicalNanosporesA.match = new Regex(@"\ suffers\ the\ effect\ of\ Aetherochemical\ Nanospores\ α\.");
            AetherochemicalNanosporesA.warningMessage = @"Tether";
            AetherochemicalNanosporesA.warningTime = TimeSpan.FromSeconds(1);

            RotationAbility AetherochemicalNanosporesB = new RotationAbility(); // Aetherochemical Nanospores β
            AetherochemicalNanosporesB.announceWarning = false;
            AetherochemicalNanosporesB.match = new Regex(@"\ suffers\ the\ effect\ of\ Aetherochemical\ Nanospores\ β\.");
            AetherochemicalNanosporesB.warningMessage = @"Aetherochemical Nanospores β";

            RotationAbility NanosporeCloud = new RotationAbility(); // Nanospore Cloud
            NanosporeCloud.announceWarning = true;
            NanosporeCloud.match = new Regex(@"\ uses\ Nanospore\ Cloud\.");
            NanosporeCloud.warningMessage = @"Nanospore Cloud"; 

            


            
            phaseNum = 1;
            phases[phaseNum] = new Phase();
            


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2751301), Resonance);      // 19:29:13:475 @ 99.5841004208438%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4933714), NerveGas);      // 19:29:19:968 @ 98.3110017556973%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.1639818), Resonance);      // 19:29:37:132 @ 94.0020300552885%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.4336539), NerveGas);      // 19:29:48:566 @ 91.4464289349772%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank());      // 19:29:58:717 @ 89.5235962419741%



            phases[phaseNum].phaseEndRegex = new Regex(" readies Barofield");

            phaseNum = 2;
            phases[phaseNum] = new Phase();
            phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(5);
            

            /**/
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.9616842), Missiles);      // 19:30:15:871 @ 85.844484580208%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.09252), Resonance);      // 19:30:24:963 @ 84.3301835484087%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.391194), SecondaryHead);      // 19:30:28:354 @ 83.4234449088172%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9222816), IntheHeadlights);      // 19:30:33:278 @ 82.4329446756614%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5640894), MainHead);      // 19:30:34:842 @ 82.39183944919%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.161238), Resonance);      // 19:30:39:3 @ 81.1284354129282%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3351336), NerveGas);      // 19:30:41:338 @ 80.9259146155256%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.1779825), Resonance);      // 19:30:58:516 @ 77.3020623384026%


            phases[phaseNum].phaseEndHP = 60;


            phaseNum = 3;
            phases[phaseNum] = new Phase();



            phases[phaseNum].phaseEndRegex = new Regex(@" readies Emergency Mode\.");

            phaseNum = 4;
            phases[phaseNum] = new Phase();

            //phases[phaseNum].timedAbilities.Add(SecondaryHeadTrigger);
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3631923), NextPhase); // This phase only exists for the extra delay after Emergency Mode
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank());


            phaseNum = 5;
            phases[phaseNum] = new Phase();

            phases[phaseNum].timedAbilities.Add(ResonanceTrigger);
            phases[phaseNum].timedAbilities.Add(NerveGasTrigger);

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6522089), NerveCloud);      // 19:2:29:120 @ 58.8832369202491%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.7880451), NanosporeJet);      // 19:17:57:888 @ 58.7992814341071%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1962973), AetherochemicalNanosporesA);      // 19:18:3:84 @ 58.331127805262%

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.760387), NerveGasMaybe);      // 19:17:57:888 @ 58.7992814341071%

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank());

            /**/


            phaseNum = 6;
            phases[phaseNum] = new Phase();


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Resonance);      // 19:5:0:749 @ 31.635803815612%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1145213), Missiles);      // 19:5:9:864 @ 29.9071545391707%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.985342), NerveGas);      // 19:5:15:849 @ 28.8234889224323%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.226042), SecondaryHead);      // 19:5:34:75 @ 23.7207210089394%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.961284), IntheHeadlights);      // 19:5:39:36 @ 22.8935752724918%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0520601), MainHead);      // 19:5:40:89 @ 22.7810206311397%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1261788), Resonance);      // 19:5:43:215 @ 22.2782571771761%

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), GoToPhase5);  


            phaseNum = 7;
            phases[phaseNum] = new Phase();


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NerveGas); // Nerve Gas           19:2:52:543 @ 54.8601598256518%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.373936), Resonance);      // 19:3:8:917 @ 51.5358715810679%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.9356255), Missiles);      // 19:3:19:853 @ 49.0501687350157%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.221299), Resonance);      // 19:3:25:74 @ 48.1602987496837%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741187), SecondaryHead);      // 19:3:27:148 @ 47.8853590745119%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.195297), IntheHeadlights);      // 19:3:32:343 @ 47.3280148599272%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0400595), MainHead);      // 19:3:33:383 @ 47.0754697774792%

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), GoToPhase5); 



        }
        public void onStartEncounter()
        {
            // Enrage @ 13 minutes


            // bossName is needed if you want health based phase swaps
            bossName = "Nael Deus Darnus";


            // Triggered abilities

            // Enrage Timer
            TriggeredAbility EnrageTrigger = new TriggeredAbility();
            timedAbilities.Add(EnrageTrigger);
            EnrageTrigger.warningMessage = "Enrage in one minute";
            EnrageTrigger.timerDuration = TimeSpan.FromMinutes(13);
            EnrageTrigger.warningTime = TimeSpan.FromSeconds(65);


            EnrageTrigger.start();


            // Person with thunderstruck needs to get away from everyone else
            TriggeredAbility ThunderstruckTrigger = new TriggeredAbility();
            timedAbilities.Add(ThunderstruckTrigger);
            ThunderstruckTrigger.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Thunderstruck");
            ThunderstruckTrigger.matchMessage = "${member} Thunder";


            // When this drops, need to be about 55% - 75% along the radius of the arena away from the edge (0% is at edge, 100% is at center of arena)
            TriggeredAbility HeavensfallTrigger = new TriggeredAbility();
            timedAbilities.Add(HeavensfallTrigger);
            HeavensfallTrigger.match = new Regex(@" readies Heavensfall");
            HeavensfallTrigger.matchMessage = "Heaven's fall";


            // Needs to be silenced
            TriggeredAbility EarthshockTrigger = new TriggeredAbility();
            timedAbilities.Add(EarthshockTrigger);
            EarthshockTrigger.match = new Regex(@" readies Earthshock");
            EarthshockTrigger.matchMessage = "Earth shock";



            // Blight lasts 12 seconds. Warn 5 seconds before it ends (12-5=7)
            TriggeredAbility RavenBlightTrigger = new TriggeredAbility();
            timedAbilities.Add(RavenBlightTrigger);
            RavenBlightTrigger.match = new Regex(@" suffers the effect of Raven Blight");
            RavenBlightTrigger.warningMessage = "Blight";
            RavenBlightTrigger.timerDuration = TimeSpan.FromSeconds(12);
            RavenBlightTrigger.warningTime = TimeSpan.FromSeconds(5);



            TriggeredAbility GarroteTwist = new TriggeredAbility(); // Garrote Twist
            timedAbilities.Add(GarroteTwist);
            GarroteTwist.announceWarning = true;
            GarroteTwist.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Garrote Twist");
            GarroteTwist.matchMessage = @"${member} Twist"; 
            

            // Rotation abilities

            // 4k conal AOE
            RotationAbility Ravensclaw = new RotationAbility();
            Ravensclaw.announceWarning = false;
            Ravensclaw.match = new Regex(@" uses Ravensclaw");
            Ravensclaw.warningMessage = "Ravensclaw";

            // T9 version of Death sentance. On 47 second timer outside of rotation. Places Raven's Blight debuff on tank, which does big damage when it wears off
            RotationAbility Ravensbeak = new RotationAbility();
            Ravensbeak.announceWarning = true;
            Ravensbeak.match = new Regex(@" readies Ravensbeak");
            Ravensbeak.warningMessage = "Ravensbeak";
            Ravensbeak.warningTime = TimeSpan.FromSeconds(4);

            RotationAbility RavenBlight = new RotationAbility(); // Raven Blight
            RavenBlight.announceWarning = false;
            RavenBlight.match = new Regex(@" suffers the effect of Raven Blight");
            RavenBlight.warningMessage = @"Raven Blight"; 


            // This is the damage from Raven Blight after it wears off (applied by Ravensbeak)
            // Not announcing here, since I have a triggered ability above for it (better timing)
            // This is just here to help with rotation timings
            RotationAbility RavensAscent = new RotationAbility();
            RavensAscent.announceWarning = false;
            RavensAscent.match = new Regex(@" uses Raven's Ascent");
            RavensAscent.warningMessage = "Raven's Ascent";


            // Stardust on  38 second timer, outside of rotation. Starts at ???
            // Meteor lands 12 seconds after stardust
            // Announcing 2 seconds after it happens (right when icon should show up), since this will just act as a prompt to look for the icon above your head
            RotationAbility Stardust = new RotationAbility();
            Stardust.announceWarning = true;
            Stardust.match = new Regex(@" readies Stardust");
            Stardust.warningMessage = "Stardust";
            Stardust.warningTime = TimeSpan.FromSeconds(-2);


            // Jumps on main tank.
            RotationAbility RavenDive = new RotationAbility();
            RavenDive.announceWarning = false;
            RavenDive.match = new Regex(@" uses Raven Dive");
            RavenDive.warningMessage = "Raven Dive";


            // Iron chariot point blank AOE, which starts off the chariot/dive/thermionic beam combo
            RotationAbility IronChariot = new RotationAbility();
            IronChariot.announceWarning = true;
            IronChariot.match = new Regex(@" readies Iron Chariot");
            IronChariot.warningMessage = "Chariot";
            IronChariot.warningTime = TimeSpan.FromSeconds(7);


            // Damage is split by all who it hits. Very small range. Need to stack tight on one person (usually in the center of the arena)
            RotationAbility ThermionicBeam = new RotationAbility(); // Inertia Stream
            ThermionicBeam.announceWarning = true;
            ThermionicBeam.match = new Regex(@" uses Thermionic Beam");
            ThermionicBeam.warningMessage = "Thermeonic";
            ThermionicBeam.warningTime = TimeSpan.FromSeconds(7);


            RotationAbility LunarDynamo = new RotationAbility();
            LunarDynamo.announceWarning = true;
            LunarDynamo.match = new Regex(@" readies Lunar Dynamo");
            LunarDynamo.warningMessage = "Lunar Dynamo";
            LunarDynamo.warningTime = TimeSpan.FromSeconds(5);



            RotationAbility MeteorStream = new RotationAbility();
            MeteorStream.announceWarning = true;
            MeteorStream.match = new Regex(@" uses Meteor Stream");
            MeteorStream.warningMessage = "Meteor Stream";

            RotationAbility DalamudDive = new RotationAbility();
            DalamudDive.announceWarning = false;
            DalamudDive.match = new Regex(@" uses Dalamud Dive");
            DalamudDive.warningMessage = "Dalamud Dive";

            RotationAbility MeteorImpact = new RotationAbility(); // Meteor Impact
            MeteorImpact.announceWarning = false;
            MeteorImpact.match = new Regex(@" uses Meteor Impact");
            MeteorImpact.warningMessage = @"Meteor Impact"; 
            

            /*
            RotationAbility GarroteTwist = new RotationAbility();
            GarroteTwist.announceWarning = true;
            GarroteTwist.match = new Regex("uses Garrote Twist");
            GarroteTwist.warningMessage = "Garrote Twist";

            RotationAbility Heavensfall = new RotationAbility();
            Heavensfall.announceWarning = true;
            Heavensfall.match = new Regex("readies Heavensfall");
            Heavensfall.warningMessage = "Heaven's fall";
            */

            RotationAbility BahamutsFavor = new RotationAbility();
            BahamutsFavor.announceWarning = false;
            BahamutsFavor.match = new Regex(@"Nael Deus Darnus uses Bahamut's Favor");
            BahamutsFavor.warningMessage = "Bahamut's Favor";

            RotationAbility BahamutsClaw = new RotationAbility();
            BahamutsClaw.announceWarning = false;
            BahamutsClaw.match = new Regex(@"Nael Deus Darnus uses Bahamut's Claw");
            BahamutsClaw.warningMessage = "Bahamut's Claw";

            RotationAbility FireTetherOut = new RotationAbility();
            FireTetherOut.announceWarning = true;
            FireTetherOut.match = new Regex(@"uses Fire Tether");
            FireTetherOut.warningMessage = "Fire away";
            FireTetherOut.warningTime = TimeSpan.FromSeconds(9);

            RotationAbility FireTetherIn = new RotationAbility();
            FireTetherIn.announceWarning = true;
            FireTetherIn.match = new Regex(@"uses Fire Tether");
            FireTetherIn.warningMessage = "Fire in";
            FireTetherIn.warningTime = TimeSpan.FromSeconds(9);
            FireTetherIn.warningCallback = delegate(Ability self)
            {
                // PartyList seems to be broken currently in FFXIV-APP, so disabling this until it's fixed
                return;

                string output = "except ";

                foreach (PartyEntity member in partyList)
                {
                    foreach (StatusEntry status in member.StatusEntries)
                    {
                        if (status.StatusName == "Firescorched")
                        {
                            output += member.Name + " ";
                        }
                    }
                }

                if (output != "except ")
                {
                    tts(output);
                }
            };

            /*
            RotationAbility Thunderstruck = new RotationAbility();
            Thunderstruck.announceWarning = true;
            Thunderstruck.match = new Regex("uses Thunderstruck");
            Thunderstruck.warningMessage = "Thunderstruck";
            */

            RotationAbility SuperNova = new RotationAbility();
            SuperNova.announceWarning = false;
            SuperNova.match = new Regex(@" uses SuperNova");
            SuperNova.warningMessage = "Super Nova";
            SuperNova.warningTime = TimeSpan.FromSeconds(7);

            RotationAbility DoubleDragonDivebombs = new RotationAbility();
            DoubleDragonDivebombs.announceWarning = true;
            DoubleDragonDivebombs.warningMessage = "Divebombs soon";
            DoubleDragonDivebombs.warningCallback = delegate(Ability self)
            {
                string output = "";

                foreach (ActorEntity mob in mobList)
                {
                    output += Environment.NewLine + "Mob: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")";
                }
                foreach (ActorEntity mob in pcEntities)
                {
                    output += Environment.NewLine + "Player: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")";
                }

                debug(output, DBMErrorLevel.EncounterInfo);
            };

            RotationAbility SingleDivebomb = new RotationAbility();
            SingleDivebomb.announceWarning = false;
            SingleDivebomb.warningMessage = "Divebomb";


            int phaseNum = 1;
            phases[phaseNum] = new Phase();
            phases[phaseNum].phaseEndHP = 65;


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw);      // 20:20:12:381 @ 99.7669476312431%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1666387), Ravensclaw);      // 20:20:23:548 @ 97.2918055007918%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.343134), Stardust);      // 20:20:25:891 @ 96.9166541742199%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0644612), Ravensbeak);      // 20:20:33:955 @ 94.6969878296274%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.374193), RavenBlight);      // 20:20:37:329 @ 93.9135539478441%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020002), MeteorImpact);      // 20:20:37:331 @ 93.9135539478441%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2323564), RavenDive);      // 20:20:43:564 @ 92.5051617950323%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3050747), IronChariot);      // 20:20:44:869 @ 92.2785341131979%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972972), RavensAscent);      // 20:20:50:66 @ 92.0977610595946%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2690154), ThermionicBeam);      // 20:20:50:335 @ 92.0977610595946%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.9723416), Ravensclaw);      // 20:20:56:308 @ 91.5090833735401%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5324309), Stardust);      // 20:21:3:840 @ 90.4482541858095%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8274477), Ravensclaw);      // 20:21:11:667 @ 88.884031881564%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5771474), LunarDynamo);      // 20:21:14:245 @ 88.2785996198097%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2960741), MeteorImpact);      // 20:21:15:541 @ 88.159679924617%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1692385), MeteorStream);      // 20:21:19:710 @ 87.7250687504488%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1141781), DalamudDive);      // 20:21:22:824 @ 87.7250687504488%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4493117), Ravensbeak);      // 20:21:28:273 @ 87.293229009855%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.392194), RavenBlight);      // 20:21:31:666 @ 86.8082281343339%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4953715), Ravensclaw);      // 20:21:38:161 @ 85.3030877549246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.342134), Stardust);      // 20:21:40:503 @ 84.8061193253323%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1522375), RavensAscent);      // 20:21:44:655 @ 83.9348813889417%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5474316), MeteorImpact);      // 20:21:52:203 @ 82.3632266037467%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551634), MeteorStream);      // 20:21:55:58 @ 82.1137975820502%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3104753), DalamudDive);      // 20:22:3:368 @ 82.1137975820502%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9562835), Ravensclaw);      // 20:22:8:325 @ 81.9026647333818%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4833708), Ravensbeak);      // 20:22:14:808 @ 80.9578578330161%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3881938), RavenBlight);      // 20:22:18:196 @ 80.5018310357729%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8481629), Stardust);      // 20:22:21:44 @ 80.1182394342244%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.291417), Ravensclaw);      // 20:22:28:336 @ 78.8102487613581%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5911482), RavensAscent);      // 20:22:30:927 @ 78.3490570197263%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5580892), MeteorImpact);      // 20:22:32:485 @ 78.2656620639874%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8661639), RavenDive);      // 20:22:35:351 @ 77.9222562492678%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0330591), IronChariot);      // 20:22:36:384 @ 77.7649144067936%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9402826), ThermionicBeam);      // 20:22:41:325 @ 77.4672372460516%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.9306251), Ravensclaw);      // 20:22:52:255 @ 76.5414524579466%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.866164), Stardust);      // 20:22:55:121 @ 76.0711905700713%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7794449), Ravensbeak);      // 20:23:2:901 @ 74.8106921907301%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6432084), RavenBlight);      // 20:23:6:544 @ 74.3047795891476%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2560147), MeteorImpact);      // 20:23:6:800 @ 74.3047795891476%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551633), LunarDynamo);      // 20:23:9:655 @ 73.7472175436784%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4643125), MeteorStream);      // 20:23:15:119 @ 73.1727749482561%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1221786), DalamudDive);      // 20:23:18:242 @ 73.1727749482561%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.424253), Ravensclaw);      // 20:23:22:666 @ 72.9851992849701%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7884455), Stardust);      // 20:23:30:454 @ 72.0324560066414%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2804164), Ravensclaw);      // 20:23:37:735 @ 71.0940737931981%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4282533), MeteorImpact);      // 20:23:42:163 @ 70.5569195767769%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4202528), MeteorStream);      // 20:23:46:583 @ 70.0340004509878%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0484604), DalamudDive);      // 20:23:54:632 @ 70.0340004509878%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9442828), Ravensbeak);      // 20:23:59:576 @ 69.7943974210551%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3731929), RavenBlight);      // 20:24:2:949 @ 69.2946575578883%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), Ravensclaw);      // 20:24:9:188 @ 68.3382610262115%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8701642), Stardust);      // 20:24:12:58 @ 67.9610941115855%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3681926), RavensAscent);      // 20:24:15:426 @ 67.4105866243057%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3294765), MeteorImpact);      // 20:24:23:755 @ 66.2358767115177%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5600892), RavenDive);      // 20:24:25:315 @ 66.0641738041579%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.032059), IronChariot);      // 20:24:26:348 @ 66.0321763437988%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7443286), ThermionicBeam);      // 20:24:32:92 @ 65.8216733663974%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6592665), Ravensclaw);      // 20:24:36:751 @ 65.5844638472789%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank());      // 20:24:36:751 @ 65.5844638472789%
            // I couldn't make my group kill slower than this, so no idea where the rotation goes after 7 meteors.
            // Shouldn't be an issue though - usually you won't have more than 4 or 5 meteors
            
            /** /
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Ravensclaw);      // 00:06
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), Ravensclaw);      // 00:17
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Stardust);      // 00:22
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak);      // 00:28
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands);      // 00:31

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), RavenDive);      // 00:37
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), IronChariot);      // 00:38
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam);      // 00:43
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), RavensAscent);      // 00:43
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive);      // 00:45

            // Ravensbeak here?

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw);      // 00:50
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Stardust);      // 00:57
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensclaw);      // 01:05
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), LunarDynamo);      // 01:08
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), YellowMeteorLands);      // 01:09
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream);      // 01:14
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), DalamudDive);      // 01:16
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak);      // 01:22
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Ravensclaw);      // 01:32
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), Stardust);      // 01:34
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RavensAscent);      // 01:37
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), RedMeteorLands);      // 01:46
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream);      // 01:49
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream);      // 01:54
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), DalamudDive);      // 01:57
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw);      // 02:02
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak);      // 02:08
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Stardust);      // 02:14
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw);      // 02:23
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), RavensAscent);      // 02:24
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands);      // 02:26

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive);      // 02:28
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), IronChariot);      // 02:30
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam);      // 02:35
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive);      // 02:37

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw);      // 02:46
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust);      // 02:49
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak);      // 02:57
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands);      // 03:00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), LunarDynamo);      // 03:02
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream);      // 03:07
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavensAscent);      // 03:09
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak);      // ??
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust);      // ??
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream);      // ??
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream);      // ??
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands);      // ??
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank());      // ??
            /**/


            phaseNum = 2;
            phases[phaseNum] = new Phase();
            phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Megaflare");
            // Golems


            phaseNum = 3;
            phases[phaseNum] = new Phase();
            phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Bahamut's Favor");
            // Heavenfall/ghosts
            // Start @ 6:06

            //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavensfall); 


            phaseNum = 4;
            phases[phaseNum] = new Phase();
            // Dragons/soft enrage

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), BahamutsFavor);     
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.5013718), BahamutsClaw);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.4737135), FireTetherOut); 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7770444), LunarDynamo);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1926402), FireTetherIn);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8685644), IronChariot);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.3431341), FireTetherOut);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3771931), SuperNova);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2523576), ThermionicBeam);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3321334), FireTetherIn);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1582379), BahamutsClaw);     
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8188476), MeteorStream); 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.3945945), DalamudDive);  


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4797138), BahamutsFavor);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), BahamutsClaw);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4867142), LunarDynamo);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0030002), FireTetherOut);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.2156987), FireTetherIn);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8735075), IronChariot);      
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.0841764), FireTetherOut); 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), SuperNova);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4673128), ThermionicBeam);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6742673), FireTetherIn);    
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), BahamutsClaw);   
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs);  
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9186245), IronChariot);    
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0184015), RavenDive);    
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3000743), LunarDynamo);    

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(19.7651305), RotationAbility.Blank());      // 11:08



        }
        public void onStartEncounter()
        {




            calloutDefensivePush = true;
            calloutDefensivePushByName = false;

            calloutTowerStrategy = true;



            // bossName is needed if you want health based phase swaps, or access to "bossEntity" for custom logic
            bossName = "The Avatar";



            TriggeredAbility EnrageTrigger = new TriggeredAbility();
            EnrageTrigger.warningMessage = "Enrage in one minute";
            EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11);
            EnrageTrigger.warningTime = TimeSpan.FromSeconds(60);

            timedAbilities.Add(EnrageTrigger);

            EnrageTrigger.start();


            TriggeredAbility mineTowerWarning = new TriggeredAbility();
            mineTowerWarning.warningTime = TimeSpan.FromSeconds(5);
            mineTowerWarning.warningMessage = "Mines soon";

            TriggeredAbility dreadTowerWarning = new TriggeredAbility();
            dreadTowerWarning.warningTime = TimeSpan.FromSeconds(3);
            dreadTowerWarning.warningMessage = "Dreadnaught";

            TriggeredAbility westTowerWarning = new TriggeredAbility();
            westTowerWarning.warningTime = TimeSpan.FromSeconds(5);
            westTowerWarning.warningMessage = "Defensive reaction";

            TriggeredAbility southTowerWarning = new TriggeredAbility();
            southTowerWarning.warningTime = TimeSpan.FromSeconds(5);
            southTowerWarning.warningMessage = "Defensive reaction";


            towers[Towers.mine] = new Tower(Towers.mine, this, mineTowerWarning);
            towers[Towers.dread] = new Tower(Towers.dread, this, dreadTowerWarning);
            towers[Towers.west] = new Tower(Towers.west, this, westTowerWarning);
            towers[Towers.south] = new Tower(Towers.south, this, southTowerWarning);




            TriggeredAbility LifeDrainMessage = new TriggeredAbility();
            LifeDrainMessage.announceWarning = false;
            LifeDrainMessage.match = new Regex("The support module uses Life Drain");
            LifeDrainMessage.matchCallback = delegate(Ability self, Match match)
            {
                // life drain should happen before Languishing.
                // We take a snapshot of everyone's position here, and use that when determining which tower.
                // Otherwise, if a monk were to use shoulder tackle between life drain and languishing, it may be difficult to tell which tower he pushed
                takeLifedrainSnapshot();
            };

            timedAbilities.Add(LifeDrainMessage);

            TriggeredAbility LanguishingMessage = new TriggeredAbility();
            LanguishingMessage.collectMultipleLinesFor = TimeSpan.Zero; // set to zero so we can process each match ourselves
            LanguishingMessage.announceWarning = false;
            LanguishingMessage.match = new Regex("(?<member>.+?) suffers the effect of Languishing");
            LanguishingMessage.matchCallback = delegate(Ability self, Match match)
            {
                if (match.Groups["member"].Success)
                {
                    string dOut = "Languishing: " + match.Groups["member"].Value.Trim();

                    // snapshot is only valid for 2 seconds
                    if (!lifeDrainSnapshot.Any() || (DateTime.Now - lastSnapshot).Duration() > TimeSpan.FromSeconds(1))
                    {
                        takeLifedrainSnapshot();
                    }
                    if (lifeDrainSnapshot.ContainsKey(match.Groups["member"].Value.Trim()))
                    {
                        if (!foundCoords)
                        {
                            towers[Towers.mine].pos = new Coordinate(bossEntity.Coordinate.X + 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y);
                            towers[Towers.dread].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y - 15);
                            towers[Towers.west].pos = new Coordinate(bossEntity.Coordinate.X - 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y);
                            towers[Towers.south].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y + 15);

                            foundCoords = true;
                        }
                        Coordinate playerCoord = lifeDrainSnapshot[match.Groups["member"].Value.Trim()];

                        SortedDictionary<double, Towers> distances = new SortedDictionary<double, Towers>();

                        distances.Add(playerCoord.DistanceTo(towers[Towers.mine].pos), Towers.mine);
                        distances.Add(playerCoord.DistanceTo(towers[Towers.dread].pos), Towers.dread);
                        distances.Add(playerCoord.DistanceTo(towers[Towers.west].pos), Towers.west);
                        distances.Add(playerCoord.DistanceTo(towers[Towers.south].pos), Towers.south);

                        towers[distances.First().Value].addCharge();

                        dOut += " Tower: " + Enum.GetName(typeof(Towers), distances.First().Value);

                        debug(dOut, DBMErrorLevel.EncounterInfo);
                    }
                }
            };

            timedAbilities.Add(LanguishingMessage);





            SpawnTowers.timerDuration = TimeSpan.FromSeconds(20);
            SpawnTowers.warningTime = TimeSpan.Zero;
            SpawnTowers.warningCallback = this.startTowers;

            timedAbilities.Add(SpawnTowers);



            RotationAbility startTowers = new RotationAbility();
            startTowers.warningTime = TimeSpan.Zero;
            startTowers.warningCallback = this.startTowers;





            TriggeredAbility BrainjackOver = new TriggeredAbility();

            BrainjackOver.match = new Regex("recovers from the effect of Confused");
            BrainjackOver.matchMessage = "Brainjack over";

            timedAbilities.Add(BrainjackOver);



            TriggeredAbility AllaganFieldMessage = new TriggeredAbility();
            AllaganFieldMessage.timerDuration = TimeSpan.FromSeconds(30);
            AllaganFieldMessage.warningTime = TimeSpan.FromSeconds(5);
            AllaganFieldMessage.warningMessage = "Field exploding";

            AllaganFieldMessage.match = new Regex("(?<member>[^ ]+?) [^ ]* suffers the effect of Allagan Field");
            AllaganFieldMessage.matchMessage = "Allagan field on ${member}";
            AllaganFieldMessage.matchCallback = delegate(Ability self, Match match)
            {
                if (match.Groups["member"].Success)
                {
                    lastAllaganField = match.Groups["member"].Value;
                }
                else
                {
                    lastAllaganField = "";
                }
            };

            timedAbilities.Add(AllaganFieldMessage);



            if (calloutDefensivePush)
            {
                TriggeredAbility AllaganFieldRecovery = new TriggeredAbility();

                AllaganFieldRecovery.announceWarning = false;
                AllaganFieldRecovery.match = new Regex("(?<member>[^ ]+?) [^ ]* recovers from the effect of Allagan Field");
                AllaganFieldRecovery.matchCallback = delegate(Ability self, Match match)
                {
                    if (defensiveWarningOnFieldDrop)
                    {
                        if (calloutDefensivePushByName)
                        {
                            tts(lastAllaganField + " west tower now");
                        }
                        else
                        {
                            tts("One to west now");
                        }
                        defensiveWarningOnFieldDrop = false;
                    }
                };

                timedAbilities.Add(AllaganFieldRecovery);
            }



            RotationAbility Brainjack = new RotationAbility(); // Homing Missile
            Brainjack.announceWarning = true;
            Brainjack.match = new Regex("The Avatar readies Brainjack");
            Brainjack.warningMessage = "Brain jack";


            RotationAbility HomingMissile = new RotationAbility(); // Homing Missile
            HomingMissile.announceWarning = true;
            HomingMissile.match = new Regex("The Avatar uses Homing Missile");
            HomingMissile.warningMessage = "Homing Missile";
            HomingMissile.warningTime = TimeSpan.FromSeconds(5);


            RotationAbility GaseousBomb = new RotationAbility(); // Gaseous Bomb
            GaseousBomb.announceWarning = false;
            GaseousBomb.match = new Regex("The Avatar uses Gaseous Bomb");
            GaseousBomb.warningMessage = "Gaseous";


            RotationAbility InertiaStream = new RotationAbility(); // Inertia Stream
            InertiaStream.announceWarning = true;
            InertiaStream.match = new Regex("The Avatar uses Inertia Stream");
            InertiaStream.warningMessage = "Gather for circles";


            RotationAbility BallisticMissile = new RotationAbility(); // Ballistic Missile
            BallisticMissile.announceWarning = false;
            BallisticMissile.match = new Regex("The Avatar readies Ballistic Missile");
            BallisticMissile.warningMessage = "Ballistic Missile";


            RotationAbility NextPhase = new RotationAbility();
            NextPhase.announceWarning = false;
            NextPhase.matchRegex = false;
            NextPhase.warningTime = TimeSpan.Zero;
            NextPhase.warningCallback = delegate(Ability self)
            {
                nextPhase();
            };



            // This is just a placeholder. Rotation can watch for it to make sure the timing is right.
            RotationAbility AllaganField = new RotationAbility();
            AllaganField.announceWarning = false;
            AllaganField.match = new Regex("The Avatar uses Allagan Field");
            AllaganField.warningMessage = "";




            RotationAbility Dreadnaught = new RotationAbility(); // Dreadnaught
            RotationAbility Mines = new RotationAbility(); // Mines
            RotationAbility Defensive = new RotationAbility(); // Defensive
            RotationAbility DreadnaughtTower = new RotationAbility(); // 
            RotationAbility MineTower = new RotationAbility(); // 
            RotationAbility P3TowerSet1 = new RotationAbility();
            RotationAbility P3TowerSet2 = new RotationAbility(); // 


            // This is the old way of doing towers. Hard coded into the rotation.
            // New way understands towers much better, and will work with strategies other than the one this rotation was scripted for
            
            /** /
            Dreadnaught.announceWarning = true;
            Dreadnaught.match = new Regex("A reinforcement dreadnaught appears!");
            Dreadnaught.warningMessage = "Dreadnaught";
            Dreadnaught.warningTime = TimeSpan.FromSeconds(5);


            Mines.announceWarning = true;
            Mines.match = new Regex("Landmines have been scattered");
            Mines.warningMessage = "Mines soon";
            Mines.warningTime = TimeSpan.FromSeconds(5);


            
            Defensive.announceWarning = true;
            Defensive.match = new Regex("The support module uses Defensive Reaction.");
            Defensive.warningMessage = "Defensive reaction";
            Defensive.warningTime = TimeSpan.FromSeconds(5);



            DreadnaughtTower.announceWarning = true;
            DreadnaughtTower.matchRegex = false;
            DreadnaughtTower.warningMessage = "Two to dreadnaught tower";
            DreadnaughtTower.warningTime = TimeSpan.FromSeconds(1);
            

            
            MineTower.announceWarning = true;
            MineTower.matchRegex = false;
            MineTower.warningMessage = "Two to mine tower.";
            MineTower.warningTime = TimeSpan.FromSeconds(1);
            

            
            P3TowerSet1.announceWarning = false;
            P3TowerSet1.matchRegex = false;
            P3TowerSet1.warningMessage = "";
            P3TowerSet1.warningTime = TimeSpan.FromSeconds(1);
            P3TowerSet1.warningCallback = delegate(Ability self)
            {
                tts("Two to west defensive. One to south tower. " + lastAllaganField + " stand near west tower");
                defensiveWarningOnFieldDrop = true;
            };
             


            
            P3TowerSet2.announceWarning = true;
            P3TowerSet2.matchRegex = false;
            P3TowerSet2.warningTime = TimeSpan.FromSeconds(1);
            P3TowerSet2.warningMessage = "Two to mine tower. One to dreadnaught tower.";
            /**/
            


            int phaseNum = 1;
            phases[phaseNum] = new Phase();

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower);      // 19:45:31:821
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), startTowers);      // 19:45:31:821

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6771255), HomingMissile);      // 19:45:41:498
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1835252), GaseousBomb);      // 19:45:50:681
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), Dreadnaught);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.0937785), HomingMissile);      // 19:46:21:775
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb);      // 19:46:30:704
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Defensive);      // 


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), MineTower);      // 19:46:54:704

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8667655), HomingMissile);      // 19:47:1:570
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.074519), GaseousBomb);      // 19:47:10:645
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Mines);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), HomingMissile);      // 19:47:41:906
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), GaseousBomb);      // 19:47:50:768
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), Defensive);      // 

            // maybe add in other logic for the phase switch someday, but I've never heard of anyone not phase swapping at this point
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NextPhase);

            phases[phaseNum].phaseEndRegex = new Regex("The Avatar uses Inertia Stream");


            phaseNum = 2;
            phases[phaseNum] = new Phase();

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4024234), InertiaStream);      // 19:47:58:171
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.255129), BallisticMissile);      // 19:48:0:426

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower);      // 19:48:10:371

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Brainjack);      // 19:48:16:371
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.5), HomingMissile);      // 19:48:35:170
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Dreadnaught);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb);      // 19:48:50:876
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Brainjack);      // 19:48:56:315
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), Defensive);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), HomingMissile);      // 19:49:14:960

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), InertiaStream);      // 19:49:17:29
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5), BallisticMissile);      // 19:49:19:398
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), GaseousBomb);      // 19:49:31:70

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MineTower);      // 19:49:36:253

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1832965), Brainjack);      // 19:49:36:253
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.8150762), HomingMissile);      // 19:49:55:68
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), GaseousBomb);      // 19:50:11:108
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.280302), Brainjack);      // 19:50:16:389
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Defensive);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.654067), HomingMissile);      // 19:50:35:43

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1181211), InertiaStream);      // 19:50:37:161
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.4061376), BallisticMissile);      // 19:50:39:567
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb);      // 19:50:51:71

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), MineTower);      // 19:49:36:253

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.332305), Brainjack);      // 19:50:56:403
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.7060699), HomingMissile);      // 19:51:15:109
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Mines);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.9849143), GaseousBomb);      // 19:51:31:94
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1712958), Brainjack);      // 19:51:36:265
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Dreadnaught);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.2110988), HomingMissile);      // 19:51:55:476

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8141038), InertiaStream);      // 19:51:57:290
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2931311), BallisticMissile);      // 19:51:59:584
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb);      // 19:52:10.503
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.332305), Brainjack);      // 19:52:15.835
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), RotationAbility.Blank());
            // Next phase should be here somewhere. Let Allagan Field trigger it.
            //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), NextPhase);      // 19:52:15.835


            phases[phaseNum].phaseEndRegex = new Regex("The Avatar readies Allagan Field");


            phaseNum = 3;
            phases[phaseNum] = new Phase();

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), AllaganField);      // 20:12:25.00 / 19:52:3:380
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6915543), HomingMissile);      // 20:12:35.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), P3TowerSet1);      // 20:12:43.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), GaseousBomb);      // 20:12:43.00


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(22), AllaganField);      // 20:13:05.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile);      // 20:13:15.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb);      // 20:13:23.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Defensive);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16), AllaganField);      // 20:13:45.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile);      // 20:13:55.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Mines);      //
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), GaseousBomb);      // 20:14:03.00


            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), P3TowerSet2);      // 20:14:03.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), AllaganField);      // 20:14:25.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile);      // 20:14:35.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb);      // 20:14:43.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines);      // 

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), AllaganField);      // 20:15:05.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile);      // 20:15:15.00
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Dreadnaught);      // 
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), GaseousBomb);      // 20:15:23.00

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12), Defensive);      // 

            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), RotationAbility.Blank());      // 20:15:45.00

            
        }