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.
In 2045, shade-satellite magnate Orin Quell prepares to sell an evening’s darkness from a drifting solar barge when a battered public-power token returns a forgotten promise to him.
The player decides how Orin meets the memory, then whether he gives the world back a piece of daylight, rebuilds one small mercy, or keeps the past as private property.
# game/script.rpy
define q = Character("Orin Quell")
image bg_veil = "images/bg_veil.png"
image man_veil = "images/man_veil.png"
image bg_auction = "images/bg_auction.png"
image cg_token = "images/cg_token.png"
image bg_pantry = "images/bg_pantry.png"
image man_young = "images/man_young.png"
image bg_gallery = "images/bg_gallery.png"
image cg_bench = "images/cg_bench.png"
image bg_maintenance = "images/bg_maintenance.png"
image man_bare = "images/man_bare.png"
image bg_public = "images/bg_public.png"
image bg_sunrise = "images/bg_sunrise.png"
transform slow_drift:
xalign 0.50
yalign 0.50
linear 12.0 xalign 0.54
linear 12.0 xalign 0.46
repeat
transform enter_left:
xalign -0.20
yalign 1.0
alpha 0.0
parallel:
linear 0.7 xalign 0.18
parallel:
linear 0.5 alpha 1.0
transform token_turn:
xalign 0.50
yalign 0.52
zoom 0.78
alpha 0.0
rotate 0
parallel:
linear 0.5 alpha 1.0 zoom 1.0
parallel:
linear 3.0 rotate 3
label start:
# PANEL 1
scene bg_veil at slow_drift
with dissolve
"2045. Far above the Pacific, the heliostat barge {i}Morrow{/i} drifts beneath its own silver sail."
"Below it, evening spreads across the water like ink being carefully poured."
# PANEL 2
show man_veil at enter_left
"Orin Quell stands alone at the glass helm."
"He is the richest man alive: founder of Minute Mesh, owner of the machines that decide where sunlight goes."
# PANEL 3
scene bg_auction
with wipeleft
"Tonight he is hosting a private sale."
"A coastal federation wants twenty minutes of manufactured dusk for its summer festival; Orin intends to name the price."
# PANEL 4
scene bg_veil
show cg_token at token_turn
"A maintenance drone bumps the rail beside him. Something falls from its intake and skates across the floor."
"It is a cardboard power token, soft at the corners, punched with nine tiny half-moons."
menu:
"What does Orin do?"
"Hold it to the light.":
jump listen_token
"Ask where the drone found it.":
jump ask_drone
"Order it replaced with a clean replica.":
jump replace_token
label listen_token:
# PANEL 5
scene bg_pantry
with dissolve
"He holds the token against the sunset."
"For an instant, the barge becomes the steam-fogged pantry of a public charging station in old Recife."
# PANEL 6
show man_young at enter_left
"A boy with Orin’s solemn eyes is counting holes with his thumb."
"His mother says, “One more ten-minute turn. Find someone who needs it more than you do.”"
jump reckoning
label ask_drone:
# PANEL 7
scene bg_gallery
with dissolve
"The drone projects its recovery path: a sealed museum crate, opened for appraisal before the auction."
"The crate came from the first Minute Mesh neighborhood station, preserved as a curiosity."
# PANEL 8
scene cg_bench
"A record blooms in the air: a sun-baked bench, a queue of tired people, and a handwritten sign."
"FREE POWER. TEN MINUTES EACH. PLEASE LEAVE A TURN FOR THE NEXT PERSON."
jump reckoning
label replace_token:
# PANEL 9
scene bg_maintenance
with wipeleft
"“Print a duplicate,” Orin says."
"The fabricator refuses. Its scan identifies the cardboard as chemically obsolete, impossible to reproduce exactly."
# PANEL 10
scene bg_veil
show man_bare at enter_left
q "It is only a token."
"But he remembers giving his final punched turn to a woman keeping insulin cold in a paper bag."
"He remembers his mother walking home with him in the dark, proud as if they had built a cathedral."
jump reckoning
label reckoning:
# PANEL 11
scene bg_auction
with dissolve
"The buyers wait behind frosted screens. Their representatives are ready to purchase darkness by the minute."
"Orin built his empire by making every spare watt visible, measurable, billable."
# PANEL 12
scene cg_token
"The little token had measured something else."
"It had made a stranger’s need larger than a child’s impatience. That was the first wealth Orin ever understood."
menu:
"The auction clock begins."
"Give every city a daily unmetered hour of shade and power.":
jump ending_open
"Cancel the sale and rebuild the old neighborhood station himself.":
jump ending_bench
"Put the token in his private archive and continue.":
jump ending_lock
label ending_open:
# PANEL 13
scene bg_public
with wipeleft
"Orin opens every public channel."
q "Minute Mesh is changing its first rule. One hour each day belongs to whoever cannot afford to ask."
"The buyers rage. Then, across the hot side of Earth, cooling shelters blink awake without invoices."
"For the first time in decades, Orin watches a number fall and feels relieved."
return
label ending_bench:
# PANEL 14
scene bg_sunrise
with dissolve
"The auction is cancelled. By dawn, Orin is standing in Recife beside a rebuilt charging bench."
"It has no marble, no logo, and one crooked handwritten sign."
"A child offers his unused turn to an old man. Orin does not introduce himself."
"He sits at the far end of the bench until the sun reaches them all."
return
label ending_lock:
# PANEL 15
scene bg_veil at slow_drift
with dissolve
"Orin seals the token inside a climate-controlled drawer beneath the helm."
"The sale closes. Far below, a festival receives its elegant purchased twilight."
"His fortune rises before breakfast."
"In the glass, his reflection looks like a man standing outside a warm room, unable to remember the door."
return
{
"style": "Hand-penciled monochrome traditional line art created entirely with graphite pencil and paper, with visible hatch marks, soft erased highlights, textured toothy paper, cinematic negative space, and restrained charcoal-gray shading. Maintain a quiet futuristic realism: advanced technology should feel physical, weathered, and hand-drawn rather than glossy or digital. No color, no painted effects, no typography unless specifically requested as a small diegetic sign.",
"assets": [
{
"id": "bg_veil",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide cinematic interior of a drifting orbital heliostat barge above the Pacific at sunset, curved glass helm windows, immense silver solar sail visible outside, ocean far below, sparse control surfaces, one empty central standing position, melancholic vastness."
},
{
"id": "man_veil",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-body character sprite of Orin Quell, a lean man around sixty with close-cropped silver hair, a narrow thoughtful face, tired eyes, and a simple dark high-collared work coat. He stands upright but carries private exhaustion, hands relaxed at his sides, transparent background."
},
{
"id": "bg_auction",
"kind": "bg",
"aspect": "16:9",
"prompt": "Interior auction chamber aboard a futuristic solar barge, circular floor, frosted translucent screens surrounding an empty speaker position, distant silhouettes of remote bidders suggested behind the screens, severe elegant machinery and a view of clouded ocean twilight."
},
{
"id": "cg_token",
"kind": "cg",
"aspect": "3:2",
"prompt": "Close-up of an old cardboard public-power token resting on a dark metal floor, rounded worn corners, nine small punched half-moon marks, one remaining unpunched segment, faint grease smudges and thumb wear, dramatic isolated light."
},
{
"id": "bg_pantry",
"kind": "bg",
"aspect": "16:9",
"prompt": "Memory scene in an old public charging station pantry in Recife, humid steam-fogged windows, battered electric kettles, communal battery lockers, practical benches, paper notices, warm late-afternoon light rendered only through pencil value."
},
{
"id": "man_young",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_veil",
"prompt": "Full-body character sprite of Orin Quell as a solemn nine-year-old boy, recognizably sharing the older man's narrow face and observant eyes, short untidy dark hair, oversized school shirt and worn shorts, looking down at something in his hand, transparent background."
},
{
"id": "bg_gallery",
"kind": "bg",
"aspect": "16:9",
"prompt": "Quiet futuristic archive gallery inside the heliostat barge, a museum crate opened beneath a projected recovery map, suspended labels and preservation equipment, dim clean room lighting, sense of corporate history becoming personal."
},
{
"id": "cg_bench",
"kind": "cg",
"aspect": "16:9",
"prompt": "Archival image projected like a memory: a sun-baked public charging bench in old Recife, several ordinary people waiting with devices and battery bags, a humble handwritten cardboard sign reading FREE POWER. TEN MINUTES EACH. PLEASE LEAVE A TURN FOR THE NEXT PERSON."
},
{
"id": "bg_maintenance",
"kind": "bg",
"aspect": "16:9",
"prompt": "Industrial maintenance corridor inside the solar barge, compact fabrication machine with articulated arms, racks of tools, exposed cable bundles, a tiny retrieval drone near the floor, hard utilitarian lighting and deep pencil shadows."
},
{
"id": "man_bare",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_veil",
"prompt": "Full-body character sprite of Orin Quell matching the referenced man exactly in face, age, silver hair, and dark high-collared coat, but with his shoulders lowered and one hand loosely open as if caught by an old memory, transparent background."
},
{
"id": "bg_public",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide view of a dense hot future coastal city at evening, public cooling shelters and shade canopies activating across rooftops and streets, ordinary citizens gathering beneath them, distant screens glowing softly, hopeful civic scale without spectacle."
},
{
"id": "bg_sunrise",
"kind": "bg",
"aspect": "16:9",
"prompt": "Quiet sunrise in Recife beside a humble rebuilt public charging bench, a child offering a small token to an elderly man, a reserved older man seated at the distant end of the bench, low buildings, tangled wires, and morning light across the pavement."
}
]
}
man_young and man_bare use man_veil as their visual reference so Orin’s distinctive narrow face, silver hair, coat, and posture remain stable across ages and emotional states.The script treats each branch as a different route into the same buried recollection, then uses a single reconvergence before the final decision: this gives the player authorship over how Orin encounters the past while preserving the accelerating film rhythm of interruption, recognition, auction-clock pressure, and consequence rather than making the story feel like unrelated slides.