commit 97a27f9a426bc5730817ffcb7091faf437d9e890 Author: Gabrieal Jimmy Date: Thu Oct 1 15:15:20 2026 -0500 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7cd5d55 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Python +__pycache__/ +*.py[cod] +.venv/ +venv/ +.env/ + +# Secrets (OPENROUTER_API_KEY is read from the environment) +.env +.env.* +*.key +secrets* + +# Generated sprites (generate_sprite.py --out, default sprites/) +sprites/ +sample_out/ +test_out/ +test_out_colors/ +out/ + +# Generated contact sheets (preview.py, $PREVIEW_OUT defaults to preview/) +preview/ + +# Scratch reports +size_changes.txt + +# Real business logos used for local testing +test_logos/ +logos/ + +# Editor / OS +.vscode/ +.idea/ +*.swp +.DS_Store +Thumbs.db diff --git a/AI_PIXEL_ART_GUIDE.md b/AI_PIXEL_ART_GUIDE.md new file mode 100644 index 0000000..fc47532 --- /dev/null +++ b/AI_PIXEL_ART_GUIDE.md @@ -0,0 +1,108 @@ +# How to make good pixel art as an AI (no image model) + +This guide is for AI coding agents. It describes the method used to build the Henry pixel-art loading animations (`~/Documents/henry_pixel_art_animations`). No diffusion or image generation was involved: every pixel is written as code, rendered, looked at, and fixed. + +The reference implementation is in `henry_pixel_art_animations/src/lib/henry/`: `engine/` holds the drawing engine, `henry.ts` the mascot sprite, and `scenes/` one file per animation. + +--- + +## 1. Constraints first + +Hard limits are what make the result look like real pixel art instead of blurry clip art. Decide them before drawing anything. + +- **Tiny canvas.** Everything is drawn at a low logical resolution (Henry uses 160×120, 4:3), then upscaled. Never draw at screen resolution. +- **Whole pixels only.** Round every coordinate. Sub-pixel positions smear when scaled. +- **One fixed palette.** Use about 16 colours plus a few named extras. Henry uses Sweetie 16 by GrafxKid. Every scene uses only these colours, which is why they all look like one set. Ban ad-hoc hex values, or give each extra colour a name. +- **1px dark outline** (`ink`, the palette's darkest colour) around characters and props, so they read against any background. +- **Upscale with nearest-neighbour.** In canvas, set `imageSmoothingEnabled = false`; in CSS, use `image-rendering: pixelated`. For fractional display scales, use a "sharp bilinear" upscale: scale with nearest-neighbour to the next whole multiple, then do one smooth downscale to the exact size. Pixels then stay evenly sized. + +## 2. Sprites are text grids + +Write each sprite as an array of equal-length strings. Each character maps to a palette colour, and `.` is transparent. + +```ts +const PAL = { k: C.ink, w: C.down, h: C.downLight, s: C.downShade, e: C.ink, o: C.bill, O: C.billShade, f: C.bill }; + +const STAND = [ + '....kkkkk.....', + '...kwwwwwk....', + '..khwwwwwwk...', + '..khwwwwwwwk..', + '..kwwwwwwewk..', // e = eye + '..kwwwwwwewkk.', + '..kwwwwwwwwook', // o = bill + '..kswwwwwwwOk.', + // ... + '.....f..f.....', // feet + '.....ff.ff....', +]; +``` + +- **Validate.** Throw if any row has a different width. This catches most authoring mistakes. +- **Bake once.** Render each sprite once to a small offscreen canvas, plus a horizontally flipped copy, and `drawImage` those every frame. +- **Make new poses by editing rows, not redrawing.** A blink changes the eye cell. Breathing drops one row so the body squashes 1px. A crouch drops two rows. A stride swaps the feet rows. Keeping the head rows identical keeps the character on-model across every pose. +- **Reason row by row** about silhouette and symmetry while writing the grid. Get the outline right first, then add the fill, then one highlight colour and one shade colour. +- **Keep sprites small.** A 14×18 character is plenty; small sprites read more clearly and are easier to get right. + +## 3. Draw scenery procedurally + +Backgrounds are drawing commands, not grids. + +- **Primitives:** `rect`, `px`, a scanline `disc` (a filled circle with no antialiasing), `pill` (a rounded rectangle with 1px corner notches), `clip`, and `sprite`. +- **Dithering:** at colour band edges, use a checkerboard. For example, at a sky band edge, paint the previous band's colour where `(x + y) % 2 === 0`, fading over 2–4 rows. +- **Seeded randomness** for skylines, asphalt specks and windows, with a small PRNG such as `mulberry32(seed)`, so the scenery is identical every run. +- **Pre-render static layers** (background, foreground props) once into offscreen canvases. Each frame, draw only the moving things between them. +- **Layer order:** background, then far movers (clouds, birds, distant cars), then big actors (bus), then foreground props, then the character, then speech bubbles and effects. +- **Ambient life** keeps loops from feeling static: drifting clouds, a passing bird, cars, blinking, flickering lights. + +## 4. Animate with timers and state machines + +- **Phases.** Each animation is a small state machine, e.g. `intro → waiting (loops forever) → resolving → finished`. Each phase has its own timer. +- **Idle scheduler.** While waiting, the character randomly picks short "acts" (look around, tap foot, hop, think bubble), never the same act twice in a row, with random rests between. This prevents a visibly repeating loop. +- **Motion:** use easing functions (`easeOutCubic`, `easeOutBack`) and a parabolic `hop(t, height)`. Step frame animations by time (`Math.floor(t / 0.16) % 2`) or by distance travelled (wheels, walk cycles). +- **Cartoon cues:** a 1-frame pop on bubbles, dust puffs on landing, a squash before a jump, sparkles on success, wobble or shake for impact. +- **Clamp `dt`** to a range like 0–0.05 s, so a backgrounded tab doesn't fast-forward, and a negative first-frame delta can't break array indexing. +- **Transitions:** the iris (circle) wipe paints everything outside a circle with the palette's darkest colour, one scanline at a time so the edges stay crisp. It closes on the character's position and opens the next scene on its character. + +## 5. Render, look, fix — the step that matters most + +You cannot see the art while writing the character grids, so you must render it and inspect it. Never ship unviewed art. + +1. Run the app (e.g. a Vite dev server) and open it in a headless browser. +2. Grab frames from the canvas **inside one in-page script**, because headless tabs may freeze between tool calls: + ```js + // in page.evaluate: sample the canvas every 250 ms, trigger UI via setTimeout in the same script + const out = []; const c = document.querySelector('canvas'); + const id = setInterval(() => { out.push(c.toDataURL('image/png')); if (out.length > 40) { clearInterval(id); resolve(out); } }, 250); + ``` + For exact, repeatable checks, import the scene module directly in the page and step it with a fixed `dt = 1/60`, drawing to an offscreen canvas. +3. Write the frames as PNGs, then tile them into a contact sheet with ffmpeg. Always use nearest-neighbour scaling: + ```sh + ffmpeg -framerate 1 -i f%03d.png -vf "scale=160:120:flags=neighbor,crop=W:H:X:Y,scale=320:-1:flags=neighbor,tile=6x4" -frames:v 1 sheet.png + ``` +4. **Look at the image.** Crop and zoom to 4–10× on details such as the character, icons and contact points. Check whether: + - the silhouette reads, and the icon is recognisable; + - the motion reads across frames; + - things line up (feet on the ground, a bill touching a button, nothing clipping through a wall); + - the character is still visible when the iris closes. +5. Fix and repeat. Expect several rounds on anything important. Real fixes from this project: the bill was one pixel too narrow; the "walk" icon was a blob until it got a gap between head and body; a button was 2px too low for the bill to touch; a peeking pose showed the tail instead of the face until it was flipped. +6. For small icons, preview the grid by itself on a plain background at about 14× before placing it in the scene. + +## 6. Scaling up with multiple agents + +If several agents each build a scene, keep the style consistent: + +- **Write a shared guide first.** Cover the engine API, palette, layout constants, character sprite and helpers, the scene contract, style rules (outlines, dithering, ambient life), and the render-and-look verification loop. +- **Freeze the shared files** (engine, palette, character). Agents put scene-specific colours and poses in their own files, and build new poses from the shared character rows so the design never drifts. +- **Give each agent a way to open its scene directly,** e.g. `?scene=`, and a unique temp directory and browser tab. +- **Review every finished scene yourself.** Step each one with fixed timesteps across early, middle and late "done" triggers to catch crashes and scenes that never finish, then look at the contact sheets. + +## Checklist + +- [ ] Low fixed resolution, whole pixels, nearest-neighbour upscale +- [ ] One named palette; no stray colours +- [ ] 1px dark outlines on characters and props +- [ ] Sprites as text grids with validated widths; poses made by editing rows +- [ ] Procedural backgrounds with checkerboard dithering and seeded randomness +- [ ] State-machine animation, varied idle acts, ambient motion, clamped `dt` +- [ ] Rendered, sampled, contact-sheeted, zoomed and **looked at** — then fixed and checked again diff --git a/README.md b/README.md new file mode 100644 index 0000000..6344c6d --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# sprite_gen + +Procedural 96x96 creature sprites for businesses. You give it a business name and logo. It picks a type, builds a creature from parts and recolors it with the logo's brand colors. + +## Setup + +```bash +pip install -r requirements.txt +``` + +You only need an [OpenRouter](https://openrouter.ai) API key if you want the type picked automatically. Skip the key by passing `--type`. + +## Generate a sprite + +```bash +# Type picked from the business name +OPENROUTER_API_KEY= python generate_sprite.py "Rosas Landscaping" logos/rosas.png + +# Add a description to help pick the type +OPENROUTER_API_KEY= python generate_sprite.py "Rosas Landscaping" logos/rosas.png --desc "Lawn care and garden design" + +# Set the type yourself (no API key needed) +python generate_sprite.py "Rosas Landscaping" logos/rosas.png --type grass + +# Set the colors yourself instead of using a logo (main color first) +python generate_sprite.py "Rosas Landscaping" --type grass --colors "#2E7D32,#FBC02D" + +# A different creature for the same business +python generate_sprite.py "Rosas Landscaping" logos/rosas.png --type grass --reroll 1 +``` + +Each run writes `sprites/.png` (96x96), `sprites/@4x.png` and `sprites/.json` (type, parts, colors). With `--reroll N`, the file names end in `-rN`. + +| Option | Meaning | +|---|---| +| `--type T` | Skip the classifier. One of: normal fire water grass electric ice fighting poison ground flying psychic bug rock ghost dragon | +| `--desc TEXT` | Description sent to the classifier (default: the name) | +| `--colors "#main,#accent"` | Manual colors; overrides the logo | +| `--reroll N` | Alternate creature; the name alone always gives the same sprite | +| `--out DIR` | Output folder (default `sprites`) | +| `--scale N` | Size of the upscaled copy (default 4, `1` disables it) | + +Logo colors: transparent pixels, soft edge pixels and a solid white/black/gray background are ignored, and colored brand colors are used before white, black or gray. A logo with only white, black or gray in it still uses those colors. + +## Batch + +Use a CSV with the columns `name,logo,type,description`. Only `name` is required, and rows with no `type` use the classifier. + +```bash +OPENROUTER_API_KEY= python generate_sprite.py --batch businesses.csv --out sprites +``` + +## Editing the art + +The parts are text grids in `parts_src//.txt`, compiled to `parts//.png`. Weights, compatibility and deny lists live in `sprite_parts.py`. See `AI_PIXEL_ART_GUIDE.md` for the palette and anchor rules. + +```bash +python build_parts.py # compile all grids (or pass part names) +python validate_parts.py --sample 3000 # check colors, anchors, canvas fit on random composites +python preview.py bases # contact sheets in preview/ +python preview.py part back plant_bulb # one part on every base it fits +python preview.py zoom body=base_fox tail=tail_leaf +python generate_sprite.py --sprite-list SPRITES.md # regenerate the part list and weight report +``` + +Do not run `--make-placeholders --overwrite`, because it replaces the real art with test placeholders. diff --git a/SPRITES.md b/SPRITES.md new file mode 100644 index 0000000..e068153 --- /dev/null +++ b/SPRITES.md @@ -0,0 +1,319 @@ +# Sprite checklist + +**104 sprites** across 5 slots. Save each as `parts//.png`. + +## Art rules + +- Final canvas is 96x96. Sizes below are suggested part canvases; crop tight with transparency. +- Characters face left in a 3/4 view, light from the top-left. 1px outline, no anti-aliasing, no semi-transparent pixels. +- Draw only with the palette keys below. Any other color (eye white, pupils) is left as-is. + +| Key | Hex | Use | +|---|---|---| +| main_light | #FF8080 | body / most fur and skin | +| main_base | #FF0000 | body / most fur and skin | +| main_dark | #800000 | body / most fur and skin | +| accent_light | #80FF80 | horns, wings, beaks, crests, shells | +| accent_base | #00FF00 | horns, wings, beaks, crests, shells | +| accent_dark | #008000 | horns, wings, beaks, crests, shells | +| type_light | #8080FF | elemental bits: flames, leaves, sparks, ice, water | +| type_base | #0000FF | elemental bits: flames, leaves, sparks, ice, water | +| type_dark | #000080 | elemental bits: flames, leaves, sparks, ice, water | +| outline | #000000 | outline (recolored) | +| pupil | #141414 | not recolored | +| eye white | #FFFFFF | not recolored | + +### Anchor marker pixels + +One pixel each. `pivot` is where the part attaches to its parent; the others are where children attach. + +| Marker | Hex | Needed in | +|---|---|---| +| pivot | #FF00FF | every part (bodies: bottom center between the feet) | +| head_top | #FA00FF | all bodies (top of the head) | +| tail | #FD00FF | all bodies | +| back | #FC00FF | all bodies | +| aura | #FB00FF | all bodies (center of mass; belly patch centre) | + +## body (28) + +| Done | File | Size | Palette | Plans | Description | Most likely for | +|---|---|---|---|---|---|---| +| [ ] | `body/base_fox.png` | 42x36 | main | quadruped | Chibi fox/cat critter with cheek tufts, big pointed ears and a fluffy bib | fire, electric, psychic | +| [ ] | `body/base_cub.png` | 40x34 | main | quadruped | Chunky bear-cub on all fours, round ears, sturdy paws | ground, fighting, rock | +| [ ] | `body/base_pup.png` | 42x34 | main | quadruped | Bouncy puppy with floppy ears and a happy open mouth | normal, fire, fighting | +| [ ] | `body/base_salamander.png` | 47x27 | main | quadruped | Low chibi salamander/newt with a wide smile and frilly cheeks | fire, water, poison | +| [ ] | `body/base_drake.png` | 42x38 | main | quadruped | Cool baby dragon on four legs, nub horns, confident grin | dragon, fire, rock | +| [ ] | `body/base_fawn.png` | 42x35 | main | quadruped | Dainty chibi fawn in 3/4 view: big leaf ears, gentle eyes, spotted back | grass, ice, psychic | +| [ ] | `body/base_imp.png` | 40x40 | main | biped | Upright mouse-imp with big round ears and a cheeky fanged grin | electric, normal, psychic | +| [ ] | `body/base_brawler.png` | 42x43 | main | biped | Stout little fighter with big fists and a determined face | fighting, ground, rock | +| [ ] | `body/base_bunny.png` | 36x45 | main | biped | Upright chibi bunny with long ears and a fluffy chest | normal, grass, ice | +| [ ] | `body/base_dino.png` | 36x44 | main | biped | Little upright dino with a big head, tiny arms and a toothy grin | dragon, fire, ground | +| [ ] | `body/base_pixie.png` | 42x39 | main | biped | Leaf-elf pixie with sweeping pointed ears, round torso, stubby legs and a mischievous grin | psychic, ghost, grass | +| [ ] | `body/base_chick.png` | 36x35 | main | avian | Egg-round chick with a feather tuft, wing nubs and a tiny beak | normal, ice, water | +| [ ] | `body/base_owl.png` | 36x36 | main | avian | Round owlet with huge eyes and ear tufts | psychic, flying, ghost | +| [ ] | `body/base_hawk.png` | 38x37 | main | avian | Cool young hawk, puffed chest, sharp brow and hooked beak | flying, fire, fighting | +| [ ] | `body/base_penguin.png` | 36x38 | main | avian | Chubby penguin chick with flipper wings and a bib | ice, water, normal | +| [ ] | `body/base_guppy.png` | 46x33 | main | aquatic | Round bubbly fish with big eyes and frilly fins | water, ice, poison | +| [ ] | `body/base_otter.png` | 49x30 | main | aquatic | Chubby seal/otter pup lying on its flippers | water, ice, normal | +| [ ] | `body/base_axolotl.png` | 51x30 | main | aquatic | Smiling axolotl with feathery gill fronds | water, poison, dragon | +| [ ] | `body/base_noodle.png` | 44x40 | main | serpentine | Cute coiled snake with a big round head and a sly smile | poison, ground, normal | +| [ ] | `body/base_eel.png` | 45x46 | main | serpentine | Rising sea-serpent with fin frills and big eyes | water, ice, electric | +| [ ] | `body/base_wyrm.png` | 43x44 | main | serpentine | Cool coiled young wyrm with whisker barbels and a proud look | dragon, ghost, ice | +| [ ] | `body/base_blob.png` | 40x33 | main | blob | Squishy mochi blob with a curl on top and a big smile | normal, grass, ice | +| [ ] | `body/base_slime.png` | 40x34 | main | blob | Drippy goo blob with a cheeky tongue-out face | poison, water, ghost | +| [ ] | `body/base_wisp.png` | 36x40 | main | blob | Floating ghost wisp with a curly tail-end and a spooky-cute grin | ghost, psychic, fire | +| [ ] | `body/base_pebble.png` | 38x32 | main | blob | Round rock lump creature with a sturdy little face and stubby feet | rock, ground, fighting | +| [ ] | `body/base_beetle.png` | 42x30 | main | insectoid | Round shiny beetle bug with a horn and stubby legs | bug, ground, rock | +| [ ] | `body/base_grub.png` | 44x27 | main | insectoid | Plump caterpillar with a big happy face and tufted segments | bug, grass, poison | +| [ ] | `body/base_bee.png` | 38x35 | main | insectoid | Fuzzy round bee/bug with tiny wings and antennae | bug, fighting, flying | + +## head_top (23) + +| Done | File | Size | Palette | Plans | Description | Most likely for | +|---|---|---|---|---|---|---| +| [ ] | `head_top/ears_pointed.png` | 16x14 | main | all | Pair of tall pointed ears | electric, normal, fire | +| [ ] | `head_top/ears_round.png` | 16x14 | main | all | Pair of round mouse/bear ears | normal, electric, ice | +| [ ] | `head_top/ears_long.png` | 18x20 | main | all | Long rabbit ears (drawn behind the creature) | normal, psychic, grass | +| [ ] | `head_top/ears_floppy.png` | 26x12 | main | all | Droopy hanging ears (drawn behind the creature) | normal, water, ground | +| [ ] | `head_top/ears_bolt.png` | 16x14 | main | all | Zigzag lightning-bolt ears, type-colored tips | electric, normal, fire | +| [ ] | `head_top/ears_fin.png` | 16x14 | accent | all | Fin-shaped ear frills | water, ice, dragon | +| [ ] | `head_top/horn_single.png` | 10x14 | accent | all | One forehead horn (rhino/beetle) | ground, bug, rock | +| [ ] | `head_top/horns_ram.png` | 26x14 | accent | all | Curled ram horns | ground, rock, fighting | +| [ ] | `head_top/horns_dragon.png` | 22x16 | accent | all | Swept-back dragon horns | dragon, fire, ghost | +| [ ] | `head_top/antennae.png` | 16x16 | main | all | Two thin antennae with tips | bug, electric, psychic | +| [ ] | `head_top/crest_feather.png` | 16x14 | accent | all | Swept feather crest | flying, fire, fighting | +| [ ] | `head_top/crest_flame.png` | 16x14 | type | all | Flickering flame on top of head | fire, normal, water | +| [ ] | `head_top/leaf_sprout.png` | 14x14 | type | all | Leaf/sprout growing from head | grass, normal, fire | +| [ ] | `head_top/flower_bloom.png` | 16x14 | accent | all | Small flower on head | grass, poison, psychic | +| [ ] | `head_top/mushroom_cap.png` | 20x12 | accent | all | Mushroom cap worn like a hat | poison, grass, bug | +| [ ] | `head_top/ice_crown.png` | 18x12 | type | all | Ring of small icicles | ice, normal, fire | +| [ ] | `head_top/crystal_spikes.png` | 16x14 | accent | all | Cluster of crystal shards | rock, ice, psychic | +| [ ] | `head_top/gem_forehead.png` | 8x8 | accent | all | Gem set in forehead | psychic, dragon, rock | +| [ ] | `head_top/spiky_hair.png` | 20x12 | main | all | Spiky tuft of fur/hair | electric, fighting, poison | +| [ ] | `head_top/headband.png` | 24x10 | accent | all | Tied headband with trailing ends | fighting, normal, fire | +| [ ] | `head_top/wisp_flame.png` | 16x14 | type | all | Ghostly floating flame wisp | ghost, fire, psychic | +| [ ] | `head_top/water_spout.png` | 16x14 | type | all | Water droplet/fountain crest | water, ice, normal | +| [ ] | `head_top/cloud_tuft.png` | 20x12 | type | all | Puffy cloud tuft | flying, electric, ice | + +## back (22) + +| Done | File | Size | Palette | Plans | Description | Most likely for | +|---|---|---|---|---|---|---| +| [ ] | `back/wings_feather.png` | 44x30 | accent | avian, biped, quadruped | Full feathered wings, spread | flying, fire, normal | +| [ ] | `back/wings_feather_small.png` | 30x14 | accent | avian, biped, quadruped, blob | Tiny stubby wings | flying, normal, ice | +| [ ] | `back/wings_bat.png` | 44x26 | accent | biped, quadruped, avian, blob, serpentine | Membrane bat wings | poison, ghost, flying | +| [ ] | `back/wings_bug.png` | 40x28 | accent | insectoid, biped, blob | Translucent veined insect wings | bug, grass, poison | +| [ ] | `back/wings_dragon.png` | 48x32 | accent | quadruped, biped, serpentine | Large clawed dragon wings | dragon, fire, flying | +| [ ] | `back/shell_round.png` | 40x26 | accent | quadruped, biped, aquatic | Domed turtle shell | water, ground, rock | +| [ ] | `back/shell_spiked.png` | 40x28 | accent | quadruped, biped, insectoid | Armored shell with spikes | rock, ground, water | +| [ ] | `back/spikes_back.png` | 36x14 | accent | quadruped, biped, serpentine, aquatic, blob | Row of spikes along the spine | ground, poison, rock | +| [ ] | `back/sail_fin.png` | 34x20 | accent | quadruped, biped, serpentine | Tall dimetrodon-style back sail | fire, dragon, water | +| [ ] | `back/dorsal_fin.png` | 20x16 | accent | aquatic, serpentine, quadruped | Shark-style dorsal fin | water, ice, dragon | +| [ ] | `back/plant_bulb.png` | 30x26 | type | quadruped, biped, blob | Large seed pod/bulb with leaves | grass, poison, normal | +| [ ] | `back/leaf_cape.png` | 38x20 | type | quadruped, biped, serpentine, insectoid | Overlapping leaves along the back | grass, bug, flying | +| [ ] | `back/flower_back.png` | 32x26 | accent | quadruped, biped, blob | Big blooming flower | grass, poison, psychic | +| [ ] | `back/mushroom_back.png` | 30x22 | accent | quadruped, insectoid, blob | Cluster of mushrooms growing on back | grass, poison, bug | +| [ ] | `back/flame_mane.png` | 36x28 | type | quadruped, biped | Mane/collar of fire | fire, dragon, normal | +| [ ] | `back/crystal_cluster.png` | 30x24 | accent | quadruped, biped, blob, serpentine | Crystals jutting from back | rock, ice, psychic | +| [ ] | `back/rock_plates.png` | 38x20 | accent | quadruped, biped, serpentine | Boulder armor plates | rock, ground, fighting | +| [ ] | `back/icicle_spikes.png` | 29x24 | type | quadruped, biped, aquatic, avian, blob | Tight fan of icicles rising from the back | ice, water, normal | +| [ ] | `back/mane_fluffy.png` | 34x26 | main | quadruped, biped | Big fluffy fur collar/mane | normal, fighting, electric | +| [ ] | `back/coil_spikes.png` | 26x24 | type | quadruped, biped, blob, insectoid | Chunky coil/battery prongs with a spark | electric, normal, fire | +| [ ] | `back/cloud_puffs.png` | 30x20 | type | blob, avian, quadruped, serpentine | Fluffy cloud hugging the back | flying, ice, psychic | +| [ ] | `back/ghost_tatters.png` | 26x24 | accent | biped, blob, serpentine, avian | Short ghostly shroud draped from the shoulders | ghost, poison, psychic | + +## tail (17) + +| Done | File | Size | Palette | Plans | Description | Most likely for | +|---|---|---|---|---|---|---| +| [ ] | `tail/tail_stub.png` | 10x10 | main | quadruped, biped, avian | Short round stub tail | normal, ice, ground | +| [ ] | `tail/tail_fluffy.png` | 26x20 | main | quadruped, biped | Big fluffy fox/squirrel tail | normal, ice, electric | +| [ ] | `tail/tail_long_thin.png` | 30x12 | main | quadruped, biped | Long thin tail with tuft | psychic, normal, electric | +| [ ] | `tail/tail_curly.png` | 16x16 | main | quadruped, biped | Spiral curly tail | normal, psychic, grass | +| [ ] | `tail/tail_flame_tip.png` | 28x20 | type | quadruped, biped, serpentine | Tail ending in a flame | fire, normal, water | +| [ ] | `tail/tail_lightning.png` | 26x22 | type | quadruped, biped | Zigzag lightning-bolt tail | electric, normal, fire | +| [ ] | `tail/tail_leaf.png` | 24x16 | type | quadruped, biped, insectoid, serpentine | Tail ending in a big leaf | grass, bug, normal | +| [ ] | `tail/tail_fish_fin.png` | 22x22 | accent | aquatic, serpentine, quadruped, biped | Forked fish/mermaid tail fin | water, ice, dragon | +| [ ] | `tail/tail_club.png` | 28x16 | main | quadruped, biped | Heavy club-ended tail | rock, ground, fighting | +| [ ] | `tail/tail_spiked.png` | 28x14 | main | quadruped, biped, serpentine | Tail with spikes | ground, rock, dragon | +| [ ] | `tail/tail_stinger.png` | 22x18 | accent | insectoid, serpentine, quadruped, biped | Curved stinger tail | poison, bug, normal | +| [ ] | `tail/tail_feather_fan.png` | 22x22 | accent | avian, biped | Fanned tail feathers | flying, fire, psychic | +| [ ] | `tail/tail_wispy.png` | 24x16 | main | blob, serpentine, biped, avian | Fading smoky wisp tail | ghost, psychic, fire | +| [ ] | `tail/tail_ice_shard.png` | 24x16 | type | quadruped, biped, aquatic, serpentine | Tail ending in an ice shard | ice, normal, fire | +| [ ] | `tail/tail_dragon.png` | 30x16 | main | quadruped, biped, serpentine | Thick tapered tail with small fin | dragon, fire, ground | +| [ ] | `tail/tail_rattle.png` | 14x12 | accent | serpentine | Rattlesnake rattle tip | poison, ground, normal | +| [ ] | `tail/tail_crystal.png` | 24x16 | accent | quadruped, biped, serpentine | Tail tipped with a crystal | psychic, rock, ice | + +## aura (14) + +| Done | File | Size | Palette | Plans | Description | Most likely for | +|---|---|---|---|---|---|---| +| [ ] | `aura/aura_embers.png` | 84x84 | type | all | Floating embers | fire | +| [ ] | `aura/aura_sparks.png` | 84x84 | type | all | Crackling sparks | electric | +| [ ] | `aura/aura_bubbles.png` | 84x84 | type | all | Rising bubbles | water, poison | +| [ ] | `aura/aura_leaves.png` | 84x84 | type | all | Drifting leaves | grass, flying, bug | +| [ ] | `aura/aura_snowflakes.png` | 84x84 | type | all | Snowflakes | ice | +| [ ] | `aura/aura_wisps.png` | 84x84 | type | all | Ghost wisps | ghost, psychic | +| [ ] | `aura/aura_rings.png` | 84x84 | type | all | Psychic rings/ripples | psychic | +| [ ] | `aura/aura_dust.png` | 84x84 | type | all | Dust cloud at the feet | ground, rock, fighting | +| [ ] | `aura/aura_toxic.png` | 84x84 | type | all | Toxic bubbles and drips | poison | +| [ ] | `aura/aura_sparkle.png` | 84x84 | type | all | Twinkling sparkles | dragon, normal, psychic | +| [ ] | `aura/aura_gusts.png` | 84x84 | type | all | Wind swirls | flying, dragon | +| [ ] | `aura/aura_pebbles.png` | 84x84 | type | all | Floating pebbles | rock, ground, psychic | +| [ ] | `aura/aura_power.png` | 84x84 | type | all | Power-up energy lines | fighting | +| [ ] | `aura/aura_spores.png` | 84x84 | type | all | Floating spores | bug, grass, poison | + +## Simulated pick rates per type + +From 3,000 random seeds per type. Use this to spot parts that never show up or show up too much. + +### Normal + +- **Body plan:** quadruped 41%, biped 32%, avian 15%, blob 8%, serpentine 4% +- **body:** base_pup 18%, base_bunny 14%, base_imp 12%, base_chick 9%, base_fox 8%, base_cub 8%, base_blob 7%, base_fawn 4% +- **head_top:** none 61%, spiky_hair 9%, horns_ram 8%, headband 6%, horn_single 3%, ears_round 2%, ears_floppy 2%, flower_bloom 1% +- **back:** none 47%, mane_fluffy 17%, wings_feather_small 13%, wings_feather 8%, cloud_puffs 6%, coil_spikes 2%, spikes_back 2% +- **tail:** none 36%, tail_stub 23%, tail_fluffy 15%, tail_curly 12%, tail_long_thin 7%, tail_feather_fan 3%, tail_rattle 1% +- **aura:** none 100% +- **markings:** none 42%, belly 31%, spots 15%, speckles 12% + +### Fire + +- **Body plan:** quadruped 43%, biped 26%, avian 12%, serpentine 11%, blob 8% +- **body:** base_dino 18%, base_pup 11%, base_salamander 11%, base_fox 10%, base_drake 10%, base_hawk 9%, base_wisp 5%, base_wyrm 4% +- **head_top:** crest_flame 53%, none 15%, wisp_flame 10%, horns_dragon 5%, spiky_hair 5%, crest_feather 4%, ears_pointed 2%, horn_single 1% +- **back:** none 34%, flame_mane 19%, sail_fin 14%, wings_dragon 10%, spikes_back 7%, wings_feather 6%, mane_fluffy 5%, wings_feather_small 2% +- **tail:** none 68%, tail_flame_tip 15%, tail_feather_fan 5%, tail_dragon 3%, tail_wispy 3%, tail_stub 2%, tail_fluffy 2%, tail_long_thin 1% +- **aura:** none 100% +- **markings:** none 58%, belly 29%, spots 9%, speckles 5% + +### Water + +- **Body plan:** aquatic 43%, serpentine 22%, quadruped 16%, biped 12%, blob 8% +- **body:** base_eel 19%, base_guppy 16%, base_otter 14%, base_axolotl 12%, base_salamander 8%, base_slime 6%, base_dino 6%, base_pup 4% +- **head_top:** water_spout 48%, none 26%, ears_fin 11%, horn_single 3%, spiky_hair 2%, horns_ram 1%, horns_dragon 1%, flower_bloom 1% +- **back:** none 41%, dorsal_fin 37%, icicle_spikes 6%, shell_round 6%, sail_fin 4%, shell_spiked 2%, spikes_back 1%, wings_feather_small 1% +- **tail:** none 72%, tail_fish_fin 14%, tail_dragon 7%, tail_rattle 1% +- **aura:** none 100% +- **markings:** none 48%, spots 25%, belly 23%, speckles 4% + +### Grass + +- **Body plan:** quadruped 38%, biped 28%, blob 18%, insectoid 9%, serpentine 8% +- **body:** base_fawn 19%, base_bunny 15%, base_blob 14%, base_cub 9%, base_pixie 9%, base_grub 8%, base_noodle 6%, base_salamander 4% +- **head_top:** leaf_sprout 42%, flower_bloom 26%, mushroom_cap 15%, none 10%, ears_long 1% +- **back:** leaf_cape 31%, plant_bulb 29%, flower_back 17%, none 9%, mushroom_back 9%, wings_bug 4% +- **tail:** none 87%, tail_leaf 11%, tail_curly 1% +- **aura:** none 100% +- **markings:** none 48%, spots 37%, belly 12%, speckles 4% + +### Electric + +- **Body plan:** quadruped 38%, biped 28%, blob 18%, insectoid 9%, avian 8% +- **body:** base_fox 26%, base_imp 22%, base_blob 12%, base_bee 6%, base_chick 5%, base_drake 2%, base_fawn 2%, base_pup 2% +- **head_top:** none 23%, cloud_tuft 23%, spiky_hair 22%, antennae 15%, ears_pointed 4%, horn_single 2%, ears_bolt 2%, ears_round 2% +- **back:** coil_spikes 33%, none 33%, mane_fluffy 10%, cloud_puffs 9%, wings_bug 5%, sail_fin 4%, wings_feather_small 2%, wings_feather 1% +- **tail:** none 73%, tail_lightning 13%, tail_long_thin 5%, tail_fluffy 4%, tail_stub 2%, tail_curly 1% +- **aura:** none 100% +- **markings:** none 54%, spots 29%, belly 14%, speckles 4% + +### Ice + +- **Body plan:** quadruped 28%, aquatic 19%, biped 18%, avian 13%, blob 13%, serpentine 9% +- **body:** base_fawn 14%, base_otter 12%, base_bunny 12%, base_blob 10%, base_fox 9%, base_penguin 8%, base_guppy 7%, base_eel 6% +- **head_top:** ice_crown 52%, none 13%, cloud_tuft 10%, crystal_spikes 10%, water_spout 5%, horn_single 1%, ears_fin 1%, ears_round 1% +- **back:** icicle_spikes 50%, none 18%, crystal_cluster 12%, spikes_back 6%, cloud_puffs 5%, dorsal_fin 4%, mane_fluffy 2%, wings_feather_small 1% +- **tail:** none 77%, tail_ice_shard 14%, tail_stub 3%, tail_crystal 2%, tail_fluffy 1% +- **aura:** none 100% +- **markings:** none 49%, belly 24%, speckles 20%, spots 6% + +### Fighting + +- **Body plan:** biped 75%, quadruped 20%, insectoid 5% +- **body:** base_brawler 61%, base_cub 10%, base_pup 7%, base_dino 4%, base_bee 4%, base_bunny 4%, base_imp 3%, base_pixie 3% +- **head_top:** headband 38%, none 20%, horns_ram 16%, horn_single 15%, spiky_hair 7% +- **back:** none 42%, mane_fluffy 23%, shell_spiked 11%, rock_plates 10%, spikes_back 2%, shell_round 2%, wings_feather 2%, wings_feather_small 2% +- **tail:** none 72%, tail_club 12%, tail_stub 4%, tail_long_thin 3%, tail_fluffy 3%, tail_curly 2%, tail_spiked 1% +- **aura:** none 100% +- **markings:** none 58%, belly 29%, spots 9%, speckles 5% + +### Poison + +- **Body plan:** blob 32%, serpentine 24%, quadruped 15%, biped 15%, insectoid 14% +- **body:** base_slime 27%, base_noodle 21%, base_salamander 10%, base_grub 10%, base_pixie 9%, base_beetle 3%, base_wisp 2%, base_dino 2% +- **head_top:** mushroom_cap 29%, none 19%, flower_bloom 15%, horn_single 12%, spiky_hair 12%, antennae 5%, ears_pointed 1%, horns_ram 1% +- **back:** none 30%, spikes_back 15%, mushroom_back 11%, plant_bulb 10%, flower_back 10%, wings_bat 10%, wings_bug 8%, ghost_tatters 2% +- **tail:** none 72%, tail_stinger 13%, tail_rattle 7%, tail_spiked 4%, tail_long_thin 2% +- **aura:** none 100% +- **markings:** none 48%, spots 37%, belly 12%, speckles 4% + +### Ground + +- **Body plan:** quadruped 48%, biped 29%, serpentine 18%, insectoid 4% +- **body:** base_cub 32%, base_noodle 16%, base_brawler 15%, base_dino 10%, base_drake 7%, base_beetle 3%, base_salamander 2%, base_fawn 2% +- **head_top:** horn_single 35%, none 34%, horns_ram 18%, spiky_hair 2%, flower_bloom 2%, mushroom_cap 1%, leaf_sprout 1% +- **back:** spikes_back 26%, none 22%, rock_plates 19%, shell_spiked 15%, shell_round 14% +- **tail:** none 62%, tail_club 13%, tail_spiked 12%, tail_stub 3%, tail_dragon 3%, tail_rattle 3% +- **aura:** none 100% +- **markings:** none 42%, speckles 33%, belly 20%, spots 5% + +### Flying + +- **Body plan:** avian 71%, insectoid 10%, quadruped 10%, serpentine 9% +- **body:** base_hawk 35%, base_owl 21%, base_chick 14%, base_bee 8%, base_eel 3%, base_wyrm 3%, base_noodle 3%, base_drake 2% +- **head_top:** cloud_tuft 51%, none 35%, crest_feather 5%, flower_bloom 2%, leaf_sprout 1%, horn_single 1% +- **back:** cloud_puffs 46%, wings_feather_small 24%, none 15%, wings_feather 9%, leaf_cape 4% +- **tail:** none 72%, tail_feather_fan 24%, tail_stub 2% +- **aura:** none 100% +- **markings:** none 69%, belly 17%, spots 9%, speckles 5% + +### Psychic + +- **Body plan:** biped 39%, quadruped 29%, blob 18%, avian 14% +- **body:** base_pixie 18%, base_wisp 14%, base_fox 13%, base_fawn 12%, base_owl 12%, base_bunny 9%, base_imp 9%, base_cub 2% +- **head_top:** gem_forehead 44%, none 14%, flower_bloom 12%, antennae 7%, wisp_flame 6%, crystal_spikes 4%, ears_long 3%, ears_pointed 2% +- **back:** none 31%, crystal_cluster 28%, cloud_puffs 9%, flower_back 7%, ghost_tatters 6%, wings_bug 5%, wings_bat 5%, wings_feather_small 3% +- **tail:** none 72%, tail_crystal 6%, tail_long_thin 6%, tail_curly 5%, tail_wispy 4%, tail_fluffy 3%, tail_stub 2%, tail_feather_fan 1% +- **aura:** none 100% +- **markings:** none 69%, belly 17%, spots 9%, speckles 5% + +### Bug + +- **Body plan:** insectoid 83%, serpentine 11%, avian 6% +- **body:** base_grub 29%, base_beetle 28%, base_bee 26%, base_eel 4%, base_noodle 4%, base_wyrm 3%, base_penguin 2%, base_hawk 1% +- **head_top:** antennae 31%, mushroom_cap 22%, none 22%, horn_single 20% +- **back:** wings_bug 31%, none 29%, mushroom_back 21%, leaf_cape 18% +- **tail:** none 86%, tail_stinger 9%, tail_leaf 4% +- **aura:** none 100% +- **markings:** none 54%, spots 29%, belly 14%, speckles 4% + +### Rock + +- **Body plan:** quadruped 32%, biped 31%, blob 19%, serpentine 19% +- **body:** base_brawler 22%, base_cub 16%, base_pebble 16%, base_drake 10%, base_wyrm 7%, base_noodle 6%, base_eel 6%, base_pixie 2% +- **head_top:** none 23%, horn_single 22%, horns_ram 17%, gem_forehead 17%, crystal_spikes 12%, spiky_hair 2% +- **back:** crystal_cluster 27%, rock_plates 19%, spikes_back 18%, none 15%, shell_spiked 11%, shell_round 6%, wings_dragon 1% +- **tail:** none 73%, tail_spiked 9%, tail_crystal 8%, tail_club 7%, tail_stub 1% +- **aura:** none 100% +- **markings:** none 46%, speckles 36%, belly 11%, spots 6% + +### Ghost + +- **Body plan:** blob 65%, serpentine 20%, biped 10%, avian 5% +- **body:** base_wisp 50%, base_wyrm 17%, base_slime 10%, base_pixie 6%, base_owl 4%, base_pebble 3%, base_blob 3%, base_imp 2% +- **head_top:** wisp_flame 44%, none 21%, mushroom_cap 8%, gem_forehead 7%, horns_dragon 6%, ears_pointed 3%, ears_round 2%, horn_single 1% +- **back:** ghost_tatters 40%, none 29%, wings_bat 26%, mushroom_back 3% +- **tail:** none 84%, tail_wispy 14% +- **aura:** none 100% +- **markings:** none 69%, belly 17%, spots 9%, speckles 5% + +### Dragon + +- **Body plan:** serpentine 39%, quadruped 29%, biped 27%, avian 4% +- **body:** base_wyrm 25%, base_dino 21%, base_drake 18%, base_eel 12%, base_salamander 8%, base_hawk 2%, base_brawler 2%, base_imp 2% +- **head_top:** none 30%, gem_forehead 29%, horns_dragon 23%, horn_single 7%, ears_fin 2%, spiky_hair 2%, flower_bloom 2% +- **back:** none 28%, wings_dragon 25%, sail_fin 14%, spikes_back 14%, wings_bat 10%, dorsal_fin 3%, flame_mane 1% +- **tail:** none 57%, tail_dragon 23%, tail_spiked 11%, tail_fish_fin 3%, tail_stub 2% +- **aura:** none 100% +- **markings:** none 58%, belly 29%, spots 9%, speckles 5% diff --git a/build_parts.py b/build_parts.py new file mode 100755 index 0000000..494e9c4 --- /dev/null +++ b/build_parts.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +""" +Compile text-grid part sources into palette-key PNGs. + +Sources live in parts_src//.txt and compile to parts//.png. +Every non-blank line is one pixel row; lines starting with '#' are comments. All rows +must be the same width. + +Legend + . transparent o outline + 1 main_light 2 main_base 3 main_dark + a accent_light b accent_base c accent_dark + x type_light y type_base z type_dark + w white p pupil + P pivot T tail B back A aura ^ head_top + +Layout sources (parts_src//.layout) assemble stamps onto a fixed canvas, +used for the 84x84 auras: + size 84 84 + stamp [flip] # parts_src//stamps/.txt, top-left at x,y + marker # e.g. "marker P 42 42" +Later stamps paint over earlier ones; '.' in a stamp never paints. + +Usage + python build_parts.py # build everything + python build_parts.py body/quad_slim # build some parts + python build_parts.py mirror FILE # print FILE + its horizontal mirror (shared center column) + python build_parts.py mirror FILE --gap N # mirror with N transparent columns between halves + python build_parts.py flip FILE # print FILE flipped horizontally +""" +import os +import sys +from pathlib import Path + +from PIL import Image + +from generate_sprite import KEYS, MARKERS, PUPIL, EYE_WHITE + +# PARTS_SRC / PARTS_DIR let experiments build into a separate library (e.g. proto/). +SRC = Path(os.environ.get("PARTS_SRC", "parts_src")) +OUT = Path(os.environ.get("PARTS_DIR", "parts")) + +LEGEND = { + "o": KEYS["outline"], + "1": KEYS["main_light"], "2": KEYS["main_base"], "3": KEYS["main_dark"], + "a": KEYS["accent_light"], "b": KEYS["accent_base"], "c": KEYS["accent_dark"], + "x": KEYS["type_light"], "y": KEYS["type_base"], "z": KEYS["type_dark"], + "w": EYE_WHITE, "p": PUPIL, + "P": MARKERS["pivot"], "T": MARKERS["tail"], "B": MARKERS["back"], + "A": MARKERS["aura"], "^": MARKERS["head_top"], +} + + +class SourceError(Exception): + pass + + +def read_grid(path): + rows = [] + for n, line in enumerate(Path(path).read_text().splitlines(), 1): + line = line.rstrip() + if not line or line.startswith("#"): + continue + bad = sorted({c for c in line if c != "." and c not in LEGEND}) + if bad: + raise SourceError(f"{path}:{n}: unknown characters {bad}") + rows.append(line) + if not rows: + raise SourceError(f"{path}: empty grid") + widths = {len(r) for r in rows} + if len(widths) != 1: + for n, r in enumerate(rows): + if len(r) != len(rows[0]): + raise SourceError(f"{path}: row {n} is {len(r)} wide, row 0 is {len(rows[0])}") + return rows + + +def paint(canvas, rows, x0, y0, flip=False): + for y, row in enumerate(rows): + if flip: + row = row[::-1] + for x, c in enumerate(row): + if c == ".": + continue + px, py = x0 + x, y0 + y + if not (0 <= px < len(canvas[0]) and 0 <= py < len(canvas)): + raise SourceError(f"stamp pixel ({px},{py}) outside canvas") + canvas[py][px] = c + + +def read_layout(path): + path = Path(path) + canvas = None + for n, line in enumerate(path.read_text().splitlines(), 1): + parts = line.split("#")[0].split() + if not parts: + continue + cmd, args = parts[0], parts[1:] + try: + if cmd == "size": + w, h = int(args[0]), int(args[1]) + canvas = [["."] * w for _ in range(h)] + elif cmd == "stamp": + rows = read_grid(path.parent / "stamps" / f"{args[0]}.txt") + paint(canvas, rows, int(args[1]), int(args[2]), flip=len(args) > 3 and args[3] == "flip") + elif cmd == "marker": + paint(canvas, [args[0]], int(args[1]), int(args[2])) + else: + raise SourceError(f"unknown command {cmd!r}") + except (IndexError, ValueError, TypeError) as e: + raise SourceError(f"{path}:{n}: {e}") + if canvas is None: + raise SourceError(f"{path}: missing 'size'") + return ["".join(r) for r in canvas] + + +def to_image(rows): + h, w = len(rows), len(rows[0]) + img = Image.new("RGBA", (w, h), (0, 0, 0, 0)) + px = img.load() + for y, row in enumerate(rows): + for x, c in enumerate(row): + if c != ".": + px[x, y] = LEGEND[c] + (255,) + return img + + +def sources(): + for p in sorted(SRC.glob("*/*")): + if p.suffix in (".txt", ".layout"): + yield p + + +def build(path): + rows = read_layout(path) if path.suffix == ".layout" else read_grid(path) + out = OUT / path.parent.name / f"{path.stem}.png" + out.parent.mkdir(parents=True, exist_ok=True) + to_image(rows).save(out) + return out, len(rows[0]), len(rows) + + +def main(argv): + if argv and argv[0] in ("mirror", "flip"): + rows = read_grid(argv[1]) + if argv[0] == "flip": + print("\n".join(r[::-1] for r in rows)) + else: + gap = int(argv[3]) if len(argv) > 3 and argv[2] == "--gap" else None + for r in rows: + print(r + "." * gap + r[::-1] if gap is not None else r + r[-2::-1]) + return 0 + wanted = set(argv) + errors = 0 + built = 0 + for path in sources(): + key = f"{path.parent.name}/{path.stem}" + if wanted and key not in wanted: + continue + try: + out, w, h = build(path) + built += 1 + if wanted: + print(f"{out} {w}x{h}") + except SourceError as e: + print(f"ERROR {e}", file=sys.stderr) + errors += 1 + print(f"built {built} part(s), {errors} error(s)") + return 1 if errors else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/business_pokemon_type.py b/business_pokemon_type.py new file mode 100644 index 0000000..92e3a75 --- /dev/null +++ b/business_pokemon_type.py @@ -0,0 +1,76 @@ +import os +import sys +import json +import requests + +OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY") +if not OPENROUTER_API_KEY: + sys.exit("Set OPENROUTER_API_KEY first: export OPENROUTER_API_KEY='sk-or-v1-...'") + +# All 15 Gen 1 types, tuned for home service businesses. Each trade is listed under +# exactly one type, and Rock is limited to stone/roofing work so "construction-y" +# businesses spread out by what they actually do. +POKEMON_TYPES = { + "normal": "General or multi-trade home services: general contractors, remodeling, handymen, painters, drywall, flooring, cabinets, house cleaning and maid services, home inspectors", + "fire": "Heat and engines: heating and furnace repair, fireplaces, chimney sweeps, outdoor kitchens and grills, welding, auto repair and mechanics", + "water": "Water: plumbing, leak detection, water heaters, water damage restoration, pools and spas, irrigation and sprinklers, pressure washing, car washes and auto detailing", + "grass": "Plants and yards: landscaping, lawn care and mowing, tree service, sod, gardening, nurseries, mulch", + "electric": "Electricity and tech: electricians, lighting, solar, generators, EV chargers, smart home, home theater, alarm and camera systems, appliance repair", + "ice": "Cooling: air conditioning repair and install, refrigeration, insulation, ice machines, cold storage", + "fighting": "Protection and heavy labor: fencing and gates, security, demolition, moving companies, hauling, furniture assembly", + "poison": "Waste and contaminants: junk removal, dumpster rental, septic, mold remediation, asbestos and lead abatement, hazardous waste", + "ground": "Earth and dirt work: foundation repair, excavation, grading, drainage and French drains, concrete, driveways, paving, patios and hardscaping", + "flying": "Air and high places: gutters, air duct cleaning, dryer vents, indoor air quality, window cleaning, drones, couriers", + "psychic": "Knowledge and planning: interior design, architects, real estate, property management, home warranties, insurance, consulting, marketing", + "bug": "Insects and critters: pest control, exterminators, termite treatment, wildlife and rodent removal, beekeeping", + "rock": "Stone only: roofing, masonry, brick, stone veneer, granite and quartz countertops, tile, retaining walls", + "ghost": "Hidden spaces and the unseen: attics, crawl spaces, basement waterproofing, locksmiths, estate cleanouts, trauma and crime scene cleanup, funeral homes", + "dragon": "Premium or rare: luxury custom homes, high-end remodels, custom pools, exotic or performance auto shops, elite luxury brands", +} + + +def get_business_type(description: str) -> dict: + response = requests.post( + url="https://openrouter.ai/api/alpha/decisions", + headers={ + "Authorization": f"Bearer {OPENROUTER_API_KEY}", + "Content-Type": "application/json", + }, + data=json.dumps({ + "model": "typesafe/jev-1.13", + "state": f"Business description: {description}", + "questions": { + "pokemon_type": { + "type": "choice", + "instructions": ( + "Which Gen 1 Pokémon type best matches this business? Decide by its " + "specific trade or main service, not by the fact that it is construction, " + "home service, or physical work in general. Being construction-related is " + "not a reason to choose Rock; choose Rock only for roofing or stone work. " + "If the description is only a business name, use the trade the name implies." + ), + "criteria": POKEMON_TYPES, + } + }, + }), + timeout=30, + ) + response.raise_for_status() + return response.json()["answers"]["pokemon_type"] + + +if __name__ == "__main__": + desc = " ".join(sys.argv[1:]) or "Residential lawn mowing, hedge trimming, and flower bed installation" + answer = get_business_type(desc) + + choice = answer["choice"] + probs = answer["probabilities"] + top3 = sorted(probs.items(), key=lambda kv: kv[1], reverse=True)[:3] + + print(f"Business: {desc}") + print(f"Type: {choice.upper()} ({probs[choice]:.0%})") + print("Top 3: " + ", ".join(f"{t} {p:.0%}" for t, p in top3)) + + # Low confidence usually means a vague description or a true dual-type business + if probs[choice] < 0.5: + print(f"Low confidence. Possible dual type: {top3[0][0]}/{top3[1][0]}") diff --git a/generate_sprite.py b/generate_sprite.py new file mode 100644 index 0000000..e52c8a2 --- /dev/null +++ b/generate_sprite.py @@ -0,0 +1,729 @@ +#!/usr/bin/env python3 +""" +Generate a Pokémon-style sprite for a business. + +Pipeline: Jev picks a type -> seeded RNG picks a base creature and its variation parts +(weighted by type) -> parts snap together via anchor pixels -> markings painted on -> +palette keys swapped for colors pulled from the business logo. + +Logo colors: transparent pixels, anti-aliased edges and a solid white/black/gray background +(the colour filling the image border) are ignored; hued brand colours win over white, black +or gray text. A logo that is only white/black (or only its background) still uses that. + +Usage + python generate_sprite.py "Rosas Landscaping" logos/rosas.png # Jev picks the type + python generate_sprite.py "Rosas Landscaping" logos/rosas.png --type grass + python generate_sprite.py "Rosas Landscaping" --type grass --colors "#2E7D32,#FBC02D" + python generate_sprite.py --batch businesses.csv # columns: name,logo,type,description + python generate_sprite.py --make-placeholders # test art for every part + python generate_sprite.py --sprite-list SPRITES.md # art checklist + weight report + +Requires: pip install pillow numpy requests +""" +import argparse +import colorsys +import csv +import hashlib +import json +import random +import re +import sys +from collections import Counter +from pathlib import Path + +import numpy as np +from PIL import Image, ImageDraw + +import sprite_parts as cfg + +CANVAS = 96 # final sprite size (square) +GROUND_MARGIN = 4 # empty rows under the feet + +# Palette keys: draw every part using ONLY these exact colors (plus pass-through colors +# like eye white). They get swapped for logo-derived colors at render time. +KEYS = { + "main_light": (255, 128, 128), "main_base": (255, 0, 0), "main_dark": (128, 0, 0), + "accent_light": (128, 255, 128), "accent_base": (0, 255, 0), "accent_dark": (0, 128, 0), + "type_light": (128, 128, 255), "type_base": (0, 0, 255), "type_dark": (0, 0, 128), + "outline": (0, 0, 0), +} +PUPIL = (20, 20, 20) # near-black that is NOT recolored +EYE_WHITE = (255, 255, 255) + +# Anchor marker pixels. Place one pixel of the color where a child part attaches. +# They are read, then replaced with the surrounding color. +MARKERS = { + "pivot": (255, 0, 255), "tail": (253, 0, 255), "back": (252, 0, 255), + "aura": (251, 0, 255), "head_top": (250, 0, 255), +} + +PICK_ORDER = ["body", "head_top", "back", "tail", "aura"] +DEFAULT_Z = {"aura": 0, "back": 10, "tail": 20, "body": 30, "head_top": 50} + + +def warn(msg): + print(f" ! {msg}", file=sys.stderr) + + +# ============================================================ seeded picking + +def make_rng(name, reroll=0): + key = f"{name.strip().lower()}|{reroll}" + return random.Random(int(hashlib.sha256(key.encode()).hexdigest()[:16], 16)) + + +def weighted_pick(rng, items): + items = [(it, w) for it, w in items if w > 0] + total = sum(w for _, w in items) + if total <= 0: + return None + r = rng.random() * total + acc = 0.0 + for it, w in items: + acc += w + if r < acc: + return it + return items[-1][0] + + +def part_weight(p, ptype): + return p["types"].get(ptype, p["other"]) + + +def candidates(slot, plan, ptype, tags, excluded, denied=()): + out = [] + for p in cfg.SLOTS[slot]: + if plan not in p["plans"] or p["name"] in denied: + continue + if p["requires"] and not set(p["requires"]) & tags: + continue + if set(p["tags"]) & excluded or set(p["excludes"]) & tags: + continue + out.append((p, part_weight(p, ptype))) + return out + + +def motif_factor(p, motifs): + """Keep one creature's features on a theme: same motif boosted, clashing motifs damped.""" + m = cfg.MOTIFS.get(p["name"]) + if m is None or not motifs: + return 1.0 + if m in motifs: + return cfg.MOTIF_SAME + if all(frozenset((m, o)) in cfg.MOTIF_PAIRS for o in motifs): + return 1.0 + return cfg.MOTIF_CLASH + + +def pick_parts(ptype, rng): + plan = weighted_pick(rng, cfg.PLAN_WEIGHTS[ptype].items()) + chosen, tags, excluded, denied, motifs = {}, {f"plan:{plan}"}, set(), set(), set() + features = 0 + for slot in PICK_ORDER: + if slot in cfg.DISABLED_SLOTS: + continue + cands = candidates(slot, plan, ptype, tags, excluded, denied) + if slot in cfg.FEATURE_SLOTS: + if features >= cfg.MAX_FEATURES: + cands = [(p, w) for p, w in cands if p["name"] == "none"] + cands = [(p, w * motif_factor(p, motifs)) for p, w in cands] + p = weighted_pick(rng, cands) + if p is None: + continue + chosen[slot] = p + tags |= set(p["tags"]) + excluded |= set(p["excludes"]) + denied |= set(p.get("deny", ())) + if p["name"] != "none" and slot in cfg.FEATURE_SLOTS: + features += 1 + if cfg.MOTIFS.get(p["name"]): + motifs.add(cfg.MOTIFS[p["name"]]) + markings = weighted_pick(rng, [(m, w.get(ptype, w.get("_other", 0))) for m, w in cfg.MARKINGS.items()]) + return plan, chosen, markings, tags + + +def attributes_from(tags): + """Public attributes: drop compatibility plumbing (*_head family tags, _internal tags, plan).""" + return sorted(t for t in tags if not t.endswith("_head") and not t.startswith(("_", "plan:"))) + + +# ============================================================ loading + compositing + +_part_cache = {} + + +def load_part(parts_dir, slot, name): + path = Path(parts_dir) / slot / f"{name}.png" + if path in _part_cache: + return _part_cache[path] + if not path.exists(): + _part_cache[path] = None + return None + arr = np.array(Image.open(path).convert("RGBA")) + rgb, alpha = arr[:, :, :3], arr[:, :, 3] > 0 + anchors, marker_mask = {}, np.zeros(alpha.shape, bool) + for mname, col in MARKERS.items(): + m = np.all(rgb == col, axis=-1) & alpha + ys, xs = np.nonzero(m) + if len(xs): + anchors[mname] = (int(round(xs.mean())), int(round(ys.mean()))) + marker_mask |= m + # Replace marker pixels with the most common opaque, non-marker 4-neighbor + h, w = alpha.shape + for y, x in zip(*np.nonzero(marker_mask)): + neigh = [tuple(arr[ny, nx]) for ny, nx in ((y - 1, x), (y + 1, x), (y, x - 1), (y, x + 1)) + if 0 <= ny < h and 0 <= nx < w and arr[ny, nx, 3] > 0 and not marker_mask[ny, nx]] + arr[y, x] = Counter(neigh).most_common(1)[0][0] if neigh else (0, 0, 0, 0) + result = (Image.fromarray(arr), anchors) + _part_cache[path] = result + return result + + +def key_mask(arr, key): + return np.all(arr[:, :, :3] == KEYS[key], axis=-1) & (arr[:, :, 3] > 0) + + +def apply_markings(img, kind, rng, center=None): + """Paint accent markings onto main-ramp pixels. + + center: the body's aura anchor (torso centre). When given, markings stay on the body + below the face (rows from a little above the torso centre down) and the belly patch + is centred there.""" + if kind in (None, "none"): + return img + arr = np.array(img) + h, w = arr.shape[:2] + main = key_mask(arr, "main_light") | key_mask(arr, "main_base") | key_mask(arr, "main_dark") + ys, xs = np.mgrid[0:h, 0:w] + if center: + main &= ys >= center[1] - h * 0.12 + if not main.any(): + return img + if kind == "spots": + pat = np.zeros((h, w), bool) + pts = np.argwhere(main) + for _ in range(rng.randint(4, 8)): + y, x = pts[rng.randrange(len(pts))] + r = rng.randint(1, 3) + pat |= (xs - x) ** 2 + (ys - y) ** 2 <= r * r + elif kind == "speckles": + pat = np.random.default_rng(rng.randrange(2 ** 32)).random((h, w)) < 0.1 + elif kind == "belly": + oy, ox = np.nonzero(arr[:, :, 3] > 0) + x0, x1, y0, y1 = ox.min(), ox.max(), oy.min(), oy.max() + cx, cy = center if center else ((x0 + x1) / 2, y0 + (y1 - y0) * 0.62) + rx, ry = max((x1 - x0) * 0.2, 1), max((y1 - y0) * 0.17, 1) + pat = ((xs - cx) / rx) ** 2 + ((ys - cy) / ry) ** 2 <= 1 + else: + return img + mask = pat & main + for src, dst in (("main_light", "accent_light"), ("main_base", "accent_base"), ("main_dark", "accent_dark")): + arr[mask & key_mask(arr, src), :3] = KEYS[dst] + return Image.fromarray(arr) + + +def outline_behind(canvas, body, pos): + """Where parts drawn behind the body (back, tail, rear ears) touch the body's silhouette, + add a second outline pixel so the creature's own shape stays readable against them.""" + arr = np.array(canvas) + h, w = arr.shape[:2] + m = np.zeros((h, w), bool) + x, y = pos + m[y:y + body.height, x:x + body.width] = np.array(body)[:, :, 3] > 0 + ring = np.zeros_like(m) + ring[1:] |= m[:-1] + ring[:-1] |= m[1:] + ring[:, 1:] |= m[:, :-1] + ring[:, :-1] |= m[:, 1:] + hit = ring & ~m & (arr[:, :, 3] > 0) + arr[hit] = KEYS["outline"] + (255,) + return Image.fromarray(arr) + + +def compose(parts_dir, chosen, markings, rng): + body = chosen["body"] + loaded = load_part(parts_dir, "body", body["name"]) + if loaded is None: + raise FileNotFoundError(f"Missing body sprite: {parts_dir}/body/{body['name']}.png") + bimg, banch = loaded + bimg = apply_markings(bimg, markings, rng, banch.get("aura")) + bpiv = banch.get("pivot", (bimg.width // 2, bimg.height - 1)) + bpos = (-bpiv[0], -bpiv[1]) + + layers = [(body["z"] or DEFAULT_Z["body"], 0, bimg, bpos)] + for i, slot in enumerate(PICK_ORDER[1:], 1): + p = chosen.get(slot) + if not p or p["name"] == "none": + continue + loaded = load_part(parts_dir, slot, p["name"]) + if loaded is None: + warn(f"missing sprite {slot}/{p['name']}.png, skipped") + continue + img, anch = loaded + a = banch.get(slot) + if a is None: + warn(f"no '{slot}' anchor on {body['name']}, {p['name']} skipped") + continue + piv = anch.get("pivot", (img.width // 2, img.height // 2)) + pos = (bpos[0] + a[0] - piv[0], bpos[1] + a[1] - piv[1]) + layers.append((p["z"] if p["z"] is not None else DEFAULT_Z[slot], i, img, pos)) + + layers.sort(key=lambda l: (l[0], l[1])) + minx = min(l[3][0] for l in layers) + miny = min(l[3][1] for l in layers) + maxx = max(l[3][0] + l[2].width for l in layers) + maxy = max(l[3][1] + l[2].height for l in layers) + canvas = Image.new("RGBA", (maxx - minx, maxy - miny), (0, 0, 0, 0)) + for _, i, img, (x, y) in layers: + if i == 0: + canvas = outline_behind(canvas, img, (x - minx, y - miny)) + canvas.alpha_composite(img, (x - minx, y - miny)) + return canvas.crop(canvas.getbbox()) + + +def place_on_canvas(sprite): + w, h = sprite.size + size = max(CANVAS, w + 2, h + GROUND_MARGIN + 1) + if size > CANVAS: + warn(f"sprite is {w}x{h}, canvas expanded to {size}px") + out = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + out.alpha_composite(sprite, ((size - w) // 2, size - GROUND_MARGIN - h)) + return out + + +def recolor(img, palette): + arr = np.array(img) + masks = {k: key_mask(arr, k) for k in palette} # compute all before writing + for k, rgb in palette.items(): + arr[masks[k], :3] = rgb + return Image.fromarray(arr) + + +# ============================================================ colors + +def hex_to_rgb(h): + h = h.strip().lstrip("#") + return tuple(int(h[i:i + 2], 16) for i in (0, 2, 4)) + + +def rgb_to_hex(c): + return "#{:02X}{:02X}{:02X}".format(*c) + + +def to_hls(rgb): + return colorsys.rgb_to_hls(*(c / 255 for c in rgb)) + + +def from_hls(h, l, s): + return tuple(int(round(c * 255)) for c in colorsys.hls_to_rgb(h % 1, min(max(l, 0), 1), min(max(s, 0), 1))) + + +def hue_toward(h, target, amount): + d = ((target - h + 0.5) % 1.0) - 0.5 + return (h + max(-amount, min(amount, d))) % 1.0 + + +def color_dist(a, b): + rmean = (a[0] + b[0]) / 2 + dr, dg, db = a[0] - b[0], a[1] - b[1], a[2] - b[2] + return ((2 + rmean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rmean) / 256) * db * db) ** 0.5 + + +def rotate_hue(rgb, amount): + h, l, s = to_hls(rgb) + return from_hls(h + amount, l, s) + + +def ramp(rgb): + """light/base/dark with hue shifting: highlights lean yellow, shadows lean blue.""" + h, l, s = to_hls(rgb) + l = min(max(l, 0.25), 0.75) + light = from_hls(hue_toward(h, 1 / 6, 0.03), min(l + 0.17, 0.95), s * 0.92) + base = from_hls(h, l, s) + dark = from_hls(hue_toward(h, 2 / 3, 0.035), max(l - 0.2, 0.06), s * 1.08) + return light, base, dark + + +def outline_color(rgb): + h, l, s = to_hls(rgb) + return from_hls(hue_toward(h, 2 / 3, 0.05), min(l * 0.35, 0.16), s * 0.8) + + +def _dist_to(px, rgb): + """color_dist from many pixels (N,3 float) to one colour.""" + r, g, b = rgb + rmean = (px[:, 0] + r) / 2 + dr, dg, db = px[:, 0] - r, px[:, 1] - g, px[:, 2] - b + return np.sqrt((2 + rmean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rmean) / 256) * db * db) + + +def is_neutral(rgb): + """White, black or gray: carries no brand hue.""" + mx, mn = max(rgb), min(rgb) + light, chroma = (mx + mn) / 510, (mx - mn) / 255 + return chroma < 0.12 or light > 0.93 or light < 0.08 + + +def logo_background(arr): + """The solid background colour of a logo, if its border is mostly one opaque colour.""" + h, w = arr.shape[:2] + border = np.concatenate([arr[0], arr[-1], arr[:, 0], arr[:, -1]]) + opaque = border[border[:, 3] >= 200][:, :3].astype(float) + if len(opaque) < 0.4 * len(border): + return None # transparent or busy border: no solid background + best = None + for c in opaque[:: max(1, len(opaque) // 64)]: + share = np.mean(_dist_to(opaque, c) < 40) + if best is None or share > best[1]: + best = (c, share) + if best[1] < 0.4: + return None + near = opaque[_dist_to(opaque, best[0]) < 40] + return tuple(int(v) for v in near.mean(0)) + + +def _quantize(px, n): + q = Image.fromarray(px.astype(np.uint8).reshape(1, -1, 3), "RGB").quantize(colors=n, method=Image.Quantize.MEDIANCUT) + pal, counts = q.getpalette(), q.getcolors() + total = sum(c for c, _ in counts) + merged = [] + for rgb, frac in sorted(((tuple(pal[i * 3:i * 3 + 3]), c / total) for c, i in counts), key=lambda cf: -cf[1]): + for m in merged: + if color_dist(m[0], rgb) < 40: + m[1] += frac + break + else: + merged.append([rgb, frac]) + return [(tuple(c), f) for c, f in merged] + + +def _interior(arr, tol=24): + """Opaque pixels whose 4 neighbours are opaque and nearly the same colour. Drops the + anti-aliased blends at shape edges, which would otherwise show up as muddy extra colours.""" + rgb = arr[:, :, :3].astype(float) + ok = arr[:, :, 3] >= 200 + keep = ok.copy() + for dy, dx in ((1, 0), (-1, 0), (0, 1), (0, -1)): + nb = np.roll(np.roll(rgb, dy, 0), dx, 1) + nok = np.roll(np.roll(ok, dy, 0), dx, 1) + keep &= nok & (np.abs(rgb - nb).max(-1) < tol) + keep[0, :] = keep[-1, :] = keep[:, 0] = keep[:, -1] = False + return keep + + +def extract_logo_colors(path, n=6): + """Return [(rgb, fraction)] of a logo's brand colours, most important first. + + - Transparent pixels and anti-aliased edge blends are ignored. + - A solid white/black/gray background (the colour filling most of the image border) is + removed. A coloured background is kept: it is part of the brand. + - Brand hues come first; neutral colours (white, black, gray) that are part of the logo + itself rank after every hued colour. + - If nothing but the background is left (e.g. a plain logo on its own colour), the + background colour is used rather than nothing. + """ + img = Image.open(path).convert("RGBA") + img.thumbnail((256, 256)) + arr = np.array(img) + opaque = arr[:, :, 3] >= 200 + if not opaque.any(): + return [] + inner = _interior(arr) + if inner.sum() < 0.25 * opaque.sum(): # tiny or noisy logo: use every opaque pixel + inner = opaque + px = arr[inner][:, :3].astype(float) + bg = logo_background(arr) + if bg is not None and is_neutral(bg): + fg = px[_dist_to(px, bg) >= 60] + if len(fg) < max(20, 0.002 * len(px)): + return [(bg, 1.0)] + px = fg + found = _quantize(px, n) + hued = [cf for cf in found if not is_neutral(cf[0])] + neutral = [cf for cf in found if is_neutral(cf[0])] + return sorted(hued, key=lambda cf: -cf[1]) + sorted(neutral, key=lambda cf: -cf[1]) + + +def pick_main_accent(colors, ptype): + type_rgb = hex_to_rgb(cfg.TYPE_COLORS[ptype]) + if not colors: + main = type_rgb + accent = rotate_hue(type_rgb, 0.5) + else: + main = colors[0][0] + cands = [(c, f) for c, f in colors[1:] if f >= 0.04 and color_dist(c, main) >= 90] + if cands: + # hued brand colours beat white/black/gray text for the accent + accent = max(cands, key=lambda cf: color_dist(cf[0], main) * cf[1] ** 0.5 + * (0.6 if is_neutral(cf[0]) else 1.0))[0] + elif color_dist(type_rgb, main) >= 90: + accent = type_rgb + else: + accent = rotate_hue(main, 0.5) + # Keep main and accent readable against each other + (_, lm, _), (ha, la, sa) = to_hls(main), to_hls(accent) + if abs(lm - la) < 0.12 and color_dist(main, accent) < 140: + la = la + 0.22 if lm < 0.55 else la - 0.22 + accent = from_hls(ha, la, sa) + return main, accent + + +def build_palette(main, accent, ptype): + type_rgb = hex_to_rgb(cfg.TYPE_COLORS[ptype]) + # Elemental parts (leaves, flames, sparks) must read against the body: if the type colour + # is close to the main colour, push its lightness away from the main colour. + if color_dist(type_rgb, main) < 150: + (_, lm, _), (ht, lt, st) = to_hls(main), to_hls(type_rgb) + type_rgb = from_hls(ht, lm + 0.24 if lm < 0.5 else lm - 0.24, st) + pal = {} + for group, rgb in (("main", main), ("accent", accent), ("type", type_rgb)): + pal[f"{group}_light"], pal[f"{group}_base"], pal[f"{group}_dark"] = ramp(rgb) + pal["outline"] = outline_color(main) + return pal + + +# ============================================================ generate + +def slugify(s): + return re.sub(r"[^a-z0-9]+", "-", s.lower()).strip("-") or "business" + + +def classify(description): + try: + from business_pokemon_type import get_business_type # imported lazily so --type works offline + except ImportError: + sys.exit("business_pokemon_type.py not found next to this script; pass --type instead.") + except SystemExit: + sys.exit("No --type given and OPENROUTER_API_KEY is not set: export it or pass --type .") + ans = get_business_type(description) + return ans["choice"].lower(), ans.get("probabilities") + + +def generate(name, parts_dir, out_dir, ptype=None, description=None, logo=None, colors=None, + reroll=0, scale=4): + probs = None + if not ptype: + ptype, probs = classify(description or name) + ptype = ptype.lower() + if ptype not in cfg.PLAN_WEIGHTS: + sys.exit(f"Unknown type '{ptype}'. Options: {', '.join(cfg.TYPES)}") + + rng = make_rng(name, reroll) + plan, chosen, markings, tags = pick_parts(ptype, rng) + + if colors: + logo_colors = [(hex_to_rgb(c), 1.0) for c in colors] + elif logo: + logo_colors = extract_logo_colors(logo) + if not logo_colors: + warn("no usable colors in logo, falling back to type color") + else: + logo_colors = [] + main, accent = pick_main_accent(logo_colors, ptype) + palette = build_palette(main, accent, ptype) + + sprite = recolor(place_on_canvas(compose(parts_dir, chosen, markings, rng)), palette) + + out_dir = Path(out_dir) + out_dir.mkdir(parents=True, exist_ok=True) + slug = slugify(name) + (f"-r{reroll}" if reroll else "") + sprite.save(out_dir / f"{slug}.png") + if scale > 1: + sprite.resize((sprite.width * scale, sprite.height * scale), Image.NEAREST).save(out_dir / f"{slug}@{scale}x.png") + + info = { + "name": name, "type": ptype, "type_probabilities": probs, "plan": plan, + "parts": {s: p["name"] for s, p in chosen.items()}, "markings": markings, + "attributes": attributes_from(tags), + "colors": {"main": rgb_to_hex(main), "accent": rgb_to_hex(accent), + "type": cfg.TYPE_COLORS[ptype], "outline": rgb_to_hex(palette["outline"])}, + } + (out_dir / f"{slug}.json").write_text(json.dumps(info, indent=2)) + print(f"{name}: {ptype.upper()} {plan} | {', '.join(info['attributes']) or 'no attributes'} | " + f"main {info['colors']['main']} accent {info['colors']['accent']} -> {out_dir / slug}.png") + return info + + +# ============================================================ placeholders + +BASE_ANCHORS = {"pivot": (0.5, 1.0), "head_top": (0.35, 0.08), "back": (0.7, 0.35), "tail": (0.9, 0.7), + "aura": (0.5, 0.55)} +CHILD_ANCHORS = { + "head_top": {"pivot": (0.5, 1.0)}, "back": {"pivot": (0.5, 0.85)}, "tail": {"pivot": (0.05, 0.6)}, + "aura": {"pivot": (0.5, 0.5)}, +} +DEFAULT_SIZE = {"head_top": (16, 14), "back": (40, 30), "tail": (26, 14), "aura": (84, 84)} + + +def anchors_for(slot, p): + return BASE_ANCHORS if slot == "body" else CHILD_ANCHORS[slot] + + +def size_for(slot, p): + return tuple(p["size"] or DEFAULT_SIZE[slot]) + + +def _shaded(d, box, pal): + x0, y0, x1, y1 = [int(v) for v in box] + w, h = x1 - x0, y1 - y0 + d.ellipse((x0, y0, x1, y1), fill=KEYS[f"{pal}_dark"], outline=KEYS["outline"]) + if w > 4 and h > 4: + d.ellipse((x0 + 1, y0 + 1, x1 - max(2, int(w * 0.2)), y1 - max(2, int(h * 0.25))), fill=KEYS[f"{pal}_base"]) + d.ellipse((x0 + int(w * 0.2), y0 + int(h * 0.15), x0 + int(w * 0.4), y0 + int(h * 0.3)), fill=KEYS[f"{pal}_light"]) + + +def _rect(d, box, pal): + d.rectangle([int(v) for v in box], fill=KEYS[f"{pal}_base"], outline=KEYS["outline"]) + + +def draw_placeholder(slot, p): + w, h = size_for(slot, p) + img = Image.new("RGBA", (w, h), (0, 0, 0, 0)) + d = ImageDraw.Draw(img) + pal = p["palette"] + if slot == "body": # base creature: round body with a big head and two dot eyes + _shaded(d, (w * 0.3, h * 0.45, w - 1, h - 1), pal) + _shaded(d, (0, 0, w * 0.65, h * 0.7), pal) + for ex in (0.2, 0.42): + d.rectangle((int(w * ex), int(h * 0.3), int(w * ex) + 1, int(h * 0.3) + 2), fill=PUPIL) + elif slot == "head_top": + d.polygon([(0, h - 1), (w // 2, 0), (w - 1, h - 1)], fill=KEYS[f"{pal}_base"], outline=KEYS["outline"]) + d.line([(w // 2, 2), (w // 2, h - 3)], fill=KEYS[f"{pal}_light"]) + elif slot == "aura": + rng = random.Random(p["name"]) + for _ in range(14): + x, y = rng.randrange(4, w - 8), rng.randrange(4, h - 8) + r = rng.randint(2, 3) + d.ellipse((x, y, x + r * 2, y + r * 2), fill=KEYS["type_base"], outline=KEYS["type_dark"]) + else: + _shaded(d, (0, 0, w - 1, h - 1), pal) + + for mname, (fx, fy) in anchors_for(slot, p).items(): + img.putpixel((min(int(fx * w), w - 1), min(int(fy * h), h - 1)), MARKERS[mname] + (255,)) + return img + + +def make_placeholders(parts_dir, overwrite=False): + made = 0 + for slot, parts in cfg.SLOTS.items(): + (Path(parts_dir) / slot).mkdir(parents=True, exist_ok=True) + for p in parts: + if p["name"] == "none": + continue + path = Path(parts_dir) / slot / f"{p['name']}.png" + if path.exists() and not overwrite: + continue + draw_placeholder(slot, p).save(path) + made += 1 + print(f"Wrote {made} placeholder sprites to {parts_dir}/") + + +# ============================================================ sprite list + weight report + +def simulate(ptype, n=3000): + plans, slots, marks = Counter(), {s: Counter() for s in PICK_ORDER}, Counter() + for i in range(n): + plan, chosen, m, _ = pick_parts(ptype, random.Random(i)) + plans[plan] += 1 + marks[m] += 1 + for s in PICK_ORDER: + slots[s][chosen[s]["name"] if s in chosen else "none"] += 1 + return plans, slots, marks + + +def pct(counter, n, top=None): + return ", ".join(f"{k} {v / n:.0%}" for k, v in counter.most_common(top) if v / n >= 0.01) + + +def write_sprite_list(path): + L = ["# Sprite checklist", ""] + total = sum(1 for parts in cfg.SLOTS.values() for p in parts if p["name"] != "none") + L += [f"**{total} sprites** across {len(cfg.SLOTS)} slots. Save each as `parts//.png`.", "", + "## Art rules", "", + f"- Final canvas is {CANVAS}x{CANVAS}. Sizes below are suggested part canvases; crop tight with transparency.", + "- Characters face left in a 3/4 view, light from the top-left. 1px outline, no anti-aliasing, no semi-transparent pixels.", + "- Draw only with the palette keys below. Any other color (eye white, pupils) is left as-is.", ""] + L += ["| Key | Hex | Use |", "|---|---|---|"] + uses = {"main": "body / most fur and skin", "accent": "horns, wings, beaks, crests, shells", + "type": "elemental bits: flames, leaves, sparks, ice, water"} + for k, v in KEYS.items(): + L.append(f"| {k} | {rgb_to_hex(v)} | {'outline (recolored)' if k == 'outline' else uses[k.split('_')[0]]} |") + L += [f"| pupil | {rgb_to_hex(PUPIL)} | not recolored |", f"| eye white | {rgb_to_hex(EYE_WHITE)} | not recolored |", ""] + L += ["### Anchor marker pixels", "", + "One pixel each. `pivot` is where the part attaches to its parent; the others are where children attach.", "", + "| Marker | Hex | Needed in |", "|---|---|---|", + f"| pivot | {rgb_to_hex(MARKERS['pivot'])} | every part (bodies: bottom center between the feet) |", + f"| head_top | {rgb_to_hex(MARKERS['head_top'])} | all bodies (top of the head) |", + f"| tail | {rgb_to_hex(MARKERS['tail'])} | all bodies |", + f"| back | {rgb_to_hex(MARKERS['back'])} | all bodies |", + f"| aura | {rgb_to_hex(MARKERS['aura'])} | all bodies (center of mass; belly patch centre) |", ""] + + for slot in ["body", "head_top", "back", "tail", "aura"]: + parts = [p for p in cfg.SLOTS[slot] if p["name"] != "none"] + L += [f"## {slot} ({len(parts)})", "", "| Done | File | Size | Palette | Plans | Description | Most likely for |", + "|---|---|---|---|---|---|---|"] + for p in parts: + top = sorted(cfg.TYPES, key=lambda t: -part_weight(p, t))[:3] + top = ", ".join(t for t in top if part_weight(p, t) > 0) + plans = "all" if p["plans"] == cfg.ALL else ", ".join(p["plans"]) + w, h = size_for(slot, p) + L.append(f"| [ ] | `{slot}/{p['name']}.png` | {w}x{h} | {p['palette']} | {plans} | {p['desc']} | {top} |") + L.append("") + + L += ["## Simulated pick rates per type", "", + "From 3,000 random seeds per type. Use this to spot parts that never show up or show up too much.", ""] + for t in cfg.TYPES: + n = 3000 + plans, slots, marks = simulate(t, n) + L += [f"### {t.capitalize()}", "", f"- **Body plan:** {pct(plans, n)}"] + for s in PICK_ORDER: + L.append(f"- **{s}:** {pct(slots[s], n, 8)}") + L += [f"- **markings:** {pct(marks, n)}", ""] + Path(path).write_text("\n".join(L)) + print(f"Wrote {path}") + + +# ============================================================ CLI + +def main(): + ap = argparse.ArgumentParser(description="Generate Pokémon-style business sprites") + ap.add_argument("name", nargs="?", help="Business name (also the random seed)") + ap.add_argument("logo_file", nargs="?", help="Logo image to pull colors from (same as --logo)") + ap.add_argument("--desc", help="Business description for Jev (defaults to the name)") + ap.add_argument("--type", help="Skip Jev and use this type") + ap.add_argument("--logo", help="Logo image to pull colors from") + ap.add_argument("--colors", help='Manual colors, e.g. "#2E7D32,#FBC02D" (main first)') + ap.add_argument("--reroll", type=int, default=0, help="Alternate creature for the same business") + ap.add_argument("--parts", default="parts", help="Parts folder") + ap.add_argument("--out", default="sprites", help="Output folder") + ap.add_argument("--scale", type=int, default=4, help="Also save an upscaled copy (1 to disable)") + ap.add_argument("--batch", help="CSV with columns name,logo,type,description (only name required)") + ap.add_argument("--make-placeholders", action="store_true", help="Create test art for every part") + ap.add_argument("--overwrite", action="store_true", help="With --make-placeholders, replace existing files") + ap.add_argument("--sprite-list", metavar="PATH", help="Write the art checklist and weight report") + a = ap.parse_args() + + if a.make_placeholders: + make_placeholders(a.parts, a.overwrite) + if a.sprite_list: + write_sprite_list(a.sprite_list) + colors = a.colors.split(",") if a.colors else None + if a.batch: + with open(a.batch, newline="", encoding="utf-8") as f: + for row in csv.DictReader(f): + if not (row.get("name") or "").strip(): + continue + generate(row["name"].strip(), a.parts, a.out, ptype=(row.get("type") or "").strip() or None, + description=(row.get("description") or "").strip() or None, + logo=(row.get("logo") or "").strip() or None, scale=a.scale) + elif a.name: + logo = a.logo or a.logo_file + if logo and not Path(logo).exists(): + sys.exit(f"Logo not found: {logo}") + generate(a.name, a.parts, a.out, a.type, a.desc, logo, colors, a.reroll, a.scale) + elif not (a.make_placeholders or a.sprite_list): + ap.print_help() + + +if __name__ == "__main__": + main() diff --git a/legacy/parts/body/avian_perched.png b/legacy/parts/body/avian_perched.png new file mode 100644 index 0000000..e982f03 Binary files /dev/null and b/legacy/parts/body/avian_perched.png differ diff --git a/legacy/parts/body/avian_round.png b/legacy/parts/body/avian_round.png new file mode 100644 index 0000000..fb1d4ed Binary files /dev/null and b/legacy/parts/body/avian_round.png differ diff --git a/legacy/parts/body/biped_bulky.png b/legacy/parts/body/biped_bulky.png new file mode 100644 index 0000000..44e6eda Binary files /dev/null and b/legacy/parts/body/biped_bulky.png differ diff --git a/legacy/parts/body/biped_small.png b/legacy/parts/body/biped_small.png new file mode 100644 index 0000000..0204378 Binary files /dev/null and b/legacy/parts/body/biped_small.png differ diff --git a/legacy/parts/body/biped_tall.png b/legacy/parts/body/biped_tall.png new file mode 100644 index 0000000..b7157df Binary files /dev/null and b/legacy/parts/body/biped_tall.png differ diff --git a/legacy/parts/body/blob_drip.png b/legacy/parts/body/blob_drip.png new file mode 100644 index 0000000..39b0fc3 Binary files /dev/null and b/legacy/parts/body/blob_drip.png differ diff --git a/legacy/parts/body/blob_floating.png b/legacy/parts/body/blob_floating.png new file mode 100644 index 0000000..865c370 Binary files /dev/null and b/legacy/parts/body/blob_floating.png differ diff --git a/legacy/parts/body/blob_round.png b/legacy/parts/body/blob_round.png new file mode 100644 index 0000000..c61c4e9 Binary files /dev/null and b/legacy/parts/body/blob_round.png differ diff --git a/legacy/parts/body/fish_body.png b/legacy/parts/body/fish_body.png new file mode 100644 index 0000000..aacab82 Binary files /dev/null and b/legacy/parts/body/fish_body.png differ diff --git a/legacy/parts/body/insect_beetle.png b/legacy/parts/body/insect_beetle.png new file mode 100644 index 0000000..b893292 Binary files /dev/null and b/legacy/parts/body/insect_beetle.png differ diff --git a/legacy/parts/body/insect_larva.png b/legacy/parts/body/insect_larva.png new file mode 100644 index 0000000..71a9fbb Binary files /dev/null and b/legacy/parts/body/insect_larva.png differ diff --git a/legacy/parts/body/insect_mantis.png b/legacy/parts/body/insect_mantis.png new file mode 100644 index 0000000..2cc674c Binary files /dev/null and b/legacy/parts/body/insect_mantis.png differ diff --git a/legacy/parts/body/quad_long.png b/legacy/parts/body/quad_long.png new file mode 100644 index 0000000..a013b6a Binary files /dev/null and b/legacy/parts/body/quad_long.png differ diff --git a/legacy/parts/body/quad_slim.png b/legacy/parts/body/quad_slim.png new file mode 100644 index 0000000..e08eefd Binary files /dev/null and b/legacy/parts/body/quad_slim.png differ diff --git a/legacy/parts/body/quad_stocky.png b/legacy/parts/body/quad_stocky.png new file mode 100644 index 0000000..7c5bb03 Binary files /dev/null and b/legacy/parts/body/quad_stocky.png differ diff --git a/legacy/parts/body/seal_body.png b/legacy/parts/body/seal_body.png new file mode 100644 index 0000000..4d2267d Binary files /dev/null and b/legacy/parts/body/seal_body.png differ diff --git a/legacy/parts/body/serpent_coiled.png b/legacy/parts/body/serpent_coiled.png new file mode 100644 index 0000000..49c0871 Binary files /dev/null and b/legacy/parts/body/serpent_coiled.png differ diff --git a/legacy/parts/body/serpent_rising.png b/legacy/parts/body/serpent_rising.png new file mode 100644 index 0000000..19e6d09 Binary files /dev/null and b/legacy/parts/body/serpent_rising.png differ diff --git a/legacy/parts/eyes/eyes_angry.png b/legacy/parts/eyes/eyes_angry.png new file mode 100644 index 0000000..b2ecd88 Binary files /dev/null and b/legacy/parts/eyes/eyes_angry.png differ diff --git a/legacy/parts/eyes/eyes_beady.png b/legacy/parts/eyes/eyes_beady.png new file mode 100644 index 0000000..ee66804 Binary files /dev/null and b/legacy/parts/eyes/eyes_beady.png differ diff --git a/legacy/parts/eyes/eyes_big_shiny.png b/legacy/parts/eyes/eyes_big_shiny.png new file mode 100644 index 0000000..e99d201 Binary files /dev/null and b/legacy/parts/eyes/eyes_big_shiny.png differ diff --git a/legacy/parts/eyes/eyes_compound.png b/legacy/parts/eyes/eyes_compound.png new file mode 100644 index 0000000..c5c8317 Binary files /dev/null and b/legacy/parts/eyes/eyes_compound.png differ diff --git a/legacy/parts/eyes/eyes_cyclops.png b/legacy/parts/eyes/eyes_cyclops.png new file mode 100644 index 0000000..f7d5439 Binary files /dev/null and b/legacy/parts/eyes/eyes_cyclops.png differ diff --git a/legacy/parts/eyes/eyes_glowing.png b/legacy/parts/eyes/eyes_glowing.png new file mode 100644 index 0000000..265be76 Binary files /dev/null and b/legacy/parts/eyes/eyes_glowing.png differ diff --git a/legacy/parts/eyes/eyes_happy_closed.png b/legacy/parts/eyes/eyes_happy_closed.png new file mode 100644 index 0000000..d112d17 Binary files /dev/null and b/legacy/parts/eyes/eyes_happy_closed.png differ diff --git a/legacy/parts/eyes/eyes_masked.png b/legacy/parts/eyes/eyes_masked.png new file mode 100644 index 0000000..cc35205 Binary files /dev/null and b/legacy/parts/eyes/eyes_masked.png differ diff --git a/legacy/parts/eyes/eyes_round.png b/legacy/parts/eyes/eyes_round.png new file mode 100644 index 0000000..4cf4bf8 Binary files /dev/null and b/legacy/parts/eyes/eyes_round.png differ diff --git a/legacy/parts/eyes/eyes_sharp.png b/legacy/parts/eyes/eyes_sharp.png new file mode 100644 index 0000000..48b7b93 Binary files /dev/null and b/legacy/parts/eyes/eyes_sharp.png differ diff --git a/legacy/parts/eyes/eyes_sleepy.png b/legacy/parts/eyes/eyes_sleepy.png new file mode 100644 index 0000000..abf85f8 Binary files /dev/null and b/legacy/parts/eyes/eyes_sleepy.png differ diff --git a/legacy/parts/head/head_bird.png b/legacy/parts/head/head_bird.png new file mode 100644 index 0000000..0195dab Binary files /dev/null and b/legacy/parts/head/head_bird.png differ diff --git a/legacy/parts/head/head_bulky.png b/legacy/parts/head/head_bulky.png new file mode 100644 index 0000000..7735499 Binary files /dev/null and b/legacy/parts/head/head_bulky.png differ diff --git a/legacy/parts/head/head_canine.png b/legacy/parts/head/head_canine.png new file mode 100644 index 0000000..ba796b5 Binary files /dev/null and b/legacy/parts/head/head_canine.png differ diff --git a/legacy/parts/head/head_feline.png b/legacy/parts/head/head_feline.png new file mode 100644 index 0000000..999aa04 Binary files /dev/null and b/legacy/parts/head/head_feline.png differ diff --git a/legacy/parts/head/head_flat.png b/legacy/parts/head/head_flat.png new file mode 100644 index 0000000..ad4b79f Binary files /dev/null and b/legacy/parts/head/head_flat.png differ diff --git a/legacy/parts/head/head_ghost.png b/legacy/parts/head/head_ghost.png new file mode 100644 index 0000000..3735d01 Binary files /dev/null and b/legacy/parts/head/head_ghost.png differ diff --git a/legacy/parts/head/head_insect.png b/legacy/parts/head/head_insect.png new file mode 100644 index 0000000..5d14830 Binary files /dev/null and b/legacy/parts/head/head_insect.png differ diff --git a/legacy/parts/head/head_reptile.png b/legacy/parts/head/head_reptile.png new file mode 100644 index 0000000..23997ea Binary files /dev/null and b/legacy/parts/head/head_reptile.png differ diff --git a/legacy/parts/head/head_rock.png b/legacy/parts/head/head_rock.png new file mode 100644 index 0000000..e80b6db Binary files /dev/null and b/legacy/parts/head/head_rock.png differ diff --git a/legacy/parts/head/head_round.png b/legacy/parts/head/head_round.png new file mode 100644 index 0000000..4c494fa Binary files /dev/null and b/legacy/parts/head/head_round.png differ diff --git a/legacy/parts/snout/beak_duck.png b/legacy/parts/snout/beak_duck.png new file mode 100644 index 0000000..b150f2d Binary files /dev/null and b/legacy/parts/snout/beak_duck.png differ diff --git a/legacy/parts/snout/beak_hooked.png b/legacy/parts/snout/beak_hooked.png new file mode 100644 index 0000000..2f81bbf Binary files /dev/null and b/legacy/parts/snout/beak_hooked.png differ diff --git a/legacy/parts/snout/beak_short.png b/legacy/parts/snout/beak_short.png new file mode 100644 index 0000000..26f827b Binary files /dev/null and b/legacy/parts/snout/beak_short.png differ diff --git a/legacy/parts/snout/fangs.png b/legacy/parts/snout/fangs.png new file mode 100644 index 0000000..c8f46bc Binary files /dev/null and b/legacy/parts/snout/fangs.png differ diff --git a/legacy/parts/snout/fish_lips.png b/legacy/parts/snout/fish_lips.png new file mode 100644 index 0000000..8faf401 Binary files /dev/null and b/legacy/parts/snout/fish_lips.png differ diff --git a/legacy/parts/snout/mandibles.png b/legacy/parts/snout/mandibles.png new file mode 100644 index 0000000..71c888c Binary files /dev/null and b/legacy/parts/snout/mandibles.png differ diff --git a/legacy/parts/snout/muzzle_long.png b/legacy/parts/snout/muzzle_long.png new file mode 100644 index 0000000..2ba8bf1 Binary files /dev/null and b/legacy/parts/snout/muzzle_long.png differ diff --git a/legacy/parts/snout/muzzle_small.png b/legacy/parts/snout/muzzle_small.png new file mode 100644 index 0000000..1f68759 Binary files /dev/null and b/legacy/parts/snout/muzzle_small.png differ diff --git a/legacy/parts/snout/reptile_jaw.png b/legacy/parts/snout/reptile_jaw.png new file mode 100644 index 0000000..395deaa Binary files /dev/null and b/legacy/parts/snout/reptile_jaw.png differ diff --git a/legacy/parts/snout/snout_pig.png b/legacy/parts/snout/snout_pig.png new file mode 100644 index 0000000..0a7d1bb Binary files /dev/null and b/legacy/parts/snout/snout_pig.png differ diff --git a/legacy/parts/snout/tongue_out.png b/legacy/parts/snout/tongue_out.png new file mode 100644 index 0000000..bf63e3c Binary files /dev/null and b/legacy/parts/snout/tongue_out.png differ diff --git a/legacy/parts/snout/trunk_short.png b/legacy/parts/snout/trunk_short.png new file mode 100644 index 0000000..8093a25 Binary files /dev/null and b/legacy/parts/snout/trunk_short.png differ diff --git a/legacy/parts/snout/tusks.png b/legacy/parts/snout/tusks.png new file mode 100644 index 0000000..fd211a7 Binary files /dev/null and b/legacy/parts/snout/tusks.png differ diff --git a/legacy/parts/snout/whiskers.png b/legacy/parts/snout/whiskers.png new file mode 100644 index 0000000..4307e04 Binary files /dev/null and b/legacy/parts/snout/whiskers.png differ diff --git a/legacy/parts_src/body/avian_perched.txt b/legacy/parts_src/body/avian_perched.txt new file mode 100644 index 0000000..ec35895 --- /dev/null +++ b/legacy/parts_src/body/avian_perched.txt @@ -0,0 +1,32 @@ +...............oooooo........... +.............oo222222oo......... +............o2222222222o........ +.........ooo2H2222222222o....... +........o222221111122B222o...... +......oo222221111112222222o..... +....oo22221111111111222222o..... +...o22222111111111111122223o.... +.oo222221111111111111222223o.... +o22222211111111111111122222o.... +.ooo222111111111111111222233o... +..o2222222111111111212222233o... +.o22222221111112222222222233o... +o222222222211122222222222233o... +.oooo2222222222222A222222333o... +...o222222222222222222222233o... +...o223322222222222222222233o... +....oooo22222222222222222223o... +........o2222222222222222223o... +........o22222222222333332333o.. +.........o22222222333333333T3o.. +.........o23333333333333333333o. +..........o23333333333333333332o +...........o3333333333333333333o +............o3obco33333oooooooo. +.............oobco333ooo........ +..............obcoooocco........ +..............obco..occo........ +.............oobcoo.occo........ +............oabbbcooobcoo....... +............obbbccoobbcco....... +............ooooooPoooooo....... diff --git a/legacy/parts_src/body/avian_round.txt b/legacy/parts_src/body/avian_round.txt new file mode 100644 index 0000000..02bff5a --- /dev/null +++ b/legacy/parts_src/body/avian_round.txt @@ -0,0 +1,28 @@ +..............ooo............. +..........oooo222oooo......... +........oo22222222222oo....... +.......o222222222222222o...... +......o22221111112222222o..... +.....o222111111112B222222o.... +....o222111111111112222222o... +...o22211H11111111122222222o.. +..o222111111111111122222222o.. +..o2221111111111112222222223o. +.o22222111111111222222222223o. +.o22222111111122222222222233o. +.o222221111112222222222222T3o. +.o2222221112222A222222222333o. +.o22222222222222222222233333o. +.o22222222222222222222333333o. +.o2222222222222222223333333o.. +..o222222222222222233333333o.. +..o22222222222222333333333o... +...o222222222223333333333o.... +....o3222222233333333333o..... +.....o33333333333333333o...... +......o333333333333333o....... +.......oo33333333333oo........ +.........ooco333ocoo.......... +..........ocoooooco........... +.........obbco.obbco.......... +..........ooo.P.ooo........... diff --git a/legacy/parts_src/body/biped_bulky.txt b/legacy/parts_src/body/biped_bulky.txt new file mode 100644 index 0000000..f675f93 --- /dev/null +++ b/legacy/parts_src/body/biped_bulky.txt @@ -0,0 +1,39 @@ +.................oooooooooo................. +.............oooo2222222222oooo............. +...........oo222222222222222222oo........... +.........oo22oooooooHooo222222222oo......... +........o111111111122222oo222oooo22o........ +.......o211111111111121122o2o2111222o....... +.......o221111111111111122oo221111222o...... +......o2o22212211122211222oo2111111222o..... +......o22o222221222222222oo22111122223o..... +.....o2o2o22223o22223o222oo22111122223o..... +.....o2o22o223o1o223o1o23oo22111122223o..... +....o22o22o23o111o2o111oo2o22211122233o..... +....o22o222oo1111o3o122222o22221112233o..... +....o222o22oo21111o12222222o22B211223o...... +....o222o2222211112222222222o222122223o..... +...o2223o22222112222222222222o22122223o..... +...o222o222222122222222222222o22222223o..... +...o222o222222222222222222222o212222223o.... +..o2222o222222222222222222222o222222223o.... +..o2222o2222222222222A2222222o222222223o.... +..o2222o222222222222222222223o2212222233o... +.o22222o222222222222222222233o2212222233o... +.o222223o22222222222222222333o22122222333o.. +o2222333o22222222222222233333o22222T23333o.. +o22223333o2222222222233333333o22222233333o.. +o22233332o2222222223333333333o22222233333o.. +.o33333333o222222333333333333o22222233333o.. +.o33333333oo33323333333333333o22222333333o.. +..oo3333oo32oo33333333333333ooo222333333o... +....oooo.o2223ooo33333333ooo112oo333333o.... +.........o2322333oo33333o22222222oo33oo..... +.........o222233333oooooo2222222223oo....... +........oo222333333o....o2222222223o........ +.......o2222333333o....o222222222233o....... +......o222223333333o...o222222233333o....... +......o233333333333o...o222223333333o....... +.......o3333333333o....o222233333333o....... +........oo333333oo......ooo333333ooo........ +..........oooooo......P....oooooo........... diff --git a/legacy/parts_src/body/biped_small.txt b/legacy/parts_src/body/biped_small.txt new file mode 100644 index 0000000..c1c2aa0 --- /dev/null +++ b/legacy/parts_src/body/biped_small.txt @@ -0,0 +1,31 @@ +.............................. +.............................. +............oooooo............ +..........oo222222oo.......... +.........o22222H2222o......... +........o222211122222o........ +.......o22211111122222o....... +.......o22111111112222o....... +......o2221111111122223o...... +......o2221111111122223o...... +......o2221111111122223o...... +......o222211111122ooo3o...... +.....o2o2211111122o1B2oo...... +....o22o2111111222o1222o...... +...o22o22211112222o122o3o..... +..o22o22221112222o2223o32o.... +..o22o222211222A2o222o333o.... +..o23o22221222222o123o333o.... +...o3o2222122222o222o3333o.... +....o22222222222o222o3333o.... +....o22222222222o223o33T3o.... +....o222222222222ooo33333o.... +.....o222222222233333333o..... +......o2222222233333333o...... +.......oo3333333333333o....... +.....oo22ooo333322233o........ +....o2222222o111112222o....... +....o2223333o2111222222o...... +....o33333333o22222232o....... +.....oo33333oo2333333o........ +.......ooooo..Poooooo......... diff --git a/legacy/parts_src/body/biped_tall.txt b/legacy/parts_src/body/biped_tall.txt new file mode 100644 index 0000000..2923527 --- /dev/null +++ b/legacy/parts_src/body/biped_tall.txt @@ -0,0 +1,45 @@ +............oooooooo............ +..........oo22222222oo.......... +.........o2ooooooooo22o......... +........o1o2111H1122oo2oo....... +.......o1111111111112oo22o...... +......o2211111111211o21122o..... +......oo22222111222oo11122o..... +......o2o2222o22223o2111233o.... +......o2o222o1o223o2o21223o..... +.....o2o2o2o111o2o22o21223o..... +.....o22ooo2211o3o223o1222o..... +.....o22ooo22212o2233o22223o.... +.....o233o222222222333o2223o.... +....o22333o2222222233Bo1223o.... +....o22333o2222222233o21223o.... +...oo2233oo2222222233o212233ooo. +..o2o2233oo2222222233o221233222o +.o2222233oo2222222233oo21223ooo. +o32222233o222122A23333o22223o... +.oo223333o222122233333oT2223o... +..o233333o222222333333oo12233o.. +..o233333o22222233333oo212233o.. +...o3333ooo2222233333o3o22333o.. +....oooo.o2oo333333oo23o2233o... +.........o223oooooo2223o333o.... +.........o223333o222233oooo..... +.........o223333o222233o........ +.........o22333o222223o......... +.........o22333o222223o......... +.........o22333o222233o......... +.........o22333o222233o......... +.........o22333o222233o......... +.........o22333o222223o......... +.........o2233o.o22223o......... +.........o2233o.o22223o......... +.........o2233o.o22223o......... +.........o2333o.o21223o......... +.........o2233o.o21223o......... +........oo2233o.o21223o......... +......oo22233o.oo11223o......... +.....o22222333o1111222o......... +.....o23333333o21122333o........ +....o33333333o222222333o........ +.....oooooooo22223333oo......... +.............oooPoooo........... diff --git a/legacy/parts_src/body/blob_drip.txt b/legacy/parts_src/body/blob_drip.txt new file mode 100644 index 0000000..092fa35 --- /dev/null +++ b/legacy/parts_src/body/blob_drip.txt @@ -0,0 +1,38 @@ +.....................oooo................. +...................oo2222o................ +.................oo22222o................. +..............ooo22222222ooo.............. +............oo22222222222222oo............ +..........oo222222112222222222oo.......... +.........o2222211111122222222222o......... +........o222211111111^12222222222o........ +.......o22211111111111111222222222o....... +......o2222111111111111112222oo2222o...... +......o222211111111111111112o12o222o...... +.....o2222111111111111111122o22o2223o..... +.....o22221111111111111112222oB22223o..... +.....o222211111111111112222222222222o..... +....o22222211111111E12222222222222233o.... +....o22222211111111222222222222222233o.... +....o22222222111222222222222222222333o.... +....o22222222112222222222222222223333o.... +....o22222222222222222222222222233333o.... +...o222222222222222222222222222333333oo... +..o22222222222222222222S222222233333332o.. +..o222222222222222222A22222222233333332o.. +..o222222222222222222222222222233333333o.. +..o222o2222222222222222222222223333o333o.. +..o212oo2222222oo2222oo22222o2233T3o233o.. +.o2123o2o21223o11o23o12o223o2o21223o223o.. +.o2123o2o21223o11o23o22o223o2o21223o223o.. +.o2223o2o22223o22o23o22o223o2o22223o233o.. +.o22223o222233o22oooo22o223o2o22223oooo... +..o223oo222233o22222222o223o2o22223o...... +...ooo22o22223o222222222ooo22o2223o2ooo... +..o11222o22223o22222222222233o2223oo222o.. +.o222222o22223o222222233333333oooo11o122o. +.o2222222o223o2223333333333333333o22o222o. +..o2222222ooo333333333333333333333oo333o.. +...ooo333333333333333333333333333333ooo... +......oooooo333333333333333333oooooo...... +............oooooooooPoooooooo............ diff --git a/legacy/parts_src/body/blob_floating.txt b/legacy/parts_src/body/blob_floating.txt new file mode 100644 index 0000000..10918da --- /dev/null +++ b/legacy/parts_src/body/blob_floating.txt @@ -0,0 +1,40 @@ +...................................... +...............oooooooo............... +............ooo22222222ooo............ +..........oo22222222222222oo.......... +.........o222222111222222222o......... +........o22221111111222222222o........ +.......o22211111111^1222222222o....... +......o222111111111111122222222o...... +.....o22211111111111111122222222o..... +.....o22211111111111111112222222o..... +....o2222211111111111112222222223o.... +....o2222211111111111222222B22223o.... +....o2222211111111122222222222233o.... +....o222222111111E222222222222233o.... +....o2222221111222222222222222233o.... +....o2222221112222222222222222333o.... +....o2222222222222222222222223333o.... +....o2222222222222222222222233333o.... +....o22222222222222A2222222333333o.... +....o2222222222222222S222233333T3o.... +.....o22222222222222222233333333oo.... +....o1ooo2222222222222233333333o22o... +...o2111o222222222222233333333o2223o.. +...o2122o22222222222223333333o22333o.. +...o2223o33222222222223333333o23333o.. +...o2233oo322222222222233333o.ooooo... +....oooo..oo222222222223333o.......... +...........o22222222222333o........... +............o3222222222233o........... +.............o322222222223o........... +..............o332222222233o.......... +..............o233233333333o.......... +...............o33333333333o....o..... +................o33333333333o.oo2o.... +.................o33333333332o2222o... +..................oo3333333331222o.... +....................o33333333222o..... +.....................o333333333o...... +......................ooooo333o....... +...........................oPo........ diff --git a/legacy/parts_src/body/blob_round.txt b/legacy/parts_src/body/blob_round.txt new file mode 100644 index 0000000..816cfcf --- /dev/null +++ b/legacy/parts_src/body/blob_round.txt @@ -0,0 +1,31 @@ +...................................... +.............oooooooooooo............. +..........ooo222222222222ooo.......... +........oo222222222222222222oo........ +.......o22222222222^2222222222o....... +......o222222111111122222222222o...... +.....o22211111111111122222222222o..... +....o2221111111111111112222222222o.... +...o222111111111111111112222222222o... +..o22211111111111111111112222222222o.. +..o2222111111111111111111122B222222o.. +.o2222211111111111111111111222222223o. +.o2222221111111111111122222222222233o. +.o222222111111111E222222222222222233o. +.o2222222111111222222222222222222233o. +.o2222222111122222222222222222222233o. +.o22222222122222222A2222222222223333o. +.o2222222222222222222222222222223333o. +.o2222222222222222222222222222223333o. +.o22222222222222222222S2222222223333o. +.o2222222222222222222222222222333333o. +..o22222222222222222222222223333333o.. +..o222222222222222222222333333333T3o.. +.o2222222222222222233333333333333333o. +.o2222222222333333333333333333333333o. +..o22223223333333333333333333333333o.. +...o323333333333333333333333333333o... +....oo33333333333333333333333333oo.... +......oooo333333333333333333oooo...... +..........oooooooooooooooooo.......... +...................P.................. diff --git a/legacy/parts_src/body/fish_body.txt b/legacy/parts_src/body/fish_body.txt new file mode 100644 index 0000000..1c58ed0 --- /dev/null +++ b/legacy/parts_src/body/fish_body.txt @@ -0,0 +1,35 @@ +.................................................. +............ooooooo............................... +.........ooo2222222ooooooooo...................... +........o222222222222o222222oooo.................. +......oo22222112222222o222222222oo................ +.....o22221111111222222oo222B22222oo.............. +....o2222111111^112222222o2222222222oo............ +...o2221111111111122222222o22222222222oo.......... +...o2221111111111111222222o2222222222222ooo....... +..o222111111111111111222222o222222222222222ooo.... +..o222211111111111112222222o222222222222222222o... +.o22222111111111112222222222o222222222222222222o.. +.o22222111111111122222222223o222222222222222222o.. +.o2222211111E112222222222223o222222222222222T23o.. +.o22222211111122222222222223o222222222222222233o.. +.o2222221111222222222222ooo3o222222222333333333o.. +.o2222221122222222222A22oaaoo22222333333333333o... +.o2222222122222222222222oaaaaooo233333333333oo.... +.o2222222222222222222222obaaaaaaooo33333oooo...... +.o2222S22222222222222223obbbaaaaaaaoo3oo.......... +.o22222222222222222222333obbbbbbaaaaaoo........... +..o2222222222222222223333obbcbbbbbbbbbbo.......... +..o22222222222222223333333obbccbbbbbbboo.......... +...o2222222222222233333333obbbbccccccoo........... +...o2222222222233333333333oobbbbbbbbo............. +....o23222233333333333333o3obbbbbbbbbo............ +.....o33333333333333333oo333obcbbbbbbbo........... +......oo33333333333333o33333obbccbbbccco.......... +........o333333333333o333333oobbbcccoo............ +.........ooo3333333ooooooooo..ooooo............... +............ooooooo............................... +.............obbbbco.............................. +..............obbbbco............................. +...............obbcco............................. +................oPoo.............................. diff --git a/legacy/parts_src/body/insect_beetle.txt b/legacy/parts_src/body/insect_beetle.txt new file mode 100644 index 0000000..360f51a --- /dev/null +++ b/legacy/parts_src/body/insect_beetle.txt @@ -0,0 +1,30 @@ +.............................................. +....................oooooooooooooo............ +.................ooo22222222222222ooo......... +................o2222222222B222222222o........ +..............oo2222211112222222222222oo...... +.............o22221111111111122222222222o..... +............o2222111111111111111222222222o.... +...........o2211111oooooooooooooo222222222o... +......ooooo22211ooo22222222222222ooo2222222o.. +.....o22222ooooo21111111111222222222oo22222o.. +....o221111122o11111111111111222222222o22223o. +...o22111H11222o11111111111111112222222o2223o. +..o2211111111222o11111111111111111222222o233o. +..o2221111111122o111111222222222222222222T33o. +..o2221111112222o122222222222222222222222o33o. +..o2221111222222o22222222A222222222222222o33o. +..o2222222222222o222222222222222222222333o3o.. +..o2222222222223o222222222222222222223333o3o.. +...o22222222223o222222222222222222223333o3o... +....o22222222oo22333333333333333333oo33o3o.... +.....o3oooooo12o33333333oo33333333o12oo3o..... +......o2233o1122oooooooo12oooooooo1122oo...... +.....o2223o111222o3333o1122o3333o211122o...... +.....o223o2112233o333o211122o33oo2211222o..... +....o2233o211223oo222o211123oooo2o2122222o.... +....o223o2212233oo223o211223o...oo2222223o.... +.....o33o222223o.o233o222223o....oo222233o.... +......o3o222233o..o33o222233o.....o233333o.... +.......ooo2233o....o33o2233o.......o3333o..... +..........o33o......oo.oP3o.........oooo...... diff --git a/legacy/parts_src/body/insect_larva.txt b/legacy/parts_src/body/insect_larva.txt new file mode 100644 index 0000000..4034125 --- /dev/null +++ b/legacy/parts_src/body/insect_larva.txt @@ -0,0 +1,25 @@ +................................................ +................................................ +................................................ +.......................o........................ +......................o2o.......o............... +......oooooooo.......o22o......o2o......o....... +.....o22222222o.....o122o.....o22o.....o2o...... +....o2211112222o...o1112o....o122o....o22o...... +...o22111H122222ooooooooo...oo212o...o122o...... +..o22111111122222o222222o.ooo2oooo..o2212o...... +..o22111111112222o1111222o2222222ooooooooo...... +.o2221111122222223o1112222o11B12222o22222oooo... +.o2221111222222223o11122222o1111222o111222o22o.. +.o2221112222222223o11122223o11111222o111222o22o. +.o2222222222222333o22222223o11122223o111223o122o +.o2222222222223333o22222A233o2222223o222222T223o +..o22222222223333o222222223o22222223o22oo233o23o +..o2222222oooo333o222ooo333o22oooo33o2o12o3o233o +...o22223o1122o3o222o112o33o2o1122o3oo2112oo333o +....o3333o2112oo222o21122oo22o2112oo2o2122oo33o. +.....o333o1122o2333o21222o332o1122oo3o1123o33o.. +......ooo21223oo333o21233o33o21223o3o21223ooo... +........o21223o.oooo2223o.ooo21223ooo21223o..... +........o22233o....o2223o...o22233o.o22233o..... +.........o233o.....o2233P....o233o...o233o...... diff --git a/legacy/parts_src/body/insect_mantis.txt b/legacy/parts_src/body/insect_mantis.txt new file mode 100644 index 0000000..69dbba4 --- /dev/null +++ b/legacy/parts_src/body/insect_mantis.txt @@ -0,0 +1,35 @@ +...............oooo................. +.......o......o2222o................ +......obo....o221222o............... +......obbo..o2211H222o.............. +......obbboo2oooo11222o............. +..o...obbbcoo1122o1222o............. +.obo..obbbboo1112o22223o............ +.obao..obbco21222o22223o............ +.obaao.obcco21233o22B23o............ +.obaabo.oco22223o22222o2oo.......... +.obbaao.obo21233o22223o222o......... +..obabaooo22223o222223o1222o........ +..obbbbbboooo33o2222233o122o........ +...obbbbbbbbboo2222223o11223o....... +...obcbcbbaaboo2222223o11122o....... +....occccbbbbo12222223o111223o...... +.....oocccccco22222233o222222o...... +.......oooooo22222A233o2222222o..... +..........o22222222333o22222222o.... +...........o222222333o322222222o.... +...........o2oooo3333o333322T223o... +............o1122o33o3o333333333o... +............o1112o3o22ooo33333333o.. +...........o21122oo2233o.ooo333332o. +...........o21223o22233o....oo3333o. +...........o21223o22233o......oooo.. +...........o21233oo2233o............ +...........o2223o.o22333o........... +..........o22223o..o2333o........... +..........o21233o..o2333o........... +..........o2123o...o23333o.......... +..........o2223o....o2333o.......... +..........o2223o....o2333o.......... +.........o22233o....o2333o.......... +..........o223o..P...o333o.......... diff --git a/legacy/parts_src/body/quad_long.txt b/legacy/parts_src/body/quad_long.txt new file mode 100644 index 0000000..42436a0 --- /dev/null +++ b/legacy/parts_src/body/quad_long.txt @@ -0,0 +1,20 @@ +.................oooooooooooooo...... +.......oooooooooo22222222222222o..... +....ooo22222222222222222B2222222o.... +...o1111111111111111111111oooooo2o... +..o11111H111111111111111oo111112o2o.. +.oaaaaaaaaab11111111111o111111111T2o. +.oaaaaaaaabb11111111111o11111111122o. +.o2baaaaabb11111111111o2111111111222o +o221baaabb111111111111o2111111122223o +o22221bb1112222222A222o2111111222223o +.o22111112222222222222o2111122222223o +.o22211112222222222222o2211222222233o +.o222111222222222222222o21222222233o. +..o22111232222222222222o22222222333o. +...o212223o3333333333333o22222333oo.. +...o2aaaa3ooooooo3333333oaaaaa3oo3o.. +...oaaaaabo223333oooooooaaaaaao333o.. +...obbbbbboo3333o......obbaaabo33o... +....obbbbo.o2333o.......obbbbo333o... +.....oooo...oooo.P.......oooooooo.... diff --git a/legacy/parts_src/body/quad_slim.txt b/legacy/parts_src/body/quad_slim.txt new file mode 100644 index 0000000..eb4b791 --- /dev/null +++ b/legacy/parts_src/body/quad_slim.txt @@ -0,0 +1,20 @@ +.......oooo.oooooooooooo......... +.....oo1222o222222222222oo....... +....o111112111111122222B22o...... +...o11111111111111111222222o..... +..o11111bH111111111111ooooo2o.... +.o2aaaaaaaaabb1111111o11112oTo... +.oaaaaaaaaaabb111111o1111112oo... +.obaaaaaaaaab111111o1111111122o.. +o2bbaaaaaaabb222222o1111111222o.. +.o2bbaaaaabb2222A2o211111122222o. +.o222ooobbb2222222o211111222223o. +.o22o111obb2222222o221112222233o. +..o2o111o2b33333333o2112222233o.. +...o2112o3333333333o2212222333o.. +...o21123333333ooooo22222233ooo.. +...o11223332233o....o222223o222o. +..o211223o22333o...o222223o22233o +..o222223o233333o..o222233o3333o. +...o22233oo3333o....o22333ooooo.. +....ooooo..oooo.P....ooooo....... diff --git a/legacy/parts_src/body/quad_stocky.txt b/legacy/parts_src/body/quad_stocky.txt new file mode 100644 index 0000000..b93a771 --- /dev/null +++ b/legacy/parts_src/body/quad_stocky.txt @@ -0,0 +1,26 @@ +............oooooooo.............. +........oooo22222222oooo.......... +......oo2222211122222B22oo........ +.....o22211111111222222222o....... +....o2211111111111111222222o...... +...o221111111111111111122222o..... +..o2211H111111111111111122222o.... +.oaaaaaaaaaab1111111oooooooo22o... +.oaaaaaaaaabb11111oo11111122oTo... +o22aaaaaaabb11111o1111111111222o.. +o222baaaabb111111o1111111111122o.. +o2222baabb111111o211111111111222o. +o22221bb11111122A211111111112223o. +o222211111112222o111111111122222o. +o22111122122222o22111111222222233o +.o21111122222222o221112222222223o. +.o21111122222222o222112222222233o. +.o21111122222222o222122222222233o. +.o2111122o2222222o2222222222233o.. +.o2111222o2222222o222222222333oo.. +.o2112222o33333333o222222333oo3o.. +.o2aaaaab3oo3333333oaaaaa3oo333o.. +.oaaaaaaao23ooo3333oaaaaao23333o.. +.obbbbbbbo23333oooobbaaabo23333o.. +..obbbbbbo3333o....obbbbbo3333o... +...oooooo.o33o.P....ooooo.o33o.... diff --git a/legacy/parts_src/body/seal_body.txt b/legacy/parts_src/body/seal_body.txt new file mode 100644 index 0000000..f93754a --- /dev/null +++ b/legacy/parts_src/body/seal_body.txt @@ -0,0 +1,27 @@ +............oooooo.............................. +..........oo222222oo............................ +.........o2222222222o........................... +........o2222H1222222o.......................... +.......o22211111122222o......................... +......o2221111111222222oo....................... +.....o2221111111112222222oo..................... +...oo2221111111111122222222oo................... +..o22222111111111111122222222oo................. +.o2222211111111111111122222B222oo............... +..oo22221111111111111112222222222o.............. +..o2222211111111222222222222222222oo............ +.o2222211111112222222222222222222222o........... +..oo222222222222222222222222222222222o.......... +..o22222222222222222222222222222222222oo........ +.o2222222222222222222A222222222222222222oo...... +..oooo222222222222222222222222222222222222oo.... +.....o22oooooo222222222222222222222222222222oo.. +....oooo112222o2222222222222222222222222222222o. +...o1111112222o3333333333333332222222222222222o. +..o1111112223o3333333333333333333333322232T2232o +.o2211122223o333333333333333333333333333333333o. +.o221222223o3333333333333333333333333333333333o. +o2222222333oooooooo33ooooooooo333333333333oooo.. +o22o22333oo........oo233333333o333333ooooo...... +.o2o33ooo...........o3333333ooooooooo........... +..ooooo..............Poooooo.................... diff --git a/legacy/parts_src/body/serpent_coiled.txt b/legacy/parts_src/body/serpent_coiled.txt new file mode 100644 index 0000000..26eea87 --- /dev/null +++ b/legacy/parts_src/body/serpent_coiled.txt @@ -0,0 +1,36 @@ +..........oooooo.............................. +.........o222222o............................. +........o22111222o.....ooo.................... +........o2111H122o...ooaao.................... +.......o221111223o.ooaabbo.................... +.......o221122223ooaabbco..................... +......o2221122223oabbcco...................... +......o2211122223obccoo....................... +......o2211112233ooooooo...................... +.....o22111111233oaabbbco..................... +.....o2211111123ooabbbccco.................... +....o22211111123oobccccoo..................... +....o22211111122ooooooooooooooooooo........... +....o222111111222oo2222222222222222ooo........ +....o222111112222o22122222222B11112222oo...... +....o2222111122222o112222222222211111222o..... +....o22222111222222o113333333333221112222o.... +.....o22221222222222o133333333333211222222o... +......o22222222222222o23333333333122222222o... +......o222222222222222o22333333211222222233o.. +.......oo2222222222332o2222222111112222233o... +.....oo22o222222223333o2211111111112333333o... +...oo22211o22222233333o22221111112222333ooo... +..o2221111o22223333333o333222222222233oo222o.. +.o221111111o2333333333o33A332222223ooo222222o. +o22211111111o33333333oooooooooooooo2222222222o +o222211111111o333333o22222222222222222222T223o +o2222222222222oooooo2222222222222222222222233o +o22222222222222222222222222222222222222332333o +.o222222222222222222222222222222222223333333o. +..o3332222222222222222222222222222333333333o.. +...oo333333333222222222233333333333333333oo... +.....oo33333333333333333333333333333333oo..... +.......ooo33333333333333333333333333ooo....... +..........oooooo33333333333333oooooo.......... +................oooooooPoooooo................ diff --git a/legacy/parts_src/body/serpent_rising.txt b/legacy/parts_src/body/serpent_rising.txt new file mode 100644 index 0000000..bdd131c --- /dev/null +++ b/legacy/parts_src/body/serpent_rising.txt @@ -0,0 +1,47 @@ +............oooo.......................... +...........o2222o......................... +..........o222122oo....................... +.........o222111222o...................... +.........o2211111222o..................... +........o22211H111222o.................... +.........o221111111222o................... +.........o222111111222o................... +..........o222111222223o.................. +...........o22211222222o.................. +............o22222222223o................. +.............o2222222223o................. +.............o2222222223o................. +..............o2222222333o................ +..............o2222223333ooo.............. +.............o21122223333obboo............ +...........oo211122233333obbbco........... +..........o22211112333B3ooobccco.......... +.........o22211112233333oobbccco.......... +.........o22111122223333obbccco........... +.......ooo2211122222333obcccoo............ +.....ooaao2221222223333oooo............... +...ooaaabo221122223333o................... +.ooaaaabbo2211122333oo.................... +oaaaabbbbo221111233o...................... +.oooabbbco22111113o....................... +.oaabbbcco22111123o....................... +oabbbbccco22111122o....................... +.ooobccco2221111222o...................... +....oooo2221111222A2o..................... +.......o2222112222222o.................... +.......o22221122222222ooooo............... +........o2222222222222o2222oooo........... +......oo2o2222222222222o2111222oo......... +....oo2221o122222222222o222111122oo....... +...o2221111o223222222332o3322111222o...... +..o221111111o22222222333333321122222ooooo. +.o2221111112o2222223333333332222222222222o +.o2222111112oo232333333333311222222222222o +.o222222122222oo333333333o11112222T222222o +.o22222222222222ooooooooo11111222233333oo. +..o2222222222222111111111111122233333oo... +...o3332222222222211111112222223333oo..... +....oo3333333333322222222222223333o....... +......oo33333333333222222233333ooo........ +........oooo333333333333333oooo........... +............ooooooooPoooooo............... diff --git a/legacy/parts_src/eyes/eyes_angry.txt b/legacy/parts_src/eyes/eyes_angry.txt new file mode 100644 index 0000000..a67c109 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_angry.txt @@ -0,0 +1,7 @@ +oo............o +.ooo........ooo +...oo.....ooo.. +.ooo......oooo. +owwpo....owwppo +oppwo..P.opppwo +.ooo......oooo. diff --git a/legacy/parts_src/eyes/eyes_beady.txt b/legacy/parts_src/eyes/eyes_beady.txt new file mode 100644 index 0000000..bb87714 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_beady.txt @@ -0,0 +1,3 @@ +oo........oo +pp...P....pp +pp........pp diff --git a/legacy/parts_src/eyes/eyes_big_shiny.txt b/legacy/parts_src/eyes/eyes_big_shiny.txt new file mode 100644 index 0000000..d13829f --- /dev/null +++ b/legacy/parts_src/eyes/eyes_big_shiny.txt @@ -0,0 +1,9 @@ +.oooo......ooooo. +oppppo....opppppo +owwppo....owwpppo +owwppo....owwpppo +oppppo..P.opppppo +oppppo....opppppo +opppwo....oppppwo +opwwpo....oppwwpo +.oooo......ooooo. diff --git a/legacy/parts_src/eyes/eyes_compound.txt b/legacy/parts_src/eyes/eyes_compound.txt new file mode 100644 index 0000000..55e5142 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_compound.txt @@ -0,0 +1,8 @@ +.oooo.....ooooo. +owabbo...owabbbo +oabcbo...oabcbbo +obcbco.P.obcbcbo +obbcco...obbcbco +ocbcco...ocbcbco +.occo.....occco. +..oo.......ooo.. diff --git a/legacy/parts_src/eyes/eyes_cyclops.txt b/legacy/parts_src/eyes/eyes_cyclops.txt new file mode 100644 index 0000000..7c9d89d --- /dev/null +++ b/legacy/parts_src/eyes/eyes_cyclops.txt @@ -0,0 +1,9 @@ +..oooooo.. +.owwwwwwo. +owppppwwwo +opwwpppwwo +opwwPppwwo +opppppwwwo +owppppwwwo +.owwwwwwo. +..oooooo.. diff --git a/legacy/parts_src/eyes/eyes_glowing.txt b/legacy/parts_src/eyes/eyes_glowing.txt new file mode 100644 index 0000000..daafe0a --- /dev/null +++ b/legacy/parts_src/eyes/eyes_glowing.txt @@ -0,0 +1,7 @@ +.oo......ooo.. +oyyo....oyyyo. +oxyo....oxxyo. +oxxo..P.oxxyo. +oxyo....oxyyo. +oyzo....oyyzo. +.oo......ooo.. diff --git a/legacy/parts_src/eyes/eyes_happy_closed.txt b/legacy/parts_src/eyes/eyes_happy_closed.txt new file mode 100644 index 0000000..fd4ebe5 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_happy_closed.txt @@ -0,0 +1,3 @@ +.oo......ooo. +oooo..P.ooooo +o..o....oo.oo diff --git a/legacy/parts_src/eyes/eyes_masked.txt b/legacy/parts_src/eyes/eyes_masked.txt new file mode 100644 index 0000000..b9db96a --- /dev/null +++ b/legacy/parts_src/eyes/eyes_masked.txt @@ -0,0 +1,8 @@ +oo..............oo +oaoo..........oobo +oaoooooooooooooobo +oaowpoaaabbowpwobo +oboppobbPbboppwoco +oboooobbbbboooooco +occccbboooobbcccco +.ooooooo..oooooo.. diff --git a/legacy/parts_src/eyes/eyes_round.txt b/legacy/parts_src/eyes/eyes_round.txt new file mode 100644 index 0000000..b90fe8d --- /dev/null +++ b/legacy/parts_src/eyes/eyes_round.txt @@ -0,0 +1,8 @@ +.oooo.....ooooo. +oppppo...opppppo +owwppo...owwpppo +owwppo...owwpppo +oppppo.P.opppppo +oppppo...opppppo +opppwo...oppppwo +.oooo.....ooooo. diff --git a/legacy/parts_src/eyes/eyes_sharp.txt b/legacy/parts_src/eyes/eyes_sharp.txt new file mode 100644 index 0000000..af90fc1 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_sharp.txt @@ -0,0 +1,6 @@ +o...........o +ooo......oooo +oooo....ooooo +owpo..P.oppwo +oppo....oppwo +.oo......ooo. diff --git a/legacy/parts_src/eyes/eyes_sleepy.txt b/legacy/parts_src/eyes/eyes_sleepy.txt new file mode 100644 index 0000000..3252920 --- /dev/null +++ b/legacy/parts_src/eyes/eyes_sleepy.txt @@ -0,0 +1,5 @@ +.ooo.....oooo. +o112o...o1122o +ooooo..Poooooo +oppwo...opppwo +.ooo.....oooo. diff --git a/legacy/parts_src/head/head_bird.txt b/legacy/parts_src/head/head_bird.txt new file mode 100644 index 0000000..d2b2734 --- /dev/null +++ b/legacy/parts_src/head/head_bird.txt @@ -0,0 +1,21 @@ +...................... +.........oooooooo..... +......ooo22222222o.... +.....o222212^22222o... +....o22111111122222o.. +...o221111111112223o.. +..o2211111111111222o.. +.o222111111111222223o. +.o222211111112222223o. +.o222211112E22222223o. +.o222211122222222233o. +.o222211222222222233o. +.o222222222222222333o. +.o2S2222222222223333o. +.o222222222222233333o. +..o2222222222233333o.. +...o22222223333333o... +....o333333333333o.... +.....o333333P333o..... +......ooo3333ooo...... +.........oooo......... diff --git a/legacy/parts_src/head/head_bulky.txt b/legacy/parts_src/head/head_bulky.txt new file mode 100644 index 0000000..89e5e4d --- /dev/null +++ b/legacy/parts_src/head/head_bulky.txt @@ -0,0 +1,24 @@ +...........ooooooo.......... +........ooo2222222oo........ +.......o222222222222o....... +.....oo22222111222222o...... +...oo22ooooooo^1222222o..... +..o22111111122oooo22222o.... +.o2211111111122112oo222o.... +o22222222222222222oo2223o... +.o2222222222223ooo222223o... +..o2ooooooooooo112222223o... +...o22211111112222222222o... +..o2221111112222222222223o.. +..o222111112E222222222222o.. +.o222211122222222222222223o. +o2222221222222222222222333o. +o222222222222222222223oo333o +o2222S22222222222223oo33333o +o22222222222222233oo3333333o +o2222222222222233333333333o. +.o22222222223333333333333o.. +..o333323333333333333333o... +...oo33333333333333333oo.... +.....ooo3333333P333ooo...... +........ooooooooooo......... diff --git a/legacy/parts_src/head/head_canine.txt b/legacy/parts_src/head/head_canine.txt new file mode 100644 index 0000000..597f6fe --- /dev/null +++ b/legacy/parts_src/head/head_canine.txt @@ -0,0 +1,22 @@ +...........ooooo.......... +.........oo22222oo........ +........o222112222o....... +.......o22111122222oo..... +......o2211111^222222oooo. +.....o2221111112222222222o +.....o221111111112222222o. +.....o22111111112222233o.. +....o22111111112222222ooo. +...oo2111111E222222232322o +.oo222111111222222222332o. +o2222211112222222222233o.. +o222222111222222222223ooo. +o22222S222222222222333322o +o22222222222222222333332o. +.o2oooo2222222223333333o.. +..oo332222222223333333o... +....oo322233333333333o.... +......o3333333333333o..... +.......o3333333P33oo...... +........oooooooooo........ +.......................... diff --git a/legacy/parts_src/head/head_feline.txt b/legacy/parts_src/head/head_feline.txt new file mode 100644 index 0000000..cac24cb --- /dev/null +++ b/legacy/parts_src/head/head_feline.txt @@ -0,0 +1,22 @@ +..........oooooo.......... +........oo222222oo........ +......oo2222122222oo...... +.....o22221112222222o..... +....o22111111^1222222o.... +....o2211111111112222o.... +...o222111111111222223o... +...o222111111111122223o... +...o222211111122222223o... +...o221111112222222223o... +..oo2222112E2222222233oo.. +.o2222221222222222222332o. +o222222122222222222223322o +.ooo222222222222222233ooo. +..o22222222222222233333o.. +.o22222S2222222333333332o. +o222222222222333333333332o +.ooo222323333333333333ooo. +....oo33333333333333oo.... +......ooo33333P33ooo...... +.........oooooooo......... +.......................... diff --git a/legacy/parts_src/head/head_flat.txt b/legacy/parts_src/head/head_flat.txt new file mode 100644 index 0000000..edcb0ae --- /dev/null +++ b/legacy/parts_src/head/head_flat.txt @@ -0,0 +1,18 @@ +.......................... +.......................... +............ooooo......... +....oooo...o22^22o....oo.. +...o2222o.o2222222o.oobbo. +..o221122o22112222oobbbbo. +.o2211122121111222obbbbo.. +.o22111111111112222oooooo. +.o221111111E1112222222obbo +.o2111112221112222222obbbo +o222222222221222222222obo. +o2222222222222o22223333o.. +oooooSoooooooo22223333obo. +.o2222222222222333333obbo. +..o22323333333333333oboo.. +...o3333333333333333oo.... +....ooo3333333P33ooo...... +.......oooooooooo......... diff --git a/legacy/parts_src/head/head_ghost.txt b/legacy/parts_src/head/head_ghost.txt new file mode 100644 index 0000000..a06dfe7 --- /dev/null +++ b/legacy/parts_src/head/head_ghost.txt @@ -0,0 +1,22 @@ +..........................o. +........................oo2o +........oooooooo......oo222o +......oo22222222oooooo2222o. +.....o22212^2222222222222o.. +....o22211111222222222222o.. +...o2211ooo1111112111222o... +..o22ooooooooo111111223o.... +.o22ooooooooooo11122223o.... +.o2ooooooooooooo1222223o.... +o2oooooooooooooo2222223o.... +o2ooooooooooooooo222223o.... +o2o333333E333333o222233o.... +o2o3333333333333o222233o.... +o22o33333333333o2222233o.... +o22o33333333333o2322233o.... +.o22ooS333333oo23333333o.... +.o2222ooooooo2233333333o.... +.o222322222223P33333333o.... +.o22333o33333o33333o333o.... +..o233o.o333o.o333o.o3o..... +...ooo...ooo...ooo...o...... diff --git a/legacy/parts_src/head/head_insect.txt b/legacy/parts_src/head/head_insect.txt new file mode 100644 index 0000000..ab71436 --- /dev/null +++ b/legacy/parts_src/head/head_insect.txt @@ -0,0 +1,20 @@ +.......ooooooooo...... +.....oo222222222oo.... +....o2221112222222o... +...o221111111222222o.. +..o22111111^11122222o. +..o22111111111112222o. +.o2221111111112222223o +.o2222111112222222223o +.o2222112222222222223o +.o2222222E22222222233o +.o2222222222222222333o +.o2222222222222223333o +.o2222222222222233333o +.o2222oo22222223333oo. +.o222o22ooo2233333o... +.o222oS222oooooooo.... +..o2o222222223333o.... +...o2222223P3333o..... +....oo3333333333o..... +......oooooooooo...... diff --git a/legacy/parts_src/head/head_reptile.txt b/legacy/parts_src/head/head_reptile.txt new file mode 100644 index 0000000..d75abb7 --- /dev/null +++ b/legacy/parts_src/head/head_reptile.txt @@ -0,0 +1,20 @@ +.................oo.....oo.. +...............oobbo..oobbo. +..........oo..oaaabo.oabbbo. +.........obboobbaaboobbabbo. +........obbbo2ooooo22obbbbo. +.......obboo2222222222ooco.. +......oooo21111^11222222oo.. +...ooo22211111111111222222o. +..o22221111111111111122223o. +.o211111111111111122222223o. +o2222111111111E12222222223o. +o2222211111122222222222233o. +o222222222222oo22222222333o. +oooooSooooooo222222222333o.. +.o22222222222222222223333o.. +..o3333332222222222333333o.. +...ooo333333333333333333o... +......oooo3333333333333o.... +..........ooo33P33333oo..... +.............oooooooo....... diff --git a/legacy/parts_src/head/head_rock.txt b/legacy/parts_src/head/head_rock.txt new file mode 100644 index 0000000..74fc444 --- /dev/null +++ b/legacy/parts_src/head/head_rock.txt @@ -0,0 +1,22 @@ +...........oo.....oo...... +....ooooooo22o.ooo22oo.... +...o222221o222o2222222o... +...o21111o22222o2222222o.. +..o22111111^2222o2222223o. +.o221111111112222oo22233o. +.o2211111111112222o22333o. +o22211111111222222o22o333o +o22211112222222222o333o33o +o222211222E2222223o333o33o +o23222222222222223o33o333o +o22322222222222223o33o333o +o22322222222222233o333333o +o22222222222222333o333333o +.o2222oooooooo3333o333333o +.ooooo11111122ooooo33333o. +.o211S111111o111122o333o.. +.o22111122222o221222o3o... +.o22222222222o2222233o.... +..o22222233333P33233o..... +...oo33333333333333o...... +.....oooooooooooooo....... diff --git a/legacy/parts_src/head/head_round.txt b/legacy/parts_src/head/head_round.txt new file mode 100644 index 0000000..153eaa9 --- /dev/null +++ b/legacy/parts_src/head/head_round.txt @@ -0,0 +1,22 @@ +........oooooooooo........ +......oo2222222222oo...... +.....o22211111112222o..... +....o2211111111122222o.... +...o221111111^11122222o... +..o22111111111111122222o.. +.o2211111111111111122222o. +.o2111111111111111112222o. +o222111111111111111122222o +o222111111111111111222223o +o222111111111111122222223o +o222111111111122222222223o +o2221111111E1112222222223o +o221111111111111222222223o +o211111111111111122222233o +o211111111111111122222333o +o2111S1111111111122223333o +o2211111o1o11222222333333o +.o2211111o22222333333333o. +..o22212222223333333333o.. +...oo33333oooooooo333oo... +.....ooooo....P...ooo..... diff --git a/legacy/parts_src/snout/beak_duck.txt b/legacy/parts_src/snout/beak_duck.txt new file mode 100644 index 0000000..4a33898 --- /dev/null +++ b/legacy/parts_src/snout/beak_duck.txt @@ -0,0 +1,6 @@ +.ooooooo. +oaaaaaabo +oabbbbbbP +obbbbbbco +.occcccco +..oooooo. diff --git a/legacy/parts_src/snout/beak_hooked.txt b/legacy/parts_src/snout/beak_hooked.txt new file mode 100644 index 0000000..7f709ce --- /dev/null +++ b/legacy/parts_src/snout/beak_hooked.txt @@ -0,0 +1,7 @@ +...oooooo +..oaaaabo +.oaaabbbo +oabbbbbcP +obbcoccco +obco.ooo. +.oo...... diff --git a/legacy/parts_src/snout/beak_short.txt b/legacy/parts_src/snout/beak_short.txt new file mode 100644 index 0000000..f736b06 --- /dev/null +++ b/legacy/parts_src/snout/beak_short.txt @@ -0,0 +1,6 @@ +....ooo. +..ooaabo +.oaaabbo +oaabbbbP +.oobccco +...oooo. diff --git a/legacy/parts_src/snout/fangs.txt b/legacy/parts_src/snout/fangs.txt new file mode 100644 index 0000000..8228718 --- /dev/null +++ b/legacy/parts_src/snout/fangs.txt @@ -0,0 +1,10 @@ +..ooo... +.o1111.. +o1111122 +o111222P +o2222233 +.ooooooo +.owwoww. +.owwoww. +..owoow. +...o..o. diff --git a/legacy/parts_src/snout/fish_lips.txt b/legacy/parts_src/snout/fish_lips.txt new file mode 100644 index 0000000..c3c6e09 --- /dev/null +++ b/legacy/parts_src/snout/fish_lips.txt @@ -0,0 +1,9 @@ +...oooo. +..o1112o +.o111122 +ooppo22P +opppo223 +ooppo223 +.o222233 +..o2333o +...oooo. diff --git a/legacy/parts_src/snout/mandibles.txt b/legacy/parts_src/snout/mandibles.txt new file mode 100644 index 0000000..d03220e --- /dev/null +++ b/legacy/parts_src/snout/mandibles.txt @@ -0,0 +1,10 @@ +..ooo..oooo. +.obbbooaaabo +obbbcoaaabbo +obbcooabbbbP +obco..obbbco +obco...obbco +occo...obcco +.occo.obcco. +..oco.obco.. +...o...oo... diff --git a/legacy/parts_src/snout/muzzle_long.txt b/legacy/parts_src/snout/muzzle_long.txt new file mode 100644 index 0000000..24f889a --- /dev/null +++ b/legacy/parts_src/snout/muzzle_long.txt @@ -0,0 +1,9 @@ +....ooooooo... +..oo1111111111 +.oppp111111111 +opppp11111122P +oppp2222222222 +.ooo2o22222223 +....oo22222233 +.....ooo222333 +........ooo33. diff --git a/legacy/parts_src/snout/muzzle_small.txt b/legacy/parts_src/snout/muzzle_small.txt new file mode 100644 index 0000000..a9b0b73 --- /dev/null +++ b/legacy/parts_src/snout/muzzle_small.txt @@ -0,0 +1,7 @@ +...oooo... +..o11112.. +.pp111222. +opp111222P +o21112222. +.oo222223. +...oooo33. diff --git a/legacy/parts_src/snout/reptile_jaw.txt b/legacy/parts_src/snout/reptile_jaw.txt new file mode 100644 index 0000000..c11b707 --- /dev/null +++ b/legacy/parts_src/snout/reptile_jaw.txt @@ -0,0 +1,10 @@ +....oooooooo +..oo11111222 +.o1111111122 +o11pp111122P +o111p1122222 +ooooooooo222 +.owowowowo22 +.o2222222333 +..o3333333oo +...ooooooo.. diff --git a/legacy/parts_src/snout/snout_pig.txt b/legacy/parts_src/snout/snout_pig.txt new file mode 100644 index 0000000..9c58344 --- /dev/null +++ b/legacy/parts_src/snout/snout_pig.txt @@ -0,0 +1,8 @@ +...oooo..... +..o1111oooo. +.o111111o222 +.o1o11o1o22P +.o1o11o1o223 +.o222222o233 +..o2222ooo3. +...oooo..... diff --git a/legacy/parts_src/snout/tongue_out.txt b/legacy/parts_src/snout/tongue_out.txt new file mode 100644 index 0000000..acd59fa --- /dev/null +++ b/legacy/parts_src/snout/tongue_out.txt @@ -0,0 +1,11 @@ +...ooooooo +..o1111122 +.o11111222 +o11112222P +oooooooo22 +ooaaaabo23 +.oaabbbo33 +.oabbcbo3o +.oabbcboo. +..obbbo... +...ooo.... diff --git a/legacy/parts_src/snout/trunk_short.txt b/legacy/parts_src/snout/trunk_short.txt new file mode 100644 index 0000000..5ecb286 --- /dev/null +++ b/legacy/parts_src/snout/trunk_short.txt @@ -0,0 +1,14 @@ +......oooo11 +....oo111111 +...o11111112 +..o11111112P +..o111122222 +.o1112222223 +.o112222oooo +o112222o.... +o12222o..oo. +o12222o.o22o +o22222oo223o +.o222222233o +..o3333333o. +...ooooooo.. diff --git a/legacy/parts_src/snout/tusks.txt b/legacy/parts_src/snout/tusks.txt new file mode 100644 index 0000000..c967bb0 --- /dev/null +++ b/legacy/parts_src/snout/tusks.txt @@ -0,0 +1,9 @@ +.o.....o.... +oao...obo... +oaao..obbo.P +oabo..obbco. +oabbo.obbcco +.oabboobbcco +.oaabbbocco. +..obbccooo.. +...oooo..... diff --git a/legacy/parts_src/snout/whiskers.txt b/legacy/parts_src/snout/whiskers.txt new file mode 100644 index 0000000..5ba81a7 --- /dev/null +++ b/legacy/parts_src/snout/whiskers.txt @@ -0,0 +1,7 @@ +oo.....ooo...... +..ooo.o11122..oo +.....opp11222o.. +oooooopp1222Pooo +......oo22233o.. +..ooo...ooo33.oo +oo.............. diff --git a/parts/aura/aura_bubbles.png b/parts/aura/aura_bubbles.png new file mode 100644 index 0000000..77dac42 Binary files /dev/null and b/parts/aura/aura_bubbles.png differ diff --git a/parts/aura/aura_dust.png b/parts/aura/aura_dust.png new file mode 100644 index 0000000..31a768c Binary files /dev/null and b/parts/aura/aura_dust.png differ diff --git a/parts/aura/aura_embers.png b/parts/aura/aura_embers.png new file mode 100644 index 0000000..521daef Binary files /dev/null and b/parts/aura/aura_embers.png differ diff --git a/parts/aura/aura_gusts.png b/parts/aura/aura_gusts.png new file mode 100644 index 0000000..42fd891 Binary files /dev/null and b/parts/aura/aura_gusts.png differ diff --git a/parts/aura/aura_leaves.png b/parts/aura/aura_leaves.png new file mode 100644 index 0000000..3b5e4e3 Binary files /dev/null and b/parts/aura/aura_leaves.png differ diff --git a/parts/aura/aura_pebbles.png b/parts/aura/aura_pebbles.png new file mode 100644 index 0000000..7643935 Binary files /dev/null and b/parts/aura/aura_pebbles.png differ diff --git a/parts/aura/aura_power.png b/parts/aura/aura_power.png new file mode 100644 index 0000000..f2f4152 Binary files /dev/null and b/parts/aura/aura_power.png differ diff --git a/parts/aura/aura_rings.png b/parts/aura/aura_rings.png new file mode 100644 index 0000000..241d110 Binary files /dev/null and b/parts/aura/aura_rings.png differ diff --git a/parts/aura/aura_snowflakes.png b/parts/aura/aura_snowflakes.png new file mode 100644 index 0000000..7753631 Binary files /dev/null and b/parts/aura/aura_snowflakes.png differ diff --git a/parts/aura/aura_sparkle.png b/parts/aura/aura_sparkle.png new file mode 100644 index 0000000..a975e4e Binary files /dev/null and b/parts/aura/aura_sparkle.png differ diff --git a/parts/aura/aura_sparks.png b/parts/aura/aura_sparks.png new file mode 100644 index 0000000..e1a64a1 Binary files /dev/null and b/parts/aura/aura_sparks.png differ diff --git a/parts/aura/aura_spores.png b/parts/aura/aura_spores.png new file mode 100644 index 0000000..dea1df2 Binary files /dev/null and b/parts/aura/aura_spores.png differ diff --git a/parts/aura/aura_toxic.png b/parts/aura/aura_toxic.png new file mode 100644 index 0000000..6eaf870 Binary files /dev/null and b/parts/aura/aura_toxic.png differ diff --git a/parts/aura/aura_wisps.png b/parts/aura/aura_wisps.png new file mode 100644 index 0000000..ee2856a Binary files /dev/null and b/parts/aura/aura_wisps.png differ diff --git a/parts/back/cloud_puffs.png b/parts/back/cloud_puffs.png new file mode 100644 index 0000000..ecef2d9 Binary files /dev/null and b/parts/back/cloud_puffs.png differ diff --git a/parts/back/coil_spikes.png b/parts/back/coil_spikes.png new file mode 100644 index 0000000..858132c Binary files /dev/null and b/parts/back/coil_spikes.png differ diff --git a/parts/back/crystal_cluster.png b/parts/back/crystal_cluster.png new file mode 100644 index 0000000..708fac1 Binary files /dev/null and b/parts/back/crystal_cluster.png differ diff --git a/parts/back/dorsal_fin.png b/parts/back/dorsal_fin.png new file mode 100644 index 0000000..4751f74 Binary files /dev/null and b/parts/back/dorsal_fin.png differ diff --git a/parts/back/flame_mane.png b/parts/back/flame_mane.png new file mode 100644 index 0000000..7f014e9 Binary files /dev/null and b/parts/back/flame_mane.png differ diff --git a/parts/back/flower_back.png b/parts/back/flower_back.png new file mode 100644 index 0000000..3da54d7 Binary files /dev/null and b/parts/back/flower_back.png differ diff --git a/parts/back/ghost_tatters.png b/parts/back/ghost_tatters.png new file mode 100644 index 0000000..b4ab652 Binary files /dev/null and b/parts/back/ghost_tatters.png differ diff --git a/parts/back/icicle_spikes.png b/parts/back/icicle_spikes.png new file mode 100644 index 0000000..0bec4a5 Binary files /dev/null and b/parts/back/icicle_spikes.png differ diff --git a/parts/back/leaf_cape.png b/parts/back/leaf_cape.png new file mode 100644 index 0000000..e4b3df0 Binary files /dev/null and b/parts/back/leaf_cape.png differ diff --git a/parts/back/mane_fluffy.png b/parts/back/mane_fluffy.png new file mode 100644 index 0000000..47d1ca4 Binary files /dev/null and b/parts/back/mane_fluffy.png differ diff --git a/parts/back/mushroom_back.png b/parts/back/mushroom_back.png new file mode 100644 index 0000000..78f6c16 Binary files /dev/null and b/parts/back/mushroom_back.png differ diff --git a/parts/back/plant_bulb.png b/parts/back/plant_bulb.png new file mode 100644 index 0000000..ed29097 Binary files /dev/null and b/parts/back/plant_bulb.png differ diff --git a/parts/back/rock_plates.png b/parts/back/rock_plates.png new file mode 100644 index 0000000..cc4e0d9 Binary files /dev/null and b/parts/back/rock_plates.png differ diff --git a/parts/back/sail_fin.png b/parts/back/sail_fin.png new file mode 100644 index 0000000..68cdec5 Binary files /dev/null and b/parts/back/sail_fin.png differ diff --git a/parts/back/shell_round.png b/parts/back/shell_round.png new file mode 100644 index 0000000..f4df0a7 Binary files /dev/null and b/parts/back/shell_round.png differ diff --git a/parts/back/shell_spiked.png b/parts/back/shell_spiked.png new file mode 100644 index 0000000..3f189eb Binary files /dev/null and b/parts/back/shell_spiked.png differ diff --git a/parts/back/spikes_back.png b/parts/back/spikes_back.png new file mode 100644 index 0000000..02c2b97 Binary files /dev/null and b/parts/back/spikes_back.png differ diff --git a/parts/back/wings_bat.png b/parts/back/wings_bat.png new file mode 100644 index 0000000..d682a20 Binary files /dev/null and b/parts/back/wings_bat.png differ diff --git a/parts/back/wings_bug.png b/parts/back/wings_bug.png new file mode 100644 index 0000000..93b8932 Binary files /dev/null and b/parts/back/wings_bug.png differ diff --git a/parts/back/wings_dragon.png b/parts/back/wings_dragon.png new file mode 100644 index 0000000..1091626 Binary files /dev/null and b/parts/back/wings_dragon.png differ diff --git a/parts/back/wings_feather.png b/parts/back/wings_feather.png new file mode 100644 index 0000000..a6e8b2a Binary files /dev/null and b/parts/back/wings_feather.png differ diff --git a/parts/back/wings_feather_small.png b/parts/back/wings_feather_small.png new file mode 100644 index 0000000..1662c32 Binary files /dev/null and b/parts/back/wings_feather_small.png differ diff --git a/parts/body/base_axolotl.png b/parts/body/base_axolotl.png new file mode 100644 index 0000000..2b00b4e Binary files /dev/null and b/parts/body/base_axolotl.png differ diff --git a/parts/body/base_bee.png b/parts/body/base_bee.png new file mode 100644 index 0000000..892888a Binary files /dev/null and b/parts/body/base_bee.png differ diff --git a/parts/body/base_beetle.png b/parts/body/base_beetle.png new file mode 100644 index 0000000..bd7698f Binary files /dev/null and b/parts/body/base_beetle.png differ diff --git a/parts/body/base_blob.png b/parts/body/base_blob.png new file mode 100644 index 0000000..44d87d8 Binary files /dev/null and b/parts/body/base_blob.png differ diff --git a/parts/body/base_brawler.png b/parts/body/base_brawler.png new file mode 100644 index 0000000..d53e9a8 Binary files /dev/null and b/parts/body/base_brawler.png differ diff --git a/parts/body/base_bunny.png b/parts/body/base_bunny.png new file mode 100644 index 0000000..20af3e6 Binary files /dev/null and b/parts/body/base_bunny.png differ diff --git a/parts/body/base_chick.png b/parts/body/base_chick.png new file mode 100644 index 0000000..b340f5d Binary files /dev/null and b/parts/body/base_chick.png differ diff --git a/parts/body/base_cub.png b/parts/body/base_cub.png new file mode 100644 index 0000000..93b3273 Binary files /dev/null and b/parts/body/base_cub.png differ diff --git a/parts/body/base_dino.png b/parts/body/base_dino.png new file mode 100644 index 0000000..00dac64 Binary files /dev/null and b/parts/body/base_dino.png differ diff --git a/parts/body/base_drake.png b/parts/body/base_drake.png new file mode 100644 index 0000000..5d5d653 Binary files /dev/null and b/parts/body/base_drake.png differ diff --git a/parts/body/base_eel.png b/parts/body/base_eel.png new file mode 100644 index 0000000..a31b41f Binary files /dev/null and b/parts/body/base_eel.png differ diff --git a/parts/body/base_fawn.png b/parts/body/base_fawn.png new file mode 100644 index 0000000..dc1e08f Binary files /dev/null and b/parts/body/base_fawn.png differ diff --git a/parts/body/base_fox.png b/parts/body/base_fox.png new file mode 100644 index 0000000..6a027bf Binary files /dev/null and b/parts/body/base_fox.png differ diff --git a/parts/body/base_grub.png b/parts/body/base_grub.png new file mode 100644 index 0000000..af0c8fa Binary files /dev/null and b/parts/body/base_grub.png differ diff --git a/parts/body/base_guppy.png b/parts/body/base_guppy.png new file mode 100644 index 0000000..726d5ae Binary files /dev/null and b/parts/body/base_guppy.png differ diff --git a/parts/body/base_hawk.png b/parts/body/base_hawk.png new file mode 100644 index 0000000..4fba0a7 Binary files /dev/null and b/parts/body/base_hawk.png differ diff --git a/parts/body/base_imp.png b/parts/body/base_imp.png new file mode 100644 index 0000000..20f8328 Binary files /dev/null and b/parts/body/base_imp.png differ diff --git a/parts/body/base_noodle.png b/parts/body/base_noodle.png new file mode 100644 index 0000000..07cf6da Binary files /dev/null and b/parts/body/base_noodle.png differ diff --git a/parts/body/base_otter.png b/parts/body/base_otter.png new file mode 100644 index 0000000..04b2895 Binary files /dev/null and b/parts/body/base_otter.png differ diff --git a/parts/body/base_owl.png b/parts/body/base_owl.png new file mode 100644 index 0000000..e482e27 Binary files /dev/null and b/parts/body/base_owl.png differ diff --git a/parts/body/base_pebble.png b/parts/body/base_pebble.png new file mode 100644 index 0000000..92da764 Binary files /dev/null and b/parts/body/base_pebble.png differ diff --git a/parts/body/base_penguin.png b/parts/body/base_penguin.png new file mode 100644 index 0000000..7a0e6bb Binary files /dev/null and b/parts/body/base_penguin.png differ diff --git a/parts/body/base_pixie.png b/parts/body/base_pixie.png new file mode 100644 index 0000000..a5fabc7 Binary files /dev/null and b/parts/body/base_pixie.png differ diff --git a/parts/body/base_pup.png b/parts/body/base_pup.png new file mode 100644 index 0000000..36b2af1 Binary files /dev/null and b/parts/body/base_pup.png differ diff --git a/parts/body/base_salamander.png b/parts/body/base_salamander.png new file mode 100644 index 0000000..5e2a63b Binary files /dev/null and b/parts/body/base_salamander.png differ diff --git a/parts/body/base_slime.png b/parts/body/base_slime.png new file mode 100644 index 0000000..f2e3640 Binary files /dev/null and b/parts/body/base_slime.png differ diff --git a/parts/body/base_wisp.png b/parts/body/base_wisp.png new file mode 100644 index 0000000..f22b7d2 Binary files /dev/null and b/parts/body/base_wisp.png differ diff --git a/parts/body/base_wyrm.png b/parts/body/base_wyrm.png new file mode 100644 index 0000000..822a39b Binary files /dev/null and b/parts/body/base_wyrm.png differ diff --git a/parts/head_top/antennae.png b/parts/head_top/antennae.png new file mode 100644 index 0000000..80b21e4 Binary files /dev/null and b/parts/head_top/antennae.png differ diff --git a/parts/head_top/cloud_tuft.png b/parts/head_top/cloud_tuft.png new file mode 100644 index 0000000..f484c83 Binary files /dev/null and b/parts/head_top/cloud_tuft.png differ diff --git a/parts/head_top/crest_feather.png b/parts/head_top/crest_feather.png new file mode 100644 index 0000000..92deb33 Binary files /dev/null and b/parts/head_top/crest_feather.png differ diff --git a/parts/head_top/crest_flame.png b/parts/head_top/crest_flame.png new file mode 100644 index 0000000..9e30b2f Binary files /dev/null and b/parts/head_top/crest_flame.png differ diff --git a/parts/head_top/crystal_spikes.png b/parts/head_top/crystal_spikes.png new file mode 100644 index 0000000..1c457d4 Binary files /dev/null and b/parts/head_top/crystal_spikes.png differ diff --git a/parts/head_top/ears_bolt.png b/parts/head_top/ears_bolt.png new file mode 100644 index 0000000..d7ede2d Binary files /dev/null and b/parts/head_top/ears_bolt.png differ diff --git a/parts/head_top/ears_fin.png b/parts/head_top/ears_fin.png new file mode 100644 index 0000000..e3684a7 Binary files /dev/null and b/parts/head_top/ears_fin.png differ diff --git a/parts/head_top/ears_floppy.png b/parts/head_top/ears_floppy.png new file mode 100644 index 0000000..615a6d3 Binary files /dev/null and b/parts/head_top/ears_floppy.png differ diff --git a/parts/head_top/ears_long.png b/parts/head_top/ears_long.png new file mode 100644 index 0000000..d0a7d75 Binary files /dev/null and b/parts/head_top/ears_long.png differ diff --git a/parts/head_top/ears_pointed.png b/parts/head_top/ears_pointed.png new file mode 100644 index 0000000..26483c9 Binary files /dev/null and b/parts/head_top/ears_pointed.png differ diff --git a/parts/head_top/ears_round.png b/parts/head_top/ears_round.png new file mode 100644 index 0000000..3043964 Binary files /dev/null and b/parts/head_top/ears_round.png differ diff --git a/parts/head_top/flower_bloom.png b/parts/head_top/flower_bloom.png new file mode 100644 index 0000000..61d7a99 Binary files /dev/null and b/parts/head_top/flower_bloom.png differ diff --git a/parts/head_top/gem_forehead.png b/parts/head_top/gem_forehead.png new file mode 100644 index 0000000..40fa4c0 Binary files /dev/null and b/parts/head_top/gem_forehead.png differ diff --git a/parts/head_top/headband.png b/parts/head_top/headband.png new file mode 100644 index 0000000..06f8419 Binary files /dev/null and b/parts/head_top/headband.png differ diff --git a/parts/head_top/horn_single.png b/parts/head_top/horn_single.png new file mode 100644 index 0000000..c377101 Binary files /dev/null and b/parts/head_top/horn_single.png differ diff --git a/parts/head_top/horns_dragon.png b/parts/head_top/horns_dragon.png new file mode 100644 index 0000000..3297608 Binary files /dev/null and b/parts/head_top/horns_dragon.png differ diff --git a/parts/head_top/horns_ram.png b/parts/head_top/horns_ram.png new file mode 100644 index 0000000..e76afc4 Binary files /dev/null and b/parts/head_top/horns_ram.png differ diff --git a/parts/head_top/ice_crown.png b/parts/head_top/ice_crown.png new file mode 100644 index 0000000..c18ec02 Binary files /dev/null and b/parts/head_top/ice_crown.png differ diff --git a/parts/head_top/leaf_sprout.png b/parts/head_top/leaf_sprout.png new file mode 100644 index 0000000..b6679ce Binary files /dev/null and b/parts/head_top/leaf_sprout.png differ diff --git a/parts/head_top/mushroom_cap.png b/parts/head_top/mushroom_cap.png new file mode 100644 index 0000000..1382366 Binary files /dev/null and b/parts/head_top/mushroom_cap.png differ diff --git a/parts/head_top/spiky_hair.png b/parts/head_top/spiky_hair.png new file mode 100644 index 0000000..6715710 Binary files /dev/null and b/parts/head_top/spiky_hair.png differ diff --git a/parts/head_top/water_spout.png b/parts/head_top/water_spout.png new file mode 100644 index 0000000..fd53e0c Binary files /dev/null and b/parts/head_top/water_spout.png differ diff --git a/parts/head_top/wisp_flame.png b/parts/head_top/wisp_flame.png new file mode 100644 index 0000000..bdef19e Binary files /dev/null and b/parts/head_top/wisp_flame.png differ diff --git a/parts/tail/tail_club.png b/parts/tail/tail_club.png new file mode 100644 index 0000000..52024ba Binary files /dev/null and b/parts/tail/tail_club.png differ diff --git a/parts/tail/tail_crystal.png b/parts/tail/tail_crystal.png new file mode 100644 index 0000000..6162d7e Binary files /dev/null and b/parts/tail/tail_crystal.png differ diff --git a/parts/tail/tail_curly.png b/parts/tail/tail_curly.png new file mode 100644 index 0000000..c129a77 Binary files /dev/null and b/parts/tail/tail_curly.png differ diff --git a/parts/tail/tail_dragon.png b/parts/tail/tail_dragon.png new file mode 100644 index 0000000..6b5a559 Binary files /dev/null and b/parts/tail/tail_dragon.png differ diff --git a/parts/tail/tail_feather_fan.png b/parts/tail/tail_feather_fan.png new file mode 100644 index 0000000..5bff4bc Binary files /dev/null and b/parts/tail/tail_feather_fan.png differ diff --git a/parts/tail/tail_fish_fin.png b/parts/tail/tail_fish_fin.png new file mode 100644 index 0000000..427d471 Binary files /dev/null and b/parts/tail/tail_fish_fin.png differ diff --git a/parts/tail/tail_flame_tip.png b/parts/tail/tail_flame_tip.png new file mode 100644 index 0000000..33e7efc Binary files /dev/null and b/parts/tail/tail_flame_tip.png differ diff --git a/parts/tail/tail_fluffy.png b/parts/tail/tail_fluffy.png new file mode 100644 index 0000000..b937055 Binary files /dev/null and b/parts/tail/tail_fluffy.png differ diff --git a/parts/tail/tail_ice_shard.png b/parts/tail/tail_ice_shard.png new file mode 100644 index 0000000..e81b510 Binary files /dev/null and b/parts/tail/tail_ice_shard.png differ diff --git a/parts/tail/tail_leaf.png b/parts/tail/tail_leaf.png new file mode 100644 index 0000000..d9d0179 Binary files /dev/null and b/parts/tail/tail_leaf.png differ diff --git a/parts/tail/tail_lightning.png b/parts/tail/tail_lightning.png new file mode 100644 index 0000000..0b68614 Binary files /dev/null and b/parts/tail/tail_lightning.png differ diff --git a/parts/tail/tail_long_thin.png b/parts/tail/tail_long_thin.png new file mode 100644 index 0000000..a2ffcc3 Binary files /dev/null and b/parts/tail/tail_long_thin.png differ diff --git a/parts/tail/tail_rattle.png b/parts/tail/tail_rattle.png new file mode 100644 index 0000000..df602e7 Binary files /dev/null and b/parts/tail/tail_rattle.png differ diff --git a/parts/tail/tail_spiked.png b/parts/tail/tail_spiked.png new file mode 100644 index 0000000..902fa3d Binary files /dev/null and b/parts/tail/tail_spiked.png differ diff --git a/parts/tail/tail_stinger.png b/parts/tail/tail_stinger.png new file mode 100644 index 0000000..25810f2 Binary files /dev/null and b/parts/tail/tail_stinger.png differ diff --git a/parts/tail/tail_stub.png b/parts/tail/tail_stub.png new file mode 100644 index 0000000..bc3be7f Binary files /dev/null and b/parts/tail/tail_stub.png differ diff --git a/parts/tail/tail_wispy.png b/parts/tail/tail_wispy.png new file mode 100644 index 0000000..57b496e Binary files /dev/null and b/parts/tail/tail_wispy.png differ diff --git a/parts_src/aura/aura_bubbles.txt b/parts_src/aura/aura_bubbles.txt new file mode 100644 index 0000000..9e956dc --- /dev/null +++ b/parts_src/aura/aura_bubbles.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +...........................oo..............ooo...................................... +..........................oyyo............owyyo.............oooo.................... +.........................oywyyo...........oyyzo............oyyyyo................... +.........................oyyyzo...........oyzzo...........oywwyyyo.................. +...............ooo........ozzo.............ooo............oywxyyyo.................. +..............owyyo........oo.............................oyyyyyzo.................. +..............oyyzo.......................................oyyyyzzo.................. +..............oyzzo........................................oyzzzo................... +...............ooo..........................................oooo.................... +.................................................................................... +........................................................................oo.......... +.......................................................................owyo......... +.......................................................................oyzo......... +........................................................................oo.......... +.......oooo......................................................................... +......oyyyyo........................................................................ +.....oywwyyyo....................................................................... +.....oywxyyyo....................................................................... +.....oyyyyyzo....................................................................... +.....oyyyyzzo....................................................................... +......oyzzzo........................................................................ +.......oooo.................................................................oo...... +...........................................................................oyyo..... +..........................................................................oywyyo.... +..........................................................................oyyyzo.... +...........................................................................ozzo..... +............................................................................oo...... +.................................................................................... +.................................................................................... +.................................................................................... +.....oo............................................................................. +....owyo............................................................................ +....oyzo............................................................................ +.....oo............................................................................. +.................................................................................... +.................................................................................... +..........................................P......................................... +.................................................................................... +...........................................................................ooo...... +..........................................................................owyyo..... +..........................................................................oyyzo..... +..........................................................................oyzzo..... +...........................................................................ooo...... +.......oo........................................................................... +......oyyo.......................................................................... +.....oywyyo......................................................................... +.....oyyyzo......................................................................... +......ozzo.......................................................................... +.......oo........................................................................... +.................................................................................... +.......................................................................oo........... +......................................................................owyo.......... +......................................................................oyzo.......... +.......................................................................oo........... +.................................................................................... +.................................................................................... +.............oo..................................................................... +............owyo.................................................................... +............oyzo.................................................................... +.............oo..................................................................... +...................................................................ooo.............. +..................................................................owyyo............. +..................................................................oyyzo............. +.......................oo.........................................oyzzo............. +......................owyo.........................................ooo.............. +......................oyzo.......................................................... +.......................oo........................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_dust.txt b/parts_src/aura/aura_dust.txt new file mode 100644 index 0000000..9114fa3 --- /dev/null +++ b/parts_src/aura/aura_dust.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +...............oo..................................................oo............... +..............oxyo................................................oxyo.............. +..............oyzo................................................oyzo.............. +...............oo..................................................oo............... +.................................................................................... +..........o...............................P...............................o......... +.........oxo.............................................................oxo........ +........oxyzo...........................................................oxyzo....... +.........ozo.............................................................ozo........ +..........o...............................................................o......... +.................................................................................... +.....oo......................................................................oo..... +....oxyo..............oo....................................oo..............oxyo.... +....oyzo.............oxyo..................................oxyo.............oyzo.... +.....oo..............oyzo..................................oyzo..............oo..... +............oooooo....oo......oo....................oo......oo....oooooo............ +...........oyyyyyyo..........oxyo..................oxyo..........oyyyyyyo........... +..........oyyxxxyyyo.........oyzo..................oyzo.........oyyxxxyyyo.......... +.........oyyxxxyyyyyo.........oo....................oo.........oyxxxxxxyyyo......... +.........oyyzzzzzyyzo..oooo..............oo..............oooo..oyyxzzzzzyzo......... +.........oyyzxxxzyyzo.oyyyyo...........ooyyoo...........oyyyyo.oyyxzxyyzyzo......... +......ooooxxzxzzzyyzooyyyyyyo.........oxxyyyyo.........oxyxxyyooyyxzzzxzyyoooo...... +.....oxyyxxxzzxxyyzyoyyxyyyyyo.......ooxxxxyyoo.......oyxxxxyyyoxzyyyyzzyyyyyyo..... +....oxxyxxxyxzzzzzyyyxxxxyyyzo.....ooxxxxxxyyyyoo.....oyyxxxxyzxxxyyzzzyyzyxxyyo.... +...oyxyyxxyyyyyzyyyyyxxxxxyyyo....oxyxxxxyyyzzyyyo....oyxxyxxzxxxxyyyzzyzyyyxxyyo... +...oyyyyyyyzzyyzyyyyyzyxxyzzzyo...oyyyyyyyyyzyyyyo...oyzzyyyyzyyxxyyyzzyyyyyyyyzo... +...oyyyyyyyzooyyyyyyyzyyyzzyyyyo..oyyyyzyyzzzyzyzo..oyyyxyyzzyyyyyyyzzooyyyyzyyzo... +...oyyyyyzzzooyyyyyyzzzzyzyyyyzo..oyyzzzozzozzzzzo..oyyyyyzzyyyyyyyyzzooyzzzzzzzo... +....oyyyzzzo..ozyyzzzzzooyyyzzzo...oozoo.oo.oozoo...oyyyyyzooyyyzzyzzo..ozzzzzzo.... +.....ozzzzo...oyzzzzzzzooyzzzzzo.....o........o.....oyyyyzzooyzzzzzzzo...ozzzzo..... +......oooo.....ozzzzzzo..ozzzzo......................oyzzzo..ozzzzzzo.....oooo...... +................oozzoo....oooo........................oooo....oozzoo................ +..................oo............................................oo.................. +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_embers.txt b/parts_src/aura/aura_embers.txt new file mode 100644 index 0000000..6f29c4b --- /dev/null +++ b/parts_src/aura/aura_embers.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +........................................o............................oo............. +.........................o.............oxo..........................oxyo............ +........................oyo...........oxyzo.............o...........oyzo............ +.......................oyyo............ozo.............oyo...........oo............. +......................oyxyo.............o..............oyyo......................... +......................oyxzo.............................oyyo........................ +.......................ozo.............................ozyxyo....................... +........................o........o.....................ozyxxyo...................... +................................oxo....................ozyxxyo...................... +...............oo..............oxyzo....................ozyyo....................... +..............oxyo..............ozo......................ooo........................ +..............oyzo...............o.................................................. +...............oo................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +..............................................................................o..... +.............................................................................oyo.... +............................................................................oyyo.... +...........................................................................oyyo..... +...........o..............................................................oyxyzo.... +..........oyo............................................................oyxxyzo.... +.........oyyo............................................................oyxxyzo.... +........oyyo..............................................................oyyzo..... +.......oyxyzo..............................................................ooo...... +......oyxxyzo....................................................................... +......oyxxyzo....................................................................... +.......oyyzo........................................................................ +........ooo......................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +....oo.............................................................................. +...oxyo............................................................................. +...oyzo............................................................................. +....oo.............................................................................. +..........................................P...................................o..... +.............................................................................oxo.... +............................................................................oxyzo... +.............................................................................ozo.... +..............................................................................o..... +.................................................................................... +.................................................................................... +.......o............................................................................ +......oyo........................................................................... +......oyyo.......................................................................... +......oyxyo......................................................................... +......ozxyo......................................................................... +.......ozo.......................................................................... +........o........................................................................... +.................................................................................... +.........................................................................o.......... +........................................................................oyo......... +.......................................................................oyyo......... +......................................................................oyxyo......... +......................................................................oyxzo......... +.......................................................................ozo.......... +........................................................................o........... +.................................................................................... +.................................................................................... +......................o............................................................. +.....................oxo............................................................ +....................oxyzo....................................oo..................... +.....................ozo....................................oxyo.................... +......................o.....................................oyzo.................... +.............................................................oo..................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_gusts.txt b/parts_src/aura/aura_gusts.txt new file mode 100644 index 0000000..cac1fbd --- /dev/null +++ b/parts_src/aura/aura_gusts.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +..................................ooooooo........................................... +.................................ozzyyyxxo.......................................... +.............ooooo................ooooooo........................................... +............oxxxxxo................................................................. +...........oxoooooxo................................................................ +...........oxooxxoxo................................................................ +...........oxoooxoxo................................................................ +...........oxxxxxoxo.........................................ooooo.................. +....ooooooooooooooxo........................................oxxxxxo................. +...ozzyyyyyyyyyyyyo........................................oxoooooxo................ +....oooooooooooooo.........................................oxoxxooxo................ +...........................................................oxoxoooxo................ +..............oooooooo.....................................oxoxxxxxo................ +.............ozzyyyyxxo....................................oxooooooooooooooo........ +..............oooooooo......................................oyyyyyyyyyyyyyzzo....... +.............................................................ooooooooooooooo........ +.................................................................................... +.................................................................................... +................................................................ooooooo............. +...............................................................oxxyyyzzo............ +...........ooo..................................................ooooooo............. +..........oxxxo..................................................................... +.........oxoooxo.................................................................... +.........oxoxoxo.................................................................... +.........oxxxoxo.................................................................... +......ooooooooxo.................................................................... +.....ozzyyyyyyo......................................................ooooooooo...... +......oooooooo......................................................oyyyyyyyzzo..... +...................................................................oxooooooooo...... +...................................................................oxoxxxo.......... +...................................................................oxoxoxo.......... +...................................................................oxoooxo.......... +....................................................................oxxxo........... +..............oooooo.................................................ooo............ +.............ozzyyxxo............................................................... +..............oooooo......................P......................................... +.................................................................................... +....................................................................oooooo.......... +...................................................................oxxyyzzo......... +....................................................................oooooo.......... +....ooooooooooooo................................................................... +...ozzyyyyyyyyyyyo.................................................................. +....oooooooooooooxo................................................................. +..........oxxxxxoxo................................................................. +..........oxoooxoxo............................................ooooo................ +..........oxooxxoxo...........................................oxxxxxo............... +..........oxoooooxo..........................................oxoooooxo.............. +...........oxxxxxo...........................................oxoxxooxo.............. +............ooooo............................................oxoxoooxo.............. +.............................................................oxoxxxxxo.............. +.............................................................oxoooooooooooo......... +..............................................................oyyyyyyyyyyzzo........ +...............................................................oooooooooooo......... +.................................................................................... +.................................................................................... +.................................................................................... +...................ooooo............................................................ +..................oxxxxxo........................................................... +.................oxoooooxo...............................oooooooooooo............... +.................oxooxxoxo..............................oyyyyyyyyyyzzo.............. +.................oxoooxoxo.............................oxoooooooooooo............... +.................oxxxxxoxo.............................oxoxxxo...................... +........ooooooooooooooooxo.............................oxoxoxo...................... +.......ozzyyyyyyyyyyyyyyo..............................oxoooxo...................... +........oooooooooooooooo................................oxxxo....................... +.........................................................ooo........................ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_leaves.txt b/parts_src/aura/aura_leaves.txt new file mode 100644 index 0000000..828e183 --- /dev/null +++ b/parts_src/aura/aura_leaves.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +............................................o....................................... +................................o..........oyoo..................................... +..............................ooyo.........oyxxo...........oo....................... +.............................oxxyo.........oyzxxo.........oyxo...................... +..................o.........oxxzyo..........oyzxo.........oyxxoo.................... +................ooyo........oxzyzo...........ooo..........oyzxxxo................... +...............oxxyo.......ozozzo.........................oyyzxxxo.................. +..............oxxzyo........o.oo..........................ozyyzxxo.................. +..............oxzyo........................................ozyyzxo.................. +...............ooo..........................................ozzyozo................. +.............................................................ooo.o.................. +.................................................................................... +...........................................................................o........ +.........................................................................ooyo....... +........................................................................oxxyo....... +.......................................................................oxxzyo....... +............oo.........................................................oxzyo........ +...........oxyo.........................................................ooo......... +.........ooxxyo..................................................................... +........oxxxzyo..................................................................... +.......oxxxzyyo..................................................................... +.......oxxzyyzo..................................................................... +.......oxzyyzo...................................................................... +......ozoyzzo....................................................................... +.......o.ooo........................................................................ +.................................................................................... +.................................................................................... +..........................................................................o......... +.........................................................................oyoo....... +.........................................................................oyxxo...... +.........................................................................oyzxxo..... +.........................................................................ozyzxo..... +..........................................................................ozzozo.... +...........................................................................oo.o..... +.................................................................................... +....o............................................................................... +...oyoo...................................P......................................... +...oyxxo............................................................................ +...oyzxxo........................................................................... +....oyzxo........................................................................... +.....ooo............................................................................ +............................................................................ooo..... +...........................................................................oxzyo.... +...........................................................................oxxzyo... +............................................................................oxxyo... +.............................................................................ooyo... +...............................................................................o.... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.........o.oo....................................................................... +........ozozzo..........................................................oo.......... +.........oxzyzo........................................................oxyo......... +.........oxxzyo......................................................ooxxyo......... +..........oxxyo.....................................................oxxxzyo......... +...........ooyo....................................................oxxxzyyo......... +.............o.....................................................oxxzyyzo......... +...................................................................oxzyyzo.......... +...............................o..................................ozoyzzo........... +.............................ooyo..................oo.o............o.ooo............ +............................oxxyo.................ozzozo............................ +...........................oxxzyo................ozyzxo............................. +...........................oxzyo.................oyzxxo............................. +............................ooo..................oyxxo.............................. +.................................................oyoo............................... +..................................................o................................. +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_pebbles.txt b/parts_src/aura/aura_pebbles.txt new file mode 100644 index 0000000..756aad3 --- /dev/null +++ b/parts_src/aura/aura_pebbles.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.......................oo................ooo..............oo........................ +......................oxxo..............oxxyo............oxxo....................... +.....................oxxyzo............oxxxyzo..........oxxyzo...................... +.....................oyyzzo............oxxyzzo..........oyyzzo.......ooo............ +......................ozzo.............oyyzzzo...........ozzo......ooxxxo........... +.......................oo...............oyzoo.............oo......ozyxxxxo.......... +............ooo..........................oo.......................ozzyxxxxo......... +..........ooxxxoo.................................................ozzzyyyyo......... +.........oxxxxxxyo.................................................ozzzyyo.......... +........oxxxxxxyyzo.................................................oozzo........... +........oxxxxyyzzzo...................................................oo............ +........oyyyyyzzzzo......ooo........................................................ +.........oyyyzzzzo......oxxyo....................................................... +..........oyzzooo......oxxxyzo...................................................... +...........ooo.........oxxyzzo...................................................... +.......................oyyzzzo...................................................... +........................oyzoo....................................................... +.........................oo......................................................... +.................................................................................... +............................................................................ooo..... +...........................................................................oxxyo.... +..........................................................................oxxxyzo... +..........................................................................oxxyzzo... +..........................................................................oyyzzzo... +...........................................................................oyzoo.... +............................................................................oo...... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.......ooo.......................................................................... +......oxxxoo........................................................................ +.....oxxxxyzo....................................................................... +....oxxxxyzzo....................................................................... +....oyyyyzzzo....................................................................... +.....oyyzzzo...............................................................ooo...... +......ozzoo...............................P...............................oyxxo..... +.......oo................................................................ozyxxxo.... +.........................................................................ozzyxxo.... +.........................................................................ozzzyyo.... +..........................................................................oozyo..... +............................................................................oo...... +...............oo..............................................oo................... +..............oxxo............................................oxxo.................. +.............oxxyzo..........................................oxxyzo................. +.............oyyzzo..........................................oyyzzo................. +..............ozzo............................................ozzo.................. +...............oo..............................................oo................... +.................................................................................... +.................................................................................... +......................................................................ooo........... +....................................................................ooxxxoo......... +........ooo........................................................oxxxxxxyo........ +.......oxxyo......................................................oxxxxxxyyzo....... +......oxxxyzo.....................................................oxxxxyyzzzo....... +......oxxyzzo.....................................................oyyyyyzzzzo....... +......oyyzzzo......................................................oyyyzzzzo........ +.......oyzoo........................................................oyzzooo......... +........oo...........................................................ooo............ +......................ooo........................................................... +.....................oxxxoo......................................................... +....................oxxxxyzo........................................................ +...................oxxxxyzzo.............................oo......................... +...................oyyyyzzzo...........oo...............oxxo........................ +....................oyyzzzo...........oxxo.............ozyxxo....................... +.....................ozzoo...........oxxyzo............ozzyyo....................... +......................oo.............oyyzzo.............ozzo........................ +......................................ozzo...............oo......................... +.......................................oo........................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_power.txt b/parts_src/aura/aura_power.txt new file mode 100644 index 0000000..68963cc --- /dev/null +++ b/parts_src/aura/aura_power.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +................o..................................................o................ +...............oxo.........o............................o.........oxo............... +...............oxxo.......oxo..........................oxo.......oxxo............... +...............oxxo......oxxyo........................oyxxo......oxxo............... +.....o.........oxxo.....oxyoyzo......................ozyoyxo.....oxxo.........o..... +....oxo........oxyo......oo.oo........................oo.oo......oyxo........oxo.... +....oxxo.......oxyo..............................................oyxo.......oxxo.... +....oxxo.......oyzo..............................................ozyo.......oxxo.... +....oxxo.......oyzo..............................................ozyo.......oxxo.... +....oxxo........ozo..............................................ozo........oxxo.... +....oxyo.........o................................................o.........oyxo.... +....oxyo....................................................................oyxo.... +....oyzo....................................................................ozyo.... +....oyzo....................................................................ozyo.... +.....ozo....................................................................ozo..... +......o......................................................................o...... +...........o..........o......................................o..........o........... +..........oxo........oxo....................................oxo........oxo.......... +..........oxxo......oxxxo..................................oxxxo......oxxo.......... +..........oxxo.....oxxyxyo................................oyxyxxo.....oxxo.......... +..........oxxo....oxxyoyyzo..............................ozyyoyxxo....oxxo.......... +..........oxxo....oxyo.oyzo..............................ozyo.oyxo....oxxo.......... +..........oxxo.....oo...oo................................oo...oo.....oxxo.......... +..........oxxo........................................................oxxo.......... +..........oxxo........................................................oxxo.......... +..........oxyo........................................................oyxo.......... +..........oxyo........................................................oyxo.......... +..........oxyo........................................................oyxo.......... +..........oxyo........................................................oyxo.......... +..........oxyo........................................................oyxo.......... +..........oyzo........................................................ozyo.......... +..........oyzo........................................................ozyo.......... +..........oyzo........................................................ozyo.......... +..........oyzo........................................................ozyo.......... +...........ozo........................................................ozo........... +............o.............................P............................o............ +.................................................................................... +.................................................................................... +......o.........o..................................................o.........o...... +.....oxo.......oxo................................................oxo.......oxo..... +.....oxxo.....oxxyo..............................................oyxxo.....oxxo..... +.....oxxo....oxyoyzo............................................ozyoyxo....oxxo..... +.....oxxo.....oo.oo..............................................oo.oo.....oxxo..... +.....oxxo..................................................................oxxo..... +.....oxyo..................................................................oyxo..... +.....oxyo..................................................................oyxo..... +.....oxyo..................................................................oyxo..... +.....oxyo............o........................................o............oyxo..... +.....oyzo...........oxo......................................oxo...........ozyo..... +.....oyzo...........oxxo....................................oxxo...........ozyo..... +......ozo...........oxxo....................................oxxo...........ozo...... +.......o............oxxo....................................oxxo............o....... +....................oxxo....................................oxxo.................... +....................oxyo....................................oyxo.................... +....................oxyo....................................oyxo.................... +.............o......oyzo....................................ozyo......o............. +............oxo.....oyzo....................................ozyo.....oxo............ +...........oxxxo.....ozo....................................ozo.....oxxxo........... +..........oxxyxyo.....o......................................o.....oyxyxxo.......... +.........oxxyoyyzo................................................ozyyoyxxo......... +.........oxyo.oyzo................................................ozyo.oyxo......... +..........oo...oo..................................................oo...oo.......... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_rings.txt b/parts_src/aura/aura_rings.txt new file mode 100644 index 0000000..79e96d3 --- /dev/null +++ b/parts_src/aura/aura_rings.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.........................................oo......................................... +........................................oxyo.................oo..................... +........................................oyzo................oxyo.................... +.....................oo..................oo.................oyzo.................... +....................oxyo.....................................oo..................... +....................oyzo............................................................ +.....................oo............................................................. +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +............o...........................................................o........... +...........oxo.........................................................oyo.......... +..........oxxo.........................................................oyyo......... +..........oxo...........................................................oyo......... +.........oxo.............................................................oyo........ +........oxyo.............................................................ozyo....... +........oxyo.............................................................ozyo....... +.......oxyo....o.....................................................o....ozyo...... +.......oxyo...oxo...................................................oyo...ozyo...... +......oxyo...oxxo...................................................oyyo...ozyo..... +......oxyo...oxyo...................................................ozyo...ozyo..... +.....oxxyo..oxxyo...................................................ozyyo..ozyyo.... +.....oxyo...oxyo.....................................................ozyo...ozyo.... +.....oxyo...oxyo.....................................................ozyo...ozyo.... +.....oxyo..oxyo.......................................................ozyo..ozyo.... +....oxyo...oxyo.......................................................ozyo...ozyo... +....oxyo...oxyo.......................................................ozyo...ozyo... +....oxyo...oxyo.......................................................ozyo...ozyo... +....oxyo...oxo.........................................................oyo...ozyo... +....oxyo...oxo.........................................................oyo...ozyo... +....oxo.....o.............................P.............................o.....oyo... +....oxo.......................................................................oyo... +....oxo.......................................................................oyo... +....oxo.......................................................................oyo... +.....o.........................................................................o.... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +..................oo.............................................oo................. +.................oyxo...........................................oyzo................ +..................oyxo.........................................oyzo................. +...................oyxooo...................................oooyzo.................. +....................oyyxxooooo.........................oooooyyzzo................... +.....................oooyyxxxxoooooooooooooooooooooooooyyyyzzooo.................... +........................oooyyyyxxxxxyyyyyyyyyyyyyyyyyyzzzzooo....................... +...........................ooooooyyyyyyyyyyyyyyyzzzzoooooo.......................... +.................................ooooooooooooooooooo................................ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_snowflakes.txt b/parts_src/aura/aura_snowflakes.txt new file mode 100644 index 0000000..47d261d --- /dev/null +++ b/parts_src/aura/aura_snowflakes.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +........................................oo.......................................... +..........................o.o.o........oxyo............o..o..o...................... +.........................oxzxzyo.......oyzo...........oxzoxozyo..................... +..........................zxxyz.........oo.............zxzxzyz...................... +.........................oxxyyyo.......................ozxxyzo...................... +..........................zyyzz.......................oxxxxyyyo..................... +................oo.......oyzyzzo.......................ozyyyzo...................... +...............oxyo.......o.o.o........................zyzyzzz...................... +...............oyzo...................................oyzozozzo..................... +................oo.....................................o..o..o...................... +......................................................................o.o.o......... +.....................................................................oxzxzyo........ +......................................................................zxxyz......... +.....................................................................oxxyyyo........ +......................................................................zyyzz......... +.....................................................................oyzyzzo........ +.......o..o..o........................................................o.o.o......... +......ox.oxo.yo..................................................................... +........x.x.y....................................................................... +.......o.xxy.o...................................................................... +......oxxxxyyyo..................................................................... +.......o.yyy.o...................................................................... +........y.y.z................................................................oo..... +......oy.ozo.zo.............................................................oxyo.... +.......o..o..o..............................................................oyzo.... +.............................................................................oo..... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +........................................................................o..o..o..... +.......................................................................ox.oxo.yo.... +.........................................................................x.x.y...... +..........................................P.............................o.xxy.o..... +.....oo................................................................oxxxxyyyo.... +....oxyo................................................................o.yyy.o..... +....oyzo.................................................................y.y.z...... +.....oo................................................................oy.ozo.zo.... +........................................................................o..o..o..... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.......o.o.o........................................................................ +......oxzxzyo..............................................................oo....... +.......zxxyz..............................................................oxyo...... +......oxxyyyo.............................................................oyzo...... +.......zyyzz...............................................................oo....... +......oyzyzzo....................................................................... +.......o.o.o........................................................................ +.................................................................................... +.................................................................................... +.........................o..o..o.................................................... +........................oxzoxozyo.................................o.o.o............. +.........................zxzxzyz.................................oxzxzyo............ +.........................ozxxyzo..................................zxxyz............. +........................oxxxxyyyo................................oxxyyyo............ +.........................ozyyyzo..................................zyyzz............. +.........................zyzyzzz.....................oo..........oyzyzzo............ +........................oyzozozzo...................oxyo..........o.o.o............. +.........................o..o..o....................oyzo............................ +.....................................................oo............................. +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_sparkle.txt b/parts_src/aura/aura_sparkle.txt new file mode 100644 index 0000000..3a7ffbc --- /dev/null +++ b/parts_src/aura/aura_sparkle.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +...........................................oo............o.......................... +.......................o..................oxyo..........oxo......................... +......................oxo.................oyzo.........ooxoo........................ +.....................ooxoo.................oo.........oxxxyzo....................... +....................oxxxyzo............................ooyoo........o............... +.....................ooyoo..............................ozo........oxo.............. +......................ozo................................o.........oxo.............. +............o..........o.....oo..................................ooxxyoo............ +...........oxo..............oxyo................................oxxxxyyzo........... +...........oxo..............oyzo.................................ooyyzoo............ +...........oxo...............oo....................................oyo.............. +........oooxxyooo..................................................ozo.............. +.......oxxxxxyyyzo..................................................o............... +........oooyyzooo................................................................... +...........oyo...................................................................... +...........oyo...................................................................... +...........ozo.................................................oo................... +............o.................................................oxyo.................. +..............................................................oyzo.................. +...............................................................oo................... +.................................................................................... +............................................................................o....... +...........................................................................oxo...... +.......o..................................................................ooxoo..... +......oxo................................................................oxxxyzo.... +.....oxyzo................................................................ooyoo..... +......ozo..................................................................ozo...... +.......o....................................................................o....... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +..............oo.................................................................... +.............oxyo................................................................... +.............oyzo................................................................... +..............oo.................................................................... +..........................................P......................................... +.................................................................................... +.................................................................................... +.........................................................................o.......... +.........o..............................................................oxo......... +........oxo.............................................................oxo......... +........oxo.............................................................oxo......... +......ooxxyoo........................................................oooxxyooo...... +.....oxxxxyyzo......................................................oxxxxxyyyzo..... +......ooyyzoo........................................................oooyyzooo...... +........oyo.............................................................oyo......... +........ozo.............................................................oyo......... +.........o..............................................................ozo......... +.........................................................................o.......... +.................................................................................... +.................................................................................... +.................................................................................... +.................o.................................................................. +................oxo................................................................. +...............ooxoo................................................................ +..............oxxxyzo.......................................................oo...... +...............ooyoo.......................................................oxyo..... +................ozo........................................................oyzo..... +.................o..............................................o...........oo...... +....................................................o..........oxo.................. +...................................................oxo........ooxoo................. +........o.......................o..................oxo.......oxxxyzo................ +.......oxo.....................oxo...............ooxxyoo......ooyoo................. +......oxyzo...................ooxoo.............oxxxxyyzo......ozo.................. +.......ozo...................oxxxyzo.............ooyyzoo........o................... +........o.....................ooyoo................oyo.............................. +...............................ozo.................ozo.............................. +................................o...................o............................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_sparks.txt b/parts_src/aura/aura_sparks.txt new file mode 100644 index 0000000..c3a4fa7 --- /dev/null +++ b/parts_src/aura/aura_sparks.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +...............................o...........o...o.......................oo........... +..............................oxo.........oxo.oyo.....................oxyo.......... +.............................oxo...........oyoyoyo.........o..........oyzo.......... +............................oxyyo...........oyo.ozo.......oxo..........oo........... +..................o..........ooyo............o...o.........oxo...................... +.................oxo.........oyo...........................ooxo..................... +................ooxoo.......ozo...........................oyyyxo.................... +...............oxxyyzo.......o............................oyooo..................... +................oozoo......................................oyo...................... +.................ozo........................................oyo..................... +..................o..........................................ozo.................... +..............................................................o..................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +............o................................................................o...... +...........oxo..............................................................oxo..... +..........oxo..............................................................ooxoo.... +.........oxoo.............................................................oxxyyzo... +........oxyyyo.............................................................oozoo.... +.........oooyo..............................................................ozo..... +..........oyo................................................................o...... +.........oyo........................................................................ +........ozo......................................................................... +.........o.......................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +............................................................................o....... +...........................................................................oxo...... +..........................................P.................................oyo..... +......o......................................................................oyo.... +.....oxo....................................................................oyo..... +....ooxoo..................................................................oyo...... +...oxxyyzo..................................................................oyo..... +....oozoo....................................................................ozo.... +.....ozo......................................................................o..... +......o............................................................................. +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.........o...o...................................................................... +........oyo.oxo......................................................o...o.......... +.......oyoyoyo......................................................oxo.oyo......... +......ozo.oyo........................................................oyoyoyo........ +.......o...o............o.............................................oyo.ozo....... +.......................oxo.............................................o...o........ +........................oxo......................................................... +.......................oyyxo..............................o......................... +.......................oyoo..............................oxo........................ +........................oyo.............................ooxoo....................... +.........................ozo...........oo..............oxxyyzo...................... +..........................o...........oxyo..............oozoo....................... +......................................oyzo...............ozo........................ +.......................................oo.................o......................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_spores.txt b/parts_src/aura/aura_spores.txt new file mode 100644 index 0000000..1bfcab1 --- /dev/null +++ b/parts_src/aura/aura_spores.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +...........................oo..........oo........................................... +..........................oxyo........oxyo...................oo..................... +..........................oyzo.......oxyyyo.................oxyo.................... +....................ooo....oo........oyyzzo.................oyzo.................... +...................oxxyo..............ozzo...................oo......ooo............ +..................oxxyyyo..............oo...........................oxxyo........... +..................oxyzyyo..........................................oxxyyyo.......... +..................oyyyyzo..........................................oxyzyyo.......... +...................oyzzo...........................................oyyyyzo.......... +....................ooo.............................................oyzzo........... +...........ooo.......................................................ooo............ +..........oxxyo..................................................................... +.........oxxxyyo.................................................................... +........oxxyyzyyo................................................oo................. +........oxyzyyyzo...............................................oxyo................ +........oyyyyzyzo..............................................oxyyyo............... +.........oyyyyzo...............................................oyyzzo............... +..........oyzzo.................................................ozzo................ +...........ooo...................................................oo.......ooo....... +.........................................................................oxxyo...... +........................................................................oxxxyyo..... +.......................................................................oxxyyzyyo.... +..............oo.......................................................oxyzyyyzo.... +.............oxyo......................................................oyyyyzyzo.... +.....ooo.....oyzo.......................................................oyyyyzo..... +....oxxyo.....oo.........................................................oyzzo...... +...oxxyyyo................................................................ooo....... +...oxyzyyo.......................................................................... +...oyyyyzo.......................................................................... +....oyzzo........................................................................... +.....ooo............................................................................ +.................................................................................... +..............................................................................oo.... +.............................................................................oxyo... +.............................................................................oyzo... +..............................................................................oo.... +..........................................P......................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.......ooo.......................................................................... +......oxxyo......................................................................... +.....oxxyyyo...............................................................oo....... +.....oxyzyyo..............................................................oxyo...... +.....oyyyyzo.............................................................oxyyyo..... +......oyzzo..............................................................oyyzzo..... +.......ooo................................................................ozzo...... +...........................................................................oo....... +...............oo................................................................... +..............oxyo.................................................................. +.............oxyyyo................................................................. +.............oyyzzo................................................................. +..............ozzo.................................................................. +.....oo........oo..................................................ooo.............. +....oxyo..........................................................oxxyo............. +....oyzo.........................................................oxxyyyo............ +.....oo..........................................................oxyzyyo............ +.......................ooo.......................................oyyyyzo............ +......................oxxyo.......................................oyzzo......oo..... +.....................oxxxyyo.......................................ooo......oxyo.... +....................oxxyyzyyo...............................................oyzo.... +....................oxyzyyyzo...........................oo...................oo..... +....................oyyyyzyzo..........................oxyo......................... +.....................oyyyyzo....oo....................oxyyyo........................ +......................oyzzo....oxyo...........oo......oyyzzo........................ +.......................ooo.....oyzo..........oxyo......ozzo......................... +................................oo...........oyzo.......oo.......................... +..............................................oo.................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_toxic.txt b/parts_src/aura/aura_toxic.txt new file mode 100644 index 0000000..0b65540 --- /dev/null +++ b/parts_src/aura/aura_toxic.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +......................................................oo............................ +............................oo.......................oyyo........................... +..................oo.......oxyo.....................oyxyyo.......................... +.................oyyo......oyzo.....................oyyyzo.......................... +................oyxyyo......oo.......................ozzo............ooo............ +................oyyyzo................................oo............oyyyo........... +.................ozzo..............................................oyxxyyo.......... +............ooo...oo...............................................oyxyyzo.......... +...........oyyyo...................................................oyyyxzo.......... +..........oyxxyyo...................................................oyzzo........... +.........oyxyyyyyo...................................................ooo............ +.........oyxyyyyzo.................................................................. +.........oyyyyyxzooo................................................................ +..........oyyyzzooyyo............................................oo......ooo........ +...........ozzzooyxyyo..........................................oyyo....oyyyo....... +............ooo.oyyyzo.........................................oyxyyo..oyxxyyo...... +.................ozzo..........................................oyyyzo.oyxyyyyyo..... +..................oo............................................ozzo..oyxyyyyzo..... +.................................................................oo...oyyyyyxzo..... +.......................................................................oyyyzzo...... +........................................................................ozzzo....... +.........................................................................ooo........ +......ooo........................................................................... +.....oyyyo.......................................................................... +....oyxxyyo......................................................................... +....oyxyyzo..................................................................oo..... +....oyyyxzo.................................................................oyyo.... +.....oyzzo.................................................................oyxyyo... +......ooo..................................................................oyyyzo... +............................................................................ozzo.... +.............................................................................oo..... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.......o.....................................................................o...... +......oyo.................................P.................................oyo..... +......oyo...................................................................oyo..... +.....oyxyo.................................................................oyxyo.... +....oyxyyyo...............................................................oyxyyyo... +....oyxyyzo...............................................................oyxyyzo... +....oyyyzzo...............................................................oyyyzzo... +.....ozzzo.................................................................ozzzo.... +......ooo...................................................................ooo..... +.................................................................................... +.................................................................................... +.............o.........................................................o............ +............oyo.......................................................oyo........... +............oyo.......................................................oyo........... +...........oyxyo.....................................................oyxyo.......... +...........oxyzo.....................................................oxyzo.......... +...........oyzzo.....................................................oyzzo.......... +............ooo.......................................................ooo........... +.................................................................................... +.................................................................................... +.................................................................................... +................ooo................................................................. +...............oyyyo............................................ooo................. +..............oyxxyyo..........................................oyyyo................ +.........ooo.oyxyyyyyo........................................oyxxyyo...ooo......... +........oyyyooyxyyyyzo.......................................oyxyyyyyo.oyyyo........ +.......oyxxyyoyyyyyxzo.......................................oyxyyyyzooyxxyyo....... +.......oyxyyzooyyyzzo..oo......oo........................oo..oyyyyyxzooyxyyzo....... +.......oyyyxzo.ozzzo..oyyo....oxyo.....oo.....oo........oyyo..oyyyzzo.oyyyxzo....... +........oyzzo...ooo..oyxyyo...oyzo....oyyo...oxyo......oyxyyo..ozzzo...oyzzo........ +.........ooo.........oyyyzo....oo....oyxyyo..oyzo......oyyyzo...ooo.....ooo......... +......................ozzo...........oyyyzo...oo........ozzo........................ +.......................oo.............ozzo...............oo......................... +.......................................oo........................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/aura/aura_wisps.txt b/parts_src/aura/aura_wisps.txt new file mode 100644 index 0000000..afefa14 --- /dev/null +++ b/parts_src/aura/aura_wisps.txt @@ -0,0 +1,84 @@ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +..............................oo.................................................... +.............................oyyo.............................oo.................... +................o.............oyyo...........................oyyo................... +...............oyoo............oyyo.........................oyyo.................... +................oyyo..........oxyyo........................oyyo..................... +................oxyo.........oxxxyzo.......................oyyo..................... +...............oxxyzo........oxxyyzo.......................oyyyo.................... +...............oxyyzo.........oyzzo.......................ozyyxxo................... +................ozzo...........ooo........................ozyyxxxo.................. +.................oo.......................................ozyyyxxo.................. +...........................................................ozzyyo................... +............................................................oooo.................... +.................................................................................... +..........................................................................o......... +........oo...............................................................oyoo....... +.......oyyo...............................................................oyyo...... +........oyyo..............................................................oxyo...... +.........oyyo............................................................oxxyzo..... +.........oyyo............................................................oxyyzo..... +........oyyyo.............................................................ozzo...... +.......oxxyyzo.............................................................oo....... +......oxxxyyzo...................................................................... +......oxxyyyzo...................................................................... +.......oyyzzo....................................................................... +........oooo........................................................................ +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +....o............................................................................... +...oyoo.......................................................................oo.... +....oyyo.....................................................................oyyo... +....oxyo....................................................................oyyo.... +...oxxyzo..................................................................oyyo..... +...oxyyzo.................................P................................oyyxo.... +....ozzo..................................................................ozyxxxo... +.....oo...................................................................ozyyxxo... +...........................................................................ozzyo.... +............................................................................ooo..... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.........oo......................................................................... +........oyyo........................................................................ +.......oyyo......................................................................... +......oyyo.......................................................................... +......oyyxo......................................................................... +.....ozyxxxo..........................................................oo............ +.....ozyyxxo.........................................................oyyo........... +......ozzyo...........................................................oyyo.......... +.......ooo.............................................................oyyo......... +.......................................................................oyyo......... +......................................................................oyyyo......... +.....................................................................oxxyyzo........ +...........................o........................................oxxxyyzo........ +.........................ooyo.......................................oxxyyyzo........ +........................oyyo.........................................oyyzzo......... +........................oyxo..........................o...............oooo.......... +.......................ozyxxo........................oyoo........................... +.......................ozyyxo.........................oyyo.......................... +........................ozzo..........................oxyo.......................... +.........................oo..........................oxxyzo......................... +.....................................................oxyyzo......................... +......................................................ozzo.......................... +.......................................................oo........................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... +.................................................................................... diff --git a/parts_src/back/cloud_puffs.txt b/parts_src/back/cloud_puffs.txt new file mode 100644 index 0000000..fca9bc7 --- /dev/null +++ b/parts_src/back/cloud_puffs.txt @@ -0,0 +1,20 @@ +.........oooooo............... +.......ooyyyyyyoo............. +......oyyyyxxyyyyo............ +......oyyxxxyyyyyoooooo....... +.....oyyxxxxxxyyyyyyyyyo...... +.....oyyxxxxxyyyyzxxxyyyo..... +...oooyxxxxxxxyyyzxxxxyyyo.... +..oyyyyxxxxxxxxyyzxxxxxyzo.... +.oyyyxxxxxxxxyyyzzxxxxxyzo.... +oyyyyxxxxxxyyyyyzzyxxyyyyooo.. +oyyyyxxxxxyyyyyyyyyyyyyyyyyyo. +oyyyyxxxxxyyyyyyyyyyyyyyyyyyyo +oyyyyyyyyyyyyyyyyyyyyyyyyyyyyo +oyyyyyyyyyyyyyyyyyyyyyyyyyzyzo +oyyyyyyyyyyyyyyyyzzyyyyyzzzzzo +.oyyyyyyyyyyyyyzzzzzyyzzzzzzzo +..ozzzzzzzzzzzzzzzzzzzzzzzzzo. +...ooozzzzzzPzzzzzzzzzoooooo.. +......ooozzzzzzzzzzooo........ +.........oooooooooo........... diff --git a/parts_src/back/coil_spikes.txt b/parts_src/back/coil_spikes.txt new file mode 100644 index 0000000..72266ac --- /dev/null +++ b/parts_src/back/coil_spikes.txt @@ -0,0 +1,24 @@ +..............oo.......... +.............oxxo......... +............oxxo.......... +...........oxxxxo......... +............ooxxo......... +............oxxo.......... +............oxo........... +...........ooo............ +..........oxyzo........... +.........oxxyzzo.....oo... +........oxxyyyzzo...oxyo.. +...oo...oxxyyyzzo..oxyyzo. +..oxyo..oxxyyyzzo.oxxyyzzo +.oxyyzo.oxxyyyzzo.oxxyyzzo +oxxyyzzoooooooooo.oxxyyzzo +oxxyyzzooxxyyyzzooooooooo. +oxxyyzzooxxyyyzzooxxyyzzo. +.ooooooooxxyyyzzooxxyyzzo. +.oxxyyzzooooooooooxxyyzzo. +.oxxyyzzoxxyyyzzoooooooo.. +.oxxyyzzoxxyyyzzoxxyyzzo.. +.ooooooooxxyyyzzoxxyyzzo.. +.oxxyyzzoxxyPyzzoxxyyzzo.. +.oxxyyzzoxxyyyzzoxxyyzzo.. diff --git a/parts_src/back/crystal_cluster.txt b/parts_src/back/crystal_cluster.txt new file mode 100644 index 0000000..cbae320 --- /dev/null +++ b/parts_src/back/crystal_cluster.txt @@ -0,0 +1,23 @@ +...............oo................. +..............obco................ +.............oabco................ +............oaabcco............... +...........oaaabcco............... +...........oaabbbcco.............. +..........oaaabbbcco.............. +..........oaaabbbccco............. +..........oaaabbbccco...o......... +.........oaaaabbbccco.oobo........ +..oo.....oaaabbbbcccoobbco........ +.obcoo...oaaabbbccccobbbcco...ooo. +.obbcco..oaaabbbcccobbbbccooooaabo +oaabbcco.oaaabbbcccobbbbccoaaaabco +oaabbcccooaaabbbcccobbbcccoaabbbco +oaabbbccooaaabbbccobbbbccoaabbbcco +oaaabbcccoaaabbbccobbbccoaabbbcco. +.oaabbbccoaaabbbccobbbcoaabbbccco. +..oaabbcccoaabbbccobbboaaabbbccco. +..oaabbbccoaabbbccobbcoaabbbccco.. +...oaabbccoaabbPccobboaabbbccco... +...oaaabboaaabbbccobboabbbccco.... +....oaaoooooooooooooocobbccco..... diff --git a/parts_src/back/dorsal_fin.txt b/parts_src/back/dorsal_fin.txt new file mode 100644 index 0000000..fe208f8 --- /dev/null +++ b/parts_src/back/dorsal_fin.txt @@ -0,0 +1,19 @@ +.................oo... +..............oooyyo.. +............ooyyyyo... +..........ooyyyyyo.... +.........oaxxxyyo..... +.......ooaaaayyyo..... +......obbaaaabco...... +.....obbaaaabbco...... +....obbbaaabbbco...... +....obbaaaabbcco...... +...obbaaaabbbco....... +...obbaaaabbbco....... +..obbaaaabbbbco....... +..obbaaabbbbbco....... +.obbbabbbbbbbco....... +.obbbbbbbbbbbco....... +.obbbbbbPbccccco...... +obbbbbccccccccco...... +obbbccccccccccco...... diff --git a/parts_src/back/flame_mane.txt b/parts_src/back/flame_mane.txt new file mode 100644 index 0000000..0ad4605 --- /dev/null +++ b/parts_src/back/flame_mane.txt @@ -0,0 +1,26 @@ +..............o....................... +.............oyo....o.....o........... +.........o..oyyo...ozo...oyo.......... +........ozooyyyo..ozzo.ooyo........... +........oo.oyyo..oyzo.oyyyo....o...... +.....o.ozooyyyo..oyzooyyyyo...ozo..... +....oyoyzooyyyo.oyyzooyyyo...ozzo..... +....oooyyoyyyyo.oyyzoyyyyo..oyzo...... +...oyyoyzoyyyyzoyyzoyyyyzo.oyyzo..o... +..oyyyoyoyyyyyzoyyzoyyyyzo.oyzzoooyo.. +..oyyyoyoyyyyyzoyyoyyyyyzooyyzzoyyyo.. +.oyyyyoyoyyyyyzoyyoyyyyyzoyyyzoyyyyo.. +.oyyyyoyoyyyyyyoyyoyyyxyzoyyzoyyyyo... +.oyyyyzooyyyxyyzoyoyyyxyzoyyoyyyyyo... +.oyyyyyooyyyxyyzoyoyyxxyyoyyoyyyyzo.o. +.oyyyyyyoyyyxxyyoyoyyxxyyzooyyyyzzoozo +.oyyyxyyyyyyxxyyyooyyxxyyyoyyyxyzooyzo +.oyyyxyyyyyyxxxyyyyyyxxxyyyyyyxyzoyzzo +..oyyyxyyyyyxxxyyyyyyxxxyyyyyxxyzoyzo. +..oyyyxxyyyyxxxxyxxxxxxxyyyyyxxyzozzo. +..oyyyxxxxyyyxxxxxxxxxxxxxxyxxxzzozzo. +...oyyyxxxxyxxxxxxxxxxxxxxxxxxzzozzo.. +....oyyzxxzzyxxxxxxxxxxxxxxzzzzzozzo.. +....oyyzxxzzzzzzzxxxxxxzzzPzzzooozo... +.....ozzzoooozzzzzzzzzzzzzzooo...o.... +......ozo....oooooooooooooo........... diff --git a/parts_src/back/flower_back.txt b/parts_src/back/flower_back.txt new file mode 100644 index 0000000..91574dc --- /dev/null +++ b/parts_src/back/flower_back.txt @@ -0,0 +1,26 @@ +.............oooooo............. +............obbbbbbo............ +...........obbbbbbbbo........... +......ooooobbbbbbbbccooooo...... +.....oabbbobbbbbbccccobbbbo..... +....oaaaabobbbcccccccoaaabbo.... +...obaaaabboccccccccoaaaaabbo... +...obbaabbboccooooccobaaabbco... +...obaabbbbocoxyyyocobaabbbbo... +..obbabbbbbcoxxxxyyobbbbbbbcco.. +..obbbbbooooyxxxxyyyoooobbbcco.. +...obbbobbboyyxxyyyzobbbobcco... +...obboaaaaoyyyyyyzzoabbbocco... +.o..oobaaaaaoyyyyzzoaaabbboo.... +oyo..obbaaaabozzzzoaabbbbco..... +.oyooobbabbbbbooooaabbbbbcoooo.. +.oyyyobbbbbbbbbobbbbbbbcccoyyyo. +..oyyyobbbbbbbcobbbbbbcccoyyyyo. +..oyyyyobccccccobbbbccccoxxyyo.. +...ozyyyoccccccoobcccccoyyyyyo.. +...oyzzzzooooooxyooooooyyyzzo... +....ozzzzzzzzzoxyoyyyyyyyzzo.... +.....ozzzzzzzzoxyoyyyyyyzzo..... +......ozzzzoooyyPzooyzzzzo...... +.......oooo..oyyyzo.ooooo....... +.............oyyzzo............. diff --git a/parts_src/back/ghost_tatters.txt b/parts_src/back/ghost_tatters.txt new file mode 100644 index 0000000..847525f --- /dev/null +++ b/parts_src/back/ghost_tatters.txt @@ -0,0 +1,24 @@ +......ooooo............... +....ooaabbbooo............ +..ooaaaaaabbbboo.......... +.oaaaaaaaaabbbbboo........ +oaaaaaaaaaabbbbbbbo....... +oaaaaaaaaaabbbcbbbbo...... +oaaaaaaaacabbbcbbbbo...... +obaaaaaaacbbbbbcbbbbo..... +obbbaaaabcbbbbbcbbbbo..... +obbbbbbbbcbbbbbcbbbbbo.... +obbbbbbbbcbbbbbcbbbbbo.... +obbbbbbbbbcbbbbbcbbbbbo... +obbbbbPbbbcbbbbbcbbbbbo... +obbbbbbbbbcbbbbbcbbbbbbo.. +obbbbbbbbbcbbbbbcbbbbbbo.. +obbbbbbbbbcbbbbbbcbbbbbbo. +ocbbbbbbbbcbbbbbbcbbbbbbo. +.occbbbbbbocbbbbbocbbbbbo. +..ooccbbbboocbbbboocbbbbo. +....ooccbbbooccbbbooccbbbo +......ooccbo.oocbbo.oocbbo +........ooco...ocbo...ocbo +..........o.....oco....oco +.................o......o. diff --git a/parts_src/back/icicle_spikes.txt b/parts_src/back/icicle_spikes.txt new file mode 100644 index 0000000..5171cac --- /dev/null +++ b/parts_src/back/icicle_spikes.txt @@ -0,0 +1,24 @@ +..........oo................. +.........oxzo................ +.........oxzo................ +.........oxzo................ +.........oxyo.........oo..... +.........oxyzo.......oxzo.... +.........oxyzo.......oxzo.... +........oxxyzo......oxyzo.... +.oo.....oxxyzo......oxyzo.... +oxzo....oxxyzzo....oxyzo..... +oxyo....oxxyzzo....oxyzo..... +oxyzo...oxxyzzo...oxyyzo..... +oxxzo...oxxyzzo..oxxyzzo...o. +oxxyzo.oxxxyyzzo.oxxyzzo..oxo +oxxyzo.oxxxyyzzooxxyyzzo.oxyo +.oxyzzooxxxyyzzooxxyyzzooxyzo +.oxyyzooxxxyyzzoxxyyzzo.oxyzo +.oxyyzzoxxxyyzzzoxyyzzooxyzo. +.oxxyyzoxxxyyzzzoxyyzzoxyyzo. +.oxxyyoxxxxyyzzzoyyyzzoxyzzo. +.oxxyyoxxxxyyzzzoyyzzzoyyzzo. +.oxxyyoxxxyPyyzzzoyzzzoyzzo.. +.oxxyyoxxxyyyyzzzoyzzzoyzzo.. +.oxxxyoxxxyyyyzzzoyzzzoyzzo.. diff --git a/parts_src/back/leaf_cape.txt b/parts_src/back/leaf_cape.txt new file mode 100644 index 0000000..af720a4 --- /dev/null +++ b/parts_src/back/leaf_cape.txt @@ -0,0 +1,20 @@ +..................oo.................. +................ooyyo......ooo........ +..............ooyyyo.....ooyyyo....... +............ooyxzyyo...ooyyyyo........ +...........oxxxyzyo..ooyxyyyyo........ +.......oo.oyxxxzyyo.oxxxxyzyo......... +......oyyoyxxxyzyzooxxxxzzyzo......... +.....oyyyoxxxyzyzoyyxxxyzyzo.....oooo. +....oxzyoyxxxyyyoyxxxxyzyzzo..oooyyzzo +...oyxyoyyxxyzyyoyyxxyzyyzo.ooyyyzyzo. +..oyxyyoyyxxzyyyoyyxxyyyyzooyyyyzzzzo. +.oyyxyxoyyxyzyyyoyyxzzyyzoyyyyyzyzzo.. +.oyxxyyoyyyzzyyzoyyyzyyyzoyyyyzyzzzo.. +oyyxxzyoyyyzyyzzoyyzyyyyoyyyyzyzzzo... +oyyxyzyzoyyzyzzoyyyzyyzzoyyyyyzzzzo... +oyyyyzzzoyyzzzzoyyyzzzzzoyzyyzzzzo.... +.oyyyzzooyzzzzooyyzzzzzooyzzzzzzzo.... +..ozzzo..ozzoo..oyPzooo..ozzzzzzo..... +...ooo....oo.....ooo......oooooo...... +...................................... diff --git a/parts_src/back/mane_fluffy.txt b/parts_src/back/mane_fluffy.txt new file mode 100644 index 0000000..4ac4f8d --- /dev/null +++ b/parts_src/back/mane_fluffy.txt @@ -0,0 +1,35 @@ +.....................o................... +....................o2o.................. +...................o22o.................. +........o.........o122o.................. +.......o2o.......o1122o.................. +.......o21o...ooo21122o........ooo....... +.......o212o.o22211123ooooooooo222o...... +.......o212oo221111122o2222222222o....... +.......o2122oo211111223o11111122o........ +......o2211222o11112222o11111oo2o........ +.....o211112222o12222233o11oo22ooo....... +.o...o2111122222o2222233ooo2212222o...... +o2ooo22111222323o222233oo2221111222o..... +.o111oooo2222333o222333oo2111111222ooo... +.o2111222o222333o23333oo22111112222222oo. +..o2111122o2233o33333o3o2222ooooooo22222o +..o22221222o333oo33oo33o222o2222222o322o. +..o22222223o33o11oo11oooo2o221111222ooo.. +..o22222233ooo1111122222oo2111111122o.... +..o2223333o21111122222222o22111111223o... +...o23333o222122222222222ooooooo22223o... +....ooooo2222222222222222o222222o2223o... +.......o2222222222222222o22111222o222o... +........o222222222222223o111111222o222o.. +........o22222222222233o2211112223o3332o. +.........o2322222223333o2211122223o33332o +..........o333333333333o22221P2233oooooo. +...........oo33333333333o222222233o...... +.............oo33333333ooo3232223o....... +...............oooooooo...oo33233o....... +............................oo323o....... +..............................o33o....... +...............................o3o....... +................................o3o...... +.................................o....... diff --git a/parts_src/back/mushroom_back.txt b/parts_src/back/mushroom_back.txt new file mode 100644 index 0000000..3f088d9 --- /dev/null +++ b/parts_src/back/mushroom_back.txt @@ -0,0 +1,22 @@ +............ooo............... +.........ooobbbooo............ +........obbbbbbbbbo........... +.......obbaaaawwbbbo.......... +......oaaaaaaaabbbbbo......... +.....obbawwaaaaabbbbbooooo.... +.....obbawwabbbbbwwbbobbbbo... +....obbbabbbbbbbbwwbbcobbbbo.. +....obbbbbbbwbbbbbbbbcobbwwco. +....obbbbbbbbbbbbccwwcoccccco. +...oobbbbcccccccccccccwcccccco +..oabooccccoooooccccooccccccco +.oaaaaaoooo21223oooocooooccoo. +obbwbbbbbbo21223o..oo2233oo... +obbbbbbbbco21223o...o2233o.... +obbboooocco21223o...o2233o.... +.ooo2233ooo21223o...o2233o.... +...o2333o.o21223o...o2233o.... +...o233o..o21223o....o233o.... +...o233o..o2222Po....o233o.... +...o233o..o22233o....o233o.... +...o333o..o223333o...o333o.... diff --git a/parts_src/back/plant_bulb.txt b/parts_src/back/plant_bulb.txt new file mode 100644 index 0000000..2db728d --- /dev/null +++ b/parts_src/back/plant_bulb.txt @@ -0,0 +1,26 @@ +................................ +.................ooooo.......... +................oyyyyyo......... +...............oyyyyyxyo........ +..............oyyyyyyyyo........ +.............oyyyyooozzo........ +.............oyyyoo.oyo......... +..........oooyoooyyooo.......... +.........oyyyyxyyyyyyyo......... +........oyyxyxxxyyyzyyyo........ +.o.....oyyxyyxxxxxxzzyyyo....... +oyo...oyyxyyxxxxxxxxzzyyyo...oo. +oyyo..oyyxyxxxxxxxxxyzyyyo..oyzo +oyyyooyyyyyxxxxxxyyyyzzyyzooyyzo +oyzyyoyyyzxxxxxxyyyyyyzyyzoyyyzo +oyzzyyoyyzxxxyyyyyyyyyzyyoyyzyzo +oyyzyyoyyzyxyyyyyyyyyyzzzoyyyzzo +oyyzzzoyyzyyyyyyyyyyyyzzzoyzyzzo +oyyyzzoyyzyyyyyyyyyyyyzzzoyzzzzo +.oyyyyzoyzyyyyyyyyyyyzzzoyzyzzo. +.oyzzyyoyzyyyyyyyyzzzzzzoyyzzzo. +.oyzzzyyozyyyyyyyzzzzzzoyyzzzzo. +.oyzzzzyyozzzzzzzzzzzzoyyzzzzzo. +..ozzzzzzyozzzPzzzzzzoyzzzzzzo.. +...oozzzzzzoozzzzzzoozzzzzzoo... +.....oooooo..oooooo..oooooo..... diff --git a/parts_src/back/rock_plates.txt b/parts_src/back/rock_plates.txt new file mode 100644 index 0000000..cf3990a --- /dev/null +++ b/parts_src/back/rock_plates.txt @@ -0,0 +1,25 @@ +.............oooooooo.................. +............obbbbbbbbo................. +...........obbaaacbbbbo................ +..........obbbaaacbbbbbo.ooo........... +.........obbbaaacaabbbbbobbboo......... +........obbbaaaacaaabbbcobbcbbo........ +........obbaaaaaacaabbbcoaacbbbo....... +......ooobbaaaaaaabbbbbboacbbbbbooo.... +....oobbbooaaaaaaabbbbbbcocabbbcobbo... +...obbbabbboaaaaabbbbbbccoacbbbboacbo.. +..obbacaabbboaaaabbbbbbccoabbbbbcobbbo. +.obbaacaaabboaaabbbbbbbccobbbbbbcoabbo. +.obbaaacbbbboaabbbbbbbbccobbbbbccobbbco +.obbaaaabbbbcobbbbbbbbcccobbbbcccobbbco +obbbaaabbbbbcobbbbbbbbcccobbbbcccobbbco +obbbaabbbbbccobbbbbbbccccobbbbcccobbbco +obbbbbbbbbbccobbbbbbbcccobbbbbccobbbcco +obbbbbbbbbccobbbbbbbccccobbbbbccobbccco +.obbbbbbbcccobbbbbbcccccobbbbcccobccco. +.obbbbbbccccobPbbbccccccobbbccccobccco. +.obbbbbcccccobbbccccccccocccccccoccco.. +..obcccccccocccccccccccocccccccoccco... +...occccccocccccccccccocccccccooooo.... +....oooooooccccccccccooooooooo......... +...........oooooooooo.................. diff --git a/parts_src/back/sail_fin.txt b/parts_src/back/sail_fin.txt new file mode 100644 index 0000000..cc7535c --- /dev/null +++ b/parts_src/back/sail_fin.txt @@ -0,0 +1,24 @@ +..............o....o.............. +.............obo..obo............. +.........o...obo..obo...o......... +........obo.obco.obco..obo........ +........obo.obcboobcbo.obo........ +.......obco.obcbbbbcbooaco........ +....o..obcbobbcaabbcbbobcbo....... +...obo.obbbbbbbaabbcbbbbcbo..o.... +...oboobbbaababaaabcabbbcbo.obo... +..obcoobabaaaabaaaabaabbcbcoobo... +..obbabbabaaaabaaaabaabbcbbobcbo.. +..obcbbaabaaaabaaaacaabbcbbbbcbo.. +..obcbbbabaaaabaaaacbbbbcbbbbcbo.. +..obcbbbabaaabcaaabcbbbbcbbbbcco.. +..obcbbbbbaabbcbbbbcbbbbcbbbbcco.. +..obcbbbbcabbbcbbbbcbbbbcbbbccco.. +..obcbbbbcbbbbcbbbbcbbbbcbbcccco.. +...ocbbbbcbbbbcbbbbcbbbbcbccccco.. +....obbbbcbbbbcbbbbcbbbbcccccco... +....obbbbcbbbbcbbcccbbccccccco.... +.....obbbcbbbbccccccccccccccco.... +.....obbccccccccPccccccccccco..... +......obccccccccccccccccccco...... +.......occccccccccccccccccco...... diff --git a/parts_src/back/shell_round.txt b/parts_src/back/shell_round.txt new file mode 100644 index 0000000..86021fc --- /dev/null +++ b/parts_src/back/shell_round.txt @@ -0,0 +1,26 @@ +........................................ +........................................ +................oooooooo................ +.............ooobbbbbbbbooo............. +............obbbbbbbbbbbbbbo............ +..........oobbbbbaabbbbbbbbboo.......... +.........oobbbaaaaaabbbbbbbbbbo......... +........oboaaaaaaaccccbbbbbbbobo........ +.......obbooaaaaacaaaacbbbbbbobbo....... +......obbbaoaaaaacaccacaabbbobbbbo...... +.....obbbaaooaaaacacaacaaabbobbbbbo..... +.....obbbaaaooaaaacaccbbbbbobbbbbbo..... +....obbbbaaaaoaabbbbbbbbbbobbbbbbbco.... +....obbbbaaaaoobbbbbbbbbbbobbbbbbbbo.... +...obbbbbaabbbobbbbbbbbbbobbbbbbbbbco... +...obbbbbbbbbboobbbbbbbbbobbbbbbbbbco... +...obbbbbbbbbbbobbbbbbbbobbbbbbbbbbco... +..obbbbbbbbbbbbooooooooooccccccccbccco.. +..obbboooooooooaaaaaoaabboooooooooccco.. +.oaooooaaaaaaoaaaaaaoaaaaaaoaaaabbooobo. +obbaaaoaaaaaaoaaabbbobbbbbboaaaabboaabbo +obbbbbobbbbbbobbbbbbobbbbbbobbbbbbobbbbo +.obbcbobbbbbbobbbbPbobbbcccobbbbbcoccco. +..oooooccccccoccccccoccccccoccccccoooo.. +......ooooooooocccccoccccooooooooo...... +...............oooooooooo............... diff --git a/parts_src/back/shell_spiked.txt b/parts_src/back/shell_spiked.txt new file mode 100644 index 0000000..0fe7fa2 --- /dev/null +++ b/parts_src/back/shell_spiked.txt @@ -0,0 +1,28 @@ +...................oo................... +..................obco.................. +..................obbo.................. +........o........obbbco........o........ +.......obo.......obbbco.......oco....... +.......obboo....obbbbcco....oobco....... +.......obbbboooobooooooboooobbbco....... +.......obbcbbobbbbbbbbbbbbobbbbco....... +.......obbccobbbbaabbbbbbbbobbcco....... +.......obcoobaaaaaaabbbbbbbboocco....... +.......oboooaaaaaaaaaabbbbbbbooco....... +.......oobaoaaaaaaaaaaabbbbbobboo....... +......obbbaooaaaaaaaaaaaabbbobbbbo...... +.ooooobbbaaaooaaaaaaaaaaaaaobbbbbbooooo. +obbbbbobbaaaaoaaabbbbbbbbbobbbbbbobbbcco +.obbbobbbaaaaoobbbbbbbbbbbobbbbbbbobcco. +..obbobbbaaabbobbbbbbbbbbobbbbbbbbocco.. +..obobbbbabbbboobbbbbbbbbobbbbbbbbboco.. +...obbbbbbbbbbbobbbbbbbbobbbbbbbbbbco... +...obbbbbbbbbbboooooooooobbbbbbbbbbco... +..obbboooooooooaaaaaoaabboooooooooccco.. +.oaooooaaaaaaoaaaaaaoaaaaaaoaaaabbooobo. +obbaaaoaaaaaaoaaabbbobbbbbboaaaabboaabbo +obbbbbobbbbbbobbbbbbobbbbbbobbbbbbobbbbo +.obbcbobbbbbbobbbbPbobbbcccobbbbbcoccco. +..oooooccccccoccccccoccccccoccccccoooo.. +......ooooooooocccccoccccooooooooo...... +...............oooooooooo............... diff --git a/parts_src/back/spikes_back.txt b/parts_src/back/spikes_back.txt new file mode 100644 index 0000000..e53fe24 --- /dev/null +++ b/parts_src/back/spikes_back.txt @@ -0,0 +1,18 @@ +....................o............... +...................obo.............. +..................obbo.............. +..................oabo.............. +............o....obabo.............. +...........obo...oaabo.....o........ +..........oabbo.obaabco...obo....... +......o...oaaboobbaabco..oabo....... +.....obo.oaaaboobaaabco.oaabbo...o.. +....oaboobaaacobbaaabcoobaabbo..oco. +...obaboobaaabobbaabbbooaaabco.obco. +...oaabobbaabbcoaaabbbobbaabcoobbco. +..obaabobbaabbobaaabbbobaabbcoobbco. +..oaaabobaabbbobabbbbbobaabbcobbbcco +.obaaabobabbbbobabbbbboaabbbobbbbcco +.obbbbbobbbbbobbbbbbbcobbbbbobbcccco +.obbbbbobbbccobbbbPcccobbbccobccccco +.obbcccobccccobbccccccobccccocccccco diff --git a/parts_src/back/wings_bat.txt b/parts_src/back/wings_bat.txt new file mode 100644 index 0000000..48e56d5 --- /dev/null +++ b/parts_src/back/wings_bat.txt @@ -0,0 +1,26 @@ +..........................oo................ +.........................obbo............... +...........oo...........obbbbooooooooooooo.. +..oooooooooabo..........obabbobaaabbbbbbbo.. +..obbbbbbbcoao..........obaboobbaaaaaaabbo.. +..obbbbbbbooabo........obbbboaobbbbaaabbo... +..obbbbbbocoabo........obabbooaoocbbbbbco... +...obbbbobcoobo........oaaboaboaaoocbbbco... +...obboobbocoaco......obbaboaaobaabooccco... +..obbobbbbocoaco......obabboabcobbbabooco... +..obobbccocccobo......oaabboaabobbbbbbboco.. +..oocbbccocccoaco....obbaboaaabcobbbbccboo.. +..ooobcccocccoaco....obabboaabbbobccccoooo.. +.....occoccccoabo....oaabboaabbbcoccco...... +.....obcocccccobco..obaabobbbbbbbobco....... +.....oboccccccoaco..obaabobbbbcccboco....... +.....ococcccccoaco..oaabbobbccccccboo....... +.....oooooooccoabo.obaabbobccooooccoo....... +............oocobcoobaabobboo....oooo....... +.............ocobcoobabbobo................. +..............obbcobaabbobo................. +...............obcobaabobo.................. +................ooobbPboo................... +..................obbbbo.................... +...................oooo..................... +............................................ diff --git a/parts_src/back/wings_bug.txt b/parts_src/back/wings_bug.txt new file mode 100644 index 0000000..1720b46 --- /dev/null +++ b/parts_src/back/wings_bug.txt @@ -0,0 +1,28 @@ +............................ooaaaaoo.... +....oooo...................oaaaaaaaao... +..oobbbboo................oaaaccccaaao.. +.obbbbbbbbo...............oaacaaaacaao.. +.obbccccbbo..............oaacaaaaaacaao. +obbcbbbbcbbo.............oaacaaaaaacaao. +obbcbbbbcbbo............oaacaaaaaaacabo. +obbcbbbbbcbbo...........oaacaaaaaaacbbo. +obbcbbbbbbcbbo..........oaacaaaaaacabo.. +.obbcbbbcbcbbo.........oaacaaacaaacbbo.. +..obbcbbbcbcbbo........oaacaacaaacbbo... +...obbcbbbccbbo.......oaacaaacaacbbo.... +....obbcbbcbcbbo......oaacaacaacbbo..... +.....obbcbbcbcbbo.....oaacaacacbbo...... +......obbcbbccbbo....oaacaacacbbo....... +......oobbccbccbbo...oaaaacacboooooo.... +....oobboobbccbbbo..oaaaaaccboaaaaaao... +...obbbbbboobbcbbbo.oaaaacaboaaaaaaaao.. +...obbccbbbbobbcbbo.oaaacaboaacccccaao.. +..obbcbbccbbbobbcbboaaaacboaccaaaacabo.. +..obbcbbbbccbbobcbbboaacaoacaaaaaacabo.. +...obbccccccccbobcboaaacoacaaacccccbbo.. +...obbbbbbbcccccobcoaacoacccccccbbbbbo.. +....oobbbbbbbbbbcooaaaoccaaaaabbbbbbo... +......oooooobbbbbboaPoabbbbbbbbboooo.... +............oooooooaaooooooooooo........ +...................oo................... +........................................ diff --git a/parts_src/back/wings_dragon.txt b/parts_src/back/wings_dragon.txt new file mode 100644 index 0000000..802544c --- /dev/null +++ b/parts_src/back/wings_dragon.txt @@ -0,0 +1,32 @@ +................................................ +.........................oo..................... +.........oo.............oabo..oo................ +........obco.............oabooabo............... +.........obcooo...........oabbbbbooooooooooooo.. +..........obcabo...........ooaabboaaaabbbbbbbo.. +.ooooooooooobaabo..........obaabbobbaaaaaaabbo.. +.obbbbbbbbbbobabo..........obaabooobbaaaaabbo... +.obbbbbbbbbbooabo..........obaabooaocbbbbbbco... +..obbbbbbbbocoaabo........obaabbooaaoobbbbbco... +..obbbbbboobcooaco........obaabboobaaboccbbco... +..obbbbbobbbocoabo........obaaboaboaaabooccco... +..obbbbobbbbocoabco......obbabboabobbbbbbocco... +..obboobbbbocccoabo......obaabboabcobbbbbbooco.. +.obbobbccbbocccoabco....obbaaboaaabobbbbbbbboo.. +.ooobbbcccoccccobaco....obbabboaaabcobccccccoo.. +.ooccbccccocccccoabo....obaabboaaabbobccccoo.... +...oocccccocccccoabco..obbabbcoabbbbcoccco...... +.....occcoccccccobabo..obbabbobabbbbcocco....... +.....obccocccccccoaaco.obaabcobabbbbbocco....... +......ococcccccccoaacoobbabbcobbbcccccoo........ +......ococcccccccobaaoobbabbobbbbcccccoo........ +......ooooooocccccoabboaaabcobbcccooocco........ +.............oocccoaabaaabbcobbooo...oo......... +...............oocobbbbaabbcooo................. +.................ocobbbaabcoo................... +..................obbbbbbbco.................... +...................obbbbPbco.................... +....................oobccco..................... +......................occo...................... +.......................oo....................... +................................................ diff --git a/parts_src/back/wings_feather.txt b/parts_src/back/wings_feather.txt new file mode 100644 index 0000000..1e69ce8 --- /dev/null +++ b/parts_src/back/wings_feather.txt @@ -0,0 +1,30 @@ +..............................ooooooo....... +..........................oooobbbbbbboooo... +........................oobbbbbbbbbbbbbbboo. +.....oooo..............oaaaaaaaabbbbbbbbbbbo +...oobbbbooo.........oobaaaaaaaabbbbbbbbbbbo +..obbbbbbbbboo......obbaaaaabbbbbbbbbbbbccco +.obbbbbbbbbbbbo.....obaaaabbbbbbbbbccccccoo. +.obccbbbbbbbbbbo...obbbaaabbbbbbbccccccooo.. +..occbbbbbooobbco.obbbaaabbbbbccccccoooo.... +...ooobbbbbbbooco.obbbaabbbbccccccooooo..... +..obbbbbbbbbbbbbcobbbbabbbbbcccooobbbbbooo.. +.obbbbbccccccbccccobbbbbbbbccooaaaabbbbbbbo. +.obccbbbcccccccccobbbbbbbbbccoaaaaaabbbbbbbo +..occccccccccccccobbbbbbbbccobaaabbbbbbbbbbo +...ooccccccccccccobbbbbbbcccoaaabbbbbccccco. +.....ooccccccccccobbbbbbbccobaaaabccccccoo.. +.......oocccccccobbbbbbbccobbaaabccccooo.... +.........oocccccobbbbbbbccobbaabooooo....... +...........oocccobbbbbbccobbaboobbbbboo..... +.............oocobbbbbcccobboobbbbcbbbbo.... +...............obbbbbbccobbabbbbbbccbbbo.... +...............obbbbbccobbbbbbcccccccco..... +...............obbbbbccobbbbbccccccooo...... +...............obbbbccobbbbbcccoooo......... +................obbcccobbbcccoo............. +................obbccobbbccoo............... +.................obcPbbbcco................. +..................ocobbboo.................. +...................ooooo.................... +............................................ diff --git a/parts_src/back/wings_feather_small.txt b/parts_src/back/wings_feather_small.txt new file mode 100644 index 0000000..ec78e31 --- /dev/null +++ b/parts_src/back/wings_feather_small.txt @@ -0,0 +1,16 @@ +......................oooo.... +....................oobbbboo.. +......ooo.........oobaaabbbbo. +....oobbboo......oaaaaaabbbbbo +...obbbbbbbo....oaaaaabbbbbcbo +..obbbbbbbbbo..obbabbbbbbccco. +..obbbbbbbbbbo.obbbbbbbcccoo.. +...occcccbbbbbobbbbbccccoobbo. +....occcccccbccobbbccooobbbbo. +.....ooccccccccobbbcobbbbbbbo. +.......ooccccccobbccobbbbboo.. +.........oocccobbccobbbooo.... +...........occobbcobbbo....... +............ocobbcoboo........ +.............oobPobo.......... +...............oooo........... diff --git a/parts_src/body/base_axolotl.txt b/parts_src/body/base_axolotl.txt new file mode 100644 index 0000000..e1ee0aa --- /dev/null +++ b/parts_src/body/base_axolotl.txt @@ -0,0 +1,30 @@ +................oooooooo.............oo............ +.....oo......ooo22222222ooo.........oaao........... +....obbo...oo22221111222222oo......oaabo........... +....ocbbo.o222111111122222222o.....oabbo........... +....occboo2211111111^111222222o...oabbo............ +.....occo2211111111111111122222o..oabo..ooo........ +.ooo..oo221111111111111111122222ooabbo.oaaao....... +obbbo.o22111111111111111111122222oabo.oaabbo....... +occbboo2211oooo1111111ooooo112222obboobbbbo........ +.occco2221oppppo11111opppppo222222obbbbbco......... +..occo2221owwppo11111owwpppo222223obbccoo.......... +...ooo2221owwppo11111owwpppo222223obboo............ +.....o2222oppppo11111opppppo222233obbbooo.......... +...ooo2222oppppo11111opppppo222233ocbbbbbo....ooo.. +..occco222opppwo11111oppppwo23333oooooobbboooo222o. +.occcco2222oooo1111111ooooo23333o222222oooo222222o. +..occcoo22aabo2222222222oaab333o111112222B211T222o. +...ooo..o22222oo222222oo233333o111111111111111222o. +.........o222222oooooo3333333o111111111111111222o.. +..........o3333223333333333oo111111111111122223o... +...........oo33333333333ooo1111111111222222233o.... +.............ooo333333oo111111122A22222222233o..... +................oooooo2222222222222222222223o...... +......................o222222222222222223333o...... +.................ooo...o222222222222211113oo....... +................o222o.o1111222333333111112o........ +...............o22223o111112333ooooo211122o........ +...............o22333o222222ooo22333o22222o........ +................o333o.o2222o...o3333o2223o......... +.................ooo...oooo.P...oooo.oooo.......... diff --git a/parts_src/body/base_bee.txt b/parts_src/body/base_bee.txt new file mode 100644 index 0000000..24b6e32 --- /dev/null +++ b/parts_src/body/base_bee.txt @@ -0,0 +1,35 @@ +....................o................. +...................oao................ +......oooo........oaaao............... +.....obbbbo......oaaaabo.............. +.....obbbco......obaabbo.............. +.....obcooo.ooooooooobo...ooo......... +......oo22oo2222222o2ooo.obbbo........ +.......o222o21111122o222obbbbo........ +.......o2121211112222222obbbcco....... +.....oo22111111112111222obbbccoooo.... +....o22211111111^11112222ooccooaabo... +...o22111111111111111122222ocoaaabbo.. +...o21111111111111111111222ooaaaaabo.. +..o2211111111111111111122B3ooaaaabbo.. +.o222111111111111111112222ooaaaabbo... +.o2222oooo1111ooooo11222222oaabbbbo... +.o222oppppo11opppppo2222222obabbbo.... +..o22owwppo11owwpppo2222222obbboo..... +.o222owwppo11owwpppo22222223ooo....... +o2222oppppo11opppppo222222333o........ +o2222oppppo11opppppo22222233oooo...... +o2222opppwo22opAppwo2222233o2222o..... +.o2222oooo2222ooooo22222233o111bbo.... +.o2ab222222oooo22222abb2333o11aa22o... +o1222222222obbo22222222333o111aa122o.. +o21222222222oo222222223333o11aa111bbo. +.o21232222222222222233333o111a112bb2o. +..o223233222222222333333o111aa222bb22o +...o33oo333333333333333o211ab222bb223o +....oo..oo333333333333o222bb222bb2233o +.........o11333333333o.o22bb22bb2T33o. +.........o1112ooo2233o..obb222bb2333o. +.........o2222o.o2333o...o222cc3333o.. +.........o2222o..o33o.....o3cc3333o... +..........oooo.P..oo.......ooooooo.... diff --git a/parts_src/body/base_beetle.txt b/parts_src/body/base_beetle.txt new file mode 100644 index 0000000..6b530cd --- /dev/null +++ b/parts_src/body/base_beetle.txt @@ -0,0 +1,30 @@ +..oo...................................... +..oaoo.................................... +..oaabo................oooooooooo......... +...oaabo...oooooooo..oo222222222ooo....... +...oaabbooo22222222oo22211ww11222o2oo..... +....oaabco22111112222o111w11112222o22o.... +....oaabbco11111122222o11111111B222o22o... +....ooabbc111111^112222oo1111111112o222o.. +...o221111111111111122222o1111111112o22o.. +...o211111111111111111222o1111111111o222o. +..o22111111111111111111222o1111111122o22o. +.o2221111111111111111112222o111112222o223o +.o22211oooo1111ooooo1122222o111122222o223o +.o2221oppppo11opppppo222222o122222222To23o +.o2221owwppo11owwpppo222222o2222222222o23o +.o2222owwppo11owwpppo222222o2222222222o33o +.o2222oppppo11opppppo222222o2222222223o33o +.o2222oppppo22opppppo22222Ao2222222223o3o. +.o2222opppwo22oppppwo222233o222222223333o. +.o22222oooo2222ooooo2222333o22222223333o.. +.o22ab2222oooooo22222abb333o22222333333o.. +..o22222222obbo22222222333o22223333333o... +...o22222222oo22222223333o3333333333ooo... +...o222222222222222233333o33oooo3oooaabo.. +....o322222222222333333oooo3oaaoobcoaabo.. +.....ooo33233333333333obbbcobaaobbcoaabo.. +......obooo33333333oo3obbccobabobccoabbo.. +......obbbbo33333oobboobcccobbbocccobbco.. +......obbbcoooooobbbco.occoobbboccoobbo... +.......oooo......ooooP..oo..oooooo..oo.... diff --git a/parts_src/body/base_blob.txt b/parts_src/body/base_blob.txt new file mode 100644 index 0000000..22fca36 --- /dev/null +++ b/parts_src/body/base_blob.txt @@ -0,0 +1,33 @@ +...................ooooo................ +.................ooaaaabo............... +................oaaabbbbbo.............. +................oaabooobbbo............. +................oabo.oabbco............. +................oabo.obcco.............. +................oabo..ooo............... +.................obbo................... +.................obbo................... +...........oo2222oooo222222oo........... +.........oo222111112222222222oo......... +........o2221111111111112222222o........ +.......o221111111111^11111222222o....... +......o22111111111111111111122B22o...... +.....o2211oooo11111ooooo1111122222o..... +....o2211oppppo111opppppo1111122222o.... +....o2211owwppo111owwpppo1111112222o.... +...o22211owwppo111owwpppo11111122222o... +...o22211oppppo111opppppo11112222223o... +...o22221oppppo111opppppo22222222223o... +...o22211opppwo111oppppwo22222222223o... +...o222211oooo11111ooooo111222222222o... +..o222aab11111oooooo111111aabb2222T23o.. +..o22abbb111111opbo1111111abbb2222333o.. +..o2222221111111oo1111111112222223333o.. +..o2222222211111111111111222222333333o.. +...o222222222222222A2222222333333333o... +....o222222222233333333333333333333o.... +.....oo33333333333333333333333333oo..... +.....obbbbb333333333333333333aaabo...... +.....obbcccccoooooooooooobbbbbbbbo...... +......occccco............obbbbbbo....... +.......ooooo........P.....oooooo........ diff --git a/parts_src/body/base_brawler.txt b/parts_src/body/base_brawler.txt new file mode 100644 index 0000000..c8cb155 --- /dev/null +++ b/parts_src/body/base_brawler.txt @@ -0,0 +1,43 @@ +....o2oo........................oo........ +....o212oo.....................o22o....... +....o2a112oo...oooooooooo....oo223o....... +....o2aaa112ooo2222222222oooo22bb3o....... +.....o2aaab222221111112222o222bbc3o....... +.....o2abbb1111111111122222oobbcc3o....... +.....o2bbb1111111111^11122222obc3o........ +.....o2bb111111111111111112222oc3o........ +.....o221111111111111111111222o33o........ +.....o221oo11111111111111oo1222o3o........ +.....o222ooooo11111111ooooo1222o3o........ +.....o22221ooooo1111ooooo1222222oo........ +......o2221oooo11111ooooo22222223o........ +......o222opppoo211ooppppo2222223o........ +......o222owwppo222owwpppo2222223o........ +......o222owwppo222owwpppo2222223o........ +......o222oppppo222opppppo2222333o........ +......o222oppppo222opppppo2223333o........ +......o222opppwo222oppppwo2333333o........ +.......o222oooo22222ooooo2333333o......... +........o22222ooooooo2223333333o.......... +.........oo222owpppwo22222333oo........... +....ooooo..o222ooooo22222233o............. +..ooaabbboo.oo222222222222oo.............. +.oaaaaaabbbo..ooo333333oooo............... +.oaaaaaaaabo.oo222222222222oooB..ooooo.... +obaaaaaaaabbo11111111111122222ooobbbbbo... +obaaaaaabbboo1111111111111122222bbbbbbbo.. +obbaaabbbbbo1o1111111111111122obbbbbbbbco. +obbbbbbbbbco2o1111111A111111122obbbbbbcco. +.obbbbbbbbo2o111111111111112222obbbbcccco. +.obbbbbbccoo1111111111111222222obbbccccco. +..oocccccooooooooooooooooooooooobccccccco. +....ooooooaaaaaaaaoxxyyoaaaaaaaoccccccco.. +.........obbaaaaaaoyyyzoaaaaabbboccccco... +..........oobbbbbboooooobbbbbboo.ooooo.... +..........o1oooooooooooooooooT3o.......... +.........o2111122o3333333333323o.......... +.........o2111222o33333333323333o......... +.........o21122233ooooooo2233333o......... +.........o2122223o......o2333333o......... +.........o2222233o.......o33333o.......... +..........o22333o....P....o333o........... diff --git a/parts_src/body/base_bunny.txt b/parts_src/body/base_bunny.txt new file mode 100644 index 0000000..8b9cf30 --- /dev/null +++ b/parts_src/body/base_bunny.txt @@ -0,0 +1,45 @@ +......o1111o.............oo22o...... +.....o111112o...........o22223o..... +.....o211112o..........o222223o..... +.....o21aa122o.........o222b23o..... +.....o21aab12o........o222bb33o..... +.....o21aaa122o......o222bbc33o..... +.....o21aaab12o......o222bbc33o..... +.....o21aaab22o......o22bbcc3o...... +.....o21baab222o....o222bbc33o...... +.....o221aab222o....o22bbcc33o...... +......o21aabb22o....o22bbcc3o....... +......o21aabb22ooooo222bcc33o....... +......o22babb222222o22bbcc33o....... +.......o21aoo2221222ooocc33o........ +.......o22o211111111222oo3o......... +.......o22111111111122222oo......... +......o22111111111111122222o........ +.....o2211111111111111122222o....... +.....o21111111111^1111112222o....... +....o2221oooo11111ooooo112222o...... +....o221oppppo111opppppo22223o...... +....o222owwppo111owwpppo22222o...... +...o2222owwppo111owwpppo222233o..... +....o222oppppo122opppppo22223o...... +....o222oppppo222opppppo22233o...... +....o222opppwo222oppppwo23333o...... +.....o222oooo22222ooooo23333o....... +.....oaab222222oo222222aab33o....... +......o222222o2222o22333333o........ +.......o222222oooo33333333o......... +........o33333233333333o3o.......... +.........oooooo3333ooooo2oB......... +..........oaaaaooooaaabbo2o......... +.........obaaaaaaaaaaaaabo2o........ +.........obaaaaaaaaaaaabbo2o........ +.........obbabbabbbbabbbbo3o........ +.........oobbbbbbbbbbbbbco3o........ +.........o2obbcobbbcobbbo33o........ +.........o2obco2obAo2obcoT3o........ +.......oo1oooo222oo222oo332ooo...... +......o111112oo222222333322222o..... +.....o211111112o33333333222223o..... +.....o221112222o33333323223333o..... +......o22222333ooooooo23333333o..... +.......oo2333oo...P...ooo33ooo...... diff --git a/parts_src/body/base_chick.txt b/parts_src/body/base_chick.txt new file mode 100644 index 0000000..11b90e5 --- /dev/null +++ b/parts_src/body/base_chick.txt @@ -0,0 +1,35 @@ +..........o1o......oo............... +...........o1oo...o12o.............. +...........o211o..o12o.............. +............o211o.o11o.............. +.............o222o2222o............. +............ooooo2oooooo............ +..........oo222111122222oo.......... +.........o2221111112222222o......... +........o221111111111222222o........ +.......o2211111111^111122222o....... +......o2211111111111111122222o...... +.....o2211oooo11111ooooo122222o..... +....o2221oppppo111opppppo12B222o.... +....o2211owwppo111owwpppo122222o.... +....o2211owwppo111owwpppo222222o.... +...o22211oppppo111opppppo2ooo223o... +...o22221oppppo111opppppoo111o23o... +..o222221opppwo111oppppwoo1111o3o... +.o22222211oooo1ooooooooo2o11112oo... +o22222222111111oaabo11111o1111222o.. +o222222221111111obco11111o1112222o.. +o2222222221111111oo111112o2122223o.. +o2233222222221111111122222o222223o.. +o2333222222222aaabbbbbbb222o22223o.. +.oo3322222222aaaaaaaaaabb233o2T33o.. +...ooo222222baaaaaaaaaaabb333o33o... +......o22222baaaaaaaaaabbb333ooo.... +.......o2222bbaabbAbbbbbbc33o....... +........o232bbbbbbbbbbbbcc3o........ +.........o333bbbbbbbbbbcc3o......... +.........obb33bcccccccccaao......... +........obbbbc33333333aabbbo........ +.........obccccoooooobbbbbo......... +..........occco......obbbo.......... +...........ooo....P...ooo........... diff --git a/parts_src/body/base_cub.txt b/parts_src/body/base_cub.txt new file mode 100644 index 0000000..44aeb87 --- /dev/null +++ b/parts_src/body/base_cub.txt @@ -0,0 +1,34 @@ +....oo...............ooooo.............. +..oo22oo............o11122o............. +.o222222o..........o11ooo22o............ +o22oooo2o.........o21oaaao2o............ +o2obbbo33oooooooooo21oaaao2o............ +o2obbco33o22222222o21oaabo2o............ +o2occcooo2111111122ooooboo2o............ +.o3oooo2111111^112222ooo222o............ +..o3o211111111111122222o22o............. +..oo21111111111111112222oo.............. +..o211oooo11111ooooo12222oooo........... +.o221oppppo111opppppo1222o222ooo........ +.o222owwppo111owwpppo2222o122222oo...... +.o222owwppo111owwpppo2222o1112B222o..... +.o222oppppo111opppppo2222o111122222o.... +.o222opppwo112oppppwo2222o1111122222o... +.o2222oooo22222ooooo22223o11111122222o.. +.o22bb22222aabb22222bb223o111111122222o. +..o222222aaaooobb2222333o1111112222222o. +..o22222baaaoooabb233333o1111222222T23o. +...o2222baaaaobbbb33333o11222222222223o. +....o322bbabobobcb333oo122222222222223o. +.....oo33bbbbbbcc33oo12222222222222233o. +.......oooooooooooo2222222oooo2A222333o. +.......o111112o2222222222o1111o233333o.. +.......o2111112o222222222o1111o3333oo... +.......o2111122ooo2222222o1112o333o33o.. +.......o2111223o22oo33222o1122o3oo333o.. +.......o2122223o2223oo333o1222oo23333o.. +.......o2aaaaa3oo22333o33oaaaao233333o.. +.......oaaaaaaboo23333oooaaaaaao33333o.. +.......obbbbbbbo.o333o.obbabbbbo3333o... +........obbbbbo...ooo...obbbbbbooooo.... +.........ooooo......P....oooooo......... diff --git a/parts_src/body/base_dino.txt b/parts_src/body/base_dino.txt new file mode 100644 index 0000000..c3a0172 --- /dev/null +++ b/parts_src/body/base_dino.txt @@ -0,0 +1,44 @@ +................oooooooo............ +.............ooo22222222ooo......... +...........oo22221122222222oo....... +..........o222111111122222222o...... +.........o2211111111^111222222o..... +........o2211111111111111122222o.... +.......o221111111111111111122222o... +......o2211ooo111111oooo111122222o.. +.....o2211opppo1111oppppo11112222o.. +.....o221opwwppo11opwwpppo11112222o. +....o2211opwwppo11opwwpppo11122222o. +....o2211opppppo11oppppppo11122222o. +...o22111opppppo11oppppppo22222222o. +..o222111opppwpo11oppppwpo22222222o. +.o2o222111opppo1111oppppo222222222o. +.o222221111ooo111111oooo2222222233o. +o22o22221111111111o2222222aa22223o.. +.o2oowwowwowwowwwoo22222222222233o.. +.o22oppppppppppppo22222222222233o... +..o22oppppaaaappo22222222222233o.... +...o22oooooooooo22222222222233o..... +....oo2222222222222222222223oo...... +......oooo2222222222222223oo22oo.... +..........oo22222222223ooo112222o... +............ooooooooooo1111112222o.. +.............o2ooo1abbbb111111B222o. +...........oo1o112oaaaabbb11111222o. +..........o1111112oaaaaaabb11122222o +.........o21112222oaaaaaaabb2222223o +.........o222oooooaaaaaaaaab2222223o +..........o2o2bbaaaaaaaabbbbb222223o +...........oo2bbaaaaaaabbbbbc222233o +............o2boooaaabAbbbbbc222233o +............ooo112oobbbbbbbcc22233o. +...........o21111112obbbbbcc2333To3o +...........o21111112obbbbccc3333o23o +...........o21111122occcccc333oo333o +...........o21111222occccc33oo22233o +..........oo11122223o33333oo2233333o +.........o1111222223oooooo22223333o. +........o22111222223o...o2222333333o +........o22222222333o...o2333333333o +.........oo2222333oo.....ooo3333ooo. +...........ooooooo...P......oooo.... diff --git a/parts_src/body/base_drake.txt b/parts_src/body/base_drake.txt new file mode 100644 index 0000000..023c557 --- /dev/null +++ b/parts_src/body/base_drake.txt @@ -0,0 +1,38 @@ +.............o............................ +...........oobo........................... +.........oobbbco......oooooo.............. +........obbbccooooooooabbbbbo............. +........obbbcoo2222oaaaaabbbo............. +........obboo22212oaaaaabooo.............. +........ooo2111112oaaaabo2o............... +.......o221111111^obaabo222o.............. +......o22111111111obbbbo2222o............. +.....o22oooo1111111oooooooo22o............ +....o221opppoo11111ooooppo222o............ +....o221owwpppo111opwwpppo2222o........... +...o2211owwpppo111opwwpppo2222o........... +...o2111opppppo111oppppppo1222ooooo....... +..o22111opppppo111oppppppo222obbbbbo...... +.o2o2111opppppo111oppppppo222obbboo....... +o2222211oppppwo111opppppwo222oboo......... +o22222211ooooo11111oooooo22222oooo........ +o2222222211oo1111222222222223o2222ooo..... +.o2o22222ooo1122222222222222obooo2222o.... +..o2ooooo2211222222222222223ooooB22222o... +...ooowo2222222222222222223oo1111122222o.. +.....oo2222222222222222223o1111111121222o. +......o222222222222222223o111111122221222o +.......o222222222222223oo1111111111222222o +........oooooo22223oooo111111111111122T23o +........o11111ooooo2222111112111111222223o +........o21111o112bbbbbbb2222111122223333o +........o21111obbbbbbbbbbbbb221112223333o. +........o21112obbbbbbbbAbbbbb21112223333o. +........o11122obbbbbbbbbbbbbb221222333333o +.......o2111222obcccccccccccc222222333333o +.......o2112222o3333322333o33222222o23333o +.......o22122233oooo223333ooo212222o33333o +........o222223o...o233333o.o222223o33333o +........obbbccco....o3333o...obbccco3333o. +.........ooccoo......oooo.....oocoo.oooo.. +...........oo...........P.......o......... diff --git a/parts_src/body/base_eel.txt b/parts_src/body/base_eel.txt new file mode 100644 index 0000000..eac1a50 --- /dev/null +++ b/parts_src/body/base_eel.txt @@ -0,0 +1,46 @@ +..................oooooo...........oo........ +...............ooo222222ooo.......oabo....... +...oo........oo222211122222oo....oaaco....... +..obbo......o2221111111222222o..oaacbo...oo.. +.obbcco....o221111111111222222oobaccbo..oabo. +obbbbco...o2211111111^111122222oaacabbooabbo. +.obbbbco.o221111111111111112222oacaaaboaccco. +.oobbbbco22111111111111111112222ocaaabbccbo.. +obbobbbcco2111111111111111111222oaaaaccabbo.. +obcccbbcco2111111111111111122222oaaccbbbboo.. +.obbbccco221111111111111112222222occabbbbbbo. +.oobbbcco221oooo1111ooooo11222222oaabbbcccco. +obcccccco11oppppo11opppppo1112222occcccccco.. +.obbcccco11owwppo11owwpppo1112222obbbbbboo... +..occccco11owwppo11owwpppo1111233obbbbbbbo... +...ooccco11oppppo11opppppo1111233occcbbccbo.. +.....ooo111oppppo11opppppo111133obbbcccccco.. +......o2111opppwo11oppppwo111333oobbccccoo... +......o2211oppppo11opppppo113333o2occooo..... +......o22111oooo1111ooooo113333o222ooo....... +.......o2aaa111oooooo1111aaa33o2222oaboo..... +.......o2222111oaaabo12233333o22222oabbboo... +........oo222233obco3333333oo22222Boaabbbbo.. +..........o333333oo33333oooc2222222oaabbbo... +...........ooooooo33oooobbbc2222222obbboo.... +..................oo2aabbbcc2222223oabbbboo.. +..................o2baabbbcc2222233obbbbbbbo. +.................o2baaaabcc22222233obbcccoo.. +................o2baaaabbcc22222333obbboo.... +................obaaaabbcc22222333obbbcco.... +...............obbaaabbcc122223333obbcccboo.. +...............obbaabbcc1122A3333obcccooo12o. +..............obbbabbcc1112223333ooooooo1222o +..............obbaaacc1111222333o....o11222o. +.............oobbaaac1111222233oo...o111122o. +..........ooo22obaabb111222223o22ooo111122o.. +........oo11111oaaabbc12222222o22221111T2o... +.......o1111111obabbbb22222222o1111111222o... +......o211111111obbbbcc2222223o111111122o.... +......o221111111obbbbc22222233o21222222o..... +......o2222122222obbcc22222333o22222233o..... +.......o222222222occc222223333o2222233o...... +........oo33222222o2222222333o3332233o....... +..........ooo333322o23333333o3333o33o........ +.............ooooo33o3333333ooooo.oo......... +..................ooooooPooo................. diff --git a/parts_src/body/base_fawn.txt b/parts_src/body/base_fawn.txt new file mode 100644 index 0000000..237799c --- /dev/null +++ b/parts_src/body/base_fawn.txt @@ -0,0 +1,35 @@ +.......oooo....................oooo....... +.....oo2222oo................oo1122oo..... +...oo11aabb22o..............o11aaaa22oo... +.oo11aaaaabb22oooooooo.....o21aaaaabb22oo. +o22baaaaaaab12o2222222ooo..o11baaaaabbb22o +.o22bbaaabbooo21111122222oo211baabbbbb22o. +..o22bbbbbbo1111111112222o2211bbbbbcc22o.. +...o22bbbbco11111111112222oo11bbbccc22o... +....oo2oooo1111111^111122222o22bbc22oo.... +......o211111111111111111222o22222oo...... +.....o22111111111111111111222ooooooo...... +.....o221111111111111111222223o22222o..... +.....o2221oooo1111ooooo222222o222222oo.... +.....o222oppppo11opppppo222223o1aa2222oo.. +.....o222owwppo11owwpppo22222o11ab11B222o. +.....o222owwppo12owwpppo22223o1111111aa2o. +.....o222oppppo22opppppo22223o1111111ab22o +......o22oppppo22opppppo3333o111111112222o +......o22opppwo22oppppwo3333o11111aa22223o +.......o22oooo2222ooooo333oo111111ab22T23o +........oab2222cc22222ba3o11111A222222223o +........oo2222o22o2233333o112222222222223o +........o2o2223oo3333333o2222222111222233o +........o21oo333333333oo22222221111222233o +........o2211ooooooooo2222222221111222333o +........o22112221111222332222221111223333o +........o221222221112223ooo3321111222333o. +........o222223332222223o..oo211122o2333o. +........o222223ooo222223o...o212223o2333o. +........o222223o.o222223o...o222223o2333o. +........o222223o.o222223o...o222233obbbbo. +........o212223o.o212233o...obbbbbbocccco. +........obbbbbbo.obbbbbbo...occccccoooooo. +.........occcco...occcco.....oooooo....... +..........oooo.....ooooP.................. diff --git a/parts_src/body/base_fox.txt b/parts_src/body/base_fox.txt new file mode 100644 index 0000000..7723439 --- /dev/null +++ b/parts_src/body/base_fox.txt @@ -0,0 +1,36 @@ +....oooo..................oooo............ +....o222oo..............oo112o............ +....o22222o..oooooooo..o111b2o............ +....o2b2222oo22222222oo111ab2o............ +....o2bbb3322211111222o1aaab2o............ +....o2bcco2211111111222ooaab2o............ +....o2bco21111111^1122222obb3o............ +....o2bo211111111111112222ob3o............ +....o222111111111111111222o23o............ +....o2221111111111111111222o3o............ +.....o2211111111111111112223o............. +.....o222oooo11111ooooo11222o............. +....o222oppppo111opppppo22233o............ +.....o22owwppo111owwpppo2223o............. +....oo22owwppo122owwpppo2222oo............ +...o1221oppppo111opppppo222222o........... +...o2221oppppo111opppppo222222o........... +..o22211opppwo111oppppwo2233222o.......... +..o222111oooo11111ooooo13333332o.......... +.o222221111111o1o1o113333333oo32o......... +o222oo221111111o3o33333333oo22ooooo....... +.ooo..oo332233333333333ooo111112222oo..... +........ooooooooooooooobbb11111B12222o.... +..........obbbaaabbabbbbcc111111111222o... +...........obabbbbbbbbbbc1111111111122o... +..........obbbbbbbbbbbbbb11111122222T2o... +..........obbbbbbbbbcbbccc111112222223o... +..........obbbccbbccccccc222A111222223o... +...........obbb11ccc22cc22221111223333o... +............o211122o22222222111223333o.... +............o211123o22332222111233333o.... +............o211223o2233o3321122o2233o.... +............o212223o2233ooo21222o2233o.... +............o222233o2333o.o22223o2333o.... +.............o2233oo2333o..o2233o2333o.... +..............o23o..oooo..P.o23o.oooo..... diff --git a/parts_src/body/base_grub.txt b/parts_src/body/base_grub.txt new file mode 100644 index 0000000..9db92f6 --- /dev/null +++ b/parts_src/body/base_grub.txt @@ -0,0 +1,27 @@ +.........oooooo............................. +......ooo222222ooo.......................... +.....o222211122222o......................... +....o22111111111222o........................ +...o2211111111112222o................oooo... +..o221111111^11122222o..............oaaabo.. +.o22111111111111122222oooo.........oaaaabo.. +.o21111111111111112222oaaao........obabbbo.. +o222111111111111112222oaaabo..oooooooobooo.. +o222oooo1111ooooo22222oaaaabooaaaao111o122o. +o22oppppo11opppppo2222oaabbbooaaaao11111122o +o22owwppo11owwpppo2222obbbcooobaabbo1111222o +o22owwppo11owwpppo2222ooooo22Bobbboo11T2223o +o22oppppo12opppppo2222o11111o11ooo12o222233o +o22oppppo22opppppo2233o11111o1111111o22233o. +o22opppwo22oppppwo2333o1111o111111112o333o.. +.o22oooo2222ooooo2333o11112o2111112223ooo... +.oab22o222222o2223abbo11222o2111222223o..... +..o2222oooooo2223333o112222A2212222233o..... +...o222oppppo333333o22222222o22222223o...... +....o223obbo3333333o22222223o2222223oo...... +.....o333oo3333333oo2o2222333ooo3oooco...... +......ooo333333ooo..oboo3oooobbbobbcco...... +.........oooooo....obbbcobbbcbbccocco....... +...................obbccobbccocco.oo........ +....................occo.occo.oo............ +.....................oP...oo................ diff --git a/parts_src/body/base_guppy.txt b/parts_src/body/base_guppy.txt new file mode 100644 index 0000000..86d344e --- /dev/null +++ b/parts_src/body/base_guppy.txt @@ -0,0 +1,33 @@ +.............................................. +.............oooooooooooo..................... +...........oo222222222222oo................... +..........o2221111122222222o.................. +.........o221111111111222222o................. +........o2211111111^111122222o................ +.......o22111111111111111222B2o............... +......o221111111111111111122222o.............. +.....o22111111111111111111122222o............. +....o22211oooo11111ooooo111122222o............ +....o2211oppppo111opppppo11112222o........oo.. +....o2211owwppo111owwpppo11111222o.......oaao. +...o22221owwppo111owwpppo112222222o.....oaaaao +...o22221oppppo111opppppo2222222222o...obaaaao +...o22221oppppo111opppppo22222222222ooobbaaaao +...o22222opppwo111oppppwo2222222222222obbbaaoo +...o222222oooo11111ooooo2oo22222222222obbbbo.. +...o22222211111112222222oaaoo2222233T2obbbo... +...o22aab21111oooooo22aabaaaaoo2233333obbbbo.. +....o2222222222opbo22222obaaaaaoooo333obbbbboo +....o22222222222oo222222obbaaaaaaaaoooobbbbbbo +...oo2222222222222222222obbbaaaabbao...obcbbbo +..obbo2222222222222222222obbbaabooo.....occbbo +.obcbbo2222222222A2222222obbbbaaaaoo.....occo. +.occbo.o222222222222222333obbbbaaaao......oo.. +..occo..o22222222222223333obcbbbabbo.......... +...oo....o3323333333333333obccbbooo........... +..........o3333333333333333obcbbbo............ +...........oo333333333333ooobcbaao............ +.............oooooooooooo...obbbao............ +.............obaabaabao.....ooooo............. +..............obbobbobo....................... +...............oo.Po.oo....................... diff --git a/parts_src/body/base_hawk.txt b/parts_src/body/base_hawk.txt new file mode 100644 index 0000000..23f7d87 --- /dev/null +++ b/parts_src/body/base_hawk.txt @@ -0,0 +1,37 @@ +..........oooooooooooo................ +........oo222222222222oooo............ +.......o222111111122222222ooooooooo... +......o2211111111112222222222222222o.. +.....o221111111^11111112222222222oo... +....o22111111111111ooo111112222oo..... +...ooo11111111111ooo1111111322o....... +...o21ooo111111111oooo111222oo........ +..o22ooo1111111ooopppo1222222ooo...... +..o22owwooo111opwwpppo2222222222o..... +..o22owwpppo11opwwpppo22222233222o.... +..o22opppppo11oppppppo22222233ooo..... +..o22opppppo12oppppppo2222233o........ +..o22oppppooooopppppwo2222233o........ +...o22ooooaaabooooooo2223333o......... +...o22222oabbbo2222222233333o......... +....o2222obbcoo2222222333B3o.......... +.....o222oco22222222333333o........... +......oo22o22233333333333o.oo......... +.....oaoo3333333333333oo2oo11o........ +....oaaaaoooooooooooooabb2o111o....... +...oaaaaaaaaaaaaaaaaabbbb1o1111o...... +...obaaaaaaaaaaaaaaabbbbbo111112o..... +...obaaaaaaaaaaabbbbbbbbco211122o..... +...obbaaaaabbAbbbbbbbbbcco111222o..... +....obbbbbbbbbbbbbbbbbcco1112223o..... +....obbbbbbbbbbbbbbbbccco2222233o..... +.....obbbbbbbbbbbbbbccco22o22233o..... +......obbbbbbbbbbbbccco222o223To...... +.......obbbcobbcobcco2222223333o...... +........obo22obo2oo22222223333o....... +........oo22222222222222223333o....... +...........o2111123o3333333oo......... +...........o2111223oo33333o........... +..........obaaaabboo.obbbbco.......... +..........obbbbbbco..obbbcco.......... +...........ooooooo.P..oooooo.......... diff --git a/parts_src/body/base_imp.txt b/parts_src/body/base_imp.txt new file mode 100644 index 0000000..ac8139e --- /dev/null +++ b/parts_src/body/base_imp.txt @@ -0,0 +1,40 @@ +......oo....................o112222o.... +...ooo22ooo................o11111122o... +..o22222222o......ooo.....o1111111122o.. +.o2222222222o.oooo222ooooo1111aaab1122o. +o22222bb22223o2222222222o2211aaaabb1222o +o222bbbbbb22o221111111222oo1baaaaabb222o +o222bbbbbboo211111111122222ooaaaaabb223o +o22bbbbbbo211111111^111122222oaabbbc223o +o22bbbbbco1111111111111111222oabbbbc233o +o22bbbcco211111111111111111222obbbcc333o +o222ccco22111111111111111112222occc333o. +o2333cco22111111111111112222222oc2333o.. +.o33333o2211oooo11111ooooo22222o3333o... +..o3333o221oppppo111opppppo2222o333o.... +...ooo3o221owwppo111owwpppo22223ooo..... +......o2222owwppo111owwpppo22223o....... +......o2222oppppo111opppppo23233o....... +......o2222oppppo111opppppo23333o....... +.......o221opppwo111oppppwo3333o........ +........o221oooo11111ooooo3333o......... +........o22111111ooooo13333333o......... +.........o3221111oppwo3333333o.......... +..........oo333333oo3333333oo........... +............oo3ooo333oooooo............. +............ooo111ooo11222ooo........... +...........o22111111111122211oo......... +.........oo2221111111111121111Boo....... +........o22222111aaabbbb121111111o...... +.......o22222211aaaaaaabb222111112o..... +......o222332211aaaaaaaab222222222o..... +.......o2333222baaaaAaabbb2332T232o..... +........o3ooo22bbaabbbbbccc3oo333o...... +.........o..o222bbbbbbbbc333o.ooo....... +.............o22bbbbbbbcc33o............ +............oo232bcccccc33oo............ +...........o22222333333o1111o........... +...........o222333oooo1111112o.......... +...........o233333o..o2222222o.......... +............oo33oo....o22222o........... +..............oo....P..ooooo............ diff --git a/parts_src/body/base_noodle.txt b/parts_src/body/base_noodle.txt new file mode 100644 index 0000000..b1217ad --- /dev/null +++ b/parts_src/body/base_noodle.txt @@ -0,0 +1,40 @@ +..............oooooooooo.................... +............oo2222222222oo.................. +..........oo22211111222222oo................ +.........o222111111112222222o............... +........o2211111111^111222222o.............. +.......o2211111111111111122222o............. +......o221111111111111111122222o............ +.....o22111111111111111111122222o........... +.....o21111111111111111111122222o........... +.....o1111oooo1111ooooo112222223o........... +.....o111oppppo11opppppo12222222o........... +....o1111owwppo11owwpppo112222233o.......... +....o1111owwppo11owwpppo11222223o........... +...o11111oppppo11opppppo11222223o........... +..o231311oppppo11opppppo11223333o........... +..o211111opppwo11oppppwo11233333o........... +..o2111111oooo1111ooooo11133333o............ +..o22aaa11111111111111aaa33333o............. +..o22o11111111111o11113333333ooo............ +...ob2oo1111111oo12223333333oab2ooo......... +.ooao222ooooooo22223333333ooaabbb22o........ +obbo.o322221w11333333333oo1bbbb112aao...oo.. +.obo..oo333333333333oooo1111bb1111babo.oabo. +..o.....ooo333333ooo11111111111B111bb2oaabbo +.........oooooooo11111111111111222222oaaabo. +.......oobb2o211111111222222222222222obbbbo. +......obbbb1o222222222222222222222223o1bbbo. +.....o11bb111o2222222222222222222233o1T22o.. +....o221111111o22222222222222223333o11122o.. +....o2211111111ooo22333333333333ooo122223o.. +....o2221111111111oooooooooooooo222222223o.. +....o2221111111111112oooo2222222222222223o.. +....o2222111122aa222222A22222222222222233o.. +....o22222222baaaab222222222aa22222222333o.. +.....o2222222baabbb2222222baaaab22223333o... +......o22222222bb222222222baabbb2233333o.... +.......oo3233322222222223333bb3333333oo..... +.........oo333333333333333333333333oo....... +...........oooo3333333333333333oooo......... +...............ooooooooPooooooo............. diff --git a/parts_src/body/base_otter.txt b/parts_src/body/base_otter.txt new file mode 100644 index 0000000..c63a6ee --- /dev/null +++ b/parts_src/body/base_otter.txt @@ -0,0 +1,30 @@ +...........ooooooooo............................. +.........oo222222222oo........................... +........o2221111112222o.......................... +......oo221111111122222oo........................ +.....o222111111^111222222o....................... +....o221111111111111222222o...................... +..ooo211111111111111112222ooo.................... +.o222211111111111111111222112o................... +.o22221oooo11111ooooo12222212ooooo............... +.o2222oppppo111opppppo222222o22222ooo............ +.o2222owwppo111owwpppo22222o122222222o........... +..o222owwppo111owwpppo22222o1112B22222oo......... +..o222oppppo111opppppo22222o111111222222o........ +..o222oppppo111opppppo22223o1111111222222o....... +..o222opppwo111oppppwo22233o1111111112222o....... +...o222oooo11111ooooo22233o111111111112222o...oo. +ooooaab222211pp112222aab33ooo1111111222223o.ooabo +...o2222221o1oo1o122223333o111111122222222oobaabo +.oooo2222211o11o112223333ooo1122222222222obbbbbco +.....o222222222222233333o22222A222222222obbbccoo. +......o2222222333333333o2222222222222T2oooooooo.. +.......o3333333333333oo2222222222222222obaaaaaoo. +....oooooo333333ooooo222222222222222223oaaaaaaabo +...obbboooooooooaaaoo222222222222222333obbbbbbbco +..obbbbbbo....obaaaaaoo22222222222333333oooooooo. +...obbbbbco....obaaaaao22333333333333333o........ +...obccccco....obbbbbbbo33333333333333oo......... +....occccco.....oocbbbco333333333333oo........... +.....oocco........oocccooooooooooooo............. +.......oo.....P.....ooo.......................... diff --git a/parts_src/body/base_owl.txt b/parts_src/body/base_owl.txt new file mode 100644 index 0000000..8d5f8f9 --- /dev/null +++ b/parts_src/body/base_owl.txt @@ -0,0 +1,36 @@ +..oo............................oo.. +.o22o.oo....................oo.o22o. +.o2a2o22o..................o22o2b2o. +.o2aa2122oo..............oo2222bb2o. +..o21a211122ooooooooooooo11122b22o.. +...o2111112222222222222211112222o... +...o211111111111122221111111222o.... +...o2111111111111^1111111112223o.... +...o212111111111111111111112323o.... +...o222111111111111111111112233o.... +....o2211111111111113333111222o..... +...o221333333111113311113322222o.... +...o233111111331131111111132222o.... +..o22311oooo11313111ooooo1132222o... +..o2311oppppo113111opppppo113223o... +..o231oppppppo1111opppppppo13222o... +.o2111opwwpppo1111opwwppppB112223o.. +.o2111opwwpppo1111opwwppppo112223o.. +.o2111oppppppo1111opppppppo222233o.. +.o2211oppppwpo1111opppppppo222233o.. +.o22111oppppo1ooo1oppppwppoooo333o.. +.o222111oooo1oabbo2opppppoo211o33o.. +.oo2211111111obbco22ooooo2o1111o3o.. +.o2o2221111122obo222222222o11111oo.. +.o2o22222222222o2222222222o211122o.. +o22o22222222222aaabb2222222o11222o.. +o222o2222222aaaaaaabbbb2223o122223o. +o223o222222aaaaaaaaaaabb333o222223o. +o2333o2222baaaaaaaaaaaabb333o2T223o. +.o33oo2222bbaaaaaAabbbbbb3333o2233o. +..oo..o232bbbabbbbbbbbbcc333oo333o.. +.......o333bbbbbbbbbbbbc333o..ooo... +........oo3bbbbbbbbbbccc3oo......... +.........oaaaoccccccccoaaao......... +.........obbbboooooooobbbbo......... +..........oooo...P....oooo.......... diff --git a/parts_src/body/base_pebble.txt b/parts_src/body/base_pebble.txt new file mode 100644 index 0000000..78f10a2 --- /dev/null +++ b/parts_src/body/base_pebble.txt @@ -0,0 +1,32 @@ +..................ooooo............... +.............ooooo22232ooo............ +...........oo1111111131112ooo......... +.........oo111111111311111122o........ +.......oo111111111^13311112222o....... +......o211111111111111311222222oo..... +.....o222111111111111111222222222o.... +....o2222222222222222222222222222o.... +...o222222222222222222222222222222o... +...o222211111111112222222222233333o... +..o222ooo111111111ooo22222222B33333o.. +..o222111o1111111o11122222222333333o.. +..o2221oooo11111ooooo22222222333o333o. +.o2222oppppo111opppppo222222233o3333o. +.o2222owwppo111owwpppo222222233o3333o. +.o2222owwppo111owwpppo22222223o33333o. +.o2222oppppo111opppppo22222223o33333o. +.o2222opppwo111oppppwo222222233o3333o. +.o22222oooo11122ooooo222222223333333o. +.o2aab2222222222222222aab22223333T33o. +..oabb222o222222o22222bbb2223333333o.. +..o2222222opppppo222222222223333333o.. +..o23222222oaabo2222222222223333333o.. +..o232222222oo222222222222233333333o.. +...o2322222222222A2222222333333333o... +....o2222222222222222333333333333o.... +.....oooooooooo33333333333333333o..... +.....oaaaabbbbo333333333333ooooo...... +.....oaabbbbbbco33333333oobbccco...... +.....obbbbbbbccoooooooooobcccco....... +......obbcccco..........occcco........ +.......oooooo......P.....oooo......... diff --git a/parts_src/body/base_penguin.txt b/parts_src/body/base_penguin.txt new file mode 100644 index 0000000..abde55e --- /dev/null +++ b/parts_src/body/base_penguin.txt @@ -0,0 +1,38 @@ +...............o.................... +..............o2o..o................ +..............o2ooo2o............... +............ooo222222oo............. +..........oo22221112222oo........... +.........o222111111112222o.......... +........o22111111111122222o......... +.......o221111111^111122222o........ +......o221111111111111122222o....... +......o211111111111111112222o....... +.....o222oooo111111ooooo22222o...... +.....o22oppppo1111opppppo2223o...... +.....o22owwppo1111owwpppo2223o...... +.....o22owwppo1111owwpppo2223o...... +.....o22oppppo1111opppppo2223o...... +.....o22oppppo1oooopppppoB223o...... +.....o22opppwooaaboppppwo2333o...... +.....o222oooo1obbcoooooo22333o...... +......o22aa111ooo1122222aa23o....... +......o222111111o11222222223o....... +.....oo2221bbbb1111bbbb2222oo1o..... +....o2o22baaaabbbbaaabbbb22o111o.... +...o2o222baaaaaaaaaaaaabbb2o1111o... +..o22o222baaaaaaaaaaaaabbb2o11111o.. +..o2o2222aaaaaaaaaaaaaabbb22o11111o. +.o22o222baaaaaaaaaaaaabbbbc2o211212o +o222o222bbaaaaaaaaaaabbbbbc23o22222o +o222o222bbbaaaaaaAbbbbbbbbc333o2222o +o233o222bbbaabbbbbbbbbbbbbc333o2223o +o2333o22bbbbbbbbbbbbbbbbbcc3T3o2333o +o23oo222bbbbbbbbbbbbbbbbbcc333oo333o +.oo..o222bbbbbbbbbbbbbbbccc33o..ooo. +......o22bbbbbbbbbbbbbcccc33o....... +.......o333bbbbccccccccc333o........ +........oooooocccccoooooooo......... +.........oaaabo33333oaaabo.......... +.........obbbbooooooobbbbo.......... +..........oooo...P...oooo........... diff --git a/parts_src/body/base_pixie.txt b/parts_src/body/base_pixie.txt new file mode 100644 index 0000000..56d8aa3 --- /dev/null +++ b/parts_src/body/base_pixie.txt @@ -0,0 +1,39 @@ +.......................................o.. +.o..............oooooooo.............oo2o. +o1o...........oo22222222oo..........o122o. +.o1oo.......oo222111112222oo......oo1a2o.. +.oa11o.....o2221111111122222o...oo1ab12o.. +.o1ab1oo..o221111111^11222222o.o11bb122o.. +..o1bb11oo22111111111111122222o111b122o... +..o22b111o2ooo111111111ooo2222o2111222o... +...o2211o21111o1111111o11112222o11222o.... +....o222o2211111111111111112222o1223o..... +.....o22o211oooo11111ooooo22222o223o...... +......o2o22oppppo111opppppo2222o23o....... +......oo222owwppo111owwpppo22223oo........ +.......o222owwppo122owwpppo22223o......... +.......o222oppppo222opppppo22223o......... +.......o222oppppo222opppppo23333o......... +.......o222opppwo222oppppwo33333o......... +........o222oooo22222ooooo33333o.......... +.........oaa22o222222o222aa333o........... +..........o2222owpppo22222333o............ +...........o2222oooo22222233o............. +............oo333333333333oo.............. +............oooooooooooooooo.B............ +...........o11o1111111222o12o............. +..........o112o1111111122o122o............ +........oo1111o111aa111122o222oo.......... +.......o111112o1aaabbb1122o22222o......... +.......o11112o2baaaaabb222o22223o......... +......o22112o22aaaaaabb222o222233o........ +.......o2222o2bbaaaaAbbb223o3233o......... +........o2ooo22baabbbbc2333ooo3o.......... +.........o..o22bbbbbbcc33oo...o........... +............o222bbbccc3ooT3o.............. +............o22223cc33o2333o.............. +...........oaoooo3oooo2oooobo............. +..........oaaaaaaoo..oobbbbbco............ +..........obbbbbbbo..obbccccco............ +...........obbbbbo....occccco............. +............ooooo...P..ooooo.............. diff --git a/parts_src/body/base_pup.txt b/parts_src/body/base_pup.txt new file mode 100644 index 0000000..a02bf72 --- /dev/null +++ b/parts_src/body/base_pup.txt @@ -0,0 +1,34 @@ +.......................................... +.......................................... +......ooo...............ooo............... +.....obbbo...oooooooo..oaaao.............. +....obbbbcooo22222222ooaaaabo............. +....obbbbco222111112222oaaaao............. +...obbbbco2211111^11222oaaaaao............ +...obbbco21111111111122oaaaaabo........... +..obbbbo211111111111112obaaaabo........... +..obbbbo1oooo1111ooooo12oaaaabbo.......... +..obbbo2oppppo11opppppo1oaaabbbo.......... +.obbbbo2owwppo11owwpppo2obabbbbcoo........ +.obbbo22owwppo11owwpppo22oabbbbo22oo...... +obbbbo22oppppo11opppppo22obbbbbbo222oo.... +obbbbo22opppwo11oppppwo222obbbbboB2222o... +obbbco222oooo1122ooooo2222obbbbco112222o.. +obbcco22221111222222222222obbbcco111122o.. +.occccobb2211ooo1111222bb33obbco11222T22o. +..occco222o111o111o11122333oooo112222223o. +...oooo2221ooooooo11112333o1111222222233o. +......o2211opppppo11122333o112222222233o.. +.......o2211opaao11222333o2222oo222223oo.. +........o3121ooo2222223oo2222o11o2223o3o.. +.........oo3o22222223oo22222o111Ao333o3o.. +...........o2oooo33oo2222222o1112o3oo33o.. +...........o21122oo2oo222222o1112oo2233o.. +...........o21123oo222oo2333o1112o22233o.. +...........o21123oo22233o333o1122o22233o.. +...........o21223oo22233oooo21222o22233o.. +...........o11223oo22333o..o11222o22333o.. +..........o222223o223333o.o222222o233333o. +..........o222233oo33333o..o22233o233333o. +...........oooooo..ooooo....oooooooooooo.. +.......................P.................. diff --git a/parts_src/body/base_salamander.txt b/parts_src/body/base_salamander.txt new file mode 100644 index 0000000..76a2f63 --- /dev/null +++ b/parts_src/body/base_salamander.txt @@ -0,0 +1,27 @@ +..................ooooooo...................... +...............ooo2222222ooo.............o..... +....o........oo2222111122222oo.........oobo.... +...oboo....oo22211111112222222oo......oaabo.... +...obbbo..o2221111111^1112222222o....oaaabo.... +...obbbboo22111111111111111222222o..oaaaabo.... +...obbbbbo211111111111111111122222ooaaaaabo.... +...obbbbbo111111111111111111112222obaaaaabo.... +...obbbbo2211111111111111111111222ooaaaaoooo... +..oooobbo22111oooo11111ooooo222222oaaooobbbbo.. +.obbbboo222111oppppo111opppppo22223ooaabbbbbbo. +obbbbbbco22111owwppo111owwpppo2222oaaaaabcooo.. +.occbbbco22211owwppo122owwpppo22223oaaabcB222o. +..oobbbco22211oppppo222opppppo2222obooooo11222o +....oooo222221oppppo222opppppo2233oobbbbbo2222o +...obbcco22222opppwo222oppppwo233331obbbbbo223o +..obbbccco2aa22oooo22222oooooo3aa3211ooooco223o +..obccccco222oo2oo222222222oo3333o1111222ooT33o +..obcooooo22222oppppppppppo33333o2111122222333o +...oo.....o322o1oppaaaappo3333332211A22222333o. +...........oo3o11oooooooo3333322221112322333o.. +.............o21112o333333oo2222221122333333o.. +.............o21122o33333o223333321222333333o.. +.............o212222oooooo223333321222o22333o.. +.............o222222o....o23333oo22223o23333o.. +..............o2222o......o333o..o2233oo333o... +...............oooo........oPo....oooo..ooo.... diff --git a/parts_src/body/base_slime.txt b/parts_src/body/base_slime.txt new file mode 100644 index 0000000..5a9eb15 --- /dev/null +++ b/parts_src/body/base_slime.txt @@ -0,0 +1,34 @@ +.................oooooo................. +..............ooo222222ooo.............. +............oo222211122222oo............ +..........oo2221111112222222oo.......... +.........o2ww11111111112222222o......... +........o2www1111111^1111222222o........ +.......o22ww11111111111111222222o....... +.......o211111111111111111122222o....... +......o22111111111111111111122222o...... +......o22111111111111111111122222o...... +.....o2221111111111111111111122223o..... +.....o222111111111111111111112B223o..... +.....o22221111111111ooooo111112223o..... +.....o2222oo1111111opppppo11222223o..... +.....o22221ooo11111owwpppo22222223o..... +.....o2221111ooo111owwpppo22222223o..... +.....o22111ooo11111opppppo22222222o..... +....o22211oo1111111opppppo222222222o.... +...o222111111111111oppppwo2222222222o... +..o22222111111112222ooooo222222222T22o.. +..o222aab111112222222222222aabb222232o.. +.o2222abb1111oo222222oo2222abbb2223332o. +.o222222221112oppppppo2222222222233333o. +..o222222221222oppaabo222222222333333o.. +..o2222222212222ooabbo222222233333333o.. +...o22222222222222obbo22222333333333o... +....o22222222222222oo22222233333333o.... +.....o222222222222222A322223333333o..... +....o222233322222333333322333333oo...... +.....o223333332223333333333333oo........ +.....o2233ooo33333333333333333o......... +......o22o...oo3333oooooo33333o......... +.......oo.....o2333o.....o333o.......... +...............oooo.P.....ooo........... diff --git a/parts_src/body/base_wisp.txt b/parts_src/body/base_wisp.txt new file mode 100644 index 0000000..671093f --- /dev/null +++ b/parts_src/body/base_wisp.txt @@ -0,0 +1,40 @@ +............oooooooo................ +.........ooo22222222ooo............. +........o22221111222222o............ +......oo2211111112222222oo.......... +.....o2221111111^111222222o......... +....o2211111111111111222222o........ +....o2211111111111111112222o........ +...o221111111111111111112222o....... +..o22211111111111111111122222o...... +..o22111111111111111111222223o...... +..o22111oooo11111ooooo1222222o...... +.o22211oppppo111opppppo2222223o..... +.o22221owwppo111owwpppo2222223o..... +.o22221owwppo111owwpppo222B223o..... +.o22222oppppo111opppppo2222323o..... +.o22222oppppo111opppppo2222333o..... +.o22222opppwo111oppppwo2222333o..... +..o22222oooo11122ooooo2222333o...... +..oaab22211111112222222aabb33o...... +..oabb22o2111111122o222abbb33oo..... +.o1o2222oowppppppwoo22223333o22o.... +o111o2222oppppppaapo2233333o2223o... +o112o22222ooppaaboo222333332T233o... +o2222o222222oooo2222223333o2233o.... +.o22o.o222222222A2222233oo.o33o..... +..oo...o2222222222222233o...oooo.... +........o322222222222333o..oaaabo... +.........o22222222222233o..oabbbbo.. +..........o2222222222223o..oabbbbo.. +..........o2222222222223o..oboabbco. +...........o222222222222o...ooabcco. +............o323222222222o...oabcco. +............o2333222222222ooobbbcco. +.............o3333333222332bbbbccco. +..............oo333333333322bbbcco.. +................oo3333333332bbcco... +..................o3333333332ccco... +...................oo333333333oo.... +.....................ooo333ooo...... +........................oPo......... diff --git a/parts_src/body/base_wyrm.txt b/parts_src/body/base_wyrm.txt new file mode 100644 index 0000000..67b71bb --- /dev/null +++ b/parts_src/body/base_wyrm.txt @@ -0,0 +1,44 @@ +...................oo......oo.............. +..................oabo....obbo............. +.................oaabo...obbco............. +................ooccco...occco............. +.............ooooaabcoooobbcco............. +...........oo222oabbco22obbcco............. +..........o2221oaabbco22222oo.............. +.........o221111111111222222o.............. +........o22111111111111122222o............. +.......o221111111111^111122222o............ +......o221111111111111111122222o........... +......o2oo11111111111oo11112222o........... +.....o2221oo1111111oo11122222222o.......... +.....o2111oooo1111ooooo112222223o.......... +.....o111oppooo11ooopppo11222223o.......... +.....o111owwpoo11oowpppo11222223o.......... +.....o111owwppo11owwpppo11122233o.......... +....o1111oppppo11opppppo11123333ooo........ +....o1313oppppo11opppppo1113333obbbo....... +...o21111opppwo11oppppwo113333obbbo........ +...o221111oooo1111ooooo113333oabbo......... +...oo21aaa11111111o111aaa333o2obo.......... +..oab221111o11111o112333333o223o........... +.oaboo222111ooooo22333333oo222oboo......... +oabo..o22221333w333333ooo112222obbo........ +obo....o3a3333oooooooo1111222223Bo......... +obbo...oaboooobbaaaabc1111222223o......ooo. +.obbo..obo...obbaaaabc11122222223o....o112o +..oo...obbo..obaaaaaac11222222223o...o1112o +........obbooooccccccc12222222223o...o1122o +.........ooo222obaabbbb22222222233o.o1122o. +.......oo2211111oabbbbbb222222223o2o11122o. +.....oo111111111oocccccc222222223o2111T22o. +....o1111111111111obbbbbbb2222233o111112o.. +...o21111111111111obbbAbbb2222233o111122o.. +...o22111111111111occccccc2222333o222223o.. +...o221111111111111occccccb22333o2222223o.. +...o222222222222222o222222233333o2222233o.. +....o222222222222222o2233333333o2223333o... +.....oo32222222222222oo333333oo3333333o.... +.......oo33223333322222oooooo3333333oo..... +.........ooo33333333333333333333oooo....... +............ooooooo333333ooooooo........... +...................oooPoo.................. diff --git a/parts_src/head_top/antennae.txt b/parts_src/head_top/antennae.txt new file mode 100644 index 0000000..2501e85 --- /dev/null +++ b/parts_src/head_top/antennae.txt @@ -0,0 +1,16 @@ +..ooo......ooo.. +.oabbo....oaabo. +oabbbbo..oaaabbo +obbbbco..oabbbbo +obbbcco..obbbbco +.occco....obcco. +..o23o....o12o.. +..o23o....o12o.. +..o23o....o12o.. +..o23o....o12o.. +...o23o..o12o... +...o23o..o12o... +...o23o..o12o... +...o23o..o12o... +..o223o..o112o.. +..o223o.Po112o.. diff --git a/parts_src/head_top/cloud_tuft.txt b/parts_src/head_top/cloud_tuft.txt new file mode 100644 index 0000000..6cacc7b --- /dev/null +++ b/parts_src/head_top/cloud_tuft.txt @@ -0,0 +1,11 @@ +.........oooo......... +.......ooxxxxoo....... +...oo.oxxxxxxxxo.oo... +..oxxoxxxxxxxxxyoyyo.. +.oxxxoxxxxxxxxyyoyyyo. +oxxxxxxxxxxxxyyyyyyyyo +oxxxxxyxxxxxyyyyyyyyzo +oxxxyyyyyyyyyyyyyyyzzo +oyyyyyyyyyyyyyyyyyzzzo +.oyyyyoyyyyyyyyoyzzzo. +..ooooyyyyyPyyyyoooo.. diff --git a/parts_src/head_top/crest_feather.txt b/parts_src/head_top/crest_feather.txt new file mode 100644 index 0000000..1efd7ae --- /dev/null +++ b/parts_src/head_top/crest_feather.txt @@ -0,0 +1,14 @@ +........oo....o... +......ooabo.ooao.. +.....oaabcooabco.. +....oaabcoaabco... +...oaaabcoabco.... +..oaaabbcobbco.... +..oaaabbcobcco.oo. +..oaaabbcobcooobco +..oaaabcobbcobcco. +..oaaabcobcobccco. +...oaabcobcoccco.. +...oaabcobcocco... +...oaabcobcocco... +....aabcPbcocc.... diff --git a/parts_src/head_top/crest_flame.txt b/parts_src/head_top/crest_flame.txt new file mode 100644 index 0000000..2b12b6b --- /dev/null +++ b/parts_src/head_top/crest_flame.txt @@ -0,0 +1,16 @@ +...........oo..... +..........oyyo.... +.........oyyyo.... +........oyyyyo..o. +.......oyyyyyo.oyo +..o...oyyyyyo.oyyo +.oyo..oyyxyyooyyyo +.oyyooyyxxyyoyyyyo +.oyyyoyyxxyyyyyzyo +.oyyyyyxxxxyyyzzyo +oyyxyyxxxxxyyyzyo. +oyyxxyxxxxxxyzzyo. +oyyxxxxxxxxxyzzyo. +.oyyxxxxxxxyzzyo.. +..oyzxxxxxyzzyo... +....yzzxxPzzz..... diff --git a/parts_src/head_top/crystal_spikes.txt b/parts_src/head_top/crystal_spikes.txt new file mode 100644 index 0000000..fb201ba --- /dev/null +++ b/parts_src/head_top/crystal_spikes.txt @@ -0,0 +1,14 @@ +........oo........ +.......oabo....... +......oaabco...o.. +..o..oaabbcco.obo. +.oao.oaabbccoobco. +.oabooaabbccobbco. +.oaaboaabbccobbcco +.oaaboaabbccobbcco +.oaaboaabbccobcco. +..oaaoaabbccobcco. +..oaaoaabbccocco.. +...oaoaabbccocco.. +...oaoaabbccoco... +......aabPccoc.... diff --git a/parts_src/head_top/ears_bolt.txt b/parts_src/head_top/ears_bolt.txt new file mode 100644 index 0000000..b26861e --- /dev/null +++ b/parts_src/head_top/ears_bolt.txt @@ -0,0 +1,16 @@ +..oooo..............oooo.. +.oxxxyo............oxyyzo. +.oxyyyyo..........oxyyyzo. +..oxyyyo..........oyyyzo.. +...oxyyyo........oyyyzo... +....o1222o......o1223o.... +....o12222o....o12223o.... +.ooooo1222o....o2223ooooo. +o1111122333o..o3332222223o +.o122223ooo....ooo222223o. +.o1222223o......o2222223o. +..o122223o......o222223o.. +...o122223o....o222223o... +...o122223o....o222223o... +....o122223o..o222223o.... +....o1222223oP2222223o.... diff --git a/parts_src/head_top/ears_fin.txt b/parts_src/head_top/ears_fin.txt new file mode 100644 index 0000000..8519261 --- /dev/null +++ b/parts_src/head_top/ears_fin.txt @@ -0,0 +1,15 @@ +....o......................o.... +...obo....................obo... +...ocbo..................oaco... +...oacbo................oacco... +.o.oacbbo..............oabcco.o. +obooabcbbo............oabcbcoobo +oaacbbccbbo..........oabccbbcaco +.oabccbcbco..........oabcbccbco. +..oabccccbbo........oabccccbco.. +.oabbbcccbbbo......oabbcccbbbbo. +oacccbbcccbco......oabcccbbcccbo +.oabccccccbbbo....oabbccccccbco. +..ooabbbcccbco....oabcccbbbcoo.. +....oooabbbbco..P.oabbbbcooo.... +.......oooooo......oooooo....... diff --git a/parts_src/head_top/ears_floppy.txt b/parts_src/head_top/ears_floppy.txt new file mode 100644 index 0000000..b4c29dd --- /dev/null +++ b/parts_src/head_top/ears_floppy.txt @@ -0,0 +1,17 @@ +......ooooooo.........ooooooo...... +....oo2222222oo.....oo1222222oo.... +..oo11111122222o...o22111111222oo.. +.o11111122222322o.o22221111111222o. +.o221112223333oo...oo222211111112o. +.o221122233ooo...P...ooo222112222o. +o222222233o.............o322222223o +o22222233o...............o22222223o +o2222233o.................o2222223o +o2222233o.................o2222333o +o222223o...................o223333o +.o22223o...................o23333o. +.o22222o...................o22333o. +..o22233o.................o22233o.. +...o3333o.................o2223o... +....o33o...................o22o.... +.....oo.....................oo..... diff --git a/parts_src/head_top/ears_long.txt b/parts_src/head_top/ears_long.txt new file mode 100644 index 0000000..1b0f3ac --- /dev/null +++ b/parts_src/head_top/ears_long.txt @@ -0,0 +1,20 @@ +..oo................oo.. +.o21o..............o12o. +.o212o............o112o. +o22122o..........o21122o +o21112o..........o11123o +o21bb23o........o21bb23o +o21bb22o........o21bb23o +o21bb223o......o221bb23o +o22bb223o......o221bb23o +o221bb23o......o21bb223o +o221bb223o....o221bb223o +o221bb223o....o221bb223o +o221bbb23o....o22bbb233o +o222bbb233o..o222bbb233o +.o22bbb223o..o222bbb33o. +.o222bbb23o..o22bbb233o. +..o22bbb23o..o22bbb33o.. +..o222bb333oo222bb333o.. +...o23bbb33oP22bbb33o... +....o33bb33oo22bb33o.... diff --git a/parts_src/head_top/ears_pointed.txt b/parts_src/head_top/ears_pointed.txt new file mode 100644 index 0000000..b0c3ffc --- /dev/null +++ b/parts_src/head_top/ears_pointed.txt @@ -0,0 +1,14 @@ +.o..............o. +o1o............o1o +o12o..........o12o +o112o........o123o +o112o........o123o +o1132o......o1233o +o1132o......o1233o +o11332o....o12333o +o113322o..o123332o +o113322o..o123332o +o112222o..o122222o +o122222o..o122222o +o222222o..o222222o +.222222..P.222222. diff --git a/parts_src/head_top/ears_round.txt b/parts_src/head_top/ears_round.txt new file mode 100644 index 0000000..9b36285 --- /dev/null +++ b/parts_src/head_top/ears_round.txt @@ -0,0 +1,12 @@ +...ooooo..........ooooo... +..o22222o........o12222o.. +.o2211122o......o1111122o. +o2211cc122o....o211cc1222o +o221cbbb23o....o22cbbb223o +o221cbbb23o....o22cbbb223o +o222cbba22o....o22cbba233o +.o222bb2223o..o2212bb233o. +.o222222222o..o221223333o. +..oo32223333oo22222333oo.. +....o3333333oo2222233o.... +.....o3333333P222333o..... diff --git a/parts_src/head_top/flower_bloom.txt b/parts_src/head_top/flower_bloom.txt new file mode 100644 index 0000000..a96f844 --- /dev/null +++ b/parts_src/head_top/flower_bloom.txt @@ -0,0 +1,15 @@ +.......oooo....... +......oaabbo...... +.....obaaabbo..... +..oooobaabbboooo.. +.oaabbobbbbobbbco. +.oaaabboooobbbbbo. +obabbboxxyyobcccco +obbbbooxxxyoocccco +.obbooyyyyyyoocco. +..ooaaoyyzzobboo.. +..obaaboyzobccco.. +..obabbboobcccco.. +..obbbccocccccco.. +...ooccooooccoo... +........zP........ diff --git a/parts_src/head_top/gem_forehead.txt b/parts_src/head_top/gem_forehead.txt new file mode 100644 index 0000000..dcee1a8 --- /dev/null +++ b/parts_src/head_top/gem_forehead.txt @@ -0,0 +1,6 @@ +.oooo. +oawabo +oaabco +obbbco +.obPo. +..oo.. diff --git a/parts_src/head_top/headband.txt b/parts_src/head_top/headband.txt new file mode 100644 index 0000000..0a5c1ec --- /dev/null +++ b/parts_src/head_top/headband.txt @@ -0,0 +1,10 @@ +......................ooo. +...................oo.oabo +....ooooooooooooooobboabco +...oaaaaaaaaabbbbbboaabbo. +..obbbbbbbbPbbbbbbbobbco.. +.occcccccccccccccccobbbo.. +.oooooooooooooooooooccbboo +....................ocbbco +......................occo +.......................oo. diff --git a/parts_src/head_top/horn_single.txt b/parts_src/head_top/horn_single.txt new file mode 100644 index 0000000..48f6515 --- /dev/null +++ b/parts_src/head_top/horn_single.txt @@ -0,0 +1,14 @@ +........oo.. +......oobbo. +.....oabbbo. +....oababo.. +...obbabbo.. +...obabbco.. +..obbabco... +..obbabco... +..obaabco... +.obbabbco... +.obbbbbco... +.obbbbccco.. +.obbcPcco... +..oooooo.... diff --git a/parts_src/head_top/horns_dragon.txt b/parts_src/head_top/horns_dragon.txt new file mode 100644 index 0000000..c1a4afc --- /dev/null +++ b/parts_src/head_top/horns_dragon.txt @@ -0,0 +1,19 @@ +................o...... +.............ooobo..... +...........oobbbo...... +.........oobbbbo....... +........obbbbbo.....oo. +.......obbbbbo...ooocco +......obbbbbo..oobbcco. +.....obccbbo..obbbcco.. +....obbacco..obbccco... +...obbabbco.obbccco.... +...obbbbco.obbbcco..... +..obccbbco.obbcco...... +..obaccccoobbccco...... +.obbaabcoobbbccco...... +obbaabbcoobbbcco....... +obbbbbbcPobcccco....... +obbbbbcco.occcco....... +.oocccco...ooooo....... +...oooo................ diff --git a/parts_src/head_top/horns_ram.txt b/parts_src/head_top/horns_ram.txt new file mode 100644 index 0000000..785ffc6 --- /dev/null +++ b/parts_src/head_top/horns_ram.txt @@ -0,0 +1,13 @@ +....oooooo.............oooooo.... +..ooaaacaabo.........obaacaaaoo.. +.oaaabbcbbbbo.......obbbbcbbaaao. +oaabbbbcbbbbbo.....obbbbbcbbbbbbo +oabbooooobbbbbo...obbbbbooooobbco +oaao.....obbbbo...obbbbo.....obco +occo......obbbco.ocbbbo......occo +oabbo.....obbbco.ocbbbo.....obbco +obbbco....obbccoPoccbbo....ocbbco +.oobbbo...occcoo.ooccco...obbcoo. +..ocbbbo..oooo.....oooo..obbbco.. +...ooccbo...............obccoo... +.....oooo...............oooo..... diff --git a/parts_src/head_top/ice_crown.txt b/parts_src/head_top/ice_crown.txt new file mode 100644 index 0000000..8569cbc --- /dev/null +++ b/parts_src/head_top/ice_crown.txt @@ -0,0 +1,14 @@ +..........o.......... +.........oyo......... +......o..oyo..o...... +.....oyooxyzooyo..... +..o..oyooxyzooyo..o.. +.oyooxyoxxyzzoyzoozo. +.oyooxyoxxyzzoyzoozo. +oxyoxxyoxxyzzoyzzozzo +oxyoxxyoxxyzzoyzzozzo +oooooxyoxxyzzoyzooooo +oxxxxoooooooooooyyyyo +oyyyyxxxxxxxxxxyzzzzo +.ooooyyyyyyyyyyzoooo. +.....oooooPooooo..... diff --git a/parts_src/head_top/leaf_sprout.txt b/parts_src/head_top/leaf_sprout.txt new file mode 100644 index 0000000..9eb4b58 --- /dev/null +++ b/parts_src/head_top/leaf_sprout.txt @@ -0,0 +1,16 @@ +................ooo. +.............oooyyzo +............oyyyxxzo +.ooooo.....oyyyyxzo. +ozyyyyo...oyyyyxzzo. +.oxxyyyo..oyyyxxzzo. +.ozxxyyyo.oyyxxzzzo. +.ozzxxyyyooyxxzzzzo. +.ozzzxxyyooxxzzzzo.. +..ozzzzxxooxzzzoo... +...ozzzzoyzoooo..... +....oooooyzo........ +........oyzo........ +........oyzo........ +........oyzo........ +.........yP......... diff --git a/parts_src/head_top/mushroom_cap.txt b/parts_src/head_top/mushroom_cap.txt new file mode 100644 index 0000000..c67c874 --- /dev/null +++ b/parts_src/head_top/mushroom_cap.txt @@ -0,0 +1,12 @@ +........oooooooo........ +......oobbbbbbbboo...... +....oobbbbbaabbbbboo.... +...obbbbbbaaaabbbbbbo... +..obbbbbbbaaaabbbbbbbo.. +.obbaabbbbbaabbbbaabbbo. +.obaaaabbbbbbbbbaaaabco. +obbaaaabbabbbbbbbaabccco +obbbaabbaaabbbbbbbbcccco +obbbbbbbbabbbbbbbbccccco +.occcccccccccccccccccco. +..ooooooooooPooooooooo.. diff --git a/parts_src/head_top/spiky_hair.txt b/parts_src/head_top/spiky_hair.txt new file mode 100644 index 0000000..955fba2 --- /dev/null +++ b/parts_src/head_top/spiky_hair.txt @@ -0,0 +1,13 @@ +............o....... +..........oo2o...... +........oo22o....o.. +.......o1222o..oo2o. +......o1112o.oo22o.. +.....o21122oo2222o.. +....o21112o111122o.. +...o221112o11122oooo +..o2211122o11123o23o +..o21112222o122o223o +.o222222222o222o233o +o2222222223o223o33o. +o222222222Po222o3o.. diff --git a/parts_src/head_top/water_spout.txt b/parts_src/head_top/water_spout.txt new file mode 100644 index 0000000..6754630 --- /dev/null +++ b/parts_src/head_top/water_spout.txt @@ -0,0 +1,14 @@ +........oooo........ +......ooxyyyoo...... +....ooxxwyyyyzoo.... +..ooxxxyyxyyyyzzooo. +.oxxyyoooxyzoooyyzzo +oxyyoo..oxyzo..ooyzo +oxyo....oxyzo...oyzo +.oo.....oxyzo....oo. +........oxyzo....... +.oo....oxxyzzo...oo. +oxyo..oxxyyyzzo.oyzo +oyzo.oxxyyyyyzzoozzo +.oo..oxyyyyyyzzo.oo. +.....oyyyyPyyzzo.... diff --git a/parts_src/head_top/wisp_flame.txt b/parts_src/head_top/wisp_flame.txt new file mode 100644 index 0000000..8cabf18 --- /dev/null +++ b/parts_src/head_top/wisp_flame.txt @@ -0,0 +1,16 @@ +...........ooo.. +.........ooyyo.. +.oo.....oyyyo... +oxyo.o.oyyyo.... +oyyooyooyyyo..o. +.oo.oyyxyyyyooyo +...oyxxxxyyyyyo. +...oyxxxxxyyyzo. +....oyxxxyyyzzo. +.....ooyyyyzzo.. +.......oooooo... +................ +................ +................ +................ +........P....... diff --git a/parts_src/tail/tail_club.txt b/parts_src/tail/tail_club.txt new file mode 100644 index 0000000..3504cd5 --- /dev/null +++ b/parts_src/tail/tail_club.txt @@ -0,0 +1,18 @@ +...............oo........... +..............obbo.......o.. +..............obbbo....oobo. +.............obboo2oooobbo.. +.............ooo2222obbbbo.. +............o22111122obbbo.. +...........o2211111122obbo.. +..........o221111112222oo... +..........o2221111222223o... +..........o2221112222223o... +.........oaoo22222222233o... +.....ooooaaabo222222233oboo. +ooooo222aaabbo22222333obbbbo +2222222bbabbbo22223333obboo. +211P112bbbbcco33333333obo... +22222223bbccoo3333333o.o.... +2233333oocco..ooooooo....... +ooooooo..oo................. diff --git a/parts_src/tail/tail_crystal.txt b/parts_src/tail/tail_crystal.txt new file mode 100644 index 0000000..b1b900d --- /dev/null +++ b/parts_src/tail/tail_crystal.txt @@ -0,0 +1,22 @@ +.................o........ +................oao....... +...............oaabo...... +..............oaaabbo..... +.............oaaabbbco.... +.............oaaabbbco.... +............ooaaabbbcoo... +...........oaoaaabbbcoao.. +..........oaaoaaabbbcoabo. +..........oaboaaabbbcobbco +..........oaboaaabbbcobbco +...........oooaaabbbcobbco +.........oo111oaabbcoabbco +...oooooo211122ooooooabco. +..o1222211112233o....ooo.. +.o1111111122233o.......... +o2111111222233o........... +o221222222233o............ +o222P2222333o............. +o222223333oo.............. +.o222333oo................ +..o333oo.................. diff --git a/parts_src/tail/tail_curly.txt b/parts_src/tail/tail_curly.txt new file mode 100644 index 0000000..cb1b7b0 --- /dev/null +++ b/parts_src/tail/tail_curly.txt @@ -0,0 +1,16 @@ +.....oooooo..... +...oo222222oo... +..o2221111222o.. +.o221111112222o. +.o2211oooo22223o +o2112o2222o2223o +o2112o2112o2223o +o2122o2122o2233o +o2222o2222o2233o +o2222o222222233o +o2223o22222333o. +o2223oo2333333o. +o2233o.ooooooo.. +o2P33o.......... +o2333o.......... +.oooo........... diff --git a/parts_src/tail/tail_dragon.txt b/parts_src/tail/tail_dragon.txt new file mode 100644 index 0000000..b4dd310 --- /dev/null +++ b/parts_src/tail/tail_dragon.txt @@ -0,0 +1,17 @@ +..................oo.......... +..................oaoo........ +..................oaaaoo...... +.................oooaaaaoo.... +...............oo22oaaaaaaoo.. +............ooo22222oaaaaaaaoo +......oooooo22111122oabbbbbbbo +...ooo22222211112223obbbbbbcoo +..o1211111111122233obbbbbccoo. +.o1111111111122233oobbbbcoo... +o2211111222222233oobbbccoo.... +o222122222222233o.obccoo...... +o2222P222223333o..ooo......... +o222222233333oo............... +.o2223333333o................. +..o333333ooo.................. +...oo3ooo..................... diff --git a/parts_src/tail/tail_feather_fan.txt b/parts_src/tail/tail_feather_fan.txt new file mode 100644 index 0000000..8b3a03f --- /dev/null +++ b/parts_src/tail/tail_feather_fan.txt @@ -0,0 +1,22 @@ +...o................... +..obo.....o............ +..oao....obo........... +.oaabo.ooabo........... +obaabboaabbo........... +obaabobaaaboooooo...... +obaabobabbboabbbbo..... +obabbobbbboaaaabbo..... +obabobbbbobaabbbbo..... +obabobbbcobabbbcco..... +obabobbbobabbbccoo..... +obabobbobbabbccobboo... +obbobbobbabbccobbbbbo.. +.obobaobabbccoaabbbo... +.obobobbbbcooabbbbco... +.oobobbbbcoabbbbccco... +.oobobbbbobbbbcccooo... +.ooobbbbobbbcoooobbboo. +.oobbboobboooaaaaabbbbo +.oobPobooobbbbbbbbbbbco +..ooooobbbbbbcccccccco. +...oooooooooooooooooo.. diff --git a/parts_src/tail/tail_fish_fin.txt b/parts_src/tail/tail_fish_fin.txt new file mode 100644 index 0000000..4e769c3 --- /dev/null +++ b/parts_src/tail/tail_fish_fin.txt @@ -0,0 +1,19 @@ +...............oooo...... +..............obbbbo..... +.............obacbbo..... +...........oobacbbo...... +..........obaacbbbo...... +.........obaacbbbo....... +.......oobaacbbbbo....... +......obbaacbbbbo........ +.....obbaacbbbbco........ +.oooobbaacbbbbco......... +obbbbbaacbbbbcco......... +obbbbbbbbbbbccoo......... +obbbbbbbbbbbbbbbooo...... +obbbPbbbbccccbbbbbbooo... +obbbbbbbbbbbbccccbbbbboo. +obbbbbbbbbbbbbbbbccccbbbo +occcbbbbbbbbbbbbbbbbbccco +.ooooccccccccccccccccccco +.....ooooooooooooooooooo. diff --git a/parts_src/tail/tail_flame_tip.txt b/parts_src/tail/tail_flame_tip.txt new file mode 100644 index 0000000..6b12777 --- /dev/null +++ b/parts_src/tail/tail_flame_tip.txt @@ -0,0 +1,23 @@ +...................o...... +..................oyo..... +..................oyyo.... +.................oyyyo.... +.................oyyyyo... +.............o..oyyyyyoo.. +............oyo.oyyyyyoyo. +............oyyoyyyxyyoyo. +............oyyyyyxxyyyyo. +...........oyyyyyxxxyyyyo. +...........oyyyyxxxxyyyzo. +...........oyyyxxxxxyyzzo. +..........ooyyyxxxxxxyzzo. +.........o2oyyyxxxxxyyzzo. +........o222oyyyxxxxyzzzo. +.......o2122ozyyyyyyzzzo.. +.....oo21123oozzzzzzzzo... +...oo221123o..oooooooo.... +.oo2211233o............... +o22112233o................ +o22P2233o................. +o233333o.................. +.oooooo................... diff --git a/parts_src/tail/tail_fluffy.txt b/parts_src/tail/tail_fluffy.txt new file mode 100644 index 0000000..1ff718a --- /dev/null +++ b/parts_src/tail/tail_fluffy.txt @@ -0,0 +1,23 @@ +...............o.......... +..............o2o....o.... +.............o22o...o2o... +............o222o..o12o... +...........o22122oo222o... +..........o22112221222ooo. +.........o221111111222222o +........o221113112222232o. +........o22111132222222o.. +.......o2211111222322233o. +.......o22111222222323332o +......o2221322222233333oo. +......o222123222233333o... +.....o222222222233333o.... +.....o22222222233333o..... +....o22222222233333o...... +....o222222233333oo....... +...o22222233333oo......... +...o222223333oo........... +..o2P222333oo............. +..o222333oo............... +...o223oo................. +....ooo................... diff --git a/parts_src/tail/tail_ice_shard.txt b/parts_src/tail/tail_ice_shard.txt new file mode 100644 index 0000000..7eef4d7 --- /dev/null +++ b/parts_src/tail/tail_ice_shard.txt @@ -0,0 +1,23 @@ +...........................oo +..........................oxo +.........................oxxo +........................oxxyo +.......................oxxxyo +......................oxxxyyo +.............o.......oxxxxyyo +............oxo.....oxxxxyyzo +............oxyo...oxxxxyyyzo +...........oxxyo..oxxxxyyyzo. +...........oxxyyooxxxxyyyzzo. +...........oxyyyoxxxyyyyzzo.. +...........oxyyoxxxyyyyzzo... +........ooooxyoxxyyyyzzoo.... +..oooooo2211ooxxyyyzzoooo.... +.o11222111112oxyyzzooxxxxoo.. +o2111111122222ozzooyyyyyyyyo. +o21111122222333oo.ozzzzzyoo.. +o222222222333oo....ooooooo... +o222P222333oo................ +o22223333oo.................. +.o23333oo.................... +..ooooo...................... diff --git a/parts_src/tail/tail_leaf.txt b/parts_src/tail/tail_leaf.txt new file mode 100644 index 0000000..2640195 --- /dev/null +++ b/parts_src/tail/tail_leaf.txt @@ -0,0 +1,24 @@ +.......................oo. +......................oyyo +.....................oyyzo +...................ooyyyo. +..................oyyyxyo. +................ooyyxxyyo. +...............oyyyyyxyzo. +..............oyyxyyxyyzo. +.............oyyyyxxyyzzo. +.............oyyyyyxyyzo.. +............oyyxyyxyyzzo.. +............oyyyxxyyyzzo.. +...........oyyyyyxyyzzo... +...........oyyyyxyyzzzo... +...........oyyyxyyzzzo.... +...........oyyyxyzzzo..... +........ooooyyxyzzzo...... +....oooo2221oyzzzzo....... +.ooo22221123oyzooo........ +o2221112233o.oo........... +o22P222333o............... +o2333333oo................ +.o333ooo.................. +..ooo..................... diff --git a/parts_src/tail/tail_lightning.txt b/parts_src/tail/tail_lightning.txt new file mode 100644 index 0000000..a703df5 --- /dev/null +++ b/parts_src/tail/tail_lightning.txt @@ -0,0 +1,23 @@ +.......................o. +.....................ooyo +...................ooxyyo +..................oxxyzo. +................ooxxyzo.. +...............oxxyyzo... +.............ooxxyyzo.... +............oxxxyyzo..... +..........ooxxyyyzo...... +.......oooyxxyyzoo....... +......oyxxxxxxyyyzoo..... +.......ooyyyyyyyyyzzo.... +.........oooooxyyzzo..... +............oxyyzzo...... +...........oxyyzzo....... +...ooooo..oxyyzzo........ +..o22222ooxyyzzo......... +.o211122oxyyzzo.......... +o221122oxyyzzo........... +o22P22oyyyzzo............ +o223333ooooo............. +.o3333oo................. +..oooo................... diff --git a/parts_src/tail/tail_long_thin.txt b/parts_src/tail/tail_long_thin.txt new file mode 100644 index 0000000..1599fdd --- /dev/null +++ b/parts_src/tail/tail_long_thin.txt @@ -0,0 +1,15 @@ +....................oo.. +...................o22o. +.................oo222o. +................o22222o. +...............o212222o. +..............o2112223o. +.............o21122233o. +.............o2222233o.. +.............o222333o... +..............o2333o.... +............oo23ooo..... +.ooooooooooo223o........ +o22P222222223oo......... +o3333333333oo........... +.oooooooooo............. diff --git a/parts_src/tail/tail_rattle.txt b/parts_src/tail/tail_rattle.txt new file mode 100644 index 0000000..73de5b4 --- /dev/null +++ b/parts_src/tail/tail_rattle.txt @@ -0,0 +1,18 @@ +............oo. +...........oabo +...........obco +..........oooo. +.........oaabo. +........oabbbco +.......oooocco. +......oaabboo.. +.....oaabbbco.. +....ooooobco... +...oaabbboo.... +..oaabbbbco.... +..oooooobco.... +.oaaabbboo..... +oaaabbbbbo..... +obbPbbbbco..... +.obbbbcco...... +..oooooo....... diff --git a/parts_src/tail/tail_spiked.txt b/parts_src/tail/tail_spiked.txt new file mode 100644 index 0000000..a474bcc --- /dev/null +++ b/parts_src/tail/tail_spiked.txt @@ -0,0 +1,21 @@ +....................o....... +...................oao...... +..............o....oabo..... +.............oao..oabco..oo. +.............oabo.oabbcoo22o +.......o....oabcooaabbco222o +......oao...oabbcoabbbo2222o +......oabo.oaabbcoaboo2222o. +.....oabco.oabbbcooo22222o.. +.....oabbcoaabbboo2121222o.. +.....oabbcoaaooo21111222o... +.....oabooooo2211112223o.... +...ooooo22222111122233o..... +..o222221111112222233o...... +.o211111111112222333o....... +.o2111111122222333oo........ +o222222222222233oo.......... +o2222P222223333o............ +.o22222333333oo............. +.o222333333oo............... +..o33333ooo................. diff --git a/parts_src/tail/tail_stinger.txt b/parts_src/tail/tail_stinger.txt new file mode 100644 index 0000000..13ba5f3 --- /dev/null +++ b/parts_src/tail/tail_stinger.txt @@ -0,0 +1,23 @@ +...........oooooo..... +.........ooaaaabbbo... +.......ooaaaaabbbbbo.. +.....ooaaabbbbbbbbco.. +...ooabbbbbbbbbbbbco.. +....ooooobbbbbbbbcco.. +.........oobbbbbccco.. +...........occccco.... +............ooooo..... +...........oaabbbo.... +...........oabbbco.... +.........ooobbbcco.... +........oaabobcco..... +.......oaabbbooo...... +...oooooabbbbco....... +.ooaaabobbbbcco....... +oaaaabbbobccco........ +oaabbbbbboooo......... +oabbbbbbco............ +obbbPbbbco............ +obbbbbccco............ +.obbcccco............. +..oooooo.............. diff --git a/parts_src/tail/tail_stub.txt b/parts_src/tail/tail_stub.txt new file mode 100644 index 0000000..5744259 --- /dev/null +++ b/parts_src/tail/tail_stub.txt @@ -0,0 +1,15 @@ +............o.. +...........o2o. +......ooo.o22o. +....oo222oo22o. +...o222122222o. +..o221111222o.. +..o2111112222o. +.o22111122223o. +.o22212222223o. +.o22222222233o. +..o2222222233o. +..oP22222333o.. +...o33333333o.. +....oo3333oo... +......oooo..... diff --git a/parts_src/tail/tail_wispy.txt b/parts_src/tail/tail_wispy.txt new file mode 100644 index 0000000..4c143eb --- /dev/null +++ b/parts_src/tail/tail_wispy.txt @@ -0,0 +1,19 @@ +...............ooooo.... +..............o22221o... +.............o2222112o.. +............o222ooo11oo. +............o21o..o1222o +............o122o..o222o +............o223o.o2233o +............o223o.o2133o +............o223o.o222o. +.............ooo.o2223o. +..oooooooo......o22223o. +.o11222222oooooo22222o.. +o2111111222222222222o... +o211111122211122222o.... +o22122222222222222o..... +o222P2222333333ooo...... +o222233333ooooo......... +.o23333ooo.............. +..ooooo................. diff --git a/preview.py b/preview.py new file mode 100755 index 0000000..cb06025 --- /dev/null +++ b/preview.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python3 +""" +Contact sheets for the sprite part library. Writes PNGs into preview/ (or $PREVIEW_OUT). + + python preview.py bases # every base creature, bare and lightly varied + python preview.py body # one base with markings and a few variations + python preview.py part # a variation part on every compatible base + python preview.py slot # every part of a slot on a default base + python preview.py raw # parts of a slot at 8x: raw keys + markers, and recolored + python preview.py show body/base_fox tail/tail_leaf # chosen parts at 10x, raw + recolored + python preview.py zoom body=base_fox tail=tail_leaf + body=base_blob head_top=leaf_sprout # tight crops, 5x + python preview.py all # raw + slot sheets for every slot, plus bases + +Options: --markings (default none), --scale N, --type (type ramp) +Grid sheets are drawn in three test palettes (dark / light / near-gray), one row block each. +Cells with a red frame triggered "canvas expanded". Set PARTS_DIR to preview another library. +""" +import os +import random +import sys +from pathlib import Path + +from PIL import Image, ImageDraw + +import generate_sprite as gs +import sprite_parts as cfg + +OUT = Path(os.environ.get("PREVIEW_OUT", "preview")) # set PREVIEW_OUT to keep sheets apart +PARTS = os.environ.get("PARTS_DIR", "parts") +PALETTES = [("dark", ["#0D47A1", "#FFC107"]), ("light", ["#FFEB3B", "#5D4037"]), ("gray", ["#757575", "#E53935"])] +BG = (226, 226, 220, 255) +LABEL_H = 9 + +BY_NAME = {slot: {p["name"]: p for p in parts} for slot, parts in cfg.SLOTS.items()} +DEFAULT_BODY = "base_fox" + + +def P(slot, name): + return BY_NAME[slot][name] + + +def exists(slot, name): + return (Path(PARTS) / slot / f"{name}.png").exists() + + +def allowed(slot, name, chosen): + """Same rules as generate_sprite.candidates, against an explicit selection.""" + p = P(slot, name) + body = P("body", chosen["body"]) + tags, excluded, denied = {f"plan:{body['plans'][0]}"}, set(), set() + for s, n in chosen.items(): + if s != slot and not s.startswith("_") and n != "none": + tags |= set(P(s, n)["tags"]) + excluded |= set(P(s, n)["excludes"]) + denied |= set(P(s, n)["deny"]) + if body["plans"][0] not in p["plans"] or name in denied: + return False + if p["requires"] and not set(p["requires"]) & tags: + return False + return not (set(p["tags"]) & excluded or set(p["excludes"]) & tags) + + +def top_type(slot, name): + p = P(slot, name) + return max(cfg.TYPES, key=lambda t: gs.part_weight(p, t)) + + +def typed(chosen, ptype): + """Type ramp to show: explicit, else the first type-palette part's best type, else the body's.""" + if ptype: + return ptype + for s, n in chosen.items(): + if s != "body" and not s.startswith("_") and n != "none" and P(s, n)["palette"] == "type": + return top_type(s, n) + return top_type("body", chosen["body"]) + + +def compose(chosen, markings="none"): + chosen = dict(chosen) + m = chosen.pop("_markings", markings) + picks = {s: P(s, n) for s, n in chosen.items() if n and n != "none"} + return gs.compose(PARTS, picks, m, random.Random(1)) + + +def colored(spr, colors, ptype): + main, accent = gs.pick_main_accent([(gs.hex_to_rgb(c), 1.0) for c in colors], ptype) + return gs.recolor(spr, gs.build_palette(main, accent, ptype)) + + +def sheet(cells, path, ptype=None, markings="none", scale=4, cols=6): + """cells: list of (label, chosen-dict). Renders each in all three palettes at 1x cells.""" + if not cells: + print(f"nothing to render for {path}") + return + cols = min(cols, len(cells)) + rows_per = (len(cells) + cols - 1) // cols + cw, ch = gs.CANVAS, gs.CANVAS + LABEL_H + block_h = rows_per * ch + 12 + img = Image.new("RGBA", (cols * cw, block_h * len(PALETTES)), BG) + d = ImageDraw.Draw(img) + for bi, (pname, colors) in enumerate(PALETTES): + y0 = bi * block_h + d.text((2, y0 + 1), f"{pname}: {', '.join(colors)}", fill=(60, 60, 60, 255)) + for i, (label, chosen) in enumerate(cells): + cx, cy = (i % cols) * cw, y0 + 12 + (i // cols) * ch + sprite = compose(chosen, markings) + expanded = max(sprite.width + 2, sprite.height + gs.GROUND_MARGIN + 1) > gs.CANVAS + spr = colored(gs.place_on_canvas(sprite), colors, typed(chosen, ptype)) + if spr.size[0] > cw: + spr = spr.crop(((spr.width - cw) // 2, spr.height - gs.CANVAS, (spr.width + cw) // 2, spr.height)) + img.alpha_composite(spr, (cx, cy)) + if expanded: + d.rectangle((cx, cy, cx + cw - 1, cy + gs.CANVAS - 1), outline=(220, 0, 0, 255)) + label = f"{label} {sprite.width}x{sprite.height}!" + d.text((cx + 1, cy + gs.CANVAS - 1), label[:19], fill=(40, 40, 40, 255)) + OUT.mkdir(parents=True, exist_ok=True) + img.resize((img.width * scale, img.height * scale), Image.NEAREST).save(path) + print(path) + + +def zoom_sheet(groups, path, scale=5, markings="none", ptype=None): + """Tight-cropped composites, one row per combo, one column per test palette.""" + rows = [] + for chosen in groups: + spr = compose(chosen, markings) + rows.append([colored(spr, colors, typed(chosen, ptype)) for _, colors in PALETTES]) + cw = max(i.width for r in rows for i in r) + 4 + ch = max(i.height for r in rows for i in r) + 4 + img = Image.new("RGBA", (cw * len(PALETTES), ch * len(rows)), BG) + for yi, r in enumerate(rows): + for xi, im in enumerate(r): + img.alpha_composite(im, (xi * cw + (cw - im.width) // 2, yi * ch + ch - 2 - im.height)) + OUT.mkdir(parents=True, exist_ok=True) + img.resize((img.width * scale, img.height * scale), Image.NEAREST).save(path) + print(path) + + +def bodies(): + return [b for b in BY_NAME["body"] if exists("body", b)] + + +def hosts_for(slot, name): + """Every drawn base that can legally carry the part.""" + cells = [] + for b in bodies(): + chosen = {"body": b, slot: name} + if slot == "body" or allowed(slot, name, chosen): + cells.append((b, chosen)) + return cells + + +def raw_sheet(items, path, scale=8, cols=6): + """items: [(slot, name)]. Each part drawn raw (with markers) and recolored in the dark palette.""" + imgs = [] + for slot, n in items: + if not exists(slot, n): + continue + raw = Image.open(Path(PARTS) / slot / f"{n}.png").convert("RGBA") + rec = colored(gs.load_part(PARTS, slot, n)[0], PALETTES[0][1], top_type(slot, n)) + imgs.append((n, raw, rec)) + if not imgs: + return + pad = 3 + cw = max(i.width for _, i, _ in imgs) * 2 + pad * 3 + ch = max(i.height for _, i, _ in imgs) + pad * 2 + cols = min(cols, len(imgs)) + rows = (len(imgs) + cols - 1) // cols + out = Image.new("RGBA", (cols * cw * scale, rows * (ch * scale + 12)), BG) + d = ImageDraw.Draw(out) + for k, (n, raw, rec) in enumerate(imgs): + x, y = (k % cols) * cw * scale, (k // cols) * (ch * scale + 12) + for j, im in enumerate((raw, rec)): + ox, oy = x + (pad + j * (raw.width + pad)) * scale, y + pad * scale + for yy in range(im.height): # checker shows the part canvas + for xx in range(im.width): + if (xx + yy) % 2: + d.rectangle((ox + xx * scale, oy + yy * scale, ox + (xx + 1) * scale - 1, + oy + (yy + 1) * scale - 1), fill=(205, 205, 200, 255)) + out.alpha_composite(im.resize((im.width * scale, im.height * scale), Image.NEAREST), (ox, oy)) + d.text((x + 2, y + ch * scale), f"{n} {raw.width}x{raw.height}", fill=(30, 30, 30, 255)) + OUT.mkdir(parents=True, exist_ok=True) + out.save(path) + print(path) + + +def variation(b): + """A light, legal variation for a base: first allowed head_top, back and tail in a fixed list.""" + chosen = {"body": b} + prefs = {"head_top": ["leaf_sprout", "crest_flame", "gem_forehead", "horn_single"], + "back": ["wings_feather_small", "wings_bug", "spikes_back", "dorsal_fin"], + "tail": ["tail_flame_tip", "tail_leaf", "tail_fish_fin", "tail_stinger", "tail_wispy", "tail_rattle"]} + for slot, names in prefs.items(): + for n in names: + if exists(slot, n) and allowed(slot, n, {**chosen, slot: n}): + chosen[slot] = n + break + return chosen + + +def parse_opts(args): + opts, rest, it = {"markings": "none", "scale": None, "type": None}, [], iter(args) + for a in it: + if a in ("--markings", "--scale", "--type"): + opts[a[2:]] = next(it) + else: + rest.append(a) + return opts, rest + + +def main(argv): + opts, args = parse_opts(argv) + scale = int(opts["scale"]) if opts["scale"] else None + kw = {"markings": opts["markings"], "scale": scale or 4, "ptype": opts["type"]} + if not args: + print(__doc__) + return + cmd = args[0] + if cmd == "bases": + cells = [] + for b in bodies(): + cells += [(b, {"body": b}), (f"{b} +", variation(b))] + sheet(cells, OUT / "bases.png", **kw) + elif cmd == "body": + b = args[1] + cells = [("bare", {"body": b}), ("varied", variation(b))] + cells += [(m, {"body": b, "_markings": m}) for m in cfg.MARKINGS if m != "none"] + sheet(cells, OUT / f"body_{b}.png", **kw) + elif cmd == "part": + slot, name = args[1], args[2] + sheet(hosts_for(slot, name), OUT / f"part_{slot}_{name}.png", + **{**kw, "ptype": kw["ptype"] or (top_type(slot, name) if slot != "body" else None)}) + elif cmd == "slot": + slot = args[1] + cells = [] + for n in BY_NAME[slot]: + if n == "none" or not exists(slot, n): + continue + hosts = hosts_for(slot, n) + pick = next((c for _, c in hosts if c["body"] == DEFAULT_BODY), hosts[0][1] if hosts else None) + if pick: + cells.append((n, pick)) + sheet(cells, OUT / f"slot_{slot}.png", **kw) + elif cmd == "raw": + slot = args[1] + raw_sheet([(slot, n) for n in BY_NAME[slot] if n != "none"], OUT / f"raw_{slot}.png", + cols=3 if slot in ("aura", "body", "back") else 6) + elif cmd == "show": + raw_sheet([tuple(a.split("/", 1)) for a in args[1:]], OUT / "show.png", scale=scale or 10, cols=3) + elif cmd == "zoom": + groups, cur = [], {} + for a in args[1:]: + if a == "+": + groups.append(cur) + cur = {} + else: + k, v = a.split("=", 1) + cur[k] = v + groups.append(cur) + zoom_sheet(groups, OUT / "zoom.png", scale=scale or 5, markings=opts["markings"], ptype=opts["type"]) + elif cmd == "all": + main(["bases"]) + for slot in cfg.SLOTS: + main(["raw", slot]) + main(["slot", slot]) + else: + print(__doc__) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b01714d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +numpy>=2.0 +Pillow>=10.0 +requests>=2.31 diff --git a/sample.csv b/sample.csv new file mode 100644 index 0000000..d2537c0 --- /dev/null +++ b/sample.csv @@ -0,0 +1,46 @@ +name,type +Maple Street Bakery,normal +Corner Copy Shop,normal +Sunny Side Diner,normal +Blaze BBQ Pit,fire +Ember Forge Welding,fire +Hot Spot Pizza,fire +Clearwave Pools,water +Harbor Fish Market,water +Rainy Day Plumbing,water +Greenleaf Landscaping,grass +Fern Gully Florist,grass +Root & Sprout Farm,grass +Volt Auto Electric,electric +Bright Spark Repairs,electric +Zap Solar Co,electric +Frosty Treats Creamery,ice +Polar Air HVAC,ice +Glacier Cold Storage,ice +Iron Fist Dojo,fighting +Rumble Boxing Gym,fighting +Titan Strength Club,fighting +Nightshade Pest Control,poison +Venom Tattoo Parlor,poison +Toxic Waste Removal,poison +Bedrock Excavation,ground +Dusty Trail Concrete,ground +Mudflap Towing,ground +Skyline Drone Tours,flying +Feather Travel Agency,flying +Tailwind Kites,flying +Third Eye Tarot,psychic +Mindful Yoga Studio,psychic +Dreamscape Therapy,psychic +Busy Bee Honey,bug +Beetle Bros Moving,bug +Hive Mind Coworking,bug +Granite Countertops Plus,rock +Boulder Climbing Gym,rock +Pebble Jewelry,rock +Hollow Oaks Funeral Home,ghost +Midnight Escape Rooms,ghost +Phantom Haunt Tours,ghost +Wyvern Security,dragon +Drake Motorsports,dragon +Scale & Claw Reptiles,dragon diff --git a/sketch.py b/sketch.py new file mode 100755 index 0000000..e4ab784 --- /dev/null +++ b/sketch.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +""" +Authoring helper for part drafts. Build a part from primitive forms, shade it with +the shared light model, add hand details, and save the text grid to parts_src/. +The saved .txt grid is the source of truth afterwards; hand-edit it freely. + + from sketch import Canvas, stamp, save + c = Canvas(40, 34) + c.capsule(26, 26, 26, 31, 2.4, r="F") # far leg (F = main ramp, in shadow) + c.ellipse(24, 24, 11, 8, r="M") # body (M = main ramp) + c.ellipse(15, 13, 12, 11, r="K") # big head in front (K = main ramp, front layer) + rows = c.shade(soft=["KM"], dark=0.84, light=(0.06, 0.50), side=(0.14, 0.80), min_light=4) + rows = stamp(rows, ["pp", "pp"], 10, 12) # hand details (face) on top + save("body/base_x", rows, marks=[("P", 22, 33), ("^", 15, 5), ("B", 28, 17), ("T", 33, 24), ("A", 24, 25)]) + +Region letters (see REGIONS): one letter per form layer. Same letter = one merged form. + main ramp: M N K (normal) F (far side, in shadow) U (extra lit) + accent ramp: C D (normal) G (far side) V (extra lit) + type ramp: Y Q (normal) J (far side) X (extra lit) +Literal palette chars (1 2 3 a b c x y z o w p) may also be used as a layer: painted flat. + +Shading: every pixel of a form gets its position along the light chord (march toward the +light at the top-left and away from it until leaving the form). The far end of the chord +is core shadow, so the shadow is a crescent that thickens where the form is deep (no +outline-following band). The highlight is an off-outline blob on the lit side. Each form +is shaded with its full silhouette, so overlapping front forms do not distort it. +Where a front form overlaps a form behind it, a 1px line is drawn on the front form, +except for pairs listed in `soft`. +""" +import math +from pathlib import Path + +REGIONS = { + "M": ("main", 0), "N": ("main", 0), "K": ("main", 0), "F": ("main", -1), "U": ("main", 1), + "C": ("accent", 0), "D": ("accent", 0), "G": ("accent", -1), "V": ("accent", 1), + "Y": ("type", 0), "Q": ("type", 0), "J": ("type", -1), "X": ("type", 1), +} +RAMPS = {"main": "123", "accent": "abc", "type": "xyz"} +LIGHT_DIR = (-0.55, -0.83) # toward the light, screen coords (y down) +DIRS4 = ((1, 0), (-1, 0), (0, 1), (0, -1)) + + +def _march(cset, x, y, dx, dy): + n, fx, fy = 0, x + 0.5, y + 0.5 + while True: + fx += dx * 0.5 + fy += dy * 0.5 + if (int(math.floor(fx)), int(math.floor(fy))) not in cset: + return n * 0.5 + n += 1 + + +def shade_form(pixels, ramp, bias=0, dark=0.76, light=(0.10, 0.42), side=(0.22, 0.72), min_light=5.0): + """{(x,y): tone char} for one form.""" + lx, ly = LIGHT_DIR + m = math.hypot(lx, ly) + lx, ly = lx / m, ly / m + px_, py_ = -ly, lx + out = {} + for x, y in pixels: + up, dn = _march(pixels, x, y, lx, ly), _march(pixels, x, y, -lx, -ly) + a, b = _march(pixels, x, y, px_, py_), _march(pixels, x, y, -px_, -py_) + chord, t = up + dn + 1, (up + 0.5) / (up + dn + 1) + q = (a + 0.5) / (a + b + 1) + d_th = dark - 0.30 * (bias < 0) + 0.10 * (bias > 0) + if t >= d_th: + tone = 2 + elif (bias >= 0 and chord >= min_light and light[0] <= t <= light[1] + 0.12 * (bias > 0) + and side[0] <= q <= side[1]): + tone = 0 + else: + tone = 1 + out[(x, y)] = RAMPS[ramp][tone] + return out + + +def add_outline(rows, ch="o"): + """1px outline (4-neighbour) around every opaque pixel.""" + h, w = len(rows), len(rows[0]) + g = [list(r) for r in rows] + add = [] + for y in range(h): + for x in range(w): + if g[y][x] == "." and any(0 <= x + dx < w and 0 <= y + dy < h and g[y + dy][x + dx] != "." + for dx, dy in DIRS4): + add.append((x, y)) + for x, y in add: + g[y][x] = ch + return ["".join(r) for r in g] + + +def stamp(rows, st, x0, y0): + """Paint text rows onto rows at x0,y0. '_' is skipped (see-through); '.' erases.""" + g = [list(r) for r in rows] + for j, s in enumerate(st): + for i, ch in enumerate(s): + if ch != "_" and 0 <= y0 + j < len(g) and 0 <= x0 + i < len(g[0]): + g[y0 + j][x0 + i] = ch + return ["".join(r) for r in g] + + +def replace(rows, pairs, region=None): + """Swap characters, e.g. replace(rows, {'o': '.'}, region=(x0, y0, x1, y1)) (inclusive).""" + g = [list(r) for r in rows] + for y, r in enumerate(g): + for x, ch in enumerate(r): + if region and not (region[0] <= x <= region[2] and region[1] <= y <= region[3]): + continue + if ch in pairs: + g[y][x] = pairs[ch] + return ["".join(r) for r in g] + + +def flip(rows): + return [r[::-1] for r in rows] + + +def save(key, rows, marks=()): + """Write parts_src/.txt, placing marker chars at (x, y).""" + g = [list(r) for r in rows] + widths = {len(r) for r in g} + if len(widths) != 1: + raise ValueError(f"{key}: ragged rows {sorted(widths)}") + for ch, x, y in marks: + g[y][x] = ch + path = Path("parts_src") / f"{key}.txt" + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("\n".join("".join(r) for r in g) + "\n") + return ["".join(r) for r in g] + + +def load(key): + return [r for r in (Path("parts_src") / f"{key}.txt").read_text().splitlines() if r and not r.startswith("#")] + + +class Canvas: + """Collects forms as ordered layers; shade() turns them into palette rows.""" + + def __init__(self, w, h): + self.w, self.h = w, h + self.layers = [] # [(char, set of pixels)], back to front + + def _add(self, px, r): + px = {(x, y) for x, y in px if 0 <= x < self.w and 0 <= y < self.h} + if self.layers and self.layers[-1][0] == r: + self.layers[-1][1].update(px) + return + for ch, s in self.layers: # same letter again = same form, keep its depth + if ch == r and r in REGIONS: + s.update(px) + return + self.layers.append((r, px)) + + def ellipse(self, cx, cy, rx, ry, r="M", angle=0.0, clip=None): + """angle in degrees, positive rotates clockwise on screen.""" + ca, sa = math.cos(math.radians(angle)), math.sin(math.radians(angle)) + rr = max(rx, ry) + px = set() + for y in range(int(cy - rr) - 1, int(cy + rr) + 2): + for x in range(int(cx - rr) - 1, int(cx + rr) + 2): + ux, uy = x + 0.5 - cx, y + 0.5 - cy + lx, ly = ux * ca + uy * sa, -ux * sa + uy * ca + if (lx / rx) ** 2 + (ly / ry) ** 2 <= 1.0 and (clip is None or clip(x, y)): + px.add((x, y)) + self._add(px, r) + + def capsule(self, x0, y0, x1, y1, r0, r="M", r1=None): + """Tapered limb from (x0,y0) radius r0 to (x1,y1) radius r1 (default r0).""" + r1 = r0 if r1 is None else r1 + vx, vy = x1 - x0, y1 - y0 + ln2 = vx * vx + vy * vy or 1e-9 + px = set() + big = max(r0, r1) + for y in range(int(min(y0, y1) - big) - 1, int(max(y0, y1) + big) + 2): + for x in range(int(min(x0, x1) - big) - 1, int(max(x0, x1) + big) + 2): + cx, cy = x + 0.5, y + 0.5 + t = max(0.0, min(1.0, ((cx - x0) * vx + (cy - y0) * vy) / ln2)) + rr = r0 + (r1 - r0) * t + if math.hypot(cx - (x0 + vx * t), cy - (y0 + vy * t)) <= rr: + px.add((x, y)) + self._add(px, r) + + def poly(self, pts, r="M"): + px = set() + ys = [p[1] for p in pts] + for y in range(int(min(ys)) - 1, int(max(ys)) + 2): + yc = y + 0.5 + xs = [] + for (ax, ay), (bx, by) in zip(pts, pts[1:] + pts[:1]): + if (ay <= yc < by) or (by <= yc < ay): + xs.append(ax + (yc - ay) * (bx - ax) / (by - ay)) + xs.sort() + for a, b in zip(xs[::2], xs[1::2]): + for x in range(int(math.floor(a)), int(math.ceil(b)) + 1): + if a <= x + 0.5 <= b: + px.add((x, y)) + self._add(px, r) + + def mask(self, rows, x0=0, y0=0): + """Add forms from a hand-drawn letter mask (each letter becomes/extends its layer).""" + by = {} + for j, row in enumerate(rows): + for i, ch in enumerate(row): + if ch not in "._ ": + by.setdefault(ch, set()).add((x0 + i, y0 + j)) + for ch, px in by.items(): + self._add(px, ch) + + def erase(self, pts): + for _, s in self.layers: + s.difference_update(pts) + + def shade(self, soft=(), outline=True, seps=True, **kw): + out = [["."] * self.w for _ in range(self.h)] + owner = [[-1] * self.w for _ in range(self.h)] + softset = {frozenset(s) for s in soft} + for k, (ch, px) in enumerate(self.layers): + if ch in REGIONS: + ramp, bias = REGIONS[ch] + tones = shade_form(px, ramp, bias, **kw) + else: + tones = {p: ch for p in px} + line = set() + if seps and ch in REGIONS: + for x, y in px: + for dx, dy in DIRS4: + nx, ny = x + dx, y + dy + if (nx, ny) in px or not (0 <= nx < self.w and 0 <= ny < self.h): + continue + o = owner[ny][nx] + if o >= 0 and out[ny][nx] != "." and self.layers[o][0] in REGIONS \ + and frozenset((ch, self.layers[o][0])) not in softset and self.layers[o][0] != ch: + line.add((x, y)) + break + for (x, y), t in tones.items(): + out[y][x] = "o" if (x, y) in line else t + owner[y][x] = k + rows = ["".join(r) for r in out] + return add_outline(rows) if outline else rows + + +if __name__ == "__main__": + print(__doc__) diff --git a/sprite_parts.py b/sprite_parts.py new file mode 100644 index 0000000..4b64964 --- /dev/null +++ b/sprite_parts.py @@ -0,0 +1,423 @@ +""" +Part library and per-type weights for generate_sprite.py. + +How picking works +----------------- +1. A body plan is picked using PLAN_WEIGHTS[type]. +2. Each slot in PICK_ORDER (generate_sprite.py) is filled with one part. A part is a + candidate only if: + - the chosen body plan is in its `plans` + - if it has `requires`, at least one of those tags was added by an earlier pick + - none of its `tags` were excluded by an earlier pick, and none of its + `excludes` match an earlier pick's tags +3. Candidate weight = types.get(type, other). Higher = more likely. 0 = never. + "none" entries are real choices, so their weight controls how often a slot is empty. + +Bodies are complete base creatures (body, head and face drawn together); the other slots +vary them. Tags ending in "_head" (head family, gates head_top parts) and tags starting +with "_" (used only so a base can exclude one specific part shape) are internal plumbing. +All other tags show up as the sprite's "attributes" (beaked, finned, fluffy, tailed...). + +Editing this file changes which parts existing businesses get, since every pick +draws from the same seeded random sequence. +""" + +TYPES = [ + "normal", "fire", "water", "grass", "electric", "ice", "fighting", "poison", + "ground", "flying", "psychic", "bug", "rock", "ghost", "dragon", +] + +# Signature color per type. Used for the "type" palette (flames, leaves, sparks...) +# and as a fallback when a logo has no usable second color. +TYPE_COLORS = { + "normal": "#A8A878", "fire": "#F08030", "water": "#6890F0", "grass": "#78C850", + "electric": "#F8D030", "ice": "#98D8D8", "fighting": "#C03028", "poison": "#A040A0", + "ground": "#E0C068", "flying": "#A890F0", "psychic": "#F85888", "bug": "#A8B820", + "rock": "#B8A038", "ghost": "#705898", "dragon": "#7038F8", +} + +PLANS = ["quadruped", "biped", "serpentine", "avian", "aquatic", "blob", "insectoid"] +ALL = PLANS +LEGGED = ["quadruped", "biped"] + +PLAN_WEIGHTS = { + "normal": {"quadruped": 5, "biped": 4, "avian": 2, "blob": 1, "serpentine": 0.5}, + "fire": {"quadruped": 5, "biped": 3, "serpentine": 1.5, "avian": 1.5, "blob": 1}, + "water": {"aquatic": 5, "serpentine": 2.5, "quadruped": 2, "biped": 1.5, "blob": 1}, + "grass": {"quadruped": 4, "biped": 3, "blob": 2, "serpentine": 1, "insectoid": 1}, + "electric": {"quadruped": 4, "biped": 3, "blob": 2, "avian": 1, "insectoid": 1}, + "ice": {"quadruped": 3, "biped": 2, "aquatic": 2, "avian": 1.5, "blob": 1.5, "serpentine": 1}, + "fighting": {"biped": 7, "quadruped": 2, "insectoid": 0.5}, + "poison": {"blob": 4, "serpentine": 3, "quadruped": 2, "biped": 2, "insectoid": 2}, + "ground": {"quadruped": 5, "biped": 3, "serpentine": 2, "insectoid": 0.5}, + "flying": {"avian": 7, "quadruped": 1, "serpentine": 1, "insectoid": 1}, + "psychic": {"biped": 4, "quadruped": 3, "blob": 2, "avian": 1.5}, + "bug": {"insectoid": 7, "serpentine": 1, "avian": 0.5}, + "rock": {"biped": 3, "quadruped": 3, "serpentine": 2, "blob": 2}, + "ghost": {"blob": 6, "serpentine": 2, "biped": 1, "avian": 0.5}, + "dragon": {"serpentine": 4, "quadruped": 3, "biped": 3, "avian": 0.5}, +} + +# Procedural markings: painted onto the body's main-color pixels in the accent color. +# No sprites needed. "_other" is the weight for types not listed. The belly patch is +# centred on the body's aura anchor (its visual centre), so it lands on the tummy +# rather than across a big baked-in head. +MARKINGS = { + "none": {"_other": 4}, + "spots": {"grass": 3, "poison": 3, "bug": 2, "water": 2, "electric": 2, "normal": 1.5, "_other": 0.5}, + "speckles": {"ground": 3, "rock": 3, "ice": 1.5, "normal": 1, "_other": 0.3}, + "belly": {"normal": 3, "water": 2, "fire": 2, "dragon": 2, "ice": 2, "fighting": 2, "ground": 2, "_other": 1}, +} + +# Combination rules for the variation slots. +# - At most MAX_FEATURES of head_top/back/tail are filled (picked in that order), so a creature +# gets one or two signature features instead of a pile of unrelated parts. +# - Each feature part has a visual motif. Once a motif is on the creature, more parts of the +# same motif are boosted (x MOTIF_SAME) and parts of an unrelated motif are damped +# (x MOTIF_CLASH), unless the pair is listed in MOTIF_PAIRS. Parts without a motif (plain fur +# ears and tails) go with anything. +# Slots skipped during generation (their art stays in the library). Remove "aura" to bring +# the floating aura effects back. +DISABLED_SLOTS = {"aura"} +FEATURE_SLOTS = ("head_top", "back", "tail") +MAX_FEATURES = 2 +MOTIF_SAME, MOTIF_CLASH = 2.5, 0.08 +MOTIFS = { + # feathers + "crest_feather": "feather", "wings_feather": "feather", "wings_feather_small": "feather", + "tail_feather_fan": "feather", + # plants + "leaf_sprout": "plant", "flower_bloom": "plant", "mushroom_cap": "plant", "plant_bulb": "plant", + "leaf_cape": "plant", "flower_back": "plant", "mushroom_back": "plant", "tail_leaf": "plant", + # fire + "crest_flame": "fire", "flame_mane": "fire", "tail_flame_tip": "fire", + # spooky + "wisp_flame": "spooky", "wings_bat": "spooky", "ghost_tatters": "spooky", "tail_wispy": "spooky", + # crystal / ice + "ice_crown": "crystal", "crystal_spikes": "crystal", "gem_forehead": "crystal", "crystal_cluster": "crystal", + "icicle_spikes": "crystal", "tail_ice_shard": "crystal", "tail_crystal": "crystal", + # water + "ears_fin": "water", "water_spout": "water", "dorsal_fin": "water", "tail_fish_fin": "water", + # electric + "ears_bolt": "electric", "coil_spikes": "electric", "tail_lightning": "electric", + # armour / rock + "horn_single": "armor", "horns_ram": "armor", "shell_round": "armor", "shell_spiked": "armor", + "spikes_back": "armor", "rock_plates": "armor", "tail_club": "armor", "tail_spiked": "armor", + # dragon + "horns_dragon": "dragon", "wings_dragon": "dragon", "sail_fin": "dragon", "tail_dragon": "dragon", + # bug + "antennae": "bug", "wings_bug": "bug", "tail_stinger": "bug", + # sky + "cloud_tuft": "sky", "cloud_puffs": "sky", +} +MOTIF_PAIRS = {frozenset(p) for p in [ + ("dragon", "armor"), ("dragon", "fire"), ("crystal", "armor"), ("crystal", "water"), ("plant", "bug"), + ("feather", "sky"), ("fire", "armor"), ("water", "armor"), ("spooky", "crystal"), ("electric", "armor"), + ("sky", "electric"), ("sky", "crystal"), ("feather", "fire"), ("dragon", "water"), +]} + + +def part(name, plans=ALL, types=None, other=0.25, tags=(), requires=(), excludes=(), deny=(), + palette="main", size=None, z=None, desc=""): + return { + "name": name, "plans": list(plans), "types": dict(types or {}), "other": other, + "tags": list(tags), "requires": list(requires), "excludes": list(excludes), "deny": list(deny), + "palette": palette, "size": size, "z": z, "desc": desc, + } + + +def none(types=None, other=1.0, plans=ALL, requires=()): + return part("none", plans, types, other, requires=requires, desc="(empty slot, no sprite)") + + +# Head-family tags carried by each base body. head_top parts use them in `requires`. +MAMMAL = ["mammal_head"] +ANY_FACE = ["mammal_head", "reptile_head", "integrated_head"] +NOT_BEAK = ["mammal_head", "reptile_head", "rock_head", "insect_head", "integrated_head", "ghost_head"] +INTEGRATED = ["integrated_head"] + + +def base(name, plan, types, head, size, desc, tags=(), excludes=(), deny=()): + """A complete designed creature (body + head + face in one sprite). + + head: head-family tag(s) gating head_top parts. excludes: tags of variation parts that + clash with features already drawn into the base (e.g. "eared" when it has ears). + deny: specific variation part names that don't sit well on this base.""" + heads = [head] if isinstance(head, str) else list(head) + return part(name, [plan], types, 0.3, tags=heads + list(tags), excludes=excludes, deny=deny, + size=size, desc=desc) + + +# --------------------------------------------------------------------------- body (base creatures) +BODY = [ + # quadruped + base("base_fox", "quadruped", {"fire": 3, "electric": 3, "psychic": 3, "normal": 2, "ice": 2}, "mammal_head", + (42, 36), "Chibi fox/cat critter with cheek tufts, big pointed ears and a fluffy bib", excludes=["eared"], + deny=["ears_fin", "horns_ram", "horns_dragon", "crystal_spikes", "tail_fish_fin"]), + base("base_cub", "quadruped", {"ground": 4, "rock": 3, "fighting": 3, "normal": 2, "grass": 2}, "mammal_head", + (40, 34), "Chunky bear-cub on all fours, round ears, sturdy paws", excludes=["eared", "_side_horns"], + deny=["ears_fin", "horns_dragon", "crystal_spikes", "mane_fluffy", "tail_fish_fin"]), + base("base_pup", "quadruped", {"normal": 4, "fire": 3, "fighting": 2, "water": 1.5}, "mammal_head", + (42, 34), "Bouncy puppy with floppy ears and a happy open mouth", excludes=["eared", "_side_horns"], + deny=["ears_fin", "horns_dragon", "tail_fish_fin"]), + base("base_salamander", "quadruped", {"fire": 3, "water": 3, "poison": 3, "dragon": 2, "grass": 1}, "reptile_head", + (47, 27), "Low chibi salamander/newt with a wide smile and frilly cheeks", excludes=["_head_fins"], + deny=["horns_ram", "tail_fluffy", "mane_fluffy"]), + base("base_drake", "quadruped", {"dragon": 5, "fire": 3, "rock": 2, "ground": 1}, "reptile_head", + (42, 38), "Cool baby dragon on four legs, nub horns, confident grin", excludes=["horned", "_headband"], + deny=["ears_fin", "crest_feather", "crystal_spikes", "tail_fluffy"]), + base("base_fawn", "quadruped", {"grass": 4, "psychic": 3, "ice": 3, "normal": 1}, "mammal_head", + (42, 35), "Dainty chibi fawn in 3/4 view: big leaf ears, gentle eyes, spotted back", + excludes=["eared", "_side_horns"], + deny=["ears_fin", "crystal_spikes", "mane_fluffy", "tail_fish_fin", "horns_dragon", "wings_bat", + "wings_dragon", "mushroom_back"]), + # biped + base("base_imp", "biped", {"electric": 4, "normal": 3, "psychic": 2, "ghost": 1}, "mammal_head", + (40, 40), "Upright mouse-imp with big round ears and a cheeky fanged grin", excludes=["eared"], + deny=["ears_fin", "crystal_spikes", "shell_round", "shell_spiked", "rock_plates", "tail_fish_fin"]), + base("base_brawler", "biped", {"fighting": 5, "rock": 3, "ground": 3, "normal": 1}, "mammal_head", + (42, 43), "Stout little fighter with big fists and a determined face", excludes=["eared"], + deny=["ears_fin", "spiky_hair", "crystal_spikes", "flame_mane", "tail_stub", "tail_fish_fin", "tail_feather_fan"]), + base("base_bunny", "biped", {"normal": 4, "grass": 3, "ice": 2, "psychic": 2}, "mammal_head", + (36, 45), "Upright chibi bunny with long ears and a fluffy chest", excludes=["eared"], + deny=["ears_fin", "horn_single", "horns_dragon", "antennae", "crest_flame", "crystal_spikes", "spiky_hair", "water_spout", "wings_dragon", "flame_mane", "tail_fish_fin", "tail_feather_fan"]), + base("base_dino", "biped", {"dragon": 4, "fire": 3, "ground": 2, "water": 1}, "reptile_head", + (36, 44), "Little upright dino with a big head, tiny arms and a toothy grin", excludes=["_headband"], + deny=["flame_mane"]), + base("base_pixie", "biped", {"psychic": 4, "ghost": 3, "grass": 2, "poison": 2}, "mammal_head", + (42, 39), "Leaf-elf pixie with sweeping pointed ears, round torso, stubby legs and a mischievous grin", + excludes=["eared"], + deny=["ears_fin", "wings_dragon", "shell_spiked", "rock_plates", "tail_feather_fan"]), + # avian + base("base_chick", "avian", {"normal": 4, "ice": 3, "electric": 2, "water": 2, "flying": 2}, "beak_head", + (36, 35), "Egg-round chick with a feather tuft, wing nubs and a tiny beak", + deny=["crest_feather", "wings_bat"]), + base("base_owl", "avian", {"psychic": 4, "flying": 3, "ghost": 3, "normal": 1}, "beak_head", + (36, 36), "Round owlet with huge eyes and ear tufts", excludes=["eared"], + deny=["crest_feather", "crest_flame", "crystal_spikes", "ice_crown", "wisp_flame", "wings_feather", "wings_bat"]), + base("base_hawk", "avian", {"flying": 5, "fire": 3, "fighting": 3, "dragon": 1}, "beak_head", + (38, 37), "Cool young hawk, puffed chest, sharp brow and hooked beak", + deny=["crest_feather", "wisp_flame", "wings_feather", "wings_bat"]), + base("base_penguin", "avian", {"ice": 5, "water": 4, "normal": 1}, "beak_head", + (36, 38), "Chubby penguin chick with flipper wings and a bib", + deny=["wings_feather", "wings_feather_small", "wings_bat", "tail_wispy", "ghost_tatters"]), + # aquatic + base("base_guppy", "aquatic", {"water": 5, "poison": 2, "ice": 2, "dragon": 1}, "integrated_head", + (46, 33), "Round bubbly fish with big eyes and frilly fins", + deny=["ears_round", "ears_long", "ears_floppy", "shell_round"]), + base("base_otter", "aquatic", {"ice": 4, "water": 4, "normal": 2}, "mammal_head", + (49, 30), "Chubby seal/otter pup lying on its flippers", excludes=["eared"], + deny=["shell_round", "tail_fish_fin"]), + base("base_axolotl", "aquatic", {"water": 4, "poison": 3, "dragon": 2, "grass": 1}, "reptile_head", + (51, 30), "Smiling axolotl with feathery gill fronds", excludes=["_head_fins"], + deny=["horns_ram", "shell_round"]), + # serpentine + base("base_noodle", "serpentine", {"poison": 4, "ground": 3, "normal": 2, "grass": 2}, "reptile_head", + (44, 40), "Cute coiled snake with a big round head and a sly smile", + deny=["dorsal_fin"]), + base("base_eel", "serpentine", {"water": 4, "ice": 3, "electric": 2, "dragon": 2}, "reptile_head", + (45, 46), "Rising sea-serpent with fin frills and big eyes", excludes=["finned"], + deny=["horns_ram", "wings_bat", "wings_dragon", "spikes_back", "leaf_cape", "crystal_cluster", "rock_plates", "cloud_puffs", "ghost_tatters", "icicle_spikes"]), + base("base_wyrm", "serpentine", {"dragon": 4, "ghost": 3, "psychic": 1, "ice": 1}, "reptile_head", + (43, 44), "Cool coiled young wyrm with whisker barbels and a proud look", excludes=["horned", "feathered"], + deny=["ears_fin", "crystal_spikes", "spiky_hair", "dorsal_fin"]), + # blob + base("base_blob", "blob", {"normal": 4, "grass": 3, "ice": 3, "electric": 2}, "integrated_head", + (40, 33), "Squishy mochi blob with a curl on top and a big smile", + deny=["horn_single", "horns_ram", "ears_bolt", "ears_fin", "flower_back"]), + base("base_slime", "blob", {"poison": 5, "water": 3, "ghost": 1}, "integrated_head", + (40, 34), "Drippy goo blob with a cheeky tongue-out face", + deny=["ears_floppy", "mushroom_back"]), + base("base_wisp", "blob", {"ghost": 5, "psychic": 3, "fire": 1, "flying": 1}, ["integrated_head", "ghost_head"], + (36, 40), "Floating ghost wisp with a curly tail-end and a spooky-cute grin", excludes=["tailed"], + deny=["ears_floppy", "flower_back"]), + base("base_pebble", "blob", {"rock": 5, "ground": 3, "fighting": 1}, "integrated_head", + (38, 32), "Round rock lump creature with a sturdy little face and stubby feet", + deny=["ears_floppy", "mushroom_back"]), + # insectoid + base("base_beetle", "insectoid", {"bug": 4, "rock": 2, "ground": 2, "poison": 1}, "insect_head", + (42, 30), "Round shiny beetle bug with a horn and stubby legs", excludes=["horned"], + deny=["crystal_spikes", "shell_spiked"]), + base("base_grub", "insectoid", {"bug": 4, "grass": 3, "poison": 3}, "insect_head", + (44, 27), "Plump caterpillar with a big happy face and tufted segments", + deny=["shell_spiked", "coil_spikes"]), + base("base_bee", "insectoid", {"bug": 4, "flying": 2, "fighting": 2, "electric": 1}, "insect_head", + (38, 35), "Fuzzy round bee/bug with tiny wings and antennae", excludes=["winged", "antennae"], + deny=["horns_ram", "horns_dragon", "shell_spiked", "tail_leaf", "tail_stinger", "coil_spikes"]), +] + +# --------------------------------------------------------------------------- head_top +HEAD_TOP = [ + none({"normal": 4, "poison": 2.5, "fighting": 2.5, "water": 2.5, "ghost": 2.5}, 2), + part("ears_pointed", types={"electric": 4, "normal": 3, "fire": 3, "psychic": 3, "grass": 1.5}, other=0.5, + requires=MAMMAL + INTEGRATED, tags=["eared"], desc="Pair of tall pointed ears"), + part("ears_round", types={"normal": 4, "electric": 2, "ground": 2, "ice": 2, "water": 1.5}, other=0.5, + requires=MAMMAL + INTEGRATED, tags=["eared"], desc="Pair of round mouse/bear ears"), + part("ears_long", types={"normal": 3, "psychic": 3, "grass": 2, "flying": 1.5, "ice": 1}, other=0.3, + requires=MAMMAL + INTEGRATED, tags=["eared"], size=(18, 20), z=25, desc="Long rabbit ears (drawn behind the creature)"), + part("ears_floppy", types={"normal": 4, "water": 2, "ground": 1.5, "grass": 1}, other=0.3, + requires=MAMMAL + INTEGRATED, tags=["eared"], size=(26, 12), z=25, desc="Droopy hanging ears (drawn behind the creature)"), + part("ears_bolt", types={"electric": 7}, other=0.05, requires=MAMMAL + INTEGRATED, tags=["eared"], + desc="Zigzag lightning-bolt ears, type-colored tips"), + part("ears_fin", types={"water": 5, "ice": 2, "dragon": 1.5}, other=0.1, requires=ANY_FACE, + tags=["finned", "eared", "_head_fins"], palette="accent", desc="Fin-shaped ear frills"), + part("horn_single", types={"rock": 3, "ground": 3, "bug": 3, "dragon": 2, "fighting": 2, "poison": 2}, other=0.3, + requires=NOT_BEAK, tags=["horned"], palette="accent", size=(10, 14), desc="One forehead horn (rhino/beetle)"), + part("horns_ram", types={"rock": 4, "ground": 4, "fighting": 3, "normal": 1.5}, other=0.2, + requires=NOT_BEAK, tags=["horned", "_side_horns"], palette="accent", size=(26, 14), desc="Curled ram horns"), + part("horns_dragon", types={"dragon": 7, "fire": 2, "ghost": 1}, other=0.1, + requires=NOT_BEAK, tags=["horned"], palette="accent", size=(22, 16), desc="Swept-back dragon horns"), + part("antennae", types={"bug": 7, "electric": 2, "psychic": 1.5, "poison": 1}, other=0.1, + requires=["insect_head", "mammal_head", "integrated_head"], tags=["antennae"], size=(16, 16), + desc="Two thin antennae with tips"), + part("crest_feather", types={"flying": 6, "fire": 2, "fighting": 1.5, "psychic": 1}, other=0.2, + requires=["beak_head", "reptile_head"], tags=["feathered"], palette="accent", desc="Swept feather crest"), + part("crest_flame", types={"fire": 8}, other=0.05, palette="type", desc="Flickering flame on top of head"), + part("leaf_sprout", types={"grass": 8}, other=0.05, palette="type", size=(14, 14), desc="Leaf/sprout growing from head"), + part("flower_bloom", types={"grass": 5, "poison": 2, "psychic": 1.5}, other=0.1, palette="accent", + tags=["floral"], desc="Small flower on head"), + part("mushroom_cap", types={"poison": 4, "grass": 3, "bug": 2, "ghost": 1}, other=0.05, palette="accent", + size=(20, 12), desc="Mushroom cap worn like a hat"), + part("ice_crown", types={"ice": 8}, other=0.05, palette="type", size=(18, 12), desc="Ring of small icicles"), + part("crystal_spikes", types={"rock": 5, "ice": 3, "psychic": 2}, other=0.05, palette="accent", + tags=["crystal"], desc="Cluster of crystal shards"), + part("gem_forehead", types={"psychic": 6, "dragon": 2, "rock": 1.5, "ghost": 1}, other=0.05, palette="accent", + tags=["gem"], size=(8, 8), desc="Gem set in forehead"), + part("spiky_hair", types={"fighting": 3, "electric": 3, "poison": 2, "normal": 1, "fire": 1}, other=0.2, + requires=ANY_FACE, tags=["spiky"], size=(20, 12), desc="Spiky tuft of fur/hair"), + part("headband", types={"fighting": 6, "normal": 0.5}, other=0.02, + requires=["mammal_head", "reptile_head", "rock_head", "ghost_head"], tags=["_headband"], palette="accent", + size=(24, 10), + desc="Tied headband with trailing ends"), + part("wisp_flame", types={"ghost": 6, "fire": 1.5, "psychic": 1}, other=0.02, palette="type", + desc="Ghostly floating flame wisp"), + part("water_spout", types={"water": 5, "ice": 1}, other=0.02, palette="type", desc="Water droplet/fountain crest"), + part("cloud_tuft", types={"flying": 3, "electric": 2, "ice": 1.5}, other=0.05, palette="type", + tags=["fluffy"], size=(20, 12), desc="Puffy cloud tuft"), +] + +# (Faces are baked into the base creatures; there are no head, snout or eyes slots.) + +# --------------------------------------------------------------------------- back +BACK = [ + none({"normal": 5, "fighting": 4, "water": 3, "electric": 3, "psychic": 3, "poison": 3, "ground": 3, + "fire": 3, "ghost": 3, "ice": 2.5, "rock": 2, "grass": 2, "dragon": 1.5, "bug": 1, "flying": 0.5}, 2), + part("wings_feather", ["avian", "biped", "quadruped"], + {"flying": 8, "fire": 2, "normal": 1.5, "psychic": 1.5, "ice": 1}, 0.3, + tags=["winged", "feathered"], palette="accent", size=(44, 30), desc="Full feathered wings, spread"), + part("wings_feather_small", ["avian", "biped", "quadruped", "blob"], + {"flying": 4, "normal": 2, "ice": 2, "psychic": 1, "water": 1}, 0.3, + tags=["winged", "feathered"], palette="accent", size=(30, 14), desc="Tiny stubby wings"), + part("wings_bat", ["biped", "quadruped", "avian", "blob", "serpentine"], + {"ghost": 4, "poison": 4, "dragon": 2, "flying": 2, "psychic": 1}, 0.1, + tags=["winged"], palette="accent", size=(44, 26), desc="Membrane bat wings"), + part("wings_bug", ["insectoid", "biped", "blob"], + {"bug": 6, "grass": 2, "poison": 2, "psychic": 1.5, "electric": 1}, 0.1, + tags=["winged"], palette="accent", size=(40, 28), desc="Translucent veined insect wings"), + part("wings_dragon", ["quadruped", "biped", "serpentine"], {"dragon": 6, "fire": 3, "flying": 2, "rock": 1}, 0.1, + tags=["winged"], palette="accent", size=(48, 32), desc="Large clawed dragon wings"), + part("shell_round", ["quadruped", "biped", "aquatic"], {"water": 5, "ground": 3, "rock": 2, "grass": 1}, 0.2, + tags=["shelled"], palette="accent", size=(40, 26), desc="Domed turtle shell"), + part("shell_spiked", ["quadruped", "biped", "insectoid"], + {"rock": 4, "ground": 3, "poison": 2, "water": 2, "fighting": 1}, 0.1, + tags=["shelled", "spiky"], palette="accent", size=(40, 28), desc="Armored shell with spikes"), + part("spikes_back", ["quadruped", "biped", "serpentine", "aquatic", "blob"], + {"ground": 4, "poison": 3, "rock": 3, "dragon": 2, "ice": 2, "fire": 1.5}, 0.2, + tags=["spiky"], palette="accent", size=(36, 14), desc="Row of spikes along the spine"), + part("sail_fin", ["quadruped", "biped", "serpentine"], {"fire": 4, "dragon": 3, "water": 2, "electric": 1.5}, 0.1, + tags=["finned"], palette="accent", size=(34, 20), desc="Tall dimetrodon-style back sail"), + part("dorsal_fin", ["aquatic", "serpentine", "quadruped"], {"water": 7, "ice": 2, "dragon": 1.5}, 0.05, + tags=["finned"], palette="accent", size=(20, 16), desc="Shark-style dorsal fin"), + part("plant_bulb", ["quadruped", "biped", "blob"], {"grass": 6, "poison": 2}, 0.02, + tags=["leafy"], palette="type", size=(30, 26), desc="Large seed pod/bulb with leaves"), + part("leaf_cape", ["quadruped", "biped", "serpentine", "insectoid"], {"grass": 6, "bug": 2, "flying": 1}, 0.02, + tags=["leafy"], palette="type", size=(38, 20), desc="Overlapping leaves along the back"), + part("flower_back", ["quadruped", "biped", "blob"], {"grass": 5, "poison": 2, "psychic": 1.5}, 0.02, + tags=["floral"], palette="accent", size=(32, 26), desc="Big blooming flower"), + part("mushroom_back", ["quadruped", "insectoid", "blob"], {"grass": 3, "poison": 3, "bug": 3, "ghost": 1}, 0.02, + palette="accent", size=(30, 22), desc="Cluster of mushrooms growing on back"), + part("flame_mane", LEGGED, {"fire": 8, "dragon": 1}, 0.02, + tags=["fiery"], palette="type", size=(36, 28), desc="Mane/collar of fire"), + part("crystal_cluster", ["quadruped", "biped", "blob", "serpentine"], {"rock": 5, "ice": 3, "psychic": 3}, 0.02, + tags=["crystal"], palette="accent", size=(30, 24), desc="Crystals jutting from back"), + part("rock_plates", ["quadruped", "biped", "serpentine"], {"rock": 6, "ground": 3, "fighting": 1}, 0.02, + tags=["armored"], palette="accent", size=(38, 20), desc="Boulder armor plates"), + part("icicle_spikes", ["quadruped", "biped", "aquatic", "avian", "blob"], {"ice": 8, "water": 1}, 0.02, + tags=["spiky"], palette="type", size=(29, 24), desc="Tight fan of icicles rising from the back"), + part("mane_fluffy", LEGGED, {"normal": 4, "fighting": 3, "electric": 2, "fire": 1.5, "ice": 1.5}, 0.2, + tags=["fluffy"], size=(34, 26), desc="Big fluffy fur collar/mane"), + part("coil_spikes", ["quadruped", "biped", "blob", "insectoid"], {"electric": 7, "normal": 0.3}, 0.02, + tags=["electric"], palette="type", size=(26, 24), desc="Chunky coil/battery prongs with a spark"), + part("cloud_puffs", ["blob", "avian", "quadruped", "serpentine"], + {"flying": 4, "ice": 2, "psychic": 2, "electric": 1.5, "normal": 1}, 0.05, + tags=["fluffy"], palette="type", size=(30, 20), desc="Fluffy cloud hugging the back"), + part("ghost_tatters", ["biped", "blob", "serpentine", "avian"], {"ghost": 6, "psychic": 1, "poison": 1}, 0.02, + palette="accent", size=(26, 24), desc="Short ghostly shroud draped from the shoulders"), +] + +# --------------------------------------------------------------------------- tail +TAIL = [ + none({"fighting": 3, "bug": 3, "ghost": 3, "psychic": 2, "normal": 2}, 1.5, plans=ALL), + part("tail_stub", ["quadruped", "biped", "avian"], {"normal": 4, "ground": 2, "ice": 2, "rock": 1.5, "fighting": 1.5}, 0.5, + tags=["tailed"], size=(10, 10), desc="Short round stub tail"), + part("tail_fluffy", LEGGED, {"normal": 4, "ice": 3, "electric": 2, "psychic": 2, "fire": 1.5}, 0.4, + tags=["tailed", "fluffy"], size=(26, 20), desc="Big fluffy fox/squirrel tail"), + part("tail_long_thin", LEGGED, {"psychic": 3, "normal": 2, "poison": 2, "electric": 2, "ghost": 1}, 0.4, + tags=["tailed"], size=(30, 12), desc="Long thin tail with tuft"), + part("tail_curly", LEGGED, {"normal": 3, "psychic": 3, "grass": 1.5, "poison": 1}, 0.3, + tags=["tailed"], size=(16, 16), desc="Spiral curly tail"), + part("tail_flame_tip", ["quadruped", "biped", "serpentine"], {"fire": 8}, 0.05, + tags=["tailed", "fiery"], palette="type", size=(28, 20), desc="Tail ending in a flame"), + part("tail_lightning", LEGGED, {"electric": 8}, 0.05, + tags=["tailed"], palette="type", size=(26, 22), desc="Zigzag lightning-bolt tail"), + part("tail_leaf", ["quadruped", "biped", "insectoid", "serpentine"], {"grass": 7, "bug": 1.5}, 0.05, + tags=["tailed", "leafy"], palette="type", size=(24, 16), desc="Tail ending in a big leaf"), + part("tail_fish_fin", ["aquatic", "serpentine", "quadruped", "biped"], {"water": 7, "ice": 2, "dragon": 1.5}, 0.05, + tags=["tailed", "finned"], palette="accent", size=(22, 22), desc="Forked fish/mermaid tail fin"), + part("tail_club", LEGGED, {"rock": 5, "ground": 4, "fighting": 1.5}, 0.05, + tags=["tailed"], size=(28, 16), desc="Heavy club-ended tail"), + part("tail_spiked", ["quadruped", "biped", "serpentine"], + {"ground": 3, "rock": 3, "dragon": 3, "poison": 2, "ice": 1.5}, 0.1, + tags=["tailed", "spiky"], size=(28, 14), desc="Tail with spikes"), + part("tail_stinger", ["insectoid", "serpentine", "quadruped", "biped"], {"bug": 5, "poison": 5}, 0.05, + tags=["tailed", "stinger"], palette="accent", size=(22, 18), desc="Curved stinger tail"), + part("tail_feather_fan", ["avian", "biped"], {"flying": 7, "fire": 2, "psychic": 1.5, "normal": 1}, 0.1, + tags=["tailed", "feathered"], palette="accent", size=(22, 22), desc="Fanned tail feathers"), + part("tail_wispy", ["blob", "serpentine", "biped", "avian"], {"ghost": 7, "psychic": 1.5, "fire": 1}, 0.05, + tags=["tailed"], size=(24, 16), desc="Fading smoky wisp tail"), + part("tail_ice_shard", ["quadruped", "biped", "aquatic", "serpentine"], {"ice": 8}, 0.05, + tags=["tailed", "crystal"], palette="type", size=(24, 16), desc="Tail ending in an ice shard"), + part("tail_dragon", ["quadruped", "biped", "serpentine"], {"dragon": 6, "fire": 2, "ground": 1.5, "water": 1}, 0.1, + tags=["tailed"], size=(30, 16), desc="Thick tapered tail with small fin"), + part("tail_rattle", ["serpentine"], {"poison": 4, "ground": 4, "normal": 1}, 0.2, + tags=["tailed"], palette="accent", size=(14, 12), desc="Rattlesnake rattle tip"), + part("tail_crystal", ["quadruped", "biped", "serpentine"], {"psychic": 4, "rock": 3, "ice": 2}, 0.05, + tags=["tailed", "crystal"], palette="accent", size=(24, 16), desc="Tail tipped with a crystal"), +] + +# --------------------------------------------------------------------------- aura +_AURA_SIZE = (84, 84) +AURA = [ + none(other=8), + part("aura_embers", types={"fire": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Floating embers"), + part("aura_sparks", types={"electric": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Crackling sparks"), + part("aura_bubbles", types={"water": 3, "poison": 0.5}, other=0, palette="type", size=_AURA_SIZE, desc="Rising bubbles"), + part("aura_leaves", types={"grass": 3, "flying": 0.5, "bug": 0.5}, other=0, palette="type", size=_AURA_SIZE, + desc="Drifting leaves"), + part("aura_snowflakes", types={"ice": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Snowflakes"), + part("aura_wisps", types={"ghost": 3, "psychic": 0.5}, other=0, palette="type", size=_AURA_SIZE, desc="Ghost wisps"), + part("aura_rings", types={"psychic": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Psychic rings/ripples"), + part("aura_dust", types={"ground": 3, "rock": 1.5, "fighting": 1}, other=0, palette="type", size=_AURA_SIZE, + desc="Dust cloud at the feet"), + part("aura_toxic", types={"poison": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Toxic bubbles and drips"), + part("aura_sparkle", types={"dragon": 2, "normal": 1, "psychic": 1, "flying": 0.5}, other=0, palette="type", + size=_AURA_SIZE, desc="Twinkling sparkles"), + part("aura_gusts", types={"flying": 3, "dragon": 0.5}, other=0, palette="type", size=_AURA_SIZE, desc="Wind swirls"), + part("aura_pebbles", types={"rock": 3, "ground": 1, "psychic": 0.5}, other=0, palette="type", size=_AURA_SIZE, + desc="Floating pebbles"), + part("aura_power", types={"fighting": 3}, other=0, palette="type", size=_AURA_SIZE, desc="Power-up energy lines"), + part("aura_spores", types={"bug": 2, "grass": 1.5, "poison": 1.5}, other=0, palette="type", size=_AURA_SIZE, + desc="Floating spores"), +] + +SLOTS = {"body": BODY, "back": BACK, "tail": TAIL, "head_top": HEAD_TOP, "aura": AURA} diff --git a/validate_parts.py b/validate_parts.py new file mode 100755 index 0000000..41ff20f --- /dev/null +++ b/validate_parts.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +""" +Validate the part library in parts/. + +Fails on: + - a missing file for any part listed in sprite_parts.py + - any color outside the palette keys, pupil, eye white and marker colors + - any partial alpha + - a missing (or duplicated) required marker for the slot / body type + - any legal composite that triggers "canvas expanded": checked exhaustively per body + via bounding boxes, plus a random sample of real composites + + python validate_parts.py [--sample N] +""" +import random +import sys +from itertools import product +from pathlib import Path + +import numpy as np +from PIL import Image + +import generate_sprite as gs +import sprite_parts as cfg + +PARTS = Path("parts") +ALLOWED = {tuple(v) for v in gs.KEYS.values()} | {gs.PUPIL, gs.EYE_WHITE} | {tuple(v) for v in gs.MARKERS.values()} +MARKER_BY_COLOR = {v: k for k, v in gs.MARKERS.items()} + + +def required_markers(slot, p): + if slot == "body": + return {"pivot", "tail", "back", "aura", "head_top"} + return {"pivot"} + + +def check_file(slot, p): + errs = [] + path = PARTS / slot / f"{p['name']}.png" + if not path.exists(): + return [f"missing file {path}"] + arr = np.array(Image.open(path).convert("RGBA")) + a = arr[:, :, 3] + partial = np.count_nonzero((a > 0) & (a < 255)) + if partial: + errs.append(f"{path}: {partial} partial-alpha pixel(s)") + opaque = arr[a > 0][:, :3] + colors = {tuple(int(v) for v in c) for c in np.unique(opaque, axis=0)} if len(opaque) else set() + bad = colors - ALLOWED + if bad: + errs.append(f"{path}: illegal colors {sorted(gs.rgb_to_hex(c) for c in bad)[:8]}") + found = {} + for c in colors & set(MARKER_BY_COLOR): + n = int(np.count_nonzero(np.all(arr[:, :, :3] == c, axis=-1) & (a > 0))) + found[MARKER_BY_COLOR[c]] = n + req = required_markers(slot, p) + missing = req - set(found) + if missing: + errs.append(f"{path}: missing markers {sorted(missing)}") + extra = set(found) - req + if extra: + errs.append(f"{path}: unexpected markers {sorted(extra)}") + dup = [k for k, n in found.items() if n > 1] + if dup: + errs.append(f"{path}: marker used more than once {sorted(dup)}") + if slot == "aura" and (arr.shape[1], arr.shape[0]) != (84, 84): + errs.append(f"{path}: aura must be 84x84, is {arr.shape[1]}x{arr.shape[0]}") + return errs + + +# ------------------------------------------------------------------ size checks + +def bbox_of(slot, name): + """(anchors, opaque bbox x0,y0,x1,y1 exclusive) of a loaded part.""" + loaded = gs.load_part(str(PARTS), slot, name) + if loaded is None: + return None + img, anch = loaded + bb = img.getbbox() + return anch, bb + + +def exhaustive_extents(): + """For each body, the worst legal composite size, computed from bounding boxes. + + Every variation slot is independent given the body, so the union bbox worst case is + found by taking each side's extreme from a different slot (or one part covering both).""" + problems = [] + worst = {} + for body in cfg.BODY: + plan = body["plans"][0] + b = bbox_of("body", body["name"]) + if b is None: + continue + banch, bbb = b + bpos = (-banch["pivot"][0], -banch["pivot"][1]) + tags = {f"plan:{plan}"} | set(body["tags"]) + excl = set(body["excludes"]) + fx0, fy0, fx1, fy1 = bpos[0] + bbb[0], bpos[1] + bbb[1], bpos[0] + bbb[2], bpos[1] + bbb[3] + opt = {} + for slot in gs.PICK_ORDER[1:]: + lst = [] + for p in cfg.SLOTS[slot]: + if p["name"] == "none" or plan not in p["plans"] or p["name"] in body["deny"]: + continue + if p["requires"] and not set(p["requires"]) & tags: + continue + if set(p["tags"]) & excl or set(p["excludes"]) & tags: + continue + pb = bbox_of(slot, p["name"]) + a = banch.get(slot) + if pb is None or a is None or pb[1] is None: + continue + panch, pbb = pb + piv = panch.get("pivot", (0, 0)) + pos = (bpos[0] + a[0] - piv[0], bpos[1] + a[1] - piv[1]) + lst.append((pos[0] + pbb[0], pos[1] + pbb[1], pos[0] + pbb[2], pos[1] + pbb[3], p["name"])) + if lst: + opt[slot] = lst + + def worst_span(lo_i, hi_i, f_lo, f_hi): + best = (f_hi - f_lo, "") + for s1 in opt: + for p in opt[s1]: # single part both sides + span = max(f_hi, p[hi_i]) - min(f_lo, p[lo_i]) + if span > best[0]: + best = (span, f"{s1}={p[4]}") + for s1, s2 in product(opt, opt): + if s1 == s2: + continue + lo = min(opt[s1], key=lambda p: p[lo_i]) + hi = max(opt[s2], key=lambda p: p[hi_i]) + span = max(f_hi, hi[hi_i]) - min(f_lo, lo[lo_i]) + if span > best[0]: + best = (span, f"{s1}={lo[4]} + {s2}={hi[4]}") + return best + + w, wwhy = worst_span(0, 2, fx0, fx1) + h, hwhy = worst_span(1, 3, fy0, fy1) + worst[body["name"]] = (w, h, wwhy, hwhy) + if w + 2 > gs.CANVAS: + problems.append(f"{body['name']}: worst width {w} > {gs.CANVAS - 2} ({wwhy})") + if h + gs.GROUND_MARGIN + 1 > gs.CANVAS: + problems.append(f"{body['name']}: worst height {h} > {gs.CANVAS - gs.GROUND_MARGIN - 1} ({hwhy})") + return problems, worst + + +def sample_composites(n): + problems = [] + rng = random.Random(12345) + for i in range(n): + ptype = rng.choice(cfg.TYPES) + prng = random.Random(i) + plan, chosen, markings, tags = gs.pick_parts(ptype, prng) + if any(not (PARTS / s / f"{p['name']}.png").exists() for s, p in chosen.items() if p["name"] != "none"): + continue + spr = gs.compose(str(PARTS), chosen, markings, prng) + if max(spr.width + 2, spr.height + gs.GROUND_MARGIN + 1) > gs.CANVAS: + problems.append(f"sample {ptype} seed {i}: {spr.width}x{spr.height} " + f"({', '.join(f'{s}={p['name']}' for s, p in chosen.items())})") + return problems + + +def main(argv): + n = 2000 + if "--sample" in argv: + n = int(argv[argv.index("--sample") + 1]) + errs = [] + for slot, parts in cfg.SLOTS.items(): + for p in parts: + if p["name"] != "none": + errs += check_file(slot, p) + size_probs, worst = exhaustive_extents() + errs += size_probs + errs += sample_composites(n) + for e in errs: + print("FAIL", e) + if "--verbose" in argv: + for b, (w, hh, ww, hw) in sorted(worst.items()): + print(f"{b:16s} worst {w}x{hh} w:{ww} h:{hw}") + total = sum(1 for parts in cfg.SLOTS.values() for p in parts if p["name"] != "none") + present = sum(1 for slot, parts in cfg.SLOTS.items() for p in parts + if p["name"] != "none" and (PARTS / slot / f"{p['name']}.png").exists()) + print(f"{present}/{total} parts present, {len(errs)} problem(s)") + return 1 if errs else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:]))