mxbmrp3

AI Development Context for MXBMRP3

Read This First

This is a racing simulator HUD plugin for MX Bikes (motocross game). It’s a DLL plugin written in C++ using the game’s proprietary API.

For deep technical details: See ARCHITECTURE.md (comprehensive documentation with mermaid diagrams, component descriptions, dependency graphs). This file is a quick-start guide.

Quick Architecture

MX Bikes Game Engine
    ↓ (callbacks via plugin API)
plugin_manager.cpp (entry point)
    ↓
PluginData (singleton - caches all game state)
    ↓ (notifies on data changes)
HudManager (singleton - owns all HUD instances)
    ↓
Individual HUDs (IdealLap, Standings, Map, etc.)
    ↓ (build render primitives)
Game Engine (renders quads/strings)

Key Singletons:

Build & Test

⚠️ IMPORTANT - Build Environment:

Build Instructions (Windows only):

Important Patterns & Constraints

DO:

DON’T:

Design Decisions (Don’t “Fix” These)

Singletons Everywhere Required by plugin API - we get one global entry point, everything branches from there.

Lambdas in settings_hud.cpp rebuildRenderData() Intentional - they capture local layout state. Alternatives were worse (passing 8+ parameters).

Public member variables on HUDs (e.g., m_enabledRows) These are configuration data, not encapsulated state. SettingsHud needs direct access.

HUDs don’t cache raw game data HUDs pull fresh from PluginData on rebuild - they only cache formatted render data (m_displayEntries, m_quads, m_strings). This enforces PluginData as single source of truth and prevents synchronization issues.

Widget vs HUD Distinction Widgets (TimeWidget, PositionWidget, LapWidget, SessionWidget, SpeedWidget, SpeedoWidget, TachoWidget, BarsWidget, LeanWidget, NoticesWidget, VersionWidget, SettingsButtonWidget) are simplified HUD components with:

Full HUDs (StandingsHud, LapLogHud, PitboardHud, TimingHud, etc.) have:

Handler-to-API Event Mapping Each handler corresponds to specific MX Bikes API callback(s):

No unit tests Requires game engine to run. Manual testing in-game is current workflow.

Common Tasks

Adding a New HUD

  1. Create class inheriting from BaseHud (.h and .cpp files in mxbmrp3/hud/)
  2. Add files to Visual Studio project:
    • mxbmrp3/mxbmrp3.vcxproj - Add <ClInclude> for .h and <ClCompile> for .cpp
    • mxbmrp3/mxbmrp3.vcxproj.filters - Add filter entries to place files in Header Files\hud and Source Files\hud
    • Without these entries, the build will fail with linker errors (LNK2019 unresolved externals)
  3. Implement rebuildRenderData() - builds vectors of quads/strings
  4. Register in HudManager constructor (add pointer, getter, initialize in initialize(), null in clear())
  5. Add tab in SettingsHud for configuration
  6. Add save/load in SettingsManager

Debugging Rendering Issues

Working with Game API Events

When implementing event handlers or debugging timing/lap data:

Files You’ll Likely Need

Core:

HUD Base:

Example HUDs:

Settings:


Git & Development Workflow

Commit Message Conventions

Branch Naming

Version Management

Development Style