Bullet sprites were wrong because I read the pack's layout backwards. Each of
its 8 PNGs is one ANIMATION FRAME, and a column within a file is a COLOUR
variant -- so walking columns cycled the palette while the shape sat still, and
the rows I picked were in a region of larger multi-cell sprites, which is the
scattered debris that showed on screen. tools/build_local_assets.py now composes
a proper atlas: 8 frames across, one row per SimConfig.KIND_*.
Animations ran at whatever the machine's framerate was, because they counted
_process calls. At 240fps that is four times too fast on its own, before the
requested halving. Both actor and bullet animation are now driven by elapsed
seconds, so they look the same on any machine.
The knight shifted sideways instead of mirroring: a Rect2 with negative width
does not flip, the draw call normalises it, so the sprite kept its orientation
and jumped right by its own width. Mirrored through the canvas transform about
the sprite's centre instead.
Shots were silent when a bullet spawned inside an enemy. The sound rode on
BULLET_SPAWN, which is deliberately suppressed for a bullet resolved and removed
within the same tick -- so no event, no sound, and this got more likely the
closer you stood. Firing is now its own event (PLAYER_FIRED): the shot happened
whether or not a bullet survived to be replicated. Protocol 3 -> 4, because
inserting mid-enum shifts the wire value of every event after it.
Fire cooldown 7 -> 14 ticks (4.3 shots/sec).
Licence question 2, confirmed verbatim: the paid tier DOES grant commercial use
("You may use these assets in personal, commercial or non-commercial
projects"), but its next sentence still forbids redistribution "no matter how
much you modify it". Paying moves these from local-only-and-non-commercial to
local-only-and-commercial; it never makes them committable. Only replacing them
with permissively licensed art does that.
Question 3: CREDITS.md now credits every pack, including the two whose licences
do not require it and the unused ones in considering_dont_use_yet/.
158 tests. check.sh, test.sh and smoke.sh pass.
5.2 KiB
Asset packs and attribution
The packs themselves are not in git (see
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 totals 548 KB across seven files: three sprite
sheets and four sounds. Sprite rects and sound paths are all declared in one
place, 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. Two of the four 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 | CC0 1.0 (public domain) | Yes | Not required | Yes — assets/sprites/dungeon_tileset.png |
| Helton Yan Pixel Combat | CC BY 4.0 | Yes | Required | Yes — assets/audio/sfx/ |
| 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 | 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.
Two obligations this creates
-
Helton Yan's CC BY 4.0 requires attribution, and it is not satisfied by a file in the source tree once the game ships. Players need to be able to see it. CREDITS.md records it for now; an in-game credits screen is a todo.
-
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. Art is Stage 2 in
ROADMAP.md; everything currently on screen is drawn from
primitives plus one runtime-generated dot texture.