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