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.
An agrotech titan spends New Year's Eve 2045 inside a subglacial soil vault, where an uncataloged mason jar of pre-collapse orchard mud shatters his synthetic empire. The player decides whether he sequences the wild soil to dismantle his sterile monopoly, incinerates it to preserve order, or locks himself away with the memory.
# Ren'Py 8.x / Python 3 Script
# Resolution: 1920x1080
init:
# Transforms
transform drift_slow:
xalign 0.5 yalign 0.5
subpixel True
linear 18.0 xalign 0.55 yalign 0.52
transform focus_in:
xalign 0.5 yalign 0.5
subpixel True
easein 3.5 zoom 1.08
transform pulse_subtle:
xalign 0.5 yalign 0.5
subpixel True
block:
ease 4.0 zoom 1.02
ease 4.0 zoom 1.00
repeat
# Image declarations (single-token names)
image bg_vault = "images/bg_vault.png"
image bg_table = "images/bg_table.png"
image bg_incinerator = "images/bg_incinerator.png"
image bg_greenhouse = "images/bg_greenhouse.png"
image man_neutral = "images/man_neutral.png"
image man_gaze = "images/man_gaze.png"
image man_resolute = "images/man_resolute.png"
image man_soft = "images/man_soft.png"
image cg_jar = "images/cg_jar.png"
image cg_soil = "images/cg_soil.png"
define narrator = Character(None)
define j = Character("Julian Vane", color="#c8c8c8")
label start:
# PANEL 1
scene bg_vault at drift_slow
with wipeleft
narrator "Sub-Svalbard Repository Seven, December 31, 2045."
narrator "Three hundred meters beneath the permafrost, Julian Vane spends New Year's Eve alone with the world's mineral ledger."
# PANEL 2
show man_neutral at pulse_subtle
with dissolve
narrator "He is fifty-eight years old, worth six hundred billion credits, and owns the synthetic mycorrhizal patents that feed nine billion souls."
j "“No receptions. No broadcast from Geneva. Just the yearly audit.”"
# PANEL 3
scene bg_table
with dissolve
narrator "His evening task is routine: certifying decommissioned agricultural seed lots acquired before the 2038 global topsoil collapse."
narrator "Every grain of dirt on the planet today is manufactured Humus-9—sterile, vitamin-coated, and licensed under his seal."
# PANEL 4
scene bg_table
show man_neutral at focus_in
with dissolve
narrator "Beneath packing foam in crate 00-Delta, Julian's fingers touch cold glass instead of an alloy canister."
narrator "It is a heavy mason jar, sealed with cracked paraffin and masking tape yellowed by thirty winters."
# PANEL 5
scene cg_jar at pulse_subtle
with dissolve
narrator "Handwritten on the peeling tape in blue ballpoint ink: {i}Orchard Bed 4, Rhone Valley, October 1999.{/i}"
narrator "The year he turned twelve. The autumn before his family sold the farm to an aggregate fertilizer trust."
# PANEL 6
scene bg_table
show man_gaze at pulse_subtle
with dissolve
narrator "He snaps the brittle paraffin wax. The vacuum seal gives way with a sharp hiss."
narrator "Geosmin fills the freezing chamber—the raw, earthy smell of rain striking unfiltered, unpatented decaying leaves."
# PANEL 7
menu:
"Place the loam beneath the molecular sequencer immediately.":
jump path_analyze
"Pour the loam into his bare hands and inhale the scent.":
jump path_remember
label path_analyze:
# PANEL 8
scene cg_soil at focus_in
with dissolve
narrator "The analytical spectrometer paints the table in cold phosphor green."
narrator "Living actinobacteria. Wild nematode eggs. Microscopic spores that modern agritech scrubbed from the Earth to enforce synthetic dependency."
j "“It isn't sterile. It survived in the dark for forty-six years without a single license.”"
jump path_choice_final
label path_remember:
# PANEL 9
scene cg_soil at pulse_subtle
with dissolve
narrator "He presses the crumbly grey-black earth against his palms, feeling the grit of crushed river silt and decomposed oak bark."
narrator "He remembers kneeling in cold October mud with his grandfather, digging for nightcrawlers without gloves, before algorithms replaced the rain."
j "“We spent thirty trillion dollars building dust that never dies... and never lives.”"
jump path_choice_final
label path_choice_final:
# PANEL 10
scene bg_table
show man_gaze at focus_in
with dissolve
narrator "The jar sits open between his hands. The automated vault alert flashes amber on the wall console: {i}Unregistered biological agent detected.{/i}"
narrator "In twelve minutes, the automated clean-sweep protocol will purge the room unless he enters an override code."
# PANEL 11
menu:
"Release the wild strain into the deep subglacial germplasm nursery.":
jump ending_reseed
"Drop the jar into the decontamination incinerator.":
jump ending_incinerate
"Seal the jar inside his coat and seal the vault doors behind him forever.":
jump ending_relic
label ending_reseed:
# PANEL 12
scene bg_greenhouse at drift_slow
with wipeleft
show man_resolute at pulse_subtle
with dissolve
narrator "Julian overrides the safety interlocks and scatters the unsterile loam across the synthetic nursery beds."
narrator "By morning, wild unpatented mold will ride the ventilation shafts across every underground seed-vault on the continent."
j "“Let the empire rot. Let the real mud grow.”"
narrator "The richest man in the world walks out into the arctic dawn, penniless in spirit, finally breathing."
return
label ending_incinerate:
# PANEL 13
scene bg_incinerator at focus_in
with wipeleft
show man_neutral at pulse_subtle
with dissolve
narrator "Julian drops the jar into the plasma chute. The white thermal blast consumes forty-six years of memory in three seconds."
narrator "The air scrubbers engage. The geosmin vanishes, replaced by the clean, metallic odor of ozone and profit."
j "“Order requires sacrifice. The world cannot afford nostalgia.”"
narrator "He logs the crate as incinerated waste, adjusts his cuffs, and prepares his speech for Geneva."
return
label ending_relic:
# PANEL 14
scene bg_vault at drift_slow
with wipeleft
show man_soft at pulse_subtle
with dissolve
narrator "Julian pockets the unsealed jar inside his wool coat, overrides the vault seals, and severs the satellite uplink."
narrator "He sits on the cold iron steps of the bunker, inhaling the scent of a lost orchard until the emergency batteries run quiet."
j "“Just this one handful. The rest of the world can buy their dust.”"
narrator "He stays in the dark beneath the ice, holding the only unowned thing left on Earth."
return
{
"style": "Hand-penciled traditional line art on textured heavy paper, monochrome graphite sketching, fine crosshatching, raw pencil strokes, high contrast shading with luminous paper highlights, stark architectural framing, no color, no digital smoothing.",
"assets": [
{
"id": "bg_vault",
"kind": "bg",
"aspect": "16:9",
"prompt": "Vast subterranean permafrost vault interior in the year 2045, brutalist concrete arches, massive cryogenic storage drums covered in light frost, industrial overhead gantry cranes, heavy pipes, moody graphite crosshatching, solitary atmosphere."
},
{
"id": "bg_table",
"kind": "bg",
"aspect": "16:9",
"prompt": "Close shot of a heavy steel laboratory workbench in a cold vault, holographic status screens in standby, opened wooden cargo crate with shredded paper packing, precise pencil hatching, deep shadows."
},
{
"id": "bg_incinerator",
"kind": "bg",
"aspect": "16:9",
"prompt": "Industrial bio-hazard decontamination chute and plasma incinerator furnace inside a high-tech bunker, circular steel hatch radiating intense graphite shading, harsh stark lighting."
},
{
"id": "bg_greenhouse",
"kind": "bg",
"aspect": "16:9",
"prompt": "Deep underground experimental botanical germplasm nursery, terraced planting beds stretching into deep perspective, automated misting rigs, fine graphite rendering of damp soil beds and overhead grow lights."
},
{
"id": "man_neutral",
"kind": "sprite",
"aspect": "9:16",
"prompt": "Full body character sketch of Julian Vane, 58 years old, lean billionaire recluse, aristocratic sharp jawline, short silvering hair swept back, wearing an austere heavy charcoal wool thermal smock over dark trousers, watchful neutral expression, detailed pencil sketch on clean background."
},
{
"id": "man_gaze",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "Julian Vane shown from chest up, holding an open antique glass mason jar up near his chest, eyes widened in sudden visceral shock and nostalgic realization, delicate graphite shading on face."
},
{
"id": "man_resolute",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "Julian Vane standing defiant with sleeves rolled up, dark smock dusted with real dirt, firm determined jaw, calm resolute eyes, dynamic pencil linework."
},
{
"id": "man_soft",
"kind": "sprite",
"aspect": "9:16",
"ref": "man_neutral",
"prompt": "Julian Vane seated on an industrial steel step, shoulders relaxed, cradling an old jar close to his chest with both hands, soft melancholy smile, introspective pencil crosshatching."
},
{
"id": "cg_jar",
"kind": "cg",
"aspect": "16:9",
"prompt": "Close-up dramatic composition of weathered hands holding an old vintage glass canning jar sealed with cracked wax and peeling masking tape with faint cursive handwriting, resting inside a rough timber crate, intense graphite detail."
},
{
"id": "cg_soil",
"kind": "cg",
"aspect": "16:9",
"prompt": "Extreme macro close-up of dark crumbly organic garden soil spilling across pale palms, visible microscopic root hairs and decaying leaf fibers, rich black graphite tonal rendering."
}
]
}
drift_slow, focus_in, pulse_subtle), and all 3 used across background and character displays.man_neutral establishes Julian Vane's facial features, age, hairstyle, and wardrobe as the sole visual anchor; subsequent sprites (man_gaze, man_resolute, man_soft) explicitly reference man_neutral.Continuous subpixel kinetic framing (drift_slow and pulse_subtle) keeps the backgrounds and graphite character portraits in perpetual, gentle cinematographic drift while dialogue and narration advance, preventing static frame-holds and simulating the deliberate lens momentum of 35mm film.