Skip to content

Instantly share code, notes, and snippets.

@alexcrichton
Created November 19, 2024 00:03
Show Gist options
  • Save alexcrichton/f68cecc966a6328e08932e6a63d5d793 to your computer and use it in GitHub Desktop.
Save alexcrichton/f68cecc966a6328e08932e6a63d5d793 to your computer and use it in GitHub Desktop.
top triggers
// Installation:
//
// 1. Place this file in a folder "$somewhere/raidboss/top.js".
// a. example: C:/Users/alex/Downloads/tmp/raidboss/top.js
// 2. ACT > Plugins > OverlayPlugin.dll > Cactbot Config
// 3. Set "Cactbot user directory" to "$somewhere" from above.
// a. example: C:/Users/alex/Downloads/tmp
// 4. Reload the overlay
// 5. In "Cactbot Config" under "Raidboss" at the bottom you should see a path to "top.js"
// 6. Under "top.js" you should see "The Omega Protocol (Ultimate)"
// 7. Under this you should see the custom triggers.
function groupAndPrioMap(data) {
let g1key = `g1${data.phase}`;
let g2key = `g2${data.phase}`;
const g1 = data.triggerSetConfig[g1key];
const g2 = data.triggerSetConfig[g2key];
const group = {};
const prio = {};
let i = 0;
for (let name of g1.split(',')) {
group[name.trim()] = 0;
prio[name.trim()] = i++;
}
i = 0;
for (let name of g2.split(',')) {
group[name.trim()] = 1;
prio[name.trim()] = i++;
}
return [group, prio];
}
Options.Triggers.push({
id: 'tinys-top-triggers',
zoneId: ZoneId.TheOmegaProtocolUltimate,
config: [
{
id: 'g1p1',
name: {
en: 'Group 1 in Phase 1 (first never swaps)',
},
type: 'string',
default: 'Tiny,Andy,Caspian,Scloral',
},
{
id: 'g2p1',
name: {
en: 'Group 2 in Phase 1 (first never swaps)',
},
type: 'string',
default: 'Karasu,Ruu,Shino,Vaults',
},
],
triggers: [
{
id: 'TOP In Line Debuff',
type: 'GainsEffect',
netRegex: { effectId: ['BBC', 'BBD', 'BBE', 'D7B'], capture: false },
condition: (data) => data.phase === 'p1',
delaySeconds: 0.5,
durationSeconds: 5,
suppressSeconds: 1,
infoText: (data, _matches, output) => {
const myNum = data.inLine[data.me];
if (myNum === undefined)
return;
let partner = output.unknown();
for (const [name, num] of Object.entries(data.inLine)) {
if (num === myNum && name !== data.me) {
partner = name;
break;
}
}
const [groups, prio] = groupAndPrioMap(data);
let swapstr = output.noswap();
// DEBUGGING vvvv
if (groups[data.me] === undefined) {
swapstr = `!me not in group: ${data.me}!`;
} else if (groups[partner] === undefined) {
swapstr = `!partner not in group: ${partner}!`;
} else if (prio[data.me] === undefined) {
swapstr = `!me not in prio: ${data.me}!`;
} else if (prio[partner] === undefined) {
swapstr = `!partner not in prio: ${partner}!`;
// DEBUGGING ^^^^^
} else if (groups[data.me] == groups[partner] && prio[data.me] > prio[partner]) {
swapstr = output.swap();
}
return output.text({
num: myNum,
player: data.party.member(partner),
swapstr,
});
},
outputStrings: {
text: {
en: '${num} (with ${player} ${swapstr})',
},
swap: 'and YOU SWAP',
noswap: '',
unknown: Outputs.unknown,
},
},
],
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment