Skip to content

Supported Engines

Sakura runs games on two separate engine frameworks under the hood: a classic engine (NScripter/ONScripter) and ONScripter-RU, a GPU-accelerated fork used by newer, more demanding titles like Umineko no Naku Koro ni.

EngineDisplayed AsBadgeUsed For
NScripter / ONScripter (Shift-JIS)ONScripterNScrClassic Japanese-encoded games
NScripter / ONScripter (UTF-8)ONScripterNScrUTF-8 fan translations and repacks
ONScripter-RUONScripter-RURUGPU-era games such as Umineko

The two classic variants are an encoding difference, not a different engine — both show up in your library as “ONScripter,” with the encoding (Shift-JIS or UTF-8) surfaced separately in the game’s Details chips.

When you import a game, Sakura scans its files to figure out which engine it needs — you never have to choose manually unless you want to. Detection works like this, in order:

  1. script.file present → ONScripter-RU. This is the packed script name ONScripter-RU uses; the classic engine never produces a file with this name, so it’s a reliable signal on its own.

  2. A fonts/ folder plus a 0.txt → ONScripter-RU. Some repacked RU games ship a plain 0.txt, but the mandatory fonts/ subfolder alongside it is the tell — classic games never bundle one.

  3. Loose boot scripts → classic ONScripter:

    • 0.txt / 00.txt → Shift-JIS
    • 0.utf / 0.utf.txt / 00.utf / 00.utf.txt → UTF-8
    • nscr_sec.dat / nscript.___ / nscript.dat → Shift-JIS
    • pscript.dat → UTF-8

    (If a game somehow ships both a Shift-JIS and a UTF-8 marker, Shift-JIS wins.)

  4. Archive-only imports — if the folder only contains a packed archive (arc*.nsa, *.ns2, *.sar) with no loose boot script, it’s still tagged classic ONScripter so it gets a proper library badge.

  5. Otherwise the game is marked unknown.

Every game’s Settings → Engine picker lets you force Auto / ONScripter / ONScripter-RU instead of relying on detection. This is an intrinsic, per-game setting — it isn’t affected by the “Use Global Settings” toggle, and it takes effect the next time you launch that game.

The classic engine and ONScripter-RU aren’t feature-equivalent. RU is a newer, GPU-based fork focused on getting demanding games running well, and it simply doesn’t have hooks for several of the classic engine’s extras.

Classic ONScripter (NScripter/ONScripter, Shift-JIS or UTF-8)

Section titled “Classic ONScripter (NScripter/ONScripter, Shift-JIS or UTF-8)”
  • Render scale, upscale filter (Smooth/xBRZ/Sharp), and contrast-adaptive sharpening (CAS), adjustable per-game or live in the game overlay
  • Rollback / rewind, with an adjustable rollback depth
  • Skip Unread Text
  • Runtime font switching (game folder fonts, Sakura’s bundled fonts, or your imported font library)
  • Auto-translate (Apple’s on-device Translation, iOS 18+) — see Translation for details
  • Text Language / Menu Language auto-detection
  • Automode timing and audio buffer size (shared with classic)
  • Game ID and NSA offset overrides (shared with classic)
  • No display filters (render scale/upscale/CAS), no rollback, no skip-unread toggle, no runtime font switching, and no translation — RU has no control hooks for any of these, so Sakura hides those settings entirely for RU games rather than showing controls that wouldn’t do anything. The per-game Settings screen shows a short “Engine Limits” notice explaining this.
  • The in-game overlay reflects the same limits: RU’s quick menu only shows skip and auto-advance controls (no rewind), and the full overlay menu disables “Reset to Title” and the in-engine menu shortcut, since RU doesn’t expose those either.

Both engine frameworks are self-contained native libraries that link their own copy of SDL2. Loading both in the same running app at once isn’t safe, so Sakura only allows one engine family per app session: once you’ve launched either a classic game or an ONScripter-RU game, every other game you launch in that session must use the same family. ONScripter-RU is additionally limited to one run per session, since its clean shutdown path is newer than the classic engine’s.

If you try to launch a game that needs a different engine family than the one already in use, Sakura shows a Restart Needed alert rather than launching it:

“This game runs on a different engine than the one already used this session. Close and reopen the app, then launch this game first.”

Choosing Close App quits Sakura so you can relaunch it and start with the other game. If you’re bouncing between a classic game and an RU game like Umineko, expect to restart the app in between.