132646f6c3
ci / verify (push) Successful in 48s
Crusenho's Complete UI Essential Pack is CC BY 4.0 -- redistributable and
commercial-friendly, confirmed from the License.txt the pack itself ships --
so unlike the two bdragon packs a subset is committed: twelve PNGs, 48 KB,
under assets/sprites/ui/. Only what is used, because each committed PNG costs
a Godot .import sidecar and a directory nothing references is one nobody
prunes.
UiTheme builds a Theme in code from it -- button states, panels, line edits --
and every screen roots itself through UiTheme.themed_root(). The HUD's bars are
the pack's frame with a tinted fill, drawn as three horizontal slices because
Godot's nine-patch lives on nodes and the HUD is drawn rather than built from
controls. Inventory slots use the pack's slot art at exactly twice the source
size; a non-integer scale on a 1px border reads as a wobble along every edge.
The credits screen is the other half of the request and it is a licence
obligation, not a nicety: two packs are now CC BY, which asks for attribution
"in any reasonable manner", and a markdown file in a source repo is not
reasonable for someone who downloaded a build. Settings -> Credits shows every
source with its terms and a link to the licence text. test_credits.gd asserts
CREDITS.md and docs/ASSETS.md name every entry, so the three cannot drift.
Two things found by actually looking at the screen, which is the point:
- The FIRST version of this styled nothing. A Control inherits its theme from
Control ANCESTORS only, and the chain breaks at the first plain Node or
CanvasLayer -- which is every screen here. get_window().theme set the
property, changed nothing, and read as correct. check.sh, 458 tests and a
clean smoke run all passed with the entire interface unstyled. The theme
test now instantiates every screen and asks what its buttons resolve.
- The settings screen showed Fire bound to the right mouse button, because
the test suite was writing the player's real user://settings.cfg --
rebinding calls save() and nothing had redirected the path. Settings.path
is now redirectable, the fixture points it at a scratch file, and a test
asserts the default is still the player's own.
tools/screenshot.tscn is what found both. It boots the client windowed and
saves the menus, the HUD, settings and credits. Manual, needs a display, and
the only thing in the project that can tell you the interface rendered.
check.sh clean, 460 tests, SMOKE PASS, all four diagnostics green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
133 lines
6.7 KiB
Markdown
133 lines
6.7 KiB
Markdown
# Asset packs and attribution
|
|
|
|
The packs themselves are **not in git** (see
|
|
[`assetpacks/README.md`](../assetpacks/README.md)), which means their bundled
|
|
licence files are not either. This file is the record that survives. Keep it
|
|
current when a pack is added or removed.
|
|
|
|
## How assets get from a pack into the game
|
|
|
|
`assetpacks/` carries a `.gdignore`, so Godot skips it entirely — nothing there
|
|
can be referenced from a scene or script. Files are copied into `res://assets/`
|
|
in game-ready form, and only then imported. The tree is 3.9 GB and
|
|
`tools/check.sh` runs `--import`, which would otherwise walk all of it every run.
|
|
|
|
What is in the game today is three sprite sheets, four sounds and twelve small
|
|
UI sprites. Sprite rects and sound paths are all declared in one
|
|
place, [src/view/art.gd](../src/view/art.gd), and
|
|
`tests/unit/test_art.gd` asserts every rect lands inside its texture — a wrong
|
|
atlas coordinate does not error, it silently draws the wrong pixels.
|
|
|
|
## Licence findings
|
|
|
|
Checked against each pack's itch.io page, and against the licence file the pack
|
|
itself ships where there is one. **Two of the five forbid redistribution**,
|
|
which is what publishing a repository containing them would be — so they are not
|
|
in the repository.
|
|
|
|
| Pack | Licence | Commercial | Credit | In this repo? |
|
|
| --- | --- | --- | --- | --- |
|
|
| [0x72 DungeonTileset II](https://0x72.itch.io/dungeontileset-ii) | **CC0 1.0** (public domain) | Yes | Not required | **Yes** — `assets/sprites/dungeon_tileset.png` |
|
|
| [Helton Yan Pixel Combat](https://heltonyan.itch.io/pixelcombat) | **CC BY 4.0** | Yes | **Required** | **Yes** — `assets/audio/sfx/` |
|
|
| [Complete UI Essential Pack](https://crusenho.itch.io/complete-ui-essential-pack) | **CC BY 4.0** | Yes | **Required** | **Yes** — `assets/sprites/ui/` |
|
|
| [Fire Pixel Bullet 16x16](https://bdragon1727.itch.io/fire-pixel-bullet-16x16) | Custom | Free tier non-commercial; **paid tier allows commercial** | Encouraged | **No, at any tier** — local only |
|
|
| [750+ Effect and FX Pixel All](https://bdragon1727.itch.io/750-effect-and-fx-pixel-all) | Custom | Free tier non-commercial; **paid tier allows commercial** | Encouraged | **No, at any tier** — local only |
|
|
|
|
### The blocking clause
|
|
|
|
Both bdragon1727 packs state, verbatim:
|
|
|
|
> **You cannot do:** Resell / redistribute this asset.
|
|
|
|
And the paid tier of the FX pack is no better for this purpose:
|
|
|
|
> You can NOT re-distribute the file, no matter how much you modify it you can
|
|
> use it but not share or re-sell it.
|
|
|
|
Putting those files in a public repository distributes them to everyone who
|
|
clones it, which is squarely what that forbids. Paying for the commercial tier
|
|
does **not** unlock it — the restriction survives payment and survives
|
|
modification.
|
|
|
|
So they live in `assets/local/`, which is gitignored. `Art.bullets_texture()`
|
|
and `Art.impact_texture()` load them at runtime if present and return null if
|
|
not; the bullet renderer falls back to a generated dot. Verified both ways: with
|
|
the files present the game uses them, and with them hidden the suite still
|
|
passes 156/156 and the game runs.
|
|
|
|
This is also why nothing there may be `preload()`ed — `preload` resolves at
|
|
compile time and would fail the build on every machine that lacks the files.
|
|
|
|
### The UI pack is the easy case
|
|
|
|
Crusenho's *Complete UI Essential Pack* ships its own `License.txt` naming
|
|
CC BY 4.0 outright, with the licensor and store link spelled out. That permits
|
|
redistribution and commercial use, so unlike the bullet and FX packs a subset of
|
|
it is committed — twelve PNGs, 48 KB, under `assets/sprites/ui/`, listed in
|
|
`UiTheme.TEXTURES`.
|
|
|
|
Only what the game uses was copied rather than all 98 sprites: each committed
|
|
PNG costs a Godot `.import` sidecar, and a directory of files nothing references
|
|
is a directory nobody prunes. The rest stays in the untracked pack.
|
|
|
|
The obligation it creates is the same one the audio creates — see below.
|
|
|
|
### Two obligations this creates
|
|
|
|
1. **Two packs are CC BY 4.0 and require attribution** — Helton Yan's audio and
|
|
Crusenho's UI art. A file in the source tree does not satisfy that once the
|
|
game ships, because a player who downloaded a build never sees it. **Done:**
|
|
Settings → Credits shows the same list, built from
|
|
[src/core/credits.gd](../src/core/credits.gd), including a link to the
|
|
licence text as CC BY asks. `tests/unit/test_credits.gd` asserts every source
|
|
there also appears in [CREDITS.md](../CREDITS.md) and in this file, so the
|
|
three cannot drift apart.
|
|
2. **Both bdragon packs are non-commercial in their free tier.** Buying the
|
|
full tier *does* fix that — confirmed verbatim from the FX pack's paid
|
|
licence: "You may use these assets in personal, commercial or
|
|
non-commercial projects."
|
|
|
|
It does **not** fix the repository problem. The paid licence's very next
|
|
sentence is: "You can NOT re-distribute the file, no matter how much you
|
|
modify it you can use it but not share or re-sell it." Redistribution is
|
|
forbidden at every tier, so paying moves these assets from
|
|
*local-only-and-non-commercial* to *local-only-and-commercial*. They cannot
|
|
be committed to a public repo at any price.
|
|
|
|
The only route that puts bullet and FX art back into the repository is
|
|
replacing it with something permissive (CC0, or CC BY with attribution),
|
|
which would also remove the local-asset fallback machinery.
|
|
|
|
### Not in use
|
|
|
|
`assetpacks/considering_dont_use_yet/` is the "not chosen" marker and nothing
|
|
there is referenced. It contains RF Catacombs v1.0 (public domain per its
|
|
bundled `public-license.txt` — free for personal or commercial use, credit
|
|
appreciated, no reselling; artwork by Szadi art), plus Tiny RPG Character Pack
|
|
02 and neo_zero demos, whose terms are unrecorded.
|
|
|
|
## Converting audio before use
|
|
|
|
Helton Yan's pack is 24-bit / 96 kHz stereo — studio masters, averaging ~2 MB
|
|
per file and 5 MB at the largest. That is roughly a hundred times what a game
|
|
needs for a gunshot.
|
|
|
|
Downsample to 16-bit / 44.1 kHz mono before copying anything into
|
|
`res://assets/`. Godot imports `.wav` losslessly and keeps it in memory
|
|
uncompressed for low-latency playback, so the source format is what you pay for
|
|
in RAM and in export size.
|
|
|
|
## Where converted assets go
|
|
|
|
`res://assets/`, which is committed and imported. See
|
|
[`assets/README.md`](../assets/README.md). Art is Stage 2 in
|
|
[ROADMAP.md](ROADMAP.md); everything currently on screen is drawn from
|
|
primitives plus one runtime-generated dot texture.
|
|
|
|
## Placeholder art worth revisiting
|
|
|
|
- **Warden's Ration** draws as a gold flask (`Art.ITEM_ICONS[1]`). The 0x72
|
|
tileset has no food sprite, and the item is deliberately useless flavour, so a
|
|
recoloured flask stands in until the art pass. It reads as a potion, which is
|
|
the wrong thing for it to read as.
|