From 61c37de884cd0c2e4e30ddd1102e58516a9f6009 Mon Sep 17 00:00:00 2001 From: iosullivan Date: Sun, 19 Jul 2026 16:49:55 +0800 Subject: [PATCH] First commit --- .gitignore | 18 + CHANGELOG.md | 190 ++ README.md | 177 ++ assets/fonts/pixel-font.ttf | Bin 0 -> 14488 bytes assets/header.jpg | Bin 0 -> 49872 bytes assets/screens/controls.png | Bin 0 -> 7214 bytes assets/screens/cool-cars.png | Bin 0 -> 7405 bytes assets/screens/demo.png | Bin 0 -> 6966 bytes assets/screens/home.png | Bin 0 -> 9131 bytes assets/screens/knobuss.png | Bin 0 -> 18935 bytes assets/screens/player.png | Bin 0 -> 122156 bytes assets/screens/sensors.png | Bin 0 -> 7484 bytes assets/screens/settings.png | Bin 0 -> 2406 bytes assets/screens/snake.png | Bin 0 -> 10192 bytes assets/screens/space-wars.png | Bin 0 -> 68916 bytes assets/screens/thermostat.png | Bin 0 -> 11365 bytes assets/screens/timer.png | Bin 0 -> 14738 bytes assets/screens/watchface-demo.png | Bin 0 -> 2108 bytes assets/screens/watchface-minecraft.png | Bin 0 -> 5225 bytes assets/screens/watchface-neon.png | Bin 0 -> 17023 bytes assets/screens/weather.png | Bin 0 -> 14440 bytes assets/sounds/alarm.wav | Bin 0 -> 60524 bytes assets/sounds/wake.wav | Bin 0 -> 6764 bytes assets/sprites/cool-cars/coin.png | Bin 0 -> 1115 bytes assets/sprites/cool-cars/cone.png | Bin 0 -> 1106 bytes assets/sprites/cool-cars/logo.png | Bin 0 -> 16699 bytes assets/sprites/cool-cars/ocop2.png | Bin 0 -> 2685 bytes assets/sprites/cool-cars/omus2.png | Bin 0 -> 2882 bytes assets/sprites/cool-cars/osed2.png | Bin 0 -> 3647 bytes assets/sprites/cool-cars/pcar2.png | Bin 0 -> 4327 bytes assets/sprites/cool-cars/road2.png | Bin 0 -> 624 bytes assets/sprites/knobuss/CREDITS.txt | 20 + assets/sprites/knobuss/bullet.png | Bin 0 -> 125 bytes assets/sprites/knobuss/core.png | Bin 0 -> 6438 bytes assets/sprites/knobuss/enemy0.png | Bin 0 -> 1786 bytes assets/sprites/knobuss/enemy1.png | Bin 0 -> 1770 bytes assets/sprites/knobuss/enemy2.png | Bin 0 -> 1908 bytes assets/sprites/knobuss/enemy3.png | Bin 0 -> 1791 bytes assets/sprites/knobuss/expl0.png | Bin 0 -> 274 bytes assets/sprites/knobuss/expl1.png | Bin 0 -> 391 bytes assets/sprites/knobuss/expl2.png | Bin 0 -> 489 bytes assets/sprites/knobuss/expl3.png | Bin 0 -> 579 bytes assets/sprites/knobuss/expl4.png | Bin 0 -> 632 bytes assets/sprites/knobuss/expl5.png | Bin 0 -> 558 bytes assets/sprites/knobuss/expl6.png | Bin 0 -> 426 bytes assets/sprites/knobuss/expl7.png | Bin 0 -> 303 bytes assets/sprites/knobuss/knobuss-logo.png | Bin 0 -> 114857 bytes assets/sprites/knobuss/life.png | Bin 0 -> 701 bytes assets/sprites/knobuss/ship0.png | Bin 0 -> 1139 bytes assets/sprites/knobuss/ship1.png | Bin 0 -> 1258 bytes assets/sprites/knobuss/ship10.png | Bin 0 -> 1210 bytes assets/sprites/knobuss/ship11.png | Bin 0 -> 1232 bytes assets/sprites/knobuss/ship12.png | Bin 0 -> 1129 bytes assets/sprites/knobuss/ship13.png | Bin 0 -> 1240 bytes assets/sprites/knobuss/ship14.png | Bin 0 -> 1227 bytes assets/sprites/knobuss/ship15.png | Bin 0 -> 1205 bytes assets/sprites/knobuss/ship2.png | Bin 0 -> 1262 bytes assets/sprites/knobuss/ship3.png | Bin 0 -> 1247 bytes assets/sprites/knobuss/ship4.png | Bin 0 -> 1096 bytes assets/sprites/knobuss/ship5.png | Bin 0 -> 1254 bytes assets/sprites/knobuss/ship6.png | Bin 0 -> 1263 bytes assets/sprites/knobuss/ship7.png | Bin 0 -> 1280 bytes assets/sprites/knobuss/ship8.png | Bin 0 -> 1111 bytes assets/sprites/knobuss/ship9.png | Bin 0 -> 1218 bytes assets/sprites/minecraft/flower.png | Bin 0 -> 190 bytes assets/sprites/minecraft/ground.png | Bin 0 -> 2268 bytes assets/sprites/minecraft/moon.png | Bin 0 -> 329 bytes assets/sprites/minecraft/sun.png | Bin 0 -> 329 bytes assets/sprites/snake/fruit0.png | Bin 0 -> 286 bytes assets/sprites/snake/fruit1.png | Bin 0 -> 286 bytes assets/sprites/snake/fruit10.png | Bin 0 -> 315 bytes assets/sprites/snake/fruit11.png | Bin 0 -> 335 bytes assets/sprites/snake/fruit2.png | Bin 0 -> 248 bytes assets/sprites/snake/fruit3.png | Bin 0 -> 304 bytes assets/sprites/snake/fruit4.png | Bin 0 -> 213 bytes assets/sprites/snake/fruit5.png | Bin 0 -> 291 bytes assets/sprites/snake/fruit6.png | Bin 0 -> 266 bytes assets/sprites/snake/fruit7.png | Bin 0 -> 274 bytes assets/sprites/snake/fruit8.png | Bin 0 -> 287 bytes assets/sprites/snake/fruit9.png | Bin 0 -> 343 bytes assets/sprites/snake/skull.png | Bin 0 -> 1064 bytes assets/sprites/snake/snake-logo.png | Bin 0 -> 54314 bytes assets/sprites/space-wars/enemy1.png | Bin 0 -> 2011 bytes assets/sprites/space-wars/enemy2.png | Bin 0 -> 1509 bytes assets/sprites/space-wars/exp0.png | Bin 0 -> 240 bytes assets/sprites/space-wars/exp1.png | Bin 0 -> 378 bytes assets/sprites/space-wars/exp2.png | Bin 0 -> 502 bytes assets/sprites/space-wars/exp3.png | Bin 0 -> 564 bytes assets/sprites/space-wars/exp4.png | Bin 0 -> 366 bytes assets/sprites/space-wars/exp5.png | Bin 0 -> 336 bytes assets/sprites/space-wars/logo2.png | Bin 0 -> 6554 bytes assets/sprites/space-wars/player.png | Bin 0 -> 2173 bytes assets/sprites/space-wars/spacebg.png | Bin 0 -> 64490 bytes assets/sprites/weather/cloud0.png | Bin 0 -> 2225 bytes assets/sprites/weather/cloud1.png | Bin 0 -> 2182 bytes assets/sprites/weather/cloud2.png | Bin 0 -> 2241 bytes assets/sprites/weather/cloud3.png | Bin 0 -> 2182 bytes assets/sprites/weather/cloud4.png | Bin 0 -> 2225 bytes assets/sprites/weather/cloud5.png | Bin 0 -> 2242 bytes assets/sprites/weather/cloud6.png | Bin 0 -> 2182 bytes assets/sprites/weather/cloud7.png | Bin 0 -> 2242 bytes assets/sprites/weather/moon0.png | Bin 0 -> 1804 bytes assets/sprites/weather/moon1.png | Bin 0 -> 1861 bytes assets/sprites/weather/moon2.png | Bin 0 -> 1941 bytes assets/sprites/weather/moon3.png | Bin 0 -> 1861 bytes assets/sprites/weather/moon4.png | Bin 0 -> 1804 bytes assets/sprites/weather/moon5.png | Bin 0 -> 1769 bytes assets/sprites/weather/moon6.png | Bin 0 -> 1736 bytes assets/sprites/weather/moon7.png | Bin 0 -> 1769 bytes assets/sprites/weather/partly0.png | Bin 0 -> 3411 bytes assets/sprites/weather/partly1.png | Bin 0 -> 3591 bytes assets/sprites/weather/partly2.png | Bin 0 -> 3759 bytes assets/sprites/weather/partly3.png | Bin 0 -> 3695 bytes assets/sprites/weather/partly4.png | Bin 0 -> 3639 bytes assets/sprites/weather/partly5.png | Bin 0 -> 3618 bytes assets/sprites/weather/partly6.png | Bin 0 -> 3627 bytes assets/sprites/weather/partly7.png | Bin 0 -> 3563 bytes assets/sprites/weather/rain0.png | Bin 0 -> 2658 bytes assets/sprites/weather/rain1.png | Bin 0 -> 2683 bytes assets/sprites/weather/rain2.png | Bin 0 -> 2711 bytes assets/sprites/weather/rain3.png | Bin 0 -> 2700 bytes assets/sprites/weather/rain4.png | Bin 0 -> 2733 bytes assets/sprites/weather/rain5.png | Bin 0 -> 2715 bytes assets/sprites/weather/rain6.png | Bin 0 -> 2697 bytes assets/sprites/weather/rain7.png | Bin 0 -> 2685 bytes assets/sprites/weather/snow0.png | Bin 0 -> 2380 bytes assets/sprites/weather/snow1.png | Bin 0 -> 2431 bytes assets/sprites/weather/snow2.png | Bin 0 -> 2421 bytes assets/sprites/weather/snow3.png | Bin 0 -> 2373 bytes assets/sprites/weather/snow4.png | Bin 0 -> 2387 bytes assets/sprites/weather/snow5.png | Bin 0 -> 2404 bytes assets/sprites/weather/snow6.png | Bin 0 -> 2439 bytes assets/sprites/weather/snow7.png | Bin 0 -> 2345 bytes assets/sprites/weather/storm0.png | Bin 0 -> 3081 bytes assets/sprites/weather/storm1.png | Bin 0 -> 3101 bytes assets/sprites/weather/storm2.png | Bin 0 -> 3134 bytes assets/sprites/weather/storm3.png | Bin 0 -> 2497 bytes assets/sprites/weather/storm4.png | Bin 0 -> 2442 bytes assets/sprites/weather/storm5.png | Bin 0 -> 3062 bytes assets/sprites/weather/storm6.png | Bin 0 -> 3086 bytes assets/sprites/weather/storm7.png | Bin 0 -> 3059 bytes assets/sprites/weather/sun0.png | Bin 0 -> 3213 bytes assets/sprites/weather/sun1.png | Bin 0 -> 4208 bytes assets/sprites/weather/sun2.png | Bin 0 -> 3990 bytes assets/sprites/weather/sun3.png | Bin 0 -> 4210 bytes assets/sprites/weather/sun4.png | Bin 0 -> 3789 bytes assets/sprites/weather/sun5.png | Bin 0 -> 4214 bytes assets/sprites/weather/sun6.png | Bin 0 -> 4035 bytes assets/sprites/weather/sun7.png | Bin 0 -> 4169 bytes base/core.yaml | 2932 +++++++++++++++++++++++ base/screens/README.md | 95 + base/screens/cool-cars.yaml | 565 +++++ base/screens/demo.yaml | 147 ++ base/screens/knobuss.yaml | 711 ++++++ base/screens/player.yaml | 265 ++ base/screens/sensors.yaml | 244 ++ base/screens/snake.yaml | 704 ++++++ base/screens/space-wars.yaml | 498 ++++ base/screens/thermostat.yaml | 298 +++ base/screens/timer.yaml | 17 + base/screens/weather.ha-helper.yaml | 37 + base/screens/weather.yaml | 541 +++++ base/watchfaces/demo.yaml | 118 + base/watchfaces/minecraft.yaml | 191 ++ base/watchfaces/neon.yaml | 245 ++ guition-va.yaml | 94 + partitions.csv | 8 + scripts/esplog.py | 25 + scripts/gen_snake.py | 647 +++++ scripts/gen_weather.py | 355 +++ scripts/make_sounds.py | 59 + 171 files changed, 9201 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 assets/fonts/pixel-font.ttf create mode 100644 assets/header.jpg create mode 100644 assets/screens/controls.png create mode 100644 assets/screens/cool-cars.png create mode 100644 assets/screens/demo.png create mode 100644 assets/screens/home.png create mode 100644 assets/screens/knobuss.png create mode 100644 assets/screens/player.png create mode 100644 assets/screens/sensors.png create mode 100644 assets/screens/settings.png create mode 100644 assets/screens/snake.png create mode 100644 assets/screens/space-wars.png create mode 100644 assets/screens/thermostat.png create mode 100644 assets/screens/timer.png create mode 100644 assets/screens/watchface-demo.png create mode 100644 assets/screens/watchface-minecraft.png create mode 100644 assets/screens/watchface-neon.png create mode 100644 assets/screens/weather.png create mode 100644 assets/sounds/alarm.wav create mode 100644 assets/sounds/wake.wav create mode 100644 assets/sprites/cool-cars/coin.png create mode 100644 assets/sprites/cool-cars/cone.png create mode 100644 assets/sprites/cool-cars/logo.png create mode 100644 assets/sprites/cool-cars/ocop2.png create mode 100644 assets/sprites/cool-cars/omus2.png create mode 100644 assets/sprites/cool-cars/osed2.png create mode 100644 assets/sprites/cool-cars/pcar2.png create mode 100644 assets/sprites/cool-cars/road2.png create mode 100644 assets/sprites/knobuss/CREDITS.txt create mode 100644 assets/sprites/knobuss/bullet.png create mode 100644 assets/sprites/knobuss/core.png create mode 100644 assets/sprites/knobuss/enemy0.png create mode 100644 assets/sprites/knobuss/enemy1.png create mode 100644 assets/sprites/knobuss/enemy2.png create mode 100644 assets/sprites/knobuss/enemy3.png create mode 100644 assets/sprites/knobuss/expl0.png create mode 100644 assets/sprites/knobuss/expl1.png create mode 100644 assets/sprites/knobuss/expl2.png create mode 100644 assets/sprites/knobuss/expl3.png create mode 100644 assets/sprites/knobuss/expl4.png create mode 100644 assets/sprites/knobuss/expl5.png create mode 100644 assets/sprites/knobuss/expl6.png create mode 100644 assets/sprites/knobuss/expl7.png create mode 100644 assets/sprites/knobuss/knobuss-logo.png create mode 100644 assets/sprites/knobuss/life.png create mode 100644 assets/sprites/knobuss/ship0.png create mode 100644 assets/sprites/knobuss/ship1.png create mode 100644 assets/sprites/knobuss/ship10.png create mode 100644 assets/sprites/knobuss/ship11.png create mode 100644 assets/sprites/knobuss/ship12.png create mode 100644 assets/sprites/knobuss/ship13.png create mode 100644 assets/sprites/knobuss/ship14.png create mode 100644 assets/sprites/knobuss/ship15.png create mode 100644 assets/sprites/knobuss/ship2.png create mode 100644 assets/sprites/knobuss/ship3.png create mode 100644 assets/sprites/knobuss/ship4.png create mode 100644 assets/sprites/knobuss/ship5.png create mode 100644 assets/sprites/knobuss/ship6.png create mode 100644 assets/sprites/knobuss/ship7.png create mode 100644 assets/sprites/knobuss/ship8.png create mode 100644 assets/sprites/knobuss/ship9.png create mode 100644 assets/sprites/minecraft/flower.png create mode 100644 assets/sprites/minecraft/ground.png create mode 100644 assets/sprites/minecraft/moon.png create mode 100644 assets/sprites/minecraft/sun.png create mode 100644 assets/sprites/snake/fruit0.png create mode 100644 assets/sprites/snake/fruit1.png create mode 100644 assets/sprites/snake/fruit10.png create mode 100644 assets/sprites/snake/fruit11.png create mode 100644 assets/sprites/snake/fruit2.png create mode 100644 assets/sprites/snake/fruit3.png create mode 100644 assets/sprites/snake/fruit4.png create mode 100644 assets/sprites/snake/fruit5.png create mode 100644 assets/sprites/snake/fruit6.png create mode 100644 assets/sprites/snake/fruit7.png create mode 100644 assets/sprites/snake/fruit8.png create mode 100644 assets/sprites/snake/fruit9.png create mode 100644 assets/sprites/snake/skull.png create mode 100644 assets/sprites/snake/snake-logo.png create mode 100644 assets/sprites/space-wars/enemy1.png create mode 100644 assets/sprites/space-wars/enemy2.png create mode 100644 assets/sprites/space-wars/exp0.png create mode 100644 assets/sprites/space-wars/exp1.png create mode 100644 assets/sprites/space-wars/exp2.png create mode 100644 assets/sprites/space-wars/exp3.png create mode 100644 assets/sprites/space-wars/exp4.png create mode 100644 assets/sprites/space-wars/exp5.png create mode 100644 assets/sprites/space-wars/logo2.png create mode 100644 assets/sprites/space-wars/player.png create mode 100644 assets/sprites/space-wars/spacebg.png create mode 100644 assets/sprites/weather/cloud0.png create mode 100644 assets/sprites/weather/cloud1.png create mode 100644 assets/sprites/weather/cloud2.png create mode 100644 assets/sprites/weather/cloud3.png create mode 100644 assets/sprites/weather/cloud4.png create mode 100644 assets/sprites/weather/cloud5.png create mode 100644 assets/sprites/weather/cloud6.png create mode 100644 assets/sprites/weather/cloud7.png create mode 100644 assets/sprites/weather/moon0.png create mode 100644 assets/sprites/weather/moon1.png create mode 100644 assets/sprites/weather/moon2.png create mode 100644 assets/sprites/weather/moon3.png create mode 100644 assets/sprites/weather/moon4.png create mode 100644 assets/sprites/weather/moon5.png create mode 100644 assets/sprites/weather/moon6.png create mode 100644 assets/sprites/weather/moon7.png create mode 100644 assets/sprites/weather/partly0.png create mode 100644 assets/sprites/weather/partly1.png create mode 100644 assets/sprites/weather/partly2.png create mode 100644 assets/sprites/weather/partly3.png create mode 100644 assets/sprites/weather/partly4.png create mode 100644 assets/sprites/weather/partly5.png create mode 100644 assets/sprites/weather/partly6.png create mode 100644 assets/sprites/weather/partly7.png create mode 100644 assets/sprites/weather/rain0.png create mode 100644 assets/sprites/weather/rain1.png create mode 100644 assets/sprites/weather/rain2.png create mode 100644 assets/sprites/weather/rain3.png create mode 100644 assets/sprites/weather/rain4.png create mode 100644 assets/sprites/weather/rain5.png create mode 100644 assets/sprites/weather/rain6.png create mode 100644 assets/sprites/weather/rain7.png create mode 100644 assets/sprites/weather/snow0.png create mode 100644 assets/sprites/weather/snow1.png create mode 100644 assets/sprites/weather/snow2.png create mode 100644 assets/sprites/weather/snow3.png create mode 100644 assets/sprites/weather/snow4.png create mode 100644 assets/sprites/weather/snow5.png create mode 100644 assets/sprites/weather/snow6.png create mode 100644 assets/sprites/weather/snow7.png create mode 100644 assets/sprites/weather/storm0.png create mode 100644 assets/sprites/weather/storm1.png create mode 100644 assets/sprites/weather/storm2.png create mode 100644 assets/sprites/weather/storm3.png create mode 100644 assets/sprites/weather/storm4.png create mode 100644 assets/sprites/weather/storm5.png create mode 100644 assets/sprites/weather/storm6.png create mode 100644 assets/sprites/weather/storm7.png create mode 100644 assets/sprites/weather/sun0.png create mode 100644 assets/sprites/weather/sun1.png create mode 100644 assets/sprites/weather/sun2.png create mode 100644 assets/sprites/weather/sun3.png create mode 100644 assets/sprites/weather/sun4.png create mode 100644 assets/sprites/weather/sun5.png create mode 100644 assets/sprites/weather/sun6.png create mode 100644 assets/sprites/weather/sun7.png create mode 100644 base/core.yaml create mode 100644 base/screens/README.md create mode 100644 base/screens/cool-cars.yaml create mode 100644 base/screens/demo.yaml create mode 100644 base/screens/knobuss.yaml create mode 100644 base/screens/player.yaml create mode 100644 base/screens/sensors.yaml create mode 100644 base/screens/snake.yaml create mode 100644 base/screens/space-wars.yaml create mode 100644 base/screens/thermostat.yaml create mode 100644 base/screens/timer.yaml create mode 100644 base/screens/weather.ha-helper.yaml create mode 100644 base/screens/weather.yaml create mode 100644 base/watchfaces/demo.yaml create mode 100644 base/watchfaces/minecraft.yaml create mode 100644 base/watchfaces/neon.yaml create mode 100644 guition-va.yaml create mode 100644 partitions.csv create mode 100644 scripts/esplog.py create mode 100644 scripts/gen_snake.py create mode 100644 scripts/gen_weather.py create mode 100644 scripts/make_sounds.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5839147 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Secrets — never commit Wi-Fi / API / OTA credentials +secrets.yaml + +# ESPHome build cache & artifacts +.esphome/ +*.bin + +# Demo recordings (host README/wiki videos via GitHub attachments, not in-repo) +*.mp4 + +# Python +__pycache__/ +*.pyc + +# OS junk +.DS_Store +Thumbs.db +desktop.ini diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c396d6e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,190 @@ +# Changelog + +All notable changes to this project are documented here. The format is based on +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). + +## [2.2.6] - 2026-06-25 + +### Fixed +- Neon watchface: temperature degree sign showed as `º` (double-encoded in source); now renders `°` like Classic. + +## [2.2.5] - 2026-06-19 + +### Added +- New **Knobuss** game (optional carousel screen, a knob-steered tube shooter): your ship orbits the rim, you auto-fire inward, foes spiral out from a black-hole core. Turn the knob to aim; every foe that reaches the rim costs a life and bursts in an animated explosion. The ship is a pixel fighter pre-rotated into 16 frames so it always points inward, foes are glowing orbs, a rushing starfield + concentric rings give a cheap 3D-depth tube, and the menu has a "Knobuss" title screen. 3 lives, top-10 scores. Add it to your `screen_order` as `knobuss` (`gyruss` also works). (Art: Lunar Lander pack by Matt Walkden, CC0; see assets/sprites/knobuss/CREDITS.txt.) + +### Fixed +- Cool Cars ran choppier than the other games: its per-tick position updates were 8 separate widget actions (now one batched lambda, like Snake/Knobuss), and it ticked at 12.5fps (now 20fps with speeds scaled to keep the same pace) - so the motion is much smoother. + +## [2.2.4] - 2026-06-19 + +### Changed +- Sensors screen: each glance now gets its own accent colour (icon + position dots). +- Added a faint depth ring to the Sensors, Home (Classic) and Weather screens for a consistent framed look. + +## [2.2.3] - 2026-06-19 + +### Changed +- Thermostat screen polished: the whole arc is now colour-coded by action (heating / cooling / idle / off), a white head-dot marks the target on the gauge, and a faint depth ring was added. + +## [2.2.2] - 2026-06-19 + +### Changed +- Timer screen redesigned: colour-coded depleting ring (green → amber → red) with a head-dot, SET / RUNNING / PAUSED status, and tile-styled buttons with a soft glow. +- Alarm screen redesigned: red scrim, a big pulsing bell, "TIME'S UP!" and a tap-to-stop hint. + +### Fixed +- Returning to the home screen after music stops/pauses keeps the selected watchface (was forced to Classic). +- The Minecraft watchface now shows the active-timer badge. + +## [2.2.1] - 2026-06-19 + +### Added +- **Minecraft watchface** - a blocky scene with a day/night cycle (sun by day, moon + stars by night), a textured grass/dirt ground, a pixel-font clock, and a heart bar for the battery. Optional, like the other faces. + +### Changed +- Watchfaces redraw the clock only when the minute changes (not every second), so they stay light; faces slide in by swipe direction instead of cross-fading. + +### Fixed +- Silenced the font "missing glyphs" warnings (pixel font uses an explicit glyph list; the Roboto faces use `ignore_missing_glyphs`). + +## [2.2.0] - 2026-06-19 + +### Added +- **Watchfaces** - the home screen now has selectable looks. Classic is built in; enable the optional **Neon** face (big two-tone digits + neon rings) or copy the heavily-commented **Demo** template to build your own. Pick one in Settings → Home → Watchface with a live full-screen preview (knob switches, tap keeps). + +### Changed +- Settings: clearer names (Home screen, LED Ring, Voice Assistant, Show weather / Show climate, Screen auto-off) and the selected row is styled like the swipe-up control tiles. +- The rotary knob now wakes the screen from sleep, just like a tap. + +## [2.1.6] - 2026-06-18 + +### Changed +- Control tiles: the lit tile now has a soft amber glow, and tile names get a little letter spacing. + +## [2.1.5] - 2026-06-18 + +### Changed +- Weather screen redesigned: animated condition icons, colour-coded temperature, and a glow that slides to the selected day. +- Boot splash ring is now an azure comet instead of the rainbow. + +### Fixed +- LED ring no longer flashes a stray pixel during screen transitions (RMT now uses DMA). + +## [2.1.4] - 2026-06-18 + +### Added +- **Snake 360** (optional carousel screen). Steer a 360-degree snake with the knob; eat fruit (up to 3 at once) to grow, avoid the ring, your tail and up to two skulls. Keeps a top-10. + +### Changed +- In games the knob only changes volume on the menu/scores/how-to screens; while playing and on game-over it steers (no accidental volume changes). + +### Fixed +- Clock could stay on UTC: the `timezone` substitution now maps common IANA names (e.g. `Europe/Warsaw`) to the POSIX form the device needs. Use a POSIX string for unlisted zones. + +## [2.1.3] - 2026-06-17 + +### Added +- **Boot splash**. A short "HELLO!" greeting on startup (~5 s) with a spinning arc on the screen + and the LED ring animating, then it cross-fades to the clock. Touch is ignored until it hands off. +- **Hold to talk** toggle (Settings -> Assistant). Press and hold anywhere on the screen to start + the assistant; this can now be turned off (the wake word keeps working regardless). + +### Fixed +- Clock could show UTC (off by the timezone offset) after a restart until the next time sync. The + device now re-applies its resolved timezone every second, so the clock never drifts to UTC. +- OTA updates could roll back to the previous firmware if the device was restarted shortly after + flashing (on esp-idf the bootloader only keeps a new image once the boot is marked good). The + image is now committed as soon as the boot splash finishes, and the safe-mode window is shortened. + +## [2.1.2] - 2026-06-17 + +### Changed +- Per-screen settings are now declared in each screen's own package via a generic Widgets + options registry, so a screen is fully self-contained (its options, globals and reset + logic live in its file). Adding a screen with settings no longer touches the core. +- The games' "Reset scores" is now under separate **Cool Cars** and **Space Wars** groups + in Settings -> Widgets (previously a single "Games" group); each game owns its high scores. + +## [2.1.1] - 2026-06-17 + +### Added +- **Sensors screen** (optional). A glance of 1-6 configurable Home Assistant entities, shown + one at a time big and readable; turn the knob to cycle (slider dots show the position). + Pulls straight from HA (no helper), auto-skips unconfigured slots, and units with a micro + sign / superscripts are sanitized so they don't render as boxes. New `glanceN_entity` / + `glanceN_name` / `glanceN_icon` substitutions, plus the icons `air`, `plant`, `plex`, + `server` and `shield`. + +## [2.1.0] - 2026-06-17 + +### Added +- **Thermostat screen** (optional). A round dial for a Home Assistant `climate.*` entity: + the knob sets the target temperature (committed ~0.6 s after you stop turning), tap toggles + on/off, and the accent colour follows the action (heating / cooling / idle). Shows the + current temperature, humidity and HVAC mode. Set it with the `climate_entity` substitution. +- **Configurable wake word** via a `wake_word` substitution (default `alexa`; built-in: + `okay_nabu`, `hey_jarvis`, `hey_mycroft`). + +## [2.0.0] - 2026-06-17 + +Modular screens release. The firmware is now split into an always-on core plus optional +screen packages, and you keep a single thin config locally that pulls everything else +from GitHub at compile time. + +### Added +- **Modular screens.** Optional carousel screens live as separate packages under + `base/screens/`. Pick which ones compile in via the `files:` list and set their + left-to-right order with the `screen_order` substitution, all from one file. +- **Thin local config.** The root `guition-va.yaml` is the only firmware file you keep; + it pulls `base/core.yaml` and the selected `base/screens/*.yaml` as a remote package. +- **Weather screen.** Today plus a 7-day radial dial (Apple-Watch style); the knob + highlights a day, the centre shows the day name, temperatures and condition. Includes a + Celsius/Fahrenheit toggle and a Home Assistant helper sensor that feeds the forecast. +- **Example "demo" screen.** A small, heavily commented screen (TAP ME!) you can copy as a + starting point for your own screen. +- **Configurable control tiles.** The swipe-up page is now four tiles, each with its own HA + entity, icon (chosen by name from a 20-icon set, repeatable) and label. Works on any HA + domain via `homeassistant.toggle`. +- **Configurable clock timezone** via a `timezone` substitution (DST automatic). + +### Changed +- **Repository layout.** The core and screens moved into `base/`; the root holds the thin + `guition-va.yaml` you copy and edit. +- **Settings menu.** "Widgets" is now a per-screen group menu (Widgets -> Demo / Games / + Weather), each opening that screen's own options. A separate "Home" submenu owns the + home-screen widget toggles; "Display" keeps global brightness / night / screen-off. + "System" is always last, and device Restart lives only inside it. + +### Fixed +- Clock showing UTC: the timezone is now set explicitly (the Home Assistant time platform + does not sync the zone to the device). +- Control-tile icons rendering empty, and the "led" icon pointing at map-marker-outline + (now `led-strip`). +- Settings list collapsing "Restart" and "System" into one entry (a folded YAML newline). +- Demo LED ring staying lit on the home screen after a reboot. + +## [1.0.0] - 2026-06-16 + +### Added +- Initial release: ESPHome voice assistant for the Guition JC3636K718C round knob display. + Clock, music player (album art + transport), timer, two games (Cool Cars, Space Wars), + settings menu, WS2812 LED ring, on-device wake word and the Assist voice pipeline. +- Fonts, images and sounds fetched from GitHub at compile time (nothing to copy locally + except the config and the partition table). + +[2.2.5]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.5 +[2.2.4]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.4 +[2.2.3]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.3 +[2.2.2]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.2 +[2.2.1]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.1 +[2.2.0]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.2.0 +[2.1.6]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.6 +[2.1.5]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.5 +[2.1.4]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.4 +[2.1.3]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.3 +[2.1.2]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.2 +[2.1.1]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.1 +[2.1.0]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.1.0 +[2.0.0]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v2.0.0 +[1.0.0]: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/releases/tag/v1.0.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..442ee4a --- /dev/null +++ b/README.md @@ -0,0 +1,177 @@ + + +![ESPHome + Home Assistant Voice Assistant on the Guition JC3636K718C](assets/header.jpg) + +# ESPHome Voice Assistant for the Guition JC3636K718C (round knob display) + +A full-featured **Home Assistant Voice Assistant** running on the **Guition +JC3636K718C** - a 1.8" round 360×360 touch display with a rotary knob, speaker, +microphone and an **addressable LED ring**. It's pure ESPHome (no custom C firmware): +an always-on core plus optional screen packages you pick from one thin config. + +It started as "my kid needs a physical timer" and turned into a whole puck. 🙂 + +## Demo + +
+ +
+ +## What it does + +- **Voice assistant** - on-device wake word ("Alexa") via `micro_wake_word`, full + Home Assistant Assist pipeline (STT / LLM / TTS), wake beep + music ducking. You can also + press and hold the screen to talk (toggleable in Settings). +- **Boot splash** - a short "HELLO!" greeting with a spinning ring on startup, then the clock. +- **Music player** - `speaker` media player visible in HA / Music Assistant, with + album art, title/artist, transport buttons and a progress bar. +- **Timers** - set by knob or by voice; big countdown with a depleting ring, + pause/stop, and an alarm (sound + on-screen + LED) when it finishes. +- **Device control** - a tiles screen toggling your lights/switches. +- **Home screen** - clock, date, battery, weather + room temp/humidity, with a **selectable watchface** look (Classic, Neon, or your own). +- **More screens** (all optional, knob-driven) - a weather forecast dial, a thermostat for + any `climate` entity, and a configurable multi-sensor glance. +- **LED ring** - controllable from HA *and* reactive: assistant (comet/spinner/wave), + timer countdown, alarm flash, volume bar - each reaction toggleable in Settings. +- **Four built-in arcade games** (a lane racer, a vertical shooter, a 360-degree snake and a Gyruss-style tube shooter) for the kid. + +Everything is navigated with **swipes + taps on the screen** and the **rotary knob**. + +## Screens + +| Screen | View | +|:---:|---| +| | **Home / Clock**
Time, date, battery (a bolt while charging), outdoor weather and room temperature + humidity. Pick the watchface look in Settings → Home - see [Watchfaces](#watchfaces) below. | +| | **Player**
Album art, title & artist, prev / play-pause / next and a progress bar. Auto-shows when playback starts. | +| | **Control tiles** (swipe up)
Four configurable tiles toggling any HA entity; each has its own icon and label, and the colour follows the live on/off state. | +| | **Weather**
A 7-day dial; turn the knob to scroll days. Animated condition icon, colour-coded temperature, and a glow that slides to the selected day. | +| | **Thermostat**
A dial for a `climate.*` entity; the knob sets the target (a head-dot rides the gauge), tap toggles on/off. The whole arc is colour-coded by action - heating / cooling / idle / off. | +| | **Sensors**
A glance of 1-6 configurable Home Assistant entities, shown big one at a time; turn the knob to cycle (dots show the position). Each gets its own accent colour. Any entity, pulled straight from HA. | +| | **Timer**
Set by knob or voice; big countdown with a colour-coded depleting ring (green → amber → red) and a head-dot, SET / RUNNING / PAUSED status, pause/stop, and a fancy alarm screen when it finishes. | +| | **Cool Cars**
A lane-racing arcade game - the knob steers, dodge traffic and grab coins. | +| | **Space Wars**
A vertical space shooter - the knob steers, auto-fire, survive the waves. | +| | **Snake 360**
A smooth-steering 360-degree snake - turn the knob to steer the head and the body trails behind, across the whole round screen. | +| | **Knobuss**
A **Gyruss clone**: your ship orbits the rim and auto-fires inward while foes spiral out of a black-hole core - turn the knob to aim and shoot them down. **Every foe that reaches the rim costs a life** (it bursts in an explosion). 3 lives, top-10 scores. | +| | **Settings** (swipe down)
Display, Home screen, Widgets, LED Ring, Voice Assistant, System; turn the knob to scroll, tap to enter. | +| | **Demo**
A small, heavily commented example screen (tap flips black ↔ white) to copy when building your own. | + +> Optional screens (player, timer, games, weather, thermostat, sensors, demo) are pickable - choose which compile in and their order; see [Configuration](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Configuration). + +## Watchfaces + +The home screen has a **selectable look**. Open **Settings → Home → Watchface** and the knob previews each face live, full-screen - tap to keep. **Classic** is built in; **Neon** (big neon digits), **Minecraft** (a blocky day/night scene) and a heavily-commented **Demo** template are optional files you switch on in your config, and you can copy Demo to build your own (see [Configuration](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Configuration)). + +| Classic (built-in) | Neon | Minecraft | Demo (template) | +|:---:|:---:|:---:|:---:| +| | | | | + +## Documentation + +Full docs live in the **[wiki](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki)**: + +| Page | What's inside | +|---|---| +| [Hardware](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Hardware) | Board specs, full pinout, what to buy on AliExpress | +| [Installation](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Installation) | Requirements, first flash (USB), OTA, the bundled sounds | +| [Usage](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Usage) | Gestures, screens, the settings menu, the LED ring | +| [Configuration](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Configuration) | Change entities, tiles, wake word, run without Music Assistant | +| [Troubleshooting](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Troubleshooting) | Known issues (battery %, GPIO0 strapping, performance, the knob) | + +Release history: [CHANGELOG.md](CHANGELOG.md). + +## Buying one (AliExpress) + +Search for the exact model number and verify the listing matches: + +- Model: **Guition JC3636K718** (look for this in the title/photos) +- ESP32-S3, **16 MB flash**, **octal PSRAM** +- 1.8" round **360×360**, driver **ST77916** +- touch **CST816**, rotary **knob**, speaker + mic, **LED ring** + +⚠️ **Heads-up:** there's a near-identical board, the **JC3636W518**, with a *different +pinout*. Make sure the listing says **K718**, not W518. More detail on the +[Hardware](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Hardware) wiki page. + +## Quick start + +> **Requires ESPHome 2025.5.0+** - the LED ring uses `use_dma`, added in that release. Older versions fail to compile with `[use_dma] is an invalid option for [light.esp32_rmt_led_strip]`. + +1. Copy `secrets.example.yaml` → `secrets.yaml` and fill in your Wi-Fi. +2. Copy **`guition-va.yaml`** and **`partitions.csv`** so they sit together with `secrets.yaml`. Edit the `substitutions:` at the top of `guition-va.yaml` (HA URL + your entity IDs + the four control tiles). That thin file is the only firmware file you keep - the core and all screens are **pulled from GitHub at compile time** (see its `packages:` block), as are the fonts, images and sounds. +3. Choose which screens compile in via the `files:` list and their left-to-right order via `screen_order`, both in `guition-va.yaml`. +4. **First flash over USB** - easiest via the **ESPHome dashboard** (GUI) or the CLI; the 16 MB partition table can't be set over OTA, so the first flash is USB, then updates go wireless. +5. In Home Assistant: open the new ESPHome device → assign an Assist pipeline. + +To pull the latest changes later: `esphome clean guition-va.yaml` (clears the package cache) then `esphome run guition-va.yaml`. + +Full details on the [Installation](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Installation) wiki page. + +## Repository layout + +``` +guition-va.yaml # YOUR config: copy + edit this (pulls everything else from GitHub) +partitions.csv # 16 MB partition table (keep next to guition-va.yaml) +secrets.example.yaml # copy to secrets.yaml +base/ # pulled as a remote package at compile time (no need to copy) + core.yaml # always-on core: clock, controls (swipe-up tiles), settings menu + screens/ # optional carousel screens (toggle each in guition-va.yaml) + player.yaml # music player (album art + transport) + timer.yaml # timer screen in the carousel + cool-cars.yaml # "Cool Cars" game + space-wars.yaml # "Space Wars" game + snake.yaml # "Snake 360" game (knob steers) + knobuss.yaml # "Knobuss" game (Gyruss-style tube shooter, knob aims) + weather.yaml # weather (today + 7-day radial dial) + thermostat.yaml # thermostat (climate.* dial; knob sets target, tap on/off) + sensors.yaml # sensors glance (1-6 HA entities, knob cycles) + demo.yaml # commented example screen + weather.ha-helper.yaml # HA template sensor that feeds the weather screen + watchfaces/ # optional home-screen looks (Classic is built into core) + neon.yaml # "Neon" watchface - big two-tone digits + neon rings + minecraft.yaml # "Minecraft" watchface - blocky day/night scene + pixel clock + demo.yaml # "Demo" watchface - minimal, heavily-commented template to copy +assets/ # fetched from GitHub at compile time (no need to copy locally) + header.jpg # banner + fonts/pixel-font.ttf # pixel font (Minecraft watchface) + sounds/ # wake.wav + alarm.wav + sprites/cool-cars/ # "Cool Cars" game graphics + sprites/space-wars/ # "Space Wars" game graphics + sprites/snake/ # "Snake" menu logo + sprites/knobuss/ # "Knobuss" game graphics (ship/foes/explosion/core/logo) + sprites/minecraft/ # "Minecraft" watchface graphics (sun/moon/ground/flower) + sprites/weather/ # animated weather icon frames +scripts/ + make_sounds.py # (re)generate the wav sounds + gen_weather.py # (re)generate the animated weather icon frames + gen_snake.py # (re)generate the snake sprites + esplog.py # stream device logs over the native API +skill/ # Claude Code skill: hardware spec + gotchas +``` + +## Claude Code skill + +This repo ships a [Claude Code](https://claude.com/claude-code) skill at +[`skill/guition-jc3636k718c/`](skill/guition-jc3636k718c/SKILL.md). It gives the +assistant the correct pinout, ESPHome component choices, and the hard-won gotchas +(the knob isn't quadrature, GPIO0 ring strapping, 16 MB partitions need a USB flash, +LVGL performance limits, lambda/string pitfalls, the battery heuristic). + +### Install it + +So Claude can use it on any project: + +- **User-wide** - copy the folder into `~/.claude/skills/`: + ```bash + cp -r skill/guition-jc3636k718c ~/.claude/skills/ + ``` +- **Per-project** - copy it into that project's `.claude/skills/`. + +Start a new Claude Code session and ask anything about this board; the skill loads +automatically. See the [wiki](https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/wiki/Claude-Code-Skill) for details. + +## Credits / notes + +- Pinout and the display `init_sequence` come from the **official manufacturer demo** + (`JC3636K718_knob_EN`) - this is the correct pinout for the **K718C** board, which + differs from the otherwise-similar **JC3636W518**. +- Built with [ESPHome](https://esphome.io/) + Home Assistant. diff --git a/assets/fonts/pixel-font.ttf b/assets/fonts/pixel-font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..85c14725a3bf6d67aaf0f03292f9b763c1654f07 GIT binary patch literal 14488 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 Z*c*kN@$GAW{e3oGeYSI$CI24pe*xM150(G` literal 0 HcmV?d00001 diff --git a/assets/header.jpg b/assets/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6fe1494a2bac866e97987cb1198308998a07d57 GIT binary patch literal 49872 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 uWB1ozv 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

4+=Bbdnnnn7FTmBEjc#9TPagum`^Y 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 literal 0 HcmV?d00001 diff --git a/assets/screens/controls.png b/assets/screens/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..9bff76fd9b6635dbfb4d1a23f58c271e6c6fb23a GIT binary patch literal 7214 zcmds+*H=^B)`xi&0gaSN7a7~Lk6d}JvM~E8n$cF=>em%Mg_AdZy6UaX?NP%J z1kIV2_`u?$EiV820W0dd@1(QQ^~S!LfTNH7Gg3u-iW2HR*Rk^CN?|UUVKhgMYC+sN z$`Z6v`s&yDKV7-8$>C>h*WzQ7?5txXtYcv`PmfqmhScM%utgU^hnv{zHpkb-&w z+Bi7aTeuM)3jL@yKFI3?e3a3P6mXukKiqu{YXZ=ozl?vSFWp{-c>8Yi0XHu{@QpTH zCyRfLZY_^>z&1Emecxn~(#z5mo;9jr5Gp*A`%wd*Xez9uDk?2|(A|ww8~?tBSR1&3 zUPC+_?_4u8SWHg9xR2cyh|BHp%u4{dTZ~-4dq%j);~&tS7Eys|@&hQ`+iacr;4^yT zQ-Zm;2~-%{)hVFuu94?>mv=C>WqNS{mt!CJRKbth+lnJ(V(Ox_fHA*_QG-uGTy;Znx|l5?^WZFM5u*ME}U>}GBtYdJ9%l?+)$ZSWwF7@H!H&S-}H2Qc?&RC9cF$V&-YPqMareUwFx+g=K3+g`66g z4|6C)ugO%26{N`8?AsKLAn&BG^}8+2%6aZKvlNb5s%hp2D3m>j8S{?uDeWruKKy}Up^II0Yv}}va2p?o=V@hbpX*NQ6<*@ z?f#BN=B^^HD9WDMv!&X9eLOjY-|vartSe2KeTx72rvENIhAT7x5SZCRH&Ka9@)y@b z(3MCEVoMwHaP6MtH7dQ61;KBgnmQe?O6Va@-i)%0Dvv>KE)7&v%%-TfWy!iW!N*i5 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 literal 0 HcmV?d00001 diff --git a/assets/screens/cool-cars.png b/assets/screens/cool-cars.png new file mode 100644 index 0000000000000000000000000000000000000000..b0673fd6b326d6f722619b96ecf00a8902423daa GIT binary patch literal 7405 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 z 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

7?AjWvw@`cghj-9_ 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 z

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

E&MSUdUls;}8~j(PU5!HkS~G@?NaCO}0F} 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 B%uoOT literal 0 HcmV?d00001 diff --git a/assets/screens/sensors.png b/assets/screens/sensors.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb1fe3957f49142d615d1e17e85f15616781563 GIT binary patch literal 7484 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 literal 0 HcmV?d00001 diff --git a/assets/screens/space-wars.png b/assets/screens/space-wars.png new file mode 100644 index 0000000000000000000000000000000000000000..e12088497efd8c4072cdbc5b2c4e5fe185b7c199 GIT binary patch literal 68916 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

21}Xl?0uScho5RE8qpIRAz7Z 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 literal 0 HcmV?d00001 diff --git a/assets/screens/timer.png b/assets/screens/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..5bee901ecd6a8e7e3fc0836c7f291b9c64c4439d GIT binary patch literal 14738 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 literal 0 HcmV?d00001 diff --git a/assets/screens/watchface-minecraft.png b/assets/screens/watchface-minecraft.png new file mode 100644 index 0000000000000000000000000000000000000000..711c238575f846fae5a67dd6519d034d7e53139a GIT binary patch literal 5225 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 Icg-^BpX|G+j{pDw literal 0 HcmV?d00001 diff --git a/assets/screens/watchface-neon.png b/assets/screens/watchface-neon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba42032e0b9cefe87ee87318d0532c42105637c GIT binary patch literal 17023 zcmXtfb97|S^Y+HJF|n06#(d}VJ-_#ynSbu>Q{7!% zx4Q5=5z2~ED2RlJU%q@nk&zZx{qhCE^1nYkB>2gF*hAo#FQSq%;v(uE*%vtu;lwAt zM{D3s-a80CX3wg}kel;&q= zXV*(bpPt71Ydup<#$`rk#)t3O_XTh4JWOoB=T^6r20Uk@T7_3h?)gFi}qWG|k`2dOKQ3A!qqi5BC;DDPK_*McH+ zvK>!WNkB?!%E}C|h*A;cm~+y4NfiuO617zvDUmTkhSSR8)eub{XwFHufrBbE;o^5# zCFN)02@`SS0Poo**x%v+dK@}p38|zCMRg4teiaiufc^!UjH(j9Tc`q}Fh~IV0}EOX zq3`>C!GtSC7aDfPatY3(HI}-h?mkW1MZl{+l8b6QBv`m^!)#$0PVP64(^=Ob- z&&d7-Jchc(Ey9VVWc)y5r%}Q?W${P^L@5;|dDnu4t3nS#kgi6@p?1c>i4hvT{U8~r%a27GRcf&SM zjhUM)m3eW46xD<1&LHiOxOdUuTE_vSH3E^jYE&XA6%=*H;vHmF&SuGSZ}A&?m+70+ zXOIaP;B7A=88D@~E$>dniHk$yn3Cs%{sb^AOakp{^*vI$|MCMWv$ez}QcmiX1j}9z z=*QlBL;8A%zwM26@2pjxkUz?I8&Q0Cn?LBE%s zO4m-ouBRgBARj{ERj>3Wt>`jt+xJhcEqCsN7ifL%Cq*NDY(Efc%+P_q7D4lAoux)5 zy7qo&LG-c(FVEi8gZUk`t$0`@LYo$m+*OJ2m>|T52A!|J#N=V~#x&%gew=`9LE9tj zoH!v1Y}^Y#>Et=3V;~T=h!ZZ5pOR zY0Y{_1rBwZM_1g|f@MCan2Z2mf5FMg6IE7*olIA&3crXq91PeHvgf?~Q$Z`%tC2~&rcMIte zksaH|COcDfQD7&D7*qC9>WZ=9rtl%tQEtgfh#vW(O^furZ1mZc#%3LvBYRx0f)0p8Ztqqr<5MJ zW%n|T1$IM}(KguyJkp zZ|3Dq;$T3j{xEuk?cDu1Lkh~1-SWW1FjUBpSrlOsqgG8o(~K&MBfUz?lAN}$&>z0@ z)z+=b-XvF>`X}U#A(WQV5DQbyt66@pc>AT&ahD+d^t&4O4p)K6P&ut1ZhMyKc0sU= zIxIK7sg18{-!mD2qPN%Q9M_0sstXNxLRqc~WqKoRQYSz3_tH}mT3-+SyyWVSO7Y9_ zDj20t5ynC{p82(QlUz}Ba8uQJOSfgJ1Dw-@5;HNQAbsMhqg%6-+hGjFcO^3jsMn`8+u zR#U+trtQ~)ERzKe4L!|>^uVWNjMea!$WHa!_81Octh;7brTm^$bwHDMa&r;;*~OUt zo%~V%h7=k-D#Ma%32^O0T0%Hn+)Z-@3JTA=e_NpPHs@ebHHG%|-F{HR`Z8X_O0gG4 zg=2z|)P85(ik5hj+h$#I>PK$l-^JTxT7=KYp;{dqCszbnN#LI$PkSL3)Wo~`7OTg~ z%2Z|??AYm~K4N*XK5?~{z%zfWg=q{p#*~~pW zMT0k7ytalLveNOa9IMW;riL521?P!uS|K&N;>2P_IQ)A>b2t#d?IuV6N`$Bh90m3y;1+n<|u576qp^9i}pde8Przz2x$k z@7su6L-X4F5$d5bucT?Q0&&9OE9@w|zho-`WfQf84X^S^P~RW747Y}3VL1?LtWfMY zL2>K{s5Vf5cMfZ*j9`;_bu1kq&14eQGi@VP@l)$s_H3-v+K^((%0AAFoFcqkZ)4JO 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 JPDHLkV1nggw59+6 literal 0 HcmV?d00001 diff --git a/assets/screens/weather.png b/assets/screens/weather.png new file mode 100644 index 0000000000000000000000000000000000000000..179e162fe45ac17cf230ef4c4154193bc2b11f14 GIT binary patch literal 14440 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 DDpg<7 literal 0 HcmV?d00001 diff --git a/assets/sounds/alarm.wav b/assets/sounds/alarm.wav new file mode 100644 index 0000000000000000000000000000000000000000..f19edb26febafb8af39d126007a1d845fe3c3f83 GIT binary patch literal 60524 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/cone.png b/assets/sprites/cool-cars/cone.png new file mode 100644 index 0000000000000000000000000000000000000000..29ab1080e27a0bfe76b6efe77dcfcdbf1c044cff GIT binary patch literal 1106 zcmV-Y1g-mtP)7%g5T5t;&yI~98Cu;EJ@tKnM}q6oe?P#HmK@A(e`hUO-%mgwz9RBXQu6 z8>d!+14tmX*TSLv$TUp~QBr;sE1^HJiR%bE@!C!tuh+Z#(5xNB0k^6^2u2!vG~YMh z&g{Bod`L4(J{sxVvXGU3eL~ZTclL#dbzaDJVjzV z^i-?B&@sjwVvXEJ`%CL~yPe@bw!lOVc%uUAx?pvLF^F6ZYv4ATMcgvnwOA}>f-H;P z96LS4=U*PQm!BWp6S5|mzL_+q%l4^jdh3;(mrOt`rpdBQW3iatbmTez%t-lmoE zBfb3*`Q)*qywAn~I>wko3^~Y6)M}uqpdi@U7yxxCOH|LT7Mur$VAq@HKy2@{9AnHO zh8*My!p^aGs8_3HG7iLK#bOR%Q(5@>OJk+)Q5t%E)WTP;UIEOh`HZ51o*M@Ooz*gF z)}fWet1)2ieM3j~4;&wTxLsYPzfQah1~VQ}Ek&L&3=T8=U15JL`f$D&~oYqwq=)=xH@#ZL9{i*b!nx1?xhw{vk4 zyaRokPrUO1Y^Im33%7Ix!MnT7aDG48f*h5)C9G-CumnkcpJ-=jzpLc)xqMooI`#e; ze%JA1T*q5y0Z4s+nE}6lc$S;`>~rR;`t)4?(=NyAYHKq2Q?af=NH`o7I3-^@w!<0^aLxpfDcrhM$pB1eJpHgzF@x>Ycrnvvcdz3j zHEi1LBG_g!W%F`M{U)1MFMx7m+QR&POKZoLM8l4N^UuT}u+ z9ReZ13ldZ+>JRIxemK1_lZ!-7@w2n%t4)tyq3|1}04%*Qvj*M$XF%iwpjH@|q&_nv zVB-jAY6|Y$SflkCxW7fYa5yY(eVFd$$oU5!EO=nsaSs~}pW4R8MpNABbh5^m>c47# Y0Me4xG@lyE#{d8T07*qoM6N<$f>p2_O8@`> literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/logo.png b/assets/sprites/cool-cars/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..027c802c166d82a1cb4e0e656d9445142776d0db GIT binary patch literal 16699 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/ocop2.png b/assets/sprites/cool-cars/ocop2.png new file mode 100644 index 0000000000000000000000000000000000000000..01619ed20ccddaef3ebe9fbdb36b8883bda77109 GIT binary patch literal 2685 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/omus2.png b/assets/sprites/cool-cars/omus2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9a8c08062b41906b710838d797397cfe310b39 GIT binary patch literal 2882 zcmV-I3%&G-P))}8fz{0cc=!s9p`}H;sV6VfRlbT0Fr?E8 zdU|Z}rMfQtDC1;NfPh~glfpG~e0+R>0ys`6+tC;_7#U=&FN=UuN_#9;_Z?LaEpr_E zXOybt9Q?YA1-^%}>IF!*t;5jSBcq?~+PaA<%CkNEbbX;7 zF)(sr(5|XUY4Jp*?mPZ92{46We8j-Opo!7`Gf<3>+qUuf1SjN;6Z_u((eTK~4h#*U z=h^`jWy|LxAeJX0%CkIgN2AGm%c|mUL}C>SDJ3Q$!~mdst_R0<;Jeo$;4`?63qlB( zs=>^TsYY4MYuosI5M2i5N6PGfomPKlRlF4)zii+3amq^Sc zK!EiWty^g2xkYdDz;ij_DhL$|(!le4rm8E9NMsQqa6Q)zsajEhghS#_l*si;NZdF5 zovCmNIYkXcgSHLN*HflGQy4mf^sTLM90%f79&m_tGADZ)!_nkuA=mLldwaXm(NQE( zB0zw425j-G`_r8j$;x{I&j(=?p5wyzJcJ?R~JiF}rp*QSDaYN_uG_mJw^1UC!$5?MkiZUzo-Q8_KizW#0M4~0?qp*uodOK4UFK~Sg!qq_3AeZz65d;BYq`V9(SGR+d#ZkYs4xe=% zK)5^#5s*?wXO`ql0)ZDW7cS$RdwMu>ch!RCgCm1S@02CvIC(`il-q;A7gD7PK#`X# zL7A!|pPfYW(lnN=TZ=>cx^ec@8G#NnJBpTvpG9*lAyeALK9D}$hsR%h8JW*cp!fI%L@SF;JEu+gQ|wzVntXX>&7xzH0HuOh5P(zaI*x3d z;sb!^c?g0))IP>X$8lThaxg}*{oTJJ0KrJ#IkauqjH=X9geoebs4AGML(w!4_^3`T zma9uFw;s`_U&8R&W7zZ7Z*X!?2bQh*7FPY>Ib@FZPiNu=j0t}!p|=#9I1U680gXl? z{{8FL!ZIxhq#HWUpE-x|(J|by;x71sk25Du;n2PVU`&Bi$l~57e~QNCt09u-yDl6n z4@H!lC_MnKZIx!Qpn>wLT9j8UK=MV^eXaN>LHk>BRklOPu~0m!m(=ju7g-Ig@fDQ!`{Da#gbdThE?mIfK@P|X&Nr} z_98nmA=RrCkShyI(u+4YS75>)kCvDDYrpp>vrSw6q8U2+&-SA0*jbK^c+$P)ZO4TxL! zY~~naIDO(Y^4T1gwcaN0D?Kk}hM6zmIF=1XRixI7{t%HY3~T8>_tpu_GZHuvqNN5 zd{$RiT_#BgMuvuE@D$Di7o3Q3t+=j>{{D+NaNtwC`m5JaU!R0!S>Qat;#-$u(UQe5 zO$(urfz!uN;^dKIpo#)Rl)wz-nQ2-mR0{Fz&IiFY@rkOSkTbD))3aE;x($xw!Y~YM z-0%!0vpJCJ1&gPUi>b0bAF8S#915Y3FUY34*bvK`OCjXK9>Wj zOf2jIA&d}mCs7oxP)bC~giKac#*l2Nhvzuh^N&s>lC{$>ahC=LaPQhRG6P4t|0x|Q zs!@@JT`;8z&EdT)1yxnBY{gx$3wi9_`SGmyqRBt)Iw)sSp{6gu4&?8Z$BPd|6RXv@xq`q z!AnlgCcnjY;0T2coIZMrez^5LCY)D8p{wwng23;?!y6vQ)muYNbT(kIy$CL$tuto=N0@V)nK<0um|;M$kH_3uq_*U$PiP}atfB1R6Al# zRqK29?aSf|S~|TvF`mo515WOr3!fv{VVm~xAP6WWRO}r@OVHfph0QH3E!xa1i++$V zx$;z?=ad5wUX@DKQCI&n=UAiaN?s2~G`oZHB6C>gzi?dKEzNm9ltjGKZ05vNa?YiN_bG6b*j@ zXuI!=jh8CaX1kfo{xF{(yfk%Ea1&>ott!y%UJt*ap&@i-aC)Xr1<8#r5{oTt(nI=V zK0J#-F?`qDGCX{Kp!E9}cmB)5FWOx1d)Ijn{LkZ)FSbZ)aSJG|TO2#waLxZ0;LqE< g&D*@q+y9{b3!op2K_ej?1^@s607*qoM6N<$f{?+7f&c&j literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/osed2.png b/assets/sprites/cool-cars/osed2.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3aa584f54a9ac90d57cffa8041240b16ccb6bd GIT binary patch literal 3647 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 Rz_$PZ002ovPDHLkV1npT?aKfF literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/pcar2.png b/assets/sprites/cool-cars/pcar2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b94bb83263d88cf346e44fd62f833a4d546b030 GIT binary patch literal 4327 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/cool-cars/road2.png b/assets/sprites/cool-cars/road2.png new file mode 100644 index 0000000000000000000000000000000000000000..1da4573c17252563c6613366b1793e20cff4b3c4 GIT binary patch literal 624 zcmeAS@N?(olHy`uVBq!ia0y~yV9WrrS8*@_N&X8?oeT_2=AJH&Ar*7pURx-5*g(M5 zQG0R{PfY6s?tol3&1pn5C8xG literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/CREDITS.txt b/assets/sprites/knobuss/CREDITS.txt new file mode 100644 index 0000000..0ed90bb --- /dev/null +++ b/assets/sprites/knobuss/CREDITS.txt @@ -0,0 +1,20 @@ +Gyruss sprite credits +===================== + +ship0..15.png, life.png, expl0..7.png + Derived from the "Lunar Lander" asset pack by Matt Walkden + (mattwalkden.itch.io / mattwalkden.com), released into the Public Domain + under the Creative Commons CC0 dedication. No attribution required; credited + here with thanks. Ship sprite pre-rotated into 16 frames (+ an upright life + icon); explosion sliced from the 8-frame sheet. + +knobuss-logo.png (menu title screen) + "KNOBUSS by Zan" - made by the project owner (Zan). + +core.png (black-hole portal), enemy0..3.png (glowing orbs) + Cropped/scaled from a "celestial objects" pixel-art set. Used with the + project owner's confirmation that its license permits redistribution. + TODO(owner): fill in the exact source/author + license for this set. + +bullet.png + Original to this project. diff --git a/assets/sprites/knobuss/bullet.png b/assets/sprites/knobuss/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..8c117f82ac406864034a0b90f1b910fc560d0c4d GIT binary patch literal 125 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/enemy1.png b/assets/sprites/knobuss/enemy1.png new file mode 100644 index 0000000000000000000000000000000000000000..e29ead516a38e3c3ebbc28d40d1ae744957371f7 GIT binary patch literal 1770 zcmV)K+7M{KP>>z&G2j}EZG72fecAQy&d$uKX0RI|7qt)V_cU{K z=KId~Ki~Y%f&UZ4?Jp${E{{f{qJ(UgYljb99UImr+&8bf@c#SB+>GxLLd-3gJqINa zz{y#Al!DlX(}TU8Wv}inANcZ&0ru{7K3Aw_>C#HqQFkbsx>7n0&Twjl2!&J8hRI(U zjmI||RTBwURN`0`(sfaF9fUv&263$1hM|^IYh)xa^O z%@UkcgHc$7UOkE0@=_vIRh(%#O=(RnLJ{;_IFAqt3SfrA2t^^;eDrBMo$BmTa#Erw9}XV#|q_$jPJ z99(CsP(;3}>CtGh%_Vo{N)-_lC`g`ucJ*s>TD~|IxDLQbs)?ZN|@k`MYG-^+YP3@QIt|&!I3^p9c=`V0Y?> zuwyOz#;!jcR?cqT@P_5`Th%nFt|%iC43f(_yq`(Yo3TDYJ`ORSBn8}@M0&Lx8*?0q z)O0H5F9b6LiZWj;+VR5FrK?xYibZ3)XPX)>F7NatNmvf*n2PHyR(u>$kFx}oDs(Jd z8dMX-^+QEUx&$K{TF7EJJ&JDVL_(o1O}h3=jb+8L!EB0_%Qu)(UFEkJk2LSzigU4{ z;#DSPd*ZiBIe<+7;X4_wlxRuGaK`b&(x639J34v!Pk%vE1n1j3<|;?l{&-~$dN0Zlc=Wp!hVVn^kCB^^7N(hG~1&bXOxJl5)%?? z>#3glMeO(hwWLk|ugya&Uh5*TuP=ff+nL~*LI|iA5Zu~DfqCaylCsvN4`q`rOR|BhnZ6v=15}1?*>%? zos8o$XgQx64$a#@U~yH9=>;Yy;wi%65QP;LTg#vQ>C=g}wh_NG%o1X-UCP#$%5td% z4AGahDbh8Lr$>lq2eGB}9U0^4xDB39De?EBZ6wEiu>eC-BYE+nbMf7St!KA9llSKR z`%5XMa+LhW4@R8L9m$kt3d!QiLgKc|xtnRSwoT5JcQ}$jNL2`E8gt5`Wa9(u-1BE< ztz1Q_zi-Fuv!<>a3+cz_kr2Wg_{ExzK3zA>O|F2qt|u@O{WR586E7;{X2wD~_N_oj zi4+PG3&I4GH#yLHffM@=q8kQ(-}Q2ueD2)1$Q_Pu$C~yV8xvjEpUb6Ee01nNVs-bh z=z*C`Pz4jFPeaoU|3u9s;+*`bo#vCRa2Q3?f8}Jdm(Oh3@aYHN-Kbx;{t49x zPY#!rY_vy5$>nl5wnNqQ8EA&?3ys9%4E6M222F&f<77wIdMEqY%^RP;o9{D)#xdmw zPi?Z3$<3yBhbS%c?-O1J@LGi)40+Gnhg<$J&nPc{H87#Nk$}GQ%rk30_^*XNaos}B z^#&!JEP811sYsXF;J9Ztf?buG%Kf61-J2U5?ovoSx<+h(R zb2Ouw?>*mp-tRpJKBEw~K79F(&1+TQKkw%BD}AHmM@#Rz+uGVUw>$Lia5#P@`-T*9 z*X|w%$C4EN;0@c9KRJFn&*WsD#zqG(D7tpuSfY~ZqaTbdd@9hM?yjd%+E3IPKib@B zJh__FiJ4hmu3w{QX_O!>0zW`0Ff9Wiz_uip#*17}E0$Ii3N=+ZO3d?IHJ%ssLAuOov&W;xH<6Bmh98GP}P zuhP2Z^K9rkbrWd&6vD7@-67sT@iysskNw~8CcP>U#q7>A$FInaj@Vm$BeziZz|PKI z&()7@ZS$}G@Zf__H*IK$uP(bBe&rqZedkd+w||e78v_)*E9gL?0n0W}DxjjGot1Q) zsVje^VVyz5amc$KADq0%#s0~04C9e!UK|_@EAsO8Q1?dn!>@h&&Sw*AYvU{F948K+ z8&%c4zK0;V!8iXVgX~ME<3H%I&`~ovG zZ*pz^FwJZChH41g(6OE}+apIEfOig+joS2k)_3+T*7}AbfT# zru9>vAJDq7hL+ZcF;@~HRZ10ZUV%r{ZpSw3Nlm}Ra_$_FcoJz^Xas?BDaK}5Q}ZB7 z<&cJCY$!!M>XlV@|L*8Yb&WwTlV$IH2dJn^P~ks-WhOqBj0kCSjWM!}paX?r#!xwz zZ00gT%20_;vV}mn7_l6c72Rk#Nq^rZzW%K($P#UfOZqp}6^e~JTWRm=1?8Z10TLh@ zB)+{wCNn}Yvp|r|quj#H2^dB=hQzEalbyQ+QB6(FCeFSy#O6EJlfIt8OjMaeUO=-S zC~E7gaAF2w>jMQjOR%~^cJ>Nr1zMJqBg)B3D}GCOnPrd)&qy)SpG6pwYg5-*zoiLN zNYPv@`gGm4o~?JZQ_Opql_p9S305;?uTFd{1Ovm4pnUHW0BJ}5(^jO!u1g?1@cn@E z$1f6zRxmTMfGI_Z-vHAnt%E>Hn|ywfW$`Y#>2ZWjR5R8q2oH=0-zma?2B;#Y7vLv1=Q` zJo)()(d0S|CrTvIhzi`WQbAd~NI@*Qf&6@i<}RPsP0dUV&v9*DBZF1%3AZ3P-8aMB zCskwJtCuLoNt(3ICyXhAifBN}Tbojyw} z5+Ub$FPtCFeOFo)Ms$L*!U1?$)$MXI?Brt6mxjFG=-^o3QG&jjlW5DVifnI z5vER`=Iz)2hEPyhTk-QlzZ(8SlT~EM3xrEMK8MIoNu+F?(vt(S*-?(O9E-cAft z;^s0erlNFg`6jW-6s|i<;DsboA}SQQSSB?&Mlm1IcjSYxLWx=|di>I`?ce?Q7w5*q zjqlin@vD1p>pVDoxp-KL2!p3a34BFmJc?foSXs(&Ep>?G+Ixva*3)(STF@mBjbYl1 z51-_tOEZjJmV@j_LC2{+hlPjO)+0YX;I8%)xLke zpX&j+&bIXn|MzgxRMoWR2ancQ4UV}3y**C#f7w|%v?|g2j_0Xkjw9kH-}81P8?2W$ uwutl3{Carm8@=nIt9hsL*5lS^7XJn#6k0n{;EE3b0000$g&6k literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/enemy3.png b/assets/sprites/knobuss/enemy3.png new file mode 100644 index 0000000000000000000000000000000000000000..d37ac845954581339dd5ed519cfab3ddbd72bf0d GIT binary patch literal 1791 zcmVkrVx=9GA7g%VFssz#Zh!>>kNbKjG!aq z_-dhJV<%eawDdvfXf4zcn_xmH1_Dh;DIxDHY+k!dOg8(z_a0|&5NUY)r{A6X$2oK6 z`|kJse)pUM{GUK>AFN3&kOebRqlltobadqAH1D=bSq6g*c1b=eaYA{foC^vHFdQ{e ze$S%r6`m&7%V{M(pRWl}?<=$_CnrN9!XZlN7L_qX6X6PWn%LtFdUoYxJ4#+_ZH?YnsNB8e+eXSa#8nkhB?h~}4q238 zd%0FKWXE_IrN%$837{W>f12=}T(Xk30ZC7xz^&EWK6d2TB zabSrrx%1?+qr

Gdic3{=$aOJzW1tZY2_$g5RD!jHfo#WA)Z0fFfh;>=Z(CA#juf zPdOwM6)v|K)7BgK~Ft;LSqo95K*4+4h?ALBNVh5SD`;Dy!=akSc12N*~yPt=r^BPoDg_=;2Q<9At|14(xv-2YV z0RtEVC{JK8^T@7F!I?jdpy$SA_566(lmveB>!19!Q+LD|6FPPtJCJX8?`j$T2zxg_ z0n7o4qUc6~hV|-|0URc$Th$Yb9IiPn4VHAbw zMX;Kzpd4F6c2{mKe0I~$m3D{WP3syFP&8aQ5`Sug2$#ZAurQDGc#h_0D>c z`52ReNkoDXjQ5VAhjgRi(0d>}@apgPf`94M+Z6*fV?Q;g7*+?vA^d3PlW>JIb;9&A zqwYpbp`ZeRuP2OHP`hWGV1OudkX;fYA2U#qV0mgG=6W^I9R)SH8BWLZoIoI3Q*iwF zS%}LL5DXl09!QZ zh#ZgBk$+-*xDqR>^S}}s5C=?d5x(v)B7Ox_O4=cJbyK*-0Z!%7a{Oalk9)x}4vqo| zvQ6Ady=ft@%CyIa|23-Fjdtw$@^>NlOfc9v5KlUYXA#)tG-SC8U`{h5e`P*6f%}X= zGG59N1iE9G7H*)a{Ul715rW8J;Qg6|Bjjqn^=b8`)!#_rQyMj75fP@C75DZ)#ge%*rw{dby63kTJRC6n>@F)CuZr>|VRSi)kitS}}C~=gmU)Hd; z`PT0JPS43Vx0P)$Fh;lWgsWmP;L;zb;5YZ6tU3#s@=_3L#L}v440aB{vDB#lD^9mb zKPFn*il@ceL+#`+L{s z#tuz}eE4wqG&qe1(Fj&%ltSV}U1(x%3M0W$q!?1b6HdQ7aD+Ywin`akPJDPf-#vwr z@IBjEbtTYO0YdgQ54GcJU=SL#`2z@mL6E>0Ie2|`c(p~eA2v&J1)=1ZZ*-mLUdZ*C zJHtY_e*J|O_G8ut!^CTs$9mBmY(7dUDc75g;e4@m+1JHT&iHx%Kg=Op=!jEszUYhj he*&Q9e!Txv{2Rrv)BGvsDjxs<002ovPDHLkV1kF>Q3n73 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl0.png b/assets/sprites/knobuss/expl0.png new file mode 100644 index 0000000000000000000000000000000000000000..caf39b5844e0a31764ab6e9c510238da0aa93b64 GIT binary patch literal 274 zcmV+t0qy>YP)+;0G*y0fSK#qL!*^ZE)npw?s{&+{Je`GBbFB zT-hN6Kv)0~Lh^3Ijp}rN7^YVD$m^N$9|0(ygo%86``)|m^Lly?d#@wF?vAzs`Wf;i zC`6F_Rt0&&1=&tO_wl;|Nc}Qn!6?c=DQDZ{@3}k_fy(Y6F}bulMWnd}ZKJcpG=vpF zt0#(=(_p14q(M}M(T^R2st}H?SR)dK5XGZ->gkwZ>7SW^N}yU7hX5%EoIxP~!UFKc Y8}6M=MH~iAM*si-07*qoM6N<$g5!R1EdT%j literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl1.png b/assets/sprites/knobuss/expl1.png new file mode 100644 index 0000000000000000000000000000000000000000..1df056c84e1ed069d4456af3cb5beb67769d1619 GIT binary patch literal 391 zcmV;20eJq2P)3|wwyWq?LDuC*sg5ATODFbSN3OI-n!Ju&zS>}~X{uxh*ZKQ8xAqylT z=u@Fr?=S$sa0C#mG6t8;PiFJiURy7kC;j4Q0B}jFMPQ2ru+R-^(ddG3D7eGM zj(Ko~ry4G zZ@;d@E6H&mVDU0aAlgM^-G@(- lAT2XA{4?rVVE}-hbpdFek?Qao_vQcq002ovPDHLkV1l~RtvCPx literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl2.png b/assets/sprites/knobuss/expl2.png new file mode 100644 index 0000000000000000000000000000000000000000..3cde8ad1e840f332aea27d6df696c69be1e61024 GIT binary patch literal 489 zcmVB#Pbm7ut__LV{xbpy5DLZX=9cW`cl zA_Q*j@N!b^8E%F{UEu;%@FWPgs!70*frAJO)_RKwc3UfyCo!;p`1*M!?S=U`9BUTb zA%eTX5{L*i0cp3TB!ci1Y%eb3G}r<(76fd|BiJ=ZAf5~kHRi!>JA!OXNS|E405_qm zKJ*$+?j2oOfNX>D0^>Zc`(>cI+g?IBVD9KTMoA24kmRBnfhwjJsQquF;{gJ=-8&Dy z1gUK2BETC|a&-<~FfIaW%oBt{3c@zc5Il;d{`Q{8#1&5^{B+7-?}D+xwEk51iH?Aa)u-h-Paw4Mtw7ChLwp}}g8Kz{9{H1( fQTQEO{c-vU;#K42%0J4200000NkvXXu0mjfI7Hq8 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl3.png b/assets/sprites/knobuss/expl3.png new file mode 100644 index 0000000000000000000000000000000000000000..902749432217d58456d2d8f58e7addd7aa893903 GIT binary patch literal 579 zcmV-J0=)f+P)Ftdpp`*AiTC1VPa{sE6a%M*`#MtX>{UdtDLO*$av&%))>|K%%ga za#9j{0eZmGe+9k(8}&fd2(&7`B1;5jZ!sdaCqsn*?r#U|{%||I4$i06?og2!J&+=Y zAPcyTlB#%2N!qsTAdsLe0<-rBZjz|&4xOeM2ubKDjC#EZE`YVZU=fpau9Y2#La^*) z#p3~bMLMrz;4Fe*Z)}2l0G19U<-JlvA|ZQ zs|FH~ngMk0Z;5pxQq~D~6!{F-ji=cePw0w%3Z~6(6qLcHmyQ15)d>}+Ar2$Xx!*;M zr7@O;LgN&a225ku{Hy7ETKHIKI9IR>+--(4pdQ1ppxLSIDcdmaNg51#&0xAaR!1-t zw&RTF)V!ETLvoB1=RF?Xjk^Jzdp9&EUzCe3COu-c>l3bNbnV-*dmR6V`~ZbHN|M3m RPcr}j002ovPDHLkV1h)m{XqZ# literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl4.png b/assets/sprites/knobuss/expl4.png new file mode 100644 index 0000000000000000000000000000000000000000..808a57aa0657df5a623f2482382d9d1c1d962ce5 GIT binary patch literal 632 zcmV-;0*C#HP)1kEHpcamg+WPo;y=9VEkfC>ttOi@oC_Ywg`ZG|EqA3vhW zdp|vM?S>_3S&{lH$>aR;<{$U{gnk=R>w64{;qz_XI~~*GeE3bz{{ccx02lJX7%;94 z+a*9m=JE4I+W}mt`~esj-R5eDYYlA25u7@LmCo^(zpr_|bSfM7g5a z(yiZ-4rez+NDJG8fl69@r~nXO-m8JKx+u#5RtivRDs`rhBw34oUKs-@#x*ZmA?bo> zCE=rDSQtoN>rzun5i5zkN%e^W04?4M!1(HB!|xy8`TOaZ=Z~ra-Vf)w#NRzNL(nwL zrKw9*uk&p@Cnf=4;)2j;#_eJdrfh9R*zPEe&gs~qxK#my{xE;OViwJLmdhBJ8`LKt z(eq#=8iFModqh>C0pYgvben*7FFZ?#7=!@f+V|J2ImvQ0#Ti=hloPBai}Ith972Uy zNO4m}iptPQs4Kk`lvf%{e2^B+WoP>*ORSgr+yT%2SoMGp5@=jatyTGW?H+sf=lLHqM#y27 S3^q6b0000-$UkKm+No4QMo%XM8oiMZ_*Z$N~qgFcI5tUxlrhtk1M`@XE%u`6jE(Dr8HE zWj0E-w?;*q1!k@Q$gwjln~4&tF}Y@MV?Ay#ZR!mY4yGeZ&968696cu?MH zTbq`sB?}&{fyR*(6)m*9HfKgeUOp2p`JTp++LAaYX;4q$Wz=EL&8`((2bzZR1 zmH%rEAb^{HyCwJX?cA^qT=K}f0F3eR{n5BC<9|}iWF6e2N?6R+f;R{gW5zp0R8`?~eEn#DRxtiMveQrsrglL@1=(ztK%~U1Mb1Ymke%^eqJ_+X&2hGK zOTz1)6tu`ul-mlAFj2io7RqXOS(L)vIy+rtCa(;({hvH%sgUe=^%n^y z8mzn~;f*}mB4yS|Cc@<2_x^|)b1|u;p*vwj0NoQ=T(l@l-S{D-2g)7-= zH>86|3*aXRodyvK7b~mnDQy2EL3M(}V_Mb)R|@KkebrE84B;~TQUqr1fYpD@KghcB U7&bnKQvd(}07*qoM6N<$f+It>J^%m! literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/expl7.png b/assets/sprites/knobuss/expl7.png new file mode 100644 index 0000000000000000000000000000000000000000..da936cc1c1713589e167e7d921a68c29cb9e0d50 GIT binary patch literal 303 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/life.png b/assets/sprites/knobuss/life.png new file mode 100644 index 0000000000000000000000000000000000000000..eb577aff40b7c47ff76e5cb02ecad4f72152e671 GIT binary patch literal 701 zcmV;u0z&8oVg%lT} zf*@#Hsh~wm!ABP@T7=q;)lR3KN0P~7l6;c5@i7Hmxa)xnmwV2+-{sy9*usCqgHpCW zdHT*3{^(>@>YSp{rc*Ho0)6x-dL+5AwNdCRRdRDfLOYV;<^K$^EH1p;kGmH6R^x#Rn?TJ zV1umRf)p#Fs=Kf(1*GW`G?Pax7A-&!+cusY%>L}>es8F+=Z3hDq*Nasf5KST`H^B91z_Sd2T3m${ zJRpN1P9Y*S9w|+CE!N(ls0@p-ghF5eo(bDjp{oT@*9byaH(*-^;8`Fr;cFo(!!?hx zCzIJLIb#F5RsdyX5H1F4ufkM6qiU9dFx4e^=E@I_Rp4tSXKcXt{?YKzxxusPmU0|U z1)v__Rv;LYAglx?R2PJwN4)0%^)(c}Hr-N=``%x7*fxGx;bx``uQ_a4EMR{D@6AK7 zXQ4+g!V~rbpy0fZkiCZ}X}eGjWdObzg5V;|tQZBS{TOC@-v(DEZhoX-HH2Y&dd<4a z^L5hKK{0N^$h#0Lk6;pZ8Wf1LFFQh_hlu(Pwmt{TZoO^lI}VuPR43u`BNXTj8dCj3 z4*EhL)<*9)B@zmhmZWQu9*{5uMtfFYxzPud;5ByLb4|9J5D}utOeoUWaCR4-d>I}}5(N@F00000NkvXXu0mjf%au5* literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship0.png b/assets/sprites/knobuss/ship0.png new file mode 100644 index 0000000000000000000000000000000000000000..7c51bfbd674527fe68be61ac1656dc533be75ca5 GIT binary patch literal 1139 zcmV-(1dRKMP)jYbrX1# z5QR__Bv{ZzZBc9qEoo~gyK3vMy6w8>?3wd3XMWB%U%1*u(8W2jO2IxbH^a;~5AXYa z@4O!@u)qTUW3<)BUlM&sF0=TJea*fTyA>jfR_)td)t0;;p!XB}=~26I_O=UkKRVLE zxfixSux-baiG;iUt1te@`cV$*=LaZ!e(d%ME&C|5sAttHzF*%RWcRFarUyASk*6#k zMAT2Cf|<8lS?=bAmVBDk(y84ln0Y;@Pu(R+;s$MeKeQ1MOQWeWDlCnnTNAA;D_Zr) zZ5{5>m3Uey`Dz$6daI?&X!0t$)lCpI5JCghAo4B~t9(<;C8w__jJIaafA>i<>uW8z z=$-fNS+BhEKqS?ndbQZ=mc~$#kBkJNJAGY72vnnj2&XZ{WZtVz-m4S`oBc@BLa%*z z{7_d{_)~dydZ|+w!*feC!YVXMASPY_O<}aw>Y5UYltSuxemM~*iX8BKJU@qNr_gkLZoB)Qi|5YbR%Qvq21E@s?Mz_E7X#nxhX+nAXw zMyB~XYPzW3eg5&iQ&Yx;~qX+$iGFuK6J6J>M~8hzBu7KW7| zKHq)l26B4%@Xx}^Y|(VF*G}cf5^cQ*%|zD}Mxqm?qH8T2p{M7hoI<*&8uD~2eW>NX z{lASLscgsf@uOCPusk<@2vtEXPG{>g07y6rX&y@=UYu_FowsnXESR_5ye)G=s*1s32I^B1@v=~v+bcT4~P002ovPDHLk FV1oSAB=`UT literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship1.png b/assets/sprites/knobuss/ship1.png new file mode 100644 index 0000000000000000000000000000000000000000..b12b77942e397a6e371964d2a810f480890fb1d4 GIT binary patch literal 1258 zcmVBi)qb(s8d+l6{mJR#$jT?{=HjEy;R1EM?_ zI!w!gov4K{8v&67Pjw;|{see`vK9VJaXOiZ{GsI}tjA|XNJYNuBpqbuS-i4+IWjE* zhC_&uL>MRtp+h%Juq*)5g`f$fjeW>q7p1c%B9so5WHoyGG~_0` zFn+chez*Xkek}}9f|L;il>_O)uxfzRJs4N*(5oBRsM2BBNs1?u74@np)NRW~_2d05 z=mz`itQD6VSK=@r=lwIkGcZNw14q zGqcm$DvcEO!>(S4Qu;-p;RV?BE8#dANC+qy!E*;73=1T*=|F=dLNvNE^tQ^7H=sf; zyoZJ{R3t0Jp2*~`^`eZjhEcNP>yuj7i0h=fMD?4bhHcvLa@rAN*((+mmgS% zf$c?9NTrLBC)V8hUUvVn>#eHn(;T`8{0W8}BT~WiR1i(Tjt)S;15=zKU5e}8Loqx1 z)flk5QlS}L9jP@PY0_fv`uT}R{oE;CpvVk^pgVvJpqGAy;ckOnWx+2@Kr<52)R~Uy zSHNWvnx<)EBOL2XGcj*9kwg$kD8v8`!1)tw(?P1KJIlENk90kOk)GW%>QV94ah}u9 zor&2s&sui!sL)d^6@k4{IZc3`ASrDbc{*9y6pW-6VTR0H2td$r{~yA>@iiHRy>-3lW#2Fs zZ)em!T=7<(^$DHl)cQ}Eob|*mpf|(-*tnuX0940a8(0OWp(Ta^RJ@tzm;&!6vw~k-uvF0H#41|ZD-n2C=@A0KnREgTcHi0h6OC7#vjq>N;W3OjfsDNi7rSa zZd^)S8ZgF%vQR@1C~6EvtyEE3hZbSl>HO%tdGEe^OiA3iptSsm>1T8A;^yRY?>Xn@ z0Lv`%Adwk*2@id6VKE`Z(%Arrr20v@+r%TE4m|)u&T3fsL+q|2Db3FNCe+lvtLHEv z(emPEdbNtu_3_S$Kf*%*E&-Uk>nY205B^v$PeC`T zETe!{SqFBzVkVR--8et8MPB@UXMeKqV`rhU7cA7&zCJ7Ujlh^X*dtMyn1tuGFq8!$ z1z_2Hy|fB$>-Ihw+kNn^3stU-7U!(~y6^6Wr@CQ6iMaZeh&6x^LJ6`g3Fs1n*-P8+ zT2Z$>w)ZWb{_FA-zn7y3A7fGyrV8N~Am+|NN45Y~7Q_q^l1aK0hNg%{Fn}wsjx1?W zckI{~P^f49NKcj;lZIuN5bz+K7Ql%iAP0~MAgltW1|u>gWCm_LW&5Gu9$vx7lBF!$ zwMW-)R8*)r3kjBTj$j0wNDRqzGpzY52^-Q*Lb#n^s|7HcjenDEH`A0&We;NKxVt1T zlwC7$ET~W2+Pi6sjbDPI849@!%Uuoa6+y;FQ>qKXj^8Tkz)PTBo1#z$@V%R`VwwJA zmLs!3eX&BqvAt2o5@3qrY&%7zIwL@WwvM-b|e z>(wGz?uw1FJh=PJ@&Skbv*aVa^kv z`Us>cAe!tZKe~x|`XsWE3;CJbvH5SIwcTj$8APPJ->Ad^VK=8?tt27>h!My=02@Fh zA)PpsvY`D2$`uV&`vP%%1KS4tnH*H2jau>v^!0CfdhG1+j|k8p;@cPMc>N97t4dPm%lZStB$wW6J zv@U;3M8U$ltnmI(igriI?l`3^MVr@M2nM#FM$d}VfcBUWK+YEqSpe6d>qYoM0OL=? zYWxh=Ari68h`AeJfk2QbTrG_rf9J}1+-b`Ar{}iLuR4G9iS`}Q)rr>pE7Qf_dR1yo ztD+hZc+es`-|8F&6$D<1T-SzB6*wvbe>RTqPmQ1^H;~uRFzlx>^Y)n~`>A&yKAb;u z;#5z(@2eLHyuV&8tn__`9nB%AO@PTlB(aL4JVv@vX60nbwk=cfn}i>PXbcZ5XvA62 z;g!#GdVKi9L2`3L>D;H=n0FlPo9dyqIwDh*`k}~T) zC72I*EVIlq%lyCj Y2bdYsmzVp>KL7v#07*qoM6N<$f=2R2?EnA( literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship11.png b/assets/sprites/knobuss/ship11.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f815fe4c81dd8a4faa01ed43133967cb0ee4b6 GIT binary patch literal 1232 zcmV;>1TXuEP)LKot~5W+@djM11F7A#ol z0(VBG3r!>jh?*Et5(pJ(!A8IU(g*DzooQ$8o%=ZFGabST7ejd@Ci7d|%{}+KzjOcJ z`7ThSMvebB49#!sL-x?|Y9G)aolA?2#-7(;w|u}v{Rlm7p?Obj4n>?@l?Cs6JwN>6 z^};h*#Jb)>^65CZ{{tSEP<_YdW6CRS@uwXPWOq<#bxe9|mm$@$3T9VaFP#L_lQO8X z9-pI!F?(rRv}O&w(QdyyrZFBU5tS%v^O-Cd>dEHZg4K9Y6a>zEI2BtpPN3 zES$XAfAi9X&u@vH+bs5b3o}MYmK`=VDp8bKhUgNZ(11GQ98$3yJl<8=KsB&x7S*?H z$b2le14owWT(>WDN0sMHLNh|>5e1jpNb%+@@Gu`Y zO1rq*d;rzR{C8yW%`d>rOyJhnw}A3>r=02`Sxj@0Ku{tky?~TRF)#+93s{jPB-Ozs z2QJMf6M*?SXd({7io(!Ku5LEC)yUi{)N$}Dkm`XdE-wmmZR_T08p_X6=uR*& z4n5k2WI9t>=ei2zvJXv;KnS}cgbX0lIu_KxM3ZX zzPq^O%rJ;FAuKW|A4D9XA_Vy}u;maeb`8M{z`f-V4X?B5+!z8OQ+da!YTi{dhr+_I z&weA!xdS8Uy+((i(psk(I z_v-2!xDTrTxsL1~3I^WpGr0FjEWNlStPFF?94x*PEY(X^qz%r*I0jEoQ+{S1LzqX| zmtP{*dE|bCs?PQ-@O4s(5UHJ~&i{N%A7*jA=9;Q~LshKDXwL19j#2@Of-`+&= zy`S+Yh3*nv`NhUn3;N#=>tF7@^7ld%3RYQ|%nH4kI|K6c`Z?8}v(PMuhtDjzcy@aA u;X_x&jGNeji@SGLZq%qzqecxpH2wvHo$yW?&e-Mv0000 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship12.png b/assets/sprites/knobuss/ship12.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5b1afbfa6fcfee9cb6f444b4fdb553abf7613f GIT binary patch literal 1129 zcmV-v1eW`WP)ie-Q*GT_UQmj?LaAPvwy?A2pg&RDGd^(o z%SP5?mOS?iE%&eCj}P}PDv;g@Fu!t`*`dfh|S!(T^7(%X@AVYj_6-0rQ|9eH)}mCi*4G9Ehh zn!-G+>LrAK8G@N1vo^HE5u-WRweUJ5)wvY;@_IsN?Yzc6hwJy_*b#1r%Um%*VJelc z%dRP8u16(SBdipHaA)+(woexoNaL(KJm5sXKTs5#FjSGKHiHOmV$}vnJ0sMRk5Y=Z zAWS(gi0U}A-(Xkz@vTP)WFJZ{#jvwPB28MIp=zx9t$JbS+S@i_p+L!K_|2!EO&3<= z&Z0yLBhd-&YQp43WK!Y>T^N>wZO;#3Is{e^rk$hiZ2+$aBe6WzY7gzDJr~+@!9Y_3 z`%YIX-r1F1dGygCEQFl{Bh5spt=YFWp6?(& zKv=CvZz-ls;kd1Xj^l0~`?h!DUmux98yJK~O=b!GF%$}JJzG*)ymUK;bmO7ly;KHF z4}|WgiZxoRJ?<1nW6=OpBLfG8RBs8{-ifG!3bAbuDIL&95{7Y|Fp1}E+ocwGV5W!+ zhjL-!hMJr_*vMXY>`=_*mx{t}`zV>|#54?)urZ~B!eF*sWF|iz5B;v^;x%1k7-)^w zY7ZKqp$=)HQu(NC?|j?#ax0^X5&t*-^m(jeKb|!mcgLU1;#argWcu(cX>2cpw5_XJ zOM^7lA39k*IufH(y$|rEuFmAF&rV~2u9mA`fh}U$@e64vvYiW>%JERGP zID-}(I1{_npl z?YKC&vOVESB-4aJL}=!yR_pZjUY&UC@zk-8U*5J`H}Y-=nx|)PA9BrZC)xI@A?9r& vrKpxCKO?xbpP@Y$Z&fyF(xgd~{}q1%ihs1-1jLO500000NkvXXu0mjfV1Xl; literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship13.png b/assets/sprites/knobuss/ship13.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4088f65dbf52428c5d54c2470588a67a91bfaf GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship15.png b/assets/sprites/knobuss/ship15.png new file mode 100644 index 0000000000000000000000000000000000000000..45b950401b50b39a146094ecc4602e56a23c88bb GIT binary patch literal 1205 zcmV;m1WNmfP)Tp~gdmV4?{zMnm*YjqyU!Xu<_Igm|IE zh!_*l3*)VX7&Rn{7b+Dg0TMjW6bdeM>9)H&J3Gg3UbFZYK)1n|{*t-;p84hdp84hj z=9%Ze#Hz!WvFOdWXA>dXp)sn@j1w+MK$y9Gm zg(?47{Yj@X`oZrL<4f5qBa{}1FH4fwp9|dLYnsX50(k0Xlj&A;^ns(RtaSd1AdJ^K zjTwR;vq%udeg#VX8<~{9D5R#L>4m6r@q2AqT3kob{8XUOg{K}0F&&7nOa-P19S~te95j%mQ%4;8`ib@lF%yV*%i}#OPEQ_t zrQ)wQw1nhjwwIUzAyhC+1c8SrOu;L|#*arA%?QqaS9X0mDBIuQrCj^FSm3(hzuc*p)FzzY4`W1JnQM#tWD^ z-Mw;{(XLW6jQdT!3f-wdx0WGakeK=V9Gu`!gmFI%MMV?_kgyQDWsrLY8JvU+D`fR7 zL=;F?%$VCYAyN_<-}BJDxRZu=EXBIbYam%bL^WuJKpaPiLLVR%5J|9-hocX})}H2O z*bUW4kRqtm_rUP(wg?3y8z>Ayl%^N+ZzlpcHG`81K`}BQj^Md2n)Vc8zXZe$Q0gv3 z<~=}a1=XC@JX22Dfh|ut?YPG@5Mhz@ukXB%* zIViftLI}i7k7Ji1gaWqi)sQT_f!u>z(cZs(x3%;Aj}QIvN3I={)Z1ocoyq3u8i^)>d8gx4Fs5&G~*g=l^~8 z0`tr>&ph+Y9^dBk>z;k>r49gedxh^jXU@zvX#e_?);2$}Y?*j6bLmKCsJQjI8C&_A zPjo?-{=%KGEEo2~HHI1je3#5n1kf8G zIE;?QT{o9Mu=L`@&Gcu7_SX&~z4NEL)lsUlseOB+LPpLEXlQM<_~9+9Vbql1h;cX~ z3Qwre%{Wv&N)TCsUx5$|*DgZj2iS7-1!LC+9#37be5y4q>ZUaZ57YhMoSw1J3$HKk zOti(@84?~CW$OYa%4b2E3NNq1W6eRw~eS4ZKxKoOfE!kZC>1yu_` zQ8kcJ4;Bi*4&awT3V~UG++k*KEC*}i0PJKB#`=!}SCZ2cBAOg5-qNn;4`%Fj+eEM) zRQog)3Q5R70tl`|%=AI31|d91rv!)sP#%I#!*IsamLzC0ilcW0>^-OO{TaOZh<*#xp1tGAQPUz={FQ ztb=EbgDD2Vwai)^zORyI)<6$5B0F$w$KTbeuI>9;t!zHK&$Y&jicwEcG$Jnp-x`5* z3zKsPo&XBDF*tS^P<%)knruo^HOdAXq9Qx=V^#5}>ZM6!Hkq;lx~r-R6i8+@LLdU% z5oq=qNbZ7fBmgA>Vq3D`yhE}3M`h^V>4u&gI?2d0$LoNC*cd90ToOdN@4{os)Q+$FsyEb zyq;imVS63sT1b|=_gObj^ftz?0-j60^a0_)G&2-!X$G0>D@qVjYtW0SOW8RWD)c_* ztXb06)4BSLj7O7`a}#h=LK9g>Rsby!p<->(S;jU;J-p&`~3%4 z+skNsGXn(fo6Wteo)NU5mN!ajS%8|T3o((H$btns6J((qV%$ig zF)=`l5KSb-hA5z^f)E4|D$)ng)=JCtHPd!UsQT*%yTiitgFW*olDPECztwcIxdZQ{$W z^Fv#97cabg^4+5~+BR-7rQjC&4VB%DsTy2FsT3i6Hzib8^kC zxe95O7VbE3V&xB=gKzc^q*mF6gY|2t*ct7i;eil&$7A1Up@P1S;pR!#6K@MCl0f?o z;JiN;NX7u=K(S3hd71@=sqNvBwuY9+_9YiD8|(ZmehJuJn0Kg0`}(th zHUZMXexAMJ7@SfLQVM_w4294wp_IFc(47D)4;-%zTiNf>{aIDIg4e@bm>3Cc`tI29XaI(OExs zLx74PV{r(T@8s?+&(H74;%O3O-B$0rxiZP9%}y4I3_#_9 z@=XZ43Bq0m&-LMy#t|wB%}7J}1}`?wlIIYVKdqD1u)i?W`5Is~Vaetta5HttAMc#k zh5~2YcEY6XI%5Fq5Jnp0I5534@W?}PDgx5t0DK@65S(QzrITNB*e#5cCTYsFvKMcs z*crt5=Y#*%tCCP__UJA&Mh`0!H-V66L#!wY$m7eT1eKAWynP!b3| z4Q8Ykn!QY9dQX2)$?%m31?yjUwfM+GIT1HA0CccB1r)C`83axEY?Y27T08)e@7klT zzP`c;{&+B6v< zhA^YuxB8Et{bz>x$W$y8*bhin29W!)2ig8Nme%~-7ig{T$b|U}DAGLg>+y<@^c{g# z9lV0(J<~`(`xek(-_2eXO~(Gj5X!@!VC?8ew=ZawDpmf!{0(E^FvJ++fCT^m002ov JPDHLkV1kU_TlfF~ literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship4.png b/assets/sprites/knobuss/ship4.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8b14ec6b34e0e91d044a66e760316b5c9ab2e8 GIT binary patch literal 1096 zcmV-O1h@N%P)s(ou^Z<_kYKob&yD zf4}=X=Xarn7FuYbg}*@XpxAhHGtQ=i>1^-oQZ#I0tqH1&pAud@&g9{V|EeJC?a#)J zpZ~71XX4trzI58gii%i{B%~YP3)wt0v+(S5ou@x|b>tur{i_A7czpl1l`F#wzeTU0 z>RHwlrrG+m;^%K~Pz(mBT3c{rg;mxm=I5R5cP^d0*o?nyhTQ%9r2*Bw_tfS25hC4* zSRP~hPM37HgL-7q9$i6}#)#>}a17UIn#o}|L$&g)Cy8jpP5sxic3blg6(o zRH=q#<%tN)t(RKt2Ht=49UA;Hr*(9|cNfvRj@A)w`zUj_`&qgLUNwa$263~a z$(i9axX}TledHaIo!Nb%s;^USkvOap_<1sgEqLj*6uoNVl+I^q>&W4|%fw+B<;K{l zu60Hm!-tRVQE&LXOE~(9aPq5l96)`ERL20>TrWZh;;1o5(z4K6Q(ay})n>uYBV-yK zF5S|hc#NsN<$Hek{nXPlF#J|F*SA_m3lLQxc2UYB3YG)8MY z?kCqh3+jL2T3?K{FQNl0(~mGs)fyrfx3Yv=ULX#=B+R;2DgDuQ!xV|eXpM*QdiXaq z_1dV)?H_Vg9)U(Uy^VieR3Y+x{J<2~olt$Zgx03u2&{H+dQqy5R!fL*W+=UUauhiE zP#t<|*UK+$-82qi86hNQ-i3~lwI3j^lF4nLz0e4=HhZ!?^Us7Kwn`J;xbwl6OGXt594J# zANb0ua`41AXK&=n;u)ka69*+kcn3S2AgUK}>`8)X2xYDab5kK5&MaXy#0oA@PYn}0 zE0C!?H;daSogL2wa_|H&-1OMXC&u2;SRdsLYSe&%O*`8carO?*p# zn%af?>j2*LyR@y}sZ;$&fF=v7O?*V{`c>|p`RdQTc+HMunY=uzOKn3s?VyFYhTt&M z?~Ese;T?yZ?o{JkHO@60WB!X7z{GjoGx{POgPZ;?ZwoE7&_WCUcl-{Gzwk>D(V3qB O000032tg7enkdomqA&8`1M$I-;DZl_ z7-J$2@?uPk5;aDm2|^_hMFAyzwm`eIP+HpEZFjf(ad+>XJ7X4OjLHKo6<+q2OeT}e zob#XmnaKg_)TvXa&OadB1^aqVF24BN#PWR~^oxQU-GqxiU2^7@ zr~0lhKrUxj7*{q_8H!AJCss}=_M{IbR-c=#48Eh{25-T=2(sHiq+nAHv6!bbIfo>h zfl_X$TP07wj^f+LCKI1cPEMx)XS)Ka-temh_~H?*@~5yc(WRe%sfbli4pJOvwarR! zLh&WbHa5SuVk`5>=xU!vhzP&K!W? zaqudKlD#D6wBl-#kiK$i-gK7Ch^;)h*{|lmu|l&~Fqwj^3~9h4A_JUpnDJ#Oh%G3& z9dPp+*$D}4HbYVq(%EK=8{3~o=b_lNIJ9Ep)(w}3f8Cw;H?%V4gN%rVJ4zq|xO3|< z3l5m^C*W2(;HeuBW(d-0f?vsKD-tH*#B(#kq{r`0(5{B{uN2xF7tGshL@&?z=}b2y zqM9*>h?&qD&`QCV5~gJ%6jBIgrHi6hCd#w$s$f1oMr~*U9SO}$<=B9vG(qTGEC36jwl|Vzh z83qqf$_~OU4gtIo1Rqc?hzZTr7z{gMC_amOQ*x;9%@+_^vmRDr6q&CxK;>F^{<=?0 z)7xgoZOGC%d0Ag;V3C1WANAyjj5iaB+RD347D6^^w7)d()Ko1IQmXheTf)94kuF4()EFA zuhw23fI!4bp<`K|E#JJY1VCb1dl`VSfv(y=#uC6Bsg=|J;=52h@@f!REmBsMK$T4I zwDy#gEb@?%_ZCsE2yi{%{ZHNgPr89y3C0J`onY~X3uGYh3Yz&|9uB+CguL*xD)$%t zs=$#hjjm&JAIBXsDTi*y^&byDTbr9&pOF-9={J~n$dteAP8Vl92r@pFu~mzSc^vmj z&|hTwkNhjv;XEkwA)wxc)4B%tTF`&F;UazGBk*QZ8_~75*-)oW9o!H8004U$J0PT; Qd;kCd07*qoM6N<$f>Fmv<^TWy literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship6.png b/assets/sprites/knobuss/ship6.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebb3230bbbcf49fccd3924c189508941c675781 GIT binary patch literal 1263 zcmV45^ z-}jvvV39=@S!9u03DfTj+WqQ_t3S!*Hr{OFAAxfwdC$4HR&8$+%sWccy=$6dhwE$G zI&1s;_0NWf#3(N8*}LFEjZbrO`0V=+k)7I|Os!~VSz4tK75Rw~#FGM2R0FUOdf5^S zVR>gZ&iTOq`ND&{cBQ)xA6psSbmAETKkUwoHu^rptVkg!j)2L4Rn^3Xf02j_ToFx? zWk=MNYq}tV;GNw%Cn^13chU#9Y}=V_sj5pqw|aX+`}uKMr&AG79+W?WQaHnq4y>v> zC_+;tvWKv4%Tl_x^D$hxI4rumDseq%N4Wm;G1;>{J#Qge^-&MB#H1!lomWRk1K+=F zxSoM9cbS!4L4p}j4xkF8nRPI%1On*+vI>2_^g*la!SslYFn^uNY9k@ctW55I0NK~O z<}OtK@+<5NIEbV>LoLof^=&k0$O0=3&=oNZNLd8252i}!b}dZ9K&Vy1(b^CchVgUP zap++Rs$wmeL)14V+BQGg+VSCQn1|5l+XsQ=pQ2{vL$H=_h92EPRGVb8frtd4ia=RL zi-NQ`G);r1>tNr7jBdqLF+j9<0tg2|Za_$Ff^hnv1)2Mq`5gj65b zz8_XPt*BPOT0(|%27%TLvRhzSNko%rlx1b$!|?<(?*b^ef{Mg)6nHh8&M~B{@1DQZ zedvR^SLiQ3%W5x2LzSpUWD><`11dWV5vfCHu0^?E9A?2`9HiSYtqSNy2##$)7__4l zN)C&I6sdj`nV@3~IE0%OQWTH3X{Augz|*2OxLA~M&HD(EMntPyAY=}{a~(pDL6}hp zO&};0;TFdsL!az;6HMWp52}`ab3-=eD$KSya{AayN)o($h{D7KDUpEEmN1Jr0yhKQ zss@V)3b|iV$d4nR&0r=w0O@5JEZMYbAV{9dXQ*^bgvwm&Ij#$?2sI%xhGCErF)q)h zS8|ZgP9g})p8+2#aKPR;NM-<`lQ3(@cc%)OT;?dc8(rKgp)#4F6NYXtI}j05PcSv? zBk4*Nl-n~2RqTi1o&=mhF#CXrK|nIeDY*GdzRV0<#X|pFD_6YmHN)6!+71l2AAw$r zJnsaVHGonuEE^Fs0+!Buh3;+p=8`?zQ2!&bSX*_K{iCfo1|uplGwmYhwlbnR5i}?n zau7(0R3ugKI00cc3?eH<&^WwajPbjO?D;{PYo zf~GenvEeiu8xFrU-;{Z`?C*Gk2*!?(+s9IhZp@Q8U;9}pyN-Jw`FQpR7g+=g Z#&3n_9f)@V7`Olc002ovPDHLkV1f*dKRo~d literal 0 HcmV?d00001 diff --git a/assets/sprites/knobuss/ship7.png b/assets/sprites/knobuss/ship7.png new file mode 100644 index 0000000000000000000000000000000000000000..92c903e152bfd1031e67b8a2c5943549ea776d65 GIT binary patch literal 1280 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/minecraft/ground.png b/assets/sprites/minecraft/ground.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6b8d70e267ac7c112126225ec57e2d02270a0d GIT binary patch literal 2268 zcmb_eX*iS%8-5)p#3-jk2qA<_W-Nn3$Ts#dBT}4XYf8=`C;L>x!IUlgUKnX|Mq;v# zCA2WezBQA}&S6BBEafwAeYpDd{rLXO^WzChP99!|fa# z;&rR&N%fEQ!%@gpCOtkTJw2VO)3Y(UNShlf8y}_79zbMdWnt`Id?KS#aGOdT2he}! z!~uXyd4*Yax@C$M} z1Pie_Xj;fJ-4dRnvz+ITf&~~_tM)kB&wgD{=nFwK8~wnrPLVsg%~PL6`09M^Vutl; z(jV*cIgWH^E1}#euXUaM?b+HA_^@nT1FI=5`mLGnpTN1Jhd6;yp^a}1eNn%{&)%BI zfbq$ z9hu_lxJBU3qIo&9O5Ko|JJZOtk;Y6%0&8L8l7VrUV5ixQ(UiN0h$sbuL<{22+Gs@6LzKc@FK*c9*p8^X?yg-tNR;0kY z`xEb$gzNWgFRfrS_H3TX+taT-)E0$Ws!>B{>hLTZp2X!p+FmRqk{w7>7gc~8ChJ!t zJ952Cs*J`r2P3U0Wf^jLpriJ*X8$01z1wtxkvu5kwCPP=i=z<}LDkTkyDUEk{2Dym zR_rfysrFW}SD${OAt{2Ez0`?p`iKBqm!oEOtDiq}P7C_-V#Q35uViTkmW*8ch`tuO zXF@a6J_EJrjJW!W-0Re*2I8O6sc!qEeW*l~Z?!l}VVEA{+z-d7bi6ehBm8C9d(#<% zsGm}(9C+4g+=C8ug>AVcVqbx}EV}*I)sHH8Qu%8~X8yI@=d_fj;d_B17qzD`D2;-~ zDlbppZ4m+a{0igz>4@oCW)FI9Iq5rV+Fl+xN9m}c=kG5>emTIT2C9`%q|zfVa$C@FWBKbTV&y|5jen{Gw+y6-M| zJw=PogPHgs7O``NDvQ5WK!&7Og)*V zqVn~1n|eX2n*|-?i3HQ@M`Kn#P9WQY8(uBb{|+NugFd{b>AYSPsEP@sN`IGFc`uKX zhGpGqr1Kqw^| zbTU8PE+5)sL%Ew_5)T4|p>{LhtOe%^z5b5BU?#daLfSK|@c$HT9uwYA25luNF1B|- zCyuwX0vAlw!|oUwc5bCcPRQ)mOIkdkI%m*?$Fwx7@ls&=wCX+9aT+&)auz zW1Sv!+!#|%@+ZE$eTVa>yjA&A)7IqyG~6#S$7tN`c1-gcK=Xiq!R3;(CtlilFO1zaIr`nSjGSHP=f}^#zb-k;a=(H4 z8P4L&w?13LW<@6Y%@BSTl>5x@IJ554>$|lkADRP{URr(ug zU&N{Zd}Bth!g=AfVYU z?`>xWr}8f|abEiP^P~R{?oBRKKEs>+KOr}E_1e{U-!3pvuR5O)cV*@ZJw4-)>S;aK zoZnk(03E0)wc+dMLw_Y}-)~=GFx_kahEn;``tY^eqeEtRuT{Ts|7M=gjLX-!Gv0DP Yk_q2+uu$|CFo+mDUHx3vIVCg!06XoLa{vGU literal 0 HcmV?d00001 diff --git a/assets/sprites/minecraft/sun.png b/assets/sprites/minecraft/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..27ee31facd9a35337c67c7d8a1138b1e386e688b GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<5jnFba6OIEGZrd3(#S>#%`9>%)3E zwsK3S8%pLU6t~@P&fDL9f;ULV(#gtE;r8kdflnJAM#gK;7Cga!GMWA4yZg_dul{)W zx~kD@?&3pp48)_;wW9OWS}ha(W^}JL-d;DSO)aEu{p_@$8N$z6cD^`!C*zpgR->vF zMw$DYfa*0BOj({npNZ|}_4 zS5KwPlr&L4!wIrW{oB3Ck(19aTKv9!=`Hqj|6{#3e*aEbIqzeb+H0QNyOUr3EmH)k zyfZ0QVfXu!_re2!Zdg=$@Q>U7XDvV@tMX_3U$s{f{$1N#g?NL38BAM>eF3`)gkcsk!Zd>< zL7G3h1;U*Nas>>4prk5Tlp+IcnqanL7yvT_msem33#J*X k0U+Qn>x0!0WQ{NY02RP;0_OW8m;e9(07*qoM6N<$f?$MkvH$=8 literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/fruit1.png b/assets/sprites/snake/fruit1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1baabf048900b8256db6f1e68f6b2778847303 GIT binary patch literal 286 zcmV+(0pb3MP)k!YrUX|NRgf?+GNK}^^*gV>U_ z8DPyYaj+Pa4H93g@A@A#3@q~?3Trc<)=Wat409E-Az&{&!(uxO;NyeXAg?fCwH*r3 z!vxtd7+``q7p$;(28wOC3_>yB_$wZG7+|vjn?__lBZz>71G=Aa0hj?&yN@%1y#R6r zOfx>)Ky2hR0uKXFqQGYex>WVn7Ad=^&dx znm_<%D@YT}C7KM(U_LAiSdd+S?sOPi6KcryckEy`Rxg+$IThxDMeo?*av%V+edFUT z@YrKP_djy9!8AZ@X2u$bEXXdHbVCg8XOIT4%}9X<0?4+501C%n)(0H7aY8>)LLHk% htOlSPgij;Y002+|lYAatuc`n5002ovPDHLkV1m_4he!Yb literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/fruit2.png b/assets/sprites/snake/fruit2.png new file mode 100644 index 0000000000000000000000000000000000000000..1174e28468ff75b7e2cc516adef55c87d087ad08 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``#oJ8Ln`JZCoB*!I3#gx>%ae| zU+fO3K5LU}IsK5?$Kcq-XT3eef3YrGS|)$|m6BUY zizJo&VWeeJxf6?<-&c<*w^X=M(Lp3`O^c!h^)JAX4T z<4N1%t$+HjG88ciU(|A3r*N#{dG!sA@`J@PZ3)8ZO@>YS@6v4kb+Io`l90C*lep;X w;>Ui1A;sc^P)XsMmE0*DyClrcHZwCYWS4ra+q^?28|W1VPgg&ebxsLQ0I|bh9{>OV literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/fruit3.png b/assets/sprites/snake/fruit3.png new file mode 100644 index 0000000000000000000000000000000000000000..bf12102c82662bbc46187c95ad2e5bd60c2f5a42 GIT binary patch literal 304 zcmV-00nh%4P);wQpD)$^zdF$1Kgci;8zhF!8;s}zFwKe%Vhr~WykY>+yXU-TP*M5KVAy??kzg2{ zN7D?VT~h=Z?%ZJo%MnaSAb_kHMyseWfDIuk8WqtrgJ^7;aT;(RO*1SEh%x|V6E@8t z@k`H{F$};O3!vzOX+qZAeBvzec>!byvW?g@gTw(AOxS(< z5-aZ6G(Y^IEw^FD(i`Fy(su>iVrFe*oS?Y;exYHB&Ak&IyB%u!j+ZUsvFLMF4Af&_ z6*$rVqV2$s7ysB9dmc_;K+u|W0?$R1XAqG&MFi#7`eLhh}3K@1GZ-Sc5^mSu?uEpI;xt4S<1<$M>Na z!i39jAk8ou#s&d?OD7aBGJ%L2&315sAD3>U7=-QubVHcXC6T>>&m~yB@Z-{LxC;om z1m+4Rn81s3f5~zQ6NZ~ebO{rP(5O9xHIWc<35E+^pm_tAOF(RpOF-(GV1h7Lpc{hj z5|CyP8|DHGrz58c2_t3_U*MaRwePgU|yU0E{+=Zl}ee Q`2YX_07*qoM6N<$g37yS6951J literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/fruit7.png b/assets/sprites/snake/fruit7.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f2b14721656b86d4951127e0901be2d58586f2 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`H$7b(Ln`JZCoB;4h|B$df7iAD z_D1rvt<*{wQ+#hQ?6Og|bCs%+m&l6|YPhUWu%%MDOHQohZ1&gK|He7LjwNV*YgL@$ z$g^%|#%1#k#*9~z7fqW@nhtynx8YfSztHeW<{qZa6OT6Qze_tJ$@XXWwZoxuc>KSoq><#Aw^Jiaw#E_~f2c~aa62LHs5nVG(BTO?g z02zSp8YW^igIoa93<5lAe;D+`ga5+~u!d@eX+qbG%-7KSfZ{49T+YR&83sUJfE!?q z=Jeu~pHTdZ%m&$hW{n8g3oyWfVLVg=Nb&6JAK+{dK-Ua6U^X<0@BxrKx@NE!7_b1C zjWFAhqYon*zuaO$u^m|hj15u)!q{BE2qHjn3X(+D333WV9giUi2~1ST`u{f-LIeyl0BHi*3ep4vFwH0ifavgu pJ19=Xr3o3p1!0CD16-Pr0RR(*j1G78@W227002ovPDHLkV1g3OfUy7o literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/skull.png b/assets/sprites/snake/skull.png new file mode 100644 index 0000000000000000000000000000000000000000..7f95088b37531e3099749d11affe442eb974d597 GIT binary patch literal 1064 zcmV+@1lRkCP)jYLbpg+kmJB2sLNbzxAbBH}^`sJnJis0%kGPjDmZTUgz= zsXGn0DHbX<1gx0&gNi>v{EJBJQ!ggg4P_La?i=k`DW&unR@{~2v3XW zc@PAF&ffw60zei30Sl$8luOkxBE?JXQ#Kix*DxkD~Cwx z4?=r#Ix#WvcO(+|2LL1h_&(=|GmrttabK2|mHC`bXRpa*0*}W7U0q#JTU*QAzY^v= z7K?q6NF*LD7EAW@^wgKhWNrXpA4W$<4T2!Nt*NQOm6es}qoX5P6h#FQQI_RTE<}8f zi06p7=5#v4f*`zWYHBhNapd(Uhr^*992`i=WD+x(463S%pDCASv-wW|_=Wg10Kku4 zulFmD$HNR@**4ETeDD(qU3=R%rEEdDV!$TBB5hY2|Q&SX{ zJrml$OqCaZ%T8Z*N0gT^(yPEqVq>#W*`VgT}^2*0^-0 z=B0f>K>>Tl<8e?Fg+)ifsHzH^o15VEdg1EoN-rb>q|4+%mSue!G=3;m0?_u9Dn(6z zv=l{QOXrz>9v&XppZ)#);BYu}W53_eq9!1x(+NJGkMXAID=I43o&5ZKcGe5k)6=7@ zuCB83cXxMVUS1yBY&J|J68QZ5jL~S6Rq^EH1n1`Fu%x7f+4T1IQctPWLcw5=!u(h7 z!`ux_y}rIy3F!R%9BFET!625FmZIHm$LZ;527GaGftQz;m`bIz7FDOFru07i zd2es;oAL4SCbQWLLqkJQUtbRz6?b=ckW41o`RVD2b%WJvrTqAGI=weCGUDQS-g10= z{1*WHPJnO2;qd!#IP9W3E|=?##bU`TFE3}j*zI+9>$U@&+G z05t&c8vy*uDjf&}jD3B5W<)d?jmA)0Tbq(hCfO^6gi<3eUx@7Y`xTSPG(&d+fq<1T zw61wQT7NV*H{<^PzDxyLSXf{P@pzo^IXpZ}N2$HNoj7}!d&BE9`4W+*R5*@X5k;|N zd3m{x!0zwwxx&Ii*xA{E`T2REVzjol@~Kpc#_3R&Wo_*KSC~5h_>L+j2*O9-6prI$ ip69i1%Ga;%F!>L@zpHd33P|(-0000_xJ+< literal 0 HcmV?d00001 diff --git a/assets/sprites/snake/snake-logo.png b/assets/sprites/snake/snake-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a32fd587c1c542440579190f766710d9941aa47d GIT binary patch literal 54314 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�yr8^_emo$s*nfWKBghcDyI>EF}EvJc3dqcky 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 MAcptfXgS3F7mR}^QUCw| literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/enemy1.png b/assets/sprites/space-wars/enemy1.png new file mode 100644 index 0000000000000000000000000000000000000000..301710c80ba995392c69f2c3ef5994389054a8c8 GIT binary patch literal 2011 zcmV<12PF83P)oZ~~-iDn+C(sFas9eQ1%X zR4I^(rb#QcC`eQh1ZacPrfG;ng^ekWi>pAe4MCJ$@7=duFMFHoss4lAnt+l%^e@fJ z{J-z}&CHo|Vff#Qp?$9cU(}27?Av_pqff!-vz<;h%k2y2Kg1m0caU9>!^sWv*5e&JlFdo{X8JX%3Q&mLrcW;QMLe>!tm-$5f)0@Sv#lh4|A9Gy_g>;i~h{x8;=7}Pk*o90+0Y$zKV*6HO^N&w`GgHY2!vt&8{ zkr9*%dBjp+0s>-BX>8Y0J023CIe<(U@%;re&B0nwyuR(ygvtkQrUeneZGnv27OIo(-1v zwzjedG)+17kG>;&JgmJlFN_<)<|899<;jg3(7Is*(vy=o`1%`I7`zWZe)(m`m@gLL z^{DvX^V@iJO%3lpdlny^ISW(R*4Kovx0JE=VnJa0>NPJ6s;bd(d)zI03jR_{3r}=+ zyY~0>9og;S?MqFe->j-srV5($t<7y%v-T0VTrS8GcLpyM523c9*11BlkaLfEq#-SN z$V(ZNMVXXM3}O*e-rL&BJG#3?eRb{I5Ba=XKaYg_0Z^;UKwvS(_?zeyj^QHZg_&1H2olxU1oV1Hh=wbJo9uLiiHAPvIK8+HRN~# z)z`1%*%x(`*M05`Sbm)0#9cAK`CqpQ~wElfK5S zZvFU!(|_I9)3b?jNxHm#-J=f%gA0v|mj{*m?_YvtOPjE2RSOtnuuKC%zaJS>!>jE( z@!ZB?JpU6J;~&^iC7^blgk!H5I5O0PA00b{Dn&&&7K0=y5D>U{aR67Y4&&Oj>sYn? z0V5m^Dd&36f5sWugB2A%b0R&ZH2UY`kyR~dS-BDt=MFUB_hU4jLC5Z0$VZ3Kw1VUE zNfZCNU_(pU5ETXjD>;hcVMjw+@>rJPWVEbY;bb=Y=Ytr;A|?&AZJMUcIfLr|JpB5D(R3Rqr6hUUkNlU2E-E#tbxNlS3rV{lBPRa@{pG@WJPf@ zRksJkAQmy5Ka6t@)3P8*5|{vl5SUY2i+C(1ez<3k-rx`5z=8dU!vyM8R4ihUgAAS; zMyoUAxvJA64Qa_kUdo^>%A{;!5X)gwqf{!Prqbuk(~0yXYOAW?^_Ju3uO48bP{@@` z#L(a04-c&Xngykr!R-gs>f6hL;Fi-P4Qa_kUdo^>%A{;!5Q~_cF@Zv%fSQ^bH2Uk& z+4&xBhQrRB428pKS(bNYrlx2)wA{`jEWpYHlqv?9_96OiOgP&SX-G>R@=^w6Q6^;* zgIL7mv`R{nWNW&P=4H#E8zz#elmliE1=BR&nHn2K|Bahc9xBvPOIRA9G~C`rgaIf? zOHhwAq$Lk|DTA^old_3HEMjs?lA0sY1ka??&Kl||D|5zyK8LXFO4{lt;<3$_hOZ_S zxQpX4!8``DT{0jufa$O^alxoZ8q$)7yfn`xS#mO|h(Ro3%Fy-XXexdw5l=J~a(TrT zf;scoG6_x(V`K`2zlcJiA-+DO-^o+P(jN{f}M+4|HzH~Z+TrN*z4#nlthlU1KVi8jo zLP&16J9jIW`~4?$)DXZTtA(l`G$E2n34Dnwy*j<%=~0=q&=u zfRR1%pCg0;v;fM$Ea*&8hR5T^-|N9b5Zv)Qz5Tdl0D{Cg}O`{m7> zVUM@GLK}%hot5W{H2@d{qBo>#8hY2cioBFTS(HiH#2^+i<(VT%Hk-`|A+B&?*_S>Y zU{zHkf(P+eT{=E3r z#KZ(EzM!m002ovPDHLkV1hY6-P-^F literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/enemy2.png b/assets/sprites/space-wars/enemy2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3ec06dbb819ffaae8f50deeb8eedc812743bb7 GIT binary patch literal 1509 zcmVX1^@s6CN-WK000H7NklO=_${4Go%;jeOxSEaKvTj2RXhAXhmQ1gfiT0Qu7(tSkLCTeN7gs5w;Q_(qIaPlTMD zY-`b?#mdRr-`O-E?+WExTHOIa2f&6CwrIlGgB+%+a5t`7%XDo=tYo^wYLBXMmBFX$ z#^~b7v>>Ds34?5G^+)Stug(9IwMA9YpZ-MoV(YiUaUa}?5O;;Y8*I3T#JLA8*H?;? zLiBT6#i$${I(!&eDHBVVFQ*;hhuz;xn<$??z)=`*t#yaXogjezA$P3l#+r(Xc_=QL zfEmGZOr1If$z&4Q+1aox3vVxei|^RAQ=1cy`g z`Bf|n&cdm4=TTMt75}BScBRkjMLdy!$KydH5Ff==#)>5)_w~Vcf(Cux$%;Dr;7+mcqGtxpIN|1qG7R-J68r zF*J{1*r(5&K}SaigzMt3_AcCLyCEzyMSqH+xvpCkjYfACPk9!O>o{FqovHwn0X^N_ zxNVvUH#cL}?AdVLf#WdEK5X2yNgmJk?c1cy%^cO`=CF+U^~e#urKLsI4ugQ>x(>H( zH5!eAG&RoouCA_|Vau|r0Wo^g#6s@#s+yvxxZT$$S6fqa5QT+>ID7WA6yLDnGnCJq z39rWkUDvT{)yFt{>J&w{q!a9syxn)B<|TeR@y#+&hYq7pzY-D86> zRvV8eUa7xuzCIjo(vqpPtk`6-7rD8)2vvlzZ{I#761@lpgP2=Uf##+rR97Fsyif?` z!5QdHr6ea5nk!={R^~{hZOTcxNrSXVlY}iHgvJ<)m}dI*ravzIe5s*c?@pwwM50&p zr_(4eFUQ`!d$DlgLSzR5@cDdl`2BwQ3cDFl#6mwZqgtv(xe|* zoI(hdF?Q4D{GCXod7EXWtHz8O!x>{*Pfrg_(?s{JTd-^!hNi(k(ht*2!=vl4IY&op zE6lz=S;d5CH0pG9bs4c(Y$t$qj4_8aNbAl$z5{Yl7ol6fHWrIr?&;~FARcRN)jHbS zk+v*(&9;2L1zDqVpsE@+ZQd+xwh(A*YeQ>mD|I6tiA1z`JYEH07xkh{Zf9`kx~FGk zo~oiKyW;V9vp*~AL`Qo&zj*PY*51~JR`dUU2&++LcNwTW;4c4mzI{!nlon(KYH{xS`b^la#!*_`|o$!Bk%MM{_6$5KklJbd_VpH%RbR7jml``00000 LNkvXXu0mjfK`h|* literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/exp0.png b/assets/sprites/space-wars/exp0.png new file mode 100644 index 0000000000000000000000000000000000000000..26c578a18cda04e98d8ed789d853297fe330fb36 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM1!3HGvvhwHvsqLOFjv*Cuk`o%5{^zUxOIKht zn7Bw{xm!}s-~B$H?AxrIr2Z>sCLL5eDe-lVpiAT(lvn?FuGI>E&F;b(3=hHuJlGK+3^u}DY? zzIte8)b->r>&B+1K`fWFiahqsWx3d}jMMn(fj=+XjvZ$Tn8W@}y^kZ^fq90XYqx&R ntN?}+WwI#!TXD!YZ4Sn}_J;4ZMUJ5;;Rn)zOz(c>n+a literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/exp2.png b/assets/sprites/space-wars/exp2.png new file mode 100644 index 0000000000000000000000000000000000000000..33a394ee5174de1ff06157138fce6ce81b44a2ff GIT binary patch literal 502 zcmVIzV6j-Yxo?zGsdMksbO{SV2AAfs0i{1;%#&J73N=NFR~_ z6Js_Ie!XK&du#rIY%TR>!j2$ht0^6Dp5VxcENTK*g0%LZA>cegG_-eA7LkAe5@EDP z-0Kt4)dE0%Kzd;^VB9hN4$sc``}phqcztC1<@|^Zu>e8<gVgpO@;VDiU6~H%MSzAbN=prrTETgW=L1A*~hF^V|iHXoPQQ zx##J}aMPF78cBdn!tjaL|TI~U)m(=!f shm(2g!|oMT+a5zB_#vx^R1;F z;Ei+GE6^S=$>h^Dzmm{U8I5|L8vP_EA_sY#+=B`T%pdpcA;Sufa7-If4V8$jmk1$8 zH=KnUo^*NC3z3lIf<$Rj5Hl&}Q;)M9Ml$$Y)9?P<~H89X2{WgVt;1!`A^Kl2&?*Rz7=c zrkoTVWV{(Q(TbYUnHq~x-#d8)FK$S8$WXT3F{ZYoa0>up8{vWBznI8YqQM8*RGcU7-uT*_o1?OGzH zdCCu{aI@hhk?|CHjgAeKxv7+Jo=5H8dya^p^@ox4?UEkO%WAC|C%m2bqzn_ffdIW+ z6XDTd&hcbwbiD9ISyX^t3J@V8BG+a~< zU@|nqgvtB{UilBH*PyAK|0&weL^gkKN;~3Tk@*5r;$B9(O@2230000MH00003sNkl)VbxBvhE M07*qoM6N<$f}$&+k^lez literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/exp5.png b/assets/sprites/space-wars/exp5.png new file mode 100644 index 0000000000000000000000000000000000000000..00ce0b3fb753532a1c210600cbb0d21358259be2 GIT binary patch literal 336 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 WFlQr?{rAs>Ku6O+qe0y%=6?WK$`}^_ literal 0 HcmV?d00001 diff --git a/assets/sprites/space-wars/player.png b/assets/sprites/space-wars/player.png new file mode 100644 index 0000000000000000000000000000000000000000..f352e62ff7acde90ac3eb76a59d6c4ce7a6dcde3 GIT binary patch literal 2173 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%0At1}znQ~T} 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud1.png b/assets/sprites/weather/cloud1.png new file mode 100644 index 0000000000000000000000000000000000000000..efeef8f41b9a2ec1f20ccf80338bebde3aa319f4 GIT binary patch literal 2182 zcmV;12zmF3P)ml1>TX3kdQ#4RnJ&l;SS=~^OW-OgG6;yk{Nh)bPk*S)*< z6rkEOi6p@MwQHF#JahDG$oV%tPn^i*m_0sT0G1lOlmJOA!Skedzv;iHg!tLp%Qt_H zh>>c$h3Z&C+U`Ro&(b^eZl|4v1!bnncm#BfEah^WM{vhEKqZ zBK1Q?fnEDkN~!c$*|yEImI;9${**=8Z%s|1L(k05D?U35#igYNCW(~Cj_qq~XoL5{ zAK0hdoz8VTw{JJfMlt*QQptLuw%SaH)DUr746l@upg>JbmH67Kb5()*EdYF;A$x{# zc0dTC29=nm@gGE7MC5NPKl8cjJKZ(j{QCvjDfN&O77f;_0jo zJ@~=I{;_jwtIZe@`x1U#+mdvVjY*0_(SL`jMP}hg_Xz z19kvJu8c7w3Pb5QEipM+JhxPBTqII{l8mg+*_Su()nCr%?K4i(AqFNU-Z7+v%d3@U zJULl<^~Q4j99d`@A-aMMpx3Wwv)bxO+dGal(i&?uH^~*O@87CEIF%}a4O#*6#*G^m zB0KH-aldU1+$EAE!E83mmB6xydm^I7lIC*bA%ef-%OOW=rG?_Di>` z&dcPk-CTk7nDkJXQ;`x!a<-ipLXiLODg_WIwKNO^q!e#%_6*xjgY#|Tqv?<6eFf6Z=2Y;ASeY#(onc97hpQotu`)}_Z42PtvZR6 zl2g_NdkD0EluC_viv;XRdH#+2^>dU})v8U3bp~T>x10PUKt!YQz>$SQ{_KZ$R=iT&VD9c}EMH2=#3{ zpW{M^cILB3K~@`uk<40_jS7FH)|KvXlPpiIth5e927HJLZ6T--v3C`)4#LV=yw&ng zKYMWO@8k;IEI|850OCuR?a9z4MY&=a9 zYggbg((5pK{Ep2w89|cklUlp3pP(^u3`%=&~5z^OC!8N0;9yP3)h?4|7 zKZJV20jK2yA3o{G43*Ov|L?Qqa&vxuo^PJgA}q9ZG*}Lx384D^-O8GtaY3EvANz)INoCTE$AKeo5!2PM!LA6d=t|f-pT@xG&=5SH+S|V;Be_ zQbXi=jxJJs)OAO@q=+DlVEKLx?p12g@&cMIt)zZa5!z`gjTO1)dVij|Q2IxwzJX6` zEuc~Xn=Kbss`W<{(0#y4Ys};v41>d1(S~9nuU!Uv*kLkF6F6sq=lCzq9D2f90MljT zp{cR|1!4H+zKJ|XfOb~UBRC>NaSXM3Q@g>FK;};~p9l$l5JIKafFKC961U@zv|~hT zft;OVuIrsmh1Yu;@FaqJxb;yQLN9m?K;F4jKRVE z`@puc+7gJFx;2$@770k(?FQ{8yRLio=z;Q2XzPwDW$WACN<~OgMW|RR=!#GrM_aB4 zk*=t8cCT88Ac*vNuOPX|3n$7&C>8QrA^M|&l%q*-nlR3}VcWLeISzvGeLsj^J33wZ z%SPb|*iTI`@coCHUjL3}a6L5&TrYsiS_9%lwBvj~0j1p}2&KTvm{82;z|L8kBdAN$ z%&=U}0;lCV8I%7>2=(iC{?xWchWe0bj398RiY^n^$e)lr~HxS2qTOz!U!Xb0DBt$2RgQ}Nf#7#ZvX%Q07*qo IM6N<$f-y!dasU7T literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud2.png b/assets/sprites/weather/cloud2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d19252eb93f05f2efa533bad5930b1fc03df065 GIT binary patch literal 2241 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 P00000NkvXXu0mjfM3h6x literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud3.png b/assets/sprites/weather/cloud3.png new file mode 100644 index 0000000000000000000000000000000000000000..efeef8f41b9a2ec1f20ccf80338bebde3aa319f4 GIT binary patch literal 2182 zcmV;12zmF3P)ml1>TX3kdQ#4RnJ&l;SS=~^OW-OgG6;yk{Nh)bPk*S)*< z6rkEOi6p@MwQHF#JahDG$oV%tPn^i*m_0sT0G1lOlmJOA!Skedzv;iHg!tLp%Qt_H zh>>c$h3Z&C+U`Ro&(b^eZl|4v1!bnncm#BfEah^WM{vhEKqZ zBK1Q?fnEDkN~!c$*|yEImI;9${**=8Z%s|1L(k05D?U35#igYNCW(~Cj_qq~XoL5{ zAK0hdoz8VTw{JJfMlt*QQptLuw%SaH)DUr746l@upg>JbmH67Kb5()*EdYF;A$x{# zc0dTC29=nm@gGE7MC5NPKl8cjJKZ(j{QCvjDfN&O77f;_0jo zJ@~=I{;_jwtIZe@`x1U#+mdvVjY*0_(SL`jMP}hg_Xz z19kvJu8c7w3Pb5QEipM+JhxPBTqII{l8mg+*_Su()nCr%?K4i(AqFNU-Z7+v%d3@U zJULl<^~Q4j99d`@A-aMMpx3Wwv)bxO+dGal(i&?uH^~*O@87CEIF%}a4O#*6#*G^m zB0KH-aldU1+$EAE!E83mmB6xydm^I7lIC*bA%ef-%OOW=rG?_Di>` z&dcPk-CTk7nDkJXQ;`x!a<-ipLXiLODg_WIwKNO^q!e#%_6*xjgY#|Tqv?<6eFf6Z=2Y;ASeY#(onc97hpQotu`)}_Z42PtvZR6 zl2g_NdkD0EluC_viv;XRdH#+2^>dU})v8U3bp~T>x10PUKt!YQz>$SQ{_KZ$R=iT&VD9c}EMH2=#3{ zpW{M^cILB3K~@`uk<40_jS7FH)|KvXlPpiIth5e927HJLZ6T--v3C`)4#LV=yw&ng zKYMWO@8k;IEI|850OCuR?a9z4MY&=a9 zYggbg((5pK{Ep2w89|cklUlp3pP(^u3`%=&~5z^OC!8N0;9yP3)h?4|7 zKZJV20jK2yA3o{G43*Ov|L?Qqa&vxuo^PJgA}q9ZG*}Lx384D^-O8GtaY3EvANz)INoCTE$AKeo5!2PM!LA6d=t|f-pT@xG&=5SH+S|V;Be_ zQbXi=jxJJs)OAO@q=+DlVEKLx?p12g@&cMIt)zZa5!z`gjTO1)dVij|Q2IxwzJX6` zEuc~Xn=Kbss`W<{(0#y4Ys};v41>d1(S~9nuU!Uv*kLkF6F6sq=lCzq9D2f90MljT zp{cR|1!4H+zKJ|XfOb~UBRC>NaSXM3Q@g>FK;};~p9l$l5JIKafFKC961U@zv|~hT zft;OVuIrsmh1Yu;@FaqJxb;yQLN9m?K;F4jKRVE z`@puc+7gJFx;2$@770k(?FQ{8yRLio=z;Q2XzPwDW$WACN<~OgMW|RR=!#GrM_aB4 zk*=t8cCT88Ac*vNuOPX|3n$7&C>8QrA^M|&l%q*-nlR3}VcWLeISzvGeLsj^J33wZ z%SPb|*iTI`@coCHUjL3}a6L5&TrYsiS_9%lwBvj~0j1p}2&KTvm{82;z|L8kBdAN$ z%&=U}0;lCV8I%7>2=(iC{?xWchWe0bj398RiY^n^$e)lr~HxS2qTOz!U!Xb0DBt$2RgQ}Nf#7#ZvX%Q07*qo IM6N<$f-y!dasU7T literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud4.png b/assets/sprites/weather/cloud4.png new file mode 100644 index 0000000000000000000000000000000000000000..71b671f5181a9301564d4adfb7bcede9f75bc495 GIT binary patch literal 2225 zcmV;i2u}BjP)HSs z0|*I)3sSVcArP2|ESFpy5F*&If^aaKwRf`~@BH+1_w?T@R6X76+41bpjA!lLXg+C1 z>esK|tEyL3uj*Tv%Aph=_l(>!&5{2p>iekzgiw z*_Q<&;1K{vJz%n;0uiI+Ik(bqJ|Tqm5f!SZ!!RT%B?>9tRw`PaF6XWxqLcJxfhj~J zIEVruA}wWn>8>@aYufh^@L3|5$!4=4b?(%eH4FgS?KU975&``=h@w|!rixd4$4Q-l`nux$@~-(!MR!hZMM!Z0$J&u7549iIq)+pz2( zo;i8=Hv0+gkI3I`W|)1);R_dVuA?nH?xPg|CCtBftNxss%f4DDW~OWF7Pp50!0)!4 zhlrTD2odGPWD!~|?{?sY-#PMxa2rAuJV&u`X_O8{cNOJg3Y02UWX zo5h;?IhDxaw zO%uzSroFCV<`0KTc)jy+>_ll$^T2^Q?z8eY-miXT>d4e3tJ#W_;>8q0dvv7~Gl7+f z5|9E2!w7uePv!&AbqP|}L23ZD-42Bii$v!L&qsSM07@jj)@Xl}5Z@xD z%Dx}4gBs0tMif%)?=YQf<4yWwv&k0~y1g7xBBGZ1kS_2R%WbifY*|)hS*@s0$b4;ja{4d-US9hoGr!vy1c#w5 zmGFO8YUfMk;u|f?X1(9lgnI?0R9GyPWEciDtK~j>`grAUtT{XF5@N{th%S;4LcF+* zgMX+HLP)FG3^h$om|1;cX{kQR?K_3qV$g|FsV;xVdqUUsXIhp`k9zgHh0wCBuvpAJ z9vSeW!Ye4jAxcst*6)&w#qie0I4l< zxXCJY*P#CKW5?Xylv(uoju%*g3STOfaz`A;2@WFj40h0t?L?J{{8ywWHX9g z{lRCReE|{yMN#Ny}~iGhOVE^X0y2{isGmNJ~TijC2s*6 zk>O?yNI?M6!%XlVW-1x4Ct+sWNDu+Ez1IAWUg1V4-SM@1kGKSZZkl^oW19S@@$(ixmHCWLOH{LhR z+{awk9r-r6vbGL>5GI09@mYV%X~VI@6QD~8QPMU_v2*oF({yxPw+Wj5ucSFvyIvol z&Ca3^AbxM=^et1!VIUBJ>jrJlk5@Ww69S|Z;I@5OUa3OEvO7d*Vx*ZShs60p4np65 zbLLR~RuTxsMDz+EW?0wY*LJJzaq=??KNSyv2+fugukNNQ2R{ppP2z)U4VG7{P-|Fh zim?#*-Gf31!9`ZoH2Jgp-a!`P%7e^8=D4Xg5p&Iw)r4dUE6KP1jnol>rRuviML2iAQW;Y>#a&zBV;I0JF?^GC3yr5Kc&M-1L-Qex&p4#%y z4+t7f8(NMV+kCu{?5r?5BF@Y@rSgq{iMLA@NZWP2jA2~P=H*MLk4|1mom}Uxz=iv+ z*mMJTHF?kN3$6JI literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud5.png b/assets/sprites/weather/cloud5.png new file mode 100644 index 0000000000000000000000000000000000000000..805b73edc9064afda84dd813e17eec12bbb7ea82 GIT binary patch literal 2242 zcmV;z2tD_SP)7)l5w3c#yQhCHa6JlkZC}Ks3kdR<~$i;g@+&Cnh00n7@WY_}-goKdHN^nNN z0fiM30))awIk2ZaAl6#3XcsxKEE~}NV)AD@wr4zlJ^lL%)tjE|IBUnAcZHh7JSMu<#@H;d;`*FP|F?0|ma{1f`Th zM0KAabErs2!xWz9vLGM`f*Wx{KO8^oUdfo2EUWHz3>MHVfS6(-wcpcY6#(&!A*z4P z-#d1wSh!j&+UM3PEl84>O@QCwW;BRMGrDQ<&|6Sy>#~M*{FLgdnN$N2>y3*?NrXO z=cJG&-}jmM9r+YC7thO!oGl@V0ir16XZoEG0xT;B(%|m^!l3mQ5&rna7k>SlOP4Oi zkLpCR*9Mu5;*A?%6h`Z>6bkvtTD6u4A^PP|nPdL39`VYe$B4+UwC(c`ZO4(0V?q!_ zulqHBdg6HLZyaMFw#{d|5RWiMJ^S8B^*bXYg}yS+Kt%4J8Ib_`UL(7gop(X2r7Ek{ zL`riqU(C<`XQA?SW}ah^p6Edj=qyW%i;W|xiT{>T9*UwU8{p%CQYtk~Q@WlDmDTb$ zP8~n|d@tr8dZfo4Qz+C|izRP3iX!zmnP&(gWRfJR*=Q;^?_IvNP@QDv*-ve&J@kf@ z=EwwqueJP`ZE;`3^K3Rrl7K(~Xv*J}%T(m&+X=BnkDi|vChDhiIqS)w6==e+PauR4 zzVD}{VeeEuu6;XO7PlOq=z#{ZL{k(KmX$NJKxSWoonx&UC}|kqynDBHBnz}~#{wWC zoSz4iH6V_X&sdi3^N|9N-30q1_DjX0I}%B_n1#w5RzJD`sO?edS5j zzMK4RU=#r%&=)gD_|S>M?d{nx+RV|h;t!VY)nY{Cz~|rrL3yq#DwVa1 zr^iQrwOM$K4{mX9FIS&5OzWRXl8Q7qqB>c(D%*J~I_z6C>VVA2bD#U3Ih+K>CG3-t*EldF;Eqe#Qm1ZE{ZS%h{uKe2Mj6!{<0lyV;s~ zK!GuDT#+WTC4NI6p!kmv&L-`I(#K-I*9Ho61-&?yEj41Y@8(E zw?e3_)gcHYFfymJi%?cB$3lK*V&YJ>li1mKGlVdg?REM#DSAUL5bBKkQyB(p(uG;o(kT2C6&8CzFm#zDv1?@lspx)$? znbJ%OL@*2iOkrtd4HlQn5XCV_A@sX`f|v6khykShefDS_Un2WROJ-~=znI3!wZf3g zqe%N@e_;&7 z_!fHsY_E@U{7CWbAP9dna@b>A>8Z@LZUF3HgaE%4=o#kP-c~ln0%8GZM;U~$yjpE* z&NkYvqfM0ZUchl3(QNwD8S@+he`FQF4H|1FaciYX8oFv?&NUHaZNhozt4YeQ(rPr`*oBuIm~Alr)>o>4~GI=O0!x#H}(yBP01| zDrFxMt~|6WLz}XanYC8mRx5_3tS4DEFC_xo zGNIr(;5s=l3_}-YY{wB&O7Q*Gs$t-(q|~)P|8f4xg$rk+?bHZyyIEo3TGIq@k(4^& zxHia6%*atD4^RO#TQO8?4G5xG3xkECXK)AnYpu#6M>Zv%aAuef6Cn_r#oLss-{w5; z=V!)?t6gK?)}aa9asXXYd}Cq38+8t!L8MPhq$h$PfH)@P8TW&LYxTMfukj2Hs`?V> zskX{-Upyg(VL=o{Ylz0*|McSAYtKD*;r>aH+1Xh!H8qv?^*|L7AA!@(abIF5XAQAO zLU{G+RdM9Vd7PSB|85rc2uz4+&(6Z~@)Vsv-=EWB0}L?000Rs#0Q}$Ke~&t{^J!c1 QNB{r;07*qoM6N<$f=G8as{jB1 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud6.png b/assets/sprites/weather/cloud6.png new file mode 100644 index 0000000000000000000000000000000000000000..71b395f96cb4c59fb1df944e06218a3a50ef14b2 GIT binary patch literal 2182 zcmV;12zmF3P)eovteMYP#3!^?G(@y8`G-_y6iu0ZcH#1QSd!!2}abFu?>9Ot5*-TBFvQpFOLE*0=q0tu>?P@OgyJ2ppm9 z17!qmR!14p8WA=9zS?d#RE*Cs#-6Zk@mLtf2&j8*+5HEgyxMS_ONc15cR3;`fd0D= z9Rsu>pij(=R(MncdsWHwdE2%dmL-6Tyd6N=(-4M1%7t|a0nT*8j){5YH(Yc_T9NYiJ>ZKKpYL{Crc)V7lfm*9N;F-y(EoXq%8fO6b z5ybSfIq#kA+oz7tH9H!#R>&A1u`hzG)vBW1_7(y3Zvf$-5Y}ET)ssp|pe~WK|B!33 zEcVx4l)SrVN9EtE&2K9iz-iErXIsD8y{r0qv)SnZfEXb0b)l3}mSwR@wFGGjAX5oR zk}N;BZ5z1YAUHs`8^(z6$0Q8jdUSW=LhdUz;wNyU#9zL?^u0>Ga>nllJ*Ct=5x=5u zB7mf6x?34eN!9z0ft-k_RHh&dB$2(BhJ^!L5`1UwX z$PR~!`J9GJ%aaGW#i_l2PlmTHW0dMX}s^;vrKI z6iO+*xX|g9E6%qXU)cWcr=Pa!^mLTuiVfS4IwjS=e!a7UaqCsD9ny`F9Nv9l1ERGs z-$^R9;$bM_?=tBRO&1$sJVR`c>+e*nZX-z&ip67*&m*EeKiBCs8kO%}zS;UQ2`USd zo5}#)|HN-9bt~l^BM7e(DZ#BbDGjH^aXo%DLi(g6P}Zx&uOKnq@?IK9u9B~ zD92$SrF<^?J#e04t(&CsB=yTTJI@yj_DQGUJd>sh66G6LIKH$Spp<6meIWa-M`D1^ ziNCRQ+$|N}20+nnbyCVe5g7vgjX6|54}2_>{_qUYeYHvm6Wt_D&@=aEQwo_5tv`(IrNnq?XO!!=Wl5*)ly1Q_i^<013^-os+5`MbxuD1 zNd4tOOJ-(X$U=qI+E$3CIOj;7{$V7ZfQ&J}>&tE1Y9~IKT{<=>Gi3RdngKa{mUxv!Wjq$1=^`2uuM(rm9#fx&^VE7~SUBS$;v4 z*{z)1R&klih>UTj5UqiU5N?6plXK0=x8}Fn0&An8l#+^RO_l3AAUw~@3LWq-Do5Y1 zb-t-$N(HH;a(9nn64WZL8IG>+$DkD2gb*wYLN7|;Vs`sBu8ZmEX>&s+(fKG8F(R|? zhl0*F7a{JYl%*MF&S`}lKc}BKx&-P1k zlAL$l(x&~t~5yl9ET%gaOTL7Bc$JV zWVS5(Hj4!T{B2<|ssL@y1o}NgryKO0(W+;hp)rY@^Gk5`MxPOBYStgX*u61AYpoo| zVeOXRPEvL%3x9VA7PH2AjZb{m^e&X#;!}Yi+;ci?q~GhomD%}$?aX#BnT6KCIR{H{ zC>0%O)GFrws4!_QVp^-0t%dp45BKe^|KV;6B4#F#EfuMv#I$~i7DBWjA})?R`pSs_ zKy#sO2wSgRZW`1!N_w!+@{C51S&RbOEI~lo*ip6?7h5L>5l>jX_r~|`s{TFb`X@?m ziMH`^qyB(Ycy6HuVU&z)*Q7Z__}pR}TAi+8Onh1W`f zbKt;=kn5U?P!I&SDnbJsb#^GgToduF4M=b`C|9VKUD#HyfW^7dklZZtGX`X;rIHJ_ z!yt}(%_L5KvZpci`<(bedl)!MO)&8NJVM;oA<;~w1L`bJdN8-x0zXQOr#DSE>Ql4X zNu`ZnD7!^)iv=*pZWzgfad*lEuj6SU`1_n&e^x%85qqc)|b~Hwqt#VMN-@bWpjt~Yx?AZ2u zn(3b(+PCZdy!mOZ`3plHn!rI1S95W`6CD5!PbaZDl%^Ed5xYSIK@gcxN9rns0HU3k zVwC?LYf5>xoLds@)0jL$*yr1k|G~Gvdf>yAr&gu`D0&Ued0ekS79!btw)CKoAEMak zSs~oOU~4+UnfzlK?k}=2rnA#$n{`@jf(a&=V1fxIfd4!E4{v;-o$<)H@Bjb+07*qo IM6N<$g5(S~G5`Po literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/cloud7.png b/assets/sprites/weather/cloud7.png new file mode 100644 index 0000000000000000000000000000000000000000..805b73edc9064afda84dd813e17eec12bbb7ea82 GIT binary patch literal 2242 zcmV;z2tD_SP)7)l5w3c#yQhCHa6JlkZC}Ks3kdR<~$i;g@+&Cnh00n7@WY_}-goKdHN^nNN z0fiM30))awIk2ZaAl6#3XcsxKEE~}NV)AD@wr4zlJ^lL%)tjE|IBUnAcZHh7JSMu<#@H;d;`*FP|F?0|ma{1f`Th zM0KAabErs2!xWz9vLGM`f*Wx{KO8^oUdfo2EUWHz3>MHVfS6(-wcpcY6#(&!A*z4P z-#d1wSh!j&+UM3PEl84>O@QCwW;BRMGrDQ<&|6Sy>#~M*{FLgdnN$N2>y3*?NrXO z=cJG&-}jmM9r+YC7thO!oGl@V0ir16XZoEG0xT;B(%|m^!l3mQ5&rna7k>SlOP4Oi zkLpCR*9Mu5;*A?%6h`Z>6bkvtTD6u4A^PP|nPdL39`VYe$B4+UwC(c`ZO4(0V?q!_ zulqHBdg6HLZyaMFw#{d|5RWiMJ^S8B^*bXYg}yS+Kt%4J8Ib_`UL(7gop(X2r7Ek{ zL`riqU(C<`XQA?SW}ah^p6Edj=qyW%i;W|xiT{>T9*UwU8{p%CQYtk~Q@WlDmDTb$ zP8~n|d@tr8dZfo4Qz+C|izRP3iX!zmnP&(gWRfJR*=Q;^?_IvNP@QDv*-ve&J@kf@ z=EwwqueJP`ZE;`3^K3Rrl7K(~Xv*J}%T(m&+X=BnkDi|vChDhiIqS)w6==e+PauR4 zzVD}{VeeEuu6;XO7PlOq=z#{ZL{k(KmX$NJKxSWoonx&UC}|kqynDBHBnz}~#{wWC zoSz4iH6V_X&sdi3^N|9N-30q1_DjX0I}%B_n1#w5RzJD`sO?edS5j zzMK4RU=#r%&=)gD_|S>M?d{nx+RV|h;t!VY)nY{Cz~|rrL3yq#DwVa1 zr^iQrwOM$K4{mX9FIS&5OzWRXl8Q7qqB>c(D%*J~I_z6C>VVA2bD#U3Ih+K>CG3-t*EldF;Eqe#Qm1ZE{ZS%h{uKe2Mj6!{<0lyV;s~ zK!GuDT#+WTC4NI6p!kmv&L-`I(#K-I*9Ho61-&?yEj41Y@8(E zw?e3_)gcHYFfymJi%?cB$3lK*V&YJ>li1mKGlVdg?REM#DSAUL5bBKkQyB(p(uG;o(kT2C6&8CzFm#zDv1?@lspx)$? znbJ%OL@*2iOkrtd4HlQn5XCV_A@sX`f|v6khykShefDS_Un2WROJ-~=znI3!wZf3g zqe%N@e_;&7 z_!fHsY_E@U{7CWbAP9dna@b>A>8Z@LZUF3HgaE%4=o#kP-c~ln0%8GZM;U~$yjpE* z&NkYvqfM0ZUchl3(QNwD8S@+he`FQF4H|1FaciYX8oFv?&NUHaZNhozt4YeQ(rPr`*oBuIm~Alr)>o>4~GI=O0!x#H}(yBP01| zDrFxMt~|6WLz}XanYC8mRx5_3tS4DEFC_xo zGNIr(;5s=l3_}-YY{wB&O7Q*Gs$t-(q|~)P|8f4xg$rk+?bHZyyIEo3TGIq@k(4^& zxHia6%*atD4^RO#TQO8?4G5xG3xkECXK)AnYpu#6M>Zv%aAuef6Cn_r#oLss-{w5; z=V!)?t6gK?)}aa9asXXYd}Cq38+8t!L8MPhq$h$PfH)@P8TW&LYxTMfukj2Hs`?V> zskX{-Upyg(VL=o{Ylz0*|McSAYtKD*;r>aH+1Xh!H8qv?^*|L7AA!@(abIF5XAQAO zLU{G+RdM9Vd7PSB|85rc2uz4+&(6Z~@)Vsv-=EWB0}L?000Rs#0Q}$Ke~&t{^J!c1 QNB{r;07*qoM6N<$f=G8as{jB1 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/moon0.png b/assets/sprites/weather/moon0.png new file mode 100644 index 0000000000000000000000000000000000000000..e66e62d8e1d6a9c0d839a77e242f7a85ea7fc022 GIT binary patch literal 1804 zcmV+n2lM!eP)MMl3e{?BiWYqkd}<#=5g#I=J_rg5K4c4u3JQV` zN_-SVHcuj2HR5jDL|bUZ)}~E=tyWX}XPadIW_D(doY~oSt6NESH=B*j2g@=u_ukoi z?sxtd2oNAZfB*pk1PBmd-hi2jnblnXjsVSuoVuL;q0@ZV@o`=c)XxNk`2`{(CI<-{ zcpo6fd;>F6J*R){40oS6$A$4J=HqAh0sooSvJB|&XO&8^E4t$CwUAIyHvi2YUfL1I>q_BiBLYlb07qk>LLMKiy^WqL8^M{_g7Vr&PH}H6 zhEz6NI_+o_S|)?u?xnP?JO*=tREj+&ZTp!Y-gSh>_m49VkFvYtXEuL2$vkq9hvd1~ zgnGPyd>z@57WRb=7`lGR3(%anLH234eLwfb;ut98;1n&mM9`VRZS7D+3$NaLC!J0M zGS;p2T{2hRcgqqwY+2ZvnZmxCmw42_WN@3xfTX|q9s79Wf;a~9IXI3DMG6Fl)4l-O z#6@hszXuG5JJ_vpkB))31~(E-nE~v;}AYJO|avDyv_S2TT=kJ z_)tzR#U&e2FDe+c_wv2^f*@7Pq#l5_5V=LhTd_EWhr-aNCUL3*_*_n` zw?-e`jC5GlLjBD|&i4oSfwp!$IdK6Fsmn|vz==jZ77VRgMHxRRYG|nHB}8@DlS-&s zCps>k4I5D4D=Elc)aL2dw{o3sV5~74&}T|LF?`z&@b#L)qnRmTJhUrzNFd7sD}`fn zdA1c3m0B5)2E2sB05-;Ah&hhu@-FRP^k3JZEE5w24M*hOCZHiyZ3zMN`lo3F56L%O z<#a_5P8LPX1E^a3Ff(p(N_PFK`fY^fN3}`KQ2*WZPv}s<3d{12zv_Gj*etd-^~+E* zouF%C<`5F=_fLpDux+prM%*xPbNMz}7^;>@{9lHR;f4**yWAv~ga0=HXi5(H>hr`f zN*L_ASTEOI{}%xeN%YBN_F$43$HQUob~P`c3Z|E)JR)_1Mu)+3%78&YZ75}RziQf5 z+#o>}@^GVVxV7y%tdm>Silg&V09`(v6=8=e&8!*+5Ij3TMH_v>oUU~1s)3rx;Iwc2 z*v8ge7B;998U70deR2YB`vPnl9_4i#Hjv$_EKoBUEGe+0p=F?dupu*wv-o0`{}KwFre!mwX3Uvg34v!#5-{J$SB?s+p%X)CcT_(kuApj}BsqZ?wY9g?kA*y5?pz2_hN?wR36EVD zl*_`6L@@BfK~6|T$*UEnSeN=D<`C3~viQg-4|Fa<--YvD3anSw2riHHT3X!E36;s< zYbxTUH9a(1ZmD&3fqHvAFH?8#pqT<7zisV)e~Rq5x2s_8PUk@W8$wDCqThirff?$TD6tq|z$WFo3bbO@& zpA}u~0`U7i-85Nd#^%kl+wY@>tRh7cUkD=y`QcCq??&3tV-^6j)XEkUsY+w~-a*M| zN=Z$VctV7h$-n|5uZ3{J2w}{!@aCFs>`VA%c+3K*k&B5@^P;{ahi|+SuY^K)T-UKu zX@F@0j_rNiN?t4Fb(3I(fv^GOviOS`L$-^AsD@vNnKf0QMlV=N+b<8Z(M5Q~1s(&i zhFvVxb##hAN*#ZoP(Y3d=aj;3O~>b|h%fH$rn6`gXm*zM>V{V|EyZIT8pk!~FXDDB z49zY8kqBV4;b@18bIX@gzH)3yJz67Jsu@CG|33lRbeQA+nX0Mz0yXVTB}0k9K`3b! ulrfqBClbx|{Q&|52oNAZfB*py0DlAJC0AuuXI@VL0000A4u literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/moon1.png b/assets/sprites/weather/moon1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a31cd267ce76453d027c88d9f4c8cb0eae78bd8 GIT binary patch literal 1861 zcmV-L2fFx)P)by9~$BAMp-Z|$Yxo~))-X(kG!z|7mnA{ zmp{3|5q{@b*`0Jn6!2Gpd2pEfy*7cAOF@MGW3bYvA|hMvzx#t1suI>iVRb~uib4U0 z*~VjQm*KQK06KpllZg?LGdRjO$8~&LsUX7aj+>a_Boa^)1#DO}pSFpj{P$jz7?91n z17I1%&I5es?je4ciWrE*@bl2(FII?vXL|gSLk}x_nT=rYF0#)Rjq z;_?S@Z1?)y#0{hSVbRw}}_EhthTFzoguv_b)2t+^3Bp5^O`&gWD3 z;4psx;M%SQw4xE~3v>j4Bs2p6@7l}rID+>K18mzMck-U8GzE}@H)U}B%z@rh11v#w za1@z{jkFsT8iXE1XbC`K{q;ZdOC2d(dHMt_Qq{hM`jIHKiE)gifvsNDZ`k^RNtXWc zpJ$Dw!73>AzuCukv?cJs*eTfl;s%<^8czud?3HH8iN31K|6vt~#j(*!GpA-O%)$~!gG z$pBf(yHF$+L~9W^I>*0=hkGTEJa$r75f{im(f) zU=~0HS%#Q#on4LVQ~Gx-GCRs`s!soRaz7xgfa^`uHGfTc2H2>yHuZg|dIfY%!koJ& zKL-*IEDIcqA{C3_TK_Rx7%GSmpD(a6oM_BlU9OSaEti@CH0AC@r<9YxC~2_c;C8w1 zyi^oGB*_<(u>|AHI1-Jzk87<0s%*Gf`aM!7=x$OP+!74f0;nD$3&3xhHpMbXP~{Sw z_BJePn}>Dss8(@wRw|&=qq8D>t*VkW^8hKt zNg+en)4-`v>#PDfZ+ojL^y#`w?b>djpo)3esWficIe=FrcI?>`to|^apddoRf?N(N zdL_O{B(W|(?$!iqQe5f-@pfp%JRV-Vl-}CS9J!TbJJA{^yDF%l_%#8KS4`NNE;^~r z1c$4uf)q`6?Bm{Bi7Hu!ob|QDUO@#Bl0AV0wbhI1`*I0ScFcu1gH^jN$ZcIN>1bzF|#QzzUlus*p)@K0N?)bG+AQ29JQr3#){ zxr7G%Bel*>PI#->e;pC_CT)RbPNNa87B=YGCB62YtSHY_p9fKi6+maZl6RnPURX9v}w zDJ3;c@(EE|J`WR&k`}?Qu?P;BCSF|Gg`YA2Ne+T(05!8S32JWEm*wbH%kfksg8OtG zHz*A-48XSBpEH@)O1Y;=h(&>D3@8?Gk{R1A2N`hIX7=)X)vQDGN$ z*(b9<7nY^-Ymt3u#2Gcw2#NT}B%_%;R>NvcW+pS~XT6S`>gqVj_Gr4gXVMeugQlsf zdvD!y&Uel|_uK+v#E20iMvNFSmK2znnXdFKVq7UOvvJ}CCxivfGC^SpftfY=KXw{V zIwoEsB5qa&!V*DfX&M7`>omr74a>9=mM>q9X?Y$hNDuDbvE5A7?NXl?4h5jGa4Kjf}7^{=1V|MWkwA zeNN+nY!++ECHS5PFPlYAA>SMe2n&QjW=}BbQE^!jWljx!eX&N@cmzMpDJM+6gC?=ZYdNn!RPTy zX0FKd%b0L5*2LHRi%bS^j31oV%1x|f|zwgQ6;a$7PhbZdutW{+IqfZ552i9*Hs8s`rkBjhc9OUb> z8N8?z9@+x;29-BX~uE!f?jsR++=p-6$i@RDh0g#zBWa~%dk%QqCA z=VO5c?uizr!g`cWlF*C+{J|l&HeoCfOWPA) z^KTs+D^{+csTvETj;lxMv;iQo{M;I+_lOm;=qeDc7S5l5V%IB&Ij?+G?WVy?vN}q$%8&KQD}j zcF{}-WZPh+a7-@Gv^aAMU&7QPwW>xM%Tgx)7O*XyM%wd&CGWyi#Q$|2%C2Chtl_BK z+uo#)E;Ljljkku@bb-6&pXRZyD8ehW#zz+#s=@ZM6p4?o_NrlRULsn?(x^762L0b3 z{RmkF+-Tc@`Rn#)fGbXWQ@;k)Xa`-BFb6}T-=&av;JRSTM8>kPs&*S~3>Bple_vo@ z_@))CE;q>K?yF4!ni50L-%kRgq`|(ApUHLa)uI5Z=HgV@fLUf7H_hO7y;VS!E0U_< zUa1poZBZKB77W-8r~x9`iT_vA=2->_N~*TW4y@_84qN0_tq`*070?^fSrOh<)t+_p z074K4$Z;_!%;_C%UpG*VG#(9uAG`Q>u>cogb@u;2&}V1hr#i8H?-*|x7$CP@S)dwe zyh{!znAPT+@L9#i-efA^KwTf_>N=s5!f#|pDC}v+Gkw))htaV7q$v#RdO+>^ZlIuw zd3c#DZreA8UrFpZc(C>75Y2+3bP^VfjzXEs@K!2~E&17?CQz5+QXfbpp%wFZ{HGh~ zF9(>7+ex+)(MnjYhKkxz{F;EL9UGpei%#k@!RP9#AVt%?hk5XJA}7aCqC~U-RFqD# zCy=1Fc|CntF5%g(Ziq9u_1l7cA5<*BPb4t>{t+IMic(N39ARDRi@1WIW;)l(UHis( zxT^<))04p#Sf5)X_^vIah{4$|sC*u;lY?hAZIJIBsz++Qy`ZgIgH=X$UA$BjK()h; z_m1#z_q7v@DInw2LMjp(ND8AX6)F}+Jfq(pq7jxMUqen z`;PEEhJjxvI^^z_@MW=>@Z8|%&*imJ!D$jK6EH2HSilrB z_P9QV#5JOv_%;G+^?-9}`>)U0>LuLk1NQ^i#6GUqb#w*i{K07-P%fiLgtJQFfTrU$ z<=~&U_0t(F5@=zD4eEv$z7h%UFl(Rv57$hd!+Onx=9Ym(0`A7W1UG1a2(7iiJmR1K8ay&Fmn3u+h}0uK!>?%E$CMvNFSV#J6M b12OO|H;_~MiUaPU00000NkvXXu0mjf>i?ko literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/moon3.png b/assets/sprites/weather/moon3.png new file mode 100644 index 0000000000000000000000000000000000000000..6a31cd267ce76453d027c88d9f4c8cb0eae78bd8 GIT binary patch literal 1861 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/moon5.png b/assets/sprites/weather/moon5.png new file mode 100644 index 0000000000000000000000000000000000000000..38f58042f5f2b8bd465ee7597b407e15809d79c8 GIT binary patch literal 1769 zcmVLi^`y?*!Bd-tAq z-+lKr5FkK+009C72oNAZfI9`uO!67-aRjI}ieB$K$0LrN;jz_Vf=rP+Sp_Ezdhn@C22`QYg$1>3B4q z#$mSc*20;%><*wnMzn`LWlafm$6|QJ$bqk1gc)xFWwY2ge=5CMj0t|I3cwb_Sq{ETrEoEC zz)>1jdB6G5=b~cTi1lUiU3h-!BhMN z0S`tvvdfvS4n+iEMKzHb9`deq;(kDqFY;iW5=V3UG=ZE%3y*yyrg z!;Be}@{*#e40b4>{0iC*-Uvsaz}E*M28bDAk&W_PZTeRmdO4lFbkp9vkH={W&!(;l zAGS-5^xil2(UCBN8GmEE$`a=W&P_qlxg5fPQxK-TLDzM z_0^977JJ^bfM?{JZsJ`rgq=nncK}qG{kgCO;UPJY+$xWVgzCId;X#$T{+;9>Xi~r= z({$ZmQl0@e^7T#qB2>8ox+Y-`A&GuBLgImCfg@ogA`v`TY(^bJ`4Qq<1vZ8gj<~za zee$^WZZm+U#L+jGlfWoxu;buKd2YE|3_v95Hue;V!1 zW$|9~D9B>4O7{gh4k(j`6OE$d_dafyijwG%JfV^c(`taKQ5N6U%N@=4p!L!P_Xw;H zt`Yp#7fb|hYKBUs@GIr?CvsEtM}Ey093r}*xtt-qei3k!a2FY zk+z$#i(xg!p_?X5P2m$GkM9>uq5U`LRkbn%RjOdH5q9k7Ha(1XIV|Kdu;jR0$`H)3 zm4X&e0O_kRG#$Tazz=x`I{}=WH<<>C%viZ{XzvrKDq5sS;u&FEA1@1q@L9A0(~TTp zaSjA>dJnw0~hQ6SQQ!%Ys(Pn<~E!F>zMqdt-)-w^srzHmE#U=Zeb zf2OMGd4X#7rb3{^+O<$}Sx`i8JGi~QwtIho009C72oNAZ00h9lu#Gr6Rd&RI00000 LNkvXXu0mjf7RyEN literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/moon6.png b/assets/sprites/weather/moon6.png new file mode 100644 index 0000000000000000000000000000000000000000..26e0949efee94702d898fe5d367ca4be34d95f52 GIT binary patch literal 1736 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 LNkvXXu0mjf7RyEN literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly0.png b/assets/sprites/weather/partly0.png new file mode 100644 index 0000000000000000000000000000000000000000..adc63a3f2096dac6174a4f63a19ddf604f612fd3 GIT binary patch literal 3411 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 N002ovPDHLkV1j6jvM;&6L(z>>SO4BOPv`OH& zQ#GyKG$yT^R=P?QX`A8}jjkf(&t^LTN+{val0Y^p3I^iDv132K_x#@X@1E)0?>)zH z9OCB$+m&*pXTNv9``vrax##@Ox#wP>PGSae-)39>U+@fZ8}Hqg;V17{iC+P->*>t9 zyDXyK2p9-w?a;m1LeD^m1l@(@$-m=+orhuJ=Sa{iD3lMOePC3&5s9vr2C2Drloh9) zy^&e{=eIx12e;p7tf9O6+!*cE|D-k|X*DBh?Lf|X7-T(xM7k{&y!!&nS@H^C5uU(& zXvYq?sh7~4>_HSgVg%ao+Bt#R+cmQ&gl~t>Kqac67*qY33%Vu)yUf4 zhog4DRzRTRkB~)xqhgr#^l|v%SLycs&l$pgf+`9Q}eWUc>ztJ+WqG>9}<#1(y+Y=_O8AV$&>R|`=J@1rgI9yR0i zcl;q5-N#VyHFB;(Iobz5_&PQp_(lBs!ngs=CMZ9%bv07%M-e&4@z#?kX(wW&?uNoH zF#12U5()h(9My`+CZt4cODq)yyPNYzY z7`8epkNBTAIw0HxU&~s>@4A`u1;2o}+Q)n)6D2IH#_3X<33tbP*`(64$*QK*SPToG zTG+|sHLSu%FsXkX#c-2h`rXDj;aRsl2jE(SX0^!xp5??Qele0~(ntETmJ~=MZKt7v z>jAut4P9oJiA5rNW&?fZX;09g`Z*+RQ>)S-04WZBnIxlW6_2xGn0TP$0k{?;(k~!Q zCvXZARX!Fc6=o5*w@V3g0*nS5q^;kZgi4%(r5X_tLq}x%+eu#B3Ix}~AP$T2UEtJ@ zM7UZu*#yG3khNVDL%`=TG~&|$US5cV$i4{A44gAdlf4}ovS`cqD%{_309jHrnh(lD5rjLIw zFjk=G$B_7-HJKF^bg$&At2=Et6AmeU7DoVS)X2I3+52hBK#?R{^eY|6Do2A7NF@|t z9hPUa)eaU^0W9S%hB5_@|LXWn?%#T|VQ3ZYMj?CyN!v0RUQNi-Xe_9NKl#XaX*0@^ zX%vG33;B_=IQ!IJFtf$X%XDg0i=K3TsZctJXxxWC^0cvx8*i+pl#8($!nur$pY6OK zDf>GphA-n(!|g^PhqnI?Y(oSg`zsTzcfanc^2bdx6AAkb5hWG-;iu_M`C44p35JS!QGBQ+gze5ET$PE0J%#7n8YLVWpNMlLS03 zKoEp5v49jvIf%3ZvG3Uq4tkaFp=(+)hgopO$Qvu7M!R?Kwz|5yOgtgkh+R1abjQ`7 zfzDfyv5sI;V4f9hrJ+#(sax>L-+rgsrxPyy0BL(Q$`KGSpmofQWh;aQRI-~ey5<`Q z-PKUK2#!JqDLq43kUf~JGAWC4xg31o3qu_}xMo@Ak(e(Q)5?tlC;;ACqVhSOjdjp` z6hX5!)`}9`-|b05N(@1wzS;p<`e;pcGM{ugj$qit#ed$+Zs!M;x_e$c!QuF4oU zm>Ba4&7ZTzKlBZowGR?Ept-pyh*#0%T#G{RuNdbCXvf~6scrML8Xmv+6$d!k24Ag* zRq)R=eEqku?(^TS6pIcx5*x3Fuh<@#xuLO9DT$@osQN-4OB1RMt_Oq3(rwf?(Q ztUP?(s>bK5F2i%h2)ZZ(RpGe5^Yd_3GktQ;_h%L~FGfFMPT!J`jyn`wTdDZsqw~%l zSt89jUJbuS`D{R1K6XPxL+mm^^x&G7%p>(Ef#zHZk`tg^Jv{YWLZoE&{hd3Jv#&)V z>O*S9oAimtN8dg@`gqHV=6gnl^C2l!U*UBgBrYS7XhmxSjf@l@y{0AmRf$J)aR>E& z4`WStD}xC=J?HP&dkq4M3hzUs``57X0?O~b9{lVNo*|~+9~~_*Df+;LH!P?)_MRD@ z2wGdRfBe>|aVbGZeSLkGoS)`1;S>h+-J1jr9fzw{>yRvkf`c`8W3cIKpimN^1<7Tm z@x`o^ijt|MHCZfmtXtJ|;8MV-<~LQfc0j{7AZz~`GImm>ZAbJu%r|J+@y4m|!jefA zqA1QsNPTy3a8NcWdS()J1r*RDAVkPoLm=Fxi_y1qDICz$kdKnrkYYIxS)4;)rIea1 zPDTxlx%HfC+*$>~i^^%wXOeSR@KZSxe4_fnSl^#CMad7n=_tJ{2n2-}Nel6;%$olQ zz<<79SNn42VP>0%!dLeGFth5`yS9}>=T60bHVi`vL5p?|K<4%;zHCo7iW?A7*<_is zghhM4lT-%`2TzZ8x{2i9Cf&paB!G#01xtWb5cr%(xGMs^OiFLZs&;W@6tFwa%k|($ zu{)Va>=H}Qk55E01<4t}5+JQLyKW+(y`ZVKSGXb|*w@!*?<9&O*0wFr>?%)AMx|0w zlOk)W2wx>O^%jmcRZV|Z1yEfhR%7bhr^dIYvzdLBawXJS3l1!)dp|Xj-C-(~RQY_V z9uRuma7Xn#XQw9km)-# zRA|wz^}m*-8hzgvjF}gA^4iJaQB0OSbL+Ookqjo5AcCh;3FI;n6iO%b>NT$s9xK+25_ojYu|TEh};~GBWY#+7*po zxmazG<|y~{8O%F_`FxYh?!RSosm}4SqA)1dAm(+!*388AI=x4P z&ZH7p(b5FhwheBW1A_REmg=zMxJYLbs8l>Z^rJt!)HwmwtALskYJCc5~_+Z=0SVJbAgk#$fl+R>Sn3yPO+qT{X zcwbO1|NYvw<;P;5H@VBK)6sksP*XxxKpq?_+>}V!UkWwvU>$uVmCjhK<>-b@e6M&u z3Z=3EyxJ|9dG935#ZxxcAQojJ1z|Lqbe>8j691IshW}}6qf)JKBejc540m}n;|$*# z^}O{KTdRu2BEk?jJu;5*QV}+6BolGkQ8#kVpy|m=44Sa59T_M6U5=c#J)3v%Ha zVrG4PydbAQ@56)KIFZOy*P_xDW}*gwQ{(nd{rTXitIJ%H_?6h6U!|*bm9ElNx=L6& Z^#A>>Pbsk50Q3L=002ovPDHLkV1jI9I|l#& literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly3.png b/assets/sprites/weather/partly3.png new file mode 100644 index 0000000000000000000000000000000000000000..63cc11c6ac9d6391fcfa4129ef2223ecfc981e3f GIT binary patch literal 3695 zcmV-#4v_JQP)=Fan#cf#dqPRVt;aT3L>hT5YXbW@V+aWgr-Lcd@Yxu|pLMwOhLwYz*v+y?bBho^xitYUZB1 zEDH;}3oL7ipZ2WoIWuR@_kHud=9>ZL0p@Mayxs!{iwrcE&dfc+zC^v6pIVp3=bBt> z+B;!JA!-&ucAo%sdLX578%4`Ivd6<^KX2;8(&%W4ie7a6M?Z~ z+vGUBBi0Tt`9;*r--0K;1J8XC&F=d=u;s6(3UV<(%%&4F6ElbhyS~N;x_%DVc^(np zf~4r?{;hXXcb}SMs&%NURS~s=5Fi(nP>up5MH2)*vTXwcpDqCa-NMc^@t3f~+k#>g zq8wG=h$Nior@XV%Grf$E(9xm!t#vM#w<9SNa77w|5*QEiQ1WMXxQ;=EPn7_uPjgR? zfGR(UPfEW)%5jizJZJ_4jUtPBpqKG@58-hDL#+ZrKZdc&j}Yl2NJ&8R`xwp)8%?po zoC5P~F`30hQL}9x+`NGg|0eVP&Ug6Dt}gqmr$=yqyS(Uo?`%u(;Ro;FfzGc?YDull z=+q4FElMyzcD4pKZJkv6n$xTGIrLB?|LVae!}uk~nktBWowxHq*KPK<(X_=72H6le z(C%QkjnUnwF9>rCs;M%+-nj)*{0>-u2@$W3M?D28-i78D@m~3PdUVh?!m2vV>btyS zQv+7Y??5_#hC=u@b?jMRHIZJ81p>|ICFA7iuD3(pv*{*eE=U1{x_TKn1h}H= zWh(jzg6P|{;g$W?L9Tl{!fTuFh9{qe=X?PZAtNOirD!9yzp}3;C@i!9xCerIp?P1| z8hCgL5x)!>)Roku7} ze@GkmJZ-h>jjbyI{SFu&wAM&ViK04$BCSW)J>f!WfjIB3qrH01`m1P6bii|d08Iyx zOdaAkH?6MPZ7*~G)@4YGm*CKHcpa42zsq@1qL=lQ%8OCA*y#gf9Si-H{NB@kZ z(}t2^9ulkpHw9!`fNWd!GQZ6;(?;Y#Gozx6&v=&mf1|}Rm{R|ULRf}F$50BsMeBdQ zi8kyWHWW+`mDgMVY#mdtwzDhf8;Hz|!a>?m0R4>a-92IZ4Q~D#>f{y_LIomewLIAX zWSXlClc-)+AkEb_YY8L}YK3}tDV*q!tT69+brgyp#96+F?%VTBZPpix`3p3_5+H*F zTzUpdpMVqzWL*j3m(F#f--9Enwrv`$^$!of{AQ(RuvxOQ39zJ>An(;=rnsH)*MLDW|Q@J4*ay|Z=D;VMLCrr9_< zz;UayI}=Qs>0|n`CTKPuKMfIn9>8%7m`?2u?`UIe>(dLZ1#Dgo7G1%2CuUEOsI z8p1T3(CEmOXKKdMwWyBMJE*Al9Mjce%fbml&Pd}_L13F;?jsCTN)X;@IHCcH7+Mij z2)N0awSWkSLO>f|YAPp02vo&piU$3iD>y~phEluWCH^bcyaj`}RAbFCS^FGlcWC3F z55~Jl2xGNXj~5g#lTcFJ$3jC2Lcn7qS~ zv;et)n5m)Wn0RMrD-UehSjz+<=mii6T9cj8unhRQcy^}@XTu>?+e{zZCN#1M^Luye z`WN$Lvc<6c5DF^N5rvR)B|?4_Q6gCIJfMcDv6%O7c@#}_01my(2Oem)ZOZRMKKfrI zr2}R)$z*Y~%BT&0W=&A8KJzC4VUk3};Jky0k#R&5-y3Ic8a@2nXO*n)M5!o+GD0kA zXuO1umxt_nU;%_6FUCCY>uiPK=a6IrOQDa1 zmFS5TZFSF?_I_r$ktjN!Mz;18Cm@qTx;j3f?k>W{09IYf##dx$qa%LD$Z&QulgR8 z(*U9J02vxD@6_1{kiji&_0Gsh{venSdkOcBFjAj4^Q~DcN6I6vn>fT2?cBHPrT^&e z?pCo@@LaWlE=ojCkDy*7fUeshm}tZ9Urnz9UGR=6fkjvWzql$8w=5m|T<>O80t zRhgd~wALz}&N!YY5rhh15X2M{yo3igLGb+$to7k23ZGcfTs4`V9u~d5afqI;0H(vP z0XhcNWC^UM1*Xv1AVRpAqqMd!rV#jWlwZiE@Y|()PJwD(aqckMU^7rtU8&Bn1sO%C z+P_Gp)4~YJFIRqY?97Sp-n(YaL{CqT=fi{VB?+87d+4LJyULlg`|E{5fyso&1%lQ(Y-w$9$42veZ(iE4S!?YWCwaN| z#GJomD#Zp)^e`F|b5ETrKhsFB)-&G=cn_n)`LNae4gm6bkCc>uXx=qJUo$WEq z&n7yEIe)2EHe-ASz8W*zUt)>pA@D`1u{}t-To>8keqA7QXN%fPdXIfFGI47x1aVab zK(Rld_C1f`qskhD>LCR5Bp~|AnLE8?!mjuhtge4PZA3~boy{iQKOff^y9r;0(}-L_$<5m6Q2l|JT;8U0N_{^h^#>%=at({rzTzV}E}# zG_>L5Sn+SAl(&~kB^#b_{a~2qWHPm^u`RRuauY4*^95s9CKWyU!O)r|&2@k0IBu8c zImqWrPFlc4#g9quZjS6Fx&9*f2YQ~)9K`s$)vX=cQ&U>C2RMl z?YeVs=15x3*sfhJ1v#ftW9E;a9^cf^)bM<%SjPC-oD#w&Jd0_6pMpR^IPUH7GJ3|S zBxXBe98UDHGlgX`;Xdn^eI15jjrm0d;Y@>7rx41`_0)9V@78UFI)N3{AApBm^;=!QwEYKKyWKxpdt}a^po_%*@xIl!A05 zX{{fh$rQva$Fj^iDQ|OKT{@#wq!)>^yCjTx=JN$kc!~8Vhbya1A!T}IC}ug9m7E4| zuHIg~n%qLH7E`IDRPgVJAJM!80MJTRU0*Hw*`ETI(v&G_?Ue|?!W7?djc~0kinYF? zC_wT5+|{Jh92hi=o3j&srCLy$vF0{^kWvicILEFe5hDAKX~1#tjmzwZ&l*ExIRrt7 zNGU{-LN=X3YjXn}$FawT%tx+*yoK+F=IqWd<9j_H4bb+VqFsf2Il9siX!lB@2ow1t z%6?#(H#46vmhkcE5fn>hd+)@R_A7IMDOCLOdn?8>N8@llcL7iwK33gS_g)YL`|Ikn zCbrJ&K!crC5-5~>Lm(VcH3I{~a2Q57H8h5kr$>;>7Z8NeC66Cm1}dF(O@ZS3w1z4d zZQ!4wf%nf`pXz z%+_o^$jm`YTYX|=c;bbXt@Yitddc*DVh)5GEpTpbZG5|2@c*=>IV0ora`rX&nDU{K zaVTw$7GByx8s-g*7MzLSF&e{{h*HdKXj08B^@-eg`5+R!y|#sRQJOGE)K-Ki&P@C; zTc7#kN+m?a_l;k$dxO(8qPmd)IF8v-XAF;yW1>)+WNx-F8j)}%+L{}YPMU-2=8TrT z%qQ$6UDq)-Z-%b;=k^IMRS}YN6+o@fNJM|~@lgIv*K>c^($a8~?<@GeZ}RU+NgGkr zLY;AThIte2jIGZ#r7+?$5ySX~x=adn*)&`!&1S1ercz|iSr$vB(Ml!QPtgCctTFY9 zdCzQ;Om}?e@q>AyrU~!Af2ysnwfUP$g%4}yJ5$M2y2hK*3VtO-vE-vrEZbQVV*0V` zIUrunRLzI109Z%Lah#(9c*ad<{^g6GX&8;^i_bY+I&CLh0ct|1-H(>|vsy)8Fq&Xs z>~=g?K!gZMnS^xAf#EAdO=Tk$A?an|2hr({b+^1%v+;Pbb5VzPO~A}#_VA}3V7MMI zMcVn$Kv$E99%k|Qlrj4z|6L<&vw!jV25#U6ZUBn|{}0WCNV?(1B!mC} N002ovPDHLkV1iY5C6fRE literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly4.png b/assets/sprites/weather/partly4.png new file mode 100644 index 0000000000000000000000000000000000000000..fad07bce9eb1a81f6adeb9bc64a19c3dd80c294e GIT binary patch literal 3639 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 JPDHLkV1l4R>dgQE literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly5.png b/assets/sprites/weather/partly5.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce601138bc964e05a4bae0e11e9637f4e4c20fa GIT binary patch literal 3618 zcmV+-4&CvIP)X()!QH)g@4a)1 znR`i74@#s+k#e9EU8l`6cS@i~5ovDTV+1fW zp|3p!nR*$`?k(^mGsUQdB}DEGwEmeQGe`@k-!&oV>l2Xf&)~`dc)?d_?XCm3N+72E zi@tVA>-#+@+JR7o7zt{q1|Bjp3t7L@)amJr+wJKTu{NY0K+gUM2x}na9)4-_x45t4 zLzpOj)Pa6cBCgiFn^V*TWJ2f_fOD7B-;R zf@|FmlDT*ZbX~m!Fn5V~y^cd?PrSbU)PJKIyba)0RKu@gu+ag5zm8|LN9ox&&r$F` z*z_h+(t;od8H-SA{41^7@v62Z7qS;u1$dl&h*kA`>&?6GT6obmde>RzeS4?F`#1j~ zzkJUS@7+}4J@?Mnwq&l=|Ke6&zxQvvk6*gy_a?3haM#&d#Q*i_dHmL==Z&^;R$1@n zrQExz-8^3!`+~6D6J8r>dSjKZ-ga2 z3s%b!@`sXE-+?6#L*W@5&u*iwJ&mzG5-&0SGY}h2qMm5BgugHWtk-2v#QmFp6FK=L z%0YmvZ6i_&LDWHa?(F4*pRj4=D*^B9Sd6UoP1xdYSON%C{L+vF*dn$vzB+_P_#my_ zwNEdHQ8KuzOW5_#WBj(hJJY;>V>2RZhr)6w@9$}S ze>jH(0C=S%58wJT0DlTcI=0YKUa%t3*CB z@oxk{!gzp6u#wt#?lQCAabOkF;w$i@JK$QaCa6;361sEu$#a*D-buM$@(=Yv|=P^z!ec#beO^Ptvk<%UU34>vjuB*9HKj(|8-cr20b^0 z#`yJbxC=RJBSwMoWZgq=?tH7EB8|Dx{w6QRwGUa*QSWah=WDaI{x3>^iTv~~uDx9W z-AqKxd+yCa1vennlfz^Tp0wlHow%X6j;_m!pjaVeWzbMJ7y@4SgiUJ~Hs7P;i0Nb5d3$z;ygV-(VXWe=u^1*b{l((KHP><5J4B4{`ab6to zqfVD!-1r07(0=|gG}(89=^i7?s+a0u9EKw_P4P@Ms+Y*CP*TT0!Ip%OhGFI2GGyzZ zhvzO;CeHe#6Bw&{>QG1_Wl7XR4+Ea|_3L?8N5RyQ_#OxZrO3>vHf~-incZ>Cjk-gx z0)&227Ad$4M2%;0$9As=EO_6S+T!@5Tb;M{o^=9RPsdX!@kA2J36u0_b(g}m*2ZP! z9#q03a4l&fJT15;pgNRTdhPyHEOd1csGS6&3ZQ&MA}6Du$qQOmKchy&a1otP@B{zzYYEl0U*o^i{0evDcLE+5AaZv>%aTM2UYN z3xyN25|#mxf|p%^diGWX?)3;UyL(OW+PhXhqe zZT<$77JLSQdjpsp5QhKfNK3fu$lxr88-$p!#y9A%APx!t_yH@95Ftf@KMje}94J6BW-M z6U&((f+iMv)F7RmzdtXT@yuNd@xIg_Kt-L3(@O@g``dgi^D&ZPF*b~o%DZZh8gYK! ze5#a71A@d;An~h;qmK$5K@lJ=dBl?9P#A`NBZJ=4%a$!DCq#&|HD!hfxDdu{gh^}B z8?^rU<6~vpAy2Fy>~}IPtLl|AOhRW!rUp%dok~$Qn?@KieBU37FKoww<49wg{YK-s zih@U4sYJ++u3Eb+9>kiB0Qx^+}eD*;3h#BlCF|m5R5oTB+QB<8^IEE>{!8q-&Z(4jugk zT}WG5_)#+)>+5*uX9r6^`PvtiaQ?Dd8A$?w%Li#4BeIA{(l{9BoO~ZN8ay~q3R9`n z>RciJ($Qmsw`t)u2~+J)Os0}afNIO%zi9;u&L5)|G88wI-rp;~wYFg6mRvUN1Yx8t z_Z83f>OO=JR=HFT1T$s9ch=|DfQ`Y&(ZI%M=HI=f?AQz*phXg zXYN40A87;mkm}vLR z5x|M?KmYkau4PI7@0j`b)0tGNR&BudJrg0#C3OEvXW#|j8ix{-(@1M7!XG(tdPP20 z_-3Zb{`l}v1)k^Ybhh!=m}4ZT&6E@C?WM<$ms$V}Yf>(?SrU_NT>IHfCevCj#=_$&gN}`S&r?m=^fKkpw#3DY zY2FZFt={U`>GBtwTk;(`^12#@AMXu{!{xBKCD(E67o|Vfu|TqIo)F>^Z8CSUJ_dS7 z``OD4oMsgSSt)x;TGpSOJXvnlo**%bQ#~7GWB87Lx%|PD<9w`Ets91Ml|wIj-}gCR zXlf25-<#L~c{v&&^dAPT%QU$uX6V@SqLAd=LHN1`s(Y93N3W+8k@5lWRRMyhovrO*gMIF5~lE%V^I4x&h3Gn&4u(FQYTY-&n{!e>z=>ZB;!H`W(*P;Nbe9GT zA;d_<^Cj@ybZvlKwv2ot{6|yPrs)u%)!g$N2!ar{^{$YVsQTIO=cWoZB< zKWuKMQlk-lULWWDH`Mf3}WM*wAF4%#| zq9zu9xL84{T-8a;N&DP*f3J+z6f63-aa##}Mrz%^Wm(kJlobnF3zqNu`-TPv@3?XC z&wOR1HYwpR+_4Gf z(UeJ{kZVH9v0+(Kq|+Jbl~}LUiqa9UaTNXg_qQK@VyY)aG^Md5Bs}uSBlf2{zwkK{ zxKBmA+Hsr~N(5Aqc5i{P^jh#BjLZ_4ZaAe$(ALtj^u5eb&-`mb;@hpQi=JGZr-5-} zoYDyqO?4pWc5tj%Y(_)eY}>XB!w`eT5e$`z2)z)lYr&G1zWg(7n9Igdh-_09BVl-| z{gw~>@2GoAjJ3%DUa5NoXF+$^+uLhh&Qa7%A{oQ9f(DxIAjYvjhMpc=IdsPVB`H3l opM}}JhHJQnYq*AMz%MQSAJ7r~p~ym1uK)l507*qoM6N<$f^BF0YXATM literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly6.png b/assets/sprites/weather/partly6.png new file mode 100644 index 0000000000000000000000000000000000000000..cb436af8ece17ad7b94d19383c91c5a4fd075829 GIT binary patch literal 3627 zcmV+`4%G39P)^>OhPQ2K)WIKfh->-}|01 z#NhV~*q+3ZF5Gv&Kkhl_dw!p5;3@*|+qQD?^1GM2?5P#5p!+bfo->-#l0I* z{9(kn8$`Fj!tc@@&%VvOpy*NP+1K}5pdn2FW0674Yt{ZO77-XqZ9}{B1Ej34!lJv7 zwK@@Sx0%!3Kh0d;m7F>s?Ca)(y&okSiiP;4APs6>t9p8plO?=@GhPM7unIp8kWzrg z7Bkj4PSeuTeUzBD*Z}_vGWH=pwBuVmxFJRKsGgRlrOE(i5D#9g*N-Nm>*?bNw8C;X z14TeNdKb|C1xy<1S2QpbV}JUO(USTIDzS^S_19Q;!|VJ~?~a)gvKXM|B3?vY2r!JO zAu7+z$=P8UOphRp9)fNCCeDVp(UyH*Pu9ul?lQ!S*dwjJi%JwhWTX%VXmvJ%)mo!U z-A5Nq3g}V;26-W3xc6zK)T^{<@834NIS-521F*6;!NFs&sSkk$(iTt%2WjiRPm6RJ z30X?OHIe7x?GNxT?_>VOz08MpJj*ZbT%WkIgmFeH>O|Jp9=vxMzw^oV_p1%SFYova zAKLl9{K}4y4{yJbnWv>{$w&Yj;uzT9(*`^9b2xMpyf{KzDur@10n6#eoj)5lo?z<% z5oz$Do!de5S+MR##J^G7briNb292L$lAoea>@~K5_w49IN^hiX`-bZ(h9$*-;Vrfh z#xM0gf;HJkaiS7}KxlDnl*8{~^S&?RwJ+K9JCBDF_@Kr9XEzWNjN>Jc>B;4eZ)Q zhWHnHZ%5vF4QXp9Dv?Gpj8Kg=BF*Lsv_?6MQH&xe>PFhx&%?bB8A1p9Q+47+RU|NC z)C}$d2S+s51U}d|fL7-*Oa|Yio_$Z4;N|cyI>F%^a8ws6aU}jgj?aLqslKk+H8LSj z3`GiAn@|jUsb}Bwvl%~rd3zTo+!EdYOa+VY1wg>A#GO64r2`-BDxiBqRPzkaq0Q+v zr%q&pHQ;1{R1UD5WP>;af-(?R08+A{hNB2Ek0Ww6qUV_jGw(p}=aII451Ma9T5Uur zewa2t_rtm>UTX%ZOAQ!t6k_G1{_wyV3=Jj3AJ~2mTJ2tx!Z;zGfpi;?TLCzkgjl)c zUY^OA%pp<;b&R~T5?1tZvcH7Wv>Bc02cdBnY^xO-A2$f}bS;P~sJSN8gCO*5N#-&= z2ule?YzPxV>qLqq)Isj+%#k^DCRAgF=Fjo)mUQw0dK!~{h?vW$L?M`OPh9KJtclb$ zX8_kiUqQnBUo%eV*&iFk2pbV-b9QEdi2Y^l7T4yOTQXk4!WtmG$~@Ehm#D@Hc_#} z#}yo#_#@zT4J#DQRaeFIYMt!!W~ZiseV?6m+5!Yg>iq4l#3Q)zYDD@usDk;F337x?0N`b@Q67p%_aFzG>9z#m4N5~q?%D6f)a+f?TO59;`FRoC* zkIo{Mf2U5U34RtSAyOCq>{rJ361|G7?ZBcO+Fb{%K6QQtJ#7M3t;w8jSOvVP<3F_$+%i95~vG)?N6#WPSdjkUl@yCfG zei9vttL5n|b0L9dd&vKGUluF;7TWau_^dU8gFEhoO|Kxm8U_`xQi~)lj+wXraS+jhV02a>Vi`1}V1k z(Yh6}Gj;sMr!VA4y5vU{diM^-I z^B3+}iPqeoB0T#Cm9|fIpI-eHMH~=GZIl|cZ5%_xi88sI?NH{&G^sW4?$aRgXmpo{w8hOYxGu5a^&R6 zzU;C!|6VD}smIm@9-%>C9dm12J4t~#2ttG=*#wkQNVzT?2PhV*v7NI1qg?VHxp7t7 zVKJU2ES;x~poS2uwukLuG*b-OYP(-VI&u3CX!u){6 zvz*6`W>letK)LLEK93;qqbQ8Owzebp_gBIM)iCh~c6e3&05L}hbOfdPP+cK+s-;b_@cmX1^YM1061|*=UJ+tL!VQMP&Jl|TjBKw_@)5XVYjG0%6uI8Na z=7yvPK>8$#;SuDWlvyV=!pX@mJofwEsLhoxoIP6>v$-Gv4XLE;bb7oHc6GEobo|t$ zRBqzo;bFV!z0iyS9Ndt?2iJWKj{26a@NsMNvm1UrKJ{nImgT>5?rb5F6T$+5coL;l zoX(`JN~zp?!>aZdnl+57kxBL3oCb~tbl2W*V=B5!A)C0XSoi39r*MHm)FX~#p@Bf^ zA4f(;Bq&=k<&VO!HoQoXyqQ_^7n@ybH#1p`%+{?G?b)-( zJvHU^vE~PubtZ~paY2jM;3Oj73&dM|Ow@pgs-gysxJA3sm((_lM#d)lQf~V1T-WUu ziVKAzmH?@YdSrw%;$vn1 zIF7BQO1yy98c`I(b?qM>J6Y&xBqmUo8xv8Yboriqd+Yj2sS+zm%a$-m9O8Li)V?gY zGV9>snkrmYP1RhR#yWaHNfBg`KV)cz3FUIgTJz_Q9AU{@npXjy7Ju=nYLn-M@_R|2 z{tTcn2w*wZn(Xp(t84W|HIMEvF_6y?p(~CSInrxBKj2I{lXV>D=KAAH%~y@409PBt zmR?JHn(RL}ed=<9<#HG@xO_EjpVUhPIkDD$5Srgt8InHvY~IF9ms ze?mo5@6?`Ma$_|I&H_JGmgx%38zU2zDTS)%qgblI_X9($Xu!l|0i)v+@WVtJ>Jl>V zcS&}Zb)`VCcip;m)!ISwJiZZPGd4O}?9eIee=JM21wl}&(KQdU?7i^`RI0voho+B2 zHWNt@!m}9{t+@=`lmp9ZUf7J-T9&pf1+Nlqym4**n0SE8^$*l#5H^LzHEZ&xqd5G_ z)_htqbJHI!nN5^JsZvF?>PvKWfjlPT2~SI952NGfF!J7MjE}W^IwvF8|4T9t!E!APiNg?4Sxn8)D+C`JwHwQCyOYSFpf4#-ls#2*0`E!V|Gn1Gsmtez2+D*cYEB)Ma zX0Q?mIvzV09vRrN@$5{TY9hZN-xfl|Ywu*T{|7I8AR<+*{=WbK002ovPDHLkV1iY5{IdW6 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/partly7.png b/assets/sprites/weather/partly7.png new file mode 100644 index 0000000000000000000000000000000000000000..23dc4726d3e76987a9c71d07368a14d590bfb468 GIT binary patch literal 3563 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/rain0.png b/assets/sprites/weather/rain0.png new file mode 100644 index 0000000000000000000000000000000000000000..f184778179d2d64494c4aca45a619a4e5c93c2ca GIT binary patch literal 2658 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/rain2.png b/assets/sprites/weather/rain2.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbceead4b85b687a26c8a84abdda40b57c56311 GIT binary patch literal 2711 zcmV;I3TX9-P)6+Y+Qnc1CP@57EaAxT>~O-WO=QlU+#K&ps=il_R6%2pcE7FwZFDk?x!mC6q% zzbcRrLKK8REo#B3WJ?8sc!Ub#A|ybGgsP^6G+0fYG;wWbz3+jGD7kgkwHY_(y$*1z z6cPo3CMpUk{u7b%g&M$buS!Kv&3!if8&}h1u#=O8%pxM{bJN9-o0jz$qPQa(HNf); zYPA~Q1T2LV0<1^`3T-K(o+gRgs0)flI-P);>*t+H<(t=RPCeZ;Z~9Cw2Yu-@ zKa-n7Q?67IxO|b{#YiyE#6&)AC9UV;UG^t)vqjAUBBE?%3az!WB9>uD36A4Fji8kk zH9z3F>N?UIPzaEQJZ(tvitqblrJ3rlckSveg!Bbl-FhlO@=BbYE{tx;B=4G>D!7Pf zwLOm}VvbVjBr;>3r@(dHx5rJ(0?U%16+q2(&uQiT^wdkopXl%J_c`beHpPxLQviiQ z>&#?sD6=_rXl8nO!q0&ZL8J)$q}gpW6C?n%EK7DJqEL1Gf6nGh5AC|D`(K=H`w{&$ zQvijgcWyd=yEEbD?G9BL$ zRn`+>MrcVku>!jF0EJ?YtS7p4-Po`a^0Or!iI@*gPCD1N>Iz~x#5m=ICZ<8t&5FyM zHQrgy1LPPKkK0BK-TT68omBu4m!c#%-?D~h3Uq^Inp-`tbJt%1Yz5%CiaELS*s)_= zPA{1aj8-QfdZ*f=$((Zsp?K6&)qVmnoJwU~g5O;5;_!Y0LG0Lm{jJ@IINe;LFIxc= z3V-tCL{IP4nIBoEwVzA2a;d~)EIe!ku%y27bu1Q7pyS*K0Arz*t7R*I>KfF%kGGQ6 z9}|h_-s!14y8shhlcJ|B@Q#ap0fp1b?V^?K?Z2m|6SB)V8jIU3yvGqY+~jO5;X@E< z(8~XEEBA_}#(DKQxAyeJ_s(Vm;Z4}UV5=;b$||!t`M~&v?89L?TyRH=;q38Ka8|fVp z%i835-hvw3$O@=cs}PAsc5Le_zCUciiMAAASh&rKL?WU2Uv^-LEh}PqfZM`Lm$f^^*pT%;$gs!Z^<~jR^rLpfC>6{7JGOR@Ez~T<#U^P~gJ<5#|Eaq>dBhSsVT5xH*YPa4X&7Kx24s3tAOr@1vt@dk+{~7wH8q+0 zao^VNhZpM zr&fdWZ)NMI--drT+$Ncbhn7%xiMcg7pAYa)J}imHqfjn8M=!oPbKs_%uE{Rd5W!X$ zX_yczA=#b!rEQzL@&yMx*HuD@Muj!^?GN5cLa9=PshQb8kmUroh7ux{37fi;5VIp7 zxGHC_s6%vhB{^z?QrKj_oSK_hA7WP}W z<}>kNIu?>Cx~>PgdT0#7Twhs+lnS_+ ziumr=McSd;#Aw}(xZ#6ELz*W%rGB#SmYpv&@z~bU7`Dw!UAv;0$iTpe{OaR-6X)MN zhjIU+e^zg`bab2j$fy5)@oz8R7WI{;a;doDn3R1yIc9GG6ORKSg5t97jaabpaPEPh>Kl)O_*OUvhmJLGt z@W}8zcwwksAY5Xyql2jUGvC-+0XsQaqw*Sfmael9dWY}9e*~*LN5G+>dT;LZZup** zu+swg;!}f|o$ubu4nv`EbANAOAUveFdzilcz#oY2|2@&&!*rDIWj9)DesMJ>Wnnn# z2j<<3(ANh>A#QqbT3C?LE+`oROZ)Jl;r)1=m2miy0}QIy*Q;P10#*Ts52LOh1L;#z^=ynzBp1N89ltD|!kB~Ti2UZMFcYNZgcmZ-PdP-rM4!37z-5e%eV&_ci& zzGd{4=3=QH69xuI9(*%1%E{wUOO;Cw>DBPT+SE@O?m$>Xz<{3^sV4xu(I#0ZlgXpaD<+@|93?9 zK2LPu2)#D&By|OwpAK09!a6D;FzNXaro;PwPHESI*U^9^DNtqvOs@+2p8Ep6$O>98 z&a?pm>jV~_h4|>P;C}|P)?!EKcd2M%E`=E9yloCiFKrw2Ftfs-J=^vV%0D*!MgM?_*KuGY9wSN&w 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/rain5.png b/assets/sprites/weather/rain5.png new file mode 100644 index 0000000000000000000000000000000000000000..42e6d7ddc1c067203d7b6c9e626f67bc45abf719 GIT binary patch literal 2715 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 Vnd=Qf4haAN002ovPDHLkV1io1HNOA= literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/rain6.png b/assets/sprites/weather/rain6.png new file mode 100644 index 0000000000000000000000000000000000000000..78b6a5f43dba6401d7385537a67695b30601e8d2 GIT binary patch literal 2697 zcmV;43U>90P)aV;sy`?cLL^5*t*T0-sI_VPqg5i63i=4aN-!aDV&i@9-M#nDoa)TIOE!)lyY|{~ zs6Tnv_S`!&=R0%GnKKW7b*y6@>sZG+{%?V+*%=XC)*m7ge9|#8LdGbONkrnxXCns9 z^X!_(2$3;+#K*^HvhTlN=pmxq1W~;88HMkQPlO8)k%5Sk|DG&*_e$x1O`zEAdEOlY zg@FP=5tW4@{_7aV8x4TpU7wAeoLx8iA6L?4u$zrV!XhH7vs2|SShoE%qSzaYncxQm zjYflC0%lfGA2#KPZ%cY^=1x2@3`@xNyvM;o>n>$k|z_whD z>l9}7X)IR}xOB>w38LGXm?-A#jC~}Tia$`umlYF4M5CQ1lv2`mY|}Iha9!^O1SRd5 z^=aRew~$hRLV#f!r%XfqD+q$I%5?oVJ9lm@Mg0r5x~r)GgGb_nsnXHSeVK9V(%U24e2X4Nx@A&LlWHE?k%Att{ zk`BfbF-uCRBjGaJY_DTP6hfG#Vle=Mo>VS(BI^LE|p9qr3}>7Ag=`x!YG%^K_-{n z9+UR7(Tva*H?fRzxAFTM4W0((U+_M zipan7&P4CV8~T1`TlT}8vQ;Y;e#YcsEr6K@GEj*`GL5c#2LOykRxX#U017pzcpYzN z?AO!j*zT!|MRo!1a8;6?j=(D}_5~DfJFkm&mbd?zno1if^H?GoXYxKr+-Q-rw#Y{y zQlMn;t#;lOi#_Mj=ef1FH@Q1Mqsd#ahQU@@tyE>-rp!0T&(Ay=O^5TYNO3X0KmB3p zwph}9JMd+5VX`Jiy%oGjuq;cVfi>CicJ=pVPBk}bI6_~gXIM4W)W=++wAwBQ;-=n6h5QeQrCf~@&w0x@5G{!(Uc zyJOoMeBYl}gKJp3r=*T0Mo{;w&OUF`CoHj##jR# zs_Z+hycV?p3utEJ7xe4);9T-;cFuuaG)PgbbbvKR92$Kaq|9u~M$eHuw1F1a~Brf)CD5^A?u= zzf~G8GfflH$+-SlmZ_JwT)w3K5QA9UF)QWj!1gUYWAkm6;zEryv%xbLiht{J*gY6=0<`4Y?&O4|Qv4ncUX;XIy+Tc!!NZ9-pf7KA_@INR<|k=M65V_%#s z{CwM%o+lUDDHe-1Muc&&pK#rJJ|1R-9UVS|=YXiqy-=!Xax|}t02oFn632#8xu%sC zt~?i?IfzeIi2MzG8GB}?dOUtz?rA=PU&wuNQ38<_j89DM=B;PbuzD)xvJZ&nVnMMv z@@}I6=Pt~Irr&{oH{B+aPDYjxy2R|9oX-dNHy@THlQF1P-D4kpIKA)AJ8zs>Y(oUw z5u|BCtb|NY_LX?t+F2~Q;Cr4FLNqh1*|$GD$SK zvzh(YYXsc6ZjL!Mr?_IN3Z-gIcM_IgYLBU-3eWurO&}&UkEr}^GZ|$?#A7zZ<1t7i z5)k+S1cCoX!f~E2O;^VFz_fW-+s?TFwyS{Ir?8Wg<;|Fie<^6V_bCOR@qD?3mEd_2 z>YfMHT3wGE2RvOj+(*YtaRJm{FKp^9`4-&2RV%%)xj3R zt9c+HkGep?%paM3WGfdbaJs|0UBmt+j`3{phG|)6-ZWh(x zAQ{eAAT~6FRaW*~abl?uu*w)Z3gV@&W1RpF8YW<31K28npBx^-lY?y1hoXHuJ<0(4 zU!x87L-1#e!@K)N=pH7|Rsq*ChKEA}55G)9j~<~P>OvjJE*X+m1`+Oim0tSB?}-k) zMzrr$dUx=7O6j0C>ki^lfv_TA0YleVNC}6UqkTp7(99qE73Dk|PNNAKk{~SyEWZwW zjy!^IvVx8db$%ykHUxAVdSs9n_0$~cxxnO^#OFu#oxnL!OM>8oK4@+cgf_C=`$sEj z0i?+{gVrktmL9a&&&S3}F#ew9KHpL5qVW6aV)efQPye^;gUVhF2+QbsM6ajjcw|TGOB?JL91B z$jkKEsPLLNQSKUAlb?kWp-(i1he_yMejV$8wT}M*RnN@`$4LcI00000NkvXXu0mjf D=6(Zi literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/rain7.png b/assets/sprites/weather/rain7.png new file mode 100644 index 0000000000000000000000000000000000000000..7968086f1a31352102eb5904fecfa7106e76318e GIT binary patch literal 2685 zcmV-@3WD{CP)7l@y>@Jx zpVn*p&CL6b`Ofzqzy(~u1zf-dT)_V=a4m@u(TC_EBEd%;!^32Z5}8CK&b~Hm&;r*s zJcfyk`EPuDJfD5*twIkGGN}(fg#7{#OKwy`JY?BTyJ9 z5EM~a7~(a@Fpf3={&-O~c4Gds(f_!bE`!~iEMgWBQJtD8f7Y_?hY-cSSj+@JAZRoi zd=sz~h7e#o4wxoDwc<7mLmYl@w*1qpFYP@I3GR>y~YUZ5yB@K*RG+De3?A#D9)G+TY(FaM0b~5%-a-mdU;Ds?D3LQFfu#v;d*M$^TR;nMg_*sPiGbW<&_1TrLNhTyj@T z+K)yVp)J|O3h0Ib3dJ5HOmye9v0)_?=PJr^tox>?-Amhb1+g4roN^))Q=sTN$z{$O zcb4Y>atul)<7NZBd!w=LDu9SfQ4*YQS;Mm>y4tp^Z9dnz=U)MA1>k#D;bA?1B@JYt5{YCQUH2LQ7>lf2E?WTZ)fa3 zr_-^$GiQqI0!(mCik^BSa}C$=EVyNwVB042^=3f`)Pb{YdWyWhtr`2wbm7-K zxAi=**h;Zjaxx-}gMGj2*5~43McC2iL%0u!+T07JiWZI*bP)i<2wCFTP%787(!$Pj z>C8dAvqI!=>dV;qeDzrTW4VWT3w|;8#U%xZtYCa{W-l*2n}*d>DVKdfG?xmB%{T8h z8gTmEd}#U|_;=H7GU;Sw3872OugQ6TfPeF5NirFOYSn$=y?160Tzl;$`K1;_upLI4 zCd5j}^kkon$F1GPk_*1)Ng+hD!kT~jgIh_c)ar0%c1{bjoZ!|}f@52-sV4)8xC4T# za`uW4B9+Q;)CMX2Q+^OUwxc)s%ZTqqg=e(QQBw)W$H%i5Z@K7uO47HI31=(&t=9;c zxSo!MY^JzksS2fPO%n;n7ofg`ZL{8*#V9Kx9hc7$9cRoTN&dG z)8=MvJNp9It^(%o!cI?@w_+;(g`nZytQ36Q^W`>Hg6B!7dmdD4b^Ycz;5B8`#CTy9 zkylrdc*|Fh>Ey3?jJE^NqT9k~=tjKYgJsjOj{8#n=9U{SJKDlyM_Xgqi2@=5{ETQN zGB7Y~Jp9V5;^GX0urce*mDUKkp-%N|RYBV~|SIE!Tgw!eg(!_LKPRY{ulV zYNfm&Pdr^Jm8RUzo$%iHX>ZS-9ko`Tx^-xxEilp1QGLK^*|ov`A^O>!&(ZI1dWJH~ zJ%ANO`DFv48(?#8^VUbk!1z%=26rB&A0~R>$NZd|hofJ%;PWs5{As)LSyxA7+CmhZ z21X!h`EXL$(5F0*h6A<=;HIHF@EGqu96D?1im-WH0J;nTYYjw-x!@2&Qb`cNrN01D z0KI(q)scBGMJo+CNYdb7_m9yDSWARW777JbB$zVvSuh~wff52H_?D4ZT9aa!6$S># zxcg~J9y+8?h~S2{fc+yNp86Wr3E*MF1Watw=KqVK{di(vm<(Vc8G0WQ;GXAclYKk< z9pmu&fnmB)Tf#;^SvnY*@*U66{=1LR5A>jZvmd-&tqdYOaG0L@`k#mnK2LPuFugwT zIHh#j>yjlPtO}M6TC4)@iH_?O)NsyKUmS2Zkj@*SWvVunTcYZ2t zJ_K|dZ3ZnCo`v}Is6G{XPSlbdB7xh-u!{(7WThw2R?`AV3(rBz`4YsQJ&4uj+w62E z_VckZ5Zh0~-|QsZ?AL+YzzPO%)zIBA9df_&v?!okScRbVVm}6k0pFG$%-L}eDuC|{ z-GftuVb?|L$^r)1CkH?sI08?`vT!hH00eb7>F42w;Rm1^wPzhM-E3zEo~Fxfgv~?u z;6IjYQLAeKM92Z@-X|eT1h>^Ip!_=crUO@)J#eEIVx)6g7{!s1gZKsuuVYG=t3k7y zlX1{8gYE_`4wfwVtJeS?>O$0CH5V9MqoCDoh;B}{7C~!WgPPsm({%Y=&(J5L!3}Yy rplfI?epaJ<+YlHWB%y2h4S@dvIVPV2n-e|q00000NkvXXu0mjfhd~&I literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/snow0.png b/assets/sprites/weather/snow0.png new file mode 100644 index 0000000000000000000000000000000000000000..9085e518c0141efde642c37283648211eadd5e7e GIT binary patch literal 2380 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/snow2.png b/assets/sprites/weather/snow2.png new file mode 100644 index 0000000000000000000000000000000000000000..746ac466150eb490548d5ffaa032c94c6004e985 GIT binary patch literal 2421 zcmV-*35xcKP)x4mENtP{tn6}L^=szpVR2vMm57ez&_gb=8Jc%c>+4z#jInhdu0J4no|8h!UX z&JroB-}vloDgEAil`Iiu=82-+ebl~R> zEQKNj=!OBR3ec!qwxWn%trX4gJ#v5UD!T;_hX_7Ex6p({(6JJKD-?pTg~E3jS}4?i z5Q#;;Ay9!@t;!t|+mhTgalV()78KP?CJDCVRjp?8Ta#nyH@n8o%vCCIIFsRLDywKJ zn^gpET;y9A3C5Y9uV(a={_A)m`gEmi`Ya$KD*X)M`@Yl-T~!qYEX#Ql!IyeO`>^ZC z2g&yVg#blWuBnRnhv#`0>c!S?j~?Au3+W5Cx}8*j!f)bwq4t~oxzy+L%QXiP^?}Fn ziI}5wCWXwH>q>AO=VrgA>!9lj_!7W&oCROHKfC((i?2^lPkS76zt9yswoL&P2Ccb# z<#cW=eWqC0nDDFMK@cedKk0TGp9vBG>bkBZk`ZWG-aF-L{iUOavVY}tJB{dVn*t~_ zy@f*cAyv~ad!7_hN^ZOB1y&G1h-5mQRvp(V*DJNBADGNtT%ARFL2QzbKu}N8tI=3Q zlTrqeaFb*9M;H->5NfSj^?)Fo$RyAG_x;K-7JiU=0yi7==a%c^iUQY=FearJFb3NU z4xq_oQn4)SU6ZWGAKtgG5oQ;?0^YtZL;yq?m3pG-!M z7nZB+0!(mQik^YMGcNW86jndCi+-lJ|0)!cNZ~YcRxMt8CO8GB=j`>g;0aWS9=uoRMNLzkl~e?cqpVz3jQN zGcg&;x84n&BxsuEqk>IoJI5w+scW5unn5f8gBw(MITnkmzV8o3s_O?VspB}5Oh%GE z;frAwxTCCMoxmsO=jWpY^l7VU2c`x05ZbQbl287#moAaERwfW@J%7q&7ioqHX>pkp)ta+~MZDsJ|vPo4$uq@6sRIm(q_i8DgAW1>e9JCVj`KML( zu2ROXYMK_rfz4KZ{5b2=Y_v;g+i}5hT^LCxA(Ki3%3yEX3Vj6TZy4CJti0-{uXM}R z(*m#^FqF668m)s*7o)K#n~=XLhC&6@>P;w=Dp0PP&}`Wtr4P%cDl8UCAf*hfV~Z?8 z#^VN4o|%}yX1G>JgA_svr^4%t=2NkB^iOrOA^Tk8zayBC^nJL#SmY(F;JTX|Zc|ki zlJRJ8Xqp;KZ@GO#^boyB)KKeYV|r>ldtt4`Qe1D4PBl2URQ*FXn>tZ0RXtva9F!Rr zR22e>b6@N|Xxj>A=L^Sq=~-2@Y~3_nKva7L#m<|zY#ZKRDz#02 z0RL{g4M8dqg={7nCsT?e(bTyQm+LO?1zz#39%AV z+4L`?QSE58W`XNCQV7whuvUNl!Ba`7H(Rh=EC>ESXmAVS1aAWg#PR+6AeD#(TV;st zCGQX-kx20cNa-%Pp7+MYNc@K(-|Gs`=$oUC5-!cortcd&^i5yV*W)o`Kl`m?drUkS zj)m-`xN5BdwMH`_(r)jU+D)p#F*SJzk_iJi9@@4GONAAPMI#W4$H8+w@I3c?%rJgb zE7mXYhG}QBwx4|g9EhE+UD$ly+>eRqGoEcd>HF|8$Ccx(1jmukavU~8^xBbKAdw*8 zeZ4TG_s1Bzo(BgHjKwAnjH<5JuH!Wo<-%f7=9gFUhN1t(mGsk3e&m7kT|5r7HHL#I zASA%gh;Aa!J$F`l^^FtBxxdZ9V)F*3(`h(3afo7urF`e@x2u1C?KSTcr%$V=p7~;0 z)uXaeH+#}OkQ-G@%ke&R**EqAxJf znVH}Nr*&(CQj?w}qEmc^4WLYvsoC^S$Km;Zxl9@E#)TETb?06^N3hCKY*2Vx>VApZS{GyYK6F zyk2b^g$hHCFx|1h9aHC$e7M&qD2xk5i=KBw7vM8rclYmVP{$QadWwk7@VV0-9=Cl+ zx$8iy0u^7c7J6ud*;XNZ(<*;6+!3DBm+8{=PBBW4cpC^*hX4G>Oz1c9)QcWe!~G*AdFKA zB150rwk$Q)=>@icCU04`E#McOtN^o)z-wCPNVD7{nWzX#Z%-QLjL nJF8mTH-+899`>*YxE22c;3dUd20f~300000NkvXXu0mjfr(vWp literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/snow3.png b/assets/sprites/weather/snow3.png new file mode 100644 index 0000000000000000000000000000000000000000..c97cd2e63d2f36898082c232ebd1bd42cde0022f GIT binary patch literal 2373 zcmV-L3A*-)P)f*?o&S{u<2mu@#nce^t?mvhd{nREHRzx>ZR6DO1G&dl!YCF}mk zOlHsJ`(Mug`uz{UKK8MXee7c&|F>YR` zmk^cyCq6%4E4=q!qlAdXMMSgr9LCr4J>dd~s4&I^{a$YRpA;haGH3jp@B5E(#udgH zNJN_}{NIM6yyXGBezcIf-hXfMH`_{=VdGpZVU{t*iT`8@j403b?L+k%1I?O8aQw zi$_pOV4Q=ZDmPSx|1%83Ij7qB{mGM)RzjbX)$ODL6nYXjE7orhmGfU&Ua@?}m_G74 z5|KD66!VN23jzVY@83DE={o4T0#X2YzJE)K;OE!hzVgcS^mIr;_vxP4v26;#Bxo%x zH)hHQ3olnI8xy_{Aw-cP@{?Y-kwg#yn6B$eHkX2q8~(N4be=nTwDdPhx6_P;+ok|a zOz&2uc}msvcfwF`Ap{-U@&YRgAc&$+D5!qm*PVv-)Q2A`U+K>xgTOb*My z(u5FEB;4eh!x3hTan4n%*$e@plr82i|L6V2SrUGfdV*~>>MyJ~hZO~GFl1>V!iX{0 zW>5gl<#LMay6@WPK7M*~vXx{P+)4}J(KiO4%4X6TAwszm!bgm7uGqF6=8KsVDWSiT zWQ3t)@fQNonMMHBZMSzM`1OMx4)q%h_=%}gA1g7&D!nE8h82K`@Yk*_ zPD~yv|5(@buTsg@avVBG!ozL=Ng9e!rqh`mbKOS)U@oz8v0(*ZtU*bAyq?$J$mLS! zDl1KL0V239MbAi}j*EPOad()@`7rJ6zbciSl2tFKGbRZiP{d7|oZTgS0z?T?gwG6f zEgy8Ao<8N)iHXd)dMy%OgIx@=%9hg-<%9We%`erSPtxI<9Vr{+_wU}ePNy>JJ7FNY zjmfTj>b;;QLDMwJ6xJ4=e|D;zztP>O8N~uvbb$&lq|>GAP9mr zHMpA<;B`7+q>K|sj@utew&3_k3Q%=+L^lj0G5-e+B(bg=dI0Q5a_Alx=IgJpH4P4J z>1>xqsZc}OF<1k9y_+QnD-42goWYOECRO3lwm8*L(Kg`L)l$?T368=ZwGx!{)v1Tq zvFJ55O^f2dW~)BBo%Ct9;u6~P1Mq_YCJH$y=ChG9$lJ!DkI4KDgLPbYS(Sxry>bn- z02T)f<+axiI3V$gnKsFUA%#-m%_aNEbiw?iW4FYRd;IqW5fW0u&7~@BVMTxUazn>dRfSx} zj6RyCM(r&f-w-{5YGWwWbO^iiG;&7T?9Z;VwNa2Sav&7THJXK&KyXS6~y2` zIj`4htt;k-iZ9X#em(bP0|iK|V1BW3j<%jvMJqYB9ROqMprF`&@~-E>`ybR|(;vaV zyKa-uWfDt>U827xr}+T=Ps5T-CIzjQdwKPC^=pqk_E2rmh6o#mk**1m67r?OuS`=r z*|b~;d|z@= zLIk&hFno1tBJ;z9?{$SI49!tj30LRm3&#!~{jL=F?M&J@M1JdgArX(3BO$vfu4%Qv zYPBOG@o^X(G*(W21c4vL57RVYqF8{GX+jtT5QgDfX~X!DRdwcQVA>tl4l@^Eqwvx@ zgsYBCllOZX|x zDt6r~cDMx$k5i#r4ou9k*1|uK;HxckYi;y5YqI@{8<*fJJRqR-n<#_*^& z=CfOYK|Y&&cI4IAZ3C|1v;Dri=aqnnD&_KC;i*P&1AMa5!Bf4*_cSmu{o58!+8+Ly z26k?U-in3K?0HM*O?|5^yqKiNj^!cRK8BSJp57@X@NJ|OHz^2b!gx%@Xj3?=fubTz zCD*XMZvi$wP3G?<>9OwOUzV0I(@meSmw}0iuh@8@9payCAAiwk;6!q6ZwueW%*?%h rzLUbU9dw88Ceik7V(eod(2xHDh_MTb8gpZ200000NkvXXu0mjfj&XRyY7#j zojY@8&i`@#uXD}->|qak*ux(7@P7-omBbM7K6;EXgx!vd7g3o-R1uLs*mhCDHQIJO zE+Q%`M|^IsT6p)}dI=GW3y5ZS8^+J`UEu2`*(aLW{c ziRs-gH%_RU{&pA&E`*?an_gf=0R&ML3I){<{F+m@o_yr!G=|At)Pm}P2)Dvvfs6W5#98wgx$&jUm2qVT| zi$MW2m&+-x>%L>7`}oQI` zBqQ`C8y|sg9H1CKt;C6LtP>kjLZjwL!_b~xT5=!m*A@6M#3%;bH}d$vH}QvL7aSkc6OG^>7Lm@ z?YHw+{#R|`Qr$g=jK2_w_6!23ZmTtx;I|SqI5gj2z^A89e6++ED|eUZLn{Ci;jdp` znArc&f2!; zIuny^IqKb@NrI+nk}0euJpc66Wd3Gnp=J;ZV9^6AypT?ts+4kDq`H1UlKQ@nxm+qI zkv*GafmLPY>jXZru&`hv;Ah;H7nv69AjGZ^phWq(Yu8X)D--aw-lu<3ElwM{zAp%Z zH8r@M72vhoV5E%c!^i9oB};I8AO)y8JFFXqk(mFE14*pwh8_SroZNcAh57nDY|aFS zmUOmCqg1FNtr)BUzTV3cgcSxsxRJq+$|hCe(Xu$zP|-5r=G9U(K@uE=J!mB;>0i4R z-oT>Q&@?TI1EW@b^g8L&ZpJ0F=Lg^i0ZbHfP|Rl|WstXRggzqkHw@Nx-6d5Pu6N7T z(*jr=FqAjn+~vhtp2It>z{Gn9JpQ}|HAuU7>$_xpr zat@W61=YG0`9H402;~~8<4JH$RYBKPn4Bm8=PU}GebbZZPae$c%S-hiA3Icfe!Z1q z-m^1AW`h2l>$YoVToDem`4H~|vdG-)mJ7tOzjmEJ0tIU9=!K{H8%YL z{JY~e`CKNkgxDok*5tH5Kxf)4$z)Q{Y`T~3-l=@~vB!>9do75tei-SP5Gf&FD*W6u zwc`!Tg~0a(=e$#4t^E3frjp>a+OS-yMS=_y+&W4ybPe{E@{l$S;8c~9SH$4iY@VVv z2oc;4!tjl$iOdfYzSk9=&^JdNC0v`ED?D`I$Ty|HuV>Q6LGoMQ3yFBt9SPYfcd<>voB4~wlktWYRGd;mZr`WqRUYz{-; zRlfVXUp4;p+H2uzJZ;oR6Mcb*&dx?3I1ODJ41=nVPaxuVmRtBqx~3gr7&|c9FW9sr zS>uO_gI^7k$Vcazi%-Yow{{SEB4J!jj#0PZqxZ{*xoQh5w8n9_i7uV#n(lW$Hz?Fm zm|KhC#1HTJX+P;`R{%SsRmNN^#Bb9^Cy;ii=MNi3`w~uDjdE3QYD5>xiXB z8{g_wDfFA}QQL@0h?Q&OSwwu5&fWLN4osr)T?bzz!O2hQh<-cxV)rv6(712zvJqdF zs<4AVMOb3)(QJBuN6j4_0dJ1$&6Wd>12ME+pi1qD~B+w-`9 zsPvEc+*~#H;fM7CBIXwm&E7f;+w+fw3m~Gx7!&k=so{QJ2=5!5@w2Y$KE)YV7-t|6 zEw1qQ3`M!r1$g&JE^)p8-RL*lPM2X@*;&LaV~ojLW$P=NuD`+(Wt0?^U_bS%UpM11pRd>9SUykh)ca^E zn^gqcxX8;G3Hn)BXyo;*{)bfBe70V*BnikEQwHfmN-1{01K%VcfuO#?SIuNX z6G8-$aFcxwMwl_iIaiyFh7SmZbUt(O{X6wDB>XV>1lw%XpI@>MDGJWCh^4f;f3@W@d)c>2+rV zb?1Rguixe zVPgLy#b4{1{%uOxTDDDfBs`1)NK#+;GMP+enBzPJ0JD*miw!FPLk&t=$Lm@BFPTi@ zYQ&zp z@xo*zN4*!cNYFG*GKIB8*F7^;%-)DMYKE}@7Bo=d;b4_vu5b`QwJJ@AEuw zRSk}^0=k_J7zyL};bYc`XbX-Hr2tiDhjqg+BJqoM~~n6KT#_AGE{ zOJ}DvN{JfMj=?J6YrQN%G=0zWw=(!q+N3Hx*cPW8D%b|xzFdkHNP?rVhRp;eeROL6 zbRM$Y;}mGRWJuLLY(o8wTq*PDz!yYrS%< zYXK|_7|J{E?6X1QWix4#3CT?{6e*x-x1n6EL#<&!yVC_BBrH`Muvo5w5F)USEwTua zN*P3XW@?JHqrE~LCJ|C-D!jR9J(J9tf3vNY7;uk&MGzq&CEQ%B&=ywkyO$d(Q&kl* zDKmI9O%0Z}RK6j4jQI)EP;IL#zrL}g7 z`MRAUG86O{9j8+>!;EmK!-w!3kOk&mZ`y%yxT=c)C`!l@#fGNU4wM$IJlCH&kWN+* zy?w>3Uaht+n+Nl+&=LGv?#tE{AhLqFh4NY2dR7&!U|W_4jH&Ad#dzeMZWr#{t%jyQ zgn!3wlg*?eO9)+}KPRX20s5xHl2j@It(J4~-tEeFPMc9O#OG&WX9ayT=0zp<1K3Jgyi2()zMkhZHD8bM**jLCx(lmfm zR!&|Kf~V72irOHAcgyqrH>M_1zl``^Q+UF_!x1at%G_M;k;x-Jkph31N*V{qZ{4m> z#Dnfg$asotG+WSYwF4qy`EsiC<+>i2rV*IFZ975m>$i9M87HHp2s5FBX(k|6HA*Zi*YMJeI4t|tzW5?oh6$919A z?gS%80WWyBhgkf-5JDcDEEWzQoCt=r-fY4A!tGkb7-Blbh57eMCv0)St5ukT?FOlb;zo5MO#<|S=zvp4GeVgTSIS3yBXas-DFj2@eQLE#T z6Q4LWxi9;7*9SvN5cwo1OAYTw|GfI%+XsufQYzCH??<5S(&-H5j~#=1b9dY`XQtY{ zJZ;sbiGe^wXJP8-e*nl66HN5p$A?A~jkLs7iu;LoUTwP4v>P8YDED8I|V;Jjeq z=lpr3$jPtW#dNiebR`B!5tfT`(ZbVFyWo;l{6vQ_JtUW3z}j=bNPwjVo@jaayOxXZ zmMwgyx30hKLLDD>1isej;&lDW zg@G?WMgl7FvqF7PR&C**NpOl4)i%21GL;s7uD8ubpu!d+N<8jgQ5od&(nc>gjTErQ z7s)@#Psv~7x=r>y`YwQooR}e|Vg`v>Vmdxi-emuy8w4@(Kk`TNOY+ZfPDdoa?QOG3 zI?I%}Rf4OqM-Z-=0wwU-*>J-HMg_RdF7QwX!94|BA&G&94KqU~LSu|E#u#J3?&1H9 Wtrc_VDm7970000|-AvSm1UJMnvx$4-pCObeug)+6<9SMB?_cvl^{Zw&!t{ zNb8^R+1YaL+O=wdi1PD9$=)*R)E9Sz2@sKnh?2iA*8ERO8GKcsIOY5PLjr|{0znZu zLKFYBH0^vF;7><$i7WkW=VuSzGk%55g1bWm1<=bhArW-7M2$iq2qR>^OVC2m{dppl z_>n*j>h&5INbGR(o{Do_Mu$<<^LZQEepvIG&7T}QlzXM8-~3#)3di$#Zd2_WQ`@W{ zaN{h$kC3RJ`T1Jj%$mPXXOfRqD~@6Y5m6hY3#F7aEmPMu4Lr|(1wlzOVSF_3<$a_S zpb((x+ErZ>{|>|Of?I0+@#M*a^>}>2TDOw|(0C@U7wdmGJf8j9;!@p5M04nV6cJOD z%V&`Z3jztg@4r`Wm?oH}21)|7eSbm8;N>g-y7GIj!5Uif;Y=017yXyG3mZl@8$Z4&^+s<%+A z-LD(wn_(!0l#-uqd4d%=5F(k&<#a#rD{i&^*uBTbFZM@~^&mD$N5p6->A7SoVMr+> zPq@iG2OAg>g%EnZRttfkkjdNU-o9C#V&;d*CvdY~e{RX0&@{M;gefV*h%ne@umiPi zTk|~c9f!O}9yoZg5l0u=N(~UvI|ZN0q*G}rL$wpkM}!EWIgS%%^XU@_X}%Cggn@Vy zn;5s_pioR{oj|vv3mXP-nGM-pm^zIqd6vRdb&j7H?!uSZ98$QxKv{k z-~qQK=@|;V;$mAs;SEw<46?laPqAog8U0);on+<%_PFsPXLm6lgGhmr;r9lqE7mLL z+2`0gHkLkBDM!p3u#3T3*>D?j{80A0v$x7m#o=((6)CP~_wU@OKafc4Z-#;FE=+di ztoMQ!35H=P)UYYr{?z1n_G)*dW*7~?sDchpr&38>DYYv?-5_92ecvbBPS}d@i8u1b4Fl z+N~B?3G2j>c8i}9Gj+P27pK6N4J@W)N&UQ(Z z6E)%;gH<5bYOFxk!ypJp>HIit(lrrni*pVYZ3AvyF2xHZDM&iQW`c^}T9xn$<=ZvG zFd{#&*{qM7vpk(fCxveN0r)`xV>ui0*-Ru1wzg5oBT|3M!j|VP>MD1+m#=j-06Pvt zd+oIYE-1Q~OeI-`)TRiE1yFaJP%KxWQgfi$YJ-#tmdZ7_RV;&)GSZF_X@pFtEgpGh zauS>IULg&W2x%M&uitVWP34k*b)AMBaF2gQ@IX>2xPGg|TUgQWUTXN6uIpf@lhMmC z^k{j@&o?w4Vwgx;y6ZHiPfQdpthQN-Yjx7i2It^uWdF1RAslNsk7vdWT?f>KJ%GZI>7<+*<3AU;_k3J#2C z&2qVMF?m=1Sw4ba%Y1QN24XFkoiCo^t!G^`3a;Y>fT*wM6uUF;wcBv>-Ev3uhp_Li z*<|f>tO*^H=+DXde1Jdsuq2&MK%?QETfR~H=EDykE3da9f`bs!RUsBawvc-@nKVw; z>K+8XFNF}@46Fb42QMYTZMI;kREZebh;!=-!7>dvP{=|mX@TIZoUNh*k;!D)YlD=* zLJ)>8PL8Etis@dHdB(sLb%k(gb~bnSp`$-ml75g*S%=wf{dUNMN8K@#-4Iu+H=y2V zMuT*ouTB9Ai58}xqr^Vt>z8P<#Nz@0YEMKyA50vW^A&&hWPu!Ti)lVrjJb?v_JCJ+w*^0 ztoh!=0ow?rqK4~WZ<|cUru^~ausnOypPHI%_R=(}OA`Zu2c4OTE;wyCH|V0=qAv$T z3yqM-lk`TD=tF~Ez>2;64uhief}vh#&YWTIDK6ch)N+Ha^1fBcr51a&9Ewq+v#+zN|r#l%k?2(XBPql2ykDVjz=mTGuxeM&Pey<^87Z$SK~0A zacZ&}bTr{Rz2z&k8`<(vhn+ATfSVgW_|@Dp8@6zX-yTSyhlO*-t@ErK+TCB=L-|*TspjZ`)4n0al&+}*R^E=uEC|22$N8b)& zBKebl_m*!;utl<)A^ntJ{JpnqM?qZziR^NdN_-B%cFLdpo1br%*gHK8u8Uot2+p27eC literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/snow7.png b/assets/sprites/weather/snow7.png new file mode 100644 index 0000000000000000000000000000000000000000..97c4fd66d6a152c9bfa24d179ad115af073390f0 GIT binary patch literal 2345 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 P00000NkvXXu0mjfN>Xy5 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm0.png b/assets/sprites/weather/storm0.png new file mode 100644 index 0000000000000000000000000000000000000000..e1de8c0ea0d33bda81a2ab5b5b2156f8ba13506b GIT binary patch literal 3081 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 XD@=-rm>BPo00000NkvXXu0mjfe!$)v literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm1.png b/assets/sprites/weather/storm1.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd823a5cf73e393a371641178ab9a9d93dab718 GIT binary patch literal 3101 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm2.png b/assets/sprites/weather/storm2.png new file mode 100644 index 0000000000000000000000000000000000000000..768af6d4f9437711099f4bf30c283a50928c35e1 GIT binary patch literal 3134 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

a}#m!`Z3Gw~p!h9^?yc!qS1Q z^vqO_b~Yd^09vc^nV)gLX=3$5H`DhT6AOpnmI>hb#D@?eMl~?e2w@+9Lj$l3g}UC0 z?DXWtmxxc<@+e;hg*~Q&?pguc9^FbiTlW@C0PRA+EWrCd`#4r5ZbYW~EOOQBrz0Qs z&#Z=qpjIBnZ|yj)@M@5i_@%07*qoM6N<$f{V8qs{jB1 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm3.png b/assets/sprites/weather/storm3.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b5ba19eb8370ff56a7679c17af546267746c91 GIT binary patch literal 2497 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 Ef)i@?SO5S3 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm6.png b/assets/sprites/weather/storm6.png new file mode 100644 index 0000000000000000000000000000000000000000..8853bd345b9545ab885e2397014511f11354502c GIT binary patch literal 3086 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/storm7.png b/assets/sprites/weather/storm7.png new file mode 100644 index 0000000000000000000000000000000000000000..826b2691c9f1be28b6854883eede04e61fe02e23 GIT binary patch literal 3059 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 B3ikj2 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun0.png b/assets/sprites/weather/sun0.png new file mode 100644 index 0000000000000000000000000000000000000000..219a7c147bfe6602e1e08cfc69429cdd158730a9 GIT binary patch literal 3213 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun1.png b/assets/sprites/weather/sun1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3e12da3bfbcee90e021f10f13642048dfbdf06 GIT binary patch literal 4208 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun3.png b/assets/sprites/weather/sun3.png new file mode 100644 index 0000000000000000000000000000000000000000..089e051c455f4f8edf59740dda22dee875359f0f GIT binary patch literal 4210 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 IM6N<$g0wUE4FCWD literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun4.png b/assets/sprites/weather/sun4.png new file mode 100644 index 0000000000000000000000000000000000000000..0330b27e2e00b9412964d91ccd8a1991bfa4a1bf GIT binary patch literal 3789 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 DNE0{w literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun5.png b/assets/sprites/weather/sun5.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7d8acc9fb24d06fc217655046b16c84bd9ae6b GIT binary patch literal 4214 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 M07*qoM6N<$g58N082|tP literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun6.png b/assets/sprites/weather/sun6.png new file mode 100644 index 0000000000000000000000000000000000000000..abf5108334912c6d8df9fa3098a131812ae042d5 GIT binary patch literal 4035 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 literal 0 HcmV?d00001 diff --git a/assets/sprites/weather/sun7.png b/assets/sprites/weather/sun7.png new file mode 100644 index 0000000000000000000000000000000000000000..c7440c046f99b2ceac7db451e48a23a9045ffc4c GIT binary patch literal 4169 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 TCYVsG00000NkvXXu0mjfXPWLI literal 0 HcmV?d00001 diff --git a/base/core.yaml b/base/core.yaml new file mode 100644 index 0000000..0d09ba0 --- /dev/null +++ b/base/core.yaml @@ -0,0 +1,2932 @@ +############################################################################### +# Guition JC3636K718C (1.8" 360x360 ROUND KNOB, ESP32-S3) - core config +# Pins and init_sequence from the OFFICIAL manufacturer demo (JC3636K718_knob_EN), +# files pincfg.h + scr_st77916.h. This is the correct pinout for THIS board +# (different from the JC3636W518!). +# +# Always-on core: display (ST77916/QSPI) + touch (CST816) + knob + audio + voice assistant + +# LED ring + the clock home screen, control tiles and settings. Optional carousel screens +# (player, timer, games, weather, demo) live as packages in base/screens/ - see base/screens/README.md. +############################################################################### + +substitutions: + name: voice-knob + friendly_name: "Voice Knob" + # Clock timezone. HA does not push its zone to the device, so set yours here. Use a friendly IANA + # name (e.g. Europe/Warsaw, America/New_York) - core maps the common ones to the POSIX form the + # device needs (it has no IANA database). For a zone not in that table, paste its POSIX string + # instead (see https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv). DST automatic. + timezone: "Australia/Brisbane" + # For album art: base URL of your HA + the media_player entity (change if different) + ha_base_url: "http://ha.iosull.com" + player_entity: media_player.voice_knob_player + # On-device wake word. Built-in models: alexa, okay_nabu, hey_jarvis, hey_mycroft. + wake_word: "hey_jarvis" + # Entities for the home screen (toggle each in Settings -> Home). Change if different. + weather_entity: weather.home + room_temp_entity: sensor.room_temperature + room_hum_entity: sensor.room_humidity + climate_entity: climate.home # thermostat screen target (a climate.* entity) + # Control tiles (swipe up): 4 toggleable HA entities, each with an icon + a name. Any domain. + # tileN_icon = a name from the built-in set: bulb lamp led power plug switch fan ac heater + # thermometer lock unlock door blinds tv speaker bell wifi home flash. The same icon may + # repeat across tiles. (For an icon outside the set, paste its glyph or a \U000Fxxxx code.) + tile1_entity: light.desk_lamp + tile1_icon: "bulb" + tile1_name: "Lamp" + tile2_entity: switch.neon + tile2_icon: "flash" + tile2_name: "Neon" + tile3_entity: light.desk_lamp + tile3_icon: "power" + tile3_name: "Tile " + # Sensors screen (knob cycles): up to 6 read-only HA entities, one shown big at a time. + # Set as many glanceN_entity as you want (+ a name, optional icon name); leave the rest at + # their default (a non-existent entity) and they're skipped. + glance1_entity: sensor.power + glance1_name: "Power" + glance1_icon: "flash" + glance2_entity: sensor.va_glance_unused2 + glance2_name: "" + glance2_icon: "" + glance3_entity: sensor.va_glance_unused3 + glance3_name: "" + glance3_icon: "" + glance4_entity: sensor.va_glance_unused4 + glance4_name: "" + glance4_icon: "" + glance5_entity: sensor.va_glance_unused5 + glance5_name: "" + glance5_icon: "" + glance6_entity: sensor.va_glance_unused6 + glance6_name: "" + glance6_icon: "" + forecast_entity: sensor.va_weekly_forecast # weather screen forecast (HA helper, see base/screens/weather.ha-helper.yaml) + # Carousel screen order (left-to-right). Screens not included in the build are skipped. + screen_order: "clock,player,timer,cars,space,snake,knobuss,weather,thermostat,sensors,demo" + +esphome: + name: ${name} + friendly_name: ${friendly_name} + platformio_options: + board_build.flash_mode: dio + board_build.f_flash: 80000000L + board_build.f_cpu: 240000000L + on_boot: + - priority: 800 + then: + - lambda: |- + id(g_order_n) = 0; + id(g_set_n) = 0; + id(g_set_labels) = ""; + for (int i = 0; i < 16; i++) id(g_present)[i] = false; + id(g_present)[0] = true; // clock is always present + id(g_wgrp_n) = 0; id(g_wgrp_labels) = ""; id(g_wgrp_idx) = 0; + id(g_wopt_n) = 0; id(g_wcur_n) = 0; id(g_wopt_idx) = 0; + - priority: 790 + then: + - lambda: |- + // core settings list: label + the g_mode each opens. (Screen packages add their + // own entries under Widgets via the g_wgrp_* / g_wopt_* registry, not here.) + id(g_set_labels) += "Display"; id(g_set_items)[id(g_set_n)++] = 11; + id(g_set_labels) += "\nHome screen"; id(g_set_items)[id(g_set_n)++] = 12; + id(g_set_labels) += "\nWidgets"; id(g_set_items)[id(g_set_n)++] = 17; + id(g_set_labels) += "\nVoice Assistant"; id(g_set_items)[id(g_set_n)++] = 13; + - priority: 760 + then: + - lambda: |- + // Resolve a friendly icon name to its MDI glyph. Unknown -> use the value as-is. + auto ic = [](const std::string &s) -> std::string { + if (s == "bulb" || s == "light") return "\U000f0335"; + if (s == "lamp") return "\U000f06b5"; + if (s == "led" || s == "strip") return "\U000f07d6"; + if (s == "power") return "\U000f0425"; + if (s == "plug") return "\U000f06a5"; + if (s == "switch") return "\U000f0521"; + if (s == "fan") return "\U000f0210"; + if (s == "ac" || s == "aircon") return "\U000f001b"; + if (s == "heater" || s == "radiator") return "\U000f0438"; + if (s == "thermometer" || s == "temp") return "\U000f050f"; + if (s == "lock") return "\U000f033e"; + if (s == "unlock") return "\U000f033f"; + if (s == "door") return "\U000f081a"; + if (s == "blinds") return "\U000f00ac"; + if (s == "tv") return "\U000f0502"; + if (s == "speaker") return "\U000f04c3"; + if (s == "bell") return "\U000f009a"; + if (s == "wifi") return "\U000f05a9"; + if (s == "home") return "\U000f02dc"; + if (s == "flash") return "\U000f0241"; + if (s == "air" || s == "pm" || s == "airquality") return "\U000f0d44"; + if (s == "plant" || s == "sprout" || s == "moisture") return "\U000f0e66"; + if (s == "plex") return "\U000f06ba"; + if (s == "server") return "\U000f048b"; + if (s == "shield" || s == "alarm" || s == "security") return "\U000f068a"; + return s; + }; + id(g_tile1_glyph) = ic("${tile1_icon}"); + id(g_tile2_glyph) = ic("${tile2_icon}"); + id(g_tile3_glyph) = ic("${tile3_icon}"); + - priority: 595 + then: + - lambda: 'id(g_set_labels) += "\nSystem"; id(g_set_items)[id(g_set_n)++] = 15;' # always last + - priority: 600 + then: + - lambda: |- + // build the carousel order from ${screen_order}, skipping screens not in this build + std::string s = "${screen_order}"; + size_t pos = 0; + while (true) { + size_t comma = s.find(',', pos); + std::string tok = (comma == std::string::npos) ? s.substr(pos) : s.substr(pos, comma - pos); + while (!tok.empty() && tok.front() == ' ') tok.erase(tok.begin()); + while (!tok.empty() && tok.back() == ' ') tok.pop_back(); + int id = -1; + if (tok == "clock") id = 0; + else if (tok == "player") id = 1; + else if (tok == "timer") id = 2; + else if (tok == "cars") id = 3; + else if (tok == "space") id = 4; + else if (tok == "weather") id = 5; + else if (tok == "demo") id = 6; + else if (tok == "thermostat") id = 7; + else if (tok == "sensors") id = 8; + else if (tok == "snake") id = 9; + else if (tok == "gyruss" || tok == "knobuss") id = 10; + if (id >= 0 && id < 16 && id(g_present)[id]) id(g_order)[id(g_order_n)++] = id; + if (comma == std::string::npos) break; + pos = comma + 1; + } + if (id(g_order_n) == 0) id(g_order)[id(g_order_n)++] = 0; // safety: keep the clock + - priority: -50 + then: + - if: + condition: { lambda: 'return id(g_factory_reset);' } + then: + - delay: 2s # give the game packages' interval watchers time to clear their scores + - lambda: 'id(g_factory_reset) = false;' + - priority: -100 + then: + - lambda: |- + // The device has no IANA tz database, so the clock needs a POSIX TZ string. To keep the + // `timezone` substitution friendly, map common IANA names -> POSIX here and force the + // result into the environment ourselves (on some builds the homeassistant time platform + // never applies the zone and the clock sticks on UTC). An explicit POSIX string is used + // as-is; an IANA name not in the table falls back to whatever the time platform resolved. + // The 1s interval re-applies g_tz_posix so a runtime reset to UTC can't stick. + static const char* TZMAP[][2] = { + {"Europe/Warsaw","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/London","GMT0BST,M3.5.0/1,M10.5.0"}, + {"Europe/Berlin","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Paris","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Madrid","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Rome","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Amsterdam","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Brussels","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Vienna","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Prague","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Zurich","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Copenhagen","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Stockholm","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Oslo","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Budapest","CET-1CEST,M3.5.0,M10.5.0/3"}, + {"Europe/Lisbon","WET0WEST,M3.5.0/1,M10.5.0"}, + {"Europe/Athens","EET-2EEST,M3.5.0/3,M10.5.0/4"}, + {"Europe/Helsinki","EET-2EEST,M3.5.0/3,M10.5.0/4"}, + {"Europe/Bucharest","EET-2EEST,M3.5.0/3,M10.5.0/4"}, + {"Europe/Sofia","EET-2EEST,M3.5.0/3,M10.5.0/4"}, + {"Europe/Kyiv","EET-2EEST,M3.5.0/3,M10.5.0/4"}, + {"Europe/Moscow","MSK-3"}, + {"Europe/Istanbul","<+03>-3"}, + {"Europe/Dublin","IST-1GMT0,M10.5.0,M3.5.0/1"}, + {"America/New_York","EST5EDT,M3.2.0,M11.1.0"}, + {"America/Chicago","CST6CDT,M3.2.0,M11.1.0"}, + {"America/Denver","MST7MDT,M3.2.0,M11.1.0"}, + {"America/Los_Angeles","PST8PDT,M3.2.0,M11.1.0"}, + {"America/Phoenix","MST7"}, + {"America/Toronto","EST5EDT,M3.2.0,M11.1.0"}, + {"America/Sao_Paulo","<-03>3"}, + {"America/Mexico_City","CST6"}, + {"Asia/Tokyo","JST-9"}, + {"Asia/Shanghai","CST-8"}, + {"Asia/Hong_Kong","HKT-8"}, + {"Asia/Singapore","<+08>-8"}, + {"Asia/Dubai","<+04>-4"}, + {"Asia/Kolkata","IST-5:30"}, + {"Asia/Seoul","KST-9"}, + {"Asia/Jerusalem","IST-2IDT,M3.4.4/26,M10.5.0"}, + {"Australia/Sydney","AEST-10AEDT,M10.1.0,M4.1.0/3"}, + {"Australia/Perth","AWST-8"}, + {"Pacific/Auckland","NZST-12NZDT,M9.5.0,M4.1.0/3"}, + {"UTC","UTC0"}, + }; + std::string cfg = "${timezone}"; + std::string tz = cfg; + bool found = false; + for (auto &e : TZMAP) if (cfg == e[0]) { tz = e[1]; found = true; break; } + if (!found && cfg.find('/') != std::string::npos) { + const char* en = getenv("TZ"); if (en && en[0]) tz = en; // unknown IANA -> platform's resolved zone + } + id(g_tz_posix) = tz; + if (!tz.empty()) { setenv("TZ", tz.c_str(), 1); tzset(); } + - script.execute: night_apply # brightness per g_bright / night mode + - script.execute: disp_apply # show/hide weather + temp/humidity per settings + - script.execute: settings_build # push the dynamic settings list into the roller + - lambda: 'id(g_wf_present)[0] = true; id(g_wf_name)[0] = "Classic";' # register the built-in Classic watchface (id 0) + - lvgl.label.update: { id: tile1_ic, text: !lambda 'return id(g_tile1_glyph);' } # tiles get their icon glyph now (set at priority 760) + - lvgl.label.update: { id: tile2_ic, text: !lambda 'return id(g_tile2_glyph);' } + - lvgl.label.update: { id: tile3_ic, text: !lambda 'return id(g_tile3_glyph);' } + # Watchface finalize - runs after every face package has registered (priority < 650). + # If the saved face isn't present (its file was removed), fall back to Classic, then build + # the Home settings roller line. The face itself is shown at the end of the boot splash. + - priority: 500 + then: + - lambda: 'if (id(g_watchface) < 0 || id(g_watchface) >= 8 || !id(g_wf_present)[id(g_watchface)]) id(g_watchface) = 0;' + - script.execute: home_roller_build + +esp32: + board: esp32-s3-devkitc-1 + flash_size: 16MB # 16 MB flash + partitions: partitions.csv # MAX app partitions (~7.9 MB/slot) - see partitions.csv. Requires USB flashing! + framework: + type: esp-idf + sdkconfig_options: + CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y" + CONFIG_ESP32S3_DATA_CACHE_64KB: "y" + CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y" + CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y + CONFIG_SPIRAM_RODATA: y + +psram: + mode: octal + speed: 80MHz + +logger: + level: INFO # less logging = less overhead (DEBUG was very noisy, esp. during VA) + +api: + +ota: + - platform: esphome + +# OTA rollback safety. On esp-idf the bootloader rolls back to the PREVIOUS firmware if the device +# resets before the boot is marked "good" (default 1 min). That is why a quick "Restart" from the +# menu right after flashing booted the OLD build again. We shorten that window AND mark the boot good +# as soon as the splash finishes (see the boot interval -> safe_mode.mark_successful). +safe_mode: + boot_is_good_after: 30s + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + ap: + ssid: "${friendly_name} Setup" + +captive_portal: + +time: + - platform: homeassistant + id: ha_time + # The homeassistant time platform syncs the epoch from HA but NOT the timezone, so + # without this the clock falls back to the compile host's zone (often UTC). Set your + # IANA zone in the `timezone` substitution (top of file / thin config). DST is handled. + timezone: "${timezone}" + +############################################################################### +# AUDIO - DAC PCM5100A (out) + microphone + voice assistant (HA Assist) +# DAC: BCK=3 WS=45 DO=42 (no MCK) MUTE=46 (LOW=mute -> we hold HIGH) +# MIC: data(SD)=4 clk(SCK)=5 -> configured as PDM +############################################################################### +switch: + - platform: gpio + pin: GPIO0 + name: "DAC unmute" + id: dac_unmute + restore_mode: ALWAYS_ON # HIGH = not muted + +i2s_audio: + - id: i2s_out # DAC PCM5100A + i2s_bclk_pin: GPIO39 + i2s_lrclk_pin: GPIO40 + - id: i2s_in # PDM microphone: clock=GPIO5 + i2s_lrclk_pin: GPIO45 + +speaker: + # Raw I2S output to the DAC + - platform: i2s_audio + id: i2s_speaker_raw + i2s_audio_id: i2s_out + i2s_dout_pin: GPIO41 + dac_type: external + channel: stereo + # Mixer: combines the music channel and the announcement (TTS) channel on one speaker + - platform: mixer + id: mixing_speaker + output_speaker: i2s_speaker_raw + source_speakers: + - id: announcement_mixing_input + - id: media_mixing_input + # Resamplers (match source sample rates to the mixer) + - platform: resampler + id: media_resampling_speaker + output_speaker: media_mixing_input + - platform: resampler + id: announcement_resampling_speaker + output_speaker: announcement_mixing_input + +# Player visible in HA / Music Assistant (album art etc.) +media_player: + - platform: speaker + name: "Player" + id: media_player_speaker + announcement_pipeline: + speaker: announcement_resampling_speaker + media_pipeline: + speaker: media_resampling_speaker + files: + - id: wake_sound + file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sounds/wake.wav # beep after the wake word + - id: alarm_sound + file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sounds/alarm.wav # timer alarm (generated with make_sounds.py) + +microphone: + - platform: i2s_audio + id: i2s_microphone + i2s_audio_id: i2s_in + i2s_din_pin: GPIO46 + adc_type: external + pdm: true + sample_rate: 16000 + bits_per_sample: 16bit + +voice_assistant: + id: va + microphone: i2s_microphone + speaker: announcement_resampling_speaker # TTS via the announcement channel (ducks the music) + noise_suppression_level: 2 + auto_gain: 31dBFS + volume_multiplier: 2.0 + # Wake word works only when connected to HA (Assist pipeline) + on_client_connected: + - micro_wake_word.start: + on_client_disconnected: + - micro_wake_word.stop: + on_listening: + - lambda: |- + id(g_va_active) = true; + id(g_tts_played) = false; + id(g_va_phase) = 1; + - mixer_speaker.apply_ducking: + id: media_mixing_input + decibel_reduction: 20 + duration: 0.2s + - lvgl.label.update: { id: va_text, text: "Listening..." } + - script.execute: va_show + on_stt_end: + - lambda: 'id(g_va_phase) = 2;' + - lvgl.label.update: { id: va_text, text: "Thinking..." } + on_tts_start: + - lambda: |- + id(g_tts_played) = true; + id(g_va_phase) = 3; + - lvgl.label.update: { id: va_text, text: "Speaking..." } + # TTS actually stopped -> clear the flag, hide the overlay, restore music volume + on_tts_stream_end: + - lambda: 'id(g_va_active) = false;' + - script.execute: va_hide + - mixer_speaker.apply_ducking: + id: media_mixing_input + decibel_reduction: 0 + duration: 0.5s + on_end: + # Cleanup only when there was NO TTS (command without a response); otherwise on_tts_stream_end handles it + - if: + condition: + lambda: 'return !id(g_tts_played);' + then: + - lambda: 'id(g_va_active) = false;' + - script.execute: va_hide + - mixer_speaker.apply_ducking: + id: media_mixing_input + decibel_reduction: 0 + duration: 0.3s + - micro_wake_word.start: # resume listening for the wake word + on_error: + - lambda: 'id(g_va_active) = false;' + - script.execute: va_hide + - mixer_speaker.apply_ducking: + id: media_mixing_input + decibel_reduction: 0 + duration: 0.3s + - micro_wake_word.start: + # --- Timers set by VOICE (HA counts down, the puck shows the same screen as the knob timer) --- + on_timer_started: + - lambda: |- + id(g_timer_secs) = (int) timer.seconds_left; + id(g_timer_total) = (int) timer.seconds_left; + id(g_timer_active) = true; + id(g_timer_paused) = false; + id(g_timer_local) = false; // HA counts down and will call finished; locally just smooth display + - script.execute: timer_render + on_timer_updated: + - lambda: |- + id(g_timer_secs) = (int) timer.seconds_left; + if (timer.is_active) { id(g_timer_active) = true; id(g_timer_paused) = false; } + - script.execute: timer_render + on_timer_finished: + - script.execute: alarm_start + on_timer_cancelled: + - lambda: 'id(g_timer_active) = false; id(g_timer_paused) = false; id(g_timer_secs) = 0;' + - script.execute: timer_render + +############################################################################### +# WAKE WORD on-device (built-in micro_wake_word, no external component; model = ${wake_word}) +############################################################################### +micro_wake_word: + microphone: i2s_microphone + vad: + models: + - model: ${wake_word} + on_wake_word_detected: + - lambda: |- + id(g_va_active) = true; + id(g_va_phase) = 1; + - mixer_speaker.apply_ducking: + id: media_mixing_input + decibel_reduction: 20 + duration: 0.15s + - lvgl.label.update: { id: va_text, text: "Yes?" } + - script.execute: va_show + - if: + condition: { lambda: 'return id(g_beep_ww);' } + then: + - media_player.speaker.play_on_device_media_file: + id: media_player_speaker + media_file: wake_sound + announcement: true + - voice_assistant.start: + + +# Variables for swipe gestures: dx/dy relative to touch start (x_org/y_org) +globals: + - id: g_va_active + type: bool + restore_value: no + initial_value: 'false' + - id: g_tts_played + type: bool + restore_value: no + initial_value: 'false' + - id: g_x0 + type: int + restore_value: no + initial_value: '0' + - id: g_y0 + type: int + restore_value: no + initial_value: '0' + - id: g_t0 + type: uint32_t + restore_value: no + initial_value: '0' + - id: g_dx + type: int + restore_value: no + initial_value: '0' + - id: g_dy + type: int + restore_value: no + initial_value: '0' + # --- UI mode system --- 0=normal 1=menu 2=timer_set 3=timer_run 4=alarm + - id: g_mode + type: int + restore_value: no + initial_value: '0' + - id: g_mode0 # snapshot of the mode at gesture time (routing), so one gesture doesn't cascade + type: int + restore_value: no + initial_value: '0' + - id: g_gesture # 0=tap 1=hold 2=left 3=right 4=up 5=down -1=ignore + type: int + restore_value: no + initial_value: '0' + - id: g_vol_shown # true = volume overlay on top (tap hides it and consumes the click) + type: bool + restore_value: no + initial_value: 'false' + - id: g_cur_page # current page: 0=base 1=page_mode 2=page_settings 3=page_controls + type: int + restore_value: no + initial_value: '0' + - id: g_exit_anim # one-shot direction of the mode-exit animation: 0=right, 1=down + type: int + restore_value: no + initial_value: '0' + - id: g_show_weather # Display: show weather on the home screen (persistent) + type: bool + restore_value: yes + initial_value: 'true' + - id: g_show_climate # Display: show room temperature+humidity (persistent) + type: bool + restore_value: yes + initial_value: 'true' + - id: g_watchface # Home watchface: 0 = Classic, 1 = Neon (persistent) + type: int + restore_value: yes + initial_value: '0' + - id: g_wf_prev # watchface picker: face to restore if the user cancels + type: int + restore_value: no + initial_value: '0' + - id: g_wf_pick # watchface picker: face currently being previewed + type: int + restore_value: no + initial_value: '0' + - id: g_wf_present # registry: which watchface ids exist (0=Classic in core; others self-register) + type: bool[8] + restore_value: no + - id: g_wf_name # registry: display name per watchface id + type: std::string[8] + restore_value: no + - id: g_wf_req # request flag: a non-Classic face self-shows its page when this is set + type: bool + restore_value: no + initial_value: 'false' + - id: g_home_last_min # Classic clock: last drawn minute (perf - redraw the clock only on change) + type: int + restore_value: no + initial_value: '-1' + - id: g_home_upd_min + type: bool + restore_value: no + initial_value: 'false' + - id: g_nf_glyph # current weather MDI glyph (set when the weather state changes; reused by the Neon face) + type: std::string + restore_value: no + initial_value: '""' + - id: g_nf_cond # current weather condition, friendly UPPERCASE (Neon face) + type: std::string + restore_value: no + initial_value: '""' + - id: g_night # Night mode: screen dimming (persistent) + type: bool + restore_value: yes + initial_value: 'false' + - id: g_disp_idx # selection in the Display submenu (roller) + type: int + restore_value: no + initial_value: '0' + - id: g_base # current carousel screen id (fixed: 0=clock 1=player 2=timer 3=cars 4=space 5=weather 6=demo) + type: int + restore_value: no + initial_value: '0' + - id: g_timer_active # timer has an active session (running or paused) - regardless of screen + type: bool + restore_value: no + initial_value: 'false' + - id: g_timer_paused + type: bool + restore_value: no + initial_value: 'false' + - id: g_timer_total # total timer time (s) - for the progress ring + type: int + restore_value: no + initial_value: '300' + - id: g_set_min # default timer minutes (after restart); the knob changes it + type: int + restore_value: no + initial_value: '60' + - id: g_timer_secs # remaining seconds (display + local countdown) + type: int + restore_value: no + initial_value: '0' + - id: g_timer_local # true = knob timer (we count down locally); false = from VA (HA counts down) + type: bool + restore_value: no + initial_value: 'false' + - id: g_alarm_cnt + type: int + restore_value: no + initial_value: '0' + - id: g_alarm_pulse # alarm screen: toggles each tick for the pulsing bell/scrim + type: bool + restore_value: no + initial_value: 'false' + - id: g_bright # screen brightness in % (settings) + type: int + restore_value: no + initial_value: '100' + - id: g_batt # battery level in % (-1 = no reading yet -> show "-") + type: int + restore_value: no + initial_value: '-1' + - id: g_charging # true = charging/on USB (voltage heuristic - no STAT pin on GPIO) + type: bool + restore_value: no + initial_value: 'false' + - id: g_v_med # last median VCC_OUT voltage (to detect rising = charging) + type: float + restore_value: no + initial_value: '0.0' + - id: g_chg_anim # frame of the battery "filling" animation while charging (0..4) + type: int + restore_value: no + initial_value: '0' + - id: g_night_from + type: int + restore_value: yes + initial_value: '22' + - id: g_night_to + type: int + restore_value: yes + initial_value: '7' + - id: g_blank_idx + type: int + restore_value: yes + initial_value: '0' + - id: g_idle_ticks + type: int + restore_value: no + initial_value: '0' + - id: g_disp_off + type: bool + restore_value: no + initial_value: 'false' + - id: g_want_off + type: bool + restore_value: no + initial_value: 'false' + - id: g_wake_consume + type: bool + restore_value: no + initial_value: 'false' + - id: g_sub_idx # selection inside a settings submenu (Home/Assistant/Ring/System/Demo/Weather) + type: int + restore_value: no + initial_value: '0' + - id: g_beep_ww # beep on wake word detection (Sound category) + type: bool + restore_value: yes + initial_value: 'true' + - id: g_hold_talk # press-and-hold the screen to start the assistant + type: bool + restore_value: yes + initial_value: 'true' + - id: g_tz_posix # resolved POSIX timezone captured at boot (to re-apply if runtime resets it to UTC) + type: std::string + restore_value: no + - id: g_set_idx # selected item in the settings list (roller) + type: int + restore_value: no + initial_value: '0' + - id: g_ww_on # wake word enabled + type: bool + restore_value: no + initial_value: 'true' + - id: g_va_phase # assistant phase for the ring: 1=listening 2=thinking 3=speaking + type: int + restore_value: no + initial_value: '0' + - id: g_vol # last volume from HA (0..1) - for the ring volume bar + type: float + restore_value: no + initial_value: '0.0' + - id: g_vol_show # true = show volume on the ring (briefly, ~2 s after turning) + type: bool + restore_value: no + initial_value: 'false' + + # --- Modular carousel contract: shared globals so the core never names a screen's symbols --- + - id: g_order + type: int[16] + restore_value: no + - id: g_order_n + type: int + restore_value: no + initial_value: '0' + - id: g_nav_req + type: bool + restore_value: no + initial_value: 'false' + - id: g_nav_anim + type: int + restore_value: no + initial_value: '1' + - id: g_knob_capture + type: bool + restore_value: no + initial_value: 'false' + - id: g_knob_delta + type: int + restore_value: no + initial_value: '0' + # --- Dynamic settings registry: each screen package can add its own entries --- + - id: g_set_items # g_mode each settings row opens + type: int[12] + restore_value: no + - id: g_set_n + type: int + restore_value: no + initial_value: '0' + - id: g_set_labels # newline-joined roller labels, applied at boot + type: std::string + restore_value: no + - id: g_present # which screens registered (by base id); carousel is built from screen_order + type: bool[16] + restore_value: no + - id: g_tap_seq # bumped on every normal-mode tap; screens watch it to react (shared infra) + type: int + restore_value: no + initial_value: '0' + - id: g_boot # boot splash active (gates input until it hands off to the clock) + type: bool + restore_value: no + initial_value: 'true' + - id: g_boot_t # boot splash tick counter + type: int + restore_value: no + initial_value: '0' + - id: g_tile1_glyph + type: std::string + restore_value: no + - id: g_tile2_glyph + type: std::string + restore_value: no + - id: g_tile3_glyph + type: std::string + restore_value: no + - id: g_wgrp_labels # Widgets submenu: group names, appended by each screen package at boot + type: std::string + restore_value: no + - id: g_wopt_n # generic per-screen settings registry (filled by screen packages at boot) + type: int + restore_value: no + initial_value: '0' + - id: g_wopt_group # which Widgets group each option belongs to + type: int[16] + restore_value: no + - id: g_wopt_label # option label + type: std::string[16] + restore_value: no + - id: g_wopt_kind # 0 = toggle, 1 = action (confirm) + type: int[16] + restore_value: no + - id: g_wopt_ptr # &bool for toggles / &flag for actions + type: "std::array" + restore_value: no + - id: g_wopt_idx # selection within the current group's options + type: int + restore_value: no + initial_value: '0' + - id: g_wcur_opts # registry indices of the current group's options + type: int[16] + restore_value: no + - id: g_wcur_n + type: int + restore_value: no + initial_value: '0' + - id: g_wcur_name # current group name (header) + type: std::string + restore_value: no + - id: g_factory_reset # one-shot (persists a reboot); game packages clear their scores when set + type: bool + restore_value: yes + initial_value: 'false' + - id: g_wgrp_n + type: int + restore_value: no + initial_value: '0' + - id: g_wgrp_idx + type: int + restore_value: no + initial_value: '0' + +# Shows the volume arc for ~2 s while turning the knob, then hides it (mode: restart) +script: + # Carousel router: show the screen for g_base. Core pages directly; optional screens + # (cars/space) show themselves via g_nav_req. g_nav_anim: 0=left 1=right 2=top 3=bottom. + - id: show_base + then: + # Home base: Classic is core's page_home (directional); other faces self-show via g_wf_req. + - if: { condition: { lambda: 'return id(g_base)==0 && id(g_watchface)==0 && id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_home, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==0 && id(g_watchface)==0 && id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_home, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==0 && id(g_watchface)==0 && id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_home, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==0 && id(g_watchface)==0 && id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_home, animation: move_bottom, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==0 && id(g_watchface)!=0;' }, then: [ lambda: 'id(g_wf_req) = true;' ] } + - if: { condition: { lambda: 'return id(g_base)==1;' }, then: [ lambda: 'id(g_nav_req) = true;' ] } + - if: { condition: { lambda: 'return id(g_base)==2 && id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_timer, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==2 && id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_timer, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==2 && id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_timer, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base)==2 && id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_timer, animation: move_bottom, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_base) >= 3;' }, then: [ lambda: 'id(g_nav_req) = true;' ] } + # Apply the dynamically-built settings list to the roller (called once at boot). + - id: settings_build + then: + - lambda: 'lv_roller_set_options(id(settings_roller)->obj, id(g_set_labels).c_str(), LV_ROLLER_MODE_NORMAL);' + - lambda: 'lv_roller_set_options(id(wid_roller)->obj, id(g_wgrp_labels).c_str(), LV_ROLLER_MODE_NORMAL);' + # Home watchface: make the active face the current home view. Classic (id 0) is core's + # page_home; other faces self-show their own page when g_wf_req is set. Each face owns its + # own weather/room visibility (classic via disp_apply; others gate themselves). + - id: face_apply + then: + - if: + condition: { lambda: 'return id(g_watchface) == 0;' } + then: + - lambda: 'id(g_wf_req) = false;' # Classic shows directly - clear any pending request + - lvgl.page.show: { id: page_home, animation: fade_in, time: 250ms } + - script.execute: disp_apply + else: + - lambda: 'id(g_wf_req) = true;' + # Rebuild the Home settings roller so its 3rd line shows the current watchface name. + - id: home_roller_build + then: + - lambda: |- + int wf = id(g_watchface); if (wf < 0 || wf >= 8 || !id(g_wf_present)[wf]) wf = 0; + std::string opts = std::string("Show weather\nShow climate\nWatchface: ") + id(g_wf_name)[wf]; + lv_roller_set_options(id(home_roller)->obj, opts.c_str(), LV_ROLLER_MODE_NORMAL); + # Watchface picker (mode 33): update + show the overlay hint with the previewed face name. + - id: facepick_render + then: + - lvgl.label.update: + id: pick_name + text: !lambda |- + int wf = id(g_wf_pick); if (wf < 0 || wf >= 8) wf = 0; + std::string s = id(g_wf_name)[wf]; + for (auto &c : s) { if (c >= 'a' && c <= 'z') c -= 32; } + return s; + - lvgl.widget.show: pick_bar + # Draws the battery indicator on the home screen. Charging: lightning bolt + green + + # "filling" animation (icon cycles empty→full). On battery: static level icon. + - id: batt_render + then: + - lvgl.label.update: + id: lbl_batt + text: !lambda |- + int p = id(g_batt); + if (p < 0) return std::string(""); // no reading yet (after boot) - empty instead of tofu (montserrat has no "-") + if (id(g_charging)) { // charging: lightning bolt + animation, WITHOUT % (voltage reads high) + const char* fr[5] = {"","","","",""}; + return std::string("") + fr[id(g_chg_anim) % 5]; + } + std::string ic = p > 87 ? "" : p > 62 ? "" : p > 37 ? "" : p > 12 ? "" : ""; + char bf[12]; snprintf(bf, sizeof(bf), " %d%%", p); + return ic + bf; + - if: + condition: + lambda: 'return id(g_charging);' + then: + - lvgl.label.update: { id: lbl_batt, text_color: 0x35c759 } + else: + - lvgl.label.update: { id: lbl_batt, text_color: 0x6f9a92 } + - id: flash_volume + mode: restart + then: + - lvgl.widget.show: vol_dim + - lvgl.widget.show: vol_arc + - lvgl.widget.show: vol_label + - lambda: 'id(g_vol_shown) = true;' + - delay: 2000ms + - lvgl.widget.hide: vol_dim + - lvgl.widget.hide: vol_arc + - lvgl.widget.hide: vol_label + - lambda: 'id(g_vol_shown) = false;' + # Immediately hides the volume overlay (after tapping it) - consumes the click + - id: vol_hide_now + then: + - script.stop: flash_volume + - lvgl.widget.hide: vol_dim + - lvgl.widget.hide: vol_arc + - lvgl.widget.hide: vol_label + - lambda: 'id(g_vol_shown) = false;' + # Assistant overlay (dim + frame + text) - always on top + - id: va_show + then: + - lvgl.widget.show: va_dim + - lvgl.widget.show: va_frame + - lvgl.widget.show: va_text + - id: va_hide + then: + - lvgl.widget.hide: va_dim + - lvgl.widget.hide: va_frame + - lvgl.widget.hide: va_text + # Draws the menu/timer/alarm overlay per g_mode (hidden in normal mode and during VA) + - id: ui_render + then: + # === A: animated transitions: BASE(0) / page_mode(menu,timer,alarm,sub) / page_settings(5) / page_controls(10) === + # g_cur_page: 0=base 1=page_mode 2=page_settings 3=page_controls. Animation only when the page changes. + - if: + condition: + lambda: 'int w=(id(g_mode)==0||id(g_mode)==33)?0:(id(g_mode)==5)?2:(id(g_mode)==10)?3:1; return w != id(g_cur_page);' + then: + - if: # -> BASE (also the watchface picker, mode 33): return per g_base; direction per g_exit_anim + condition: { lambda: 'return id(g_mode) == 0 || id(g_mode) == 33;' } + then: + - lambda: |- + // g_exit_anim 0=right 1=down 2=up -> g_nav_anim 1=right 3=bottom 2=top + id(g_nav_anim) = (id(g_exit_anim)==1) ? 3 : (id(g_exit_anim)==2) ? 2 : 1; + id(g_exit_anim) = 0; + - script.execute: show_base + - if: # -> SETTINGS (list): from base "from top" (swipe ↓), from a sub-screen "back" (to the right) + condition: { lambda: 'return id(g_mode) == 5;' } + then: + - if: + condition: { lambda: 'return id(g_cur_page) == 0;' } + then: [lvgl.page.show: { id: page_settings, animation: move_bottom, time: 250ms }] + else: [lvgl.page.show: { id: page_settings, animation: move_right, time: 250ms }] + - if: # -> CONTROLS (tiles, swipe ↑ from base = "from bottom") + condition: { lambda: 'return id(g_mode) == 10;' } + then: [lvgl.page.show: { id: page_controls, animation: move_top, time: 250ms }] + - if: # -> MODE: from settings "deeper" (to the left), menu from base "from bottom", rest fade + condition: { lambda: 'return id(g_mode) != 0 && id(g_mode) != 5 && id(g_mode) != 10 && id(g_mode) != 33;' } + then: + - if: + condition: { lambda: 'return id(g_cur_page) == 2;' } + then: [lvgl.page.show: { id: page_mode, animation: move_left, time: 250ms }] + else: + - if: + condition: { lambda: 'return id(g_mode) == 1;' } + then: [lvgl.page.show: { id: page_mode, animation: move_top, time: 250ms }] + else: [lvgl.page.show: { id: page_mode, animation: fade_in, time: 250ms }] + - lambda: 'id(g_cur_page) = (id(g_mode)==0||id(g_mode)==33)?0:(id(g_mode)==5)?2:(id(g_mode)==10)?3:1;' + - if: + condition: + lambda: 'return id(g_mode) == 0 || id(g_mode) == 33 || id(g_va_active);' + then: + - lvgl.widget.hide: ui_dim + - lvgl.widget.hide: ui_head_bg + - lvgl.widget.hide: ui_head + - lvgl.widget.hide: ui_big + - lvgl.widget.hide: ui_sub + - lvgl.widget.hide: ui_bar + - lvgl.widget.hide: disp_roller + - lvgl.widget.hide: disp_lbl + - lvgl.widget.hide: disp_switch + - lvgl.widget.hide: asys_roller + - lvgl.widget.hide: sys_roller + - lvgl.widget.hide: home_roller + - lvgl.widget.hide: wid_roller + - lvgl.widget.hide: wopt_roller + else: + - lvgl.widget.show: ui_dim + - lvgl.widget.show: ui_head_bg + - lvgl.widget.show: ui_head + - if: # subtext ONLY on Info (IP/version) - the rest without instructions + condition: { lambda: 'return id(g_mode) == 7 || id(g_mode) == 23 || id(g_mode) == 31 || id(g_mode) == 9 || id(g_mode) == 22;' } + then: [lvgl.widget.show: ui_sub] + else: [lvgl.widget.hide: ui_sub] + - if: # settings-list roller (5) - lives on page_settings (always visible there); here only the selection + condition: { lambda: 'return id(g_mode) == 5;' } + then: + - lvgl.roller.update: + id: settings_roller + animated: true + selected_index: !lambda 'return id(g_set_idx);' + - if: # bar only for brightness (6) + condition: { lambda: 'return id(g_mode) == 6;' } + then: + - lvgl.widget.show: ui_bar + - lvgl.bar.update: + id: ui_bar + value: !lambda 'return id(g_bright);' + else: + - lvgl.widget.hide: ui_bar + - if: # Display submenu (11): roller + (% for Brightness / switch for toggles) + condition: { lambda: 'return id(g_mode) == 11;' } + then: + - lvgl.widget.show: disp_roller + - lvgl.roller.update: + id: disp_roller + animated: true + selected_index: !lambda 'return id(g_disp_idx);' + - if: # Brightness (0) -> show %, hide switch + condition: { lambda: 'return id(g_disp_idx) == 0;' } + then: + - lvgl.widget.show: disp_lbl + - lvgl.widget.hide: disp_switch + - lvgl.label.update: + id: disp_lbl + text: !lambda 'char b[10]; snprintf(b, sizeof(b), "%d%%", id(g_bright)); return std::string(b);' + else: + - lvgl.widget.hide: disp_lbl + - if: + condition: { lambda: 'return id(g_disp_idx) == 1;' } + then: + - lvgl.widget.show: disp_switch + - lvgl.widget.update: { id: disp_switch, state: { checked: !lambda 'return id(g_night);' } } + else: + - lvgl.widget.hide: disp_switch + else: + - lvgl.widget.hide: disp_roller + - lvgl.widget.hide: disp_lbl + - lvgl.widget.hide: disp_switch + - if: # Home (12): home-screen widget toggles (weather / climate) + condition: { lambda: 'return id(g_mode) == 12;' } + then: + - lvgl.widget.show: home_roller + - lvgl.roller.update: { id: home_roller, animated: true, selected_index: !lambda 'return id(g_sub_idx);' } + - if: # items 0/1 are toggles; item 2 (Watchface) is a tap-to-cycle, no switch + condition: { lambda: 'return id(g_sub_idx) <= 1;' } + then: + - lvgl.widget.show: disp_switch + - lvgl.widget.update: { id: disp_switch, state: { checked: !lambda 'return id(g_sub_idx) == 0 ? id(g_show_weather) : id(g_show_climate);' } } + else: [ lvgl.widget.hide: disp_switch ] + else: [ lvgl.widget.hide: home_roller ] + - if: # Widgets (17): list of per-screen groups (Demo / Games / Weather) + condition: { lambda: 'return id(g_mode) == 17;' } + then: + - lvgl.widget.show: wid_roller + - lvgl.roller.update: { id: wid_roller, animated: true, selected_index: !lambda 'return id(g_wgrp_idx);' } + else: [ lvgl.widget.hide: wid_roller ] + - if: # Widget options (30): generic per-screen options for the selected group + condition: { lambda: 'return id(g_mode) == 30;' } + then: + - lvgl.widget.show: wopt_roller + - lvgl.roller.update: { id: wopt_roller, animated: true, selected_index: !lambda 'return id(g_wopt_idx);' } + - if: + condition: { lambda: 'return id(g_wcur_n) > 0 && id(g_wopt_kind)[id(g_wcur_opts)[id(g_wopt_idx)]] == 0;' } + then: + - lvgl.widget.show: disp_switch + - lvgl.widget.update: { id: disp_switch, state: { checked: !lambda 'int o = id(g_wcur_opts)[id(g_wopt_idx)]; return id(g_wopt_ptr)[o] && *id(g_wopt_ptr)[o];' } } + else: [ lvgl.widget.hide: disp_switch ] + else: [ lvgl.widget.hide: wopt_roller ] + - if: # Assistant (13): both items = toggles (0=wake word, 1=beep) + condition: { lambda: 'return id(g_mode) == 13;' } + then: + - lvgl.widget.show: asys_roller + - lvgl.roller.update: { id: asys_roller, animated: true, selected_index: !lambda 'return id(g_sub_idx);' } + - lvgl.widget.show: disp_switch + - lvgl.widget.update: { id: disp_switch, state: { checked: !lambda 'return id(g_sub_idx) == 0 ? id(g_ww_on) : id(g_sub_idx) == 1 ? id(g_beep_ww) : id(g_hold_talk);' } } + else: [ lvgl.widget.hide: asys_roller ] + - if: + condition: { lambda: 'return id(g_mode) == 15;' } + then: [ lvgl.widget.show: sys_roller, lvgl.roller.update: { id: sys_roller, animated: true, selected_index: !lambda 'return id(g_sub_idx);' } ] + else: [ lvgl.widget.hide: sys_roller ] + - if: # we hide ui_big in the list (5), info (7), wake word (8), Display (11) + condition: { lambda: 'return id(g_mode) == 5 || id(g_mode) == 7 || id(g_mode) == 9 || id(g_mode) == 11 || id(g_mode) == 12 || id(g_mode) == 13 || id(g_mode) == 15 || id(g_mode) == 17 || id(g_mode) == 22 || id(g_mode) == 30 || id(g_mode) == 31;' } + then: [lvgl.widget.hide: ui_big] + else: [lvgl.widget.show: ui_big] + - lvgl.label.update: + id: ui_big + text: !lambda |- + char b[16]; + int m = id(g_mode); + if (m == 1) return std::string("Timer"); + if (m == 2) { snprintf(b, sizeof(b), "%d min", id(g_set_min)); return std::string(b); } + if (m == 6) { snprintf(b, sizeof(b), "%d%%", id(g_bright)); return std::string(b); } + if (m == 9) return std::string("Restart?"); + if (m == 23) { if (id(g_batt) < 0) return std::string("--"); char b[8]; snprintf(b, sizeof(b), "%d%%", id(g_batt)); return std::string(b); } + if (m == 24) { const char* L[5]={"Never","15s","30s","1min","5min"}; return std::string(L[id(g_blank_idx) % 5]); } + if (m == 25) { char b[8]; snprintf(b, sizeof(b), "%02d:00", id(g_night_from)); return std::string(b); } + if (m == 26) { char b[8]; snprintf(b, sizeof(b), "%02d:00", id(g_night_to)); return std::string(b); } + int s = id(g_timer_secs); if (s < 0) s = 0; + snprintf(b, sizeof(b), "%d:%02d", s / 60, s % 60); + return std::string(b); + - lvgl.label.update: + id: ui_sub + text: !lambda |- + if (id(g_mode) == 23) { char b[24]; snprintf(b, sizeof(b), "%.2f V", id(batt_volt).state); return std::string(b); } + if (id(g_mode) == 31) { std::string l = (id(g_wcur_n) > 0) ? id(g_wopt_label)[id(g_wcur_opts)[id(g_wopt_idx)]] : std::string(""); return l + "?\ntap = yes"; } + if (id(g_mode) == 9) return std::string("Restart?\ntap = yes"); + if (id(g_mode) == 22) return std::string("Factory reset?\ntap = yes"); + if (id(g_mode) != 7) return std::string(""); + std::string ip = id(wifi_ip).state.empty() ? std::string("-") : id(wifi_ip).state; + return std::string("IP ") + ip + "\nESPHome " ESPHOME_VERSION; + - lvgl.label.update: + id: ui_head + text: !lambda |- + int m = id(g_mode); + if (m == 1) return std::string("MENU"); + if (m == 2 || m == 3) return std::string("TIMER"); + if (m == 4) return std::string("ALARM"); + if (m == 5) return std::string("SETTINGS"); + if (m == 6) return std::string("BRIGHTNESS"); + if (m == 7) return std::string("INFO"); + if (m == 9) return std::string("RESTART"); + if (m == 11) return std::string("DISPLAY"); + if (m == 12) return std::string("HOME SCREEN"); + if (m == 13) return std::string("VOICE ASSISTANT"); + if (m == 15) return std::string("SYSTEM"); + if (m == 17) return std::string("WIDGETS"); + if (m == 30) return id(g_wcur_name); + if (m == 31) return std::string("CONFIRM"); + if (m == 23) return std::string("BATTERY"); + if (m == 24) return std::string("SCREEN OFF"); + if (m == 25) return std::string("NIGHT FROM"); + if (m == 26) return std::string("NIGHT TO"); + if (m == 22) return std::string("FACTORY"); + return std::string(""); + - if: + condition: { lambda: 'return id(g_mode) >= 5;' } + then: [lvgl.widget.update: { id: ui_head_bg, bg_color: 0xF5B83D }] + - if: + condition: { lambda: 'return id(g_mode) == 4;' } + then: [lvgl.widget.update: { id: ui_head_bg, bg_color: 0xFF5555 }] + - if: + condition: { lambda: 'return id(g_mode) >= 1 && id(g_mode) <= 3;' } + then: [lvgl.widget.update: { id: ui_head_bg, bg_color: 0x42F4DC }] + # Alarm screen (mode 4): show the dedicated bell layout, hide the generic overlay + - if: + condition: { lambda: 'return id(g_mode) == 4;' } + then: + - lvgl.widget.show: alarm_scrim + - lvgl.widget.show: alarm_bell + - lvgl.widget.show: alarm_title + - lvgl.widget.show: alarm_sub + - lvgl.widget.hide: ui_dim + - lvgl.widget.hide: ui_head_bg + - lvgl.widget.hide: ui_head + - lvgl.widget.hide: ui_big + - lvgl.widget.hide: ui_sub + else: + - lvgl.widget.hide: alarm_scrim + - lvgl.widget.hide: alarm_bell + - lvgl.widget.hide: alarm_title + - lvgl.widget.hide: alarm_sub + - id: timer_start_local + then: + - lambda: |- + id(g_timer_secs) = id(g_set_min) * 60; + id(g_timer_local) = true; + id(g_mode) = 3; + - script.execute: ui_render + - id: timer_cancel + then: + - lambda: 'id(g_mode) = 0; id(g_timer_local) = false; id(g_timer_secs) = 0;' + - script.execute: ui_render + - id: alarm_start + then: + - lambda: 'id(g_mode) = 4; id(g_alarm_cnt) = 0; id(g_timer_active) = false; id(g_timer_paused) = false; id(g_timer_secs) = 0;' + - script.execute: ui_render + - script.execute: timer_render + - media_player.speaker.play_on_device_media_file: + id: media_player_speaker + media_file: alarm_sound + announcement: true + - id: alarm_stop + then: + - lambda: 'id(g_mode) = 0; id(g_timer_active) = false; id(g_timer_paused) = false; id(g_timer_secs) = 0;' + - script.execute: ui_render + - script.execute: timer_render + # --- Timer as a SCREEN (page_timer): render + button controls --- + - id: timer_render + then: + - lvgl.label.update: + id: timer_big + text: !lambda |- + int s = id(g_timer_active) ? id(g_timer_secs) : id(g_set_min) * 60; + if (s < 0) s = 0; + char b[12]; snprintf(b, sizeof(b), "%d:%02d", s / 60, s % 60); + return std::string(b); + - lvgl.arc.update: + id: timer_arc + value: !lambda |- + if (!id(g_timer_active)) return 100.0f; + int tot = id(g_timer_total); if (tot <= 0) return 0.0f; + float f = 100.0f * id(g_timer_secs) / tot; + if (f < 0) f = 0; if (f > 100) f = 100; + return f; + - if: + condition: { lambda: 'return id(g_timer_active);' } + then: + - lvgl.widget.hide: timer_play + - lvgl.widget.show: timer_pause + - lvgl.widget.show: timer_stop + - lvgl.widget.show: timer_dot + - lvgl.label.update: + id: timer_pause_ic + text: !lambda 'return id(g_timer_paused) ? std::string("") : std::string("");' + else: + - lvgl.widget.show: timer_play + - lvgl.widget.hide: timer_pause + - lvgl.widget.hide: timer_stop + - lvgl.widget.hide: timer_dot + - if: # ride the head-dot on the leading edge of the remaining arc + condition: { lambda: 'return id(g_timer_active);' } + then: + - lambda: |- + int tot = id(g_timer_total); float v = (tot > 0) ? 100.0f * id(g_timer_secs) / tot : 0.0f; + if (v < 0) v = 0; if (v > 100) v = 100; + float a = (271.0f + v / 100.0f * 358.0f) * 0.01745329f; // arc head angle -> radians + int x = 180 + (int) lroundf(143.0f * cosf(a)) - 9; + int y = 180 + (int) lroundf(143.0f * sinf(a)) - 9; + lv_obj_set_pos(id(timer_dot), x, y); + # status caption + arc/time colour by remaining: SET grey, then green > amber > red + - lvgl.label.update: + id: timer_cap + text: !lambda |- + if (!id(g_timer_active)) return std::string("SET"); + return id(g_timer_paused) ? std::string("PAUSED") : std::string("RUNNING"); + - if: + condition: { lambda: 'return !id(g_timer_active);' } + then: + - lvgl.arc.update: { id: timer_arc, indicator: { arc_color: 0x2FB85C } } + - lvgl.label.update: { id: timer_cap, text_color: 0x6F9A92 } + - lvgl.label.update: { id: timer_big, text_color: 0xFFFFFF } + else: + - if: + condition: { lambda: 'int t=id(g_timer_total); return t>0 && (long)id(g_timer_secs)*100 > (long)t*50;' } + then: + - lvgl.arc.update: { id: timer_arc, indicator: { arc_color: 0x2FB85C } } + - lvgl.label.update: { id: timer_cap, text_color: 0x2FB85C } + - lvgl.label.update: { id: timer_big, text_color: 0xFFFFFF } + else: + - if: + condition: { lambda: 'int t=id(g_timer_total); return t>0 && (long)id(g_timer_secs)*100 > (long)t*20;' } + then: + - lvgl.arc.update: { id: timer_arc, indicator: { arc_color: 0xF5B83D } } + - lvgl.label.update: { id: timer_cap, text_color: 0xF5B83D } + - lvgl.label.update: { id: timer_big, text_color: 0xFFFFFF } + else: + - lvgl.arc.update: { id: timer_arc, indicator: { arc_color: 0xFF3B30 } } + - lvgl.label.update: { id: timer_cap, text_color: 0xFF6B60 } + - lvgl.label.update: { id: timer_big, text_color: 0xFF6B60 } + - id: timer_start + then: + - lambda: |- + id(g_timer_secs) = id(g_set_min) * 60; + id(g_timer_total) = id(g_timer_secs); + id(g_timer_active) = true; + id(g_timer_paused) = false; + id(g_timer_local) = true; // timer from the button -> the interval counts down and fires the alarm + - script.execute: timer_render + - id: timer_toggle + then: + - lambda: 'id(g_timer_paused) = !id(g_timer_paused);' + - script.execute: timer_render + - id: timer_halt + then: + - lambda: 'id(g_timer_active) = false; id(g_timer_paused) = false; id(g_timer_secs) = 0;' + - script.execute: timer_render + # Shows/hides home-screen elements per Display settings + - id: disp_apply # gate the Classic face's weather/climate widgets per the Display settings + then: + - if: + condition: { lambda: 'return id(g_show_weather);' } + then: [ lvgl.widget.show: lbl_wx_ic, lvgl.widget.show: lbl_wx_val ] + else: [ lvgl.widget.hide: lbl_wx_ic, lvgl.widget.hide: lbl_wx_val ] + - if: + condition: { lambda: 'return id(g_show_climate);' } + then: [ lvgl.widget.show: lbl_ct_ic, lvgl.widget.show: lbl_ct_val, lvgl.widget.show: lbl_ch_ic, lvgl.widget.show: lbl_ch_val ] + else: [ lvgl.widget.hide: lbl_ct_ic, lvgl.widget.hide: lbl_ct_val, lvgl.widget.hide: lbl_ch_ic, lvgl.widget.hide: lbl_ch_val ] + # Night mode: ON -> dim screen to 15%, OFF -> restore brightness from settings + - id: night_apply + then: + - light.turn_on: + id: backlight_light + brightness: !lambda 'return id(g_bright) / 100.0f;' +# Volume (0..1) from the entity -> vol_arc value + % label +sensor: + - platform: homeassistant + id: vol_sensor + entity_id: ${player_entity} + attribute: volume_level + on_value: + - lambda: 'id(g_vol) = x;' + - lvgl.arc.update: + id: vol_arc + value: !lambda 'return x * 100.0;' + - lvgl.label.update: + id: vol_label + text: !lambda |- + char buf[8]; snprintf(buf, sizeof(buf), "%d%%", (int) roundf(x * 100.0f)); return std::string(buf); + # --- Home screen: weather (outdoor temp) + room temperature/humidity --- + - platform: homeassistant + id: wx_temp + entity_id: ${weather_entity} + attribute: temperature + on_value: + - lvgl.label.update: + id: lbl_wx_val + text: !lambda 'char b[10]; snprintf(b, sizeof(b), "%d°", (int) roundf(x)); return std::string(b);' + - platform: homeassistant + id: room_temp + entity_id: ${room_temp_entity} + on_value: + - lvgl.label.update: + id: lbl_ct_val + text: !lambda 'char b[12]; snprintf(b, sizeof(b), "%.1f°", x); return std::string(b);' + - platform: homeassistant + id: room_hum + entity_id: ${room_hum_entity} + on_value: + - lvgl.label.update: + id: lbl_ch_val + text: !lambda 'char b[8]; snprintf(b, sizeof(b), "%d%%", (int) roundf(x)); return std::string(b);' + # Battery: ADC on GPIO6 (BAT_ADC, ~10k/10k divider -> x2). PIN/RATIO to verify live. + - platform: adc + pin: GPIO1 + id: batt_volt + name: "Battery voltage" + attenuation: 12db + update_interval: 1s + samples: 64 # hardware oversampling: 64 readings/measurement averaged + # -> cuts ripple from the ETA6003 converter (no capacitor on BAT_ADC) + filters: + - multiply: 2.0 + # Reject values physically impossible for Li-ion (that's switching ripple, not voltage): + - lambda: 'return (x >= 3.20f && x <= 4.30f) ? x : NAN;' + # On the cleaned signal: moving average, output every ~10 s + - sliding_window_moving_average: + window_size: 20 + send_every: 10 + send_first_at: 5 + on_value: + - lambda: |- + // x = VCC_OUT (median, after ×2) = system rail ≈ battery voltage UNDER load. + float v = x; + // Voltage→% curve CALIBRATED on a real discharge (under load): + // start ~4.10 (≈90%), nearly linear drop, brownout ~3.20 V. Range 3.20-4.15. + static const float vt[] = {3.20f,3.25f,3.39f,3.57f,3.74f,3.84f,4.10f}; + static const float st[] = {0.f, 4.f, 20.f, 40.f, 60.f, 80.f, 100.f}; + const int n = 7; + float pct; + if (v <= vt[0]) pct = 0.f; + else if (v >= vt[n-1]) pct = 100.f; + else { pct = 0.f; for (int i = 0; i < n-1; i++) { if (v >= vt[i] && v < vt[i+1]) { pct = st[i] + (v - vt[i]) / (vt[i+1] - vt[i]) * (st[i+1] - st[i]); break; } } } + int p = (int) roundf(pct); + if (p < 0) p = 0; if (p > 100) p = 100; + id(g_batt) = p; + // --- Charging detection (no STAT pin on GPIO -> voltage heuristic) --- + // The puck constantly draws current (backlight+ESP+audio); only USB keeps the voltage high. + float prev = id(g_v_med); + id(g_v_med) = v; + bool rising = (prev > 0.1f) && (v - prev > 0.010f); // voltage rising = charging + bool high = (v >= 4.13f); // on battery under load max ~4.10 -> only USB holds ≥4.13 + bool low = (v < 4.05f); // clearly on battery + if (high || rising) id(g_charging) = true; + else if (low) id(g_charging) = false; + // 4.05-4.13 zone without a rise: keep the previous state (hysteresis, no flicker) + - script.execute: batt_render + +# Push-to-talk: screen TAP (handled in touchscreen: on_release). Swipe = next/prev. +# Eventually the wake word (micro_wake_word) will be better. +binary_sensor: + # ── KNOB: this "encoder" is NOT classic quadrature. Confirmed by logs: + # direction is encoded by WHICH pin pulses (not A/B phase): + # • LEFT → GPIO7 pulses → quieter + # • RIGHT → GPIO8 pulses → louder + # Each detent = one clean LOW pulse (sequence 0101...), zero bounce. + # That's why rotary_encoder (expects interleaved A/B) counted zero. + # So we read two independent pulses: inverted+pullup → detent = "on_press". + - platform: gpio + name: "Knob left" + id: knob_left + pin: + number: GPIO7 + inverted: true + mode: + input: true + pullup: true + on_press: + - if: + condition: { lambda: 'return id(g_disp_off);' } # asleep -> just wake, don't act (same as touch) + then: + - light.turn_on: { id: backlight_light, brightness: !lambda 'return id(g_bright) / 100.0f;' } + - lambda: 'id(g_disp_off) = false; id(g_idle_ticks) = 0;' + else: + - if: + condition: + lambda: 'return id(g_mode) == 0 && (id(g_knob_capture) || (id(g_base) == 2 && !id(g_timer_active)));' + then: + - if: + condition: { lambda: 'return id(g_knob_capture);' } + then: [ lambda: 'id(g_knob_delta)--;' ] + else: + - lambda: 'id(g_set_min)--; if (id(g_set_min) < 1) id(g_set_min) = 1;' + - script.execute: timer_render + else: + - if: + condition: + lambda: 'return id(g_mode) == 5 || id(g_mode) == 11 || (id(g_mode) >= 12 && id(g_mode) <= 17) || id(g_mode) == 30;' + then: + - lambda: |- + if (id(g_mode) == 11) { if (id(g_disp_idx) > 0) id(g_disp_idx)--; } + else if (id(g_mode) == 5) { if (id(g_set_idx) > 0) id(g_set_idx)--; } + else if (id(g_mode) == 17) { if (id(g_wgrp_idx) > 0) id(g_wgrp_idx)--; } + else if (id(g_mode) == 30) { if (id(g_wopt_idx) > 0) id(g_wopt_idx)--; } + else { if (id(g_sub_idx) > 0) id(g_sub_idx)--; } + - script.execute: ui_render + else: + - if: + condition: + lambda: 'return id(g_mode) == 6;' + then: + - lambda: 'id(g_bright) -= 10; if (id(g_bright) < 10) id(g_bright) = 10;' + - light.turn_on: + id: backlight_light + brightness: !lambda 'return id(g_bright) / 100.0f;' + - script.execute: ui_render + else: + - if: + condition: { lambda: 'return id(g_mode) == 24 || id(g_mode) == 25 || id(g_mode) == 26;' } + then: + - lambda: |- + if (id(g_mode) == 24) { if (id(g_blank_idx) > 0) id(g_blank_idx)--; } + else if (id(g_mode) == 25) { id(g_night_from)--; if (id(g_night_from) < 0) id(g_night_from) = 23; } + else { id(g_night_to)--; if (id(g_night_to) < 0) id(g_night_to) = 23; } + - script.execute: ui_render + else: + - if: # watchface picker: previous present face + condition: { lambda: 'return id(g_mode) == 33;' } + then: + - lambda: 'int n=id(g_wf_pick); for(int k=0;k<8;k++){ n=(n+7)%8; if(id(g_wf_present)[n]) break; } id(g_wf_pick)=n; id(g_watchface)=n;' + - script.execute: face_apply + - script.execute: facepick_render + else: + - media_player.volume_down: + id: media_player_speaker + - script.execute: flash_volume + - platform: gpio + name: "Knob right" + id: knob_right + pin: + number: GPIO8 + inverted: true + mode: + input: true + pullup: true + on_press: + - if: + condition: { lambda: 'return id(g_disp_off);' } # asleep -> just wake, don't act (same as touch) + then: + - light.turn_on: { id: backlight_light, brightness: !lambda 'return id(g_bright) / 100.0f;' } + - lambda: 'id(g_disp_off) = false; id(g_idle_ticks) = 0;' + else: + - if: + condition: + lambda: 'return id(g_mode) == 0 && (id(g_knob_capture) || (id(g_base) == 2 && !id(g_timer_active)));' + then: + - if: + condition: { lambda: 'return id(g_knob_capture);' } + then: [ lambda: 'id(g_knob_delta)++;' ] + else: + - lambda: 'id(g_set_min)++; if (id(g_set_min) > 180) id(g_set_min) = 180;' + - script.execute: timer_render + else: + - if: + condition: + lambda: 'return id(g_mode) == 5 || id(g_mode) == 11 || (id(g_mode) >= 12 && id(g_mode) <= 17) || id(g_mode) == 30;' + then: + - lambda: |- + if (id(g_mode) == 11) { if (id(g_disp_idx) < 4) id(g_disp_idx)++; } + else if (id(g_mode) == 5) { if (id(g_set_idx) < id(g_set_n) - 1) id(g_set_idx)++; } + else if (id(g_mode) == 17) { if (id(g_wgrp_idx) < id(g_wgrp_n) - 1) id(g_wgrp_idx)++; } + else if (id(g_mode) == 30) { if (id(g_wopt_idx) < id(g_wcur_n) - 1) id(g_wopt_idx)++; } + else { int mx = (id(g_mode) == 15) ? 3 : (id(g_mode) == 13) ? 2 : (id(g_mode) == 12) ? 2 : 0; if (id(g_sub_idx) < mx) id(g_sub_idx)++; } + - script.execute: ui_render + else: + - if: + condition: + lambda: 'return id(g_mode) == 6;' + then: + - lambda: 'id(g_bright) += 10; if (id(g_bright) > 100) id(g_bright) = 100;' + - light.turn_on: + id: backlight_light + brightness: !lambda 'return id(g_bright) / 100.0f;' + - script.execute: ui_render + else: + - if: + condition: { lambda: 'return id(g_mode) == 24 || id(g_mode) == 25 || id(g_mode) == 26;' } + then: + - lambda: |- + if (id(g_mode) == 24) { if (id(g_blank_idx) < 4) id(g_blank_idx)++; } + else if (id(g_mode) == 25) { id(g_night_from)++; if (id(g_night_from) > 23) id(g_night_from) = 0; } + else { id(g_night_to)++; if (id(g_night_to) > 23) id(g_night_to) = 0; } + - script.execute: ui_render + else: + - if: # watchface picker: next present face + condition: { lambda: 'return id(g_mode) == 33;' } + then: + - lambda: 'int n=id(g_wf_pick); for(int k=0;k<8;k++){ n=(n+1)%8; if(id(g_wf_present)[n]) break; } id(g_wf_pick)=n; id(g_watchface)=n;' + - script.execute: face_apply + - script.execute: facepick_render + else: + - media_player.volume_up: + id: media_player_speaker + - script.execute: flash_volume + +############################################################################### +# DISPLAY (QSPI ST77916) + BACKLIGHT + TOUCH (CST816) +# Pins: SCK=11 CS=12 D0=13 D1=14 D2=15 D3=16 RST=17 BLK=21 +# TOUCH SDA=9 SCL=10 INT=7 RST=8 +############################################################################### +spi: + id: display_qspi + type: quad + clk_pin: 13 + data_pins: [15, 16, 17, 18] # TFT_SDA0..3 + +i2c: + sda: 11 # TOUCH_PIN_NUM_I2C_SDA + scl: 12 # TOUCH_PIN_NUM_I2C_SCL + scan: true + id: touchscreen_bus + +output: + - platform: ledc + pin: GPIO47 # your backlight GPIO + id: backlight_output + +light: + - platform: monochromatic + output: backlight_output + name: "Backlight" + id: backlight_light + restore_mode: ALWAYS_ON + +button: + - platform: restart + id: btn_restart + name: "Restart" + +touchscreen: + platform: cst816 + id: my_touchscreen + interrupt_pin: GPIO9 # TOUCH_PIN_NUM_INT + reset_pin: GPIO10 # TOUCH_PIN_NUM_RST + display: main_display + on_touch: + - lambda: |- + id(g_x0) = (int) touch.x; + id(g_y0) = (int) touch.y; + id(g_t0) = millis(); + id(g_dx) = 0; + id(g_dy) = 0; + id(g_idle_ticks) = 0; + - if: + condition: { lambda: 'return id(g_disp_off);' } + then: + - light.turn_on: { id: backlight_light, brightness: !lambda 'return id(g_bright) / 100.0f;' } + - lambda: 'id(g_disp_off) = false; id(g_wake_consume) = true;' + on_update: + - lambda: |- + if (!touches.empty()) { + id(g_dx) = (int) touches[0].x - id(g_x0); + id(g_dy) = (int) touches[0].y - id(g_y0); + } + on_release: + # Gesture classification + mode snapshot (routing by g_mode0, so one gesture doesn't cascade) + - lambda: |- + if (id(g_boot)) { id(g_gesture) = -1; id(g_mode0) = 0; return; } // ignore input during the boot splash + int dx = id(g_dx), dy = id(g_dy); + uint32_t held = millis() - id(g_t0); + int g; + if (abs(dx) > 50 && abs(dx) > abs(dy)) g = (dx < 0) ? 2 : 3; // 2=left 3=right + else if (abs(dy) > 50 && abs(dy) > abs(dx)) g = (dy < 0) ? 4 : 5; // 4=up 5=down + else if (abs(dx) < 16 && abs(dy) < 16) g = (held >= 500) ? 1 : 0; // 1=hold 0=tap + else g = -1; + if (id(g_wake_consume)) { g = -1; id(g_wake_consume) = false; } + id(g_idle_ticks) = 0; + id(g_gesture) = g; + id(g_mode0) = id(g_mode); + # === Volume overlay on top: ANY gesture (tap/swipe/hold) hides it and is CONSUMED === + - if: + condition: + lambda: 'return id(g_vol_shown) && id(g_gesture) >= 0;' + then: + - script.execute: vol_hide_now + - lambda: 'id(g_gesture) = -1;' # neutralize the gesture -> no mode will handle it + # === NORMAL MODE === + - if: + condition: + lambda: 'return id(g_mode0) == 0;' + then: + - if: # tap -> bump a generic signal so the active screen can react (e.g. demo) + condition: { lambda: 'return id(g_gesture) == 0;' } + then: [ lambda: 'id(g_tap_seq)++;' ] + - if: # swipe up -> controls (light tiles) + condition: + lambda: 'return id(g_gesture) == 4;' + then: + - lambda: 'id(g_mode) = 10;' + - script.execute: ui_render + - if: # swipe down -> settings (list) + condition: + lambda: 'return id(g_gesture) == 5;' + then: + - lambda: 'id(g_mode) = 5; id(g_set_idx) = 0;' + - script.execute: ui_render + # Horizontal carousel: swipe steps through g_order (built from screen_order at boot), + # wrapping around. Each screen shows itself via show_base / its nav handler. + - if: # swipe ← -> next + condition: { lambda: 'return id(g_gesture) == 2;' } + then: + - lambda: |- + int i = 0; for (; i < id(g_order_n); i++) if (id(g_order)[i] == id(g_base)) break; + if (i >= id(g_order_n)) i = 0; + id(g_base) = id(g_order)[(i + 1) % id(g_order_n)]; + id(g_nav_anim) = 0; + id(g_knob_capture) = false; id(g_knob_delta) = 0; + - script.execute: show_base + - if: # swipe → -> previous + condition: { lambda: 'return id(g_gesture) == 3;' } + then: + - lambda: |- + int i = 0; for (; i < id(g_order_n); i++) if (id(g_order)[i] == id(g_base)) break; + if (i >= id(g_order_n)) i = 0; + id(g_base) = id(g_order)[(i - 1 + id(g_order_n)) % id(g_order_n)]; + id(g_nav_anim) = 1; + id(g_knob_capture) = false; id(g_knob_delta) = 0; + - script.execute: show_base + # game: START/Play buttons on the game screen handle start/restart (not a global tap) + # prev/play/next are handled by the buttons on the player screen (transport) + - if: # hold -> start the assistant (works on every screen; toggle in Settings > Assistant) + condition: + lambda: 'return id(g_gesture) == 1 && id(g_hold_talk);' + then: + - if: + condition: voice_assistant.is_running + then: [voice_assistant.stop: {}] + else: [voice_assistant.start: {}] + # === MENU === + - if: + condition: + lambda: 'return id(g_mode0) == 1;' + then: + - if: # tap -> open timer (the only item) + condition: + lambda: 'return id(g_gesture) == 0;' + then: + - lambda: 'id(g_mode) = 2; id(g_set_min) = 5;' + - script.execute: ui_render + - if: # hold / swipe down / swipe right -> close menu (back) + condition: + lambda: 'return id(g_gesture) == 1 || id(g_gesture) == 5 || id(g_gesture) == 3;' + then: + - lambda: 'id(g_mode) = 0;' + - script.execute: ui_render + # === TIMER_SET === + - if: + condition: + lambda: 'return id(g_mode0) == 2;' + then: + - if: # tap -> start + condition: + lambda: 'return id(g_gesture) == 0;' + then: + - script.execute: timer_start_local + - if: # hold / swipe right -> cancel (back) + condition: + lambda: 'return id(g_gesture) == 1 || id(g_gesture) == 3;' + then: + - script.execute: timer_cancel + # === TIMER_RUN === + - if: + condition: + lambda: 'return id(g_mode0) == 3;' + then: + - if: + condition: + lambda: 'return id(g_gesture) == 0 || id(g_gesture) == 1 || id(g_gesture) == 3;' + then: + - script.execute: timer_cancel + # === ALARM === + - if: + condition: + lambda: 'return id(g_mode0) == 4;' + then: + - if: + condition: + lambda: 'return id(g_gesture) == 0 || id(g_gesture) == 1 || id(g_gesture) == 3;' + then: + - script.execute: alarm_stop + # === CONTROLS (tiles) === tap=tile buttons; swipe ↓/→/hold = back + - if: + condition: + lambda: 'return id(g_mode0) == 10;' + then: + - if: # swipe ↓ -> close with a "downward slide" + condition: { lambda: 'return id(g_gesture) == 5;' } + then: + - lambda: 'id(g_exit_anim) = 1; id(g_mode) = 0;' + - script.execute: ui_render + - if: # back (right / hold) -> close "to the right" + condition: { lambda: 'return id(g_gesture) == 1 || id(g_gesture) == 3;' } + then: + - lambda: 'id(g_exit_anim) = 0; id(g_mode) = 0;' + - script.execute: ui_render + # === SETTINGS (list) === knob=scroll; tap=enter; right/hold=back + - if: + condition: + lambda: 'return id(g_mode0) == 5;' + then: + - if: # tap -> enter the selected item + condition: + lambda: 'return id(g_gesture) == 0;' + then: + - lambda: 'id(g_mode) = id(g_set_items)[id(g_set_idx)]; id(g_disp_idx) = 0; id(g_sub_idx) = 0; id(g_wgrp_idx) = 0;' + - script.execute: ui_render + - if: # back: swipe right / hold -> "to the right" + condition: + lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' + then: + - lambda: 'id(g_exit_anim) = 0; id(g_mode) = 0;' + - script.execute: ui_render + - if: # swipe ↑ -> close "upward" (reverse of settings entering from the bottom) + condition: + lambda: 'return id(g_gesture) == 4;' + then: + - lambda: 'id(g_exit_anim) = 2; id(g_mode) = 0;' + - script.execute: ui_render + # === DISPLAY (11) === knob=scroll; tap=action; right/hold=back to settings + - if: + condition: + lambda: 'return id(g_mode0) == 11;' + then: + - if: # tap -> action per the selected item + condition: { lambda: 'return id(g_gesture) == 0;' } + then: + - if: { condition: { lambda: 'return id(g_disp_idx) == 0;' }, then: [ lambda: 'id(g_mode) = 6;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_disp_idx) == 1;' }, then: [ lambda: 'id(g_night) = !id(g_night);', script.execute: night_apply, script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_disp_idx) == 2;' }, then: [ lambda: 'id(g_mode) = 25;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_disp_idx) == 3;' }, then: [ lambda: 'id(g_mode) = 26;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_disp_idx) == 4;' }, then: [ lambda: 'id(g_mode) = 24;', script.execute: ui_render ] } + - if: # back -> settings list + condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' } + then: + - lambda: 'id(g_mode) = 5;' + - script.execute: ui_render + # === HOME (12) === tap: 0=toggle weather widget, 1=toggle climate widget, 2=cycle watchface; right/hold=back + - if: + condition: { lambda: 'return id(g_mode0) == 12;' } + then: + - if: { condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 0;' }, then: [ lambda: 'id(g_show_weather) = !id(g_show_weather);', script.execute: disp_apply, script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 1;' }, then: [ lambda: 'id(g_show_climate) = !id(g_show_climate);', script.execute: disp_apply, script.execute: ui_render ] } + - if: # enter the live watchface picker (mode 33) on the home page + condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 2;' } + then: + - lambda: 'id(g_wf_prev) = id(g_watchface); id(g_wf_pick) = id(g_watchface); id(g_mode) = 33;' + - script.execute: ui_render + - script.execute: face_apply + - script.execute: facepick_render + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 5;', script.execute: ui_render ] } + # === WATCHFACE PICKER (33) === knob switches faces live; tap = keep, swipe-right/hold = cancel (revert) + - if: + condition: { lambda: 'return id(g_mode0) == 33;' } + then: + - if: # tap -> keep the previewed face (already applied + persisted), drop to home + condition: { lambda: 'return id(g_gesture) == 0;' } + then: + - lvgl.widget.hide: pick_bar + - script.execute: home_roller_build + - lambda: 'id(g_mode) = 0; id(g_exit_anim) = 0;' + - script.execute: ui_render + - if: # swipe-right / hold -> cancel: restore the previous face + condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' } + then: + - lvgl.widget.hide: pick_bar + - lambda: 'id(g_watchface) = id(g_wf_prev);' + - script.execute: face_apply + - script.execute: home_roller_build + - lambda: 'id(g_mode) = 0; id(g_exit_anim) = 0;' + - script.execute: ui_render + # === WIDGETS (17) === list of per-screen groups; tap opens one; right/hold = back to settings + - if: + condition: { lambda: 'return id(g_mode0) == 17;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0 && id(g_wgrp_n) > 0;' } + then: + - lambda: |- + int g = id(g_wgrp_idx); + id(g_wcur_n) = 0; + for (int o = 0; o < id(g_wopt_n); o++) if (id(g_wopt_group)[o] == g) id(g_wcur_opts)[id(g_wcur_n)++] = o; + std::string s; for (int k = 0; k < id(g_wcur_n); k++) { if (k) s += "\n"; s += id(g_wopt_label)[id(g_wcur_opts)[k]]; } + lv_roller_set_options(id(wopt_roller)->obj, s.c_str(), LV_ROLLER_MODE_NORMAL); + id(g_wcur_name) = ""; { std::string gl = id(g_wgrp_labels); int idx = 0; size_t pp = 0; while (true) { size_t nl = gl.find('\n', pp); std::string tok = (nl == std::string::npos) ? gl.substr(pp) : gl.substr(pp, nl - pp); if (idx == g) { id(g_wcur_name) = tok; break; } if (nl == std::string::npos) break; pp = nl + 1; idx++; } } + id(g_wopt_idx) = 0; id(g_mode) = 30; + - script.execute: ui_render + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 5;', script.execute: ui_render ] } + # === WIDGET OPTIONS (30) === tap: toggle / confirm action; right/hold = back to Widgets + - if: + condition: { lambda: 'return id(g_mode0) == 30;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0 && id(g_wcur_n) > 0;' } + then: + - if: + condition: { lambda: 'return id(g_wopt_kind)[id(g_wcur_opts)[id(g_wopt_idx)]] == 0;' } + then: [ lambda: 'int o = id(g_wcur_opts)[id(g_wopt_idx)]; if (id(g_wopt_ptr)[o]) *id(g_wopt_ptr)[o] = !*id(g_wopt_ptr)[o];', script.execute: ui_render ] + else: [ lambda: 'id(g_mode) = 31;', script.execute: ui_render ] + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 17;', script.execute: ui_render ] } + # === CONFIRM (31) === generic action confirm; tap = YES (fire), right/hold = NO + - if: + condition: { lambda: 'return id(g_mode0) == 31;' } + then: + - if: { condition: { lambda: 'return id(g_gesture) == 0 && id(g_wcur_n) > 0;' }, then: [ lambda: 'int o = id(g_wcur_opts)[id(g_wopt_idx)]; if (id(g_wopt_ptr)[o]) *id(g_wopt_ptr)[o] = true; id(g_mode) = 30;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 30;', script.execute: ui_render ] } + # === ASSISTANT (13) === tap: 0=toggle wake word, 1=toggle beep; right/hold=back + - if: + condition: { lambda: 'return id(g_mode0) == 13;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 0;' } + then: + - lambda: 'id(g_ww_on) = !id(g_ww_on);' + - if: + condition: { lambda: 'return id(g_ww_on);' } + then: [micro_wake_word.start: {}] + else: [micro_wake_word.stop: {}] + - script.execute: ui_render + - if: { condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 1;' }, then: [ lambda: 'id(g_beep_ww) = !id(g_beep_ww);', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_gesture) == 0 && id(g_sub_idx) == 2;' }, then: [ lambda: 'id(g_hold_talk) = !id(g_hold_talk);', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 5;', script.execute: ui_render ] } + # === SYSTEM (15) === + - if: + condition: { lambda: 'return id(g_mode0) == 15;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0;' } + then: + - if: { condition: { lambda: 'return id(g_sub_idx) == 0;' }, then: [ lambda: 'id(g_mode) = 7;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_sub_idx) == 1;' }, then: [ lambda: 'id(g_mode) = 23;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_sub_idx) == 2;' }, then: [ lambda: 'id(g_mode) = 9;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_sub_idx) == 3;' }, then: [ lambda: 'id(g_mode) = 22;', script.execute: ui_render ] } + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 5;', script.execute: ui_render ] } + # === RESTART confirm (9) === tap = YES (restart); right/hold = NO + - if: + condition: + lambda: 'return id(g_mode0) == 9;' + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0;' } + then: + - button.press: btn_restart + - if: + condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' } + then: + - lambda: 'id(g_mode) = 5;' + - script.execute: ui_render + # === BRIGHTNESS (6) === any gesture = return to Display (we enter from there) + - if: + condition: + lambda: 'return id(g_mode0) == 6;' + then: + - if: + condition: { lambda: 'return id(g_gesture) >= 0;' } + then: + - lambda: 'id(g_mode) = 11;' + - script.execute: ui_render + # === SCREEN OFF (24) === any gesture = return to Display + - if: + condition: { lambda: 'return id(g_mode0) == 24;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) >= 0;' } + then: [ lambda: 'id(g_mode) = 11;', script.execute: ui_render ] + # === NIGHT FROM/TO (25/26) === any gesture = return to Display + - if: + condition: { lambda: 'return id(g_mode0) == 25 || id(g_mode0) == 26;' } + then: + - if: { condition: { lambda: 'return id(g_gesture) >= 0;' }, then: [ lambda: 'id(g_mode) = 11;', script.execute: ui_render ] } + # === BATTERY (23) === any gesture = return to System + - if: + condition: { lambda: 'return id(g_mode0) == 23;' } + then: + - if: { condition: { lambda: 'return id(g_gesture) >= 0;' }, then: [ lambda: 'id(g_mode) = 15;', script.execute: ui_render ] } + # === FACTORY confirm (22) === tap=YES (reset+restart); right/hold=NO + - if: + condition: { lambda: 'return id(g_mode0) == 22;' } + then: + - if: + condition: { lambda: 'return id(g_gesture) == 0;' } + then: + - lambda: |- + id(g_bright)=100; id(g_night)=false; id(g_show_weather)=false; id(g_show_climate)=false; id(g_watchface)=0; id(g_ww_on)=true; id(g_set_min)=60; id(g_beep_ww)=true; id(g_hold_talk)=true; id(g_night_from)=22; id(g_night_to)=7; id(g_blank_idx)=0; id(g_factory_reset)=true; + - button.press: btn_restart + - if: { condition: { lambda: 'return id(g_gesture) == 3 || id(g_gesture) == 1;' }, then: [ lambda: 'id(g_mode) = 15;', script.execute: ui_render ] } + # === INFO (7) === any gesture = return to the settings list + - if: + condition: + lambda: 'return id(g_mode0) == 7;' + then: + - if: + condition: { lambda: 'return id(g_gesture) >= 0;' } + then: + - lambda: 'id(g_mode) = 5;' + - script.execute: ui_render + +display: + - platform: mipi_spi + id: main_display + model: JC3636W518V2 + data_rate: 80MHz + color_order: rgb + rotation: 0 + cs_pin: 14 + reset_pin: 21 + invert_colors: true + auto_clear_enabled: false + update_interval: never + dimensions: + height: 360 + width: 360 + +############################################################################### +# FONTS (Latin glyphs incl. diacritics) + PLAYER DATA + ALBUM ART +############################################################################### +font: + - file: "gfonts://Roboto" + id: font_med + size: 22 + glyphsets: [GF_Latin_Core] + ignore_missing_glyphs: true # GF_Latin_Core lists combining accents Roboto's static face lacks - harmless, silence the warning + - file: "gfonts://Roboto" + id: font_artist + size: 16 + glyphsets: [GF_Latin_Core] + ignore_missing_glyphs: true + - file: "gfonts://Roboto" + id: font_sel + size: 28 + glyphsets: [GF_Latin_Core] + ignore_missing_glyphs: true + # Big bell for the alarm screen (single MDI glyph) + - file: "https://github.com/Templarian/MaterialDesign-Webfont/raw/v7.4.47/fonts/materialdesignicons-webfont.ttf" + id: font_bell + size: 72 + bpp: 4 + glyphs: [ "\U000F009A" ] + # Material Design icons (for the control tiles) - ESPHome downloads the TTF at compile time + - file: "https://github.com/Templarian/MaterialDesign-Webfont/raw/v7.4.47/fonts/materialdesignicons-webfont.ttf" + id: icons34 + size: 34 + bpp: 4 + glyphs: + # smart-home icon set (reference these by name in tileN_icon) + - "\U000f0335" + - "\U000f06b5" + - "\U000f07d6" + - "\U000f0425" + - "\U000f06a5" + - "\U000f0521" + - "\U000f0210" + - "\U000f001b" + - "\U000f0438" + - "\U000f050f" + - "\U000f033e" + - "\U000f033f" + - "\U000f081a" + - "\U000f00ac" + - "\U000f0502" + - "\U000f04c3" + - "\U000f009a" + - "\U000f05a9" + - "\U000f02dc" + - "\U000f0241" + - "\U000f0d44" + - "\U000f0e66" + - "\U000f06ba" + - "\U000f048b" + - "\U000f068a" + - "󰖐" + - "󰖑" + - "󰖓" + - "󰖔" + - "󰖕" + - "󰖖" + - "󰖗" + - "󰖘" + - "󰖙" + - "󰖝" + + - file: "https://github.com/Templarian/MaterialDesign-Webfont/raw/v7.4.47/fonts/materialdesignicons-webfont.ttf" + id: icons18 + size: 20 + bpp: 4 + glyphs: + - "󰋑" + - "󰔏" + - "󰖎" + - "\U000f09de" + - "\U000f09df" + +text_sensor: + - platform: wifi_info # IP for the Info screen (settings) + ip_address: + id: wifi_ip + # Control-tile states -> tile colour (on = accent, off = dark) + - platform: homeassistant + id: st_tile1 + entity_id: ${tile1_entity} + on_value: + - if: + condition: { lambda: 'return x == "on";' } + then: + - lvgl.widget.update: { id: tile1, bg_color: 0xF5B83D, border_color: 0xFFD27A, shadow_opa: 70% } + - lvgl.label.update: { id: tile1_ic, text_color: 0x231803 } + - lvgl.label.update: { id: tile1_lbl, text_color: 0x231803 } + else: + - lvgl.widget.update: { id: tile1, bg_color: 0x161A22, border_color: 0x2A303C, shadow_opa: 0% } + - lvgl.label.update: { id: tile1_ic, text_color: 0x707A8A } + - lvgl.label.update: { id: tile1_lbl, text_color: 0x9AA3B0 } + - platform: homeassistant + id: st_tile2 + entity_id: ${tile2_entity} + on_value: + - if: + condition: { lambda: 'return x == "on";' } + then: + - lvgl.widget.update: { id: tile2, bg_color: 0xF5B83D, border_color: 0xFFD27A, shadow_opa: 70% } + - lvgl.label.update: { id: tile2_ic, text_color: 0x231803 } + - lvgl.label.update: { id: tile2_lbl, text_color: 0x231803 } + else: + - lvgl.widget.update: { id: tile2, bg_color: 0x161A22, border_color: 0x2A303C, shadow_opa: 0% } + - lvgl.label.update: { id: tile2_ic, text_color: 0x707A8A } + - lvgl.label.update: { id: tile2_lbl, text_color: 0x9AA3B0 } + - platform: homeassistant + id: st_tile3 + entity_id: ${tile3_entity} + on_value: + - if: + condition: { lambda: 'return x == "on";' } + then: + - lvgl.widget.update: { id: tile3, bg_color: 0xF5B83D, border_color: 0xFFD27A, shadow_opa: 70% } + - lvgl.label.update: { id: tile3_ic, text_color: 0x231803 } + - lvgl.label.update: { id: tile3_lbl, text_color: 0x231803 } + else: + - lvgl.widget.update: { id: tile3, bg_color: 0x161A22, border_color: 0x2A303C, shadow_opa: 0% } + - lvgl.label.update: { id: tile3_ic, text_color: 0x707A8A } + - lvgl.label.update: { id: tile3_lbl, text_color: 0x9AA3B0 } + # Weather: state (rainy/sunny/...) -> MDI icon on the home screen + - platform: homeassistant + id: wx_state + entity_id: ${weather_entity} + on_value: + # Map the HA condition -> MDI glyph + a friendly UPPERCASE label, stash both in globals + # (lbl_wx_ic reads the glyph; the Neon watchface reuses glyph + condition text). + - lambda: |- + std::string s = x, g, c; + if (s == "sunny") { g = "󰖙"; c = "SUNNY"; } + else if (s == "clear-night") { g = "󰖔"; c = "CLEAR"; } + else if (s == "partlycloudy") { g = "󰖕"; c = "PARTLY CLOUDY"; } + else if (s == "fog") { g = "󰖑"; c = "FOG"; } + else if (s == "windy" || s == "windy-variant") { g = "󰖝"; c = "WINDY"; } + else if (s == "lightning" || s == "lightning-rainy") { g = "󰖓"; c = "STORM"; } + else if (s == "pouring") { g = "󰖖"; c = "POURING"; } + else if (s == "rainy") { g = "󰖗"; c = "RAINY"; } + else if (s == "snowy" || s == "snowy-rainy" || s == "hail") { g = "󰖘"; c = "SNOW"; } + else { g = "󰖐"; c = "CLOUDY"; } + id(g_nf_glyph) = g; id(g_nf_cond) = c; + - lvgl.label.update: { id: lbl_wx_ic, text: !lambda 'return id(g_nf_glyph);' } +############################################################################### +# LVGL - home page (clock + VA status) and PLAYER page (album art) +############################################################################### +interval: + # Alarm screen pulse: flash the bell + scrim while the alarm is ringing (mode 4) + - interval: 400ms + then: + - if: + condition: { lambda: 'return id(g_mode) == 4;' } + then: + - lambda: 'id(g_alarm_pulse) = !id(g_alarm_pulse);' + - if: + condition: { lambda: 'return id(g_alarm_pulse);' } + then: + - lvgl.widget.update: { id: alarm_scrim, bg_color: 0x520F0F } + - lvgl.label.update: { id: alarm_bell, text_color: 0xFFFFFF } + else: + - lvgl.widget.update: { id: alarm_scrim, bg_color: 0x2E0808 } + - lvgl.label.update: { id: alarm_bell, text_color: 0xFF7A6A } + # Boot splash: type out "HELLO!" then cross-fade to the clock (~5 s), once at startup. + - interval: 150ms + then: + - if: + condition: { lambda: 'return id(g_boot);' } + then: + - lambda: 'id(g_boot_t)++;' + - lvgl.label.update: { id: lbl_boot, text: !lambda 'std::string w = "HELLO!"; int n = id(g_boot_t); if (n > (int) w.size()) n = w.size(); return w.substr(0, n);' } + - if: + condition: { lambda: 'return id(g_boot_t) >= 33;' } # 33 * 150ms ~= 5 s + then: + - lambda: 'id(g_boot) = false;' + - safe_mode.mark_successful: # commit this OTA image now so a restart won't roll back to the old firmware + - script.execute: face_apply # reveal the active home watchface (Classic page_home, or a face's own page) + - interval: 2s + then: + - lambda: |- + id(g_idle_ticks)++; + bool off = false; + if (id(g_night) && id(ha_time).now().is_valid()) { + int h = id(ha_time).now().hour, f = id(g_night_from), t = id(g_night_to); + bool inwin = (f < t) ? (h >= f && h < t) : (h >= f || h < t); + if (inwin && id(g_idle_ticks) * 2 >= 10) off = true; + } + int secs[5] = {0, 15, 30, 60, 300}; + int bs = secs[id(g_blank_idx) % 5]; + if (bs > 0 && id(g_idle_ticks) * 2 >= bs) off = true; + if (id(g_va_active) || id(g_mode) == 3 || id(g_mode) == 4) off = false; + id(g_want_off) = off; + - if: + condition: { lambda: 'return id(g_want_off) && !id(g_disp_off);' } + then: + - light.turn_off: backlight_light + - lambda: 'id(g_disp_off) = true;' + - if: + condition: { lambda: 'return !id(g_want_off) && id(g_disp_off);' } + then: + - light.turn_on: { id: backlight_light, brightness: !lambda 'return id(g_bright) / 100.0f;' } + - lambda: 'id(g_disp_off) = false;' + - interval: 1s + then: + # TZ self-heal: some ESPHome builds reset the device timezone to UTC at runtime (e.g. on a + # menu restart or when a log/API client without a TZ reconnects), so the clock jumps to UTC. + # g_tz_posix was resolved at boot (from the `timezone` substitution, or the time component); + # re-assert it every tick so a stray UTC reset can't stick. (No-op once it is correct.) + - lambda: 'if (!id(g_tz_posix).empty()) { setenv("TZ", id(g_tz_posix).c_str(), 1); tzset(); }' + # Battery: while charging - "filling" animation; when full (≥99%) - static full icon. + - lambda: 'if (id(g_charging)) id(g_chg_anim) = (id(g_chg_anim) + 1) % 5;' + - script.execute: batt_render + # Clock/date: redraw only when the minute actually changes (not every second) + - lambda: |- + id(g_home_upd_min) = false; + auto t = id(ha_time).now(); + if (t.is_valid()) { int mn = t.hour * 60 + t.minute; if (mn != id(g_home_last_min)) { id(g_home_last_min) = mn; id(g_home_upd_min) = true; } } + - if: + condition: { lambda: 'return id(g_home_upd_min);' } + then: + - lvgl.label.update: + id: lbl_clock + text: !lambda 'return id(ha_time).now().strftime("%H:%M");' + - lvgl.label.update: + id: lbl_date + text: !lambda |- + auto t = id(ha_time).now(); + static const char* d[8] = {"","Su","Mo","Tu","We","Th","Fr","Sa"}; + std::string day = (t.day_of_week >= 1 && t.day_of_week <= 7) ? std::string(d[t.day_of_week]) : std::string(""); + return t.strftime("%d.%m") + " " + day; + # Screen-timer countdown (g_timer_active). From the button: local. From VA: HA calls finished, locally smooth. + - if: + condition: + lambda: 'return id(g_timer_active) && !id(g_timer_paused);' + then: + - lambda: 'id(g_timer_secs)--;' + - script.execute: timer_render + - if: # button timer reached zero -> alarm (with VA the alarm fires on on_timer_finished) + condition: { lambda: 'return id(g_timer_local) && id(g_timer_secs) <= 0;' } + then: + - script.execute: alarm_start + # Timer badge on the home screen (red) - time left (rounded up to minutes) + - if: + condition: { lambda: 'return id(g_timer_active);' } + then: + - lvgl.widget.show: lbl_timer + - lvgl.label.update: + id: lbl_timer + text: !lambda |- + int s = id(g_timer_secs); if (s < 0) s = 0; + int m = (s + 59) / 60; + char b[24]; snprintf(b, sizeof(b), " %d min", m); + return std::string(b); + else: + - lvgl.widget.hide: lbl_timer + - if: # refresh the alarm overlay every second + condition: + lambda: 'return id(g_mode) == 4;' + then: + - script.execute: ui_render + - if: # alarm: repeat the sound every ~2 s + condition: + lambda: 'return id(g_mode) == 4;' + then: + - lambda: 'id(g_alarm_cnt)++;' + - if: + condition: + lambda: 'return id(g_alarm_cnt) % 2 == 0;' + then: + - media_player.speaker.play_on_device_media_file: + id: media_player_speaker + media_file: alarm_sound + announcement: true + +lvgl: + # A <25% buffer lands in FAST internal RAM (instead of slow PSRAM at the default 100%) + buffer_size: 24% + displays: + - main_display + touchscreens: + - my_touchscreen + # Always-on-top layer: assistant overlay (dim + frame + text) + top_layer: + widgets: + # Watchface picker overlay (shown only in pick mode 33) - last so it draws on top. + # A bottom sheet: rounded top, square bottom pushed BELOW the screen edge (y:24 puts the + # bottom + its corner radius off-display), so only the straight sides reach the edge. + - obj: + id: pick_bar + align: BOTTOM_MID + y: 24 + width: 210 + height: 96 + radius: 24 + bg_color: 0x0A0E16 + bg_opa: 82% + border_width: 1 + border_color: 0xF5B83D + border_opa: 35% + pad_all: 0 + clickable: false + scrollable: false + hidden: true + widgets: + - label: # left chevron (turn the knob) + id: pick_chevl + align: TOP_LEFT + x: 16 + y: 16 + text: "<" + text_font: font_sel + text_color: 0x55606E + - label: # right chevron + id: pick_chevr + align: TOP_RIGHT + x: -16 + y: 16 + text: ">" + text_font: font_sel + text_color: 0x55606E + - label: # face name (set by facepick_render) + id: pick_name + align: TOP_MID + y: 12 + text: "" + text_font: font_sel + text_color: 0xFFFFFF + - label: # subtle hint + id: pick_help + align: TOP_MID + y: 44 + text: "Tap to keep" + text_font: font_artist + text_color: 0x6A7280 + - obj: + id: va_dim + x: 0 + y: 0 + width: 360 + height: 360 + radius: 0 + border_width: 0 + bg_color: 0x000000 + bg_opa: 100% + hidden: true + - arc: + id: va_frame + align: CENTER + width: 320 + height: 320 + arc_width: 2 + min_value: 0 + max_value: 100 + value: 0 + start_angle: 0 + end_angle: 360 + adjustable: false + arc_color: 0x0E5E54 + indicator: + arc_opa: 0% + hidden: true + - label: + id: va_text + align: CENTER + text: "" + text_font: font_med + text_color: 0x5FF0D9 + hidden: true + # Volume overlay - on top_layer, so it shows on EVERY screen while turning + - obj: + id: vol_dim + x: 0 + y: 0 + width: 360 + height: 360 + radius: 0 + border_width: 0 + bg_color: 0x000000 + bg_opa: 55% + hidden: true + - arc: + id: vol_arc + align: CENTER + width: 350 + height: 350 + arc_width: 8 + min_value: 0 + max_value: 100 + value: 50 + start_angle: 135 + end_angle: 45 + adjustable: false + hidden: true + arc_color: 0x0C4A44 + indicator: + arc_color: 0x42F4DC + arc_width: 8 + - label: + id: vol_label + align: TOP_MID + y: 40 + hidden: true + text: "50%" + text_color: 0x5FF0D9 + text_font: montserrat_20 + pages: + # --- Home page: clock + Assistant status --- + # --- Boot splash: typewriter "HELLO!" then fade to the clock (driven by the 150ms interval) --- + - id: page_boot + bg_color: 0x000000 + widgets: + # Rotating arc around the greeting - the "spinning" boot animation. + - spinner: + id: boot_spin + align: CENTER + width: 300 + height: 300 + spin_time: 1500ms + arc_length: 70deg + arc_width: 6 + arc_color: 0x16302B # faint static track + indicator: + arc_color: 0x5FF0D9 # bright sweeping arc (brand cyan) + arc_width: 6 + - label: { id: lbl_boot, align: CENTER, y: -10, text: "", text_font: montserrat_48, text_color: 0xFFFFFF } + - label: { id: lbl_boot_sub, align: CENTER, y: 40, text: "${friendly_name}", text_font: font_med, text_color: 0x5FF0D9 } + - id: page_home + bg_color: 0x000000 + widgets: + - obj: # faint outer ring for depth (matches the other screens) + id: home_ring_out + align: CENTER + width: 340 + height: 340 + radius: 170 + bg_opa: TRANSP + border_width: 2 + border_color: 0x1A1F2A + border_opa: 70% + clickable: false + scrollable: false + - label: + id: lbl_clock + align: CENTER + y: -22 + text: "--:--" + text_color: 0xFFFFFF + text_font: montserrat_48 + - label: + id: lbl_date + align: CENTER + y: 34 + text: "" + text_color: 0x6f9a92 + text_font: font_med + - label: + id: lbl_batt + align: BOTTOM_MID + y: -30 + text: "" + text_color: 0x6f9a92 + text_font: montserrat_18 + - label: # red badge: timer active - time left (TOP) + id: lbl_timer + align: TOP_MID + y: 22 + text: "" + text_font: montserrat_18 + text_color: 0xFFFFFF + bg_color: 0xFF3B30 + bg_opa: COVER + radius: 14 + pad_left: 12 + pad_right: 12 + pad_top: 5 + pad_bottom: 5 + hidden: true + - label: + id: lbl_wx_ic + align: CENTER + x: -22 + y: -92 + text: "󰖐" + text_font: icons34 + text_color: 0xBFD2DA + hidden: true + - label: + id: lbl_wx_val + align: CENTER + x: 22 + y: -92 + text: "-" + text_font: font_med + text_color: 0xE8E8EA + hidden: true + - label: + id: lbl_ct_ic + align: CENTER + x: -88 + y: 78 + text: "󰔏" + text_font: icons18 + text_color: 0xFF8A5C + hidden: true + - label: + id: lbl_ct_val + align: CENTER + x: -52 + y: 78 + text: "-" + text_font: font_med + text_color: 0xE8E8EA + hidden: true + - label: + id: lbl_ch_ic + align: CENTER + x: 24 + y: 78 + text: "󰖎" + text_font: icons18 + text_color: 0x3FA9D6 + hidden: true + - label: + id: lbl_ch_val + align: CENTER + x: 56 + y: 78 + text: "-" + text_font: font_med + text_color: 0xE8E8EA + hidden: true + - id: page_mode + bg_color: 0x000000 + widgets: + # Menu / timer / alarm overlay (controlled by ui_render) + - obj: + id: ui_dim + x: 0 + y: 0 + width: 360 + height: 360 + radius: 0 + border_width: 0 + bg_color: 0x000000 + bg_opa: 100% + hidden: true + - obj: + id: ui_head_bg + align: TOP_MID + y: 0 + width: 360 + height: 46 + radius: 0 + border_width: 0 + bg_color: 0x42F4DC + bg_opa: COVER + hidden: true + - label: + id: ui_head + align: TOP_MID + y: 15 + text: "" + text_font: font_artist + text_color: 0x000000 + hidden: true + - label: + id: ui_big + align: CENTER + y: -12 + text: "" + text_font: montserrat_48 + text_color: 0xFFFFFF + hidden: true + - label: + id: ui_sub + align: CENTER + y: 56 + width: 300 + text_align: CENTER + text: "" + text_font: font_med + text_color: 0x5FF0D9 + hidden: true + # Brightness bar - visible only in mode 6 + - bar: + id: ui_bar + align: CENTER + y: 36 + width: 180 + height: 8 + min_value: 0 + max_value: 100 + value: 100 + hidden: true + indicator: + bg_color: 0xF5B83D + # "Display" submenu (mode 11): item roller + status label of the selected one + - roller: + id: disp_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "Brightness" + - "Night mode" + - "Night from" + - "Night to" + - "Screen auto-off" + selected_index: 0 + hidden: true + - label: # only for "Brightness" (shows %); toggles use disp_switch + id: disp_lbl + align: CENTER + y: 92 + text: "" + text_font: font_artist + text_color: 0x5FF0D9 + hidden: true + - switch: # visual switch state (clickable: false - tapping the screen toggles) + id: disp_switch + align: CENTER + y: 88 + clickable: false + hidden: true + - roller: + id: home_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: # 3rd line is rebuilt at runtime to "Watchface: " (home_roller_build) + - "Show weather" + - "Show climate" + - "Watchface" + selected_index: 0 + hidden: true + - roller: + id: wid_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "..." + selected_index: 0 + hidden: true + - roller: + id: wopt_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "..." + selected_index: 0 + hidden: true + - roller: + id: asys_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "Wake word" + - "Beep wake word" + - "Hold to talk" + selected_index: 0 + hidden: true + - roller: + id: sys_roller + align: CENTER + y: -14 + width: 290 + visible_row_count: 3 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "Info" + - "Battery" + - "Restart" + - "Factory reset" + selected_index: 0 + hidden: true + # ───────── Alarm screen (mode 4): red scrim + pulsing bell + TIME'S UP ───────── + - obj: + id: alarm_scrim + x: 0 + y: 0 + width: 360 + height: 360 + radius: 0 + border_width: 0 + bg_color: 0x3A0A0A + bg_opa: COVER + clickable: false + scrollable: false + hidden: true + - label: + id: alarm_bell + align: CENTER + y: -52 + text: "\U000F009A" + text_font: font_bell + text_color: 0xFFFFFF + hidden: true + - label: + id: alarm_title + align: CENTER + y: 38 + text: "TIME'S UP!" + text_font: font_sel + text_color: 0xFFFFFF + hidden: true + - label: + id: alarm_sub + align: CENTER + y: 76 + text: "Tap to stop" + text_font: font_artist + text_color: 0xF0B4B4 + hidden: true + - id: page_settings + bg_color: 0x000000 + widgets: + - obj: # header bar (amber) + id: ui_head_bg_s + align: TOP_MID + y: 0 + width: 360 + height: 46 + radius: 0 + border_width: 0 + bg_color: 0xF5B83D + bg_opa: COVER + - label: + id: ui_head_s + align: TOP_MID + y: 15 + text: "SETTINGS" + text_font: font_artist + text_color: 0x000000 + # Settings list (mode 5) - animated roller; controlled by the knob (clickable: false) + - roller: + id: settings_roller + align: CENTER + y: 8 + width: 260 + visible_row_count: 5 + clickable: false + text_font: font_med + text_color: 0x9AA3B0 + bg_opa: TRANSP + border_width: 0 + selected: + text_color: 0x231803 + bg_color: 0xF5B83D + bg_opa: COVER + radius: 14 + options: + - "Display" + - "Ring" + - "Assistant" + - "System" + selected_index: 0 + # --- TIMER page (left of the clock): ring + controls --- + - id: page_timer + bg_color: 0x000000 + widgets: + - obj: # faint outer ring for depth + id: timer_ring_out + align: CENTER + width: 332 + height: 332 + radius: 166 + bg_opa: TRANSP + border_width: 2 + border_color: 0x252B37 + border_opa: 65% + clickable: false + scrollable: false + - arc: + id: timer_arc + align: CENTER + width: 300 + height: 300 + arc_width: 14 + adjustable: false + min_value: 0 + max_value: 100 + value: 100 + start_angle: 271 + end_angle: 269 + arc_color: 0x1C2027 + indicator: + arc_color: 0x2FB85C + arc_width: 14 + - obj: # head-dot: a white bead riding the leading edge of the remaining arc (positioned in timer_render) + id: timer_dot + x: 0 + y: 0 + width: 18 + height: 18 + radius: 9 + bg_color: 0xFFFFFF + bg_opa: COVER + border_width: 0 + shadow_color: 0xFFFFFF + shadow_width: 10 + shadow_opa: 55% + clickable: false + scrollable: false + hidden: true + - label: + id: timer_cap + align: CENTER + y: -72 + text: "SET" + text_font: font_artist + text_color: 0x6F9A92 + - label: + id: timer_big + align: CENTER + y: -20 + text: "60:00" + text_font: montserrat_48 + text_color: 0xFFFFFF + - button: + id: timer_play + align: CENTER + y: 54 + width: 58 + height: 58 + radius: 29 + bg_color: 0x2FB85C + bg_opa: COVER + border_width: 0 + shadow_color: 0x2FB85C + shadow_width: 18 + shadow_opa: 55% + on_click: + - script.execute: timer_start + widgets: + - label: { align: CENTER, text: "", text_font: montserrat_28, text_color: 0xFFFFFF } + - button: + id: timer_pause + align: CENTER + x: -40 + y: 54 + width: 52 + height: 52 + radius: 26 + bg_color: 0xF5B83D + bg_opa: COVER + border_width: 0 + shadow_color: 0xF5B83D + shadow_width: 14 + shadow_opa: 50% + hidden: true + on_click: + - script.execute: timer_toggle + widgets: + - label: { id: timer_pause_ic, align: CENTER, text: "", text_font: montserrat_22, text_color: 0x231803 } + - button: + id: timer_stop + align: CENTER + x: 40 + y: 54 + width: 52 + height: 52 + radius: 26 + bg_color: 0x1E232E + bg_opa: COVER + border_width: 2 + border_color: 0x2E3540 + hidden: true + on_click: + - script.execute: timer_halt + widgets: + - label: { align: CENTER, text: "", text_font: montserrat_22, text_color: 0xFF6B60 } + # --- CONTROLS page (swipe up): 4 configurable HA toggles (entity/icon/name in substitutions) --- + - id: page_controls + bg_color: 0x0A0E16 + widgets: + - button: + id: tile1 + align: CENTER + x: -61 + y: -61 + width: 110 + height: 110 + radius: 22 + bg_color: 0x161A22 + bg_opa: COVER + border_width: 2 + border_color: 0x2A303C + shadow_color: 0xF5B83D + shadow_width: 18 + shadow_spread: 1 + shadow_opa: 0% + on_click: + - homeassistant.action: { action: homeassistant.toggle, data: { entity_id: "${tile1_entity}" } } + widgets: + - label: { id: tile1_ic, align: CENTER, y: -16, text: "", text_font: icons34, text_color: 0x707A8A } + - label: { id: tile1_lbl, align: CENTER, y: 26, width: 100, long_mode: wrap, text_align: CENTER, text: "${tile1_name}", text_font: font_artist, text_color: 0x9AA3B0, text_letter_space: 2 } + - button: + id: tile2 + align: CENTER + x: 61 + y: -61 + width: 110 + height: 110 + radius: 22 + bg_color: 0x161A22 + bg_opa: COVER + border_width: 2 + border_color: 0x2A303C + shadow_color: 0xF5B83D + shadow_width: 18 + shadow_spread: 1 + shadow_opa: 0% + on_click: + - homeassistant.action: { action: homeassistant.toggle, data: { entity_id: "${tile2_entity}" } } + widgets: + - label: { id: tile2_ic, align: CENTER, y: -16, text: "", text_font: icons34, text_color: 0x707A8A } + - label: { id: tile2_lbl, align: CENTER, y: 26, width: 100, long_mode: wrap, text_align: CENTER, text: "${tile2_name}", text_font: font_artist, text_color: 0x9AA3B0, text_letter_space: 2 } + - button: + id: tile3 + align: CENTER + x: 61 + y: 61 + width: 110 + height: 110 + radius: 22 + bg_color: 0x161A22 + bg_opa: COVER + border_width: 2 + border_color: 0x2A303C + shadow_color: 0xF5B83D + shadow_width: 18 + shadow_spread: 1 + shadow_opa: 0% + on_click: + - homeassistant.action: { action: homeassistant.toggle, data: { entity_id: "${tile3_entity}" } } + widgets: + - label: { id: tile3_ic, align: CENTER, y: -16, text: "", text_font: icons34, text_color: 0x707A8A } + - label: { id: tile3_lbl, align: CENTER, y: 26, width: 100, long_mode: wrap, text_align: CENTER, text: "${tile3_name}", text_font: font_artist, text_color: 0x9AA3B0, text_letter_space: 2 } diff --git a/base/screens/README.md b/base/screens/README.md new file mode 100644 index 0000000..2af8220 --- /dev/null +++ b/base/screens/README.md @@ -0,0 +1,95 @@ +# Modular screens (beta) + +Goal: pick which carousel screens are compiled in, straight from the YAML - comment a +line in `packages:` and the screen is gone from the firmware (and the flash it used). + +This is a **beta** layout on the `beta` branch. It needs to be compiled on a device +(there is no local validation here). Until it is verified, `main` keeps the single-file +config. + +## How you choose screens + +You keep one thin file locally (`guition-va.yaml`, repo root) that pulls the core and the +screens from GitHub as a remote package. Pick screens in its `files:` list: + +```yaml +packages: + core: + url: https://github.com/MichalZaniewicz/esphome-guition-jc3636k718c-va + ref: beta + files: + - base/core.yaml # always on (clock + controls + settings) + - base/screens/timer.yaml + - base/screens/cool-cars.yaml + - base/screens/space-wars.yaml # comment out to drop Space Wars + refresh: 0s +``` + +Remove/comment a `base/screens/*.yaml` line -> that screen's page, scripts, globals and +game tick are not compiled, and its carousel slot disappears. Nothing else to edit. + +## How it stays decoupled (the contract) + +ESPHome merges package lists (globals/scripts/interval/lvgl.pages/esphome.on_boot all +concatenate), so each screen file is self-contained and the core never names a screen's +symbols. The glue is a few plain globals in the core: + +- `g_base` (int) - id of the current carousel screen. Fixed ids: 0=clock, 1=player, + 2=timer, 3=cars, 4=space (an id never changes, even if a screen is absent). +- `g_order[12]`, `g_order_n` - carousel order, built at boot. Core seeds clock+player; + each screen package appends its id in an `esphome.on_boot` step (priority sets the + position). Swipe left/right just steps through `g_order` and wraps. +- `g_nav_req` (bool) + `g_nav_anim` (int: 0=right 1=left 2=top 3=bottom) - core sets + these on a screen change; each screen package owns a small handler that, when + `g_base == `, runs its own `lvgl.page.show` with the matching animation and + clears `g_nav_req`. Core only `page.show`s its own (clock/player). +- `g_knob_capture` (bool) + `g_knob_delta` (int) - when a screen wants the knob (game + running, timer idle), it sets `g_knob_capture=true`; the core knob handler then just + accumulates +/-1 into `g_knob_delta` instead of changing volume. The screen reads and + zeroes `g_knob_delta` in its own tick. Core never names a game variable. +- Per-screen **settings registry** (`g_wgrp_*` + `g_wopt_*`) - a screen declares its own + Settings -> Widgets group and options in `on_boot`: append a group name to + `g_wgrp_labels`, then append each option (label + kind 0=toggle / 1=action + a `bool*` + to its own global) to `g_wopt_*`. The core renders them generically (modes 30 options / + 31 confirm). The option globals live in the screen package, not the core. +- `g_factory_reset` (bool, persists a reboot) - Settings -> System -> Factory reset sets + it; each game package clears its own score globals when it sees the flag in its tick. + +So a screen package contributes: its `globals`, its `script`s, its game-tick `interval`, +its `lvgl.pages` entry, an `on_boot` step to register its carousel id (and any Settings +group/options), and one nav handler. It reads/writes only the shared core globals above. + +## Status + +- [x] core refactor: data-driven carousel (`g_order`), nav via `g_nav_req`, knob via + `g_knob_capture`/`g_knob_delta`. +- [x] extract Space Wars -> `base/screens/space-wars.yaml` +- [x] extract Cool Cars -> `base/screens/cool-cars.yaml` +- [x] extract Player -> `base/screens/player.yaml` (volume + overlay stay in core) +- [x] timer carousel-screen toggle -> `base/screens/timer.yaml` (voice timers/alarm/badge stay in core) +- [x] new Weather screen -> `base/screens/weather.yaml` (radial 7-day dial, knob highlights the day; + forecast from the HA helper `base/screens/weather.ha-helper.yaml`) +- [x] new Thermostat screen -> `base/screens/thermostat.yaml` (climate.* dial; knob sets the target with a + debounced commit, tap toggles on/off, accent colour by heating/cooling/idle) +- [x] settings ownership: home-screen widget toggles moved to a "Home" submenu (core); "Display" + keeps only global brightness/night/screen-off +- [x] carousel order via the `screen_order` substitution; screens register `g_present`, + absent ones are skipped (clock kept as a safety fallback) +- [x] self-contained screen settings: each screen declares its Widgets group + options + (toggles/actions) and owns the backing globals; the core renders them generically + (`g_wgrp_*` / `g_wopt_*`, modes 30/31). Game scores + reset live in the game packages. +- [x] verified on device (compiles; screens toggle from `files:`, order from `screen_order`, + settings list adapts) +- [x] merged to `main` (stable); `beta` is the active dev branch + +## Adding a new screen (recipe) + +A screen package adds: its `globals` / `script`s / game-tick `interval` / `lvgl.pages` +entry; an `esphome.on_boot` step that sets `id(g_present)[] = true`; a 50ms nav +handler that shows its page when `g_nav_req && g_base == `. To give it a carousel +slot, add its name to the core `name -> id` map in the order builder and to `screen_order`. + +To add Settings, register a Widgets group + options in `on_boot` (see `demo.yaml` / +`weather.yaml` as templates): claim `int g = id(g_wgrp_n)++;`, append the group name to +`id(g_wgrp_labels)`, then for each option append to `g_wopt_*` (group `g`, a label, kind +0=toggle / 1=action, and `&id(your_global)`). Declare those globals in your own file. diff --git a/base/screens/cool-cars.yaml b/base/screens/cool-cars.yaml new file mode 100644 index 0000000..ad0f7c1 --- /dev/null +++ b/base/screens/cool-cars.yaml @@ -0,0 +1,565 @@ +# Cool Cars - optional carousel screen (base id 3). Lane racer. +# Remove it: drop this file from your config's package "files:" list. Nothing else to edit. +# Scores (g_top / g_best) + the "Reset scores" settings action live here - fully self-contained. + +esphome: + on_boot: + - priority: 670 + then: + - lambda: 'id(g_present)[3] = true;' # register after clock/player/timer + # Settings (Settings -> Widgets -> Cool Cars -> Reset scores) + factory-reset handling. + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\n" : ""); id(g_wgrp_labels) += "Cool Cars"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Reset scores"; id(g_wopt_kind)[o] = 1; id(g_wopt_ptr)[o] = &id(g_cars_reset); + +globals: + # --- scores (persistent) + reset flag, owned by this package --- + - id: g_best + type: int + restore_value: yes + initial_value: '0' + - id: g_top + type: int[10] + restore_value: yes + - id: g_cars_reset # Widgets "Reset scores" sets this; the watcher below clears the scores + type: bool + restore_value: no + initial_value: 'false' + # --- "Car" game (page_game screen, g_base==3) --- + - id: g_game_state # 0=idle 1=playing 2=game over + type: int + restore_value: no + initial_value: '0' + - id: g_car_lane # car lane 0/1/2 + type: int + restore_value: no + initial_value: '1' + - id: g_score + type: int + restore_value: no + initial_value: '0' + - id: g_gspeed # obstacle speed (px/tick) + type: int + restore_value: no + initial_value: '7' + - id: g_lives # lives (3) - game v2 + type: int + restore_value: no + initial_value: '3' + - id: g_inv # invulnerability frames after a hit (anti double-hit) + type: int + restore_value: no + initial_value: '0' + - id: g_o1_type # car obstacle: 0=cop 1=muscle 2=sedan + type: int + restore_value: no + initial_value: '0' + - id: g_o1_lane + type: int + restore_value: no + initial_value: '0' + - id: g_o1_x # X position (horizontal; they move left) + type: int + restore_value: no + initial_value: '200' + - id: g_o2_type # obstacle: 0=cop 1=muscle 2=sedan 3=cone (all = crash) + type: int + restore_value: no + initial_value: '0' + - id: g_o2_lane + type: int + restore_value: no + initial_value: '2' + - id: g_o2_x + type: int + restore_value: no + initial_value: '320' + - id: g_o3_type # 3rd obstacle (more = harder) + type: int + restore_value: no + initial_value: '1' + - id: g_o3_lane + type: int + restore_value: no + initial_value: '1' + - id: g_o3_x + type: int + restore_value: no + initial_value: '460' + - id: g_cn_lane # coin + type: int + restore_value: no + initial_value: '1' + - id: g_cn_x + type: int + restore_value: no + initial_value: '440' + - id: g_cn_on + type: bool + restore_value: no + initial_value: 'true' + - id: g_dash_off # offset of the dashed lane lines (0..359) + type: int + restore_value: no + initial_value: '0' + +script: + # --- "Car" game --- + - id: car_render # car lane (Y) + score + lives (hearts) + message per state + then: + - lvgl.widget.update: { id: car, y: !lambda 'return (id(g_car_lane) - 1) * 55;' } + - lvgl.label.update: + id: lbl_game_score + text: !lambda 'char b[10]; snprintf(b, sizeof(b), "%d", id(g_score)); return std::string(b);' + - lvgl.label.update: + id: lbl_lives + text: !lambda |- + std::string h; for (int i = 0; i < id(g_lives); i++) h += "󰋑"; return h; + # Shows the correct game screen per state (0=menu 1=playing 2=game over 3=how-to 4=scores) + - id: game_screen + then: + # knob steers only during play + game over -> capture it there (block volume), free it in menu/how-to/scores + - lambda: 'id(g_knob_capture) = (id(g_game_state) == 1 || id(g_game_state) == 2);' + # 1) hide everything + - lvgl.widget.hide: road_bg + - lvgl.widget.hide: logo_bg + - lvgl.widget.hide: car + - lvgl.widget.hide: obs1 + - lvgl.widget.hide: obs2 + - lvgl.widget.hide: obs3 + - lvgl.widget.hide: coin + - lvgl.widget.hide: dl0 + - lvgl.widget.hide: dl1 + - lvgl.widget.hide: db0 + - lvgl.widget.hide: db1 + - lvgl.widget.hide: lbl_lives + - lvgl.widget.hide: lbl_game_score + - lvgl.widget.hide: hit_flash + - lvgl.widget.hide: btn_start + - lvgl.widget.hide: btn_howto + - lvgl.widget.hide: btn_scores + - lvgl.widget.hide: lbl_over + - lvgl.widget.hide: lbl_rec + - lvgl.widget.hide: btn_replay + - lvgl.widget.hide: btn_exit + - lvgl.widget.hide: lbl_howto_t + - lvgl.widget.hide: lbl_howto1 + - lvgl.widget.hide: lbl_howto2 + - lvgl.widget.hide: lbl_howto_b + - lvgl.widget.hide: img_howcoin + - lvgl.widget.hide: lbl_howto_l + - lvgl.widget.hide: lbl_howheart + - lvgl.widget.hide: badge1 + - lvgl.widget.hide: badge2 + - lvgl.widget.hide: badge3 + - lvgl.widget.hide: badge4 + - lvgl.widget.hide: lbl_scores_t + - lvgl.widget.hide: lbl_scores1 + - lvgl.widget.hide: lbl_scores2 + - lvgl.widget.hide: btn_back + # 2) show per state + - if: # MENU + condition: { lambda: 'return id(g_game_state) == 0;' } + then: + - lvgl.widget.show: logo_bg + - lvgl.widget.show: btn_start + - lvgl.widget.show: btn_howto + - lvgl.widget.show: btn_scores + - if: # GAME + condition: { lambda: 'return id(g_game_state) == 1;' } + then: + - lvgl.widget.show: road_bg + - lvgl.widget.show: car + - lvgl.widget.show: obs1 + - lvgl.widget.show: obs2 + - lvgl.widget.show: obs3 + - lvgl.widget.show: coin + - lvgl.widget.show: dl0 + - lvgl.widget.show: dl1 + - lvgl.widget.show: db0 + - lvgl.widget.show: db1 + - lvgl.widget.show: lbl_lives + - lvgl.widget.show: lbl_game_score + - if: # GAME OVER + condition: { lambda: 'return id(g_game_state) == 2;' } + then: + - lvgl.widget.show: logo_bg + - lvgl.widget.show: lbl_over + - lvgl.widget.show: lbl_rec + - lvgl.widget.show: btn_replay + - lvgl.widget.show: btn_exit + - lvgl.label.update: { id: lbl_over, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Score: %d", id(g_score)); return std::string(b);' } + - lvgl.label.update: { id: lbl_rec, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Best: %d", id(g_best)); return std::string(b);' } + - if: # HOW TO PLAY + condition: { lambda: 'return id(g_game_state) == 3;' } + then: + - lvgl.widget.show: lbl_howto_t + - lvgl.widget.show: lbl_howto1 + - lvgl.widget.show: lbl_howto2 + - lvgl.widget.show: lbl_howto_b + - lvgl.widget.show: img_howcoin + - lvgl.widget.show: lbl_howto_l + - lvgl.widget.show: lbl_howheart + - lvgl.widget.show: badge1 + - lvgl.widget.show: badge2 + - lvgl.widget.show: badge3 + - lvgl.widget.show: badge4 + - lvgl.widget.show: btn_back + - if: # SCORES (top 10) + condition: { lambda: 'return id(g_game_state) == 4;' } + then: + - lvgl.widget.show: lbl_scores_t + - lvgl.widget.show: lbl_scores1 + - lvgl.widget.show: lbl_scores2 + - lvgl.widget.show: btn_back + - lvgl.label.update: + id: lbl_scores1 + text: !lambda |- + std::string s; char b[24]; + for (int i = 0; i < 5; i++) { if(i) s += "\n"; if(id(g_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + - lvgl.label.update: + id: lbl_scores2 + text: !lambda |- + std::string s; char b[24]; + for (int i = 5; i < 10; i++) { if(i>5) s += "\n"; if(id(g_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + - id: score_render # score with "$" (refreshed on change, not every tick) + then: + - lvgl.label.update: + id: lbl_game_score + text: !lambda 'char b[10]; snprintf(b, sizeof(b), "%d", id(g_score)); return std::string(b);' + - id: obs1_spawn # obstacle: 0=cop 1=muscle 2=sedan 3=cone + then: + - lambda: |- + id(g_o1_type) = esp_random() % 4; + id(g_o1_lane) = esp_random() % 3; + id(g_o1_x) = 200 + (int)(esp_random() % 120); + - if: { condition: { lambda: 'return id(g_o1_type)==0;' }, then: [lvgl.image.update: { id: obs1, src: img_cop }] } + - if: { condition: { lambda: 'return id(g_o1_type)==1;' }, then: [lvgl.image.update: { id: obs1, src: img_mus }] } + - if: { condition: { lambda: 'return id(g_o1_type)==2;' }, then: [lvgl.image.update: { id: obs1, src: img_sed }] } + - if: { condition: { lambda: 'return id(g_o1_type)==3;' }, then: [lvgl.image.update: { id: obs1, src: img_cone }] } + - lvgl.widget.update: { id: obs1, x: !lambda 'return id(g_o1_x);', y: !lambda 'return (id(g_o1_lane)-1)*55;' } + - id: obs2_spawn + then: + - lambda: |- + id(g_o2_type) = esp_random() % 4; + id(g_o2_lane) = esp_random() % 3; + id(g_o2_x) = 260 + (int)(esp_random() % 140); + - if: { condition: { lambda: 'return id(g_o2_type)==0;' }, then: [lvgl.image.update: { id: obs2, src: img_cop }] } + - if: { condition: { lambda: 'return id(g_o2_type)==1;' }, then: [lvgl.image.update: { id: obs2, src: img_mus }] } + - if: { condition: { lambda: 'return id(g_o2_type)==2;' }, then: [lvgl.image.update: { id: obs2, src: img_sed }] } + - if: { condition: { lambda: 'return id(g_o2_type)==3;' }, then: [lvgl.image.update: { id: obs2, src: img_cone }] } + - lvgl.widget.update: { id: obs2, x: !lambda 'return id(g_o2_x);', y: !lambda 'return (id(g_o2_lane)-1)*55;' } + - id: obs3_spawn + then: + - lambda: |- + id(g_o3_type) = esp_random() % 4; + id(g_o3_lane) = esp_random() % 3; + id(g_o3_x) = 340 + (int)(esp_random() % 160); + - if: { condition: { lambda: 'return id(g_o3_type)==0;' }, then: [lvgl.image.update: { id: obs3, src: img_cop }] } + - if: { condition: { lambda: 'return id(g_o3_type)==1;' }, then: [lvgl.image.update: { id: obs3, src: img_mus }] } + - if: { condition: { lambda: 'return id(g_o3_type)==2;' }, then: [lvgl.image.update: { id: obs3, src: img_sed }] } + - if: { condition: { lambda: 'return id(g_o3_type)==3;' }, then: [lvgl.image.update: { id: obs3, src: img_cone }] } + - lvgl.widget.update: { id: obs3, x: !lambda 'return id(g_o3_x);', y: !lambda 'return (id(g_o3_lane)-1)*55;' } + - id: coin_spawn + then: + - lambda: |- + id(g_cn_lane) = esp_random() % 3; + id(g_cn_x) = 220 + (int)(esp_random() % 200); + id(g_cn_on) = true; + - lvgl.widget.show: coin + - lvgl.widget.update: { id: coin, x: !lambda 'return id(g_cn_x);', y: !lambda 'return (id(g_cn_lane)-1)*55;' } + - id: game_start + then: + - lambda: |- + id(g_game_state) = 1; id(g_score) = 0; id(g_gspeed) = 7; + id(g_car_lane) = 1; id(g_lives) = 3; id(g_inv) = 0; + id(g_knob_capture) = true; id(g_knob_delta) = 0; + - lvgl.widget.update: { id: car, x: -120 } + - script.execute: obs1_spawn + - script.execute: obs2_spawn + - script.execute: obs3_spawn + - script.execute: coin_spawn + - script.execute: score_render + - script.execute: game_screen + - script.execute: car_render + - id: lose_life # losing a life: red flash + invulnerability (blinking), 0 lives -> game over + then: + - lambda: 'id(g_lives)--; id(g_inv) = 22;' # ~1.1s invulnerability (scaled for 50ms) + - lvgl.widget.show: hit_flash + - if: + condition: { lambda: 'return id(g_lives) <= 0;' } + then: [ script.execute: game_crash ] + else: [ script.execute: car_render ] + - id: game_crash # GAME OVER (0 lives) - save score + insert into top 10 + then: + - lambda: |- + id(g_game_state) = 2; // game_screen keeps the knob captured on game over (no volume) + int s = id(g_score); + if (s > id(g_best)) id(g_best) = s; + for (int i = 0; i < 10; i++) { + if (s > id(g_top)[i]) { + for (int j = 9; j > i; j--) id(g_top)[j] = id(g_top)[j-1]; + id(g_top)[i] = s; + break; + } + } + - script.execute: game_screen + +interval: + # Reset scores when the Widgets action fired (g_cars_reset). Idempotent + cheap. + - interval: 250ms + then: + - if: + condition: { lambda: 'return id(g_cars_reset) || id(g_factory_reset);' } + then: + - lambda: 'for (int i = 0; i < 10; i++) id(g_top)[i] = 0; id(g_best) = 0; id(g_cars_reset) = false;' + # nav: show this screen when it is selected in the carousel + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==3;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_game_state) = 0;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_game, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_game, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_game, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_game, animation: move_bottom, time: 250ms }] } + - script.execute: game_screen + # "Car" game (driving right) - tick only on the game screen during play. + # 50ms (20fps) so motion is smooth; speeds are scaled down to keep the same px/sec pace. + - interval: 50ms + then: + - if: + condition: + lambda: 'return id(g_base) == 3 && id(g_game_state) == 1;' + then: + - if: + condition: { lambda: 'return id(g_knob_capture) && id(g_knob_delta) != 0;' } + then: + - lambda: 'id(g_car_lane) += id(g_knob_delta); if (id(g_car_lane) < 0) id(g_car_lane) = 0; if (id(g_car_lane) > 2) id(g_car_lane) = 2; id(g_knob_delta) = 0;' + - script.execute: car_render + - lambda: |- + id(g_o1_x) -= id(g_gspeed); + id(g_o2_x) -= id(g_gspeed); + id(g_o3_x) -= id(g_gspeed); + id(g_cn_x) -= id(g_gspeed); + if (id(g_inv) > 0) id(g_inv)--; + int sp = 7 + id(g_score) / 11; if (sp > 16) sp = 16; id(g_gspeed) = sp; // ramps up (scaled for 50ms) + id(g_dash_off) = (id(g_dash_off) + id(g_gspeed)) % 360; + # Recycle obstacles past the left edge (+ a point for dodging, score updated only on change) + - if: + condition: { lambda: 'return id(g_o1_x) < -200;' } + then: [ lambda: 'id(g_score)++;', script.execute: obs1_spawn, script.execute: score_render ] + - if: + condition: { lambda: 'return id(g_o2_x) < -200;' } + then: [ lambda: 'id(g_score)++;', script.execute: obs2_spawn, script.execute: score_render ] + - if: + condition: { lambda: 'return id(g_o3_x) < -200;' } + then: [ lambda: 'id(g_score)++;', script.execute: obs3_spawn, script.execute: score_render ] + - if: + condition: { lambda: 'return id(g_cn_x) < -200;' } + then: [ script.execute: coin_spawn ] + # Collisions (cars + cone = lose a life) + - if: + condition: { lambda: 'return id(g_inv) <= 0 && abs(id(g_o1_x) - (-120)) < 30 && id(g_o1_lane) == id(g_car_lane);' } + then: [ script.execute: lose_life ] + - if: + condition: { lambda: 'return id(g_inv) <= 0 && abs(id(g_o2_x) - (-120)) < 30 && id(g_o2_lane) == id(g_car_lane);' } + then: [ script.execute: lose_life ] + - if: + condition: { lambda: 'return id(g_inv) <= 0 && abs(id(g_o3_x) - (-120)) < 30 && id(g_o3_lane) == id(g_car_lane);' } + then: [ script.execute: lose_life ] + # Coin pickup + - if: + condition: { lambda: 'return id(g_cn_on) && abs(id(g_cn_x) - (-120)) < 28 && id(g_cn_lane) == id(g_car_lane);' } + then: + - lambda: 'id(g_score) += 5; id(g_cn_on) = false;' + - lvgl.widget.hide: coin + - script.execute: coin_spawn + - script.execute: score_render + # Hit effect: red flash fades after a moment, car blinks during invulnerability + - if: + condition: { lambda: 'return id(g_inv) > 0;' } + then: + - lvgl.widget.update: { id: car, hidden: !lambda 'return (id(g_inv) % 4) >= 2;' } + - lvgl.widget.update: { id: hit_flash, hidden: !lambda 'return id(g_inv) < 16;' } + # Move obstacles/coin/dashes in ONE lambda (lv_obj_align) instead of 8 widget.update + # actions - far less per-tick overhead (the pattern that keeps Snake/Knobuss smooth). + - lambda: |- + lv_obj_align(id(obs1), LV_ALIGN_CENTER, id(g_o1_x), (id(g_o1_lane) - 1) * 55); + lv_obj_align(id(obs2), LV_ALIGN_CENTER, id(g_o2_x), (id(g_o2_lane) - 1) * 55); + lv_obj_align(id(obs3), LV_ALIGN_CENTER, id(g_o3_x), (id(g_o3_lane) - 1) * 55); + lv_obj_align(id(coin), LV_ALIGN_CENTER, id(g_cn_x), (id(g_cn_lane) - 1) * 55); + int d0 = ((0 - id(g_dash_off)) % 360 + 360) % 360 - 180; + int d1 = ((180 - id(g_dash_off)) % 360 + 360) % 360 - 180; + lv_obj_align(id(dl0), LV_ALIGN_CENTER, d0, -28); + lv_obj_align(id(dl1), LV_ALIGN_CENTER, d1, -28); + lv_obj_align(id(db0), LV_ALIGN_CENTER, d0, 27); + lv_obj_align(id(db1), LV_ALIGN_CENTER, d1, 27); + +image: + - id: img_road2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/road2.png" + type: RGB565 + - id: img_p + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/pcar2.png" + type: RGB565 + transparency: alpha_channel + - id: img_cop + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/ocop2.png" + type: RGB565 + transparency: alpha_channel + - id: img_mus + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/omus2.png" + type: RGB565 + transparency: alpha_channel + - id: img_sed + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/osed2.png" + type: RGB565 + transparency: alpha_channel + - id: img_coin + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/coin.png" + type: RGB565 + transparency: alpha_channel + - id: img_cone + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/cone.png" + type: RGB565 + transparency: alpha_channel + - id: img_logo + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/cool-cars/logo.png" + type: RGB565 + +lvgl: + pages: + # --- "Car" GAME page (after the player): 3 lanes, car at the bottom, obstacles from the top --- + - id: page_game + bg_color: 0x0D1323 + scrollbar_mode: "off" + scrollable: false + widgets: + - image: { id: road_bg, align: CENTER, x: 0, y: 0, src: img_road2, hidden: true } # road (only in-game) + # Dashed lane lines - moving (scrolled in the interval = sense of driving) + - obj: { id: dl0, align: CENTER, x: 0, y: -28, width: 26, height: 4, radius: 0, border_width: 0, bg_color: 0xECD25A, hidden: true } + - obj: { id: dl1, align: CENTER, x: 0, y: -28, width: 26, height: 4, radius: 0, border_width: 0, bg_color: 0xECD25A, hidden: true } + - obj: { id: db0, align: CENTER, x: 0, y: 27, width: 26, height: 4, radius: 0, border_width: 0, bg_color: 0xECD25A, hidden: true } + - obj: { id: db1, align: CENTER, x: 0, y: 27, width: 26, height: 4, radius: 0, border_width: 0, bg_color: 0xECD25A, hidden: true } + - image: { id: coin, align: CENTER, x: 440, y: 0, src: img_coin, hidden: true } + - image: { id: obs1, align: CENTER, x: 200, y: -55, src: img_cop, hidden: true } + - image: { id: obs2, align: CENTER, x: 320, y: 55, src: img_mus, hidden: true } + - image: { id: obs3, align: CENTER, x: 460, y: 0, src: img_sed, hidden: true } + - image: { id: car, align: CENTER, x: -120, y: 0, src: img_p, hidden: true } + - label: { id: lbl_lives, align: CENTER, x: -70, y: -108, text: "", text_font: icons18, text_color: 0xE24B4A, hidden: true } + - label: { id: lbl_game_score, align: CENTER, x: 70, y: -108, text: "0", text_font: font_med, text_color: 0xCFEAE4, hidden: true } + - obj: { id: hit_flash, align: CENTER, x: 0, y: 0, width: 360, height: 360, radius: 0, border_width: 0, bg_color: 0xFF2A2A, bg_opa: 45%, hidden: true } + # --- Logo background (menu) --- + - image: { id: logo_bg, align: CENTER, x: 0, y: 0, src: img_logo, hidden: true } + # --- MENU (state 0): Start / How to play? / Scores (under the logo) --- + - button: + id: btn_start + align: CENTER + y: -8 + width: 150 + height: 44 + radius: 22 + bg_color: 0x2FE6CF + bg_opa: COVER + border_width: 0 + on_click: [ script.execute: game_start ] + widgets: + - label: { align: CENTER, text: "Start", text_font: font_med, text_color: 0x06201C } + - button: + id: btn_howto + align: CENTER + y: 42 + width: 150 + height: 44 + radius: 22 + bg_color: 0x2A2E55 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_game_state) = 3;', script.execute: game_screen ] + widgets: + - label: { align: CENTER, text: "How to play?", text_font: font_med, text_color: 0xFFFFFF } + - button: + id: btn_scores + align: CENTER + y: 92 + width: 150 + height: 44 + radius: 22 + bg_color: 0x2A2E55 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_game_state) = 4;', script.execute: game_screen ] + widgets: + - label: { align: CENTER, text: "Scores", text_font: font_med, text_color: 0xFFFFFF } + # --- GAME OVER (state 2): score + Play + Exit --- + - label: { id: lbl_over, align: CENTER, x: 0, y: -10, text_align: CENTER, text: "", text_font: font_sel, text_color: 0xFFFFFF, hidden: true } + - label: { id: lbl_rec, align: CENTER, x: 0, y: 22, text_align: CENTER, text: "", text_font: font_artist, text_color: 0x9AA6B2, hidden: true } + - button: + id: btn_replay + align: CENTER + x: -66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x2FE6CF + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ script.execute: game_start ] + widgets: + - label: { align: CENTER, text: "Play", text_font: font_med, text_color: 0x06201C } + - button: + id: btn_exit + align: CENTER + x: 66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_game_state) = 0;', script.execute: game_screen ] + widgets: + - label: { align: CENTER, text: "Exit", text_font: font_med, text_color: 0xFFFFFF } + # --- HOW TO PLAY? (state 3) - navy background, logo accents --- + - label: { id: lbl_howto_t, align: CENTER, y: -104, text: "HOW TO PLAY?", text_font: font_sel, text_color: 0xE94FB0, hidden: true } + - obj: { id: badge1, align: CENTER, x: -90, y: -46, width: 24, height: 24, radius: 12, bg_color: 0xE94FB0, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "1", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge2, align: CENTER, x: -90, y: -10, width: 24, height: 24, radius: 12, bg_color: 0xE94FB0, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "2", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge3, align: CENTER, x: -90, y: 26, width: 24, height: 24, radius: 12, bg_color: 0xE94FB0, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "3", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge4, align: CENTER, x: -90, y: 62, width: 24, height: 24, radius: 12, bg_color: 0xE94FB0, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "4", text_font: font_artist, text_color: 0xFFFFFF } ] } + - label: { id: lbl_howto1, align_to: { id: badge1, align: OUT_RIGHT_MID, x: 8 }, text: "Use the knob", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_howto2, align_to: { id: badge2, align: OUT_RIGHT_MID, x: 8 }, text: "Dodge obstacles", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_howto_b, align_to: { id: badge3, align: OUT_RIGHT_MID, x: 8 }, text: "Collect bonuses", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - image: { id: img_howcoin, align_to: { id: lbl_howto_b, align: OUT_RIGHT_MID, x: 6 }, src: img_coin, hidden: true } + - label: { id: lbl_howto_l, align_to: { id: badge4, align: OUT_RIGHT_MID, x: 8 }, text: "You have 3 lives", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_howheart, align_to: { id: lbl_howto_l, align: OUT_RIGHT_MID, x: 6 }, text: "󰋑󰋑󰋑", text_font: icons18, text_color: 0xE24B4A, hidden: true } + # --- SCORES (state 4): top 10 in two columns --- + - label: { id: lbl_scores_t, align: CENTER, y: -116, text: "SCORES", text_font: font_sel, text_color: 0xE94FB0, hidden: true } + - label: { id: lbl_scores1, align: CENTER, x: -52, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_scores2, align: CENTER, x: 56, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC2CDDA, hidden: true } + # --- Back (state 3/4 -> menu) --- + - button: + id: btn_back + align: CENTER + y: 120 + width: 130 + height: 42 + radius: 21 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_game_state) = 0;', script.execute: game_screen ] + widgets: + - label: { align: CENTER, text: "Back", text_font: font_med, text_color: 0xFFFFFF } diff --git a/base/screens/demo.yaml b/base/screens/demo.yaml new file mode 100644 index 0000000..c9feea7 --- /dev/null +++ b/base/screens/demo.yaml @@ -0,0 +1,147 @@ +# ============================================================================ +# DEMO / EXAMPLE SCREEN (base id 6, carousel name "demo") +# ---------------------------------------------------------------------------- +# A minimal, heavily-commented screen that shows how a screen package is built: +# * it registers itself in the carousel (g_present), +# * it shows its own LVGL page, +# * it reacts to a tap (toggles the background black <-> white, text inverts), +# * it declares its OWN settings toggles (Settings -> Widgets -> Demo): +# g_demo_border -> draw a border +# g_demo_led -> drive the LED ring (green on white bg, red on black bg) +# The globals live in THIS file and are registered into the core's generic settings +# registry (g_wgrp_* / g_wopt_*) in on_boot - see how below as the template. +# * it drives the LED ring directly (a simple demo - it bypasses the ring +# reaction-priority system in the core; that is fine for an example). +# +# Everything a screen needs lives in THIS file (globals/scripts/interval/lvgl page + +# its settings registration). Remove the screen by dropping this file from the package +# "files:" list - nothing else to edit, anywhere. +# ============================================================================ + +esphome: + on_boot: + # Register this screen so the carousel knows it exists. The core builds the + # carousel order from `screen_order`, including only screens that set g_present. + - priority: 655 + then: + - lambda: 'id(g_present)[6] = true;' + # Register this screen's settings (Settings -> Widgets -> Demo) in the generic registry. + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\n" : ""); id(g_wgrp_labels) += "Demo"; + int o; + o = id(g_wopt_n)++; id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Border"; id(g_wopt_kind)[o] = 0; id(g_wopt_ptr)[o] = &id(g_demo_border); + o = id(g_wopt_n)++; id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Demo LED"; id(g_wopt_kind)[o] = 0; id(g_wopt_ptr)[o] = &id(g_demo_led); + +globals: + - id: g_demo_bg # background: false = black, true = white (runtime state) + type: bool + restore_value: no + initial_value: 'false' + # Demo settings (declared here, registered above; the core menu reaches them by pointer). + - id: g_demo_border # draw a border (Settings -> Widgets -> Demo) + type: bool + restore_value: yes + initial_value: 'false' + - id: g_demo_led # drive the LED ring (Settings -> Widgets -> Demo) + type: bool + restore_value: yes + initial_value: 'false' + # Tap de-duplication: the core bumps g_tap_seq on every normal-mode tap; we + # remember the last value we handled so one tap = one toggle. + - id: g_demo_lasttap + type: int + restore_value: no + initial_value: '0' + # Tracks whether WE currently own the LED ring, so we can release it on leave. + # Persistent so that after a reboot (the ring component restores its last colour) the + # 80ms loop below sees "we owned it", and since we boot onto the home screen it turns + # the ring back off instead of leaving the demo colour stuck on. + - id: g_demo_ring_on + type: bool + restore_value: yes + initial_value: 'false' + +script: + # Redraws the screen from the three state flags (g_demo_bg / border / led). + - id: demo_render + then: + # background + text colour (text is the inverse of the background) + - if: + condition: { lambda: 'return id(g_demo_bg);' } # white background + then: + - lvgl.widget.update: { id: demo_bg, bg_color: 0xFFFFFF, border_color: 0x000000 } + - lvgl.label.update: { id: demo_lbl, text_color: 0x000000 } + else: # black background + - lvgl.widget.update: { id: demo_bg, bg_color: 0x000000, border_color: 0xFFFFFF } + - lvgl.label.update: { id: demo_lbl, text_color: 0xFFFFFF } + # border on/off (width is an int, so a lambda is fine here) + - lvgl.widget.update: { id: demo_bg, border_width: !lambda 'return id(g_demo_border) ? 6 : 0;' } + # LED ring: green when the background is white, red when it is black + - if: + condition: { lambda: 'return id(g_demo_led);' } + then: + - if: + condition: { lambda: 'return id(g_demo_bg);' } + then: [ light.turn_on: { id: ring_light, red: 0%, green: 100%, blue: 0%, effect: "None" } ] + else: [ light.turn_on: { id: ring_light, red: 100%, green: 0%, blue: 0%, effect: "None" } ] + - lambda: 'id(g_demo_ring_on) = true;' + else: + # LED toggle is off: release the ring if we were driving it + - if: + condition: { lambda: 'return id(g_demo_ring_on);' } + then: + - light.turn_off: ring_light + - lambda: 'id(g_demo_ring_on) = false;' + +interval: + # Carousel navigation: when this screen becomes selected, show its page. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==6;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_demo_lasttap) = id(g_tap_seq);' # sync tap counter so arriving never counts as a tap + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_demo, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_demo, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_demo, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_demo, animation: move_bottom, time: 250ms }] } + - script.execute: demo_render + # React to a tap while this screen is on top; release the LED when we leave. + - interval: 80ms + then: + - if: + condition: { lambda: 'return id(g_base)==6 && id(g_tap_seq) != id(g_demo_lasttap);' } + then: + - lambda: 'id(g_demo_lasttap) = id(g_tap_seq); id(g_demo_bg) = !id(g_demo_bg);' # one tap = flip background + - script.execute: demo_render + - if: + condition: { lambda: 'return id(g_base) != 6 && id(g_demo_ring_on);' } + then: + - lambda: 'id(g_demo_ring_on) = false;' + +lvgl: + pages: + - id: page_demo + bg_color: 0x000000 + widgets: + # A full circle that fills the round screen - this is the background we recolour. + # radius 180 on a 360x360 box makes it a circle, so the optional border is a clean ring. + - obj: + id: demo_bg + align: CENTER + width: 360 + height: 360 + radius: 180 + bg_color: 0x000000 + bg_opa: COVER + border_width: 0 + border_color: 0xFFFFFF + - label: + id: demo_lbl + align: CENTER + text: "TAP ME!" + text_font: montserrat_34 + text_color: 0xFFFFFF diff --git a/base/screens/knobuss.yaml b/base/screens/knobuss.yaml new file mode 100644 index 0000000..874b04d --- /dev/null +++ b/base/screens/knobuss.yaml @@ -0,0 +1,711 @@ +# Knobuss - optional carousel screen (base id 10). A Gyruss-style tube shooter: your ship orbits the rim, you +# auto-fire inward, foes spiral out from the centre. Turn the knob to aim, blast them before they +# reach you. Remove it: drop this file from your config's package "files:" list. Nothing else to edit. +# Scores (g_gy_top / g_gy_best) + the "Reset scores" settings action live here - fully self-contained. +# +# Perf: ship + bullet pool (6) + enemy pool (10) are all positioned each tick from float arrays in +# ONE lambda (lv_obj_set_pos over a pooled lv_obj_t* array - LVGL can't index a widget by a runtime +# var), so per-tick cost is constant and the action chain stays shallow. Sprites have a fixed src +# (enemies alternate enemy/enemy2 by slot), so there are no per-tick image swaps. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_present)[10] = true;' + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\n" : ""); id(g_wgrp_labels) += "Knobuss"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Reset scores"; id(g_wopt_kind)[o] = 1; id(g_wopt_ptr)[o] = &id(g_gy_reset); + +globals: + - id: g_gy_best + type: int + restore_value: yes + initial_value: '0' + - id: g_gy_top + type: int[10] + restore_value: yes + - id: g_gy_reset + type: bool + restore_value: no + initial_value: 'false' + - id: g_gy_state # 0=menu 1=playing 2=game over 3=how-to 4=scores + type: int + restore_value: no + initial_value: '0' + - id: g_gy_score + type: int + restore_value: no + initial_value: '0' + - id: g_gy_lives + type: int + restore_value: no + initial_value: '3' + - id: g_gy_ship_ang # ship orbit angle (radians) + type: float + restore_value: no + initial_value: '0.0' + - id: g_gy_dead + type: bool + restore_value: no + initial_value: 'false' + - id: g_gy_fire_clk + type: int + restore_value: no + initial_value: '0' + - id: g_gy_spawn_clk + type: int + restore_value: no + initial_value: '0' + - id: g_gy_hud_dirty # score/lives changed this tick -> refresh the HUD labels + type: bool + restore_value: no + initial_value: 'false' + # bullet pool (fly inward along a fixed radial) + - id: g_gy_br # radius (px from centre) + type: float[6] + restore_value: no + - id: g_gy_ba # angle (radians) + type: float[6] + restore_value: no + - id: g_gy_bon + type: bool[6] + restore_value: no + # enemy pool (spiral outward from the centre) + - id: g_gy_er + type: float[10] + restore_value: no + - id: g_gy_ea + type: float[10] + restore_value: no + - id: g_gy_eon + type: bool[10] + restore_value: no + # starfield (depth illusion): dots rush outward from the centre, faster as they near the rim + - id: g_gy_sr # radius (px from centre) + type: float[10] + restore_value: no + - id: g_gy_sa # angle (radians) + type: float[10] + restore_value: no + # explosion pool (expanding shockwave ring of dots) - fired when a foe reaches the rim + - id: g_gy_exx # centre X (relative to screen centre, px) + type: float[2] + restore_value: no + - id: g_gy_exy # centre Y + type: float[2] + restore_value: no + - id: g_gy_exage # -1 = inactive, else explosion frame 0..7 + type: int[2] + restore_value: no + - id: g_gy_shipframe # current ship rotation frame (0..15), -1 forces a refresh + type: int + restore_value: no + initial_value: '-1' + - id: g_gy_shipdirty # ship rotation bucket changed this tick + type: bool + restore_value: no + initial_value: 'false' + - id: g_gy_exact # an explosion is active or expired this tick (refresh its sprite) + type: bool + restore_value: no + initial_value: 'false' + - id: g_gy_tick # frame counter (throttles the starfield + ship-sprite refresh) + type: int + restore_value: no + initial_value: '0' + +script: + # position every active widget from the float arrays (constant cost, one shallow lambda) + - id: gy_render + then: + - lambda: |- + const float R = 148.0f; + // starfield (background depth) - small dots rushing outward + lv_obj_t *SF[6] = { id(gy_s0), id(gy_s1), id(gy_s2), id(gy_s3), id(gy_s4), id(gy_s5) }; + for (int k = 0; k < 6; k++) { + float r = id(g_gy_sr)[k], a = id(g_gy_sa)[k]; + lv_obj_set_pos(SF[k], 180 + (int) lroundf(cosf(a) * r) - 1, 180 + (int) lroundf(sinf(a) * r) - 1); + } + lv_obj_t *BB[6] = { id(gy_b0), id(gy_b1), id(gy_b2), id(gy_b3), id(gy_b4), id(gy_b5) }; + for (int k = 0; k < 6; k++) { + if (id(g_gy_bon)[k]) { + float r = id(g_gy_br)[k], a = id(g_gy_ba)[k]; + lv_obj_set_pos(BB[k], 180 + (int) lroundf(cosf(a) * r) - 6, 180 + (int) lroundf(sinf(a) * r) - 6); + } else lv_obj_set_pos(BB[k], 400, 400); + } + lv_obj_t *EE[10] = { id(gy_e0), id(gy_e1), id(gy_e2), id(gy_e3), id(gy_e4), id(gy_e5), id(gy_e6), id(gy_e7), id(gy_e8), id(gy_e9) }; + for (int k = 0; k < 10; k++) { + if (id(g_gy_eon)[k]) { + float r = id(g_gy_er)[k], a = id(g_gy_ea)[k]; + lv_obj_set_pos(EE[k], 180 + (int) lroundf(cosf(a) * r) - 13, 180 + (int) lroundf(sinf(a) * r) - 13); + } else lv_obj_set_pos(EE[k], 400, 400); + } + float sa = id(g_gy_ship_ang); + lv_obj_set_pos(id(gy_ship), 180 + (int) lroundf(cosf(sa) * R) - 18, 180 + (int) lroundf(sinf(sa) * R) - 18); + // explosions (32px sprites) - positioned while alive, parked otherwise + lv_obj_t *XX[2] = { id(gy_x0), id(gy_x1) }; + for (int s = 0; s < 2; s++) { + if (id(g_gy_exage)[s] >= 0) lv_obj_set_pos(XX[s], 180 + (int) lroundf(id(g_gy_exx)[s]) - 16, 180 + (int) lroundf(id(g_gy_exy)[s]) - 16); + else lv_obj_set_pos(XX[s], 400, 400); + } + # set the ship sprite to its current rotation frame (called only when the bucket changes) + - id: gy_shipspr + then: + - if: { condition: { lambda: 'return id(g_gy_shipframe)==0;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship0 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==1;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship1 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==2;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship2 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==3;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship3 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==4;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship4 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==5;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship5 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==6;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship6 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==7;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship7 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==8;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship8 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==9;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship9 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==10;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship10 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==11;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship11 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==12;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship12 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==13;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship13 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==14;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship14 } ] } + - if: { condition: { lambda: 'return id(g_gy_shipframe)==15;' }, then: [ lvgl.image.update: { id: gy_ship, src: img_gy_ship15 } ] } + # advance/hide the explosion sprites by their frame (called only while a burst is live) + - id: gy_explspr + then: + - if: + condition: { lambda: 'return id(g_gy_exage)[0] < 0;' } + then: [ lvgl.widget.hide: gy_x0 ] + else: + - lvgl.widget.show: gy_x0 + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==0;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl0 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==1;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl1 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==2;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl2 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==3;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl3 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==4;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl4 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==5;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl5 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]==6;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl6 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[0]>=7;' }, then: [ lvgl.image.update: { id: gy_x0, src: img_gy_expl7 } ] } + - if: + condition: { lambda: 'return id(g_gy_exage)[1] < 0;' } + then: [ lvgl.widget.hide: gy_x1 ] + else: + - lvgl.widget.show: gy_x1 + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==0;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl0 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==1;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl1 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==2;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl2 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==3;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl3 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==4;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl4 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==5;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl5 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]==6;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl6 } ] } + - if: { condition: { lambda: 'return id(g_gy_exage)[1]>=7;' }, then: [ lvgl.image.update: { id: gy_x1, src: img_gy_expl7 } ] } + - id: gy_hud + then: + - lvgl.label.update: { id: lbl_gy_score, text: !lambda 'char b[12]; snprintf(b,sizeof(b),"%d",id(g_gy_score)); return std::string(b);' } + - lvgl.label.update: { id: lbl_gy_lives, text: !lambda 'char b[16]; snprintf(b,sizeof(b),"LIVES %d",id(g_gy_lives)<0?0:id(g_gy_lives)); return std::string(b);' } + # park every gameplay widget off-screen + - id: gy_clear + then: + - lambda: |- + lv_obj_t *BB[6] = { id(gy_b0), id(gy_b1), id(gy_b2), id(gy_b3), id(gy_b4), id(gy_b5) }; + for (int k = 0; k < 6; k++) lv_obj_set_pos(BB[k], 400, 400); + lv_obj_t *EE[10] = { id(gy_e0), id(gy_e1), id(gy_e2), id(gy_e3), id(gy_e4), id(gy_e5), id(gy_e6), id(gy_e7), id(gy_e8), id(gy_e9) }; + for (int k = 0; k < 10; k++) lv_obj_set_pos(EE[k], 400, 400); + lv_obj_t *SF[6] = { id(gy_s0), id(gy_s1), id(gy_s2), id(gy_s3), id(gy_s4), id(gy_s5) }; + for (int k = 0; k < 6; k++) lv_obj_set_pos(SF[k], 400, 400); + lv_obj_set_pos(id(gy_ship), 400, 400); + - lvgl.widget.hide: gy_x0 + - lvgl.widget.hide: gy_x1 + - id: gy_start + then: + - lambda: |- + id(g_gy_state) = 1; id(g_gy_score) = 0; id(g_gy_lives) = 3; id(g_gy_dead) = false; + id(g_gy_ship_ang) = -1.5708f; // start at the top + id(g_gy_fire_clk) = 0; id(g_gy_spawn_clk) = 0; + for (int k = 0; k < 6; k++) id(g_gy_bon)[k] = false; + for (int k = 0; k < 10; k++) id(g_gy_eon)[k] = false; + for (int k = 0; k < 6; k++) { id(g_gy_sr)[k] = 6.0f + (esp_random() % 168); id(g_gy_sa)[k] = (esp_random() % 62832) / 10000.0f; } + for (int s = 0; s < 2; s++) id(g_gy_exage)[s] = -1; + id(g_gy_shipframe) = -1; // force a ship-sprite refresh on the first tick + id(g_knob_capture) = true; id(g_knob_delta) = 0; + - script.execute: gy_screen + - script.execute: gy_hud + - id: gy_over + then: + - lambda: |- + id(g_gy_state) = 2; + int s = id(g_gy_score); + if (s > id(g_gy_best)) id(g_gy_best) = s; + for (int i = 0; i < 10; i++) { + if (s > id(g_gy_top)[i]) { + for (int j = 9; j > i; j--) id(g_gy_top)[j] = id(g_gy_top)[j-1]; + id(g_gy_top)[i] = s; + break; + } + } + - script.execute: gy_screen + # screen state + the single knob-capture authority (captured only in play + game over) + - id: gy_screen + then: + - lambda: 'id(g_knob_capture) = (id(g_gy_state) == 1 || id(g_gy_state) == 2);' + - script.execute: gy_clear + - lvgl.widget.hide: gy_logo + - lvgl.widget.hide: gy_ring + - lvgl.widget.hide: gy_ring2 + - lvgl.widget.hide: gy_ring3 + - lvgl.widget.hide: gy_core + - lvgl.widget.hide: lbl_gy_score + - lvgl.widget.hide: lbl_gy_lives + - lvgl.widget.hide: lbl_gy_title + - lvgl.widget.hide: lbl_gy_sub + - lvgl.widget.hide: btn_gy_start + - lvgl.widget.hide: btn_gy_howto + - lvgl.widget.hide: btn_gy_scores + - lvgl.widget.hide: lbl_gy_over + - lvgl.widget.hide: lbl_gy_rec + - lvgl.widget.hide: btn_gy_replay + - lvgl.widget.hide: btn_gy_exit + - lvgl.widget.hide: lbl_gy_howto_t + - lvgl.widget.hide: gy_hb1 + - lvgl.widget.hide: gy_hb2 + - lvgl.widget.hide: gy_hb3 + - lvgl.widget.hide: gy_hb4 + - lvgl.widget.hide: lbl_gy_howto1 + - lvgl.widget.hide: lbl_gy_howto2 + - lvgl.widget.hide: lbl_gy_howto3 + - lvgl.widget.hide: lbl_gy_howto4 + - lvgl.widget.hide: gy_life_icon + - lvgl.widget.hide: lbl_gy_scores_t + - lvgl.widget.hide: lbl_gy_scores1 + - lvgl.widget.hide: lbl_gy_scores2 + - lvgl.widget.hide: btn_gy_back + - if: # MENU + condition: { lambda: 'return id(g_gy_state) == 0;' } + then: + - lvgl.widget.show: gy_logo + - lvgl.widget.show: btn_gy_start + - lvgl.widget.show: btn_gy_howto + - lvgl.widget.show: btn_gy_scores + - if: # PLAY + condition: { lambda: 'return id(g_gy_state) == 1;' } + then: + - lvgl.widget.show: gy_ring + - lvgl.widget.show: gy_ring2 + - lvgl.widget.show: gy_ring3 + - lvgl.widget.show: gy_core + - lvgl.widget.show: lbl_gy_score + - lvgl.widget.show: lbl_gy_lives + - script.execute: gy_render + - if: # GAME OVER + condition: { lambda: 'return id(g_gy_state) == 2;' } + then: + - lvgl.widget.show: gy_logo + - lvgl.widget.show: lbl_gy_over + - lvgl.widget.show: lbl_gy_rec + - lvgl.widget.show: btn_gy_replay + - lvgl.widget.show: btn_gy_exit + - lvgl.label.update: { id: lbl_gy_over, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Score: %d", id(g_gy_score)); return std::string(b);' } + - lvgl.label.update: { id: lbl_gy_rec, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Best: %d", id(g_gy_best)); return std::string(b);' } + - if: # HOW TO PLAY + condition: { lambda: 'return id(g_gy_state) == 3;' } + then: + - lvgl.widget.show: lbl_gy_howto_t + - lvgl.widget.show: gy_hb1 + - lvgl.widget.show: gy_hb2 + - lvgl.widget.show: gy_hb3 + - lvgl.widget.show: gy_hb4 + - lvgl.widget.show: lbl_gy_howto1 + - lvgl.widget.show: lbl_gy_howto2 + - lvgl.widget.show: lbl_gy_howto3 + - lvgl.widget.show: lbl_gy_howto4 + - lvgl.widget.show: gy_life_icon + - lvgl.widget.show: btn_gy_back + - if: # SCORES (top 10) + condition: { lambda: 'return id(g_gy_state) == 4;' } + then: + - lvgl.widget.show: lbl_gy_scores_t + - lvgl.widget.show: lbl_gy_scores1 + - lvgl.widget.show: lbl_gy_scores2 + - lvgl.widget.show: btn_gy_back + - lvgl.label.update: + id: lbl_gy_scores1 + text: !lambda |- + std::string s; char b[24]; + for (int i = 0; i < 5; i++) { if(i) s += "\n"; if(id(g_gy_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_gy_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + - lvgl.label.update: + id: lbl_gy_scores2 + text: !lambda |- + std::string s; char b[24]; + for (int i = 5; i < 10; i++) { if(i>5) s += "\n"; if(id(g_gy_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_gy_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + +interval: + - interval: 250ms + then: + - if: + condition: { lambda: 'return id(g_gy_reset) || id(g_factory_reset);' } + then: + - lambda: 'for (int i = 0; i < 10; i++) id(g_gy_top)[i] = 0; id(g_gy_best) = 0; id(g_gy_reset) = false;' + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==10;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_gy_state) = 0; id(g_knob_delta) = 0;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_gyruss, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_gyruss, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_gyruss, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_gyruss, animation: move_bottom, time: 250ms }] } + - script.execute: gy_screen + # Game tick: aim (knob) + auto-fire + spiral the foes + collisions; all positioning in gy_render. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_base) == 10 && id(g_gy_state) == 1;' } + then: + - lambda: |- + id(g_gy_hud_dirty) = false; id(g_gy_shipdirty) = false; + id(g_gy_tick)++; + int kd = id(g_knob_delta); id(g_knob_delta) = 0; + id(g_gy_ship_ang) += kd * 0.30f; // aim sensitivity: ~17 deg per knob detent + // auto-fire a bullet down the ship's radial + if (++id(g_gy_fire_clk) >= 5) { + id(g_gy_fire_clk) = 0; + for (int k = 0; k < 6; k++) if (!id(g_gy_bon)[k]) { id(g_gy_bon)[k] = true; id(g_gy_br)[k] = 138.0f; id(g_gy_ba)[k] = id(g_gy_ship_ang); break; } + } + for (int k = 0; k < 6; k++) if (id(g_gy_bon)[k]) { id(g_gy_br)[k] -= 9.0f; if (id(g_gy_br)[k] < 12.0f) id(g_gy_bon)[k] = false; } + // spawn foes from the core (faster as the score climbs) + int sw = 24 - id(g_gy_score) / 200; if (sw < 9) sw = 9; + if (++id(g_gy_spawn_clk) >= sw) { + id(g_gy_spawn_clk) = 0; + for (int k = 0; k < 10; k++) if (!id(g_gy_eon)[k]) { + float a = (esp_random() % 62832) / 10000.0f; + id(g_gy_eon)[k] = true; id(g_gy_er)[k] = 32.0f; id(g_gy_ea)[k] = a; break; // start at the core's rim (not under it) to avoid central overdraw + } + } + // age existing explosions first (8-frame sprite); refresh sprite while any is live/expiring + id(g_gy_exact) = false; + for (int s = 0; s < 2; s++) if (id(g_gy_exage)[s] >= 0) { + id(g_gy_exact) = true; + if (++id(g_gy_exage)[s] > 7) id(g_gy_exage)[s] = -1; + } + // foes spiral outward; ANY foe that reaches the rim costs a life and explodes there + float esp = 1.5f + id(g_gy_score) / 1500.0f; if (esp > 3.2f) esp = 3.2f; + for (int k = 0; k < 10; k++) if (id(g_gy_eon)[k]) { + id(g_gy_er)[k] += esp; id(g_gy_ea)[k] += 0.05f; + if (id(g_gy_er)[k] >= 146.0f) { + id(g_gy_eon)[k] = false; + id(g_gy_lives)--; id(g_gy_hud_dirty) = true; if (id(g_gy_lives) <= 0) id(g_gy_dead) = true; + for (int s = 0; s < 2; s++) if (id(g_gy_exage)[s] < 0) { id(g_gy_exx)[s] = cosf(id(g_gy_ea)[k]) * 146.0f; id(g_gy_exy)[s] = sinf(id(g_gy_ea)[k]) * 146.0f; id(g_gy_exage)[s] = 0; id(g_gy_exact) = true; break; } + } + } + // depth starfield (throttled to every 2nd tick): rush outward, respawn near the centre + if ((id(g_gy_tick) & 1) == 0) for (int k = 0; k < 6; k++) { + id(g_gy_sr)[k] += id(g_gy_sr)[k] * 0.10f + 2.0f; + if (id(g_gy_sr)[k] > 176.0f) { id(g_gy_sr)[k] = 4.0f + (esp_random() % 14); id(g_gy_sa)[k] = (esp_random() % 62832) / 10000.0f; } + } + // ship rotation frame (every 2nd tick, on the ODD ticks so it doesn't share a tick with + // the starfield move above - spreads the two throttled costs; position stays 50ms) + if ((id(g_gy_tick) & 1) == 1) { + int bk = (int) lroundf(id(g_gy_ship_ang) / 0.3926991f); bk %= 16; if (bk < 0) bk += 16; + id(g_gy_shipdirty) = (bk != id(g_gy_shipframe)); + if (id(g_gy_shipdirty)) id(g_gy_shipframe) = bk; + } + // bullet vs foe (polar proximity) + for (int b = 0; b < 6; b++) if (id(g_gy_bon)[b]) for (int e = 0; e < 10; e++) if (id(g_gy_eon)[e]) { + float dr = id(g_gy_br)[b] - id(g_gy_er)[e]; if (dr < 0) dr = -dr; + if (dr < 13.0f) { + float da = id(g_gy_ba)[b] - id(g_gy_ea)[e]; da = atan2f(sinf(da), cosf(da)); + if (fabsf(da) < 0.28f) { id(g_gy_bon)[b] = false; id(g_gy_eon)[e] = false; id(g_gy_score) += 10; id(g_gy_hud_dirty) = true; break; } + } + } + - if: { condition: { lambda: 'return id(g_gy_shipdirty);' }, then: [ script.execute: gy_shipspr ] } + - if: { condition: { lambda: 'return id(g_gy_exact);' }, then: [ script.execute: gy_explspr ] } + - script.execute: gy_render + - if: + condition: { lambda: 'return id(g_gy_dead);' } + then: + - script.execute: gy_over + else: + - if: + condition: { lambda: 'return id(g_gy_hud_dirty);' } + then: + - script.execute: gy_hud + +# Sprites are pulled from the repo /main/ raw URLs at compile time. +# Third-party art (see assets/sprites/knobuss/CREDITS.txt). +image: + - id: img_gy_ship0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship0.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship1.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship2.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship3.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship4.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship5.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship6.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship7.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship8 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship8.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship9 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship9.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship10 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship10.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship11 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship11.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship12 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship12.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship13 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship13.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship14 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship14.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_ship15 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/ship15.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_enemy0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/enemy0.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_enemy1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/enemy1.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_enemy2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/enemy2.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_enemy3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/enemy3.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl0.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl1.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl2.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl3.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl4.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl5.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl6.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_expl7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/expl7.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_bullet + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/bullet.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_core + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/core.png" + type: RGB565 + transparency: alpha_channel + - id: img_gy_logo + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/knobuss-logo.png" + type: RGB565 + - id: img_gy_life + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/knobuss/life.png" + type: RGB565 + transparency: alpha_channel +lvgl: + pages: + - id: page_gyruss + bg_color: 0x070611 + scrollbar_mode: "off" + scrollable: false + widgets: + # Knobuss title screen (full-screen menu backdrop, behind the buttons) - hidden in play + - image: { id: gy_logo, align: CENTER, x: 0, y: 0, src: img_gy_logo, hidden: true } + # starfield (declared first = drawn behind everything) - parked until play + - obj: { id: gy_s0, x: 400, y: 400, width: 3, height: 3, radius: 999, bg_color: 0x6076A4, bg_opa: COVER, border_width: 0, pad_all: 0 } + - obj: { id: gy_s1, x: 400, y: 400, width: 2, height: 2, radius: 999, bg_color: 0x32466E, bg_opa: COVER, border_width: 0, pad_all: 0 } + - obj: { id: gy_s2, x: 400, y: 400, width: 3, height: 3, radius: 999, bg_color: 0x6076A4, bg_opa: COVER, border_width: 0, pad_all: 0 } + - obj: { id: gy_s3, x: 400, y: 400, width: 2, height: 2, radius: 999, bg_color: 0x32466E, bg_opa: COVER, border_width: 0, pad_all: 0 } + - obj: { id: gy_s4, x: 400, y: 400, width: 3, height: 3, radius: 999, bg_color: 0x6076A4, bg_opa: COVER, border_width: 0, pad_all: 0 } + - obj: { id: gy_s5, x: 400, y: 400, width: 2, height: 2, radius: 999, bg_color: 0x32466E, bg_opa: COVER, border_width: 0, pad_all: 0 } + # concentric guide rings (static) suggest a tube receding to the core - free depth cue + - obj: { id: gy_ring3, align: CENTER, x: 0, y: 0, width: 112, height: 112, radius: 56, bg_opa: TRANSP, border_width: 1, border_color: 0x1A2742, hidden: true } + - obj: { id: gy_ring2, align: CENTER, x: 0, y: 0, width: 200, height: 200, radius: 100, bg_opa: TRANSP, border_width: 1, border_color: 0x1E2C4A, hidden: true } + - obj: { id: gy_ring, align: CENTER, x: 0, y: 0, width: 300, height: 300, radius: 150, bg_opa: TRANSP, border_width: 2, border_color: 0x2A3C66, hidden: true } + - image: { id: gy_core, align: CENTER, x: 0, y: 0, src: img_gy_core, hidden: true } + # foes: 4 glowing-orb colours cycled across the 10 slots (fixed src - no runtime swap) + - image: { id: gy_e0, x: 400, y: 400, src: img_gy_enemy0 } + - image: { id: gy_e1, x: 400, y: 400, src: img_gy_enemy1 } + - image: { id: gy_e2, x: 400, y: 400, src: img_gy_enemy2 } + - image: { id: gy_e3, x: 400, y: 400, src: img_gy_enemy3 } + - image: { id: gy_e4, x: 400, y: 400, src: img_gy_enemy0 } + - image: { id: gy_e5, x: 400, y: 400, src: img_gy_enemy1 } + - image: { id: gy_e6, x: 400, y: 400, src: img_gy_enemy2 } + - image: { id: gy_e7, x: 400, y: 400, src: img_gy_enemy3 } + - image: { id: gy_e8, x: 400, y: 400, src: img_gy_enemy0 } + - image: { id: gy_e9, x: 400, y: 400, src: img_gy_enemy1 } + - image: { id: gy_b0, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_b1, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_b2, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_b3, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_b4, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_b5, x: 400, y: 400, src: img_gy_bullet } + - image: { id: gy_ship, x: 400, y: 400, src: img_gy_ship0 } + # explosion sprites (8-frame), parked + hidden until a foe hits the rim + - image: { id: gy_x0, x: 400, y: 400, src: img_gy_expl0, hidden: true } + - image: { id: gy_x1, x: 400, y: 400, src: img_gy_expl0, hidden: true } + - label: { id: lbl_gy_score, align: CENTER, x: 0, y: -150, text: "0", text_font: font_med, text_color: 0xCFE4FF, hidden: true } + - label: { id: lbl_gy_lives, align: CENTER, x: 0, y: 150, text: "LIVES 3", text_font: font_artist, text_color: 0xFF7A6A, hidden: true } + - label: { id: lbl_gy_title, align: CENTER, x: 0, y: -86, text: "KNOBUSS", text_font: font_sel, text_color: 0x46E3D0, hidden: true } + - label: { id: lbl_gy_sub, align: CENTER, x: 0, y: -52, text: "tube shooter", text_font: font_artist, text_color: 0x6B7BA6, hidden: true } + - button: + id: btn_gy_start + align: CENTER + y: -8 + width: 150 + height: 44 + radius: 22 + bg_color: 0x39C6E6 + bg_opa: COVER + border_width: 0 + on_click: [ script.execute: gy_start ] + widgets: + - label: { align: CENTER, text: "Start", text_font: font_med, text_color: 0x06131A } + - button: + id: btn_gy_howto + align: CENTER + y: 40 + width: 150 + height: 44 + radius: 22 + bg_color: 0x1C2A44 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_gy_state) = 3;', script.execute: gy_screen ] + widgets: + - label: { align: CENTER, text: "How to play?", text_font: font_med, text_color: 0xC4D2F0 } + - button: + id: btn_gy_scores + align: CENTER + y: 88 + width: 150 + height: 44 + radius: 22 + bg_color: 0x1C2A44 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_gy_state) = 4;', script.execute: gy_screen ] + widgets: + - label: { align: CENTER, text: "Scores", text_font: font_med, text_color: 0xC4D2F0 } + - label: { id: lbl_gy_over, align: CENTER, x: 0, y: -10, text_align: CENTER, text: "", text_font: font_sel, text_color: 0xCFE4FF, hidden: true } + - label: { id: lbl_gy_rec, align: CENTER, x: 0, y: 22, text_align: CENTER, text: "", text_font: font_artist, text_color: 0x6B7BA6, hidden: true } + - button: + id: btn_gy_replay + align: CENTER + x: -66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x39C6E6 + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ script.execute: gy_start ] + widgets: + - label: { align: CENTER, text: "Play", text_font: font_med, text_color: 0x06131A } + - button: + id: btn_gy_exit + align: CENTER + x: 66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x2A2E3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_gy_state) = 0;', script.execute: gy_screen ] + widgets: + - label: { align: CENTER, text: "Exit", text_font: font_med, text_color: 0xFFFFFF } + - label: { id: lbl_gy_howto_t, align: CENTER, y: -104, text: "HOW TO PLAY?", text_font: font_sel, text_color: 0x46E3D0, hidden: true } + - obj: { id: gy_hb1, align: CENTER, x: -96, y: -52, width: 24, height: 24, radius: 12, bg_color: 0x2C6FB2, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "1", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: gy_hb2, align: CENTER, x: -96, y: -16, width: 24, height: 24, radius: 12, bg_color: 0x2C6FB2, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "2", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: gy_hb3, align: CENTER, x: -96, y: 20, width: 24, height: 24, radius: 12, bg_color: 0x2C6FB2, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "3", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: gy_hb4, align: CENTER, x: -96, y: 56, width: 24, height: 24, radius: 12, bg_color: 0x2C6FB2, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "4", text_font: font_artist, text_color: 0xFFFFFF } ] } + - label: { id: lbl_gy_howto1, align_to: { id: gy_hb1, align: OUT_RIGHT_MID, x: 8 }, text: "Turn knob to aim", text_font: font_med, text_color: 0xC4D2F0, hidden: true } + - label: { id: lbl_gy_howto2, align_to: { id: gy_hb2, align: OUT_RIGHT_MID, x: 8 }, text: "You auto-fire inward", text_font: font_med, text_color: 0xC4D2F0, hidden: true } + - label: { id: lbl_gy_howto3, align_to: { id: gy_hb3, align: OUT_RIGHT_MID, x: 8 }, text: "Blast foes before the rim", text_font: font_med, text_color: 0xC4D2F0, hidden: true } + - label: { id: lbl_gy_howto4, align_to: { id: gy_hb4, align: OUT_RIGHT_MID, x: 8 }, text: "You have three lives", text_font: font_med, text_color: 0xC4D2F0, hidden: true } + - image: { id: gy_life_icon, align_to: { id: lbl_gy_howto4, align: OUT_RIGHT_MID, x: 8 }, src: img_gy_life, hidden: true } + - label: { id: lbl_gy_scores_t, align: CENTER, y: -116, text: "SCORES", text_font: font_sel, text_color: 0x46E3D0, hidden: true } + - label: { id: lbl_gy_scores1, align: CENTER, x: -52, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC4D2F0, hidden: true } + - label: { id: lbl_gy_scores2, align: CENTER, x: 56, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC4D2F0, hidden: true } + - button: + id: btn_gy_back + align: CENTER + y: 120 + width: 130 + height: 42 + radius: 21 + bg_color: 0x2A2E3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_gy_state) = 0;', script.execute: gy_screen ] + widgets: + - label: { align: CENTER, text: "Back", text_font: font_med, text_color: 0xFFFFFF } diff --git a/base/screens/player.yaml b/base/screens/player.yaml new file mode 100644 index 0000000..ecccf82 --- /dev/null +++ b/base/screens/player.yaml @@ -0,0 +1,265 @@ +# Player - optional carousel screen (base id 1). Full-screen album art + transport. +# Remove it: drop this file from your config's package "files:" list. +# Volume control + the volume overlay stay in the core; this is only the now-playing SCREEN. + +esphome: + on_boot: + - priority: 690 + then: + - lambda: 'id(g_present)[1] = true;' # register after clock + +globals: + - id: g_last_pic + type: std::string + restore_value: no + - id: g_pos # position in the track (s) - progress bar + type: int + restore_value: no + initial_value: '0' + - id: g_dur # track length (s) + type: int + restore_value: no + initial_value: '0' + +# Required by online_image (fetching album art over HTTP) +http_request: + timeout: 10s + verify_ssl: false + +# Album art fetched dynamically from HA (entity_picture is a signed URL) + +online_image: + - id: album_art + url: "${ha_base_url}/" + format: JPEG + type: RGB565 + resize: 360x360 + # Album art FIX: after download you must EXPLICITLY refresh the LVGL widget (it won't redraw itself) + on_download_finished: + - lvgl.image.update: + id: ui_album + src: album_art + on_error: + - logger.log: "Failed to fetch album art" + +sensor: + - platform: homeassistant + id: media_pos + entity_id: ${player_entity} + attribute: media_position + on_value: + - lambda: 'id(g_pos) = (int) x;' + - platform: homeassistant + id: media_dur + entity_id: ${player_entity} + attribute: media_duration + on_value: + - lambda: 'id(g_dur) = (int) x;' + +text_sensor: + - platform: homeassistant + id: media_title + entity_id: ${player_entity} + attribute: media_title + on_value: + - lvgl.label.update: + id: lbl_title + text: !lambda 'return x.empty() ? std::string("-") : x;' + - platform: homeassistant + id: media_artist + entity_id: ${player_entity} + attribute: media_artist + on_value: + - lvgl.label.update: + id: lbl_artist + text: !lambda 'return x;' + - platform: homeassistant + id: media_pic + entity_id: ${player_entity} + attribute: entity_picture + on_value: + - lambda: |- + if (x.empty()) return; + std::string url = x.rfind("http", 0) == 0 ? x : std::string("${ha_base_url}") + x; + if (url == id(g_last_pic)) return; // same album art -> don't reload (less flicker) + id(g_last_pic) = url; + id(album_art)->set_url(url.c_str()); + id(album_art)->update(); + # Player state -> only "playing" shows the player; pause/stop = player disappears (clock) + - platform: homeassistant + id: media_state + entity_id: ${player_entity} + on_value: + - lvgl.label.update: # icon on the button: pause when playing, play when not + id: lbl_play + text: !lambda 'return id(media_state).state == "playing" ? std::string("") : std::string("");' + - if: + condition: + lambda: 'return !id(g_va_active) && !id(g_boot) && id(g_mode) == 0 && (id(g_base) == 0 || id(g_base) == 1);' # auto-switch clock<->player only when we're on the clock/player (and not during boot splash) + then: + # Only switch on an ACTUAL transition: home -> player when playback starts, + # player -> home when it stops. (Avoids re-navigating on every media-state event, + # incl. the state HA pushes at boot, which used to flip the home to Classic.) + - if: + condition: { lambda: 'return x == "playing" && id(g_base) == 0;' } + then: + - lvgl.page.show: { id: page_player, animation: move_left, time: 250ms } + - lambda: 'id(g_base) = 1;' + - if: + condition: { lambda: 'return x != "playing" && id(g_base) == 1;' } + then: + # back to the home base, respecting the active watchface (Classic shows + # page_home directly; other faces self-show via g_wf_req) - don't hardcode Classic + - lambda: 'id(g_base) = 0; id(g_nav_anim) = 1;' + - if: + condition: { lambda: 'return id(g_watchface) == 0;' } + then: + - lvgl.page.show: { id: page_home, animation: move_right, time: 250ms } + else: + - lambda: 'id(g_wf_req) = true;' + +interval: + # nav: show this screen when it is selected in the carousel + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==1;' } + then: + - lambda: 'id(g_nav_req) = false;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_player, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_player, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_player, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_player, animation: move_bottom, time: 250ms }] } + # track progress (position / time / progress bar) + - interval: 1s + then: + # Track progress: tick the position while playing + update time and bar + - if: + condition: + lambda: 'return id(media_state).state == "playing" && id(g_dur) > 0 && id(g_pos) < id(g_dur);' + then: + - lambda: 'id(g_pos)++;' + - lvgl.label.update: + id: lbl_time + text: !lambda |- + int p = id(g_pos), d = id(g_dur); + if (d <= 0) return std::string(""); + char b[20]; snprintf(b, sizeof(b), "%d:%02d | %d:%02d", p/60, p%60, d/60, d%60); + return std::string(b); + - lvgl.bar.update: + id: prog_bar + value: !lambda 'return id(g_dur) > 0 ? (int)(1000L * id(g_pos) / id(g_dur)) : 0;' + +lvgl: + pages: + # --- Player page: full-screen album art + scrim + title/artist + volume arc --- + - id: page_player + bg_color: 0x000000 + widgets: + # Album art covering the whole round screen (360x360; the bezel hides the corners) + - image: + id: ui_album + align: CENTER + src: album_art + # Dim the whole thing under text and buttons (readability) + - obj: + align: CENTER + width: 360 + height: 360 + radius: 0 + border_width: 0 + bg_color: 0x000000 + bg_opa: 42% + # Title (scroll) + artist (clip) - in the upper part + - label: + id: lbl_title + align: CENTER + y: -72 + width: 250 + long_mode: scroll_circular + text_align: CENTER + text_font: font_med + text_color: 0xFFFFFF + text: "-" + - label: + id: lbl_artist + align: CENTER + y: -46 + width: 230 + long_mode: clip + text_align: CENTER + text_font: font_artist + text_color: 0x9FC7BE + text: "" + # Transport: prev / play-pause / next (touch buttons) + - button: + id: btn_prev + align: CENTER + x: -84 + y: 6 + width: 50 + height: 50 + radius: 25 + bg_color: 0x223230 + bg_opa: COVER + border_width: 0 + on_click: + - homeassistant.action: + action: media_player.media_previous_track + data: { entity_id: "${player_entity}" } + widgets: + - label: { align: CENTER, text: "", text_font: montserrat_22, text_color: 0xCFEAE4 } + - button: + id: btn_play + align: CENTER + x: 0 + y: 6 + width: 74 + height: 74 + radius: 37 + bg_color: 0x2FE6CF + bg_opa: COVER + border_width: 0 + on_click: + - homeassistant.action: + action: media_player.media_play_pause + data: { entity_id: "${player_entity}" } + widgets: + - label: { id: lbl_play, align: CENTER, text: "", text_font: montserrat_28, text_color: 0x06201C } + - button: + id: btn_next + align: CENTER + x: 84 + y: 6 + width: 50 + height: 50 + radius: 25 + bg_color: 0x223230 + bg_opa: COVER + border_width: 0 + on_click: + - homeassistant.action: + action: media_player.media_next_track + data: { entity_id: "${player_entity}" } + widgets: + - label: { align: CENTER, text: "", text_font: montserrat_22, text_color: 0xCFEAE4 } + # Time + progress bar + - label: + id: lbl_time + align: CENTER + y: 64 + text: "" + text_font: font_artist + text_color: 0xCFEAE4 + - bar: + id: prog_bar + align: CENTER + y: 90 + width: 210 + height: 5 + min_value: 0 + max_value: 1000 + value: 0 + border_width: 0 + indicator: + bg_color: 0x2FE6CF diff --git a/base/screens/sensors.yaml b/base/screens/sensors.yaml new file mode 100644 index 0000000..d498dea --- /dev/null +++ b/base/screens/sensors.yaml @@ -0,0 +1,244 @@ +# Sensors / glance - optional carousel screen (base id 8). +# Shows one configurable Home Assistant sensor at a time, big and readable; turn the KNOB to +# cycle between them. Pulls straight from HA (no helper). Works for 1 sensor (no cycling) up to +# 6 (knob scrolls, a "n/total" indicator appears). Any entity works - the state is shown as text +# and the unit comes from the entity's unit_of_measurement attribute. +# +# Configure slots with the glanceN_entity / glanceN_name / glanceN_icon substitutions. Leave a +# slot at its default (a non-existent entity) and it's skipped automatically. Icon names use the +# same set as the control tiles; leave empty for no icon. +# +# Remove it: drop this file from the package "files:" list. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: |- + id(g_present)[8] = true; // register the sensors screen + // resolve icon names -> glyphs (same set as the control tiles); "" -> no icon + auto ic = [](const std::string &s) -> std::string { + if (s == "bulb" || s == "light") return "\U000f0335"; + if (s == "lamp") return "\U000f06b5"; + if (s == "led" || s == "strip") return "\U000f07d6"; + if (s == "power") return "\U000f0425"; + if (s == "plug") return "\U000f06a5"; + if (s == "switch") return "\U000f0521"; + if (s == "fan") return "\U000f0210"; + if (s == "ac" || s == "aircon") return "\U000f001b"; + if (s == "heater" || s == "radiator") return "\U000f0438"; + if (s == "thermometer" || s == "temp") return "\U000f050f"; + if (s == "lock") return "\U000f033e"; + if (s == "unlock") return "\U000f033f"; + if (s == "door") return "\U000f081a"; + if (s == "blinds") return "\U000f00ac"; + if (s == "tv") return "\U000f0502"; + if (s == "speaker") return "\U000f04c3"; + if (s == "bell") return "\U000f009a"; + if (s == "wifi") return "\U000f05a9"; + if (s == "home") return "\U000f02dc"; + if (s == "flash") return "\U000f0241"; + if (s == "air" || s == "pm" || s == "airquality") return "\U000f0d44"; + if (s == "plant" || s == "sprout" || s == "moisture") return "\U000f0e66"; + if (s == "plex") return "\U000f06ba"; + if (s == "server") return "\U000f048b"; + if (s == "shield" || s == "alarm" || s == "security") return "\U000f068a"; + return s; + }; + id(g_gl_glyph)[0] = ic("${glance1_icon}"); id(g_gl_name)[0] = "${glance1_name}"; + id(g_gl_glyph)[1] = ic("${glance2_icon}"); id(g_gl_name)[1] = "${glance2_name}"; + id(g_gl_glyph)[2] = ic("${glance3_icon}"); id(g_gl_name)[2] = "${glance3_name}"; + id(g_gl_glyph)[3] = ic("${glance4_icon}"); id(g_gl_name)[3] = "${glance4_name}"; + id(g_gl_glyph)[4] = ic("${glance5_icon}"); id(g_gl_name)[4] = "${glance5_name}"; + id(g_gl_glyph)[5] = ic("${glance6_icon}"); id(g_gl_name)[5] = "${glance6_name}"; + +globals: + - id: g_gl_val + type: std::string[6] + restore_value: no + - id: g_gl_unit + type: std::string[6] + restore_value: no + - id: g_gl_name + type: std::string[6] + restore_value: no + - id: g_gl_glyph + type: std::string[6] + restore_value: no + - id: g_gl_present + type: bool[6] + restore_value: no + - id: g_gl_sel + type: int + restore_value: no + initial_value: '0' + +script: + - id: gl_render + then: + - lambda: |- + int first = -1; + for (int i = 0; i < 6; i++) if (id(g_gl_present)[i]) { first = i; break; } + if (first >= 0 && !id(g_gl_present)[id(g_gl_sel)]) id(g_gl_sel) = first; + - if: + condition: { lambda: 'int c=0; for(int i=0;i<6;i++) if(id(g_gl_present)[i]) c++; return c==0;' } + then: + - lvgl.widget.show: gl_empty + - lvgl.widget.hide: gl_icon + - lvgl.widget.hide: gl_value + - lvgl.widget.hide: gl_name + - lvgl.widget.hide: gl_pos + else: + - lvgl.widget.hide: gl_empty + - lvgl.widget.show: gl_value + - lvgl.widget.show: gl_name + - lvgl.label.update: { id: gl_icon, text: !lambda 'return id(g_gl_glyph)[id(g_gl_sel)];' } + - lvgl.widget.update: { id: gl_icon, hidden: !lambda 'return id(g_gl_glyph)[id(g_gl_sel)].empty();' } + - lvgl.label.update: + id: gl_value + text: !lambda |- + std::string v = id(g_gl_val)[id(g_gl_sel)]; + if (v.empty() || v == "unknown" || v == "unavailable") return std::string("--"); + std::string u = id(g_gl_unit)[id(g_gl_sel)]; + if (!u.empty()) v += " " + u; + // replace symbols the value font lacks (micro sign, superscripts) so units don't tofu + auto rep = [&](const std::string &a, const std::string &b) { + size_t p; while ((p = v.find(a)) != std::string::npos) v.replace(p, a.size(), b); + }; + rep("\xC2\xB5", "u"); // µ micro sign (U+00B5) -> u + rep("\xCE\xBC", "u"); // μ Greek mu (U+03BC, what HA often uses) -> u + rep("\xC2\xB2", "2"); // ² -> 2 + rep("\xC2\xB3", "3"); // ³ -> 3 + rep("\xC2\xB9", "1"); // ¹ -> 1 + return v; + - lvgl.label.update: { id: gl_name, text: !lambda 'return id(g_gl_name)[id(g_gl_sel)];' } + - lvgl.widget.update: { id: gl_pos, hidden: !lambda 'int c=0; for(int i=0;i<6;i++) if(id(g_gl_present)[i]) c++; return c<=1;' } + - lvgl.label.update: + id: gl_pos + text: !lambda |- + std::string d; // slider dots: active = bigger (circle-medium), rest = circle-small + for (int i=0;i<6;i++) { + if (!id(g_gl_present)[i]) continue; + d += (i == id(g_gl_sel)) ? "\U000f09de" : "\U000f09df"; + } + return d; + # per-sensor accent (by slot): tints the icon + dots so each glance has its identity + - if: { condition: { lambda: 'return id(g_gl_sel)==0;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0x35C759 }, lvgl.label.update: { id: gl_pos, text_color: 0x35C759 } ] } + - if: { condition: { lambda: 'return id(g_gl_sel)==1;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0x3FA9D6 }, lvgl.label.update: { id: gl_pos, text_color: 0x3FA9D6 } ] } + - if: { condition: { lambda: 'return id(g_gl_sel)==2;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0xF5B83D }, lvgl.label.update: { id: gl_pos, text_color: 0xF5B83D } ] } + - if: { condition: { lambda: 'return id(g_gl_sel)==3;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0xA66BFF }, lvgl.label.update: { id: gl_pos, text_color: 0xA66BFF } ] } + - if: { condition: { lambda: 'return id(g_gl_sel)==4;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0xFF6B60 }, lvgl.label.update: { id: gl_pos, text_color: 0xFF6B60 } ] } + - if: { condition: { lambda: 'return id(g_gl_sel)==5;' }, then: [ lvgl.label.update: { id: gl_icon, text_color: 0x2FE6CF }, lvgl.label.update: { id: gl_pos, text_color: 0x2FE6CF } ] } + +text_sensor: + - platform: homeassistant + id: gl1_v + entity_id: ${glance1_entity} + on_value: [ lambda: 'id(g_gl_val)[0]=x; id(g_gl_present)[0]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl1_u + entity_id: ${glance1_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[0]=x;', script.execute: gl_render ] + - platform: homeassistant + id: gl2_v + entity_id: ${glance2_entity} + on_value: [ lambda: 'id(g_gl_val)[1]=x; id(g_gl_present)[1]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl2_u + entity_id: ${glance2_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[1]=x;', script.execute: gl_render ] + - platform: homeassistant + id: gl3_v + entity_id: ${glance3_entity} + on_value: [ lambda: 'id(g_gl_val)[2]=x; id(g_gl_present)[2]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl3_u + entity_id: ${glance3_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[2]=x;', script.execute: gl_render ] + - platform: homeassistant + id: gl4_v + entity_id: ${glance4_entity} + on_value: [ lambda: 'id(g_gl_val)[3]=x; id(g_gl_present)[3]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl4_u + entity_id: ${glance4_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[3]=x;', script.execute: gl_render ] + - platform: homeassistant + id: gl5_v + entity_id: ${glance5_entity} + on_value: [ lambda: 'id(g_gl_val)[4]=x; id(g_gl_present)[4]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl5_u + entity_id: ${glance5_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[4]=x;', script.execute: gl_render ] + - platform: homeassistant + id: gl6_v + entity_id: ${glance6_entity} + on_value: [ lambda: 'id(g_gl_val)[5]=x; id(g_gl_present)[5]=true;', script.execute: gl_render ] + - platform: homeassistant + id: gl6_u + entity_id: ${glance6_entity} + attribute: unit_of_measurement + on_value: [ lambda: 'id(g_gl_unit)[5]=x;', script.execute: gl_render ] + +interval: + # Carousel nav: when selected, show the page and take the knob (only if >1 sensor). + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==8;' } + then: + - lambda: 'id(g_nav_req) = false;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_sensors, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_sensors, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_sensors, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_sensors, animation: move_bottom, time: 250ms }] } + - script.execute: gl_render + # Knob cycles between present sensors (capture only when there's more than one). + - interval: 120ms + then: + - if: + condition: { lambda: 'return id(g_base)==8;' } + then: + - lambda: |- + int c=0; for (int i=0;i<6;i++) if (id(g_gl_present)[i]) c++; + id(g_knob_capture) = (c > 1); + - if: + condition: { lambda: 'return id(g_knob_delta) != 0;' } + then: + - lambda: |- + int d = id(g_knob_delta); id(g_knob_delta) = 0; + int cnt=0; for (int i=0;i<6;i++) if (id(g_gl_present)[i]) cnt++; + if (cnt > 0) { + int step = (d > 0) ? 1 : -1; int n = (d > 0) ? d : -d; + for (int k=0;k id(g_sn_best)) id(g_sn_best) = s; + for (int i = 0; i < 10; i++) { + if (s > id(g_sn_top)[i]) { + for (int j = 9; j > i; j--) id(g_sn_top)[j] = id(g_sn_top)[j-1]; + id(g_sn_top)[i] = s; + break; + } + } + - script.execute: sn_screen + # screen state + the single knob-capture authority (captured only in play + game over) + - id: sn_screen + then: + - lambda: 'id(g_knob_capture) = (id(g_sn_state) == 1 || id(g_sn_state) == 2);' + - lvgl.widget.hide: sn_ring + - script.execute: sn_clear + - lvgl.widget.hide: lbl_sn_score + - lvgl.widget.hide: sn_logo + - lvgl.widget.hide: btn_sn_start + - lvgl.widget.hide: btn_sn_howto + - lvgl.widget.hide: btn_sn_scores + - lvgl.widget.hide: lbl_sn_over + - lvgl.widget.hide: lbl_sn_rec + - lvgl.widget.hide: btn_sn_replay + - lvgl.widget.hide: btn_sn_exit + - lvgl.widget.hide: lbl_sn_howto_t + - lvgl.widget.hide: sn_b1 + - lvgl.widget.hide: sn_b2 + - lvgl.widget.hide: sn_b3 + - lvgl.widget.hide: sn_b4 + - lvgl.widget.hide: lbl_sn_howto1 + - lvgl.widget.hide: lbl_sn_howto2 + - lvgl.widget.hide: lbl_sn_howto3 + - lvgl.widget.hide: lbl_sn_howto4 + - lvgl.widget.hide: lbl_sn_scores_t + - lvgl.widget.hide: lbl_sn_scores1 + - lvgl.widget.hide: lbl_sn_scores2 + - lvgl.widget.hide: btn_sn_back + - if: # MENU + condition: { lambda: 'return id(g_sn_state) == 0;' } + then: + - lvgl.widget.show: sn_logo + - lvgl.widget.show: btn_sn_start + - lvgl.widget.show: btn_sn_howto + - lvgl.widget.show: btn_sn_scores + - if: # PLAY + condition: { lambda: 'return id(g_sn_state) == 1;' } + then: + - lvgl.widget.show: sn_ring + - lvgl.widget.show: lbl_sn_score + - script.execute: sn_drawfull + - if: # GAME OVER + condition: { lambda: 'return id(g_sn_state) == 2;' } + then: + - lvgl.widget.show: sn_logo + - lvgl.widget.show: lbl_sn_over + - lvgl.widget.show: lbl_sn_rec + - lvgl.widget.show: btn_sn_replay + - lvgl.widget.show: btn_sn_exit + - lvgl.label.update: { id: lbl_sn_over, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Score: %d", id(g_sn_score)); return std::string(b);' } + - lvgl.label.update: { id: lbl_sn_rec, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Best: %d", id(g_sn_best)); return std::string(b);' } + - if: # HOW TO PLAY + condition: { lambda: 'return id(g_sn_state) == 3;' } + then: + - lvgl.widget.show: lbl_sn_howto_t + - lvgl.widget.show: sn_b1 + - lvgl.widget.show: sn_b2 + - lvgl.widget.show: sn_b3 + - lvgl.widget.show: sn_b4 + - lvgl.widget.show: lbl_sn_howto1 + - lvgl.widget.show: lbl_sn_howto2 + - lvgl.widget.show: lbl_sn_howto3 + - lvgl.widget.show: lbl_sn_howto4 + - lvgl.widget.show: btn_sn_back + - if: # SCORES (top 10) + condition: { lambda: 'return id(g_sn_state) == 4;' } + then: + - lvgl.widget.show: lbl_sn_scores_t + - lvgl.widget.show: lbl_sn_scores1 + - lvgl.widget.show: lbl_sn_scores2 + - lvgl.widget.show: btn_sn_back + - lvgl.label.update: + id: lbl_sn_scores1 + text: !lambda |- + std::string s; char b[24]; + for (int i = 0; i < 5; i++) { if(i) s += "\n"; if(id(g_sn_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sn_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + - lvgl.label.update: + id: lbl_sn_scores2 + text: !lambda |- + std::string s; char b[24]; + for (int i = 5; i < 10; i++) { if(i>5) s += "\n"; if(id(g_sn_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sn_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s += b; } + return s; + +interval: + - interval: 250ms + then: + - if: + condition: { lambda: 'return id(g_sn_reset) || id(g_factory_reset);' } + then: + - lambda: 'for (int i = 0; i < 10; i++) id(g_sn_top)[i] = 0; id(g_sn_best) = 0; id(g_sn_reset) = false;' + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==9;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_sn_state) = 0; id(g_knob_delta) = 0;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_snake, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_snake, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_snake, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_snake, animation: move_bottom, time: 250ms }] } + - script.execute: sn_screen + # Game tick: steer + glide head; lay/drop one trail dot when the head advanced SEG_DIST. + # All body/head positioning is done IN this lambda (lv_obj_set_pos) to keep the action chain shallow. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_base) == 9 && id(g_sn_state) == 1;' } + then: + - lambda: |- + id(g_sn_add) = -1; id(g_sn_del) = -1; id(g_sn_newfruit) = -1; id(g_sn_newskull) = -1; + int kd = id(g_knob_delta); id(g_knob_delta) = 0; + id(g_sn_ang) += kd * 0.26f; + float spd = 3.2f + id(g_sn_score) / 400.0f; if (spd > 5.5f) spd = 5.5f; + float hx = id(g_sn_hx) + cosf(id(g_sn_ang)) * spd; + float hy = id(g_sn_hy) + sinf(id(g_sn_ang)) * spd; + if (hx*hx + hy*hy > 168.0f * 168.0f) { id(g_sn_dead) = true; } // hit the ring + else { + id(g_sn_hx) = hx; id(g_sn_hy) = hy; + int len = id(g_sn_len), head = id(g_sn_head); + for (int i = 6; i < len; i++) { + int sl = (head - i + 400) % 100; + float dx = hx - id(g_sn_tx)[sl], dy = hy - id(g_sn_ty)[sl]; + if (dx*dx + dy*dy < 8.0f * 8.0f) { id(g_sn_dead) = true; break; } + } + for (int s = 0; s < 2; s++) if (id(g_sn_skon)[s]) { + float dx = hx - id(g_sn_skx)[s], dy = hy - id(g_sn_sky)[s]; + if (dx*dx + dy*dy < 13.0f * 13.0f) { id(g_sn_dead) = true; } + } + for (int s = 0; s < 3 && !id(g_sn_dead); s++) if (id(g_sn_fon)[s]) { + float dx = hx - id(g_sn_fx)[s], dy = hy - id(g_sn_fy)[s]; + if (dx*dx + dy*dy < 12.0f * 12.0f) { id(g_sn_fon)[s] = false; id(g_sn_score) += 10; id(g_sn_grow) += 3; } + } + if (!id(g_sn_dead)) { + float dx = hx - id(g_sn_tx)[head], dy = hy - id(g_sn_ty)[head]; + if (dx*dx + dy*dy >= 8.0f * 8.0f) { + int nh = (head + 1) % 100; + id(g_sn_tx)[nh] = hx; id(g_sn_ty)[nh] = hy; + id(g_sn_head) = nh; id(g_sn_add) = nh; + if (id(g_sn_grow) > 0 && id(g_sn_len) < 99) { id(g_sn_grow)--; id(g_sn_len)++; id(g_sn_del) = -1; } // cap at POOL-1: the ring needs one free slot or add/drop collide + else { if (id(g_sn_grow) > 0) id(g_sn_grow)--; id(g_sn_del) = (head - id(g_sn_len) + 1 + 400) % 100; } + } + } + } + if (!id(g_sn_dead)) { + int fc = 0; for (int s = 0; s < 3; s++) if (id(g_sn_fon)[s]) fc++; + id(g_sn_fclk)++; + int wait = (fc <= 1) ? 45 : 90; + if (fc < 3 && id(g_sn_fclk) >= wait) { + id(g_sn_fclk) = 0; + int sl = -1; for (int s = 0; s < 3; s++) if (!id(g_sn_fon)[s]) { sl = s; break; } + if (sl >= 0) { + float a = (esp_random() % 62832) / 10000.0f; float rad = 25.0f + (esp_random() % 140); + id(g_sn_fx)[sl] = cosf(a)*rad; id(g_sn_fy)[sl] = sinf(a)*rad; + id(g_sn_fi)[sl] = esp_random() % 12; id(g_sn_fon)[sl] = true; id(g_sn_newfruit) = sl; + } + } + int sc = 0; for (int s = 0; s < 2; s++) if (id(g_sn_skon)[s]) sc++; + id(g_sn_skclk)++; + if (sc < 2 && id(g_sn_skclk) >= 200) { + id(g_sn_skclk) = 0; + int sl = -1; for (int s = 0; s < 2; s++) if (!id(g_sn_skon)[s]) { sl = s; break; } + if (sl >= 0) { + float a = (esp_random() % 62832) / 10000.0f; float rad = 30.0f + (esp_random() % 130); + id(g_sn_skx)[sl] = cosf(a)*rad; id(g_sn_sky)[sl] = sinf(a)*rad; + id(g_sn_skon)[sl] = true; id(g_sn_skage)[sl] = 0; id(g_sn_newskull) = sl; + } + } + for (int s = 0; s < 2; s++) if (id(g_sn_skon)[s]) { id(g_sn_skage)[s]++; if (id(g_sn_skage)[s] >= 220) id(g_sn_skon)[s] = false; } + // render (constant cost): head every tick + the one added/dropped dot + lv_obj_set_pos(id(sn_head), 180 + (int) lroundf(id(g_sn_hx)) - 4, 180 + (int) lroundf(id(g_sn_hy)) - 4); + if (id(g_sn_add) >= 0 || id(g_sn_del) >= 0) { + lv_obj_t *SS[100] = { id(sn_seg0), id(sn_seg1), id(sn_seg2), id(sn_seg3), id(sn_seg4), id(sn_seg5), id(sn_seg6), id(sn_seg7), id(sn_seg8), id(sn_seg9), id(sn_seg10), id(sn_seg11), id(sn_seg12), id(sn_seg13), id(sn_seg14), id(sn_seg15), id(sn_seg16), id(sn_seg17), id(sn_seg18), id(sn_seg19), id(sn_seg20), id(sn_seg21), id(sn_seg22), id(sn_seg23), id(sn_seg24), id(sn_seg25), id(sn_seg26), id(sn_seg27), id(sn_seg28), id(sn_seg29), id(sn_seg30), id(sn_seg31), id(sn_seg32), id(sn_seg33), id(sn_seg34), id(sn_seg35), id(sn_seg36), id(sn_seg37), id(sn_seg38), id(sn_seg39), id(sn_seg40), id(sn_seg41), id(sn_seg42), id(sn_seg43), id(sn_seg44), id(sn_seg45), id(sn_seg46), id(sn_seg47), id(sn_seg48), id(sn_seg49), id(sn_seg50), id(sn_seg51), id(sn_seg52), id(sn_seg53), id(sn_seg54), id(sn_seg55), id(sn_seg56), id(sn_seg57), id(sn_seg58), id(sn_seg59), id(sn_seg60), id(sn_seg61), id(sn_seg62), id(sn_seg63), id(sn_seg64), id(sn_seg65), id(sn_seg66), id(sn_seg67), id(sn_seg68), id(sn_seg69), id(sn_seg70), id(sn_seg71), id(sn_seg72), id(sn_seg73), id(sn_seg74), id(sn_seg75), id(sn_seg76), id(sn_seg77), id(sn_seg78), id(sn_seg79), id(sn_seg80), id(sn_seg81), id(sn_seg82), id(sn_seg83), id(sn_seg84), id(sn_seg85), id(sn_seg86), id(sn_seg87), id(sn_seg88), id(sn_seg89), id(sn_seg90), id(sn_seg91), id(sn_seg92), id(sn_seg93), id(sn_seg94), id(sn_seg95), id(sn_seg96), id(sn_seg97), id(sn_seg98), id(sn_seg99) }; + if (id(g_sn_add) >= 0) lv_obj_set_pos(SS[id(g_sn_add)], 180 + (int) lroundf(id(g_sn_tx)[id(g_sn_add)]) - 4, 180 + (int) lroundf(id(g_sn_ty)[id(g_sn_add)]) - 4); + if (id(g_sn_del) >= 0) lv_obj_set_pos(SS[id(g_sn_del)], 400, 400); + } + } + - if: + condition: { lambda: 'return id(g_sn_dead);' } + then: + - script.execute: sn_over + else: + - if: + condition: { lambda: 'return id(g_sn_newfruit) >= 0;' } + then: + - if: { condition: { lambda: 'return id(g_sn_newfruit) == 0;' }, then: [ script.execute: sn_fspr0 ] } + - if: { condition: { lambda: 'return id(g_sn_newfruit) == 1;' }, then: [ script.execute: sn_fspr1 ] } + - if: { condition: { lambda: 'return id(g_sn_newfruit) == 2;' }, then: [ script.execute: sn_fspr2 ] } + - if: + condition: { lambda: 'return id(g_sn_newskull) >= 0;' } + then: + - if: { condition: { lambda: 'return id(g_sn_newskull) == 0;' }, then: [ lvgl.widget.update: { id: sn_skull0, hidden: false, x: !lambda 'return (int) lroundf(id(g_sn_skx)[0]);', y: !lambda 'return (int) lroundf(id(g_sn_sky)[0]);' } ] } + - if: { condition: { lambda: 'return id(g_sn_newskull) == 1;' }, then: [ lvgl.widget.update: { id: sn_skull1, hidden: false, x: !lambda 'return (int) lroundf(id(g_sn_skx)[1]);', y: !lambda 'return (int) lroundf(id(g_sn_sky)[1]);' } ] } + - script.execute: sn_items + - script.execute: sn_hud + +image: + - id: img_sn_logo + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/snake-logo.png" + type: RGB565 + - id: img_sn_fruit0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit0.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit1.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit2.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit3.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit4.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit5.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit6.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit7.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit8 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit8.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit9 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit9.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit10 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit10.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_fruit11 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/fruit11.png" + type: RGB565 + transparency: alpha_channel + - id: img_sn_skull + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/skull.png" + type: RGB565 + transparency: alpha_channel + +lvgl: + pages: + - id: page_snake + bg_color: 0x0D1E15 + scrollbar_mode: "off" + scrollable: false + widgets: + - obj: { id: sn_ring, align: CENTER, x: 0, y: 0, width: 344, height: 344, radius: 172, bg_opa: TRANSP, border_width: 4, border_color: 0x3A8C4E, hidden: true } + - image: { id: sn_fruit0, align: CENTER, x: 0, y: 0, src: img_sn_fruit0, hidden: true } + - image: { id: sn_fruit1, align: CENTER, x: 0, y: 0, src: img_sn_fruit0, hidden: true } + - image: { id: sn_fruit2, align: CENTER, x: 0, y: 0, src: img_sn_fruit0, hidden: true } + - image: { id: sn_skull0, align: CENTER, x: 0, y: 0, src: img_sn_skull, hidden: true } + - image: { id: sn_skull1, align: CENTER, x: 0, y: 0, src: img_sn_skull, hidden: true } + - obj: { id: sn_seg0, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg1, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg2, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg3, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg4, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg5, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg6, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg7, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg8, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg9, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg10, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg11, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg12, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg13, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg14, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg15, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg16, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg17, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg18, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg19, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg20, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg21, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg22, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg23, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg24, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg25, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg26, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg27, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg28, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg29, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg30, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg31, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg32, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg33, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg34, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg35, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg36, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg37, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg38, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg39, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg40, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg41, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg42, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg43, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg44, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg45, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg46, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg47, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg48, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg49, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg50, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg51, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg52, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg53, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg54, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg55, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg56, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg57, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg58, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg59, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg60, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg61, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg62, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg63, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg64, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg65, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg66, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg67, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg68, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg69, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg70, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg71, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg72, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg73, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg74, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg75, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg76, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg77, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg78, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg79, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg80, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg81, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg82, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg83, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg84, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg85, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg86, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg87, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg88, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg89, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg90, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg91, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg92, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg93, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg94, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg95, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg96, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg97, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg98, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_seg99, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0x52A049, bg_opa: COVER } + - obj: { id: sn_head, x: 400, y: 400, width: 9, height: 9, radius: 4, border_width: 0, bg_color: 0xB8E86A, bg_opa: COVER } + - label: { id: lbl_sn_score, align: CENTER, x: 0, y: -150, text: "0", text_font: font_med, text_color: 0xCFEAE4, hidden: true } + - image: { id: sn_logo, align: CENTER, x: 0, y: 0, src: img_sn_logo, hidden: true } + - button: + id: btn_sn_start + align: CENTER + y: 4 + width: 150 + height: 44 + radius: 22 + bg_color: 0xA6D85F + bg_opa: COVER + border_width: 0 + on_click: [ script.execute: sn_start ] + widgets: + - label: { align: CENTER, text: "Start", text_font: font_med, text_color: 0x12241A } + - button: + id: btn_sn_howto + align: CENTER + y: 54 + width: 150 + height: 44 + radius: 22 + bg_color: 0x244A30 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sn_state) = 3;', script.execute: sn_screen ] + widgets: + - label: { align: CENTER, text: "How to play?", text_font: font_med, text_color: 0xCFE6C4 } + - button: + id: btn_sn_scores + align: CENTER + y: 104 + width: 150 + height: 44 + radius: 22 + bg_color: 0x244A30 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sn_state) = 4;', script.execute: sn_screen ] + widgets: + - label: { align: CENTER, text: "Scores", text_font: font_med, text_color: 0xCFE6C4 } + - label: { id: lbl_sn_over, align: CENTER, x: 0, y: -10, text_align: CENTER, text: "", text_font: font_sel, text_color: 0x12212D, hidden: true } + - label: { id: lbl_sn_rec, align: CENTER, x: 0, y: 22, text_align: CENTER, text: "", text_font: font_artist, text_color: 0x12212D, hidden: true } + - button: + id: btn_sn_replay + align: CENTER + x: -66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0xA6D85F + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ script.execute: sn_start ] + widgets: + - label: { align: CENTER, text: "Play", text_font: font_med, text_color: 0x12241A } + - button: + id: btn_sn_exit + align: CENTER + x: 66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sn_state) = 0;', script.execute: sn_screen ] + widgets: + - label: { align: CENTER, text: "Exit", text_font: font_med, text_color: 0xFFFFFF } + - label: { id: lbl_sn_howto_t, align: CENTER, y: -104, text: "HOW TO PLAY?", text_font: font_sel, text_color: 0xA6D85F, hidden: true } + - obj: { id: sn_b1, align: CENTER, x: -96, y: -52, width: 24, height: 24, radius: 12, bg_color: 0x6FB23F, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "1", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: sn_b2, align: CENTER, x: -96, y: -16, width: 24, height: 24, radius: 12, bg_color: 0x6FB23F, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "2", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: sn_b3, align: CENTER, x: -96, y: 20, width: 24, height: 24, radius: 12, bg_color: 0x6FB23F, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "3", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: sn_b4, align: CENTER, x: -96, y: 56, width: 24, height: 24, radius: 12, bg_color: 0xE05A4A, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "!", text_font: font_artist, text_color: 0xFFFFFF } ] } + - label: { id: lbl_sn_howto1, align_to: { id: sn_b1, align: OUT_RIGHT_MID, x: 8 }, text: "Turn knob to steer", text_font: font_med, text_color: 0xC6DCC0, hidden: true } + - label: { id: lbl_sn_howto2, align_to: { id: sn_b2, align: OUT_RIGHT_MID, x: 8 }, text: "Eat fruit to grow", text_font: font_med, text_color: 0xC6DCC0, hidden: true } + - label: { id: lbl_sn_howto3, align_to: { id: sn_b3, align: OUT_RIGHT_MID, x: 8 }, text: "Avoid the ring & tail", text_font: font_med, text_color: 0xC6DCC0, hidden: true } + - label: { id: lbl_sn_howto4, align_to: { id: sn_b4, align: OUT_RIGHT_MID, x: 8 }, text: "Skulls kill - avoid!", text_font: font_med, text_color: 0xC6DCC0, hidden: true } + - label: { id: lbl_sn_scores_t, align: CENTER, y: -116, text: "SCORES", text_font: font_sel, text_color: 0xA6D85F, hidden: true } + - label: { id: lbl_sn_scores1, align: CENTER, x: -52, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC6DCC0, hidden: true } + - label: { id: lbl_sn_scores2, align: CENTER, x: 56, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC6DCC0, hidden: true } + - button: + id: btn_sn_back + align: CENTER + y: 120 + width: 130 + height: 42 + radius: 21 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sn_state) = 0;', script.execute: sn_screen ] + widgets: + - label: { align: CENTER, text: "Back", text_font: font_med, text_color: 0xFFFFFF } diff --git a/base/screens/space-wars.yaml b/base/screens/space-wars.yaml new file mode 100644 index 0000000..f42ac17 --- /dev/null +++ b/base/screens/space-wars.yaml @@ -0,0 +1,498 @@ +# Space Wars - optional carousel screen (base id 4). Vertical shooter. +# Remove it: drop this file from your config's package "files:" list. Nothing else to edit. +# Scores (g_sw_top / g_sw_best) + the "Reset scores" settings action live here - fully self-contained. + +esphome: + on_boot: + - priority: 660 + then: + - lambda: 'id(g_present)[4] = true;' # register after clock/player/timer/cars + # Settings (Settings -> Widgets -> Space Wars -> Reset scores) + factory-reset handling. + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\n" : ""); id(g_wgrp_labels) += "Space Wars"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Reset scores"; id(g_wopt_kind)[o] = 1; id(g_wopt_ptr)[o] = &id(g_sw_reset); + +globals: + # --- scores (persistent) + reset flag, owned by this package --- + - id: g_sw_best + type: int + restore_value: yes + initial_value: '0' + - id: g_sw_top + type: int[10] + restore_value: yes + - id: g_sw_reset # Widgets "Reset scores" sets this; the watcher below clears the scores + type: bool + restore_value: no + initial_value: 'false' + # --- Game 2 "Space Wars" (page_game2, g_base==4) --- + - id: g_sw_state # 0=menu 1=playing 2=game over 3=how-to 4=scores + type: int + restore_value: no + initial_value: '0' + - id: g_sw_px # player ship X + type: int + restore_value: no + initial_value: '0' + - id: g_sw_lives + type: int + restore_value: no + initial_value: '3' + - id: g_sw_inv + type: int + restore_value: no + initial_value: '0' + - id: g_sw_score + type: int + restore_value: no + initial_value: '0' + - id: g_fire # auto-fire cadence counter + type: int + restore_value: no + initial_value: '0' + - id: g_tcount # time counter (points for time survived) + type: int + restore_value: no + initial_value: '0' + - id: g_sw_crash + type: bool + restore_value: no + initial_value: 'false' + - id: g_b_x # player bullets (2): X + type: int[2] + restore_value: no + - id: g_b_y + type: int[2] + restore_value: no + - id: g_b_on + type: bool[2] + restore_value: no + - id: g_en_x # enemies (3) + type: int[3] + restore_value: no + - id: g_en_y + type: int[3] + restore_value: no + - id: g_en_on + type: bool[3] + restore_value: no + - id: g_eb_x # enemy bullets (2) + type: int[2] + restore_value: no + - id: g_eb_y + type: int[2] + restore_value: no + - id: g_eb_on + type: bool[2] + restore_value: no + - id: g_exp_f # explosion: countdown frame counter (0=inactive), ticks in the 70ms loop + type: int + restore_value: no + initial_value: '0' + - id: g_exp_x # explosion: position (from the destroyed enemy) + type: int + restore_value: no + initial_value: '0' + - id: g_exp_y + type: int + restore_value: no + initial_value: '0' + - id: g_exp_new # flag: start the animation this tick + type: bool + restore_value: no + initial_value: 'false' + - id: g_exp_hide # flag: hide the explosion this tick + type: bool + restore_value: no + initial_value: 'false' + +script: + # ===== SPACE WARS (game 2) ===== + - id: sw_render # ship X + score + lives + then: + - lvgl.widget.update: { id: sw_ship, x: !lambda 'return id(g_sw_px);' } + - lvgl.label.update: { id: lbl_sw_score, text: !lambda 'char b[12]; snprintf(b,sizeof(b),"%d",id(g_sw_score)); return std::string(b);' } + - lvgl.label.update: + id: lbl_sw_lives + text: !lambda |- + std::string h; for (int i=0;iid(g_sw_best)) id(g_sw_best)=s; + for (int i=0;i<10;i++){ if(s>id(g_sw_top)[i]){ for(int j=9;j>i;j--) id(g_sw_top)[j]=id(g_sw_top)[j-1]; id(g_sw_top)[i]=s; break; } } + // reset game state so the end of the current tick restores nothing (red flash / enemies) + id(g_sw_inv)=0; + for(int i=0;i<3;i++) id(g_en_on)[i]=false; + for(int i=0;i<2;i++){ id(g_b_on)[i]=false; id(g_eb_on)[i]=false; } + id(g_exp_f)=0; id(g_exp_new)=false; id(g_exp_hide)=false; + - script.execute: sw_screen + - id: sw_screen # 0=menu 1=playing 2=game over 3=how-to 4=scores + then: + # knob steers only during play + game over -> capture it there (block volume), free it in menu/how-to/scores + - lambda: 'id(g_knob_capture) = (id(g_sw_state) == 1 || id(g_sw_state) == 2);' + - lvgl.widget.hide: sw_bg + - lvgl.widget.hide: sw_logo + - lvgl.widget.hide: sw_ship + - lvgl.widget.hide: sw_exp + - lvgl.widget.hide: b0 + - lvgl.widget.hide: b1 + - lvgl.widget.hide: eb0 + - lvgl.widget.hide: eb1 + - lvgl.widget.hide: en0 + - lvgl.widget.hide: en1 + - lvgl.widget.hide: en2 + - lvgl.widget.hide: lbl_sw_lives + - lvgl.widget.hide: lbl_sw_score + - lvgl.widget.hide: sw_flash + - lvgl.widget.hide: btn_sw_start + - lvgl.widget.hide: btn_sw_howto + - lvgl.widget.hide: btn_sw_scores + - lvgl.widget.hide: lbl_sw_over + - lvgl.widget.hide: lbl_sw_rec + - lvgl.widget.hide: btn_sw_replay + - lvgl.widget.hide: btn_sw_exit + - lvgl.widget.hide: lbl_sw_ht_t + - lvgl.widget.hide: badge_h1 + - lvgl.widget.hide: badge_h2 + - lvgl.widget.hide: badge_h3 + - lvgl.widget.hide: badge_h4 + - lvgl.widget.hide: lbl_sw_ht1 + - lvgl.widget.hide: lbl_sw_ht2 + - lvgl.widget.hide: lbl_sw_ht3 + - lvgl.widget.hide: lbl_sw_ht4 + - lvgl.widget.hide: lbl_sw_hheart + - lvgl.widget.hide: lbl_sw_st + - lvgl.widget.hide: lbl_sw_s1 + - lvgl.widget.hide: lbl_sw_s2 + - lvgl.widget.hide: btn_sw_back + - if: # MENU + condition: { lambda: 'return id(g_sw_state)==0;' } + then: [ lvgl.widget.show: sw_logo, lvgl.widget.show: btn_sw_start, lvgl.widget.show: btn_sw_howto, lvgl.widget.show: btn_sw_scores ] + - if: # GAME + condition: { lambda: 'return id(g_sw_state)==1;' } + then: + - lvgl.widget.show: sw_bg + - lvgl.widget.show: sw_ship + - lvgl.widget.show: en0 + - lvgl.widget.show: en1 + - lvgl.widget.show: en2 + - lvgl.widget.show: lbl_sw_lives + - lvgl.widget.show: lbl_sw_score + - if: # GAME OVER + condition: { lambda: 'return id(g_sw_state)==2;' } + then: + - lvgl.widget.show: sw_logo + - lvgl.widget.show: lbl_sw_over + - lvgl.widget.show: lbl_sw_rec + - lvgl.widget.show: btn_sw_replay + - lvgl.widget.show: btn_sw_exit + - lvgl.label.update: { id: lbl_sw_over, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Score: %d", id(g_sw_score)); return std::string(b);' } + - lvgl.label.update: { id: lbl_sw_rec, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Best: %d", id(g_sw_best)); return std::string(b);' } + - if: # HOW TO PLAY + condition: { lambda: 'return id(g_sw_state)==3;' } + then: + - lvgl.widget.show: sw_bg + - lvgl.widget.show: lbl_sw_ht_t + - lvgl.widget.show: badge_h1 + - lvgl.widget.show: badge_h2 + - lvgl.widget.show: badge_h3 + - lvgl.widget.show: badge_h4 + - lvgl.widget.show: lbl_sw_ht1 + - lvgl.widget.show: lbl_sw_ht2 + - lvgl.widget.show: lbl_sw_ht3 + - lvgl.widget.show: lbl_sw_ht4 + - lvgl.widget.show: lbl_sw_hheart + - lvgl.widget.show: btn_sw_back + - if: # SCORES + condition: { lambda: 'return id(g_sw_state)==4;' } + then: + - lvgl.widget.show: sw_bg + - lvgl.widget.show: lbl_sw_st + - lvgl.widget.show: lbl_sw_s1 + - lvgl.widget.show: lbl_sw_s2 + - lvgl.widget.show: btn_sw_back + - lvgl.label.update: { id: lbl_sw_s1, text: !lambda 'std::string s; char b[24]; for(int i=0;i<5;i++){ if(i) s+="\n"; if(id(g_sw_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sw_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s+=b; } return s;' } + - lvgl.label.update: { id: lbl_sw_s2, text: !lambda 'std::string s; char b[24]; for(int i=5;i<10;i++){ if(i>5) s+="\n"; if(id(g_sw_top)[i]>0){ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sw_top)[i]); } else { snprintf(b,sizeof(b),"%d. -",i+1); } s+=b; } return s;' } + +interval: + # Reset scores when the Widgets action fired (g_sw_reset). Idempotent + cheap. + - interval: 250ms + then: + - if: + condition: { lambda: 'return id(g_sw_reset) || id(g_factory_reset);' } + then: + - lambda: 'for (int i = 0; i < 10; i++) id(g_sw_top)[i] = 0; id(g_sw_best) = 0; id(g_sw_reset) = false;' + # nav: show this screen when it is selected in the carousel + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==4;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_sw_state) = 0;' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_game2, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_game2, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_game2, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_game2, animation: move_bottom, time: 250ms }] } + - script.execute: sw_screen + # Space Wars - tick only on the Space screen during play + - interval: 70ms + then: + - if: + condition: { lambda: 'return id(g_base) == 4 && id(g_sw_state) == 1;' } + then: + - lambda: |- + id(g_sw_px) += id(g_knob_delta) * 18; if (id(g_sw_px) < -150) id(g_sw_px) = -150; if (id(g_sw_px) > 150) id(g_sw_px) = 150; id(g_knob_delta) = 0; + int px = id(g_sw_px); + if (id(g_sw_inv) > 0) id(g_sw_inv)--; + if (id(g_exp_f) > 0) { id(g_exp_f)--; if (id(g_exp_f)==0) id(g_exp_hide)=true; } + id(g_tcount)++; if (id(g_tcount) % 10 == 0) id(g_sw_score)++; + // auto-fire every 5 ticks into a free slot + id(g_fire)++; + if (id(g_fire) >= 5) { id(g_fire)=0; for(int i=0;i<2;i++){ if(!id(g_b_on)[i]){ id(g_b_on)[i]=true; id(g_b_x)[i]=px; id(g_b_y)[i]=100; break; } } } + // player bullets go up + for (int i=0;i<2;i++){ if(id(g_b_on)[i]){ id(g_b_y)[i]-=24; if(id(g_b_y)[i]<-185) id(g_b_on)[i]=false; } } + // enemies go down; destroyed/escaped -> respawn at the top + for (int e=0;e<3;e++){ + if(id(g_en_on)[e]){ id(g_en_y)[e]+=6; if(id(g_en_y)[e]>188){ id(g_en_y)[e]=-160; id(g_en_x)[e]=(int)(esp_random()%280)-140; } } + else { id(g_en_on)[e]=true; id(g_en_y)[e]=-160-(int)(esp_random()%140); id(g_en_x)[e]=(int)(esp_random()%280)-140; } + } + // enemies shoot + if ((int)(esp_random()%100) < 9) { int k=(int)(esp_random()%3); if(id(g_en_on)[k]) for(int i=0;i<2;i++){ if(!id(g_eb_on)[i]){ id(g_eb_on)[i]=true; id(g_eb_x)[i]=id(g_en_x)[k]; id(g_eb_y)[i]=id(g_en_y)[k]+26; break; } } } + // enemy bullets go down + for (int i=0;i<2;i++){ if(id(g_eb_on)[i]){ id(g_eb_y)[i]+=13; if(id(g_eb_y)[i]>188) id(g_eb_on)[i]=false; } } + // player bullet x enemy + for (int b=0;b<2;b++){ if(id(g_b_on)[b]) for(int e=0;e<3;e++){ if(id(g_en_on)[e] && abs(id(g_b_x)[b]-id(g_en_x)[e])<22 && abs(id(g_b_y)[b]-id(g_en_y)[e])<26){ id(g_en_on)[e]=false; id(g_b_on)[b]=false; id(g_sw_score)+=10; id(g_exp_x)=id(g_en_x)[e]; id(g_exp_y)=id(g_en_y)[e]; id(g_exp_f)=6; id(g_exp_new)=true; break; } } } + // enemy / enemy bullet x player + id(g_sw_crash)=false; + if (id(g_sw_inv)<=0){ + for(int e=0;e<3;e++){ if(id(g_en_on)[e] && abs(id(g_en_x)[e]-px)<26 && abs(id(g_en_y)[e]-130)<32){ id(g_en_on)[e]=false; id(g_sw_crash)=true; break; } } + for(int i=0;i<2;i++){ if(id(g_eb_on)[i] && abs(id(g_eb_x)[i]-px)<18 && abs(id(g_eb_y)[i]-130)<26){ id(g_eb_on)[i]=false; id(g_sw_crash)=true; break; } } + } + - lvgl.widget.update: { id: sw_ship, x: !lambda 'return id(g_sw_px);' } + - if: { condition: { lambda: 'return id(g_sw_crash);' }, then: [ script.execute: sw_lose ] } + # explosion after destroying an enemy: set position, show, run the animation once + - if: + condition: { lambda: 'return id(g_exp_new);' } + then: + - lvgl.widget.update: { id: sw_exp, x: !lambda 'return id(g_exp_x);', y: !lambda 'return id(g_exp_y);', hidden: false } + - lvgl.animimg.start: sw_exp + - lambda: 'id(g_exp_new)=false;' + - if: + condition: { lambda: 'return id(g_exp_hide);' } + then: + - lvgl.animimg.stop: sw_exp + - lvgl.widget.hide: sw_exp + - lambda: 'id(g_exp_hide)=false;' + # positions + visibility + - lvgl.widget.update: { id: b0, x: !lambda 'return id(g_b_x)[0];', y: !lambda 'return id(g_b_y)[0];', hidden: !lambda 'return !id(g_b_on)[0];' } + - lvgl.widget.update: { id: b1, x: !lambda 'return id(g_b_x)[1];', y: !lambda 'return id(g_b_y)[1];', hidden: !lambda 'return !id(g_b_on)[1];' } + - lvgl.widget.update: { id: eb0, x: !lambda 'return id(g_eb_x)[0];', y: !lambda 'return id(g_eb_y)[0];', hidden: !lambda 'return !id(g_eb_on)[0];' } + - lvgl.widget.update: { id: eb1, x: !lambda 'return id(g_eb_x)[1];', y: !lambda 'return id(g_eb_y)[1];', hidden: !lambda 'return !id(g_eb_on)[1];' } + - lvgl.widget.update: { id: en0, x: !lambda 'return id(g_en_x)[0];', y: !lambda 'return id(g_en_y)[0];', hidden: !lambda 'return !id(g_en_on)[0];' } + - lvgl.widget.update: { id: en1, x: !lambda 'return id(g_en_x)[1];', y: !lambda 'return id(g_en_y)[1];', hidden: !lambda 'return !id(g_en_on)[1];' } + - lvgl.widget.update: { id: en2, x: !lambda 'return id(g_en_x)[2];', y: !lambda 'return id(g_en_y)[2];', hidden: !lambda 'return !id(g_en_on)[2];' } + - lvgl.label.update: { id: lbl_sw_score, text: !lambda 'char b[12]; snprintf(b,sizeof(b),"%d",id(g_sw_score)); return std::string(b);' } + - if: + condition: { lambda: 'return id(g_sw_inv) > 0;' } + then: + - lvgl.widget.update: { id: sw_ship, hidden: !lambda 'return (id(g_sw_inv) % 4) >= 2;' } + - lvgl.widget.update: { id: sw_flash, hidden: !lambda 'return id(g_sw_inv) < 12;' } + +image: + # Space Wars + - id: img_spacebg + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/spacebg.png" + type: RGB565 + - id: img_logo2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/logo2.png" + type: RGB565 + - id: img_sp + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/player.png" + type: RGB565 + transparency: alpha_channel + - id: img_se1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/enemy1.png" + type: RGB565 + transparency: alpha_channel + - id: img_se2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/enemy2.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp0.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp1.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp2.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp3.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp4.png" + type: RGB565 + transparency: alpha_channel + - id: img_exp5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/space-wars/exp5.png" + type: RGB565 + transparency: alpha_channel + +lvgl: + pages: + # --- SPACE WARS page (game 2): vertical shooter --- + - id: page_game2 + bg_color: 0x140A20 + scrollbar_mode: "off" + scrollable: false + widgets: + - image: { id: sw_bg, align: CENTER, x: 0, y: 0, src: img_spacebg, hidden: true } + - image: { id: sw_logo, align: CENTER, x: 0, y: 0, src: img_logo2, hidden: true } + - obj: { id: b0, align: CENTER, x: 0, y: 0, width: 4, height: 14, radius: 2, border_width: 0, bg_color: 0xFFE45A, hidden: true } + - obj: { id: b1, align: CENTER, x: 0, y: 0, width: 4, height: 14, radius: 2, border_width: 0, bg_color: 0xFFE45A, hidden: true } + - obj: { id: eb0, align: CENTER, x: 0, y: 0, width: 5, height: 14, radius: 2, border_width: 0, bg_color: 0xFF5050, hidden: true } + - obj: { id: eb1, align: CENTER, x: 0, y: 0, width: 5, height: 14, radius: 2, border_width: 0, bg_color: 0xFF5050, hidden: true } + - image: { id: en0, align: CENTER, x: -60, y: -150, src: img_se1, hidden: true } + - image: { id: en1, align: CENTER, x: 60, y: -150, src: img_se1, hidden: true } + - image: { id: en2, align: CENTER, x: 0, y: -150, src: img_se2, hidden: true } + - image: { id: sw_ship, align: CENTER, x: 0, y: 130, src: img_sp, hidden: true } + - animimg: + id: sw_exp + align: CENTER + x: 0 + y: 0 + src: [img_exp0, img_exp1, img_exp2, img_exp3, img_exp4, img_exp5] + duration: 420ms + repeat_count: 1 + auto_start: false + hidden: true + - label: { id: lbl_sw_lives, align: CENTER, x: -54, y: -132, text: "", text_font: icons18, text_color: 0xE24B4A, hidden: true } + - label: { id: lbl_sw_score, align: CENTER, x: 54, y: -132, text: "0", text_font: font_med, text_color: 0xCFEAE4, hidden: true } + - obj: { id: sw_flash, align: CENTER, x: 0, y: 0, width: 360, height: 360, radius: 0, border_width: 0, bg_color: 0xFF2A2A, bg_opa: 45%, hidden: true } + # MENU + - button: + id: btn_sw_start + align: CENTER + y: 4 + width: 150 + height: 44 + radius: 22 + bg_color: 0xFF7A4D + bg_opa: COVER + border_width: 0 + on_click: [ script.execute: sw_start ] + widgets: [ label: { align: CENTER, text: "Start", text_font: font_med, text_color: 0x2A0E06 } ] + - button: + id: btn_sw_howto + align: CENTER + y: 54 + width: 150 + height: 44 + radius: 22 + bg_color: 0x3A2150 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sw_state)=3;', script.execute: sw_screen ] + widgets: [ label: { align: CENTER, text: "How to play?", text_font: font_med, text_color: 0xFFFFFF } ] + - button: + id: btn_sw_scores + align: CENTER + y: 104 + width: 150 + height: 44 + radius: 22 + bg_color: 0x3A2150 + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sw_state)=4;', script.execute: sw_screen ] + widgets: [ label: { align: CENTER, text: "Scores", text_font: font_med, text_color: 0xFFFFFF } ] + # GAME OVER + - label: { id: lbl_sw_over, align: CENTER, x: 0, y: -10, text_align: CENTER, text: "", text_font: font_sel, text_color: 0xFFFFFF, hidden: true } + - label: { id: lbl_sw_rec, align: CENTER, x: 0, y: 22, text_align: CENTER, text: "", text_font: font_artist, text_color: 0x9AA6B2, hidden: true } + - button: + id: btn_sw_replay + align: CENTER + x: -66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0xFF7A4D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ script.execute: sw_start ] + widgets: [ label: { align: CENTER, text: "Play", text_font: font_med, text_color: 0x2A0E06 } ] + - button: + id: btn_sw_exit + align: CENTER + x: 66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sw_state)=0;', script.execute: sw_screen ] + widgets: [ label: { align: CENTER, text: "Exit", text_font: font_med, text_color: 0xFFFFFF } ] + # HOW TO PLAY + - label: { id: lbl_sw_ht_t, align: CENTER, y: -104, text: "HOW TO PLAY?", text_font: font_sel, text_color: 0xFF7A4D, hidden: true } + - obj: { id: badge_h1, align: CENTER, x: -90, y: -46, width: 24, height: 24, radius: 12, bg_color: 0xFF7A4D, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "1", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge_h2, align: CENTER, x: -90, y: -10, width: 24, height: 24, radius: 12, bg_color: 0xFF7A4D, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "2", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge_h3, align: CENTER, x: -90, y: 26, width: 24, height: 24, radius: 12, bg_color: 0xFF7A4D, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "3", text_font: font_artist, text_color: 0xFFFFFF } ] } + - obj: { id: badge_h4, align: CENTER, x: -90, y: 62, width: 24, height: 24, radius: 12, bg_color: 0xFF7A4D, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: { align: CENTER, text: "4", text_font: font_artist, text_color: 0xFFFFFF } ] } + - label: { id: lbl_sw_ht1, align_to: { id: badge_h1, align: OUT_RIGHT_MID, x: 8 }, text: "Use the knob", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_sw_ht2, align_to: { id: badge_h2, align: OUT_RIGHT_MID, x: 8 }, text: "Dodge bullets", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_sw_ht3, align_to: { id: badge_h3, align: OUT_RIGHT_MID, x: 8 }, text: "Destroy enemies", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_sw_ht4, align_to: { id: badge_h4, align: OUT_RIGHT_MID, x: 8 }, text: "You have 3 lives", text_font: font_med, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_sw_hheart, align_to: { id: lbl_sw_ht4, align: OUT_RIGHT_MID, x: 6 }, text: "󰋑󰋑󰋑", text_font: icons18, text_color: 0xE24B4A, hidden: true } + # SCORES + - label: { id: lbl_sw_st, align: CENTER, y: -116, text: "SCORES", text_font: font_sel, text_color: 0xFF7A4D, hidden: true } + - label: { id: lbl_sw_s1, align: CENTER, x: -50, y: -6, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC2CDDA, hidden: true } + - label: { id: lbl_sw_s2, align: CENTER, x: 50, y: -6, text: "", text_align: LEFT, text_font: font_artist, text_color: 0xC2CDDA, hidden: true } + - button: + id: btn_sw_back + align: CENTER + y: 120 + width: 130 + height: 42 + radius: 21 + bg_color: 0x3A3A3D + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sw_state)=0;', script.execute: sw_screen ] + widgets: [ label: { align: CENTER, text: "Back", text_font: font_med, text_color: 0xFFFFFF } ] diff --git a/base/screens/thermostat.yaml b/base/screens/thermostat.yaml new file mode 100644 index 0000000..c6e6c69 --- /dev/null +++ b/base/screens/thermostat.yaml @@ -0,0 +1,298 @@ +# Thermostat - optional carousel screen (base id 7). +# A round dial for a Home Assistant climate.* entity (${climate_entity}): +# * big centre = the target temperature; turn the KNOB to change it (by the entity's +# target_temp_step). The new value is sent to HA ~0.6 s after you stop turning. +# * "now ..." = the current room temperature; "RH ..%" = humidity (if the entity has it). +# * top label + the target colour show the action: heating (orange) / cooling (blue) / +# idle (teal) / off (grey). Bottom chip = the HVAC mode. +# * TAP toggles the climate on/off. +# +# Set ${climate_entity} in your config. Remove this screen by dropping the file from the +# package "files:" list. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_present)[7] = true;' # register the thermostat screen + +globals: + - id: g_th_cur # current temperature (-127 = no reading yet) + type: float + restore_value: no + initial_value: '-127.0' + - id: g_th_target # target temperature (synced from HA; edited locally by the knob) + type: float + restore_value: no + initial_value: '20.0' + - id: g_th_action # hvac_action: heating / cooling / idle / off (may be empty) + type: std::string + restore_value: no + - id: g_th_mode # hvac mode (the entity state): off / heat / cool / auto / heat_cool + type: std::string + restore_value: no + - id: g_th_hum # current humidity % (-1 = none) + type: int + restore_value: no + initial_value: '-1' + - id: g_th_min + type: float + restore_value: no + initial_value: '7.0' + - id: g_th_max + type: float + restore_value: no + initial_value: '35.0' + - id: g_th_step + type: float + restore_value: no + initial_value: '0.5' + - id: g_th_pending # true = local edit not yet sent; blocks HA from overwriting the target + type: bool + restore_value: no + initial_value: 'false' + - id: g_th_lasttap # last g_tap_seq we handled (one tap = one on/off toggle) + type: int + restore_value: no + initial_value: '0' + +script: + # Sends the edited target to HA, but only ~0.6 s after the last knob turn (mode: restart). + - id: th_commit + mode: restart + then: + - delay: 600ms + - homeassistant.action: + action: climate.set_temperature + data: + entity_id: ${climate_entity} + temperature: !lambda 'char b[8]; snprintf(b, sizeof(b), "%.1f", id(g_th_target)); return std::string(b);' + - lambda: 'id(g_th_pending) = false;' + # Redraws the dial from the state globals. + - id: th_render + then: + - lvgl.label.update: + id: th_target + text: !lambda 'char b[12]; snprintf(b, sizeof(b), "%.1f°", id(g_th_target)); return std::string(b);' + - lvgl.label.update: + id: th_cur + text: !lambda |- + if (id(g_th_cur) < -100) return std::string("now --"); + char b[16]; snprintf(b, sizeof(b), "now %.1f°", id(g_th_cur)); return std::string(b); + - lvgl.widget.update: { id: th_hum, hidden: !lambda 'return id(g_th_hum) < 0;' } + - lvgl.label.update: + id: th_hum + text: !lambda |- + if (id(g_th_hum) < 0) return std::string(""); + char b[12]; snprintf(b, sizeof(b), "RH %d%%", id(g_th_hum)); return std::string(b); + - lvgl.label.update: + id: th_mode + text: !lambda |- + std::string m = id(g_th_mode); + if (m == "heat_cool") return std::string("Auto"); + if (m.empty()) return std::string("-"); + if (m[0] >= 'a' && m[0] <= 'z') m[0] -= 32; return m; + - lvgl.arc.update: + id: th_arc + value: !lambda |- + float r = id(g_th_max) - id(g_th_min); + if (r <= 0) return 0.0f; + float p = 100.0f * (id(g_th_target) - id(g_th_min)) / r; + if (p < 0) p = 0; if (p > 100) p = 100; + return p; + - lvgl.label.update: + id: th_action + text: !lambda |- + std::string m = id(g_th_mode), a = id(g_th_action); + if (m == "off" || m.empty()) return std::string("OFF"); + if (a.find("heat") != std::string::npos || (a.empty() && m == "heat")) return std::string("HEATING"); + if (a.find("cool") != std::string::npos || (a.empty() && m == "cool")) return std::string("COOLING"); + if (a == "idle") return std::string("IDLE"); + if (!a.empty()) { if (a[0] >= 'a' && a[0] <= 'z') a[0] -= 32; return a; } + if (m[0] >= 'a' && m[0] <= 'z') m[0] -= 32; return m; + # accent colour for the action label + target by heat/cool/off/idle + - if: + condition: + lambda: 'return id(g_th_mode) != "off" && !id(g_th_mode).empty() && (id(g_th_action).find("heat") != std::string::npos || (id(g_th_action).empty() && id(g_th_mode) == "heat"));' + then: + - lvgl.label.update: { id: th_action, text_color: 0xFF6B30 } + - lvgl.label.update: { id: th_target, text_color: 0xFF6B30 } + - lvgl.arc.update: { id: th_arc, indicator: { arc_color: 0xFF6B30 } } + else: + - if: + condition: + lambda: 'return id(g_th_mode) != "off" && !id(g_th_mode).empty() && (id(g_th_action).find("cool") != std::string::npos || (id(g_th_action).empty() && id(g_th_mode) == "cool"));' + then: + - lvgl.label.update: { id: th_action, text_color: 0x3FA9D6 } + - lvgl.label.update: { id: th_target, text_color: 0x3FA9D6 } + - lvgl.arc.update: { id: th_arc, indicator: { arc_color: 0x3FA9D6 } } + else: + - if: + condition: { lambda: 'return id(g_th_mode) == "off" || id(g_th_mode).empty();' } + then: + - lvgl.label.update: { id: th_action, text_color: 0x6F9A92 } + - lvgl.label.update: { id: th_target, text_color: 0x6F9A92 } + - lvgl.arc.update: { id: th_arc, indicator: { arc_color: 0x44506A } } + else: + - lvgl.label.update: { id: th_action, text_color: 0x9FC7BE } + - lvgl.label.update: { id: th_target, text_color: 0xFFFFFF } + - lvgl.arc.update: { id: th_arc, indicator: { arc_color: 0x2FE6CF } } + - lambda: |- # position the target head-dot on the gauge + float r = id(g_th_max) - id(g_th_min); + float p = (r > 0) ? 100.0f * (id(g_th_target) - id(g_th_min)) / r : 0.0f; + if (p < 0) p = 0; if (p > 100) p = 100; + float a = (135.0f + p / 100.0f * 270.0f) * 0.01745329f; + int x = 180 + (int) lroundf(144.0f * cosf(a)) - 9; + int y = 180 + (int) lroundf(144.0f * sinf(a)) - 9; + lv_obj_set_pos(id(th_dot), x, y); + +sensor: + - platform: homeassistant + id: th_cur_s + entity_id: ${climate_entity} + attribute: current_temperature + on_value: + - lambda: 'id(g_th_cur) = x;' + - script.execute: th_render + - platform: homeassistant + id: th_tgt_s + entity_id: ${climate_entity} + attribute: temperature + on_value: + - lambda: 'if (!id(g_th_pending)) id(g_th_target) = x;' # don't clobber a value being edited + - script.execute: th_render + - platform: homeassistant + id: th_hum_s + entity_id: ${climate_entity} + attribute: current_humidity + on_value: + - lambda: 'id(g_th_hum) = (int) roundf(x);' + - script.execute: th_render + - platform: homeassistant + id: th_min_s + entity_id: ${climate_entity} + attribute: min_temp + on_value: [ lambda: 'id(g_th_min) = x;' ] + - platform: homeassistant + id: th_max_s + entity_id: ${climate_entity} + attribute: max_temp + on_value: [ lambda: 'id(g_th_max) = x;' ] + - platform: homeassistant + id: th_step_s + entity_id: ${climate_entity} + attribute: target_temp_step + on_value: [ lambda: 'if (x > 0) id(g_th_step) = x;' ] + +text_sensor: + - platform: homeassistant + id: th_mode_s + entity_id: ${climate_entity} # the entity state IS the hvac mode + on_value: + - lambda: 'id(g_th_mode) = x;' + - script.execute: th_render + - platform: homeassistant + id: th_action_s + entity_id: ${climate_entity} + attribute: hvac_action + on_value: + - lambda: 'id(g_th_action) = x;' + - script.execute: th_render + +interval: + # Carousel nav: when selected, show the page and take the knob. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==7;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_knob_capture) = true; id(g_th_lasttap) = id(g_tap_seq);' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_thermostat, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_thermostat, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_thermostat, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_thermostat, animation: move_bottom, time: 250ms }] } + - script.execute: th_render + # Knob (adjust target, debounced commit) + tap (on/off) while this screen is on top. + - interval: 120ms + then: + - if: + condition: { lambda: 'return id(g_base)==7 && id(g_knob_delta) != 0;' } + then: + - lambda: |- + id(g_th_target) += id(g_knob_delta) * id(g_th_step); + id(g_knob_delta) = 0; + if (id(g_th_target) < id(g_th_min)) id(g_th_target) = id(g_th_min); + if (id(g_th_target) > id(g_th_max)) id(g_th_target) = id(g_th_max); + id(g_th_pending) = true; + - script.execute: th_commit + - script.execute: th_render + - if: + condition: { lambda: 'return id(g_base)==7 && id(g_tap_seq) != id(g_th_lasttap);' } + then: + - lambda: 'id(g_th_lasttap) = id(g_tap_seq);' + - if: + condition: { lambda: 'return id(g_th_mode) == "off";' } + then: + - homeassistant.action: + action: climate.turn_on + data: + entity_id: ${climate_entity} + else: + - homeassistant.action: + action: climate.turn_off + data: + entity_id: ${climate_entity} + +lvgl: + pages: + - id: page_thermostat + bg_color: 0x0B1020 + widgets: + - obj: # faint outer ring for depth + id: th_ring_out + align: CENTER + width: 332 + height: 332 + radius: 166 + bg_opa: TRANSP + border_width: 2 + border_color: 0x1B2740 + border_opa: 70% + clickable: false + scrollable: false + - arc: + id: th_arc + align: CENTER + width: 300 + height: 300 + arc_width: 12 + adjustable: false + min_value: 0 + max_value: 100 + value: 50 + start_angle: 135 + end_angle: 45 + arc_color: 0x21304A + indicator: + arc_color: 0x2FE6CF + arc_width: 12 + - obj: # head-dot: white bead marking the target on the gauge (positioned in th_render) + id: th_dot + x: 0 + y: 0 + width: 18 + height: 18 + radius: 9 + bg_color: 0xFFFFFF + bg_opa: COVER + border_width: 0 + shadow_color: 0xFFFFFF + shadow_width: 10 + shadow_opa: 55% + clickable: false + scrollable: false + - label: { id: th_action, align: CENTER, y: -86, text: "", text_font: font_artist, text_color: 0x9FC7BE } + - label: { id: th_target, align: CENTER, y: -14, text: "--", text_font: montserrat_48, text_color: 0xFFFFFF } + - label: { id: th_cur, align: CENTER, y: 30, text: "now --", text_font: font_med, text_color: 0x9FC7BE } + - label: { id: th_hum, align: CENTER, y: 58, text: "", text_font: font_artist, text_color: 0x3FA9D6, hidden: true } + - label: { id: th_mode, align: CENTER, y: 92, text: "", text_font: font_artist, text_color: 0xCFEAE4 } diff --git a/base/screens/timer.yaml b/base/screens/timer.yaml new file mode 100644 index 0000000..f10c97d --- /dev/null +++ b/base/screens/timer.yaml @@ -0,0 +1,17 @@ +# Timer carousel-screen toggle. +# +# Unlike the other screens, the timer cannot be a full standalone package: its logic is +# wired into core components (the voice_assistant on_timer_* triggers, the shared alarm +# overlay, timer_render, the home-screen badge, the knob). So the timer FEATURE always +# lives in base/core.yaml. This tiny package only adds the timer SCREEN to the swipe +# carousel (base id 2). +# +# Remove this file from your config's package "files:" list to hide the timer screen from +# the carousel. Voice timers ("set a 5 minute timer"), the alarm and the home-screen +# countdown badge keep working - you just can't swipe to the on-device timer screen. + +esphome: + on_boot: + - priority: 680 + then: + - lambda: 'id(g_present)[2] = true;' # add the timer screen to the carousel diff --git a/base/screens/weather.ha-helper.yaml b/base/screens/weather.ha-helper.yaml new file mode 100644 index 0000000..7893c42 --- /dev/null +++ b/base/screens/weather.ha-helper.yaml @@ -0,0 +1,37 @@ +# Home Assistant helper for the device's Weather screen (base/screens/weather.yaml). +# +# HA no longer exposes a weather entity's multi-day forecast as an attribute, so this +# template calls weather.get_forecasts and publishes a single compact sensor the device +# reads. State format: "condition,high,low,DayName|..." (one segment per day, up to 7). +# +# 1. Change weather.forecast_dom below to your weather entity (3 places). +# 2. Put this in HA configuration.yaml (or a packages/ file), then restart HA / reload +# template entities. It creates sensor.va_weekly_forecast. +# 3. On the device, ${forecast_entity} defaults to sensor.va_weekly_forecast - override +# the substitution if you name it differently. + +template: + - trigger: + - platform: homeassistant + event: start + - platform: time_pattern + minutes: "/30" + action: + - service: weather.get_forecasts + target: + entity_id: weather.forecast_dom + data: + type: daily + response_variable: fc + sensor: + - name: "VA weekly forecast" + unique_id: va_weekly_forecast + state: > + {% set ns = namespace(parts=[]) %} + {% for d in fc['weather.forecast_dom'].forecast[:7] %} + {% set hi = (d.temperature | round(0)) if d.temperature is not none else 0 %} + {% set lo = (d.templow | round(0)) if (d.templow is defined and d.templow is not none) else hi %} + {% set nm = as_timestamp(d.datetime) | timestamp_custom('%a', true) %} + {% set ns.parts = ns.parts + [d.condition ~ ',' ~ hi ~ ',' ~ lo ~ ',' ~ nm] %} + {% endfor %} + {{ ns.parts | join('|') }} diff --git a/base/screens/weather.yaml b/base/screens/weather.yaml new file mode 100644 index 0000000..4e0fff6 --- /dev/null +++ b/base/screens/weather.yaml @@ -0,0 +1,541 @@ +# Weather - carousel screen (base id 5). GENERATED by scripts/gen_weather.py. +# A dial of forecast days around the rim (knob scrolls), animated condition icon + colour-coded +# temperature in the centre, a glow that slides to the selected day. Forecast comes from a Home +# Assistant helper sensor (see base/screens/weather.ha-helper.yaml). Remove: drop from `files:`. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_present)[5] = true;' + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\n" : ""); id(g_wgrp_labels) += "Weather"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Fahrenheit"; id(g_wopt_kind)[o] = 0; id(g_wopt_ptr)[o] = &id(g_wx_fahrenheit); + +globals: + # --- forecast data --- + - id: g_wx_fahrenheit + type: bool + restore_value: yes + initial_value: 'false' + - id: g_wx_now + type: int + restore_value: no + initial_value: '-127' + - id: g_wx_state_cur + type: std::string + restore_value: no + - id: g_wx_cond + type: std::string[7] + restore_value: no + - id: g_wx_icon + type: std::string[7] + restore_value: no + - id: g_wx_name + type: std::string[7] + restore_value: no + - id: g_wx_hi + type: int[7] + restore_value: no + - id: g_wx_lo + type: int[7] + restore_value: no + - id: g_wx_n + type: int + restore_value: no + initial_value: '0' + - id: g_wx_day + type: int + restore_value: no + initial_value: '0' + # --- render cache --- + - id: g_wx_sel + type: std::string + restore_value: no + - id: g_wx_tc + type: int + restore_value: no + initial_value: '-127' + - id: g_wx_lastcond + type: std::string + restore_value: no + - id: g_wx_ikey + type: std::string + restore_value: no + - id: g_wx_gpos + type: float + restore_value: no + initial_value: '0.0' + +font: + - file: "https://github.com/Templarian/MaterialDesign-Webfont/raw/v7.4.47/fonts/materialdesignicons-webfont.ttf" + id: icons_wx + size: 30 + bpp: 4 + glyphs: ["󰖙", "󰖔", "󰖕", "󰖑", "󰖝", "󰖓", "󰖖", "󰖗", "󰖘", "󰖐"] + +image: + - id: img_wx_sun0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_sun7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/sun7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_partly7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/partly7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_moon7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/moon7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_cloud7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/cloud7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_rain7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/rain7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_storm7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/storm7.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow0 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow0.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow1 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow1.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow2 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow2.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow3 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow3.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow4 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow4.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow5 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow5.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow6 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow6.png" + type: RGB565 + transparency: alpha_channel + - id: img_wx_snow7 + file: "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/snow7.png" + type: RGB565 + transparency: alpha_channel + +script: + - id: wx_render + then: + - lambda: |- + int d = id(g_wx_day); + bool has = (id(g_wx_n) > 0 && d < id(g_wx_n)); + id(g_wx_sel) = has ? id(g_wx_cond)[d] : id(g_wx_state_cur); + id(g_wx_tc) = has ? id(g_wx_hi)[d] : id(g_wx_now); + - lvgl.label.update: + id: wx_day + text: !lambda |- + int d = id(g_wx_day); + if (id(g_wx_n) <= 0 || d >= id(g_wx_n)) return std::string("TODAY"); + std::string s = id(g_wx_name)[d]; + if (s == "Mon") return std::string("MONDAY"); + if (s == "Tue") return std::string("TUESDAY"); + if (s == "Wed") return std::string("WEDNESDAY"); + if (s == "Thu") return std::string("THURSDAY"); + if (s == "Fri") return std::string("FRIDAY"); + if (s == "Sat") return std::string("SATURDAY"); + if (s == "Sun") return std::string("SUNDAY"); + return s; + - lvgl.label.update: + id: wx_htemp + text: !lambda |- + int d = id(g_wx_day); + bool f = id(g_wx_fahrenheit); + char u = f ? 'F' : 'C'; + if (id(g_wx_n) <= 0 || d >= id(g_wx_n)) { + if (id(g_wx_now) > -100) { int n = id(g_wx_now); if (f) n = n*9/5+32; char b[12]; snprintf(b,sizeof(b),"%d°%c",n,u); return std::string(b); } + return std::string("--"); + } + int hi = id(g_wx_hi)[d], lo = id(g_wx_lo)[d]; + if (f) { hi = hi*9/5+32; lo = lo*9/5+32; } + char b[24]; snprintf(b,sizeof(b),"%d° / %d°",hi,lo); return std::string(b); + - lvgl.label.update: + id: wx_cond + text: !lambda |- + if (id(g_wx_n) <= 0) return std::string("Add the HA forecast helper"); + std::string s = id(g_wx_sel); + if (s == "sunny") return std::string("Sunny"); + if (s == "clear-night") return std::string("Clear"); + if (s == "partlycloudy") return std::string("Partly Cloudy"); + if (s == "cloudy") return std::string("Cloudy"); + if (s == "fog") return std::string("Fog"); + if (s == "rainy") return std::string("Rainy"); + if (s == "pouring") return std::string("Heavy Rain"); + if (s == "lightning" || s == "lightning-rainy") return std::string("Storm"); + if (s == "snowy" || s == "snowy-rainy") return std::string("Snow"); + if (s == "hail") return std::string("Hail"); + if (s == "windy" || s == "windy-variant") return std::string("Windy"); + if (s == "exceptional") return std::string("Severe"); + return s; + - if: + condition: { lambda: 'return id(g_wx_sel) != id(g_wx_lastcond);' } + then: + - lambda: |- + id(g_wx_lastcond) = id(g_wx_sel); + std::string s = id(g_wx_sel), k; + if (s == "sunny") k = "sun"; + else if (s == "clear-night") k = "moon"; + else if (s == "partlycloudy") k = "partly"; + else if (s == "rainy" || s == "pouring") k = "rain"; + else if (s == "lightning" || s == "lightning-rainy") k = "storm"; + else if (s == "snowy" || s == "snowy-rainy" || s == "hail") k = "snow"; + else k = "cloud"; + id(g_wx_ikey) = k; + - lvgl.animimg.stop: wx_a_sun + - lvgl.animimg.stop: wx_a_partly + - lvgl.animimg.stop: wx_a_moon + - lvgl.animimg.stop: wx_a_cloud + - lvgl.animimg.stop: wx_a_rain + - lvgl.animimg.stop: wx_a_storm + - lvgl.animimg.stop: wx_a_snow + - lvgl.widget.hide: wx_a_sun + - lvgl.widget.hide: wx_a_partly + - lvgl.widget.hide: wx_a_moon + - lvgl.widget.hide: wx_a_cloud + - lvgl.widget.hide: wx_a_rain + - lvgl.widget.hide: wx_a_storm + - lvgl.widget.hide: wx_a_snow + - if: { condition: { lambda: 'return id(g_wx_ikey) == "sun";' }, then: [ lvgl.widget.show: wx_a_sun, lvgl.animimg.start: wx_a_sun ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "partly";' }, then: [ lvgl.widget.show: wx_a_partly, lvgl.animimg.start: wx_a_partly ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "moon";' }, then: [ lvgl.widget.show: wx_a_moon, lvgl.animimg.start: wx_a_moon ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "cloud";' }, then: [ lvgl.widget.show: wx_a_cloud, lvgl.animimg.start: wx_a_cloud ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "rain";' }, then: [ lvgl.widget.show: wx_a_rain, lvgl.animimg.start: wx_a_rain ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "storm";' }, then: [ lvgl.widget.show: wx_a_storm, lvgl.animimg.start: wx_a_storm ] } + - if: { condition: { lambda: 'return id(g_wx_ikey) == "snow";' }, then: [ lvgl.widget.show: wx_a_snow, lvgl.animimg.start: wx_a_snow ] } + - lvgl.widget.update: { id: wx_glow, hidden: !lambda 'return id(g_wx_n) <= 0;' } + - lvgl.widget.update: { id: wx_d0, hidden: !lambda 'return 0 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(0 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(0 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d0, text: !lambda 'return id(g_wx_n) > 0 ? id(g_wx_icon)[0] : std::string("");' } + - lvgl.widget.update: { id: wx_d1, hidden: !lambda 'return 1 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(1 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(1 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d1, text: !lambda 'return id(g_wx_n) > 1 ? id(g_wx_icon)[1] : std::string("");' } + - lvgl.widget.update: { id: wx_d2, hidden: !lambda 'return 2 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(2 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(2 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d2, text: !lambda 'return id(g_wx_n) > 2 ? id(g_wx_icon)[2] : std::string("");' } + - lvgl.widget.update: { id: wx_d3, hidden: !lambda 'return 3 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(3 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(3 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d3, text: !lambda 'return id(g_wx_n) > 3 ? id(g_wx_icon)[3] : std::string("");' } + - lvgl.widget.update: { id: wx_d4, hidden: !lambda 'return 4 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(4 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(4 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d4, text: !lambda 'return id(g_wx_n) > 4 ? id(g_wx_icon)[4] : std::string("");' } + - lvgl.widget.update: { id: wx_d5, hidden: !lambda 'return 5 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(5 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(5 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d5, text: !lambda 'return id(g_wx_n) > 5 ? id(g_wx_icon)[5] : std::string("");' } + - lvgl.widget.update: { id: wx_d6, hidden: !lambda 'return 6 >= id(g_wx_n);', x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf(6 * 6.2831853f / n));', y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf(6 * 6.2831853f / n));' } + - lvgl.label.update: { id: wx_d6, text: !lambda 'return id(g_wx_n) > 6 ? id(g_wx_icon)[6] : std::string("");' } + - lvgl.label.update: { id: wx_htemp, text_color: 0xFFFFFF } + - if: { condition: { lambda: 'return id(g_wx_tc) > -100 && id(g_wx_tc) <= 0;' }, then: [ lvgl.label.update: { id: wx_htemp, text_color: 0x7FB2FF } ] } + - if: { condition: { lambda: 'return id(g_wx_tc) > 0 && id(g_wx_tc) < 10;' }, then: [ lvgl.label.update: { id: wx_htemp, text_color: 0x6FD0E8 } ] } + - if: { condition: { lambda: 'return id(g_wx_tc) >= 10 && id(g_wx_tc) < 18;' }, then: [ lvgl.label.update: { id: wx_htemp, text_color: 0x7FE6B0 } ] } + - if: { condition: { lambda: 'return id(g_wx_tc) >= 18 && id(g_wx_tc) < 25;' }, then: [ lvgl.label.update: { id: wx_htemp, text_color: 0xFFD061 } ] } + - if: { condition: { lambda: 'return id(g_wx_tc) >= 25;' }, then: [ lvgl.label.update: { id: wx_htemp, text_color: 0xFF7A4D } ] } + +sensor: + - platform: homeassistant + id: wx_now_temp + entity_id: ${weather_entity} + attribute: temperature + on_value: + - lambda: 'id(g_wx_now) = (int) roundf(x);' + - script.execute: wx_render + +text_sensor: + - platform: homeassistant + id: wx_now_state + entity_id: ${weather_entity} + on_value: + - lambda: 'id(g_wx_state_cur) = x;' + - script.execute: wx_render + - platform: homeassistant + id: wx_week + entity_id: ${forecast_entity} + on_value: + - lambda: |- + auto glyph = [](const std::string &s) -> std::string { + if (s == "sunny") return std::string("󰖙"); + if (s == "clear-night") return std::string("󰖔"); + if (s == "partlycloudy") return std::string("󰖕"); + if (s == "fog") return std::string("󰖑"); + if (s == "windy" || s == "windy-variant") return std::string("󰖝"); + if (s == "lightning" || s == "lightning-rainy") return std::string("󰖓"); + if (s == "pouring") return std::string("󰖖"); + if (s == "rainy") return std::string("󰖗"); + if (s == "snowy" || s == "snowy-rainy" || s == "hail") return std::string("󰖘"); + return std::string("󰖐"); + }; + std::string s = x; + for (int i = 0; i < 7; i++) { id(g_wx_icon)[i] = ""; id(g_wx_cond)[i] = ""; } + int n = 0; size_t pos = 0; + while (n < 7) { + size_t bar = s.find('|', pos); + std::string seg = (bar == std::string::npos) ? s.substr(pos) : s.substr(pos, bar - pos); + size_t c1 = seg.find(','); + if (c1 != std::string::npos) { + size_t c2 = seg.find(',', c1 + 1); + size_t c3 = (c2 != std::string::npos) ? seg.find(',', c2 + 1) : std::string::npos; + if (c2 != std::string::npos && c3 != std::string::npos) { + std::string cond = seg.substr(0, c1); + id(g_wx_cond)[n] = cond; + id(g_wx_icon)[n] = glyph(cond); + id(g_wx_hi)[n] = atoi(seg.substr(c1 + 1, c2 - c1 - 1).c_str()); + id(g_wx_lo)[n] = atoi(seg.substr(c2 + 1, c3 - c2 - 1).c_str()); + id(g_wx_name)[n] = seg.substr(c3 + 1); + n++; + } + } + if (bar == std::string::npos) break; + pos = bar + 1; + } + id(g_wx_n) = n; + if (id(g_wx_day) >= n) id(g_wx_day) = 0; + - script.execute: wx_render + +interval: + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_nav_req) && id(g_base)==5;' } + then: + - lambda: 'id(g_nav_req) = false; id(g_knob_capture) = true; id(g_wx_day) = 0; id(g_wx_gpos) = 0.0f; id(g_wx_lastcond) = "";' + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_weather, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_weather, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_weather, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_weather, animation: move_bottom, time: 250ms }] } + - script.execute: wx_render + - interval: 120ms + then: + - if: + condition: { lambda: 'return id(g_base)==5 && id(g_knob_delta) != 0;' } + then: + - lambda: |- + id(g_wx_day) += id(g_knob_delta); id(g_knob_delta) = 0; + int mx = (id(g_wx_n) > 0) ? id(g_wx_n) - 1 : 0; + if (id(g_wx_day) < 0) id(g_wx_day) = 0; + if (id(g_wx_day) > mx) id(g_wx_day) = mx; + - script.execute: wx_render + - interval: 30ms + then: + - if: + condition: { lambda: 'return id(g_base)==5;' } + then: + - lambda: |- + float p = id(g_wx_gpos), tgt = (float) id(g_wx_day); + if (fabsf(tgt - p) > 0.001f) { // only while actually sliding + int n = id(g_wx_n); if (n < 1) n = 1; + p += (tgt - p) * 0.35f; + if (fabsf(tgt - p) < 0.02f) p = tgt; + id(g_wx_gpos) = p; + float rx = 140.0f * sinf(p * 6.2831853f / n); + float ry = -140.0f * cosf(p * 6.2831853f / n); + lv_obj_set_pos(id(wx_glow), 180 + (int) lroundf(rx) - 28, 180 + (int) lroundf(ry) - 28); + } + +lvgl: + pages: + - id: page_weather + bg_color: 0x0B1020 + widgets: + - obj: { id: wx_bg, align: CENTER, x: 0, y: 0, width: 360, height: 360, radius: 0, bg_color: 0x1C2838, bg_opa: COVER, border_width: 0 } + - obj: { id: wx_ring_out, align: CENTER, width: 348, height: 348, radius: 174, bg_opa: TRANSP, border_width: 2, border_color: 0x33455C, border_opa: 55%, clickable: false, scrollable: false } + - obj: { id: wx_glow, x: 152, y: 12, width: 56, height: 56, radius: 28, bg_color: 0xCAD6E8, bg_opa: 30%, border_width: 0, hidden: true } + - label: { id: wx_d0, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d1, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d2, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d3, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d4, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d5, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - label: { id: wx_d6, align: CENTER, x: 0, y: 0, text: "", text_font: icons_wx, text_color: 0xDCE6F2, hidden: true } + - animimg: { id: wx_a_sun, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_sun0, img_wx_sun1, img_wx_sun2, img_wx_sun3, img_wx_sun4, img_wx_sun5, img_wx_sun6, img_wx_sun7 ] } + - animimg: { id: wx_a_partly, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_partly0, img_wx_partly1, img_wx_partly2, img_wx_partly3, img_wx_partly4, img_wx_partly5, img_wx_partly6, img_wx_partly7 ] } + - animimg: { id: wx_a_moon, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_moon0, img_wx_moon1, img_wx_moon2, img_wx_moon3, img_wx_moon4, img_wx_moon5, img_wx_moon6, img_wx_moon7 ] } + - animimg: { id: wx_a_cloud, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_cloud0, img_wx_cloud1, img_wx_cloud2, img_wx_cloud3, img_wx_cloud4, img_wx_cloud5, img_wx_cloud6, img_wx_cloud7 ] } + - animimg: { id: wx_a_rain, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_rain0, img_wx_rain1, img_wx_rain2, img_wx_rain3, img_wx_rain4, img_wx_rain5, img_wx_rain6, img_wx_rain7 ] } + - animimg: { id: wx_a_storm, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_storm0, img_wx_storm1, img_wx_storm2, img_wx_storm3, img_wx_storm4, img_wx_storm5, img_wx_storm6, img_wx_storm7 ] } + - animimg: { id: wx_a_snow, align: CENTER, x: 0, y: -52, duration: 1400ms, repeat_count: 65535, auto_start: false, hidden: true, src: [ img_wx_snow0, img_wx_snow1, img_wx_snow2, img_wx_snow3, img_wx_snow4, img_wx_snow5, img_wx_snow6, img_wx_snow7 ] } + - label: { id: wx_day, align: CENTER, x: 0, y: -10, text: "", text_font: font_artist, text_color: 0x9AA6B2 } + - label: { id: wx_htemp, align: CENTER, x: 0, y: 24, text: "--", text_font: montserrat_34, text_color: 0xFFFFFF } + - label: { id: wx_cond, align: CENTER, x: 0, y: 62, text: "", text_font: font_med, text_color: 0xCFE0F2 } diff --git a/base/watchfaces/demo.yaml b/base/watchfaces/demo.yaml new file mode 100644 index 0000000..a604ee2 --- /dev/null +++ b/base/watchfaces/demo.yaml @@ -0,0 +1,118 @@ +# ═════════════════════════════════════════════════════════════════════════════ +# DEMO WATCHFACE - a minimal, heavily-commented template. Copy this file to +# base/watchfaces/.yaml, change the 4 spots marked >>> EDIT <<< and +# you have your own home-screen look. +# +# How watchfaces work (same idea as the carousel screens): +# - The home base (the clock area) can show one of several "faces". +# - "Classic" is built into core and is always the fallback (face id 0). +# - Every OTHER face is an optional file like this one, switched on by adding it +# to the `files:` list in your thin config, and chosen at runtime in +# Settings > Home > Watchface (turn the knob to preview, tap to keep). +# - Core can't reference a page that might not be compiled in, so each face +# SHOWS ITSELF: core just raises a flag (g_wf_req) and the active face's own +# interval calls lvgl.page.show. Same trick the screens use (g_nav_req). +# +# Everything you can read from core (no extra entities needed): +# id(ha_time).now() - current time (ESPTime) -> strftime("%H"), etc. +# id(wx_temp).state - outdoor temperature (float) + .has_state() +# id(room_temp).state - room temperature (float) +# id(room_hum).state - room humidity (float) +# id(g_nf_glyph) - weather icon glyph (std::string, MDI in font icons34) +# id(g_nf_cond) - weather condition text, UPPERCASE +# id(g_batt) / id(g_charging) - battery % (int, -1 = unknown) / charging (bool) +# id(g_show_weather) / id(g_show_climate) - the Display toggles (bool) +# Fonts already provided by core: montserrat_18/48, font_med, font_artist, +# font_sel, icons18, icons34. Define your own under `font:` if you want more. +# ═════════════════════════════════════════════════════════════════════════════ + +# ── 1. REGISTER the face at boot ────────────────────────────────────────────── +# Pick a UNIQUE id (0 = Classic, 1 = Neon are taken; use 2, 3, ...). The name is +# what shows in the picker. Priority 655 runs after core but before the boot +# finalize that validates the saved choice. +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_wf_present)[2] = true; id(g_wf_name)[2] = "Demo";' # >>> EDIT <<< id + name + +# ── 2. (optional) your own fonts ────────────────────────────────────────────── +# This demo reuses core's fonts, so nothing here. Add a `font:` block if needed. + +# ── 3. THE PAGE ─────────────────────────────────────────────────────────────── +# A full-screen page. Give it a unique id (page_home_) and unique widget ids. +lvgl: + pages: + - id: page_home_demo # >>> EDIT <<< unique page id + bg_color: 0x000000 + widgets: + - label: # big centered clock + id: dwf_time + align: CENTER + y: -16 + text: "00:00" + text_font: montserrat_48 + text_color: 0xFFFFFF + - label: # small date under it + id: dwf_date + align: CENTER + y: 30 + text: "" + text_font: font_med + text_color: 0x6f9a92 + +# ── 4. INTERVALS: self-show + refresh ───────────────────────────────────────── +interval: + # Self-show: core raises g_wf_req when it wants the home base shown. If we are + # the active face, show OUR page (and render once so it isn't blank), then clear + # the flag. Keep the id check (== 2) matching the one you registered above. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_wf_req) && id(g_watchface) == 2;' } # >>> EDIT <<< id + then: + - lambda: 'id(g_wf_req) = false;' + # slide in matching the carousel direction (like Classic / the screens) - no laggy fade + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_home_demo, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_home_demo, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_home_demo, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_home_demo, animation: move_bottom, time: 250ms }] } + - script.execute: dwf_render + # Refresh once a second while we are the active home face. + - interval: 1s + then: + - if: + condition: { lambda: 'return id(g_watchface) == 2 && id(g_base) == 0;' } # >>> EDIT <<< id + then: [ script.execute: dwf_render ] + +# ── 5. RENDER: fill your widgets from core's data ───────────────────────────── +script: + - id: dwf_render # >>> EDIT <<< unique script id + then: + # Time - HH:MM (24h). Use "%I:%M %p" for 12-hour. + - lvgl.label.update: + id: dwf_time + text: !lambda 'return id(ha_time).now().is_valid() ? id(ha_time).now().strftime("%H:%M") : std::string("00:00");' + # Date - e.g. "Mon 19 Jun" + - lvgl.label.update: + id: dwf_date + text: !lambda |- + auto t = id(ha_time).now(); + if (!t.is_valid()) return std::string(""); + static const char* d[8] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + std::string day = (t.day_of_week >= 1 && t.day_of_week <= 7) ? std::string(d[t.day_of_week]) : std::string(""); + return day + t.strftime(" %d %b"); + # ── Want more? Uncomment and add widgets above, then fill them here. ── + # Example: show room temperature (respecting the "Show climate" toggle) + # - lvgl.label.update: + # id: dwf_temp + # text: !lambda |- + # if (!id(g_show_climate) || !id(room_temp).has_state()) return std::string(""); + # char b[12]; snprintf(b, sizeof(b), "%.1f\xC2\xB0", id(room_temp).state); return std::string(b); + # Example: weather icon (font icons34) + outdoor temp + # - lvgl.label.update: { id: dwf_wx, text: !lambda 'return id(g_show_weather) ? id(g_nf_glyph) : std::string("");' } + +# ── 6. TURN IT ON ───────────────────────────────────────────────────────────── +# Add this file to the `files:` list in your thin config: +# - base/watchfaces/demo.yaml +# then rebuild and pick "Demo" in Settings > Home > Watchface. diff --git a/base/watchfaces/minecraft.yaml b/base/watchfaces/minecraft.yaml new file mode 100644 index 0000000..4aea2c7 --- /dev/null +++ b/base/watchfaces/minecraft.yaml @@ -0,0 +1,191 @@ +# ═════════════════════════════════════════════════════════════════════════════ +# MINECRAFT watchface (optional, id 3). A blocky scene with a day/night cycle: +# sky + textured grass/dirt ground, the sun by day / moon + stars by night, pixel +# flowers on the grass, a blocky pixel font for the time (classic drop shadow), +# outdoor temp, and a Minecraft heart bar (HUD) for the battery. +# +# PERFORMANCE: the per-second tick is just a tiny lambda; the heavy redraws (the big +# pixel digits, the day/night swap) only run when the minute actually changes or the +# day/night state flips - so it stays light. No animated clouds. +# +# Assets (font + sprites) are fetched from this repo's /main/ raw GitHub URLs at compile time. +# Watchface contract: see base/watchfaces/demo.yaml. +# ═════════════════════════════════════════════════════════════════════════════ + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_wf_present)[3] = true; id(g_wf_name)[3] = "Minecraft";' + +globals: + - { id: g_mc_last_min, type: int, restore_value: no, initial_value: '-1' } + - { id: g_mc_last_night, type: int, restore_value: no, initial_value: '-1' } + - { id: g_mc_upd_min, type: bool, restore_value: no, initial_value: 'false' } + - { id: g_mc_upd_night, type: bool, restore_value: no, initial_value: 'false' } + +font: + - file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/fonts/pixel-font.ttf + id: mc_font_big + size: 78 + glyphs: "0123456789:" + - file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/fonts/pixel-font.ttf + id: mc_font_sm + size: 26 + glyphs: " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # date only (uppercased) - no GF_Latin_Core, avoids missing-glyph warnings + +image: + - { id: img_mc_ground, file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/minecraft/ground.png, type: RGB565 } + - { id: img_mc_sun, file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/minecraft/sun.png, type: RGB565, transparency: alpha_channel } + - { id: img_mc_moon, file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/minecraft/moon.png, type: RGB565, transparency: alpha_channel } + - { id: img_mc_flower, file: https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/minecraft/flower.png, type: RGB565, transparency: alpha_channel } + +lvgl: + pages: + - id: page_home_mc + bg_color: 0x000000 + widgets: + # sky (recoloured day/night) - full screen, behind everything + - obj: { id: mc_sky, x: 0, y: 0, width: 360, height: 360, bg_color: 0x5A9BD4, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false } + # stars (night only) + - obj: { id: mc_star1, x: 44, y: 64, width: 6, height: 6, bg_color: 0xEAECF5, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false, hidden: true } + - obj: { id: mc_star2, x: 120, y: 42, width: 6, height: 6, bg_color: 0xEAECF5, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false, hidden: true } + - obj: { id: mc_star3, x: 250, y: 48, width: 6, height: 6, bg_color: 0xEAECF5, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false, hidden: true } + - obj: { id: mc_star4, x: 70, y: 116, width: 5, height: 5, bg_color: 0xC9D0E4, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false, hidden: true } + - obj: { id: mc_star5, x: 300, y: 120, width: 5, height: 5, bg_color: 0xC9D0E4, bg_opa: COVER, radius: 0, border_width: 0, clickable: false, scrollable: false, hidden: true } + # textured ground (flush to the bottom edge) + - image: { id: mc_ground, src: img_mc_ground, align: BOTTOM_MID, y: 0 } + # pixel flowers standing on the grass + - image: { id: mc_flower1, src: img_mc_flower, x: 56, y: 200 } + - image: { id: mc_flower2, src: img_mc_flower, x: 282, y: 206 } + # sun by day / moon by night (top-right) + - image: { id: mc_sun, src: img_mc_sun, align: TOP_RIGHT, x: -38, y: 38 } + - image: { id: mc_moon, src: img_mc_moon, align: TOP_RIGHT, x: -38, y: 38, hidden: true } + - label: { id: mc_sun_temp, align: TOP_RIGHT, x: -52, y: 100, text: "--°", text_font: font_artist, text_color: 0x16314A } + # time: dark shadow behind + white in front (the Minecraft look) + - label: { id: mc_time_sh, align: CENTER, x: 3, y: -41, text: "00:00", text_font: mc_font_big, text_color: 0x1A2A40 } + - label: { id: mc_time, align: CENTER, x: 0, y: -44, text: "00:00", text_font: mc_font_big, text_color: 0xFFFFFF } + - label: { id: mc_date, align: CENTER, x: 0, y: 14, text: "", text_font: mc_font_sm, text_color: 0xEAF2FB } + # battery as a Minecraft heart bar (HUD), low: 5 dark "empty" slots + red fill on top + - label: { id: mc_hearts_bg, align: BOTTOM_LEFT, x: 128, y: -16, text: "󰋑󰋑󰋑󰋑󰋑", text_font: icons18, text_color: 0x3A1614 } + - label: { id: mc_hearts, align: BOTTOM_LEFT, x: 128, y: -16, text: "", text_font: icons18, text_color: 0xE2453F } + # timer badge (active timer - minutes left) + - label: + id: mc_timer + align: TOP_MID + y: 6 + text: "" + text_font: montserrat_18 + text_color: 0xFFFFFF + bg_color: 0xFF3B30 + bg_opa: COVER + radius: 12 + pad_left: 11 + pad_right: 11 + pad_top: 4 + pad_bottom: 4 + hidden: true + +interval: + - interval: 50ms # self-show when core requests the home base + then: + - if: + condition: { lambda: 'return id(g_wf_req) && id(g_watchface) == 3;' } + then: + - lambda: 'id(g_wf_req) = false; id(g_mc_last_min) = -1; id(g_mc_last_night) = -1;' # force a full redraw on entry + # slide in matching the carousel direction (like Classic / the screens) - no laggy fade + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_home_mc, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_home_mc, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_home_mc, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_home_mc, animation: move_bottom, time: 250ms }] } + - script.execute: mc_render + - interval: 1s # cheap tick - only redraws on a real change + then: + - if: + condition: { lambda: 'return id(g_watchface) == 3 && id(g_base) == 0;' } + then: [ script.execute: mc_render ] + +script: + - id: mc_render + then: + # Decide what actually changed (so the second-by-second tick is nearly free) + - lambda: |- + id(g_mc_upd_min) = false; id(g_mc_upd_night) = false; + auto t = id(ha_time).now(); + if (!t.is_valid()) return; + int mn = t.hour * 60 + t.minute; + if (mn != id(g_mc_last_min)) { id(g_mc_last_min) = mn; id(g_mc_upd_min) = true; } + int night = (t.hour < 6 || t.hour >= 20) ? 1 : 0; + if (night != id(g_mc_last_night)) { id(g_mc_last_night) = night; id(g_mc_upd_night) = true; } + # Minute changed -> redraw time / date / temp / hearts + - if: + condition: { lambda: 'return id(g_mc_upd_min);' } + then: + - lvgl.label.update: { id: mc_time, text: !lambda 'return id(ha_time).now().strftime("%H:%M");' } + - lvgl.label.update: { id: mc_time_sh, text: !lambda 'return id(ha_time).now().strftime("%H:%M");' } + - lvgl.label.update: + id: mc_date + text: !lambda |- + auto t = id(ha_time).now(); + static const char* d[8] = {"","SUN","MON","TUE","WED","THU","FRI","SAT"}; + std::string day = (t.day_of_week >= 1 && t.day_of_week <= 7) ? std::string(d[t.day_of_week]) : std::string(""); + std::string s = day + t.strftime(" %d %b"); + for (auto &c : s) { if (c >= 'a' && c <= 'z') c -= 32; } + return s; + - if: + condition: { lambda: 'return id(g_show_weather);' } + then: + - lvgl.widget.show: mc_sun_temp + - lvgl.label.update: + id: mc_sun_temp + text: !lambda |- + if (!id(wx_temp).has_state()) return std::string("--°"); + char b[10]; snprintf(b, sizeof(b), "%d°", (int) roundf(id(wx_temp).state)); return std::string(b); + else: [ lvgl.widget.hide: mc_sun_temp ] + - lvgl.label.update: + id: mc_hearts + text: !lambda |- + int p = id(g_batt); + int n = (p < 0) ? 5 : (p + 10) / 20; if (n < 0) n = 0; if (n > 5) n = 5; + std::string s; for (int i = 0; i < n; i++) s += "󰋑"; + return s; + # Day/night flipped -> swap sky tint, sun<->moon, stars, temp colour + - if: + condition: { lambda: 'return id(g_mc_upd_night);' } + then: + - if: + condition: { lambda: 'return id(g_mc_last_night) == 1;' } + then: + - lvgl.widget.update: { id: mc_sky, bg_color: 0x101A33 } + - lvgl.widget.hide: mc_sun + - lvgl.widget.show: mc_moon + - lvgl.widget.show: mc_star1 + - lvgl.widget.show: mc_star2 + - lvgl.widget.show: mc_star3 + - lvgl.widget.show: mc_star4 + - lvgl.widget.show: mc_star5 + - lvgl.label.update: { id: mc_sun_temp, text_color: 0xC8D2E2 } + else: + - lvgl.widget.update: { id: mc_sky, bg_color: 0x5A9BD4 } + - lvgl.widget.show: mc_sun + - lvgl.widget.hide: mc_moon + - lvgl.widget.hide: mc_star1 + - lvgl.widget.hide: mc_star2 + - lvgl.widget.hide: mc_star3 + - lvgl.widget.hide: mc_star4 + - lvgl.widget.hide: mc_star5 + - lvgl.label.update: { id: mc_sun_temp, text_color: 0x16314A } + # Timer badge (active timer - minutes left), kept responsive (outside the minute gate) + - if: + condition: { lambda: 'return id(g_timer_active);' } + then: + - lvgl.widget.show: mc_timer + - lvgl.label.update: + id: mc_timer + text: !lambda |- + int s = id(g_timer_secs); if (s < 0) s = 0; + int m = (s + 59) / 60; + char b[24]; snprintf(b, sizeof(b), " %d min", m); + return std::string(b); + else: + - lvgl.widget.hide: mc_timer diff --git a/base/watchfaces/neon.yaml b/base/watchfaces/neon.yaml new file mode 100644 index 0000000..9f13ba3 --- /dev/null +++ b/base/watchfaces/neon.yaml @@ -0,0 +1,245 @@ +# ───────────────────────────────────────────────────────────────────────────── +# NEON watchface (optional home face). Add to the thin config's files: list to +# enable; the picker (Settings > Home > Watchface) then offers it. Watchface id 1. +# +# A full-screen home page with huge two-tone digits, neon rim rings, weather + +# room/battery stats. It reuses core's clock/weather/room/battery sensors and the +# g_show_weather / g_show_climate display toggles - no extra entities needed. +# +# Contract (mirrors the screen carousel): self-registers in the watchface registry +# at boot, renders itself while active, and self-shows its page when core requests +# the home base (core can't reference an optional page id, hence the g_wf_req flag). +# ───────────────────────────────────────────────────────────────────────────── + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_wf_present)[1] = true; id(g_wf_name)[1] = "Neon";' + +globals: + - { id: g_nf_last_min, type: int, restore_value: no, initial_value: '-1' } # perf: only redraw on minute change + - { id: g_nf_upd_min, type: bool, restore_value: no, initial_value: 'false' } + +font: + # Huge bold digits - only 0-9 needed, so it stays tiny in flash + - file: { type: gfonts, family: "Roboto", weight: 900 } + id: font_neon + size: 108 + glyphs: "0123456789" + +lvgl: + pages: + - id: page_home_neon + bg_color: 0x000000 + widgets: + - obj: # outer neon ring at the rim + id: nf_ring_out + align: CENTER + width: 352 + height: 352 + radius: 176 + bg_opa: TRANSP + border_width: 4 + border_color: 0xFF2E88 + border_opa: 60% + clickable: false + scrollable: false + - obj: # second neon ring, also hugging the rim (interior left free for content) + id: nf_ring_in + align: CENTER + width: 320 + height: 320 + radius: 160 + bg_opa: TRANSP + border_width: 4 + border_color: 0x9A5BFF + border_opa: 55% + clickable: false + scrollable: false + - label: # weather icon + id: nf_wx_ic + align: CENTER + x: -34 + y: -103 + text: "󰖕" + text_font: icons34 + text_color: 0xBFD2DA + - label: # outdoor temperature + id: nf_wx_temp + align: CENTER + x: 26 + y: -106 + text: "--°" + text_font: font_sel + text_color: 0xFFFFFF + - label: # condition text (UPPERCASE) + id: nf_wx_cond + align: CENTER + y: -76 + text: "" + text_font: font_artist + text_color: 0x8A93A0 + - label: # HOURS + id: nf_hh + align: CENTER + x: -70 + y: -4 + text: "00" + text_font: font_neon + text_color: 0xFF2E88 + - label: # MINUTES + id: nf_mm + align: CENTER + x: 70 + y: -4 + text: "00" + text_font: font_neon + text_color: 0x9A5BFF + - label: # date + id: nf_date + align: CENTER + y: 70 + text: "" + text_font: font_med + text_color: 0x6f9a92 + - label: # room temperature icon + id: nf_ct_ic + align: CENTER + x: -60 + y: 99 + text: "󰔏" + text_font: icons18 + text_color: 0xFF8A5C + - label: + id: nf_ct_val + align: CENTER + x: -32 + y: 99 + text: "--" + text_font: font_artist + text_color: 0x9AA3B0 + - label: # room humidity icon + id: nf_hum_ic + align: CENTER + x: 16 + y: 99 + text: "󰖎" + text_font: icons18 + text_color: 0x3FA9D6 + - label: + id: nf_hum_val + align: CENTER + x: 42 + y: 99 + text: "--" + text_font: font_artist + text_color: 0x9AA3B0 + - label: # battery (glyph + %), mirrored from core's lbl_batt (same LVGL symbols) + id: nf_bt + align: CENTER + y: 126 + text: "" + text_font: montserrat_18 + text_color: 0x6f9a92 + - label: # timer badge (active timer - mins left), mirrors the classic face + id: nf_timer + align: TOP_MID + y: 22 + text: "" + text_font: montserrat_18 + text_color: 0xFFFFFF + bg_color: 0xFF3B30 + bg_opa: COVER + radius: 14 + pad_left: 12 + pad_right: 12 + pad_top: 5 + pad_bottom: 5 + hidden: true + +interval: + # Self-show: core sets g_wf_req when it wants the home base shown; we own page_home_neon. + - interval: 50ms + then: + - if: + condition: { lambda: 'return id(g_wf_req) && id(g_watchface) == 1;' } + then: + - lambda: 'id(g_wf_req) = false; id(g_nf_last_min) = -1;' # force a full redraw on entry + # slide in matching the carousel direction (like Classic / the screens) - no laggy fade + - if: { condition: { lambda: 'return id(g_nav_anim)==0;' }, then: [lvgl.page.show: { id: page_home_neon, animation: move_left, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==1;' }, then: [lvgl.page.show: { id: page_home_neon, animation: move_right, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==2;' }, then: [lvgl.page.show: { id: page_home_neon, animation: move_top, time: 250ms }] } + - if: { condition: { lambda: 'return id(g_nav_anim)==3;' }, then: [lvgl.page.show: { id: page_home_neon, animation: move_bottom, time: 250ms }] } + - script.execute: neon_render + # Refresh while this is the active home face + - interval: 1s + then: + - if: + condition: { lambda: 'return id(g_watchface) == 1 && id(g_base) == 0;' } + then: [ script.execute: neon_render ] + +script: + - id: neon_render + then: + # Cheap tick: figure out if the minute actually changed (heavy redraws only then) + - lambda: |- + id(g_nf_upd_min) = false; + auto t = id(ha_time).now(); + if (!t.is_valid()) return; + int mn = t.hour * 60 + t.minute; + if (mn != id(g_nf_last_min)) { id(g_nf_last_min) = mn; id(g_nf_upd_min) = true; } + - if: + condition: { lambda: 'return id(g_nf_upd_min);' } + then: + - lvgl.label.update: { id: nf_hh, text: !lambda 'return id(ha_time).now().strftime("%H");' } + - lvgl.label.update: { id: nf_mm, text: !lambda 'return id(ha_time).now().strftime("%M");' } + - lvgl.label.update: { id: nf_wx_ic, text: !lambda 'return id(g_nf_glyph).empty() ? std::string("󰖕") : id(g_nf_glyph);' } + - lvgl.label.update: { id: nf_wx_cond, text: !lambda 'return id(g_nf_cond);' } + - lvgl.label.update: + id: nf_wx_temp + text: !lambda |- + if (!id(wx_temp).has_state()) return std::string("--°"); + char b[10]; snprintf(b, sizeof(b), "%d°", (int) roundf(id(wx_temp).state)); return std::string(b); + - lvgl.label.update: + id: nf_date + text: !lambda |- + auto t = id(ha_time).now(); + static const char* d[8] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + std::string day = (t.day_of_week >= 1 && t.day_of_week <= 7) ? std::string(d[t.day_of_week]) : std::string(""); + return t.strftime("%d %b") + " " + day; + - lvgl.label.update: + id: nf_ct_val + text: !lambda 'if (!id(room_temp).has_state()) return std::string("--"); char b[12]; snprintf(b, sizeof(b), "%.1f°", id(room_temp).state); return std::string(b);' + - lvgl.label.update: + id: nf_hum_val + text: !lambda 'if (!id(room_hum).has_state()) return std::string("--"); char b[8]; snprintf(b, sizeof(b), "%d%%", (int) roundf(id(room_hum).state)); return std::string(b);' + # Battery: mirror core's lbl_batt text + colour + - lambda: 'lv_label_set_text(id(nf_bt), lv_label_get_text(id(lbl_batt)));' + - if: + condition: { lambda: 'return id(g_charging);' } + then: [ lvgl.label.update: { id: nf_bt, text_color: 0x35c759 } ] + else: [ lvgl.label.update: { id: nf_bt, text_color: 0x6f9a92 } ] + # Weather / climate visibility obey the Display toggles + - if: + condition: { lambda: 'return id(g_show_weather);' } + then: [ lvgl.widget.show: nf_wx_ic, lvgl.widget.show: nf_wx_temp, lvgl.widget.show: nf_wx_cond ] + else: [ lvgl.widget.hide: nf_wx_ic, lvgl.widget.hide: nf_wx_temp, lvgl.widget.hide: nf_wx_cond ] + - if: + condition: { lambda: 'return id(g_show_climate);' } + then: [ lvgl.widget.show: nf_ct_ic, lvgl.widget.show: nf_ct_val, lvgl.widget.show: nf_hum_ic, lvgl.widget.show: nf_hum_val ] + else: [ lvgl.widget.hide: nf_ct_ic, lvgl.widget.hide: nf_ct_val, lvgl.widget.hide: nf_hum_ic, lvgl.widget.hide: nf_hum_val ] + # Timer badge - kept responsive (cheap) so it appears/updates promptly + - if: + condition: { lambda: 'return id(g_timer_active);' } + then: + - lvgl.widget.show: nf_timer + - lvgl.label.update: + id: nf_timer + text: !lambda |- + int s = id(g_timer_secs); if (s < 0) s = 0; + int m = (s + 59) / 60; + char b[24]; snprintf(b, sizeof(b), " %d min", m); + return std::string(b); + else: + - lvgl.widget.hide: nf_timer diff --git a/guition-va.yaml b/guition-va.yaml new file mode 100644 index 0000000..3a0dd32 --- /dev/null +++ b/guition-va.yaml @@ -0,0 +1,94 @@ +# ============================================================================= +# Voice Knob - YOUR config. This is the only firmware file you keep locally. +# ----------------------------------------------------------------------------- +# Copy THIS file (+ partitions.csv + a secrets.yaml) next to each other, edit the +# entities/tiles below to match your Home Assistant, then: +# +# esphome run guition-va.yaml +# +# Everything else (the firmware core + the optional screens) is pulled from GitHub +# at compile time - see the `packages:` block at the bottom - so you only ever +# maintain this one file. To get the latest changes: +# +# esphome clean guition-va.yaml # clears the package cache +# esphome run guition-va.yaml +# ============================================================================= + +substitutions: + name: voice-knob + friendly_name: "Voice Knob" + timezone: "Australia/Brisbane" # IANA name; core maps common zones to POSIX. Zone not listed? paste a POSIX string (github.com/nayarsystems/posix_tz_db). DST automatic. + # For album art: base URL of your HA + the media_player entity + ha_base_url: "http://ha.iosull.com" + player_entity: media_player.voice_knob_player + # On-device wake word. Built-in models: alexa, okay_nabu, hey_jarvis, hey_mycroft. + wake_word: "alexa" + # Home screen (weather + room climate). Change to your entities. + weather_entity: weather.home + room_temp_entity: sensor.room_temperature + room_hum_entity: sensor.room_humidity + # Weather screen forecast: an HA helper sensor (see base/screens/weather.ha-helper.yaml) + forecast_entity: sensor.va_weekly_forecast + # Thermostat screen: the climate.* entity it controls + climate_entity: climate.living_room + + # Control tiles (swipe up): 4 toggles, each entity + icon + name. Works on any HA domain. + # tileN_icon = a name from the built-in set: bulb lamp led power plug switch fan ac heater + # thermometer lock unlock door blinds tv speaker bell wifi home flash. Same icon may repeat. + # (For an icon outside the set: paste its glyph or a "\U000Fxxxx" code from pictogrammers.com.) + tile1_entity: light.living_room + tile1_icon: "bulb" + tile1_name: "Light" + tile2_entity: switch.desk_neon + tile2_icon: "flash" + tile2_name: "Neon" + tile3_entity: switch.power_socket + tile3_icon: "power" + tile3_name: "Socket" + + # Sensors screen (knob cycles): up to 6 read-only HA entities, shown one at a time, big. + # Set as many glanceN as you want; leave the rest at their default (a non-existent entity) + # and they're skipped. Icon name is optional (same set as the tiles); empty = no icon. + glance1_entity: sensor.power + glance1_name: "Power" + glance1_icon: "flash" + glance2_entity: sensor.va_glance_unused2 + glance2_name: "" + glance2_icon: "" + glance3_entity: sensor.va_glance_unused3 + glance3_name: "" + glance3_icon: "" + glance4_entity: sensor.va_glance_unused4 + glance4_name: "" + glance4_icon: "" + glance5_entity: sensor.va_glance_unused5 + glance5_name: "" + glance5_icon: "" + glance6_entity: sensor.va_glance_unused6 + glance6_name: "" + glance6_icon: "" + + # Carousel order, left to right. Reorder/remove names freely; screens you did not + # include in "files:" below are skipped automatically. + screen_order: "clock,player,timer,cars,space,snake,knobuss,weather,thermostat,sensors,demo" + +packages: + - !include base/core.yaml + - !include base/screens/player.yaml # optional: music player (album art + transport) + - !include base/screens/timer.yaml # optional: timer screen in the carousel (voice timers/alarm stay regardless) + - !include base/screens/cool-cars.yaml # optional: Cool Cars game + - !include base/screens/space-wars.yaml # optional: Space Wars game + - !include base/screens/snake.yaml # optional: Snake game (knob steers) + - !include base/screens/knobuss.yaml # optional: Knobuss - a Gyruss-style tube shooter (knob aims, auto-fire) + - !include base/screens/weather.yaml # optional: weather (today + 7-day, knob scrolls days) + - !include base/screens/thermostat.yaml # optional: thermostat (climate.* entity; knob sets target, tap on/off) + - !include base/screens/sensors.yaml # optional: sensors glance (1-6 HA entities, knob cycles) + #- !include base/screens/demo.yaml # optional: commented example screen (TAP ME!) + Widgets settings + # Watchfaces (optional home-screen looks; Classic is built into core and always available). + # Comment one out to drop it; pick the active one in Settings > Home > Watchface. + - !include base/watchfaces/neon.yaml # optional: Neon - big two-tone digits + neon rings + - !include base/watchfaces/minecraft.yaml # optional: Minecraft - blocky scene + pixel clock + - !include base/watchfaces/demo.yaml # optional: Demo - minimal, heavily-commented template to copy + +# Wi-Fi comes from your local secrets.yaml (the core uses !secret wifi_ssid / wifi_password). +# Keep a secrets.yaml and partitions.csv next to this file (both must be local paths). diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..c88b18a --- /dev/null +++ b/partitions.csv @@ -0,0 +1,8 @@ +# ESP32-S3 16 MB flash, dual-OTA, MAXIMUM app partitions. +# In ESPHome the images/fonts/animations are compiled into the app -> bigger app = more room for the UI. +# ~7.94 MB per slot (app0/app1). Changing the partition layout needs a USB flash (not OTA). +# Name, Type, SubType, Offset, Size +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x7F0000, +app1, app, ota_1, 0x800000, 0x7F0000, diff --git a/scripts/esplog.py b/scripts/esplog.py new file mode 100644 index 0000000..f521592 --- /dev/null +++ b/scripts/esplog.py @@ -0,0 +1,25 @@ +import asyncio, sys, time +from aioesphomeapi import APIClient, LogLevel + +HOST = "voice-knob.local" # your device hostname or IP +PORT = 6053 +DURATION = int(sys.argv[1]) if len(sys.argv) > 1 else 15 +FILTER = sys.argv[2] if len(sys.argv) > 2 else "" # optional substring filter + +async def main(): + cli = APIClient(HOST, PORT, None) # no password, no encryption + await cli.connect(login=True) + info = await cli.device_info() + print(f"# connected: {info.name} esphome={info.esphome_version} uptime-ok", flush=True) + + def on_log(msg): + line = msg.message.decode("utf-8", "replace") + if FILTER and FILTER.lower() not in line.lower(): + return + print(line, flush=True) + + cli.subscribe_logs(on_log, log_level=LogLevel.LOG_LEVEL_DEBUG) + await asyncio.sleep(DURATION) + print(f"# done ({DURATION}s)", flush=True) + +asyncio.run(main()) diff --git a/scripts/gen_snake.py b/scripts/gen_snake.py new file mode 100644 index 0000000..2349e38 --- /dev/null +++ b/scripts/gen_snake.py @@ -0,0 +1,647 @@ +#!/usr/bin/env python3 +# Generates base/screens/snake.yaml (modular carousel screen, base id 9). Run from anywhere: +# python scripts/gen_snake.py +# +# Smooth-steering 360-degree snake. The head glides every tick (knob rotates its heading); the body is a TRAIL +# of dots the head lays down every SEG_DIST of travel. Dots do NOT move once placed - each tick only +# the head moves and (when the head advanced one spacing) one dot is added at the head / dropped at +# the tail. Per-tick render cost is constant regardless of length, which keeps the main loop fast +# enough not to starve the knob input (a chain-follow body that moved every segment every tick made +# turning degrade as the snake grew). +# +# IMPORTANT (why segments are moved from a lambda, not YAML actions): ESPHome plays a sequence of +# synchronous actions by recursion, so a long YAML action list (e.g. a 56-way "if slot==k" dispatch +# or a 56-widget redraw) becomes ~56 nested calls and overflows the task stack. So all body/head +# positioning is done inside ONE lambda via lv_obj_set_pos on an array of lv_obj_t* (indexed at +# runtime). Hidden = parked off-screen (pos 400,400) - avoids any LVGL flag-API version differences. +# Coords: a centre-offset (cx,cy) maps to a top-left lv_obj_set_pos of (180+cx-SEG/2, 180+cy-SEG/2). +import os + +POOL = 100 # max body dots = number of body widgets (max snake length = POOL-1). + # Render is O(1) per tick (trail model), so a big pool only costs RAM (obj + # widgets, allocated in PSRAM) - not per-tick time. +SEG = 9 # dot square (px) +SEGR = 4 # dot corner radius +HALF = SEG // 2 # 4 +SEG_DIST = 8.0 # spacing between trail dots (px) +R = 168.0 # max head distance from centre (inside the ring) +RING_D = 344 # ring diameter (radius 172) -> just inside the 360 round display +SPEED0 = 3.2 # head speed px/tick (50ms tick) +TURN = 0.26 # radians turned per knob detent +EAT = 12.0 # head-to-fruit distance that counts as eating +SKHIT = 13.0 # head-to-skull distance that kills +SELF_SKIP = 6 # newest body dots skipped in self-collision (the neck) +SELF_DIST = 8.0 # head-to-body distance that kills (~ the two 9px sprites touching) +GROW = 3 # body dots added per fruit eaten +START_LEN = 5 + +NFRUIT = 12 # fruit sprites in the rotation +NFSLOT = 3 # max fruit on the board +NSKULL = 2 # max skulls +FRUIT_WAIT = 90 # ticks between fruit top-ups (~4.5s); halved when only 1 fruit is left +SKULL_WAIT = 200 # ticks between skull spawns (~10s) +SKULL_LIFE = 220 # ticks a skull stays (~11s) + +BASE = "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/snake/" + +PAGE_BG = "0x0D1E15" +RING = "0x3A8C4E" +HEAD = "0xB8E86A" +BODY = "0x52A049" +ACCENT = "0xA6D85F" +ACCENT_TXT = "0x12241A" +BTN2 = "0x244A30" +BTN2_TXT = "0xCFE6C4" +GRAY = "0x3A3A3D" +TXT = "0xC6DCC0" +BADGE = "0x6FB23F" +HUD = "0xCFEAE4" +WORDMARK = "0x12212D" + +M = POOL * 4 # safe positive-modulo offset +# C++ array of the body-segment lv_obj_t* (built locally in each rendering lambda) +SEGINIT = "lv_obj_t *SS[" + str(POOL) + "] = { " + ", ".join(f"id(sn_seg{k})" for k in range(POOL)) + " };" + + +def body_widgets(): + # no align (top-left origin); parked off-screen until positioned by a lambda + return "\n".join( + f" - obj: {{ id: sn_seg{k}, x: 400, y: 400, width: {SEG}, height: {SEG}, " + f"radius: {SEGR}, border_width: 0, bg_color: {BODY}, bg_opa: COVER }}" + for k in range(POOL)) + + +def fruit_widgets(): + return "\n".join( + f" - image: {{ id: sn_fruit{s}, align: CENTER, x: 0, y: 0, src: img_sn_fruit0, hidden: true }}" + for s in range(NFSLOT)) + + +def skull_widgets(): + return "\n".join( + f" - image: {{ id: sn_skull{s}, align: CENTER, x: 0, y: 0, src: img_sn_skull, hidden: true }}" + for s in range(NSKULL)) + + +def fspr_dispatch(): + return "\n".join( + f" - if: {{ condition: {{ lambda: 'return id(g_sn_newfruit) == {s};' }}, " + f"then: [ script.execute: sn_fspr{s} ] }}" + for s in range(NFSLOT)) + + +def skull_dispatch(): + return "\n".join( + f" - if: {{ condition: {{ lambda: 'return id(g_sn_newskull) == {s};' }}, " + f"then: [ lvgl.widget.update: {{ id: sn_skull{s}, hidden: false, " + f"x: !lambda 'return (int) lroundf(id(g_sn_skx)[{s}]);', " + f"y: !lambda 'return (int) lroundf(id(g_sn_sky)[{s}]);' }} ] }}" + for s in range(NSKULL)) + + +def items_hidden(): + out = [] + for s in range(NFSLOT): + out.append(f" - lvgl.widget.update: {{ id: sn_fruit{s}, hidden: !lambda 'return !id(g_sn_fon)[{s}];' }}") + for s in range(NSKULL): + out.append(f" - lvgl.widget.update: {{ id: sn_skull{s}, hidden: !lambda 'return !id(g_sn_skon)[{s}];' }}") + return "\n".join(out) + + +def item_hides(): + out = [f" - lvgl.widget.hide: sn_fruit{s}" for s in range(NFSLOT)] + out += [f" - lvgl.widget.hide: sn_skull{s}" for s in range(NSKULL)] + return "\n".join(out) + + +def fruit_setters(): + blocks = [] + for s in range(NFSLOT): + lines = [f" - id: sn_fspr{s}", " then:", + f" - lvgl.widget.update: {{ id: sn_fruit{s}, hidden: false, " + f"x: !lambda 'return (int) lroundf(id(g_sn_fx)[{s}]);', " + f"y: !lambda 'return (int) lroundf(id(g_sn_fy)[{s}]);' }}"] + for k in range(NFRUIT): + lines.append( + f" - if: {{ condition: {{ lambda: 'return id(g_sn_fi)[{s}] == {k};' }}, " + f"then: [ lvgl.image.update: {{ id: sn_fruit{s}, src: img_sn_fruit{k} }} ] }}") + blocks.append("\n".join(lines)) + return "\n".join(blocks) + + +def fruit_images(): + return "\n".join( +f""" - id: img_sn_fruit{k} + file: "{BASE}fruit{k}.png" + type: RGB565 + transparency: alpha_channel""" for k in range(NFRUIT)) + + +YAML = f"""# Snake - optional carousel screen (base id 9). Smooth-steering 360-degree snake steered by the knob. +# Remove it: drop this file from your config's package "files:" list. Nothing else to edit. +# Scores (g_sn_top / g_sn_best) + the "Reset scores" settings action live here - fully self-contained. +# +# GENERATED by scripts/gen_snake.py - edit the generator, not the blocks. Body = a trail of dots +# (ring buffer) rendered from a lambda (lv_obj_set_pos), so per-tick cost is constant + shallow. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_present)[9] = true;' + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\\n" : ""); id(g_wgrp_labels) += "Snake"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Reset scores"; id(g_wopt_kind)[o] = 1; id(g_wopt_ptr)[o] = &id(g_sn_reset); + +globals: + - id: g_sn_best + type: int + restore_value: yes + initial_value: '0' + - id: g_sn_top + type: int[10] + restore_value: yes + - id: g_sn_reset + type: bool + restore_value: no + initial_value: 'false' + - id: g_sn_state # 0=menu 1=playing 2=game over 3=how-to 4=scores + type: int + restore_value: no + initial_value: '0' + - id: g_sn_len # body dots in the snake + type: int + restore_value: no + initial_value: '{START_LEN}' + - id: g_sn_score + type: int + restore_value: no + initial_value: '0' + - id: g_sn_tx # body trail dots X (ring buffer; centre coords px) + type: float[{POOL}] + restore_value: no + - id: g_sn_ty + type: float[{POOL}] + restore_value: no + - id: g_sn_head # ring index of the newest dot + type: int + restore_value: no + initial_value: '0' + - id: g_sn_hx # smooth head position (leads the newest dot) + type: float + restore_value: no + initial_value: '0.0' + - id: g_sn_hy + type: float + restore_value: no + initial_value: '0.0' + - id: g_sn_ang # heading (radians) + type: float + restore_value: no + initial_value: '0.0' + - id: g_sn_grow # pending growth (appends that won't drop the tail) + type: int + restore_value: no + initial_value: '0' + - id: g_sn_dead + type: bool + restore_value: no + initial_value: 'false' + - id: g_sn_add # ring slot to show/position this tick (-1 none) + type: int + restore_value: no + initial_value: '-1' + - id: g_sn_del # ring slot to park off-screen this tick (-1 none) + type: int + restore_value: no + initial_value: '-1' + - id: g_sn_fx + type: float[{NFSLOT}] + restore_value: no + - id: g_sn_fy + type: float[{NFSLOT}] + restore_value: no + - id: g_sn_fi + type: int[{NFSLOT}] + restore_value: no + - id: g_sn_fon + type: bool[{NFSLOT}] + restore_value: no + - id: g_sn_fclk + type: int + restore_value: no + initial_value: '0' + - id: g_sn_newfruit + type: int + restore_value: no + initial_value: '-1' + - id: g_sn_skx + type: float[{NSKULL}] + restore_value: no + - id: g_sn_sky + type: float[{NSKULL}] + restore_value: no + - id: g_sn_skon + type: bool[{NSKULL}] + restore_value: no + - id: g_sn_skage + type: int[{NSKULL}] + restore_value: no + - id: g_sn_skclk + type: int + restore_value: no + initial_value: '0' + - id: g_sn_newskull + type: int + restore_value: no + initial_value: '-1' + +script: +{fruit_setters()} + - id: sn_hud + then: + - lvgl.label.update: {{ id: lbl_sn_score, text: !lambda 'char b[12]; snprintf(b,sizeof(b),"%d",id(g_sn_score)); return std::string(b);' }} + - id: sn_items + then: +{items_hidden()} + # full body redraw - used at start / when (re)entering the play screen (one lambda, not per tick) + - id: sn_drawfull + then: + - lambda: |- + {SEGINIT} + for (int k = 0; k < {POOL}; k++) {{ + int d = (id(g_sn_head) - k + {M}) % {POOL}; + if (d < id(g_sn_len)) lv_obj_set_pos(SS[k], 180 + (int) lroundf(id(g_sn_tx)[k]) - {HALF}, 180 + (int) lroundf(id(g_sn_ty)[k]) - {HALF}); + else lv_obj_set_pos(SS[k], 400, 400); + }} + lv_obj_set_pos(id(sn_head), 180 + (int) lroundf(id(g_sn_hx)) - {HALF}, 180 + (int) lroundf(id(g_sn_hy)) - {HALF}); + - script.execute: sn_items + # hide every gameplay widget (park body off-screen + hide fruit/skulls) + - id: sn_clear + then: + - lambda: |- + {SEGINIT} + for (int k = 0; k < {POOL}; k++) lv_obj_set_pos(SS[k], 400, 400); + lv_obj_set_pos(id(sn_head), 400, 400); +{item_hides()} + - id: sn_start + then: + - lambda: |- + id(g_sn_state) = 1; id(g_sn_score) = 0; id(g_sn_dead) = false; + id(g_sn_ang) = -1.5708f; id(g_sn_grow) = 0; // heading up + id(g_sn_len) = {START_LEN}; id(g_sn_head) = {START_LEN - 1}; + for (int i = 0; i < {POOL}; i++) {{ id(g_sn_tx)[i] = 0.0f; id(g_sn_ty)[i] = 0.0f; }} + for (int k = 0; k < {START_LEN}; k++) {{ id(g_sn_tx)[k] = 0.0f; id(g_sn_ty)[k] = ({START_LEN - 1} - k) * {SEG_DIST}f; }} + id(g_sn_hx) = 0.0f; id(g_sn_hy) = 0.0f; + for (int s = 0; s < {NFSLOT}; s++) id(g_sn_fon)[s] = false; + for (int s = 0; s < {NSKULL}; s++) {{ id(g_sn_skon)[s] = false; id(g_sn_skage)[s] = 0; }} + id(g_sn_fclk) = 0; id(g_sn_skclk) = 0; + id(g_sn_newfruit) = -1; id(g_sn_newskull) = -1; id(g_sn_add) = -1; id(g_sn_del) = -1; + id(g_knob_capture) = true; id(g_knob_delta) = 0; + float a = (esp_random() % 62832) / 10000.0f; float rad = 60.0f + (esp_random() % 80); + id(g_sn_fx)[0] = cosf(a)*rad; id(g_sn_fy)[0] = sinf(a)*rad; + id(g_sn_fi)[0] = esp_random() % {NFRUIT}; id(g_sn_fon)[0] = true; + - script.execute: sn_fspr0 + - script.execute: sn_screen + - script.execute: sn_drawfull + - script.execute: sn_hud + - id: sn_over + then: + - lambda: |- + id(g_sn_state) = 2; + int s = id(g_sn_score); + if (s > id(g_sn_best)) id(g_sn_best) = s; + for (int i = 0; i < 10; i++) {{ + if (s > id(g_sn_top)[i]) {{ + for (int j = 9; j > i; j--) id(g_sn_top)[j] = id(g_sn_top)[j-1]; + id(g_sn_top)[i] = s; + break; + }} + }} + - script.execute: sn_screen + # screen state + the single knob-capture authority (captured only in play + game over) + - id: sn_screen + then: + - lambda: 'id(g_knob_capture) = (id(g_sn_state) == 1 || id(g_sn_state) == 2);' + - lvgl.widget.hide: sn_ring + - script.execute: sn_clear + - lvgl.widget.hide: lbl_sn_score + - lvgl.widget.hide: sn_logo + - lvgl.widget.hide: btn_sn_start + - lvgl.widget.hide: btn_sn_howto + - lvgl.widget.hide: btn_sn_scores + - lvgl.widget.hide: lbl_sn_over + - lvgl.widget.hide: lbl_sn_rec + - lvgl.widget.hide: btn_sn_replay + - lvgl.widget.hide: btn_sn_exit + - lvgl.widget.hide: lbl_sn_howto_t + - lvgl.widget.hide: sn_b1 + - lvgl.widget.hide: sn_b2 + - lvgl.widget.hide: sn_b3 + - lvgl.widget.hide: sn_b4 + - lvgl.widget.hide: lbl_sn_howto1 + - lvgl.widget.hide: lbl_sn_howto2 + - lvgl.widget.hide: lbl_sn_howto3 + - lvgl.widget.hide: lbl_sn_howto4 + - lvgl.widget.hide: lbl_sn_scores_t + - lvgl.widget.hide: lbl_sn_scores1 + - lvgl.widget.hide: lbl_sn_scores2 + - lvgl.widget.hide: btn_sn_back + - if: # MENU + condition: {{ lambda: 'return id(g_sn_state) == 0;' }} + then: + - lvgl.widget.show: sn_logo + - lvgl.widget.show: btn_sn_start + - lvgl.widget.show: btn_sn_howto + - lvgl.widget.show: btn_sn_scores + - if: # PLAY + condition: {{ lambda: 'return id(g_sn_state) == 1;' }} + then: + - lvgl.widget.show: sn_ring + - lvgl.widget.show: lbl_sn_score + - script.execute: sn_drawfull + - if: # GAME OVER + condition: {{ lambda: 'return id(g_sn_state) == 2;' }} + then: + - lvgl.widget.show: sn_logo + - lvgl.widget.show: lbl_sn_over + - lvgl.widget.show: lbl_sn_rec + - lvgl.widget.show: btn_sn_replay + - lvgl.widget.show: btn_sn_exit + - lvgl.label.update: {{ id: lbl_sn_over, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Score: %d", id(g_sn_score)); return std::string(b);' }} + - lvgl.label.update: {{ id: lbl_sn_rec, text: !lambda 'char b[24]; snprintf(b,sizeof(b),"Best: %d", id(g_sn_best)); return std::string(b);' }} + - if: # HOW TO PLAY + condition: {{ lambda: 'return id(g_sn_state) == 3;' }} + then: + - lvgl.widget.show: lbl_sn_howto_t + - lvgl.widget.show: sn_b1 + - lvgl.widget.show: sn_b2 + - lvgl.widget.show: sn_b3 + - lvgl.widget.show: sn_b4 + - lvgl.widget.show: lbl_sn_howto1 + - lvgl.widget.show: lbl_sn_howto2 + - lvgl.widget.show: lbl_sn_howto3 + - lvgl.widget.show: lbl_sn_howto4 + - lvgl.widget.show: btn_sn_back + - if: # SCORES (top 10) + condition: {{ lambda: 'return id(g_sn_state) == 4;' }} + then: + - lvgl.widget.show: lbl_sn_scores_t + - lvgl.widget.show: lbl_sn_scores1 + - lvgl.widget.show: lbl_sn_scores2 + - lvgl.widget.show: btn_sn_back + - lvgl.label.update: + id: lbl_sn_scores1 + text: !lambda |- + std::string s; char b[24]; + for (int i = 0; i < 5; i++) {{ if(i) s += "\\n"; if(id(g_sn_top)[i]>0){{ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sn_top)[i]); }} else {{ snprintf(b,sizeof(b),"%d. -",i+1); }} s += b; }} + return s; + - lvgl.label.update: + id: lbl_sn_scores2 + text: !lambda |- + std::string s; char b[24]; + for (int i = 5; i < 10; i++) {{ if(i>5) s += "\\n"; if(id(g_sn_top)[i]>0){{ snprintf(b,sizeof(b),"%d. %d",i+1,id(g_sn_top)[i]); }} else {{ snprintf(b,sizeof(b),"%d. -",i+1); }} s += b; }} + return s; + +interval: + - interval: 250ms + then: + - if: + condition: {{ lambda: 'return id(g_sn_reset) || id(g_factory_reset);' }} + then: + - lambda: 'for (int i = 0; i < 10; i++) id(g_sn_top)[i] = 0; id(g_sn_best) = 0; id(g_sn_reset) = false;' + - interval: 50ms + then: + - if: + condition: {{ lambda: 'return id(g_nav_req) && id(g_base)==9;' }} + then: + - lambda: 'id(g_nav_req) = false; id(g_sn_state) = 0; id(g_knob_delta) = 0;' + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==0;' }}, then: [lvgl.page.show: {{ id: page_snake, animation: move_left, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==1;' }}, then: [lvgl.page.show: {{ id: page_snake, animation: move_right, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==2;' }}, then: [lvgl.page.show: {{ id: page_snake, animation: move_top, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==3;' }}, then: [lvgl.page.show: {{ id: page_snake, animation: move_bottom, time: 250ms }}] }} + - script.execute: sn_screen + # Game tick: steer + glide head; lay/drop one trail dot when the head advanced SEG_DIST. + # All body/head positioning is done IN this lambda (lv_obj_set_pos) to keep the action chain shallow. + - interval: 50ms + then: + - if: + condition: {{ lambda: 'return id(g_base) == 9 && id(g_sn_state) == 1;' }} + then: + - lambda: |- + id(g_sn_add) = -1; id(g_sn_del) = -1; id(g_sn_newfruit) = -1; id(g_sn_newskull) = -1; + int kd = id(g_knob_delta); id(g_knob_delta) = 0; + id(g_sn_ang) += kd * {TURN}f; + float spd = {SPEED0}f + id(g_sn_score) / 400.0f; if (spd > 5.5f) spd = 5.5f; + float hx = id(g_sn_hx) + cosf(id(g_sn_ang)) * spd; + float hy = id(g_sn_hy) + sinf(id(g_sn_ang)) * spd; + if (hx*hx + hy*hy > {R}f * {R}f) {{ id(g_sn_dead) = true; }} // hit the ring + else {{ + id(g_sn_hx) = hx; id(g_sn_hy) = hy; + int len = id(g_sn_len), head = id(g_sn_head); + for (int i = {SELF_SKIP}; i < len; i++) {{ + int sl = (head - i + {M}) % {POOL}; + float dx = hx - id(g_sn_tx)[sl], dy = hy - id(g_sn_ty)[sl]; + if (dx*dx + dy*dy < {SELF_DIST}f * {SELF_DIST}f) {{ id(g_sn_dead) = true; break; }} + }} + for (int s = 0; s < {NSKULL}; s++) if (id(g_sn_skon)[s]) {{ + float dx = hx - id(g_sn_skx)[s], dy = hy - id(g_sn_sky)[s]; + if (dx*dx + dy*dy < {SKHIT}f * {SKHIT}f) {{ id(g_sn_dead) = true; }} + }} + for (int s = 0; s < {NFSLOT} && !id(g_sn_dead); s++) if (id(g_sn_fon)[s]) {{ + float dx = hx - id(g_sn_fx)[s], dy = hy - id(g_sn_fy)[s]; + if (dx*dx + dy*dy < {EAT}f * {EAT}f) {{ id(g_sn_fon)[s] = false; id(g_sn_score) += 10; id(g_sn_grow) += {GROW}; }} + }} + if (!id(g_sn_dead)) {{ + float dx = hx - id(g_sn_tx)[head], dy = hy - id(g_sn_ty)[head]; + if (dx*dx + dy*dy >= {SEG_DIST}f * {SEG_DIST}f) {{ + int nh = (head + 1) % {POOL}; + id(g_sn_tx)[nh] = hx; id(g_sn_ty)[nh] = hy; + id(g_sn_head) = nh; id(g_sn_add) = nh; + if (id(g_sn_grow) > 0 && id(g_sn_len) < {POOL - 1}) {{ id(g_sn_grow)--; id(g_sn_len)++; id(g_sn_del) = -1; }} // cap at POOL-1: the ring needs one free slot or add/drop collide + else {{ if (id(g_sn_grow) > 0) id(g_sn_grow)--; id(g_sn_del) = (head - id(g_sn_len) + 1 + {M}) % {POOL}; }} + }} + }} + }} + if (!id(g_sn_dead)) {{ + int fc = 0; for (int s = 0; s < {NFSLOT}; s++) if (id(g_sn_fon)[s]) fc++; + id(g_sn_fclk)++; + int wait = (fc <= 1) ? {FRUIT_WAIT // 2} : {FRUIT_WAIT}; + if (fc < {NFSLOT} && id(g_sn_fclk) >= wait) {{ + id(g_sn_fclk) = 0; + int sl = -1; for (int s = 0; s < {NFSLOT}; s++) if (!id(g_sn_fon)[s]) {{ sl = s; break; }} + if (sl >= 0) {{ + float a = (esp_random() % 62832) / 10000.0f; float rad = 25.0f + (esp_random() % 140); + id(g_sn_fx)[sl] = cosf(a)*rad; id(g_sn_fy)[sl] = sinf(a)*rad; + id(g_sn_fi)[sl] = esp_random() % {NFRUIT}; id(g_sn_fon)[sl] = true; id(g_sn_newfruit) = sl; + }} + }} + int sc = 0; for (int s = 0; s < {NSKULL}; s++) if (id(g_sn_skon)[s]) sc++; + id(g_sn_skclk)++; + if (sc < {NSKULL} && id(g_sn_skclk) >= {SKULL_WAIT}) {{ + id(g_sn_skclk) = 0; + int sl = -1; for (int s = 0; s < {NSKULL}; s++) if (!id(g_sn_skon)[s]) {{ sl = s; break; }} + if (sl >= 0) {{ + float a = (esp_random() % 62832) / 10000.0f; float rad = 30.0f + (esp_random() % 130); + id(g_sn_skx)[sl] = cosf(a)*rad; id(g_sn_sky)[sl] = sinf(a)*rad; + id(g_sn_skon)[sl] = true; id(g_sn_skage)[sl] = 0; id(g_sn_newskull) = sl; + }} + }} + for (int s = 0; s < {NSKULL}; s++) if (id(g_sn_skon)[s]) {{ id(g_sn_skage)[s]++; if (id(g_sn_skage)[s] >= {SKULL_LIFE}) id(g_sn_skon)[s] = false; }} + // render (constant cost): head every tick + the one added/dropped dot + lv_obj_set_pos(id(sn_head), 180 + (int) lroundf(id(g_sn_hx)) - {HALF}, 180 + (int) lroundf(id(g_sn_hy)) - {HALF}); + if (id(g_sn_add) >= 0 || id(g_sn_del) >= 0) {{ + {SEGINIT} + if (id(g_sn_add) >= 0) lv_obj_set_pos(SS[id(g_sn_add)], 180 + (int) lroundf(id(g_sn_tx)[id(g_sn_add)]) - {HALF}, 180 + (int) lroundf(id(g_sn_ty)[id(g_sn_add)]) - {HALF}); + if (id(g_sn_del) >= 0) lv_obj_set_pos(SS[id(g_sn_del)], 400, 400); + }} + }} + - if: + condition: {{ lambda: 'return id(g_sn_dead);' }} + then: + - script.execute: sn_over + else: + - if: + condition: {{ lambda: 'return id(g_sn_newfruit) >= 0;' }} + then: +{fspr_dispatch()} + - if: + condition: {{ lambda: 'return id(g_sn_newskull) >= 0;' }} + then: +{skull_dispatch()} + - script.execute: sn_items + - script.execute: sn_hud + +image: + - id: img_sn_logo + file: "{BASE}snake-logo.png" + type: RGB565 +{fruit_images()} + - id: img_sn_skull + file: "{BASE}skull.png" + type: RGB565 + transparency: alpha_channel + +lvgl: + pages: + - id: page_snake + bg_color: {PAGE_BG} + scrollbar_mode: "off" + scrollable: false + widgets: + - obj: {{ id: sn_ring, align: CENTER, x: 0, y: 0, width: {RING_D}, height: {RING_D}, radius: {RING_D // 2}, bg_opa: TRANSP, border_width: 4, border_color: {RING}, hidden: true }} +{fruit_widgets()} +{skull_widgets()} +{body_widgets()} + - obj: {{ id: sn_head, x: 400, y: 400, width: {SEG}, height: {SEG}, radius: {SEGR}, border_width: 0, bg_color: {HEAD}, bg_opa: COVER }} + - label: {{ id: lbl_sn_score, align: CENTER, x: 0, y: -150, text: "0", text_font: font_med, text_color: {HUD}, hidden: true }} + - image: {{ id: sn_logo, align: CENTER, x: 0, y: 0, src: img_sn_logo, hidden: true }} + - button: + id: btn_sn_start + align: CENTER + y: 4 + width: 150 + height: 44 + radius: 22 + bg_color: {ACCENT} + bg_opa: COVER + border_width: 0 + on_click: [ script.execute: sn_start ] + widgets: + - label: {{ align: CENTER, text: "Start", text_font: font_med, text_color: {ACCENT_TXT} }} + - button: + id: btn_sn_howto + align: CENTER + y: 54 + width: 150 + height: 44 + radius: 22 + bg_color: {BTN2} + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sn_state) = 3;', script.execute: sn_screen ] + widgets: + - label: {{ align: CENTER, text: "How to play?", text_font: font_med, text_color: {BTN2_TXT} }} + - button: + id: btn_sn_scores + align: CENTER + y: 104 + width: 150 + height: 44 + radius: 22 + bg_color: {BTN2} + bg_opa: COVER + border_width: 0 + on_click: [ lambda: 'id(g_sn_state) = 4;', script.execute: sn_screen ] + widgets: + - label: {{ align: CENTER, text: "Scores", text_font: font_med, text_color: {BTN2_TXT} }} + - label: {{ id: lbl_sn_over, align: CENTER, x: 0, y: -10, text_align: CENTER, text: "", text_font: font_sel, text_color: {WORDMARK}, hidden: true }} + - label: {{ id: lbl_sn_rec, align: CENTER, x: 0, y: 22, text_align: CENTER, text: "", text_font: font_artist, text_color: {WORDMARK}, hidden: true }} + - button: + id: btn_sn_replay + align: CENTER + x: -66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: {ACCENT} + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ script.execute: sn_start ] + widgets: + - label: {{ align: CENTER, text: "Play", text_font: font_med, text_color: {ACCENT_TXT} }} + - button: + id: btn_sn_exit + align: CENTER + x: 66 + y: 62 + width: 112 + height: 48 + radius: 24 + bg_color: {GRAY} + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sn_state) = 0;', script.execute: sn_screen ] + widgets: + - label: {{ align: CENTER, text: "Exit", text_font: font_med, text_color: 0xFFFFFF }} + - label: {{ id: lbl_sn_howto_t, align: CENTER, y: -104, text: "HOW TO PLAY?", text_font: font_sel, text_color: {ACCENT}, hidden: true }} + - obj: {{ id: sn_b1, align: CENTER, x: -96, y: -52, width: 24, height: 24, radius: 12, bg_color: {BADGE}, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: {{ align: CENTER, text: "1", text_font: font_artist, text_color: 0xFFFFFF }} ] }} + - obj: {{ id: sn_b2, align: CENTER, x: -96, y: -16, width: 24, height: 24, radius: 12, bg_color: {BADGE}, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: {{ align: CENTER, text: "2", text_font: font_artist, text_color: 0xFFFFFF }} ] }} + - obj: {{ id: sn_b3, align: CENTER, x: -96, y: 20, width: 24, height: 24, radius: 12, bg_color: {BADGE}, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: {{ align: CENTER, text: "3", text_font: font_artist, text_color: 0xFFFFFF }} ] }} + - obj: {{ id: sn_b4, align: CENTER, x: -96, y: 56, width: 24, height: 24, radius: 12, bg_color: 0xE05A4A, bg_opa: COVER, border_width: 0, pad_all: 0, hidden: true, widgets: [ label: {{ align: CENTER, text: "!", text_font: font_artist, text_color: 0xFFFFFF }} ] }} + - label: {{ id: lbl_sn_howto1, align_to: {{ id: sn_b1, align: OUT_RIGHT_MID, x: 8 }}, text: "Turn knob to steer", text_font: font_med, text_color: {TXT}, hidden: true }} + - label: {{ id: lbl_sn_howto2, align_to: {{ id: sn_b2, align: OUT_RIGHT_MID, x: 8 }}, text: "Eat fruit to grow", text_font: font_med, text_color: {TXT}, hidden: true }} + - label: {{ id: lbl_sn_howto3, align_to: {{ id: sn_b3, align: OUT_RIGHT_MID, x: 8 }}, text: "Avoid the ring & tail", text_font: font_med, text_color: {TXT}, hidden: true }} + - label: {{ id: lbl_sn_howto4, align_to: {{ id: sn_b4, align: OUT_RIGHT_MID, x: 8 }}, text: "Skulls kill - avoid!", text_font: font_med, text_color: {TXT}, hidden: true }} + - label: {{ id: lbl_sn_scores_t, align: CENTER, y: -116, text: "SCORES", text_font: font_sel, text_color: {ACCENT}, hidden: true }} + - label: {{ id: lbl_sn_scores1, align: CENTER, x: -52, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: {TXT}, hidden: true }} + - label: {{ id: lbl_sn_scores2, align: CENTER, x: 56, y: 0, text: "", text_align: LEFT, text_font: font_artist, text_color: {TXT}, hidden: true }} + - button: + id: btn_sn_back + align: CENTER + y: 120 + width: 130 + height: 42 + radius: 21 + bg_color: {GRAY} + bg_opa: COVER + border_width: 0 + hidden: true + on_click: [ lambda: 'id(g_sn_state) = 0;', script.execute: sn_screen ] + widgets: + - label: {{ align: CENTER, text: "Back", text_font: font_med, text_color: 0xFFFFFF }} +""" + +here = os.path.dirname(os.path.abspath(__file__)) +out = os.path.join(here, "..", "base", "screens", "snake.yaml") +out = os.path.normpath(out) +with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write(YAML) +print("wrote", out, "(", len(YAML), "bytes )") diff --git a/scripts/gen_weather.py b/scripts/gen_weather.py new file mode 100644 index 0000000..a781c46 --- /dev/null +++ b/scripts/gen_weather.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python3 +# Generates base/screens/weather.yaml (the Weather carousel screen, base id 5). +# python scripts/gen_weather.py +# +# Modern look: fixed partly-cloudy palette, colour-coded centre temperature, ANIMATED condition +# icons (animimg frame loops, every HA condition maps to one of 7 icons), and a glow that slides +# around the rim to the selected day. Self-contained: it owns the HA forecast data layer (sensors + +# parsing into g_wx_*) AND the rendering. Animated frames: assets/sprites/weather/0..7.png. +# +# DATA layer (sensors/parser/globals) is kept as raw strings; the modern render/page is an f-string. +import os + +ICONS = ["sun", "partly", "moon", "cloud", "rain", "storm", "snow"] +NF = 8 +DUR = "1400ms" +BASE = "https://raw.githubusercontent.com/MichalZaniewicz/esphome-guition-jc3636k718c-va/main/assets/sprites/weather/" +BG = "0x1C2838"; GLOW = "0xCAD6E8"; RIM = "0xDCE6F2"; ACCENT = "0x9AA6B2"; CONDC = "0xCFE0F2"; PAGE = "0x0B1020" + +# ---------- data layer (raw - HA sensors + forecast parser + data globals + font) ---------- +HEAD = """# Weather - carousel screen (base id 5). GENERATED by scripts/gen_weather.py. +# A dial of forecast days around the rim (knob scrolls), animated condition icon + colour-coded +# temperature in the centre, a glow that slides to the selected day. Forecast comes from a Home +# Assistant helper sensor (see base/screens/weather.ha-helper.yaml). Remove: drop from `files:`. + +esphome: + on_boot: + - priority: 655 + then: + - lambda: 'id(g_present)[5] = true;' + - priority: 650 + then: + - lambda: |- + int g = id(g_wgrp_n)++; + id(g_wgrp_labels) += (g ? "\\n" : ""); id(g_wgrp_labels) += "Weather"; + int o = id(g_wopt_n)++; + id(g_wopt_group)[o] = g; id(g_wopt_label)[o] = "Fahrenheit"; id(g_wopt_kind)[o] = 0; id(g_wopt_ptr)[o] = &id(g_wx_fahrenheit); + +globals: + # --- forecast data --- + - id: g_wx_fahrenheit + type: bool + restore_value: yes + initial_value: 'false' + - id: g_wx_now + type: int + restore_value: no + initial_value: '-127' + - id: g_wx_state_cur + type: std::string + restore_value: no + - id: g_wx_cond + type: std::string[7] + restore_value: no + - id: g_wx_icon + type: std::string[7] + restore_value: no + - id: g_wx_name + type: std::string[7] + restore_value: no + - id: g_wx_hi + type: int[7] + restore_value: no + - id: g_wx_lo + type: int[7] + restore_value: no + - id: g_wx_n + type: int + restore_value: no + initial_value: '0' + - id: g_wx_day + type: int + restore_value: no + initial_value: '0' + # --- render cache --- + - id: g_wx_sel + type: std::string + restore_value: no + - id: g_wx_tc + type: int + restore_value: no + initial_value: '-127' + - id: g_wx_lastcond + type: std::string + restore_value: no + - id: g_wx_ikey + type: std::string + restore_value: no + - id: g_wx_gpos + type: float + restore_value: no + initial_value: '0.0' + +font: + - file: "https://github.com/Templarian/MaterialDesign-Webfont/raw/v7.4.47/fonts/materialdesignicons-webfont.ttf" + id: icons_wx + size: 30 + bpp: 4 + glyphs: ["\U000f0599", "\U000f0594", "\U000f0595", "\U000f0591", "\U000f059d", "\U000f0593", "\U000f0596", "\U000f0597", "\U000f0598", "\U000f0590"] +""" + +SENSORS = """ +sensor: + - platform: homeassistant + id: wx_now_temp + entity_id: ${weather_entity} + attribute: temperature + on_value: + - lambda: 'id(g_wx_now) = (int) roundf(x);' + - script.execute: wx_render + +text_sensor: + - platform: homeassistant + id: wx_now_state + entity_id: ${weather_entity} + on_value: + - lambda: 'id(g_wx_state_cur) = x;' + - script.execute: wx_render + - platform: homeassistant + id: wx_week + entity_id: ${forecast_entity} + on_value: + - lambda: |- + auto glyph = [](const std::string &s) -> std::string { + if (s == "sunny") return std::string("\U000f0599"); + if (s == "clear-night") return std::string("\U000f0594"); + if (s == "partlycloudy") return std::string("\U000f0595"); + if (s == "fog") return std::string("\U000f0591"); + if (s == "windy" || s == "windy-variant") return std::string("\U000f059d"); + if (s == "lightning" || s == "lightning-rainy") return std::string("\U000f0593"); + if (s == "pouring") return std::string("\U000f0596"); + if (s == "rainy") return std::string("\U000f0597"); + if (s == "snowy" || s == "snowy-rainy" || s == "hail") return std::string("\U000f0598"); + return std::string("\U000f0590"); + }; + std::string s = x; + for (int i = 0; i < 7; i++) { id(g_wx_icon)[i] = ""; id(g_wx_cond)[i] = ""; } + int n = 0; size_t pos = 0; + while (n < 7) { + size_t bar = s.find('|', pos); + std::string seg = (bar == std::string::npos) ? s.substr(pos) : s.substr(pos, bar - pos); + size_t c1 = seg.find(','); + if (c1 != std::string::npos) { + size_t c2 = seg.find(',', c1 + 1); + size_t c3 = (c2 != std::string::npos) ? seg.find(',', c2 + 1) : std::string::npos; + if (c2 != std::string::npos && c3 != std::string::npos) { + std::string cond = seg.substr(0, c1); + id(g_wx_cond)[n] = cond; + id(g_wx_icon)[n] = glyph(cond); + id(g_wx_hi)[n] = atoi(seg.substr(c1 + 1, c2 - c1 - 1).c_str()); + id(g_wx_lo)[n] = atoi(seg.substr(c2 + 1, c3 - c2 - 1).c_str()); + id(g_wx_name)[n] = seg.substr(c3 + 1); + n++; + } + } + if (bar == std::string::npos) break; + pos = bar + 1; + } + id(g_wx_n) = n; + if (id(g_wx_day) >= n) id(g_wx_day) = 0; + - script.execute: wx_render +""" + + +def image_block(): + return "\n".join( +f""" - id: img_wx_{k}{i} + file: "{BASE}{k}{i}.png" + type: RGB565 + transparency: alpha_channel""" for k in ICONS for i in range(NF)) + + +def animimg_widgets(): + out = [] + for k in ICONS: + src = ", ".join(f"img_wx_{k}{i}" for i in range(NF)) + out.append( + f" - animimg: {{ id: wx_a_{k}, align: CENTER, x: 0, y: -52, duration: {DUR}, " + f"repeat_count: 65535, auto_start: false, hidden: true, src: [ {src} ] }}") + return "\n".join(out) + + +def dispatch_stop_hide(): + out = [f" - lvgl.animimg.stop: wx_a_{k}" for k in ICONS] + out += [f" - lvgl.widget.hide: wx_a_{k}" for k in ICONS] + return "\n".join(out) + + +def dispatch_show(): + return "\n".join( + f" - if: {{ condition: {{ lambda: 'return id(g_wx_ikey) == \"{k}\";' }}, " + f"then: [ lvgl.widget.show: wx_a_{k}, lvgl.animimg.start: wx_a_{k} ] }}" + for k in ICONS) + + +def rim_updates(): + out = [] + for i in range(7): + out.append( + f" - lvgl.widget.update: {{ id: wx_d{i}, hidden: !lambda 'return {i} >= id(g_wx_n);', " + f"x: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(140.0f * sinf({i} * 6.2831853f / n));', " + f"y: !lambda 'int n=id(g_wx_n); if(n<1)n=1; return (int) lroundf(-140.0f * cosf({i} * 6.2831853f / n));' }}") + out.append( + f" - lvgl.label.update: {{ id: wx_d{i}, text: !lambda 'return id(g_wx_n) > {i} ? id(g_wx_icon)[{i}] : std::string(\"\");' }}") + return "\n".join(out) + + +def rim_widgets(): + return "\n".join( + f" - label: {{ id: wx_d{i}, align: CENTER, x: 0, y: 0, text: \"\", text_font: icons_wx, text_color: {RIM}, hidden: true }}" + for i in range(7)) + + +MODERN = f""" +image: +{image_block()} + +script: + - id: wx_render + then: + - lambda: |- + int d = id(g_wx_day); + bool has = (id(g_wx_n) > 0 && d < id(g_wx_n)); + id(g_wx_sel) = has ? id(g_wx_cond)[d] : id(g_wx_state_cur); + id(g_wx_tc) = has ? id(g_wx_hi)[d] : id(g_wx_now); + - lvgl.label.update: + id: wx_day + text: !lambda |- + int d = id(g_wx_day); + if (id(g_wx_n) <= 0 || d >= id(g_wx_n)) return std::string("TODAY"); + std::string s = id(g_wx_name)[d]; + if (s == "Mon") return std::string("MONDAY"); + if (s == "Tue") return std::string("TUESDAY"); + if (s == "Wed") return std::string("WEDNESDAY"); + if (s == "Thu") return std::string("THURSDAY"); + if (s == "Fri") return std::string("FRIDAY"); + if (s == "Sat") return std::string("SATURDAY"); + if (s == "Sun") return std::string("SUNDAY"); + return s; + - lvgl.label.update: + id: wx_htemp + text: !lambda |- + int d = id(g_wx_day); + bool f = id(g_wx_fahrenheit); + char u = f ? 'F' : 'C'; + if (id(g_wx_n) <= 0 || d >= id(g_wx_n)) {{ + if (id(g_wx_now) > -100) {{ int n = id(g_wx_now); if (f) n = n*9/5+32; char b[12]; snprintf(b,sizeof(b),"%d°%c",n,u); return std::string(b); }} + return std::string("--"); + }} + int hi = id(g_wx_hi)[d], lo = id(g_wx_lo)[d]; + if (f) {{ hi = hi*9/5+32; lo = lo*9/5+32; }} + char b[24]; snprintf(b,sizeof(b),"%d° / %d°",hi,lo); return std::string(b); + - lvgl.label.update: + id: wx_cond + text: !lambda |- + if (id(g_wx_n) <= 0) return std::string("Add the HA forecast helper"); + std::string s = id(g_wx_sel); + if (s == "sunny") return std::string("Sunny"); + if (s == "clear-night") return std::string("Clear"); + if (s == "partlycloudy") return std::string("Partly Cloudy"); + if (s == "cloudy") return std::string("Cloudy"); + if (s == "fog") return std::string("Fog"); + if (s == "rainy") return std::string("Rainy"); + if (s == "pouring") return std::string("Heavy Rain"); + if (s == "lightning" || s == "lightning-rainy") return std::string("Storm"); + if (s == "snowy" || s == "snowy-rainy") return std::string("Snow"); + if (s == "hail") return std::string("Hail"); + if (s == "windy" || s == "windy-variant") return std::string("Windy"); + if (s == "exceptional") return std::string("Severe"); + return s; + - if: + condition: {{ lambda: 'return id(g_wx_sel) != id(g_wx_lastcond);' }} + then: + - lambda: |- + id(g_wx_lastcond) = id(g_wx_sel); + std::string s = id(g_wx_sel), k; + if (s == "sunny") k = "sun"; + else if (s == "clear-night") k = "moon"; + else if (s == "partlycloudy") k = "partly"; + else if (s == "rainy" || s == "pouring") k = "rain"; + else if (s == "lightning" || s == "lightning-rainy") k = "storm"; + else if (s == "snowy" || s == "snowy-rainy" || s == "hail") k = "snow"; + else k = "cloud"; + id(g_wx_ikey) = k; +{dispatch_stop_hide()} +{dispatch_show()} + - lvgl.widget.update: {{ id: wx_glow, hidden: !lambda 'return id(g_wx_n) <= 0;' }} +{rim_updates()} + - lvgl.label.update: {{ id: wx_htemp, text_color: 0xFFFFFF }} + - if: {{ condition: {{ lambda: 'return id(g_wx_tc) > -100 && id(g_wx_tc) <= 0;' }}, then: [ lvgl.label.update: {{ id: wx_htemp, text_color: 0x7FB2FF }} ] }} + - if: {{ condition: {{ lambda: 'return id(g_wx_tc) > 0 && id(g_wx_tc) < 10;' }}, then: [ lvgl.label.update: {{ id: wx_htemp, text_color: 0x6FD0E8 }} ] }} + - if: {{ condition: {{ lambda: 'return id(g_wx_tc) >= 10 && id(g_wx_tc) < 18;' }}, then: [ lvgl.label.update: {{ id: wx_htemp, text_color: 0x7FE6B0 }} ] }} + - if: {{ condition: {{ lambda: 'return id(g_wx_tc) >= 18 && id(g_wx_tc) < 25;' }}, then: [ lvgl.label.update: {{ id: wx_htemp, text_color: 0xFFD061 }} ] }} + - if: {{ condition: {{ lambda: 'return id(g_wx_tc) >= 25;' }}, then: [ lvgl.label.update: {{ id: wx_htemp, text_color: 0xFF7A4D }} ] }} +{SENSORS} +interval: + - interval: 50ms + then: + - if: + condition: {{ lambda: 'return id(g_nav_req) && id(g_base)==5;' }} + then: + - lambda: 'id(g_nav_req) = false; id(g_knob_capture) = true; id(g_wx_day) = 0; id(g_wx_gpos) = 0.0f; id(g_wx_lastcond) = "";' + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==0;' }}, then: [lvgl.page.show: {{ id: page_weather, animation: move_left, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==1;' }}, then: [lvgl.page.show: {{ id: page_weather, animation: move_right, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==2;' }}, then: [lvgl.page.show: {{ id: page_weather, animation: move_top, time: 250ms }}] }} + - if: {{ condition: {{ lambda: 'return id(g_nav_anim)==3;' }}, then: [lvgl.page.show: {{ id: page_weather, animation: move_bottom, time: 250ms }}] }} + - script.execute: wx_render + - interval: 120ms + then: + - if: + condition: {{ lambda: 'return id(g_base)==5 && id(g_knob_delta) != 0;' }} + then: + - lambda: |- + id(g_wx_day) += id(g_knob_delta); id(g_knob_delta) = 0; + int mx = (id(g_wx_n) > 0) ? id(g_wx_n) - 1 : 0; + if (id(g_wx_day) < 0) id(g_wx_day) = 0; + if (id(g_wx_day) > mx) id(g_wx_day) = mx; + - script.execute: wx_render + - interval: 30ms + then: + - if: + condition: {{ lambda: 'return id(g_base)==5;' }} + then: + - lambda: |- + float p = id(g_wx_gpos), tgt = (float) id(g_wx_day); + if (fabsf(tgt - p) > 0.001f) {{ // only while actually sliding + int n = id(g_wx_n); if (n < 1) n = 1; + p += (tgt - p) * 0.35f; + if (fabsf(tgt - p) < 0.02f) p = tgt; + id(g_wx_gpos) = p; + float rx = 140.0f * sinf(p * 6.2831853f / n); + float ry = -140.0f * cosf(p * 6.2831853f / n); + lv_obj_set_pos(id(wx_glow), 180 + (int) lroundf(rx) - 28, 180 + (int) lroundf(ry) - 28); + }} + +lvgl: + pages: + - id: page_weather + bg_color: {PAGE} + widgets: + - obj: {{ id: wx_bg, align: CENTER, x: 0, y: 0, width: 360, height: 360, radius: 0, bg_color: {BG}, bg_opa: COVER, border_width: 0 }} + - obj: {{ id: wx_glow, x: 152, y: 12, width: 56, height: 56, radius: 28, bg_color: {GLOW}, bg_opa: 30%, border_width: 0, hidden: true }} +{rim_widgets()} +{animimg_widgets()} + - label: {{ id: wx_day, align: CENTER, x: 0, y: -10, text: "", text_font: font_artist, text_color: {ACCENT} }} + - label: {{ id: wx_htemp, align: CENTER, x: 0, y: 24, text: "--", text_font: montserrat_34, text_color: 0xFFFFFF }} + - label: {{ id: wx_cond, align: CENTER, x: 0, y: 62, text: "", text_font: font_med, text_color: {CONDC} }} +""" + +YAML = HEAD + MODERN + +here = os.path.dirname(os.path.abspath(__file__)) +out = os.path.normpath(os.path.join(here, "..", "base", "screens", "weather.yaml")) +with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write(YAML) +print("wrote", out, "(", len(YAML), "bytes )") diff --git a/scripts/make_sounds.py b/scripts/make_sounds.py new file mode 100644 index 0000000..90c0d06 --- /dev/null +++ b/scripts/make_sounds.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Generate wake.wav (wake-word confirmation) and alarm.wav (timer alarm). + +Pure stdlib (wave + math), no dependencies. Output: 16-bit PCM, mono, 16 kHz. +Run: python make_sounds.py +""" +import math +import struct +import wave +import os + +RATE = 16000 +SOUNDS = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "assets", "sounds") +os.makedirs(SOUNDS, exist_ok=True) + + +def _tone(freq, dur, vol=0.6, rate=RATE): + """One sine tone with short fade in/out to avoid clicks.""" + n = int(rate * dur) + fade = max(1, int(rate * 0.005)) # 5 ms fade + out = [] + for i in range(n): + env = 1.0 + if i < fade: + env = i / fade + elif i > n - fade: + env = (n - i) / fade + out.append(vol * env * math.sin(2 * math.pi * freq * i / rate)) + return out + + +def _silence(dur, rate=RATE): + return [0.0] * int(rate * dur) + + +def _write(path, samples, rate=RATE): + with wave.open(path, "w") as w: + w.setnchannels(1) + w.setsampwidth(2) + w.setframerate(rate) + frames = b"".join( + struct.pack("