# Crimson Desert — Linux Setup Reference

**Steam App ID:** 3321460
**Genres:** Action RPG, Open World, Fantasy
**Engine:** BlackSpace Engine (Pearl Abyss proprietary, DX12)
**Anti-Cheat:** XIGNCODE3 (+ Denuvo DRM)
**Linux Rating:** Silver/Gold (ProtonDB — works with Proton Experimental / GE-Proton 10-34+)

## System Used

| Component | Detail |
|-----------|--------|
| GPU | NVIDIA RTX 3070 (GA104) |
| Driver | nvidia 595.71.05 |
| Distro | CachyOS (Arch) |
| Runner | GE-Proton10-34 or proton-cachyos-11.0 |
| Game Source | Pirated/cracked copy (non-Steam) |

## Key: UMU Overrides Lutris Wine Version

Lutris launches Proton-based runners via UMU (umu-run). When UMU starts, it auto-detects the proton version available in `~/.local/share/Steam/compatibilitytools.d/` and defaults to the latest GE-Proton — **ignoring whatever Wine version is set in the Lutris game config**.

**To force a specific Proton (e.g. proton-cachyos):**

1. Install the Proton build into UMU's compat tools directory:
   ```bash
   mkdir -p ~/.local/share/Steam/compatibilitytools.d
   ln -sf ~/.local/share/lutris/runners/wine/proton-cachyos-11.0-20260429-slr-x86_64 ~/.local/share/Steam/compatibilitytools.d/proton-cachyos-11.0
   ```

2. Set `PROTONPATH=proton-cachyos-11.0` in the Lutris game config's system → env:
   ```json
   "env": {
     "PROTONPATH": "proton-cachyos-11.0",
     ...
   }
   ```

3. Also set `STEAM_COMPAT_DATA_PATH` to a path containing the numeric AppId (required by protonfixes):
   ```json
   "env": {
     "STEAM_COMPAT_DATA_PATH": "/home/raymond/Games/umu/3321460",
     "STEAM_COMPAT_INSTALL_PATH": "/home/raymond/Games/Crimson Desert",
     ...
   }
   ```

   Without the numeric AppId in the path, protonfixes crashes with:
   ```
   IndexError: list index out of range (protonfixes/fix.py:28)
   ```

## ⚠ Gbe_fork Steam Emulator: "unable to create interface isteamuser"

If you replaced the crack's `steam_api64.dll` with gbe_fork's standalone DLL trying to fix Steam issues, you'll hit this error.

**The fundamental issue:** The DenuvOwO crack's original `steam_api64.dll` (320KB) is a **full crack wrapper with 1089 Steam API exports** — not a thin redirector. It handles every Steam API function the game needs, AND it contains the DenuvO runtime bypass hooks.

When you replace it with gbe_fork:
1. All 1089 exports are now emulated by gbe_fork (not the crack)
2. The DenuvO bypass hooks are gone — the game's DenuvO is still active
3. gbe_fork's interface creation fails with `"unable to create interface isteamuser"` even though it supports `SteamUser023` — because the game's compiled interface expectations and gbe_fork's internal dispatch don't align for the crack-wrapper layer

**Resolution:** Restore the original 320KB `steam_api64.dll` from the crack. gbe_fork is for legit Steam copies, not cracked ones.

## Key: XIGNCODE3 & Hypervisor Bypasses

**⚠️ The crack's hypervisor bypass is a Windows-only concern.** Do not attempt to load `.sys` drivers on Linux.

**This is the critical difference from Windows:**

On Windows, XIGNCODE3 is a **kernel-level** anti-cheat that detects virtualization (Hyper-V) and refuses to run. A hypervisor bypass/hack is needed to hide from it.

On **Linux with Proton:**
- XIGNCODE3's kernel driver (.sys) **can't load** — Linux won't run Windows drivers
- Only the user-mode component runs inside the Proton sandbox
- **No Hyper-V exists** on Linux to detect
- **No bypass needed** — the same cracked copy that required a hypervisor bypass on Windows works unmodified

## Folder Structure

```
~/Games/Crimson Desert/          ← note: space in folder name
├── bin64/
│   ├── CrimsonDesert.exe        ← main game executable
│   ├── steamclient_loader_x64.exe  ← 🎯 CRACK LAUNCHER (use this, not exe directly)
│   ├── DenuvOwO.dll             ← crack DLL (hooked at runtime)
│   ├── DenuvOwO.ini             ← crack config
│   │   └── AutoLoadHV=false     ← ⚠️ MUST be false on Linux (no hypervisor to bypass)
│   ├── ColdClientLoader.ini     ← Steam emulator config (reads Exe=CrimsonDesert.exe)
│   ├── coldclient/
│   │   ├── steamclient.dll      ← Steam emulator DLL (32-bit)
│   │   └── steamclient64.dll    ← Steam emulator DLL (64-bit)
│   ├── *.dll                    ← game DLLs
│   ├── *data*                   ← game assets
│   └── ...
├── _Crack/
│   └── DenuvOwO/                ← crack source (copy bin64/ contents to game bin64/)
```

