Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
c1303bb
Power Infusion Helper: give it its own page, out of the Aura Designer
Krathe82 Sep 8, 2026
253251d
PI Helper: its records leave the designer's lists, and the colour joi…
Krathe82 Sep 8, 2026
b8f961a
PI Helper: an enable tick, a real preview, and Square retired
Krathe82 Sep 8, 2026
3f9eb2d
PI Helper: side-by-side like the designer, Triggers before Indicators…
Krathe82 Sep 8, 2026
76790f6
PI Helper: size the preview panel before building into it, not after
Krathe82 Sep 8, 2026
63cd608
PI Helper: preview at the top with its slider, and Triggers / Effects…
Krathe82 Sep 8, 2026
ec1f152
PI Helper: Roles asked positively, one duplicate link removed, banner…
Krathe82 Sep 8, 2026
fe384c4
PI Helper: several effects per signal, added and removed one at a time
Krathe82 Sep 8, 2026
00755ad
PI Helper: the Effects tab IS the designer's, scoped to the helper
Krathe82 Sep 8, 2026
42027dc
PI Helper: a fourth pool tab in the designer, not a page beside it
Krathe82 Sep 8, 2026
f9ada49
PI Helper: fix the two bugs the fourth-tab change introduced
Krathe82 Sep 8, 2026
8c4981c
PI Helper: one page, two sub-tabs, and the stuck icon group deleted
Krathe82 Sep 9, 2026
fb59106
PI Helper: delete the icon group from the store it actually lives in
Krathe82 Sep 9, 2026
0dc039f
PI Helper: purge stray marks by MARK, across every store
Krathe82 Sep 9, 2026
e79fa0c
PI Helper: light the row you clicked, re-sync both strips on a reuse,…
Krathe82 Sep 9, 2026
9c455d2
PI Helper: Others Only is not a choice on this pool, so stop offering it
Krathe82 Sep 9, 2026
68b14c3
PI Helper: paint the Icon tile with Power Infusion, not the placeholder
Krathe82 Sep 9, 2026
3cbd051
PI Helper: sweep the leftovers from the rework
Krathe82 Sep 9, 2026
84dbb13
PI Helper: the clash warning comes back, on the effect card
Krathe82 Sep 9, 2026
6aea4a3
PI Helper: the role box is called Roles, not Triggers
Krathe82 Sep 9, 2026
1224d6b
PI Helper: disabling stashes every surface, and stops taking effects …
Krathe82 Sep 9, 2026
035a69c
PI Helper: the enable tick is a stored flag, like the rest of AD
Krathe82 Sep 9, 2026
ebdea0f
PI Helper: no stack count on a marker that can never have stacks
Krathe82 Sep 9, 2026
35e6f13
PI Helper: the icon picks its picture and what it is allowed to show
Krathe82 Sep 9, 2026
11e8d1d
Filters: a list WE seeded toggles and resets, instead of being torn a…
Krathe82 Sep 9, 2026
6893380
Filters: stamp the curated mark on a helper that already exists
Krathe82 Sep 9, 2026
670c072
Filters: the count follows the ticks
Krathe82 Sep 9, 2026
89612b8
PI Helper: four trigger sources, each a tick with its count
Krathe82 Sep 9, 2026
5496c6a
PI Helper: multiple icons, the icon's picture picked with pictures, a…
Krathe82 Sep 9, 2026
2a0d831
PI Helper: the class ticks live with the source they narrow
Krathe82 Sep 9, 2026
55be126
PI Helper: the link sits with the list it opens, and the count moves …
Krathe82 Sep 9, 2026
dd079aa
PI Helper: the button names what it edits, and the note says the model
Krathe82 Sep 9, 2026
bea8150
PI Helper: every source links to its own list, and the note is gone
Krathe82 Sep 9, 2026
8d02a33
PI Helper: the edit pencil, and the cooldowns go back in with their c…
Krathe82 Sep 9, 2026
263a19a
PI Helper: Cooldown Icons is an effect, not a layout group
Krathe82 Sep 9, 2026
f93d84c
PI Helper: the edit pencils were under the row's own hover rect
Krathe82 Sep 9, 2026
c66c781
PI Helper: Racials is a list, Icon asks which icon, and the group say…
Krathe82 Sep 9, 2026
7519036
PI Helper: the icon step leaves by an X, like every other AD picker
Krathe82 Sep 9, 2026
4cd4d52
PI Helper: the amplifier ticks reference their lists instead of copyi…
Krathe82 Sep 10, 2026
0271239
PI Helper: the icon tiles show real cooldowns instead of question marks
Krathe82 Sep 10, 2026
47b39ba
AD: one declaration of what a new layout group is
Krathe82 Sep 10, 2026
37ca7a3
PI Helper: the sound tick says "Enable" and explains itself in a tooltip
Krathe82 Sep 10, 2026
a1e2436
PI Helper: the cooldown gate says "Show when I can't infuse"
Krathe82 Sep 10, 2026
75a0568
PI Helper: the gate label is "Show when Power Infusion is on Cooldown"
Krathe82 Sep 10, 2026
0afb49c
PI Helper: the gate tooltip says "effects", in two plain lines
Krathe82 Sep 10, 2026
32db5a3
PI Helper: off the Any Buff preview, and the two icons can coexist
Krathe82 Sep 10, 2026
189819b
PI Helper: watch named players only
Krathe82 Sep 10, 2026
7d3abc0
Border animations: the blend mode is a setting, not a constant
Krathe82 Sep 10, 2026
bcef78a
PI Helper: Cooldown Icons picks its own sources
Krathe82 Sep 10, 2026
0354ed2
PI Helper: the icon group's count follows its own sources, and it is …
Krathe82 Sep 10, 2026
329ca38
PI Helper: the icon effect picks its sources too
Krathe82 Sep 10, 2026
8664b5c
PI Helper: the two icons are named apart in Active Indicators
Krathe82 Sep 10, 2026
79e9642
PI Helper: writing the trigger references invalidates the aura layout
Krathe82 Sep 10, 2026
d306df2
PI Helper: /df debug pi can see what the placed slots are carrying
Krathe82 Sep 10, 2026
5faa495
PI Helper: the gate edge arms the processor, so a placed icon clears …
Krathe82 Sep 10, 2026
97c41ed
PI Helper: a no-op for anyone who is not a priest
Krathe82 Sep 10, 2026
8b3d5e8
PI Helper: show in combat only
Krathe82 Sep 10, 2026
d56e27f
PI Helper: the gate follows a retargeted frame
Krathe82 Sep 10, 2026
9cc5e4f
PI Helper: read the LIVE designer, not the mode base
Krathe82 Sep 10, 2026
44c2be2
PI Helper: the player list is actually pushed, and the readout can se…
Krathe82 Sep 10, 2026
528ed3d
PI Helper: the gate reaches placed slots in combat, and says so in th…
Krathe82 Sep 10, 2026
68bb6de
PI Helper: the gate log separates the two lanes
Krathe82 Sep 10, 2026
a1fdbf0
PI Helper: the dead filter is the verified park lever, not an include…
Krathe82 Sep 11, 2026
5784d57
PI Helper: the player list is data, not the switch
Krathe82 Sep 11, 2026
bb60e54
PI Helper: two ticks wrote through `x and nil or y`, which always yie…
Krathe82 Sep 14, 2026
2a5810b
Retire every `x and nil or y` -- nil never wins an and/or, so y alway…
Krathe82 Sep 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
358 changes: 341 additions & 17 deletions DandersFrames/AuraDesigner/Engine.lua

