# Crash Bandicoot 2 Recompiled

> **An unofficial, non-commercial fan project.** Not affiliated with,
> authorised or endorsed by Activision, Naughty Dog or Sony Interactive
> Entertainment. Crash Bandicoot is a trademark of Activision Publishing, Inc.
> **No game data is distributed here — bring your own disc.**

The PlayStation game *Crash Bandicoot 2: Cortex Strikes Back* translated to
native code and run directly, rather than emulated. A launcher takes a disc
image you already own, builds the game on your machine, and runs it.

> **Work in progress.** The game is completable from start to finish, but there
> are still minor sound and graphical issues. Treat this as a preview rather
> than a finished release, and expect rough edges.

**This project contains no game data.** No game code, audio or disc content is
distributed here. You supply your own disc image; everything derived from it is
produced locally and never leaves your machine. 

---

## What you need

| | |
|---|---|
| Windows | 64-bit, 10 or later |
| A disc image you own | `.cue` with its `.bin` alongside, or a `.chd`. The build targets the North American release, serial `SCUS-94154`. |
| Disk space | About 3 GB while building; roughly 100 MB once built |
| Time | Five to twenty minutes for the first build, once |

No PlayStation BIOS is required. OpenBIOS, a free MIT-licensed replacement, is
included.

## Getting started

1. Run the launcher.
2. Open **Setup** and choose your disc image. It is checked for complete
   tracks, whole sectors and the boot serial, then hashed.
3. Press **Build the game**. This translates the game to C and compiles it.
   Live output appears below the progress bar.
4. When it finishes, the **Play** page is ready.

Settings apply on the next launch. If the game is already running, the Play
page tells you to relaunch.

## While playing

| Key | |
|---|---|
| **Home** | Pause menu: restart, display options, quick save/load, and live lives/Aku Aku assists. On a controller, Guide or Start+Select. |
| F5 / F9 | Quick save / quick load |
| F7 | Save state slots |
| F8 | Rewind |
| Tab | Fast-forward: hold it, or set it to switch on and off |
| F | FPS counter |
| Alt+Enter or Ctrl+F | Fullscreen |
| Keypad + / - | Volume |

These are the defaults. **Settings > Input > Hotkeys** changes them, and the
same page sets the fast-forward speed.

What you change in the Home menu - display options, POST FX, the FPS
counter, the assists - and with the volume keys is kept for the next launch,
and the launcher's settings show it. Switching to another window pauses the
game behind the Home menu; Settings > Input can turn that off.

## Saves

Saves live in `userdata/`, next to the launcher. The **Saves** page shows the
twelve save-state slots with a picture of each. **Play from here** starts the
game and loads that slot, and a slot can be deleted. The page also backs up
the memory cards, which hold the game's own saves, and restores a backup; a
restore first backs up the cards it replaces.

## Controls

**Settings > Input** remaps both the keyboard and the controller for player 1.
For a controller, click a PS1 button and press the button you want; each PS1
button can have two. Press-to-assign hears Xbox-compatible controllers; any
other pad (a PlayStation controller without Steam Input, say) is assigned from
the list and still works in the game. Names are positions: A is the bottom
face button on every pad, Cross on a PlayStation controller. The stick deadzone
is set there too.

The keys that work while playing - pause menu, quick save, fast-forward and
the rest - are under **Hotkeys** on the same page. A hotkey can use Ctrl, Alt
or Shift, and the page warns when one is also a game button.

## Video

**Settings > Video** sets internal resolution, aspect and output, and has a
**Post-processing** card: anti-aliasing (FXAA or SMAA), sharpening, colour
controls, bloom, vignette, film grain, and *Smooth dithered art*, which
softens the checkerboard dithering painted into many textures. The Authentic
preset leaves all of it off; Enhanced turns on SMAA and light sharpening. The
Home menu's **POST FX** row switches it on and off while you play, so you can
compare.

The renderer is OpenGL by default. **Direct3D 12** draws the same picture
through Direct3D 12 - the same renderer built for the other API - for systems
whose OpenGL driver misbehaves. If it cannot start, the log says so and the
game runs on OpenGL.

**Widescreen.** A 16:9 (or 14:9) *Gameplay aspect* widens the view. Crash 2's
levels were made for 4:3, so the wider the view, the more objects and scenery
can pop in at the sides; the Enhanced preset's 14:9 reaches half as far as
16:9.

## Mods

The **Mods** page lists what is installed, switches individual features on and
off, and exposes whatever settings each one declares. Four enhancements ship
with the launcher and appear once the game has been built:

| | |
|---|---|
| **PGXP Precision** | Sub-pixel vertex precision and perspective-correct texturing, so polygons stop wobbling and large floor textures stop warping. Needs internal resolution 2x or higher to see. |
| **Fast Loading** | Speeds up the wall-clock pacing of loads. Nothing the game can observe changes, but it does run faster while a load is detected. |
| **CD Speed** | Shortens loads by dividing the emulated drive's sector delay. Unlike the above this changes *when* the game receives CD interrupts, so raise it gradually. |
| **Bezel Artwork** | Draws an image of your choosing in the letterbox or pillarbox margins. |

All four are off by default. Changes apply on the next launch.

To add one, press **Install a .psxmod...** and pick the file. It is checked
before anything is written, so a package with an unexpected layout is refused
rather than half-installed. If a selection cannot work, the page says so before
you launch rather than leaving you to read an error on startup.

