diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-06 17:21:52 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-06 17:21:52 +0300 |
| commit | 13d4f703e45dad9d611b7b720b0148e08e1409a3 (patch) | |
| tree | fa7f19f8c68ac0d43e62b6780d081cad5caf1e61 /internal/story | |
| parent | 00488c7e8d7e93406c3bcf2264d7c7239c3a5516 (diff) | |
feat: mandatory speech bubbles in story panels, v0.26.0v0.26.0
Two-part fix for missing dialogue bubbles:
1. Panel script prompt: each panel description must include quoted Bulgarian
dialogue for the character to speak/think. At least 3 of 4 panels per page
must have speech or thought text in the description.
2. Image prompt: added MANDATORY SPEECH BUBBLES block requiring at least 3 of 4
panels to contain a bubble, describing exact white-background/black-outline
style for speech and cloud-shape for thought bubbles, all text Bulgarian Cyrillic.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/story')
| -rw-r--r-- | internal/story/artist.go | 6 | ||||
| -rw-r--r-- | internal/story/generator.go | 15 |
2 files changed, 15 insertions, 6 deletions
diff --git a/internal/story/artist.go b/internal/story/artist.go index 3c66978..4ae0a6f 100644 --- a/internal/story/artist.go +++ b/internal/story/artist.go @@ -551,6 +551,12 @@ func buildStoryPagePrompt(section string, pageNum, totalPages int, style, bible "Each panel is separated by a thin black gutter line. "+ "All 4 panels must be clearly distinct scenes — NOT one continuous image. "+ "The full image area must be covered by the 4 panels with no empty space.\n"+ + "MANDATORY SPEECH BUBBLES — this is a comic book; characters MUST speak:\n"+ + " • At least 3 of the 4 panels MUST contain a speech bubble or thought bubble.\n"+ + " • If the panel description includes quoted dialogue, render it EXACTLY inside a speech bubble.\n"+ + " • Speech bubbles have a white background, black outline, and a tail pointing to the speaker.\n"+ + " • Thought bubbles use a cloud shape with small circles leading to the thinker.\n"+ + " • ALL bubble text is in Bulgarian Cyrillic — never Roman letters.\n"+ "VARIETY MANDATE — every panel MUST differ from the others in at least 3 of these dimensions: "+ "camera angle (close-up, medium shot, wide shot, bird's-eye, low angle), "+ "character pose or action, location or background detail, lighting or time-of-day, "+ diff --git a/internal/story/generator.go b/internal/story/generator.go index a272893..5c4c671 100644 --- a/internal/story/generator.go +++ b/internal/story/generator.go @@ -359,16 +359,19 @@ func buildPanelScriptPrompt() string { "one per line, in strict chronological story order.\n" + "Format each line exactly as: P{page}-{panel}: {description}\n" + "where page is 1–5 and panel is A (top-left), B (top-right), C (bottom-left), D (bottom-right).\n" + - "Each description is 1–2 sentences: WHO is in the panel, WHAT they are doing, " + - "WHERE they are, and their expression or body language. Be vivid and specific.\n" + + "Each description is 1–2 sentences covering: WHO is in the panel, WHAT they are doing, " + + "WHERE they are, their expression or body language, and — REQUIRED for most panels — " + + "the exact Bulgarian dialogue or thought text the character says/thinks, written in quotes.\n" + + "At least 3 of the 4 panels on every page MUST include Bulgarian dialogue in a speech bubble " + + "or thought bubble. The dialogue must come directly from the story and be in Bulgarian Cyrillic.\n" + "The 20 panels must retell the story from beginning to end — " + "each page covers one story beat, each panel advances the action.\n" + "Do NOT repeat the same scene or camera angle on consecutive panels.\n" + "Example format (replace with actual story content):\n" + - "P1-A: Maria walks out her front door into morning sunlight, laptop bag on shoulder, looking relieved.\n" + - "P1-B: She strides down a busy city street past parked cars, headphones in, smiling.\n" + - "P1-C: Close-up of her hand gripping a large steaming coffee cup with both hands.\n" + - "P1-D: Maria pauses at a park entrance, gazing at the green trees ahead with anticipation.\n" + "P1-A: Maria walks out her front door into morning sunlight, laptop bag on shoulder, saying \"Най-накрая!\" in a speech bubble.\n" + + "P1-B: She strides down a busy city street past parked cars, headphones in, thinking \"Толкова хубав ден.\" in a thought bubble.\n" + + "P1-C: Close-up of her hand gripping a large steaming coffee cup, the barista handing it over saying \"Заповядайте!\" in a speech bubble.\n" + + "P1-D: Maria pauses at a park entrance, gazing at green trees ahead, saying \"Точно това ми трябваше.\" in a speech bubble.\n" } // slugify converts a comic title into a safe directory/file name component. |
