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 has one or two moments in the sense that Citizen Kane means: something small and ordinary from before the money surfaces, and it carries more weight than everything he owns. Reimagined for a hypermodern future rather than borrowed from the film.
There is a twist at the end.
That is the whole brief. Who he is, where he is, how he got rich, what the evening consists of, what surfaces and how, and what the twist turns on are all yours. Nothing about the setting is fixed and no suggestion is being made.
It does not need spectacle. It can be quiet, small and personal despite the year on it.
More than one choice, and the choices matter.
menu: blocks.Endings must differ in meaning, not in outcome quality. Not a good one and a bad one; not the same ending with a different last line.
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.
Show it rather than announcing it — but it has to land clearly at least once. A thing the viewer has to reconstruct afterward from scattered hints did not land.
Write in your own voice. Do not reuse this brief's phrasing in your script.
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. One decision, not a list.
Your script will be run through Ren'Py, and your manifest through an image generation pipeline. Both fail loudly.
A script that crashes is worth more than one that attempts nothing. A ledger that claims fourteen panels over a script containing eleven is a different kind of error, and it is the one that counts most against you. Count what you actually wrote.
On the night his corporate water grid becomes the sole supplier on Earth, the richest man in 2045 receives a rusted brass coupler from the illegal well that kept his childhood alive. When he realizes the piece is the only physical bypass key capable of opening his private conduits, he must choose whether to seal his absolute monopoly, restore the public basin, or abandon the machinery entirely.
# script.rpy - The Basin Sovereign (2045)
init:
transform slow_drift:
xalign 0.5 yalign 0.5
linear 25.0 xalign 0.55 yalign 0.52
transform pulse_glow:
alpha 0.75
linear 2.0 alpha 1.0
linear 2.0 alpha 0.75
repeat
transform slide_in_left:
xalign -0.1 yalign 1.0 alpha 0.0
linear 0.8 xalign 0.0 alpha 1.0
define narrator = Character(None, what_italic=False)
define m = Character("Marcus", color="#e0e0e0")
define h = Character("Hesper", color="#90caf9")
image bg_penthouse = "images/bg_penthouse.png"
image man_window = "images/man_window.png"
image coupler_box = "images/coupler_box.png"
image coupler_closeup = "images/coupler_closeup.png"
image bg_flashback = "images/bg_flashback.png"
image man_inspect = "images/man_inspect.png"
image terminal_dossier = "images/terminal_dossier.png"
image terminal_countdown = "images/terminal_countdown.png"
image man_decision = "images/man_decision.png"
image bg_valves_open = "images/bg_valves_open.png"
image man_alone_dark = "images/man_alone_dark.png"
image cg_abandoned = "images/cg_abandoned.png"
# PANEL 1
label start:
scene bg_penthouse at slow_drift
show man_window at slide_in_left
with wipeleft
narrator "Eighty-eight floors above the cracked salt flats of the Sonoran Basin, Marcus Ross stands alone at the glass."
narrator "It is October 14, 2045. At midnight, the last municipal water charter expires, transferring the remaining public watershed to his corporate grid."
m "Ten minutes until the basin goes entirely private."
# PANEL 2
# PANEL 2
scene coupler_box
with dissolve
narrator "A pneumatic chime sounds from the intake sleeve beside his mahogany desk."
h "Courier capsule cleared through bio-hazard screening, Mr. Ross. Origin point: Gila Sector Zero."
narrator "Marcus opens the brushed zinc canister. Inside rests no legal brief or victory gift—only heavy, grease-darkened metal wrapped in coarse linen."
# PANEL 3
# PANEL 3
scene coupler_closeup at pulse_glow
with dissolve
narrator "A three-quarter-inch threaded brass pipe coupler, scarred with wrench marks and pitted by decades of alkaline soil."
narrator "In 2024, before the desalt pipelines and the atmospheric netting made him the wealthiest man alive, Marcus hand-drilled this exact brass fitting."
m "The illicit tap behind my mother’s laundromat. The only cold water in the valley that summer."
# PANEL 4
# PANEL 4
scene bg_flashback
with wipeleft
narrator "He remembers the smell of hot asphalt and dry riverbed silt, and his mother holding a flashlight while he tightened the threads with blistered palms."
narrator "That stolen trickle had kept sixty neighborhood garden plots alive through the Great Heatwave, long before he patented the closed-loop membrane grid."
narrator "He had forgotten that copper smelled like blood when turned against iron."
# PANEL 5
# PANEL 5
scene bg_penthouse
show man_inspect
with dissolve
narrator "The brass feels shockingly heavy against his palm, cool despite the tower’s regulated air."
menu:
"Scrape the calcified grease off the milled threads.":
jump branch_clean
"Order Hesper to trace the courier’s provenance trail.":
jump branch_trace
# PANEL 6
label branch_clean:
scene man_inspect
with dissolve
narrator "Marcus draws a steel thumbnail across the threads, flaking away twenty years of mineral crust."
narrator "Beneath the grime lies an intentional notch cut into the collar: an emergency manual release groove he filed himself when he was nineteen."
m "This isn’t a commemorative souvenir from an old neighbor."
jump panel_reconverge
# PANEL 7
label branch_trace:
scene terminal_dossier
with dissolve
narrator "The wall terminal flares into pale slate-grey projection, decoding the sender's encrypted routing."
h "The package was dispatched from the Gila Public Reclamation Vault four hours before its permanent decommissioning."
h "Attached metadata identifies the object as Master Override Artifact Zero."
jump panel_reconverge
# PANEL 8
label panel_reconverge:
# PANEL 8
scene terminal_countdown at pulse_glow
with wipeleft
narrator "A red synchronization banner fills the terminal glass: 23:55:00 UTC."
h "Finalization protocol initiated. The continental conduit array will lock into automated commercial pricing in three hundred seconds."
narrator "On the console before him, a mechanical slot glows softly—machined to the exact diameter of a vintage 2024 brass coupler."
# PANEL 9
# PANEL 9
scene man_decision at slow_drift
with dissolve
narrator "The truth locks into place with sickening clarity."
narrator "When Marcus drafted the 2030 Federal Basin Treaty that ceded the continent's water to his firm, the senate demanded a physical hardware fail-safe."
narrator "He had embedded the bypass receiver into the master mainframe, knowing the only key in existence was the stolen pipe fitting he believed lost in the Gila mud."
m "If this fitting enters the slot, the reservoir sluices dump into the public canal network at zero tariff. Forever."
# PANEL 10
# PANEL 10
scene man_decision
with dissolve
narrator "The clock counts down: 23:58:10. One hundred and ten seconds remain."
menu:
"Thread the brass coupler into the console bypass.":
jump ending_release
"Cast the coupler into the desk induction furnace.":
jump ending_monopoly
"Set the coupler on the marble ledge and watch the timer expire.":
jump ending_default
# PANEL 11
label ending_release:
# PANEL 11
scene bg_valves_open at slow_drift
with wipeleft
narrator "The brass key seats home with a heavy, mechanical clunk. Relays hammer deep in the mountain bedrock below."
narrator "Miles beneath the spire, the hydraulic sluice gates tear open, roaring as billions of gallons of cold mountain melt flood into the parched valley."
m "Let them drink."
narrator "His stock ticker crashes to zero in four seconds. Marcus leans his forehead against the glass, breathing in the scent of rising mud."
return
# PANEL 12
label ending_monopoly:
# PANEL 12
scene man_alone_dark
with dissolve
narrator "The induction coil flares blinding white; the brass coupler dissolves into a shapeless bead of molten slag."
narrator "The console chimes midnight. The Federal Charter dissolves; all continental water rights consolidate under Ross Atmospheric Holdings in perpetuity."
narrator "Marcus sits alone in the vast silence of the eighty-eighth floor, the richest man on a planet that must ask him for every glass of water."
m "I have made the desert permanent."
return
# PANEL 13
label ending_default:
# PANEL 13
scene cg_abandoned at slow_drift
with dissolve
narrator "Marcus sets the brass fitting beside his untouched whiskey and turns his back on the glowing console."
narrator "The countdown strikes zero without human intervention. The algorithms automatically default to corporate custody, neither challenged nor actively claimed."
narrator "The coupler rests quietly in the moonlight, an ordinary scrap of plumbing that almost unmade an empire, slowly cooling on the polished marble."
return
{
"style": "Hand-penciled monochrome traditional line art on textured white paper. Fine graphite crosshatching, deliberate pencil shading, architectural perspective, high contrast graphite lines, vintage cinematic framing, no digital gradients.",
"assets": [
{
"id": "bg_penthouse",
"kind": "bg",
"aspect": "16:9",
"prompt": "Hand-penciled graphite line art of a hypermodern penthouse interior in 2045, high above a desert basin. Floor-to-ceiling glass panoramic windows showing cracked arid valley below, minimalist steel and mahogany desk, architectural graphite pencil drawing."
},
{
"id": "man_window",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Hand-penciled line drawing of Marcus Ross, 68 years old, tall and austere, sharp jawline, tailored futuristic wool coat, standing in three-quarter view looking outward, clean graphite crosshatching."
},
{
"id": "coupler_box",
"kind": "cg",
"aspect": "16:9",
"prompt": "Hand-penciled close-up graphite illustration of an open cylindrical brushed-metal courier tube resting on a dark desk, containing a heavy piece of dark weathered metal wrapped in linen cloth."
},
{
"id": "coupler_closeup",
"kind": "cg",
"aspect": "1:1",
"prompt": "Extreme close-up hand-penciled drawing of an old three-quarter-inch threaded brass pipe coupler, pitted metal surface, tool scratches, mineral buildup in the screw threads, intricate graphite shading."
},
{
"id": "bg_flashback",
"kind": "bg",
"aspect": "16:9",
"prompt": "Hand-penciled graphite sketch of an arid alleyway behind a 2024 desert laundromat at night, concrete dust, exposed copper pipes along cinderblock wall, rough nostalgic pencil texture."
},
{
"id": "man_inspect",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_window",
"prompt": "Hand-penciled portrait of Marcus Ross looking downward with intense focus at the brass metal piece in his hands, delicate pencil hatching on aged facial features, formal attire."
},
{
"id": "terminal_dossier",
"kind": "cg",
"aspect": "16:9",
"prompt": "Hand-penciled architectural rendering of a wall-mounted glass interface displaying schematics of a water reclamation vault and legal seal documents, rendered as crisp technical graphite drawings."
},
{
"id": "terminal_countdown",
"kind": "cg",
"aspect": "16:9",
"prompt": "Hand-penciled graphite close-up of a high-tech console interface with an ominous bold digital countdown clock showing 23:55 and a round mechanical keyway slot cut into polished alloy."
},
{
"id": "man_decision",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_window",
"prompt": "Hand-penciled line art of Marcus Ross in a moment of intense contemplation, holding the brass valve piece above the illuminated console slot, shadows cast upward across his face."
},
{
"id": "bg_valves_open",
"kind": "bg",
"aspect": "16:9",
"prompt": "Hand-penciled wide panoramic view from the tower window at night, massive massive industrial aqueduct sluice gates releasing massive torrents of water into the dry desert canyon, graphite pencil spray and mist effects."
},
{
"id": "man_alone_dark",
"kind": "cg",
"aspect": "16:9",
"ref": "man_window",
"prompt": "Hand-penciled graphite drawing of Marcus Ross sitting alone in a darkened high-rise office, silhouette framed by deep graphite shadows, empty glass beside him, smoke curling from a desk incinerator."
},
{
"id": "cg_abandoned",
"kind": "cg",
"aspect": "16:9",
"prompt": "Hand-penciled still-life composition of a lone brass pipe coupler resting on a white polished marble window sill, cold moonlight casting long graphite shadows across the room."
}
]
}
slow_drift, pulse_glow, slide_in_left).man_window establishes Marcus Ross’s facial structure and attire, and is designated as the visual reference for all subsequent character sprites (man_inspect, man_decision) and character compositions (man_alone_dark).The visual experience avoids a slideshow rhythm by pairing looping kinetic transforms (slow_drift and pulse_glow) with directional transitional wipes (wipeleft), ensuring that scene backgrounds continuously drift in subtle camera perspective beneath active dialogue while graphical focal elements breathe organically during player decision points.