From a5cb3cf7467123696dc4d4d8353cc17f76e6eb62 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 29 Aug 2026 17:21:00 +0700 Subject: [PATCH] guild charters: the registrar, the charter, and the twelve verbs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - founding a guild: fourteen opcodes, eight goldens (four mutation-checked), twelve engine globals, `GuildRegistrarFrame` and `PetitionFrame` — `CMSG_PETITION_BUY` is a 72-byte frame the server reads two fields of and drops in silence if short, `allowedGender` is the family's one u16, a signature is a 12-byte stride not 8, and `MSG_PETITION_DECLINE` writes the charter guid and reads the decliner's — same width, opposite meaning - two sessions, not one: the registrar is an NPC session (closed by walking away — its show event is one of the fourteen callers of the interact latch, so the registrar turns to face you) and the charter is bound to an item guid you carry across the city; right-clicking a charter in your bags opens it, keyed on template flag `0x2000` (item 5863 has no on-use spell and no quest, so every existing item-use arm declined it) - the byte carve came back and rescored six named guesses — three confirmed, two corrected, one refuted: `PETITION_SHOW` is deferred until every signer name has resolved (the window never paints blank rows), `ClosePetition` on somebody else's charter sends `MSG_PETITION_DECLINE` ("sends nothing" had been chosen on principle and was wrong half the time), and founding a guild is silent — no `ERR_GUILD_FOUNDER_S`, the reference emits no text at all; the four success ids go to chat and the five refusals to the red error frame, three paraphrased strings are now the shipped ones (a sweep asserts all fifteen), and the `npc` unit token had never been fed — the registrar's name banner was blank; `WOW_PROBE_CHARTER=1` drives gossip → buy → open → rename → destroy live, 10/10 Co-Authored-By: Claude Fable 5 --- .../assets/ui/GuildRegistrarFrame.xml | 346 +++++ .../benilla-app/assets/ui/PetitionFrame.xml | 389 +++++ crates/benilla-app/assets/ui/UiPanels.xml | 19 +- crates/benilla-app/assets/ui/benilla.toc | 10 + crates/benilla-app/src/capture/mod.rs | 2 + .../benilla-app/src/capture/probe_charter.rs | 1337 +++++++++++++++++ crates/benilla-app/src/dev.rs | 7 + crates/benilla-app/src/lib.rs | 6 + crates/benilla-app/src/net.rs | 59 + crates/benilla-app/src/net/apply.rs | 52 + crates/benilla-app/src/net/io.rs | 14 + crates/benilla-app/src/target/cursor_mode.rs | 9 +- crates/benilla-app/src/ui_action/drain.rs | 3 + crates/benilla-app/src/ui_items/drain.rs | 11 +- crates/benilla-app/src/ui_items/mod.rs | 89 ++ crates/benilla-app/src/ui_petition/feed.rs | 329 ++++ crates/benilla-app/src/ui_petition/lines.rs | 310 ++++ crates/benilla-app/src/ui_petition/mod.rs | 683 +++++++++ crates/benilla-app/src/ui_script/mod.rs | 6 + .../src/ui_script/petition_tests.rs | 454 ++++++ crates/benilla-app/src/ui_session.rs | 18 +- crates/benilla-app/src/ui_unit.rs | 64 + crates/benilla-protocol/src/events.rs | 37 +- crates/benilla-protocol/src/events/decode.rs | 17 + crates/benilla-protocol/src/messages/mod.rs | 8 + .../benilla-protocol/src/messages/opcode.rs | 36 +- .../benilla-protocol/src/messages/packet.rs | 45 +- crates/benilla-protocol/src/messages/parse.rs | 29 +- .../benilla-protocol/src/messages/petition.rs | 562 +++++++ .../benilla-protocol/src/world/writer/mod.rs | 1 + .../src/world/writer/petition.rs | 153 ++ crates/benilla-protocol/tests/petition.rs | 386 +++++ crates/benilla-ui/src/script/mod.rs | 7 + crates/benilla-ui/src/script/model.rs | 19 +- crates/benilla-ui/src/script/petition.rs | 692 +++++++++ 35 files changed, 6181 insertions(+), 28 deletions(-) create mode 100644 crates/benilla-app/assets/ui/GuildRegistrarFrame.xml create mode 100644 crates/benilla-app/assets/ui/PetitionFrame.xml create mode 100644 crates/benilla-app/src/capture/probe_charter.rs create mode 100644 crates/benilla-app/src/ui_petition/feed.rs create mode 100644 crates/benilla-app/src/ui_petition/lines.rs create mode 100644 crates/benilla-app/src/ui_petition/mod.rs create mode 100644 crates/benilla-app/src/ui_script/petition_tests.rs create mode 100644 crates/benilla-protocol/src/messages/petition.rs create mode 100644 crates/benilla-protocol/src/world/writer/petition.rs create mode 100644 crates/benilla-protocol/tests/petition.rs create mode 100644 crates/benilla-ui/src/script/petition.rs diff --git a/crates/benilla-app/assets/ui/GuildRegistrarFrame.xml b/crates/benilla-app/assets/ui/GuildRegistrarFrame.xml new file mode 100644 index 00000000..627dea98 --- /dev/null +++ b/crates/benilla-app/assets/ui/GuildRegistrarFrame.xml @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + this:SetFrameLevel(this:GetFrameLevel() + 2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MoneyFrame_OnLoad() + MoneyFrame_SetType("STATIC") + + + + + + + + + + + + + + + + + + + + + + + + + + + GuildRegistrar_Purchase(this:GetText()) + GuildRegistrar_RefocusChat() + + + + + + + + + this:RegisterEvent("GUILD_REGISTRAR_SHOW") + this:RegisterEvent("GUILD_REGISTRAR_CLOSED") + + GuildRegistrar_OnEvent(event) + + GuildRegistrar_OnShow() + PlaySound("igQuestListOpen") + + + + PlaySound("igQuestListClose") + CloseGuildRegistrar() + + + + diff --git a/crates/benilla-app/assets/ui/PetitionFrame.xml b/crates/benilla-app/assets/ui/PetitionFrame.xml new file mode 100644 index 00000000..8d5cac8e --- /dev/null +++ b/crates/benilla-app/assets/ui/PetitionFrame.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + this:SetFrameLevel(this:GetFrameLevel() + 2) + + + + + + + + + + + + + + + this:RegisterEvent("PETITION_SHOW") + this:RegisterEvent("PETITION_CLOSED") + + PetitionFrame_OnEvent(event) + PlaySound("igQuestListOpen") + + + PlaySound("igQuestListClose") + ClosePetition() + + + return + + + diff --git a/crates/benilla-app/assets/ui/UiPanels.xml b/crates/benilla-app/assets/ui/UiPanels.xml index 69f82084..a0c9e4fc 100644 --- a/crates/benilla-app/assets/ui/UiPanels.xml +++ b/crates/benilla-app/assets/ui/UiPanels.xml @@ -25,11 +25,11 @@ -->