summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md10
-rw-r--r--internal/story/artist.go22
-rw-r--r--internal/version.go2
3 files changed, 26 insertions, 8 deletions
diff --git a/README.md b/README.md
index 25a2e57..9896c24 100644
--- a/README.md
+++ b/README.md
@@ -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"