## Frame rate

**Settings -> Performance has an experimental, opt-in 60 FPS mode.** It runs
Crash 2's own game loop at 60 instead of 30 - a real change to how the game
executes, not a smoothing filter on the picture. Once enabled it stays at 60
rather than dropping you back to 30.

It is off by default and is a preview. World movement keeps the correct speed
(the engine already scales motion by measured frame time and this reuses
that), but scripted sequences, cutscene pacing, music and sound timing, bosses,
vehicle levels and FMV transitions have **not** been verified across the whole
game. It also runs the emulated PlayStation processor at 200% so a busy frame
can fit into one screen refresh, which is the furthest this gets from how the
console behaved.

While the game runs, the Play page says whether 60 is holding and, if not,
which of two limits you are hitting, because they need opposite responses. If
the machine is behind on *drawing* the frames, lower **Internal resolution** on
the Video page - at 5x the renderer draws twenty-five times the pixels of
native and running at 60 doubles that again, so it is usually what runs out
first. If instead some frames in a scene need longer than one refresh,
internal resolution will not help; that is the emulated console running out of
time inside the frame.

If something behaves strangely, turn it off and see whether the problem goes
away - that is a useful thing to report. It changes timing, not saved data.

## Assists

**Settings > Cheats** offers **Keep 99 lives** and a **Damage** setting with
three positions, all off by default:

| Damage | |
|---|---|
| Off | normal rules |
| Keep 2 masks | Aku Aku is held at two, so a hit is always absorbed |
| No damage | Crash is held in the invincible state the gold Aku Aku mask uses |

**No damage** permits everything that mask permits - it simply does not lapse
after fifteen seconds. It does not stop falls, crushing or drowning, does not
make enemies die on contact, and switches itself off during the attract-mode
demos. Because it holds an invincible state permanently, a scripted sequence
that expects Crash to be interruptible could in principle stall; if you meet
one, drop to *Keep 2 masks*.

These change saved progression: lives and masks are written to the memory card
as you play, so switching an assist off stops further writes but cannot undo
values already saved. The Home menu has the same switches: they apply at once
and are kept, while launcher choices apply on the next launch.

## If something goes wrong

The **Log** page captures everything the game prints, and has a **Save to
file** button. If the game crashes, the launcher says so and brings that page
forward. Attach the saved log to any bug report.

**Sound crackles.** Settings → Audio → Latency → Safe.

**The game will not start.** Confirm the build finished on the Setup page. If
it did not, the log there records why.

## Developer mode

Settings → Performance → Developer mode reveals an **Advanced** page holding
measurement tools: a TCP debug server, interpreter fallbacks, audio path
overrides and tracing. They exist to investigate bugs and most of them make
the game slower or worse. They stay switched off, and unreachable, unless you
turn this on.

It also shows **120 FPS (developer preview)** under the 60 FPS switch. It runs
the game loop at 120 - physics every 120 Hz refresh, while scripted animation
and music keep their normal speed - with the emulated processor at 400%. In
play it reached 120 only in bursts, fell back to 60 the rest of the time and
stuttered when it did hit 120, so it is not offered in normal play, and it
does not apply with Developer mode off even if it was ticked.

On the Video page it adds two widescreen previews, which likewise do nothing
with Developer mode off:

- **Widescreen mode.** **Squash** (the normal mode) is light on the GPU.
  **Native-wide** draws real extra columns and looks sharper, but uses far more
  GPU memory at high internal resolution. Both show the same scenery: the game
  tests every polygon against its 4:3 screen, and in native-wide the runtime
  widens that test to the columns actually on screen.
- **Object range.** Crash 2 creates enemies, crates and platforms at points
  along the camera path chosen for the 4:3 view. This creates them a little
  earlier and keeps them a little longer for the wider view, never across a
  point where the game loads or unloads the data those objects use.

## Legal

An unofficial, non-commercial fan project. Not affiliated with, authorised or
endorsed by Activision, Naughty Dog or Sony Interactive Entertainment. Crash
Bandicoot is a trademark of Activision Publishing, Inc.

Licences:

- **psxrecomp**, the recompiler and runtime: PolyForm Noncommercial 1.0.0.
  Free to use and share for any non-commercial purpose. Selling it, or
  bundling it with anything commercial, is not permitted.
- **OpenBIOS** (PCSX-Redux): MIT. Shipped as `bios/openbios.bin`; the notice
  is in `bios/OpenBIOS.LICENSE` and must travel with it.
- **SDL3**: zlib licence.
- **Qt / PySide6**: LGPL v3. The Qt libraries ship as separate files and may
  be replaced.

Dumping a disc you own for personal use is permitted in some countries and not
in others. Check where you live.

---

## Building from this repository

The launcher is the supported route. Directly:

```
python launcher/main.py           # needs Python 3.11+ and PySide6
_build/build_clang.ps1            # builds the runtime, both trees
```

Runtime changes are made in the gitignored vendored tree at
`_build/Crash2Recomp/psxrecomp/` and recorded as patches in `tuning/patches/`,
with the reasoning in `tuning/NOTES.md`. Read `tuning/NOTES.md` before changing
anything in the runtime: it records what has already been tried, what was
measured, and which theories were disproved.

Tests:

```
python launcher/test_settings_coverage.py   # every setting has a control
python launcher/test_ui_smoke.py            # the UI builds and its paths run
```
