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, the man who taught machines to print any flavor on Earth spends one evening chasing the single bowl his machine cannot: the noodles a street vendor fed him when he was a hungry kid — on the last night before his own company demolishes her street.
The choices: accept the machine's 97.4% imitation or go out into the rain; how to face the vendor's granddaughter; and how to settle a forty-year-old debt — confess it, pay it, or learn the recipe by hand.
# TWO POINT SIX PERCENT
# An evening in the life of Silas Fen, 2045.
define s = Character("Silas")
define w = Character("Wren")
define p = Character("PALATE")
define a = Character("Auntie")
default asked_hungry = False
image bg_lighthouse = "images/bg_lighthouse.png"
image bg_lamproom = "images/bg_lamproom.png"
image bg_shallows = "images/bg_shallows.png"
image bg_stall = "images/bg_stall.png"
image silas_neutral = "images/silas_neutral.png"
image silas_bowl = "images/silas_bowl.png"
image wren_neutral = "images/wren_neutral.png"
image cg_memory = "images/cg_memory.png"
image cg_bowl = "images/cg_bowl.png"
image cg_iou = "images/cg_iou.png"
image cg_dishes = "images/cg_dishes.png"
image cg_shelf = "images/cg_shelf.png"
image cg_dawn = "images/cg_dawn.png"
transform slow_pan:
xalign 0.5
yalign 0.5
xanchor 0.5
yanchor 0.5
zoom 1.08
xoffset 0
linear 22.0 xoffset -70
transform slow_push:
xalign 0.5
yalign 0.5
xanchor 0.5
yanchor 0.5
zoom 1.0
linear 20.0 zoom 1.12
transform idle_bob:
yoffset 0
linear 2.4 yoffset -6
linear 2.4 yoffset 0
repeat
transform enter_left:
xalign 0.25
yalign 1.0
zoom 0.55
xoffset -90
alpha 0.0
easein 0.9 xoffset 0 alpha 1.0
transform enter_right:
xalign 0.75
yalign 1.0
zoom 0.55
xoffset 90
alpha 0.0
easein 0.9 xoffset 0 alpha 1.0
transform spot_left:
xalign 0.25
yalign 1.0
zoom 0.55
label start:
# PANEL 1
show bg_lighthouse at slow_pan
with fade
"2045. On a grey mile of northern coast, in the last lighthouse anybody bothered to keep, lives the richest man alive."
"Silas Fen. Sixty-one. He founded Palate, the printer that put any flavor ever recorded into any kitchen on Earth."
"It made him everything he is. It also ended cooking, more or less, the way the engine ended the horse."
"Ships steer by satellite now; no one needs the lamp. He keeps it turning anyway, the way other men keep gardens."
"Once a year, on this night, he asks the machine for the same thing. This is that night."
# PANEL 2
scene bg_lamproom with dissolve
show silas_neutral at enter_left, idle_bob
"The lamp room is all glass and weather. Below, the sea. Above, the great lens turns, polishing the dark."
"Where the keeper once kept his log stands a white cabinet with a slot for a bowl: the home model of the thing that made him."
s "Profile seven. Again."
p "Profile seven, “the bowl.” Loaded, Mr. Fen. Same as every year."
"He described it to the machine forty years ago and a thousand times since, the way you would describe a face you loved."
s "Tell me the number first."
# PANEL 3
p "Concordance: ninety-seven point four percent. Unchanged."
"Ninety-seven point four. The machine can plate a dead emperor's banquet. It cannot plate one bowl of noodles from a flood street."
p "However. A living match has been found. One heritage stove still cooks from the same profile. The Shallows, lower tier."
p "Its license lapses at midnight. The district is cleared at dawn. Tonight is the last service."
"The lens turns. Rain starts up the glass, soft as static."
s "How long to the Shallows?"
p "Fifty minutes by the coast line. Sir — you have never once gone."
s "No. I have never once gone."
menu:
"Take the pour. Ninety-seven point four is close enough.":
jump ending_almost
"Put on the coat. Go down to the Shallows.":
jump descent
label ending_almost:
# PANEL 4
p "Pouring."
show cg_bowl at slow_push
with dissolve
"It comes up perfect. It always comes up perfect. Noodles with the right give, scallion cut the way she cut it, an egg broken in at the end."
"He eats standing, the way he ate then. It is the finest bowl of soup ever printed, and it tastes like almost."
s "Two point six percent."
"He has bought companies for less than two point six percent. There is nothing in the catalog called being fed."
hide cg_bowl
with dissolve
# PANEL 5
"He finishes it. He always finishes it. Waste is the one sin he still believes in."
"He sets the bowl down for the machine to wash. The lens turns. The rain crosses the glass like it is looking for someone."
"Up and down the coast the ships steer themselves home, and not one of them looks up."
centered "{i}Close enough is the most expensive thing he owns.{/i}"
return
label descent:
# PANEL 6
scene bg_shallows with dissolve
"He takes the coast line down alone, in a plain coat, collar up. The oldest disguise there is: nobody looks twice at a cold old man."
"The Shallows. Forty years since he's seen them, and they are exactly as drowning as he left them — stilt houses, walkways, laundry over black water."
"On every door, a notice. CLEARED AT DAWN, BY ORDER OF HARBORWORKS. He doesn't read them. He has people who read things."
"Then, under a tarp at the end of the lowest walkway: a gas flame, blue as a bruise, illegal in three ways. Steam. And a smell —"
"— and forty years fall off him like rain off a tarp."
# PANEL 7
scene bg_stall with dissolve
show silas_neutral at enter_left, idle_bob
show wren_neutral at enter_right, idle_bob
"The stall is a pot, a plank counter, two stools, and a woman of maybe thirty, towel on her shoulder, her grandmother's ladle in her fist."
w "Last night. We're cooking what's left, and what's left is noodles. What'll it be?"
menu:
"“The usual.”":
jump order_usual
"“Whatever the pot's got.”":
jump order_pot
"“What did the hungry ones get?”":
jump order_hungry
label order_usual:
w "The usual. Mister, nobody's had a usual here since my grandmother died. But I like the nerve."
jump stall_bowl
label order_pot:
w "Honest answer. Noodles, scallion, an egg cracked in at the end. Broth's been going since Tuesday. Sit."
jump stall_bowl
label order_hungry:
$ asked_hungry = True
"She stops with the ladle halfway to the pot, and looks at him for a long moment."
w "That's an old question. The hungry ones got the same as everyone. Just free. Who taught you to ask that?"
s "A woman with a ladle."
jump stall_bowl
label stall_bowl:
# PANEL 8
hide silas_neutral
show silas_bowl at spot_left, idle_bob
with dissolve
"The stool is plastic, cracked, mended with wire. Above him the tarp ticks with rain."
w "Eat it while it's angry."
show cg_bowl at slow_push
with dissolve
"The bowl comes down in front of him, and the steam comes up, and for a moment he does not trust his hands."
"Noodles. Scallion. An egg broken in at the end, the yolk going gold into the broth."
"He lifts it. He eats."
show cg_memory at slow_push
with irisin
"He is nineteen, and it is the coldest night of a cold year, and he has not eaten in two days."
"Auntie — the whole street called her Auntie — looks at his shoes, not his face. Fills a bowl. Sets it down."
a "Eat. Pay me when you're rich."
"He is too hungry to cry, so he eats. The broth is bones and time. The egg breaks like a small sun."
"Outside, the rain. Inside, the steam. Between them, a boy learning the world had one warm place in it."
"He never wrote down how she made it. Nobody did. She cooked by handfuls, and then she was gone, and the recipe went with her."
hide cg_memory
with irisout
hide cg_bowl
with dissolve
# PANEL 9
"The bowl is empty before he knows it. He sits with both hands around the warmth, like a man twice his age. He nearly is."
w "You eat like someone my grandmother knew. Head down, like the bowl might get taken away."
s "It was, once or twice."
w "Last night, then the wall goes up."
"She jerks her chin at the notices on the doors."
w "Harborworks. Some billionaire's storm wall. Saves the whole city by drowning my street. Fair trade, probably. Everything's a fair trade now."
"Silas Fen — chairman of Harborworks, signer of a hundred documents every Tuesday — looks at the notice and says nothing at all."
s "Probably."
# PANEL 10
w "You want to see something? Since you eat like family."
show cg_iou at slow_push
with dissolve
"She sets a tea tin on the counter and opens it. Inside: paper slips. Hundreds, soft with age."
w "Her bank. Everybody who ever owed her a bowl wrote a slip. She never cashed one. Said the interest was that you come back."
if asked_hungry:
w "You asked what the hungry ones got. This. A bowl, and a slip, and a reason to come back."
"She digs, laughing — then stops, and holds one up to the lamp. Older than she is. A boy's handwriting."
w "“I.O.U. one bowl.” Initials S.F. Ring any bells?"
"The rain ticks. The flame hisses. The richest man alive reaches for the slip with fingers that have forgotten how to be careful."
hide cg_iou
with dissolve
menu:
"Tell her.":
jump branch_reveal
"Pay it.":
jump branch_debt
"Ask her to teach you.":
jump branch_recipe
label branch_reveal:
# PANEL 11
s "S.F. Silas Fen."
"She laughs — one short bark — and then she looks at him. Really looks. The laugh dies somewhere on the way down."
w "You're on the money. Your face is on the money."
s "I know. I'm sorry about that too."
w "Harborworks. That's you. The wall is you."
s "Give me the night."
"He lifts his hand and speaks to the air, and the air carries his voice up-coast. Hold the Shallows. Stop the crews."
"A pause. Then a voice he pays very well tells him, gently, what he already knows."
s "The contracts execute themselves. I sold the company that owns the company that pours the wall. It doesn't need me anymore."
s "Nothing I built needs me anymore."
# PANEL 12
w "Hey. Look at me."
w "Don't you dare save us anyway. You save us, we're a museum. A heritage stall in a rich man's garden. I'd rather be a kitchen."
"She takes the slip from his fingers, strikes a match off the counter, and burns it over the pot."
w "Debt's not money. Debt's a promise you show up. You showed up. Forty years late is still showing up."
"At dawn the crews come, and the stall comes down plank by plank, and she lets him carry the gas canister, because it's heavy."
show cg_shelf at slow_push
with fade
"Before they part, she presses something into his arms, wrapped in a towel. The chipped bowl. Chips are lucky, she says. Means it survived something."
"The magazines print lists of everything he owns. The lists are wrong by one bowl."
centered "{i}The light turns. The shelf holds.{/i}"
return
label branch_debt:
# PANEL 13
"He sets a card on the counter. Black, no name, the kind that opens doors in four hundred countries."
s "One bowl. Forty years of interest. Name the figure."
"She looks at the card the way you'd look at a fish on a doorstep. Then she pushes it back with one finger."
w "Auntie didn't run a tab, she ran a kitchen. We don't take money we didn't cook for."
w "But there is one thing, since you're offering."
show cg_dishes at slow_push
with dissolve
"She points him at the basin. Closing night. The dishes are a mountain, the water is cold, and the soap is the cheap kind."
# PANEL 14
"So the richest man alive rolls his sleeves and washes. His hands remember before he does. They have done this work, somewhere, before the money."
w "You wash like a man who's had staff. Again."
"Somewhere across the water a market opens, and his fortune grows by the price of a street. He washes a bowl. He rinses it. He washes another."
hide cg_dishes
with dissolve
"She holds the last bowl up to the lamp, squints like a jeweler, and sets it on the rack."
w "Clean. Debt paid."
s "How do you figure?"
w "You came back. That was the interest."
centered "{i}Paid in full.{/i}"
return
label branch_recipe:
# PANEL 15
s "Teach me."
w "It's the last night of the last stall in the Shallows, and you want a cooking lesson."
s "I've paid more for less."
"She studies him, then ties an apron on him like he's a boy again, and puts the ladle in his hand."
w "Bones in at first light. Skim it. A handful of scallion —"
s "How much is a handful?"
w "A handful. Until it smells like evening. You'll know."
s "How long does it cook?"
w "Until it's done."
"Forty years he asked a machine for this, and the machine was never wrong. It was never right, either. Right, it turns out, is not a number."
# PANEL 16
show cg_dawn at slow_push
with fade
"The sky goes the color of dishwater, then of tin, then of the inside of an oyster. Two bowls on the counter. Hers, and his."
"He tastes his own. It is wrong. The noodles are soft, the broth is shy, the egg broke too early."
s "It's wrong."
w "It's yours. That's what wrong means, the first time."
"Behind them the crews come up the walkway, and she is in no hurry, and neither, for the first time in forty years, is he."
"Up-coast, in a lighthouse full of machines that are never wrong, a man will burn breakfast for years. Getting it wrong. Getting closer."
centered "{i}Until it smells like evening.{/i}"
return
{
"style": "Hand-penciled monochrome illustration, traditional graphite on paper: visible pencil strokes, cross-hatching, smudged shading, and the tooth of the paper. Strictly black, white, and grey — no color, no ink wash, no digital effects. Cinematic framing with deep blacks reserved for night, sea, and weather, and generous bare paper left for steam, rain-light, and the lighthouse beam. Quiet, tender, documentary mood; faces drawn with soft, careful line work; no captions or lettering except where a prompt explicitly asks for handwriting.",
"assets": [
{
"id": "bg_lighthouse",
"kind": "bg",
"aspect": "16:9",
"prompt": "Wide establishing shot at dusk: a lone old lighthouse on a rocky headland above a dark sea, its beam sweeping out over black water, first rain in the air, a few gulls. Deep blacks in sky and sea, the beam left as bare paper. No people. Cinematic, melancholy."
},
{
"id": "bg_lamproom",
"kind": "bg",
"aspect": "16:9",
"prompt": "Interior of a lighthouse lamp room at night: a great faceted glass lens on brass fittings at center, rain-streaked panes all around, dark sea beyond. In one corner a sleek white food-printer cabinet with a bowl slot; an old coat on a hook; a small stool. Moody, quiet. No people."
},
{
"id": "bg_shallows",
"kind": "bg",
"aspect": "16:9",
"prompt": "A flooded old city district at night in the rain: wooden houses on stilts over black canal water, sagging walkways, hanging laundry, paper lanterns, official demolition notices pasted on doors, a distant elevated train line glowing far off. Atmospheric, layered. No people."
},
{
"id": "bg_stall",
"kind": "bg",
"aspect": "16:9",
"prompt": "A tiny street-food stall at night under a patched tarp: a big steaming pot over a small gas flame, a plank counter, two cracked plastic stools, one hanging bulb, rain dripping off the tarp edge, dark water and lantern light behind. Intimate, warm against the wet dark. No people."
},
{
"id": "silas_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-length portrait of a 61-year-old man: short silver hair, silver stubble, tired intelligent eyes, deep lines, wearing a plain long dock coat with the collar turned up, hands in pockets, standing slightly hunched against weather. Plain white background, no scenery."
},
{
"id": "silas_bowl",
"kind": "sprite",
"aspect": "9:16",
"ref": "silas_neutral",
"prompt": "The same 61-year-old man, seated on a low plastic stool in his long dock coat, holding a steaming noodle bowl in both hands with chopsticks, head bowed slightly toward the steam, expression unguarded and almost young. Full figure. Plain white background, no scenery."
},
{
"id": "wren_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full-length portrait of a woman about thirty: hair tied back, rolled sleeves, a worn apron, a towel over one shoulder, holding a soup ladle loosely, stance wary but warm, faint skeptical smile. Plain white background, no scenery."
},
{
"id": "cg_memory",
"kind": "cg",
"aspect": "16:9",
"ref": "silas_neutral",
"prompt": "Flashback at a night street stall in cold rain, forty years earlier: the same man as a gaunt, hungry 19-year-old in a thin courier jacket, sitting hunched on a stool, while an elderly woman's forearms and hands set a steaming bowl before him — her face stays out of frame. Steam, rain, one hanging bulb. Tender, grainy, remembered."
},
{
"id": "cg_bowl",
"kind": "cg",
"aspect": "16:9",
"prompt": "Extreme close-up of a bowl of noodle soup on a worn wooden counter: hand-pulled noodles, chopped scallion, a soft egg yolk just breaking gold into dark broth, chopsticks resting on the rim, steam curling up into blackness. Everything beyond the bowl falls into shadow."
},
{
"id": "cg_iou",
"kind": "cg",
"aspect": "16:9",
"prompt": "Close-up of an open old tea tin on a counter, packed with hundreds of folded paper slips soft with age; one slip lies unfolded in front, covered in a child's clumsy pencil handwriting, the words not quite legible. Warm lamplight, darkness all around."
},
{
"id": "cg_dishes",
"kind": "cg",
"aspect": "16:9",
"ref": "silas_neutral",
"prompt": "Close-up of the same old man's hands washing ceramic bowls in a cold metal basin, dock coat sleeves rolled, cheap suds, a stack of clean bowls beside him, light from one hanging bulb. Face out of frame. Humble, careful work."
},
{
"id": "cg_shelf",
"kind": "cg",
"aspect": "16:9",
"prompt": "Still life: a single chipped ceramic bowl on a plain wooden shelf inside a dark lighthouse room; through glass behind it the lighthouse beam sweeps past, catching the chip in the rim. Everything else in shadow."
},
{
"id": "cg_dawn",
"kind": "cg",
"aspect": "16:9",
"prompt": "A street-food stall counter at first light: two bowls of noodle soup side by side, one perfect and one slightly crooked with a broken egg, both steaming; behind them a grey dawn sky over calm flood water and the distant work lamps of a demolition crew far down the walkway. Quiet, unresolved, hopeful."
}
]
}
# PANEL markers.silas_neutral is generated first and passed as the visual reference for silas_bowl, cg_memory, and cg_dishes, so face, coat, and build stay the same man across forty years and every panel, under one fixed pencil style.The single structural decision is that the film is built around one cut. Instead of hopping scene-to-scene like a slideshow, the evening holds on a few persistent sets while full-screen CG inserts — the bowl, the IOU tin, the dishes — are shown and hidden over them like film inserts, and irisin/irisout is used exactly once, as a match cut from the steam of the present-tense bowl into the memory and back out again. Because the sprites keep breathing on idle_bob, the establishing shot drifts on slow_pan, and every insert keeps pushing in on slow_push while text plays, no panel is ever a still: the camera is always rolling, and that one iris cut lands like an edit in a film rather than a page turn.