Map markers say when a quest wants a group #46

Manually merged
mdoorn merged 6 commits from feat/046-map-markers-say-when-a-quest-wants-a-group into master 2026-07-03 13:07:26 +02:00
Owner

Map markers say when a quest wants a group

Along the way:

  • Specify the five class files nobody has written yet
  • One reader for a quest's tag, asked when the box opens
  • The party list stops stacking, over-cropping and crowding the name
  • The Escape menu is drawn by the addon, not just added to
  • Messages float in from an edge, hold, and go

Touches 32 files: docs/CHANGELOG.md, docs/README.md, scripts/check.sh, scripts/harness/client/02-text.lua, scripts/harness/client/08-blizzard.lua, scripts/harness/client/09-group.lua and 26 more.

Map markers say when a quest wants a group Along the way: - Specify the five class files nobody has written yet - One reader for a quest's tag, asked when the box opens - The party list stops stacking, over-cropping and crowding the name - The Escape menu is drawn by the addon, not just added to - Messages float in from an edge, hold, and go Touches 32 files: `docs/CHANGELOG.md`, `docs/README.md`, `scripts/check.sh`, `scripts/harness/client/02-text.lua`, `scripts/harness/client/08-blizzard.lua`, `scripts/harness/client/09-group.lua` and 26 more.
Author
Owner

Room was already the measure; Headed calls it and no longer measures anything itself. The tooltip calls Room directly.

`Room` was already the measure; `Headed` calls it and no longer measures anything itself. The tooltip calls `Room` directly.
mdoorn approved these changes 2026-07-03 08:30:00 +02:00
mdoorn left a comment

Markers saying a quest wants a group is a thing the client knows and never shows. One note.

Markers saying a quest wants a group is a thing the client knows and never shows. One note.
@ -0,0 +335,4 @@
return true
end
local function Headed(buttons)
Owner

Headed measures, writes the title and reveals, three jobs behind one name. The measure is the half the tooltip is going to want.

`Headed` measures, writes the title and reveals, three jobs behind one name. The measure is the half the tooltip is going to want.
tvidal approved these changes 2026-07-03 10:53:57 +02:00
tvidal left a comment

Nothing from me. The group flag comes off the quest log rather than off a name match, which is the part I checked.

Nothing from me. The group flag comes off the quest log rather than off a name match, which is the part I checked.
Hovering a marker named the thing, the quest and the count and never said the
quest was elite, so the map could not answer the question it is opened with:
is this a walk I can make alone. The word is on the quest log's own row beside
the level and was on nothing the map drew, and finding out on arrival costs the
walk back from the graveyard.

Asked through Questie's QuestieDB.GetQuestTagInfo rather than the client's own
call. Questie caches it, which matters over a zone that can hold two hundred
and fifty markers against an API the client throttles, and it corrects the
quests Blizzard has tagged wrongly, which is a list this addon has no business
keeping a second copy of. The word printed is whatever comes back, so Elite,
Dungeon, Raid and the rest need no table here; an ordinary quest is tagged with
nothing and gets no line.

It sits at the right edge of the quest line, where the log prints it. A marker
whose heading already carries the quest name puts the tag on a line of its own,
because that is the half of the line not already said, and a marker with no
quest behind it asks for a tag on a nil id and gets the coordinate alone.

The section is nine lines over the 800 and is allow-listed with the reason the
other five carry: the column, the picture, Questie's markers and the gestures
over them are one window under one zone fixture, and splitting them copies the
map tree, the standing position and the icon frames three ways.

Gated in a scratch worktree cut from HEAD rather than here: another session is
mid-refactor on the role icons and its three failures are the whole of the red
in this tree. check.sh over HEAD plus these four files is 0 warnings, 0 errors,
every harness run ok.
Items 53 to 59. Nine classes and twenty-seven builds, four files on disk
covering four classes and twelve builds, so the five missing files are one item
each and the stance row's second reader is the item under them.

Four things are settled once at the top rather than argued in each item. A class
file is facts and it is one file, additive for eleven of the twelve fields.
The twelve fields and who reads each are already listed in Class/Warrior.lua,
eight about the class and four about the build, and the caps on the cooldown
row, the rotation line and the upkeep row are asserts that fire at login. No
item carries a spell id: every id is baked from Wowhead at implementation and
read back by name, which is what one letter of Deep Wound already cost. No item
writes a bar plan or guesses a signature, for the reason Shaman.lua and
Priest.lua already refuse to.
"Elite" was read in Map/Pins.lua and drawn on the map marker alone. It is a
fact about the walk rather than about the quest text, and three boxes name the
same quest: the marker hover, the creature hover out in the world and the line
under a quest's name in the log. A word off a different call in each is three
answers that disagree the day Blizzard tags one wrongly. So the read moves to
Quests/Where.lua beside the finisher and the places, and Quests/Drops.lua draws
it at the right edge of its name line in the same two colours the map uses.

The first ask about a quest always answers nothing, because the client's own
call does and Questie says so in its wrapper. Lines written when a marker was
placed therefore said "Elite" on the second visit to a zone and not on the
first. Map/Pins.lua now hands UI/Chart.lua a function instead of a table, and
the pin calls it when the tooltip opens: the paint warms Questie's cache and the
hover reads it back. The objective count comes along for free and is live, so
three more kills while the map is up show without a repaint. A caller with
nothing to defer still passes a table and pays nothing.
Three faults, all of them visible on one screen.