Large diffs are not rendered by default.

54 changes: 45 additions & 9 deletions DandersFrames/AuraDesigner/Factory.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1643,6 +1643,11 @@ local PLACED_BORDER_KEYS = {
"BorderAnimationInset", "BorderAnimationOffsetX", "BorderAnimationOffsetY",
"BorderAnimationMask", "BorderAnimationSidesAxis", "BorderAnimationCornerLength",
"BorderAnimationProcStart",
-- ⚠ ADDED 2026-09-10 WITH THE SETTING ITSELF. Every scalar BuildSpec folds into
-- spec.animation belongs here or the border goes stale until /reload -- and this one
-- is also STRUCTURAL below, because a container button's animation groups are frozen
-- at build and cannot be retuned in place.
"BorderAnimationBlendMode",
-- Colour-source keys: not exposed by the AD border UI today (source is always CUSTOM),
-- but hashed defensively so an imported profile or a future class/role border option
-- can't leave the border stale until /reload.
Expand Down Expand Up @@ -1698,6 +1703,7 @@ local function rawBorderAnimStructTok(t, borderOn)
.. "," .. tostring(t.BorderAnimationSidesAxis)
.. "," .. tostring(t.BorderAnimationCornerLength)
.. "," .. tostring(t.BorderAnimationProcStart)
.. "," .. tostring(t.BorderAnimationBlendMode)
.. "," .. colSig(t.BorderAnimationColor)
end

Expand Down Expand Up @@ -1994,7 +2000,18 @@ local function buildPlacedStyle(indicator, isSquare, borderSpec, defs)
-- Every sibling path (square fill above, filter/debuff groups, missing badge)
-- already used 0.
local inset = borderSpec and borderArtInset(borderSpec) or 0
style.icon = { show = not hideIcon, inset = inset }
-- ★ staticSpellID: PIN THE ART TO ONE SPELL, whatever aura matched.
-- ☠ IT IS THE CONTAINER'S OWN FIELD, NOT A NEW ONE. AuraContainer's styleButton has
-- honoured iconSpec.staticSpellID since the curated-art work -- it was simply never
-- reachable from a placed indicator, because nothing wrote it onto one.
-- ⚠ WHO WRITES IT: the Power Infusion Helper, on its Icon surface, with Power
-- Infusion's own id. Its trigger is a list of other people's cooldowns and its
-- MESSAGE is "infuse this player" -- so the picture must not be whichever cooldown
-- happened to match, which is the scope objection that got Icon cut once already.
-- ⚠ NOT VALIDATED HERE. A number is what the container asks for and an unknown one
-- resolves to no texture, which is the same outcome as the field being absent.
local staticID = tonumber(indicator.staticSpellID)
style.icon = { show = not hideIcon, inset = inset, staticSpellID = staticID }
end

-- Cooldown swipe: Blizzard drives it from the matched aura's Duration object
Expand Down Expand Up @@ -2277,7 +2294,21 @@ end
-- edit. The tracked spell-ID map used to live here; it is live-tunable via
-- candidateFilters and now rides placedTuningSig.
local function placedStructSig(isSquare, hideIcon, showStacks, showDuration, borderOn, indicator, defs)
-- ⚠ DERIVED HERE RATHER THAN PASSED. Both call sites already hand over the indicator, and
-- an eighth positional argument on a seven-argument sig is how the wrong value gets passed
-- at one of two sites and nobody notices for a month. A square never binds an icon, so the
-- question only means anything on the icon branch.
local staticArt = (not isSquare) and tonumber(indicator.staticSpellID) and true or false
return (isSquare and "sq" or "ic")
-- ★ PINNED ART IS STRUCTURAL, and it is structural for a BIND-ONCE reason rather than
-- a region one. bindNative registers slot.dfIcon with Blizzard's SetIcon exactly once
-- per slot (slot._boundIcon) and skips that registration when the spec pins a spell --
-- because a bound icon is repainted from the matched aura, which is the one thing a
-- pinned picture must not do. A slot pooled from one kind to the other would keep the
-- binding decision it was created with, so the two kinds must never share a slot.
-- ⚠ THE FLAG, NOT THE ID. Changing WHICH spell is pinned only needs the texture set
-- again (ApplyStyle does that); changing WHETHER one is pinned changes the binding.
.. "|" .. (staticArt and "sa" or "")
.. "|" .. (hideIcon and "hi" or "")
.. "|" .. (showStacks and "st" or "")
.. "|" .. (showDuration and "du" or "")
Expand Down Expand Up @@ -2900,7 +2931,9 @@ local function alertCompanionCoSig(frame, indicator, isBar, alpha, defs)
"sx=" .. tostring(sx), "sy=" .. tostring(sy),
-- scale is icon/square-only (the bar has no global for it, and buildBarLayout reads
-- it raw), so this passes `defs` not `gdefs` — on a bar both resolve identically.
"sc=" .. tostring(tonumber(defOf(indicator, "scale", isBar and nil or defs, 1)) or 1),
-- (Was `isBar and nil or defs`, which always yields defs; written out so the
-- expression says what it does. Same result either way, per the note above.)
"sc=" .. tostring(tonumber(defOf(indicator, "scale", defs, 1)) or 1),
"fo=" .. tostring(defOf(indicator, "durationFont", gdefs, nil)),
"al=" .. tostring(alpha),
}, "|")
Expand Down Expand Up @@ -4428,13 +4461,16 @@ function Factory:SetHelperSoundsArmed(frame, armed, map, cfg)
-- Power Infusion back onto the priest.
if UnitIsUnit(frame.unit, "player") then return 0, "own unit (never registered, by design)" end

