Skip to content

Splash design: stochastic generation strategy (refs #18) #53

Description

@dbqpdb

Follow-up to #18, narrower scope. The splash should look different every time it's called. This issue is for picking an approach — design discussion welcome from any collaborator before we commit to one.

A demo script (demo_splash.py) is in PR #52. Run python demo_splash.py to see fresh randomized output any time. Samples below are from python demo_splash.py --seed 42 so the discussion has a stable reference.

Each option shows 5 samples so the range of variation is visible, not just one arbitrary instance.

Option 1: Mask + random fill character

Single hand-designed letter shape; each call picks one random char (#, , , , , …) for the filled cells. Same silhouette every call, different fill texture.

█████   █       █     █
█    █  █       ██   ██
█████   █       █ █ █ █
█  █    █       █  █  █
█   █   █       █     █
█    █  ██████  █     █
#####   #       #     #
#    #  #       ##   ##
#####   #       # # # #
#  #    #       #  #  #
#   #   #       #     #
#    #  ######  #     #
░░░░░   ░       ░     ░
░    ░  ░       ░░   ░░
░░░░░   ░       ░ ░ ░ ░
░  ░    ░       ░  ░  ░
░   ░   ░       ░     ░
░    ░  ░░░░░░  ░     ░
▒▒▒▒▒   ▒       ▒     ▒
▒    ▒  ▒       ▒▒   ▒▒
▒▒▒▒▒   ▒       ▒ ▒ ▒ ▒
▒  ▒    ▒       ▒  ▒  ▒
▒   ▒   ▒       ▒     ▒
▒    ▒  ▒▒▒▒▒▒  ▒     ▒
▒▒▒▒▒   ▒       ▒     ▒
▒    ▒  ▒       ▒▒   ▒▒
▒▒▒▒▒   ▒       ▒ ▒ ▒ ▒
▒  ▒    ▒       ▒  ▒  ▒
▒   ▒   ▒       ▒     ▒
▒    ▒  ▒▒▒▒▒▒  ▒     ▒

Option 2: Per-cell jitter

Same mask, but each filled cell picks independently from a small pool (mostly , occasionally //), and background cells occasionally pick up a faint dot. Letters look noisy / hand-stamped.

███▒█   █     . ▒     █
▒    ▓  ▒       █▒   ▓█
█████   █ .     █·█ █ █
█  █.  ·▓       █  █. ▒
▀   █   ▒       █   . ▒
█    █  ██▓██▒  █     █
██▓██   █       █     █
▀    ▒  █  ·.   ▀█   ▓█
█████   ▓    ·  █ ▀ ▀ █
█ ·▒    █·..    █  █  █
▒   █   █ .     ▒     █
▒    █  ▀█████  █     █
█████·  █       ▒·    █
█·   ▒ ·█       ██   ██
▓██▓█   █ .  ·  █ █ █ █
█  █  ·.█     . █  ▓ .█
█   █   █       █    ·█
█    █  █▒██▓▒· █     █
█▀▓██  ·█      .▒·    █
█    ▒  ▒       █▒   █▓
▒█▓▓█   ▒       ▒·█ █ █
█  ▒  . ▀  ·    █  ▓  █
█   █   █  .    ▒  .  ▒
█    █  █▀▓▀▒▀  ▀  .  ▀
██▀██   ▓       █     ▀
▒    █  ▀       █▀   ▀█
▒▓▒█▀   █   ·  .▒ ▀ █ ▒
▓  ▓    █       █. █  █
█   █   █       █    ·▒
▒   .█  ██▓▒▓█ .▓     ▓

Option 3: Pre-designed font pool

Hand-craft ~6–10 RLM banners (block, heavy, tile, thin, chess-themed, …), pick one at random. Highest visual quality per option, finite variety, more art work to maintain. Current pool in the demo has 4 banners.

▄▀▀▀▄ █     █▄ ▄█
█▄▄▄▀ █     █ ▀ █
█  █  █     █   █
█   █ █▄▄▄  █   █
██████╗ ██╗     ███╗   ███╗
██╔══██╗██║     ████╗ ████║
██████╔╝██║     ██╔████╔██║
██╔══██╗██║     ██║╚██╔╝██║
██║  ██║███████╗██║ ╚═╝ ██║
╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝
▄▀▀▀▄ █     █▄ ▄█
█▄▄▄▀ █     █ ▀ █
█  █  █     █   █
█   █ █▄▄▄  █   █
██████╗ ██╗     ███╗   ███╗
██╔══██╗██║     ████╗ ████║
██████╔╝██║     ██╔████╔██║
██╔══██╗██║     ██║╚██╔╝██║
██║  ██║███████╗██║ ╚═╝ ██║
╚═╝  ╚═╝╚══════╝╚═╝     ╚═╝
.------..------..------.
|R.--. ||L.--. ||M.--. |
| :(): || :/\: || (\/) |
| ()() || (__) || :\/: |
| '--'R|| '--'L|| '--'M|
`------'`------'`------'

Option 4: Pyfiglet with a random font

Adds a pyfiglet dependency; gets dozens of ASCII fonts essentially for free.

[font: standard]
 ____  _     __  __ 
|  _ \| |   |  \/  |
| |_) | |   | |\/| |
|  _ <| |___| |  | |
|_| \_\_____|_|  |_|
[font: speed]
____________________  ___
___  __ \__  /___   |/  /
__  /_/ /_  / __  /|_/ / 
_  _, _/_  /___  /  / /  
/_/ |_| /_____/_/  /_/
[font: smslant]
   ___  __   __  ___
  / _ \/ /  /  |/  /
 / , _/ /__/ /|_/ / 
/_/|_/____/_/  /_/
[font: shadow]
  _ \  |      \  | 
 |   | |     |\/ | 
 __ <  |     |   | 
_| \_\_____|_|  _|
[font: small]
 ___ _    __  __ 
| _ \ |  |  \/  |
|   / |__| |\/| |
|_|_\____|_|  |_|

Option 5: Glitch overlay

Render letters cleanly (any method) then perturb cells — drop some, lighten some, sprinkle faint marks in the background.

██·██  .█      ··     █
░    █  █       ██   ██
█████   ▒       █ █ █ █
█  ░    █       █  ▒  █
█   ·  .█       █     ░
█    █  ██████ ·█     █
░████           █ ·   █
█    █  █       ██   █▒
█████   █       █ █ █ █
█  █    █       ·  █  █
█.  █   █       █     █
█·   █  █████   █     ·
█████  .█       █     █
█    █  █       ██   ██
█████   █       █ █ █ █
█  █    █  ·    █  █. █
·   █   ░       █     █
█    █   █████        █
█████·  █      .·     █
█    █  ·       ██   ██
█████   █       █ █ █ ·
   █    █       █  █  █
█   █  .    ·   █·    █
█    ▒  ██████  █    .█
█████   █              
█    █  █       ██   ██
█████   █       █ █ █ █
█       █       █  █  █
█   █   █       ▒     █
█    █  █·████  █   . █

Layered: base = pre-designed banner

Uses Option 3 as the base, then perturbs cells. Original banner glyphs are kept for most cells; jittered cells swap to lighter block glyphs (//), dropped cells become spaces, background cells occasionally pick up a faint dot. Each call also picks a different banner from the pool, so silhouette and texture both vary.

Subtle (jitter=0.10, drop=0.00, bg=0.02)

▄▀▀▀▄ █     █▄ ▄█
█▄▒▄▀ █     █ ▀ █
█  █  █     █   █
█   █ █▄▓▄  ▓   █
██████╗·▓█╗     ▒██▒ • ██▒╗
██▒░═██▒▒█║·    ██░█╗ ████║
██▓▓██╔╝██░     ██╔████╔██║
██░══██╗██║     ██║╚░█╔╝██║
██▓  ██▓███████╗██║ ╚═╝ ██║
╚═╝  ╚═░╚══════╝╚═╝     ╚═╝
▄▀▀▒▄ █     ▒▄ ▄█
█▄▄▄▀ █     █ ▀ █
█  █  █     █   █
█   █ █▄▄▄  █   █
██████╗ ██╗     ███╗   ███╗
██▒══██▒██║ ·   ████╗ ░███║
██▒███╔╝██▓     ██╔████╔██║
█▒╔══██╗▒█║     ██║╚██╔╝██║
██║  ██║███████╗██║ ╚═╝ ██║
╚═╝  ╚═╝╚══════╝╚░▒     ╚═╝
████▒█╗ ██╗     ███▓   █▓█╗
█▒╔══██▒██║     ████╗ ████║
██████░▓██▒     ░█╔████╔██║
██╔══██╗██║     ██║╚██╔╝██║
██║  ██║▓██▒██▒╗██▒ ╚▓╝ ██║
╚═╝  ╚═╝░══════╝╚═╝     ╚═╝

Medium (jitter=0.30, drop=0.06, bg=0.06)

██░███  ▓█╗  .  █ █░   █▓█╗
█░╔══██╗██║     ███░▒ ███▓▒
███░█ ╔╝ ░║      █╔▒███╔▒█║
█▒▒══██▓██║     █▒░╚██╔▒██║
▒░║  ██║█░  ░░▓╗██║ ╚═   █▒
 ═╝  ▓═░╚═▒▒═░░╝░═▒     ╚═▓
 ___▓_  _  ·   _▓  __
|  __ \▓ |    |. \░  |
| |__▓ | |    | ▒  /.|
|     /| ░    | |\/▒ |
| |   \| |____░ ▒  ░ |
|▒▒  ░░ __▒_▒_▒░▒  |_|
▄▀░▀▄ ░  •  █▄  ░
█▄▄▒▀ █  ·  ░ ▒ █
▓  ▒• █     ▓   █
█   █ █▄ ▒  ▓   ▓
.--▒--▒..-░--▓▓.▒-▒----.
▓R▒--. |▒L.--. |▓M▓░▒. |
| ░():•|▒ :/▓: || (░/░ |
| ()() ░░ (__▒ || :░▓: |
| '--'░|| '--'L▒| '--'M|
▒░▒--- '` -▒ -░'`▒▒▒-- '
█▓ █▓█╗.██╗     ▒▓█╗   ▒██▒
██▓▓═██▓░░║   • ░██▓╗ ▒▒█▓║
█░██▒█╔ ▒▓║     ██╔▓░██▒██║
█░╔═▓▒░╗░█▓     ██▓╚██▓▒▓░║
██   ▓█║░█ █▒██▓██║ ▒═▓ ░█░
╚═▒  ▓═ ░══▒═══░╚▓╝•     ═╝

Heavy (jitter=0.40, drop=0.10, bg=0.10)

░-▓-▒ -..-░  ▒ .▓▒--░▒▓.
░▓▒▓-. ▒| .░-  ▓|M▓-▓  ░
|·:▓ : ▒░  /\  ░▓.▒ /░  
| ▓▒(  ▒░  ▒░░ || :░/▓•▒
  '--'░░|  -▒▓░░|  --'M▒
`▓ ▓ ▒-▓▓--▓░--'`-░▓▒▓-░
▄░▀▀▄ █     █▄ ▄█
 ▄▄▄░ ▒       ▀ ▒
░. █. █     ░    
█     ░ ▄▄  █   █
▓▓░▀▄ ▓.    ▒▄ ▓ 
▒▄▓▒░ █    .▓ ▀ █
   ░ .█     ▓  •█
█   █ █▄▄▒• █   █
•▒___   _      ▓_  _░
░  ░_  | ░    |  \/  ░
▒ ░ ▒) | |    |    / ▒
|  _   ░ |    ░·▓\/▓ |
▒ | \ ▓|.|___▒| ▒  ▓•|
|_|  ▒_\_░__░_|_|  |_|
▒░ --░-..░▒---▓░░-░--▓-▒
░▓░--  ||▒▓▓░. ░▓░.▓ ▓ ▓
▒ ▒▓): ||   \▒ ░| (▒░) |
| (▓▒  |▓ ▒__░ |  :\ : ░
░ '-░░░|▓ '▓░▒L|▒  ▓-▓ |
`--▓- -'`▒▓ ▓-░░▓ ░▒--░ 

What I'm asking

  1. Which option (or combination) feels right for RLM's vibe?
  2. Anyone strongly anti-pyfiglet as a dependency (Option 4)?
  3. For the layered version: subtle, medium, heavy, or something else entirely?
  4. Counter-proposals welcome — there are other axes (color via ANSI, animated reveal, glyphs-as-pieces-only, …) that aren't covered here.

React with thumbs up / down on each option, or comment with a different direction. I'll implement whatever consensus we land on (#18).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions