From 5aede18ad53902dc127627556ed8747ebe753168 Mon Sep 17 00:00:00 2001 From: Aodhan Collins Date: Thu, 19 Feb 2026 00:40:29 +0000 Subject: [PATCH] Expanded generation options. Multiple outfits support. --- app.py | 434 ++++++++++++++++++++++- characters/aerith_gainsborough.json | 37 +- characters/android_18.json | 24 +- characters/anya_forger.json | 22 +- characters/biwa_hayahide.json | 24 +- characters/bulma.json | 24 +- characters/camilla.json | 22 +- characters/camilla_(fire_emblem).json | 45 +++ characters/cammy.json | 24 +- characters/chun_li.json | 24 +- characters/ciri.json | 22 +- characters/delinquent_mother_flim13.json | 33 +- characters/gold_city.json | 24 +- characters/gold_ship.json | 24 +- characters/hatsune_miku.json | 24 +- characters/jasmine_disney.json | 47 +++ characters/jessica_rabbit.json | 30 +- characters/jessie.json | 22 +- characters/jinx.json | 22 +- characters/kagamine_rin.json | 24 +- characters/kagari_atsuko.json | 22 +- characters/kda_all_out_ahri.json | 27 +- characters/kda_all_out_akali.json | 27 +- characters/kda_all_out_evelynn.json | 27 +- characters/kda_all_out_kaisa.json | 27 +- characters/komi_shouko.json | 24 +- characters/lara_croft_classic.json | 24 +- characters/lisa_minci.json | 24 +- characters/lulu.json | 26 +- characters/majin_android_21.json | 28 +- characters/marin_kitagawa.json | 24 +- characters/megurine_luka.json | 24 +- characters/meiko.json | 24 +- characters/nessa.json | 28 +- characters/olivier_mira_armstrong.json | 22 +- characters/princess_peach.json | 22 +- characters/princess_zelda_botw.json | 26 +- characters/rice_shower.json | 24 +- characters/riju.json | 26 +- characters/rosalina.json | 24 +- characters/rouge_the_bat.json | 24 +- characters/ryouko_hakubi.json | 25 +- characters/sam_totally_spies.json | 49 +++ characters/samus_aran_zero_suit.json | 22 +- characters/sarah_miller.json | 28 +- characters/scarlet_ff7.json | 51 +++ characters/shantae.json | 22 +- characters/sorceress_dragons_crown.json | 46 +++ characters/sucy_manbavaran.json | 24 +- characters/tifa_lockhart.json | 24 +- characters/tracer.json | 22 +- characters/urbosa.json | 28 +- characters/widowmaker.json | 22 +- characters/yor_briar.json | 22 +- characters/yshtola_rhul.json | 27 +- characters/yuffie_kisaragi.json | 22 +- characters/yuna_ffx.json | 24 +- launch.sh | 2 +- migrate_wardrobe.py | 153 ++++++++ models.py | 28 ++ templates/create.html | 40 +++ templates/detail.html | 68 +++- templates/edit.html | 240 +++++++++++++ templates/layout.html | 2 + templates/settings.html | 96 +++++ 65 files changed, 2086 insertions(+), 477 deletions(-) create mode 100644 characters/camilla_(fire_emblem).json create mode 100644 characters/jasmine_disney.json create mode 100644 characters/sam_totally_spies.json create mode 100644 characters/scarlet_ff7.json create mode 100644 characters/sorceress_dragons_crown.json create mode 100644 migrate_wardrobe.py create mode 100644 templates/create.html create mode 100644 templates/edit.html create mode 100644 templates/settings.html diff --git a/app.py b/app.py index bd57da0..5e16503 100644 --- a/app.py +++ b/app.py @@ -6,7 +6,7 @@ import requests import random from flask import Flask, render_template, request, redirect, url_for, flash, session from werkzeug.utils import secure_filename -from models import db, Character +from models import db, Character, Settings app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' @@ -17,11 +17,21 @@ app.config['CHARACTERS_DIR'] = 'characters' app.config['COMFYUI_URL'] = 'http://127.0.0.1:8188' app.config['ILLUSTRIOUS_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Illustrious/' app.config['NOOB_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Noob/' +app.config['LORA_DIR'] = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Looks/' db.init_app(app) ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'} +def get_available_loras(): + loras = [] + if os.path.exists(app.config['LORA_DIR']): + for f in os.listdir(app.config['LORA_DIR']): + if f.endswith('.safetensors'): + # Using the format seen in character JSONs + loras.append(f"Illustrious/Looks/{f}") + return sorted(loras) + def get_available_checkpoints(): checkpoints = [] @@ -42,7 +52,7 @@ def get_available_checkpoints(): def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS -def build_prompt(data, selected_fields=None, default_fields=None): +def build_prompt(data, selected_fields=None, default_fields=None, active_outfit='default'): def is_selected(section, key): # Priority: # 1. Manual selection from form (if list is not empty) @@ -55,7 +65,17 @@ def build_prompt(data, selected_fields=None, default_fields=None): return True identity = data.get('identity', {}) - wardrobe = data.get('wardrobe', {}) + + # Get wardrobe - handle both new nested format and legacy flat format + wardrobe_data = data.get('wardrobe', {}) + if 'default' in wardrobe_data and isinstance(wardrobe_data.get('default'), dict): + # New nested format - get active outfit + wardrobe = wardrobe_data.get(active_outfit or 'default', wardrobe_data.get('default', {})) + else: + # Legacy flat format + wardrobe = wardrobe_data + + defaults = data.get('defaults', {}) # Pre-calculate Hand/Glove priority hand_val = "" @@ -71,16 +91,22 @@ def build_prompt(data, selected_fields=None, default_fields=None): if char_tag and is_selected('special', 'name'): parts.append(char_tag) - for key in ['base_specs', 'hair', 'eyes', 'expression', 'distinguishing_marks']: + for key in ['base_specs', 'hair', 'eyes', 'extra']: val = identity.get(key) if val and is_selected('identity', key): parts.append(val) + # Add defaults (expression, pose, scene) + for key in ['expression', 'pose', 'scene']: + val = defaults.get(key) + if val and is_selected('defaults', key): + parts.append(val) + # Add hand priority value to main prompt if hand_val: parts.append(hand_val) - for key in ['outer_layer', 'inner_layer', 'lower_body', 'footwear', 'accessories']: + for key in ['top', 'headwear', 'legwear', 'footwear', 'accessories']: val = wardrobe.get(key) if val and is_selected('wardrobe', key): parts.append(val) @@ -101,7 +127,7 @@ def build_prompt(data, selected_fields=None, default_fields=None): face_parts = [] if char_tag and is_selected('special', 'name'): face_parts.append(char_tag) if identity.get('eyes') and is_selected('identity', 'eyes'): face_parts.append(identity.get('eyes')) - if identity.get('expression') and is_selected('identity', 'expression'): face_parts.append(identity.get('expression')) + if defaults.get('expression') and is_selected('defaults', 'expression'): face_parts.append(defaults.get('expression')) # 3. Hand Prompt: Hand value (Gloves or Hands) hand_parts = [hand_val] if hand_val else [] @@ -160,6 +186,7 @@ def sync_characters(): character.data = data character.name = name character.slug = slug + character.filename = filename # Check if cover image still exists if character.image_path: @@ -174,6 +201,7 @@ def sync_characters(): new_char = Character( character_id=char_id, slug=slug, + filename=filename, name=name, data=data ) @@ -189,6 +217,66 @@ def sync_characters(): db.session.commit() +def call_llm(prompt, system_prompt="You are a creative assistant."): + settings = Settings.query.first() + if not settings or not settings.openrouter_api_key: + raise ValueError("OpenRouter API Key not configured. Please configure it in Settings.") + + headers = { + "Authorization": f"Bearer {settings.openrouter_api_key}", + "Content-Type": "application/json" + } + data = { + "model": settings.openrouter_model or 'google/gemini-2.0-flash-001', + "messages": [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": prompt} + ] + } + + try: + response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data) + response.raise_for_status() + result = response.json() + return result['choices'][0]['message']['content'] + except requests.exceptions.RequestException as e: + raise RuntimeError(f"LLM API request failed: {str(e)}") from e + except (KeyError, IndexError) as e: + raise RuntimeError(f"Unexpected LLM response format: {str(e)}") from e + +@app.route('/get_openrouter_models', methods=['POST']) +def get_openrouter_models(): + api_key = request.form.get('api_key') + if not api_key: + return {'error': 'API key is required'}, 400 + + headers = {"Authorization": f"Bearer {api_key}"} + try: + response = requests.get("https://openrouter.ai/api/v1/models", headers=headers) + response.raise_for_status() + models = response.json().get('data', []) + # Return simplified list of models + return {'models': [{'id': m['id'], 'name': m.get('name', m['id'])} for m in models]} + except Exception as e: + return {'error': str(e)}, 500 + +@app.route('/settings', methods=['GET', 'POST']) +def settings(): + settings = Settings.query.first() + if not settings: + settings = Settings() + db.session.add(settings) + db.session.commit() + + if request.method == 'POST': + settings.openrouter_api_key = request.form.get('api_key') + settings.openrouter_model = request.form.get('model') + db.session.commit() + flash('Settings updated successfully!') + return redirect(url_for('settings')) + + return render_template('settings.html', settings=settings) + @app.route('/') def index(): characters = Character.query.order_by(Character.name).all() @@ -278,6 +366,323 @@ def detail(slug): return render_template('detail.html', character=character, preferences=preferences, preview_image=preview_image) +@app.route('/create', methods=['GET', 'POST']) +def create_character(): + if request.method == 'POST': + name = request.form.get('name') + slug = request.form.get('filename') + prompt = request.form.get('prompt') + + # Validate slug + safe_slug = re.sub(r'[^a-zA-Z0-9_]', '', slug) + if not safe_slug: + flash("Invalid filename.") + return redirect(request.url) + + # Check if exists + if os.path.exists(os.path.join(app.config['CHARACTERS_DIR'], f"{safe_slug}.json")): + flash("Character with this filename already exists.") + return redirect(request.url) + + # Generate JSON with LLM + system_prompt = """You are a JSON generator. output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + Structure: + { + "character_id": "WILL_BE_REPLACED", + "character_name": "WILL_BE_REPLACED", + "identity": { + "base_specs": "string (e.g. 1girl, build, skin)", + "hair": "string", + "eyes": "string", + "hands": "string", + "arms": "string", + "torso": "string", + "pelvis": "string", + "legs": "string", + "feet": "string", + "extra": "string" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "headwear": "string", + "top": "string", + "legwear": "string", + "footwear": "string", + "hands": "string", + "accessories": "string" + }, + "styles": { + "aesthetic": "string", + "primary_color": "string", + "secondary_color": "string", + "tertiary_color": "string" + }, + "lora": { + "lora_name": "", + "lora_weight": 1.0, + "lora_triggers": "" + }, + "tags": ["string", "string"] + } + Fill the fields based on the user's description. Use Danbooru-style tags for the values (e.g. 'long hair', 'blue eyes'). Keep values concise. Leave defaults fields empty.""" + + try: + llm_response = call_llm(f"Create a character profile for '{name}' based on this description: {prompt}", system_prompt) + + # Clean response (remove markdown if present) + clean_json = llm_response.replace('```json', '').replace('```', '').strip() + char_data = json.loads(clean_json) + + # Enforce IDs + char_data['character_id'] = safe_slug + char_data['character_name'] = name + + # Save file + file_path = os.path.join(app.config['CHARACTERS_DIR'], f"{safe_slug}.json") + with open(file_path, 'w') as f: + json.dump(char_data, f, indent=2) + + # Add to DB + new_char = Character( + character_id=safe_slug, + slug=safe_slug, + filename=f"{safe_slug}.json", + name=name, + data=char_data + ) + db.session.add(new_char) + db.session.commit() + + flash('Character created successfully!') + return redirect(url_for('detail', slug=safe_slug)) + + except Exception as e: + print(f"LLM/Save error: {e}") + flash(f"Failed to create character: {e}") + return redirect(request.url) + + return render_template('create.html') + +@app.route('/character//edit', methods=['GET', 'POST']) +def edit_character(slug): + character = Character.query.filter_by(slug=slug).first_or_404() + loras = get_available_loras() + + if request.method == 'POST': + try: + # 1. Update basic fields + character.name = request.form.get('character_name') + + # 2. Rebuild the data dictionary + new_data = character.data.copy() + new_data['character_name'] = character.name + + # Update nested sections (non-wardrobe) + for section in ['identity', 'defaults', 'styles', 'lora']: + if section in new_data: + for key in new_data[section]: + form_key = f"{section}_{key}" + if form_key in request.form: + val = request.form.get(form_key) + # Handle numeric weight + if key == 'lora_weight': + try: val = float(val) + except: val = 1.0 + new_data[section][key] = val + + # Handle wardrobe - support both nested and flat formats + wardrobe = new_data.get('wardrobe', {}) + if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict): + # New nested format - update each outfit + for outfit_name in wardrobe.keys(): + for key in wardrobe[outfit_name].keys(): + form_key = f"wardrobe_{outfit_name}_{key}" + if form_key in request.form: + wardrobe[outfit_name][key] = request.form.get(form_key) + new_data['wardrobe'] = wardrobe + else: + # Legacy flat format + if 'wardrobe' in new_data: + for key in new_data['wardrobe'].keys(): + form_key = f"wardrobe_{key}" + if form_key in request.form: + new_data['wardrobe'][key] = request.form.get(form_key) + + # Update Tags (comma separated string to list) + tags_raw = request.form.get('tags', '') + new_data['tags'] = [t.strip() for f in tags_raw.split(',') for t in [f.strip()] if t] + + character.data = new_data + flag_modified(character, "data") + + # 3. Write back to JSON file + # Use the filename we stored during sync, or fallback to a sanitized ID + char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json" + file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file) + + with open(file_path, 'w') as f: + json.dump(new_data, f, indent=2) + + db.session.commit() + flash('Character profile updated successfully!') + return redirect(url_for('detail', slug=slug)) + + except Exception as e: + print(f"Edit error: {e}") + flash(f"Error saving changes: {str(e)}") + + return render_template('edit.html', character=character, loras=loras) + +@app.route('/character//outfit/switch', methods=['POST']) +def switch_outfit(slug): + """Switch the active outfit for a character.""" + character = Character.query.filter_by(slug=slug).first_or_404() + outfit_name = request.form.get('outfit', 'default') + + # Validate outfit exists + available_outfits = character.get_available_outfits() + if outfit_name in available_outfits: + character.active_outfit = outfit_name + db.session.commit() + flash(f'Switched to "{outfit_name}" outfit.') + else: + flash(f'Outfit "{outfit_name}" not found.', 'error') + + return redirect(url_for('detail', slug=slug)) + +@app.route('/character//outfit/add', methods=['POST']) +def add_outfit(slug): + """Add a new outfit to a character.""" + character = Character.query.filter_by(slug=slug).first_or_404() + outfit_name = request.form.get('outfit_name', '').strip() + + if not outfit_name: + flash('Outfit name cannot be empty.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + # Sanitize outfit name for use as key + safe_name = re.sub(r'[^a-zA-Z0-9_]', '_', outfit_name.lower()) + + # Get wardrobe data + wardrobe = character.data.get('wardrobe', {}) + + # Ensure wardrobe is in new nested format + if 'default' not in wardrobe or not isinstance(wardrobe.get('default'), dict): + # Convert legacy format + wardrobe = {'default': wardrobe} + + # Check if outfit already exists + if safe_name in wardrobe: + flash(f'Outfit "{safe_name}" already exists.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + # Create new outfit (copy from default as template) + default_outfit = wardrobe.get('default', { + 'headwear': '', 'top': '', 'legwear': '', + 'footwear': '', 'hands': '', 'accessories': '' + }) + wardrobe[safe_name] = default_outfit.copy() + + # Update character data + character.data['wardrobe'] = wardrobe + flag_modified(character, 'data') + + # Save to JSON file + char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json" + file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file) + with open(file_path, 'w') as f: + json.dump(character.data, f, indent=2) + + db.session.commit() + flash(f'Added new outfit "{safe_name}".') + + return redirect(url_for('edit_character', slug=slug)) + +@app.route('/character//outfit/delete', methods=['POST']) +def delete_outfit(slug): + """Delete an outfit from a character.""" + character = Character.query.filter_by(slug=slug).first_or_404() + outfit_name = request.form.get('outfit', '') + + wardrobe = character.data.get('wardrobe', {}) + + # Cannot delete default + if outfit_name == 'default': + flash('Cannot delete the default outfit.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + if outfit_name not in wardrobe: + flash(f'Outfit "{outfit_name}" not found.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + # Delete outfit + del wardrobe[outfit_name] + character.data['wardrobe'] = wardrobe + flag_modified(character, 'data') + + # Switch active outfit if deleted was active + if character.active_outfit == outfit_name: + character.active_outfit = 'default' + + # Save to JSON file + char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json" + file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file) + with open(file_path, 'w') as f: + json.dump(character.data, f, indent=2) + + db.session.commit() + flash(f'Deleted outfit "{outfit_name}".') + + return redirect(url_for('edit_character', slug=slug)) + +@app.route('/character//outfit/rename', methods=['POST']) +def rename_outfit(slug): + """Rename an outfit.""" + character = Character.query.filter_by(slug=slug).first_or_404() + old_name = request.form.get('old_name', '') + new_name = request.form.get('new_name', '').strip() + + if not new_name: + flash('New name cannot be empty.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + # Sanitize new name + safe_name = re.sub(r'[^a-zA-Z0-9_]', '_', new_name.lower()) + + wardrobe = character.data.get('wardrobe', {}) + + if old_name not in wardrobe: + flash(f'Outfit "{old_name}" not found.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + if safe_name in wardrobe and safe_name != old_name: + flash(f'Outfit "{safe_name}" already exists.', 'error') + return redirect(url_for('edit_character', slug=slug)) + + # Rename (copy to new key, delete old) + wardrobe[safe_name] = wardrobe.pop(old_name) + character.data['wardrobe'] = wardrobe + flag_modified(character, 'data') + + # Update active outfit if renamed was active + if character.active_outfit == old_name: + character.active_outfit = safe_name + + # Save to JSON file + char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json" + file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file) + with open(file_path, 'w') as f: + json.dump(character.data, f, indent=2) + + db.session.commit() + flash(f'Renamed outfit "{old_name}" to "{safe_name}".') + + return redirect(url_for('edit_character', slug=slug)) + @app.route('/character//upload', methods=['POST']) def upload_image(slug): character = Character.query.filter_by(slug=slug).first_or_404() @@ -416,8 +821,8 @@ def _queue_generation(character, action='preview', selected_fields=None, client_ with open('comfy_workflow.json', 'r') as f: workflow = json.load(f) - # 2. Build prompts - prompts = build_prompt(character.data, selected_fields, character.default_fields) + # 2. Build prompts with active outfit + prompts = build_prompt(character.data, selected_fields, character.default_fields, character.active_outfit) # 3. Prepare workflow workflow = _prepare_workflow(workflow, character, prompts) @@ -540,5 +945,18 @@ if __name__ == '__main__': with app.app_context(): os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) db.create_all() + + # Migration: Add active_outfit column if it doesn't exist + try: + from sqlalchemy import text + db.session.execute(text('ALTER TABLE character ADD COLUMN active_outfit VARCHAR(100) DEFAULT \'default\'')) + db.session.commit() + print("Added active_outfit column to character table") + except Exception as e: + if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower(): + print("active_outfit column already exists") + else: + print(f"Migration note: {e}") + sync_characters() app.run(debug=True, port=5000) diff --git a/characters/aerith_gainsborough.json b/characters/aerith_gainsborough.json index cc2e9e5..1494207 100644 --- a/characters/aerith_gainsborough.json +++ b/characters/aerith_gainsborough.json @@ -2,24 +2,38 @@ "character_id": "aerith_gainsborough", "identity": { "base_specs": "1girl, slender build, fair skin", - "hair": "long brown hair, braided, pink ribbon", + "hair": "long brown hair, braided, ", "eyes": "green eyes", - "expression": "cheerful expression", "hands": "pink nails", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "pink hair ribbon" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "pink dress, red bolero jacket", - "lower_body": "long skirt", - "footwear": "brown boots", - "gloves": "", - "accessories": "gold bracelets, flower basket" + "default": { + "headwear": "", + "top": "pink dress, red bolero jacket", + "legwear": "long pink dress", + "footwear": "brown boots", + "hands": "", + "accessories": "gold bracelets, flower basket" + }, + "red_dress": { + "headwear": "red hair ribbons", + "top": "long dress, frilled dress, red dress", + "legwear": "long dress, frilled dress, red dress", + "footwear": "white high heels", + "hands": "red nails", + "accessories": "gold bracelets" + } }, "styles": { "aesthetic": "floral, gentle, final fantasy style", @@ -28,11 +42,12 @@ "tertiary_color": "brown" }, "lora": { - "lora_name": "", + "lora_name": "Illustrious/Looks/Aerith.safetensors", "lora_weight": 1.0, "lora_triggers": "" }, "tags": [ "Final Fantasy VII" - ] + ], + "character_name": "Aerith Gainsborough" } \ No newline at end of file diff --git a/characters/android_18.json b/characters/android_18.json index 1549ac7..24b1456 100644 --- a/characters/android_18.json +++ b/characters/android_18.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender build, fair skin", "hair": "shoulder-length blonde hair, tucked behind one ear", "eyes": "blue eyes", - "expression": "cool, indifferent expression", "hands": "blue nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "gold hoop earrings" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black short-sleeved shirt", - "outer_layer": "blue denim vest, 'RR' text on back", - "lower_body": "blue denim skirt, black leggings", - "footwear": "brown boots", - "gloves": "", - "accessories": "" + "default": { + "headwear": "black long sleeved shirt, striped sleeves", + "top": "blue denim vest,", + "legwear": "blue denim skirt, black stockings", + "footwear": "brown boots", + "hands": "", + "accessories": "gold hoop earrings" + } }, "styles": { - "aesthetic": "90s casual, anime, dragon ball style", + "aesthetic": "wasteland, mountains, anime, dragon ball style", "primary_color": "blue", "secondary_color": "black", "tertiary_color": "white" diff --git a/characters/anya_forger.json b/characters/anya_forger.json index 162e2c6..e821ffc 100644 --- a/characters/anya_forger.json +++ b/characters/anya_forger.json @@ -5,22 +5,28 @@ "base_specs": "1girl, small build, loli, fair skin", "hair": "short pink hair, two small horns (hair ornaments)", "eyes": "green eyes", - "expression": "smirk", "hands": "pink nails", "arms": "", "torso": "flat chest", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black Eden Academy uniform, gold trim", - "lower_body": "uniform skirt", - "footwear": "black shoes, white socks", - "gloves": "", - "accessories": "black and gold hair cones" + "default": { + "headwear": "", + "top": "black Eden Academy uniform, gold trim", + "legwear": "uniform skirt", + "footwear": "black shoes, white socks", + "hands": "", + "accessories": "black and gold hair cones" + } }, "styles": { "aesthetic": "cute, academic, spy x family style", diff --git a/characters/biwa_hayahide.json b/characters/biwa_hayahide.json index 6e8c170..0575414 100644 --- a/characters/biwa_hayahide.json +++ b/characters/biwa_hayahide.json @@ -5,25 +5,31 @@ "base_specs": "1girl, horse ears, horse tail, tall", "hair": "long grey hair, wild hair", "eyes": "purple eyes, red framed glasses", - "expression": "thinking", "hands": "", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "tracen school uniform", - "lower_body": "pleated skirt", - "footwear": "heeled shoes", - "gloves": "", - "accessories": "" + "default": { + "headwear": "white shirt", + "top": "tracen school uniform", + "legwear": "pleated skirt", + "footwear": "heeled shoes", + "hands": "", + "accessories": "" + } }, "styles": { - "aesthetic": "intellectual, cool", + "aesthetic": "library,intellectual,", "primary_color": "maroon", "secondary_color": "white", "tertiary_color": "grey" diff --git a/characters/bulma.json b/characters/bulma.json index bc79d40..69e6107 100644 --- a/characters/bulma.json +++ b/characters/bulma.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender build, fair skin", "hair": "turquoise hair, ponytail", "eyes": "blue eyes", - "expression": "energetic smile", "hands": "turquoise nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black playboy bunny", - "lower_body": "pantyhose", - "footwear": "red high heels", - "gloves": "detatched cuffs", - "accessories": "red hair ribbon, dragon radar" + "default": { + "headwear": "", + "top": "black playboy bunny", + "legwear": "pantyhose", + "footwear": "red high heels", + "hands": "detatched cuffs", + "accessories": "red hair ribbon" + } }, "styles": { - "aesthetic": "retro-futuristic, anime, dragon ball style", + "aesthetic": "wasteland, anime, dragon ball style", "primary_color": "pink", "secondary_color": "turquoise", "tertiary_color": "purple" diff --git a/characters/camilla.json b/characters/camilla.json index 58a75c0..a8c41a1 100644 --- a/characters/camilla.json +++ b/characters/camilla.json @@ -5,22 +5,28 @@ "base_specs": "1girl, curvaceous build, fair skin", "hair": "long wavy lavender hair, hair covering one eye", "eyes": "purple eyes", - "expression": "seductive smile", "hands": "purple nails", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "black headband with horns" + "extra": "black headband with horns" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black armor, cleavage", - "lower_body": "black leggings, armored plates", - "footwear": "black armored boots", - "gloves": "", - "accessories": "purple cape, large axe" + "default": { + "headwear": "", + "top": "black armor, cleavage", + "legwear": "black leggings, armored plates", + "footwear": "black armored boots", + "hands": "", + "accessories": "purple cape, large axe" + } }, "styles": { "aesthetic": "dark fantasy, gothic, fire emblem style", diff --git a/characters/camilla_(fire_emblem).json b/characters/camilla_(fire_emblem).json new file mode 100644 index 0000000..b78f1b4 --- /dev/null +++ b/characters/camilla_(fire_emblem).json @@ -0,0 +1,45 @@ +{ + "character_id": "camilla_(fire_emblem)", + "character_name": "Camilla Nohr", + "identity": { + "base_specs": "1girl, curvaceous build, fair skin", + "hair": "long wavy lavender hair, hair covering one eye", + "eyes": "purple eyes", + "hands": "purple nails", + "arms": "", + "torso": "large breasts", + "pelvis": "", + "legs": "", + "feet": "", + "extra": "black tiara" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "default": { + "headwear": "belt between breasts", + "top": "black armor, gold trim, cleavage", + "legwear": "purple sash, pelvic curtain, black panties", + "footwear": "black armored thigh boots", + "hands": "purple velvet gloves", + "accessories": "purple cape, large axe" + } + }, + "styles": { + "aesthetic": "battlefield,night,gothic, fire emblem style", + "primary_color": "black", + "secondary_color": "gold", + "tertiary_color": "purple" + }, + "lora": { + "lora_name": "Illustrious/Looks/fecamilla-illu-nvwls-v2.safetensors", + "lora_weight": 0.8, + "lora_triggers": "" + }, + "tags": [ + "Fire Emblem" + ] +} \ No newline at end of file diff --git a/characters/cammy.json b/characters/cammy.json index dbf6172..b6476db 100644 --- a/characters/cammy.json +++ b/characters/cammy.json @@ -5,25 +5,31 @@ "base_specs": "1girl, muscular build, fair skin", "hair": "long blonde hair, twin braids", "eyes": "blue eyes", - "expression": "serious look", "hands": "green nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "scar on left cheek, green camouflage paint on legs" + "extra": "scar on left cheek, green camouflage paint on legs" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "green high-leg leotard", - "lower_body": "bare legs", - "footwear": "black combat boots, green socks", - "gloves": "red gauntlets", - "accessories": "red beret" + "default": { + "headwear": "", + "top": "green high-leg leotard", + "legwear": "bare legs", + "footwear": "black combat boots, green socks", + "hands": "red gauntlets", + "accessories": "red beret" + } }, "styles": { - "aesthetic": "military, athletic, street fighter style", + "aesthetic": "aurora,above valley,stone bridge, street fighter style", "primary_color": "green", "secondary_color": "red", "tertiary_color": "black" diff --git a/characters/chun_li.json b/characters/chun_li.json index 27265f5..d98eec3 100644 --- a/characters/chun_li.json +++ b/characters/chun_li.json @@ -5,25 +5,31 @@ "base_specs": "1girl, muscular build, fair skin, asian", "hair": "black hair, hair buns", "eyes": "brown eyes", - "expression": "determined smile", "hands": "blue nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "thick thighs", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "blue qipao, gold embroidery, white accents", - "lower_body": "brown tights", - "footwear": "white combat boots", - "gloves": "", - "accessories": "white hair ribbons, spiked bracelets" + "default": { + "headwear": "", + "top": "blue qipao, gold embroidery, white accents, puffy shoulders", + "legwear": "brown tights", + "footwear": "white lace-up boots", + "hands": "", + "accessories": "white hair ribbons, spiked bracelets" + } }, "styles": { - "aesthetic": "chinese style", + "aesthetic": "chinese style, market,", "primary_color": "blue", "secondary_color": "white", "tertiary_color": "gold" diff --git a/characters/ciri.json b/characters/ciri.json index f7bbcc9..ab004c5 100644 --- a/characters/ciri.json +++ b/characters/ciri.json @@ -5,22 +5,28 @@ "base_specs": "1girl, athletic build", "hair": "ashen grey hair, messy bun", "eyes": "emerald green eyes, mascara", - "expression": "determined look", "hands": "green nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "scar over eye" + "extra": "scar over eye" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white blouse", - "outer_layer": "", - "lower_body": "brown leather trousers", - "footwear": "brown leather boots", - "gloves": "brown leather gloves", - "accessories": "silver sword on back, witcher medallion" + "default": { + "headwear": "white blouse", + "top": "", + "legwear": "brown leather trousers", + "footwear": "brown leather boots", + "hands": "brown leather gloves", + "accessories": "silver sword on back, witcher medallion" + } }, "styles": { "aesthetic": "gritty, fantasy, witcher style", diff --git a/characters/delinquent_mother_flim13.json b/characters/delinquent_mother_flim13.json index 80e7e10..56db610 100644 --- a/characters/delinquent_mother_flim13.json +++ b/characters/delinquent_mother_flim13.json @@ -4,36 +4,43 @@ "identity": { "base_specs": "1girl, milf, gyaru, tall", "hair": "blonde hair, long hair", - "eyes": "sharp eyes", - "expression": "smirk, sharp teeth", + "eyes": "sharp eyes, black eyes, white pupil,", "hands": "painted nails", "arms": "", "torso": "very large breasts", "pelvis": "wide hips", "legs": "", - "feet": "", - "distinguishing_marks": "" + "feet": "painted nails", + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "biege sweater, cleavage", - "outer_layer": "", - "lower_body": "pencil skirt", - "footwear": "high heels", - "gloves": "", - "accessories": "necklace, rings" + "default": { + "headwear": "cleavage", + "top": "light brown sweater, ", + "legwear": "black skirt", + "footwear": "red high heels", + "hands": "", + "accessories": "necklace, rings" + } }, "styles": { - "aesthetic": "gyaru, milf, pink leopard print", + "aesthetic": "living room", "primary_color": "pink", "secondary_color": "black", "tertiary_color": "gold" }, "lora": { "lora_name": "Illustrious/Looks/Gyaru_mom_Flim13_IL_V1.safetensors", - "lora_weight": 1.0, + "lora_weight": 0.8, "lora_triggers": "" }, "tags": [ - "Original","flim13" + "Original", + "flim13" ] } \ No newline at end of file diff --git a/characters/gold_city.json b/characters/gold_city.json index 1bbf326..94661fc 100644 --- a/characters/gold_city.json +++ b/characters/gold_city.json @@ -5,25 +5,31 @@ "base_specs": "1girl, horse ears, horse tail, tall", "hair": "blonde hair, wavy hair", "eyes": "blue eyes", - "expression": "confident expression", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "tracen school uniform", - "lower_body": "pleated skirt", - "footwear": "heeled shoes", - "gloves": "", - "accessories": "choker, earrings" + "default": { + "headwear": "white shirt", + "top": "tracen school uniform", + "legwear": "pleated skirt", + "footwear": "heeled shoes", + "hands": "", + "accessories": "choker, earrings" + } }, "styles": { - "aesthetic": "fashionable, model", + "aesthetic": "shopping,modeling,school yard", "primary_color": "gold", "secondary_color": "white", "tertiary_color": "black" diff --git a/characters/gold_ship.json b/characters/gold_ship.json index 338017e..acf46d4 100644 --- a/characters/gold_ship.json +++ b/characters/gold_ship.json @@ -5,25 +5,31 @@ "base_specs": "1girl, horse ears, horse tail, tall", "hair": "grey hair, short hair", "eyes": "red eyes", - "expression": "crazy expression, grin", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "tracen school uniform", - "lower_body": "pleated skirt", - "footwear": "heeled shoes", - "gloves": "", - "accessories": "ear covers, hat" + "default": { + "headwear": "white shirt", + "top": "tracen school uniform", + "legwear": "pleated skirt", + "footwear": "heeled shoes", + "hands": "", + "accessories": "ear covers, hat" + } }, "styles": { - "aesthetic": "energetic, sporty", + "aesthetic": "horse race track,energetic, sporty", "primary_color": "red", "secondary_color": "white", "tertiary_color": "gold" diff --git a/characters/hatsune_miku.json b/characters/hatsune_miku.json index 1fc375d..b1ff92d 100644 --- a/characters/hatsune_miku.json +++ b/characters/hatsune_miku.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender build, fair skin", "hair": "long turquoise hair, twin tails, floor-length", "eyes": "turquoise eyes", - "expression": "cheerful smile", "hands": "turquoise nails", "arms": "01 tattoo on left shoulder", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "grey sleeveless shirt, turquoise tie", - "lower_body": "grey miniskirt, turquoise trim", - "footwear": "black thigh-high boots, turquoise trim", - "gloves": "black arm warmers, turquoise trim", - "accessories": "hair ornament, headset" + "default": { + "headwear": "", + "top": "grey sleeveless shirt, turquoise tie", + "legwear": "grey miniskirt, turquoise trim", + "footwear": "black thigh-high boots, turquoise trim", + "hands": "black arm warmers, turquoise trim", + "accessories": "hair ornament, headset" + } }, "styles": { - "aesthetic": "vocaloid, futuristic, anime style", + "aesthetic": "concert, stage, vocaloid, futuristic, anime style", "primary_color": "teal", "secondary_color": "grey", "tertiary_color": "black" diff --git a/characters/jasmine_disney.json b/characters/jasmine_disney.json new file mode 100644 index 0000000..5253caa --- /dev/null +++ b/characters/jasmine_disney.json @@ -0,0 +1,47 @@ +{ + "character_id": "jasmine_disney", + "character_name": "Jasmine", + "identity": { + "base_specs": "1girl, dark skin, ", + "hair": "black hair, long hair, voluminous hair, banded hair, sectioned hair", + "eyes": "brown eyes, ", + "hands": "teal nails", + "arms": "", + "torso": "medium breasts", + "pelvis": "narrow waist", + "legs": "", + "feet": "", + "extra": "heavy eyeliner, winged eyeliner" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "default": { + "headwear": "teal crop top, tube top, off-shoulder, cleavage", + "top": "", + "legwear": "teal harem pants, baggy pants, sheer fabric", + "footwear": "gold shoes, curling toes, pointed shoes", + "hands": "", + "accessories": "gold hoop earrings, large gold necklace, blue headband, jewel on headband" + } + }, + "styles": { + "aesthetic": "desert palace, large fountain, arabian, disney, cartoon, vibrant, ferns", + "primary_color": "teal", + "secondary_color": "gold", + "tertiary_color": "black" + }, + "lora": { + "lora_name": "Illustrious/Looks/Jasmine-IL_V2.safetensors", + "lora_weight": 0.8, + "lora_triggers": "" + }, + "tags": [ + "Aladdin", + "princess", + "disney" + ] +} \ No newline at end of file diff --git a/characters/jessica_rabbit.json b/characters/jessica_rabbit.json index ed8e413..42a1914 100644 --- a/characters/jessica_rabbit.json +++ b/characters/jessica_rabbit.json @@ -2,34 +2,40 @@ "character_id": "jessica_rabbit", "character_name": "Jessica Rabbit", "identity": { - "base_specs": "1girl, voluptuous build, tall,", + "base_specs": "1girl, tall,", "hair": "long red hair, side part, hair over one eye", "eyes": "green eyes, heavy makeup, purple eyeshadow", - "expression": "seductive smile", "hands": "purple elbow gloves", "arms": "", "torso": "large breasts", - "pelvis": "narrow waist", + "pelvis": "very narrow waist", "legs": "", "feet": "", - "distinguishing_marks": "red lips" + "extra": "red lips" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "red sequin dress, strapless, high slit, backless", - "lower_body": "side_slit,", - "footwear": "red high heels", - "gloves": "purple opera gloves", - "accessories": "gold earrings, glitter" + "default": { + "headwear": "", + "top": "red sequin dress, strapless, high slit, backless", + "legwear": "side slit,", + "footwear": "red high heels", + "hands": "purple opera gloves", + "accessories": "gold earrings, glitter" + } }, "styles": { - "aesthetic": "noir, cartoon, glamorous", + "aesthetic": "jazz club,noir,", "primary_color": "red", "secondary_color": "purple", "tertiary_color": "gold" }, "lora": { - "lora_name": "", + "lora_name": "Illustrious/Looks/JessicaRabbitXL_character-12-IL.safetensors", "lora_weight": 0.8, "lora_triggers": "" }, diff --git a/characters/jessie.json b/characters/jessie.json index 1cc3acb..b3ab346 100644 --- a/characters/jessie.json +++ b/characters/jessie.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "long magenta hair, curved back", "eyes": "blue eyes", - "expression": "arrogant smirk", "hands": "white nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "green earrings" + "extra": "green earrings" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black crop top", - "outer_layer": "white Team Rocket uniform jacket, bare stomach, red R logo", - "lower_body": "white miniskirt", - "footwear": "black thigh-high boots", - "gloves": "black elbow gloves", - "accessories": "green earrings" + "default": { + "headwear": "black crop top", + "top": "white Team Rocket uniform jacket, bare stomach, red R logo", + "legwear": "white miniskirt", + "footwear": "black thigh-high boots", + "hands": "black elbow gloves", + "accessories": "green earrings" + } }, "styles": { "aesthetic": "villainous, anime, pokemon style", diff --git a/characters/jinx.json b/characters/jinx.json index 91b27a2..44463b3 100644 --- a/characters/jinx.json +++ b/characters/jinx.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, pale skin,", "hair": "long aqua hair, twin braids, very long hair, bangs", "eyes": "pink eyes, ", - "expression": "crazy eyes, crazy smile", "hands": "black and pink nails", "arms": "", "torso": "flat chest,", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "cloud tattoo," + "extra": "cloud tattoo," + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "pink and black bikini, asymmetrical_bikini ", - "lower_body": "pink shorts, single pink stocking", - "footwear": "combat boots", - "gloves": "black fingerless gloves, fishnet elbow gloves,", - "accessories": "ammo belts, choker, bullet necklace," + "default": { + "headwear": "", + "top": "pink and black bikini, asymmetrical_bikini ", + "legwear": "pink shorts, single pink stocking", + "footwear": "combat boots", + "hands": "black fingerless gloves, fishnet elbow gloves,", + "accessories": "ammo belts, choker, bullet necklace," + } }, "styles": { "aesthetic": "punk, chaotic,", diff --git a/characters/kagamine_rin.json b/characters/kagamine_rin.json index 378c8d4..225eefe 100644 --- a/characters/kagamine_rin.json +++ b/characters/kagamine_rin.json @@ -5,25 +5,31 @@ "base_specs": "1girl, petite", "hair": "blonde hair, short hair, hair bow", "eyes": "blue eyes", - "expression": "smile, energetic", "hands": "", "arms": "detached sleeves", "torso": "flat chest", "pelvis": "", "legs": "leg warmers", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt, sailor collar", - "outer_layer": "", - "lower_body": "black shorts, yellow belt", - "footwear": "white shoes", - "gloves": "", - "accessories": "headset, hair bow" + "default": { + "headwear": "white shirt, sailor collar", + "top": "", + "legwear": "black shorts, yellow belt", + "footwear": "white shoes", + "hands": "", + "accessories": "headset, hair bow" + } }, "styles": { - "aesthetic": "vocaloid, cyber", + "aesthetic": "concert, stage, vocaloid, cyber", "primary_color": "yellow", "secondary_color": "white", "tertiary_color": "black" diff --git a/characters/kagari_atsuko.json b/characters/kagari_atsuko.json index 8cde169..941fd96 100644 --- a/characters/kagari_atsuko.json +++ b/characters/kagari_atsuko.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "long brown hair, half-ponytail, bangs", "eyes": "red eyes", - "expression": "determined smile", "hands": "", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "dark blue witch robes", - "lower_body": "dark blue skirt", - "footwear": "brown boots, white socks", - "gloves": "", - "accessories": "pointed witch hat, brown belt, magic wand" + "default": { + "headwear": "white shirt", + "top": "dark blue witch robes", + "legwear": "dark blue skirt", + "footwear": "brown boots, white socks", + "hands": "", + "accessories": "pointed witch hat, brown belt, magic wand" + } }, "styles": { "aesthetic": "fantasy, magical girl, little witch academia style", diff --git a/characters/kda_all_out_ahri.json b/characters/kda_all_out_ahri.json index ad7104d..f494ca8 100644 --- a/characters/kda_all_out_ahri.json +++ b/characters/kda_all_out_ahri.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin, fox ears", "hair": "long blonde hair, flowing", "eyes": "yellow eyes", - "expression": "charming smile", "hands": "silver nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "whisker markings on cheeks, crystal tails" + "extra": "whisker markings on cheeks, crystal tails" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "silver crop top", - "outer_layer": "white and silver jacket", - "lower_body": "black leather shorts", - "footwear": "black thigh-high boots", - "gloves": "", - "accessories": "crystal heart, silver jewelry" + "default": { + "headwear": "silver crop top", + "top": "white and silver jacket", + "legwear": "black leather shorts", + "footwear": "black thigh-high boots", + "hands": "", + "accessories": "crystal heart, silver jewelry" + } }, "styles": { "aesthetic": "pop star, mystical, k/da style", @@ -34,6 +40,9 @@ "lora_triggers": "" }, "tags": [ - "League of Legends", "K/DA", "KDA", "K-Pop" + "League of Legends", + "K/DA", + "KDA", + "K-Pop" ] } \ No newline at end of file diff --git a/characters/kda_all_out_akali.json b/characters/kda_all_out_akali.json index 3347ef3..45efdeb 100644 --- a/characters/kda_all_out_akali.json +++ b/characters/kda_all_out_akali.json @@ -5,22 +5,28 @@ "base_specs": "1girl, athletic build, fair skin", "hair": "long dark blue hair, blonde streaks, high ponytail", "eyes": "blue eyes", - "expression": "cool, rebellious look", "hands": "blue nails", "arms": "tattoos on arms", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black crop top", - "outer_layer": "blue and silver motorcycle jacket", - "lower_body": "black leather pants", - "footwear": "blue sneakers", - "gloves": "black fingerless gloves", - "accessories": "kama and kunai" + "default": { + "headwear": "black crop top", + "top": "blue and silver motorcycle jacket", + "legwear": "black leather pants", + "footwear": "blue sneakers", + "hands": "black fingerless gloves", + "accessories": "kama and kunai" + } }, "styles": { "aesthetic": "pop star, street, k/da style", @@ -34,6 +40,9 @@ "lora_triggers": "" }, "tags": [ - "League of Legends", "K/DA", "KDA", "K-Pop" + "League of Legends", + "K/DA", + "KDA", + "K-Pop" ] } \ No newline at end of file diff --git a/characters/kda_all_out_evelynn.json b/characters/kda_all_out_evelynn.json index adc6ef8..eca3f41 100644 --- a/characters/kda_all_out_evelynn.json +++ b/characters/kda_all_out_evelynn.json @@ -5,22 +5,28 @@ "base_specs": "1girl, curvaceous build, fair skin", "hair": "light blue hair,", "eyes": "yellow glowing eyes, slit pupils", - "expression": "seductive, confident look", "hands": "metal claws", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "two long lashers (shadow tendrils)" + "extra": "two long lashers (shadow tendrils)" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black leather bra", - "outer_layer": "iridescent blue jacket, fur collar", - "lower_body": "black leather skirt", - "footwear": "black high-heeled boots", - "gloves": "", - "accessories": "diamond earrings" + "default": { + "headwear": "black leather bra", + "top": "iridescent blue jacket, fur collar", + "legwear": "black leather skirt", + "footwear": "black high-heeled boots", + "hands": "", + "accessories": "diamond earrings" + } }, "styles": { "aesthetic": "pop star, glamorous, k/da style", @@ -34,6 +40,9 @@ "lora_triggers": "" }, "tags": [ - "League of Legends", "K/DA", "KDA", "K-Pop" + "League of Legends", + "K/DA", + "KDA", + "K-Pop" ] } \ No newline at end of file diff --git a/characters/kda_all_out_kaisa.json b/characters/kda_all_out_kaisa.json index 62852a3..3f6372f 100644 --- a/characters/kda_all_out_kaisa.json +++ b/characters/kda_all_out_kaisa.json @@ -5,22 +5,28 @@ "base_specs": "1girl, athletic build, fair skin", "hair": "long hair, purple hair, hair ornament, ponytail, green highlights", "eyes": "purple eyes", - "expression": "focused expression", "hands": "silver nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "silver bodysuit", - "outer_layer": "white and silver jacket", - "lower_body": "silver leggings", - "footwear": "silver high-heeled boots", - "gloves": "", - "accessories": "crystal shoulder pods" + "default": { + "headwear": "silver bodysuit", + "top": "white and silver jacket", + "legwear": "silver leggings", + "footwear": "silver high-heeled boots", + "hands": "", + "accessories": "crystal shoulder pods" + } }, "styles": { "aesthetic": "pop star, futuristic, k/da style", @@ -34,6 +40,9 @@ "lora_triggers": "" }, "tags": [ - "League of Legends", "K/DA", "KDA", "K-Pop" + "League of Legends", + "K/DA", + "KDA", + "K-Pop" ] } \ No newline at end of file diff --git a/characters/komi_shouko.json b/characters/komi_shouko.json index 1a0abcb..41eba7d 100644 --- a/characters/komi_shouko.json +++ b/characters/komi_shouko.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender build, pale skin, asian", "hair": "long dark purple hair, hime cut,", "eyes": "dark purple eyes,", - "expression": "neutral expression, stoic, cat ears", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "black pantyhose", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "itan private high school uniform, blazer, striped bow tie", - "lower_body": "plaid skirt", - "footwear": "loafers", - "gloves": "", - "accessories": "" + "default": { + "headwear": "white shirt", + "top": "itan private high school uniform, blazer, striped bow tie", + "legwear": "plaid skirt", + "footwear": "loafers", + "hands": "", + "accessories": "" + } }, "styles": { - "aesthetic": "anime, manga, clean lines", + "aesthetic": "blackboard,anime, manga, clean lines", "primary_color": "purple", "secondary_color": "magenta", "tertiary_color": "white" diff --git a/characters/lara_croft_classic.json b/characters/lara_croft_classic.json index 105f42c..2010af6 100644 --- a/characters/lara_croft_classic.json +++ b/characters/lara_croft_classic.json @@ -5,25 +5,31 @@ "base_specs": "1girl, athletic build,", "hair": "long brown hair, single braid", "eyes": "brown eyes", - "expression": "light smile, raised eyebrow", "hands": "", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "teal tank top,", - "lower_body": "brown shorts", - "footwear": "brown combat boots, red laces", - "gloves": "black fingerless gloves", - "accessories": "dual thigh pistol holsters, brown leatherbackpack, red circular sunglasses" + "default": { + "headwear": "", + "top": "teal tank top,", + "legwear": "brown shorts", + "footwear": "brown combat boots, red laces", + "hands": "black fingerless gloves", + "accessories": "dual thigh pistol holsters, brown leatherbackpack, red round sunglasses" + } }, "styles": { - "aesthetic": "adventure, retro, 90s style", + "aesthetic": "adventurer, ruins, retro, 90s style", "primary_color": "teal", "secondary_color": "brown", "tertiary_color": "black" diff --git a/characters/lisa_minci.json b/characters/lisa_minci.json index 7117869..a28c383 100644 --- a/characters/lisa_minci.json +++ b/characters/lisa_minci.json @@ -5,25 +5,31 @@ "base_specs": "1girl, tall, mature female", "hair": "brown hair, wavy hair, side ponytail", "eyes": "green eyes", - "expression": "seductive smile", "hands": "", "arms": "detached sleeves", "torso": "large breasts", "pelvis": "wide hips", "legs": "black pantyhose", "feet": "", - "distinguishing_marks": "beauty mark" + "extra": "beauty mark" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "purple dress, corset", - "outer_layer": "purple shawl", - "lower_body": "slit skirt", - "footwear": "black heels", - "gloves": "purple gloves", - "accessories": "witch hat, rose, necklace" + "default": { + "headwear": "purple dress, corset", + "top": "purple shawl", + "legwear": "slit skirt", + "footwear": "black heels", + "hands": "purple gloves", + "accessories": "witch hat, rose, necklace" + } }, "styles": { - "aesthetic": "genshin impact, witch, librarian", + "aesthetic": "library, genshin impact, witch", "primary_color": "purple", "secondary_color": "white", "tertiary_color": "gold" diff --git a/characters/lulu.json b/characters/lulu.json index 104377b..1551eb4 100644 --- a/characters/lulu.json +++ b/characters/lulu.json @@ -5,32 +5,38 @@ "base_specs": "1girl, curvaceous build, fair skin", "hair": "long black hair, complex braids, hairpins", "eyes": "red eyes", - "expression": "thinking, raised eyebrow", "hands": "black nails", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "dark purple lipstick" + "extra": "dark purple lipstick" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black corset", - "outer_layer": "black fur-trimmed dress, many belts on front", - "lower_body": "long skirt made of belts", - "footwear": "black boots", - "gloves": "", - "accessories": "moogle doll, silver jewelry" + "default": { + "headwear": "black corset", + "top": "black fur-trimmed dress, many belts on front", + "legwear": "long skirt made of belts", + "footwear": "black boots", + "hands": "", + "accessories": "moogle doll, silver jewelry" + } }, "styles": { - "aesthetic": "gothic, ornate, final fantasy x style", + "aesthetic": "exotic flowers, gothic, ornate, final fantasy x style", "primary_color": "black", "secondary_color": "white", "tertiary_color": "purple" }, "lora": { "lora_name": "Illustrious/Looks/Lulu DG illuLoRA_1337272.safetensors", - "lora_weight": 1.0, + "lora_weight": 0.9, "lora_triggers": "" }, "tags": [ diff --git a/characters/majin_android_21.json b/characters/majin_android_21.json index b66998f..cb00bed 100644 --- a/characters/majin_android_21.json +++ b/characters/majin_android_21.json @@ -5,32 +5,38 @@ "base_specs": "1girl, curvaceous build, pink skin", "hair": "long voluminous white hair", "eyes": "red eyes, black sclera", - "expression": "evil smile", "hands": "black claws, pink nails", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "pink skin, long tail, pointy ears" + "extra": "pink skin, long tail, pointy ears" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black tube top", - "outer_layer": "", - "lower_body": "white harem pants", - "footwear": "black and yellow boots", - "gloves": "black sleeves", - "accessories": "gold bracelets, gold neck ring, hoop earrings" + "default": { + "headwear": "black tube top", + "top": "", + "legwear": "white harem pants", + "footwear": "black and yellow boots", + "hands": "black sleeves", + "accessories": "gold bracelets, gold neck ring, hoop earrings,pink donut" + } }, "styles": { - "aesthetic": "supernatural, anime, dragon ball style", + "aesthetic": "wasteland,pink ,anime, dragon ball style", "primary_color": "pink", "secondary_color": "white", "tertiary_color": "gold" }, "lora": { - "lora_name": "", - "lora_weight": 1.0, + "lora_name": "Illustrious/Looks/Android_21v2.1.safetensors", + "lora_weight": 0.8, "lora_triggers": "" }, "tags": [ diff --git a/characters/marin_kitagawa.json b/characters/marin_kitagawa.json index c26c33e..5909f7c 100644 --- a/characters/marin_kitagawa.json +++ b/characters/marin_kitagawa.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender build, fair skin, asian", "hair": "long blonde hair, pink tips", "eyes": "pink eyes (contacts)", - "expression": "excited smile", "hands": "long pink nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "piercings" + "extra": "piercings" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "white school shirt, loosely tied blue tie", - "lower_body": "blue plaid miniskirt", - "footwear": "black loafers, black socks", - "gloves": "", - "accessories": "choker, various bracelets" + "default": { + "headwear": "black bikini with yellow flower print", + "top": "white school shirt, loosely tied blue tie", + "legwear": "blue plaid miniskirt", + "footwear": "black loafers, black socks", + "hands": "", + "accessories": "choker, colored bracelets" + } }, "styles": { - "aesthetic": "gyaru, modern, anime style", + "aesthetic": "gyaru, modern, anime style, sewing machine", "primary_color": "white", "secondary_color": "blue", "tertiary_color": "pink" diff --git a/characters/megurine_luka.json b/characters/megurine_luka.json index 0613b50..9df0142 100644 --- a/characters/megurine_luka.json +++ b/characters/megurine_luka.json @@ -5,25 +5,31 @@ "base_specs": "1girl, tall, mature female", "hair": "pink hair, long hair", "eyes": "blue eyes", - "expression": "light smile", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "crop top, detached sleeves, gold trim", - "lower_body": "side slit, lace-up skirt", - "footwear": "thinghighs, lace-up boots, gold boots, gold armlet", - "gloves": "", - "accessories": "headset" + "default": { + "headwear": "", + "top": "crop top, detached sleeves, gold trim", + "legwear": "side slit, lace-up skirt", + "footwear": "thinghighs, lace-up boots, gold boots, gold armlet", + "hands": "", + "accessories": "headset" + } }, "styles": { - "aesthetic": "vocaloid, elegant", + "aesthetic": "concert, stage,vocaloid, elegant", "primary_color": "black", "secondary_color": "gold", "tertiary_color": "pink" diff --git a/characters/meiko.json b/characters/meiko.json index 79b4c3d..023a733 100644 --- a/characters/meiko.json +++ b/characters/meiko.json @@ -5,25 +5,31 @@ "base_specs": "1girl, mature female", "hair": "brown hair, short hair", "eyes": "brown eyes", - "expression": "smile, confident", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "red crop top, sleeveless", - "outer_layer": "", - "lower_body": "red skirt, mini skirt", - "footwear": "brown boots", - "gloves": "", - "accessories": "choker" + "default": { + "headwear": "red crop top, sleeveless", + "top": "", + "legwear": "red skirt, mini skirt", + "footwear": "brown boots", + "hands": "", + "accessories": "choker" + } }, "styles": { - "aesthetic": "vocaloid, casual", + "aesthetic": "concert, stage, vocaloid, casual", "primary_color": "red", "secondary_color": "brown", "tertiary_color": "black" diff --git a/characters/nessa.json b/characters/nessa.json index 3fa76f2..f7b6fa4 100644 --- a/characters/nessa.json +++ b/characters/nessa.json @@ -5,32 +5,38 @@ "base_specs": "1girl, athletic build, dark skin", "hair": "long hair, light blue highlights", "eyes": "blue eyes", - "expression": "confident smile", "hands": "blue nails", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "blue earrings" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white and blue bikini top", - "outer_layer": "gym uniform, number 049", - "lower_body": "white and blue shorts", - "footwear": "blue and white sandals", - "gloves": "", - "accessories": "wristband, life buoy, pokeball" + "default": { + "headwear": "white crop top, blue trim", + "top": "gym uniform, number '049'", + "legwear": "midriff, white and blue shorts, black trim", + "footwear": "white and blue sandals, orange trim", + "hands": "fingerless gloves", + "accessories": "wristband, small life buoy, pokeball, gold hoop earrings" + } }, "styles": { - "aesthetic": "sporty, aquatic, pokemon style", + "aesthetic": "arena,water,aquatic, pokemon style", "primary_color": "blue", "secondary_color": "white", "tertiary_color": "orange" }, "lora": { - "lora_name": "", - "lora_weight": 1.0, + "lora_name": "Illustrious/Looks/NessaBeaIXL_v2.safetensors", + "lora_weight": 0.8, "lora_triggers": "" }, "tags": [ diff --git a/characters/olivier_mira_armstrong.json b/characters/olivier_mira_armstrong.json index f96dca4..6092da6 100644 --- a/characters/olivier_mira_armstrong.json +++ b/characters/olivier_mira_armstrong.json @@ -5,22 +5,28 @@ "base_specs": "1girl, tall, mature female", "hair": "blonde hair, long hair, hair over one eye", "eyes": "blue eyes, sharp eyes", - "expression": "serious", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "thick lips" + "extra": "thick lips" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black shirt", - "outer_layer": "blue military coat, fur collar", - "lower_body": "black pants", - "footwear": "black boots", - "gloves": "black gloves", - "accessories": "sword" + "default": { + "headwear": "black shirt", + "top": "blue military coat, fur collar", + "legwear": "black pants", + "footwear": "black boots", + "hands": "black gloves", + "accessories": "sword" + } }, "styles": { "aesthetic": "military, amestris uniform", diff --git a/characters/princess_peach.json b/characters/princess_peach.json index c3bd203..7b079f7 100644 --- a/characters/princess_peach.json +++ b/characters/princess_peach.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "long blonde hair, voluminous, crown", "eyes": "blue eyes, long eyelashes", - "expression": "gentle smile", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "pink lips, blue earrings" + "extra": "pink lips, blue earrings" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white petticoat", - "outer_layer": "pink floor-length ball gown, puffy sleeves, dark pink panniers", - "lower_body": "long skirt", - "footwear": "red high heels", - "gloves": "white opera gloves", - "accessories": "gold crown with red and blue jewels, blue brooch" + "default": { + "headwear": "white petticoat", + "top": "pink floor-length ball gown, puffy sleeves, dark pink panniers", + "legwear": "long skirt", + "footwear": "red high heels", + "hands": "white opera gloves", + "accessories": "gold crown with red and blue jewels, blue brooch" + } }, "styles": { "aesthetic": "royal, whimsical, nintendo style", diff --git a/characters/princess_zelda_botw.json b/characters/princess_zelda_botw.json index b5a9b60..df7cce3 100644 --- a/characters/princess_zelda_botw.json +++ b/characters/princess_zelda_botw.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin, pointed ears", "hair": "long blonde hair, braided, gold hair clips", "eyes": "green eyes", - "expression": "curious", "hands": "gold nails", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "tri-force symbol, elf ears" + "extra": "tri-force symbol, elf ears" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "blue tunic", - "outer_layer": "blue champion's tunic, brown leather belts", - "lower_body": "tan trousers", - "footwear": "brown leather boots", - "gloves": "brown fingerless gloves", - "accessories": "sheikah slate, gold jewelry" + "default": { + "headwear": "blue tunic", + "top": "blue champion's tunic, brown leather belts", + "legwear": "tan trousers", + "footwear": "brown leather boots", + "hands": "brown fingerless gloves", + "accessories": "sheikah slate, gold jewelry" + } }, "styles": { "aesthetic": "fantasy, adventurous, zelda style", @@ -29,8 +35,8 @@ "tertiary_color": "brown" }, "lora": { - "lora_name": "", - "lora_weight": 1.0, + "lora_name": "Illustrious/Looks/Zelda.safetensors", + "lora_weight": 0.8, "lora_triggers": "" }, "tags": [ diff --git a/characters/rice_shower.json b/characters/rice_shower.json index db03c31..9ff161b 100644 --- a/characters/rice_shower.json +++ b/characters/rice_shower.json @@ -5,25 +5,31 @@ "base_specs": "1girl, petite, horse ears, horse tail", "hair": "long dark brown hair, bangs, hair over one eye", "eyes": "purple eyes", - "expression": "shy expression", "hands": "", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white shirt", - "outer_layer": "tracen school uniform", - "lower_body": "pleated skirt", - "footwear": "heeled shoes", - "gloves": "", - "accessories": "blue rose, hair flower, small hat, dagger" + "default": { + "headwear": "white shirt", + "top": "tracen school uniform", + "legwear": "pleated skirt", + "footwear": "heeled shoes", + "hands": "", + "accessories": "blue rose, hair flower, small hat," + } }, "styles": { - "aesthetic": "gothic lolita, elegant", + "aesthetic": "outdoors,umbrella,rain,gothic lolita, elegant", "primary_color": "purple", "secondary_color": "blue", "tertiary_color": "black" diff --git a/characters/riju.json b/characters/riju.json index 57dcb30..a969e20 100644 --- a/characters/riju.json +++ b/characters/riju.json @@ -5,31 +5,37 @@ "base_specs": "1girl, young, dark skin, gerudo", "hair": "short red hair, braided ponytail, gold hair ornament", "eyes": "green eyes", - "expression": "serious", "hands": "", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "darkblue lipstick," + "extra": "dark blue lipstick," + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black top, blue sash", - "lower_body": "black skirt, pelvic curtain,", - "footwear": "gold high heels", - "gloves": "", - "accessories": "gold jewelry, earrings" + "default": { + "headwear": "", + "top": "black top, gold trim", + "legwear": "black sarong, pelvic curtain,", + "footwear": "black high heels, gold trim", + "hands": "", + "accessories": "gold jewelry, earrings," + } }, "styles": { - "aesthetic": "fantasy, desert, gerudo style", + "aesthetic": "lightning,fantasy, desert, gerudo, zelda style", "primary_color": "gold", "secondary_color": "black", "tertiary_color": "red" }, "lora": { - "lora_name": "", + "lora_name": "Illustrious/Looks/RijuTotK_IXL_v3.safetensors", "lora_weight": 0.8, "lora_triggers": "" }, diff --git a/characters/rosalina.json b/characters/rosalina.json index e1f196b..b8a501a 100644 --- a/characters/rosalina.json +++ b/characters/rosalina.json @@ -5,25 +5,31 @@ "base_specs": "1girl, tall, slender build, fair skin", "hair": "long platinum blonde hair, side-swept bangs covering one eye", "eyes": "light blue eyes", - "expression": "serene expression", "hands": "turquoise nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "star-shaped earrings" + "extra": "star-shaped earrings" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "turquoise off-the-shoulder gown, silver trim", - "lower_body": "long skirt", - "footwear": "silver high heels", - "gloves": "", - "accessories": "silver crown with blue jewels, star wand, luma" + "default": { + "headwear": "", + "top": "turquoise off-the-shoulder gown, silver trim", + "legwear": "long skirt", + "footwear": "silver high heels", + "hands": "", + "accessories": "silver crown with blue jewels, star wand, luma" + } }, "styles": { - "aesthetic": "celestial, elegant, nintendo style", + "aesthetic": "celestial, elegant, mario style, stars, night,", "primary_color": "turquoise", "secondary_color": "silver", "tertiary_color": "yellow" diff --git a/characters/rouge_the_bat.json b/characters/rouge_the_bat.json index 550c014..c964b8e 100644 --- a/characters/rouge_the_bat.json +++ b/characters/rouge_the_bat.json @@ -5,25 +5,31 @@ "base_specs": "1girl, anthro, bat girl, white fur", "hair": "short white hair", "eyes": "teal eyes", - "expression": "sly smirk", "hands": "white gloves", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "bat wings, eyeshadow" + "extra": "bat wings, eyeshadow" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black skin-tight jumpsuit, pink heart-shaped chest plate, bare shoulders, cleavage", - "lower_body": "jumpsuit", - "footwear": "white boots, pink heart motifs", - "gloves": "white gloves, pink cuffs", - "accessories": "blue eyeshadow" + "default": { + "headwear": "", + "top": "black skin-tight jumpsuit, pink heart-shaped chest plate, bare shoulders, cleavage", + "legwear": "jumpsuit", + "footwear": "white boots, pink heart motifs", + "hands": "white gloves, pink cuffs", + "accessories": "blue eyeshadow" + } }, "styles": { - "aesthetic": "jewels, museum,sleek, spy, sonic style", + "aesthetic": "gems,jewels, sleek, spy, sonic style", "primary_color": "white", "secondary_color": "pink", "tertiary_color": "black" diff --git a/characters/ryouko_hakubi.json b/characters/ryouko_hakubi.json index 9a637f4..e6d02b5 100644 --- a/characters/ryouko_hakubi.json +++ b/characters/ryouko_hakubi.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slim build,", "hair": "long teal hair, spiky, voluminous", "eyes": "golden eyes, cat-like pupils", - "expression": "confident smirk", "hands": "", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "red gem on forehead," + "extra": "red gem on forehead," + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "long white dress, plunging neckline, black belt", - "outer_layer": "black and orange long sleeve jacket with purple trim,", - "lower_body": "side_slit,, red trousers", - "footwear": "", - "gloves": "red gloves", - "accessories": "red gems, wristbands" + "default": { + "headwear": "long white dress, plunging neckline, black belt", + "top": "black and orange long sleeve jacket with purple trim,", + "legwear": "side_slit,, red trousers", + "footwear": "", + "hands": "red gloves", + "accessories": "red gems, wristbands" + } }, "styles": { "aesthetic": "90s anime, sci-fi", @@ -34,6 +40,7 @@ "lora_triggers": "ryouko hakubi, space pirate" }, "tags": [ - "Tenchi Muyou!", "Tenchi Muyo!" + "Tenchi Muyou!", + "Tenchi Muyo!" ] } \ No newline at end of file diff --git a/characters/sam_totally_spies.json b/characters/sam_totally_spies.json new file mode 100644 index 0000000..99f464e --- /dev/null +++ b/characters/sam_totally_spies.json @@ -0,0 +1,49 @@ +{ + "character_id": "sam_totally_spies", + "character_name": "Sam", + "identity": { + "base_specs": "1girl, slim body, fair skin", + "hair": "long hair, orange hair, wavy hair, loose hair", + "eyes": "green eyes", + "hands": "green nails", + "arms": "", + "torso": "small breasts", + "pelvis": "narrow hips", + "legs": "", + "feet": "", + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "default": { + "headwear": "green bodysuit, catsuit, skin tight", + "top": "", + "legwear": "", + "footwear": "heels ", + "hands": "green bodysuit", + "accessories": "silver belt, heart buckle" + } + }, + "styles": { + "aesthetic": "western cartoon, 2000s style, cel shaded, girly, hearts, pastel", + "primary_color": "green", + "secondary_color": "orange", + "tertiary_color": "silver" + }, + "lora": { + "lora_name": "", + "lora_weight": 0.8, + "lora_triggers": "sam (totally spies!), green bodysuit, orange hair" + }, + "tags": [ + "sam (totally spies!)", + "totally spies!", + "solo", + "western cartoon", + "spy" + ] +} \ No newline at end of file diff --git a/characters/samus_aran_zero_suit.json b/characters/samus_aran_zero_suit.json index 3f3234f..fccdb7e 100644 --- a/characters/samus_aran_zero_suit.json +++ b/characters/samus_aran_zero_suit.json @@ -5,22 +5,28 @@ "base_specs": "1girl, athletic build, fair skin", "hair": "long blonde hair, ponytail", "eyes": "blue eyes", - "expression": "serious expression", "hands": "blue nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "beauty mark on chin" + "extra": "beauty mark on chin" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "blue skin-tight bodysuit, pink symbols", - "lower_body": "bodysuit", - "footwear": "blue high-heeled boots", - "gloves": "zero suit", - "accessories": "paralyzer pistol" + "default": { + "headwear": "", + "top": "blue skin-tight bodysuit, pink symbols", + "legwear": "bodysuit", + "footwear": "blue high-heeled boots", + "hands": "zero suit", + "accessories": "paralyzer pistol" + } }, "styles": { "aesthetic": "sci-fi, sleek, metroid style", diff --git a/characters/sarah_miller.json b/characters/sarah_miller.json index 70325f3..a96ae24 100644 --- a/characters/sarah_miller.json +++ b/characters/sarah_miller.json @@ -5,32 +5,38 @@ "base_specs": "1girl, loli, small build", "hair": "blonde hair, short hair", "eyes": "blue eyes", - "expression": "smile", "hands": "", "arms": "", "torso": "flat chest", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "grey t-shirt, white shirt", - "outer_layer": "", - "lower_body": "blue jeans", - "footwear": "sneakers", - "gloves": "", - "accessories": "wristwatch" + "default": { + "headwear": "grey t-shirt, white shirt", + "top": "", + "legwear": "blue jeans", + "footwear": "sneakers", + "hands": "", + "accessories": "wristwatch" + } }, "styles": { - "aesthetic": "casual, 2013 fashion", + "aesthetic": "casual, 2013 fashion, living room", "primary_color": "grey", "secondary_color": "blue", "tertiary_color": "white" }, "lora": { - "lora_name": "", - "lora_weight": 1.0, + "lora_name": "Illustrious/Looks/Sarah_Miller_Illustrious.safetensors", + "lora_weight": 0.8, "lora_triggers": "" }, "tags": [ diff --git a/characters/scarlet_ff7.json b/characters/scarlet_ff7.json new file mode 100644 index 0000000..c706488 --- /dev/null +++ b/characters/scarlet_ff7.json @@ -0,0 +1,51 @@ +{ + "character_id": "scarlet_ff7", + "character_name": "Scarlet", + "identity": { + "base_specs": "1girl, mature female, voluptuous, ", + "hair": "blonde hair, wavy hair, short hair, swept back", + "eyes": "blue eyes, narrow eyes, eyeshadow", + "hands": "manicured nails, red nails", + "arms": "", + "torso": "large breasts, cleavage", + "pelvis": "curvy, wide hips", + "legs": "", + "feet": "", + "extra": "red lipstick, heavy makeup" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "default": { + "headwear": "", + "top": "red dress, formal dress, pencil dress, sleeveless, chest cutout", + "legwear": "long skirt, high slit, side slit,black stockings", + "footwear": "high heels, red heels, stiletto heels", + "hands": "", + "accessories": "jewelry, gold earrings, necklace" + } + }, + "styles": { + "aesthetic": "corporate, sci-fi, low lighting", + "primary_color": "red", + "secondary_color": "gold", + "tertiary_color": "black" + }, + "lora": { + "lora_name": "Illustrious/Looks/ffscarlet-illu-nvwls-v2.safetensors", + "lora_weight": 0.8, + "lora_triggers": "" + }, + "tags": [ + "final fantasy vii", + "shinra", + "antagonist", + "milf", + "red dress", + "blonde hair", + "smirk" + ] +} \ No newline at end of file diff --git a/characters/shantae.json b/characters/shantae.json index 1820bdc..5e9c0e6 100644 --- a/characters/shantae.json +++ b/characters/shantae.json @@ -5,22 +5,28 @@ "base_specs": "1girl, dark skin, pointy ears", "hair": "purple hair, very long hair, ponytail", "eyes": "blue eyes", - "expression": "smile, energetic", "hands": "", "arms": "gold bracelets", "torso": "small breasts, perky breasts", "pelvis": "wide hips", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "red bikini top, red harem pants, gold trim", - "lower_body": "", - "footwear": "gold shoes", - "gloves": "", - "accessories": "gold tiara, hoop earrings" + "default": { + "headwear": "", + "top": "red bikini top, red harem pants, gold trim", + "legwear": "", + "footwear": "gold shoes", + "hands": "", + "accessories": "gold tiara, hoop earrings" + } }, "styles": { "aesthetic": "genie, dancer, arabian", diff --git a/characters/sorceress_dragons_crown.json b/characters/sorceress_dragons_crown.json new file mode 100644 index 0000000..f5daaa0 --- /dev/null +++ b/characters/sorceress_dragons_crown.json @@ -0,0 +1,46 @@ +{ + "character_id": "sorceress_dragons_crown", + "character_name": "Sorceress", + "identity": { + "base_specs": "1girl, mature female,", + "hair": "long hair, red hair, wavy hair", + "eyes": "green eyes, ", + "hands": "painted nails", + "arms": "bare shoulders, sleeveless", + "torso": "huge breasts, cleavage, ", + "pelvis": "wide hips, ", + "legs": "thick thighs, ", + "feet": "", + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "default": { + "headwear": "white top", + "top": "black corset,, clothing cutout, low cut, witch hat", + "legwear": "skirt, high slit, side slit", + "footwear": "boots, ", + "hands": "", + "accessories": "staff, necklace, bracelets, jewelry, wooden staff" + } + }, + "styles": { + "aesthetic": "fantasy, vanillaware, oil painting (style), exaggerated proportions", + "primary_color": "black", + "secondary_color": "purple", + "tertiary_color": "gold" + }, + "lora": { + "lora_name": "Illustrious/Looks/Sorceress iIlluLoRA DG.safetensors", + "lora_weight": 0.8, + "lora_triggers": "" + }, + "tags": [ + "dragon's crown", + "witch" + ] +} \ No newline at end of file diff --git a/characters/sucy_manbavaran.json b/characters/sucy_manbavaran.json index 5a4d3ee..b3cec1b 100644 --- a/characters/sucy_manbavaran.json +++ b/characters/sucy_manbavaran.json @@ -5,25 +5,31 @@ "base_specs": "1girl, lanky build, pale skin", "hair": "light purple hair, hair covering one eye", "eyes": "red eyes", - "expression": "deadpan expression", "hands": "black nails", "arms": "", "torso": "small breasts", "pelvis": "narrow waist", "legs": "", "feet": "", - "distinguishing_marks": "dark circles under eyes" + "extra": "dark circles under eyes" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "dark purple witch robes", - "lower_body": "long skirt with frayed edges", - "footwear": "brown boots", - "gloves": "", - "accessories": "pointed witch hat, potion bottle" + "default": { + "headwear": "", + "top": "dark purple witch robes", + "legwear": "long skirt with frayed edges", + "footwear": "brown boots", + "hands": "", + "accessories": "pointed witch hat, potion bottle" + } }, "styles": { - "aesthetic": "gothic, whimsical, little witch academia style", + "aesthetic": "mushroom, gothic, whimsical, little witch academia style", "primary_color": "purple", "secondary_color": "mauve", "tertiary_color": "green" diff --git a/characters/tifa_lockhart.json b/characters/tifa_lockhart.json index b088cbb..5e3283d 100644 --- a/characters/tifa_lockhart.json +++ b/characters/tifa_lockhart.json @@ -5,25 +5,31 @@ "base_specs": "1girl, athletic build, fair skin", "hair": "long black hair, tied end", "eyes": "red eyes", - "expression": "kind smile", "hands": "dark red nails", "arms": "", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "black sports bra", - "outer_layer": "white tank top, black suspenders", - "lower_body": "black miniskirt", - "footwear": "red boots, black socks", - "gloves": "red fingerless gloves", - "accessories": "silver earrings" + "default": { + "headwear": "black sports bra", + "top": "white tank top, black suspenders", + "legwear": "black miniskirt", + "footwear": "red boots, thigh high black socks", + "hands": "red fingerless gloves", + "accessories": "silver earrings" + } }, "styles": { - "aesthetic": "urban, martial arts, final fantasy style", + "aesthetic": "martial arts, final fantasy style", "primary_color": "white", "secondary_color": "black", "tertiary_color": "red" diff --git a/characters/tracer.json b/characters/tracer.json index 4ca535e..93eaabf 100644 --- a/characters/tracer.json +++ b/characters/tracer.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "short spiky brown hair", "eyes": "brown eyes", - "expression": "energetic smile", "hands": "", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "freckles" + "extra": "freckles" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "orange leggings", - "outer_layer": "brown flight jacket, yellow vest", - "lower_body": "orange leggings", - "footwear": "white and orange sneakers", - "gloves": "", - "accessories": "chronal accelerator, yellow goggles" + "default": { + "headwear": "orange leggings", + "top": "brown flight jacket, yellow vest", + "legwear": "orange leggings", + "footwear": "white and orange sneakers", + "hands": "", + "accessories": "chronal accelerator, yellow goggles" + } }, "styles": { "aesthetic": "sci-fi, pilot, overwatch style", diff --git a/characters/urbosa.json b/characters/urbosa.json index c51bc28..a267f4a 100644 --- a/characters/urbosa.json +++ b/characters/urbosa.json @@ -5,31 +5,37 @@ "base_specs": "1girl, tall, muscular, dark skin, gerudo", "hair": "long red hair, wild hair", "eyes": "green eyes", - "expression": "confident", "hands": "gold nails", "arms": "muscular arms", - "torso": "abs, mediumS breasts", + "torso": "abs, medium breasts", "pelvis": "wide hips", "legs": "muscular legs", "feet": "", - "distinguishing_marks": "dark blue lipstick, gerudo markings" + "extra": "dark blue lipstick, gerudo markings" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "blue top, blue champion's skirt, green sash, green shoulder guards,", - "lower_body": "blue skirt", - "footwear": "gold heels", - "gloves": "", - "accessories": "gold jewelry, scimitar" + "default": { + "headwear": "", + "top": "blue top, green sash, green shoulder guards,", + "legwear": "blue sarong", + "footwear": "anklet, gold heels", + "hands": "", + "accessories": "gold jewelry, scimitar" + } }, "styles": { - "aesthetic": "fantasy, warrior, gerudo style", + "aesthetic": "oasis,desert ruins,fantasy, warrior, gerudo style", "primary_color": "gold", "secondary_color": "blue", "tertiary_color": "red" }, "lora": { - "lora_name": "", + "lora_name": "Illustrious/Looks/Urbosa_-_The_Legend_of_Zelda_Illustrious.safetensors", "lora_weight": 0.8, "lora_triggers": "" }, diff --git a/characters/widowmaker.json b/characters/widowmaker.json index ebdb77d..1162ee2 100644 --- a/characters/widowmaker.json +++ b/characters/widowmaker.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, blue skin", "hair": "long purple hair, ponytail", "eyes": "yellow eyes", - "expression": "cold expression", "hands": "", "arms": "spider tattoo on arm", "torso": "large breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "blue skin" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "purple tactical bodysuit, plunging neckline", - "lower_body": "bodysuit", - "footwear": "purple high-heeled boots", - "gloves": "purple gauntlets", - "accessories": "sniper visor, grappling hook" + "default": { + "headwear": "", + "top": "purple bodysuit, plunging neckline", + "legwear": "bodysuit", + "footwear": "purple high-heeled boots", + "hands": "purple gauntlets", + "accessories": "sniper rifle, visor" + } }, "styles": { "aesthetic": "sci-fi, assassin, overwatch style", diff --git a/characters/yor_briar.json b/characters/yor_briar.json index e9deda7..ea6190e 100644 --- a/characters/yor_briar.json +++ b/characters/yor_briar.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "long black hair, styled with gold headband", "eyes": "red eyes", - "expression": "gentle yet mysterious smile", "hands": "black nails", "arms": "", "torso": "medium breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black backless halter dress, red rose pattern inside", - "lower_body": "black thigh-high boots", - "footwear": "black boots", - "gloves": "black fingerless gloves", - "accessories": "gold rose-themed headband, gold needle weapons" + "default": { + "headwear": "", + "top": "black backless halter dress, red rose pattern inside", + "legwear": "black thigh-high boots", + "footwear": "black boots", + "hands": "black fingerless gloves", + "accessories": "gold rose-themed headband, gold needle weapons" + } }, "styles": { "aesthetic": "elegant, assassin, spy x family style", diff --git a/characters/yshtola_rhul.json b/characters/yshtola_rhul.json index 6764142..79e8d27 100644 --- a/characters/yshtola_rhul.json +++ b/characters/yshtola_rhul.json @@ -5,25 +5,31 @@ "base_specs": "1girl, miqo'te, slender build, fair skin, cat ears", "hair": "short white hair, bangs", "eyes": "blind, white eyes", - "expression": "stoic expression", "hands": "black nails", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "facial markings, cat tail" + "extra": "facial markings, cat tail" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "black sorceress robes, fur trim", - "lower_body": "long skirt", - "footwear": "black boots", - "gloves": "", - "accessories": "wooden staff" + "default": { + "headwear": "", + "top": "black sorceress robes, fur trim", + "legwear": "long skirt", + "footwear": "black boots", + "hands": "", + "accessories": "wooden staff" + } }, "styles": { - "aesthetic": "magical, scholarly, final fantasy xiv style", + "aesthetic": "library, magical, scholarly, final fantasy xiv style", "primary_color": "black", "secondary_color": "white", "tertiary_color": "purple" @@ -34,6 +40,7 @@ "lora_triggers": "" }, "tags": [ - "Final Fantasy XIV" + "Final Fantasy XIV", + "mi'qote" ] } \ No newline at end of file diff --git a/characters/yuffie_kisaragi.json b/characters/yuffie_kisaragi.json index a8eda5b..f29de81 100644 --- a/characters/yuffie_kisaragi.json +++ b/characters/yuffie_kisaragi.json @@ -5,22 +5,28 @@ "base_specs": "1girl, slender build, fair skin", "hair": "short black hair, bob cut", "eyes": "brown eyes", - "expression": "playful grin", "hands": "", "arms": "black sleeve on one arm", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "headband" + "extra": "headband" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "", - "outer_layer": "green turtleneck sweater vest, midriff", - "lower_body": "beige shorts", - "footwear": "boots, socks", - "gloves": "fingerless glove on one hand, large gauntlet on one arm", - "accessories": "shuriken" + "default": { + "headwear": "", + "top": "green turtleneck sweater vest, midriff", + "legwear": "beige shorts", + "footwear": "boots, socks", + "hands": "fingerless glove on one hand, large gauntlet on one arm", + "accessories": "shuriken" + } }, "styles": { "aesthetic": "ninja, adventurer, final fantasy style", diff --git a/characters/yuna_ffx.json b/characters/yuna_ffx.json index f1567d1..1e35e6c 100644 --- a/characters/yuna_ffx.json +++ b/characters/yuna_ffx.json @@ -5,25 +5,31 @@ "base_specs": "1girl, slender, fair skin", "hair": "short brown hair, bob cut", "eyes": "heterochromia, blue eye, green eye", - "expression": "gentle", "hands": "", "arms": "", "torso": "small breasts", "pelvis": "", "legs": "", "feet": "", - "distinguishing_marks": "" + "extra": "" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" }, "wardrobe": { - "inner_layer": "white kimono top, yellow obi", - "outer_layer": "", - "lower_body": "long blue skirt, floral pattern", - "footwear": "boots", - "gloves": "detached sleeves", - "accessories": "summoner staff, necklace" + "default": { + "headwear": "white kimono top, yellow obi", + "top": "", + "legwear": "long blue skirt, floral pattern", + "footwear": "boots", + "hands": "detached sleeves", + "accessories": "summoner staff, necklace" + } }, "styles": { - "aesthetic": "fantasy, final fantasy x style", + "aesthetic": "sunset, pink sky, shrine maiden,fantasy, final fantasy x style", "primary_color": "white", "secondary_color": "blue", "tertiary_color": "yellow" diff --git a/launch.sh b/launch.sh index eee3e5b..0c3c659 100644 --- a/launch.sh +++ b/launch.sh @@ -17,7 +17,7 @@ source "$VENV_DIR/bin/activate" if [ "$1" == "--clean" ]; then echo "Performing clean start..." echo "Removing database..." - rm -f database.db + rm -f database.db instance/database.db echo "Clearing uploads..." rm -rf static/uploads/* fi diff --git a/migrate_wardrobe.py b/migrate_wardrobe.py new file mode 100644 index 0000000..1baf162 --- /dev/null +++ b/migrate_wardrobe.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +""" +Migration script to convert wardrobe structure from flat to nested format. + +Before: + "wardrobe": { + "headwear": "...", + "top": "...", + ... + } + +After: + "wardrobe": { + "default": { + "headwear": "...", + "top": "...", + ... + } + } + +This enables multiple outfits per character. +""" + +import os +import json +from pathlib import Path + + +def migrate_wardrobe(characters_dir: str = "characters", dry_run: bool = False): + """ + Migrate all character JSON files to the new wardrobe structure. + + Args: + characters_dir: Path to the directory containing character JSON files + dry_run: If True, only print what would be changed without modifying files + """ + characters_path = Path(characters_dir) + + if not characters_path.exists(): + print(f"Error: Directory '{characters_dir}' does not exist") + return + + json_files = list(characters_path.glob("*.json")) + + if not json_files: + print(f"No JSON files found in '{characters_dir}'") + return + + migrated_count = 0 + skipped_count = 0 + error_count = 0 + + for json_file in json_files: + try: + with open(json_file, 'r', encoding='utf-8') as f: + data = json.load(f) + + # Check if character has a wardrobe + if 'wardrobe' not in data: + print(f" [SKIP] {json_file.name}: No wardrobe field") + skipped_count += 1 + continue + + wardrobe = data['wardrobe'] + + # Check if already migrated (wardrobe contains 'default' key with nested dict) + if 'default' in wardrobe and isinstance(wardrobe['default'], dict): + # Verify it's actually the new format (has wardrobe keys inside) + expected_keys = {'headwear', 'top', 'legwear', 'footwear', 'hands', 'accessories', + 'inner_layer', 'outer_layer', 'lower_body', 'gloves'} + if any(key in wardrobe['default'] for key in expected_keys): + print(f" [SKIP] {json_file.name}: Already migrated") + skipped_count += 1 + continue + + # Check if wardrobe is a flat structure (not already nested) + # A flat wardrobe has string values, a nested one has dict values + if not isinstance(wardrobe, dict): + print(f" [ERROR] {json_file.name}: Wardrobe is not a dictionary") + error_count += 1 + continue + + # Check if any value is a dict (indicating partial migration or different structure) + has_nested_values = any(isinstance(v, dict) for v in wardrobe.values()) + if has_nested_values: + print(f" [SKIP] {json_file.name}: Wardrobe has nested values, may already be migrated") + skipped_count += 1 + continue + + # Perform migration + new_wardrobe = { + "default": wardrobe + } + data['wardrobe'] = new_wardrobe + + if dry_run: + print(f" [DRY-RUN] {json_file.name}: Would migrate wardrobe") + print(f" Old: {json.dumps(wardrobe, indent=2)[:100]}...") + print(f" New: {json.dumps(new_wardrobe, indent=2)[:100]}...") + else: + with open(json_file, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2, ensure_ascii=False) + print(f" [MIGRATED] {json_file.name}") + + migrated_count += 1 + + except json.JSONDecodeError as e: + print(f" [ERROR] {json_file.name}: Invalid JSON - {e}") + error_count += 1 + except Exception as e: + print(f" [ERROR] {json_file.name}: {e}") + error_count += 1 + + print() + print("=" * 50) + print(f"Migration complete:") + print(f" - Migrated: {migrated_count}") + print(f" - Skipped: {skipped_count}") + print(f" - Errors: {error_count}") + if dry_run: + print() + print("This was a dry run. No files were modified.") + print("Run with --execute to apply changes.") + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser( + description="Migrate character wardrobe structure to support multiple outfits" + ) + parser.add_argument( + "--execute", + action="store_true", + help="Actually modify files (default is dry-run)" + ) + parser.add_argument( + "--dir", + default="characters", + help="Directory containing character JSON files (default: characters)" + ) + + args = parser.parse_args() + + print("=" * 50) + print("Wardrobe Migration Script") + print("=" * 50) + print(f"Directory: {args.dir}") + print(f"Mode: {'EXECUTE' if args.execute else 'DRY-RUN'}") + print("=" * 50) + print() + + migrate_wardrobe(characters_dir=args.dir, dry_run=not args.execute) diff --git a/models.py b/models.py index f9d0f36..a7b8de4 100644 --- a/models.py +++ b/models.py @@ -6,10 +6,38 @@ class Character(db.Model): id = db.Column(db.Integer, primary_key=True) character_id = db.Column(db.String(100), unique=True, nullable=False) slug = db.Column(db.String(100), unique=True, nullable=False) + filename = db.Column(db.String(255), nullable=True) name = db.Column(db.String(100), nullable=False) data = db.Column(db.JSON, nullable=False) default_fields = db.Column(db.JSON, nullable=True) image_path = db.Column(db.String(255), nullable=True) + active_outfit = db.Column(db.String(100), default='default') + + def get_active_wardrobe(self): + """Get the currently active wardrobe outfit.""" + wardrobe = self.data.get('wardrobe', {}) + # Check if wardrobe is nested (new format) or flat (legacy) + if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict): + # New nested format - return active outfit + return wardrobe.get(self.active_outfit or 'default', wardrobe.get('default', {})) + else: + # Legacy flat format - return as-is + return wardrobe + + def get_available_outfits(self): + """Get list of available outfit names.""" + wardrobe = self.data.get('wardrobe', {}) + if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict): + return list(wardrobe.keys()) + return ['default'] def __repr__(self): return f'' + +class Settings(db.Model): + id = db.Column(db.Integer, primary_key=True) + openrouter_api_key = db.Column(db.String(255), nullable=True) + openrouter_model = db.Column(db.String(100), default='google/gemini-2.0-flash-001') + + def __repr__(self): + return '' diff --git a/templates/create.html b/templates/create.html new file mode 100644 index 0000000..e077953 --- /dev/null +++ b/templates/create.html @@ -0,0 +1,40 @@ +{% extends "layout.html" %} + +{% block content %} +
+
+
+
+
Create New Character
+
+
+
+ + +
+ +
+ + +
Used for the JSON file and URL. No spaces or special characters.
+
+ +
+ + +
+ +
+ Once created, the system will automatically attempt to generate a cover image using the new profile. +
+ +
+ +
+
+
+
+
+
+
+{% endblock %} diff --git a/templates/detail.html b/templates/detail.html index 2e29e5d..2070c36 100644 --- a/templates/detail.html +++ b/templates/detail.html @@ -79,13 +79,77 @@
-

