From 21ec03b15751020e109d6d54ef5ddd7f68feafcd Mon Sep 17 00:00:00 2001 From: funman300 Date: Wed, 6 May 2026 19:28:53 -0700 Subject: [PATCH] feat(engine): bundle Rusty Pixel as a built-in theme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pixel-art card theme generated via Claude Design (53 PNGs at 256x384, ~340 KB total) now ships embedded in the binary alongside the existing default SVG theme. Players see the new theme in the picker out of the box without needing to drop files into ~/.local/share/solitaire_quest/themes/. solitaire_engine/assets/themes/rusty-pixel/: - 53 PNGs (52 face cards + 1 back) at 256x384 - theme.ron declaring meta.id = "rusty-pixel", card_aspect = (2, 3), pixel_art = true assets/sources.rs: - New constants RUSTY_PIXEL_THEME_MANIFEST_URL, RUSTY_PIXEL_THEME_MANIFEST_PATH, RUSTY_PIXEL_THEME_MANIFEST_BYTES. - New embed_rusty_pixel_png! macro mirroring embed_default_svg!. - New RUSTY_PIXEL_THEME_PNGS table — 53 entries, one per file. - New rusty_pixel_theme_png_bytes(filename) lookup helper mirroring default_theme_svg_bytes for the thumbnail cache. - New populate_embedded_rusty_pixel_theme(app) registers the manifest + every PNG into Bevy's EmbeddedAssetRegistry. - AssetSourcesPlugin::build now calls both populate functions so the picker has both themes loadable from the binary alone. theme/registry.rs: - New rusty_pixel_entry() returns the bundled metadata. - build_registry now inserts default + rusty-pixel ahead of the user-dir scan, and filters user themes whose id collides with a bundled built-in. Bundled wins on collision because it's guaranteed complete; the user's overriding copy may be partial or stale. - Updated existing tests for the new len()=2-instead-of-1 baseline. - New test user_theme_id_collision_with_bundled_is_dropped pins the dedup contract. theme/plugin.rs: - load_initial_theme + react_to_settings_theme_change now both consult a new manifest_url_for(theme_id) helper that routes bundled built-ins through embedded:// and unknown ids through themes://. Drops the previous hard-coded "default → DEFAULT_THEME_MANIFEST_URL else themes://" branch. - read_theme_preview_bytes also checks the rusty-pixel embed table before falling through to the user-dir filesystem read, so the picker chip's thumbnail works on a fresh install where the user-dir doesn't exist. Workspace: 1172 passing tests / 0 failing, was 1171 (+1 net from the new collision test). cargo clippy --workspace --all-targets -- -D warnings clean. Binary grows by ~340 KB (the 53 bundled PNGs). Co-Authored-By: Claude Opus 4.7 --- .../assets/themes/rusty-pixel/back.png | Bin 0 -> 4947 bytes .../assets/themes/rusty-pixel/clubs_10.png | Bin 0 -> 4714 bytes .../assets/themes/rusty-pixel/clubs_2.png | Bin 0 -> 3539 bytes .../assets/themes/rusty-pixel/clubs_3.png | Bin 0 -> 3787 bytes .../assets/themes/rusty-pixel/clubs_4.png | Bin 0 -> 3947 bytes .../assets/themes/rusty-pixel/clubs_5.png | Bin 0 -> 4029 bytes .../assets/themes/rusty-pixel/clubs_6.png | Bin 0 -> 4189 bytes .../assets/themes/rusty-pixel/clubs_7.png | Bin 0 -> 4312 bytes .../assets/themes/rusty-pixel/clubs_8.png | Bin 0 -> 4429 bytes .../assets/themes/rusty-pixel/clubs_9.png | Bin 0 -> 4589 bytes .../assets/themes/rusty-pixel/clubs_ace.png | Bin 0 -> 3692 bytes .../assets/themes/rusty-pixel/clubs_jack.png | Bin 0 -> 4651 bytes .../assets/themes/rusty-pixel/clubs_king.png | Bin 0 -> 4656 bytes .../assets/themes/rusty-pixel/clubs_queen.png | Bin 0 -> 4594 bytes .../assets/themes/rusty-pixel/diamonds_10.png | Bin 0 -> 4704 bytes .../assets/themes/rusty-pixel/diamonds_2.png | Bin 0 -> 3654 bytes .../assets/themes/rusty-pixel/diamonds_3.png | Bin 0 -> 3875 bytes .../assets/themes/rusty-pixel/diamonds_4.png | Bin 0 -> 3936 bytes .../assets/themes/rusty-pixel/diamonds_5.png | Bin 0 -> 4015 bytes .../assets/themes/rusty-pixel/diamonds_6.png | Bin 0 -> 4140 bytes .../assets/themes/rusty-pixel/diamonds_7.png | Bin 0 -> 4258 bytes .../assets/themes/rusty-pixel/diamonds_8.png | Bin 0 -> 4384 bytes .../assets/themes/rusty-pixel/diamonds_9.png | Bin 0 -> 4516 bytes .../themes/rusty-pixel/diamonds_ace.png | Bin 0 -> 3529 bytes .../themes/rusty-pixel/diamonds_jack.png | Bin 0 -> 4654 bytes .../themes/rusty-pixel/diamonds_king.png | Bin 0 -> 4650 bytes .../themes/rusty-pixel/diamonds_queen.png | Bin 0 -> 4589 bytes .../assets/themes/rusty-pixel/hearts_10.png | Bin 0 -> 4503 bytes .../assets/themes/rusty-pixel/hearts_2.png | Bin 0 -> 3558 bytes .../assets/themes/rusty-pixel/hearts_3.png | Bin 0 -> 3569 bytes .../assets/themes/rusty-pixel/hearts_4.png | Bin 0 -> 3859 bytes .../assets/themes/rusty-pixel/hearts_5.png | Bin 0 -> 3865 bytes .../assets/themes/rusty-pixel/hearts_6.png | Bin 0 -> 4045 bytes .../assets/themes/rusty-pixel/hearts_7.png | Bin 0 -> 4163 bytes .../assets/themes/rusty-pixel/hearts_8.png | Bin 0 -> 4194 bytes .../assets/themes/rusty-pixel/hearts_9.png | Bin 0 -> 4357 bytes .../assets/themes/rusty-pixel/hearts_ace.png | Bin 0 -> 3478 bytes .../assets/themes/rusty-pixel/hearts_jack.png | Bin 0 -> 4640 bytes .../assets/themes/rusty-pixel/hearts_king.png | Bin 0 -> 4649 bytes .../themes/rusty-pixel/hearts_queen.png | Bin 0 -> 4579 bytes .../assets/themes/rusty-pixel/spades_10.png | Bin 0 -> 4634 bytes .../assets/themes/rusty-pixel/spades_2.png | Bin 0 -> 3295 bytes .../assets/themes/rusty-pixel/spades_3.png | Bin 0 -> 3484 bytes .../assets/themes/rusty-pixel/spades_4.png | Bin 0 -> 3916 bytes .../assets/themes/rusty-pixel/spades_5.png | Bin 0 -> 3956 bytes .../assets/themes/rusty-pixel/spades_6.png | Bin 0 -> 4137 bytes .../assets/themes/rusty-pixel/spades_7.png | Bin 0 -> 4236 bytes .../assets/themes/rusty-pixel/spades_8.png | Bin 0 -> 4360 bytes .../assets/themes/rusty-pixel/spades_9.png | Bin 0 -> 4522 bytes .../assets/themes/rusty-pixel/spades_ace.png | Bin 0 -> 3643 bytes .../assets/themes/rusty-pixel/spades_jack.png | Bin 0 -> 4645 bytes .../assets/themes/rusty-pixel/spades_king.png | Bin 0 -> 4647 bytes .../themes/rusty-pixel/spades_queen.png | Bin 0 -> 4577 bytes .../assets/themes/rusty-pixel/theme.ron | 76 ++++++++++ solitaire_engine/src/assets/mod.rs | 6 +- solitaire_engine/src/assets/sources.rs | 132 ++++++++++++++++++ solitaire_engine/src/theme/plugin.rs | 46 ++++-- solitaire_engine/src/theme/registry.rs | 90 ++++++++++-- 58 files changed, 326 insertions(+), 24 deletions(-) create mode 100644 solitaire_engine/assets/themes/rusty-pixel/back.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_10.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_2.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_3.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_4.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_5.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_6.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_7.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_8.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_9.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_ace.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_jack.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_king.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/clubs_queen.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_10.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_2.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_3.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_4.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_5.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_6.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_7.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_8.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_9.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_ace.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_jack.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_king.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/diamonds_queen.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_10.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_2.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_3.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_4.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_5.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_6.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_7.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_8.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_9.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_ace.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_jack.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_king.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/hearts_queen.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_10.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_2.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_3.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_4.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_5.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_6.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_7.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_8.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_9.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_ace.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_jack.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_king.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/spades_queen.png create mode 100644 solitaire_engine/assets/themes/rusty-pixel/theme.ron diff --git a/solitaire_engine/assets/themes/rusty-pixel/back.png b/solitaire_engine/assets/themes/rusty-pixel/back.png new file mode 100644 index 0000000000000000000000000000000000000000..ef19f35eaef8fe0e0469eeb5ae27544016d909a6 GIT binary patch literal 4947 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_10.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_10.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5e928cd4facd0f225aa9b9cece3c641b8ae104 GIT binary patch literal 4714 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_2.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b6eda9db9452165f80a9f8d3df8f0c381be944b7 GIT binary patch literal 3539 zcmeHKYgAO%89n!KFqemT2SgAF3?d8_3y2hk@VX*`Pasx-5Maguwt)t~uQf8D#jdmi6+ z_CEXDw>UI7XtBP9J^*0x=1l=R03h%y!H|pa!@spzhT~P61J>_Mi%|}&{UWNJv+?83 zWeMHl%|)C@;Jt>BJTV@xVtjEv|#7j$aVWPIkzu#+EZl+F5l{ zOYRFlL>*nF3IwOF8kDluh-6oCscj6%>oEIJc+py>y%P^+fG`vyDzdqkTzI~mk%Bc4 zeve4*#mt)=)o+0pL%R}wx|{Y3X43Gm76?|EaG9TG;>vic8EI`!)SM3^$es1HS_#O5 zb~K2tUgrTrxHJf1MmcXs8WwEi3TJ`Vy|4?3x{n2M8;Svu2$dEncohwJO?&K-JBQ0` z7e^mqixDZm9@d%9+C$W!*SL@3p8`Zp@3Bg%H-G`|!o!Op&)C6$?b3wQ-`z%f2Qt8F zcw{NGB`Nl(MFA~e3z5p)qmD9PFW&)V3hTSyQe;*+AR-J=o*qRf&;Hq#28V$#7Fr{D z=4<(9l+Ou3T;Jv70&|VIppT(l2uL~!4x$R}$K7gDQ_WQ93w;qO4hgs4C?CW5jcxLw z-i|osaz@8IGPsbm+`xbne{1EE6FeHsS6<-=e~0s0yUQF2HRu*h(|)ddA#f&>2+v>e zglb&#eD9Uz!ahBURhpUu;XEFkJuy(iDv^_Js79n+eX0vxAZJt23?7?ZKakI+;QcRc zG0bOu@%fZ}S55Ixu;;8ShZWvrC>${VVC7w3b`9|nbL;n0`?EM@W#N-BWxfpoYN$s_@$T_ z_m8Giy_+yGS`VATI*x;Zyb+A72f}uIq{9<60b(BlCJ6onNbg`wlz7D|sKg|g*Vm=x zDVQjHFCHfWSMn&_0l+d`efvYtVmcF|Zdq$2(~~>(&Ee|sT0Av4Y4qk4hb=5<81;=lBqvlj;p0LDF$yr4wN|STw%kwSN1&*64cAQ_bu{obp6YMV&1Zm;a?T z4ZeJ;d07k!&6>^2z%oLVQ}bro$Frn7=5=3^RR5ZKq0jMAh7FPUL$)>!CFg#?+m5ft zci-$@27AHxcTG|EU+d#bwty}%U$Go@H+M)pUd})JQ5vJQ3Yu>2GR*k(QsU+K)3(O& zq|xyeXF-*7KuQ*LfL_WcC^^#h>WB>!lRc|1P8ZabhT!AfQKJ}lWQK+-1e5DX zKTYw|y23Qydw<~>(^E});&h=$SqShjYsl~+>Ww>nL%{8M9y6l**xQ%rk7CECQNtFO zd2hn)SuLnCOPhLyl2ZxE0~2=jwTUU@Qm_4r5@{r@ZOJFfHh{L(_RQ`A8Q+L#Hdjry zo3Q(bu0FG69&57Cia??1+z=nB_ONw6IlHL3Cu_SfQ6h#POu7+`l8N&=ChXSdB6Tw4 zOUu1@D;ck`!DJ7jA86!`dUE-Jn6(x}bKV~ZQD&PdN+Z+ZP9b!4+cAQuMfq*7#B;!_Zd(J&MVGjcC-nFF7)7OYFl%!2BZqCRtzwHWSI>zu}fo`OkMwP3$f>~scM!zS}aV z3opoodg59CrFf;44fkS#vCjTupA{VKIU~gr4?V&H8ENY*!pd7HNg`srMeRwrqgD$C zvp*#I2iQ;4ChRBK%~=*O&2uQsjG`r%?-$uIhYHI@G$?@eojZj?1GkQxNT?vTOr#uHEZU60lpVGE2yM zE5H^pw+-BUp(Cbkf#_S(4V&|K0;>C2Im5OL3$f*36b^6zQ(wL4cG+8j1vB*6tEwU{ SJ{|w8fz2C(11|W-=KTvJnG)gv literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_3.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_3.png new file mode 100644 index 0000000000000000000000000000000000000000..09a1df61a57c1a99044338edcd46a21a1b250cba GIT binary patch literal 3787 zcmeH~X;c(f7RO&z7f_7|)gTB0cCo8LA!?*WgreCrDlkzLHNhr>KnziE!Dg>U1XMz! zCK5!Tm1DpVmWUv-b%`2KB4U(HAhe=_tj)d(^E~q*XEK?b$%pweC!ea$srPQ(d*AQg z`+uk0U0oI`FHr^nEZn@w@go2b_=?cDB7E?x$}0g-J-6A>euvPjzkTDmkE=OO-al#i z*GrbWaP|Njb0p`Uy6kq7sZVW|_S!{0YJ^%#gNH?w?X8jPD@NM-GSky<%loDCQxk*S zSv3T6Ru>x4XK(2)5!tZ`+KCcaBB-`r>|P8X7GDT4WhLe9^5z3bl2+G5reSrHI%Uyxk zu1R{}*`v4l_>?so!X~I+0*=Nq!6;Us|HA^JW(y65eKXf!#Ts%0S@7Le6lsB=HK||L z5zVeNC^ia4{%{jX_s4%iQ(h>RWTl&CP>@F3DVP4n@V~8LhU4hg4M!0a4=|!YYrVC$ zXcqb&`Qip6k=ceXQM<_Gip=-jX# zx{&>`GC93*Uejn^U-TZoGLc!2Vu6W8sl+B18vN{Z#Q>}0ko1x7+hZteG#M54@upMg z!Ko+v^9-;#cv|Kx^aL~}lYf~AkY)r^)F_!fL5e%>(>|HNuWhz`!ZU*9m;W2YWACe_r=zyYpjOaUeDGG$Q!%*$TGX?qz7&lGRC?tIW-jXyk0%Hpa zUcp%glkvdCA7JS)wnv5APf;N#=5EVpk#gv;a5mn6m_kx}f2az8!|{=>Yjk zY`Ko<=?G6~fBmKpx*Nu~7!U(5l^c^mn7a+*KZ6k_jWZ!=ciLdt8(iQiTimHmjYPy( z%JKtk=8ltj=@VmZaNlv;+I9}Jx~fr$pn8RN;UxVUu}E|QXFy@H1~nct&@To9ucBth zvx)FWQ8rgH7ppUWYn#~T3?}@NuCdUXuYMGH;WF@&zl)$Q7kE8hfs{vonz06#2ruli z=&l}oo}V6dmyA!~wk%I);V3|Pr)S2JIZSVgtMyrMI%^xa$11-SftIYN8+zG- zuVsCq=(2P>WRaTu^*CGh8tlwBqdlSvd)X4<+`FWtwwlqYEYFH`u#;VvXGZ%@xtx^u z?9)6LTlkiT)ti5c`fGK+4#EX%WKXI!n9p7m4I0tUrYd^V!9|7A5IwY6h1WWi6J4`T z9NCBy%o6G02F!ic_1uLT%+B&DRWmv~rLBd7v~8Y`En~|RyHDjC(|4cu`F{z5-E+fC zk*5y_uGO(+%LBeRgG;`+(ZNjsu?mszuR>H>l~8Rh9)jy3SfnFtb!8$(09zd|JQLO` z>~yywJ^0?1o1KJa^^7s}|i|^H^K<+8iA01WL3hpg7Y_>%( z(f+VY;JV32Ib1aR>*V9$-pGSSTf}FJar2{w4YVw%Ry?C3(0Trth0B%=G{Hj5_p^TE z2+3df-;@7h3YH%@bT9)PR27VcqMjzaG6?xAu4YwElt+n9-FPQK6~?nAyCtdB2J}PP zjq3)oPBm4E!GW%cys%#jC7?QA*|61SdN<_s^VtU;8q}?t;&ofW-l5kUE`j0why7fz zK(n{H1E#dD#H{ihP>(Cj`~YpXFB(X}+^x#8tj*}Gf})j%bn)ZJC`(ucllMw6%K+}X zo`sQt7%|B~20@?VU)2BUI`*98+C`{to9*vSt{+*N=R`x?irQ8p=0*X>0CMB>NT@bi z;=A?@8~x_1ac-eHQ@~jKXhM6>P~Z+~21N5vG&RRb)#a*!W?KS&tzZ!)$3d{n1uJLy z7whKCt4a5CsQAqU;ga2Vb1Y;H)4se`u>*K$=oNwFH(K3kiPVFr4D~D!7FGTes-gHy zi{|#u>6@%Fwsbrk6|Q{LnZ;p(UgoYcre6f9{|=U?yWIXvr{9GNXK&3mjEH$x#v;`u zjeHK3TmH+ju(9aGN}4U1}gW4Q5(%-~yZLkrK8fggMj6VGNnRS6I@<%V9G{bl4PEx^V^8F~Svh zcb~)p7frl{!|kn(PY(@NUk#EhMtR^?y(Z?q?E76eJ_Pxa<}MYq`~20-1P%p(tSr3KN=>4CK@ffH;wNp@RnjmT0-4`(t z)Y`bwcADa%SiRYn^CSTWhqsS1(d|HkX`j#3u_~wy61E~}1Wr&H=G&qvI6q>}E~g}F z$X`zUYbHvJ222gLfcH!obmi;lRlw=ixW~ZjraXjH!*W&s#^$Ap(RvXfc3Lq{Q zIMzT^3i&x0Z0#aQ0kBCN1?VxzO?%(bL}oRDdOCLltOs6*N?YFOiT1;*%zto1)_-$f z)Kta68EY3H(uC{yZY$Ay(9#en5;Mxs(&a2I(F-gb_q3t71!xtxEk_&JvuerfYcKkkMry)K OD%kAg>X^qDME?T>XrqGw literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_4.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f4be5c7f6ce59613b642b1a5c3cc7592e1185cb3 GIT binary patch literal 3947 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 H%7cFcK&LzY literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_5.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_5.png new file mode 100644 index 0000000000000000000000000000000000000000..3526423a88da296644fa5c8054dc9df236ac7bae GIT binary patch literal 4029 zcmeHKYgAKL7C!fK2{$~0X)7v^%iBU*P$+LgK;*TQFlq}3g+NizQi%#Bgg|aIN-Ie4 zi3$~vc3?n()+#EHTt%yPL{N%?3JDJtsX$O5$g{`!Gp^OH)wO1I*8G_MN>~i&atok`=u_`f1LNIUUI=RBgMu|SY;dSOT|I`e=K4oPnd3WweE!8t zekCB<_5dU`IHUx(Vh|)&neSh!gP?;453>w|2$e68<#0-$2Voyrvq2%P{CzAGMlla} zu$AjjjJL({fu9l+t5&gFbwjUyLqpv$oXDwOZ=1frBV6^bs2vAPNyj?(raTAzUIf5ogjFR8!ZW zt~eFN3i2ZmYy^T)Z!UMj?$RYb_~D*16ekJ-NN~5!!$>>>qvw`9V~Cw$^xk`y@kbnP z6kyr%M3o-?$|$&6fAD*K@nS1Ba4@Q}H&>m(aAj0*WDcdXC_>sBdR471gE?dO+%JLpnFtD z0!mK+WP@!f3*Cd^r3~3!d;?RZ_zy7l=7Cqsz7pvf zl?))!#vE{SR?iKwl12>jQM@-Q#Ri}eoZxP4G-xviUV=SNNNKs)`DsZSS9F{vk%wSz6WmV&1gS?-*G zD|tBp=k83Xi3tToW2dpYjA(vFeIn@9NipRuD`}Z*FJw|S@#vRL8l6{7V325k0dNV- zdt(y=Aj$c+I{r!LI+>yb*>d2bz#U2caTUPo+*gLfziZ*+B;504=rLBe!~o)cawEE_ z80;E*uHE}gdWH6oqsZrY^o1di*4%~5(m@@o&g|*Q!MRg2?GBxd0Kqi!^pjFWb#vpx zcV(^*UPvR$(}4LlTNZc>oC=Otp*i_;16q- z(sUf+@wQI0$BEAZcl8&xh+X|wb5gTCq*M6pc##gE(9?` z(=TFG_Qogar}2qt4`lqO&l;l8&H$IK8b~Am5vJ-xv}yx^FIk^rOFm>)4NJk+S7x;` zdra}tOgfn4i@NP=kQpIAC-T;7VZ8NAwFKs*M!~Wp1Q`(Lea8;*@*PXNO^{C_Yv2Wy z=fs{7Nk2`OC(@c|`+(r_MA^d*9f4YN4QSDdKbwViVqZMmfnIq3K+GJ2UEA2Gk#zF@ z=fh0u^RJR8&kD3&-_DDPAWjl!K#=7ZN*n?}tJBx17Kk&a2%ON0c*H{9(qg>N0e{tm8*F| zXo3dOgwuS~ZEa(^H|%&t&Inz34P7hKN31kt!&8;Swgzc-JnZ=&YrD5W4UOE|j1}xt z%bMv**%~`f3o>L{^BlbtOkcC6EBkmWH(HXqRavc8q^v6|{3)jTq%-CVCeoPv!@^8F z=J=lKS{j|(>BXSxC^}mSMSKD0YjIr|Mr%kw%NZTQ8RQZ+*AdPj#K=3p1|cl8wiUMi!?XLb))q)2-lF8R#uYSCe^9jQSwK&=G@-n1z; zRWz+xw3r~dctjzK3J9Ez#C&xg~(0F8W zqou#TP%+t{F_jz`aY+nZ#+IoPONLVV6fxOFM7={nBm514N&QD2m@SzK*^y0F8`(?Ds5?a6fs( z@nc25O?`N_7weoM<2Bu;nb#dZDY)7HDgfM+K+8TD_+F|PB2k@jg=wFz_-30X;&m%q zttqz?J#2jyK35~lZ{63{Rm-HB8}+8nF7(y*WqjycGcq%NpRSBM1%1dsx?yNLoGW6W zJ>>-2O}L>!*JdWq+e@~jYu2@wWo)}Pw!^Vr^S&T3_A;fJA+t{m6441+V@kW(9iZi11zO;_-r z;YFL)O(oe&;NbPw5q~-tPwB$>7ZaS-bfu7HXYt>x3(pLZ>+oW2Jp7bK25Sq_3%hx*s}ad-U+xYs9= literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_6.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ced4916b3d636039c960c6ae75c2a957434dea97 GIT binary patch literal 4189 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 Xeqc}&9`kJc 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 Aq5uE@ literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/clubs_ace.png b/solitaire_engine/assets/themes/rusty-pixel/clubs_ace.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c6da91ac1835de867495dd16538a2245294063 GIT binary patch literal 3692 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/diamonds_10.png b/solitaire_engine/assets/themes/rusty-pixel/diamonds_10.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9dd6b077f8465698ac3c564472ac6340d3b1b2 GIT binary patch literal 4704 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/diamonds_3.png b/solitaire_engine/assets/themes/rusty-pixel/diamonds_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0834e1a5ca69cea616304c808e7928c1e255d90c GIT binary patch literal 3875 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 Jx19as{t0mW-17hc literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/diamonds_4.png b/solitaire_engine/assets/themes/rusty-pixel/diamonds_4.png new file mode 100644 index 0000000000000000000000000000000000000000..921095f927941ff8d2162725d922e7e90a6c663e GIT binary patch literal 3936 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 bQ@XP58fm=sfY~G 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/diamonds_jack.png b/solitaire_engine/assets/themes/rusty-pixel/diamonds_jack.png new file mode 100644 index 0000000000000000000000000000000000000000..aa979b13a7eb2c209794adb405aee15d1ddbd309 GIT binary patch literal 4654 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 E7Y$H6&j0`b literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/diamonds_queen.png b/solitaire_engine/assets/themes/rusty-pixel/diamonds_queen.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5b710878c31cb61d0bf7cd9c685fdcba144cf0 GIT binary patch literal 4589 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 O4)9##y*l5Wee9paz9mus literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_10.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_10.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fcc4b37819d968e364c63abb5b0320d0b4d39f GIT binary patch literal 4503 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 X?2S%49Dbk}z~5@Wz?Fr*{M0`KeuP&# literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_2.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc2e0d1d498f933d5dd08ea1d0fcf902ea7fbfb GIT binary patch literal 3558 zcmeHKdr(tX8b9~sUQ8~Ckpy9tS5QL`1UjpQkw+qefL4g2f~$sT$44EP$JSy{3^!g|@=vtb& zsnwm3e&Xz-U@9-1PFi0%f9E<`;a;9!YA9{I<4v>A99_}A`|;opI(uaK8GVoT(;|

c)QqR_ftDN!kJ@~{x+mo!v=5m_&TET&( zIG+~o{FuE6{pY8(ra1Xo3U=VXcTp|Ji1v%e%hc;597 z@YzIp2oR5E72i+BV}u$I)7u*eb!boB(fa~+{znol|IXc1JX2t<1^I@8BDHrR?U>5n z>0kLvuzD8m2)I2sJC? z883{;PG0}v{Os>3Sg(HQ>=uzA!PIBZt>SD7F`GS9Ar<`uhkIqF6f9nyeu!3LL~T!J z99#@ZjgTzjc7$qxwX`%*vs{8bjN393jw42upYk{l*&^x-QE;qWPq*k@Ms|Ls(~mo> zJv@bVETLl1h_g2ZXu#FFkrnt!o)omkZ{Gr+a75Ib;3hYf5f5>+Nwm-&ty;I#z*Fcc zsL-D?%*&2M!8Rm%AEl>u8L!S4s-7au)A-jCyc-45o%Qm!oX%tk))}&9n!g#vYE}kS zBr&M3ZeFALy!g__O2c%F4|RO~hs z?U*a@4X90#V5Yhck4efXc%|r8EN(?R9(XLAd4;D)2U+1tYc$p~{A63E06GxAA*^4P zBWg1!>E@ZE9n8}g{jCUW^sft3y+K0x?7Zw4odZdx{x88FF-uf0VST21O&mpMB9b?D zM!|SQvdBft?O3P*xkaT3nnVf4|9p!(Y(VK}<_xp>=yQJxtBRHDkjxfl`l$RdLdrk9 zj%`ArH2ipXu5_LT9KTshs=AQOboF`oahxw%?YUl1yAh=|E4)N-t$LES~&EMA4fUA~H`z}%*IackofNC+W z1xKcN$}+G+taR@hu%6f2I)H92_B!YT0 zM9SA?TZc(z``BOzE*=$+!$7KTcsz4IkzFUr$oC@5TbZuV8pK*fbPA>}s}N(I!TPS& z)rggFL&Liiyt%K(iz#Xiq&!%cGi2D8y#DeU@Wb$i?qn>O*ZmF=Ty2~jNy0j#m>-RS zR6PB_r{Fs-I(fglX&BIg^5G@+I(K?#rfeS|vIBQGiUKKnac<@nkh{y{&Kf`n_|;R? zCszGDg{nvtgr{OJOhLjR>bU3Dl_JXXK&zZ+KfP?1GjZxn=pVIUMIpPo62zK+a@&bc z{q(>Nl?0Xh5OZRFyC3QmYie1lQxs(1n6px|RDvz~Qa%j|FoIhceqM5rf;$s$xZ<&p z^ux1)RZghcoGSEYA40`ucc;VYNJj!9lFLSN;Wl2wXQTCHWUe0<)motVn6n6-)x&&~ z#1E!U&KG0&1qGLLRkn(hfl;<)A*W+`GeT|7i)uQ7PT{=`jRjFHEEhDUZemp@(}1?Ht|AQ_=|eMVMp$DrWKXMIBEzc4drBFaCXOA> z&jt(wX%+h4^bM3;0-3XhUVE5d4~H8YCv*7pU4PjmlpU~dSL?(lVf}_%+6-E2=qVny zq9LR!>A*M>1sK8Pay^4J!0E_fKhCEjCGuKi*}R%BAxrcY{L)E?s2k5BmmrYqd(i)$ z2m{YHW#wI~L2nlp;PYQrMWutv8FZOnSh@sraqYR!5rMrFEl1aoi2MZPbUQJ45P1s5 z?2UY6_OyR{adPT9@*jh26Awzn6Cc_~f{& IvGT%y02)3f%K!iX literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_3.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8b96ca7dcec8b24e050a0ec7d907947f8e6201b0 GIT binary patch literal 3569 zcmeHKYfuzd7QTIHr3W485phu%7$7oK0G(A7->MG-VHK~b1V?Fy7JfQTs1>A?po zC_X~8d@z$@UE_*MM6*O*jhf&pED(c&2-7@d5Riuh@*eh*+DcY`#I3FUv1RR#TYc-) zz31L@&pF@s^`UivG~Zx>0RVvSzsl!B05CMg7-A;+c;7BAMfO5}pAR`xA3% za(_#cy-X&HoxQ?!2F-0SS2WsrFVa8eXz5Fy@UApC^XFUd7mTIE?!LTKD{m+ZPpog! zcukE=YEMp)l;{Mz6!Ynbio{Dv5y)UD2?hy6btmComN0pLDM(@{J7nQE*AvMJGdUB+ zmlB-|AL>8_#{}RrlhRQ-<7&3ZnrM zqh!Gl&;KlT%#VW*kHLISy=J*%gn5-DO?_;Z!`pJ~@ETG6L4Y~HE3=`HM^Y6V2KTYn zXghIZ2@&@m1%w~f8p8~NWUXuNi)xMoEH1z|h;Xo`Kn7*Mm!jcfynp07-TH@~!(P_y z-NfKR3ZxX&&W8_qBpY|vKvaWb7_9P(AOggk759dP0uKfD3?+qljkDQ#E6I6)1<-i_ zrl6~+x5ph|;~*{(egps2?Z^eyTQ{K?FYf*tKq9~f9Z_>j0w8tP}FczcS0F zMv3lKy(;}Tm$1*u=KiEM>9o9MC>TixSp5t<4LOP#@uL~g17JCRKyKQ(EnfGCtMdsp zQbZezK%?T9%#w_d5}gJZo*o^C6Re?#3}8Uo9cNdFqkIy!k_jV)U&H8A`4=iJG2xEE zk%ag_>wFIk)_Z#EiTbrT!D$*+9AaPLhH|TW4az<*>sF5`ft8e&2{E{_B4i={L?B|~ zk4F-UT{s~VewIx}(%d?bB~+%^avt)c%4Pf5GIaKmH_wg<0dzH9tTAe~&5cIUe47z) zhuDH9SO4&QHL?9yi)22`5wzM{d^` zz{@D<+giJV@ap8(U zi*#VC7nYI$H?B?YOT_bcr-orq9m?w3rXMY%J9P3eo22_53tU8llUT4c2mHmjGgJu@ zHA|lgvDr4oLo*2O(SWCifUVNAFwX)rvEKNJJhE7$c5K->Ifq>l)+l$zwp+Gb&?DIk zF5}WnFcxv+`bxObzvu%;7)g5P&LdRoO--)28TMLt{1yTsy=NaFluN)LFP9|hW#yE`F9<%1nkL*hEP1llY|r3C>yB(QL=JmFkN82OfhKM7Mywp+_$N}g+R@<^r9HnyR)sYcq$jB z_9ZS^Eg5&mw&!?Z+bv`}#_@ILY-9p7U3fYr2Q05vg5^f}g(=X^PxpJ<#EXnzuqmPJ z^q1iJ?-+1hD<5#1Q3CIU5b)mpMti2e*s?+lX8rpdL4ooXGX(bedIXMMnCm}s6!8%D zCJzxJm*iYTcJV+VgE(nkS}PC%w_ioZ+oJcdv!g8G`}zSGL6#pn7DVkWOx8n6a5 z%%VWUsF#3x1xYGihm)uR_c^j{Qv+E)3@i|^LMW4iZ94e8f& zPQ`N((IYk?IXrX0lkV;?tS9^N^C%wYbp30zL0ib>%`2?;wLG?T~lqAn253QE-4KJB`;l?_~@=3tQ-+wM>hq|>Ti7NiOtoQgyaA} zUbs@sRB6%pO;+0ys>>rSyuLN_kPo?Ebw$VDSFUq^=jby%dlw%D9Oxf%bDsu< zKH7&?qk?m8%=#G;s$!Z`&0%56-I+dIBN80(Zwiigv%>yY+fqv;Cl2c_f5j6;>j#*> zE<4|r3GO%}*O!TrKz-ZFe~RG$0DQR7s_tOrUJcU1wKySiO}%pwq1zx|B6q^z!K3Q_ z=eRo_paxnRnL9`L%0LGE=*&+1vUpFRzAP0#fp{u*EIdn0fdP9!Ey3WbKy}Xmu7j5x X%tDrZ()A7cl>`31fj(EgWoiEal~55d literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_4.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f016ef10e75f53f78a9e9d67453eefdb9a4d01da GIT binary patch literal 3859 zcmeHKYgAKL7C!fQFD3yIBmt}z5K*Hd;M5i!d0bdfpg0g85LASqYm~N%;4_6tZm3`d z6{@v9cqFS<@tt(gk}8By1hhVaT70x15vm}d1W7ayAhTVaS+mx3t@$%+&7bkt&Ar)s z-|y`6-Ti%Mw;(2B9OoSlLTFr6WY`jf2>3}bEE~9l{#d0!$o`k8u#jcqr01=3_fKwg zqy)XZ)F#EXHCJ!XOeah7BlH`%Q(VRt&5?8Nh_2kq`@X!Wc|q`Hc}r>cjqDoZcL_!M zU!~T8zF>{noxqh`@lsTIqcz&e98D8y7MbR)KxvaT!Wo8F*LA^z6PYYpe*$y#Cu*}c zVCjgRc02OHG7E>#Sl0I4WSf_w?TogR8lI^wz5Dt_rHcSn)?oAks=O%CY_F--ZXzVs zq37@ZqO7rQ%L+r}2}nJ4?P0OjhM-i$?WwFqJONsIpu%4^4)3B2=B&}iBiS~pDO90{ z!IPj2p5irZFBYHK$?c`};eaIE&@ds=!7M-#(pyraY3HH8jUlj(&1X7GB>CED6jwWK zjcEy4<|IJ61%q5!G^c8$M{X6r-j3Zye$dE?#FuX3Q^f$I*rx9ydw8Y-wT!|3&I06b z-*(0c3dij~CZDoQ-WNb%3(3_6MaO#j#n8l_f*U`Qui!;HzAg(Bm1rN=*cr_qjxJy_ zCayfJwZbxd#>yty@|j7y`kLANH;vf~X!h2%g}JSW+&eF8w9c$z}VGH9`G<)D}B zIv}|o-kr+|@J%qUUL=w;_`$ko zQDg&qy)`=I3?99V<3c*w0lo@UR{1gtAA+78D)`yfQJh2*0UMtjAbn;ikdMnL7f(YK zgT;@2n!!$lP9*v)@eR{|2D?*rFm{5vgdTJ!Pv@IATTd$n$m~R#7*>}aAR7RCzhfqW zgMAbzyX96C?x5_gp+(Ko8f)a0zQMwsl2RHVbya+@n=WDS7X?>B$sv+U%P&Te?WDb} zKBJ>q&Nc^16Q4SJ8Y&r_K9SXuKoc$VB}zb{9s_JuC8CI6Cqvfgq_*kGpg-;sgI!&Y zSmFbC@x*8 z{*26lwFq3}r!>t`piA{Pr#g5kP=3lX>q2((K)oq8IB7>s_u$>+bTgs^cB;&fGo1xJ z^6aXi?B;>;8ohzwC|pIRoOqqf{ooO?Y2hHG1>Exq1 zbz}KVJrer<*4}X_xa?J1ioRm<IT|66?Aw`S*-8nF+iNQ{QxC@%)%OU4&ZGRD5X@CJMMJP>4HT@OZM*{o z-?P35RsT|XLGnSey1j!-I~w}cwvR0D);4oC4QvgNl;HVZD=Z8oeCq%7qC6fIkMMxB zlH)Nu;ID(PuODg-RsRb4F&buUp%BfmT-ImROjWN8DU$@&@RTU8&p2ft;{JBc|LiL zgQK{5*5*YQRk{be%fP&+U4 z8R*c}wh^iMnCXt@$&<}rCEU9Y3gqS^zNa)t^dIN_c3aa5xdrY2(xiGZm%#~Df4c1s z&-?j^Qi=ciP4Ic-+_4xC{b$h=>{)lw!Ofa*I#Z(_eb#uUPZ%g2vbA>yU_`ucs!5VD za<@>}rpz2Qx=aoNWgBxgsi}LgeW=`BsYx~sKl7b0VKCn&p<3|=Y4;1Ddz?;!gUv6i zAoD;a9uq6%bT~~cGnP#A1G8i|zG;Y@1?uokr?>1e=7_}1y%_>W0pbO&W7~n-pUZg2it zn@&(~A^Z=!APU!8?r-b^6BKWh{1@$4E!75(RV}?+!LkEeUWY4uWTilk@)PSEU8lny zQ)^e@g|PWCf6;mREdmzVKX z&O6&a$#j;bK(PeTy=khYa7_5w=#A^(n4r?0jTV)I<2v_k19?z3SX zCSSpa5V)@_RP-$XoLGFE-3vs|njDy`jg(o5FNP1SIDgwW1P;3>Dm*6ae5fer@8V1F AJOBUy literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_5.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_5.png new file mode 100644 index 0000000000000000000000000000000000000000..dd2f719dc238eca536b5d8fc3470b66f7ec7a290 GIT binary patch literal 3865 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 a6OQO62;HMjOw9`b=<)UTpI0mtr~U!y-uP_* literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_7.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c838716cf82964cd3d6e71a3f352240aa7016ded GIT binary patch literal 4163 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_8.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d15f453640df5317c3249456638cf71b377bf017 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_9.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_9.png new file mode 100644 index 0000000000000000000000000000000000000000..d444ecbade96ec53533ca68f29a69a6f9197cf93 GIT binary patch literal 4357 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 F|0fMmX+!`3 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/hearts_queen.png b/solitaire_engine/assets/themes/rusty-pixel/hearts_queen.png new file mode 100644 index 0000000000000000000000000000000000000000..de5919807fd10becabc7e870b1db9f60984d031f GIT binary patch literal 4579 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_10.png b/solitaire_engine/assets/themes/rusty-pixel/spades_10.png new file mode 100644 index 0000000000000000000000000000000000000000..6feda4ee06abbe945edf937b9a750a442b5e1d9b GIT binary patch literal 4634 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 XAPjl)RmUV6;LnQBe3o5ZDvtRZ=XRCh literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_2.png b/solitaire_engine/assets/themes/rusty-pixel/spades_2.png new file mode 100644 index 0000000000000000000000000000000000000000..051f84717d91fb26db15312b2de658fcbec9aa70 GIT binary patch literal 3295 zcmeHKdr(tX9zN%Afg7GTAcD#xNZnWwLbXMTB)K3D@eypT&qavt4(b#kt`H+3>7x*V_6p~xVqv4@K)W$M@7X^U_l6|Mau#~5CTca9-U5SJJZ?m&)pgS_{}}@ zo9~|UJKwqA_d9p*3Q3%^!*mA#fOGuf=uZKFcnBHN4nLx<)-?d&^mTl6LB4 zy&GZ7CmS6drp(Uh*--~l649EfS+iFTEDw_h_l17plOG$7~te6kr&i z4+en~)C5EHTrT(+#CPs6&6i4cd z2;ZrU&eU}#7H3risaJI*?q;VFq;&uE-SmHETx|8q$)K#MNHgfh1J`KYG6r0Iw!a9# zR)995E|MKHcYjn+5kP~Bw`^neR?O4%pLhx}FO5tN7+DAl9W&GKx6Or$Nj7v1lS~5d+dz?*2VbCe&<% z##)<}((m_@+872j&3qvu=PqWz)VX&Ka>MomsEuh>QEN-sYe-=cT0cp#hUyDS#Bowz zh{_r}4{^&R4ETDD9+2PRiica3^Uwp1w}bxv;CQjy__8-xeK@Ac=ktUpy&N+mKN3cv z7A}wJTdQy748%dAwr#syP%&#~VxE{49{$ifK$;bCM?O$^on^KT;hnU5JR94JVMl zL5>K6e077Hrk`}O#vE%A*Q!Ux?2Q+#@}q8B{4r|9x}tq-8?G?*_&`1zh0pHGzj}LU z&T_mbqe@y_M}(7Y9vA%3Fs3tNwBi7pfryZLWKaKBDkyfu!5e6H;n{qZ39-^}O}=f2 z<+=+4P$lNz!HP><)Q1PJ!gp*UBzQxWUuFalkMN)`^ZVQ*jJ<)c4(9 zZdf5clReFa)Y@VIPqnn2r3jVXwvJTlEV<(FV|R%n^0DbIN8f3Q$PRz~+5~>>R1S`N{6>FTSZd0`K=m(y?@XvaBdgVE;w(!_SZ(nlaCB9~1oExV znXhff_1u}`tAfQzSEe=fKcUzZkKzUl*GFk^<|>Eo zPR43h8oyw6f-^#jJ|!CjQwDq(XLG^p%r=ER71*&5>{i-KZ8~8qyBT#tuUuES4M0NV zZkWdS^Qd3Zp!;PEKIc@R34w?#6=2<9&-=L+e&!Yg6`Y)b4Z`jxgP=huLze-VciYnk zq8dnC#ZH;n@SLO==XXoIBkKSEiz+x`?S4|3?`9n`rMs%?1xdI`oqE_}*vgT5b+2B) zW4`$z!etR?Jg_7=5}Y`1y|n}j)V0TrPIV=yKrNUuISUITU%@p0&%K5=KCqFBEK@DTfdD4MLc>JiEV_%l^}{%f4ovdJVR)s=dkPy0cweV}-Q` z>C9nBF;CxC%V*l0J51w*Y%pg}LL9h8);2(xx?%8%)rSf2ZmEJr0C1m^vNBV;&X4Z^)>}#mT(dDBJg$Roq@fT)B7VoQO?AiAeeW{)8p-J zoo848)vm19|4?^$bJ4d>Yr?&4Dp&S)I~vet+0NOpzFt01RSVF3FL)E zz(L4PI|2n1TeiE-S_H=rP%u2f4%(cKXMi z_s%(U?>+b2-}#+$kF1Lmx=f!p9RT36`dz`V0D$-x(xemqM7B07v3~n%!Kw|Cq+#{S zQnwp!(aAqM9Ne?}*Cltq0tRv{!) zzyHetyUi++y|~3A*zdYZgy2U1;TWwSL_s8($6`~B(oT-V+*{WoaT3pD7rOH4-NtP` zhS9fZF1?C68B2r9>ev!G9^M3K2MTvw+z^;`0>E#Cfc`l|lM>S;vpv*D*=K51kK+#( z0)GA55G7uC#}cCjh)4&521@)MBI@7IFcmY9$mb!Y-C(TTD_N9I`K8L4XoA!(xKp}H z9D|6U?S7`bAFD|t3=rfdcx^`a6i^r_aN_xYT<11Vunp-r^G~&@RKl znYU?qj5r6iAwv^<9C&{wXUq#-x^A4Ji_dMh35jjO89}vx4 zQE`2#e0}a2q4qJ0&2*g0Scp`3-9f+EKwj-jfryUV$4LKp@mN8w*IH(&yynPd9@1dL zpB&^t5Rqkpcn7f)o5YjS$3OLitw-lAdd6P_pQ04(TtT!JM~M8#y5r0D7+d+R9EW1kis& zY3+jaWjL-Cr!3y}Yz(?n{+pw| z3(ANpux*3_XIqbhp2Pa=wzSUYdg3BkJ9?SRY|0+)Ujm=SlwPKRSJHAA)~vlMA%e(s zlZquaqS9SxbKc!UYL>WG zxnExj_WQ(crNFGZN{o4fI1ITHA(lZRC@adWQvltdZ0xD9WuPJW$;Zr`PcDgk=}VUT zS3=RfV*hLi!#>Z!nE%AL-JAXhin6m%W5rm{5QpipUK!U&540QCXmw7e+IV1*tTlHf z*o#{nX>gIeHM#=c>}uDk*-Ywh10<_3jqs+S#Ac?lAs#HB8+17g9(7F-#e*U<9&;rl zCYJUQiYfD@*XIrovBX9j9w@Cp9QJKtI#qhN)*;1kOkKnZh2=OdjkgE0#??X%Q`0T- zx|bV8kYZ9JojaKT)r!LTRyRz|_oPQ(CWOrWb~|>yJ>kV(D$VdF#+a?cw5k*`m{mOD zCOKqMQw44^2`COYU5%oa(g2BAxN5V146VJHuwN&_|Bo4k$LzMY_N_-+q_*=zL)pen z_^xV|`3GV_8_D~?0ZBF-?@cDfmFvItBTs&9lAUvRA?HuCej~Mrn+GMv$Jp6F~1@DDT zIC)*MC5P~M1z=8{MDJmG)@ai+_wy82BA};gG+eUxI0$gsns=K2P1VT2 zZp#udKu;eLHTQS=BF%_si}r?!!`z_t%9XHB&GZd%nLewtz69iR!Y7;v!;?d1yBEF0 zQ|Wkb!TGyGMEyolTa!9#fgzt46F%xfik}`T(Rf17j?BSOSLVxM>$QHC*7xMfF;^r> zzhn=b_XBGf4@#C0nvn*lT(Bv-WpykVhJ1RzJuPQzBbVC4Cr@@YaH(c}w~@tAKT-G; z3V&l&TVTMTPy5Q1Iwf7t`M#9|Fi$lXw}U|rul1Ny417ZbvdyQHDgGK7v9_tDhJLGQC{UI+QdC0WCh(6#bCtMpf6C>{UP(+8GeKOh#^C<$??mML}Ui1;Z8bfe%8}DJYL*x!U6DAO;nTJdzvK ziZZ?*Smf0r3td))(F)QeT&b8kN7%^M) z*1#KDxpl~t1@PTd*wociyAn|zj?;`RK_(fAAYDrqzw(qQXkXweud^o!gU3~h9pTmq z3OL_xJxeoDR8r%dr}&qJLe$riVSCsllzPPzr0!1$BCWf(5li$UK!wZY9Cu?b1(YwJ zd!ZH1QfpJN-PC8mT*lPuLgZQh4C$qR`UDlAj}9!H-gnUOgqiM0u32FDFvK$QltW1J zDG(FieG0$9VN)qHcZty^CQc`x6&xZ1747m522Dps7gH&IDPq(fNrIS(s1uh>IXG!A zbJ$=HMek!^y4&9m_h1-3oiK`_jYgwt34%x*@SrI165w>RzXwa?LzAan;<+2Epvj3Z z!q5tMTkDZV)+A{xF_E$_)FmefCofu0g7EWM1MKEm1ejL7eTB{+K^ARy|8cpvnBENp zwp{t{kL9a$tAA)>HZpNCUzN{1&BDnM+=U{cAB`=oUy`>V#Mi4|x~fhTGXJ_iJ)agJ zNOSylKB|F!CCyACP%DOs3%||BUHC>X5NXeq58jn|`cCdoMtk8-{uQC81P0k9*xkXS zESv;STP&ZT8di)=J~3BaUdX(V`IIA#B|%(8zlWj~9;#p2a{yP)Bfz!jy(eishUrpf z4uxQGJT}#IB`8dn0z>=ViBvcA8jL{i#|0jeK!w=}%^1zFw%E_o2CKF&eD7B)QM6%O z)X_D%&k>|@OXI6a+dK$xku2fG4_C;>rhZh9`FV*wM%O=r}>~ zp{KG~5F+QL8>&sKI(xW3JhXmes{;FLpnUt3*|GD0TQ$H*>47ylEZW1~2k+Gc{;HWj z1P#tR$dWz%MKuuKJJ1JJ*Bxe2U|rmo#jZT+o(X^Fxg_ZNGPAjLL$}3fzMoTS$hj)A zW!43-DGAlhSl@I|BT@%tRPP?^=Ow5WVE?#vKHI7ULAL%E-PV%coNDpF1dMPIr!IRu z)Nac05ot4A5#~ zM4}RW09s}~yu#H7OwvlrA)e;5jZ57?w*I#xBQ94#nT|Q!3?&Fn=W@E{5~c_8=^^&T3_GI3`J44Y4f_G3JMGs6h7u;VHnYI{T#Ui*2bm5rF=F_=sWTA6>TsN z(q!R6Vltb`s^5yL7+BHpXkGyc(_vC!EtU!s-Y~LwsbVz=+y&XpL0FF326m;Qu#&zv z;5`EG5%@nq;0RAX_9kPrL0e!Rs}PkI7;L_UKQSHYt#aO|hEC^-=-V3BFJCdg#RmUg zb2@8b;qHvyFuWgl-{b)#D!umWV>~KrhcXKCO8VNK0yfnk7;^}Ub)6v}=^q?>G<087 zHZmS%PxMt4{f=5I-br2O?d@po-1&4zW`q=$gqe?po(k4%&X@^vKd|Mv^f zXuSbqUPA_un9gjmB%x)ehwtaK5JCFrErM(xovxE1F0W?E^m{PqT1W553czJS>ho4_ zeW+oPcLL(P0qU#%W3mvZKeHZNW}K_HBF2_9H-`AyaH*@KBLx!FnTDGjs?K7Y5HP$J zRm7w%V~DR9N`)|R&FL>>mH8mge?q)l*=73S;+h7{OB=mZ77D@GCC zx_ZRfiGG94hD5(X+lC#6qZHiaN5E&x8Os~b2yX(^jw@TLSc4!J8!G}7TM=Z|3`)=3 zx71*y|G7kOsaJq6gMDVHzs;VT)0tq2dj8Y0g82T#CIB>(^b literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_5.png b/solitaire_engine/assets/themes/rusty-pixel/spades_5.png new file mode 100644 index 0000000000000000000000000000000000000000..a0734c9fb7fca17e588f0f64f5dbceb3304c150f GIT binary patch literal 3956 zcmeHKX;c(f7Jl`3Ky}!v=}{073L3>IgbosLVJQ|t6akGRBq%f)q9%q#G|JLK6)wc6 zKom8I3LbUFi5Z#}9i6uXp>N(g9fskklFjyKAcT0`E7mgEA$(5ShAlua4( zqL*{tAmHcumDh!u^~ar1L>0!@`!X}b-h=b zwaGMq$|;(CBk+lcGs1Ip)|C1c8W6DSP_C!2fl(g>G9xAT=Lp+SobWeB{t@H}ngRB6 zFL2B%h(cY=V{H;L7_Bc;Fyq80fktQ;2lH6hG>w~%$ik&T$Ni)x1Z=3jw_do(n;x%a zq7-SVZ=SD5@3t2OB87+s`&nKJkz}FljF^?%YYt`sqJcnq zB67+(r$EQN!oxp4gawZRHUZ=r%mUAwHv`cl5zP(@EdZA-N*b_H_sE~f<9atv$;sqd zTsg)P=epQex&&j%3MWvvDb1EY>@wtf(G@T9Vx_Mx#Yksj6QdcT6b2@M?HZ^^~9I!_VH~b z#kbkMMZtdigxA@7@)7y+u`wcScSRPz2%?0nua}d#c95gT>(Zn=UnVs z6e*;^eC`!W%V_nv$aGcOP`|!bp`7hUX9J@BtFRf|Hi&YpI6dkb#+Ll_xBm1=zQYj2A?=oEFRyC*YEn8J(MHa|;I@ ztPQ$Ke(%qMINvA!fB@%=m4H`=YX&@o*GiUt#K1Z>9O?>_t>!|6<+UX3Usb^KJ_u>-)Tk(Rr%oN z8+OErj+FoWdzf zuwWIW+5E5%dwNOrh6=<0H~Dw>8-)zj-xROCu)W;ldF$3AoBDbX)gE6}Ke<1BT9_O5 zEgAb5lBRP2B#T13w?MMh{)b`sU(-j8((grn9S|uiGQBXgm~eO;UA1`vdq%zG9XXUb z`Y{Z*3kImT%=w&?JzJARvS51H?*}_jvAGFB@vS#<6(_*-HX8uL*X7+gCgR_7$GG;- ze|t0$h9AhptKIVc@~B`?m9%z`X0&nj?SZP{QtRxSW**9&{9|2`HkWSmKGV6YH{Q$Y zq*F@T7+YsRF%rHj!@pj?QI+PtIBIZwn8-JySt)y4_uwg$OUj9)ZHlguUL98_2IT8p zIz8hUmp(3j&EJ*46Ln`t?B)$9B z5dYO$$fsJIqLh{9t(au`y>bQ3xY*4HyYtLU`2|~d_OC&j$kis5S-{HT>5{9q?2e3- z?)Q=AyBL+58Bvja_jg4p6MK~w-)@9qyHk|GpmHFh?-V%tna3y~+!r^ORtx!J-szj! zZ1flds-ZpmkdrG~4`4tkhJC`TMr!IPnqtOo3x>^s*9x9SwE^5`lT>=WwQVOO|(^uRZheg znoet_(|Xm!d$L549a}fT`g9G) zI?6H(E{!ZC5D}qyHv~1I8S9i9%!#&kKXBqd(PP<+sV1MKM`A}$H>Y))?TA9!(K21H zF+YuqcXLJ7u~IR+!f&$~1&A+WgZl1af=*gVO6^%n(Nm3S^FhR+9lC_&hN*W+s}FwE9V*$}WiKU$ zZd9(Atsa~(C>@?nc=xRjg$=bY>YA{KFqVHGQY&Q6xeR9T(OB=9mnD*GY#DIm&MgC& zi3M)7`i4y?)7tSTBDjj;#+7+!1K9#BdLX0pc?Ch z8FS0A=vZx$;!WqV1v<-&nPlWFpqM#3zZNdT`+A+2o6XE2;I*@ISBNiU^dit9yk^IM zyuo|^bRNL0QRoiyu;H-c5ow3Bw1eCL`Y<43?u5cIYoRM7+i@w}hv$iN@MY_c z_!fZ47-M$j4f3o=Vsx0Dc0O2KyEHNHhKhOnmXC literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_6.png b/solitaire_engine/assets/themes/rusty-pixel/spades_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5cb1e56b7df6bbcc7f4905606f91753cf5650b GIT binary patch literal 4137 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


ThM)@#tgK5x`Yv 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_9.png b/solitaire_engine/assets/themes/rusty-pixel/spades_9.png new file mode 100644 index 0000000000000000000000000000000000000000..8d136a27a13a1bc652058933b18fc4087c8a5016 GIT binary patch literal 4522 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 UW|l9TBTXTQS{ECBF^tLiCuM@Ft^fc4 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_jack.png b/solitaire_engine/assets/themes/rusty-pixel/spades_jack.png new file mode 100644 index 0000000000000000000000000000000000000000..2b22d54ab5540ce54d9783408ea7d36f7326244a GIT binary patch literal 4645 zcmeHLX;f3!7C!gph6E7^Gi8hepcREa6sTdiDo#Zqt%?W=!KcRJ0H_EOBp0=I`Jh
YD<0ssO%IG3 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 literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/spades_king.png b/solitaire_engine/assets/themes/rusty-pixel/spades_king.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8aa99e6a146529cb7a576500a1efda82e7f7cb GIT binary patch literal 4647 zcmeHLX;c&E8vbUO;6xMy$f89_IQ;9tW{7Hf}m^y6GW+p&DIL2 zY?e~7$adKcOTY@YDp64cfe=L&OF}@F03qalz31L@>^b+`AGd$*4}Z-&=X~?d^FH76 zzTZ4^+115<@xtW`0RW2~cG>L(0D&Pw;>z%{y{Wby0JRYZJDdGs-r}D11;^Z$wY=#L zWKz>t9b4Ymw3B9c_wFh`o+G2tdn^|dQy7JDLA?D3FJQ{g@wQo{dDT8=>+QtVGReEU zha%;@6|XF14w2GmsTJR2FfF*XE_9@)K%4K=&}WTeE^FBa;P&CrB{z6!D9X~OnU<0u zBW%nv1P#@zRb=sjNC`F2q>)#RYvXqdAMrsgTB3$$xDlY0JGIgb>7|q`z%vfQ6ihhb33%7x^>KluG}~J^vaNT1^z9(XvW$9u@q=7XKJj*1FwQj|V4>I#C`#+! zl*qfUP9x(hyhl=r{RH?Sn& zyvTVCiRu#h0DRj(T8Gl#MxVeULO&`(ik7S%E0b@ba=Ksk`6qF!Q-r?fUvpm-;EQwlzwWH|<_Q z2pe&ncj3^wt&VgPItbsVLAB69kT9lG|4!;V$~`6FM$X)-^j*R)5X96`aF%LFrvnwk zSWi0pdlKlbmfXX%XrnDQ+U{5t@n09|sFJ;l-C3GFC?^v|OEg+fU;#D+2sol?sf=!; zU@U`-HoQBQ2nCgr8Bct^h;VxNimGcs2Q8i44V?QB{pf185|*q%Bl|>N*LiQyCt#v} zFwk;UHnlwNd?wEVLDGH2j#w&O(VzOuVzqSm@c3P?%e*tF6ulD7?~VAyO2dyjW6m*0 zko>aE*Lfcxk~#Gn8}uxSy88NW;Pg{Qf+gcY@6`ZFWGO=$Df=gWc9REn+xHbKazY0!*yLGlbUUx`<6YrHbo06QlH>>?0nlLVKL%;HbcCl3D4bRg+O z+0yJ5?bzam$)L2MXM>?VqQxr>!J8eL0Ko(AJP$%?1OGX!n*^tN%c`a;v#GjK(ZkXF zsj~=PTn!G#E+oP(Tx_8dI{N`eug!CWVY=JLVN=e9zK9s(Bco@QjD#S#$#vKn3tFhW zvjn2k&FX5S&=;ATx&VyDR+-E+22tKG?NvyyUs9SdgEFsi!`H*k8(8D8k`5f6j2%Mh zppTn>G!}%gcALUivYNKYepmm~LiRAy;c>bl>HG5Tjl<)7tDfN3C-`Hhd85x&2%Yla z3^2i=64`F!eu$s?HJCQ47JWMS(!v9t6?qGALa!K1gl|rNXDk4>U0t3V3ZnUa$*ENDcT1KQSHO;RkKu@7X)f-(CBieKGrZ+Wl5s1_^4 zKA=^qC7fM?CY@2?l@ec3PWk$I6*SrYTN?J?Q}1T#!kv+7`wOh1V!l&-+? zs)aZB?#8y`R1%0fwv_I}=sRlyA-}x(%&TTjU_&zZHatT`0t=1?g-)7o*bY1OYeixf z1LVeD7=-=3DB#wuHVW&Tz`3ts!ZEM%m{=gHO2}9XyQp*5ws@T9QvKotgny^5+&3AB zzGPV3){JX%Y6zMTWy^a7aXt%*yn^5ciQxvNeT_b?yLiuqMj98*UVv);J+#x!jYeL7 z9T;Q;(^qw@DYb6}INq|btYph>IGJ;ptJtY@h&Wnn4x zz3uU-^EOx7ll{+o0b|9ccDnEQL~gb#`tC&^CkIuCupO9i_V(M{Zj`w$EGp`}GII!y2xj%gpR%A{(mnq?Bb%=+ z#QzwaO*x;UPaJ&G!N}VaA&n(Lv@TeUQmg z_3iZ`7?XCxKy|ML;sI21`|#k-Oz4^iBDl*rc^JmJ)6d?B4J^cYhXdX8 zOQ0__tk4a(#5)ZA*s%B{mI|FrUh4fPv~=i6gX_GKczdDkdU2+D85#_0Dyk|_b9W>_ zs)y=U+rI|JmQoqxXAe}pRJ9HM8p7vjv?}X;e^4-Xl7i*5zY0N}pp|<5sBZv&0q0m@ z@p~*4dicDwmM3cYkS-6OHmV`y+{q;6roJnzv!ebd4R^?Vs`tvR_BjU$a58GQLCL@Q zCkjdMV)lj$>jY#tBD`Cd;{hG%ii%3x z+JMT|;|{H)Mk2RHt(JW2bBj$(p5qw~zv~uPytdw*8xe9o ze|4ieThR49*d|~sXhZ$CL(PJGLHxTwq2|>yrq&u)oI+zz{)4EPCs^4G1~3_RR=P@&&jW3UoQl;gV1YLQf*2n%26>C1JQGy_;Z#s2 z@GK=jrjQPtufu2DNUOSs(ncj?M5>P2r&i~9n!B`BVAS8NS)lK?0}E!e18{Khr0Z;P z6ozrL3iO@ ze;a~054nW`-RL zT)&f*N-lxx8@9=e(d!h9TO=DY^7G=3r|;V%dXvLL=~pj$&t}hOfh6v9TfR5M>z&^d zNHx%>lB|p>TFcLb$YMBc_tWfa52Mf|J zRBvqW*HFpkBgH{z0gX!Z|CPRMQ%Q>>iVjV%X+66&}pc%6Zos9gTnrT~Rm@eaH z6QK5bv<+HAd#lSGcG9+4#@k42U-w~MG%D#9!kZ(>B)~%HT>C?$8-ir;`d4CUOf$^^ zR*$P{CChG?l{lGBC9AGltWb1en4&A~=`^EQ83Ei{9-P4T_$ZEv%wE5U={`*s`jYSK z=du8AbLiOjTc-^N z(%=@=DyST2d3rF~DHyGxC_3Lb1eOZv=W=eQYD@)&+Xe1H!hy~V**Tj34~ibw)ed!K z(so`@@5>y_m}v6uN(ehi0E4p5cB^-mWb=*IfWD15z{s2)b`}=@Heh=Sb#IEsSlyB z40ic%z(HjR%Fz8Nacdw#P5Rt-CWBxXfc=Y)K>>J%FR0ADyMcnSY8Qa5YdZ2!l+iVl zU|$Z02U3UhakHngJOb>G`y}p@?f!hAD4S6Jm@?HK3rg&-O3{k?3zE~vy6)2O*cB8Q zs$240e5L}H1zy^1u(Sm*Vi|-gE$=v!U@Nccan+|iYE5TJ6K#wh_kGs$ib9gcUOc%0eaE~c@2eIo1b_CP;o(OK&>fprKQ-G2@rYf-1|Bh>q=Zg z8laK`0bj8f16_%Y#g_nOZ#_GyG)CFK2*$QUA;o9s#*y&ckiyBY*FGL}yzZfX-BDfg z_C~=#D5-i($IT-7nc%3HMrJg=dxT27*Sq83ZY(@DWNZf_pOLFHyQ@$z+=NQT zRw~lV$D6J--9tp<9XSru$Ml5Dln;X`ii~#i0u#c}ekH~#si^G0SOyRbqiyZ8@Tuzv z5NgS;v+Os)A?N6#O?OgE#~n0#k^)6DkBUlcqu)pU zb4j}4z$i)KuD-XF3|?|F$PRikq9#s{y-tn1nE{Yk^6SHvbAaQ6y4)tM53W|~j(3$>r;--;E+nlqv%8I>n7#6bjL4mG{Snj^}UQ;$gB{@r*mxF_{ zHfOmj5iA_=r4!)xH_zO4DBO#qI(72^sv<&XxGn?RPNkaP7}L|#IFu!{C^%)kut+Hr z|EfMs@Ib1+j8nD}SkcnsPXqt&_3>Ri_ua>VTkVzTQ_%3C5$;?Ga06H34#81`sQ;k} z;r{DjBS%Lv_F3ZaUTMAAXxF72?Awu~&ZE3$X5G*+x z$I4mMf5wInCwJy46L0CD34m4TP=_Cu60$(EVI zB4F`)v!*i}*`I!oLo~zLHmjOrOhWZDEQ$N2>!UKKD%KwfMQTOZHMTj4*~)ja;d+fS zTV>}7XFp~Sm@U}4HqhP0@J`tOFai*>j+umGLF+jRH~n%v0gevnf4ts2I%)FyxhA}! zl_IJ!gn0?oC-t^IQdcLA-mhL)9}{8=0UXi)uK;+4ICO~gL({YcU{k#<%BP(X&YurH z4p$@cSbaP;=|D9NR$Et~{38$YJ-fSI(XjVb=8rF6ZCJBRhJ}w3;x8q)L>}Xs9WGjkw->ih`A!9t3;o>4RZ9e12v+6ZXVB zkn{m%Q@d0bAa~-&edJHxka#EtKk}_~DC9zV^&KPUbaK#BkAJO`FU7hb7xNF}SxZhq z@>6JGe~|QtEkv!^nUHH=;D_7`Ya5y{CI+W@rSIe@%Mb$nSedt~O6M zUCO-%$<;{o*Qht-Qfq5oZll)1p8jTA-FMtCAb;HTt-pczCW^8fo13T$=dpmdU2@87 zwl5C4;$6+f7a&)=(#d!Hb6{k7Xsv*tC$xo-CwV)hrdT&X zOI$1H!P5R^{%%Ne8XF_gDc3x%>3Btrq+q#yAui%6xAk;}hhw);v|(gX7Wo(&{Qri* zAJYhwWxd&zktntiV%Xq&H_9l3#RANqvi6aXRY`gu$m~%j=7wbwZ;k)=ns+vtRbNmU ze(P~y5@43ToO=*Dd`8Gr`9sY4WHYEv*l;3H^N^xV8wEuW!IK)_x%HO CBp)9D literal 0 HcmV?d00001 diff --git a/solitaire_engine/assets/themes/rusty-pixel/theme.ron b/solitaire_engine/assets/themes/rusty-pixel/theme.ron new file mode 100644 index 0000000..39e6af8 --- /dev/null +++ b/solitaire_engine/assets/themes/rusty-pixel/theme.ron @@ -0,0 +1,76 @@ +// Rusty Pixel — pixel-art card theme generated via Claude Design. +// +// 53 PNGs at 256×384 (4× nearest-neighbor upscale of the source +// 64×96 grid). Card aspect 2:3 matches the engine's layout +// assumption. Drop this directory under +// `/solitaire_quest/themes/rusty-pixel/` and the theme +// registry picks it up at next launch. +( + meta: ( + id: "rusty-pixel", + name: "Rusty Pixel", + author: "Claude Design", + version: "0.1.0", + card_aspect: (2, 3), + // Opt in to nearest-neighbor sampling so the pixel grid stays + // crisp at non-integer scales (Bevy's default bilinear filter + // mushes 256x384 pixel art when displayed at ~150x200 on a + // typical desktop window). + pixel_art: true, + ), + back: "back.png", + faces: { + "clubs_ace": "clubs_ace.png", + "clubs_2": "clubs_2.png", + "clubs_3": "clubs_3.png", + "clubs_4": "clubs_4.png", + "clubs_5": "clubs_5.png", + "clubs_6": "clubs_6.png", + "clubs_7": "clubs_7.png", + "clubs_8": "clubs_8.png", + "clubs_9": "clubs_9.png", + "clubs_10": "clubs_10.png", + "clubs_jack": "clubs_jack.png", + "clubs_queen": "clubs_queen.png", + "clubs_king": "clubs_king.png", + "diamonds_ace": "diamonds_ace.png", + "diamonds_2": "diamonds_2.png", + "diamonds_3": "diamonds_3.png", + "diamonds_4": "diamonds_4.png", + "diamonds_5": "diamonds_5.png", + "diamonds_6": "diamonds_6.png", + "diamonds_7": "diamonds_7.png", + "diamonds_8": "diamonds_8.png", + "diamonds_9": "diamonds_9.png", + "diamonds_10": "diamonds_10.png", + "diamonds_jack": "diamonds_jack.png", + "diamonds_queen": "diamonds_queen.png", + "diamonds_king": "diamonds_king.png", + "hearts_ace": "hearts_ace.png", + "hearts_2": "hearts_2.png", + "hearts_3": "hearts_3.png", + "hearts_4": "hearts_4.png", + "hearts_5": "hearts_5.png", + "hearts_6": "hearts_6.png", + "hearts_7": "hearts_7.png", + "hearts_8": "hearts_8.png", + "hearts_9": "hearts_9.png", + "hearts_10": "hearts_10.png", + "hearts_jack": "hearts_jack.png", + "hearts_queen": "hearts_queen.png", + "hearts_king": "hearts_king.png", + "spades_ace": "spades_ace.png", + "spades_2": "spades_2.png", + "spades_3": "spades_3.png", + "spades_4": "spades_4.png", + "spades_5": "spades_5.png", + "spades_6": "spades_6.png", + "spades_7": "spades_7.png", + "spades_8": "spades_8.png", + "spades_9": "spades_9.png", + "spades_10": "spades_10.png", + "spades_jack": "spades_jack.png", + "spades_queen": "spades_queen.png", + "spades_king": "spades_king.png", + }, +) diff --git a/solitaire_engine/src/assets/mod.rs b/solitaire_engine/src/assets/mod.rs index e235edf..99bb74e 100644 --- a/solitaire_engine/src/assets/mod.rs +++ b/solitaire_engine/src/assets/mod.rs @@ -11,8 +11,10 @@ pub mod svg_loader; pub mod user_dir; pub use sources::{ - default_theme_svg_bytes, populate_embedded_default_theme, register_theme_asset_sources, - AssetSourcesPlugin, DEFAULT_THEME_MANIFEST_URL, USER_THEMES, + default_theme_svg_bytes, populate_embedded_default_theme, + populate_embedded_rusty_pixel_theme, register_theme_asset_sources, + rusty_pixel_theme_png_bytes, AssetSourcesPlugin, DEFAULT_THEME_MANIFEST_URL, + RUSTY_PIXEL_THEME_MANIFEST_URL, USER_THEMES, }; pub use svg_loader::{rasterize_svg, SvgLoader, SvgLoaderError, SvgLoaderSettings}; pub use user_dir::{set_user_theme_dir, user_theme_dir}; diff --git a/solitaire_engine/src/assets/sources.rs b/solitaire_engine/src/assets/sources.rs index ab6275a..c06d9ed 100644 --- a/solitaire_engine/src/assets/sources.rs +++ b/solitaire_engine/src/assets/sources.rs @@ -155,6 +155,100 @@ const DEFAULT_THEME_SVGS: &[(&str, &[u8])] = &[ embed_default_svg!("spades_king.svg"), ]; +/// Stable embedded asset URL of the bundled rusty-pixel theme manifest. +/// +/// `theme/plugin.rs::manifest_url_for` uses this when the player +/// selects "Rusty Pixel" so the manifest loads from the binary's +/// embedded asset registry rather than `themes://` (which would +/// require a user-supplied copy on disk). +pub const RUSTY_PIXEL_THEME_MANIFEST_URL: &str = + "embedded://solitaire_engine/assets/themes/rusty-pixel/theme.ron"; + +/// Path the embedded rusty-pixel theme manifest registers under, +/// relative to the `embedded://` source root. Kept in lockstep with +/// [`RUSTY_PIXEL_THEME_MANIFEST_URL`] by the unit test +/// `rusty_pixel_theme_url_constant_matches_embedded_path`. +const RUSTY_PIXEL_THEME_MANIFEST_PATH: &str = + "solitaire_engine/assets/themes/rusty-pixel/theme.ron"; + +/// Bytes of the bundled rusty-pixel theme manifest. Mirrors the +/// default-theme embed pattern — `include_bytes!` resolves at compile +/// time so the binary ships the manifest even on machines whose +/// `solitaire_engine/assets/` directory is absent at runtime. +const RUSTY_PIXEL_THEME_MANIFEST_BYTES: &[u8] = + include_bytes!("../../assets/themes/rusty-pixel/theme.ron"); + +/// Generates a `(stable_path, bytes)` entry for one rusty-pixel +/// theme PNG. Mirrors [`embed_default_svg!`] for the second bundled +/// theme — the path matches what `theme.ron` references. +macro_rules! embed_rusty_pixel_png { + ($name:literal) => { + ( + concat!("solitaire_engine/assets/themes/rusty-pixel/", $name), + include_bytes!(concat!("../../assets/themes/rusty-pixel/", $name)) as &[u8], + ) + }; +} + +/// Every rusty-pixel theme PNG bundled into the binary. 53 entries: +/// 52 face cards + 1 back. The macro pulls each PNG via +/// `include_bytes!` so adding a new file is a one-line append. +const RUSTY_PIXEL_THEME_PNGS: &[(&str, &[u8])] = &[ + embed_rusty_pixel_png!("back.png"), + embed_rusty_pixel_png!("clubs_ace.png"), + embed_rusty_pixel_png!("clubs_2.png"), + embed_rusty_pixel_png!("clubs_3.png"), + embed_rusty_pixel_png!("clubs_4.png"), + embed_rusty_pixel_png!("clubs_5.png"), + embed_rusty_pixel_png!("clubs_6.png"), + embed_rusty_pixel_png!("clubs_7.png"), + embed_rusty_pixel_png!("clubs_8.png"), + embed_rusty_pixel_png!("clubs_9.png"), + embed_rusty_pixel_png!("clubs_10.png"), + embed_rusty_pixel_png!("clubs_jack.png"), + embed_rusty_pixel_png!("clubs_queen.png"), + embed_rusty_pixel_png!("clubs_king.png"), + embed_rusty_pixel_png!("diamonds_ace.png"), + embed_rusty_pixel_png!("diamonds_2.png"), + embed_rusty_pixel_png!("diamonds_3.png"), + embed_rusty_pixel_png!("diamonds_4.png"), + embed_rusty_pixel_png!("diamonds_5.png"), + embed_rusty_pixel_png!("diamonds_6.png"), + embed_rusty_pixel_png!("diamonds_7.png"), + embed_rusty_pixel_png!("diamonds_8.png"), + embed_rusty_pixel_png!("diamonds_9.png"), + embed_rusty_pixel_png!("diamonds_10.png"), + embed_rusty_pixel_png!("diamonds_jack.png"), + embed_rusty_pixel_png!("diamonds_queen.png"), + embed_rusty_pixel_png!("diamonds_king.png"), + embed_rusty_pixel_png!("hearts_ace.png"), + embed_rusty_pixel_png!("hearts_2.png"), + embed_rusty_pixel_png!("hearts_3.png"), + embed_rusty_pixel_png!("hearts_4.png"), + embed_rusty_pixel_png!("hearts_5.png"), + embed_rusty_pixel_png!("hearts_6.png"), + embed_rusty_pixel_png!("hearts_7.png"), + embed_rusty_pixel_png!("hearts_8.png"), + embed_rusty_pixel_png!("hearts_9.png"), + embed_rusty_pixel_png!("hearts_10.png"), + embed_rusty_pixel_png!("hearts_jack.png"), + embed_rusty_pixel_png!("hearts_queen.png"), + embed_rusty_pixel_png!("hearts_king.png"), + embed_rusty_pixel_png!("spades_ace.png"), + embed_rusty_pixel_png!("spades_2.png"), + embed_rusty_pixel_png!("spades_3.png"), + embed_rusty_pixel_png!("spades_4.png"), + embed_rusty_pixel_png!("spades_5.png"), + embed_rusty_pixel_png!("spades_6.png"), + embed_rusty_pixel_png!("spades_7.png"), + embed_rusty_pixel_png!("spades_8.png"), + embed_rusty_pixel_png!("spades_9.png"), + embed_rusty_pixel_png!("spades_10.png"), + embed_rusty_pixel_png!("spades_jack.png"), + embed_rusty_pixel_png!("spades_queen.png"), + embed_rusty_pixel_png!("spades_king.png"), +]; + /// Registers asset sources that must be in place *before* /// `AssetPlugin` is built. /// @@ -191,6 +285,7 @@ pub struct AssetSourcesPlugin; impl Plugin for AssetSourcesPlugin { fn build(&self, app: &mut App) { populate_embedded_default_theme(app); + populate_embedded_rusty_pixel_theme(app); } } @@ -254,6 +349,43 @@ pub fn populate_embedded_default_theme(app: &mut App) { } } +/// Returns the embedded PNG bytes for a single rusty-pixel theme file +/// (e.g. `"back.png"` or `"spades_ace.png"`), or `None` when the +/// filename is not bundled. Mirrors [`default_theme_svg_bytes`] for +/// the second bundled theme so the picker thumbnail cache can read +/// preview-sized art without going through the async asset graph. +pub fn rusty_pixel_theme_png_bytes(filename: &str) -> Option<&'static [u8]> { + let suffix = format!("/{filename}"); + RUSTY_PIXEL_THEME_PNGS + .iter() + .find(|(path, _)| path.ends_with(&suffix)) + .map(|(_, bytes)| *bytes) +} + +/// Pushes the bundled rusty-pixel theme manifest + every face/back +/// PNG into the [`EmbeddedAssetRegistry`]. Pairs with +/// [`populate_embedded_default_theme`] — both are called from +/// [`AssetSourcesPlugin::build`] after `AssetPlugin` has set up the +/// embedded source. +pub fn populate_embedded_rusty_pixel_theme(app: &mut App) { + let registry = app + .world_mut() + .get_resource_or_insert_with(EmbeddedAssetRegistry::default); + + registry.insert_asset( + std::path::PathBuf::from(RUSTY_PIXEL_THEME_MANIFEST_PATH), + std::path::Path::new(RUSTY_PIXEL_THEME_MANIFEST_PATH), + RUSTY_PIXEL_THEME_MANIFEST_BYTES, + ); + for (path, bytes) in RUSTY_PIXEL_THEME_PNGS { + registry.insert_asset( + std::path::PathBuf::from(*path), + std::path::Path::new(*path), + *bytes, + ); + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/solitaire_engine/src/theme/plugin.rs b/solitaire_engine/src/theme/plugin.rs index 3e75ab6..9292a4a 100644 --- a/solitaire_engine/src/theme/plugin.rs +++ b/solitaire_engine/src/theme/plugin.rs @@ -17,7 +17,8 @@ use bevy::prelude::*; use solitaire_core::card::{Rank, Suit}; use crate::assets::{ - default_theme_svg_bytes, rasterize_svg, user_theme_dir, DEFAULT_THEME_MANIFEST_URL, + default_theme_svg_bytes, rasterize_svg, rusty_pixel_theme_png_bytes, user_theme_dir, + DEFAULT_THEME_MANIFEST_URL, RUSTY_PIXEL_THEME_MANIFEST_URL, }; use crate::card_plugin::CardImageSet; use crate::events::StateChangedEvent; @@ -128,16 +129,32 @@ fn load_initial_theme( settings: Option>, mut commands: Commands, ) { - let url = match settings.as_deref() { - Some(s) if s.0.selected_theme_id != "default" => { - format!("themes://{}/theme.ron", s.0.selected_theme_id) - } - _ => DEFAULT_THEME_MANIFEST_URL.to_string(), - }; + let id = settings + .as_deref() + .map(|s| s.0.selected_theme_id.as_str()) + .unwrap_or("default"); + let url = manifest_url_for(id); let handle: Handle = asset_server.load(url); commands.insert_resource(ActiveTheme(handle)); } +/// Resolves a theme id to its manifest asset URL. +/// +/// Bundled built-ins (default, rusty-pixel) route to `embedded://` +/// so the binary's compile-time-baked manifest + face files load +/// without touching disk. Anything else routes to `themes://`, +/// which `register_theme_asset_sources` points at the user themes +/// directory. Callers (load_initial_theme, +/// react_to_settings_theme_change) consult this helper instead of +/// hard-coding the URL shape per id. +fn manifest_url_for(theme_id: &str) -> String { + match theme_id { + "default" => DEFAULT_THEME_MANIFEST_URL.to_string(), + "rusty-pixel" => RUSTY_PIXEL_THEME_MANIFEST_URL.to_string(), + _ => format!("themes://{theme_id}/theme.ron"), + } +} + /// Watches [`crate::settings_plugin::SettingsChangedEvent`] and /// triggers a fresh theme load whenever /// `Settings::selected_theme_id` changes. The settings panel's theme @@ -163,11 +180,7 @@ fn react_to_settings_theme_change( return; } - let url = if new_id == "default" { - DEFAULT_THEME_MANIFEST_URL.to_string() - } else { - format!("themes://{new_id}/theme.ron") - }; + let url = manifest_url_for(new_id); let handle: Handle = asset_server.load(url); commands.insert_resource(ActiveTheme(handle)); } @@ -362,11 +375,20 @@ enum ThemePreviewBytes { /// `.svg` then `.png`. Either branch returns /// `None` on I/O failure (file missing, permission denied, etc.). fn read_theme_preview_bytes(theme_id: &str, basename: &str) -> Option { + // Bundled built-ins consult their embed tables before any + // filesystem I/O so the thumbnail works on a fresh install where + // the user themes directory doesn't exist yet. if theme_id == "default" { let filename = format!("{basename}.svg"); return default_theme_svg_bytes(&filename) .map(|b| ThemePreviewBytes::Svg(b.to_vec())); } + if theme_id == "rusty-pixel" { + let filename = format!("{basename}.png"); + if let Some(bytes) = rusty_pixel_theme_png_bytes(&filename) { + return Some(ThemePreviewBytes::Png(bytes.to_vec())); + } + } let dir = user_theme_dir().join(theme_id); if let Ok(bytes) = std::fs::read(dir.join(format!("{basename}.svg"))) { return Some(ThemePreviewBytes::Svg(bytes)); diff --git a/solitaire_engine/src/theme/registry.rs b/solitaire_engine/src/theme/registry.rs index 6be6dad..e62bb28 100644 --- a/solitaire_engine/src/theme/registry.rs +++ b/solitaire_engine/src/theme/registry.rs @@ -25,7 +25,7 @@ use bevy::prelude::{App, Plugin, Resource, Startup}; use serde::Deserialize; use super::ThemeMeta; -use crate::assets::{user_theme_dir, DEFAULT_THEME_MANIFEST_URL}; +use crate::assets::{user_theme_dir, DEFAULT_THEME_MANIFEST_URL, RUSTY_PIXEL_THEME_MANIFEST_URL}; /// One entry in the [`ThemeRegistry`] — the data the picker UI needs /// to render a row and load the theme on selection. @@ -98,10 +98,24 @@ fn build_registry_on_startup(mut registry: bevy::ecs::system::ResMut ThemeRegistry { let mut entries = Vec::new(); entries.push(default_entry()); - entries.extend(discover_user_themes(user_dir)); + entries.push(rusty_pixel_entry()); + let bundled_ids: std::collections::HashSet = + entries.iter().map(|e| e.id.clone()).collect(); + let user = discover_user_themes(user_dir) + .into_iter() + .filter(|t| !bundled_ids.contains(&t.id)); + entries.extend(user); ThemeRegistry { entries } } @@ -123,6 +137,26 @@ fn default_entry() -> ThemeEntry { } } +/// The bundled rusty-pixel theme entry — pixel-art faces by Claude +/// Design, embedded under `embedded://solitaire_engine/assets/themes/rusty-pixel/`. +/// Inserted alongside the default so the picker offers both +/// out-of-the-box on a fresh install with no user themes directory. +fn rusty_pixel_entry() -> ThemeEntry { + ThemeEntry { + id: "rusty-pixel".to_string(), + display_name: "Rusty Pixel".to_string(), + manifest_url: RUSTY_PIXEL_THEME_MANIFEST_URL.to_string(), + meta: ThemeMeta { + id: "rusty-pixel".to_string(), + name: "Rusty Pixel".to_string(), + author: "Claude Design".to_string(), + version: "0.1.0".to_string(), + card_aspect: (2, 3), + pixel_art: true, + }, + } +} + /// Walks `user_dir`, treating every immediate subdirectory as a /// candidate theme. A subdirectory contributes one entry if and only /// if it contains a `theme.ron` whose `meta` block parses cleanly and @@ -240,20 +274,22 @@ mod tests { } #[test] - fn empty_user_dir_yields_only_the_default_entry() { + fn empty_user_dir_yields_only_the_bundled_built_ins() { let tmp = tempfile::tempdir().unwrap(); let registry = build_registry(tmp.path()); - assert_eq!(registry.len(), 1); + assert_eq!(registry.len(), 2, "default + rusty-pixel always present"); assert_eq!(registry.entries[0].id, "default"); + assert_eq!(registry.entries[1].id, "rusty-pixel"); } #[test] - fn nonexistent_user_dir_still_yields_default() { + fn nonexistent_user_dir_still_yields_bundled_built_ins() { let registry = build_registry(Path::new( "/definitely/not/a/real/path/should/not/panic", )); - assert_eq!(registry.len(), 1); + assert_eq!(registry.len(), 2); assert_eq!(registry.entries[0].id, "default"); + assert_eq!(registry.entries[1].id, "rusty-pixel"); } #[test] @@ -264,12 +300,40 @@ mod tests { write_manifest(&theme_dir, "midnight", "Midnight"); let registry = build_registry(tmp.path()); - assert_eq!(registry.len(), 2); + assert_eq!(registry.len(), 3, "default + rusty-pixel + midnight"); let entry = registry.find("midnight").expect("midnight registered"); assert_eq!(entry.display_name, "Midnight"); assert_eq!(entry.manifest_url, "themes://midnight/theme.ron"); } + #[test] + fn user_theme_id_collision_with_bundled_is_dropped() { + // A user-supplied directory whose `id` matches a bundled + // built-in (rusty-pixel) must not produce a duplicate + // registry entry. The bundled version wins because it's + // guaranteed complete; the user's overriding copy may be + // partial, stale, or otherwise broken. + let tmp = tempfile::tempdir().unwrap(); + let theme_dir = tmp.path().join("rusty-pixel"); + fs::create_dir_all(&theme_dir).unwrap(); + write_manifest(&theme_dir, "rusty-pixel", "User Override"); + + let registry = build_registry(tmp.path()); + assert_eq!( + registry.len(), 2, + "user override of bundled id must not appear as a duplicate", + ); + let entry = registry.find("rusty-pixel").expect("rusty-pixel registered"); + assert_eq!( + entry.display_name, "Rusty Pixel", + "bundled entry's display_name wins over the user override", + ); + assert_eq!( + entry.manifest_url, RUSTY_PIXEL_THEME_MANIFEST_URL, + "bundled embed:// URL wins over the user themes:// URL", + ); + } + #[test] fn full_manifest_also_works_via_meta_only_parser() { // The meta-only deserialiser must tolerate the full ThemeManifest @@ -310,8 +374,9 @@ mod tests { write_manifest(&theme_dir, "../etc/passwd", "Evil"); let registry = build_registry(tmp.path()); - assert_eq!(registry.len(), 1, "escape attempt must not register"); + assert_eq!(registry.len(), 2, "escape attempt must not register; built-ins remain"); assert_eq!(registry.entries[0].id, "default"); + assert_eq!(registry.entries[1].id, "rusty-pixel"); } #[test] @@ -322,7 +387,11 @@ mod tests { fs::write(lonely.join("readme.md"), "wrong filename").unwrap(); let registry = build_registry(tmp.path()); - assert_eq!(registry.len(), 1); + assert_eq!( + registry.len(), + 2, + "no user themes register; only the bundled built-ins remain", + ); } #[test] @@ -351,8 +420,9 @@ mod tests { refresh_registry(&mut registry, tmp.path()); - assert_eq!(registry.len(), 1); + assert_eq!(registry.len(), 2, "stale entry replaced; built-ins remain"); assert_eq!(registry.entries[0].id, "default"); + assert_eq!(registry.entries[1].id, "rusty-pixel"); assert!(registry.find("stale").is_none()); }