### 🎮 Correct Executable for Lutris

Set the Lutris executable to:
```
/home/raymond/Games/Crimson Desert/bin64/steamclient_loader_x64.exe
```

NOT `CrimsonDesert.exe`. The launcher:
1. Reads `ColdClientLoader.ini` to find `Exe=CrimsonDesert.exe`
2. Injects `coldclient/steamclient*.dll` (Steam emulator) 
3. Injects `DenuvOwO.dll` (Denuvo bypass)
4. Then launches the game

If you set the executable to `CrimsonDesert.exe` directly, you get: `"unable to initialize SteamAPI"`

### ⚠ NEVER Replace steam_api64.dll with gbe_fork or Goldberg

The crack's own `steam_api64.dll` is **320KB** and has **1089 Steam API exports**. It is NOT a generic Steam emulator — it's the crack wrapper containing DenuvO bypass hooks.

| File | Size | What it is |
|------|------|------------|
| `steam_api64.dll` (ORIGINAL) | ~320 KB | ✅ Crack wrapper with 1089 exports. KEEP THIS. |
| `steam_api64.dll.gbe_fork` | ~11 MB | ❌ Gbe_fork standalone emulator. For legit copies only. |
| `steam_api64.dll.goldberg_old` | ~1.5 MB | ❌ Goldberg 2019 emulator. Too old. |
| `coldclient/steamclient64.dll` | ~18 MB | ❌ ColdClientLoader's emulator. For injector, not DLL swap. |

**If you accidentally replaced the original**, restore a backup or re-extract it from the crack archive. The error `"unable to create interface isteamuser"` after switching to gbe_fork means the crack hooks are gone.

### 🛠️ ColdClientLoader.ini Fixes

Before launching, apply these fixes to `ColdClientLoader.ini`:

```bash
cd "/home/raymond/Games/Crimson Desert/bin64"

# 1. Force injection (default 0 waits for game to load Steam itself — never happens)
sed -i 's/ForceInjectSteamClient=0/ForceInjectSteamClient=1/' ColdClientLoader.ini

# 2. Fix backslash path separators → forward slashes (Wine/Proton)
sed -i 's|coldclient\\steamclient.dll|coldclient/steamclient.dll|g' ColdClientLoader.ini
sed -i 's|coldclient\\steamclient64.dll|coldclient/steamclient64.dll|g' ColdClientLoader.ini

# 3. Create steam_appid.txt
echo 3321460 > steam_appid.txt
```

**Do NOT replace `steam_api64.dll`** with the coldclient DLL. The game's original `steam_api64.dll` exports Steamworks SDK functions (like `SteamAPI_RestartAppIfNecessary`) that `steamclient64.dll` does not export. Replacing it gives `unable to find procedure SteamAPI_RestartAppIfNecessary`. Keep the original in place.

### ⚠️ Gamemode Conflict

The `gamemoderun` prefix command injects `LD_PRELOAD=libgamemodeauto.so.0` which can interfere with the ColdClientLoader's DLL injection (`CreateRemoteThread` / `LoadLibraryExW`). If injection silently fails:

1. Install `lib32-gamemode`: `sudo pacman -S lib32-gamemode`
2. Or temporarily disable gamemode: remove `prefix_command: gamemoderun` from Lutris config

### 🔬 Diagnosis Checklist

If game still shows SteamAPI error:

| Check | Action |
|-------|--------|
| Lutris exe points to `steamclient_loader_x64.exe`? | Fix path in game config & DB |
| `ForceInjectSteamClient=1` in ColdClientLoader.ini? | `sed -i 's/ForceInjectSteamClient=0/ForceInjectSteamClient=1/'` |
| `coldclient/` paths use forward slashes? | `sed -i 's|\\\\|/|g' ColdClientLoader.ini` |
| `steam_appid.txt` exists? | `echo 3321460 > steam_appid.txt` |
| `steam_settings/` symlink in bin64/ ? | `ln -sf coldclient/steam_settings steam_settings` |
| Original `steam_api64.dll` intact? | Should be ~320KB, NOT 18MB (that's coldclient's DLL) |
| `DenuvOwO.ini` has `AutoLoadHV=false`? | Hypervisor bypass not needed on Linux |
| `lib32-gamemode` installed? | `sudo pacman -S lib32-gamemode` |

### "Not Entitled to the Game" Error

If the game loads but says `"not entitled to the game"`, the Steam emulator can't verify game ownership:

