diff --git a/README.md b/README.md index 45090c6..a98efb5 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,15 @@ Eine Sammlung von Avataren für OpenClaw Agents. | ![Lexa](lexa.png) | **Lexa** | `lexa.png` | | ![Luxo](luxo.png) | **Luxo** | `luxo.png` | | ![Lyra](lyra.png) | **Lyra** | `lyra.png` | +| ![Mycroft](mycroft.png) | **Mycroft** | `mycroft.png` | +| ![Jarvis](jarvis.png) | **Jarvis** | `jarvis.png` | | ![Nova](nova.png) | **Nova** | `nova.png` | | ![Polo](polo.png) | **Polo** | `polo.png` | | ![Rex](rex.png) | **Rex** | `rex.png` | | ![Swift](swift.png) | **Swift** | `swift.png` | +| ![Homeserver](homeserver.png) | **Homeserver** | `homeserver.png` | +| ![Slohmaier](slohmaier.png) | **Slohmaier** | `slohmaier.png` | +| ![Akpolke](akpolke.png) | **Akpolke** | `akpolke.png` | ## Details diff --git a/akpolke.png b/akpolke.png new file mode 100644 index 0000000..64079ff Binary files /dev/null and b/akpolke.png differ diff --git a/generate_akpolke.py b/generate_akpolke.py new file mode 100644 index 0000000..88217de --- /dev/null +++ b/generate_akpolke.py @@ -0,0 +1,104 @@ +from PIL import Image + +BG = (26, 26, 46) +HAIR = (230, 200, 90) +HAIR_DARK = (200, 170, 70) +SKIN = (240, 210, 190) +SKIN_DARK = (215, 185, 165) +DRESS = (200, 60, 90) +DRESS_DARK = (165, 45, 70) +BLACK = (20, 20, 20) +WHITE = (240, 240, 240) +GRAY = (120, 125, 130) + +S = 32 +g = [[BG] * S for _ in range(S)] + +def rect(t, b, l, r, c): + for y in range(t, b + 1): + for x in range(l, r + 1): + g[y][x] = c + +def hline(y, l, r, c): + for x in range(l, r + 1): + g[y][x] = c + +def vline(x, t, b, c): + for y in range(t, b + 1): + g[y][x] = c + +# --- HAIR (rows 2-5), blonde, flowing --- +rect(2, 5, 12, 19, HAIR) +# hair sides framing face +vline(12, 3, 8, HAIR) +vline(19, 3, 8, HAIR) +# hair top shading +hline(2, 12, 19, HAIR_DARK) + +# --- FACE (rows 5-10), light skin --- +rect(5, 10, 13, 18, SKIN) +vline(13, 5, 10, SKIN_DARK) +vline(18, 5, 10, SKIN_DARK) + +# --- EYES (rows 7-8) --- +g[7][14] = BLACK; g[7][15] = BLACK +g[7][16] = BLACK; g[7][17] = BLACK +# eye glint +g[7][14] = WHITE; g[7][16] = WHITE + +# --- LIPS (row 9) --- +g[9][15] = DRESS_DARK; g[9][16] = DRESS_DARK + +# --- NECK (row 11) --- +rect(11, 11, 15, 16, SKIN_DARK) + +# --- DRESS / TORSO (rows 12-21), elegant model silhouette --- +rect(12, 21, 12, 19, DRESS) +vline(12, 12, 21, DRESS_DARK) +vline(19, 12, 21, DRESS_DARK) +# neckline +hline(12, 13, 18, DRESS_DARK) + +# --- ARMS (rows 12-19), slender --- +rect(12, 19, 9, 11, SKIN) +rect(12, 19, 20, 22, SKIN) +# hands +rect(18, 19, 9, 11, SKIN_DARK) +rect(18, 19, 20, 22, SKIN_DARK) + +# --- DRESS FLARE / SKIRT (rows 22-27) --- +rect(22, 27, 10, 21, DRESS) +vline(10, 22, 27, DRESS_DARK) +vline(21, 22, 27, DRESS_DARK) +# waist +hline(22, 11, 20, DRESS_DARK) + +# --- LEGS (rows 28-29), model legs --- +rect(28, 29, 13, 15, SKIN) +rect(28, 29, 16, 18, SKIN) + +# --- HEELS (row 30) --- +g[30][13] = BLACK; g[30][14] = BLACK +g[30][17] = BLACK; g[30][18] = BLACK + +# --- GROUND (row 31) --- +hline(31, 9, 22, GRAY) + +# Scale up +img = Image.new("RGBA", (256, 256), BG + (255,)) +pixels = img.load() +scale = 256 // S +for y in range(S): + for x in range(S): + c = g[y][x] + if c == BG: + continue + for dy in range(scale): + for dx in range(scale): + px = x * scale + dx + py = y * scale + dy + if 0 <= px < 256 and 0 <= py < 256: + pixels[px, py] = c + (255,) + +img.save("akpolke.png", "PNG", optimize=True) +print("Saved akpolke.png 256x256") diff --git a/generate_slohmaier.py b/generate_slohmaier.py new file mode 100644 index 0000000..44d8899 --- /dev/null +++ b/generate_slohmaier.py @@ -0,0 +1,105 @@ +from PIL import Image + +BG = (26, 26, 46) +SKIN = (150, 100, 70) +SKIN_DARK = (120, 80, 55) +SHIRT = (120, 60, 40) +SHIRT_DARK = (95, 45, 30) +PANTS = (40, 40, 50) +PANTS_DARK = (30, 30, 40) +BLACK = (20, 20, 20) +WHITE = (240, 240, 240) +RED = (200, 50, 50) +GRAY = (120, 125, 130) + +S = 32 +g = [[BG] * S for _ in range(S)] + +def rect(t, b, l, r, c): + for y in range(t, b + 1): + for x in range(l, r + 1): + g[y][x] = c + +def hline(y, l, r, c): + for x in range(l, r + 1): + g[y][x] = c + +def vline(x, t, b, c): + for y in range(t, b + 1): + g[y][x] = c + +# --- HEAD (rows 4-10), bald, brown skin --- +rect(4, 10, 13, 18, SKIN) +# face shading +vline(13, 4, 10, SKIN_DARK) +vline(18, 4, 10, SKIN_DARK) +# ears +g[5][12] = SKIN; g[6][12] = SKIN +g[5][19] = SKIN; g[6][19] = SKIN + +# --- SUNGLASSES (rows 6-8) --- +rect(6, 8, 13, 15, BLACK) +rect(6, 8, 16, 18, BLACK) +hline(7, 13, 18, BLACK) # bridge +# lens glint +g[6][14] = WHITE; g[6][17] = WHITE + +# --- MOUTH (row 9) --- +g[9][15] = SKIN_DARK; g[9][16] = SKIN_DARK + +# --- NECK (row 11) --- +rect(11, 11, 15, 16, SKIN_DARK) + +# --- TORSO / SHIRT (rows 12-21) --- +rect(12, 21, 11, 20, SHIRT) +vline(11, 12, 21, SHIRT_DARK) +vline(20, 12, 21, SHIRT_DARK) +# collar +hline(12, 12, 19, SHIRT_DARK) + +# --- ARMS (rows 12-19) --- +rect(12, 19, 8, 10, SHIRT) +rect(12, 19, 21, 23, SHIRT) +# hands +rect(18, 19, 8, 10, SKIN) +rect(18, 19, 21, 23, SKIN) + +# --- BLIND CANE (rows 12-30), held in right hand --- +# white cane with red tip, vertical line at x=24 +vline(24, 12, 28, WHITE) +vline(24, 29, 30, RED) +# hand grip on cane +g[18][24] = SKIN; g[19][24] = SKIN + +# --- PANTS (rows 22-28) --- +rect(22, 28, 12, 19, PANTS) +vline(12, 22, 28, PANTS_DARK) +vline(19, 22, 28, PANTS_DARK) +# legs split +vline(15, 22, 28, PANTS_DARK) + +# --- SHOES (rows 29-30) --- +rect(29, 30, 12, 15, BLACK) +rect(29, 30, 16, 19, BLACK) + +# --- GROUND (row 31) --- +hline(31, 8, 24, GRAY) + +# Scale up +img = Image.new("RGBA", (256, 256), BG + (255,)) +pixels = img.load() +scale = 256 // S +for y in range(S): + for x in range(S): + c = g[y][x] + if c == BG: + continue + for dy in range(scale): + for dx in range(scale): + px = x * scale + dx + py = y * scale + dy + if 0 <= px < 256 and 0 <= py < 256: + pixels[px, py] = c + (255,) + +img.save("slohmaier.png", "PNG", optimize=True) +print("Saved slohmaier.png 256x256") diff --git a/prompts.md b/prompts.md index ba3a74c..8b7c934 100644 --- a/prompts.md +++ b/prompts.md @@ -19,3 +19,21 @@ ## Polo — Homeserver Admin > 8-bit pixel art icon, dark background (#1a1a2e), a polo horse rider carrying a server rack like a polo mallet, with network cables as reins, red and steel grey palette, retro game sprite style, 256x256 + +## Mycroft — Stefans Voice/iOS-Assistent +> 8-bit pixel art icon, dark background (#1a1a2e), a retro studio microphone with sound-wave dots on both sides, steel grey and white with teal glow accents, retro game sprite style, 256x256 + +## Jarvis — Katis Assistent +> 8-bit pixel art icon, dark background (#1a1a2e), a glowing arc-reactor core with concentric cyan and gold rings around a white center, blue and gold palette, retro game sprite style, 256x256 + +## Homeserver — Accessible Dashboard Favicon +> 8-bit pixel art icon, dark background (#1a1a2e), a small house with a red triangular roof and a server rack inside, steel grey body with red indicator LEDs and drive bays, antenna on top, red and steel grey palette, retro game sprite style, 256x256 +> (Generated via Python Pillow, see generate_homeserver.py) + +## Slohmaier — Stefan +> 8-bit pixel art icon, dark background (#1a1a2e), a standing bald man with brown skin, black sunglasses and a white blind cane with red tip, brown shirt and dark pants, brown/black/white/red/grey palette, retro game sprite style, 256x256 +> (Generated via Python Pillow, see generate_slohmaier.py) + +## Akpolke — Kati +> 8-bit pixel art icon, dark background (#1a1a2e), a blonde model woman with flowing golden hair, light skin, elegant red dress with flared skirt and high heels, blonde/light-skin/red palette, retro game sprite style, 256x256 +> (Generated via Python Pillow, see generate_akpolke.py) diff --git a/slohmaier.png b/slohmaier.png new file mode 100644 index 0000000..9605b41 Binary files /dev/null and b/slohmaier.png differ