Twilight Princess-style home-screen art, and version 1.0.0

icon0.png, pic0.dds and pic1.dds come from two new pictures in ps5/art/: a
young swordsman and a black wolf split by a seam of twilight, over carved stone,
in the near-monochrome silver and sepia of the game's own cover art, made for
the port by Gary Riches with an image generator (nothing in them is from the
game, and there is no logo, title or Triforce). pic0 and pic1 are now the same
picture, as in the other ports. make-title-art.py still draws the menu pictures
in ps5/art/res/, unchanged byte for byte.

Upstream Dusklight has nothing newer than the pinned 34a144a493 on main, so
the program is v0.3.0's.

contentVersion is 02.000.000 (0.1 to 0.3 used 01.000.000 to 01.003.000), so
consoles see the update.

Claude-Session: https://claude.ai/code/session_016xMYBaR9GfxtETyVf6er1P
This commit is contained in:
Gary Riches committed 2026-10-14 23:02:20 +01:00
1 parent f4f12bdfd3
commit 577c76212b
9 files changed
+30 -29

No files matched your search

+9 -6
View File
@@ -50,12 +50,15 @@ make the source of every part available at the revisions it was built from.
can only give away what is theirs. The code is a reimplementation derived from
a decompilation of Nintendo's game; whether and where that is lawful to use or
share is not something these licences settle.
- **Artwork.** `ps5/sce_sys/icon0.png`, `pic0.dds`, `pic1.dds` and the menu
pictures in `ps5/art/res/` (which a built title carries in place of
Dusklight's own logo, icon, emblem and pre-launch background) are drawn by
`ps5/art/make-title-art.py`: a generated landscape, the lettering of
Dusklight's logo (CC0, without its mascot), and Aurora's own mark. Nothing in
them is Nintendo's.
- **Artwork.** `ps5/sce_sys/icon0.png`, `pic0.dds` and `pic1.dds` come from
`ps5/art/icon0-source.png` and `ps5/art/pic-source.jpg`, the port's own
pictures (a young swordsman and a black wolf split by a seam of twilight, over
carved stone, made for it by Gary Riches with an image generator): nothing in
them is from the game. The menu pictures
in `ps5/art/res/` (which a built title carries in place of Dusklight's own
logo, icon, emblem and pre-launch background) are drawn by
`ps5/art/make-title-art.py`: a generated landscape and the lettering of
Dusklight's logo (CC0, without its mascot). Nothing in them is Nintendo's.
- **Button symbols.** `ps5/art/glyphs/` (shipped as `res/ps5-glyphs/`) is made
from Kenney's Input Prompts (www.kenney.nl), Creative Commons Zero:
`ps5/art/kenney/License.txt`. The cross, circle, square and triangle are
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

+18 -20
View File
@@ -3,13 +3,18 @@
#
# python3 ps5/art/make-title-art.py OUTPUT_DIR
#
# Writes icon0.png (512x512), pic0.png and pic1.png (3840x2160): a dusk sky over
# hills, generated by this script, with Dusklight's wordmark on pic0 and pic1 and
# Aurora's mark on pic1. Writes res/ too: the pictures the game's menus load,
# to go over Dusklight's own in a title (ps5/art/res/ holds them, and
# tools/link-title.sh lays them in).
# Writes icon0.png (512x512) from icon0-source.png, and pic0.png and pic1.png
# (3840x2160, the same picture) from pic-source.jpg: a young swordsman and a black
# wolf split by a seam of twilight, over carved stone, made for this port by Gary
# Riches with an image generator; nothing in them is from the game.
# tools/png-to-title-dds.py turns pic0.png into sce_sys/pic0.dds, and pic1.dds is
# a copy of it.
#
# Nothing here is Nintendo's. Of Dusklight's own artwork only the lettering of
# Writes res/ too: the pictures the game's menus load, drawn by this script (a
# dusk sky over hills), to go over Dusklight's own in a title (ps5/art/res/ holds
# them, and tools/link-title.sh lays them in).
#
# Nothing in res/ is Nintendo's. Of Dusklight's own artwork only the lettering of
# res/logo.png is used: its mascot, its application icon, its organisation icon
# and its pre-launch background all depict the game (a character, the Triforce,
# a screenshot) and stay out of the title. The lettering is cut from the logo
@@ -96,20 +101,14 @@ def place(picture: Image.Image, mark: Image.Image, width: int, centre: tuple[flo
def main() -> int:
out = Path(sys.argv[1])
out.mkdir(parents=True, exist_ok=True)
letters = with_shadow(wordmark(), 14, 0.75)
aurora = Image.open(DUSKLIGHT / "assets/aurora-powered.png").convert("RGBA")
art = Path(__file__).resolve().parent
# pic0, behind the title on the home screen, and pic1, the splash: one picture
picture = Image.open(art / "pic-source.jpg").convert("RGB").resize((3840, 2160), Image.LANCZOS)
picture.save(out / "pic0.png")
picture.save(out / "pic1.png")
Image.open(art / "icon0-source.png").convert("RGB").resize((512, 512), Image.LANCZOS).save(out / "icon0.png")
background = scene(3840, 2160).convert("RGBA")
# pic0, behind the title on the home screen: the shell writes over the lower left
pic0 = background.copy()
place(pic0, letters, 1500, (0.70, 0.30))
pic0.convert("RGB").save(out / "pic0.png")
# pic1, the splash
pic1 = background.copy()
place(pic1, letters, 2500, (0.50, 0.40))
place(pic1, with_shadow(aurora, 8, 0.6), 520, (0.50, 0.90))
pic1.convert("RGB").save(out / "pic1.png")
# icon0: the same sky, square, with the wordmark's first letter
# the drawn sky, square, with the wordmark's first letter: the game's own icon
icon = scene(1024, 1024, seed=11).convert("RGBA")
mark = wordmark()
# the D ends at the first empty column
@@ -117,7 +116,6 @@ def main() -> int:
end = next(x for x in range(40, mark.width) if columns[x] == 0)
initial = with_shadow(mark.crop((0, 0, end, mark.height)), 10, 0.8)
place(icon, initial, 430, (0.50, 0.45))
icon.resize((512, 512), Image.LANCZOS).convert("RGB").save(out / "icon0.png")
# res/: the pictures the game's own menus load. Dusklight's show the game (a
# character as mascot, the Triforce in the emblem, a screenshot behind the
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 519 KiB

+1 -1
View File
@@ -10,7 +10,7 @@
"conceptId": "99305",
"contentBadgeType": 1,
"contentId": "UP9000-PPSA99305_00-DUSKLIGHT0000000",
"contentVersion": "01.003.000",
"contentVersion": "02.000.000",
"downloadDataSize": 256,
"gameIntent": {
"permittedIntents": [
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -79,8 +79,8 @@ Compiler: $(${PS5_CLANG:-clang} --version | head -1)
No game data is included. The Legend of Zelda: Twilight Princess belongs to
Nintendo; this title does nothing without a GameCube disc image (.iso or .ciso)
that you provide, placed beside eboot.bin. The pictures in sce_sys/ are drawn by
the port's ps5/art/make-title-art.py and contain nothing of Nintendo's.
that you provide, placed beside eboot.bin. The pictures in sce_sys/ are the
port's own, made for it with an image generator; nothing in them is from the game.
eboot.bin sha256: $(sha256sum "$app/eboot.bin" | cut -d' ' -f1)
SOURCE