private void testTimedAbilityTimer(TriggeredAbility abil) { if (abil.timerStarted) { if (abil.nextAbilityTime <= DateTime.Now) { abil.timerStarted = false; if (abil.announceWarning) { string message = parseMessage(abil, abil.warningMessage); tts(message); } if (abil.warningCallback != null) { _inController = false; abil.warningCallback(abil); _inController = true; } if (abil.timerAutoRestart) { abil.start(false); } } } }
private void testTimedAbilityRegex(TriggeredAbility abil, string line) { if (abil != null && abil.matchRegex && abil.match != null) { Match m = abil.match.Match(line); if (m.Success) { bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor; abil.warningDelayStarted = true; if (abil.collectMultipleLinesFor == TimeSpan.Zero || !delayed) { abil.lastMatch.Clear(); } int lineNumber = abil.lastMatch.Count + 1; abil.lastMatch[lineNumber] = new Dictionary <string, string>(); string[] groupNames = abil.match.GetGroupNames(); foreach (string groupName in groupNames) { abil.lastMatch[lineNumber][groupName] = m.Groups[groupName].Value; } if (abil.matchCallback != null) { _inController = false; abil.matchCallback(abil, m); _inController = true; } abil.start(); } } }
private void testTimedAbilityRegex(TriggeredAbility abil, string line) { if (abil != null && abil.matchRegex && abil.match != null) { Match m = abil.match.Match(line); if (m.Success) { bool delayed = abil.timerStartedAt > DateTime.Now - abil.collectMultipleLinesFor; abil.warningDelayStarted = true; if (abil.collectMultipleLinesFor == TimeSpan.Zero || !delayed) { abil.lastMatch.Clear(); } int lineNumber = abil.lastMatch.Count + 1; abil.lastMatch[lineNumber] = new Dictionary<string, string>(); string[] groupNames = abil.match.GetGroupNames(); foreach (string groupName in groupNames) { abil.lastMatch[lineNumber][groupName] = m.Groups[groupName].Value; } if (abil.matchCallback != null) { _inController = false; abil.matchCallback(abil, m); _inController = true; } abil.start(); } } }
private void testTimedAbilityTimer(TriggeredAbility abil) { if (abil.timerStarted) { if (abil.nextAbilityTime <= DateTime.Now) { abil.timerStarted = false; if (abil.announceWarning) { string message = parseMessage(abil, abil.warningMessage); tts(message); } if (abil.warningCallback != null) { _inController = false; abil.warningCallback(abil); _inController = true; } if (abil.timerAutoRestart) { abil.start(false); } } } }
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()); }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Kaliya"; NerveCloudRotation = true; int phaseNum = 1; // for convenience TriggeredAbility EnrageTrigger = new TriggeredAbility(); EnrageTrigger.warningMessage = "Enrage soon"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11); EnrageTrigger.warningTime = TimeSpan.FromSeconds(30); timedAbilities.Add(EnrageTrigger); EnrageTrigger.start(); TriggeredAbility ForkedLightning = new TriggeredAbility(); // Forked Lightning timedAbilities.Add(ForkedLightning); ForkedLightning.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Forked Lightning\."); ForkedLightning.matchMessage = "${member.1} ${member.2} ${member.3} forked lightning"; TriggeredAbility SecondaryHeadTrigger = new TriggeredAbility(); // Forked Lightning //timedAbilities.Add(SecondaryHeadTrigger); SecondaryHeadTrigger.match = new Regex(@"\ uses\ Secondary\ Head\."); SecondaryHeadTrigger.matchMessage = "Second Head"; TriggeredAbility ResonanceTrigger = new TriggeredAbility(); ResonanceTrigger.match = new Regex(@"\ uses\ Resonance\."); ResonanceTrigger.warningCallback = delegate(Ability self) { setPhase(6); }; TriggeredAbility NerveGasTrigger = new TriggeredAbility(); NerveGasTrigger.match = new Regex(@"\ readies\ Nerve\ Gas\."); NerveGasTrigger.warningCallback = delegate(Ability self) { setPhase(7); }; RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; RotationAbility GoToPhase5 = new RotationAbility(); // Nerve Gas GoToPhase5.announceWarning = false; GoToPhase5.warningTime = TimeSpan.FromSeconds(0); GoToPhase5.warningCallback = delegate(Ability self) { setPhase(5); }; RotationAbility GoToPhase6 = new RotationAbility(); // Nerve Gas GoToPhase6.announceWarning = false; GoToPhase6.warningTime = TimeSpan.FromSeconds(0); GoToPhase6.warningCallback = delegate(Ability self) { setPhase(6); }; RotationAbility GoToPhase7 = new RotationAbility(); // Nerve Gas GoToPhase7.announceWarning = false; GoToPhase7.warningTime = TimeSpan.FromSeconds(0); GoToPhase7.warningCallback = delegate(Ability self) { setPhase(7); }; RotationAbility NerveCloud = new RotationAbility(); // Nerve Cloud NerveCloud.announceWarning = false; NerveCloud.match = new Regex(@"\ readies\ Nerve\ Cloud\."); NerveCloud.warningMessage = @"Nerve Cloud"; NerveCloud.warningCallback = delegate(Ability self) { if (NerveCloudRotation) { tts("Nerve Cloud"); delayRotation(TimeSpan.FromSeconds(8.5)); } else { delayRotation(TimeSpan.FromSeconds(-2)); } NerveCloudRotation = !NerveCloudRotation; }; RotationAbility NerveGasMaybe = new RotationAbility(); // Nerve Gas NerveGasMaybe.announceWarning = false; NerveGasMaybe.warningMessage = @"Nerve Gas"; NerveGasMaybe.warningTime = TimeSpan.FromSeconds(3); RotationAbility Missiles = new RotationAbility(); // Seed of the Sea Missiles.announceWarning = true; //Missiles.match = new Regex(@"\ uses\ Seed\ of\ the\ Sea\."); Missiles.warningMessage = @"Missiles"; Missiles.warningTime = TimeSpan.FromSeconds(8); RotationAbility NerveGas = new RotationAbility(); // Nerve Gas NerveGas.announceWarning = true; NerveGas.match = new Regex(@"\ readies\ Nerve\ Gas\."); NerveGas.warningMessage = @"Nerve Gas"; NerveGas.warningTime = TimeSpan.FromSeconds(3); RotationAbility Resonance = new RotationAbility(); // Resonance Resonance.announceWarning = false; Resonance.match = new Regex(@"\ uses\ Resonance\."); Resonance.warningMessage = @"Resonance"; RotationAbility Barofield = new RotationAbility(); // Barofield Barofield.announceWarning = false; Barofield.match = new Regex(@"\ readies\ Barofield\."); Barofield.warningMessage = @"Barofield"; RotationAbility SeedoftheSea = new RotationAbility(); // Seed of the Sea SeedoftheSea.announceWarning = true; SeedoftheSea.match = new Regex(@"\ uses\ Seed\ of\ the\ Sea\."); SeedoftheSea.warningMessage = @"Seed of the Sea"; RotationAbility SeedoftheRivers = new RotationAbility(); // Seed of the Rivers SeedoftheRivers.announceWarning = true; SeedoftheRivers.match = new Regex(@"\ uses\ Seed\ of\ the\ Rivers\."); SeedoftheRivers.warningMessage = @"Seed of the Rivers"; RotationAbility SecondaryHead = new RotationAbility(); // Secondary Head SecondaryHead.announceWarning = true; SecondaryHead.match = new Regex(@"\ uses\ Secondary\ Head\."); SecondaryHead.warningMessage = @"Second Head"; SecondaryHead.warningTime = TimeSpan.FromSeconds(2); RotationAbility IntheHeadlights = new RotationAbility(); // In the Headlights IntheHeadlights.announceWarning = false; IntheHeadlights.match = new Regex(@"\ suffers\ the\ effect\ of\ In\ the\ Headlights\."); IntheHeadlights.warningMessage = @"In the Headlights"; RotationAbility MainHead = new RotationAbility(); // Main Head MainHead.announceWarning = false; MainHead.match = new Regex(@"\ uses\ Main\ Head\."); MainHead.warningMessage = @"Main Head"; RotationAbility EmergencyMode = new RotationAbility(); // Emergency Mode EmergencyMode.announceWarning = true; EmergencyMode.match = new Regex(@"\ readies\ Emergency\ Mode\."); EmergencyMode.warningMessage = @"Emergency Mode"; RotationAbility NanosporeJet = new RotationAbility(); // Nanospore Jet NanosporeJet.announceWarning = true; NanosporeJet.match = new Regex(@"\ readies\ Nanospore\ Jet\."); NanosporeJet.warningMessage = @"Tether"; NanosporeJet.warningTime = TimeSpan.FromSeconds(2); RotationAbility AetherochemicalNanosporesA = new RotationAbility(); // Aetherochemical Nanospores α AetherochemicalNanosporesA.announceWarning = false; AetherochemicalNanosporesA.match = new Regex(@"\ suffers\ the\ effect\ of\ Aetherochemical\ Nanospores\ α\."); AetherochemicalNanosporesA.warningMessage = @"Tether"; AetherochemicalNanosporesA.warningTime = TimeSpan.FromSeconds(1); RotationAbility AetherochemicalNanosporesB = new RotationAbility(); // Aetherochemical Nanospores β AetherochemicalNanosporesB.announceWarning = false; AetherochemicalNanosporesB.match = new Regex(@"\ suffers\ the\ effect\ of\ Aetherochemical\ Nanospores\ β\."); AetherochemicalNanosporesB.warningMessage = @"Aetherochemical Nanospores β"; RotationAbility NanosporeCloud = new RotationAbility(); // Nanospore Cloud NanosporeCloud.announceWarning = true; NanosporeCloud.match = new Regex(@"\ uses\ Nanospore\ Cloud\."); NanosporeCloud.warningMessage = @"Nanospore Cloud"; phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2751301), Resonance); // 19:29:13:475 @ 99.5841004208438% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4933714), NerveGas); // 19:29:19:968 @ 98.3110017556973% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.1639818), Resonance); // 19:29:37:132 @ 94.0020300552885% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.4336539), NerveGas); // 19:29:48:566 @ 91.4464289349772% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank()); // 19:29:58:717 @ 89.5235962419741% phases[phaseNum].phaseEndRegex = new Regex(" readies Barofield"); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(5); /**/ phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.9616842), Missiles); // 19:30:15:871 @ 85.844484580208% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.09252), Resonance); // 19:30:24:963 @ 84.3301835484087% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.391194), SecondaryHead); // 19:30:28:354 @ 83.4234449088172% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9222816), IntheHeadlights); // 19:30:33:278 @ 82.4329446756614% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5640894), MainHead); // 19:30:34:842 @ 82.39183944919% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.161238), Resonance); // 19:30:39:3 @ 81.1284354129282% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3351336), NerveGas); // 19:30:41:338 @ 80.9259146155256% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.1779825), Resonance); // 19:30:58:516 @ 77.3020623384026% phases[phaseNum].phaseEndHP = 60; phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex(@" readies Emergency Mode\."); phaseNum = 4; phases[phaseNum] = new Phase(); //phases[phaseNum].timedAbilities.Add(SecondaryHeadTrigger); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3631923), NextPhase); // This phase only exists for the extra delay after Emergency Mode phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank()); phaseNum = 5; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(ResonanceTrigger); phases[phaseNum].timedAbilities.Add(NerveGasTrigger); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6522089), NerveCloud); // 19:2:29:120 @ 58.8832369202491% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.7880451), NanosporeJet); // 19:17:57:888 @ 58.7992814341071% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1962973), AetherochemicalNanosporesA); // 19:18:3:84 @ 58.331127805262% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.760387), NerveGasMaybe); // 19:17:57:888 @ 58.7992814341071% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(60), RotationAbility.Blank()); /**/ phaseNum = 6; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Resonance); // 19:5:0:749 @ 31.635803815612% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1145213), Missiles); // 19:5:9:864 @ 29.9071545391707% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.985342), NerveGas); // 19:5:15:849 @ 28.8234889224323% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.226042), SecondaryHead); // 19:5:34:75 @ 23.7207210089394% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.961284), IntheHeadlights); // 19:5:39:36 @ 22.8935752724918% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0520601), MainHead); // 19:5:40:89 @ 22.7810206311397% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1261788), Resonance); // 19:5:43:215 @ 22.2782571771761% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), GoToPhase5); phaseNum = 7; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NerveGas); // Nerve Gas 19:2:52:543 @ 54.8601598256518% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.373936), Resonance); // 19:3:8:917 @ 51.5358715810679% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.9356255), Missiles); // 19:3:19:853 @ 49.0501687350157% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.221299), Resonance); // 19:3:25:74 @ 48.1602987496837% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741187), SecondaryHead); // 19:3:27:148 @ 47.8853590745119% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.195297), IntheHeadlights); // 19:3:32:343 @ 47.3280148599272% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0400595), MainHead); // 19:3:33:383 @ 47.0754697774792% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), GoToPhase5); }
public void onStartEncounter() { // Enrage @ 13 minutes // bossName is needed if you want health based phase swaps bossName = "Nael Deus Darnus"; // Triggered abilities // Enrage Timer TriggeredAbility EnrageTrigger = new TriggeredAbility(); timedAbilities.Add(EnrageTrigger); EnrageTrigger.warningMessage = "Enrage in one minute"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(13); EnrageTrigger.warningTime = TimeSpan.FromSeconds(65); EnrageTrigger.start(); // Person with thunderstruck needs to get away from everyone else TriggeredAbility ThunderstruckTrigger = new TriggeredAbility(); timedAbilities.Add(ThunderstruckTrigger); ThunderstruckTrigger.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Thunderstruck"); ThunderstruckTrigger.matchMessage = "${member} Thunder"; // When this drops, need to be about 55% - 75% along the radius of the arena away from the edge (0% is at edge, 100% is at center of arena) TriggeredAbility HeavensfallTrigger = new TriggeredAbility(); timedAbilities.Add(HeavensfallTrigger); HeavensfallTrigger.match = new Regex(@" readies Heavensfall"); HeavensfallTrigger.matchMessage = "Heaven's fall"; // Needs to be silenced TriggeredAbility EarthshockTrigger = new TriggeredAbility(); timedAbilities.Add(EarthshockTrigger); EarthshockTrigger.match = new Regex(@" readies Earthshock"); EarthshockTrigger.matchMessage = "Earth shock"; // Blight lasts 12 seconds. Warn 5 seconds before it ends (12-5=7) TriggeredAbility RavenBlightTrigger = new TriggeredAbility(); timedAbilities.Add(RavenBlightTrigger); RavenBlightTrigger.match = new Regex(@" suffers the effect of Raven Blight"); RavenBlightTrigger.warningMessage = "Blight"; RavenBlightTrigger.timerDuration = TimeSpan.FromSeconds(12); RavenBlightTrigger.warningTime = TimeSpan.FromSeconds(5); TriggeredAbility GarroteTwist = new TriggeredAbility(); // Garrote Twist timedAbilities.Add(GarroteTwist); GarroteTwist.announceWarning = true; GarroteTwist.match = new Regex(@"(?<member>[^ ]+?) [^ ]* suffers the effect of Garrote Twist"); GarroteTwist.matchMessage = @"${member} Twist"; // Rotation abilities // 4k conal AOE RotationAbility Ravensclaw = new RotationAbility(); Ravensclaw.announceWarning = false; Ravensclaw.match = new Regex(@" uses Ravensclaw"); Ravensclaw.warningMessage = "Ravensclaw"; // T9 version of Death sentance. On 47 second timer outside of rotation. Places Raven's Blight debuff on tank, which does big damage when it wears off RotationAbility Ravensbeak = new RotationAbility(); Ravensbeak.announceWarning = true; Ravensbeak.match = new Regex(@" readies Ravensbeak"); Ravensbeak.warningMessage = "Ravensbeak"; Ravensbeak.warningTime = TimeSpan.FromSeconds(4); RotationAbility RavenBlight = new RotationAbility(); // Raven Blight RavenBlight.announceWarning = false; RavenBlight.match = new Regex(@" suffers the effect of Raven Blight"); RavenBlight.warningMessage = @"Raven Blight"; // This is the damage from Raven Blight after it wears off (applied by Ravensbeak) // Not announcing here, since I have a triggered ability above for it (better timing) // This is just here to help with rotation timings RotationAbility RavensAscent = new RotationAbility(); RavensAscent.announceWarning = false; RavensAscent.match = new Regex(@" uses Raven's Ascent"); RavensAscent.warningMessage = "Raven's Ascent"; // Stardust on 38 second timer, outside of rotation. Starts at ??? // Meteor lands 12 seconds after stardust // Announcing 2 seconds after it happens (right when icon should show up), since this will just act as a prompt to look for the icon above your head RotationAbility Stardust = new RotationAbility(); Stardust.announceWarning = true; Stardust.match = new Regex(@" readies Stardust"); Stardust.warningMessage = "Stardust"; Stardust.warningTime = TimeSpan.FromSeconds(-2); // Jumps on main tank. RotationAbility RavenDive = new RotationAbility(); RavenDive.announceWarning = false; RavenDive.match = new Regex(@" uses Raven Dive"); RavenDive.warningMessage = "Raven Dive"; // Iron chariot point blank AOE, which starts off the chariot/dive/thermionic beam combo RotationAbility IronChariot = new RotationAbility(); IronChariot.announceWarning = true; IronChariot.match = new Regex(@" readies Iron Chariot"); IronChariot.warningMessage = "Chariot"; IronChariot.warningTime = TimeSpan.FromSeconds(7); // Damage is split by all who it hits. Very small range. Need to stack tight on one person (usually in the center of the arena) RotationAbility ThermionicBeam = new RotationAbility(); // Inertia Stream ThermionicBeam.announceWarning = true; ThermionicBeam.match = new Regex(@" uses Thermionic Beam"); ThermionicBeam.warningMessage = "Thermeonic"; ThermionicBeam.warningTime = TimeSpan.FromSeconds(7); RotationAbility LunarDynamo = new RotationAbility(); LunarDynamo.announceWarning = true; LunarDynamo.match = new Regex(@" readies Lunar Dynamo"); LunarDynamo.warningMessage = "Lunar Dynamo"; LunarDynamo.warningTime = TimeSpan.FromSeconds(5); RotationAbility MeteorStream = new RotationAbility(); MeteorStream.announceWarning = true; MeteorStream.match = new Regex(@" uses Meteor Stream"); MeteorStream.warningMessage = "Meteor Stream"; RotationAbility DalamudDive = new RotationAbility(); DalamudDive.announceWarning = false; DalamudDive.match = new Regex(@" uses Dalamud Dive"); DalamudDive.warningMessage = "Dalamud Dive"; RotationAbility MeteorImpact = new RotationAbility(); // Meteor Impact MeteorImpact.announceWarning = false; MeteorImpact.match = new Regex(@" uses Meteor Impact"); MeteorImpact.warningMessage = @"Meteor Impact"; /* RotationAbility GarroteTwist = new RotationAbility(); GarroteTwist.announceWarning = true; GarroteTwist.match = new Regex("uses Garrote Twist"); GarroteTwist.warningMessage = "Garrote Twist"; RotationAbility Heavensfall = new RotationAbility(); Heavensfall.announceWarning = true; Heavensfall.match = new Regex("readies Heavensfall"); Heavensfall.warningMessage = "Heaven's fall"; */ RotationAbility BahamutsFavor = new RotationAbility(); BahamutsFavor.announceWarning = false; BahamutsFavor.match = new Regex(@"Nael Deus Darnus uses Bahamut's Favor"); BahamutsFavor.warningMessage = "Bahamut's Favor"; RotationAbility BahamutsClaw = new RotationAbility(); BahamutsClaw.announceWarning = false; BahamutsClaw.match = new Regex(@"Nael Deus Darnus uses Bahamut's Claw"); BahamutsClaw.warningMessage = "Bahamut's Claw"; RotationAbility FireTetherOut = new RotationAbility(); FireTetherOut.announceWarning = true; FireTetherOut.match = new Regex(@"uses Fire Tether"); FireTetherOut.warningMessage = "Fire away"; FireTetherOut.warningTime = TimeSpan.FromSeconds(9); RotationAbility FireTetherIn = new RotationAbility(); FireTetherIn.announceWarning = true; FireTetherIn.match = new Regex(@"uses Fire Tether"); FireTetherIn.warningMessage = "Fire in"; FireTetherIn.warningTime = TimeSpan.FromSeconds(9); FireTetherIn.warningCallback = delegate(Ability self) { // PartyList seems to be broken currently in FFXIV-APP, so disabling this until it's fixed return; string output = "except "; foreach (PartyEntity member in partyList) { foreach (StatusEntry status in member.StatusEntries) { if (status.StatusName == "Firescorched") { output += member.Name + " "; } } } if (output != "except ") { tts(output); } }; /* RotationAbility Thunderstruck = new RotationAbility(); Thunderstruck.announceWarning = true; Thunderstruck.match = new Regex("uses Thunderstruck"); Thunderstruck.warningMessage = "Thunderstruck"; */ RotationAbility SuperNova = new RotationAbility(); SuperNova.announceWarning = false; SuperNova.match = new Regex(@" uses SuperNova"); SuperNova.warningMessage = "Super Nova"; SuperNova.warningTime = TimeSpan.FromSeconds(7); RotationAbility DoubleDragonDivebombs = new RotationAbility(); DoubleDragonDivebombs.announceWarning = true; DoubleDragonDivebombs.warningMessage = "Divebombs soon"; DoubleDragonDivebombs.warningCallback = delegate(Ability self) { string output = ""; foreach (ActorEntity mob in mobList) { output += Environment.NewLine + "Mob: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")"; } foreach (ActorEntity mob in pcEntities) { output += Environment.NewLine + "Player: " + mob.Name + " (" + mob.Coordinate.X + ", " + mob.Coordinate.Y + ", " + mob.Coordinate.Z + ")"; } debug(output, DBMErrorLevel.EncounterInfo); }; RotationAbility SingleDivebomb = new RotationAbility(); SingleDivebomb.announceWarning = false; SingleDivebomb.warningMessage = "Divebomb"; int phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndHP = 65; phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 20:20:12:381 @ 99.7669476312431% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1666387), Ravensclaw); // 20:20:23:548 @ 97.2918055007918% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.343134), Stardust); // 20:20:25:891 @ 96.9166541742199% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0644612), Ravensbeak); // 20:20:33:955 @ 94.6969878296274% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.374193), RavenBlight); // 20:20:37:329 @ 93.9135539478441% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0020002), MeteorImpact); // 20:20:37:331 @ 93.9135539478441% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2323564), RavenDive); // 20:20:43:564 @ 92.5051617950323% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3050747), IronChariot); // 20:20:44:869 @ 92.2785341131979% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1972972), RavensAscent); // 20:20:50:66 @ 92.0977610595946% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2690154), ThermionicBeam); // 20:20:50:335 @ 92.0977610595946% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.9723416), Ravensclaw); // 20:20:56:308 @ 91.5090833735401% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5324309), Stardust); // 20:21:3:840 @ 90.4482541858095% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8274477), Ravensclaw); // 20:21:11:667 @ 88.884031881564% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5771474), LunarDynamo); // 20:21:14:245 @ 88.2785996198097% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2960741), MeteorImpact); // 20:21:15:541 @ 88.159679924617% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1692385), MeteorStream); // 20:21:19:710 @ 87.7250687504488% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1141781), DalamudDive); // 20:21:22:824 @ 87.7250687504488% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4493117), Ravensbeak); // 20:21:28:273 @ 87.293229009855% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.392194), RavenBlight); // 20:21:31:666 @ 86.8082281343339% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4953715), Ravensclaw); // 20:21:38:161 @ 85.3030877549246% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.342134), Stardust); // 20:21:40:503 @ 84.8061193253323% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1522375), RavensAscent); // 20:21:44:655 @ 83.9348813889417% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5474316), MeteorImpact); // 20:21:52:203 @ 82.3632266037467% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551634), MeteorStream); // 20:21:55:58 @ 82.1137975820502% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3104753), DalamudDive); // 20:22:3:368 @ 82.1137975820502% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9562835), Ravensclaw); // 20:22:8:325 @ 81.9026647333818% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4833708), Ravensbeak); // 20:22:14:808 @ 80.9578578330161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3881938), RavenBlight); // 20:22:18:196 @ 80.5018310357729% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8481629), Stardust); // 20:22:21:44 @ 80.1182394342244% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.291417), Ravensclaw); // 20:22:28:336 @ 78.8102487613581% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5911482), RavensAscent); // 20:22:30:927 @ 78.3490570197263% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5580892), MeteorImpact); // 20:22:32:485 @ 78.2656620639874% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8661639), RavenDive); // 20:22:35:351 @ 77.9222562492678% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.0330591), IronChariot); // 20:22:36:384 @ 77.7649144067936% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9402826), ThermionicBeam); // 20:22:41:325 @ 77.4672372460516% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.9306251), Ravensclaw); // 20:22:52:255 @ 76.5414524579466% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.866164), Stardust); // 20:22:55:121 @ 76.0711905700713% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7794449), Ravensbeak); // 20:23:2:901 @ 74.8106921907301% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.6432084), RavenBlight); // 20:23:6:544 @ 74.3047795891476% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.2560147), MeteorImpact); // 20:23:6:800 @ 74.3047795891476% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8551633), LunarDynamo); // 20:23:9:655 @ 73.7472175436784% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4643125), MeteorStream); // 20:23:15:119 @ 73.1727749482561% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1221786), DalamudDive); // 20:23:18:242 @ 73.1727749482561% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.424253), Ravensclaw); // 20:23:22:666 @ 72.9851992849701% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7884455), Stardust); // 20:23:30:454 @ 72.0324560066414% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2804164), Ravensclaw); // 20:23:37:735 @ 71.0940737931981% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4282533), MeteorImpact); // 20:23:42:163 @ 70.5569195767769% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4202528), MeteorStream); // 20:23:46:583 @ 70.0340004509878% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.0484604), DalamudDive); // 20:23:54:632 @ 70.0340004509878% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9442828), Ravensbeak); // 20:23:59:576 @ 69.7943974210551% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3731929), RavenBlight); // 20:24:2:949 @ 69.2946575578883% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), Ravensclaw); // 20:24:9:188 @ 68.3382610262115% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8701642), Stardust); // 20:24:12:58 @ 67.9610941115855% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3681926), RavensAscent); // 20:24:15:426 @ 67.4105866243057% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3294765), MeteorImpact); // 20:24:23:755 @ 66.2358767115177% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.5600892), RavenDive); // 20:24:25:315 @ 66.0641738041579% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.032059), IronChariot); // 20:24:26:348 @ 66.0321763437988% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7443286), ThermionicBeam); // 20:24:32:92 @ 65.8216733663974% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6592665), Ravensclaw); // 20:24:36:751 @ 65.5844638472789% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank()); // 20:24:36:751 @ 65.5844638472789% // I couldn't make my group kill slower than this, so no idea where the rotation goes after 7 meteors. // Shouldn't be an issue though - usually you won't have more than 4 or 5 meteors /** / phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Ravensclaw); // 00:06 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), Ravensclaw); // 00:17 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Stardust); // 00:22 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 00:28 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands); // 00:31 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), RavenDive); // 00:37 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), IronChariot); // 00:38 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam); // 00:43 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), RavensAscent); // 00:43 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 00:45 // Ravensbeak here? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw); // 00:50 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Stardust); // 00:57 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensclaw); // 01:05 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), LunarDynamo); // 01:08 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), YellowMeteorLands); // 01:09 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 01:14 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), DalamudDive); // 01:16 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 01:22 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Ravensclaw); // 01:32 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), Stardust); // 01:34 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RavensAscent); // 01:37 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), RedMeteorLands); // 01:46 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream); // 01:49 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 01:54 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), DalamudDive); // 01:57 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Ravensclaw); // 02:02 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Ravensbeak); // 02:08 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Stardust); // 02:14 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 02:23 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1), RavensAscent); // 02:24 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands); // 02:26 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 02:28 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), IronChariot); // 02:30 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), ThermionicBeam); // 02:35 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavenDive); // 02:37 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), Ravensclaw); // 02:46 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust); // 02:49 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak); // 02:57 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), RedMeteorLands); // 03:00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), LunarDynamo); // 03:02 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // 03:07 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), RavensAscent); // 03:09 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Ravensbeak); // ?? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), Stardust); // ?? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3), MeteorStream); // ?? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), MeteorStream); // ?? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), YellowMeteorLands); // ?? phases[phaseNum].AddRotation(TimeSpan.FromSeconds(200), RotationAbility.Blank()); // ?? /**/ phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Megaflare"); // Golems phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].phaseEndRegex = new Regex("Nael deus Darnus uses Bahamut's Favor"); // Heavenfall/ghosts // Start @ 6:06 //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Heavensfall); phaseNum = 4; phases[phaseNum] = new Phase(); // Dragons/soft enrage phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), BahamutsFavor); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.5013718), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.4737135), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.7770444), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.1926402), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8685644), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.3431341), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3771931), SuperNova); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2523576), ThermionicBeam); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3321334), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.1582379), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8188476), MeteorStream); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.3945945), DalamudDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4797138), BahamutsFavor); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2383568), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.4867142), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.0030002), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12.2156987), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.8735075), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.0841764), FireTetherOut); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), SuperNova); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4673128), ThermionicBeam); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.6742673), FireTetherIn); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0741186), BahamutsClaw); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), DoubleDragonDivebombs); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9186245), IronChariot); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0184015), RavenDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3000743), LunarDynamo); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(19.7651305), RotationAbility.Blank()); // 11:08 }
public void onStartEncounter() { calloutDefensivePush = true; calloutDefensivePushByName = false; calloutTowerStrategy = true; // bossName is needed if you want health based phase swaps, or access to "bossEntity" for custom logic bossName = "The Avatar"; TriggeredAbility EnrageTrigger = new TriggeredAbility(); EnrageTrigger.warningMessage = "Enrage in one minute"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11); EnrageTrigger.warningTime = TimeSpan.FromSeconds(60); timedAbilities.Add(EnrageTrigger); EnrageTrigger.start(); TriggeredAbility mineTowerWarning = new TriggeredAbility(); mineTowerWarning.warningTime = TimeSpan.FromSeconds(5); mineTowerWarning.warningMessage = "Mines soon"; TriggeredAbility dreadTowerWarning = new TriggeredAbility(); dreadTowerWarning.warningTime = TimeSpan.FromSeconds(3); dreadTowerWarning.warningMessage = "Dreadnaught"; TriggeredAbility westTowerWarning = new TriggeredAbility(); westTowerWarning.warningTime = TimeSpan.FromSeconds(5); westTowerWarning.warningMessage = "Defensive reaction"; TriggeredAbility southTowerWarning = new TriggeredAbility(); southTowerWarning.warningTime = TimeSpan.FromSeconds(5); southTowerWarning.warningMessage = "Defensive reaction"; towers[Towers.mine] = new Tower(Towers.mine, this, mineTowerWarning); towers[Towers.dread] = new Tower(Towers.dread, this, dreadTowerWarning); towers[Towers.west] = new Tower(Towers.west, this, westTowerWarning); towers[Towers.south] = new Tower(Towers.south, this, southTowerWarning); TriggeredAbility LifeDrainMessage = new TriggeredAbility(); LifeDrainMessage.announceWarning = false; LifeDrainMessage.match = new Regex("The support module uses Life Drain"); LifeDrainMessage.matchCallback = delegate(Ability self, Match match) { // life drain should happen before Languishing. // We take a snapshot of everyone's position here, and use that when determining which tower. // Otherwise, if a monk were to use shoulder tackle between life drain and languishing, it may be difficult to tell which tower he pushed takeLifedrainSnapshot(); }; timedAbilities.Add(LifeDrainMessage); TriggeredAbility LanguishingMessage = new TriggeredAbility(); LanguishingMessage.collectMultipleLinesFor = TimeSpan.Zero; // set to zero so we can process each match ourselves LanguishingMessage.announceWarning = false; LanguishingMessage.match = new Regex("(?<member>.+?) suffers the effect of Languishing"); LanguishingMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { string dOut = "Languishing: " + match.Groups["member"].Value.Trim(); // snapshot is only valid for 2 seconds if (!lifeDrainSnapshot.Any() || (DateTime.Now - lastSnapshot).Duration() > TimeSpan.FromSeconds(1)) { takeLifedrainSnapshot(); } if (lifeDrainSnapshot.ContainsKey(match.Groups["member"].Value.Trim())) { if (!foundCoords) { towers[Towers.mine].pos = new Coordinate(bossEntity.Coordinate.X + 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.dread].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y - 15); towers[Towers.west].pos = new Coordinate(bossEntity.Coordinate.X - 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.south].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y + 15); foundCoords = true; } Coordinate playerCoord = lifeDrainSnapshot[match.Groups["member"].Value.Trim()]; SortedDictionary<double, Towers> distances = new SortedDictionary<double, Towers>(); distances.Add(playerCoord.DistanceTo(towers[Towers.mine].pos), Towers.mine); distances.Add(playerCoord.DistanceTo(towers[Towers.dread].pos), Towers.dread); distances.Add(playerCoord.DistanceTo(towers[Towers.west].pos), Towers.west); distances.Add(playerCoord.DistanceTo(towers[Towers.south].pos), Towers.south); towers[distances.First().Value].addCharge(); dOut += " Tower: " + Enum.GetName(typeof(Towers), distances.First().Value); debug(dOut, DBMErrorLevel.EncounterInfo); } } }; timedAbilities.Add(LanguishingMessage); SpawnTowers.timerDuration = TimeSpan.FromSeconds(20); SpawnTowers.warningTime = TimeSpan.Zero; SpawnTowers.warningCallback = this.startTowers; timedAbilities.Add(SpawnTowers); RotationAbility startTowers = new RotationAbility(); startTowers.warningTime = TimeSpan.Zero; startTowers.warningCallback = this.startTowers; TriggeredAbility BrainjackOver = new TriggeredAbility(); BrainjackOver.match = new Regex("recovers from the effect of Confused"); BrainjackOver.matchMessage = "Brainjack over"; timedAbilities.Add(BrainjackOver); TriggeredAbility AllaganFieldMessage = new TriggeredAbility(); AllaganFieldMessage.timerDuration = TimeSpan.FromSeconds(30); AllaganFieldMessage.warningTime = TimeSpan.FromSeconds(5); AllaganFieldMessage.warningMessage = "Field exploding"; AllaganFieldMessage.match = new Regex("(?<member>[^ ]+?) [^ ]* suffers the effect of Allagan Field"); AllaganFieldMessage.matchMessage = "Allagan field on ${member}"; AllaganFieldMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { lastAllaganField = match.Groups["member"].Value; } else { lastAllaganField = ""; } }; timedAbilities.Add(AllaganFieldMessage); if (calloutDefensivePush) { TriggeredAbility AllaganFieldRecovery = new TriggeredAbility(); AllaganFieldRecovery.announceWarning = false; AllaganFieldRecovery.match = new Regex("(?<member>[^ ]+?) [^ ]* recovers from the effect of Allagan Field"); AllaganFieldRecovery.matchCallback = delegate(Ability self, Match match) { if (defensiveWarningOnFieldDrop) { if (calloutDefensivePushByName) { tts(lastAllaganField + " west tower now"); } else { tts("One to west now"); } defensiveWarningOnFieldDrop = false; } }; timedAbilities.Add(AllaganFieldRecovery); } RotationAbility Brainjack = new RotationAbility(); // Homing Missile Brainjack.announceWarning = true; Brainjack.match = new Regex("The Avatar readies Brainjack"); Brainjack.warningMessage = "Brain jack"; RotationAbility HomingMissile = new RotationAbility(); // Homing Missile HomingMissile.announceWarning = true; HomingMissile.match = new Regex("The Avatar uses Homing Missile"); HomingMissile.warningMessage = "Homing Missile"; HomingMissile.warningTime = TimeSpan.FromSeconds(5); RotationAbility GaseousBomb = new RotationAbility(); // Gaseous Bomb GaseousBomb.announceWarning = false; GaseousBomb.match = new Regex("The Avatar uses Gaseous Bomb"); GaseousBomb.warningMessage = "Gaseous"; RotationAbility InertiaStream = new RotationAbility(); // Inertia Stream InertiaStream.announceWarning = true; InertiaStream.match = new Regex("The Avatar uses Inertia Stream"); InertiaStream.warningMessage = "Gather for circles"; RotationAbility BallisticMissile = new RotationAbility(); // Ballistic Missile BallisticMissile.announceWarning = false; BallisticMissile.match = new Regex("The Avatar readies Ballistic Missile"); BallisticMissile.warningMessage = "Ballistic Missile"; RotationAbility NextPhase = new RotationAbility(); NextPhase.announceWarning = false; NextPhase.matchRegex = false; NextPhase.warningTime = TimeSpan.Zero; NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; // This is just a placeholder. Rotation can watch for it to make sure the timing is right. RotationAbility AllaganField = new RotationAbility(); AllaganField.announceWarning = false; AllaganField.match = new Regex("The Avatar uses Allagan Field"); AllaganField.warningMessage = ""; RotationAbility Dreadnaught = new RotationAbility(); // Dreadnaught RotationAbility Mines = new RotationAbility(); // Mines RotationAbility Defensive = new RotationAbility(); // Defensive RotationAbility DreadnaughtTower = new RotationAbility(); // RotationAbility MineTower = new RotationAbility(); // RotationAbility P3TowerSet1 = new RotationAbility(); RotationAbility P3TowerSet2 = new RotationAbility(); // // This is the old way of doing towers. Hard coded into the rotation. // New way understands towers much better, and will work with strategies other than the one this rotation was scripted for /** / Dreadnaught.announceWarning = true; Dreadnaught.match = new Regex("A reinforcement dreadnaught appears!"); Dreadnaught.warningMessage = "Dreadnaught"; Dreadnaught.warningTime = TimeSpan.FromSeconds(5); Mines.announceWarning = true; Mines.match = new Regex("Landmines have been scattered"); Mines.warningMessage = "Mines soon"; Mines.warningTime = TimeSpan.FromSeconds(5); Defensive.announceWarning = true; Defensive.match = new Regex("The support module uses Defensive Reaction."); Defensive.warningMessage = "Defensive reaction"; Defensive.warningTime = TimeSpan.FromSeconds(5); DreadnaughtTower.announceWarning = true; DreadnaughtTower.matchRegex = false; DreadnaughtTower.warningMessage = "Two to dreadnaught tower"; DreadnaughtTower.warningTime = TimeSpan.FromSeconds(1); MineTower.announceWarning = true; MineTower.matchRegex = false; MineTower.warningMessage = "Two to mine tower."; MineTower.warningTime = TimeSpan.FromSeconds(1); P3TowerSet1.announceWarning = false; P3TowerSet1.matchRegex = false; P3TowerSet1.warningMessage = ""; P3TowerSet1.warningTime = TimeSpan.FromSeconds(1); P3TowerSet1.warningCallback = delegate(Ability self) { tts("Two to west defensive. One to south tower. " + lastAllaganField + " stand near west tower"); defensiveWarningOnFieldDrop = true; }; P3TowerSet2.announceWarning = true; P3TowerSet2.matchRegex = false; P3TowerSet2.warningTime = TimeSpan.FromSeconds(1); P3TowerSet2.warningMessage = "Two to mine tower. One to dreadnaught tower."; /**/ int phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), startTowers); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6771255), HomingMissile); // 19:45:41:498 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1835252), GaseousBomb); // 19:45:50:681 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.0937785), HomingMissile); // 19:46:21:775 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:46:30:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), MineTower); // 19:46:54:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8667655), HomingMissile); // 19:47:1:570 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.074519), GaseousBomb); // 19:47:10:645 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), HomingMissile); // 19:47:41:906 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), GaseousBomb); // 19:47:50:768 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), Defensive); // // maybe add in other logic for the phase switch someday, but I've never heard of anyone not phase swapping at this point phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NextPhase); phases[phaseNum].phaseEndRegex = new Regex("The Avatar uses Inertia Stream"); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4024234), InertiaStream); // 19:47:58:171 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.255129), BallisticMissile); // 19:48:0:426 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:48:10:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Brainjack); // 19:48:16:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.5), HomingMissile); // 19:48:35:170 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:48:50:876 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Brainjack); // 19:48:56:315 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), HomingMissile); // 19:49:14:960 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), InertiaStream); // 19:49:17:29 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5), BallisticMissile); // 19:49:19:398 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), GaseousBomb); // 19:49:31:70 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1832965), Brainjack); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.8150762), HomingMissile); // 19:49:55:68 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), GaseousBomb); // 19:50:11:108 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.280302), Brainjack); // 19:50:16:389 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.654067), HomingMissile); // 19:50:35:43 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1181211), InertiaStream); // 19:50:37:161 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.4061376), BallisticMissile); // 19:50:39:567 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:50:51:71 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.332305), Brainjack); // 19:50:56:403 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.7060699), HomingMissile); // 19:51:15:109 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.9849143), GaseousBomb); // 19:51:31:94 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1712958), Brainjack); // 19:51:36:265 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.2110988), HomingMissile); // 19:51:55:476 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8141038), InertiaStream); // 19:51:57:290 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2931311), BallisticMissile); // 19:51:59:584 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:52:10.503 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.332305), Brainjack); // 19:52:15.835 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), RotationAbility.Blank()); // Next phase should be here somewhere. Let Allagan Field trigger it. //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), NextPhase); // 19:52:15.835 phases[phaseNum].phaseEndRegex = new Regex("The Avatar readies Allagan Field"); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), AllaganField); // 20:12:25.00 / 19:52:3:380 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6915543), HomingMissile); // 20:12:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), P3TowerSet1); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), GaseousBomb); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(22), AllaganField); // 20:13:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:13:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16), AllaganField); // 20:13:45.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:55.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), GaseousBomb); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), P3TowerSet2); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), AllaganField); // 20:14:25.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:14:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:14:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), AllaganField); // 20:15:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:15:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), GaseousBomb); // 20:15:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), RotationAbility.Blank()); // 20:15:45.00 }