A standalone macOS app that serves as a memory trainer for the Steam version of Magical Princess. Its own Dock icon and window — no Terminal, no scripts. Live display / edit / freeze of game stats.
macOS only — Apple Silicon (M1/M2/M3/M4, arm64). This is NOT a Windows trainer.
- Standalone app: native window with full traffic-light buttons (minimize / zoom / close), Dock icon, Cmd-Tab entry
- 37 stats in 9 categorized sections: Resources / Status / Karma / Physical / Intellect / Charm / Sense / Levels / EXP
- Edit values directly (Enter to apply), check Lock to freeze a value (enforced every 0.25 s by the in-game service)
- Quick actions: Refill AP, Clear Stress, +100 Skill Pt
- Speed hack: type a multiplier (0.1–10×) and check Boost — locks
Time.timeScaleviail2cpp_runtime_invoke, re-enforced every 0.25 s (overrides in-game pause) - On Top toggle: keep the window floating above other apps
- Multilingual UI: Simplified Chinese / Traditional Chinese / English — auto-detects macOS language, one-click cycle in the title bar (remembered)
- Field offsets resolved dynamically from IL2CPP metadata at runtime — resilient to game updates
- Zero-config: auto-locates the game (including custom Steam library folders), auto re-signs on first run, auto-injects and launches the game for you
- Apple Silicon Mac (M1/M2/M3/M4 — the game binary is arm64)
- macOS 12 Monterey or later
- Magical Princess on Steam (tested on v1.3.0)
- Download & extract: unzip, then move
MagicalPrincessTrainer.appinto Applications (recommended — avoids macOS App Translocation running it from a randomized path) - First-launch approval (one-time): double-click → "macOS cannot verify…" → OK (do not Move to Trash) → System Settings → Privacy & Security → Security → Open Anyway → Open. Approved forever after
- Automatic setup: the app locates the game (any Steam library) → re-signs it ad-hoc (first run, ~30s) → launches it → waits for the trainer service (~15s). The status line shows each phase live until connected
- Edit stats: after loading a save — type a value and press Enter; check Lock to freeze; quick buttons: Refill AP / Clear Stress / +100 Skill Pt; On Top toggles window floating
- Window: native traffic lights (minimize / zoom / close); click the Dock icon to bring it back; Launch Game button (top bar) starts or reconnects the game anytime
- Issues: click Log (top-left) → attach
trainer.logto a GitHub Issue
After a Steam game update: just relaunch the trainer app (it re-signs automatically). Play in windowed mode.
- The app re-signs the game with
get-task-allow& friends (one time), then spawns it withDYLD_INSERT_LIBRARIESpointing at a tiny service dylib inside the app bundle - The in-game service resolves
PersistentSingletonMonoBehaviour<MyData>.instance→MyData.status→BasicStatusDatavia theil2cpp_*C API (raw registry scan as fallback), then performs pure raw-memory reads/writes on the game's main thread only (crash-free by design) - The app talks to the service over a Unix domain socket (
/tmp/MagicalPrincessTrainer.<uid>.sock): poll values, set, lock - Field offsets are resolved dynamically per game build — no hardcoded offsets
Logs: trainer.log in the game folder — attach it when reporting issues.
- Where is
trainer.log? Click the Log button (top-left of the trainer window) — it reveals the file in Finder. Manually: Finder → Go → Go to Folder →~/Library/Application Support/Steam/steamapps/common/Magical Princess/trainer.log(custom Steam library:<library>/steamapps/common/Magical Princess/trainer.log) - Panel shows "game not running" forever: send
trainer.logto Issues - Trainer stops working after Steam "verify integrity": expected — the stock signature was restored, just relaunch the trainer app
- Gatekeeper warning: the project is open source; you can also build it yourself (below)
cd trainer
./build.sh # produces dist/MagicalPrincessTrainer.appMaintainer / release workflow: see DEVELOPMENT.md.
For offline single-player research and learning only. Do not use in any online/leaderboard context. Back up your saves before editing; use at your own risk.
