Implements Phase 3 of CARD_PLAN.md — the embedded:// + themes:// asset
sources the card-theme system loads from. The bundled default-theme
manifest ships in the binary via Bevy's EmbeddedAssetRegistry; user
themes load from user_theme_dir() through a FileAssetReader-backed
source registered as `themes://`.
Registration is split across:
register_theme_asset_sources(&mut App)
Called BEFORE DefaultPlugins. Registers `themes://` while
AssetSourceBuilders is still mutable.
AssetSourcesPlugin
Added AFTER DefaultPlugins. Populates the EmbeddedAssetRegistry
that AssetPlugin's build step would otherwise overwrite.
Constants exposed for downstream consumers:
USER_THEMES = "themes" (asset-source name)
DEFAULT_THEME_MANIFEST_URL = "embedded://solitaire_engine/assets/themes/default/theme.ron"
Includes a stub default theme.ron (52 face slots + back) so
`ThemeManifest::validate()` accepts it today; PROVENANCE.md documents
the plan to drop in real SVG art (hayeah/playing-cards-assets) in a
follow-up.
4 new tests covering source registration, embedded-registry
population, manifest validation against the embedded stub, and the
manifest-URL constant matching the embedded asset path.
cargo check --workspace --all-targets / clippy --workspace
--all-targets -- -D warnings clean. cargo test could not be run in
this turn because the C linker (cc) is unexpectedly absent from the
sandbox; the test bodies compile cleanly under cargo check --tests
and will run on a normal toolchain.
1.7 KiB
Default theme — provenance
This directory is the bundled-default card theme that ships embedded in
the binary via Bevy's embedded_asset! macro (see
solitaire_engine/src/assets/sources.rs). At runtime its files are
addressable as embedded://solitaire_engine/assets/themes/default/....
Current state (Phase 3)
The theme.ron manifest in this directory lists all 52 face slots plus
a back slot, but the referenced SVG files do not yet exist. The
manifest is intentionally a stub so that:
embedded_asset!has a real file to bundle (the manifest itself).ThemeManifest::validateaccepts the manifest (it requires all 52 faces to be listed by name).- The
embedded://asset source can be source-registered and queried without runtime errors during Phase 3.
The actual SVG art will be added when the project swaps in the
hayeah/playing-cards-assets artwork — see the implementation plan in
/CARD_PLAN.md. At that point, every .svg filename listed in
theme.ron's faces map (and back.svg) must be added here, and each
new file needs a corresponding embedded_asset!(app, ...) call in
solitaire_engine/src/assets/sources.rs::register_default_theme.
How to add files to the bundled default theme
For each new file you drop into this directory:
- Drop the file under
solitaire_engine/assets/themes/default/. - Add one line to
register_default_themeinsolitaire_engine/src/assets/sources.rsof the form:(The path is relative toembedded_asset!(app, "../../assets/themes/default/<filename>");sources.rs, which lives insolitaire_engine/src/assets/.) - Update this file with the licence and origin of the new asset.
Licence
To be filled in once real artwork lands.