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 testTimedAbilityDelayedMatch(TriggeredAbility abil)
        {
            bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor;

            if (abil.warningDelayStarted && !delayed)
            {
                abil.warningDelayStarted = false;

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

                    tts(message);
                }
            }
        }
        private void testTimedAbilityHealth(TriggeredAbility abil)
        {
            if (abil.healthTriggerAt >= 0 && bossHPPercent < abil.healthTriggerAt && !abil.healthWarningAlreadyTriggered)
            {
                abil.healthWarningAlreadyTriggered = true;

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

                    tts(message);
                }

                if (abil.healthCallback != null)
                {
                    _inController = false;
                    abil.healthCallback(abil);
                    _inController = true;
                }
            }
        }
        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();
                }
            }
        }
Example #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());

        }
        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 testTimedAbilityHealth(TriggeredAbility abil)
        {
            if (abil.healthTriggerAt >= 0 && bossHPPercent < abil.healthTriggerAt && !abil.healthWarningAlreadyTriggered)
            {
                abil.healthWarningAlreadyTriggered = true;

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

                    tts(message);
                }

                if (abil.healthCallback != null)
                {
                    _inController = false;
                    abil.healthCallback(abil);
                    _inController = true;
                }
            }
        }
        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 testTimedAbilityDelayedMatch(TriggeredAbility abil)
        {
            bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor;

            if (abil.warningDelayStarted && !delayed)
            {
                abil.warningDelayStarted = false;

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

                    tts(message);
                }
            }
        }
Example #10
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 #11
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 #12
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 #13
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); 



        }
