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 with Halim Sarr, who owns the world's silence, spent in the last un-demolished laundromat inside his own server prairie — where a wrench left in a dryer drum brings back a sound he professionally erased from the earth. Two forks: whether he has his mother's off-key humming reconstructed or lets it stay unrecorded, and then whether he keeps what he gets or gives the noise back.
# An evening in the life of the richest man in the world, 2045.
define H = Character("SARR", color="#f2f2f2")
define N = Character("NIA", color="#cfd8e6")
define V = Character("VESPER", color="#9a9a9a")
image bg_campus_night = "images/bg_campus_night.png"
image bg_laundromat = "images/bg_laundromat.png"
image bg_vault_quiet = "images/bg_vault_quiet.png"
image bg_dawn_laundromat = "images/bg_dawn_laundromat.png"
image bg_city_unhushed = "images/bg_city_unhushed.png"
image cg_drum_window = "images/cg_drum_window.png"
image cg_memory_table = "images/cg_memory_table.png"
image cg_wrench_hand = "images/cg_wrench_hand.png"
image sarr_calm = "images/sarr_calm.png"
image sarr_listen = "images/sarr_listen.png"
image sarr_undone = "images/sarr_undone.png"
image nia_tech = "images/nia_tech.png"
transform driftin:
zoom 1.04 xalign 0.5 yalign 0.5
linear 45.0 zoom 1.20
transform standright:
yalign 1.0 xalign 1.35
easeout 0.9 xalign 0.80
transform standleft:
yalign 1.0 xalign -0.35
easeout 0.9 xalign 0.19
transform thump:
yoffset 0
block:
linear 0.10 yoffset -14
linear 0.16 yoffset 0
pause 0.55
linear 0.10 yoffset -14
linear 0.16 yoffset 0
pause 0.95
repeat
label start:
# PANEL 1
scene black
show bg_campus_night at driftin
with Dissolve(2.0)
"Lordstown, Ohio. The eighth of November, 2045."
"Nine miles of server sheds in every direction, breathing steam into weather they make themselves."
"Inside the fences, nothing is allowed to make a sound it hasn't paid for."
"One building on the whole plain still has its old bones. A laundromat, lit up like a tooth."
# PANEL 2
scene bg_laundromat with wipeleft
show sarr_calm at standright
with dissolve
"Halim Sarr owns the quiet. Hospital, cockpit, courtroom, bedroom — every insulated room on earth leases it from him by the minute."
V "Eleven minutes on the ground, sir. Two hundred and forty billion in licence income says you have somewhere else to be."
H "Nobody puts anything on the folding table."
# PANEL 3
show nia_tech at standleft with dissolve
N "Nia Ferreira. Field archive. I record the room, then the crews take it down on Tuesday."
N "Hush bought this block in '38 and flattened forty buildings. You wrote an exception for this one. The file doesn't say why."
H "Then the file is accurate."
V "Reminder: at midnight Cleveland goes under Total Quiet. The last unsubscribed city on the continent. Your signature closes it."
# PANEL 4
hide nia_tech with dissolve
"Nine machines along the wall, numbered in paint. Six of them washers. Three dryers, and the third one always wobbled."
H "My mother worked nights at the stamping plant. That wall, other side."
H "She'd run a load between shifts. I slept here. Table by the window."
# PANEL 5
show sarr_listen at standright with dissolve
show nia_tech at standleft with dissolve
N "Is there anything in here you want kept? I can tag it for the permanent set."
H "It's a room. It has an inventory."
N "Rooms aren't inventories to me, sir. They're what you heard in them."
"He does not answer. Somewhere down the row a timer clicks over on its own."
# PANEL 6
scene bg_laundromat
show cg_drum_window at thump
with hpunch
"A test cycle. Drum six turning with something heavy loose inside it."
"Thump.{w=0.6} Two beats of nothing.{w=0.6} Thump."
"Somebody's wrench, forgotten at the back of the barrel. The oldest rhythm he knows."
# PANEL 7
scene cg_memory_table with Dissolve(2.5)
"Sixteen minutes is a dryer cycle. She used to sing the number into whatever tune she had, and she never had the tune."
"Flat, and over the thump, and in a language she was already losing."
"“Sixteen minutes,” she'd sing, wrong, every time, while the wet sheets went round."
# PANEL 8
scene bg_laundromat with dissolve
show sarr_undone at standright with dissolve
"He owns the master rights to forty thousand hours of orchestra. He owns the silence in the room where you are reading this."
"He does not have one second of his mother making noise."
H "Thirty years. I built an empire out of subtracting exactly that."
# PANEL 9 — the fork
menu:
H "Vesper. Find me everything she was ever recorded doing."
"“Find me everything she was ever recorded doing.”":
jump rebuild
"“Nia. Turn your machines off.”":
jump leave
label rebuild:
# PANEL 10
scene bg_laundromat with wipeleft
show cg_wrench_hand at driftin with dissolve
V "Plant safety audio, 2011: four seconds. Pharmacy voice menu, 2019: her badge number, twice. Total corpus, eleven seconds."
V "Sufficient. I can grow her a throat and hang the humming on it. Drum acoustics from this building are already modelled."
show nia_tech at standleft with dissolve
N "It'll be a guess, sir. Wearing her voice."
H "Every guess I ever made came out worth money."
# PANEL 11
scene bg_laundromat with dissolve
show sarr_listen at standright
show nia_tech at standleft
with dissolve
"It takes ninety seconds. It comes out of her monitors clean as a bell, sixteen minutes, sixteen minutes, over a perfect wobbling drum."
"It is correct in every measurable way."
H "It's in tune."
H "She was never in tune."
# PANEL 12
menu:
N "Do I keep the file, or lose it?"
"“File it. It's an asset.”":
jump ending_holdings
"“Lose it. Nia — you sing it.”":
jump ending_wrongnote
# PANEL 13
label ending_holdings:
scene bg_vault_quiet with Dissolve(2.5)
show bg_vault_quiet at driftin
"Four hundred metres under the Faroe shelf, in the quietest room ever certified, he plays it most nights."
"Eleven seconds of evidence, extended forever, pitch-perfect and unbearably clean."
H "Again."
"The vault obeys. It always does. It never once gets the note wrong."
"{i}THE HOLDINGS{/i}"
return
# PANEL 14
label ending_wrongnote:
scene bg_laundromat with dissolve
show nia_tech at standleft with dissolve
"Nia Ferreira cannot sing at all. She proves it standing between a folding table and a dead washer."
N "Sixteen minutes... {w=0.4}sixteen minutes—{w=0.4} sorry. Is it fifteen?"
"He laughs. Then he sits down on the table he told her not to touch, and he cannot stop."
"Midnight goes by unsigned. For nine more hours Cleveland is allowed to sound like Cleveland, because of a clerical accident, because of a flat note."
"{i}THE WRONG NOTE{/i}"
return
label leave:
# PANEL 15
scene bg_laundromat with wipeleft
show cg_wrench_hand at driftin with dissolve
"She kills the mics. The room goes back to being nobody's recording."
V "Sir, the archive window closes with the building. After Tuesday this evening does not exist in any retrievable form."
H "Correct."
V "Cleveland holds at midnight?"
H "Cleveland holds."
# PANEL 16
scene bg_laundromat with dissolve
show cg_drum_window at thump with dissolve
"He puts the wrench back where the crew forgot it, shuts the door, and starts the cycle by hand."
"Then he lies down on the folding table in a coat worth more than the block, and hums along, badly, on purpose."
"Sixteen minutes. The richest man in the world spends them lying on his back in the dark, getting it wrong."
menu:
"The clock reads 11:58."
"Let midnight come.":
jump ending_sixteen
"Give the noise back.":
jump ending_unhushed
# PANEL 17
label ending_sixteen:
scene bg_dawn_laundromat with Dissolve(3.0)
"At midnight two hundred thousand rooms in Cleveland stop hearing anything they didn't order."
"He stays until the buzzer, which is a sound he has never licensed to anyone."
"The building comes down on Tuesday, on schedule, and he watches from the car with a wrench in his coat pocket."
"He is asked, later, what was so important about a laundromat. He says it was a rounding error."
"{i}SIXTEEN MINUTES{/i}"
return
# PANEL 18
label ending_unhushed:
scene bg_city_unhushed with Dissolve(3.0)
show bg_city_unhushed at driftin
V "Sir, releasing the patents unpriced removes roughly sixty per cent of your holdings by Monday."
H "Open the fences. All of them. Start with Cleveland and don't stop at Cleveland."
"At 11:58 the world gets its noise back, and it is hideous: trains, gulls, arguments, dogs, brakes, somebody's terrible singing four floors up."
"He stands in the middle of it with his eyes shut, a poorer man, listening for a woman who never once found the note."
"{i}THE UNHUSHING{/i}"
return
{
"style": "Every image is hand-penciled monochrome traditional line art: graphite on rag paper, visible paper tooth and eraser ghosts, no ink, no colour, no digital shading or gradients. Line weight is nervous and architectural — hard 2H contour for machines, fences and rooms, soft 4B smudge for skin, steam and darkness. Large areas of bare white paper are left for light and silence; deep blacks are built from dense diagonal cross-hatching only. Compositions are wide, still and slightly documentary, as if drawn from a film frame. Recurring man throughout: Halim Sarr, a lean Black man of about sixty, close-cropped grey hair, hollow cheeks, wire-rim glasses on a neck cord, an expensive collarless shirt under a heavy old canvas work coat.",
"assets": [
{
"id": "bg_campus_night",
"kind": "bg",
"aspect": "16:9",
"prompt": "Night, a flat Ohio plain covered to the horizon with identical low windowless data-center sheds, chain-link acoustic fencing, vapour plumes standing straight up. In the middle distance one small old brick laundromat with a lit shopfront, absurdly bright and human among the sheds. One black car parked at its kerb. Sky left almost blank white paper with faint hatching."
},
{
"id": "bg_laundromat",
"kind": "bg",
"aspect": "16:9",
"prompt": "Interior of a 20th-century coin laundromat preserved intact: nine front-loading machines in a row along a tiled wall, numbers stenciled in paint, a long formica folding table under a window, plastic chairs, a mop bucket, cracked linoleum. Empty room, fluorescent light drawn as bare white paper. Modern intrusion: two slim black microphone stands and a cable snaking across the floor."
},
{
"id": "cg_drum_window",
"kind": "cg",
"aspect": "16:9",
"prompt": "Extreme close-up on the round glass door of an industrial dryer, drum spinning inside, motion smeared with soft graphite arcs. A heavy steel wrench tumbling loose at the back of the barrel, caught mid-strike against the metal. Reflection of a thin standing man faint in the glass. Dense cross-hatched darkness around the circle."
},
{
"id": "cg_memory_table",
"kind": "cg",
"aspect": "16:9",
"prompt": "Memory image, softer and hazier than the other drawings, edges dissolving into blank paper: a woman in factory coveralls folding sheets at a laundromat folding table late at night, mouth slightly open in mid-hum, and a small boy of seven asleep beside the folded pile with his cheek on the formica. Machines behind them out of focus. Warm heavy graphite, no hard outlines at the borders."
},
{
"id": "sarr_calm",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-length standing figure, three-quarter view, transparent white background, no scenery: Halim Sarr, lean Black man of about sixty, close-cropped grey hair, wire-rim glasses on a cord, expensive collarless shirt under a heavy old canvas coat, hands in pockets, chin level, entirely composed and slightly bored. Clean confident contour, minimal interior hatching."
},
{
"id": "sarr_listen",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Same man, same clothes, full-length, transparent white background: head turned sharply to one side and tilted, one hand lifted a few inches as if asking a room to be quiet, weight frozen mid-step, eyes unfocused. Attentive, arrested, listening to something behind him."
},
{
"id": "sarr_undone",
"kind": "sprite",
"aspect": "9:16",
"ref": "sarr_calm",
"prompt": "Same man, same clothes, full-length, transparent white background: glasses off and hanging from the cord, one hand flat against his own chest, shoulders collapsed forward, mouth shut hard, eyes wet and open. Heavier smudged graphite in the face than elsewhere."
},
{
"id": "nia_tech",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-length standing figure, transparent white background, no scenery: Nia Ferreira, woman in her late twenties, broad-shouldered, box braids tied back, headphones around her neck, worn field-recording rig slung across her body, one hand on a microphone stand, work trousers and scuffed boots. Practical, unimpressed, direct gaze."
},
{
"id": "cg_wrench_hand",
"kind": "cg",
"aspect "16:9",
"prompt": "Close-up of two aging hands, canvas coat cuffs, holding a greasy adjustable wrench over the open mouth of a dryer drum. Grease on the fingertips, one expensive plain ring. Background dissolving into blank paper, only the hands and tool fully rendered."
},
{
"id": "bg_vault_quiet",
"kind": "bg",
"aspect": "16:9",
"prompt": "Interior of an enormous anechoic chamber deep underground: walls, floor and ceiling covered in thousands of pyramid foam wedges drawn as relentless cross-hatched geometry, a suspended wire-mesh walkway, one single armchair at the exact centre with a small elderly figure seated in it, dwarfed. Airless, symmetrical, silent."
},
{
"id": "bg_dawn_laundromat",
"kind": "bg",
"aspect": "16:9",
"prompt": "The same laundromat interior at grey dawn, machines all stopped, wide-open white light flooding through the front window and washing out most of the drawing. A rumpled coat left on the folding table, one dryer door hanging open. No people. Faint outlines of demolition crew vehicles visible outside through the glass."
},
{
"id": "bg_city_unhushed",
"kind": "bg",
"aspect": "16:9",
"prompt": "Night street canyon in a rust-belt city suddenly full of sound, drawn as visible chaos: gulls, a train on an elevated line, dogs, sparking brakes, thrown-open windows with figures leaning out, acoustic fence panels lying flat on the pavement. Radiating hatched shockwave lines fanning from every source. In the foreground, small and back-turned, a lean man in a canvas coat standing still with his eyes shut."
}
]
}
driftin, standright, standleft, thump), 4 used.sarr_calm) carries his full description, sarr_undone names it as a visual reference, and the shared style paragraph repeats his physical signature — grey crop, corded wire-rims, canvas coat over collarless shirt — for every prompt that includes him.The load-bearing decision is that motion is decoupled from text advance: driftin and thump are looping/long-duration transforms attached to images before the dialogue lines play, so the establishing plain keeps creeping toward the viewer for four lines, and the dryer drum keeps striking under three lines of narration and then again for a whole panel in the quiet branch — the reader's clicks stop being the clock of the scene. Layered on that, transitions are cast as edits rather than decoration: wipeleft for cuts across space (outside to inside, present to procedure), hpunch as the physical jolt of the wrench hitting the drum, and long Dissolve(2.5)/Dissolve(3.0) for memory and for endings, so each ending arrives as a slow lap-dissolve out of the room instead of a hard stop.