From 45c964dbf0e5e9b7aed346e8c66ef53d043cc919 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 21 Aug 2026 15:26:20 +0200 Subject: [PATCH] =?UTF-8?q?docs(journal):=20plan=20Campaign=20QJ=20?= =?UTF-8?q?=E2=80=94=20the=20two=20tabs=20QT=20deliberately=20left=20inert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Journal tab is not a quest feature at all: it is a per-character notebook, entirely client-side, with no wire and no dat content. Each page holds a label, a title, notes, a recorded location and a countdown timer, and the Page List tab is a searchable index over them. It shares the panel with Contracts and nothing else — retail's own naming, not a mix-up here. The file format is recovered whole, including the detail that a journal file which does not open with is REFUSED with its own error string, and the authored max lengths (16 label / 32 title / 2048 notes) that the edit boxes enforce. One authored fact worth recording before anyone reads the layout as a bug: the running-timer readout shares x=84 with the three day/hour/minute fields. That overlap is the data form of ShowEditableTimer versus ShowRunningTimer — the strip is either three editable numbers or one running readout, never both. Co-Authored-By: Claude Opus 5 --- docs/plans/2026-08-21-journal-campaign.md | 99 +++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 docs/plans/2026-08-21-journal-campaign.md diff --git a/docs/plans/2026-08-21-journal-campaign.md b/docs/plans/2026-08-21-journal-campaign.md new file mode 100644 index 00000000..33e8e419 --- /dev/null +++ b/docs/plans/2026-08-21-journal-campaign.md @@ -0,0 +1,99 @@ +# Campaign QJ — the Journal and Page List tabs + +**Status:** ACTIVE 2026-08-21. Completes the panel Campaign QT mounted: QT +shipped the Contracts tab and left the other two inert by design. + +**Scope:** retail's `gmJournalUI` (element type `0x10000048`, page +`0x10000563`) and `gmPageListUI` (type `0x10000049`, page `0x10000564`). + +## What this actually is + +A **per-character notebook**, entirely client-side. No wire, no server +involvement, no dat content — the player writes the pages. Each page carries a +label, a title, free-form notes, a recorded LOCATION, and a countdown TIMER. +The Page List tab is a searchable index over those pages. + +Nothing about it depends on quests; it shares the panel with Contracts and +nothing else. That it is called "Journal" while the panel is also called +"Journal" is retail's own naming, not a mistake here. + +## Measured ground truth + +### The file format + +`gmJournalUI::SavePages @0x00497270` / `LoadPages @0x00496AC0`. A plain tagged +text file, `fopen` mode `w+`. Both call sites pass the literal prefix +`"Journal"`; the path template is `%s%s-%s-%s.txt`, i.e. +`{dir}Journal-{server}-{character}.txt`. + +``` + begins a page (a file that does not open with one is refused) + %d page number + %s label (authored max length 16) + %s title (32) + %s notes (2048) + %d timer days + %d timer hours + %d timer minutes + %f recorded location + %f +