Files
transcience/docs/ASSETS.md
T
claude b8332b697d
ci / verify (push) Successful in 49s
Documentation pass for a cold start
Audited the whole set rather than appending to it, and the two files a fresh
session reads first were both wrong.

README claimed the emergency escape takes three seconds and is CANCELLED BY
DAMAGE. It takes one, and damage explicitly does not interrupt it -- that is a
settled decision with its own entry in DECISIONS.md, and the front page said
the opposite. It also described one stationary boss, one hub portal, and none
of characters, permadeath, levels, inventory, loot, upgrades, settings or
credits. Rewritten, with the "not ready for the internet" warning made explicit.

ROADMAP had no "what is next" at all: every stage reads *done*, which for a
cold start is a dead end. It opens with where things stand and a table of
candidates -- auth, a reason to play past level 15, an economy, hit feedback,
replacing the non-redistributable packs, DTLS -- each with what blocks it, and
says plainly that the user has chosen none of them. Open questions renumbered
from the orphaned 8-11 they were left at, with the solved one dropped and three
real ones added.

ARCHITECTURE's file map listed two files twice, missed five subsystems
(upgrades, stats, poison, settings, credits, the UI theme), and still said
MapGen.build() is "the entry point both sides use" -- it is server-only, and
the whole anti-map-hack story depends on that. Rebuilt by layer and audited
against the tree: every path listed exists, and every one of the 64 source
files is covered.

CLAUDE.md's security paragraph said a client can send "exactly two things"
plus two roster requests. There are five client -> server messages. That number
is the security model, so it is now a table naming each one and what it
carries. Also records that nothing automated can see the screen.

Smaller: a stale 156/156 test count in ASSETS.md, and test counts refreshed to
468 where they are quoted.

check.sh clean, 468 tests, SMOKE PASS, all four diagnostics green, no broken
internal links.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 16:20:10 +02:00

6.8 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 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, 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 CC0 1.0 (public domain) Yes Not required Yesassets/sprites/dungeon_tileset.png
Helton Yan Pixel Combat CC BY 4.0 Yes Required Yesassets/audio/sfx/
Complete UI Essential Pack CC BY 4.0 Yes Required Yesassets/sprites/ui/
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 whole suite still passes and the game runs — tests/unit/test_art.gd has an explicit case for their absence, because a clean clone is the configuration most contributors will actually have.

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, 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 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. Art is Stage 2 in 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.