'use strict'; // Rename this file to `raidboss.js` and edit it to change the raidboss ui. // This file is Javascript. Anything after "//" on a line is a comment. // If you edit this file, remember to reload ACT or click the "Reload overlay" // button on the raidboss CactbotOverlay. // If there are errors in this file, they will appear in the OverlayPlugin.dll // log window in ACT. // If false, no timeline of upcoming events will be displayed during fights. Options.TimelineEnabled = true; // If false, triggers and timelines will not show or speak text, nor play // sounds. Options.AlertsEnabled = true; // If false, then visual text alerts are not shown for triggers. Options.TextAlertsEnabled = true; // If false, then sound alerts are not played. Options.SoundAlertsEnabled = true; // If true, then text-to-speech alerts are read aloud. Text-to-speech takes // priority over custom sounds and text noises. If a trigger does not have // a tts entry then it will fall back on text and sound (if turned on). Options.SpokenAlertsEnabled = true; // Will override the singular TTS alerts if a group alert is set for a specific trigger // Change phrasing to make sense in a group setting Options.GroupSpokenAlertsEnabled = true; // Show timer bars for events that will happen in this many seconds or less. Options.ShowTimerBarsAtSeconds = 30; // Once a timer bar reaches 0, keep it around this long after. Options.KeepExpiredTimerBarsForSeconds = 0.7; // Change the bar color to highlight it is coming up when this many seconds // are left on it. Options.BarExpiresSoonSeconds = 8; // Number of bars to show in the space given to the UI by css. Options.MaxNumberOfTimerBars = 8; // Path to sound played for info-priority text popups, or when "Info" is // specified as the sound name. Options.InfoSound = '../../resources/sounds/freesound/percussion_hit.ogg'; // Path to sound played for alert-priority text popups, or when "Alert" is // specified as the sound name. Options.AlertSound = '../../resources/sounds/BigWigs/Alert.ogg'; // Path to sound played for alarm-priority text popups, or when "Alarm" is // specified as the sound name. Options.AlarmSound = '../../resources/sounds/BigWigs/Alarm.ogg'; // Path to sound played when "Long" is specified as the sound name. Options.LongSound = '../../resources/sounds/BigWigs/Long.ogg'; // Volume between 0 and 1 to play the InfoSound at. Options.InfoSoundVolume = 1; // Volume between 0 and 1 to play the AlertSound at. Options.AlertSoundVolume = 2; // Volume between 0 and 1 to play the AlarmSound at. Options.AlarmSoundVolume = 1; // Volume between 0 and 1 to play the LongSound at. Options.LongSoundVolume = 1; // A set of nicknames to use for players, when trying to shorten names. Options.PlayerNicks = { 'Darkest Edgelord': 'Mary', 'Captain Jimmy': 'Jimmy', 'Pipira Pira': '🐟', }; // A set of triggers to be ignored. The key is the 'id' of the trigger, and // the value should be true if the trigger is to be ignored, whereas false // will have no effect. The trigger ids can be found in the trigger files for // each fight in the files inside of this directory: // https://github.com/quisquous/cactbot/tree/master/ui/raidboss/data/triggers Options.DisabledTriggers = { // Disable the /psych trigger from `test.js` in Summerford Farms. 'Test Psych': true, // Disable the "eye lasers" trigger from `drowned_city_of_skalla.js`. 'Hrodric Words': true, }; // An array of user-defined triggers, in the format defined in the readme: // https://github.com/quisquous/cactbot/tree/master/ui/raidboss/data/triggers Options.Triggers = [ // (1) Simple example trigger: show text on screen when you die. { // Match every zone. zoneRegex: /.*/, triggers: [ { regex: /:You are defeated by/, alarmText: 'YOU DIED', }, { regex: /:\y{Name}:\y{AbilityCode}:Chain Stratagem:/, infoText: 'Chain Stratagem', }, { regex: /:\y{Name}:\y{AbilityCode}:Trick Attack:/, infoText: 'Trick Attack', }, { regex: /:\y{Name}:\y{AbilityCode}:Devilment:/, infoText: 'Devilment', }, ], }, // You can add other triggers for other zones too. Here's more examples: // // (2) Maybe you want a silly kissy noise whenever you a blow a kiss in // a housing zone! { zoneRegex: /^(Mist|The Goblet|The Lavender Beds|Shirogane)$/, triggers: [ { regex: /You blow a kiss/, alertText: 'In or Out', }, ], }, // (3) Maybe you want to modify some existing timeline and triggers: // // Add some extra triggers to the test timeline. To use it, see: // https://github.com/quisquous/cactbot/blob/master/ui/raidboss/data/timelines/test.txt { // The zone this should apply to. // This should match the zoneRegex in the triggers file. zoneRegex: /^Middle La Noscea$/, // Add some additional timeline events to the test timeline. timeline: ` # Note: Hash marks are comments inside of a timeline file. # This format is the same as ACT timeline. # Add a new personal event to the test timeline. 2 "(test)" 3 "(test2)" 4 "(test4)" # Remind yourself to shield the tank 5 seconds before final sting. infotext "Final Sting" before 5 "shield the tank" # Events you don't like, you can hide. This gets rid of "Long Castbar". hideall "Long Castbar" `, // Add some additional triggers that will go off in Summerford Farms. triggers: [ // If you provoke the striking dummy (or anything), this will trigger. { id: 'User Example Provoke', regex: /You use Sprint/, alarmText: function(data) { return data.job + 'DU BIST EIN RETURN'; }, infoText: 'Sprint!', tts: 'provoke', }, // A more complicated regen trigger. { id: 'User Example Regen', // This will match log lines from ACT that look like this: // "Nacho Queen gains the effect of Regen from Taco Cat for 21.00 Seconds." regex: /gains the effect of Regen from \y{Name} for (\y{Float}) Seconds/, delaySeconds: function(data, matches) { // Wait the amount of seconds regen lasts before reminding you to // reapply it. This is not smart enough to figure out if you // cast it twice, and is left as an exercise for the reader to // figure out how to do so via storing variables on `data`. return data.ParseLocaleFloat(matches[1]); }, alertText: 'Regen Reminder', tts: 'regen', }, ], }, // EDEN SAVAGE FIGHTS // E1S { zoneRegex: /^Eden's Gate: Resurrection \(Savage\)$/, timeline: ` # dnc cooldowns 88 "Shield Samba0" 629.6 "Shield Samba1" # smn cooldowns 105.8 "Addle0" 700.8 "Addle1" # mnk cooldowns 11.8 "Mantra0" 105.8 "Mantra1" 194.6 "Mantra2" 629.6 "Mantra3" # gnb cooldowns # invul 576.0 "Superbolide0" # Repraisal & HoL 11.8 "Repraisal & HoL0" 143.0 "Repraisal & HoL1" 589.0 "Repraisal & HoL2" 726.3 "Repraisal & HoL3" # sch cooldowns 11.8 "recit and indom" 153.6 "Seraph 0" 528.6 "Fairy Stuff" 577.6 "recit and excog" 589.1 "Seraph 1" # whm cooldowns 59.4 "Benediction0" 88 "Indulgence0" 568.6 "Regens" 629.6 "Temperance" 678.1 "Benediction1" 726.3 "Indulgence1" # choose what you want to hide! (add # at the beginning to "hideall" / remove # to show) # DANCER hideall "Shield Samba0" hideall "Shield Samba1" # SUMMONER / BLACKMAGE / REDMAGE hideall "Addle0" hideall "Addle1" # MONK hideall "Mantra0" hideall "Mantra1" hideall "Mantra2" hideall "Mantra3" # GUNBREAKER hideall "Superbolide0" hideall "Repraisal & HoL0" hideall "Repraisal & HoL1" hideall "Repraisal & HoL2" hideall "Repraisal & HoL3" # SCHOLAR hideall "Seraph0" hideall "Seraph1" hideall "recit and indom" hideall "Fairy Stuff" hideall "recitand excog" # WHITEMAGE hideall "Benediction0" hideall "Benediction1" hideall "Indulgence0" hideall "Indulgence1" hideall "Regens" hideall "Temperance" `, timelineTriggers: [ // DANCER { regex: /Shield Samba\d/, condition: function(data) { return data.job == 'DNC'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Shield Samba', }, // SUMMONER { regex: /Addle\d/, condition: function(data) { return data.job == 'SMN' || data.job == 'BLM' || data.job == 'RDM'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Addle', }, // MONK { regex: /Mantra\d/, condition: function(data) { return data.job == 'MNK'; }, beforeSeconds: 2, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Mantra', }, // GUNBREAKER INVULS { regex: /Superbolide0\d/, condition: function(data) { return data.job == 'GNB'; }, beforeSeconds: 6, alarmText: 'USE INVUL', tts: 'Invul next Tankbuster', }, // GUNBREAKER REPRAISEL AND HEART OF LIGHT { regex: /Repraisal & HoL\d/, condition: function(data) { return data.job == 'GNB'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Repraisal and Heart of Light', }, // SCHOLAR -- LOTS OF SCHOLAR { regex: /recit and indom/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'RECIT + INDOM', tts: 'Recitation and Indom', }, { regex: /Seraph0/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'SERAPH', tts: 'SERAPH', }, { regex: /Fairy Stuff/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'FAIRY INC', tts: 'use fairy', }, { regex: /recit and excog/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'RECIT + EXCOG', tts: 'RECIT + EXCOG second hit', }, { regex: /Seraph1/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'SERAPH', tts: 'SERAPH', }, // Whitemage { regex: /Benediction\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'BENEDICTION AFTER TANKBUSTER', tts: 'Benediction after Tankbuster', }, { regex: /Indulgence\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE INDULGENCE AFTER DELTA', tts: 'INDULGENCE AFTER DELTA', }, { regex: /Regens/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE REGEN FOR DPS MARKS', tts: 'Regen for DPS marks', }, { regex: /Temperance/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE TEMPERANCE', tts: 'use temperance for aoe', }, ], }, // E2S { zoneRegex: /^Eden's Gate: Descent \(Savage\)$/, timeline: ` # dnc cooldowns 25.2 "Shield Samba0" 203.2 "Shield Samba1" 429.8 "Shield Samba2" 602.3 "Shield Samba3" # smn cooldowns 105.2 "Addle0" 224.7 "Addle1" 381.4 "Addle2" 499.0 "Addle3" 602.3 "Addle4" # mnk cooldowns 132.1 "Mantra0" 224.7 "Mantra1" 381.4 "Mantra2" 558.2 "Mantra3" # gnb cooldowns # invul # Repraisal & HoL 25.2 "Repraisal & HoL0" 105.2 "Repraisal & HoL1" 203.2 "Repraisal & HoL2" 272.7 "Repraisal & HoL3" 381.4 "Repraisal & HoL4" 499.0 "Repraisal & HoL5" 602.3 "Repraisal & HoL6" # sch cooldowns 25.2 "recit and indom0" 224.7 "Succ and soil0" 272.7 "Soil0" 381.4 "Succ and soil1" 386.7 "recit and indom1" 429.8 "recit and indom2" 499.0 "Soil1" # whm cooldowns 106.6 "Temperance0" 134.1 "Indulgence0" 224.7 "Indulgence1" 295.5 "Indulgence2" 386.7 "Indulgence3" 381.4 "Temperance1" 429.8 "Indulgence4" 499.0 "Indulgence5" 558.0 "Indulgence and Temperance" # choose what you want to hide! (add # at the beginning to "hideall" / remove # to show) # DANCER hideall "Shield Samba0" hideall "Shield Samba1" hideall "Shield Samba2" hideall "Shield Samba3" # SUMMONER / BLACKMAGE / REDMAGE hideall "Addle0" hideall "Addle1" hideall "Addle2" hideall "Addle3" hideall "Addle4" # MONK hideall "Mantra0" hideall "Mantra1" hideall "Mantra2" hideall "Mantra3" # GUNBREAKER hideall "Repraisal & HoL0" hideall "Repraisal & HoL1" hideall "Repraisal & HoL2" hideall "Repraisal & HoL3" hideall "Repraisal & HoL4" hideall "Repraisal & HoL5" hideall "Repraisal & HoL6" # SCHOLAR hideall "recit and indom0" hideall "Succ and soil0" hideall "Soil0" hideall "Succ and soil1" hideall "recit and indom1" hideall "recit and indom2" hideall "Soil1" # WHITEMAGE hideall "Temperance0" hideall "Indulgence0" hideall "Indulgence1" hideall "Indulgence2" hideall "Indulgence3" hideall "Temperance1" hideall "Indulgence4" hideall "Indulgence5" hideall "Indulgence and Temperance" `, timelineTriggers: [ // DANCER { regex: /Shield Samba\d/, condition: function(data) { return data.job == 'DNC'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Shield Samba', }, // SUMMONER / BLACKMAGE / REDMAGE - Just for 1 Magical DPS { regex: /Addle\d/, condition: function(data) { return data.job == 'SMN' || data.job == 'BLM' || data.job == 'RDM'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Addle', }, // MONK { regex: /Mantra\d/, condition: function(data) { return data.job == 'MNK'; }, beforeSeconds: 2, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Mantra', }, // GUNBREAKER INVULS - Currently Empty for this fight // GUNBREAKER REPRAISEL AND HEART OF LIGHT { regex: /Repraisal & HoL\d/, condition: function(data) { return data.job == 'GNB'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Repraisal and Heart of Light', }, // SCHOLAR -- LOTS OF SCHOLAR { regex: /recit and indom\d/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'RECIT + INDOM', tts: 'Recitation and Indom', }, { regex: /Succ and soil\d/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'SUCC AND SOIL', tts: 'Succ and soil', }, { regex: /Soil\d/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'USE SOIL', tts: 'use soil', }, // Whitemage { regex: /Temperance\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE TEMPERANCE', tts: 'use temperance for aoe', }, { regex: /Indulgence\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE INDULGENCE', tts: 'use indulgence for aoe', }, { regex: /Indulgence and Temperance/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE INDULGENCE AND TEMPERANCE', tts: 'indulgence and temperance', }, ], }, // E3S { zoneRegex: /^Eden's Gate: Inundation \(Savage\)$/, timeline: ` # dnc cooldowns 4.1 "Shield Samba0" 185.1 "Shield Samba1" 429.8 "Shield Samba2" # smn cooldowns 127.6 "Addle0" 223.4 "Addle1" 316.2 "Addle2" 422.4 "Addle3" 540.7 "Addle4" # mnk cooldowns 112.0 "Mantra0" 223.4 "Mantra1" 429.8 "Mantra2" 488.0 "Mantra3" 582.0 "Mantra4" # gnb cooldowns # invul 175.7 "Superbolide0" # Repraisal & HoL 69.5 "Repraisal & HoL0" 168.5 "Repraisal & HoL1" 264.1 "Repraisal & HoL2" 373.0 "Repraisal & HoL3" 441.0 "Repraisal & HoL4" 524.4 "Repraisal & HoL5" 587.7 "Repraisal & HoL6" # sch cooldowns 146.0 "Seraph0" 358.0 "Seraph1" 441.0 "Fey Illumination" 449.0 "recit and indom" 524.4 "Seraph2" # whm cooldowns 12.6 "Indulgence0" 127.6 "Indulgence and Temperance0" 197.1 "Indulgence1" 316.4 "Indulgence and Temperance1" 371.0 "Indulgence2" 441.0 "Temperance0" 493.0 "Indulgence3" 576.7 "Temperance1" # choose what you want to hide! (add # at the beginning to "hideall" / remove # to show) # DANCER hideall "Shield Samba0" hideall "Shield Samba1" hideall "Shield Samba2" # SUMMONER / BLACKMAGE / REDMAGE hideall "Addle0" hideall "Addle1" hideall "Addle2" hideall "Addle3" hideall "Addle4" # MONK hideall "Mantra0" hideall "Mantra1" hideall "Mantra2" hideall "Mantra3" hideall "Mantra4" # GUNBREAKER hideall "Superbolide0" hideall "Repraisal & HoL0" hideall "Repraisal & HoL1" hideall "Repraisal & HoL2" hideall "Repraisal & HoL3" hideall "Repraisal & HoL4" hideall "Repraisal & HoL5" hideall "Repraisal & HoL6" # SCHOLAR hideall "Seraph0" hideall "Seraph1" hideall "Fey Illumination" hideall "recit and indom" hideall "Seraph2" # WHITEMAGE hideall "Indulgence0" hideall "Indulgence and Temperance0" hideall "Indulgence1" hideall "Indulgence and Temperance1" hideall "Indulgence2" hideall "Temperance0" hideall "Indulgence3" hideall "Temperance1" `, timelineTriggers: [ // DANCER { regex: /Shield Samba\d/, condition: function(data) { return data.job == 'DNC'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Shield Samba', }, // SUMMONER { regex: /Addle\d/, condition: function(data) { return data.job == 'SMN' || data.job == 'BLM'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Addle', }, // MONK { regex: /Mantra\d/, condition: function(data) { return data.job == 'MNK'; }, beforeSeconds: 2, alarmText: 'USE RAIDCOOLDOWN', tts: 'Use Mantra', }, // GUNBREAKER INVULS { regex: /Superbolide0\d/, condition: function(data) { return data.job == 'GNB'; }, beforeSeconds: 6, alarmText: 'USE INVUL', tts: 'Invul next Tankbuster', }, // GUNBREAKER REPRAISEL AND HEART OF LIGHT { regex: /Repraisal & HoL\d/, condition: function(data) { return data.job == 'GNB'; }, beforeSeconds: 4, alarmText: 'USE RAIDCOOLDOWN', tts: 'Repraisal and Heart of Light', }, // SCHOLAR -- LOTS OF SCHOLAR { regex: /Seraph\d/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'SERAPH', tts: 'SERAPH', }, { regex: /Fey Illumination/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'USE FEY ILLUMINATION', tts: 'fey illumination', }, { regex: /recit and indom/, condition: function(data) { return data.job == 'SCH'; }, beforeSeconds: 4, alarmText: 'RECIT + INDOM', tts: 'Recitation and Indom', }, // Whitemage { regex: /Temperance\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE TEMPERANCE', tts: 'use temperance for aoe', }, { regex: /Indulgence\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE INDULGENCE', tts: 'use indulgence for aoe', }, { regex: /Indulgence and Temperance\d/, condition: function(data) { return data.job == 'WHM'; }, beforeSeconds: 4, alarmText: 'USE INDULGENCE AND TEMPERANCE', tts: 'indulgence and temperance', }, ], }, // E4S ]; // Per trigger options. By default, each trigger uses the global options // of TextAlertsEnabled, SoundAlertsEnabled, and SpokenAlertsEnabled. // These global options are set up top in this file. // // If a per trigger entry is present (regardless if true/false), it will // override whatever the global option is set to. // // SoundOverride (if present) behaves like 'sound' on an individual trigger, in // that it will take the place of the info/alert/alarm noise if no sound has // been specified. SoundAlert (or SoundAlertsEnabled) must still be true for // that override to be played. // // Here's some example per trigger options that modify the test triggers // in Summerford Farms: // https://github.com/quisquous/cactbot/blob/master/ui/raidboss/data/triggers/test.js Options.PerTriggerOptions = { // Just like Options.DisabledTriggers, this is the trigger id to apply to. // This overrides the settings for the "/laugh" trigger from the test // triggers. You can try this out by teleporting to Summerford Farms // and /laugh at a striking dummy. It will use these settings and moo. 'Test Laugh': { // Play the text to speech. SpeechAlert: false, // Play the sound alert. SoundAlert: true, // Show the info/alert/alarm text on screen. TextAlert: false, // Play this sound (replacing any sound from the original). SoundOverride: '../../resources/sounds/WeakAuras/CowMooing.ogg', // Play the sound (if any) at this volume. VolumeOverride: 0.3, }, // This makes /poke-ing a striking dummy in Summerford Farms only // use text to speech with no visual text indicator or other sound. 'Test Poke': { SpeechAlert: true, SoundAlert: false, TextAlert: false, // Override the tts output as well. TTSText: function(data) { return 'Custom Poke (' + data.pokes + ')'; }, }, // This makes /clap-ing a striking dummy override the default // behavior to use the group TTS 'Test Clap': { GroupSpeechAlert: true, SpeechAlert: true, SoundAlert: false, TextAlert: false, // Override the tts output as well. GroupTTSText: function(data) { return 'Custom CLAP'; }, }, };