Files
drippu/docs/user/InstallingUpdatesDLC.md
5de22d39fe Export Game: bake separate update/DLC dumps into the standalone snapshot (#29)
* feat(export): bake separate update/DLC dumps into standalone snapshots

Resolve base ROM plus picked update/DLC files and optional NAND-installed
add-ons through PatchManager at export time, so packaged exefs and
romfs.bin are the patched snapshot AOT recompiles. Dump decrypted AOC
next to the package and serve it from the deconstructed loader so the
standalone runtime does not need post-export NAND installs.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(export): rename AOC dir local to unshadow loader member

-Werror=shadow failed Linux tests and macOS MoltenVK: the baked-AOC
scan used a local `name` that collided with AppLoader_DeconstructedRomDirectory::name.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(export): fail closed on bake errors; honest ExeFS/AOC status

HOLD on PR 29: OnExport ignored session failures, directory ROMs could
claim an update bake after PatchExeFS(nullptr), empty exefs/ blocked the
Windows extract fallback, and aoc:u Count used the raw program id.

- Abort export on Resolve/ok()/unreadable extras; keep bake status
- Pass directory ExeFS into PatchManager; only list updates that applied
- Do not mkpath empty exefs/; extract fallback on all platforms; refuse
  DLC without main
- CountAddOnContent uses GetBaseTitleID like ListAddOnContent

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(export): refuse mixed directory+update snapshots; unbreak macOS

HOLD re-review on 363f352:

- Fail closed when an update is present but RomFS cannot BKTR without a
  Program NCA (directory dumps). Do not list Update over base romfs.bin.
- Do not create exefs/ for romfs.bin alone; never FillMissing unpatched
  main next to dumped AOC; honor extract/package failures.
- Drop static forward decls that Clang treated as extra overloads
  (DumpVirtualDir/ExtractExeFsFromRom ambiguous on macOS).
- Always remove .aot_work_* on export failure via RAII.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(export): drop unused ExtractRomFsFromRom; require PatchManager replace

- Delete dead static ExtractRomFsFromRom (-Werror=unused on ENABLE_QT=ON)
- Count update as applied only when PatchExeFS/PatchRomFS return a
  different handle than the base input, not a side NCA open
- Refuse-path status is the error only (not "base game only")

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* test(export): drop Core::System Resolve cases that SIGSEGV in CI

Linux tests on ea6d1a7 crashed in ExportContentSession Resolve after
System::Initialize. Keep header-only bake helpers; live Resolve still
needs a fuller emulator fixture.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(export): stop Linux tests spinning 1500s; refuse-path status is the error

CoreTiming tests busy-waited while(HasPendingEvents()) with no deadline.
346d452 hung after Catch2's seed line until CTest's 1500s default. Bound
that wait to 5s, cap the tests target at 180s, and stream --durations.

Resolve error paths now set status to the error (not "base game only").

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* test(ci): name Catch2 hangs; yield fiber handshake spins

346d452 Linux tests timed out at 1500s with only Catch2's seed line
because ctest captured stdout. Run bin/tests directly with -s /
--durations, split [export] vs the rest, and cap each at 30s/90s.

Fibers::InterExchange busy-waited on atomics with no yield; on a
2-vCPU runner that can starve the handshake. Yield and 5s deadline.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* test(ci): name Catch2 cases at start; fiber timeout yields home

Drop -s (lazy headers still hide hangs; RingBuffer -s floods Actions).
Print+flush the case name from a testCaseStarting listener; keep
--durations yes --order decl.

On InterExchange handshake expiry, YieldTo this thread's home fiber
and return so join() completes and REQUIRE_FALSE can fail closed.
Do not YieldTo the partner (fiber mutex deadlock).

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

* fix(core_timing): join host timer without a lost wakeup

Linux tests on a784eaf named CoreTiming[BasicOrderNoPausing] then
SIGTERM at the 90s GNU timeout. WaitForTimingIdle had already
returned; ~CoreTiming join hung because Reset Set() the events
before request_stop, so the thread could Wait() again with the
signal consumed. Stop first, then wake; skip pause_event.Wait
once the stop token is set.

Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Dallin Bland <SourCreamCulture@users.noreply.github.com>
2026-09-17 20:40:37 -05:00

3.5 KiB

User Handbook - Working with Updates/DLC in Eden

Use this guide when you want to install Updates or DLC for your games in Eden.

Click Here for a version of this guide with images & visual elements.


Pre-Requisites

  1. Eden already setup and configured for your platform.
  2. The Update/DLC file(s) you want to install

Installing Updates/DLC

  1. Open Eden to the Main Window.

  2. Select File > Install Files to NAND....

  3. Navigate to the Update/DLC files you want to install.

  4. The file(s) will be scanned for validity and then a confirmation window will appear, select Install to begin installation.

  5. Upon installation, you will get a prompt saying it was installed successfully.

  6. Look at the Add-Ons column in the main window, you should now see the additional installed content reflected.


Disabling Updates/DLC

Upon occasion you may find that you want to disable a certain DLC or Update (incompatibility with a mod, causes significant regression, etc.). Luckily the process if very easy to do so.

  1. Right-Click the game for which you want to disable the additional content.
  2. Select Configure Game.
  3. Uncheck the box next to the DLC or Update you want to disable and hit OK.
  4. The listing should now reflect that it has been disabled with a [D] before the entry. If you load the game, you will observe that the reported version is not updated (assuming the game reports this information).

Exporting a game with separate updates / DLC

Game Export can bake owned separate update and DLC/AOC dumps (or NAND-installed add-ons for that title) into the standalone package. Merged dumps that already contain the update still work; this is for the split-file layout.

This does not help you obtain dumps. Only use files you already own.

  1. Open Export Game.
  2. Choose the base ROM.
  3. Under Updates / DLC, add the extra NSP/XCI/NCA files, and/or leave Use NAND-installed add-ons for this title checked if you already installed them for emulation.
  4. The status line lists what will be baked (update version, DLC IDs, and source).
  5. Export as usual. The package's exefs/ (including romfs.bin) is the patched snapshot. DLC is written under aoc/<title id>/romfs.bin.

If an extra file cannot be read, export stops and reports the path — it does not package a base-only snapshot while claiming the add-on was baked. The status line only lists an update when both ExeFS replace and RomFS BKTR applied. A folder dump of extracted exefs/ cannot BKTR an update (no Program NCA); export refuses rather than mixing update NSOs with base romfs.bin. Use the original NSP/XCI (or a merged dump) as the base ROM.

The standalone runtime does not need a post-export NAND install. Updates are already applied to ExeFS/RomFS; DLC is served from the baked aoc/ tree. content_baked.txt in the package repeats the same summary.