""" ASCII Art Dreams - LCD-optimized for 20x4 HD44780 displays. Safe characters only: | - _ / . * o O x X ^ @ () [] {} > < ! No backslashes, no unicode, no fancy chars. """ import random DREAMS = { # === EMOTIONS (0-19) === 0: {"cat": "happy", "art": " ^_^ \n / / \n | | \n --- "}, 1: {"cat": "happy", "art": " o/ \n | \n / \\ \n YAY! "}, 2: {"cat": "happy", "art": " .---. \n / ^_^ \\ \n | | \n '---' "}, 3: {"cat": "happy", "art": " o(^_^)o \n | | \n /| |\\ \n |_| "}, 4: {"cat": "happy", "art": " o/ \n | \n / \\ \n ^_^ "}, 5: {"cat": "sad", "art": " .-. \n ( ) \n '-' \n T_T "}, 6: {"cat": "sad", "art": " ;_; \n | \n / \\ \n (sigh) "}, 7: {"cat": "sad", "art": " .---. \n / x_x \\ \n | T | \n \\___/ "}, 8: {"cat": "sad", "art": " .__. \n / \\ \n | -- | \n \\__/ "}, 9: {"cat": "angry", "art": " >_< \n | | \n / \\ \n GRR! "}, 10: {"cat": "angry", "art": " .---. \n / >_< \\ \n | RAGE | \n '---' "}, 11: {"cat": "angry", "art": " #_# \n | | \n / \\ \n MAD! "}, 12: {"cat": "excited", "art": " o/ \n | \n / \\ \n WOW! "}, 13: {"cat": "excited", "art": " * * * \n * * * * \n * * * \n YAY! "}, 14: {"cat": "excited", "art": " .---. \n / ^_^ \\ \n | OMG! | \n '---' "}, 15: {"cat": "confused", "art": " ? \n ? ? \n ? \n (???) "}, 16: {"cat": "confused", "art": " .---. \n / ? ? \\ \n | hmmm | \n '---' "}, 17: {"cat": "confused", "art": " ~ ? ~ \n ~ ~ ~ ~ \n ~ ? ~ \n (lost) "}, 18: {"cat": "love", "art": " <3 <3 \n <3 <3 <3 \n <3 <3 \n "}, 19: {"cat": "love", "art": " .---. \n / <3 \\ \n | love | \n '---' "}, # === WEATHER (20-39) === 20: {"cat": "sun", "art": " / \\ \n O \n / \\ \n "}, 21: {"cat": "sun", "art": " * \n * O * \n * \n "}, 22: {"cat": "sun", "art": " / \\ \n --- \n / \\ \n "}, 23: {"cat": "rain", "art": " .-. \n ( ) \n '-' \n | | "}, 24: {"cat": "rain", "art": " ~~~ \n / / \n / / / \n "}, 25: {"cat": "rain", "art": " .---. \n / o o \\ \n | . | \n \\___/ "}, 26: {"cat": "cloud", "art": " .--. \n .( ). \n '----' \n "}, 27: {"cat": "cloud", "art": " .---. \n ( ) \n '---' \n "}, 28: {"cat": "cloud", "art": " ___ \n / \\ \n \\___/ \n "}, 29: {"cat": "snow", "art": " * * \n * * * * \n * * \n * * * * "}, 30: {"cat": "snow", "art": " .---. \n / i i \\ \n | . | \n \\___/ "}, 31: {"cat": "snow", "art": " * * \n * * * \n * * \n "}, 32: {"cat": "wind", "art": " ~ ~ ~ \n ~ ~ ~ ~ \n ~ ~ ~ \n "}, 33: {"cat": "wind", "art": " ---> \n ---> \n ---> \n "}, 34: {"cat": "wind", "art": " ~ ~ ~ \n ~ ~ ~ ~ \n ~ ~ ~ \n "}, 35: {"cat": "storm", "art": " .---. \n / Z Z \\ \n | ! | \n \\___/ "}, 36: {"cat": "storm", "art": " .---. \n / !!! \\ \n | !!! | \n \\___/ "}, 37: {"cat": "storm", "art": " .---. \n / ??? \\ \n | ??? | \n \\___/ "}, 38: {"cat": "hot", "art": " ( ) \n ( _ ) \n ) - ( \n "}, 39: {"cat": "hot", "art": " ,,, \n ,,,, \n heat! \n "}, # === OBJECTS (40-59) === 40: {"cat": "coffee", "art": " [_] \n | | \n '---' \n "}, 41: {"cat": "coffee", "art": " {---} \n | | \n '---' \n "}, 42: {"cat": "coffee", "art": " .---. \n | | \n '---' \n "}, 43: {"cat": "code", "art": " >_> \n { } \n [___] \n "}, 44: {"cat": "code", "art": " \n { } \n [ ] \n "}, 45: {"cat": "code", "art": " >_ >_ \n { } { } \n [_] [_] \n "}, 46: {"cat": "code", "art": " .---. \n / \\ \n | CODE| \n \\___/ "}, 47: {"cat": "music", "art": " o \n o o \n o o \n o o o "}, 48: {"cat": "music", "art": " |~|~| \n |~|~| \n |~|~| \n "}, 49: {"cat": "music", "art": " ooo \n ooo \n ooo \n "}, 50: {"cat": "heart", "art": " .---. \n / <3 \\ \n | love| \n \\___/ "}, 51: {"cat": "heart", "art": " <3 <3 \n <3 <3 <3 \n <3 <3 \n "}, 52: {"cat": "star", "art": " * \n * * \n * * * \n * * "}, 53: {"cat": "star", "art": " * \n * * \n * * * \n * * "}, 54: {"cat": "moon", "art": " .-. \n ( ) \n '-' \n "}, 55: {"cat": "moon", "art": " ) \n ( ) \n ( \n "}, 56: {"cat": "planet", "art": " .--. \n / \\ \n | () | \n \\__/ "}, 57: {"cat": "planet", "art": " ___ \n / \\ \n \\___/ \n "}, 58: {"cat": "rocket", "art": " /\\ \n / \\ \n / \\ \n / || \\ "}, 59: {"cat": "rocket", "art": " ^ \n /|\\ \n / | \\ \n "}, # === NATURE (60-79) === 60: {"cat": "tree", "art": " * \n *** \n ***** \n | "}, 61: {"cat": "tree", "art": " * \n *** \n ***** \n ***** "}, 62: {"cat": "flower", "art": " * \n *** \n | \n "}, 63: {"cat": "flower", "art": " (*) \n (***) \n (*) \n "}, 64: {"cat": "ocean", "art": " ~ ~ ~ \n ~ ~ ~ ~ \n ~ ~ ~ \n "}, 65: {"cat": "ocean", "art": " ~~~~~~ \n ~~~~~~~~ \n ~~~~~~ \n "}, 66: {"cat": "mountain", "art": " /\\ \n / \\ \n /____\\ \n "}, 67: {"cat": "mountain", "art": " /\\ \n / \\ \n / \\ \n /______\\"}, 68: {"cat": "desert", "art": " .--. \n / \\ \n '----' \n "}, 69: {"cat": "desert", "art": " .--. \n / \\ \n '----' \n "}, 70: {"cat": "fire", "art": " , \n ,) \n )) \n (( "}, 71: {"cat": "fire", "art": " ) ) \n ( /( ) \n )/ v( \n "}, 72: {"cat": "fire", "art": " ) \n ( ) \n ( ) \n ) ( "}, 73: {"cat": "water", "art": " . \n /|\\ \n / | \\ \n "}, 74: {"cat": "water", "art": " ~~~ \n ~ ~ ~ \n ~~~ \n "}, 75: {"cat": "earth", "art": " ___ \n / \\ \n | () | \n \\___/ "}, 76: {"cat": "earth", "art": " .--. \n / \\ \n | () | \n \\__/ "}, 77: {"cat": "leaf", "art": " . \n /| \n / | \n "}, 78: {"cat": "leaf", "art": " . \n /|\\ \n / | \\ \n "}, 79: {"cat": "mushroom", "art": " .---. \n / \\ \n | | \n '---' "}, # === TECH (80-99) === 80: {"cat": "computer", "art": " .---. \n / \\ \n | [ ] | \n '---' "}, 81: {"cat": "computer", "art": " .---. \n / [ ] \\ \n | | \n '---' "}, 82: {"cat": "phone", "art": " .---. \n | | \n | o | \n | | "}, 83: {"cat": "robot", "art": " .---. \n / o o \\ \n | - | \n \\___/ "}, 84: {"cat": "robot", "art": " .---. \n / ^ ^ \\ \n | w | \n \\___/ "}, 85: {"cat": "alien", "art": " .---. \n / * * \\ \n | ^ | \n \\___/ "}, 86: {"cat": "alien", "art": " .---. \n / * * \\ \n | v | \n \\___/ "}, 87: {"cat": "ghost", "art": " .---. \n / o o \\ \n | . | \n '-----' "}, 88: {"cat": "ghost", "art": " .---. \n / x x \\ \n | . | \n '-----' "}, 89: {"cat": "skull", "art": " .---. \n / x x \\ \n | ^ | \n '---' "}, 90: {"cat": "cat", "art": " /_\\ \n ( o.o ) \n > ^ < \n "}, 91: {"cat": "cat", "art": " /_\\ \n ( ^.^ ) \n > ^ < \n "}, 92: {"cat": "dog", "art": " /_\\ \n ( o.o ) \n > w < \n "}, 93: {"cat": "dog", "art": " /_\\ \n ( ^.^ ) \n > w < \n "}, 94: {"cat": "bear", "art": " .---. \n / o o \\ \n | ^ | \n \\___/ "}, 95: {"cat": "bird", "art": " __ \n / \\ \n / \\ \n "}, 96: {"cat": "bird", "art": " __ \n /^^\\ \n / \\ \n "}, 97: {"cat": "fish", "art": " <> \n <><> \n <> \n "}, 98: {"cat": "fish", "art": " <> \n <><> \n <> \n "}, 99: {"cat": "butterfly", "art": " /\\ /\\ \n \\/ \\/ \n || || \n "}, } def get_dream_by_id(dream_id): """Get LCD-optimized ASCII art by ID, normalized to 4 lines x 20 chars""" dream = DREAMS.get(dream_id % 100, DREAMS[0]) art = dream["art"] # Sanitize: replace backslash with forward slash (HD44780 ROM A00 can't display \) art = art.replace('\\', '/') # Normalize to exactly 4 lines, max 20 chars lines = art.split('\n') while len(lines) < 4: lines.append('') lines = lines[:4] # Truncate + right-pad each line normalized = [] for line in lines: line = line[:20].ljust(20) normalized.append(line) return '\n'.join(normalized) def get_dream_ids_by_category(category): """Get all dream IDs for a category""" return [did for did, d in DREAMS.items() if d["cat"] == category] def get_all_categories(): """Get all unique categories""" return list(set(d["cat"] for d in DREAMS.values())) def get_random_dream(): """Get a random dream""" return random.choice(list(DREAMS.values()))["art"] def get_dream_list_for_prompt(): """Get a compact list of all dreams for the LLM prompt""" lines = [] for did in sorted(DREAMS.keys()): cat = DREAMS[did]["cat"] lines.append(f"{did}: {cat}") return "\n".join(lines)