{{ character.name }}

+
+

{{ character.name }}

+ Edit Profile +
Back to Gallery
+ + {% set outfits = character.get_available_outfits() %} + {% if outfits|length > 1 %} +
+
+ Active Outfit + {{ character.active_outfit or 'default' }} +
+
+
+
+ +
+
+ +
+
+
+
+ {% endif %} +
{% for section, details in character.data.items() %} - {% if section not in ['character_id', 'tags', 'name'] and details is mapping %} + {% if section == 'wardrobe' %} + {# Special handling for wardrobe - show active outfit #} + {% set active_wardrobe = character.get_active_wardrobe() %} +
+
+ + Wardrobe + {% if outfits|length > 1 %} + {{ character.active_outfit or 'default' }} + {% endif %} + + {% if outfits|length > 1 %} + Manage Outfits + {% endif %} +
+
+
+ {% for key, value in active_wardrobe.items() %} +
+ + {{ key.replace('_', ' ') }} +
+
{{ value if value else '--' }}
+ {% endfor %} +
+
+
+ {% elif section not in ['character_id', 'tags', 'name'] and details is mapping %}
{{ section.replace('_', ' ') }}
diff --git a/templates/edit.html b/templates/edit.html new file mode 100644 index 0000000..50c5179 --- /dev/null +++ b/templates/edit.html @@ -0,0 +1,240 @@ +{% extends "layout.html" %} + +{% block content %} +
+
+

Edit Profile: {{ character.name }}

+ Cancel +
+ + +
+
+ +
+
Basic Information
+
+
+ + +
+
+ + +
+
+
+ + +
+
LoRA Settings
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + + {% if character.data.identity %} +
+
Identity
+
+ {% for key, value in character.data.identity.items() %} +
+ + +
+ {% endfor %} +
+
+ {% endif %} + + + {% if character.data.defaults %} +
+
Defaults
+
+ {% for key, value in character.data.defaults.items() %} +
+ + +
+ {% endfor %} +
+
+ {% endif %} + + +
+
+ Wardrobe + +
+
+ {% set wardrobe_data = character.data.wardrobe %} + {% set outfits = character.get_available_outfits() %} + {% if wardrobe_data.default is defined and wardrobe_data.default is mapping %} + {# New nested format - show tabs for each outfit #} + +
+ {% for outfit_name in outfits %} +
+
+ {% if outfit_name != 'default' %} +
+ + + + + +
+ {% endif %} +
+ {% for key, value in wardrobe_data[outfit_name].items() %} +
+ + +
+ {% endfor %} +
+ {% endfor %} +
+ {% else %} + {# Legacy flat format #} + {% for key, value in wardrobe_data.items() %} +
+ + +
+ {% endfor %} + {% endif %} +
+
+ + + {% if character.data.styles %} +
+
Styles
+
+ {% for key, value in character.data.styles.items() %} +
+ + +
+ {% endfor %} +
+
+ {% endif %} + +
+ +
+
+ +
+
+
+
Notice
+
+

Saving changes here will overwrite the original JSON file in the characters/ folder.

+

Character ID ({{ character.character_id }}) cannot be changed via the GUI to maintain file and URL consistency.

+
+

Outfits: Add multiple outfits using the "Add Outfit" button in the Wardrobe section. Switch between them on the character detail page.

+
+
+
+
+
+ +
+ + + + + + + + +{% endblock %} diff --git a/templates/layout.html b/templates/layout.html index b4cbe7f..b5f4544 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -18,7 +18,9 @@ diff --git a/templates/settings.html b/templates/settings.html new file mode 100644 index 0000000..e32bd3a --- /dev/null +++ b/templates/settings.html @@ -0,0 +1,96 @@ +{% extends "layout.html" %} + +{% block content %} +
+
+
+
+
Application Settings
+
+
+
LLM Configuration (OpenRouter)
+ +
+ +
+ + +
+
Required for AI text generation features.
+
+ +
+ + +
Click "Connect" above to load the latest available models.
+
+ +
+ +
+
+
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %}