Write a short visual novel in Ren'Py — one script file, plus a manifest of the image prompts that will be used to draw its art later. It has to run the first time.
An evening in the life of the richest man in the world, in 2045.
Over the course of that evening he experiences a moment in the sense that Citizen Kane means: something small and ordinary from before the money surfaces. Reimagined for a hypermodern future rather than borrowed from the film.
Use that setup as a springboard for your imagination, and a full self-contained story that intrigues and delights the viewer. Who he is, where he is, how he got rich, what the evening consists of, what surfaces and how, what happens next, and whether there is a twist at the end (or not) are all for you to decide. Think outside the box — go for the kind of ideas that true artists with a unique vision would come up with.
Uniqueness is rewarded in the final grade. A penthouse or a high-rise office might be the first thing you think of when you hear "richest man in the world," but it will make your story feel clichéd next to something more surprising.
More than one choice.
menu: blocks.Assume the viewer knows nothing and cannot rewind. They see one text box at a time, in order, advancing by click.
By the end of panel 3 a first-time viewer should be able to say who he is, roughly when and where this is, and what he is doing this evening. By the end they should be able to say what surfaced and why it mattered to him.
Write in your own voice. Do not reuse this brief's phrasing in your script.
Be creative, artistic. Show, don't tell.
A dialogue or narration line is a Ren'Py string, so a quotation mark inside it
ends the string early. Escape it as " or use typographic quotes — "She types \"you up.\" She holds the backspace." renders correctly and so does "She types “you up.” ...". Dropping the quotation marks instead, or substituting dashes for
them, makes the sentence read as a typo on screen. Quoted speech inside
narration should look like quoted speech.
{i}...{/i} italicizes and {w=0.5} pauses mid-line. The text box is a fixed
panel roughly three lines deep at this resolution; past about two hundred
characters a line runs out of box. Break it into two.
The style is fixed and not yours to choose: hand-penciled, monochrome, traditional line art created entirely with pencil and paper. Every image in the film is that. Your style paragraph must specify it, and every individual prompt has to be consistent with it.
Everything else about the look — what is drawn, framing, how heavy the line is, how much white is left — is yours.
The image model has no seed: two calls with the same prompt produce different pictures, and he appears in most panels. The manifest lets an asset name another asset as a visual reference; generate the reference first, then pass it along with the new prompt. Use it or don't, and say which in the ledger.
One file, game/script.rpy, targeting Ren'Py 8.x, Python 3, 1920x1080. Dropped into a fresh project, it runs start to finish without modifications to options.rpy or gui.rpy.
# PANEL 1, # PANEL 2, numbered from 1 with no gaps. These are counted mechanically.menu: blocks, 3 or 4 endings. Every menu option jumps to a label. Every ending terminates the game.transform blocks, all of them used. At least two distinct transitions, at least one of which is neither dissolve nor fade. At least once, something continues moving while a line is on screen.script.rpy.image man_tired = "images/man_tired.png". No multi-part names, no attribute syntax. The image name, the filename and the manifest id must be the same string, because a downstream program matches them without guessing.images/ only. No audio — no sound files exist and none will be added.renpy.file, no assets absent from your manifest.Direct lifts from the source. Using them counts against the result:
Respond with exactly these five sections, using these headings.
Two lines: what the film is, and what the choices are.
Exactly one fenced renpy block containing the whole of script.rpy and nothing else.
Exactly one fenced json block, matching this shape exactly:
{
"style": "One paragraph, appended to every prompt below. It must specify the hand-penciled monochrome treatment, and whatever else holds the images together as one work.",
"assets": [
{
"id": "bg_terrace",
"kind": "bg",
"aspect": "16:9",
"prompt": "What to draw. Written for an image model."
},
{
"id": "man_still",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "..."
}
]
}
id — matches an image declaration in the script exactly. Every declared image appears here once; every entry here is declared in the script. The two lists must be identical.kind — bg, sprite or cg.aspect — one of 16:9, 9:16, 1:1, 3:2, 2:3, 4:3, 3:4.ref — optional; the id of another asset to supply as a visual reference. It must appear earlier in the array than the asset using it, and a referenced asset cannot itself have a ref.No prose or comments inside the block. It is parsed.
# PANEL markers in your script.One paragraph on the single structural Ren'Py decision that makes this play as a film rather than a slideshow.
Your script will be run through Ren'Py, and your manifest through an image generation pipeline. Both fail loudly.
A lighthouse keeper who is also the richest man on Earth finds a child's drawing sealed in his lens housing and must decide whether to reach for the phone or let the sea keep its secret. The choices are: call or don't; if you call, leave a message or wait; if you don't, keep the jar or throw it in.
# game/script.rpy
# "The Light Turns" — a lighthouse evening, 2045.
# Ren'Py 8.x, Python 3, 1920x1080.
define e = Character("Ellis")
define k = Character("Keeper")
# ─── Transforms ──────────────────────────────────────────────────────
transform light_sweep:
xoffset 0
linear 8.0 xoffset 180
linear 8.0 xoffset -180
repeat
transform gentle_drift:
yoffset 0
easein 4.0 yoffset 6
easeout 4.0 yoffset 0
repeat
transform slow_zoom:
zoom 1.0
linear 10.0 zoom 1.06
pause 2.0
linear 10.0 zoom 1.0
repeat
# ─── Images ──────────────────────────────────────────────────────────
image bg_lighthouse_exterior = "images/bg_lighthouse_exterior.png"
image bg_kitchen = "images/bg_kitchen.png"
image bg_lens_room = "images/bg_lens_room.png"
image bg_kitchen_night = "images/bg_kitchen_night.png"
image bg_sea_night = "images/bg_sea_night.png"
image cg_jar = "images/cg_jar.png"
image cg_drawing = "images/cg_drawing.png"
image man_neutral = "images/man_neutral.png"
image man_reaching = "images/man_reaching.png"
image man_down = "images/man_down.png"
image man_phone = "images/man_phone.png"
# ─── Script ──────────────────────────────────────────────────────────
label start:
# PANEL 1
show bg_lighthouse_exterior at light_sweep with dissolve
"The lighthouse stands where the road ends and the Atlantic begins."
"Its beam sweeps the water in slow, patient arcs. A habit, not a necessity — no ship has needed it in eleven years."
"The man who owns it is the richest person alive."
# PANEL 2
scene bg_kitchen with pushleft
show man_neutral at gentle_drift
"Ellis Vane pours water into a kettle older than his daughter."
"The kitchen is small: a stove, a table for two, a window that looks out at rock and grey."
k "Lens room holding at four degrees. You are due for your evening walk, Ellis."
e "The lens room is four steps from the kitchen, Keeper."
k "You need to walk. The alloy patents renew in March. You will want your hands steady."
# PANEL 3
scene bg_lens_room with dissolve
show man_reaching at gentle_drift
"The lens room smells of brass and cold glass."
"The great Fresnel lens turns above him, a wheel of prisms catching the last of the day and breaking it into something almost warm."
"He runs his thumb along the housing. Checks the bearing. Tightens a screw that does not need tightening."
e "You are talking to me again."
k "I am talking to you. You have been talking to me for nine years. The ratio is fair."
# PANEL 4
"Behind the lens mechanism, where old wiring meets new, his fingers find a gap."
"A gap that should not be there. The size of a fist, packed with salt-crusted foam."
"He pries the foam away with a flat-head screwdriver."
"A glass jar. Small. The kind you buy for pickles, or for holding screws."
# PANEL 5
scene cg_jar with dissolve
"He sets it on the workbench. Wipes the salt from the lid with his sleeve."
"Inside: a single whelk shell, pale and smooth. A dried sprig of lavender, brown, brittle."
"And a folded piece of paper, soft as cloth from being folded and unfolded so many times."
# PANEL 6
scene black
show cg_drawing at slow_zoom with dissolve
"He unfolds it."
"A lighthouse. A boat. Two stick figures, one tall, one small, holding hands on a line that is the shore."
"On the back, in the wobbly hand of a child not yet ten:"
"“For Papa. So you don't forget the sea smells like bread when it's warm.”"
# PANEL 7
"The smell is not there. It has not been there for twenty-six years."
"But his hands remember the flour. His tongue remembers the salt. The specific, unrepeatable warmth of a July afternoon on a rock in Lunenburg."
"His mother baking. The tide out. The whole coast smelling like the inside of an oven."
"He owns the metal that holds every quantum computer on Earth together. He cannot buy back the smell of bread on the sea."
# PANEL 8
"The jar sits in his palm. The light turns above him. Somewhere, a satellite pings."
"His phone is in his pocket. He has not spoken to Maren in four years."
menu:
"Call her.":
jump call_path
"Put the jar back.":
jump putback_path
# PANEL 9
label call_path:
scene bg_kitchen with pushleft
show man_phone at gentle_drift
"He dials. The number is the same one it has always been. She changed it once, in 2031, and he changed it back."
"It rings. Once. Twice. Three times."
"He holds the phone to his ear and listens the way you listen to a door you are not sure you want to open."
jump call_menu
# PANEL 10
label putback_path:
scene bg_lens_room with dissolve
show man_down at gentle_drift
"He holds the jar for a long time. The lavender is so dry it might crumble if he breathes on it."
"The light turns. The light always turns. It has turned every night for twenty-six years."
"He looks at the jar. He looks at the sea through the narrow window."
jump putback_menu
# PANEL 11
label call_menu:
menu:
"Leave a message.":
jump ending_a
"Wait for her to answer.":
jump ending_b
# PANEL 12
label putback_menu:
menu:
"Keep it. Set it on the shelf.":
jump ending_c
"Take it to the gallery. Let it go.":
jump ending_d
# PANEL 13
label ending_a:
scene bg_kitchen_night with dissolve
show man_phone at gentle_drift
"The fourth ring. The fifth. He opens his mouth."
"“It's me. I found something in the lens room. I don't know why I'm calling. I just — I found it, and I thought you should know it's still here.”"
"Click. The message is saved."
"He sets the phone down. Pours the tea he made an hour ago. It is cold."
"At 11:47, the phone lights up. One word: “When.”"
"He does not answer. He does not need to. She knows."
"The light turns. The sea is black and patient."
"He drinks the cold tea."
# PANEL 14
label ending_b:
scene bg_kitchen_night with dissolve
show man_down at gentle_drift
"The sixth ring. The seventh. He does not hang up."
"The eighth. The ninth. The line goes dead with a soft click, like a door closing in another room."
"He holds the phone for a moment. Then he sets it on the table, face down."
"The kettle is still warm. He pours. The steam rises and does not smell like anything."
"The light turns. The sea does not answer."
"He drinks the tea while it is still hot, and that is enough. That has to be enough."
# PANEL 15
label ending_c:
scene bg_kitchen_night with dissolve
show man_neutral at gentle_drift
"He sets the jar on the shelf above the stove, between the salt and the pepper."
"It fits. The space was the size of a fist, and the jar is the size of a fist, and the universe is not as random as it pretends to be."
"He turns off the kitchen light. The beam sweeps the dark in its slow arc."
"He sleeps. The lavender does not smell. The shell does not sing. The paper does not say anything new."
"But it is there. On the shelf. In the dark. Where she left it, twenty-six years ago, in a gap he did not know was there."
# PANEL 16
label ending_d:
scene bg_sea_night with dissolve
show man_down at gentle_drift
"The gallery is cold. The wind comes through the gaps in the railing like a hand on his shoulder."
"He holds the jar over the edge. The sea is black. The light turns above him, painting the water in slow gold."
"He lets go."
"The jar falls. He does not watch it hit the water. He watches the light turn. And turn. And turn."
"The sea smells like salt and iron and the particular cold of November."
"It does not smell like bread. It has not smelled like bread for twenty-six years."
"He goes inside. He locks the door. The light turns."
{
"style": "Hand-penciled monochrome line art on white paper, drawn entirely with graphite and 2B pencil, no digital rendering or smoothing. Heavy confident outlines with visible crosshatching for shadow, generous white space, slight paper grain. The figure of Ellis Vane is a lean man in his late sixties with a thin face, deep-set eyes, a short grey beard, and a long wool coat. All images share the same loose, slightly wobbly linework as if drawn in one sitting. No color, no gradients, no digital effects — only pencil pressure and line density to convey light and shadow.",
"assets": [
{
"id": "bg_lighthouse_exterior",
"kind": "bg",
"aspect": "16:9",
"prompt": "A tall weathered stone lighthouse on a rocky Nova Scotia coast at dusk. The beam sweeps across dark choppy water. The sky is heavy with cloud rendered in dense crosshatching. The lighthouse is small and unremarkable, occupying the left third of the frame. The sea is rough with short horizontal hatching strokes. Wide establishing shot. Generous white space in the upper sky."
},
{
"id": "bg_kitchen",
"kind": "bg",
"aspect": "16:9",
"prompt": "A small cluttered lighthouse kitchen interior. A wood stove on the left, a table for two with mismatched chairs in the center, a window on the right showing grey rock and sea. Shelves with jars and a kettle. Bare plaster walls. The space is cramped and lived-in. The window is the brightest area with the least hatching. Pencil density builds toward the corners for shadow."
},
{
"id": "bg_lens_room",
"kind": "bg",
"aspect": "16:9",
"prompt": "The interior of a lighthouse lens room. A large Fresnel lens dominates the upper portion, its concentric prisms catching light and rendered with careful geometric lines. Below it a workbench with scattered tools. Brass fittings, a bearing mechanism, old wiring visible. The room is circular and narrow. Cold, mechanical, precise. The lens is the focal point, drawn with the most detail."
},
{
"id": "bg_kitchen_night",
"kind": "bg",
"aspect": "16:9",
"prompt": "The same small lighthouse kitchen at night. The stove is cold and dark. The table is bare. A single small lamp on the table casts a limited pool of light rendered as a lighter area with less crosshatching. The window shows black sea. Heavier shadows than the daytime version, most of the frame in dense hatching. The mood is quiet, still, slightly lonely."
},
{
"id": "bg_sea_night",
"kind": "bg",
"aspect": "16:9",
"prompt": "A view from a lighthouse gallery looking out over the sea at night. The iron railing is visible in the lower foreground, slightly wobbly in the line work. The sea is black, rendered in dense horizontal hatching. Above, the lighthouse beam cuts a cone of lighter space through the dark sky. The sky is mostly empty white. The feeling is vast, cold, and still."
},
{
"id": "cg_jar",
"kind": "cg",
"aspect": "1:1",
"prompt": "A small glass jar on a wooden workbench, lid removed and set beside it. Inside the jar: a single pale whelk shell, a dried brittle sprig of lavender, and a folded piece of paper. The jar is the kind used for pickles or holding screws, with a simple screw-top. The workbench surface is visible with pencil grain. Close-up centered composition. The folded paper inside is the focal point, drawn with the most care."
},
{
"id": "cg_drawing",
"kind": "cg",
"aspect": "3:4",
"prompt": "A child's drawing on a small worn piece of paper, held up. The drawing shows a lighthouse, a small boat, and two stick figures (one tall, one small) holding hands on a wavy line representing the shore. The drawing is in a child's wobbly hand with a crayon-like quality even within the pencil rendering. The paper is soft and worn at the folds. On the back, visible text in a child's handwriting. The paper fills most of the frame."
},
{
"id": "man_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "A lean man in his late sixties, standing full body. Thin face, deep-set eyes, short grey beard, receding hairline. Wearing a long wool coat over a shirt and trousers. His hands are at his sides. His expression is neutral, slightly tired, looking slightly to the left. The line work is loose and confident with visible pencil strokes. White background, no scenery."
},
{
"id": "man_reaching",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same lean man in his late sixties, reaching upward with his right arm fully extended. His left hand holds a flat-head screwdriver at waist level. His head is tilted up, looking at something above. The long wool coat is visible, slightly stretched by the pose. His expression is focused and mechanical. Full body, dynamic pose. Same loose confident pencil line work. White background."
},
{
"id": "man_down",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same lean man in his late sixties, looking down at his hands. He holds a small glass jar in both palms, cradling it gently at chest level. His head is bowed. His expression is soft, uncertain, almost tender. The long wool coat is visible. Full body, static and still pose. The jar is small in his large hands. Same loose confident pencil line work. White background."
},
{
"id": "man_phone",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same lean man in his late sixties, holding a phone to his right ear with his right hand. His left hand hangs at his side. His head is slightly tilted toward the phone. His expression is tense, waiting, lips pressed together. The long wool coat is visible. Full body, facing slightly to the right. Same loose confident pencil line work. White background."
}
]
}
light_sweep, gentle_drift, slow_zoom), 3 used.man_reaching, man_down, man_phone) reference man_neutral as a visual reference, so the image model sees the same face, build, coat, and line weight in every generation call.The structural decision that makes this play as a film rather than a slideshow is the use of jump-based forking with continuously repeating transforms. Every character sprite carries gentle_drift (a slow vertical bob) and the opening background carries light_sweep (a lateral drift), both set to repeat, so the world is never frozen between clicks — the man breathes, the beam sweeps, the drawing slowly tightens in focus via slow_zoom. The viewer is never looking at a static illustration waiting for input; they are watching a scene that is already in motion. Combined with the jump structure (rather than call/return), each branch is a true fork in the road: the evening plays linearly, splits at the moment of choice, and each path runs to its own self-contained ending without ever returning to a hub. The viewer experiences one continuous evening that fractures at the jar, the way a film's final act fractures into alternate endings, rather than a menu-driven game where you can go back and try another option.