fix #213: complete suicide and framerate presentation
Translate suicide response 0x004A as retail's successful self-kill notice. Port /framerate onto the authored SmartBox FPS element with live two-decimal FPS and DEG values, keep diagnostic window chrome independent, and synchronize command-driven settings without discarding panel drafts. Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
parent
9ea579bdd0
commit
43f7c7807c
17 changed files with 729 additions and 39 deletions
|
|
@ -48,7 +48,7 @@ Copy this block when adding a new issue:
|
|||
|
||||
## #213 — Retail client commands were sent to ACE as chat text
|
||||
|
||||
**Status:** IN-PROGRESS — full named-retail command-family port complete 2026-07-13, pending live gate
|
||||
**Status:** IN-PROGRESS — command-family gate passed except two corrective fixes, pending re-gate
|
||||
**Severity:** MEDIUM
|
||||
**Component:** retained UI / chat commands / net
|
||||
|
||||
|
|
@ -74,6 +74,15 @@ dialog, and unknown `/` commands still publish `SendServerCommandCmd` in
|
|||
canonical `@` form so ACE administrator commands continue to work. Both chat
|
||||
backends use the same router.
|
||||
|
||||
**Corrective pass (2026-07-13):** The first connected gate passed all other
|
||||
representative commands and exposed two presentation gaps. Suicide success
|
||||
arrives as WeenieError `0x004A`; it now resolves to retail's informational
|
||||
"Ack! You killed yourself!" instead of the raw numeric fallback. `/framerate`
|
||||
now mounts and toggles SmartBox LayoutDesc `0x2100000F` element `0x10000047`,
|
||||
showing the live `FPS` and `DEG` values with the authored font and two-decimal
|
||||
format. `/framrate` remains unknown because retail registers no misspelled
|
||||
alias.
|
||||
|
||||
**Research:**
|
||||
`docs/research/2026-07-13-retail-client-command-routing-pseudocode.md`;
|
||||
`docs/research/2026-07-13-retail-client-command-families-pseudocode.md`;
|
||||
|
|
@ -85,7 +94,9 @@ backends use the same router.
|
|||
server-backed commands execute without appearing as speech: `/loc`,
|
||||
`/framerate`, `/saveui test`, `/loadui test`, `/age`, `/friends`, `/afk on`,
|
||||
and `/marketplace`. `/ls now` shows local usage and sends nothing. An ACE
|
||||
command such as `/ci 629 1` still works.
|
||||
command such as `/ci 629 1` still works. `/die` ends with the retail success
|
||||
text rather than a raw error code, and exact `/framerate` toggles the two-line
|
||||
in-world SmartBox readout.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -501,7 +501,7 @@ behavior. Estimated 17–26 days focused work, 3–5 weeks calendar.
|
|||
- **M2 held-object parenting shipped and live-gated 2026-07-11.** The combat toggle now ports `GetDefaultCombatMode` over ordered equipped contents, so a bow requests Missile instead of the old hardcoded Melee. CreateObject preserves parent/placement/timestamp fields, `0xF749` ParentEvent is handled, and `EquippedChildRenderController` renders the weapon as a separate child composed from the animated hand part + holding frame + child placement frame. Live gate passed: bow selected missile stance, rendered in-hand, followed animation, unequipped cleanly, and melee remained correct. App Release builds with zero warnings; the full 4,765-pass / 5-skip suite is green. AP-111 is retired; research: `docs/research/2026-07-11-combat-default-and-parent-event-pseudocode.md`.
|
||||
- **M2 local attack receive funnel implemented 2026-07-11; live gate pending.** Retail `ExecuteAttack` only sends the request; ACE chooses the concrete melee/missile action and returns it in a non-autonomous mt-0 `UpdateMotion`. The local branch now runs that state through the same constructor-defaulted `MoveToInterpretedState` funnel and 15-bit action-stamp gate as remotes, then applies sticky/long-jump tails. The old local-only direct `Commands[]` replay is deleted. Shared conversion lives in `InboundInterpretedMotionFactory`; research: `docs/research/2026-07-11-local-combat-motion-pseudocode.md`.
|
||||
- **M2 basic retail combat bar implemented 2026-07-11; corrective live visual gate pending.** Production mounts authored `gmCombatUI` LayoutDesc `0x21000073`, shows it only for Melee/Missile, and routes mouse plus keyboard through one `CombatAttackController`. Corrections include the authored wider centered dark-red child range (accepted IA-20), full-width left-to-right bright live attack-charge feedback, exact Speed-left/Power-right justification, silent control-only `AttackDone(ActionCancelled)`, target-frame Keep in View with manual orbit, and persistent corpse motion: the AP-80 velocity-only NPC adaptation can now replace only Ready/Walk/Run, never authoritative Dead/actions. `CombatTargetController` ports the selection-cleared AutoTarget consumer, so a selected creature's authoritative Dead motion clears it and selects the nearest eligible creature when enabled. The 2026-07-12 replacement-corpse correction unifies both multi-frame and static/reactive spawns behind retail's CreateObject lifecycle: apply the wire's Dead state while detached, then `MotionTableManager::HandleEnterWorld` strips Ready→Dead links before the first in-world tick; multiple corpses remaining fallen passed the live user gate that day. Follow-up #205 makes the toolbar read the final canonical selection after a reentrant Auto Target notice and restricts automatic candidates to hostile non-player monsters (intentional PK-edge divergence IA-19); that live gate also passed 2026-07-12. Research: `docs/research/2026-07-11-retail-combat-bar-pseudocode.md`, `docs/research/2026-07-11-combat-target-camera-pseudocode.md`, `docs/research/2026-07-12-death-and-auto-target-pseudocode.md`; AP-24/AP-95 retired, AP-80 narrowed, AP-110 narrowed, AP-112 records the remaining attack-start and exact trained-Recklessness seams.
|
||||
- **Retail client command families implemented 2026-07-13; live gate pending.** One shared typed catalog now separates retail client actions from ACE administrator commands for both chat backends. Named-decomp ports cover recall/house/PK travel; age/birth; framerate, lock, version, location, corpse, and die confirmation; clear plus named/automatic UI layouts; AFK/consent; emotes; friends; squelch/filter/message types; and fill-components. App owns execution, Core owns authoritative friends/squelch state, Core.Net owns exact UIQueue/ControlQueue packets, and confirmation requests mount imported LayoutDesc `0x2100003C`. #L.6 is closed; TS-31/TS-47 are narrowed. Research: `docs/research/2026-07-13-retail-client-command-families-pseudocode.md`.
|
||||
- **Retail client command families implemented 2026-07-13; corrective live gate pending.** One shared typed catalog now separates retail client actions from ACE administrator commands for both chat backends. Named-decomp ports cover recall/house/PK travel; age/birth; framerate, lock, version, location, corpse, and die confirmation; clear plus named/automatic UI layouts; AFK/consent; emotes; friends; squelch/filter/message types; and fill-components. App owns execution, Core owns authoritative friends/squelch state, Core.Net owns exact UIQueue/ControlQueue packets, and confirmation requests mount imported LayoutDesc `0x2100003C`. The first live gate passed the family except for raw suicide-success code `0x004A` and the title-bar-only FPS presentation; the correction maps retail's text and mounts SmartBox element `0x10000047` with live two-decimal `FPS`/`DEG`. #L.6 is closed; TS-31/TS-47 are narrowed. Research: `docs/research/2026-07-13-retail-client-command-families-pseudocode.md`.
|
||||
- **✓ SHIPPED — Character window** (`LayoutDesc 0x2100002E`, `CharacterStatController`, 2026-06-26, same branch). **Visually user-confirmed 2026-06-26 — Attributes tab reads as retail.** Three tabs, header (name/heritage/PK), large-gold level number (dat font, `largeDatFont` 18px), "Total Experience (XP):" + "XP for next level:" captions, 9-row attribute list (icons + right-aligned values + Health/Stamina/Mana vitals), click-to-select (top/bottom selection bars + footer State-B "{Attr}: {value}" / "Experience To Raise: Infinity!" + affordability-gated raise triangles), centered footer. User noted "still needs some polish for later" — deferred to Issue #158.
|
||||
- **✓ SHIPPED — D.5.4 — Client object/item data model (foundation).** Shipped 2026-06-18 (`b506f53`..`a33e897`, 11 commits). Renamed `ItemRepository`→`ClientObjectTable` / `ItemInstance`→`ClientObject`; broadened the table to hold EVERY server object (retail `weenie_object_table` shape). `CreateObject` is now the canonical merge-upsert (`ClientObjectTable.Ingest`, retail `SetWeenieDesc` semantics) via a new Core.Net `ObjectTableWiring` (off GameWindow); `DeleteObject` evicts; `PlayerDescription` is a membership manifest (`RecordMembership`); live container-membership index (`GetContents`, retail `object_inventory_table`). `_liveEntityInfoByGuid` retired (selection/describe resolve from the one table). Root fix: the old enrich-existing-only `EnrichItem` dropped `CreateObject`s for items with no `PlayerDescription` stub — live-Coldeve 4/6 hotbar slots blank; items are now created, not dropped. **Crux resolved:** retail is TWO tables (`object_table` + `weenie_object_table`), NOT one — acdream's `WorldEntity` (3D system) + `ClientObjectTable` (data/UI) split was already architecturally faithful; the fix was the ingestion path, not a table unification. 2671 tests green.
|
||||
- **Roadmap correction (2026-07-10):** the completion order is now the architecture-first campaign in `docs/superpowers/plans/2026-07-10-retail-ui-fidelity-completion.md`. Retail `gmToolbarUI` is object-only: preserve `ShortCutData.index_`, `objectID_`, and `spellID_`, but do not invent spell glyphs on this bar. `PlayerModule::favorite_spells_[8]` feeds separate spell bars.
|
||||
|
|
|
|||
|
|
@ -484,7 +484,7 @@ include dungeons.
|
|||
automatic candidates to hostile non-player monsters; live gate passed
|
||||
2026-07-12. See
|
||||
`docs/research/2026-07-12-death-and-auto-target-pseudocode.md`.
|
||||
- **Retail client command families (implemented 2026-07-13; live gate pending)** —
|
||||
- **Retail client command families (implemented 2026-07-13; corrective live gate pending)** —
|
||||
both chat surfaces now route a named-decomp command catalog into an App-layer
|
||||
controller, keeping ACE administrator verbs on the explicit server-command
|
||||
path. The implemented set covers travel, character/time queries, local UI and
|
||||
|
|
@ -492,6 +492,9 @@ include dungeons.
|
|||
friends, squelch/filter, and fill-components, with exact Core.Net messages and
|
||||
authoritative social-state parsing. See
|
||||
`docs/research/2026-07-13-retail-client-command-families-pseudocode.md`.
|
||||
The first connected gate passed the family except for raw suicide success
|
||||
code `0x004A` and the incomplete title-bar-only FPS toggle; the corrective
|
||||
pass maps retail's success text and mounts the authored SmartBox FPS element.
|
||||
- **L.1b** — Command router + motion-state cleanup (prereq for L.1c).
|
||||
|
||||
**Freeze on landing:**
|
||||
|
|
|
|||
|
|
@ -14,6 +14,12 @@ cross-check.
|
|||
- `ClientCommunicationSystem::DoMarketplace @ 0x0056FCE0`
|
||||
- `ClientCommunicationSystem::DoLockUI @ 0x005703B0`
|
||||
- `ClientCommunicationSystem::DoFrameRate @ 0x005707D0`
|
||||
- `gmSmartBoxUI::UpdateFPSMeter @ 0x004D63A0`
|
||||
- `gmSmartBoxUI::RecvNotice_SetFramerateDisplay @ 0x004D65E0`
|
||||
- `gmSmartBoxUI::UseTime @ 0x004D6E30`
|
||||
- `ClientCommunicationSystem::DoDie @ 0x00580050`
|
||||
- `ClientCommunicationSystem::DieDialogCallback @ 0x0057BA70`
|
||||
- `CM_Character::Event_Suicide @ 0x006A1B00`
|
||||
- `ClientCommunicationSystem::DoPKArena @ 0x005788D0`
|
||||
- `ClientCommunicationSystem::DoPKLArena @ 0x005789D0`
|
||||
- `ClientCommunicationSystem::DoAge @ 0x0057C5A0`
|
||||
|
|
@ -104,7 +110,18 @@ framerate(arguments):
|
|||
if arguments: display local usage
|
||||
else:
|
||||
show_framerate = !show_framerate
|
||||
notify UI so the display changes immediately
|
||||
notify gmSmartBoxUI
|
||||
if enabled:
|
||||
resolve UIElement_Text 0x10000047 from LayoutDesc 0x2100000F
|
||||
show it and update it immediately
|
||||
else:
|
||||
hide it and clear the active FPS-display pointer
|
||||
|
||||
smartbox_use_time():
|
||||
if the FPS-display pointer is active:
|
||||
update the display with two-precision values:
|
||||
"FPS: {Render.GetFramerate():F2}"
|
||||
"DEG: {active_degrade_multiplier:F2}"
|
||||
|
||||
lockui(arguments):
|
||||
if arguments: display local usage
|
||||
|
|
@ -113,6 +130,29 @@ lockui(arguments):
|
|||
broadcast the UI-lock state change
|
||||
```
|
||||
|
||||
The two-line template is portal string-table entry `0x0DCFFF73` in table
|
||||
`0x23000001`; its authored text fragments are `FPS: ` and `\nDEG: `. The
|
||||
display is the exact 128×36 SmartBox text element at `(1,1)`, using font
|
||||
`0x4000001A`. Retail registers only the exact command name `/framerate`;
|
||||
`/framrate` is not an alias.
|
||||
|
||||
```text
|
||||
die(arguments):
|
||||
if arguments: display local usage
|
||||
else:
|
||||
show the authored local confirmation dialog
|
||||
if accepted: send parameterless game action 0x0279
|
||||
|
||||
suicide_response(weenie_error):
|
||||
if code == 0x004A:
|
||||
display "Ack! You killed yourself!"
|
||||
```
|
||||
|
||||
`0x004A` is an informational success response, despite arriving through the
|
||||
WeenieError message family. Retail's own error-string table contains that exact
|
||||
text; exposing the numeric fallback makes a successful `/die` look like a
|
||||
failure.
|
||||
|
||||
```text
|
||||
query_age_response(name, duration):
|
||||
if name is empty: display "You have played for {duration}."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue