From fd7fb7b6da64757bd15078eb8133d1240633a5ae Mon Sep 17 00:00:00 2001 From: funman300 Date: Thu, 30 Apr 2026 20:36:42 +0000 Subject: [PATCH] docs: add CREDITS.md and link from README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lists the project's third-party assets and major dependencies with their licenses for v1 release readiness: - xCards @2x card artwork and back_0 (LGPL-3.0) - FiraMono-Medium font (OFL) - Bevy 0.18, kira 0.12, axum, sqlx, tokio, and the rest of the ten most prominent Rust deps (MIT/Apache-2.0 across the board) Generated assets — card backs 1-4, all backgrounds, and every WAV file — are credited as original work produced by the project's own solitaire_assetgen pipeline; the audio synthesis stack and the absence of any external sample sources are documented. The README gains a brief Credits section linking to the full list. Note: the upstream xCards source URL is left as a placeholder pending confirmation; downstream license obligations are unaffected. Co-Authored-By: Claude Opus 4.7 (1M context) --- CREDITS.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 8 ++++ 2 files changed, 115 insertions(+) create mode 100644 CREDITS.md diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..19af98b --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,107 @@ +# Credits + +Solitaire Quest is MIT-licensed (see [LICENSE](LICENSE)). It is built on top of +the work of many open-source projects and a small handful of third-party +assets. This file lists every component that ships in the binary or in the +`assets/` directory. + +--- + +## Code & Framework + +| Component | License | Role | +|---|---|---| +| [Bevy 0.18](https://bevyengine.org/) | MIT OR Apache-2.0 | Game engine, ECS, rendering, UI | +| [kira 0.12](https://crates.io/crates/kira) | MIT OR Apache-2.0 | Audio playback (mixer, sub-tracks, looping ambient) | +| [serde](https://crates.io/crates/serde) / [serde_json](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 | Serialization for save files and the sync API | +| [tokio](https://crates.io/crates/tokio) | MIT | Async runtime for the sync client and server | +| [axum 0.8](https://crates.io/crates/axum) | MIT | HTTP framework for the self-hosted sync server | +| [sqlx 0.8](https://crates.io/crates/sqlx) | MIT OR Apache-2.0 | Compile-time-checked SQLite access on the server | +| [reqwest 0.13](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 | HTTP client for the sync provider | +| [jsonwebtoken 10](https://crates.io/crates/jsonwebtoken) | MIT | JWT issuance and validation | +| [bcrypt 0.19](https://crates.io/crates/bcrypt) | MIT | Password hashing on the server | +| [keyring 4](https://crates.io/crates/keyring) | MIT OR Apache-2.0 | OS keychain integration for credential storage | +| [tower-governor 0.8](https://crates.io/crates/tower-governor) | MIT | Rate limiting on `/api/auth/*` | +| [chrono](https://crates.io/crates/chrono) | MIT OR Apache-2.0 | Date / time handling | +| [uuid](https://crates.io/crates/uuid) | MIT OR Apache-2.0 | User and session identifiers | +| [thiserror](https://crates.io/crates/thiserror) | MIT OR Apache-2.0 | Error type derive | +| [rand 0.9](https://crates.io/crates/rand) | MIT OR Apache-2.0 | Seeded shuffler in `solitaire_core` | +| [png 0.17](https://crates.io/crates/png) | MIT OR Apache-2.0 | PNG encoder used by `solitaire_assetgen` | +| [ab_glyph 0.2](https://crates.io/crates/ab_glyph) | Apache-2.0 | Glyph rasterization for generated card art | + +The full transitive dependency tree (several hundred crates) is captured in +`Cargo.lock` and reachable via `cargo tree`. Every crate brought in is +MIT, Apache-2.0, BSD-style, or a dual-licensed combination thereof — no +copyleft code is statically linked into the game binary. + +--- + +## Assets + +### Card artwork + +| File(s) | Source | License | +|---|---|---| +| `assets/cards/faces/{RANK}{SUIT}.png` (52 PNGs) | xCards @2x artwork | LGPL-3.0 | +| `assets/cards/backs/back_0.png` (bicycle_blue) | xCards @2x artwork | LGPL-3.0 | +| `assets/cards/backs/back_1.png` – `back_4.png` | Original — generated by `solitaire_assetgen::gen_art` | MIT (this project) | + +xCards is the playing-card artwork bundle by Huub de Beer, published under the +LGPL-3.0. The art is consumed as unmodified PNG files at runtime; the game +binary statically links no LGPL code, so distribution as a self-contained +binary plus the `assets/` directory satisfies the LGPL's relinking clause. + + +Upstream source: `[source URL needed]` + +### Backgrounds + +| File(s) | Source | License | +|---|---|---| +| `assets/backgrounds/bg_0.png` – `bg_4.png` | Original — generated by `solitaire_assetgen::gen_art` | MIT (this project) | + +### Typography + +| File | Source | License | +|---|---|---| +| `assets/fonts/main.ttf` (FiraMono-Medium) | [mozilla/Fira](https://github.com/mozilla/Fira) | SIL Open Font License 1.1 | + +The OFL permits redistribution and embedding in software so long as the font +file itself is not sold standalone. The file ships unmodified. + +### Audio + +All six WAV files in `assets/audio/` are **original work** — there are no +third-party audio samples in this project. They are synthesized +programmatically by `solitaire_assetgen/src/bin/gen_sfx.rs`, which writes +44.1 kHz mono 16-bit PCM WAVs using a hand-rolled WAV writer (no `hound` or +`dasp` dependency). The synthesis stack is entirely additive: sine / +square waves, layered harmonics, deterministic LCG noise, AR envelopes, +and a slow LFO for the ambient track. + +| File | Synthesis approach | +|---|---| +| `card_deal.wav` | Filtered LCG noise with a sweeping low-pass cutoff for a "whoosh" | +| `card_flip.wav` | High-passed LCG noise under a fast AR envelope | +| `card_place.wav` | 120 Hz sine body + filtered noise click | +| `card_invalid.wav` | Two dissonant square tones (196 Hz + 207.65 Hz) beating against each other | +| `win_fanfare.wav` | C-major arpeggio (C5 / E5 / G5 / C6) with sine + 2nd harmonic | +| `ambient_loop.wav` | 55 Hz fundamental with 2nd and 3rd harmonics, modulated by a 0.2 Hz LFO; loop length is chosen so the tone and LFO both complete an integer number of cycles for seamless looping | + +Audio files are MIT-licensed alongside the rest of this project. + +--- + +## License Summary + +- **Project code:** MIT — see [LICENSE](LICENSE). +- **xCards card artwork (52 faces + `back_0.png`):** LGPL-3.0, redistributed + unmodified. The LGPL applies only to those PNG files; it does not extend to + the game binary, which links no LGPL code. +- **FiraMono-Medium font:** SIL Open Font License 1.1, redistributed unmodified. +- **All other assets** (backgrounds, generated card backs, every audio file) + are original work covered by this project's MIT license. + +If you redistribute Solitaire Quest, you must ship this `CREDITS.md` and the +`LICENSE` file alongside the binary so the LGPL and OFL notices remain +visible to end users. diff --git a/README.md b/README.md index 7822667..bf3fb3d 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,14 @@ cargo test -p solitaire_core -p solitaire_sync -p solitaire_data -p solitaire_se cargo clippy --workspace -- -D warnings ``` +## Credits + +Built on [Bevy](https://bevyengine.org/) and the wider Rust ecosystem (Tokio, +Axum, sqlx, Serde, kira, and many more). Card faces and the default card back +use xCards artwork (LGPL-3.0); the UI font is FiraMono-Medium (OFL). All audio +is synthesized programmatically by this project. See [CREDITS.md](CREDITS.md) +for the full list and license details. + ## License MIT — see [LICENSE](LICENSE).