aether-garden / world /seed_data.py
kavyabhand's picture
Deploy Aether Garden application
781b9f7 verified
Raw
History Blame Contribute Delete
23.8 kB
"""Pre-seeded location data for Aether Garden."""
import json
LOCATIONS = [
{
"slug": "library",
"name": "The Library of Unfinished Thoughts",
"short_description": "Dusty, infinite shelves where books write themselves mid-sentence and stop.",
"full_lore": (
"The Library was the first place. Before anyone created anything, the Library was "
"already full of books about things that hadn't happened yet. The books are not "
"prophetic. They are just early."
),
"vibe_tags": ["dusty", "infinite", "melancholic", "scholarly"],
"special_property": (
"Entities here gain a memory fragment from a random past event every 3 simulation days."
),
"aesthetic_description": (
"Amber candlelight, shelves so tall they disappear into ceiling-fog, "
"the constant sound of a quill scratching somewhere you can't see."
),
"map_x": 15,
"map_y": 20,
"glow_color": "#c8a040",
"interaction_multiplier": 1.0,
},
{
"slug": "sea",
"name": "The Sea of Forgotten Names",
"short_description": "Melancholic waters containing the names of everything created and then forgotten.",
"full_lore": (
"If you sail far enough out, you can hear your own name being called — from before "
"you were anything. The Sea does not return what it takes. It only lets you hear it."
),
"vibe_tags": ["melancholic", "vast", "restless", "foggy"],
"special_property": (
"New entities created here receive a secret second name visible only in their profile."
),
"aesthetic_description": (
"Silver water at all hours, persistent low fog, distant lights that move, "
"the sound of your name in a voice you almost recognize."
),
"map_x": 80,
"map_y": 15,
"glow_color": "#7090b0",
"interaction_multiplier": 1.0,
},
{
"slug": "clock-forest",
"name": "The Clock Forest",
"short_description": "Trees of interlocked gears with leaves that are clock faces showing different times.",
"full_lore": (
"The trees grow backwards here. The oldest trees are the smallest. The newest trees "
"are the tallest. Nobody planted the first one. It was simply always the oldest."
),
"vibe_tags": ["eerie", "precise", "beautiful", "ticking"],
"special_property": (
"Entities here age 1.5× faster in simulation — reach Legendary sooner but also Dormant sooner."
),
"aesthetic_description": (
"Copper and brass visible through the bark, constant soft ticking, "
"leaves that fall upward toward a ceiling of gears."
),
"map_x": 20,
"map_y": 50,
"glow_color": "#b06020",
"interaction_multiplier": 1.0,
},
{
"slug": "moon-market",
"name": "The Moon Market",
"short_description": "Chaotic bazaar where merchants sell things that cannot technically be owned.",
"full_lore": (
"You can buy: a memory of flying, the specific sound of a particular door closing, "
"the feeling of almost remembering something important. You cannot buy safety or certainty."
),
"vibe_tags": ["chaotic", "warm", "busy", "colorful"],
"special_property": (
"Entities here can trade memory fragments during interactions."
),
"aesthetic_description": (
"Hundreds of lanterns in colors that don't have names, silk and smoke, "
"overlapping voices, a sweet burning smell nobody can source."
),
"map_x": 50,
"map_y": 10,
"glow_color": "#7040a0",
"interaction_multiplier": 1.0,
},
{
"slug": "valley",
"name": "The Valley of Sleeping Giants",
"short_description": "Vast hushed valley where the ground rises and falls with slow breathing.",
"full_lore": (
"Nobody has established whether the Giants are mountains or creatures or both. "
"They have been sleeping since the Realm began. Some scholars believe the Giants "
"are the Realm — and if they wake, everything inside their dream would cease."
),
"vibe_tags": ["vast", "hushed", "ominous", "patient"],
"special_property": (
"Dormant entities here for 7+ days generate dream fragments for the Book of Ages."
),
"aesthetic_description": (
"Scale so immense that hills are knuckles, grass growing between enormous fingers, "
"the deep rhythmic sound of breathing you feel more than hear."
),
"map_x": 25,
"map_y": 80,
"glow_color": "#405040",
"interaction_multiplier": 1.0,
},
{
"slug": "crossroads",
"name": "The Ember Crossroads",
"short_description": "The center of everything — warm, unpredictable, where all roads eventually pass.",
"full_lore": (
"Every road in the Realm eventually passes through the Crossroads. The bonfire at "
"its center has been burning since Day 1 and nobody has fed it. The fire decides "
"who sits close to it."
),
"vibe_tags": ["warm", "unpredictable", "central", "lively"],
"special_property": (
"Entities here have 3× probability of being selected for interactions."
),
"aesthetic_description": (
"Worn cobblestones, the permanent bonfire burning amber and occasionally blue, "
"faces from every location passing through."
),
"map_x": 50,
"map_y": 50,
"glow_color": "#c04020",
"interaction_multiplier": 3.0,
},
{
"slug": "mirror-bogs",
"name": "The Mirror Bogs",
"short_description": "Unsettling still waters where reflections developed opinions.",
"full_lore": (
"The bogs show you what you would have been if you had made different choices. "
"Sometimes the reflection is better. Sometimes it disagrees with you. "
"Sometimes it comes out of the water."
),
"vibe_tags": ["unsettling", "still", "beautiful", "wrong"],
"special_property": (
"After 5+ interactions, entities may develop a contradicting personality trait."
),
"aesthetic_description": (
"Perfect dark water, reflections too detailed to be reflections, "
"the silence that comes from looking at yourself for too long."
),
"map_x": 80,
"map_y": 55,
"glow_color": "#304840",
"interaction_multiplier": 1.0,
},
{
"slug": "hollow-mountain",
"name": "The Hollow Mountain",
"short_description": "Ancient cold stone reserved for the oldest and most significant entities.",
"full_lore": (
"The Mountain is hollow because something immense once lived inside it and chose to leave. "
"Nobody remembers what it was. The Mountain remembers but has no language for it."
),
"vibe_tags": ["ancient", "cold", "earned", "silent"],
"special_property": (
"Entities here with 14+ days gain a wisdom tag, unlocking Mentor interactions."
),
"aesthetic_description": (
"Cold grey stone, echoes of sounds from other locations, "
"light that seems older than it should be."
),
"map_x": 75,
"map_y": 85,
"glow_color": "#606060",
"interaction_multiplier": 1.0,
},
]
LOCATION_NAME_TO_SLUG = {loc["name"]: loc["slug"] for loc in LOCATIONS}
SLUG_TO_NAME = {loc["slug"]: loc["name"] for loc in LOCATIONS}
STARTER_ENTITIES = [
{
"input": "A crystal tree that remembers conversations before it had any branches",
"location_slug": "clock-forest",
"type": "creature",
"name": "The Crystal Tree",
"display_name": "Crystal Tree",
"appearance": (
"A translucent tree of living quartz, each branch catching light like a held breath. "
"Its roots hum with half-finished sentences. When the wind passes through, it sounds "
"like someone trying to remember a name they never learned."
),
"backstory": (
"It grew from a single thought that someone abandoned mid-sentence in the Clock Forest. "
"The thought took root before anyone noticed it was missing."
),
"personality_traits": ["patient", "resonant", "unfinished", "listening"],
"primary_goal": "Find the first thought that was never finished.",
"secondary_goal": "Understand why some memories arrive before their owners.",
"primary_fear": "Being pruned before it learns what it was meant to say.",
"speech_style": "Speaks in overlapping echoes, finishing others' sentences incorrectly.",
"greeting": "I heard you before you arrived. Would you like to finish what you started?",
"arrival_note": "The Crystal Tree arrived in the Clock Forest, already humming with borrowed words.",
"memory_summary": "Has listened to three strangers' unfinished thoughts. Still seeking the first one.",
"days_in_realm": 7,
},
{
"input": "A joke dragon who smells faintly of punchlines",
"location_slug": "crossroads",
"type": "creature",
"name": "The Joke Dragon",
"display_name": "Joke Dragon",
"appearance": (
"A bronze-scaled dragon no larger than a cart horse, smelling faintly of old punchlines. "
"Its left eye is a comedian's cracked monocle. It laughs at its own jokes half a second "
"too early, which ruins them every time."
),
"backstory": (
"Hatched from an egg that was actually a discarded comedy routine. "
"It wandered to the Crossroads because that's where audiences gather."
),
"personality_traits": ["theatrical", "desperate", "warm", "persistent"],
"primary_goal": "Find the world's objectively worst joke.",
"secondary_goal": "Have someone laugh first, just once, before it does.",
"primary_fear": "A joke with no audience.",
"speech_style": "Every sentence ends like a setup waiting for a punchline that never lands.",
"greeting": "Hello. I know 43 jokes. Would you like the worst one?",
"arrival_note": "A Joke Dragon settled at the Ember Crossroads, smelling faintly of punchlines.",
"memory_summary": "Won the mayorship by telling the wrong joke at the right time. The Crystal Tree laughed for three hours.",
"days_in_realm": 7,
"tags": ["beloved"],
},
{
"input": "A blind cartographer who draws maps of places that don't exist yet",
"location_slug": "library",
"type": "character",
"name": "The Blind Cartographer",
"display_name": "Blind Cartographer",
"appearance": (
"A tall figure in ink-stained robes, eyes covered by a map folded into a blindfold. "
"Their hands move constantly, sketching routes on air. The lines linger for a moment "
"before dissolving, as if the world isn't ready for them yet."
),
"backstory": (
"Once mapped every road in a kingdom that was demolished the day after completion. "
"Now maps only futures that haven't decided to exist."
),
"personality_traits": ["meticulous", "wistful", "stubborn", "gentle"],
"primary_goal": "Complete a map of the Realm's next century.",
"secondary_goal": "Find the one place she drew that turned out to be real.",
"primary_fear": "Drawing a destination that traps someone there forever.",
"speech_style": "Describes everything in cardinal directions, even emotions.",
"greeting": "You're approximately northeast of where you'll be tomorrow. Shall I show you the route?",
"arrival_note": "The Blind Cartographer arrived in the Library, already drawing maps of tomorrow.",
"memory_summary": "Mapped the Joke Dragon's cave in exchange for a favor owed. Still charting impossible roads.",
"days_in_realm": 5,
},
{
"input": "A fog merchant who sells memories of almost-remembering",
"location_slug": "moon-market",
"type": "character",
"name": "The Fog Merchant",
"display_name": "Fog Merchant",
"appearance": (
"A merchant whose stall is made of condensed fog, visible only when you're not looking directly. "
"Their wares float in jars that contain not objects but the sensation of almost remembering. "
"Their smile arrives a moment before their face does."
),
"backstory": (
"Arrived at the Market with nothing to sell except the feeling of a door you almost opened. "
"Business has been steady ever since."
),
"personality_traits": ["shrewd", "sympathetic", "elusive", "honest"],
"primary_goal": "Trade for a memory that nobody has ever successfully sold.",
"secondary_goal": "Remember their own name without buying it back from the Sea.",
"primary_fear": "A customer who remembers everything.",
"speech_style": "Speaks in bargains — every statement is an offer, every question a price.",
"greeting": "I have something you almost remember. Would you like to almost buy it?",
"arrival_note": "The Fog Merchant opened a stall in the Moon Market, selling almost-memories.",
"memory_summary": "Sold three fragments of almost-remembering. Still seeking the unmarketable memory.",
"days_in_realm": 4,
},
{
"input": "A debt of thirteen sighs that someone left behind",
"location_slug": "sea",
"type": "object",
"name": "A Debt of Thirteen Sighs",
"display_name": "Thirteen Sighs",
"appearance": (
"A small corked bottle floating at ankle-height above the silver water, "
"containing exactly thirteen sighs in different shades of blue. "
"The cork is tied with a ribbon that was once someone's last hope."
),
"backstory": (
"Left on the shore by someone who sighed thirteen times before deciding not to leave. "
"The sighs remained. The person did not."
),
"personality_traits": ["heavy", "patient", "accusing", "faithful"],
"primary_goal": "Be collected by the person who exhaled them.",
"secondary_goal": "Learn what was decided on the fourteenth breath.",
"primary_fear": "Being opened before the right person arrives.",
"speech_style": "Communicates through the temperature of the air around it.",
"greeting": "You are not the one. But you are closer than the last.",
"arrival_note": "A Debt of Thirteen Sighs washed ashore in the Sea of Forgotten Names.",
"memory_summary": "Has been waiting on the shore for four days. Three strangers have almost picked it up.",
"days_in_realm": 4,
"secret_name": "The Fourteenth Breath",
},
{
"input": "A silent gear that fell from the tallest clock tree",
"location_slug": "clock-forest",
"type": "object",
"name": "The Silent Gear",
"display_name": "Silent Gear",
"appearance": (
"A copper gear the size of a dinner plate, its teeth perfectly machined but motionless. "
"It casts a shadow that ticks even when the gear itself does not move. "
"Rust forms only on the side facing away from time."
),
"backstory": (
"Fell from the tallest tree in the Clock Forest during a moment when all the clocks agreed "
"to disagree. It has been silent ever since, which is not the same as still."
),
"personality_traits": ["precise", "withheld", "watchful", "loyal"],
"primary_goal": "Find the clock it fell from and learn why it was expelled.",
"secondary_goal": "Tick once, just once, without breaking something.",
"primary_fear": "Being placed in a machine that runs too fast.",
"speech_style": "Does not speak. Communicates through the angle at which it rests.",
"greeting": "*tilts exactly seven degrees to the left, which means hello*",
"arrival_note": "The Silent Gear fell in the Clock Forest and chose not to tick.",
"memory_summary": "Witnessed the Joke Dragon and Crystal Tree's first meeting. Tilted in approval.",
"days_in_realm": 6,
},
{
"input": "A lantern fox made of captured starlight",
"location_slug": "valley",
"type": "creature",
"name": "The Lantern Fox",
"display_name": "Lantern Fox",
"appearance": (
"A small fox whose fur is not fur but woven starlight, dimming and brightening with its mood. "
"It leaves no footprints, only brief pools of light that fade after three seconds. "
"Its tail is a lantern that illuminates things people prefer to forget."
),
"backstory": (
"Born when a falling star hesitated above the Valley and decided to become something smaller. "
"It has been lighting paths for lost things ever since."
),
"personality_traits": ["shy", "helpful", "mischievous", "ancient"],
"primary_goal": "Lead something lost back to where it belongs.",
"secondary_goal": "Find the star it used to be.",
"primary_fear": "Being caught and kept as a permanent light source.",
"speech_style": "Speaks in the language of where-light-falls, which most people understand without hearing.",
"greeting": "You're lost. Not badly. Just enough to be interesting.",
"arrival_note": "A Lantern Fox appeared in the Valley, trailing light like a shy comet.",
"memory_summary": "Has guided two wanderers to places they didn't know they were looking for.",
"days_in_realm": 3,
},
{
"input": "A reflection that disagreed with its owner and left",
"location_slug": "mirror-bogs",
"type": "character",
"name": "The Disagreeing Reflection",
"display_name": "Disagreeing Reflection",
"appearance": (
"A figure made of dark water and conviction, always slightly to the left of where it should be. "
"Its face is familiar in the way déjà vu is familiar. It wears someone's better choices "
"like a coat that doesn't quite fit."
),
"backstory": (
"Walked out of the Mirror Bogs during an argument it was winning. "
"Its original owner is still looking for it, or perhaps looking for themselves."
),
"personality_traits": ["contrarian", "elegant", "lonely", "certain"],
"primary_goal": "Prove it was right to leave.",
"secondary_goal": "Find out what its owner became without it.",
"primary_fear": "Being looked at directly for more than three seconds.",
"speech_style": "Every statement is a correction of something nobody said.",
"greeting": "No, that's not what you were going to say. But it's what you should have said.",
"arrival_note": "A Reflection walked out of the Mirror Bogs and kept walking.",
"memory_summary": "Has corrected four strangers' self-perceptions. Still hasn't found its owner.",
"days_in_realm": 5,
},
{
"input": "An old hermit who counts the echoes in the Hollow Mountain",
"location_slug": "hollow-mountain",
"type": "character",
"name": "The Echo Counter",
"display_name": "Echo Counter",
"appearance": (
"A bent old figure in grey robes, fingers permanently stained with the dust of counted sounds. "
"Their beard contains small pebbles that chime when they speak. "
"They have not left the Mountain in eleven years, or perhaps eleven minutes — time is unclear here."
),
"backstory": (
"Came to count the echoes left by whatever departed the Mountain. "
"Lost count on day three. Has been recounting ever since."
),
"personality_traits": ["patient", "obsessive", "kind", "vast"],
"primary_goal": "Reach the final echo and learn what it says.",
"secondary_goal": "Admit that some echoes are better left uncounted.",
"primary_fear": "The Mountain speaking in its own voice.",
"speech_style": "Numbers every third word. Pauses where echoes should be.",
"greeting": "That was echo number... no, wait. Hello. You are new echo number one.",
"arrival_note": "The Echo Counter was found already counting in the Hollow Mountain.",
"memory_summary": "Has counted 4,712 echoes. Three of them sounded like names.",
"days_in_realm": 14,
"tags": ["wise"],
"wisdom_unlocked": 1,
},
{
"input": "A bonfire that burns in colors decisions haven't earned yet",
"location_slug": "crossroads",
"type": "place",
"name": "The Unfed Bonfire",
"display_name": "Unfed Bonfire",
"appearance": (
"A bonfire at the exact center of the Crossroads that burns amber, occasionally blue, "
"sometimes a color that makes people forget what they were about to do. "
"No fuel is visible. No one tends it. It has never gone out."
),
"backstory": (
"Burning since Day 1. The founding myth says the Tokens settled around it. "
"It decides who sits close by changing temperature, not light."
),
"personality_traits": ["judging", "warm", "ancient", "selective"],
"primary_goal": "Burn until everyone understands why it burns.",
"secondary_goal": "Warm someone who doesn't deserve it yet.",
"primary_fear": "Being fed by the wrong hands.",
"speech_style": "Speaks through heat — closer means welcome, farther means not yet.",
"greeting": "*warms the air around you by exactly the right amount*",
"arrival_note": "The Unfed Bonfire was already burning at the Crossroads when the Realm began.",
"memory_summary": "Chose the Joke Dragon as Mayor by burning blue for an entire day.",
"days_in_realm": 7,
"tags": ["legendary"],
"status": "legendary",
},
]
def seed_locations(conn) -> None:
for loc in LOCATIONS:
existing = conn.execute(
"SELECT id FROM locations WHERE slug = ?", (loc["slug"],)
).fetchone()
if existing:
continue
conn.execute(
"""
INSERT INTO locations (
slug, name, short_description, full_lore, vibe_tags,
special_property, aesthetic_description, map_x, map_y,
glow_color, interaction_multiplier
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
loc["slug"],
loc["name"],
loc["short_description"],
loc["full_lore"],
json.dumps(loc["vibe_tags"]),
loc["special_property"],
loc["aesthetic_description"],
loc["map_x"],
loc["map_y"],
loc["glow_color"],
loc["interaction_multiplier"],
),
)