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.
A leaking market arcade, 2045: the man who taxes every digital please spends Tuesday in a communal darkroom and develops a stranger’s roll — a vending machine, a paid cup, a note for whoever the machine just robbed. Drown the frame or lift it; then walk back to the corridor, leave the print for the next pair of hands, or cut a hole in Please before the board wakes.
define m = Character("Merrick", color="#d4d0c8")
image bg_arcade = "images/bg_arcade.png"
image bg_threshold = "images/bg_threshold.png"
image bg_darkroom = "images/bg_darkroom.png"
image bg_trays = "images/bg_trays.png"
image bg_alcove = "images/bg_alcove.png"
image bg_clock = "images/bg_clock.png"
image man_coat = "images/man_coat.png"
image man_work = "images/man_work.png"
image man_wetprint = "images/man_wetprint.png"
image cg_frame = "images/cg_frame.png"
image man_street = "images/man_street.png"
image man_slate = "images/man_slate.png"
transform breath:
ease 2.2 yoffset 5
ease 2.2 yoffset 0
repeat
transform swayprint:
ease 1.8 xoffset 7 rotate 0.7
ease 1.8 xoffset -7 rotate -0.7
repeat
transform risein:
yoffset 46 alpha 0.0
ease 1.3 yoffset 0 alpha 1.0
label start:
# PANEL 1
scene bg_arcade
with dissolve
show man_coat at right, breath
"Rain uses the same wound in the arcade glass it used last October."
"Tuesday evening, 2045. The market has already sent the living home."
"A man in a coat too ordinary for the tickers walks the wet tiles like a janitor."
# PANEL 2
scene bg_threshold
with wipeleft
show man_coat at center, breath
"The basement door wakes and brightens, painfully polite."
"It asks, in a voice heard by half the planet, whether it may know him."
"He answers with a brass key. The lock predates Please, and likes him for it."
# PANEL 3
scene bg_darkroom
with dissolve
show man_coat at right, breath
"Safelight the color of an old scrape. Trays already poured. The hook knows his coat."
"His pocket clears its throat."
"“Fourteen billion grants since dawn, Mr. Ott. The board is breathing. Shall I summarize?”"
"He lays the slate face down on the dry bench.{w=0.5} This is the hour he still comes to make pictures no one requested."
# PANEL 4
scene bg_trays
with dissolve
show man_work at right, breath
"Sleeves. Tongs. A ritual that does not ping."
"He feeds a roll he shot last month: the cracked roof, a dog on a warm grate, his own hands."
"He likes these frames because they never ask if they may be seen."
# PANEL 5
scene bg_darkroom
with dissolve
show man_work at center, breath
"The communal camera waits in its labeled drawer, honest as a borrowed cup."
"Someone has left a roll inside. The checkout card is blank on purpose."
"He ought to put it back.{w=0.5} He threads it onto the reel instead."
# PANEL 6
scene bg_trays
show cg_frame at truecenter, risein
with pixellate
"In the tray, silver decides to become a place."
"A vending machine at an hour that has no audience."
"A paper cup already paid for. A scrap of receipt taped to the glass."
# PANEL 7
show cg_frame at truecenter, swayprint
show man_wetprint at right, breath
"The print turns a little on the water, as if it has a pulse of its own."
"Ink on the scrap, blocky, kind:"
"{i}For whoever the machine just robbed.{/i}"
"He knows the dent in that left door."
"His hip made it, twenty-two years back, in a corridor that smelled of burnt dust and cheap broth."
"Four coins. The machine kept two. Then this. Then a photograph he does not remember taking."
"His hands know two ways to finish a tray."
menu:
"Lift the paper. Keep looking.":
jump lift_it
"Give it back to the black.":
jump let_go
label let_go:
# PANEL 8
scene bg_trays
show man_work at center, breath
with dissolve
"He tilts the tray. The machine, the cup, the sentence — they loosen, then go."
"Silver forgets faster than men do."
"He watches until there is only night in the water."
# PANEL 9
scene bg_darkroom
show man_coat at right, breath
with dissolve
"Trays emptied. Coat. The slate, still prone, lights one patient edge."
"He does not turn it over."
"He has been consistent his entire second life."
# PANEL 10
scene bg_clock
show man_coat at left, breath
with wipeleft
"Outside, the market clock requests permission to strike nine."
"He grants it. Of course he does."
"Bells happen, carefully."
"He walks home as the man the century cannot stop paying,{w=0.5} and no one leaves him a cup."
return
label lift_it:
# PANEL 11
scene bg_darkroom
show cg_frame at truecenter, swayprint
show man_wetprint at right, breath
with dissolve
"He lifts it dripping. The safelight makes the tape on the glass look like a small sun."
"He was a student with a basement badge."
"He wrote the first Please as a joke — that doors would learn to knock."
"The cup had been warm. He drank it in the corridor and did not say thank you, because there was no one to say it to."
# PANEL 12
hide cg_frame
show man_wetprint at center, breath
"That was the last time the world handed him something without a box to tick."
"After Please, even gifts queued."
"Even lovers asked, and asked well, and the asking became the whole romance."
"He became the toll on every yes."
"The corridor dust is still on his teeth."
menu:
"Walk to the old service corridor.":
jump walk_there
"Pin the print on the communal line.":
jump pin_it
"Cut a hole in Please before the board wakes.":
jump cut_hole
label walk_there:
# PANEL 13
scene bg_alcove
show man_street at center, breath
with wipeleft
"The corridor is a polite pillar now. It offers to guide him if it may."
"He buys two paper coffees from a cart that apologizes three times for the steam."
"One cup he drinks."
"The other he sets on the pillar without pairing it to any account."
"The pillar blinks, lost. A student with a wet hood takes the cup and thanks the air."
"Merrick is already turning away, poorer by a warmth he cannot invoice."
return
label pin_it:
# PANEL 14
scene bg_darkroom
show cg_frame at truecenter, swayprint
show man_wetprint at right, breath
with dissolve
"He clips the wet picture to the communal line, among other people’s birthdays and windows."
"Tomorrow a stranger will stand where he is standing and be offered a sentence."
"He washes the trays until his hands smell only of fixer."
"He leaves the door unlatched, which is, in his city, a kind of crime,{w=0.5} and also a kind of cup."
return
label cut_hole:
# PANEL 15
scene bg_darkroom
show man_slate at center, breath
with dissolve
"The old code window is still on the slate, like a bad tooth he never had pulled."
"He writes one quiet rule."
"Once a day, a device may give and not ask, and not write it down."
"He does not name the rule. He sends it while the market clock is still requesting nine."
"Somewhere a number will fall like a plate."
"He stands under the safelight and waits to feel the size of an ordinary man."
return
{
"style": "Hand-penciled monochrome traditional line art created entirely with pencil and paper. Graphite on off-white stock, visible pencil grain and erased ghost lines left in, no ink, no wash of color, no digital smoothness. Soft midtone hatching for shadow, the reserved white of the paper for safelight, wet highlights, and rain. Observational still framing like a contact sheet, generous unworked paper at the edges. The same long-faced man in his late fifties whenever he appears: deep-set eyes, a notch in the left eyebrow, short salt hair combed with fingers, a mouth that looks about to apologize, long unbuttoned raincoat over a dark knit sweater, dark trousers, scuffed shoes.",
"assets": [
{
"id": "bg_arcade",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide interior of a 19th-century covered shopping arcade at dusk in 2045, cracked glass roof with rain leaking through, wet checkered tile floor reflecting a few small polite glowing request-posts along shuttered stalls, one ordinary man in a long raincoat walking away at far right, empty market, quiet, lots of unworked paper at the edges, graphite pencil only."
},
{
"id": "bg_threshold",
"kind": "bg",
"aspect": "16:9",
"prompt": "A scuffed basement door slightly ajar beneath a market, red safelight leaking from the stairwell, a small glowing ask-panel on the doorframe, a brass key in the old lock, wet footprints on stone steps, no luxury, cramped service architecture, graphite pencil drawing with heavy door grain and pale paper for the red light."
},
{
"id": "bg_darkroom",
"kind": "bg",
"aspect": "16:9",
"prompt": "Cramped communal photographic darkroom, not luxurious, enlarger, deep sink, hanging line with a few curling blank sheets, chemical bottles, pipes along the ceiling, a coat hook, one red safelight as the brightest unshaded paper, trays on a bench, 2045 only in a face-down slim slate on the dry corner, graphite pencil, empty of people."
},
{
"id": "bg_trays",
"kind": "bg",
"aspect": "16:9",
"prompt": "Close wide view of three photographic developing trays on a stained bench, tongs, rippled chemical surfaces catching a red safelight, no readable image in the water yet, no people, tight observational framing, graphite hatching in the liquid, reserved white paper for wet highlights."
},
{
"id": "bg_alcove",
"kind": "bg",
"aspect": "16:9",
"prompt": "Night view of a former university service corridor remade in 2045, a tall slim polite consent-pillar with a small waiting light where a vending machine once stood, a street-cart with a steam kettle at the edge, wet pavement, distant campus brick, empty of people, graphite pencil, quiet and a little cruel in its cleanliness."
},
{
"id": "bg_clock",
"kind": "bg",
"aspect": "16:9",
"prompt": "Exterior night square outside a covered market, a clock tower with a tiny polite light beside the clock face as if the clock were asking something, wet cobbles, closed iron shutters, one street almost empty, 2045 street furniture that looks like it might apologize, graphite pencil, rain indicated with erased and redrawn lines."
},
{
"id": "man_coat",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-body standing figure of a late-fifties man, three-quarter view facing left, long unbuttoned raincoat, dark knit sweater, dark trousers, scuffed shoes, short salt hair, notch in the left eyebrow, tired apologetic mouth, arms relaxed, standalone on blank paper with no background, graphite pencil figure ready to overlay on a scene."
},
{
"id": "man_work",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_coat",
"prompt": "Same late-fifties man as the reference, full-body, coat off, charcoal sweater with sleeves rolled to the elbow, dark trousers, holding developing tongs in his right hand, looking down at work, notch in the left eyebrow, salt hair, standalone on blank paper, no background, graphite pencil."
},
{
"id": "man_wetprint",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_coat",
"prompt": "Same late-fifties man as the reference, full-body, coat off, sleeves rolled, both hands holding a dripping rectangular photographic print at chest height, looking at it with a still face, wet fingers, notch in the left eyebrow, standalone on blank paper, no background, graphite pencil."
},
{
"id": "cg_frame",
"kind": "cg",
"aspect": "3:2",
"prompt": "A curling wet darkroom print drawn as an object: white paper border, slightly warped, showing a late-night vending machine with a dented left door, a paper cup sitting on the machine already paid, a scrap of receipt taped to the glass with blocky handwritten words, empty corridor around it, the whole thing still only graphite pencil, not a realistic photograph, safelight feeling, lots of pale paper."
},
{
"id": "man_street",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_coat",
"prompt": "Same late-fifties man as the reference, full-body in the long unbuttoned raincoat, holding two paper coffee cups, one slightly extended as if to set it down, notch in the left eyebrow, salt hair, damp coat hem, standalone on blank paper, no background, graphite pencil."
},
{
"id": "man_slate",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_coat",
"prompt": "Same late-fifties man as the reference, full-body, coat off, slightly hunched, holding a thin lit slate in both hands as if typing, face lit from below by the slate, notch in the left eyebrow, mouth set, standalone on blank paper, no background, graphite pencil."
}
]
}
man_coat is drawn first with no ref; the four later portraits name it as ref so the notch, mouth, hair, and clothes stay one person.The evening is staged as a held shot rather than a deck of stills: looping transforms stay alive under the lines, so rain-weight in the shoulders and the print’s small rotation continue while the viewer reads, and geography is cut with wipes and a pixellate that behaves like silver coming up, not like a slide advancing.