"""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"], ), )