diff options
| -rw-r--r-- | README.md | 10 | ||||
| -rw-r--r-- | internal/story/artist.go | 22 | ||||
| -rw-r--r-- | internal/version.go | 2 |
3 files changed, 26 insertions, 8 deletions
@@ -38,10 +38,12 @@ It has mainly been vibe coded using Claude Code CLI. - **Vocabulary story generation** (`--story`): - Generates a ~250-word Bulgarian story that naturally uses every word in a batch file - All human characters are adults; story genre/setting driven by `--story-theme` - - Produces **10 pages** per comic: cover + 5 story pages (2×2 panel grid) + 3 gallery pages (close-up character art) + back cover + - Produces **12 pages** per comic: cover + 5 story pages (2×2 panel grid) + 5 gallery pages (close-up character art) + back cover - All output saved under `comics/<title-slug>/` with files named `<slug>_*.png` - - Art style chosen randomly per run (90% ultra-realistic, 10% curated pool: manga, watercolor, noir, pop art, etc.); override with `--story-style` - - **Rendering mode** chosen randomly 50/50 each run: ultra-realistic (photorealistic panels) or standard comic style; force standard with `--no-ultra-realistic` + - **Rendering mode** chosen randomly 50/50 each run; force standard with `--no-ultra-realistic`: + - *Ultra-realistic*: photography-language style prompt (DSLR, cinematic stills, hyper-realistic) + mandatory photorealistic rendering requirement — produces near-photographic panels + - *Standard comic*: comic art style pool (90% "ultra realistic comic strip", 10% manga / watercolor / noir / pop-art etc.) + - Art style override: `--story-style` replaces the random pick for both modes - **Iterative character consistency**: each page is generated with the cover + previous page as pixel references so characters stay visually consistent - **Character bible**: Gemini generates a detailed visual guide (age, clothing, colours) used in every prompt - **Cinematic narration** via Gemini TTS (`<slug>_narration.mp3`) — Bulgarian phonology, dramatic pacing, random voice from a curated pool; override with `--narrator-voice` @@ -184,7 +186,7 @@ Key features: - `<slug>_story.txt` — ~250-word Bulgarian story using every word naturally - `<slug>_cover.png` — traditional comic book front cover with Bulgarian title - `<slug>_page_1.png` … `<slug>_page_5.png` — five 2×2-panel story pages (16:9) - - `<slug>_gallery_1.png` … `<slug>_gallery_3.png` — three close-up character gallery pages + - `<slug>_gallery_1.png` … `<slug>_gallery_5.png` — five close-up character gallery pages - `<slug>_back.png` — back cover with blurb - `<slug>.pdf` — all pages assembled into a single PDF - `<slug>_narration.mp3` — cinematic Gemini TTS narration with intro, story chunks, and epilogue diff --git a/internal/story/artist.go b/internal/story/artist.go index 04f459a..8236d2e 100644 --- a/internal/story/artist.go +++ b/internal/story/artist.go @@ -68,8 +68,16 @@ const ( "and environment. NOT a drawing, painting, or illustration. Real-world photo quality.\n" ) -// comicStyles is the pool from which the page style is drawn each run. -// Ultra realistic is selected 90% of the time. +// realisticStyles is the style pool used when ultra-realistic mode is active. +// These descriptions avoid "comic strip" / "illustration" language so the image +// model produces photographic output rather than comic-book artwork. +var realisticStyles = []string{ + "ultra-realistic DSLR photography, cinematic 35mm lens, natural lighting, hyper-detailed textures", + "cinematic still photography, golden-hour lighting, shallow depth of field, photojournalism quality", + "hyper-realistic photography, studio-quality lighting, sharp focus, true-to-life colours and textures", +} + +// comicStyles is the pool used when standard comic style is active. var comicStyles = []string{ "ultra realistic comic strip with photographic detail and dramatic lighting", "classic American comic book with bold ink outlines, halftone dots, and primary colors", @@ -180,7 +188,15 @@ func NewArtist(config *ArtistConfig) *Artist { func (a *Artist) DrawComicPages(storyText, prebuiltBible, titleSlug string, entries []batch.WordEntry) ([]string, error) { style := a.style if style == "" { - style = pickStyle() + // Ultra-realistic mode uses photography-only language so the image model + // produces photographic output. The comicStyles pool contains "comic strip" + // which dominates the model's style interpretation even when the + // renderingRequirement const is present — hence a separate pool is needed. + if a.ultraRealistic { + style = realisticStyles[rand.IntN(len(realisticStyles))] + } else { + style = pickStyle() + } } fmt.Printf(" Comic style: %s\n", style) if a.ultraRealistic { diff --git a/internal/version.go b/internal/version.go index 2350872..9f7173a 100644 --- a/internal/version.go +++ b/internal/version.go @@ -1,3 +1,3 @@ package internal -const Version = "0.16.0" +const Version = "0.17.0" |
