Skip to content

About

Idiot Proof AO2 character maker made in Dart and Flutter

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

69 Commits

Folders and files

Repository files navigation

🐾 Pinsel AO Char Maker

The most customizable, most automated Attorney Online / webAO character & button maker β€” on every platform from one codebase.

Drop in a folder of sprites β†’ get a finished, AO2- and webAO-compatible character: an auto-generated char.ini, the right folder layout, and auto-generated emote buttons. Then recolour, animate, lip-sync, and customise everything β€” or don't, because every powerful feature has a sensible default.

Runs natively on Windows, Linux, macOS, Android, iOS, and as a website (Flutter Web) so people can use and share it straight from a browser.

Built from scratch with KFO-CharMaker and DROButtonMaker as inspiration β€” aiming to be vastly more expansive than both. Format details were verified against the official AO docs and the AO2 reference client. AGPL-3.0.


✨ What it does

Automate everything (optional)

  • ⚑ One-click character. The headline shortcut: pick a folder and get a ready-to-drop .zip β€” auto char.ini, sprites converted to WebP, emote buttons + char_icon, all in one go. (Already have a project open? Finish & export everything does the same without re-importing.) (docs)
  • πŸ“ Save as a folder (no zip). Prefer not to unzip? Save as a folder (Ctrl/⌘+Shift+S, or the folder icon on the toolbar) writes the finished character folder straight into a location you pick β€” drop it into AO's characters/ and you're done, DRO/KFO button-maker style. (Desktop only.)
  • Folder β†’ character. Scans a folder of images, detects (a)/(b)/(c) idle/talk/post sprites, static sprites, sub-folder sprites, preanimations, and animation formats β€” then writes a correct char.ini, named after the folder. Import starts fresh (it clears the previous project β€” no more old emotes sneaking back in), and Start over wipes everything when you want a clean slate.
  • Update an existing character. Already have a character (or one you imported)? Add sprites / Add sprite folder drops new images straight in and turns each new sprite into a new emote β€” keeping your existing char.ini, emotes and edits. Grow a character instead of rebuilding it. Trim a big cast fast with multi-select in the Emotes tab (tick rows β†’ delete many at once).
  • Merge two characters into one. Got two correct characters and want them as one big cast? Merge characters into one (Home) fuses every char.ini in a picked folder into a single character β€” emote lists joined, buttons renumbered to stay with their emote, and any clashing sprite/preanim/sound names restructured with the char.ini updated to match, so nothing shows the wrong art. The primary keeps the identity; whatever a single character can't carry (a second [Shouts]/alt-options) is reported, never dropped silently. See docs/CHARACTER_MERGE.md.
  • Sound effects (SFX). Add sound (SFX) imports your .opus/.ogg/.wav/ .mp3 into the character so it ships with the export and shows up in the Emotes Sound picker β€” then point an emote's SoundN at it (with a preanim + the "play preanim + sound" modifier) to make it play, e.g. a jumpscare scream. See docs/SFX.md.
  • Auto folders + file moving. Builds the character folder, an emotions/ folder, and lays everything out the way AO expects.
  • Auto buttons + char_icon. Generates buttonN_off.png for every emote and the character-select char_icon.png. The Buttons screen lists every sprite (with a tiny preview of the actual button, like the Emotes screen) so you can click any pose to frame it. They frame the character's face by default (AO buttons show expressions, not whole bodies); switch to full-body, draw the crop box yourself (Manual mode β€” drag/resize a box on the sprite, KFO/DRO-style, or fly the whole cast with plain, rebindable keys β€” ←/β†’, Enter, …), tune the size/zoom/position, or lay a border on top (KFO-style) β€” import your own, pick from dozens of built-in border & background presets (Umineko, Danganronpa, Limbus, kawaii pastels, hearts/sparkles, and a big colour palette), or build your own in-app (style + colour-wheel + gradients + thickness/radius, with a live preview β€” start from any preset and tweak it). Rendered crisp (lossless PNG, never upscaled). Drop your own button in to override.
  • Smart guesses. Friendly emote names, preanimation detection, and optional sound-effect guesses (keyword β†’ SFX, e.g. slam β†’ desk-slam) β€” all adjustable.

