public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Imdugud"; midPointReached = false; chargeCalled = false; int phaseNum = 1; // for convenience // Boss's abilities TriggeredAbility Prey = new TriggeredAbility(); timedAbilities.Add(Prey); Prey.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); Prey.matchMessage = "${member.1} ${member.2} ${member.3} prey"; TriggeredAbility HeatLightningAnnounce = new TriggeredAbility(); // Heat Lightning timedAbilities.Add(HeatLightningAnnounce); HeatLightningAnnounce.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningAnnounce.matchMessage = @"Heat Lightning"; RotationAbility CrackleHiss = new RotationAbility(); // Crackle Hiss CrackleHiss.announceWarning = false; CrackleHiss.match = new Regex(@"Imdugud uses Crackle Hiss\."); CrackleHiss.warningMessage = @"Crackle Hiss"; RotationAbility CriticalRip = new RotationAbility(); // Critical Rip CriticalRip.announceWarning = true; CriticalRip.match = new Regex(@"Imdugud readies Critical Rip\."); CriticalRip.warningMessage = @"Critical Rip"; RotationAbility WildCharge = new RotationAbility(); // Wild Charge WildCharge.warningTime = TimeSpan.FromSeconds(7); WildCharge.match = new Regex(@"Imdugud readies Wild Charge\."); WildCharge.warningCallback = delegate(Ability self) { if (!chargeCalled) { tts("Charge"); } }; RotationAbility ErraticBlaster = new RotationAbility(); // Erratic Blaster ErraticBlaster.announceWarning = false; ErraticBlaster.match = new Regex(@"Imdugud uses Erratic Blaster\."); ErraticBlaster.warningMessage = @"Erratic Blaster"; RotationAbility HeatLightning = new RotationAbility(); // Heat Lightning HeatLightning.announceWarning = false; HeatLightning.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightning.warningMessage = @"Heat Lightning"; RotationAbility HeatLightningUnique = new RotationAbility(); // Heat Lightning HeatLightningUnique.announceWarning = false; HeatLightningUnique.uniqueInPhase = true; HeatLightningUnique.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningUnique.warningMessage = @"Heat Lightning"; RotationAbility Electrification = new RotationAbility(); // Electrification Electrification.announceWarning = false; Electrification.match = new Regex(@"\ uses\ Electrification\."); Electrification.warningMessage = @"Electrification"; RotationAbility CyclonicChaos = new RotationAbility(); // Cyclonic Chaos CyclonicChaos.announceWarning = true; CyclonicChaos.match = new Regex(@" uses Cyclonic Chaos\."); CyclonicChaos.warningMessage = @"Tether"; RotationAbility NextAdds = new RotationAbility(); NextAdds.warningTime = TimeSpan.Zero; NextAdds.announceWarning = true; NextAdds.warningMessage = @"Adds soon"; RotationAbility Tether = new RotationAbility(); Tether.announceWarning = true; Tether.warningMessage = @"Tether"; RotationAbility WildChargeAndTether = new RotationAbility(); WildChargeAndTether.warningTime = TimeSpan.Zero; WildChargeAndTether.warningCallback = delegate(Ability self) { chargeCalled = true; tts("Charge"); }; TriggeredAbility SpikeFlail = new TriggeredAbility(); // Spike Flail timedAbilities.Add(SpikeFlail); SpikeFlail.announceWarning = false; SpikeFlail.match = new Regex(@"Imdugud readies Spike Flail\."); SpikeFlail.matchCallback = delegate(Ability self, Match match) { delayRotation(TimeSpan.FromSeconds(5.3)); }; TriggeredAbility ElectricBurst = new TriggeredAbility(); // Electric Burst timedAbilities.Add(ElectricBurst); ElectricBurst.announceWarning = false; ElectricBurst.match = new Regex(@"Imdugud readies Electric Burst\."); ElectricBurst.matchCallback = delegate(Ability self, Match match) { delayRotation(TimeSpan.FromSeconds(5.7)); }; RotationAbility GoTo6 = new RotationAbility(); GoTo6.warningTime = TimeSpan.Zero; GoTo6.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(6); }; RotationAbility GoTo7 = new RotationAbility(); GoTo7.warningTime = TimeSpan.Zero; GoTo7.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(7); }; RotationAbility GoTo8 = new RotationAbility(); GoTo8.warningTime = TimeSpan.Zero; GoTo8.warningCallback = delegate(Ability self) { chargeCalled = false; midPointReached = false; setPhase(8); }; RotationAbility MidRotation = new RotationAbility(); MidRotation.warningTime = TimeSpan.Zero; MidRotation.warningCallback = delegate(Ability self) { midPointReached = true; }; TriggeredAbility HeatLightningChargeSwapFromTether = new TriggeredAbility(); HeatLightningChargeSwapFromTether.announceWarning = false; HeatLightningChargeSwapFromTether.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningChargeSwapFromTether.matchCallback = delegate(Ability self, Match match) { if (midPointReached) { midPointReached = false; setPhase(8); } }; TriggeredAbility HeatLightningChargeSwap = new TriggeredAbility(); HeatLightningChargeSwap.announceWarning = false; HeatLightningChargeSwap.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningChargeSwap.matchCallback = delegate(Ability self, Match match) { if (!midPointReached) { midPointReached = false; setPhase(8); } }; TriggeredAbility HeatLightningTetherSwap = new TriggeredAbility(); HeatLightningTetherSwap.announceWarning = false; HeatLightningTetherSwap.match = new Regex(@"Imdugud readies Heat Lightning\."); HeatLightningTetherSwap.matchCallback = delegate(Ability self, Match match) { if (midPointReached) { midPointReached = false; setPhase(7); } }; // // Phase 1 // phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.2112981), CrackleHiss); // 20:2:55:189 @ 99.3684518799455% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1175215), CriticalRip); // 20:3:4:307 @ 97.7928231542308% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7904456), CrackleHiss); // 20:3:12:97 @ 95.8220576843757% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.3645356), WildCharge); // 20:3:21:462 @ 93.4524667822456% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0074008), CrackleHiss); // 20:3:28:469 @ 92.5618162653262% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.5968921), ErraticBlaster); // 20:3:44:66 @ 89.6093008594643% phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electrocharge\."); // // Phase 2 // phaseNum = 2; phases[phaseNum] = new Phase(); // Nothing to warn about in this phase. Prey is being handled by a trigger. phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electric Burst\."); // // Phase 3 // phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.637208), HeatLightning); // 20:6:36:943 @ 76.1975661365016% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.1159218), ErraticBlaster); // 20:6:57:482 @ 72.6669326993261% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3781932), CrackleHiss); // 20:7:0:860 @ 72.1929921632144% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3411339), HeatLightning); // 20:7:3:202 @ 71.7703579257054% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.7984461), WildCharge); // 20:7:11:0 @ 70.705668395879% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.274416), CrackleHiss); // 20:7:18:274 @ 70.1388399858265% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.5804908), CriticalRip); // 20:7:27:381 @ 69.1835815373334% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7583866), CrackleHiss); // 20:7:34:139 @ 68.375647057377% phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electrocharge\."); // // Phase 4 // phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), NextAdds); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); phases[phaseNum].phaseEndRegex = new Regex(@"Imdugud readies Electric Burst\."); /**/ // // Phase 5 // phaseNum = 5; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.7), GoTo7); // // Phase 6 // Tether/charge combo rotation phaseNum = 6; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningChargeSwap); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), WildChargeAndTether); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(125.3316205), GoTo7); // // Phase 7 // Heat Lightning/Tether rotation // Seems like this is always the first rotation for the final phase // This also seems to always follow a charge/tether rotation phaseNum = 7; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningChargeSwapFromTether); //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), HeatLightning); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2), CyclonicChaos); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7033262), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.767461), CriticalRip); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.7563865), ErraticBlaster); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3811933), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.498), GoTo6); // // Phase 8 // Heat Lightning/Charge rotation phaseNum = 8; phases[phaseNum] = new Phase(); phases[phaseNum].timedAbilities.Add(HeatLightningTetherSwap); //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), HeatLightning); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.287417), Electrification); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.779045), WildCharge); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0214016), CrackleHiss); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MidRotation); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(121.3940121), GoTo7); /**/ }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "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 = "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"; 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 = "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() { // 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() { phases[1] = new Phase(); learningStarted = DateTime.Now; }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Oppressor"; int phaseNum = 1; // for convenience RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; TriggeredAbility Prey = new TriggeredAbility(); timedAbilities.Add(Prey); Prey.match = new Regex(@"(?<member>[^ ]+?) [^ ]+ suffers the effect of Prey\."); Prey.matchMessage = "${member.1} ${member.2} ${member.3} prey"; RotationAbility ResinBomb = new RotationAbility(); // Resin Bomb ResinBomb.announceWarning = true; ResinBomb.warningTime = TimeSpan.FromSeconds(2); ResinBomb.match = new Regex(@"\ readies\ Resin\ Bomb\."); ResinBomb.warningMessage = @"Raisins"; RotationAbility EmergencyDeployment = new RotationAbility(); // Emergency Deployment EmergencyDeployment.announceWarning = true; EmergencyDeployment.warningTime = TimeSpan.FromSeconds(1); EmergencyDeployment.match = new Regex(@"\ readies\ Emergency\ Deployment\."); EmergencyDeployment.warningMessage = @"Adds"; RotationAbility DistressBeacon = new RotationAbility(); // Distress Beacon DistressBeacon.announceWarning = false; DistressBeacon.warningTime = TimeSpan.FromSeconds(0); DistressBeacon.match = new Regex(@"\ uses\ Distress\ Beacon\."); DistressBeacon.warningMessage = @"Distress Beacon"; RotationAbility HypercompressedPlasma = new RotationAbility(); // Hypercompressed Plasma HypercompressedPlasma.announceWarning = true; HypercompressedPlasma.warningTime = TimeSpan.FromSeconds(4); HypercompressedPlasma.match = new Regex(@"\ readies\ Hypercompressed\ Plasma\."); HypercompressedPlasma.warningMessage = @"Plasma"; RotationAbility EmergencyLiftoff = new RotationAbility(); // Emergency Liftoff EmergencyLiftoff.announceWarning = true; EmergencyLiftoff.warningTime = TimeSpan.FromSeconds(5); EmergencyLiftoff.match = new Regex(@"\ uses\ Emergency\ Liftoff\."); EmergencyLiftoff.warningMessage = @"Lift off"; // Frontal laser cleave RotationAbility RoyalFount = new RotationAbility(); // Royal Fount RoyalFount.announceWarning = false; RoyalFount.match = new Regex(@"\ uses\ Royal\ Fount\."); RotationAbility GunneryPod = new RotationAbility(); // Gunnery Pod GunneryPod.announceWarning = false; GunneryPod.match = new Regex(@"\ uses\ Gunnery\ Pod\."); RotationAbility HydrothermalMissile = new RotationAbility(); // Hydrothermal Missile HydrothermalMissile.announceWarning = false; HydrothermalMissile.match = new Regex(@"\ readies\ Hydrothermal\ Missile\."); HydrothermalMissile.warningMessage = @"Prey missile"; RotationAbility PhotonSpaser = new RotationAbility(); // Photon Spaser PhotonSpaser.announceWarning = false; PhotonSpaser.match = new Regex(@"\ readies\ Photon\ Spaser\."); RotationAbility a3000tonzeMissile = new RotationAbility(); // 3000-tonze Missile a3000tonzeMissile.announceWarning = false; a3000tonzeMissile.match = new Regex(@"\ readies\ 3000-tonze\ Missile\."); a3000tonzeMissile.warningMessage = @"3000-tonze Missile"; RotationAbility QuickLanding = new RotationAbility(); // Quick Landing QuickLanding.announceWarning = false; QuickLanding.match = new Regex(@"\ uses\ Quick\ Landing\."); QuickLanding.warningMessage = @"Quick Landing"; RotationAbility ParticleCollision = new RotationAbility(); // Particle Collision ParticleCollision.announceWarning = false; ParticleCollision.match = new Regex(@"\ uses\ Particle\ Collision\."); ParticleCollision.warningMessage = @"Particle Collision"; // You'll need to split these up into phases // And separate out any timed moves which aren't part of a rotation // For now we'll assume they're all part of phase 1 phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.9022804), RoyalFount); // 18:52:44:542 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.9022232), GunneryPod); // 18:52:48:444 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.307075), HydrothermalMissile); // 18:52:49:751 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.3034749), PhotonSpaser); // 18:52:58:55 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.6251501), HydrothermalMissile); // 18:53:0:680 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4493117), RoyalFount); // 18:53:6:129 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.4531975), ResinBomb); // 18:53:9:583 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.1894112), RoyalFount); // 18:53:16:772 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8361051), PhotonSpaser); // 18:53:18:608 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.700326), GunneryPod); // 18:53:24:308 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.1261788), RoyalFount); // 18:53:27:435 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.3070748), EmergencyDeployment); // 18:53:28:742 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.271416), HydrothermalMissile); // 18:53:36:13 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.733328), GunneryPod); // 18:53:41:746 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.363192), RoyalFount); // 18:53:45:110 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.767101), HydrothermalMissile); // 18:53:46:877 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.443197), PhotonSpaser); // 18:53:50:320 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.7203272), GunneryPod); // 18:53:56:40 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.6203786), RoyalFount); // 18:54:2:661 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2121266), DistressBeacon); // 18:54:4:873 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1922973), NextPhase); // 18:54:4:873 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(120), RotationAbility.Blank()); // 18:54:4:873 @ 99.9460681483161% phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.703669), a3000tonzeMissile); // 18:54:21:769 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.1375798), GunneryPod); // 18:54:31:907 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.696097), EmergencyDeployment); // 18:54:33:603 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.8933942), ResinBomb); // 18:54:40:499 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.259415), RoyalFount); // 18:54:47:759 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.561089), PhotonSpaser); // 18:54:49:320 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.027402), GunneryPod); // 18:54:56:348 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.330132), HydrothermalMissile); // 18:54:58:678 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.636551), RoyalFount); // 18:55:8:314 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.035059), HydrothermalMissile); // 18:55:9:349 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.808103), HypercompressedPlasma); // 18:55:11:158 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.706669), PhotonSpaser); // 18:55:22:864 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.908624), GunneryPod); // 18:55:33:773 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.099521), RoyalFount); // 18:55:42:872 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.016401), EmergencyLiftoff); // 18:55:49:889 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.559832), ResinBomb); // 18:56:4:449 @ 99.9460681483161% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.281416), QuickLanding); // 18:56:11:730 @ 99.9460681483161% }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Melusine"; renaudCount = 0; pausedDamage = false; lastRenaud = DateTime.MinValue; lastVoice = DateTime.MinValue; lastAddedNewMob = DateTime.Now; TriggeredAbility PetrifactionTrigger = new TriggeredAbility(); timedAbilities.Add(PetrifactionTrigger); PetrifactionTrigger.match = new Regex(@" readies Petrifaction\."); PetrifactionTrigger.matchMessage = "petrefaction look away"; TriggeredAbility CursedShriekTrigger = new TriggeredAbility(); timedAbilities.Add(CursedShriekTrigger); CursedShriekTrigger.match = new Regex("(?<member>[^ ]+?) [^ ]+ suffers the effect of Cursed Shriek"); CursedShriekTrigger.matchMessage = "Shriek on ${member}"; CursedShriekTrigger.warningMessage = "3. 2. 1"; CursedShriekTrigger.timerDuration = TimeSpan.FromSeconds(10); CursedShriekTrigger.warningTime = TimeSpan.FromSeconds(3); // Every 24 seconds, although phase transitions will alter TriggeredAbility CursedVoiceTrigger = new TriggeredAbility(); timedAbilities.Add(CursedVoiceTrigger); CursedVoiceTrigger.match = new Regex("(?<member>[^ ]+?) [^ ]+ suffers the effect of Cursed Voice"); CursedVoiceTrigger.matchMessage = "${member.1}, ${member.2}, and ${member.3}"; TriggeredAbility CursedVoiceUsed = new TriggeredAbility(); timedAbilities.Add(CursedVoiceUsed); CursedVoiceUsed.announceWarning = false; CursedVoiceUsed.match = new Regex(@" readies Cursed Voice\."); CursedVoiceUsed.matchCallback = delegate(Ability self, Match m) { lastVoice = DateTime.Now; if (pausedDamage) { TimeSpan timeSinceRenaud = DateTime.Now - lastRenaud; if (renaudCount >= 4 || timeSinceRenaud < TimeSpan.FromSeconds(20)) { pausedDamage = false; tts("Continue damage"); } } }; TriggeredAbility firstDamagePause = new TriggeredAbility(); timedAbilities.Add(firstDamagePause); firstDamagePause.healthTriggerAt = 84; firstDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; TriggeredAbility secondDamagePause = new TriggeredAbility(); timedAbilities.Add(secondDamagePause); secondDamagePause.healthTriggerAt = 64; secondDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; TriggeredAbility thirdDamagePause = new TriggeredAbility(); timedAbilities.Add(thirdDamagePause); thirdDamagePause.healthTriggerAt = 39; thirdDamagePause.healthCallback = delegate(Ability self) { checkStopDamage(); }; phases[1] = new Phase(); }
public void onStartEncounter() { calloutDefensivePush = true; calloutDefensivePushByName = false; calloutTowerStrategy = true; // bossName is needed if you want health based phase swaps, or access to "bossEntity" for custom logic bossName = "The Avatar"; TriggeredAbility EnrageTrigger = new TriggeredAbility(); EnrageTrigger.warningMessage = "Enrage in one minute"; EnrageTrigger.timerDuration = TimeSpan.FromMinutes(11); EnrageTrigger.warningTime = TimeSpan.FromSeconds(60); timedAbilities.Add(EnrageTrigger); EnrageTrigger.start(); TriggeredAbility mineTowerWarning = new TriggeredAbility(); mineTowerWarning.warningTime = TimeSpan.FromSeconds(5); mineTowerWarning.warningMessage = "Mines soon"; TriggeredAbility dreadTowerWarning = new TriggeredAbility(); dreadTowerWarning.warningTime = TimeSpan.FromSeconds(3); dreadTowerWarning.warningMessage = "Dreadnaught"; TriggeredAbility westTowerWarning = new TriggeredAbility(); westTowerWarning.warningTime = TimeSpan.FromSeconds(5); westTowerWarning.warningMessage = "Defensive reaction"; TriggeredAbility southTowerWarning = new TriggeredAbility(); southTowerWarning.warningTime = TimeSpan.FromSeconds(5); southTowerWarning.warningMessage = "Defensive reaction"; towers[Towers.mine] = new Tower(Towers.mine, this, mineTowerWarning); towers[Towers.dread] = new Tower(Towers.dread, this, dreadTowerWarning); towers[Towers.west] = new Tower(Towers.west, this, westTowerWarning); towers[Towers.south] = new Tower(Towers.south, this, southTowerWarning); TriggeredAbility LifeDrainMessage = new TriggeredAbility(); LifeDrainMessage.announceWarning = false; LifeDrainMessage.match = new Regex("The support module uses Life Drain"); LifeDrainMessage.matchCallback = delegate(Ability self, Match match) { // life drain should happen before Languishing. // We take a snapshot of everyone's position here, and use that when determining which tower. // Otherwise, if a monk were to use shoulder tackle between life drain and languishing, it may be difficult to tell which tower he pushed takeLifedrainSnapshot(); }; timedAbilities.Add(LifeDrainMessage); TriggeredAbility LanguishingMessage = new TriggeredAbility(); LanguishingMessage.collectMultipleLinesFor = TimeSpan.Zero; // set to zero so we can process each match ourselves LanguishingMessage.announceWarning = false; LanguishingMessage.match = new Regex("(?<member>.+?) suffers the effect of Languishing"); LanguishingMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { string dOut = "Languishing: " + match.Groups["member"].Value.Trim(); // snapshot is only valid for 2 seconds if (!lifeDrainSnapshot.Any() || (DateTime.Now - lastSnapshot).Duration() > TimeSpan.FromSeconds(1)) { takeLifedrainSnapshot(); } if (lifeDrainSnapshot.ContainsKey(match.Groups["member"].Value.Trim())) { if (!foundCoords) { towers[Towers.mine].pos = new Coordinate(bossEntity.Coordinate.X + 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.dread].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y - 15); towers[Towers.west].pos = new Coordinate(bossEntity.Coordinate.X - 15, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y); towers[Towers.south].pos = new Coordinate(bossEntity.Coordinate.X, bossEntity.Coordinate.Z, bossEntity.Coordinate.Y + 15); foundCoords = true; } Coordinate playerCoord = lifeDrainSnapshot[match.Groups["member"].Value.Trim()]; SortedDictionary<double, Towers> distances = new SortedDictionary<double, Towers>(); distances.Add(playerCoord.DistanceTo(towers[Towers.mine].pos), Towers.mine); distances.Add(playerCoord.DistanceTo(towers[Towers.dread].pos), Towers.dread); distances.Add(playerCoord.DistanceTo(towers[Towers.west].pos), Towers.west); distances.Add(playerCoord.DistanceTo(towers[Towers.south].pos), Towers.south); towers[distances.First().Value].addCharge(); dOut += " Tower: " + Enum.GetName(typeof(Towers), distances.First().Value); debug(dOut, DBMErrorLevel.EncounterInfo); } } }; timedAbilities.Add(LanguishingMessage); SpawnTowers.timerDuration = TimeSpan.FromSeconds(20); SpawnTowers.warningTime = TimeSpan.Zero; SpawnTowers.warningCallback = this.startTowers; timedAbilities.Add(SpawnTowers); RotationAbility startTowers = new RotationAbility(); startTowers.warningTime = TimeSpan.Zero; startTowers.warningCallback = this.startTowers; TriggeredAbility BrainjackOver = new TriggeredAbility(); BrainjackOver.match = new Regex("recovers from the effect of Confused"); BrainjackOver.matchMessage = "Brainjack over"; timedAbilities.Add(BrainjackOver); TriggeredAbility AllaganFieldMessage = new TriggeredAbility(); AllaganFieldMessage.timerDuration = TimeSpan.FromSeconds(30); AllaganFieldMessage.warningTime = TimeSpan.FromSeconds(5); AllaganFieldMessage.warningMessage = "Field exploding"; AllaganFieldMessage.match = new Regex("(?<member>[^ ]+?) [^ ]* suffers the effect of Allagan Field"); AllaganFieldMessage.matchMessage = "Allagan field on ${member}"; AllaganFieldMessage.matchCallback = delegate(Ability self, Match match) { if (match.Groups["member"].Success) { lastAllaganField = match.Groups["member"].Value; } else { lastAllaganField = ""; } }; timedAbilities.Add(AllaganFieldMessage); if (calloutDefensivePush) { TriggeredAbility AllaganFieldRecovery = new TriggeredAbility(); AllaganFieldRecovery.announceWarning = false; AllaganFieldRecovery.match = new Regex("(?<member>[^ ]+?) [^ ]* recovers from the effect of Allagan Field"); AllaganFieldRecovery.matchCallback = delegate(Ability self, Match match) { if (defensiveWarningOnFieldDrop) { if (calloutDefensivePushByName) { tts(lastAllaganField + " west tower now"); } else { tts("One to west now"); } defensiveWarningOnFieldDrop = false; } }; timedAbilities.Add(AllaganFieldRecovery); } RotationAbility Brainjack = new RotationAbility(); // Homing Missile Brainjack.announceWarning = true; Brainjack.match = new Regex("The Avatar readies Brainjack"); Brainjack.warningMessage = "Brain jack"; RotationAbility HomingMissile = new RotationAbility(); // Homing Missile HomingMissile.announceWarning = true; HomingMissile.match = new Regex("The Avatar uses Homing Missile"); HomingMissile.warningMessage = "Homing Missile"; HomingMissile.warningTime = TimeSpan.FromSeconds(5); RotationAbility GaseousBomb = new RotationAbility(); // Gaseous Bomb GaseousBomb.announceWarning = false; GaseousBomb.match = new Regex("The Avatar uses Gaseous Bomb"); GaseousBomb.warningMessage = "Gaseous"; RotationAbility InertiaStream = new RotationAbility(); // Inertia Stream InertiaStream.announceWarning = true; InertiaStream.match = new Regex("The Avatar uses Inertia Stream"); InertiaStream.warningMessage = "Gather for circles"; RotationAbility BallisticMissile = new RotationAbility(); // Ballistic Missile BallisticMissile.announceWarning = false; BallisticMissile.match = new Regex("The Avatar readies Ballistic Missile"); BallisticMissile.warningMessage = "Ballistic Missile"; RotationAbility NextPhase = new RotationAbility(); NextPhase.announceWarning = false; NextPhase.matchRegex = false; NextPhase.warningTime = TimeSpan.Zero; NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; // This is just a placeholder. Rotation can watch for it to make sure the timing is right. RotationAbility AllaganField = new RotationAbility(); AllaganField.announceWarning = false; AllaganField.match = new Regex("The Avatar uses Allagan Field"); AllaganField.warningMessage = ""; RotationAbility Dreadnaught = new RotationAbility(); // Dreadnaught RotationAbility Mines = new RotationAbility(); // Mines RotationAbility Defensive = new RotationAbility(); // Defensive RotationAbility DreadnaughtTower = new RotationAbility(); // RotationAbility MineTower = new RotationAbility(); // RotationAbility P3TowerSet1 = new RotationAbility(); RotationAbility P3TowerSet2 = new RotationAbility(); // // This is the old way of doing towers. Hard coded into the rotation. // New way understands towers much better, and will work with strategies other than the one this rotation was scripted for /** / Dreadnaught.announceWarning = true; Dreadnaught.match = new Regex("A reinforcement dreadnaught appears!"); Dreadnaught.warningMessage = "Dreadnaught"; Dreadnaught.warningTime = TimeSpan.FromSeconds(5); Mines.announceWarning = true; Mines.match = new Regex("Landmines have been scattered"); Mines.warningMessage = "Mines soon"; Mines.warningTime = TimeSpan.FromSeconds(5); Defensive.announceWarning = true; Defensive.match = new Regex("The support module uses Defensive Reaction."); Defensive.warningMessage = "Defensive reaction"; Defensive.warningTime = TimeSpan.FromSeconds(5); DreadnaughtTower.announceWarning = true; DreadnaughtTower.matchRegex = false; DreadnaughtTower.warningMessage = "Two to dreadnaught tower"; DreadnaughtTower.warningTime = TimeSpan.FromSeconds(1); MineTower.announceWarning = true; MineTower.matchRegex = false; MineTower.warningMessage = "Two to mine tower."; MineTower.warningTime = TimeSpan.FromSeconds(1); P3TowerSet1.announceWarning = false; P3TowerSet1.matchRegex = false; P3TowerSet1.warningMessage = ""; P3TowerSet1.warningTime = TimeSpan.FromSeconds(1); P3TowerSet1.warningCallback = delegate(Ability self) { tts("Two to west defensive. One to south tower. " + lastAllaganField + " stand near west tower"); defensiveWarningOnFieldDrop = true; }; P3TowerSet2.announceWarning = true; P3TowerSet2.matchRegex = false; P3TowerSet2.warningTime = TimeSpan.FromSeconds(1); P3TowerSet2.warningMessage = "Two to mine tower. One to dreadnaught tower."; /**/ int phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), startTowers); // 19:45:31:821 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6771255), HomingMissile); // 19:45:41:498 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.1835252), GaseousBomb); // 19:45:50:681 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.0937785), HomingMissile); // 19:46:21:775 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:46:30:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), MineTower); // 19:46:54:704 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.8667655), HomingMissile); // 19:47:1:570 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.074519), GaseousBomb); // 19:47:10:645 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), HomingMissile); // 19:47:41:906 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), GaseousBomb); // 19:47:50:768 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.5), Defensive); // // maybe add in other logic for the phase switch someday, but I've never heard of anyone not phase swapping at this point phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), NextPhase); phases[phaseNum].phaseEndRegex = new Regex("The Avatar uses Inertia Stream"); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4024234), InertiaStream); // 19:47:58:171 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.255129), BallisticMissile); // 19:48:0:426 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), DreadnaughtTower); // 19:48:10:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Brainjack); // 19:48:16:371 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.5), HomingMissile); // 19:48:35:170 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 19:48:50:876 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), Brainjack); // 19:48:56:315 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4), HomingMissile); // 19:49:14:960 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), InertiaStream); // 19:49:17:29 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.5), BallisticMissile); // 19:49:19:398 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11), GaseousBomb); // 19:49:31:70 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1832965), Brainjack); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.8150762), HomingMissile); // 19:49:55:68 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), GaseousBomb); // 19:50:11:108 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.280302), Brainjack); // 19:50:16:389 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.654067), HomingMissile); // 19:50:35:43 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.1181211), InertiaStream); // 19:50:37:161 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.4061376), BallisticMissile); // 19:50:39:567 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:50:51:71 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), MineTower); // 19:49:36:253 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.332305), Brainjack); // 19:50:56:403 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.7060699), HomingMissile); // 19:51:15:109 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.9849143), GaseousBomb); // 19:51:31:94 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.1712958), Brainjack); // 19:51:36:265 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.2110988), HomingMissile); // 19:51:55:476 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.8141038), InertiaStream); // 19:51:57:290 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.2931311), BallisticMissile); // 19:51:59:584 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.503658), GaseousBomb); // 19:52:10.503 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.332305), Brainjack); // 19:52:15.835 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20), RotationAbility.Blank()); // Next phase should be here somewhere. Let Allagan Field trigger it. //phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5), NextPhase); // 19:52:15.835 phases[phaseNum].phaseEndRegex = new Regex("The Avatar readies Allagan Field"); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), AllaganField); // 20:12:25.00 / 19:52:3:380 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.6915543), HomingMissile); // 20:12:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), P3TowerSet1); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), GaseousBomb); // 20:12:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(22), AllaganField); // 20:13:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:13:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16), AllaganField); // 20:13:45.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:13:55.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7), GaseousBomb); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13), P3TowerSet2); // 20:14:03.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9), AllaganField); // 20:14:25.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:14:35.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8), GaseousBomb); // 20:14:43.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Mines); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14), AllaganField); // 20:15:05.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), HomingMissile); // 20:15:15.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6), Dreadnaught); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), GaseousBomb); // 20:15:23.00 phases[phaseNum].AddRotation(TimeSpan.FromSeconds(12), Defensive); // phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10), RotationAbility.Blank()); // 20:15:45.00 }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Bahamut Prime"; int phaseNum = 1; // for convenience lastAddedNewMob = DateTime.Now; akhMornCount = 0; RotationAbility NextPhase = new RotationAbility(); // Nerve Gas NextPhase.announceWarning = false; NextPhase.warningTime = TimeSpan.FromSeconds(0); NextPhase.warningCallback = delegate(Ability self) { nextPhase(); }; TriggeredAbility GigaflareTrigger = new TriggeredAbility(); timedAbilities.Add(GigaflareTrigger); GigaflareTrigger.announceWarning = true; GigaflareTrigger.match = new Regex(@" readies Gigaflare."); GigaflareTrigger.matchMessage = "Giga-flare"; // Boss's abilities RotationAbility FlareBreath = new RotationAbility(); // Flare Breath FlareBreath.announceWarning = false; FlareBreath.match = new Regex(@"\ uses\ Flare\ Breath\."); FlareBreath.warningMessage = @"Flare Breath"; RotationAbility Megaflare = new RotationAbility(); // Megaflare Megaflare.announceWarning = true; Megaflare.match = new Regex(@"\ readies\ Megaflare\."); Megaflare.warningMessage = @"Mega-flare"; Megaflare.warningTime = TimeSpan.FromSeconds(2); RotationAbility Flatten = new RotationAbility(); // Flatten Flatten.announceWarning = true; Flatten.match = new Regex(@"\ readies\ Flatten\."); Flatten.warningMessage = @"Flatten"; Flatten.warningTime = TimeSpan.FromSeconds(2); RotationAbility EarthShaker = new RotationAbility(); // Earth Shaker EarthShaker.announceWarning = true; EarthShaker.match = new Regex(@"\ uses\ Earth\ Shaker\."); EarthShaker.warningMessage = @"Earth Shaker"; EarthShaker.warningTime = TimeSpan.FromSeconds(8); RotationAbility FlareStar = new RotationAbility(); // Flare Star FlareStar.announceWarning = false; FlareStar.match = new Regex(@"\ readies\ Flare\ Star\."); FlareStar.warningMessage = @"Flare Star"; RotationAbility RageofBahamut = new RotationAbility(); // Rage of Bahamut RageofBahamut.announceWarning = false; RageofBahamut.match = new Regex(@"\ readies\ Rage\ of\ Bahamut\."); RageofBahamut.warningMessage = @"Rage of Bahamut"; RotationAbility MegaflareDive = new RotationAbility(); // Megaflare Dive MegaflareDive.announceWarning = true; MegaflareDive.match = new Regex(@"\ readies\ Megaflare\ Dive\."); MegaflareDive.warningMessage = @"Dive bombs"; MegaflareDive.warningTime = TimeSpan.FromSeconds(6); RotationAbility DoubleDive = new RotationAbility(); // Double Dive DoubleDive.announceWarning = true; DoubleDive.match = new Regex(@"\ readies\ Double\ Dive\."); DoubleDive.warningMessage = @"Move"; DoubleDive.warningTime = TimeSpan.FromSeconds(1); RotationAbility EvilEye = new RotationAbility(); // Evil Eye EvilEye.announceWarning = true; EvilEye.match = new Regex(@"\ uses\ Evil\ Eye\."); EvilEye.warningMessage = @"Evil Eye"; EvilEye.warningTime = TimeSpan.FromSeconds(6); RotationAbility DeathSentence = new RotationAbility(); // Death Sentence DeathSentence.announceWarning = true; DeathSentence.match = new Regex(@"\ readies\ Death\ Sentence\."); DeathSentence.warningMessage = @"Death Sentence"; DeathSentence.warningTime = TimeSpan.FromSeconds(6); RotationAbility Teraflare = new RotationAbility(); // Teraflare Teraflare.announceWarning = true; Teraflare.match = new Regex(@"\ readies\ Teraflare\."); Teraflare.warningMessage = @"Tera flare"; Teraflare.warningTime = TimeSpan.FromSeconds(-15); RotationAbility AkhMorn = new RotationAbility(); // Akh Morn AkhMorn.announceWarning = true; AkhMorn.match = new Regex(@"\ readies\ Akh\ Morn\."); //AkhMorn.warningMessage = @"Akh Morn"; AkhMorn.warningTime = TimeSpan.FromSeconds(3); AkhMorn.warningCallback = delegate(Ability abil) { akhMornCount++; tts("Akh Morn " + akhMornCount); }; RotationAbility TempestWing = new RotationAbility(); // Tempest Wing TempestWing.announceWarning = false; TempestWing.match = new Regex(@"\ uses\ Tempest\ Wing\."); TempestWing.warningMessage = @"Tempest Wing"; RotationAbility MegaflareStrike = new RotationAbility(); // Megaflare Strike MegaflareStrike.announceWarning = false; MegaflareStrike.match = new Regex(@"\ uses\ Megaflare\ Strike\."); MegaflareStrike.warningMessage = @"Megaflare Strike"; // Boss ability rotation // You'll need to split these up into phases // And separate out any timed moves which aren't part of a rotation // For now we'll assume they're all part of phase 1 phaseNum = 1; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(5.4933142), FlareBreath); // 20:13:17:626 @ 99.7963599245106% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(4.4212529), Megaflare); // 20:13:22:47 @ 99.3454269458595% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(13.769788), FlareBreath); // 20:13:35:817 @ 97.7115535215109% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(3.3851936), Flatten); // 20:13:39:202 @ 97.4483935101334% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0224017), FlareBreath); // 20:13:46:225 @ 96.5393617620241% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.6008923), EarthShaker); // 20:14:1:826 @ 94.7920056097905% phases[phaseNum].phaseEndRegex = new Regex(@" readies Gigaflare."); phaseNum = 2; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(4); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.14158), FlareStar); // 17:56:45:834 @ 65.0017658555918% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.992686), FlareBreath); // 17:56:57:827 @ 64.6718469972046% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(9.3335338), Flatten); // 17:57:7:160 @ 64.4565076714178% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(8.052461), FlareBreath); // 17:57:15:213 @ 64.129513625605% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.184640), Megaflare); // 17:57:26:398 @ 63.1931348799255% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.035803), FlareBreath); // 17:57:40:433 @ 61.249377563324% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.2970742), RageofBahamut); // 17:57:41:730 @ 61.070671515031% phases[phaseNum].phaseEndRegex = new Regex(@" readies Gigaflare."); phaseNum = 3; phases[phaseNum] = new Phase(); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(14.5868343), MegaflareDive); // 20:35:25:639 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.080119), DoubleDive); // 20:35:27:719 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.5484317), Megaflare); // 20:35:35:267 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(73.822223), EvilEye); // 20:36:49:89 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.8134469), MegaflareDive); // 20:36:56:903 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.3261331), DoubleDive); // 20:36:59:229 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.2824165), Megaflare); // 20:37:6:511 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(29.619694), DeathSentence); // 20:37:36:131 @ 50.201921748102% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(34.063948), EvilEye); // 21:28:43:170 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(0.506029), DeathSentence); // 21:28:43:676 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.797189), MegaflareDive); // 21:29:4:473 @ 50.2021411090451% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2), DoubleDive); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.621551), Megaflare); // 20:44:13:610 @ 48.7553825691407% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8141038), Teraflare); // 20:44:15:424 @ 48.7553825691407% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(500), RotationAbility.Blank()); // 21:29:10:972 @ 50.2021411090451% phases[phaseNum].phaseEndRegex = new Regex(@" uses Teraflare."); phaseNum = 4; phases[phaseNum] = new Phase(); phases[phaseNum].phaseStartDelay = TimeSpan.FromSeconds(7.7964459); phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.2493575), AkhMorn); // 21:30:29:675 @ 50.5811968186814% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(15.0688619), Megaflare); // 21:30:44:744 @ 48.0261536740399% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.187640), TempestWing); // 21:30:55:931 @ 45.5459857313019% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.019145), EarthShaker); // 21:31:15:950 @ 41.7421207377255% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.010401), TempestWing); // 21:31:22:961 @ 40.6754415918585% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.834105), FlareBreath); // 21:31:24:795 @ 40.3881518767426% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.4923713), AkhMorn); // 21:31:31:287 @ 39.5602105572572% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.3789368), Megaflare); // 21:31:47:666 @ 36.3374327018907% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(10.914624), TempestWing); // 21:31:58:581 @ 34.9454412774411% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.279160), EarthShaker); // 21:32:18:861 @ 31.3452894796685% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.0264019), TempestWing); // 21:32:25:887 @ 30.1016591730531% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.801103), FlareBreath); // 21:32:27:688 @ 29.9565153490508% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.937969), AkhMorn); // 21:32:44:626 @ 26.559272423624% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(17.3839943), Megaflare); // 21:33:2:10 @ 22.8380333852731% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.168639), TempestWing); // 21:33:13:179 @ 21.1687697287748% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.036146), EarthShaker); // 21:33:33:216 @ 18.0587433981496% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(7.263415), TempestWing); // 21:33:40:480 @ 17.1958505684008% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(1.8871079), FlareBreath); // 21:33:42:367 @ 16.8741943055362% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.1823536), AkhMorn); // 21:33:48:549 @ 15.7258397685303% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(18.698069), Megaflare); // 21:34:7:247 @ 12.1152317658044% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(11.192640), TempestWing); // 21:34:18:440 @ 10.5601820403346% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(20.525174), EarthShaker); // 21:34:38:965 @ 7.6563549962014% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(6.516373), TempestWing); // 21:34:45:481 @ 7.1320823422484% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(2.0921197), FlareBreath); // 21:34:47:573 @ 4.52461193221162% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(16.616950), AkhMorn); // 21:35:4:190 @ 1.68505764439982% phases[phaseNum].AddRotation(TimeSpan.FromSeconds(500), RotationAbility.Blank()); // 21:29:10:972 @ 50.2021411090451% }
public void onStartEncounter() { // bossName is needed if you want health based phase swaps bossName = "Titan"; RotationAbility Rockbuster = new RotationAbility(); // swipe, doesn't really need to be announced RotationAbility Landslide = new RotationAbility(); RotationAbility Stomps = new RotationAbility(); // Tumult RotationAbility Plumes = new RotationAbility(); // Weight of the Land RotationAbility Bombs = new RotationAbility(); // Rock Buster RotationAbility Gaol = new RotationAbility(); // Rock Throw RotationAbility TableFlip = new RotationAbility(); // Mountain Buster Rockbuster.announceWarning = false; Rockbuster.match = new Regex(" uses Rock Buster"); Rockbuster.warningMessage = "Swipe"; Plumes.warningTime = TimeSpan.FromSeconds(3); Landslide.announceWarning = true; Landslide.match = new Regex(" uses Landslide"); Landslide.warningMessage = "Land slide"; Stomps.announceWarning = true; Stomps.match = new Regex(" uses Tumult"); Stomps.warningMessage = "Stomps"; Plumes.announceWarning = true; Plumes.match = new Regex(" uses Weight of the Land"); Plumes.warningMessage = "Weight of the land"; Plumes.warningTime = TimeSpan.FromSeconds(7); Bombs.announceWarning = false; Bombs.match = new Regex(" strikes the earth, bringing a shower of bomb boulders"); Bombs.warningMessage = "Bombs"; Gaol.announceWarning = false; Gaol.match = new Regex(" uses Rock Throw"); Gaol.warningMessage = "Gaol"; TableFlip.announceWarning = true; TableFlip.match = new Regex(" uses Mountain Buster"); TableFlip.warningMessage = "Mountain buster"; // started @ 18:37 // first rotation ability @ 18:46 phases[1] = new Phase(); //phases[1].phaseEndHP = 90; phases[1].phaseEndRegex = new Regex(" uses Geocrush"); phases[1].phaseStartDelay = TimeSpan.FromSeconds(3); // 18:37 started phases[1].AddRotation(TimeSpan.FromSeconds(6), Landslide); // 18:46 phases[1].AddRotation(TimeSpan.FromSeconds(6), Stomps); // 18:52 phases[1].AddRotation(TimeSpan.FromSeconds(7), Rockbuster); // 18:59 // 19:05 repeat - 6 seconds (same as first landslide), perfect // jump @ 19:06 // Geocrush @ 19:12 // first rotation ability @ 19:21 phases[2] = new Phase(); //phases[2].phaseEndHP = 75; //phases[2].phaseStartDelay = TimeSpan.FromSeconds(6); phases[2].phaseEndRegex = new Regex(" uses Geocrush"); phases[2].phaseStartDelay = TimeSpan.FromSeconds(3); // Geocrush @ 19:12 phases[2].AddRotation(TimeSpan.FromSeconds(6), Plumes); // 19:21 phases[2].AddRotation(TimeSpan.FromSeconds(6), Rockbuster); // 19:27 phases[2].AddRotation(TimeSpan.FromSeconds(5), Landslide); // 19:32 phases[2].AddRotation(TimeSpan.FromSeconds(8), Stomps); // 19:40 phases[2].AddRotation(TimeSpan.FromSeconds(3), RotationAbility.Blank());// 19:49 repeat // jump @ 19:51 // Geocrush @ 19:57 // first rotation ability @ 20:07 phases[3] = new Phase(); //phases[3].phaseEndHP = 62.5; phases[3].phaseEndRegex = new Regex(" uses Geocrush"); phases[3].phaseStartDelay = TimeSpan.FromSeconds(3); // Geocrush @ 19:57 phases[3].AddRotation(TimeSpan.FromSeconds(7), Landslide); // 20:07 phases[3].AddRotation(TimeSpan.FromSeconds(8), Plumes); // 20:15 phases[3].AddRotation(TimeSpan.FromSeconds(3), Bombs); // 20:18 phases[3].AddRotation(TimeSpan.FromSeconds(7), Rockbuster); // 20:25 phases[3].AddRotation(TimeSpan.FromSeconds(10), Landslide); // 20:35 phases[3].AddRotation(TimeSpan.FromSeconds(6), Plumes); // 20:41 phases[3].AddRotation(TimeSpan.FromSeconds(5), Gaol); // 20:46 phases[3].AddRotation(TimeSpan.FromSeconds(7), Rockbuster); // 20:53 phases[3].AddRotation(TimeSpan.FromSeconds(3), Stomps); // 20:56 phases[3].AddRotation(TimeSpan.FromSeconds(3), RotationAbility.Blank());// 21:06 repeat - 10 seconds, perfect // jump @ 21:08 // Geocrush @ 21:14 // first rotation ability @ 21:25 phases[4] = new Phase(); //phases[3].phaseStartDelay = TimeSpan.FromSeconds(6); phases[4].phaseEndRegex = new Regex(" uses Earthen Fury"); phases[4].phaseStartDelay = TimeSpan.FromSeconds(3); // Geocrush @ 21:14 phases[4].AddRotation(TimeSpan.FromSeconds(11), Gaol); // 21:25 phases[4].AddRotation(TimeSpan.FromSeconds(4), Rockbuster); // 21:29 phases[4].AddRotation(TimeSpan.FromSeconds(5), Landslide); // 21:34 phases[4].AddRotation(TimeSpan.FromSeconds(8), Plumes); // 21:42 phases[4].AddRotation(TimeSpan.FromSeconds(6), Stomps); // 21:48 phases[4].AddRotation(TimeSpan.FromSeconds(8), Gaol); // 21:56 phases[4].AddRotation(TimeSpan.FromSeconds(4), Rockbuster); // 22:00 phases[4].AddRotation(TimeSpan.FromSeconds(5), Landslide); // 22:05 phases[4].AddRotation(TimeSpan.FromSeconds(8), Plumes); // ~22:13 phases[4].AddRotation(TimeSpan.FromSeconds(20), RotationAbility.Blank()); // ~22:20 die if not phase transitioned // jump @ 22:06 // Earthen Fury @ 22:22 // first rotation ability @ 22:30 phases[5] = new Phase(); //phases[3].phaseEndHP = 0; //phases[3].phaseStartDelay = TimeSpan.FromSeconds(6); //phases[5].phaseEndRegex = new Regex(" uses Geocrush"); // phase 5 doesn't end until titan dies or the party wipes phases[5].phaseStartDelay = TimeSpan.FromSeconds(4); // Earthen Fury @ 22:22 phases[5].AddRotation(TimeSpan.FromSeconds(4), TableFlip); // 22:30 - 8 seconds after earthen, read notes at bottom phases[5].AddRotation(TimeSpan.FromSeconds(3), Stomps); // 22:33 phases[5].AddRotation(TimeSpan.FromSeconds(9), Plumes); // 22:42 phases[5].AddRotation(TimeSpan.FromSeconds(3), Bombs); // 22:45 phases[5].AddRotation(TimeSpan.FromSeconds(10), Landslide); // 22:55 phases[5].AddRotation(TimeSpan.FromSeconds(4), Rockbuster); // 22:59 phases[5].AddRotation(TimeSpan.FromSeconds(4), TableFlip); // 23:03 phases[5].AddRotation(TimeSpan.FromSeconds(6), Plumes); // 23:09 phases[5].AddRotation(TimeSpan.FromSeconds(5), Gaol); // 23:14 phases[5].AddRotation(TimeSpan.FromSeconds(11), Landslide); // 23:25 phases[5].AddRotation(TimeSpan.FromSeconds(4), Rockbuster); // 23:29 // 23:33 repeat - 4 seconds. Was 8 seconds between Earthen Fury and start of rotation, // so pad here with 4 seconds, reduce start of rotation from 8 to 4, and set phaseStartDelay to 4 }