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>
77 lines
3.1 KiB
GDScript
77 lines
3.1 KiB
GDScript
extends GutTest
|
|
## Attribution. Two of the packs this game ships are CC BY 4.0, which requires
|
|
## credit -- so these are licence-compliance tests, not tidiness ones.
|
|
|
|
|
|
func test_every_source_is_completely_described() -> void:
|
|
for entry in Credits.SOURCES:
|
|
for field in ["name", "author", "licence", "url", "used_for"]:
|
|
assert_false(String(entry[field]).strip_edges().is_empty(),
|
|
"%s has no %s" % [entry.get("name", "?"), field])
|
|
assert_true(String(entry["url"]).begins_with("http"),
|
|
"%s has no usable link" % entry["name"])
|
|
|
|
|
|
## The whole point of the flag: it marks the entries a licence obliges us to
|
|
## show, as opposed to the ones credited because the work deserves it.
|
|
func test_the_cc_by_packs_are_marked_as_required() -> void:
|
|
var required := Credits.required()
|
|
assert_gt(required.size(), 0)
|
|
for entry in Credits.SOURCES:
|
|
var is_cc_by := String(entry["licence"]).begins_with("CC BY")
|
|
assert_eq(bool(entry["required"]), is_cc_by,
|
|
"%s is %s but marked required=%s" % [
|
|
entry["name"], entry["licence"], entry["required"]])
|
|
|
|
|
|
## CC BY asks for a link to the licence itself, not only to the work. A player
|
|
## reading the in-game screen has no other way to reach the terms.
|
|
func test_every_creative_commons_licence_links_to_its_terms() -> void:
|
|
for entry in Credits.SOURCES:
|
|
var licence := String(entry["licence"])
|
|
if not licence.begins_with("CC"):
|
|
continue
|
|
assert_true(Credits.licence_url(licence).begins_with(
|
|
"https://creativecommons.org/"),
|
|
"%s has no link to its terms" % licence)
|
|
|
|
|
|
## The repository file and the in-game screen have to say the same thing. They
|
|
## are maintained separately, so this is what stops one of them going stale --
|
|
## and a stale attribution is a licence problem, not a documentation one.
|
|
func test_the_credits_file_names_every_source() -> void:
|
|
var f := FileAccess.open("res://CREDITS.md", FileAccess.READ)
|
|
assert_not_null(f, "CREDITS.md should be readable")
|
|
var text := f.get_as_text()
|
|
f.close()
|
|
for entry in Credits.SOURCES:
|
|
assert_true(text.contains(String(entry["name"])),
|
|
"CREDITS.md never mentions %s" % entry["name"])
|
|
assert_true(text.contains(String(entry["author"])),
|
|
"CREDITS.md never credits %s" % entry["author"])
|
|
assert_true(text.contains(String(entry["url"])),
|
|
"CREDITS.md has no link for %s" % entry["name"])
|
|
|
|
|
|
func test_the_asset_document_covers_every_source_too() -> void:
|
|
var f := FileAccess.open("res://docs/ASSETS.md", FileAccess.READ)
|
|
assert_not_null(f)
|
|
var text := f.get_as_text()
|
|
f.close()
|
|
for entry in Credits.SOURCES:
|
|
assert_true(text.contains(String(entry["url"])),
|
|
"docs/ASSETS.md has no entry for %s" % entry["name"])
|
|
|
|
|
|
## Every pack in the repository's own asset directories must be accounted for.
|
|
## Committing art without recording where it came from is how a project ends up
|
|
## unable to say whether it may ship.
|
|
func test_the_committed_ui_art_is_attributed() -> void:
|
|
assert_true(DirAccess.dir_exists_absolute("res://assets/sprites/ui"),
|
|
"the UI art should be committed")
|
|
var names := ""
|
|
for entry in Credits.SOURCES:
|
|
names += String(entry["name"])
|
|
assert_true(names.contains("Complete UI Essential Pack"),
|
|
"the UI pack has to be credited before its art is shipped")
|