summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--generated_vocab_alien_jungle_starship.txt10
-rw-r--r--internal/comic/artist.go2
-rw-r--r--internal/config/config_test.go2
-rw-r--r--internal/image/gemini_api.go4
-rw-r--r--prompts/gallery_page_prompt.md12
-rw-r--r--prompts/story_page_prompt.md11
6 files changed, 37 insertions, 4 deletions
diff --git a/generated_vocab_alien_jungle_starship.txt b/generated_vocab_alien_jungle_starship.txt
new file mode 100644
index 0000000..b9690dd
--- /dev/null
+++ b/generated_vocab_alien_jungle_starship.txt
@@ -0,0 +1,10 @@
+подводен свят = underwater world
+коралов замък = coral castle
+извънземно морско същество = alien sea creature
+трезъбец = trident
+морска героиня = ocean heroine
+светещ риф = glowing reef
+перлена порта = pearl gate
+бурно течение = strong current
+пазител = guardian
+дълбинна звезда = abyssal star
diff --git a/internal/comic/artist.go b/internal/comic/artist.go
index a54c01a..b089769 100644
--- a/internal/comic/artist.go
+++ b/internal/comic/artist.go
@@ -345,6 +345,8 @@ func (a *Artist) galleryPromptData(style, bible string, galleryNum int) map[stri
"ScriptName": localizedScriptName(a.script),
"Style": localizedStylePrompt(style, a.language, a.script),
"Bible": bible,
+ "GalleryNum": galleryNum,
+ "TotalGalleryPages": a.galleryPages,
"Pose": galleryPoses[(galleryNum-1)%len(galleryPoses)],
"RenderingRequirement": a.renderingRequirement(),
"RenderingRequirementEnd": a.renderingRequirementEnd(),
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index e27906d..60152be 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -210,6 +210,8 @@ func TestEmbeddedPromptTemplatesRender(t *testing.T) {
"BlurbBox": "правоъгълно текстово поле с кратък текст",
"SeriesTitle": "КомиксФордж Приключения",
"Pose": "extreme close-up portrait",
+ "GalleryNum": 1,
+ "TotalGalleryPages": 5,
}
for _, name := range []string{
diff --git a/internal/image/gemini_api.go b/internal/image/gemini_api.go
index f1aa1c8..720388b 100644
--- a/internal/image/gemini_api.go
+++ b/internal/image/gemini_api.go
@@ -59,7 +59,9 @@ func geminiReferenceParts(prompt string, refs [][]byte) []*genai.Part {
refNote := fmt.Sprintf(
"The %d reference image(s) above show the exact character appearance that must be preserved. "+
- "Every character, animal, or object must look identical in the new image. Now generate:\n\n",
+ "Every character, animal, or object must keep the same identity, face, costume, colours, and markings. "+
+ "Use the references for identity only: do not copy their scene, pose, camera angle, panel layout, lighting, action, or background. "+
+ "The new image must follow the new prompt's story beat and composition. Now generate:\n\n",
len(refs),
)
parts = append(parts, &genai.Part{Text: refNote + prompt})
diff --git a/prompts/gallery_page_prompt.md b/prompts/gallery_page_prompt.md
index 9aaf8ab..4cdbd04 100644
--- a/prompts/gallery_page_prompt.md
+++ b/prompts/gallery_page_prompt.md
@@ -1,3 +1,13 @@
+UNIQUE GALLERY IMAGE {{.GalleryNum}} OF {{.TotalGalleryPages}} — this must be a completely different standalone composition from every other gallery image.
+Primary composition for this gallery image:
+{{.Pose}}
+
+VARIETY REQUIREMENTS:
+ • Make this gallery image differ strongly from the other gallery images in camera distance, camera angle, pose/action, background location, lighting, and foreground objects.
+ • Do not repeat the same standing pose, centered framing, facial expression, background, or light direction used in another gallery image.
+ • If reference images are provided, use them only for identity and costume consistency. Do not copy their pose, scene, camera, lighting, or background.
+ • This gallery image should feel like a distinct portfolio shot from a different moment in the story world.
+
Style: {{.Style}}.{{.RenderingRequirement}}
One full-frame {{if .RenderingRequirement}}photograph that looks 100% like a real camera shot{{else}}illustration{{end}} in landscape 16:9 format.
Do not split the image into panels or sections. The entire canvas is one single scene.
@@ -7,7 +17,5 @@ No text of any kind. No title, labels, speech bubbles, panel borders, or UI elem
{{end}}
-Composition: {{.Pose}}
-
The characters must be EXACTLY the described people — same faces, gender, adult age, and clothing. Include the animal companion if naturally present. Do not invent new characters or change anyone's gender. Do not add text overlays.
Background: the story setting rendered with full cinematic atmosphere and colour mood.{{if .RenderingRequirement}}{{.RenderingRequirementEnd}}{{end}}
diff --git a/prompts/story_page_prompt.md b/prompts/story_page_prompt.md
index bed4f0d..dd2e452 100644
--- a/prompts/story_page_prompt.md
+++ b/prompts/story_page_prompt.md
@@ -1,12 +1,21 @@
This comic page is in {{.LanguageName}}. All speech, thoughts, captions, and labels inside panels must use {{.ScriptName}} script only.
+UNIQUE STORY PAGE {{.PageNum}} OF {{.TotalPages}} — render this page as a NEW story beat, not a repeat of any previous page.
+The exact page-specific panel plan is the highest priority instruction:
+{{.PanelLayout}}
+
+CONTINUITY RULE:
+ • This page must continue the story with different actions, settings, poses, camera angles, and foreground objects from all earlier pages.
+ • If reference images are provided, use them only for character identity and costume consistency. Do not copy their composition, location, pose, lighting, or background.
+ • Every panel on this page must clearly show a different moment in the sequence.
+
{{.Words}}
Style: {{.Style}}.{{.RenderingRequirement}}
Interior story page only. Do NOT render a cover masthead, title banner, subtitle, price box, issue number, date, page header, page footer, logo bug, or publisher badge.
{{if .Bible}}CHARACTER AND SETTING REFERENCE:
{{.Bible}}
-{{end}}{{.PanelLayout}}Each panel is separated by a thin black gutter line. All {{.PanelsPerPage}} panels must be clearly distinct scenes, not one continuous image. Fill the full image area with the {{.PanelsPerPage}} panels.
+{{end}}Each panel is separated by a thin black gutter line. All {{.PanelsPerPage}} panels must be clearly distinct scenes, not one continuous image. Fill the full image area with the {{.PanelsPerPage}} panels.
MANDATORY SPEECH BUBBLES — this is a comic; characters must speak:
• At least {{.RequiredDialoguePanels}} of the {{.PanelsPerPage}} panels on this page must contain a speech bubble or thought bubble.
• If the panel description includes quoted dialogue, render it exactly inside the bubble.