raidboss: dmu p1 initial triggers#1069
Conversation
|
Also, I looked a bit at o8s to grab some of the outputs to match. |
|
I'll probably work on the tethers tomorrow, then it should be ready? |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…integration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…boolean model Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…integration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…boolean model Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
wexxlee
left a comment
There was a problem hiding this comment.
Leaving some fast comments now; will hopefully be able to give a more complete review after I jump in later tonight.
| const trapEarlyOutputStrings: OutputStrings = { | ||
| trapOnYou: { | ||
| en: 'Trap on YOU (later)', | ||
| }, | ||
| trapOnYouPlayer: { | ||
| en: 'Traps on YOU, ${player} (later)', | ||
| }, | ||
| trapOnPlayer: { | ||
| en: 'Trap on ${player} (later)', | ||
| }, | ||
| trapOnPlayers: { | ||
| en: 'Traps on ${player1}, ${player2} (later)', | ||
| }, | ||
| }; | ||
|
|
||
| const trapOutputStrings: OutputStrings = { | ||
| trapOnYou: { | ||
| en: 'Trap on YOU ', | ||
| }, | ||
| trapOnYouPlayer: { | ||
| en: 'Traps on YOU, ${player}', | ||
| }, | ||
| trapOnPlayer: { | ||
| en: 'Trap on ${player}', | ||
| }, | ||
| trapOnPlayers: { | ||
| en: 'Traps on ${player1}, ${player2}', | ||
| }, | ||
| }; |
There was a problem hiding this comment.
I think this leads to an ordering problem in the triggers later, e.g. if the player themselves happens to be target[0], then the later triggers will say "Traps on YOU, {playername}" where playername is the same name as the current player.
think you could probably fix this by having a single output:
"Knockback from ${players)"
Then, in the triggers, use .map to map array elements thru data.party.member(), substituting any presence of data.me with "YOU", and join with (", ") to produce a single string for the output.
(Sidenote - entirely personal preference, but I think "Knockback from" is preferable to "Traps"; I haven't heard it referred to as traps yet, and something more outcome-oriented like "Knockback from" may be more useful.)
| id: 'DMU P1 Double-trouble Trap 1', | ||
| type: 'GainsEffect', | ||
| netRegex: { effectId: '13D6', capture: true }, | ||
| condition: (_data, matches) => parseFloat(matches.duration) < 6, |
There was a problem hiding this comment.
I think you could reduce Trap 1, Trap 2, and Trap 3 into a single trigger, using, e.g.:
delaySeconds: (_data, matches) => parseFloat(matches.duration) - 4,
In case it helps, for tethers, there's an ActorSetPos line that comes out with each tether, moving the invisible add that the player is tethered to to either: |
Thanks. I am almost done with the tether triggers, I am just trying to fix tts collisions at this point before pushing. EDIT: Here is my current draft. It conflicts with left/right call and the ice call (within 1s), the pulse call is within 2s but I shortened it to knockback. {
id: 'DMU ActorSetPos Tracker',
// Only in use for P1 Graven Image tethers
type: 'ActorSetPos',
netRegex: { id: '4[0-9A-Fa-f]{7}', capture: true },
run: (data, matches) =>
data.actorPositions[matches.id] = {
x: parseFloat(matches.x),
y: parseFloat(matches.y),
heading: parseFloat(matches.heading),
},
},
{
id: 'DMU Graven Image Tether Collect',
// 271 ActorSetPos lines indicate where the tether is coming from
// 261 CombatantMemory lines may also indicate this
// Graven Image 1:
// (100, 56, 18.5) Center Tether, Will be target of BAA9 Pulse Wave (knockback)
// Graven Image 2:
// (102.5, 27, 22.5) Center Tether, Will be target of BAAC Gravitas (puddles)
// (126, 41.5, 7) Right Tether, Will be target of BAB0 Vitrophyre (rocks)
// Graven Image 3:
// (95, 25, 27) Left Tether, Will be target of BAB5 Indulgent Will which causes 503 Confused
// (107, 43, 8.5) Right tether, Will be target of BAB6 Idyllic Will which causes 131E Sleep
type: 'Tether',
netRegex: { id: headMarkerData['imageTether'], capture: true },
condition: Conditions.targetIsYou(),
delaySeconds: 0.1, // Actor position data can come after tether in log
run: (data, matches) => {
const actor = data.actorPositions[matches.sourceId];
if (actor === undefined) {
data.gravenImageTether = 'unknown';
return;
}
const x = actor.x;
// Graven Image 1: Pulse Wave target
if (x < 101 && x > 99)
data.gravenImageTether = 'pulse';
else if (x < 103 && x > 101) // Graven Image 2: Gravitas target
data.gravenImageTether = 'gravitas';
else if (x > 125) // Graven Image 2: Vitrophyre target
data.gravenImageTether = 'vitrophyre';
else if (x < 100) // Graven Image 3: Indulgent Will target
data.gravenImageTether = 'indulgent';
else if (x < 108 && x > 106) // Graven Image 3: Idyllic Will target
data.gravenImageTether = 'idyllic';
else
data.gravenImageTether = 'unknown';
},
},
{
id: 'DMU Graven Image Tether',
type: 'Tether',
netRegex: { id: headMarkerData['imageTether'], capture: true },
condition: Conditions.targetIsYou(),
delaySeconds: 0.1, // Actor position data can come after tether in log
infoText: (data, matches, output) => {
const actor = data.actorPositions[matches.sourceId];
if (actor === undefined)
return output.tetherOnYou!();
const x = actor.x;
// Graven Image 1: Pulse Wave target
if (x < 101 && x > 99)
return output.pulse!();
else if (x < 103 && x > 101) // Graven Image 2: Gravitas target
return output.gravitas!();
else if (x > 125) // Graven Image 2: Vitrophyre target
return output.vitrophyre!();
else if (x < 100) // Graven Image 3: Indulgent Will target
return output.indulgent!();
else if (x < 108 && x > 106) // Graven Image 3: Idyllic Will target
return output.idyllic!();
else
return output.tetherOnYou!();
},
outputStrings: {
tetherOnYou: {
en: 'Tether on YOU',
de: 'Verbindung auf DIR',
fr: 'Lien sur VOUS',
ja: '線ついた',
cn: '连线点名',
ko: '선 대상자 지정됨',
tc: '連線點名',
},
pulse: Outputs.knockback, // Cannot be immuned, happens within 6s of tether
gravitas: {
en: 'Puddle Tether on YOU',
},
vitrophyre: {
en: 'Rock Tether on YOU',
},
indulgent: {
en: 'Confuse Tether on YOU',
},
idyllic: {
en: 'Sleep Tether on YOU',
},
},
},
{
id: 'DMU P1 Graven Image Tether Cleanup',
// Clear on Ability:
// BAA9 Pulse Wave
// BAAC Gravitas
// BAB0 vitrophyre
// BAB5 Indulgent Will
// BAB6 Idyllic Will
type: 'Ability',
netRegex: {
id: ['BAA9', 'BAAC', 'BAB0', 'BAB5', 'BAB6'],
source: 'Graven Image',
capture: true,
},
suppressSeconds: 1,
run: (data, matches) => {
// Player could die and this ability then not target them
// Need intelligent way to remove once related ability has executed
// Clear data if ability matches our tether
const abilityMap = {
'pulse': 'BAAC',
'gravitas': 'BAA9',
'vitrophyre': 'BAB0',
'indulgent': 'BAB5',
'idyllic': 'BAB6',
'unknown': 'unknown',
};
const tether = data.gravenImageTether ?? 'unknown';
const tetherAbilityId = abilityMap[tether as keyof typeof abilityMap];
if (tetherAbilityId === matches.id || tether === 'unknown')
delete data.gravenImageTether;
},
}, |
Addon to #1068.
Adds some triggers that I worked on today.
Still to be tested, but raidemulator seemed okay. Currently missing the Graven Image 2 tell, though it is tracked.