BuffBoard-0.26.2.zip
What's new
BuffBoard — changes since 0.17.1
Seventeen releases, 0.18.0 through 0.26.2. Grouped by area rather than by
version, since most versions touched one thing and the version numbers are not
how anyone remembers a change.
---
Assignment and casting
All nine classes are assignable at all times. (0.18.0)
The blessing grid only showed classes with somebody currently in the raid, which
made it impossible to set a plan before people arrived — a paladin could not
assign anything to a class nobody had logged in as yet. Absent classes are now
dimmed toward grey rather than hidden, so they stay identifiable by class colour
while reading as not present. Only show classes present in the raid under
Display restores the old behaviour.
Auto-assign still ignores absent classes on purpose: it fills work that needs
doing, and blessing a class nobody is playing would leave the gap badge
permanently non-zero with nothing worth pressing it for.
Right-click lesser buff kept targeting the same person. (0.18.1)
With two or more members of a class, the lesser rank was cast on the first of
them repeatedly while everybody else stayed missing. The right-click reused the
target picked for the greater version, which is the first living, in-range
member of that class — correct when one cast covers everyone, wrong when it hits
exactly one person. Single-target casts now aim at somebody actually missing the
buff, falling back to the previous behaviour once everyone has it so the button
never goes dead.
In combat the aim cannot move, since secure attributes are protected. The
tooltip says so rather than silently re-buffing the same player.
Cast order is now structural. (0.24.0)
A Greater Blessing lands on every member of its class, including anyone pinned
to something else, so casting an exception first meant casting it twice. The old
sort ordered by how many people were missing a buff, which happened to give the
right answer when the class-wide gap was large and the wrong one when it was
not. Three phases now:
Broad casts — anything covering several players at once
Single target — exceptions and lesser ranks, applied on top
Reference — reactive and unmeasurable entries with no gap to fill
Where one button carries both, its corner dot is amber while the greater cast is
outstanding and green once the exception is safe to apply.
Refresh timing. (0.19.0, 0.22.0)
Replaced a free 0–15 minute slider with 10 / 7 / 5 minutes or off, defaulting to
7. Ten was most of a Greater Blessing's fifteen-minute life, so buffs sat on the
bar almost from the moment they were cast, and it flagged shields and Thorns
immediately since their duration is exactly ten minutes. Five left little margin
in a long fight.
A related bug: buffs lasting exactly as long as the cushion were excluded from
it, because the guard used a strict greater-than. At ten minutes that would have
silently dropped shields and Thorns, meaning raising the setting surfaced
fewer buffs than before.
---
Announcements
Assignments no longer reset themselves. (0.13.0, carried through)
Covered before 0.17.1 but worth restating, since it interacts with everything
below: auto-assign runs only when pressed, and fills gaps rather than
overwriting.
Announce covers one player, the one selected on the board. (0.20.0)
A full-raid dump was dozens of lines nobody read, and it is the individual who
needs telling what they owe. The button names its target and dims when that
person has nothing to send.
Two things had kept announcements broken regardless of scope. The combined
one-line-per-person format introduced in 0.17.1 produced lines long enough to
exceed chat's length limit, and an over-long `SendChatMessage` is dropped whole
rather than wrapped. Separately, `RAID_WARNING` without raid rank was rejected
silently; it now falls back to `RAID`. Every failure path reports itself in
chat.
Exceptions were announced as Greater blessings. (0.26.0)
An exception is by definition the single-target rank — that is the entire point
of pinning one player to something different — but the announcement printed
"Greater Blessing of Wisdom", telling the reader the opposite of what to cast.
Abbreviated names throughout removed the error and the repetition together, and
took a five-line announcement down to two.
Freedom, Protection and Sacrifice have their own announce button. (0.26.0)
They are cast on demand rather than maintained, so they matter to the person
holding them and rarely to the rest of the raid. Mixing them into the blessing
announcement buried the part everyone needed. Their header reads "Cooldowns"
rather than "Buffs".
Header brands the addon. (0.25.0)
"BuffBoard - Envian's Buffs:" rather than "Envian buffs:". Names ending in s
take a bare apostrophe. A paladin who pins themselves to a different blessing is
marked "(self)" in their own exceptions line, which previously read as though
they were an exception to themselves.
---
Shared duties
Salvation Remover was missing from six of the nine classes. (0.21.0)
It had been written by hand into paladin, warrior and druid and forgotten
everywhere else, so a shaman carrying unwanted Salvation had no way to drop it.
It is now injected centrally at panel registration rather than declared per
class — which is the actual fix. Hand-copying into nine files is how it drifted
in the first place, and adding the six missing copies would have left the same
trap for the next shared duty. Panels that already place the buff themselves
keep that placement.
The rogue panel is consequently no longer overview-only: rogues still provide no
raid buffs, but they carry unwanted Salvation like anyone else.
---
Layout
Sections are ordered by axis rather than declaration. (0.23.0)
Shared duties are appended after whatever a class declares, which put the
Salvation Remover below the reactive assignments and split the two self toggles
apart. Ordering by axis groups like with like on every class without each panel
having to think about it.
Buff names in the grid were unreadable. (0.21.1)
Every row rendered as "Greater Blessin..." — six blessings share that prefix, so
truncation removed the only part identifying the row. Labels now drop the shared
prefix and show the distinguishing word. Prefixes are only stripped where the
remainder still names the spell, so "Gift of the Wild" is left intact rather
than becoming "Wild".
The label column is measured, not fixed. (0.24.1, 0.26.1)
It had been sized for the longest name in the database, then for the widest
grid in the addon. Both left a paladin showing "Salvation" carrying roughly
fifty pixels of gap. The width is now measured per section using a scratch font
string in the same font and size as the real labels. A paladin's grid tightens
by about fifty pixels; a priest's "Shadow Protection" is unchanged, since it
genuinely needs the room.
Vertical space. (0.23.0, 0.23.2, 0.24.1)
A grid drew a section header directly above its own column headings — two
headers saying the same thing with a band of space between. The grid's row loop
also reported a height including a gap for a row it never drew. Section hints
reserved a fixed two lines when most are one. Together roughly seventy pixels
out of the paladin panel.
Raid list caps and scrolls. (0.19.1, 0.14.0 carried)
Eighteen rows by default, adjustable 6–30, scrolling by offset so only the
visible slice is built. Player names are indented past their class heading so a
group reads as a heading with members beneath it. The list follows the selected
player only when the selection changes, so scrolling down to read the druids
does not snap back.
Individual exception chips. (0.23.0, 0.23.2)
Icon and player name only — the buff name sat next to an icon that already
identified it, forcing both to truncate. Three per row rather than two.
The action bar stays visible with the board open. (0.23.1)
That rule made sense when the board carried its own cast buttons. Casting later
moved entirely to the bar, which left the board as a planning view with no way
to act on the plan. The bar also draws above the board now — at equal frame
strata it sat behind and appeared not to show at all.
---
Appearance
Bar background is separate from the icons. (0.16.0)
The dark around the icons is two surfaces: the panel behind them, and the ring
around each icon. They now have independent opacity, hover opacity and styling,
so the panel can drop to nothing while the buffs stay solid.
Bar background ships hidden. (0.17.0)
Opacity and hover opacity both default to 0%, style Flat. The icons carry their
own border, so the surface behind them was scaffolding rather than structure.
Background style list reworked. (0.17.0)
Three of the old textured styles were near-identical. They tinted Blizzard's
`UI-DialogBox-Background`, which is a dark near-black tileable field rather than
the light parchment of the quest and gossip frames, and vertex colour
multiplies — so tinting near-black by anything stays near-black. Now Flat,
Charcoal, Parchment, Gold, Aged, None. Real parchment needs artwork shipped in
the addon folder; the plumbing is in place.
Settings panel. (0.22.0)
Display labels ran past the column width and a note overlapped the checkbox
below it, having reserved 26 pixels for three lines of text. Labels shortened,
with the full wording moved to hover tooltips.
---
Rendering correctness
Arrows and status markers rendered as empty boxes. (0.23.0, 0.26.2)
Two separate causes with the same symptom.
The first was a character the font does not have: U+2192 in chips, so "Freedom →
unassigned" showed a box. The client's default fonts have a narrow glyph set.
The second was corrupted escape sequences, not a font problem at all. Writing
`\226\151\143` through a shell heredoc lost a backslash, and Lua's decimal
escapes consume up to three digits, so the leftover digits were swallowed into a
control character while the rest surfaced as literal letters — valid Lua that
renders as garbage. Six sites across two files, including the action bar's
removal badge.
All status markers are now plain ASCII:
State Marker
Claimed and active `+` green
Active but not claimed `~` amber
Claimed but missing `!` red
Out of range `?` grey
Removal available `X` amber
Sidebar addon-status marks use `A` for someone you may edit, lowercase `a` for
someone running the addon who has not permitted you, `-` for no addon.
Column headers collided. (0.14.0 carried, 0.21.1)
`WARRIOR` and `WARLOCK` both truncated to "WA", leaving two indistinguishable
columns. Now three letters from an explicit table.
---
Breakages shipped and fixed
Recorded honestly, since three of these reached a live raid.
0.16.1 — Lua error spam, `attempt to call a nil value`. An edit deleted more
of the icon-cell factory than intended, removing the edge textures, cooldown
swipe, status strip, badge, highlight and four methods, while six call sites
still used them.
0.16.2 — board grid icons rendered as empty black squares. The icon texture
was created but never anchored, and a texture with no anchor points has zero
size. The action bar was unaffected because it calls `SetBorderInset` on every
rebuild; the board never does.
0.23.2 — exception chips showed an icon and no name. They were moved to
their own widget pool so they could be narrower, but the refresh handler still
walked only the original pool, so their labels were never written.
Each of these is valid Lua that fails only at runtime, on whichever code path
reaches it. Four static checks now run before packaging:
Check Catches
balance syntax and block structure
method calls to methods no factory defines
anchor regions that render nothing
glyph corrupted escapes and font-unsafe characters
The method and glyph checks were each written after the corresponding bug
shipped twice.
---
Smaller fixes
Cushion note overlapping the checkbox below it (0.22.0)
Skin registration leaking on every layout, which would have grown a repaint
registry all raid (0.24.1)
`GetStringHeight` clamped, since it can return zero before layout (0.23.2)
Announce button dims when the selected player has nothing to send (0.20.0)
Checkbox tooltips, so labels can stay short enough to fit (0.22.0)
This mod has no additional files

