diff --git a/assets/cards/backs/back_0.png b/assets/cards/backs/back_0.png index b673bf0..28e92f1 100644 Binary files a/assets/cards/backs/back_0.png and b/assets/cards/backs/back_0.png differ diff --git a/assets/cards/faces/10C.png b/assets/cards/faces/10C.png new file mode 100644 index 0000000..8676778 Binary files /dev/null and b/assets/cards/faces/10C.png differ diff --git a/assets/cards/faces/10D.png b/assets/cards/faces/10D.png new file mode 100644 index 0000000..c9f9515 Binary files /dev/null and b/assets/cards/faces/10D.png differ diff --git a/assets/cards/faces/10H.png b/assets/cards/faces/10H.png new file mode 100644 index 0000000..8680893 Binary files /dev/null and b/assets/cards/faces/10H.png differ diff --git a/assets/cards/faces/10S.png b/assets/cards/faces/10S.png new file mode 100644 index 0000000..5ee6ccc Binary files /dev/null and b/assets/cards/faces/10S.png differ diff --git a/assets/cards/faces/10_c.png b/assets/cards/faces/10_c.png deleted file mode 100644 index 1c68e0f..0000000 Binary files a/assets/cards/faces/10_c.png and /dev/null differ diff --git a/assets/cards/faces/10_d.png b/assets/cards/faces/10_d.png deleted file mode 100644 index 59f2531..0000000 Binary files a/assets/cards/faces/10_d.png and /dev/null differ diff --git a/assets/cards/faces/10_h.png b/assets/cards/faces/10_h.png deleted file mode 100644 index 568b8cd..0000000 Binary files a/assets/cards/faces/10_h.png and /dev/null differ diff --git a/assets/cards/faces/10_s.png b/assets/cards/faces/10_s.png deleted file mode 100644 index 527fcb9..0000000 Binary files a/assets/cards/faces/10_s.png and /dev/null differ diff --git a/assets/cards/faces/2C.png b/assets/cards/faces/2C.png new file mode 100644 index 0000000..5d04e07 Binary files /dev/null and b/assets/cards/faces/2C.png differ diff --git a/assets/cards/faces/2D.png b/assets/cards/faces/2D.png new file mode 100644 index 0000000..91090e1 Binary files /dev/null and b/assets/cards/faces/2D.png differ diff --git a/assets/cards/faces/2H.png b/assets/cards/faces/2H.png new file mode 100644 index 0000000..25f069f Binary files /dev/null and b/assets/cards/faces/2H.png differ diff --git a/assets/cards/faces/2S.png b/assets/cards/faces/2S.png new file mode 100644 index 0000000..05ce74c Binary files /dev/null and b/assets/cards/faces/2S.png differ diff --git a/assets/cards/faces/2_c.png b/assets/cards/faces/2_c.png deleted file mode 100644 index ea6d32f..0000000 Binary files a/assets/cards/faces/2_c.png and /dev/null differ diff --git a/assets/cards/faces/2_d.png b/assets/cards/faces/2_d.png deleted file mode 100644 index bc296d6..0000000 Binary files a/assets/cards/faces/2_d.png and /dev/null differ diff --git a/assets/cards/faces/2_h.png b/assets/cards/faces/2_h.png deleted file mode 100644 index a3acf5b..0000000 Binary files a/assets/cards/faces/2_h.png and /dev/null differ diff --git a/assets/cards/faces/2_s.png b/assets/cards/faces/2_s.png deleted file mode 100644 index bec0fb8..0000000 Binary files a/assets/cards/faces/2_s.png and /dev/null differ diff --git a/assets/cards/faces/3C.png b/assets/cards/faces/3C.png new file mode 100644 index 0000000..e21e827 Binary files /dev/null and b/assets/cards/faces/3C.png differ diff --git a/assets/cards/faces/3D.png b/assets/cards/faces/3D.png new file mode 100644 index 0000000..b461ded Binary files /dev/null and b/assets/cards/faces/3D.png differ diff --git a/assets/cards/faces/3H.png b/assets/cards/faces/3H.png new file mode 100644 index 0000000..9846a6d Binary files /dev/null and b/assets/cards/faces/3H.png differ diff --git a/assets/cards/faces/3S.png b/assets/cards/faces/3S.png new file mode 100644 index 0000000..76112bb Binary files /dev/null and b/assets/cards/faces/3S.png differ diff --git a/assets/cards/faces/3_c.png b/assets/cards/faces/3_c.png deleted file mode 100644 index 96486d1..0000000 Binary files a/assets/cards/faces/3_c.png and /dev/null differ diff --git a/assets/cards/faces/3_d.png b/assets/cards/faces/3_d.png deleted file mode 100644 index 71bb2df..0000000 Binary files a/assets/cards/faces/3_d.png and /dev/null differ diff --git a/assets/cards/faces/3_h.png b/assets/cards/faces/3_h.png deleted file mode 100644 index e8e2570..0000000 Binary files a/assets/cards/faces/3_h.png and /dev/null differ diff --git a/assets/cards/faces/3_s.png b/assets/cards/faces/3_s.png deleted file mode 100644 index 473aa94..0000000 Binary files a/assets/cards/faces/3_s.png and /dev/null differ diff --git a/assets/cards/faces/4C.png b/assets/cards/faces/4C.png new file mode 100644 index 0000000..e79ae1e Binary files /dev/null and b/assets/cards/faces/4C.png differ diff --git a/assets/cards/faces/4D.png b/assets/cards/faces/4D.png new file mode 100644 index 0000000..03b21e2 Binary files /dev/null and b/assets/cards/faces/4D.png differ diff --git a/assets/cards/faces/4H.png b/assets/cards/faces/4H.png new file mode 100644 index 0000000..7a9dcdf Binary files /dev/null and b/assets/cards/faces/4H.png differ diff --git a/assets/cards/faces/4S.png b/assets/cards/faces/4S.png new file mode 100644 index 0000000..7264b9e Binary files /dev/null and b/assets/cards/faces/4S.png differ diff --git a/assets/cards/faces/4_c.png b/assets/cards/faces/4_c.png deleted file mode 100644 index d749ec4..0000000 Binary files a/assets/cards/faces/4_c.png and /dev/null differ diff --git a/assets/cards/faces/4_d.png b/assets/cards/faces/4_d.png deleted file mode 100644 index 2ee4950..0000000 Binary files a/assets/cards/faces/4_d.png and /dev/null differ diff --git a/assets/cards/faces/4_h.png b/assets/cards/faces/4_h.png deleted file mode 100644 index 83bea1a..0000000 Binary files a/assets/cards/faces/4_h.png and /dev/null differ diff --git a/assets/cards/faces/4_s.png b/assets/cards/faces/4_s.png deleted file mode 100644 index 71cd7f9..0000000 Binary files a/assets/cards/faces/4_s.png and /dev/null differ diff --git a/assets/cards/faces/5C.png b/assets/cards/faces/5C.png new file mode 100644 index 0000000..597ca4f Binary files /dev/null and b/assets/cards/faces/5C.png differ diff --git a/assets/cards/faces/5D.png b/assets/cards/faces/5D.png new file mode 100644 index 0000000..2d4982a Binary files /dev/null and b/assets/cards/faces/5D.png differ diff --git a/assets/cards/faces/5H.png b/assets/cards/faces/5H.png new file mode 100644 index 0000000..245d714 Binary files /dev/null and b/assets/cards/faces/5H.png differ diff --git a/assets/cards/faces/5S.png b/assets/cards/faces/5S.png new file mode 100644 index 0000000..edace7d Binary files /dev/null and b/assets/cards/faces/5S.png differ diff --git a/assets/cards/faces/5_c.png b/assets/cards/faces/5_c.png deleted file mode 100644 index c5e0cd6..0000000 Binary files a/assets/cards/faces/5_c.png and /dev/null differ diff --git a/assets/cards/faces/5_d.png b/assets/cards/faces/5_d.png deleted file mode 100644 index b0414ca..0000000 Binary files a/assets/cards/faces/5_d.png and /dev/null differ diff --git a/assets/cards/faces/5_h.png b/assets/cards/faces/5_h.png deleted file mode 100644 index f17eeff..0000000 Binary files a/assets/cards/faces/5_h.png and /dev/null differ diff --git a/assets/cards/faces/5_s.png b/assets/cards/faces/5_s.png deleted file mode 100644 index d7a7c3b..0000000 Binary files a/assets/cards/faces/5_s.png and /dev/null differ diff --git a/assets/cards/faces/6C.png b/assets/cards/faces/6C.png new file mode 100644 index 0000000..9c6344f Binary files /dev/null and b/assets/cards/faces/6C.png differ diff --git a/assets/cards/faces/6D.png b/assets/cards/faces/6D.png new file mode 100644 index 0000000..01e4e26 Binary files /dev/null and b/assets/cards/faces/6D.png differ diff --git a/assets/cards/faces/6H.png b/assets/cards/faces/6H.png new file mode 100644 index 0000000..5b0ea2b Binary files /dev/null and b/assets/cards/faces/6H.png differ diff --git a/assets/cards/faces/6S.png b/assets/cards/faces/6S.png new file mode 100644 index 0000000..e187d6f Binary files /dev/null and b/assets/cards/faces/6S.png differ diff --git a/assets/cards/faces/6_c.png b/assets/cards/faces/6_c.png deleted file mode 100644 index 0e3c3f5..0000000 Binary files a/assets/cards/faces/6_c.png and /dev/null differ diff --git a/assets/cards/faces/6_d.png b/assets/cards/faces/6_d.png deleted file mode 100644 index 99e60ff..0000000 Binary files a/assets/cards/faces/6_d.png and /dev/null differ diff --git a/assets/cards/faces/6_h.png b/assets/cards/faces/6_h.png deleted file mode 100644 index f2da2ab..0000000 Binary files a/assets/cards/faces/6_h.png and /dev/null differ diff --git a/assets/cards/faces/6_s.png b/assets/cards/faces/6_s.png deleted file mode 100644 index 57067d3..0000000 Binary files a/assets/cards/faces/6_s.png and /dev/null differ diff --git a/assets/cards/faces/7C.png b/assets/cards/faces/7C.png new file mode 100644 index 0000000..1c0ace5 Binary files /dev/null and b/assets/cards/faces/7C.png differ diff --git a/assets/cards/faces/7D.png b/assets/cards/faces/7D.png new file mode 100644 index 0000000..e8bedb8 Binary files /dev/null and b/assets/cards/faces/7D.png differ diff --git a/assets/cards/faces/7H.png b/assets/cards/faces/7H.png new file mode 100644 index 0000000..75e99a8 Binary files /dev/null and b/assets/cards/faces/7H.png differ diff --git a/assets/cards/faces/7S.png b/assets/cards/faces/7S.png new file mode 100644 index 0000000..159c080 Binary files /dev/null and b/assets/cards/faces/7S.png differ diff --git a/assets/cards/faces/7_c.png b/assets/cards/faces/7_c.png deleted file mode 100644 index 6714efb..0000000 Binary files a/assets/cards/faces/7_c.png and /dev/null differ diff --git a/assets/cards/faces/7_d.png b/assets/cards/faces/7_d.png deleted file mode 100644 index 046fd85..0000000 Binary files a/assets/cards/faces/7_d.png and /dev/null differ diff --git a/assets/cards/faces/7_h.png b/assets/cards/faces/7_h.png deleted file mode 100644 index 6acd6ad..0000000 Binary files a/assets/cards/faces/7_h.png and /dev/null differ diff --git a/assets/cards/faces/7_s.png b/assets/cards/faces/7_s.png deleted file mode 100644 index dc06539..0000000 Binary files a/assets/cards/faces/7_s.png and /dev/null differ diff --git a/assets/cards/faces/8C.png b/assets/cards/faces/8C.png new file mode 100644 index 0000000..13f4009 Binary files /dev/null and b/assets/cards/faces/8C.png differ diff --git a/assets/cards/faces/8D.png b/assets/cards/faces/8D.png new file mode 100644 index 0000000..8fc76fd Binary files /dev/null and b/assets/cards/faces/8D.png differ diff --git a/assets/cards/faces/8H.png b/assets/cards/faces/8H.png new file mode 100644 index 0000000..79133bd Binary files /dev/null and b/assets/cards/faces/8H.png differ diff --git a/assets/cards/faces/8S.png b/assets/cards/faces/8S.png new file mode 100644 index 0000000..c28ee94 Binary files /dev/null and b/assets/cards/faces/8S.png differ diff --git a/assets/cards/faces/8_c.png b/assets/cards/faces/8_c.png deleted file mode 100644 index 17e1de6..0000000 Binary files a/assets/cards/faces/8_c.png and /dev/null differ diff --git a/assets/cards/faces/8_d.png b/assets/cards/faces/8_d.png deleted file mode 100644 index dee3302..0000000 Binary files a/assets/cards/faces/8_d.png and /dev/null differ diff --git a/assets/cards/faces/8_h.png b/assets/cards/faces/8_h.png deleted file mode 100644 index 8beffa4..0000000 Binary files a/assets/cards/faces/8_h.png and /dev/null differ diff --git a/assets/cards/faces/8_s.png b/assets/cards/faces/8_s.png deleted file mode 100644 index 74cfe04..0000000 Binary files a/assets/cards/faces/8_s.png and /dev/null differ diff --git a/assets/cards/faces/9C.png b/assets/cards/faces/9C.png new file mode 100644 index 0000000..5404b34 Binary files /dev/null and b/assets/cards/faces/9C.png differ diff --git a/assets/cards/faces/9D.png b/assets/cards/faces/9D.png new file mode 100644 index 0000000..b92c266 Binary files /dev/null and b/assets/cards/faces/9D.png differ diff --git a/assets/cards/faces/9H.png b/assets/cards/faces/9H.png new file mode 100644 index 0000000..240b38a Binary files /dev/null and b/assets/cards/faces/9H.png differ diff --git a/assets/cards/faces/9S.png b/assets/cards/faces/9S.png new file mode 100644 index 0000000..4d5b93b Binary files /dev/null and b/assets/cards/faces/9S.png differ diff --git a/assets/cards/faces/9_c.png b/assets/cards/faces/9_c.png deleted file mode 100644 index ae5ed5a..0000000 Binary files a/assets/cards/faces/9_c.png and /dev/null differ diff --git a/assets/cards/faces/9_d.png b/assets/cards/faces/9_d.png deleted file mode 100644 index 939880d..0000000 Binary files a/assets/cards/faces/9_d.png and /dev/null differ diff --git a/assets/cards/faces/9_h.png b/assets/cards/faces/9_h.png deleted file mode 100644 index 5c76371..0000000 Binary files a/assets/cards/faces/9_h.png and /dev/null differ diff --git a/assets/cards/faces/9_s.png b/assets/cards/faces/9_s.png deleted file mode 100644 index de5bb85..0000000 Binary files a/assets/cards/faces/9_s.png and /dev/null differ diff --git a/assets/cards/faces/AC.png b/assets/cards/faces/AC.png new file mode 100644 index 0000000..96eb269 Binary files /dev/null and b/assets/cards/faces/AC.png differ diff --git a/assets/cards/faces/AD.png b/assets/cards/faces/AD.png new file mode 100644 index 0000000..c6b1f1c Binary files /dev/null and b/assets/cards/faces/AD.png differ diff --git a/assets/cards/faces/AH.png b/assets/cards/faces/AH.png new file mode 100644 index 0000000..752165d Binary files /dev/null and b/assets/cards/faces/AH.png differ diff --git a/assets/cards/faces/AS.png b/assets/cards/faces/AS.png new file mode 100644 index 0000000..89ad5e2 Binary files /dev/null and b/assets/cards/faces/AS.png differ diff --git a/assets/cards/faces/JC.png b/assets/cards/faces/JC.png new file mode 100644 index 0000000..985fbde Binary files /dev/null and b/assets/cards/faces/JC.png differ diff --git a/assets/cards/faces/JD.png b/assets/cards/faces/JD.png new file mode 100644 index 0000000..e9c0684 Binary files /dev/null and b/assets/cards/faces/JD.png differ diff --git a/assets/cards/faces/JH.png b/assets/cards/faces/JH.png new file mode 100644 index 0000000..f357287 Binary files /dev/null and b/assets/cards/faces/JH.png differ diff --git a/assets/cards/faces/JS.png b/assets/cards/faces/JS.png new file mode 100644 index 0000000..87244c0 Binary files /dev/null and b/assets/cards/faces/JS.png differ diff --git a/assets/cards/faces/KC.png b/assets/cards/faces/KC.png new file mode 100644 index 0000000..ddfe332 Binary files /dev/null and b/assets/cards/faces/KC.png differ diff --git a/assets/cards/faces/KD.png b/assets/cards/faces/KD.png new file mode 100644 index 0000000..89f1346 Binary files /dev/null and b/assets/cards/faces/KD.png differ diff --git a/assets/cards/faces/KH.png b/assets/cards/faces/KH.png new file mode 100644 index 0000000..b0186b6 Binary files /dev/null and b/assets/cards/faces/KH.png differ diff --git a/assets/cards/faces/KS.png b/assets/cards/faces/KS.png new file mode 100644 index 0000000..314e39c Binary files /dev/null and b/assets/cards/faces/KS.png differ diff --git a/assets/cards/faces/QC.png b/assets/cards/faces/QC.png new file mode 100644 index 0000000..37c528e Binary files /dev/null and b/assets/cards/faces/QC.png differ diff --git a/assets/cards/faces/QD.png b/assets/cards/faces/QD.png new file mode 100644 index 0000000..5a5066a Binary files /dev/null and b/assets/cards/faces/QD.png differ diff --git a/assets/cards/faces/QH.png b/assets/cards/faces/QH.png new file mode 100644 index 0000000..9e962e6 Binary files /dev/null and b/assets/cards/faces/QH.png differ diff --git a/assets/cards/faces/QS.png b/assets/cards/faces/QS.png new file mode 100644 index 0000000..0cb6de4 Binary files /dev/null and b/assets/cards/faces/QS.png differ diff --git a/assets/cards/faces/a_c.png b/assets/cards/faces/a_c.png deleted file mode 100644 index 7d20378..0000000 Binary files a/assets/cards/faces/a_c.png and /dev/null differ diff --git a/assets/cards/faces/a_d.png b/assets/cards/faces/a_d.png deleted file mode 100644 index 30a0565..0000000 Binary files a/assets/cards/faces/a_d.png and /dev/null differ diff --git a/assets/cards/faces/a_h.png b/assets/cards/faces/a_h.png deleted file mode 100644 index ac01018..0000000 Binary files a/assets/cards/faces/a_h.png and /dev/null differ diff --git a/assets/cards/faces/a_s.png b/assets/cards/faces/a_s.png deleted file mode 100644 index ff461e4..0000000 Binary files a/assets/cards/faces/a_s.png and /dev/null differ diff --git a/assets/cards/faces/j_c.png b/assets/cards/faces/j_c.png deleted file mode 100644 index 3d1642c..0000000 Binary files a/assets/cards/faces/j_c.png and /dev/null differ diff --git a/assets/cards/faces/j_d.png b/assets/cards/faces/j_d.png deleted file mode 100644 index 814d756..0000000 Binary files a/assets/cards/faces/j_d.png and /dev/null differ diff --git a/assets/cards/faces/j_h.png b/assets/cards/faces/j_h.png deleted file mode 100644 index bb03374..0000000 Binary files a/assets/cards/faces/j_h.png and /dev/null differ diff --git a/assets/cards/faces/j_s.png b/assets/cards/faces/j_s.png deleted file mode 100644 index 2d012e2..0000000 Binary files a/assets/cards/faces/j_s.png and /dev/null differ diff --git a/assets/cards/faces/k_c.png b/assets/cards/faces/k_c.png deleted file mode 100644 index f4c6081..0000000 Binary files a/assets/cards/faces/k_c.png and /dev/null differ diff --git a/assets/cards/faces/k_d.png b/assets/cards/faces/k_d.png deleted file mode 100644 index 746cafd..0000000 Binary files a/assets/cards/faces/k_d.png and /dev/null differ diff --git a/assets/cards/faces/k_h.png b/assets/cards/faces/k_h.png deleted file mode 100644 index ec8b86a..0000000 Binary files a/assets/cards/faces/k_h.png and /dev/null differ diff --git a/assets/cards/faces/k_s.png b/assets/cards/faces/k_s.png deleted file mode 100644 index c9c72f3..0000000 Binary files a/assets/cards/faces/k_s.png and /dev/null differ diff --git a/assets/cards/faces/q_c.png b/assets/cards/faces/q_c.png deleted file mode 100644 index b0cdfcb..0000000 Binary files a/assets/cards/faces/q_c.png and /dev/null differ diff --git a/assets/cards/faces/q_d.png b/assets/cards/faces/q_d.png deleted file mode 100644 index 1766d60..0000000 Binary files a/assets/cards/faces/q_d.png and /dev/null differ diff --git a/assets/cards/faces/q_h.png b/assets/cards/faces/q_h.png deleted file mode 100644 index b969279..0000000 Binary files a/assets/cards/faces/q_h.png and /dev/null differ diff --git a/assets/cards/faces/q_s.png b/assets/cards/faces/q_s.png deleted file mode 100644 index 3d8a048..0000000 Binary files a/assets/cards/faces/q_s.png and /dev/null differ diff --git a/solitaire_engine/src/card_plugin.rs b/solitaire_engine/src/card_plugin.rs index 031c34f..87060bb 100644 --- a/solitaire_engine/src/card_plugin.rs +++ b/solitaire_engine/src/card_plugin.rs @@ -196,111 +196,36 @@ impl Plugin for CardPlugin { } } -/// Loads card face and back PNGs at startup and inserts [`CardImageSet`]. +/// Loads card face and back PNGs at startup via [`AssetServer`] and inserts +/// [`CardImageSet`]. /// -/// The PNGs are embedded at compile time via `include_bytes!()`. Missing -/// files are compile errors, not runtime panics. Under `MinimalPlugins` -/// (tests) this system is still registered but `Assets` is unavailable, -/// so it does nothing and the plugin falls back to solid-colour sprites. -fn load_card_images(images: Option>>, mut commands: Commands) { - let Some(mut images) = images else { +/// Faces: `assets/cards/faces/{RANK}{SUIT}.png` (e.g. `AC.png`, `10H.png`) +/// Backs: `assets/cards/backs/back_{0..4}.png` +/// +/// Under `MinimalPlugins` (tests) `AssetServer` is absent, so the system +/// returns without inserting `CardImageSet` and the plugin falls back to +/// solid-colour sprites. +fn load_card_images(asset_server: Option>, mut commands: Commands) { + let Some(asset_server) = asset_server else { return; }; - use bevy::asset::RenderAssetUsages; - use bevy::image::{CompressedImageFormats, ImageSampler, ImageType}; - let load = |bytes: &[u8]| { - Image::from_buffer( - bytes, - ImageType::Extension("png"), - CompressedImageFormats::NONE, - true, - ImageSampler::default(), - RenderAssetUsages::RENDER_WORLD, - ) - .expect("valid card PNG") - }; - - // 52 face images: faces[suit][rank] - // Suit: Clubs=0, Diamonds=1, Hearts=2, Spades=3 - // Rank: Ace=0 … King=12 - const FACE_BYTES: [[&[u8]; 13]; 4] = [ - // Clubs - [ - include_bytes!("../../assets/cards/faces/a_c.png"), - include_bytes!("../../assets/cards/faces/2_c.png"), - include_bytes!("../../assets/cards/faces/3_c.png"), - include_bytes!("../../assets/cards/faces/4_c.png"), - include_bytes!("../../assets/cards/faces/5_c.png"), - include_bytes!("../../assets/cards/faces/6_c.png"), - include_bytes!("../../assets/cards/faces/7_c.png"), - include_bytes!("../../assets/cards/faces/8_c.png"), - include_bytes!("../../assets/cards/faces/9_c.png"), - include_bytes!("../../assets/cards/faces/10_c.png"), - include_bytes!("../../assets/cards/faces/j_c.png"), - include_bytes!("../../assets/cards/faces/q_c.png"), - include_bytes!("../../assets/cards/faces/k_c.png"), - ], - // Diamonds - [ - include_bytes!("../../assets/cards/faces/a_d.png"), - include_bytes!("../../assets/cards/faces/2_d.png"), - include_bytes!("../../assets/cards/faces/3_d.png"), - include_bytes!("../../assets/cards/faces/4_d.png"), - include_bytes!("../../assets/cards/faces/5_d.png"), - include_bytes!("../../assets/cards/faces/6_d.png"), - include_bytes!("../../assets/cards/faces/7_d.png"), - include_bytes!("../../assets/cards/faces/8_d.png"), - include_bytes!("../../assets/cards/faces/9_d.png"), - include_bytes!("../../assets/cards/faces/10_d.png"), - include_bytes!("../../assets/cards/faces/j_d.png"), - include_bytes!("../../assets/cards/faces/q_d.png"), - include_bytes!("../../assets/cards/faces/k_d.png"), - ], - // Hearts - [ - include_bytes!("../../assets/cards/faces/a_h.png"), - include_bytes!("../../assets/cards/faces/2_h.png"), - include_bytes!("../../assets/cards/faces/3_h.png"), - include_bytes!("../../assets/cards/faces/4_h.png"), - include_bytes!("../../assets/cards/faces/5_h.png"), - include_bytes!("../../assets/cards/faces/6_h.png"), - include_bytes!("../../assets/cards/faces/7_h.png"), - include_bytes!("../../assets/cards/faces/8_h.png"), - include_bytes!("../../assets/cards/faces/9_h.png"), - include_bytes!("../../assets/cards/faces/10_h.png"), - include_bytes!("../../assets/cards/faces/j_h.png"), - include_bytes!("../../assets/cards/faces/q_h.png"), - include_bytes!("../../assets/cards/faces/k_h.png"), - ], - // Spades - [ - include_bytes!("../../assets/cards/faces/a_s.png"), - include_bytes!("../../assets/cards/faces/2_s.png"), - include_bytes!("../../assets/cards/faces/3_s.png"), - include_bytes!("../../assets/cards/faces/4_s.png"), - include_bytes!("../../assets/cards/faces/5_s.png"), - include_bytes!("../../assets/cards/faces/6_s.png"), - include_bytes!("../../assets/cards/faces/7_s.png"), - include_bytes!("../../assets/cards/faces/8_s.png"), - include_bytes!("../../assets/cards/faces/9_s.png"), - include_bytes!("../../assets/cards/faces/10_s.png"), - include_bytes!("../../assets/cards/faces/j_s.png"), - include_bytes!("../../assets/cards/faces/q_s.png"), - include_bytes!("../../assets/cards/faces/k_s.png"), - ], - ]; + // Suit index: Clubs=0, Diamonds=1, Hearts=2, Spades=3 + const SUIT_CHARS: [&str; 4] = ["C", "D", "H", "S"]; + // Rank index: Ace=0 … King=12 + const RANK_STRS: [&str; 13] = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]; let faces: [[Handle; 13]; 4] = std::array::from_fn(|suit| { - std::array::from_fn(|rank| images.add(load(FACE_BYTES[suit][rank]))) + std::array::from_fn(|rank| { + asset_server.load(format!( + "cards/faces/{}{}.png", + RANK_STRS[rank], SUIT_CHARS[suit] + )) + }) + }); + let backs = std::array::from_fn(|i| { + asset_server.load(format!("cards/backs/back_{i}.png")) }); - let backs = [ - images.add(load(include_bytes!("../../assets/cards/backs/back_0.png"))), - images.add(load(include_bytes!("../../assets/cards/backs/back_1.png"))), - images.add(load(include_bytes!("../../assets/cards/backs/back_2.png"))), - images.add(load(include_bytes!("../../assets/cards/backs/back_3.png"))), - images.add(load(include_bytes!("../../assets/cards/backs/back_4.png"))), - ]; commands.insert_resource(CardImageSet { faces, backs }); } diff --git a/solitaire_engine/src/font_plugin.rs b/solitaire_engine/src/font_plugin.rs index 22e588b..6bdfa95 100644 --- a/solitaire_engine/src/font_plugin.rs +++ b/solitaire_engine/src/font_plugin.rs @@ -1,6 +1,6 @@ // Register FontPlugin in solitaire_engine/src/lib.rs before use. -//! Embeds FiraMono-Medium as the project font and exposes it via [`FontResource`]. +//! Loads FiraMono-Medium via the Bevy `AssetServer` and exposes it via [`FontResource`]. use bevy::prelude::*; @@ -17,20 +17,11 @@ impl Plugin for FontPlugin { } } -fn load_font(fonts: Option>>, mut commands: Commands) { - let Some(mut fonts) = fonts else { - // Assets absent (e.g. MinimalPlugins in tests) — insert default. +fn load_font(asset_server: Option>, mut commands: Commands) { + let Some(asset_server) = asset_server else { + // AssetServer absent (e.g. MinimalPlugins in tests) — insert default. commands.insert_resource(FontResource(Handle::default())); return; }; - let bytes: &'static [u8] = include_bytes!("../../assets/fonts/main.ttf"); - match Font::try_from_bytes(bytes.to_vec()) { - Ok(font) => { - commands.insert_resource(FontResource(fonts.add(font))); - } - Err(e) => { - warn!("failed to load main.ttf: {e}; falling back to Bevy default font"); - commands.insert_resource(FontResource(Handle::default())); - } - } + commands.insert_resource(FontResource(asset_server.load("fonts/main.ttf"))); } diff --git a/solitaire_engine/src/table_plugin.rs b/solitaire_engine/src/table_plugin.rs index 0a6a202..fe95d11 100644 --- a/solitaire_engine/src/table_plugin.rs +++ b/solitaire_engine/src/table_plugin.rs @@ -9,7 +9,7 @@ use bevy::window::WindowResized; use solitaire_core::card::Suit; use solitaire_core::pile::PileType; -use crate::events::HintVisualEvent; +use crate::events::{HintVisualEvent, StateChangedEvent}; use crate::layout::{compute_layout, Layout, LayoutResource}; #[cfg(test)] use crate::layout::TABLE_COLOUR; @@ -63,6 +63,7 @@ impl Plugin for TablePlugin { app.add_message::() .add_message::() .add_message::() + .add_message::() .add_systems(Startup, load_background_images.before(setup_table)) .add_systems(Startup, setup_table) .add_systems( @@ -77,41 +78,17 @@ impl Plugin for TablePlugin { } } -/// Loads the 5 background PNG files at startup and stores their -/// [`Handle`]s in [`BackgroundImageSet`]. -/// -/// The PNGs are embedded at compile time via `include_bytes!()`. If a file -/// is missing the build will fail with a clear error rather than a runtime -/// panic. -fn load_background_images(images: Option>>, mut commands: Commands) { - let Some(mut images) = images else { - // Assets is absent (e.g. MinimalPlugins in tests) — insert an +/// Loads the 5 background PNG files at startup via the Bevy `AssetServer` and +/// stores their [`Handle`]s in [`BackgroundImageSet`]. +fn load_background_images(asset_server: Option>, mut commands: Commands) { + let Some(asset_server) = asset_server else { + // AssetServer absent (e.g. MinimalPlugins in tests) — insert an // empty set so setup_table can proceed using a default handle. commands.insert_resource(BackgroundImageSet { handles: Vec::new() }); return; }; - const BG_BYTES: [&[u8]; 5] = [ - include_bytes!("../../assets/backgrounds/bg_0.png"), - include_bytes!("../../assets/backgrounds/bg_1.png"), - include_bytes!("../../assets/backgrounds/bg_2.png"), - include_bytes!("../../assets/backgrounds/bg_3.png"), - include_bytes!("../../assets/backgrounds/bg_4.png"), - ]; - let handles = BG_BYTES - .iter() - .map(|bytes| { - use bevy::image::{CompressedImageFormats, ImageSampler, ImageType}; - let image = Image::from_buffer( - bytes, - ImageType::Extension("png"), - CompressedImageFormats::NONE, - true, - ImageSampler::default(), - bevy::asset::RenderAssetUsages::RENDER_WORLD, - ) - .expect("valid background PNG"); - images.add(image) - }) + let handles = (0..5) + .map(|i| asset_server.load(format!("backgrounds/bg_{i}.png"))) .collect(); commands.insert_resource(BackgroundImageSet { handles }); } @@ -298,10 +275,12 @@ fn spawn_pile_markers(commands: &mut Commands, layout: &Layout) { } } +#[allow(clippy::too_many_arguments)] #[allow(clippy::type_complexity)] fn on_window_resized( mut events: MessageReader, mut layout_res: Option>, + mut state_changed: MessageWriter, mut backgrounds: Query< (&mut Sprite, &mut Transform), (With, Without), @@ -331,6 +310,9 @@ fn on_window_resized( transform.translation.y = pos.y; } } + + // Reposition card sprites to the new layout. + state_changed.write(StateChangedEvent); } // ---------------------------------------------------------------------------