Customize everything

  • Real-time Colour Lab β€” hue / saturation / brightness / contrast with live preview, plus hundreds of presets, palettes, gradient maps, and "Make it <colour>" recolours that preserve shading (perfect for OCs β€” turn a sprite pink without flattening it).
  • Custom colour wheel β€” pick any colour (wheel / area / sliders / hex) and blend it in as a recolour, tint, solid fill, or gradient β€” stack as many as you like on top of the presets.
  • Effects β€” add an outline, outer glow or drop shadow around a sprite, sharpen/blur, or film looks (cross-process, bleach-bypass, solarize, dither) β€” all blendable like any other preset.
  • Region / outfit editing β€” magic-wand colour selection, rectangle/ellipse masks, feathering, grow/shrink; then recolour just the clothes, erase a region, or paint a fill.
  • Crop, auto-trim & background removal β€” crop sprites (uniform across all frames + (a)/(b)), trim transparent margins, or knock out a flat background by flood-filling from the corners β€” with an optional despill that un-tints the soft hair/edge fringe so it keeps no coloured halo of the old background.
  • Zoom Studio β€” is a character drawn tiny in a big empty frame so it looks lost in-game? Pull it in with a virtual camera: mouse-wheel to zoom, drag to pan on a WYSIWYG canvas that shows exactly what AO will render, or hit Auto-frame to do it instantly. Apply to the whole cast at once (one shared framing, so poses stay aligned) β€” baked into every animation frame, losslessly. See docs/ZOOM_STUDIO.md.
  • Full char.ini editor β€” a dedicated Character tab for the [Options] block: name, showname, needs_showname, side, blips, chat, category, scaling, stretch, and more. The auto-builder fills defaults; tweak any of them here (imported custom keys are preserved).
  • Sprite mixer ("frankensprite") β€” mouse-driven: drag parts to move, drag a corner / scroll to scale, drag a handle to rotate (sliders too). Snip a region from one sprite (e.g. a head) and drop it onto a body β€” stack as many snips as you want β€” then save it as a new emote. Combine two characters by loading a second sprite folder in the Mixer (kept out of your project + export). A Layers mode "links everything" for art that ships each feature as a separate, pre-aligned file (eyes, brows, body, an arm…). Tools: snip-crop
    • ellipse, flip H/V, feather, recolour the snip, crop output.
  • Bulk operations β€” recolour, convert, crop/trim, or rename every sprite/emote at once (find/replace, prefix/suffix, numbering, case).
  • Format conversion β€” import webp/apng/gif/png (and jpg/bmp/tga/tiff/…), export PNG/APNG/GIF, and WebP (lossy + lossless) β€” instantly in the web build, or via the bundled libwebp on desktop/mobile.

Animate everything (so anyone can)

  • One-click animation recipes β€” sway, bob, bounce, breathe, shake, spin, nod, head-shake, swing, drift, orbit, heartbeat, glow, flash, rainbow, pulse, neon, hologram, glitch, fade, throb, sparkle, drop-in, spring-in, outline-pulse, aura-glow… stack them ("move + glow + rainbow") with easing curves.
  • Frame-by-frame β€” already drew the frames? The Frames mode stitches chosen sprites into one animation (fps, reverse, ping-pong, auto-aligned canvas) and exports it β€” no procedural effect required.
  • Animate ALL sprites at once β€” one button bakes your effect stack onto every sprite, saving each as an animated WebP (b) talk sprite. Give a whole character the same idle sway/breathe in a single click. Baked across all CPU cores.
  • Animate just a part β€” pick a region to wave a hand or spin a limb.
  • Talking mouths (lip-sync), zero extra art β€” the Mouth tab fakes a natural, looping talking (b) animation from a single drawing: a face-placed mouth box drops the jaw with a speech-like cadence. Preview it live and drag the box onto the lips, tune the open amount/speed, then save β€” or give your whole cast talking mouths in one click. Already drew mouth shapes? Feed it a closed+open sprite (or several visemes) instead. (docs)
  • ~88 stackable effects and a custom keyframe timeline for full control.
  • Exports as animated WebP by default (bundled libwebp on desktop/mobile; browser-native on web), auto-falling back to APNG where WebP isn't available β€” and the status line tells you why it fell back, so a stray APNG is fixable rather than a mystery.