1. **Check `steam_settings/` location** — The loader looks for it in its own directory (`bin64/`), but many repacks put it inside `coldclient/steam_settings/`. Fix: `ln -sf coldclient/steam_settings steam_settings`
2. **Verify `steam_appid.txt` inside steam_settings** — It must contain only the AppId: `3321460` (no extra whitespace or comments)
3. **Check `configs.app.ini`** — Set `unlock_all=1` if the game checks DLC ownership
4. **Try the Steam appmanifest approach** (see below)

### Fallback: Steam Appmanifest Method

If the ColdClientLoader continues to fail with SteamAPI/"not entitled" errors, bypass it entirely by making Steam think the game is legit:

```bash
# 1. Create app manifest
cat > ~/.local/share/Steam/steamapps/appmanifest_3321460.acf << 'HERMES'
"AppState"
{
    "appid"     "3321460"
    "Universe"      "1"
    "installdir"        "Crimson Desert"
    "StateFlags"        "4"
    "name"      "CRIMSON DESERT"
}
HERMES

# 2. Symlink game files
mkdir -p ~/.local/share/Steam/steamapps/common
ln -sfT "/home/raymond/Games/Crimson Desert" "/home/raymond/.local/share/Steam/steamapps/common/Crimson Desert"

# 3. Restart Steam → Find game in library → Play
```

**Lutris config for this approach:** Set executable to `CrimsonDesert.exe` (not the loader), with a unique prefix. Steam handles the SteamAPI via its runtime. The crack DLLs in the game directory still bypass Denuvo at runtime.

## Recommended Lutris Config

### Runner Settings
- **Wine version:** `proton-cachyos-<latest>` or `GE-Proton10-34+`
- **DXVK:** Disabled (runner has it built-in)
- **VKD3D:** Disabled (runner has it built-in — enabling Lutris managed VKD3D causes MissingRuntimeComponentError)
- **DXVK_NVAPI:** Disabled (runner handles NVIDIA features)
- **ESYNC:** Enabled
- **FSYNC:** Enabled

### System Settings
- **Prefix command:** `gamemoderun`
- **Environment variables:**
  - `VKD3D_CONFIG=no_upload_hvv,single_queue` — reduces DX12 stutter
  - `PROTON_ENABLE_NVAPI=1` — NVIDIA features
  - `MANGOHUD=0` — off by default, toggle in-game (Shift_L+F1)

### Environment Notes
- `DXVK_ASYNC=1` is **deprecated** in modern DXVK (2.x+). Do not use it with proton-cachyos or GE-Proton10 — it will be ignored.
- `WINE_FULLSCREEN_FSR=1` — optional, can help if performance is tight
- `PROTON_USE_SECCOMP=1` — not needed for modern Proton builds (it's default)

## Valve's Proton Fix (April 29, 2026)

Pearl Abyss pushed an update that broke Linux compatibility. Valve responded the **same day** with a Proton Hotfix, and within a few days pushed the fix to **Proton Experimental**.

**Status as of May 2026:** Works on Proton Experimental and any GE-Proton build based on Proton Experimental (GE-Proton10-34+ / proton-cachyos-11.0+).

## In-Game Performance Tips (RTX 3070)

- **Resolution:** 1440p high/medium is realistic on RTX 3070
- **DLSS:** If available, Quality mode for 1440p, Balanced for 1440p with high FPS target
- **Shadows:** Medium (biggest perf cost on this engine)
- **Volumetrics:** Low to Medium
- **Anti-aliasing:** TAA (temporal) works well with DLSS off
- **First launch shader stutter:** Let it compile — takes 1-3 minutes of gameplay

## Known Issues & Fixes

| Issue | Fix |
|-------|-----|
| Game doesn't start (crashes immediately) | Make sure you're using GE-Proton10-34+ or proton-cachyos. Older Proton/Wine won't handle XIGNCODE3. |
| `MissingRuntimeComponentError: VKD3D` | Set `dxvk: false`, `vkd3d: false` in Lutris config — runner has them built-in. |
| "Hypervisor detected" error | This is a Windows-only issue. On Linux, XIGNCODE3 can't detect Hyper-V. Make sure you're using a Proton runner. |
| Black screen with audio | Launch with `WINE_FULLSCREEN_FSR=1` or switch to borderless windowed in game settings |
| Low FPS on NVIDIA | Ensure `VKD3D_CONFIG=no_upload_hvv,single_queue` and `PROTON_ENABLE_NVAPI=1` |
| Gamemode not active | `sudo pacman -S gamemode lib32-gamemode && systemctl --user enable --now gamemoded` |
| MangoHud not showing | Set `MANGOHUD=1` in env vars. Toggle with Shift_L+F1 (default config). |

## Source
- ProtonDB: https://www.protondb.com/app/3321460
- Valve fix discussion: https://github.com/ValveSoftware/Proton/issues/9595
- GamingOnLinux coverage: https://www.gamingonlinux.com/2026/04/proton-experimental-updated-to-get-crimson-desert-working-again-on-linux-steamos/
