Public Access
Divergence meter (Nixie tubes, world lines and clock), a D-mail sent through the Phone Microwave using the panel's Message text, the Future Gadget Lab inventory with live sensors, and a world line chart of today's solar power. Original pixel art in tools/steins_sprites.py; the sprite tool is shared between themes and Sprite, sprite(), polar() and arc() move to el512_pages.h. HomeData gains the message and a 24 h solar history in 15-minute slots. The rotation now walks all pages in a random order that is reshuffled every hour (Still Alive stays out, Now playing is skipped when idle). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
168 lines
4.8 KiB
Python
168 lines
4.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Pixel art for the Steins;Gate pages (components/el512/steins.cpp).
|
|
|
|
Original 1-bit fan art: '#' is a lit pixel. Writes
|
|
components/el512/steins_sprites.h and, with --preview, a magnified PNG.
|
|
|
|
python tools/steins_sprites.py
|
|
python tools/steins_sprites.py --preview sprites.png
|
|
"""
|
|
|
|
from konosuba_sprites import main, padded
|
|
|
|
SPRITES = {
|
|
# Okabe in his lab coat, and with the coat flaring out.
|
|
"OKABE_A": [
|
|
"......#######.........",
|
|
"....##########.#......",
|
|
"...############.......",
|
|
"..#############.#.....",
|
|
"..##.#.#.##.####......",
|
|
"..#.........###.......",
|
|
"..#..##..##..#........",
|
|
"..#...........#.......",
|
|
"..#.....#.....#.......",
|
|
"...#..#####..#........",
|
|
"....#.......#.........",
|
|
".....#######..........",
|
|
"...###.....###........",
|
|
"..##..#...#..##.......",
|
|
".##....#.#....##......",
|
|
".#.#....#....#.#......",
|
|
".#.#....#....#.#......",
|
|
".#..#...#...#..#......",
|
|
"#...#...#...#...#.....",
|
|
"#...#...#...#...#.....",
|
|
"#..#....#....#..#.....",
|
|
"#..#....#....#..#.....",
|
|
"##.#....#....#.##.....",
|
|
"##.#....#....#.##.....",
|
|
"...#....#....#........",
|
|
"...#...###...#........",
|
|
"...#...#.#...#........",
|
|
"..#....#.#....#.......",
|
|
"..#....#.#....#.......",
|
|
".#.....#.#.....#......",
|
|
".#.....#.#.....#......",
|
|
"#......#.#......#.....",
|
|
"########.########.....",
|
|
".......#.#............",
|
|
".......#.#............",
|
|
"......##.##...........",
|
|
],
|
|
"OKABE_B": [
|
|
"......#######.........",
|
|
"....##########.#......",
|
|
"...############.......",
|
|
"..#############.#.....",
|
|
"..##.#.#.##.####......",
|
|
"..#.........###.......",
|
|
"..#..##..##..#........",
|
|
"..#...........#.......",
|
|
"..#.....#.....#.......",
|
|
"...#..#####..#........",
|
|
"....#.......#.........",
|
|
".....#######..........",
|
|
"...###.....###........",
|
|
"..##..#...#..##.......",
|
|
".##....#.#....##......",
|
|
".#.#....#....#.##.....",
|
|
".#.#....#....#.#.#....",
|
|
".#..#...#...#..#..#...",
|
|
"#...#...#...#...#..#..",
|
|
"#...#...#...#...#...#.",
|
|
"#..#....#....#..#....#",
|
|
"#..#....#....#..#....#",
|
|
"##.#....#....#.##....#",
|
|
"##.#....#....#......#.",
|
|
"...#....#....#......#.",
|
|
"...#...###...#.....#..",
|
|
"...#...#.#...#.....#..",
|
|
"..#....#.#....#...#...",
|
|
"..#....#.#....#...#...",
|
|
".#.....#.#.....#.#....",
|
|
".#.....#.#.....##.....",
|
|
"#......#.#......#.....",
|
|
"########.########.....",
|
|
".......#.#............",
|
|
".......#.#............",
|
|
"......##.##...........",
|
|
],
|
|
# Kurisu: long hair, shirt and tie, belt.
|
|
"KURISU": [
|
|
".....######.......",
|
|
"...##########.....",
|
|
"..############....",
|
|
"..##.#.##.#.##....",
|
|
"..#..........#....",
|
|
"..#..##..##..#....",
|
|
"..#..........#....",
|
|
"..#....#.....#....",
|
|
"..##..###...##....",
|
|
"..###......###....",
|
|
"..#.##....##.#....",
|
|
"..#..######..#....",
|
|
"..#.#..#..#..#....",
|
|
"..##..###..#.#....",
|
|
"..#....#....##....",
|
|
".##...###...###...",
|
|
".#.#...#...#..#...",
|
|
".#.#.......#..#...",
|
|
".#..#.....#...#...",
|
|
".#..#######...#...",
|
|
"....#.....#.......",
|
|
"....#.....#.......",
|
|
"....##...##.......",
|
|
".....#...#........",
|
|
".....#...#........",
|
|
".....#...#........",
|
|
".....#...#........",
|
|
"....##...##.......",
|
|
],
|
|
# Upa, upright and squashed mid-bounce.
|
|
"UPA_A": [
|
|
"..#........#..",
|
|
"..##......##..",
|
|
"..#.######.#..",
|
|
".#..........#.",
|
|
"#...#....#...#",
|
|
"#............#",
|
|
"#.....##.....#",
|
|
".#..........#.",
|
|
"..##########..",
|
|
],
|
|
"UPA_B": [
|
|
"..............",
|
|
"...#......#...",
|
|
"..##.####.##..",
|
|
".#..........#.",
|
|
"#...#....#...#",
|
|
"#.....##.....#",
|
|
"##..........##",
|
|
".############.",
|
|
"..............",
|
|
],
|
|
# The lab's favourite fizzy drink.
|
|
"CAN": [
|
|
"..######..",
|
|
".#......#.",
|
|
"##########",
|
|
"#........#",
|
|
"#.######.#",
|
|
"#.#....#.#",
|
|
"#.#.##.#.#",
|
|
"#.#....#.#",
|
|
"#.######.#",
|
|
"#........#",
|
|
"#........#",
|
|
"##########",
|
|
".########.",
|
|
],
|
|
}
|
|
|
|
for _name in SPRITES:
|
|
SPRITES[_name] = padded(SPRITES[_name])
|
|
|
|
if __name__ == "__main__":
|
|
main(SPRITES, "Steins;Gate", "steins_sprites.py", "steins", __doc__)
|