-- ☠ ROLE EXCLUSION HOLDS HERE TOO. The visual gate skips excluded roles at the
-- container funnel, which sound never passes through -- without this, a tank's cooldown
-- played the cue while nothing marked them: a signal with nobody to act on. Checked at
-- arm time, the same staleness window as everything else on this path.
if DF.AuraContainer and DF.AuraContainer.IsHelperRoleExcluded
and DF.AuraContainer.IsHelperRoleExcluded(frame.unit) then
return 0, "role excluded"
-- ☠ THE PER-UNIT NARROWINGS HOLD HERE TOO -- role, and now the named-player allowlist.
-- The visual gate applies them at the container funnel, which sound never passes through:
-- without this a tank's cooldown played the cue while nothing marked them, a signal with
-- nobody to act on. Checked at arm time, the same staleness window as everything else on
-- this path.
-- ⚠ ONE VERB (IsHelperUnitExcluded), not a test per narrowing, so a third one added later
-- cannot reach the visuals and miss the sound -- which is exactly how this one started.
if DF.AuraContainer and DF.AuraContainer.IsHelperUnitExcluded
and DF.AuraContainer.IsHelperUnitExcluded(frame.unit) then
return 0, "unit excluded (role or player list)"
end

local argKey, argVal = resolveSoundArg(cfg or {})
Expand Down
3 changes: 2 additions & 1 deletion DandersFrames/Features/ElementAppearance.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1885,7 +1885,8 @@ function DF:DebugADAlphaHosts(unit)
tostring(entryKey), kind,
okW and "OK" or "REFUSED", okR and "OK" or "refused",
tostring(rawequal(f, h.frame)), latched),
okW and nil or "BAD")
-- `okW and nil or "BAD"` toned every line BAD, successes included.
(not okW) and "BAD" or nil)
end
end
end
Expand Down
Loading