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.
THE LOWEST PLACE — on a rain-soaked night in 2045, Emil Weir, who bought the sky's water and lives in the dry reservoir bowl built over his childhood street, meets a storm nobody ordered, and the water gives him back the paper boat he lost down a drain in 2016, the last spring rain that fell free. The choices: how to log a rain that owes him nothing, whether to wade in with his own hands or send a machine, and what to do with a debt folded into a boat — unfold it, sail it, or seal it in the vault — four endings, from reckoning to release to the coldest kind of keeping.
# =============================================================
# THE LOWEST PLACE
# An evening in the life of Emil Weir, 2045.
# =============================================================
default rain_word = "an error"
# --- images ---------------------------------------------------
image bg_bowl_dusk = "images/bg_bowl_dusk.png"
image bg_house_int = "images/bg_house_int.png"
image bg_bowl_rain = "images/bg_bowl_rain.png"
image bg_floor_puddle = "images/bg_floor_puddle.png"
image man_neutral = "images/man_neutral.png"
image man_up = "images/man_up.png"
image man_wade = "images/man_wade.png"
image man_boat = "images/man_boat.png"
image cg_boat = "images/cg_boat.png"
image cg_memory = "images/cg_memory.png"
image cg_drone = "images/cg_drone.png"
image cg_bill = "images/cg_bill.png"
image cg_boat_sail = "images/cg_boat_sail.png"
image cg_vault_case = "images/cg_vault_case.png"
# --- camera ---------------------------------------------------
transform slow_zoom:
subpixel True
xanchor 0.5 yanchor 0.5 xpos 0.5 ypos 0.5 zoom 1.0
linear 14.0 zoom 1.07
transform pull_back:
subpixel True
xanchor 0.5 yanchor 0.5 xpos 0.5 ypos 0.5 zoom 1.1
linear 12.0 zoom 1.0
transform rise_in:
subpixel True
xalign 0.5 yalign 1.05 alpha 0.0
easein 1.2 yalign 1.0 alpha 1.0
transform breathe:
subpixel True
xalign 0.5 yalign 1.0
ease 2.4 yoffset -5
ease 2.4 yoffset 0
repeat
# --- cast -----------------------------------------------------
define m = Character("MARA")
define e = Character("EMIL WEIR")
define grid = Character(None, what_prefix="{i}", what_suffix="{/i}")
# =============================================================
# PANEL 1
label start:
scene bg_bowl_dusk at slow_zoom with dissolve
"The richest man in the world lives at the bottom of a hole."
"The hole used to be the Stave Reservoir, except the Stave never filled. They built the dam, condemned the valley, and sold the rains before the water ever came."
"He bought the dry bowl in '38 and set a small glass house on its floor. Emil Weir likes to keep an eye on the places where the water should be."
# PANEL 2
scene bg_house_int with dissolve
show man_neutral at rise_in
grid "20:31, November second, 2045. Grid Nine reports precipitation. Unregistered. Uncontracted. No client on file."
grid "It appears to be raining where nobody has paid for it to rain."
e "Say that again."
grid "Unregistered, sir. It appears to be raining for free."
m "Confirmed on three gauges, sir. No seed license, no delivery contract, no client. It's just raining."
e "Just raining."
# PANEL 3
scene bg_bowl_rain with dissolve
show man_neutral at rise_in
"Rain falls into the bowl in long gray threads and pools on the floor of it, and nobody anywhere is being billed."
"He was twenty-two when he filed his first claim on the sky. Everyone laughed. Then everyone was thirsty, and now every drop that lands, lands on paper."
m "How would you like it logged, sir?"
menu:
"Log it as an error.":
jump log_error
"Log it as a gift.":
jump log_gift
"Log it as mine.":
jump log_mine
# PANEL 4
label log_error:
$ rain_word = "an error"
e "Log it as an error. Instruments drift. It happens."
"The estate files the rain under instruments that drift. The rain, which cannot read, keeps falling."
jump rain_answered
# PANEL 5
label log_gift:
$ rain_word = "a gift"
e "Log it as a gift."
m "From whom, sir?"
e "It doesn't say. Gifts usually don't."
jump rain_answered
# PANEL 6
label log_mine:
$ rain_word = "mine"
e "Log it as mine. Everything else down there is."
"The estate files the rain under his name. The rain does not sign. It has never once signed for anything."
jump rain_answered
# PANEL 7
label rain_answered:
m "Filed under [rain_word], then. And sir — the harvest drones are requesting instructions. Standard capture?"
e "Tell them the sky is closed tonight."
"Somewhere above the rim, ten drones fold their wings and sulk in the dark, unpaid."
"He crosses the floor of the bowl, out past the lamplight, to where the old drain breathes."
# PANEL 8
scene bg_floor_puddle with dissolve
show man_up at rise_in
"The last time Emil Weir stood on this floor, it had another name. It was a street. He keeps the old street signs in the vault."
"Rain lands and pools, a black mirror a finger deep, and at the low point the old storm drain breathes under it. In, and out, and in."
e "It's cold."
m "Sir?"
e "The rain. It's cold. Mine comes down at twenty degrees."
# PANEL 9
scene cg_boat with dissolve
"At the mouth of the drain, where the mirror runs thin, something pale sits just above the waterline."
e "Lights on it."
"The house lowers its lights over the water like a lamp over a desk. Rain rings spread, and break against it, and it does not move."
"It is a boat. Paper, folded small.{w=0.5} Crease, crease, tuck."
e "I know that fold."
# PANEL 10
show cg_boat at slow_zoom
m "Sir, your pulse is up. A retrieval unit is on station. It can have it cleaned, cased and logged in ninety seconds."
menu:
"Wade out.":
jump wade
"Send the drone.":
jump drone_end
# PANEL 11
label wade:
scene bg_floor_puddle with dissolve
show man_wade at rise_in
"He leaves the lights and walks into the black mirror. The cold climbs over his shoes and keeps climbing."
"The richest man in the world bends down and picks it up with his own two hands. Nothing in any contract makes him do it."
e "Crease, crease, tuck."
"It is dry in his palm. It has been dry a long time. The drain kept it the way you keep a receipt."
jump boat_in_hand
# PANEL 12
label drone_end:
scene cg_drone with pixellate
"The drone comes down the dark on a tether of light. Its claw is very precise. It is built for eggs and other expensive fragile things."
e "Wait—"
"Precision is not care. The claw closes, and the boat is pulp before it knows it has been picked up."
"The claw presents it like a prize: gray mush, and one printed corner, and a number on the corner. A balance. Past due."
e "…Log it as [rain_word]."
"The estate files it away. The estate files everything. Filing is all it knows how to do with a thing it cannot keep."
"The rain keeps falling. It does not apologize. Water has never once known what it carries until it arrives."
return
# PANEL 13
label boat_in_hand:
scene bg_floor_puddle with dissolve
show man_boat at rise_in
"Rain finds the old print and blooms it dark. Numbers. A table of charges. A heavy stamp, softened but still proud of itself."
e "2016.{w=0.4} The Seep.{w=0.4} The last spring it rained for free."
"The Seep was a valley, and the valley is the bowl, and the drain at the bottom of the bowl is the drain at the bottom of his street."
"It comes back the way water does. All at once, through the lowest door."
# PANEL 14
scene cg_memory with irisin
"The Seep, 2016. A boy at a kitchen table with an unpaid water bill and a jar of glue he is not allowed to touch."
"He folds it anyway. Crease, crease, tuck. His mother laughs from the doorway. “Paper doesn't float forever, little fish.”"
"Outside, the last free rain runs down the gutter like a river, and he chases it to the mouth of the storm drain, and lets it go."
"It sails. It takes the corner too fast. It is gone."
"He is nine years old, crying over paper, and he does not know yet that he will stop at nothing, ever again, for as long as he lives."
"The buyout men came that fall. They were polite. They bought the sky."
# PANEL 15
scene bg_floor_puddle with dissolve
show man_boat at breathe with dissolve
"The rain waits. Even weather can tell when a man is deciding something."
menu:
"Unfold it.":
jump ending_ledger
"Set it on the water.":
jump ending_launch
"Put it in the vault.":
jump ending_vault
# PANEL 16
label ending_ledger:
scene cg_bill with dissolve
"He unfolds it on his knee, the way you open a letter you already know is bad."
"{i}MUNICIPAL WATER AUTHORITY. ACCOUNT PAST DUE. 340 UNITS.{/i} A date in a wet spring. At the bottom, his father's name, pressed hard enough to tear the paper."
e "Three hundred and forty units."
"That is the number. Everything he has built is the interest on it, compounding for twenty-nine years."
e "We paid it with the money they gave us for the sky. Then there was no rain left that was ours."
"He folds it back. Crease, crease, tuck. His hands never forgot."
"He stands in the rain until it stops. The richest man in the world, holding a folded debt, exactly where the water is."
return
# PANEL 17
label ending_launch:
scene cg_boat_sail at pull_back with dissolve
"He kneels at the edge of the black mirror and sets it on the water, bow first, the way you are supposed to."
e "Go on, then."
"It sails. The rain helps it. It takes the corner by the drain too fast, the way it did the first time."
"This time he does not run after it. He kneels in the cold with his empty hands and watches the water take it home."
e "Okay."
"The rain stops a few minutes later. Whatever it came to deliver, it delivered."
return
# PANEL 18
label ending_vault:
scene cg_vault_case with dissolve
"The vault is a white room under the house, kept at the exact temperature of money."
"The case closes over the boat with a sound like a held breath. The plaque prints itself: {i}PAPER VESSEL, c. 2016. PROVENANCE: THE OWNER.{/i}"
e "Put a number on it."
"They put a number on it. It is the most valuable boat in the world, and it will never touch water again."
"That night the richest man in the world owns one more thing than he did at dinner. It keeps perfectly. That is the trouble with keeping."
return
{
"style": "Hand-penciled monochrome traditional line art, drawn entirely in graphite pencil on heavy white paper — no ink, no color, no digital paint. Values are built from soft smudged graphite and visible hatching; deep velvety darks are reserved for water, night and concrete shadow, while generous bare paper stands in for rain-light, lamplight and mist. Confident, slightly imperfect contour lines with faint construction marks left visible, uniform pencil grain and paper tooth across every image. One quiet, rain-soaked world: recurring motifs of water, drains, paper and lamplight, a single soft source of light per image, faces kept loose, expressive and human. Every image must read as a page from the same artist's sketchbook.",
"assets": [
{
"id": "bg_bowl_dusk",
"kind": "bg",
"aspect": "16:9",
"prompt": "Extreme wide establishing shot at dusk: an enormous empty reservoir bowl of curved concrete terraces descending to a dry cracked floor, an intake tower silhouetted at one side, and at the very bottom a single tiny glass house glowing with lamplight. The first thin streaks of rain slant through the last gray light. Vast negative space; the house is a small bright seed at the bottom of a huge dark vessel."
},
{
"id": "bg_house_int",
"kind": "bg",
"aspect": "16:9",
"prompt": "Interior of the small glass house at night: a sparse room walled in floor-to-ceiling glass with sheer dark concrete pressing in close outside, a long low desk of pale screens showing water ledgers and grid maps, one lamp with a paper shade, an empty chair pushed back, rain beginning to streak the glass roof overhead. Quiet, clinical, lonely."
},
{
"id": "bg_bowl_rain",
"kind": "bg",
"aspect": "16:9",
"prompt": "The drained reservoir bowl at night in heavy rain, seen from partway down its wall: long gray sheets of rain falling past the concrete terraces into the dark, rain ringing off the intake tower, the small glass house lit at the bottom like a lantern under a waterfall of night. Vertical pencil-stroke rain throughout, a thin sheet of water shimmering on the floor far below."
},
{
"id": "bg_floor_puddle",
"kind": "bg",
"aspect": "16:9",
"prompt": "The dry floor of the reservoir at night in rain: a huge flat expanse of concrete covered by a finger-deep mirror of water that reflects the distant lit house, and at its lowest point the dark square mouth of an old storm drain set flush into the floor, water sliding toward it in thin threads. Immense scale, deep quiet, the drain small and absolute."
},
{
"id": "man_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-length standing figure of Emil Weir, a sharp-faced man of about thirty-eight with silver-streaked dark hair flattened by rain, wearing a heavy dark wool coat over a knit sweater, trouser hems soaked, hands loose at his sides, expression guarded, intelligent and very tired, caught mid-step as if interrupted by the weather. Rain beading on the coat shoulders, simple hatched shadow at his feet."
},
{
"id": "man_up",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same man in the same soaked wool coat, head tilted fully back to face the sky, eyes closed, mouth slightly open in surprise at the cold, rain landing on his upturned face, shoulders dropped, hands hanging loose and open. Relief and disbelief at once, rain streaks falling past him."
},
{
"id": "man_wade",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same man standing shin-deep in dark water that mirrors him, coat hem soaked and clinging, bending slightly forward with both hands cupped and reaching out in front of him, face intent and strangely soft, rain falling hard. Ripples ring his legs, the water surface broken around his wrists."
},
{
"id": "man_boat",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "The same man standing in shallow rain, holding a small folded paper boat in both hands at chest height, head bowed over it as if reading it, rain dripping from his hair onto the paper, faint printed numbers visible on the boat's hull. Undone, tender, careful."
},
{
"id": "cg_boat",
"kind": "cg",
"aspect": "16:9",
"prompt": "Close-up at water level: a small paper boat folded from an old printed water bill, floating in a thin sheet of black rainwater beside the dark square mouth of a drain, printed figures and a heavy PAST DUE stamp just legible on its hull, rain rings spreading and breaking against its paper sides, lamplight from above catching its creases."
},
{
"id": "cg_memory",
"kind": "cg",
"aspect": "16:9",
"prompt": "Flashback at gutter level on a rainy 2016 street: a child's two small hands releasing a paper boat folded from a bill into a fast gutter torrent between wet cobbles, blurred adult legs and a tenement doorway soft in the background, rain drawn as long soft diagonal pencil strokes, the little boat bright against the dark water."
},
{
"id": "cg_drone",
"kind": "cg",
"aspect": "16:9",
"prompt": "A sleek harvest drone hovering low over black rainwater at night, its articulated claw extended down and half open, holding crushed gray paper pulp with one small printed corner of a bill dangling from its tip, rain streaking past its cold lights, its reflection broken in the water below. Machine precision against soft water."
},
{
"id": "cg_bill",
"kind": "cg",
"aspect": "16:9",
"prompt": "Extreme close-up of two weathered adult hands holding an unfolded, water-stained paper bill flat: a printed table of charges, the figures 340 UNITS, a heavy PAST DUE stamp, a date in a spring month, and a father's signature pressed hard at the bottom edge, fresh rain spots blooming dark on the old paper."
},
{
"id": "cg_boat_sail",
"kind": "cg",
"aspect": "16:9",
"prompt": "Very wide shot over a vast black mirror of rainwater: the tiny paper boat sailing away toward the distant dark mouth of a drain, a man kneeling small at the frame's near edge with empty hands, watching it go, the lit glass house far behind him, enormous empty space and falling rain between them."
},
{
"id": "cg_vault_case",
"kind": "cg",
"aspect": "16:9",
"prompt": "A white museum-vault room: one small glass display case on a plinth containing a folded paper boat, a small printed plaque on the case's stand, a single overhead spotlight, deep soft shadow beyond the pool of light, the boat perfectly preserved, perfectly dry, perfectly still."
}
]
}
The structural decision is that no image in the piece is ever static: every asset is shown inside a running ATL camera transform, so the frame behaves like a held shot with a living camera rather than a slide. slow_zoom pushes in on the bowl during the opening narration and is re-applied to the boat close-up to creep in on the decision; pull_back withdraws as the boat sails away in the launch ending; the sprites idle on a breathe loop — meaning motion continues under the text box at every branch point, not just once. Because re-showing an image under a new transform reads as a camera move rather than a cut, the film gets coverage (wide, push-in, insert, pull-back) out of fourteen stills, and the transitions do the editing: dissolves carry the passage of the evening, an irisin opens the 2016 memory like an old reel, and a pixellate snaps the drone ending into machine logic. The viewer's eye is never released between clicks, so the menus play as cuts to a new shot instead of as menu screens.