You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

476 lines
14 KiB

5 years ago
'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"
5 years ago
# SUMMONER / BLACKMAGE / REDMAGE
# hideall "Addle0"
# hideall "Addle1"
5 years ago
# MONK
# hideall "Mantra0"
# hideall "Mantra1"
# hideall "Mantra2"
# hideall "Mantra3"
5 years ago
# GUNBREAKER
# hideall "Superbolide0"
# hideall "Repraisal & HoL0"
# hideall "Repraisal & HoL1"
# hideall "Repraisal & HoL2"
# hideall "Repraisal & HoL3"
5 years ago
# SCHOLAR
# hideall "Seraph0"
# hideall "Seraph1"
5 years ago
# hideall "recit and indom"
# hideall "Fairy Stuff"
# hideall "recitand excog"
# WHITEMAGE
# hideall "Benediction0"
# hideall "Benediction1"
# hideall "Indulgence0"
# hideall "Indulgence1"
# hideall "Regens"
# hideall "Temperance"
5 years ago
`,
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: 'Reprisal 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: 2,
alarmText: 'BENEDICTION AFTER TANKBUSTER',
tts: 'Benediction after Tankbuster',
},
{
regex: /Indulgence\d/,
condition: function(data) {
return data.job == 'WHM';
},
beforeSeconds: 2,
alarmText: 'USE INDULGENCE AFTER DELTA',
tts: 'INDULGENCE AFTER DELTA',
},
{
regex: /Regens/,
condition: function(data) {
return data.job == 'WHM';
},
beforeSeconds: 2,
alarmText: 'USE REGEN FOR DPS MARKS',
tts: 'Regen for DPS marks',
},
{
regex: /Temperance/,
condition: function(data) {
return data.job == 'WHM';
},
beforeSeconds: 3,
alarmText: 'USE TEMPERANCE',
tts: 'use temperance for aoe',
},
],
},
];
// 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';
},
},
};