These files had never been tracked anywhere - they lived in a plain directory with no git at all, which is also where the whole reverse-engineering record sat. Code already committed refers to them by name (opponent_substitution.h cites "ANALYSIS.md section 6hh", DebugMenuOverlay.kt cites "DEBUG_MENU.md section 3"), so until now a fresh clone carried references to documents it did not contain. ANALYSIS.md the RE record, and the reason the rest works ARCHITECTURE.md how the mod's pieces fit together ARM64_TRANSLATION_LAYER.md the translation layer's running log PROGRESS.md chronological progress across both chats BETA_TELEMETRY_PLAN.md how crash/telemetry reporting is meant to work LOBBY_UI_DESIGN.md + .html lobby design and its clickable prototype DEBUG_MENU.md debug panel design STATIC_RECOMPILATION_FALLBACK.md the plan if translation had not panned out evidence/ font atlas capture from the glyph-corruption bug save_backups/ saves at known milestones, for reproducing state Co-Authored-By: Claude <noreply@anthropic.com>
3.4 KiB
DEBUG_MENU.md — On-map debug menu (Compose)
Living document for the in-app debug menu — a developer-only overlay for poking at mod state while testing, starting with a money editor. Split out as its own file (matching the LOBBY_UI_DESIGN.md precedent) so ARCHITECTURE.md doesn't accumulate UI-only debug-tooling detail. Update this file whenever the debug menu gains a new panel or its wiring changes.
1. Purpose and scope
Requested as a debugging aid, not a player-facing feature: a way to poke at mod/game state live on-device without rebuilding. First panel is a money editor. More debug panels are expected to be added here over time (same menu, more entries) rather than each getting its own ad-hoc overlay.
Explicit enable/disable mechanism: DebugFeatures.debugMenuEnabled (mpcore/src/main/java/nfs/mod/mpcore/DebugFeatures.kt) — a single var flag, default true during active development. GameActivityMain.onCreate only adds the debug overlay's ComposeView to mFrameLayout when this flag is true, so flipping it to false removes the debug menu from the view hierarchy entirely (not just hidden) ahead of any release build. Chosen to live in mpcore (not app) per direct instruction, so the one gate for all debug tooling stays in the shared module rather than scattered across Activities.
2. Activation — button on the map
Reuses the exact mechanism CarSelectionBadge already established (ARCHITECTURE.md §4 / LOBBY_UI_DESIGN.md §1): a ComposeView overlay added to mFrameLayout above the game's GLSurfaceView, visibility driven by GameEvents.onMapLoaded() (fires via the existing, already-proven MapTrack::HandleEvent native hook — see PROGRESS.md's dispatchMapLoaded history). No new native hook needed: the map-loaded signal already exists and already fires reliably.
DebugMenuVisibility(new, app module) — aGameEventListenerobject exposingmapLoadedas Compose state, same shape asCarSelectionStateinCarSelectionOverlay.kt.- A small floating button, bottom-end corner (deliberately opposite
CarSelectionBadge's top-start corner so the two never overlap), appears oncemapLoadedis true. - Tapping it opens the debug panel as a dialog over whatever screen is currently showing.
3. First panel — money editor (stub, not wired to real game state)
Explicit scope decision (2026-08-19, direct user answer): for now this is a stub — a plain Compose text field + "Apply" button that only updates local Compose state (DebugMoneyState.amount), logged but not written into the game's actual memory/save state. Reason: no RE work has located the player's real cash balance (getter/setter/address) yet — ANALYSIS.md/PROGRESS.md only cover CashReward (a race event's bronze/silver/gold reward definition, §6aa/6z of ANALYSIS.md), not the player's own wallet/balance. Wiring this panel to the real balance is tracked as a separate, later RE task (find where Profile/CurrentState — both named in the ISaveable family, PROGRESS.md cont. "2026-08-06" save/profile entry — actually stores the spendable cash total, then add a native setter hook), not part of this UI work.
4. Screen inventory
| Panel | State | What it does |
|---|---|---|
| Money editor | Stub | Text field + Apply button; writes to local Compose state only, no game effect yet |
More rows added here as panels are added.