A party that logged in already grouped came up as a staircase, each tile a
block right and a block down of the one before it. SecureGroupHeaders writes a
child's anchor without clearing the one it wrote last time, and every attribute
write on the header arranges it again, so the pass that ran on the write of
showParty left a TOP anchor on every button that the LEFT written a line later
could not reach. The shape attributes now go in before the switch that draws
the list, and Adopt clears a tile that has ended up pinned by two corners.
09-group.lua stops clearing before it writes, because the client does not, and
clears on the children it stops showing, because the client does.

The role art was cut on a 75 pixel grid, which is Blizzard's own number in
GetTexCoordsForRole and is a window wider than the cell. On Anniversary the
overspill lands on empty sheet; on Era there is art there, and a tile came out
as one role icon with a sliver of two more beside and under it. The pitch is
67 with 66 pixels of art in it, which is what Details and DetailsFramework both
cut this file on.

The role square was drawn at the full height of the health bar, a third of a
120 pixel tile, and a five letter name came out as "Rando...". Seven tenths of
the bar now, floored to a whole pixel with a floor of eight under it so a raid
cell keeps a square you can tell a shield from a sword in, and sat on the bar's
midline at its left end: a short square hung off the tile's corner leaves a
wedge of bare fill under it that reads as a second gauge.

The Region stub keys its anchors by corner, which is how the client holds them.
Appending both left a stale anchor in front of the live one and a party frame
with a stale anchor passed every check in the suite.

02-text.lua and 39-party-raid.lua were each pinned at their own line ceiling, so
the three new gates cost prose elsewhere in both files rather than a higher
number. No assertion came out. 02-text.lua landed a line under its ceiling and
the ceiling follows it down.

Feature.lua and Panel.lua still said partySelf ships off. It has shipped on
since it was written.
One WarriorKit button at the foot of the client's game menu had stopped wearing
Blizzard's art, because the window it opens is painted in this addon's greys and
a gold button is a poor door onto it. What that bought was a flat grey rectangle
under nine red ones on a parchment frame, which reads as stapled on.

So the menu is ours. Core/MenuSkin.lua takes Blizzard's art off the frame, off
the border box inside it and off every button in it, lays the kit's panel
underneath with a title bar carrying whatever heading the client's menu had, and
gives every button the fill, the hairline, the hover and the font every other
control in the addon has.

Nothing moves. Not one of Blizzard's buttons is anchored, resized or relevelled,
for the reason already at the head of Core/Menu.lua: this column is laid out
again on every show, on the newer flavours after our own hook, so a placement of
ours comes undone in front of you. Paint survives that with nothing behind it.

Nothing of Blizzard's is called either. Every button keeps its own OnClick, so
Logout is still Blizzard's Logout off Blizzard's button. That is why this is a
skin and not a menu of our own: a menu of our own would have to make those calls
itself, and the two that matter are the two an addon may not make.

/wk menu on|off and one check box on The screen. Off puts every region hidden
back on the screen and every string back into the font it was wearing, in one
call. The button itself gets no switch: it is the way into the settings, and a
switch that hides the way in is one nobody can find their way back to.

The harness fixture grows the art it never had, in all three places a real menu
keeps it, and section 34 gates the walk in both directions, twice over for
idempotence, plus the title bar refusing to draw where there is no room.
Nothing in this addon moved before this. Every part that looked like it did was
a bar being resized on a ticker, which is a number being drawn rather than an
animation, and the difference shows the moment something has to arrive
somewhere it was not.

Ck/ is a library, written to know nothing about WarriorKit so that lifting it
out later is a change to one line and to the two TOCs. Ck/Animations.lua is the
engine: a tween is a frame, a duration, an easing and up to two channels, and
one with neither channel is a timer, which is what a message resting on screen
is. Not the client's own animation groups, for three reasons written at the head
of the file; the one that decided it is that a group hands back nothing that
says where the frame currently is, and every reflow here has to start from
wherever the last move got to.

Ck/Float.lua is the first thing built on it. A lane owns the column: the order,
the slots, the stagger, and the climb when the top message goes. The two offsets
are measured against different things on purpose, one from the screen's edge and
one from its centre, and both are resolved per message so a lane written once is
right on every monitor.

Feeds/Floats.lua is the caller. It reads CHAT_MSG_LOOT through ns.LootLine, the
same door Feeds/Loot.lua uses, and answers to its own switch: a drop the feed's
quality chips have filtered out is still a drop worth seeing float past.

Two things the harness found that reading would not have. The stagger books each
message a beat after the last one was booked, so a burst larger than the column
can hold queues beats for messages that will never be shown: a bag's worth of
loot was three hundred deep and twenty six seconds behind. The queue is now
capped at the time it takes the column to fill, and the column itself is capped
at five, oldest out. And the guard on a moving write is not a formality: a
coordinate snapped to a whole pixel repeats itself whenever the frame is
travelling under a pixel a frame, and a message crossing three pixels over two
hundred frames writes three anchors rather than two hundred.

The tick arms on the first tween and gives the OnUpdate back on the frame the
last one lands, so a session with nothing moving pays nothing.
mdoorn manually merged commit 00c424da05 into master 2026-07-03 13:07:26 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
northgale/warriorkit!46
No description provided.