Live2D-style characters (Puppet Studio)

  • Parts β†’ an animated character. Got a character that ships as separate parts (the way Live2D / gacha sprites do β€” head, hair, eyes, mouth, body)? The Puppet tab assembles them into a layered "puppet" and bakes a gently animated AO sprite β€” an idle (a) that breathes, sways and blinks and a talking (b) β€” with no hand-animation. Each layer gets a role that auto-picks sensible motion and a pivot (hair swings from the scalp, the jaw drops from the upper lip…), and the talk clip opens any mouth layer.
  • Slice a sheet, or drop in layers. Auto-detect parts from an atlas (or box them in the Ripper β†’ Send to Puppet), then arrange the pose and bake.
  • AO can't run a real Live2D/Cubism or 3D model β€” so Pinsel bakes the puppet down to ordinary AO sprites (and that's why it Just Works in-client). It's cut-out animation (move/rotate/scale/squash whole parts), not mesh warp. See docs/PUPPET.md.

Rip & theme everything

  • Sprite sheet ripper β€” drop in a sheet/collage of VN sprites and it slices out each one as a transparent sprite. Auto-detect any layout (it flood-fills the background inward from the edges, so even white-clothing-on-white works) or a uniform grid. Tap boxes to include/exclude, then add them straight to your character or download a zip. See docs/SPRITE_RIPPER.md.
  • AO2 Theme Maker β€” design a full Attorney Online 2 / webAO client theme: every widget position (drag them around the courtroom), every colour, every font, every image (PNG/GIF/WebP), sounds and Qt CSS. Import a real theme to edit, roll a random one, resize to 1080p / 720p / any custom size (scaling the whole layout), see a real-client preview before you use it, then export a .zip ready for base/themes/. ~95 known widgets, a full image catalogue and every design option β€” all customizable, with lossless round-trips. See docs/THEME_MAKER.md.

Extend everything

  • Plugin packs β€” plain JSON adding presets, palettes, gradients, animations and name sets. No install, no recompile, and they work on the web too.
  • Native code hooks β€” register new colour ops, animation recipes, and easing curves.

Never lose data

  • The char.ini parser is lossless: unknown sections/keys are preserved, and it even repairs mangled run-on lines found in real-world inis.
  • Undo/redo and a validator/linter that flags missing sprites, count mismatches, and preanim mistakes β€” with plain-language fixes.

Fast & comfortable

  • Keyboard shortcuts for everything β€” Ctrl/⌘+Z/Y undo/redo, Ctrl/⌘+S/E export, Ctrl/⌘+1…9 to jump screens, F1 for the cheat-sheet β€” plus a top toolbar with undo/redo + import/export buttons. The contextual single-key shortcuts (Button-Studio framing, Theme-Maker nudge) are rebindable in the F1 dialog and saved across sessions. See docs/SHORTCUTS.md.
  • Tuned for speed β€” an allocation-free per-pixel core, downscaled/debounced live previews, and bulk jobs that keep the UI responsive (progress instead of a freeze). Editing fields (Emotes, Character) writes to the model and commits on blur β€” no per-keystroke re-render, so typing stays smooth even with a big sprite in the preview.
  • Cancel any bulk job β€” every long bake (animate / jiggle / mouth all, recolour / convert all, apply zoom / edit / paint, bulk-build characters) shows a live progress bar and a Cancel button that stops it cleanly β€” your safety valve on a huge cast (nothing already saved is undone). See docs/PERFORMANCE.md.