Example #14
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 #16
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 #17
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 #18
0
        public void onStartEncounter()
        {
            // bossName is needed if you want health based phase swaps
            bossName = "Kaliya";

            int phaseNum = 1; // for convenience


            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";



            // This ability list may contain duplicates. Please double check before using.
            RotationAbility Resonance = new RotationAbility(); // Resonance

            Resonance.announceWarning = true;
            Resonance.match           = new Regex(@"\ uses\ Resonance\.");
            Resonance.warningMessage  = @"Resonance";

            RotationAbility NerveGas = new RotationAbility(); // Nerve Gas

            NerveGas.announceWarning = true;
            NerveGas.match           = new Regex(@"\ readies\ Nerve\ Gas\.");
            NerveGas.warningMessage  = @"Nerve Gas";

            RotationAbility VulnerabilityUp = new RotationAbility(); // Vulnerability Up

            VulnerabilityUp.announceWarning = true;
            VulnerabilityUp.match           = new Regex(@"\ suffers\ the\ effect\ of\ Vulnerability\ Up\.");
            VulnerabilityUp.warningMessage  = @"Vulnerability Up";

            RotationAbility Barofield = new RotationAbility(); // Barofield

            Barofield.announceWarning = true;
            Barofield.match           = new Regex(@"\ readies\ Barofield\.");
            Barofield.warningMessage  = @"Barofield";

            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 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 SecondaryHead = new RotationAbility(); // Secondary Head

            SecondaryHead.announceWarning = true;
            SecondaryHead.match           = new Regex(@"\ uses\ Secondary\ Head\.");
            SecondaryHead.warningMessage  = @"Secondary Head";

            RotationAbility Stun = new RotationAbility(); // Stun

            Stun.announceWarning = true;
            Stun.match           = new Regex(@"\ suffers\ the\ effect\ of\ Stun\.");
            Stun.warningMessage  = @"Stun";

            RotationAbility IntheHeadlights = new RotationAbility(); // In the Headlights

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

            RotationAbility MainHead = new RotationAbility(); // Main Head

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

            RotationAbility Heavy = new RotationAbility(); // Heavy

            Heavy.announceWarning = true;
            Heavy.match           = new Regex(@"\ suffers\ the\ effect\ of\ Heavy\.");
            Heavy.warningMessage  = @"Heavy";

            RotationAbility VacuumWave = new RotationAbility(); // Vacuum Wave

            VacuumWave.announceWarning = true;
            VacuumWave.match           = new Regex(@"\ uses\ Vacuum\ Wave\.");
            VacuumWave.warningMessage  = @"Vacuum Wave";

            RotationAbility Paralysis = new RotationAbility(); // Paralysis

            Paralysis.announceWarning = true;
            Paralysis.match           = new Regex(@"\ suffers\ the\ effect\ of\ Paralysis\.");
            Paralysis.warningMessage  = @"Paralysis";

            RotationAbility RepellingCannons = new RotationAbility(); // Repelling Cannons

            RepellingCannons.announceWarning = true;
            RepellingCannons.match           = new Regex(@"\ uses\ Repelling\ Cannons\.");
            RepellingCannons.warningMessage  = @"Repelling Cannons";

            RotationAbility NodeRetrieval = new RotationAbility(); // Node Retrieval

            NodeRetrieval.announceWarning = true;
            NodeRetrieval.match           = new Regex(@"\ uses\ Node\ Retrieval\.");
            NodeRetrieval.warningMessage  = @"Node Retrieval";

            RotationAbility Object199 = new RotationAbility(); // Object 199

            Object199.announceWarning = true;
            Object199.match           = new Regex(@"\ readies\ Object\ 199\.");
            Object199.warningMessage  = @"Object 199";


            RotationAbility Autocannons = new RotationAbility(); // Auto-cannons

            Autocannons.announceWarning = true;
            Autocannons.match           = new Regex(@"\ readies\ Auto-cannons\.");
            Autocannons.warningMessage  = @"Auto-cannons";

            RotationAbility GravityField = new RotationAbility(); // Gravity Field

            GravityField.announceWarning = true;
            GravityField.match           = new Regex(@"\ uses\ Gravity\ Field\.");
            GravityField.warningMessage  = @"Gravity Field";

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

            // 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(0), Resonance);      // 19:11:43:34 @ 99.3224423872442%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2413569), NerveGas);      // 19:11:49:276 @ 97.7958291767612%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1492374), VulnerabilityUp);      // 19:11:53:425 @ 96.8771661436414%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.9853423), NerveGas);      // 19:11:59:410 @ 95.4825937785689%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0254018), Resonance);      // 19:12:6:436 @ 93.8614579364594%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.6976691), NerveGas);      // 19:12:18:133 @ 91.0755124338463%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1255792), NerveGas);      // 19:12:28:259 @ 89.0567998611729%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.2082978), Barofield);      // 19:12:33:467 @ 88.0243218849461%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.7407288), SeedoftheSea);      // 19:12:46:208 @ 85.4544696601742%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1662383), SeedoftheRivers);      // 19:12:50:374 @ 84.6769604236165%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1402368), Resonance);      // 19:12:54:514 @ 83.7340608182848%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3841935), SecondaryHead);      // 19:12:57:899 @ 83.2458393076484%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:12:57:900 @ 83.2458393076484%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9452829), IntheHeadlights);      // 19:13:2:845 @ 82.3439479824992%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2930739), MainHead);      // 19:13:4:138 @ 82.1480195327383%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9032233), Resonance);      // 19:13:8:41 @ 81.4597978282092%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3361336), NerveGas);      // 19:13:10:377 @ 80.9628511515765%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.4125956), NerveGas);      // 19:13:20:790 @ 78.5700228502403%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0094009), Resonance);      // 19:13:27:799 @ 77.1329880106524%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7623868), SeedoftheRivers);      // 19:13:34:562 @ 75.8408878728918%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1892968), SeedoftheSea);      // 19:13:39:751 @ 74.7013811937772%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1672383), Resonance);      // 19:13:43:918 @ 74.0397227723924%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3711928), SecondaryHead);      // 19:13:47:290 @ 73.2530036383942%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:13:47:291 @ 73.2530036383942%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9422827), IntheHeadlights);      // 19:13:52:233 @ 72.3450046970477%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2960741), MainHead);      // 19:13:53:529 @ 72.0733611956968%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1672384), Resonance);      // 19:13:57:696 @ 71.4112180428677%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3381337), NerveGas);      // 19:14:0:34 @ 71.0410771120476%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1365798), NerveGas);      // 19:14:10:171 @ 69.1514000498304%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2764162), Resonance);      // 19:14:17:447 @ 67.9084516805154%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.767387), SeedoftheRivers);      // 19:14:24:215 @ 66.5764096717496%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1982974), SeedoftheSea);      // 19:14:29:413 @ 65.7012755223224%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1472372), Resonance);      // 19:14:33:560 @ 64.8530924411948%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1231786), SecondaryHead);      // 19:14:36:683 @ 64.3786373035747%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:14:36:684 @ 64.3786373035747%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.948283), IntheHeadlights);      // 19:14:41:633 @ 63.5336534499791%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2890737), MainHead);      // 19:14:42:922 @ 63.4029698526126%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1732387), Resonance);      // 19:14:47:95 @ 62.5724309960552%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3291332), NerveGas);      // 19:14:49:424 @ 62.0477576808121%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.14058), NerveGas);      // 19:14:59:565 @ 60.3002038780454%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2734161), Barofield);      // 19:15:6:838 @ 59.2805228119465%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:15:6:839 @ 59.2805228119465%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:15:6:839 @ 59.2805228119465%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0584609), VacuumWave);      // 19:15:14:898 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9502832), ForkedLightning);      // 19:15:19:848 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.0688619), VacuumWave);      // 19:15:34:917 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9412826), ForkedLightning);      // 19:15:39:858 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1982973), VacuumWave);      // 19:15:45:56 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.6031489), Heavy);      // 19:15:47:659 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.535431), VacuumWave);      // 19:15:55:195 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1241787), ForkedLightning);      // 19:15:58:319 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.8178475), ForkedLightning);      // 19:16:13:137 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8431054), VacuumWave);      // 19:16:14:980 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1085782), VacuumWave);      // 19:16:25:89 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8435058), ForkedLightning);      // 19:16:33:932 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2910739), VacuumWave);      // 19:16:35:223 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.5367742), ForkedLightning);      // 19:16:48:760 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2313565), VacuumWave);      // 19:16:54:991 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3701927), Heavy);      // 19:16:58:361 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0164013), VacuumWave);      // 19:17:5:378 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0821191), ForkedLightning);      // 19:17:7:460 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.6820114), VacuumWave);      // 19:17:25:142 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6352079), ForkedLightning);      // 19:17:28:777 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4893712), VacuumWave);      // 19:17:35:267 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4312534), EmergencyMode);      // 19:17:39:698 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0214016), NerveCloud);      // 19:17:46:719 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5170296), ForkedLightning);      // 19:17:47:236 @ 59.2537656362246%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.6516092), NanosporeJet);      // 19:17:57:888 @ 58.7992814341071%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1962973), AetherochemicalNanospores);      // 19:18:3:84 @ 58.331127805262%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), AetherochemicalNanospores);      // 19:18:3:85 @ 58.331127805262%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7950455), NanosporeCloud);      // 19:18:3:880 @ 58.2351509793029%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0030002), VulnerabilityUp);      // 19:18:3:883 @ 58.2351509793029%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.749386), Resonance);      // 19:18:10:633 @ 57.9067938989762%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.0955202), SeedoftheRivers);      // 19:18:19:728 @ 57.089536683991%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4583122), SeedoftheSea);      // 19:18:25:186 @ 56.8726678358389%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7800446), NerveGas);      // 19:18:25:966 @ 56.8726678358389%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0234018), Barofield);      // 19:18:32:990 @ 56.4523087273958%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:18:32:991 @ 56.4523087273958%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:18:32:991 @ 56.4523087273958%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1161783), NerveGas);      // 19:18:36:107 @ 56.2877908752214%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8004461), SecondaryHead);      // 19:18:43:907 @ 55.8605485802701%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020001), Stun);      // 19:18:43:909 @ 55.8605485802701%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.930282), IntheHeadlights);      // 19:18:48:840 @ 55.6809071070355%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3120751), MainHead);      // 19:18:50:152 @ 55.6126569196868%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1181783), Resonance);      // 19:18:53:270 @ 55.4421283976039%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4152526), NanosporeJet);      // 19:18:57:685 @ 55.2643289038574%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972972), AetherochemicalNanospores);      // 19:19:2:883 @ 54.957978631099%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020001), AetherochemicalNanospores);      // 19:19:2:885 @ 54.957978631099%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5274306), NerveGas);      // 19:19:10:412 @ 54.3914245190737%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1385799), NerveGas);      // 19:19:20:551 @ 53.5921023675253%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5670896), NanosporeCloud);      // 19:19:22:118 @ 53.4352432721699%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2680153), Barofield);      // 19:19:22:386 @ 53.4352432721699%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), VulnerabilityUp);      // 19:19:22:387 @ 53.4352432721699%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:19:22:387 @ 53.4352432721699%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4212529), Resonance);      // 19:19:26:808 @ 52.8692708378777%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2714159), Barofield);      // 19:19:34:79 @ 52.4182767021587%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:19:34:80 @ 52.4182767021587%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:19:34:80 @ 52.4182767021587%
             * phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1452371), SeedoftheSea);      // 19:19:38:226 @ 52.2454214691434%
             *
             * /**/
        }
        public void onStartEncounter()
        {
            // bossName is needed if you want health based phase swaps
            bossName = "Kaliya";
            
            int phaseNum = 1; // for convenience


            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";

            
            
            // This ability list may contain duplicates. Please double check before using.
            RotationAbility Resonance = new RotationAbility(); // Resonance
            Resonance.announceWarning = true; 
            Resonance.match = new Regex(@"\ uses\ Resonance\.");
            Resonance.warningMessage = @"Resonance"; 
            
            RotationAbility NerveGas = new RotationAbility(); // Nerve Gas
            NerveGas.announceWarning = true; 
            NerveGas.match = new Regex(@"\ readies\ Nerve\ Gas\.");
            NerveGas.warningMessage = @"Nerve Gas"; 
            
            RotationAbility VulnerabilityUp = new RotationAbility(); // Vulnerability Up
            VulnerabilityUp.announceWarning = true; 
            VulnerabilityUp.match = new Regex(@"\ suffers\ the\ effect\ of\ Vulnerability\ Up\.");
            VulnerabilityUp.warningMessage = @"Vulnerability Up"; 
            
            RotationAbility Barofield = new RotationAbility(); // Barofield
            Barofield.announceWarning = true; 
            Barofield.match = new Regex(@"\ readies\ Barofield\.");
            Barofield.warningMessage = @"Barofield"; 
            
            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 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 SecondaryHead = new RotationAbility(); // Secondary Head
            SecondaryHead.announceWarning = true; 
            SecondaryHead.match = new Regex(@"\ uses\ Secondary\ Head\.");
            SecondaryHead.warningMessage = @"Secondary Head"; 
            
            RotationAbility Stun = new RotationAbility(); // Stun
            Stun.announceWarning = true; 
            Stun.match = new Regex(@"\ suffers\ the\ effect\ of\ Stun\.");
            Stun.warningMessage = @"Stun"; 
            
            RotationAbility IntheHeadlights = new RotationAbility(); // In the Headlights
            IntheHeadlights.announceWarning = true; 
            IntheHeadlights.match = new Regex(@"\ suffers\ the\ effect\ of\ In\ the\ Headlights\.");
            IntheHeadlights.warningMessage = @"In the Headlights"; 
            
            RotationAbility MainHead = new RotationAbility(); // Main Head
            MainHead.announceWarning = true; 
            MainHead.match = new Regex(@"\ uses\ Main\ Head\.");
            MainHead.warningMessage = @"Main Head"; 
            
            RotationAbility Heavy = new RotationAbility(); // Heavy
            Heavy.announceWarning = true; 
            Heavy.match = new Regex(@"\ suffers\ the\ effect\ of\ Heavy\.");
            Heavy.warningMessage = @"Heavy"; 
            
            RotationAbility VacuumWave = new RotationAbility(); // Vacuum Wave
            VacuumWave.announceWarning = true; 
            VacuumWave.match = new Regex(@"\ uses\ Vacuum\ Wave\.");
            VacuumWave.warningMessage = @"Vacuum Wave"; 
            
            RotationAbility Paralysis = new RotationAbility(); // Paralysis
            Paralysis.announceWarning = true; 
            Paralysis.match = new Regex(@"\ suffers\ the\ effect\ of\ Paralysis\.");
            Paralysis.warningMessage = @"Paralysis"; 
            
            RotationAbility RepellingCannons = new RotationAbility(); // Repelling Cannons
            RepellingCannons.announceWarning = true; 
            RepellingCannons.match = new Regex(@"\ uses\ Repelling\ Cannons\.");
            RepellingCannons.warningMessage = @"Repelling Cannons"; 
            
            RotationAbility NodeRetrieval = new RotationAbility(); // Node Retrieval
            NodeRetrieval.announceWarning = true; 
            NodeRetrieval.match = new Regex(@"\ uses\ Node\ Retrieval\.");
            NodeRetrieval.warningMessage = @"Node Retrieval"; 
            
            RotationAbility Object199 = new RotationAbility(); // Object 199
            Object199.announceWarning = true; 
            Object199.match = new Regex(@"\ readies\ Object\ 199\.");
            Object199.warningMessage = @"Object 199"; 
            
            
            RotationAbility Autocannons = new RotationAbility(); // Auto-cannons
            Autocannons.announceWarning = true; 
            Autocannons.match = new Regex(@"\ readies\ Auto-cannons\.");
            Autocannons.warningMessage = @"Auto-cannons"; 
            
            RotationAbility GravityField = new RotationAbility(); // Gravity Field
            GravityField.announceWarning = true; 
            GravityField.match = new Regex(@"\ uses\ Gravity\ Field\.");
            GravityField.warningMessage = @"Gravity Field"; 
            
            // 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();
            
            // 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(0), Resonance);      // 19:11:43:34 @ 99.3224423872442%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2413569), NerveGas);      // 19:11:49:276 @ 97.7958291767612%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1492374), VulnerabilityUp);      // 19:11:53:425 @ 96.8771661436414%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.9853423), NerveGas);      // 19:11:59:410 @ 95.4825937785689%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0254018), Resonance);      // 19:12:6:436 @ 93.8614579364594%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.6976691), NerveGas);      // 19:12:18:133 @ 91.0755124338463%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1255792), NerveGas);      // 19:12:28:259 @ 89.0567998611729%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.2082978), Barofield);      // 19:12:33:467 @ 88.0243218849461%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.7407288), SeedoftheSea);      // 19:12:46:208 @ 85.4544696601742%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1662383), SeedoftheRivers);      // 19:12:50:374 @ 84.6769604236165%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1402368), Resonance);      // 19:12:54:514 @ 83.7340608182848%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3841935), SecondaryHead);      // 19:12:57:899 @ 83.2458393076484%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:12:57:900 @ 83.2458393076484%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9452829), IntheHeadlights);      // 19:13:2:845 @ 82.3439479824992%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2930739), MainHead);      // 19:13:4:138 @ 82.1480195327383%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9032233), Resonance);      // 19:13:8:41 @ 81.4597978282092%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3361336), NerveGas);      // 19:13:10:377 @ 80.9628511515765%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.4125956), NerveGas);      // 19:13:20:790 @ 78.5700228502403%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0094009), Resonance);      // 19:13:27:799 @ 77.1329880106524%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7623868), SeedoftheRivers);      // 19:13:34:562 @ 75.8408878728918%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1892968), SeedoftheSea);      // 19:13:39:751 @ 74.7013811937772%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1672383), Resonance);      // 19:13:43:918 @ 74.0397227723924%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3711928), SecondaryHead);      // 19:13:47:290 @ 73.2530036383942%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:13:47:291 @ 73.2530036383942%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9422827), IntheHeadlights);      // 19:13:52:233 @ 72.3450046970477%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2960741), MainHead);      // 19:13:53:529 @ 72.0733611956968%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1672384), Resonance);      // 19:13:57:696 @ 71.4112180428677%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3381337), NerveGas);      // 19:14:0:34 @ 71.0410771120476%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1365798), NerveGas);      // 19:14:10:171 @ 69.1514000498304%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2764162), Resonance);      // 19:14:17:447 @ 67.9084516805154%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.767387), SeedoftheRivers);      // 19:14:24:215 @ 66.5764096717496%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1982974), SeedoftheSea);      // 19:14:29:413 @ 65.7012755223224%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1472372), Resonance);      // 19:14:33:560 @ 64.8530924411948%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1231786), SecondaryHead);      // 19:14:36:683 @ 64.3786373035747%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), Stun);      // 19:14:36:684 @ 64.3786373035747%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.948283), IntheHeadlights);      // 19:14:41:633 @ 63.5336534499791%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2890737), MainHead);      // 19:14:42:922 @ 63.4029698526126%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1732387), Resonance);      // 19:14:47:95 @ 62.5724309960552%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3291332), NerveGas);      // 19:14:49:424 @ 62.0477576808121%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.14058), NerveGas);      // 19:14:59:565 @ 60.3002038780454%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2734161), Barofield);      // 19:15:6:838 @ 59.2805228119465%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:15:6:839 @ 59.2805228119465%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:15:6:839 @ 59.2805228119465%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0584609), VacuumWave);      // 19:15:14:898 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9502832), ForkedLightning);      // 19:15:19:848 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.0688619), VacuumWave);      // 19:15:34:917 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9412826), ForkedLightning);      // 19:15:39:858 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1982973), VacuumWave);      // 19:15:45:56 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.6031489), Heavy);      // 19:15:47:659 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.535431), VacuumWave);      // 19:15:55:195 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1241787), ForkedLightning);      // 19:15:58:319 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.8178475), ForkedLightning);      // 19:16:13:137 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8431054), VacuumWave);      // 19:16:14:980 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1085782), VacuumWave);      // 19:16:25:89 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8435058), ForkedLightning);      // 19:16:33:932 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2910739), VacuumWave);      // 19:16:35:223 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.5367742), ForkedLightning);      // 19:16:48:760 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2313565), VacuumWave);      // 19:16:54:991 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3701927), Heavy);      // 19:16:58:361 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0164013), VacuumWave);      // 19:17:5:378 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0821191), ForkedLightning);      // 19:17:7:460 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.6820114), VacuumWave);      // 19:17:25:142 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6352079), ForkedLightning);      // 19:17:28:777 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4893712), VacuumWave);      // 19:17:35:267 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4312534), EmergencyMode);      // 19:17:39:698 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0214016), NerveCloud);      // 19:17:46:719 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5170296), ForkedLightning);      // 19:17:47:236 @ 59.2537656362246%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.6516092), NanosporeJet);      // 19:17:57:888 @ 58.7992814341071%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1962973), AetherochemicalNanospores);      // 19:18:3:84 @ 58.331127805262%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), AetherochemicalNanospores);      // 19:18:3:85 @ 58.331127805262%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7950455), NanosporeCloud);      // 19:18:3:880 @ 58.2351509793029%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0030002), VulnerabilityUp);      // 19:18:3:883 @ 58.2351509793029%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.749386), Resonance);      // 19:18:10:633 @ 57.9067938989762%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.0955202), SeedoftheRivers);      // 19:18:19:728 @ 57.089536683991%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4583122), SeedoftheSea);      // 19:18:25:186 @ 56.8726678358389%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7800446), NerveGas);      // 19:18:25:966 @ 56.8726678358389%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0234018), Barofield);      // 19:18:32:990 @ 56.4523087273958%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:18:32:991 @ 56.4523087273958%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:18:32:991 @ 56.4523087273958%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1161783), NerveGas);      // 19:18:36:107 @ 56.2877908752214%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8004461), SecondaryHead);      // 19:18:43:907 @ 55.8605485802701%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020001), Stun);      // 19:18:43:909 @ 55.8605485802701%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.930282), IntheHeadlights);      // 19:18:48:840 @ 55.6809071070355%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3120751), MainHead);      // 19:18:50:152 @ 55.6126569196868%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1181783), Resonance);      // 19:18:53:270 @ 55.4421283976039%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4152526), NanosporeJet);      // 19:18:57:685 @ 55.2643289038574%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972972), AetherochemicalNanospores);      // 19:19:2:883 @ 54.957978631099%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020001), AetherochemicalNanospores);      // 19:19:2:885 @ 54.957978631099%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5274306), NerveGas);      // 19:19:10:412 @ 54.3914245190737%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1385799), NerveGas);      // 19:19:20:551 @ 53.5921023675253%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5670896), NanosporeCloud);      // 19:19:22:118 @ 53.4352432721699%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2680153), Barofield);      // 19:19:22:386 @ 53.4352432721699%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0010001), VulnerabilityUp);      // 19:19:22:387 @ 53.4352432721699%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:19:22:387 @ 53.4352432721699%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4212529), Resonance);      // 19:19:26:808 @ 52.8692708378777%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2714159), Barofield);      // 19:19:34:79 @ 52.4182767021587%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.001), VulnerabilityUp);      // 19:19:34:80 @ 52.4182767021587%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavy);      // 19:19:34:80 @ 52.4182767021587%
            phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1452371), SeedoftheSea);      // 19:19:38:226 @ 52.2454214691434%
            
            /**/

        }
Example #20
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 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%

        }