BrcTrainer.
Internal trainer for Bomb Rush Cyberfunk. BepInEx 5 Mono plugin with a 380px IMGUI sidebar — infinite boost, speed multiplier, fly / noclip, god mode, no heat, REP editor, time scale. Proton-safe input sampling and a GDI-private dynamic-font pipeline so menu text actually renders under Wine.
SYSTEM.TOPOLOGY
LAYER 01 / LOADER
BepInEx 5 Mono x64
winhttp.dll injection
LAYER 02 / PATCHES
HarmonyLib hooks
Player / WantedManager / BasicEnemy / GraffitiGame
LAYER 03 / TARGET
Bomb Rush Cyberfunk
Unity Mono · Reptile namespace
LAYER 04 / OUTPUT
Move · Health · Cops · Econ · World
5 tabs · 27 files · F2 toggle
Five tabs, one sidebar. Every hook is a Harmony prefix or postfix on a specific Reptile type — no memory scans, no DLL injection beyond the loader.
Infinite Boost
Harmony postfix on UseBoostChargeForBoost refunds the spend the same frame, then a per-frame keepalive pins boostCharge to maxBoostCharge so you never drop out of rocket mode.
- Postfix on Player.UseBoostChargeForBoost — instant refund
- Per-frame InfiniteBoostKeepalive MonoBehaviour backs up the refund
- Safe to toggle mid-session; refunds stop when disabled
Speed Multiplier
SpeedTweaker writes Player.runSpeedModifier every frame. Grind and skate math already respect the modifier, so the value passes through to every traversal state cleanly.
- Per-frame write from MonoBehaviour attached to the local Player
- Live slider — changes apply the next frame, no menu reopen
- Zero-friction revert when disabled (writes 1.0 once)
Fly / Noclip
FlyController disables the MovementMotor and drives player transform directly. WASD + space/ctrl for vertical — full 6-DoF movement that ignores gravity, collision, and grind surfaces.
- Motor disabled while active; restored on toggle-off
- Direct Transform.position writes, camera-relative input
- Survives scene transitions — reattaches on respawn
God Mode & No Bail
Prefix hooks on Player.GetHit and ChangeHP skip damage and cancel the bail ability entirely. Cops hit you, cars hit you, nothing sticks.
- Harmony prefix on Player.GetHit(...) short-circuits incoming damage
- Positive ChangeHP still processed so pickups still heal
- NoBailHook cancels Player.ActivateAbility(dieAbility) calls
No Heat & One-Shot Cops
Postfix on WantedManager.WantedStars pins the result to 0, so the heat gauge never climbs. One-Shot Cops prefixes BasicEnemy.GetHit to force CurHP = 1 before damage resolves.
- Postfix on WantedManager.WantedStars getter — pinned to 0
- Prefix on BasicEnemy.GetHit sets CurHP = 1 pre-damage
- Heat naturally decays when pinned; no artifact state
REP Editor
Stepped ±100 buttons (or ±1000 with Shift-click) write StageProgress.reputation directly and trigger a save. The pause-menu REP counter reflects instantly.
- Reads + writes StageProgress.reputation via SaveManager
- Shift-click bumps the step to ±1000
- Save triggered synchronously — survives quitting mid-session
Time Scale & World
Time.timeScale driven straight from config each frame. Pause menus can still override; the trainer re-asserts next tick. Plus Instant Graffiti and Unlock All On Load.
- Time.timeScale pinned every Update — slow-mo or fast-forward
- Instant Graffiti prefix skips the mini-game and calls End()
- UnlockAllOnLoad iterates Characters + Dances enums via SaveSlotData
Gamepad Navigation
Full controller support — L3 + R3 chord opens the menu (no collision with skating, BRC doesn't use stick-clicks). D-pad drives tabs and widgets under Proton-safe input sampling.
- L3 + R3 open combo — collision-free with gameplay bindings
- GamepadNav samples inputs in Update, not inside IMGUI's event loop
- Under Proton, Input.GetKeyDown for joystick buttons misfires inside OnGUI — this sidesteps it
- F2 still works for keyboard users
Getting embedded fonts to render under Proton
Two traps stack up under Proton. First, new Font(path) in Unity returns a static font — GUIStyle.fontSize silently no-ops and Unity logs "font size and style overrides are only supported for dynamic fonts" every draw. Second, even with the only size-mutable API (Font.CreateDynamicFontFromOSFont), Wine silently falls back to Arial if the family isn't visible to the host font system.
Problem
- Unity static fonts ignore GUIStyle.fontSize overrides
- Under Proton, Wine silently falls back to Arial for missing families
- AddFontResourceExW(FR_PRIVATE) works on native Windows but Wine ignores process-private registrations
- Result: menu text invisible or rendered in the wrong font under Proton
Solution
- Extract each embedded TTF to the Windows/Wine system Fonts directory
- P/Invoke plain AddFontResourceW on gdi32.dll (process-wide, not FR_PRIVATE)
- Broadcast WM_FONTCHANGE so GDI's font cache refreshes immediately
- Ask Unity for Font.CreateDynamicFontFromOSFont(familyName, size)
Font set
- Doto-{Regular, Medium}.ttf — display face
- SpaceGrotesk-{Regular, Medium, Bold}.ttf — UI body
- SpaceMono-{Regular, Bold}.ttf — monospace labels
- All embedded into the DLL as EmbeddedResource
Cross-compat
- Works on Windows native AND under Proton / Wine
- No admin rights needed — Wine prefix's windows/Fonts dir is writeable
- Tested end-to-end on the machine — no residual Arial fallback
- No manual reboot — WM_FONTCHANGE broadcast rebuilds the cache inline
How it's built
Trainer logic across 27 source files, ~3.3k lines
Mono x64 pack (winhttp.dll), NOT IL2CPP — BRC ships as Mono
Runtime method patching on Reptile namespace types
380px sidebar Quickbar, custom skin, private-registered fonts
Build target matching BRC's Unity runtime
Internals not public — reflection + cached MethodInfo for every hook
Reference-only game assemblies
Assembly-CSharp.dll, Assembly-CSharp-firstpass.dll, and Rewired_Core.dll are referenced at build time only (not redistributed). Hooks resolve Reptile types by reflection with cached MethodInfo, so trainer builds tolerate minor game updates without rebuilds.
Patch verification
VerifyPatches() enumerates every Harmony-patched method across the types the trainer targets (Reptile.Player, WantedManager, BasicEnemy, GraffitiGame, GameInput) and logs each binding — silent Harmony failures are impossible to miss.
Default hotkeys
OpenMenuKey / PanicKey / OpenHotkeysKey are rebindable through the BepInEx config file. Start is intentionally reserved — BRC uses it for its own pause menu.
Installation
Install BepInEx 5 Mono x64
Grab BepInEx_x64_5.4.*.zip from the BepInEx releases — NOT the IL2CPP variant. BRC ships as Mono. Extract it into the game directory so winhttp.dll sits next to 'Bomb Rush Cyberfunk.exe'.
Run once to seed folders
Launch the game and immediately quit. BepInEx writes its folder skeleton on first boot — you should now see BepInEx/plugins/ in the install directory.
Install the trainer
Drop BrcTrainer.dll into BepInEx/plugins/. Or use r2modmanPlus — it has BRC support, auto-installs BepInEx per profile, and accepts the zipped plugin.
Play
Launch the game. Press F2 (or L3 + R3 on gamepad) to open the sidebar. End key is the panic kill if anything misbehaves.
Get the trainer
Open source. Grab the latest DLL directly or pull the whole source and build it with dotnet build -c Release.