Files

156 lines
7.5 KiB
Markdown

# Where your game progress lives
Game progress is local to the device on which you played. nxnative Easy on the
Mac prepares the game; it does not receive the iPhone's progress automatically.
There is no active cloud synchronization yet.
## Mac
The default location for each game is:
```text
~/Library/Application Support/nxnative/<TITLE ID>/
save/ committed account/game progress
save_device/ separate device-wide progress, for games that use it
temp/ scratch files, not progress
```
For Metroid Dread, `<TITLE ID>` is `010093801237C000`. In Finder choose
**Go → Go to Folder…** and paste:
```text
~/Library/Application Support/nxnative/010093801237C000/
```
The `.app` contains the engine and game data. Saves are outside it, so moving the
app or preparing a new version does not move or replace these save folders.
The Mac launcher chooses this directory by Title ID, not the `.app` filename.
Advanced `DM_SAVE` environment overrides can change the default location.
## iPhone and iPad
Each installed game has its own app container. The default paths inside it are:
```text
Documents/
save/ committed account/game progress
save_device/ present only when the game uses a separate device save
romfs/ game content for a lightweight IPA; NOT your progress
temp/ scratch files; NOT your progress
log.txt diagnostics; NOT your progress
```
The container has an iOS-managed UUID; do not look for a fixed Mac filesystem
path. To inspect the shared Documents folder, connect and unlock the device,
trust your Mac, then use **Finder → your iPhone/iPad → Files → the game**.
Finder shows the contents of Documents directly. Depending on iOS settings, the
game may also appear under **Files → On My iPhone/iPad**.
An iPad and an iPhone have independent copies. Playing on one does not update
the other. Signature expiry stops the app from launching but is not an instruction
to remove its data: renew the same app rather than deleting it.
## Updating without losing progress
- **Mac:** close the game, build/open the new complete `.app` with the same Title
ID. The existing `save` and `save_device` stay in Application Support.
- **iPhone/iPad:** keep the same Apple signing account, team and effective bundle
identifier. Install over the existing app. For changed game content, replace
only `romfs`. Keep `save` and `save_device`. Do not uninstall the old app.
- Switching the signing account or effective identifier can create a different
app/container. A tool must not pretend that this preserves the original save.
The integrated installer refuses identity changes it cannot preserve.
The preparation records `nxnative-ios.json` / `nxnative-mac.json` in the game
folder are build metadata, not backups of your progress. An IPA is not a backup
of the installed game's Documents. A launcher update is not a game-save backup.
Folders may not exist until the game has first run and saved. These are the
game's own on-disk saves, not an emulator save state or unsaved RAM. Renewing a
signature does not save an open game for you.
## Manual copies and backups
First use the game's own Save option and close the game completely. Keep both
committed folders, if both exist, as one dated backup. For example, store it
outside the repository under your own game folder:
```text
<your-game-folder>/backups/iPad/2026-10-27/save/
<your-game-folder>/backups/iPad/2026-10-27/save_device/
```
A missing `save_device` is normal for games that do not use it. Do not replace a
real destination folder with an empty one. Keep the original backup and the
current destination before trying a restore. Matching game/Title ID, version,
DLC and account data matter; interchange between every game build or another
emulator is not guaranteed.
Manual file copies are a way to retain the files, not a certified portable backup
for every game. The engine can represent case-sensitive names with `.dm-case-*`
physical aliases and an `org.d2rmobile.guest-name` extended attribute. A tool or
archive format that drops that metadata can break those logical names. APFS-aware
copies on a Mac should preserve extended attributes; do not assume Finder/AFC,
Windows ZIP tools or a cloud-drive round trip preserves all of them. A future
native export/import must explicitly carry the known alias metadata and validate
restoration. We do not advertise the current API prototype as that exporter.
Do not back up live transaction directories such as `save.work`, `save.new` or
their `save_device` counterparts. The engine commits each save root separately;
copying during gameplay can mix two generations. `romfs` and console keys are
not required to transfer progress and should not go into a future save service.
## Touch-control profiles are separate
The four named control profiles are app preferences, keyed by
`DmPadProfiles.v2.<Title ID>`, with separate 2D/3D layouts. They are not files in
`save`. On iPhone/iPad they live in the app's preferences rather than shared
Documents. Updating the same app keeps them; copying only `save` does not copy
them to another device. Profile cloud sync/export is not implemented.
## Future cloud sync
The [API prototype](../dm/cloud/README.md) has authenticated immutable snapshots,
revision checks and revocable sharing. Native export/login/restore is not wired
to the game. A safe implementation needs a stopped game, both committed roots,
metadata-preserving packages, a local recovery backup and a durable restore
journal. This is separate from Apple-ID signing and signature renewal.
## Future portable server
No cloud host is selected. The API foundation is provider-independent: Python,
HTTP, configurable OIDC identity and SQLite. Its consistent database backup can
move snapshot history and ownership to another server.
[Configuration, backup and relocation](../dm/cloud/README.md#portable-hosting-and-migration).
This does not activate in-game sync: native login and safe device snapshot/import
flows are still pending.
## Export from a trusted iPhone/iPad (1.11)
In **Devices**, choose **Export saves** for a recognized game, save and close it
from the app switcher, confirm and select a new ZIP. Apple-account login is not
required for this read on an already paired/trusted device. **Show save ZIP**
reveals the result for manual sharing.
A separate read-only AFC capability exports only committed `Documents/save` and
optional `Documents/save_device`. It excludes game content, working transactions,
preferences and credentials. Inventories/sizes and a second SHA-256 read must
remain stable before a private ZIP is atomically published without overwriting a
backup. The package contains the same folder names plus
`nxnative-save-export.json` with game identity/version, hashes and source times.
There is no device write or restore operation in this module.
Observed running games stop export. If process inventory is unavailable, manual
export requires the player's explicit closed-game acknowledgement. Symlinks,
special files and `.dm-case-*` aliases are refused because AFC cannot preserve
the engine's case-alias xattr; use a complete device backup for those cases.
Limits are 512 MB and 8192 entries. A forced termination may leave a private
partial temporary file, never a falsely successful final ZIP.
Manual sharing/restoration still needs matching game/version/format and a backup
of the recipient's original files. Control presets are separate. This package
is not yet connected to the provider-independent cloud API or its nxsave schema.
There is no automatic import or universal emulator conversion claim.