πŸš€ Quick start

You need the Flutter SDK (3.22+). The platform project folders are generated on first run.

# 1. Get the code
cd Pinsel-AO-Char-Maker

# 2. Generate the platform folders (android/ios/linux/macos/windows/web)
flutter create .

# 3. Install dependencies
flutter pub get

# 4. Run it
flutter run -d windows      # or linux / macos / chrome / <android|ios device>

Make the website:

flutter build web --release
# Serve build/web/ from any static host (GitHub Pages, Netlify, itch.io, …)

See docs/BUILD_AND_RUN.md for per-platform details (Android/iOS signing, native libwebp, web hosting).


⬇️ Prebuilt binaries FOR DOWNLOADS. (let GitHub build them)

You don't need to compile anything yourself β€” GitHub Actions does it for every platform via .github/workflows/build.yml.

For the download links, Open the Actions tab β†’ the latest "Build binaries" run. Each platform's output is under Artifacts (pinsel-windows, -linux, -macos, -android-apk, -web). Download and unzip.

Builds run independently of the tests, so you still get binaries even if a test fails. iOS isn't auto-built (it needs your signing certificate); build it locally with flutter build ios.

πŸ“– Documentation

Doc What's inside
docs/USER_GUIDE.md Click-by-click guide to every feature (start here)
docs/BUILD_AND_RUN.md Build & run on every platform + the web
docs/WEBSITE.md Host it as a website (GitHub Pages, Netlify, …)
docs/CHAR_INI_FORMAT.md Complete AO char.ini reference
docs/SFX.md Add a sound effect (SFX) to an emote β€” import, attach, play
docs/AUTO_BUILD.md How folder β†’ character works
docs/CHARACTER_MERGE.md Merge two+ characters into one (renumber buttons, dodge name clashes)
docs/ONE_CLICK.md ⚑ One-click: folder β†’ finished, exported character
docs/COLOR_OPS.md Every colour operation + parameters
docs/PAINT.md Paint Studio β€” brushes, gradient/region fills, blend modes
docs/ZOOM_STUDIO.md Zoom Studio β€” camera zoom/framing to fill the AO viewport
docs/ANIMATION.md Recipes, easing, timeline, lip-sync, regions
docs/LIPSYNC.md Talking mouths from one drawing (preview + adjust)
docs/JIGGLE.md Jiggle physics β€” soft-body bounce for any region
docs/PUPPET.md Puppet Studio β€” Live2D-style parts β†’ an animated AO character
docs/PERFORMANCE.md GPU previews, multi-core baking + cancellable jobs
docs/MIXER.md Snip, stack & link sprites (mouse-driven; multi-snip + layers)
docs/SPRITE_RIPPER.md Slice sprite sheets into sprites (auto-detect / grid)
docs/THEME_MAKER.md Design & export an AO2 client theme (drag layout, random, custom images)
docs/SHORTCUTS.md Keyboard shortcuts + the top toolbar
docs/PLUGINS.md Pack JSON schema + native plugins + libwebp
ARCHITECTURE.md How the code is organised
ROADMAP.md What's done and what's next
docs/FAQ.md Common questions & troubleshooting

The source is documented heavily β€” almost every public type and method has a doc comment explaining what it does and why.


🧭 Status

This is v0.1 β€” a deep, tested engine plus a working cross-platform UI. The core (INI model, scanner/auto-builder, organiser, image/colour engine, animation engine, presets, plugins) is complete and unit-tested. Some UI screens are first-pass and the roadmap lists what's growing next. See ROADMAP.md.

πŸ“œ License

AGPL-3.0. See LICENSE. Credit to the Attorney Online dev team and the authors of KFO-CharMaker and DROButtonMaker for format references and inspiration.

About

Idiot Proof AO2 character maker made in Dart and Flutter

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages