Repository navigation
Releases: ollidiemaus/wayscribe
Releases · ollidiemaus/wayscribe
Release list
0.0.6
Wayscribe
0.0.6 (2026-10-12)
Full Changelog Previous Releases
- Merge pull request #15 from ollidiemaus/0.9-duels
Track duels: day entries, a Duels tab and a Your Year card - Track duels: day entries, a Duels tab and a Your Year card
Each finished duel is a DUEL entry: the opponent (from the StartDuel hook
when the player challenges, or looked up among nearby units when they are
challenged), their class and level, who won, a flight, a duel to the
death, where and how long. The winner comes from the client's own result
line, parsed through its global strings, so every language works; a
declined challenge or someone else's duel leaves nothing.
The journal gets a Duels tab between Maps and Your Year (shown while the
tracker is on, /ws duels): all duels with the record by class and the
latest ones, then each opponent with every duel against them. Your Year
gets a Duels card with the result, the rival, the nemesis and the
easiest and toughest class. Entries have a new PvP filter category.
The duel log's string parsing moved to Compat (FormatToPattern,
ParseGlobalString), next to new helpers for nearby players and class
names. Turning a tracker on or off now fires SETTINGS_CHANGED, so the tab
follows at once. - Merge pull request #14 from ollidiemaus/duel-trace
Log raw duel events in developer mode - Log raw duel events in developer mode
Research for a duel tracker. The game says who won a duel only in a
system chat line, and Forever may hide that line from addons; its names
also carry surnames. In developer mode, Compat/DuelTrace.lua prints every
duel event with its raw values (secret ones as ) and keeps the
last 200 lines in WayscribeDB.duelTrace; /ws duellog shows them again. - Merge pull request #13 from ollidiemaus/recap-day-playtime
Show the playtime of the recap's day, not of the last session - Show the playtime of the recap's day, not of the last session
The login recap dated the previous session by its start but showed that
session's length. It now shows the day the session ended and everything
played that day up to its end, earlier sessions that day included.
0.0.5
Wayscribe
0.0.5 (2026-10-11)
Full Changelog Previous Releases
- Merge pull request #12 from ollidiemaus/maps-empty-divider
Hide the maps page divider while the page is empty - Hide the maps page divider while the page is empty
The right page's divider under the dungeon name was always drawn, so with
no maps it ran through the second line of the empty-page text. It now
shows only when a dungeon is open, like the Notes tab's empty page. - Split the architecture doc into one file per section
ARCHITECTURE.md had grown to 100 KB. It now keeps the principles, the
layers and an index; every other section lives in docs/architecture/,
with §4 and §6 split further (backup, notes, footsteps). Section numbers
are unchanged, so the code's citations still resolve through the index.
The repository layout now lists the dungeon map files and tools/.
0.0.4
Wayscribe
0.0.4 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #11 from ollidiemaus/0.8-dungeon-maps
Wayscribe 0.8 Dungeon maps: plan and the first four dungeons - Bring the README up to date
The README gains the dungeon maps: what the Maps tab shows and how the
fog lifts, /ws map and its key binding, the dungeons covered so far,
the setting that hides them, and that a backup brings them back. Your
Year is now the journal's last tab, not its third. Good to know also
says why the maps lift room by room, and that the journal can't be
used in Forever's controller mode. - Let players hide the dungeon maps
Some players want the game without maps. A new setting, Show dungeon
maps (on by default, its own section in the settings), hides the Maps
tab, makes /ws map and its key binding say how to turn the maps on,
and hides the "Charted ... completely" entries in the journal and the
login recap. The tracker keeps noting the rooms reached, so the maps
are complete when they're shown again; its own toggle under Tracking
still stops that.
Record types can now declareshown, a function that hides their
entries while a setting says so; the records stay. The journal lays
its tabs out on every refresh so the ones after Maps close the gap.
The map strings move out of the middle of the notes strings, and an
unused one goes. - Add dungeon maps for four dungeons
Forever has no dungeon maps, so the journal gets a Maps tab between
Notes and Your Year with Wayscribe's own, under fog that lifts room by
room: the game gives no position inside instances, so arriving, a boss
reached (a wipe counts) and a named area are what lift a section.
Data/Charted.lua saves only those triggers per character (the backup
carries them) and back-fills them from runs and kills already in the
journal; Trackers/DungeonMaps.lua notes them and writes "Charted ...
completely" once a whole map is found. The map draws the client's
tiles by file ID with fog over the cells not found yet, fades a
section out when it's found, and unfolds across both pages. /ws map
and a key binding open it inside a dungeon.
The data covers Ragefire Chasm, Wailing Caverns, the Deadmines and the
Hall of Thanes for now; the in-game checks are in ingame-tests.md. - Add the dungeon map generator
tools/dungeonmaps/build.py writes StaticData/DungeonMaps.lua from what
the client and public data already hold: retail's map tables name the
tiles of each old dungeon map (the files are in Forever's build), the
minimap tiles of Forever's own instances stand in where there's no art,
and boss and entrance spots come from retail's encounter journal or
AzerothCore's spawn positions (coordinates only). Each floor is cut
into sections by walking distance to those spots on a 64-column grid.
dungeons.py holds what can't be looked up. Downloads and review pages
stay in an ignored cache; the packager leaves tools/ out. - Plan dungeon maps with fog of war
Forever has no dungeon maps, but the client still holds the map art
retail drew for the old dungeons (by retail's file IDs), and the
minimap tiles of its new instances such as the Hall of Thanes. Addons
get no position inside instances, so docs/dungeon-maps.md plans a fog
that lifts room by room (entrance, bosses reached, named areas),
kept per character and readable outside the dungeon, with the
phases, the in-game proof lines, the risks and the open decisions.
The roadmap points to it.
0.0.3
Wayscribe
0.0.3 (2026-10-09)
Full Changelog Previous Releases
- Merge pull request #10 from ollidiemaus/minimap-icon
Bolder small icon, centered on the minimap and in the Addon Compartment - Center the minimap icon and use it in the Addon Compartment
LibDBIcon picks its Classic layout because Forever's WOW_PROJECT_ID is
18, not Mainline's, but Forever draws the Mainline ring, so the icon
sat up and to the left of the opening. On Forever the button now gets
the layout of Blizzard's own button in that ring
(WorldMapTrackingPinButtonTemplate): border 54 px, dark disc 25 px at
(3, -4), icon 20 px at (7, -6).
The bolder icon is renamed IconSmall (Theme.ICON_SMALL) and is now the
TOC's IconTexture as well, so the Addon Compartment and the addon list
show it too. Icon.tga stays the journal's portrait and the Your Year
card. Compat's comment about Forever's WOW_PROJECT_ID is corrected (18
since build 70235). - Give the minimap button a bolder icon
The minimap button draws its icon at 17-18 px inside a round border,
where Icon.tga's blue margin, vignette and frame left the parchment a
small patch and the trail and compass mere specks.
Media/MinimapIcon.tga (64x64, 32-bit, source Media/MinimapIcon.svg,
not packaged) redraws it for that size: parchment and quill fill the
ring, outlines are thicker, the trail is a thick dashed line, and the
compass, frame and grain are left out. Theme.MINIMAP_ICON names it for
the LibDataBroker launcher; Icon.tga stays the TOC icon, the journal's
portrait and the Your Year card. - Merge pull request #9 from ollidiemaus/0.7-notes
Wayscribe 0.7 Notes: your own notes and map markers - Let a note hold places as /way lines
A note's places are now the /way lines in its text, in the notation
websites share waypoints in (TomTom's: /way [zone | #uiMapID] x y
[label]). One note can hold many places, e.g. Forever's Hidden Books
pasted from a website (docs/ARCHITECTURE.md §4.9, §7.9).- Every /way line is a marker with the note's icon; its label shows in
the tooltip. A line without a zone takes the zone of the /way line
above, else the player's, and leaving the note writes that zone into
the line (Notes:FillZones, also at logout). - Zone names are the client's own (C_Map.GetMapChildrenInfo) and the
English ones from StaticData/Zones.lua (UiMap.db2, build 70235), so
an English list works on a German client; "#1411" names a map by ID. - Alt+click and /ws mark start a note whose text is the spot's /way
line. Notes from the test build with a single place get theirs as a
/way line at login. - /way is not a chat command: in chat it belongs to TomTom and others.
- The note's subtitle counts its places and the /way lines whose zone
isn't known.
In-game results on build 70291 are in docs/ingame-tests.md,
docs/forever-probe.md and §12 row 14: Alt+click works in and out of
combat with the popup in front of the map (strata MEDIUM), and the
game's own map pin is on.
- Every /way line is a marker with the note's icon; its label shows in
- Add Wayscribe 0.7 Notes
The player's own notes, in the journal and on the world map
(docs/ARCHITECTURE.md §4.9, §7.9, 0.7). Everything else Wayscribe keeps
is recorded for the player; this is the first place to write something
down yourself.- A marker is a note with a place: one kind of thing, one list, one
editor. Notes live per character in WayscribeCharDB.notes
({ seq, list }) with their own write path, Data/Notes.lua. They are
not records: they can be edited and deleted, and nothing is derived
from them, so rollups, firsts and Your Year stay as they are. The
table is optional, so there is no schema change. - A Notes tab between Journal and Your Year (UI/NotesView.lua): the
notes newest first under New note, the open note written onto the
page (title, when and where, text). Every keystroke is saved; a note
left blank is dropped. Read-only journals can be read, not edited. - Markers on the world map (UI/NotesMap.lua), a data provider of its
own at the default map's waypoint pin level, with the eight raid
target icons. Alt+click on a zone or continent map names a new note
in a popup; /ws mark [title] marks where the player stands. Hover
shows the note, a click opens it in the journal; Show on the map
opens the map at a note. The map button's menu and Settings > Notes
hide them. - Backup and safety: the backup copies the notes with meta and state
(a snapshot, so edits during a backup stay out) and counts them in
its header. A journal with notes isn't "empty", so a restore never
replaces them. The canary counts the notes' seq, so a journal that
held only notes is still guarded when its file doesn't load. Reset
deletes them. - The text export lists the notes written in its range after the days;
/ws stats counts them; /ws probe reports the map click handler, the
map's strata and Forever's map pin game rule.
362 tests pass on Lua 5.1 and 5.5, among them backup and restore of
notes and markers into a journal that didn't load. In-game checks are
in docs/ingame-tests.md under "Notes and markers".
- A marker is a note with a place: one kind of thing, one list, one
- Record that addon windows can't join Forever's controller mode
In controller mode the journal can't be focused ("There is no interface
window to focus"): the default UI's frame manager only knows windows
from ShowUIPanel or FrameShown, and an addon can't read the controller
itself (EnableGamePadButton is protected). A test build that called
FrameShown for the login recap could be navigated, but every focus
change raised "Wayscribe has been blocked from an action only available
to the Blizzard UI", and closing the recap with the controller froze
the client. The manager and SmartNavigation run tainted once an addon
window is in them, and they call protected functions on focus changes.
The code was withdrawn (kept in a stash); ARCHITECTURE §12 row 13
records the result for build 70245.
0.0.2
Wayscribe
0.0.2 (2026-10-07)
Full Changelog Previous Releases
- Merge pull request #8 from ollidiemaus/journal-close-in-combat
Close the journal with its X button in combat - Record that the journal closes with its X in combat
Checked in game: with a fight going on, the X closes the journal. - Record the journal's map link check
Show on the map opens the map in front of the journal at the day's zone,
showing only that day, and the map button says Today again after the
map is closed. - Close the journal with its X button in combat
A friend's report: in a dungeon fight the journal closed with Escape
but not with the X. The default UI's close button calls HideUIPanel,
which since the Mainline engine does nothing for an addon in combat
("We no longer allow addons to show or hide UI panels in combat",
UIParentPanelManager.lua on build 70245) and prints "Interface action
failed because of an AddOn" once per session. Escape hides the frame
directly through UISpecialFrames, so it kept working.
The X button now hides the frame directly too, for the portrait frame
and the plain-border fallback. The test stubs give the template's
close button the client's behaviour, and InCombatLockdown. - Merge pull request #7 from ollidiemaus/forever-surnames
Name Forever players with their surnames - Record that Forever's surnames are confirmed in game
/ws probe on client build 70245 shows has.surnames = true, and the
character is now saved as "Scoopz Scoopz" on realm "Classic Beta PvE"
instead of "Scoopz" on realm "Scoopz". Companion names in a group run
and the repair of an older entry are still open in-game checks. - Name Forever players with their surnames
On WoW Forever, UnitName and UnitFullName return a character's first
name and surname where other clients return the name and the realm.
Wayscribe stored the surname as the realm, so dungeon entries and the
companions card named players by their first name only.
Compat.has.surnames is set when UnitName("player") returns a second
value (it never returns the player's own realm elsewhere). With it,
names are "First Surname", other players' realms are left out, and
the player's realm comes from GetRealmName. Players saved by older
versions get their surname joined back at login, in writable journals
only, and the missing-journal guard accepts a canary in the old form.
0.0.1
Wayscribe
0.0.1 (2026-10-07)
Full Changelog Previous Releases
- Merge pull request #6 from ollidiemaus/custom-icon
Give Wayscribe its own icon - Record the icon's in-game checks
The new icon shows in the addon list, on the minimap button, in the
Addon Compartment, as the journal's portrait and on Your Year's first
card. Also verified: with /ws dev off, Your Year says the year opens
on December 1. - Give Wayscribe its own icon
A quill drawing a dotted route on a parchment scrap replaces the
default UI's book icon (INV_Misc_Book_09). Media/Icon.tga is the
texture (128x128, 32-bit), Media/Icon.svg its source, left out of the
package. Theme.ICON names it once for the minimap button, the
journal's portrait and the Your Year overview card; the TOC's
IconTexture points at the same file. - Describe the release setup as it is
CurseForge project 1731716 and GitHub Releases, no Wago; the tag
becomes the version. The setup steps are done, so the docs list what
the workflow relies on instead of what is still to do. - set version from tag
- dropped wago support
- updated toc
- Regroup the in-game tests by feature
Shorter checks in a do-then-expect form for a tester who doesn't know
the addon, grouped by area instead of by release, with the open ones
first and the verified ones as a short list at the end. - Clean up the architecture document
Describe the addon as built instead of as a plan: drop the per-release
tags, fix claims the code never matched (ns.Defer, DAY_CHANGED, strict
validation in dev mode), split the UI table into sections, condense the
backup measurements, and group the decisions by topic. Section numbers
stay, since code comments cite them. - Write the README for players and move developer notes to docs
The README now describes the addon from a player's view, so it can also
serve as the CurseForge description. Tests, lint, the in-game setup,
developer commands and the release steps move to docs/DEVELOPMENT.md. - Merge pull request #5 from ollidiemaus/0.6-backup
Wayscribe 0.6 Backup: a restorable backup string - Log what the guards find as warnings, not errors
The missing-journal restore worked in game (2026-10-07): the warning
at login, the popup, and after the reload the journal and trails were
back without /ws accept. But with developer mode on, BugSack showed
"schema: missing" at login: the guard's own log entry, forwarded like
an error.
What the guards find in the saved data (missing, renamed, foreign,
newer, corrupt, and a pasted backup the addon can't take) is the
player's situation, not a bug, so it goes to /ws log only (Log:Warn).
A migration that throws stays an error. The missing and renamed
entries now say what they found ("missing: the account file counted
42 entries"). - Record the 0.6 backup, refusal and reset-and-restore checks
/ws backup matched /ws stats, a backup pasted into the same character
was refused, Reset followed by a restore brought everything back, and
the Settings buttons open the same windows (2026-10-07). The restore
of a journal that didn't load, the release's exit criterion, is still
open in game. - Record the in-game paste of a long backup
The third build pastes the 365-day sample (2,474,487 characters) back
in 2.8 s and checks it in 1.2 s; 7 and 30 days take 0.1 s and 0.2 s.
In line with the size, as the model predicted: one string is enough,
without splitting by year or compression. §4.8, the 0.6 decisions and
a new §12 row record it; the clipboard checks are ticked. - Collect a pasted backup from OnChar into a 32-byte field
The second in-game test: a field without a limit took 3.3 s for 49,899
pasted characters and 55.6 s for 205,724, the square of the size. The
client inserts a paste one character at a time and works through
everything the field holds for each one, about 2.6 ns per character
held; the same figure explains the first build's 28.3 s with 4,000
bytes held, leaving about 1 us for the OnChar call itself.
So the restore field holds only 32 bytes and the paste is collected
from OnChar again, in chunks of 4,096 characters instead of one table
of millions (0.14 s for the 2.4 MB sample in plain Lua). It is read on
the next frame; text that reached the field without OnChar is read
from the field. Expected in game: about 2.5 s for the sample. - Read a pasted backup in one piece, in one-line fields
The first in-game test with the 365-day sample (2,474,487 characters):
the backup was made and shown in 3.7 s and copied out whole, and the
check took 1.2 s. But the multi-line box drew nothing of the 2.4 MB
string until clicked, and collecting the paste from OnChar (a
4,000-byte box, the WeakAuras way) delivered every character yet took
28.3 s: about 11 us per character, one script call each.- Backup and restore use a one-line field; the export keeps its
multi-line box. - The restore field has no limit and no script per character: once a
frame the window asks how many letters it holds, reads them with
GetText in one piece and empties the field. - What was found is shown in white, and below it what a restore would
do: green when it can, red with the reason when it can't, so the
disabled button (on purpose for a sample) always has its reason
next to it. - Developer mode prints how long the backup took to make and to show.
- The in-game results in docs, and a stepwise paste test (7, 30 and
365 days) for the new field.
- Backup and restore use a one-line field; the export keeps its
- Add Wayscribe 0.6 Backup
A restorable backup of the character's facts as one string, copied out
through the clipboard and pasted back (docs/ARCHITECTURE.md §4.8, 0.6).
It closes the gap the missing-journal guard can't cover: every saved
file gone, or a new computer.- Format: WSB1:, a header (versions, character, counts, the payload's
length and Adler-32), then the payload. A small serializer for plain
data: a tag per value, the codec's zigzag varints, strings defined
once and referred to by number, base64 for bytes outside the
alphabet. Only the codec's 64 characters after the magic; whitespace
an editor adds is ignored. Round-tripped in plain Lua 5.1 and 5.5. - Only facts go in: rollups, firsts and the rollup version stay out and
are rebuilt on restore. The trails are optional. - A backup is a snapshot of its first frame: it is built in a coroutine
at 10 ms per frame, so meta, state and players are copied first and
later records are left out. The session being played ends with it. - Restore decodes and checks everything first, runs the journal and
trails through the same migrations and shape checks as a saved file
(Schema:PrepareCharacter / PreparePaths), then says what it would do.
The journal goes only into one with no entries or one the
missing-journal guard stopped (missing, renamed); what a journal
without entries recorded since login is replaced, and the
confirmation says so. Trails go along, or on their own into missing
or empty trails. Read-only data is never written over. Another
character's backup takes this character's identity. Then the caches
are rebuilt, the trackers stopped, the tables swapped in
(Schema:SwapIn), the canary stamped and the UI reloaded. - Windows next to the text export: Back up journal (selected for
Ctrl+C, With footsteps) and Restore backup (a paste collected from
OnChar into a 4,000-byte box, a status line, a confirmation popup).
/ws backup, /ws restore and two Settings > Data buttons; the
missing-journal warnings point at /ws restore. - /ws backup sample [days] (developer mode): the backup of a made-up
year, never stored, to time the clipboard in game; it can be checked,
not restored. Developer mode prints how long backup, paste and check
took. - Measured on a very active simulated year (14,600 entries, 3,650
trails): 1.06 MB without trails, 2.5 MB with; made in 0.37 s, checked
in 0.26 s in plain Lua. One string, no compression for now. - The exit criterion's unit test: a simulated year survives backup,
Reset and restore with the same facts, caches and Your Year cards. - enUS and deDE strings, docs, README and the 0.6 in-game checklist.
- 318 tests (was 289), all passing on Lua 5.1.5 and 5.5; luacheck clean.
- Format: WSB1:, a header (versions, character, counts, the payload's
- Plan the 0.6 backup
The missing-DB guard can't help when every saved file is gone, and the
0.5 text export can't be restored. A new §4.8 plans a backup string of
the character's facts (journal, optionally trails; caches rebuilt on
restore) in the codec's alphabet with a checksum, and restoring it
only into an empty or missing journal, through the same migrations and
build-then-swap as a loaded file. §4.6 points at it; the roadmap gets
a 0.6 row with its exit criterion. - Merge pull request #4 from ollidiemaus/0.5-your-year
Wayscribe 0.5 Your Year: yearly recap cards, share of Azeroth walked, journal export - Record the 0.5 in-game results and probe
The 0.5 probe on build 70235: C_Map.GetMapChildrenInfo lists 50 zone
maps (Kalimdor...