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.
An evening at the bottom of a drained reservoir with Ivo Marrow, who got richer than anyone alive by catching rain before it lands and selling it, and who let a lake out to find the town he grew up in — where the mud gives back one cold brass laundry token, and with it the memory of that token being warm. The choices are how a man who owns the sky answers a coin he cannot warm: refill the valley and give it all back, order warm rain and stand in it, press the token back into the mud, or pocket it and walk home.
# script.rpy — "One Wash"
# Ren'Py 8.x / Python 3 / 1920x1080
define iv = Character("Ivo", color="#e6e6e6")
define h = Character("Halloway", color="#9a9a9a", what_italic=True)
image bg_lakebed_dusk = "images/bg_lakebed_dusk.png"
image bg_lakebed_night = "images/bg_lakebed_night.png"
image bg_town_ruins = "images/bg_town_ruins.png"
image ivo_neutral = "images/ivo_neutral.png"
image ivo_fist = "images/ivo_fist.png"
image ivo_looking_up = "images/ivo_looking_up.png"
image cg_token_mud = "images/cg_token_mud.png"
image cg_laundromat = "images/cg_laundromat.png"
image cg_water_returns = "images/cg_water_returns.png"
image cg_rain_lakebed = "images/cg_rain_lakebed.png"
image cg_token_returned = "images/cg_token_returned.png"
transform slow_pan:
zoom 1.15 xalign 0.0 yalign 0.5
linear 60.0 xalign 1.0
transform step_in:
xalign 0.5 yalign 1.0 xoffset -320 alpha 0.0
easein 1.8 xoffset 0 alpha 1.0
transform breathe:
xalign 0.5 yalign 1.0
block:
easein 2.6 zoom 1.012
easeout 2.6 zoom 1.0
repeat
transform rise_slow:
xalign 0.5 yalign 0.5 zoom 1.0
linear 14.0 zoom 1.09
transform step_off:
xalign 0.5 yalign 1.0 xoffset 0 alpha 1.0
linear 6.0 xoffset 520 alpha 0.0
label start:
# PANEL 1
scene bg_lakebed_dusk at slow_pan with fade
"Sawyer Reservoir, northern California. October, 2045. Two years since the water left."
"The mud has cracked into plates the size of doors. The stone house in the middle of it was a pumping station once."
"Now it is a residence with one occupant, and the old high-water line rings it at the second storey like a collar."
"Ivo Marrow lives here. Every list that ranks such things has ranked him first for nine years running. Tonight the tenth list publishes."
# PANEL 2
show ivo_neutral at step_in
"He comes out onto the concrete apron at nine, coat buttoned to the throat, as he does every list night."
h "Ivo. It is nine o'clock. The list is out."
iv "And?"
h "First. By a wider margin than last year. Shall I read you the number?"
iv "No. Read me the sky."
h "Clear over the valley. Clear over most places. Cistern holds every cloud within four hundred miles under contract, and none of them are yours tonight."
"That is the short version of how he got rich: he learned to catch rain before it landed, and then he learned to sell it. The sky is inventory now. He owns the warehouse."
iv "Then I'll take my walk."
# PANEL 3
scene bg_lakebed_night
show ivo_neutral at breathe
with fade
"Once a year, on list night, he walks out to where the town was."
"Halloway. Four hundred people, a feed store, a school, a coin laundry. The state raised the dam in 2004 and the water came up over all of it in eleven days. Ivo was fourteen."
"Nearly forty years later he bought the reservoir, the dam, and the rights to the sky above them. Then he opened the gates and let the lake go find someone who could pay for it."
h "You have walked this route seven hundred and nine times since the drawdown. The route does not change."
iv "The mud does."
# PANEL 4
scene bg_town_ruins
show ivo_neutral at breathe
with wipeleft
"The foundations come up out of the silt like teeth. Here the school. Here the feed store."
"Here a rectangle of poured concrete with a drain in the middle, and eight rusted bolts where the machines stood."
h "Marrow's Coin Wash. Your mother's."
iv "I know whose it was."
"Something in the mud by the drain catches what little light there is. Something round."
menu:
"Kneel and dig it out.":
jump dig
"Ask the house what it is.":
jump ask
label ask:
h "Brass. Twenty-two millimeters. A laundry token, custom strike, issued 2001 through 2004. Face value: one wash."
h "The collector market for such objects is thin. I can find you a buyer in about three minutes."
iv "I don't want a buyer."
jump dig
label dig:
# PANEL 5
scene cg_token_mud at rise_slow with dissolve
"He kneels in a coat that cost more than the building did and works the token free with his thumbnail. The mud gives it up slowly."
"MARROW'S. ONE WASH. NO CASH VALUE."
"It is cold. Of course it is cold. It has been under a lake for forty years and under the open sky for two."
# PANEL 6
scene cg_laundromat at rise_slow with pixellate
"His mother worked the close. Ten at night, the last machines finishing their spins, the boy asleep on the folding table with his head on somebody else's sheets."
"There was always one token left over at the end of the count. She kept it in her apron pocket through the whole shift. At close she woke him and put it in his hand."
"Not to spend. There was nothing to spend it on."
"He held it in his fist the six blocks home, and it stayed warm the whole way, because it had been against her for eight hours."
"That is the entire memory. A coin, warm. He has not thought about it in thirty years, and he has not been able to buy it for ten."
# PANEL 7
scene bg_town_ruins
show ivo_fist at breathe
with dissolve
h "Your hands are at thirty-one degrees. The token will match them in roughly four minutes."
iv "That isn't the same."
h "Thermally it is identical."
iv "Halloway, I own the rain. I'll tell you what is and isn't identical."
"He stands in the middle of the floor of his mother's laundromat and closes his fist until the edge of the token bites."
menu:
"\"Give it back. All of it. Fill the valley.\"":
jump ending_water
"\"Bring me rain. Here. Tonight. Whatever it costs.\"":
jump ending_rain
"Say nothing. Keep walking.":
jump keep_walking
label ending_water:
# PANEL 8
hide ivo_fist
show ivo_looking_up at breathe
with dissolve
iv "Close the outlet gates. Cancel every delivery downstream. Move the fleet over the valley and empty it."
h "That is the entire western inventory. Roughly a third of your holdings, at a guess. Would you like the number?"
iv "No."
h "The towns downstream have contracts."
iv "They'll have rivers instead. Tell them it's a rounding error."
"The first drops hit the concrete an hour later. He does not go inside."
# PANEL 9
scene cg_water_returns at rise_slow with fade
"It takes forty days for the water to climb back to the old line on the walls of the house. He watches most of it from the roof."
"On the last morning the list corrects itself. He is fourth. Then ninth. Then someone else's problem."
"Somewhere under a hundred and forty feet of water there is a rectangle of concrete with a drain in the middle, and nothing on it."
"The token is in his coat. It is warm, from his own pocket, which is the best he could do."
return
label ending_rain:
# PANEL 10
hide ivo_fist
show ivo_looking_up at breathe
with dissolve
iv "Everything within reach. Over this valley. Now."
h "Cistern's own tariff applies. You would be paying yourself a very great deal of money."
iv "Then it's cheap. Make it warm."
h "Specify."
iv "Body temperature. A pocket. You know what I mean."
h "I know what you mean. I am not sure it can be delivered."
# PANEL 11
scene cg_rain_lakebed at rise_slow with dissolve
"It comes down at midnight, out of clouds that were on their way to Phoenix. It is warm, exactly as ordered."
"It runs off the coat, it fills the drain, it soaks the token in his fist."
"He stands in it for an hour. It is rain. It is very good rain; his company makes nothing else."
h "Ivo. Is it the same?"
"He does not answer. He is still first. He will be first tomorrow. He goes inside and leaves the sky running."
return
label keep_walking:
# PANEL 12
scene bg_lakebed_night
show ivo_fist at breathe
with wipeleft
"He walks. Past the school, past the feed store, out toward the house with its collar of old water and its one lit window."
h "You could keep it in a drawer. People keep things in drawers."
iv "People don't drain lakes to find them."
h "Is that what this was?"
iv "I didn't know it was. I do now."
menu:
"Put it back where the mud had it.":
jump ending_return
"Keep it. Say nothing.":
jump ending_keep
label ending_return:
# PANEL 13
scene cg_token_returned at rise_slow with dissolve
"He goes back to the rectangle of concrete and presses the token into the mud beside the drain, face down."
"He holds his palm over it until the cracks close."
"The next list will say what it always says. Nobody will know that the richest man alive spent an evening returning a quarter's worth of brass to a hole in the ground."
"The mud is patient. Someday it will give the token to someone else, and it will be cold for them too, and they will not know what it was warm from."
return
label ending_keep:
# PANEL 14
hide ivo_fist
show ivo_neutral at step_off
with dissolve
"He puts the token in his coat pocket, left side, where the lining is worn. Then he walks home across the bottom of his lake."
h "Goodnight, Ivo."
"By the time he reaches the door the brass has come up to thirty-one degrees."
"He knows exactly where that warmth came from. That is the difference. He is the only person alive who can feel it, and there is nobody to sell it to."
return
{
"style": "Hand-penciled monochrome line art drawn entirely with graphite pencil on smooth white paper, no ink, no color, no digital shading or painting. Confident thin-to-medium HB and 2B lines, shadows built from open cross-hatching and a little smudged graphite, visible pencil grain and the occasional faint construction line left in. Generous untouched white paper; the image breathes. Recurring motif of cracked dry mud plates and a horizontal high-water stain. Quiet, still, cinematic compositions with a low horizon. Consistent across every image as one sketchbook by one hand.",
"assets": [
{
"id": "bg_lakebed_dusk",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide landscape of a drained reservoir at dusk: a vast floor of cracked dry mud plates stretching to low hills, the far dam wall a straight horizontal line. In the middle distance a squat two-storey stone pumping-station house with one lit window, a dark horizontal water stain ringing its walls at second-floor height like a collar. Dead stumps and a single tilted power pole. Empty sky, a few loose pencil clouds. No people."
},
{
"id": "bg_lakebed_night",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide landscape of the same drained reservoir floor at night: cracked mud plates rendered in dense cross-hatching close to the viewer and fading to white in the distance, the stone house small and far off with one bright window, dark hills, a sky left almost entirely as white paper with a thin crescent moon. A faint footpath of scuffed pencil across the mud. No people."
},
{
"id": "bg_town_ruins",
"kind": "bg",
"aspect": "16:9",
"prompt": "Night in the drained reservoir where a small town once stood: low concrete foundations rising out of cracked mud like broken teeth, a rectangle of poured concrete floor in the foreground with a round drain at its center and eight rusted bolts in two rows where washing machines were anchored. A leaning street sign with no words. Heavy hatching in the foundations, white paper sky. No people."
},
{
"id": "ivo_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-body standing portrait of a lean man in his mid-fifties, close-cropped grey hair, long lined face with deep creases beside the mouth, heavy dark brows, clean-shaven. He wears a long plain wool overcoat buttoned to the throat, no tie, dark trousers, plain boots, hands bare and at his sides. Standing three-quarter to the viewer, weight on one leg, expression unreadable. Isolated on plain white paper with no scenery, no ground shadow."
},
{
"id": "ivo_fist",
"kind": "sprite",
"aspect": "9:16",
"ref": "ivo_neutral",
"prompt": "Full-body standing portrait of the same lean man in his mid-fifties, close-cropped grey hair, long lined face with deep creases beside the mouth, heavy dark brows, clean-shaven, long plain wool overcoat buttoned to the throat, dark trousers, plain boots. His right hand is closed in a tight fist and held against his chest over the coat; his left hand hangs open. Head slightly bowed, eyes on the fist. Isolated on plain white paper with no scenery, no ground shadow."
},
{
"id": "ivo_looking_up",
"kind": "sprite",
"aspect": "9:16",
"ref": "ivo_neutral",
"prompt": "Full-body standing portrait of the same lean man in his mid-fifties, close-cropped grey hair, long lined face with deep creases beside the mouth, heavy dark brows, clean-shaven, long plain wool overcoat buttoned to the throat, dark trousers, plain boots. His face is raised toward the sky, throat exposed, right fist closed at his side, left hand open with palm turned slightly upward. Isolated on plain white paper with no scenery, no ground shadow."
},
{
"id": "cg_token_mud",
"kind": "cg",
"aspect": "16:9",
"ref": "ivo_neutral",
"prompt": "Close-up: a bare weathered man's hand, the cuff of a long wool overcoat visible, prying a small round brass token out of cracked mud beside a concrete drain with the thumbnail. The token is half free, its face stamped with the words MARROW'S and ONE WASH in small block capitals and a worn rim. Fine detail in the mud cracks, white paper around the edges of the frame."
},
{
"id": "cg_laundromat",
"kind": "cg",
"aspect": "16:9",
"prompt": "Memory scene, softer lighter pencil than the rest: interior of a small-town coin laundromat at night around 2003, a row of front-loading washers with round glass doors, fluorescent tube light drawn as bright untouched paper. In the foreground a woman's hand in a worn apron places a single brass token into the open palm of a sleepy boy of about thirteen who is sitting up on a folding table among heaped sheets. Faces cropped or turned away; the two hands are the focus."
},
{
"id": "cg_water_returns",
"kind": "cg",
"aspect": "16:9",
"ref": "ivo_neutral",
"prompt": "High wide view of the reservoir refilling: a flat sheet of water rendered in fine horizontal pencil strokes covers most of the valley, a steady rain falling as long diagonal lines from a dark hatched sky. The stone house stands up to its old water stain in the lake, and a small figure of a lean man in a long buttoned overcoat with close-cropped grey hair sits on its roof, seen from behind, looking out over the water."
},
{
"id": "cg_rain_lakebed",
"kind": "cg",
"aspect": "16:9",
"ref": "ivo_neutral",
"prompt": "Night, heavy rain drawn as dense diagonal pencil strokes falling on the concrete laundromat foundation in the drained reservoir. A lean man in his mid-fifties with close-cropped grey hair and a long wool overcoat buttoned to the throat stands alone at the center of the concrete rectangle, face raised into the rain, one fist closed, water streaming off his shoulders and pooling around the round drain at his feet. Everything beyond him dissolves into rain and white paper."
},
{
"id": "cg_token_returned",
"kind": "cg",
"aspect": "16:9",
"ref": "ivo_neutral",
"prompt": "Close-up at ground level: a bare weathered man's hand, cuff of a long wool overcoat visible, pressed flat palm-down into cracked dry mud beside a concrete drain, as if holding something small beneath it. Mud closing around the fingers, the round drain and one rusted bolt in the frame, a thin crescent moon reflected in a puddle in the drain. Most of the frame left as white paper."
}
]
}
ivo_neutral is generated first with a fully spelled-out description (mid-fifties, cropped grey hair, long lined face, heavy brows, long buttoned wool overcoat), and every other asset that shows him — both alternate sprites and all four CGs — repeats that description verbatim and passes ivo_neutral as its ref.The structural decision is that nothing on screen is ever static under a line of text: every background is shown at a transform (the sixty-second slow_pan on the opening vista, the fourteen-second rise_slow creep on each CG) and every sprite is shown at breathe, a repeating two-and-a-half-second scale oscillation, so the camera and the body are each independently alive while the viewer reads. Scene and sprite are then committed together with a single trailing with clause, so each panel change arrives as one composited transition — a wipe or pixellate cut into the town, a fade into memory — rather than a background swap followed by a character pop-in; and the two arrivals and the one exit (step_in, step_off) are transforms that run out under dialogue rather than transitions the viewer waits through, which is what makes the evening feel filmed instead of paged.