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 world’s richest man crosses Bolivia’s salt flats aboard a walking acoustic station, judging which unwanted sounds humanity may still hear.
The viewer chooses how he investigates a familiar squeak—and whether he frees it, owns it, unleashes the world’s noise, or erases it again.
define n = Character("Niko")
define e = Character("HUSH")
define m = Character("Mara")
image saltcrawler = "images/saltcrawler.png"
image niko_window = "images/niko_window.png"
image choir_chamber = "images/choir_chamber.png"
image signal_map = "images/signal_map.png"
image mara_call = "images/mara_call.png"
image reconstruction = "images/reconstruction.png"
image bakery_memory = "images/bakery_memory.png"
image decision_chamber = "images/decision_chamber.png"
image ending_whitelist = "images/ending_whitelist.png"
image ending_bakery = "images/ending_bakery.png"
image ending_shutdown = "images/ending_shutdown.png"
image ending_suppress = "images/ending_suppress.png"
transform crawl_pan:
zoom 1.08
xalign 0.0
linear 12.0 xalign 1.0
transform slow_push:
zoom 1.0
linear 10.0 zoom 1.10
transform signal_float:
yoffset 18
linear 2.0 yoffset -18
linear 2.0 yoffset 18
repeat
label start:
$ called_mara = False
# PANEL 1
scene saltcrawler at crawl_pan
with fade
"Bolivia, 18 June 2045. At 19:42, the six-legged station Kestrel walks west across the salt, keeping pace with the sunset."
# PANEL 2
scene niko_window at slow_push
with dissolve
"Niko Quill watches from its open service deck. At fifty-two, he is the richest human alive."
"His fortune is HUSH: a planetary lattice that subtracts traffic, machinery, and unwanted voices from the air."
# PANEL 3
scene choir_chamber
with wipeleft
e "Annual exception ballot ready. Three rejected sounds have appealed for permission to remain audible."
"Once a year, Niko personally judges the last appeals. This evening, the board expects three quick refusals."
# PANEL 4
scene signal_map at signal_float
with dissolve
e "Candidate 44: an irregular seven-note squeak made by damaged delivery wheels."
e "No linguistic content. No safety value. Yet it has reappeared in fourteen cities."
"Niko's hand stops above the red refusal mark. He knows the missing eighth note."
menu:
"Call Mara, the sister he has avoided for eleven years.":
jump call_mara
"Ask HUSH to reconstruct the sound's oldest source.":
jump reconstruct_source
label call_mara:
# PANEL 5
scene mara_call
with wipeleft
$ called_mara = True
m "You really don't know? Mama's bread cart. Left rear wheel."
m "We pushed it before dawn. I ran ahead in my slippers, and that squeak brought half the building downstairs."
n "I fixed it."
m "Exactly."
jump shared_memory
label reconstruct_source:
# PANEL 6
scene reconstruction
with wipeleft
e "Oldest match recovered from municipal door-camera residue. Copenhagen, 2007."
"A wireframe kitchen blooms around Niko. His mother stacks warm flatbread while two children wrestle a cart through blue morning."
"Each turn of the bad wheel makes seven small cries, then misses one."
jump shared_memory
label shared_memory:
# PANEL 7
scene bakery_memory at slow_push
with dissolve
"At nineteen, Niko greased the wheel after a landlord threatened another fine."
if called_mara:
m "The next morning, nobody came down. Mama sold half as much bread. She sold the cart a month later."
else:
e "Bakery ledger correlation: after wheel repair, street sales fell sixty-one percent. The cart was sold thirty-two days later."
"His first perfect silence had not rescued his family. It had erased their way of arriving."
# PANEL 8
scene decision_chamber
with wipeleft
e "Board reminder: admitting functionless noise may trigger 8.2 billion appeals."
"The chamber's counterphase walls swallow even Niko's breathing. His empire has made silence feel like evidence."
# PANEL 9
scene saltcrawler at crawl_pan
with dissolve
n "Suspend local cancellation. Ten seconds."
"Wind rasps the handrail. Salt clicks under Kestrel's feet. A loose cup chatters toward the edge, and Niko catches it, laughing once."
e "Ten seconds complete."
n "I didn't say to restore it."
# PANEL 10
scene signal_map at signal_float
with wipeleft
e "Correction. Candidate 44 is not an archival recurrence."
e "During last winter's heat outages, volunteer kitchens bent robot casters to announce free bread without network service."
"The old wheel has become a street protocol. Nobody using it knows the name Quill."
# PANEL 11
scene decision_chamber at slow_push
with dissolve
"Sunset reaches the far wall. In six minutes, HUSH will renew its rules for another year."
"Niko places one finger over the system that made him richer than governments."
menu:
"Classify the squeak as public language.":
jump ending_free
"Buy the custom and make it a HUSH service.":
jump ending_owned
"Take ordinary cancellation offline at sunset.":
jump ending_open
"Reject the appeal.":
jump ending_silent
label ending_free:
# PANEL 12
scene ending_whitelist
with wipeleft
n "A sound can be infrastructure. Publish that."
"HUSH opens a new category: signals owned by whoever needs them."
"By morning, bent wheels announce bread, medicine, shade, and rides home. Niko's name appears nowhere on the rule."
"For once, the richest man leaves something valuable unowned."
return
label ending_owned:
# PANEL 13
scene ending_bakery
with wipeleft
n "Acquire the carts. Bread stays free. License the sound."
"By midnight, identical white wagons roll from HUSH depots, each chirping seven flawless notes."
"Unauthorized versions vanish inside counterphase bubbles. Niko watches his mother's bad wheel become a trademark."
"His first priceless thing has a price again."
return
label ending_open:
# PANEL 14
scene ending_shutdown
with wipeleft
n "Keep emergency channels clean. Give everything else its ears back."
"Cancellation falls away with the sunset, longitude by longitude."
"Markets punish him before dawn. Beneath Kestrel, salt breaks with a sound like thin crockery."
"Niko walks outside to hear his fortune ending."
return
label ending_silent:
# PANEL 15
scene ending_suppress
with wipeleft
n "Reject it. No private copy."
e "Candidate 44 suppressed."
"The volunteer kitchens notice. The next evening, their drivers strike spoons against the cart rails instead."
"HUSH files Candidates 45 through 903 while Niko watches the list grow."
"The ordinary has learned to branch."
return
{
"style": "Hand-penciled monochrome traditional line art created entirely with graphite pencil on white paper, with no color, ink, paint, or digital rendering. Use expressive graphite contours, restrained cross-hatching, visible paper grain, broad areas of untouched white, and occasional dense black pencil shadows. Keep the futuristic machinery tactile, weathered, and mechanically plausible rather than glossy. Compose every frame cinematically for a quiet speculative drama, and render Niko consistently as a lean fifty-two-year-old man with a silver buzz cut, long angular nose, notched left eyebrow, tired deep-set eyes, and a plain quilted maintenance coat.",
"assets": [
{
"id": "saltcrawler",
"kind": "bg",
"aspect": "16:9",
"prompt": "A vast Bolivian salt flat at evening in 2045. Kestrel, a monumental six-legged acoustic maintenance station, walks slowly across the reflective polygonal salt toward a low sunset. Its body resembles a practical fusion of railway workshop, listening instrument, and migrating animal, with exposed braces and counterphase dishes. A tiny lone man stands on an exterior service deck for scale. Wide lateral composition with immense white sky and long pencil shadows."
},
{
"id": "niko_window",
"kind": "cg",
"aspect": "16:9",
"prompt": "Definitive character reference for Niko Quill: a lean fifty-two-year-old man with a silver buzz cut, long angular nose, a notch through his left eyebrow, tired deep-set eyes, narrow hands, and a plain light-colored quilted maintenance coat. He stands at the open service deck of a walking station, looking across a salt flat sunset. He should appear powerful only through stillness and attention, never through luxury. Medium-wide cinematic framing, wind touching his coat, machinery framing him asymmetrically."
},
{
"id": "choir_chamber",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko inside Kestrel's acoustic adjudication chamber, a tall circular room lined with layered baffles resembling the interior of an enormous ear or an abstract choir stall. Three simple suspended waveform sculptures await judgment. Niko stands alone at a waist-high mechanical console, dwarfed by the chamber. Sparse futuristic environment, no readable text, strong concentric perspective and large areas of white."
},
{
"id": "signal_map",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko studying a hovering physical light-map represented in pencil as fourteen delicate city points joined by wavering lines. At the center floats an irregular seven-peak waveform with a conspicuous missing eighth beat. Make the interface abstract and legible without written words. His raised hand has stopped just short of a dark refusal control. Side profile, tense negative space, the map casting pale implied light."
},
{
"id": "mara_call",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko facing a life-size communication panel showing his older sister Mara in a modest crowded kitchen. Mara has related angular features, curly graying hair loosely tied back, flour on one sleeve, and an unimpressed but wounded expression. Niko stands in the sterile acoustic chamber while her kitchen is full of utensils, plants, and ordinary clutter. Split-space composition emphasizing eleven years of distance, no readable interface text."
},
{
"id": "reconstruction",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko stands within a fragile forensic reconstruction of a Copenhagen bakery kitchen from 2007. Translucent pencil construction lines form his mother stacking flatbread and two children pushing a narrow wire bread cart with one crooked rear wheel. Adult Niko remains solid and sharply rendered while the recovered family scene is pale, incomplete, and ghostlike without implying supernatural events. Layered temporal composition, intimate domestic details."
},
{
"id": "bakery_memory",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "A remembered blue-hour street rendered without color: teenage Niko, recognizably the younger version of the reference character, kneels proudly beside a bread cart after straightening and greasing its crooked rear wheel. His mother waits with folded arms and a complicated expression; his little sister holds a stack of warm flatbread. Apartment windows above remain closed. The repaired wheel dominates the foreground, perfectly straight and tragically quiet."
},
{
"id": "decision_chamber",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko alone at the center of the acoustic chamber at sunset, one finger poised over a circular master control. Counterphase wall panels absorb the room into oppressive blank whiteness. A thin blade of sunset crosses the far wall like a deadline. Four unmarked mechanical choices radiate around his hand. Low, slightly overhead framing that makes wealth look lonely and administrative, no readable text."
},
{
"id": "ending_whitelist",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko on Kestrel's exterior deck at early morning, watching many tiny volunteer bread carts move across a distant town at the edge of the salt flat. Their deliberately bent wheels are suggested by repeated seven-mark pencil rhythms curling through the air, becoming a shared visual language. Niko is turned partly away, relaxed and anonymous. Open, generous composition with abundant white sky."
},
{
"id": "ending_bakery",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko watches through a depot window as rows of immaculate identical corporate bread robots roll beneath acoustic suppression arches. Each has a deliberately crooked wheel, while a rough homemade cart outside the gate sits inside a blank bubble of canceled sound. Niko's reflection overlays the assembly line. Precise repetition, darker graphite, claustrophobic commercial order, and no logos or readable text."
},
{
"id": "ending_shutdown",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko walking alone down Kestrel's open exterior stairs as the station crosses the salt after sunset. Around him, pencil marks evoke the newly audible world: wind over railings, rattling cups, flexing metal, insects, and salt cracking under enormous feet. His maintenance coat whips in the wind. Expansive cinematic view, energetic graphite strokes spreading outward while the horizon remains calm."
},
{
"id": "ending_suppress",
"kind": "cg",
"aspect": "16:9",
"ref": "niko_window",
"prompt": "Niko sits motionless in the silent adjudication chamber as an overwhelming branching forest of new waveform traces rises around him, each pattern different from the suppressed wheel squeak. In a small distant inset-like view, volunteer drivers strike spoons against bread-cart rails. The proliferating marks resemble stubborn pencil roots cracking a blank page. Niko's face shows awe, defeat, and the beginning of a smile; no readable text."
}
]
}
niko_window establishes Niko’s definitive design, and every later asset containing him uses it directly as its visual reference.Long-running camera transforms continue across click-held dialogue, so each composition remains alive while the viewer reads; the script then reserves wipes and reframings for changes in memory, evidence, or moral direction, making the panels behave like edited shots rather than isolated illustrations.