Files
megboyzzandClaude e7c76fc2dd docs: bring 1.8 MB of project documentation under version control
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>
2026-09-22 23:29:12 +03:00

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) — a GameEventListener object exposing mapLoaded as Compose state, same shape as CarSelectionState in CarSelectionOverlay.kt.
  • A small floating button, bottom-end corner (deliberately opposite CarSelectionBadge's top-start corner so the two never overlap), appears once mapLoaded is 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.