Resonance is a Rust reimplementation of the GameCube version of Tales of Symphonia, built from the ground up using Bevy. The project aims to:
- Preserve the game's visuals, audio and gameplay with high fidelity on modern platforms.
- Make textures, meshes and other assets easy to replace.
- Support editing existing events and skits, and creating new ones.
- Enable players to edit fields and build new areas, storylines and content.
The playable route runs from startup through New Game, the classroom and Iselia's connected grounds, village and interiors, including Halo's shop and the Genis cooking tutorial. Milestone 3 adds field menus, ordinary saves and quicksaves, skits and Dolphin regression coverage for this route. Broader game coverage and modding tools remain in development.
The importer extracts data from your original GameCube disc and converts ("cooks") it into assets Resonance can load directly. The game then runs from these cooked files.
nix develop
cargo build --workspace
target/debug/resonance-import extract --disc /path/to/Disc1.rvz --output local/extracted/disc1
target/debug/resonance-import extract --disc /path/to/Disc2.rvz --output local/extracted/disc2
target/debug/resonance-import cook-all --jobs 6The current import profile supports North American GQSEAF revision 0.
Extraction is a one-time step. cook-all converts general assets from both discs
into one shared local/all-assets library, including unused resources in supported
formats. It also prepares startup, menus, skits and every field in the source
catalogue through shared conversion paths. Field resources and media follow their
source declarations; no list of Iselia fields or separate route-cooking commands
is needed. Battle preparation is separate; the coverage report identifies deferred
battle resources. Identical resources are reused across discs; disc names remain
provenance only. Cooking does not establish runtime support for every recovered
scene or native function. Cooks reuse valid outputs; inspect --help for
other paths and worker limits. Keep discs, extracted files, cooked assets and
recordings in the ignored local/ directory. Cooking uses in-process Rust codecs,
with no FFmpeg, vgmstream or KTX command-line tools. The
development flake supplies the build and oracle tools.
Audio interpolation filters are generated in Rust; no Dolphin installation or
DSP coefficient file is required.
The importer parses original databases into validated JSON, including
recipes, ingredients, item statistics, EX skill definitions and menu settings in
game/menu-data.json.
Executable addresses and packed table layouts stay inside the importer; the
player reads the converted records.
SymphoniaScript supports readable .sym source through separate compiler,
VM and tooling crates. Check the maintained model scripts with
cargo run -p resonance-script -- check scripts preview::sword_dancer. See the
language guide for syntax, native APIs and bindings.
Field cooking includes skit scripts, animated portraits and media timing. The
English disc's skit tracks are silent; preparation verifies that and uses their
duration without playing them. The shared library retains the decoded audio.
Field audio includes every declared script branch and shared menu sounds. Rerun
cook-all after changes to source assets, cooked formats or the importer.
cargo run -p resonance -- --silent --assets local/all-assets
cargo run --release -p resonance -- --silent --assets local/all-assets --resolution 1920x1080--silent permanently mutes speaker output, including after device recovery.
Omit it to hear the game. Use --assets PATH for another cooked directory and
--skip-intro to enter the title directly. The classroom's opening speech is
intentionally shown over black; advance it to reveal the room.
At startup, the title uses the host's local clock: the original day field from
07:00 until 19:00, and the original night field from 19:00 until 07:00. Rerun
cook-all to prepare both fields.
Resolution defaults to 640×480 and stays fixed until restart. Resizing and maximizing are disabled; compositor-imposed sizes letterbox the retained image. Wide resolutions expand the camera horizontally and keep UI in a centered 4:3 area. Gameplay renders without an application cap; movies follow their audio clock. Simulation remains at 60000/1001 updates per second.
| Action | Keyboard | Controller |
|---|---|---|
| Menu selection / movement | Arrows; WASD also moves in fields | Left stick / D-pad |
| Confirm / advance / talk | Enter; Space also works in fields/setup | South button |
| Run | Shift | East button |
| Field menu / back | Tab / Escape | North / East button |
| Inventory category / menu character / recipe page | Q / E | Left / right shoulder |
| Discard item / remove armor / cook dish | X | West button |
| Equip sorting / Optimal (character selected) | Tab | North button |
| Choose field leader / exchange party members | Enter / Tab, with a party member selected | South / North button |
| Toggle party statistics | Home | Start |
| Cycle control type in the Tech header | Home | Start |
| Edit an AI member's U. Attack shortcuts in the Tech header | Tab | North button |
| Status page | Q / E | Left / right shoulder |
| Items / book / map list / Status / recipe page | Page Up / Page Down | Right stick up / down |
| Rotate / zoom Monster List preview | [ and ] / Page Up and Page Down | Right stick |
| Reset Monster List preview | Home | Start |
| Open announced skit | Z | Z trigger (when its playback resource is cooked) |
| Skip movie | Enter / Escape | Start |
| Pause movie | Space | — |
| Performance overlay / snapshot | F3 / F4 | — |
| Development quicksave / quickload | F5 / F9 | — |
| Location test selector | Shift+Tab | — |
| Test speed 1× / 2× | F6 | — |
| Pause / resume | F7 | — |
| Skip current cutscene / cancel skip | F8 | — |
Battle skipping is off by default. Open Shift+Tab and click Skip battles
or press B while the menu is open to toggle it for the session. Skipped
encounters count as victories without loot. The --skip-battles launch option
starts with skipping enabled. Unsupported field scripts still report errors
during normal play.
Press Shift+Tab at the title or during play to visit Sylvarant towns and dungeon start/end checkpoints. Up/Down selects a row; Left/Right or Page Up/Down changes pages. Press Enter, click a row, or use 1–0 for that page; Escape closes the menu. Each jump resets the run and preserves the battle-skipping setting. Dungeon starts have fresh puzzles; seal checkpoints have their puzzles solved and place you just before the final room. Martel starts before the ring pickup; later checkpoints include the Sorcerer's Ring. Disk saves are unchanged. At the Palmacosta Ranch end checkpoint, use the Radar ring to reveal the final teleporter, then interact with it.
The location selector also has speed, pause and event-skip buttons. F8 runs the current cutscene to completion, preserving story progress, even while paused. It stops for choices and menus that need your input. Battles resolve as victories without loot; skipped dialogue and one-shot sounds are silent. F7 resumes play.
From the menu's bottom row, press Down to select the party. Field leader and formation order are saved independently; Escape cancels a pending exchange. In Items, Q/E changes category while the item list has focus; Left/Right selects category tabs. Enter or Down enters a category at its first item, and Page Up/Down jumps a full page. Owned books and world maps open from Items → Key Items. They show discovered items, monsters, figurines, learned topics and visited locations/shops. Lists use the navigation controls above; the Monster List also uses Left/Right to select, Q/E to jump ten entries, Up/Down for repeat-battle statistics and X for its list.
Quicksaves work during free field movement. They restore progress and the player's
location by restarting the field; animations and music start afresh. Use
--quick-slot NAME for independent slots and --save-directory PATH to override
the platform's user-data directory. Completion and errors appear in the window
title and console. F9 also requires free field control.
Events, dialogue, menus, movies and transitions reject quicksaves immediately;
requests are never deferred until control returns. At a memory circle, Confirm
opens Save. The field menu's System page provides save/load with separate
filesystem slots. The title's Load option opens the same slots after restarting
the game. Ordinary saves and quicksaves share the same underlying format.
System → Customize edits saved preferences. Escape applies the draft and returns
to the main menu; its Cancel action discards edits, and Default restores defaults.
Music volume previews while editing; effect levels and stereo apply when you leave Customize.
Movies and credits use Music volume for their premixed soundtracks.
In Adjust Screen, Home (or controller Start) resets the offset. Resolution remains
a startup option.
Development checkpoints are tied to the session data and scripts of the supported
fields; changing that content invalidates older checkpoints.
cargo run -p resonance -- --silent --save-directory local/saves --quick-slot classroom
cargo run -p resonance -- --silent --load local/saves/quicksaves/slot-classroom.jsoncargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all -- --checkDevelopment builds optimize every crate at level 2 with debug assertions and
overflow checks. Use release builds for performance measurements. Tests marked
ignored require locally cooked assets or independent Dolphin recordings.
The supported route has been exercised on ARM Linux; Windows, Steam Deck and
Apple Silicon macOS hardware validation remains pending. Intel macOS is out
of scope.
Maintained SymphoniaScript sources are embedded in the cooker and published under
the cooked asset directory's scripts/. These are immutable cooked assets,
verified and loaded with the field. Change the checked-in sources, rebuild and
recook to update them. Mod overlays are future work.
The checked-in standard library supplies ordinary string
and integer constants. Cooking copies it unchanged. Check source with
resonance-script check scripts preview::sword_dancer; add --assets ASSETS to
check against the cooked library instead.
- Generic asset cooking
- SymphoniaScript and native registration
- Field preparation
- Performance measurements and silent probes
- Dolphin capture, replay and comparison
- Offline media tools
Keep reusable test inputs in version control. Generated reports, logs, hashes
of individual runs and screenshots belong under local/; update the relevant
current guide when behavior changes.
Resonance is licensed under the MIT License.
Original game assets and third-party dependencies retain their respective rights and licenses.