Disgaea D2 · PS3 Recomp for macOS
Disgaea D2
OrigenPlayStation 3
TecnologíaRecompilación Estática (C/C++ nativo)
Disponible paramacOS
Ver proyecto oficialSobre el proyecto
Recompilación PS3 para macOS Apple Silicon con ps3recomp. El autor reporta pruebas en Mac mini M4 y combate final; no auditado independientemente.
Información oficial del proyecto
Disgaea D2: A Brighter Darkness — native macOS recompilation
A note from the human This project was built almost entirely by AI coding agents (Anthropic's Claude and OpenAI's Codex). I directed and tested it. My goal was simple: play my own copy of Disgaea D2 natively on my Mac, and maybe do some modding later.
Performance: on an M4 Mac it holds about 60 fps in battles and while exploring. It's been through a few optimization passes, and more are planned, focused on lowering CPU use and heat rather than raising the frame rate. Do what you want with this, it's just for fun since everyone else is doing this stuff. Might try to get it on android.
Status (October 2026): unmaintained. I'm stepping back. I'm happy with the copy I have installed, and I'm no maintainer — I'm just a dude using AI. I might still push a fix if I hit something, but don't expect support.
The Windows port of this project is under active development by LUUKASR1 — that's where the Windows launcher, Direct3D 12 renderer and direct-ISO work live. Issues and PRs about the Windows side belong there, not here. This repo stays the macOS port, MIT-licensed, as-is.
An unofficial, fan-made static recompilation of Disgaea D2: A Brighter Darkness (PS3, North America, BLUS31313) into a native Apple Silicon macOS app, built on ps3recomp with a Metal renderer. It is not an emulator: the game's PowerPC and SPU code is translated to native code ahead of time, on your machine, from your own copy of the game.
[!IMPORTANT] This repository contains no game code, assets, keys or saves, and none are provided or linked. You must own a legitimate copy of the game and dump it yourself. Nothing here can be played without it.
Legal disclaimer
- This is an independent, non-commercial fan project for preservation, interoperability and research. It is not affiliated with, endorsed by or sponsored by Nippon Ichi Software, NIS America, Sony Interactive Entertainment, or any of their partners.
- Disgaea, Disgaea D2: A Brighter Darkness, the characters and all related names and artwork are trademarks and/or copyrights of Nippon Ichi Software, Inc. / NIS America, Inc. PlayStation and PS3 are trademarks of Sony Interactive Entertainment. They are used here only to identify the game this software works with.
- The repository holds only original source code, build scripts and
documentation (see LICENSE). The recompiled code is generated
locally from the executable you supply, is derived from the game, and must
not be redistributed. Do not share decrypted executables, generated
port/src/recomp*/port/spu*output, built app bundles, game files or DLC/update packages, and do not open issues asking where to get them. - Do not use this project to play games you do not own. Piracy is not supported, and requests for ROMs, ISOs, packages or keys will be closed.
- Online/PSN features are not implemented and never will be; the game runs offline only.
- The cheat and item editors change your local save data only. Back up your saves before using them.
- The software is provided "as is", without warranty of any kind (see LICENSE). You use it at your own risk; the authors are not liable for lost saves or any other damage.
Status
Playable start to finish on Apple Silicon at 60 fps: story, battles, Item World, movies, music, saves (including importing retail PS3 saves) and the 1.40 update with its DLC. Native macOS menus cover graphics (1×–3× internal resolution, filter, aspect, VSync, frame cap), window, audio, controls, save import/export, a Cheats menu/window and a visual Item Editor. Known issues and current work are tracked in OPERATIONS.md.
What you need
- A Mac with Apple Silicon (M1 or newer) on macOS 13 or later, and about 2 GB of free disk space.
- Your own Disgaea D2: A Brighter Darkness (BLUS31313) disc, dumped from your own PS3 or a compatible Blu-ray drive. The RPCS3 quickstart guide explains how to dump your disc and install the PS3 system firmware from Sony.
- For the default 1.40 build: your own 1.40 update and DLC (title NPUB31321) for this game, installed into RPCS3 from packages you obtained yourself. Without them, build version 1.00 instead (see step 4).
- RPCS3 (only used to install your firmware, update and DLC, and to decrypt the game executable).
- Xcode Command Line Tools (
xcode-select --install), Homebrew and Python 3.11 or newer.
Build instructions
1. Install the build tools
xcode-select --install
brew install cmake ninja sdl2 ffmpeg glslang spirv-cross nlohmann-json python
2. Get the source and the patched SDK
git clone https://github.com/Sean13128/disgaea-d2-recomp.git
cd disgaea-d2-recomp
python3 -m venv .venv
.venv/bin/python -m pip install -r tools/requirements-lifts.txt
./tools/bootstrap_sdk.sh "$PWD/ps3recomp"
bootstrap_sdk.sh clones upstream ps3recomp at the pinned revision, verifies
the checksum of our patch and applies it.
3. Decrypt your game executable with RPCS3
- In RPCS3, install the PS3 firmware, then use File → Install Packages/Raps/Edats to install your 1.40 update and DLC packages.
- Use Utilities → Decrypt PS3 Binaries on:
- the 1.40
EBOOT.BINin RPCS3'sdev_hdd0/game/BLUS31313/USRDIR/(on macOS RPCS3 keepsdev_hdd0in~/Library/Application Support/rpcs3/); - optionally the 1.00
EBOOT.BINin your disc dump'sPS3_GAME/USRDIR/.
- the 1.40
- Copy the resulting
EBOOT.elffiles into this repository:
mkdir -p work/v140
cp "<path to 1.40>/EBOOT.elf" work/v140/EBOOT.elf
cp "<path to 1.00>/EBOOT.elf" work/EBOOT.elf # optional, for the 1.00 build
The generator checks each file's SHA256 against the supported executables in patches/LIFTS.json and refuses anything else.
4. Recompile the game code and build the app
PYTHON="$PWD/.venv/bin/python" ./tools/generate_lifts.sh --version 140
cmake -S port -B port/build -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DPS3RECOMP_DIR=../ps3recomp -DD2_GAME_VERSION=140 \
-DPython3_EXECUTABLE="$PWD/.venv/bin/python" \
-DCMAKE_{C,CXX,OBJC,OBJCXX}_FLAGS=-I/opt/homebrew/include
cmake --build port/build --target DisgaeaD2Dist
For the 1.00 build (no update or DLC needed), use --version 100 and
-DD2_GAME_VERSION=100 in a separate build folder such as port/build-100.
Generating the code takes a few minutes; the first build takes longer.
Optional: ctest --test-dir port/build --output-on-failure runs the asset-free
test suite.
5. Play
open "port/dist/Disgaea D2.app"
On first launch the app asks for your disc dump folder (the one containing
PS3_GAME) and the matching decrypted EBOOT.elf. For 1.40 it then offers
Migrate hdd0…: choose RPCS3's dev_hdd0 folder and it copies only the
update and DLC game content (never saves). Saves, settings and logs live in
~/Library/Application Support/DisgaeaD2Recomp/ and
~/Library/Logs/DisgaeaD2Recomp/. Retail PS3 saves can be imported from the
Game menu.
The built app is for you only; please don't share it (see the disclaimer).
Controls and menus
- Keyboard (click the game window first): arrows = D-pad, Z = Cross, X / Esc / Backspace = Circle, A = Square, S = Triangle, Q / W = L1 / R1, 1 / 2 = L2 / R2, Space = Start, Shift = Select. Return presses Cross and Start together. SDL2 gamepads (Xbox, PlayStation, MFi) take over automatically when connected.
- Menu bar (click the game window first; in fullscreen move the mouse to the top edge): Graphics, Window, Audio, Game, Cheats, Controls.
- F1 / ⌘⇧C opens the Cheats window; Cheats → Item Editor… opens the item editor.
- F2 flags an issue: it saves a screenshot, frame rate, map and CPU use, and
an optional note, to
flags/flags.jsonlin the Application Support folder, so you can attach it to a bug report.
Reporting issues
Open a GitHub issue with your Mac model, macOS version, game version (1.00 or
1.40), what you were doing, and the relevant F2 flag entry or
~/Library/Logs/DisgaeaD2Recomp/latest.log excerpt. Never attach game files,
decrypted executables or generated code.
Credits
- ps3recomp by sp00nznet, the recompiler and runtime this port is built on.
- The RPCS3 team, whose open research into the PS3 made this possible.
- The Disgaea modding and cheat communities for documenting the game's data.
- Third-party components and licenses: THIRD_PARTY_NOTICES.md.
Developer notes
SDK.lock pins upstream base a679051, audited local revision
(see revision in the lock), the patched Git tree and combined patch SHA256. Bootstrap clones a new
SDK, checks the checksum, checks out the exact base and applies only that patch.
It verifies the resulting tree without creating a commit. Existing destination
directories and mismatches are errors. Later SDK changes require an audited patch
re-export and lock update; local uncommitted SDK edits are not included.
LIFTS.json maps each supported ELF SHA256 to its loader,
PPU lift and SPU extraction/registration commands. It fixes
PS3RECOMP_CHUNK_LINES=50000, PYTHONHASHSEED=0 and four lifter workers. The SPU
builder invokes the SDK lifter with separate symbol prefixes and registers both
full-image and executable-segment fingerprints. No hand-edited lift is required.
CMake generates the canonical HLE NID table in the selected build directory.
Generated loader metadata goes to port/out*, PPU code to port/src/recomp*,
and embedded SPU images/code to port/spu*. Each output metadata directory
contains a generation.json receipt. Remove an old generated SPU tree before
regenerating, or use a fresh output directory.
To generate just one version or keep outputs external:
PYTHON="$PWD/.venv/bin/python" ./tools/generate_lifts.sh \
--sdk /absolute/path/to/sdk --version 100 --elf /absolute/path/to/EBOOT.elf \
--port-dir /absolute/path/to/lifts
CMake defaults to the project's ps3recomp SDK and version 140 outputs. Explicit
PS3RECOMP_DIR, RECOMP_DIR, SPU_DIR and D2_OUT_DIR overrides are preserved;
relative values are resolved against port/. For external version 100 outputs,
configure with -DD2_GAME_VERSION=100 -DRECOMP_DIR=/absolute/path/to/lifts/src/recomp -DSPU_DIR=/absolute/path/to/lifts/spu -DD2_OUT_DIR=/absolute/path/to/lifts/out and
the chosen SDK path. D2_OUT_DIR identifies generation metadata; the runner
loads the supplied ELF directly. Omit output overrides to switch between the
default version trees. Clear previously cached overrides with
-U RECOMP_DIR -U SPU_DIR -U D2_OUT_DIR to return to defaults. The 100 runner uses work/EBOOT.elf, the 140 runner uses
work/v140/EBOOT.elf; mismatched versions are rejected.
The maintained asset-free test suite also runs without any game files or configured game build. CTest reports unavailable Metal checks as Skipped (exit 77), separately from CPU passes. Test headers come from the selected SDK and editor schema; both 1.00 and 1.40 editor profiles are exercised.
macOS keys privacy grants (e.g. external-drive access) to the code signature.
Ad-hoc signatures change every build, so run tools/make_signing_identity.sh once
and import signing/d2-signing.p12 into your login keychain (command printed by
the script). Packaging then signs with that stable identity automatically, and
falls back to ad-hoc signing without it.
port/play.sh runs the build without the app bundle; port/capture.sh
captures diagnostics. See OPERATIONS.md for the development
log, findings and validation limits.
